refdb-1.0.2/000755 001750 001750 00000000000 12303477605 013451 5ustar00markusmarkus000000 000000 refdb-1.0.2/conf/000755 001750 001750 00000000000 12303477602 014373 5ustar00markusmarkus000000 000000 refdb-1.0.2/INSTALL000644 001750 001750 00000036605 12255432273 014512 0ustar00markusmarkus000000 000000 Installation Instructions ************************* Copyright (C) 1994-1996, 1999-2002, 2004-2013 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. This file is offered as-is, without warranty of any kind. Basic Installation ================== Briefly, the shell commands `./configure; make; make install' should configure, build, and install this package. The following more-detailed instructions are generic; see the `README' file for instructions specific to this package. Some packages provide this `INSTALL' file but do not implement all of the features documented below. The lack of an optional feature in a given package is not necessarily a bug. More recommendations for GNU packages can be found in *note Makefile Conventions: (standards)Makefile Conventions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. Caching is disabled by default to prevent problems with accidental use of stale cache files. If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. Running `configure' might take a while. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package, generally using the just-built uninstalled binaries. 4. Type `make install' to install the programs and any data files and documentation. When installing into a prefix owned by root, it is recommended that the package be configured and built as a regular user, and only the `make install' phase executed with root privileges. 5. Optionally, type `make installcheck' to repeat any self-tests, but this time using the binaries in their final installed location. This target does not install anything. Running this target as a regular user, particularly if the prior `make install' required root privileges, verifies that the installation completed correctly. 6. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. 7. Often, you can also type `make uninstall' to remove the installed files again. In practice, not all packages have tested that uninstallation works correctly, even though it is required by the GNU Coding Standards. 8. Some packages, particularly those that use Automake, provide `make distcheck', which can by used by developers to test that all other targets like `make install' and `make uninstall' work correctly. This target is generally not run by end users. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c99 CFLAGS=-g LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you can use GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. This is known as a "VPATH" build. With a non-GNU `make', it is safer to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. On MacOS X 10.5 and later systems, you can create libraries and executables that work on multiple system types--known as "fat" or "universal" binaries--by specifying multiple `-arch' options to the compiler but only a single `-arch' option to the preprocessor. Like this: ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CPP="gcc -E" CXXCPP="g++ -E" This is not guaranteed to produce working output in all cases, you may have to build one architecture at a time and combine the results using the `lipo' tool if you have problems. Installation Names ================== By default, `make install' installs the package's commands under `/usr/local/bin', include files under `/usr/local/include', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PREFIX', where PREFIX must be an absolute file name. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you pass the option `--exec-prefix=PREFIX' to `configure', the package uses PREFIX as the prefix for installing programs and libraries. Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=DIR' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. In general, the default for these options is expressed in terms of `${prefix}', so that specifying just `--prefix' will affect all of the other directory specifications that were not explicitly provided. The most portable way to affect installation locations is to pass the correct locations to `configure'; however, many packages provide one or both of the following shortcuts of passing variable assignments to the `make install' command line to change installation locations without having to reconfigure or recompile. The first method involves providing an override variable for each affected directory. For example, `make install prefix=/alternate/directory' will choose an alternate location for all directory configuration variables that were expressed in terms of `${prefix}'. Any directories that were specified during `configure', but not in terms of `${prefix}', must each be overridden at install time for the entire installation to be relocated. The approach of makefile variable overrides for each directory variable is required by the GNU Coding Standards, and ideally causes no recompilation. However, some platforms have known limitations with the semantics of shared libraries that end up requiring recompilation when using this method, particularly noticeable in packages that use GNU Libtool. The second method involves providing the `DESTDIR' variable. For example, `make install DESTDIR=/alternate/directory' will prepend `/alternate/directory' before all installation names. The approach of `DESTDIR' overrides is not required by the GNU Coding Standards, and does not work on platforms that have drive letters. On the other hand, it does better at avoiding recompilation issues, and works well even when some directory options were not specified in terms of `${prefix}' at `configure' time. Optional Features ================= If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Some packages offer the ability to configure how verbose the execution of `make' will be. For these packages, running `./configure --enable-silent-rules' sets the default to minimal output, which can be overridden with `make V=1'; while running `./configure --disable-silent-rules' sets the default to verbose, which can be overridden with `make V=0'. Particular systems ================== On HP-UX, the default C compiler is not ANSI C compatible. If GNU CC is not installed, it is recommended to use the following options in order to use an ANSI C compiler: ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" and if that doesn't work, install pre-built binaries of GCC for HP-UX. HP-UX `make' updates targets which have the same time stamps as their prerequisites, which makes it generally unusable when shipped generated files such as `configure' are involved. Use GNU `make' instead. On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot parse its `' header file. The option `-nodtk' can be used as a workaround. If GNU CC is not installed, it is therefore recommended to try ./configure CC="cc" and if that doesn't work, try ./configure CC="cc -nodtk" On Solaris, don't put `/usr/ucb' early in your `PATH'. This directory contains several dysfunctional programs; working variants of these programs are available in `/usr/bin'. So, if you need `/usr/ucb' in your `PATH', put it _after_ `/usr/bin'. On Haiku, software installed for all users goes in `/boot/common', not `/usr/local'. It is recommended to use the following options: ./configure --prefix=/boot/common Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the option `--target=TYPE' to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc causes the specified `gcc' to be used as the C compiler (unless it is overridden in the site shell script). Unfortunately, this technique does not work for `CONFIG_SHELL' due to an Autoconf limitation. Until the limitation is lifted, you can use this workaround: CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of all of the options to `configure', and exit. `--help=short' `--help=recursive' Print a summary of the options unique to this package's `configure', and exit. The `short' variant lists options used only in the top level, while the `recursive' variant lists options also present in any nested packages. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `--prefix=DIR' Use DIR as the installation prefix. *note Installation Names:: for more details, including other options available for fine-tuning the installation locations. `--no-create' `-n' Run the configure checks, but stop before creating any output files. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. refdb-1.0.2/NEWS000644 001750 001750 00000155123 12303477466 014164 0ustar00markusmarkus000000 000000 RefDB NEWS file =============== ___________________________________ Version 1.0.2 (February 2014) Bugfixes: - a buffer overflow in the XML parsing code was fixed ___________________________________ Version 1.0.1 (January 2014) Bugfixes: - due to a packaging error, the 1.0.0 tarball did not contain two essential bugfixes which already made it into svn. The new tarball fixes this without any additional changes ___________________________________ Version 1.0.0 (January 2014) Bugfixes: - assorted stylesheet fixes for namespaced XML output - fixed bibliography sorting order if author name is missing - fixed a style export bug - refdb-init no longer attempts to add schemas.xml as a style Improvements: - added a new tool runbib-missing to list the references which were reported missing by a previous runbib call - added a new tool refdb-pubmed to import data from the Pubmed database using lists of Pubmed IDs. Pubmed IDs are now saved by default as links in L2 - now creates bibliographies for RTF documents (still considered experimental) - added styles for some common formats like AMA, APA, Chicago, Harvard, MLA, Turabian, as well as for the biomedical journals CHA-MC and JPET - the web interface now supports result list paging, i.e. the query results and index searches no longer show the whole list of 5000+ matches :-) but only a limited (configurable) number at a time. You can conveniently page forward or back using buttons. - you can now provide driver files to the XML bibliography processing tools, e.g. to use custom formatting of the parts not managed by RefDB independent of other users on your system. Backwards-incompatible changes: - UNPB references are now considered not-yet-accepted INPR articles and thus use part data, just like JOUR. Previous versions have treated UNPB like an unpublished BOOK or RPRT. The current behaviour is more convenient for people who write more articles than books. ___________________________________ Version 0.9.9 (November 2007) Bugfixes: - raw bibliographies were fixed again - a bug in the tokenizers used by refdbd and by the clients to parse command line arguments has been fixed. Now escaped characters should be treated as such in all cases. - fixed the missing author type in part authors imported from risx - fixed the style export on OS X (PPC) - fixed the publication year output in RIS export if the otherinfo field is empty - crash during bibliography creation on OS X was fixed - unknown reference data types are now changed to "GEN" when importing risx data as well - abbreviated journal names which use periods without spaces are now imported properly - config.rpath was added to the tarball to avoid configure errors on particular OSes - upgrading the main database no longer creates duplicate entries in t_meta when using PostgreSQL as the database engine - fixed missing permissions after upgrading the main PostgreSQL database - the preconfigured locations of log and pid files now honor the prefix (usually /usr or /usr/local) - fixed a table locking error if a risx dataset is skipped during import - special characters are now properly converted to XML entities even in long texts with lots of these characters - now purges "(", ")", and "?" from citation keys - now checks the reference types before adding them to the database. Unknown types are changed to "GEN". - a sanity check in the RIS import code prevents segfaults if risx data are accidentally fed to it. - risx datasets which are accidentally added as RIS datasets no longer crash refdbd. - a possible client/server hiccup caused by checkref reports of a particular size was fixed. - the handling of the (entirely broken by design) issue, edition, and volume fields in a variety of reference types has been improved - when checking risx datasets the tables are now properly unlocked if a dataset is skipped Improvements: - the en2ris script now uses UTF-8 as the default output encoding - boatload of improvements of the PHP web interface, among these is the tag cloud display of authors, keywords, and periodical names in the search results. - the handling of the AV field has been cleaned up. As of this version, the AV field should only contain a physical location, i.e. either a description of the location, or a call number. The formerly applied PATH: kludge to manage links to local copies of PDF files is no longer supported. To store user-specific locations of PDF files, use the L1-L4 fields and start the URL with the "file://" protocol prefix. These links are assumed to point to local copies owned by the user. If the URL uses a relative path, i.e. "file://offprints/Miller2002" instead of "file:///home/markus/offprints/Miller2002" (note the additional root slash in the latter URL), the same pdfroot mangling is applied as was previously to the AV - PATH: paths. Please see the UPGRADING file for some hints how to efficiently migrate existing AV field contents. - in order to reflect the above change in risx datasets, the risx dtd was adapted accordingly. The element is now also allowed in . Although the DTD can't enforce this, the pubinfo/link elements are supposed to hold publicly accessible URLs of offprints, images and such, whereas the libinfo/link elements should receive only user-specific local paths to offprints. - if a character encoding conversion is necessary during data import or data export, refdbd now uses the transliteration facility of iconv for characters which cannot be mapped to the target encoding, a problem which often arises when exporting UTF-8 data to European encodings. - the new PHP web interface was thoroughly overhauled to cope with whitespace, apostrophes, and regular expression characters in keywords, author names, and journal names. Adding references now works from risx data too, and the feedback about the success of adding a file has been improved. Adding data from the web form was improved too in that empty fields are left out, author name and keyword lists are appropriately tokenized, and addref or updateref is used whenever appropriate. The code now makes sure to use a unique temporary filename which is deleted again afterwards, avoiding clutter in your /tmp. The field descriptions of the Add reference form was overhauled too to better reflect the contents depending on which reference type is used. The month selector now creates a numeric month to comply with the RIS format's requirements. - added a getax command to retrieve authors of any level - added namespace handling for DocBook and TEI stylesheet driver files. TEI P4 and DocBook V4.x files are now always processed with the non-namespaced stylesheets, whereas TEI P5 and DocBook V5 files are handled by the stylesheets with namespace support. In contrast to the stock DocBook stylesheets there is no auto-detection whether or not the document uses namespaces. - TEI P5 cooked bibliographies are now directly generated by refdbd instead of transforming them from DocBook bibliographies - refdbib now optionally retrieves raw bibliographies based on a citationlistx input document. This allows using RefDB as a data source for SGML/XML documents even if RefDB's citation and bibliography formatting capabilities are not desired or applicable - the PHP web interface has been replaced with a new implementation from scratch (thanks to Dan O'Donnell and Dominik Reusser). - added config files for runbib and refdbjade to pass additional options to (open)jade, especially to increase or disable the error limit - added a standalone SRU server for personal use or for testing purposes - bibliography styles now have elements to record the style author, a description, and an URL that points to the source of the bibliographic rules. - added a new legal bibliography style contributed by Jeremy Malcolm - DocBook and TEI XML output is now indented and can optionally be namespaced - DocBook XML V5.0 support - the internal representation of authors and titles is now based on the three-level library system (part, publication, series) instead of on the once-and-for-all-screwed RIS definition. This makes both the programmer's life and the style author's life quite a bit easier - the internal representation of the M1-M3 fields was improved to simplify data access. The contents of these RIS fields is now stored in separate fields which reflect the purpose in context of the respective reference type - citation styles now support both authors and editors in monographic data - citation styles now support the replacements of the M1-M3 fields, i.e. stuff like conference location, sender and recipient email addresses, class codes, running time and so on - the output of adduser/deleteuser was cleaned up if no hostname is available - the format specifier NX of the getref command no longer retrieves all extended notes associated with a particular reference, as these would always include the users reference lists. If you positively want those lists, use ALL or NXNL instead. - the citestylex.dtd now supports different formatting options for authors (TEXT) and editors (TEXTED). The styles shipped with RefDB were updated accordingly. - all backends were updated and now export the contents of the RIS fields M1-M3 as far as possible - two new citation styles were added (Tissue_Eng. and Biomaterials) - the bibliography sorting order is now case-insensitive and takes into account missing authors, using the title for sorting in this case - the MySQL reference database schema now uses TEXT instead of BLOB to make use of the improved character encoding and collation features of newer MySQL versions - the new refdbc:countref and refdbc:countnote commands are equivalent to the getref and getnote commands, respectively, except that they do not actually retrieve the reference or note data. Instead, they return the number of matching references and notes, respectively. - the query language supports additional relational operators: <= (less than or equal), >= (larger than or equal), <> (not like). - there is a new backend for MODS output, an XML format maintained by the Library of Congress. - the XML output (risx, mods, xnote) now supports namespaces. - the -n switch of getbib is no longer supported (it was hardly ever used anyway). refdbd now sends a stylespec no matter what. - the getnote/countnote commands now also support query strings of unlimited length, just like the getref/countref commands. - the adduser/deleteuser commands now support two classes of users: read-only users and read/write-users. The former is a simple way to generate a database account for users accessing your databases through SRU or via the web interface without permitting write access to your databases for everyone. - the new CGI script refdbsru provides an optional SRU (Search and Retrieve via URL) interface to your databases. - the checkref command can now be limited to check individual fields or combinations of fields. - improved import of tagged Pubmed data (med2ris) - digital object identifiers (DOI) are now harvested from Pubmed data and are stored properly. DOIs are presented as links (via dx.doi.org) by the (x)html backend. Backwards-incompatible changes: - the -i option of refdbjade was changed to I (capital i) to make it the same as in runbib (which uses -i for a different purpose). runbib in turn now uses -s instead of -I to skip the ID extraction step, and -I instead of -m to set include options ______________________________ Version 0.9.8-1 (January 2007) Bugfixes: - the implementation of the client/server dialog for the addref, updateref, and checkref commands was fixed - a possible segfault in the checkref command was fixed - several memory leaks were plugged - SGML/XML bibliographies are now valid even if entries lack titles _____________________________ Version 0.9.8 (December 2006) Bugfixes: - queries for UR and L1-L4 fields now work again - en2ris now properly imports the start and end page information from newer EndNote versions - using multiple databases in LaTeX documents now works again properly - bibtex output is now properly escaped - getref now honours backslash-escaped apostrophes in query strings - strings extending the length of limited size fields in t_refdb are now properly truncated during data import - correctly rollback if adding RIS data fails - exclusive queries (e.g. :UR:!~"http") now work as expected for links (UR, L1-L4, authors, and keywords - refdbd now modifies citation keys containing the string "-ID" as this may cause problems when creating bibliographies. "-ID" will be replaced with "_ID" to avoid problems. - if an iconv error occurs during data import, refdbd now returns a meaningful error message. - in Pubmed XML data, name parts no longer leak into the next author name Improvements: - the refdba:listuser command now checks for the required database argument - improved manpage layout by using new DocBook stylesheet capabilities when available, and workarounds for older stylesheet versions - configure now simplifies the task of building modularized RefDB packages. You can now build server, clients, and doc packages separately. Additionally, you can switch off building docs and manpages to build the RefDB binaries from the SVN sources on systems without an XML/DocBook toolchaiin - the code that generates citation keys from author names was improved by using iconv to transliterate foreign characters. - the default setup now uses UTF-8 as the default input, storage, and output encoding. - the wrapper script bib2ris-utf8 was added to simplify postprocessing of the bib2ris output with the new refdb_latex2uft8txt script. The latter converts foreign characters to their UTF-8 equivalents and strips off other LaTeX commands. - personal reference lists are now implemented on top of extended notes. This means in particular that each user can maintain an unlimited number of reference lists - various fixes to the PHP web interface - use an improved bibtex citation format (\cite{dbname:citekey}) - now supports citation key based citation formats in addition to author/year and numeric - improved citation formats handle more reference types - refdbd can now install and upgrade the main database without external tools. See the file UPGRADING and the refdbd man page for further information. - for this to work, the main database dump files are now versioned - refdb-init now uses these new refdbd capabilities to simplify the initial setup. - refdbd can also be run to check the database connection and to retrieve the database version. This is mainly useful for package/ports builders. - the help messages of the binaries now show the subversion revision they were built from. This makes it easier to track down bugs to specific builds. - refdbd can now run from a single main+reference database to allow the installation on cheap web space with access to a single MySQL database. - RefDB now provides frequency data for various statistical purposes. The get{au|ed|as|kw|jo|jf|j1|j2} commands allow to display the absolute number of references that use the particular item, or a relative number between 0 and 10 - the new checkref command allows to compare new data against the existing data before adding them permanently. This helps to identify duplicate references, as well as spelling variants and synonyms of keywords, author names, and periodical names. - The xhtml output of getref and checkref now contain frequency data. If you view the output with a new optional stylesheet, the authors, journal names, and keywords will be displayed according to their frequency in terms of font size and colour, similar to the tag clouds in services like del.icio.us. - getref and get{au|ed|as|kw|jo|jf|j1|j2} now support a new option -N limit[:offset] to cut down on the number of returned datasets. This feature can be conveniently used to loop over the result set in e.g. increments of 5 or 10, a feature most useful for graphical frontends. - the dump files of empty reference databases (these are required e.g. to set up RefDB using a single database) were updated and versioned. - the name of the main database is now configurable through the refdbdrc config file or by means of refdbd's -M command-line option. This allows RefDB to run in situations where you cannot choose the database name. Backwards-incompatible changes: - The -N option of the refdba:adduser command (which specifies the password of a new user) was renamed to -W. -N is now used by the clients to specify a number or a range of datasets. - The addref and updateref commands now use -A to specify the input reference type instead of -r. This was necessary to stay consistent with the new checkref command which has to deal with both an input (-A) and an output (-r) format. - To avoid confusion, these changes extend to the internal client/server protocol. Its version is now 5. As a result, old clients won't talk to the new server and vice versa. _________________________ Version 0.9.7 (June 2006) Bugfixes: - multiple citation texts are now properly included in the character encoding conversion - periodical titles need to be escaped during import - a possible segfault during the formatting of journal names in bibliographies was fixed - the formatting (bold, italics, superscript and so on) of intext citations was fixed for both the DSSSL and the XSL stylesheets - fixed missing preceding/following export in journal names during style export - all XML output now correctly exports empty strings as empty elements instead of dropping the element - bibliography titles are now left empty if the style says so, instead of inventing a default title - fixed a crash in the bibliography generation code when an URL was missing - print empty part title instead of none to make the output comply with the DTD - fixed possible segfaults if the automatic keyword scan ran without any keywords - fixed client/server dialog mishap in refdbc:getref, refdbc:getnote and getbib - assorted causes of segfaults during bibliography creation were eliminated - build problems on Debian due to the lack of batik-rasterizer. ./configure now checks for this image converter and falls back to ImageMagick's convert if the former is not available. The latter produces buttugly output from the SVG sources but this is better than a build that fails. - style problems due to bugs in refdb.dump.mysql and refdb.dump.mysql41. The *NAMEORDER field sizes were chosen too short which caused valid values for these fields to become truncated when MySQL was used as the database engine. See the instructions in UPGRADING if you're a MySQL user. - refdbd now uses the path to DB_VERSION from the config file instead of a compile-time value Improvements - added a refdb-init.sh script that helps setting up RefDB after installation - added a citationlistx backend to support refdb-publist - some fixes in the bibtex export - the XML headers now contain a larger selection of predefined entities - FIRSTSPCM (without a dot) was added to the *NAMEORDER values - support for multi-head tex citations was added - import and export fixes for CONF, HEAR, and ELEC types - replaced SGML manual sources by XML sources - replaced handcrafted man pages by DocBook output - the logic of the configure switch to build docs was reversed: docs are now built by default (this is required to install the prebuilt docs), but if you run into problems when building from the CVS sources you can disable the docs by means of the --disable-docs switch - alltitles and link0 support was added to the dsssl stylesheets - the biblioset and bibliomset grouping was improved in the bibliography output - alltitle, which is the only useful title code if you want titles in the in-text citations, is now supported - LINK ROLE="0", MISC, and USERDEF without role attribute are now properly imported - the key/citekey mismatch in the notes import code was fixed - removed a pair of parens from print/docbook-refdb-dsl which caused a warning - style export now includes the character encoding into the processing instruction line - the Makefile created by refdbnd no longer removes the source file using the full citation format when running make clean. If you really need to do this, run "make shortclean". This change was done to better support refdb-mode which uses the full citation format by default. - fixed a bug in the packaging code which kept refdb-backup and refdb-restore out of the tarball - the main database version check and the update of the database version file are now performed only once per refdbd session - marc2ris now imports the call numbers contained in the MARC fields 050 (AV) and 082 (U1) ______________________________ Version 0.9.6 (November 2005) Bugfixes: - fixed hangs when getref and getnote returned zero datasets - fixed DocBook bibliography output - fixed missing slashes in RIS date output - fixed RIS date output for missing year and otherinfo data - fixed risx reprint date output - fixed getref xhtml header - fixed erroneous month and day entries popping up in pubdates - fixed obscure bug in stylespec generation code - fixed refdb-backup and refdb-restore bugs - fixed quoting problems in addlink command - fixed dozens of int vs. long long mismatches (hi OSX!) - fixed problems when reading from stdin Improvements - added sqlite3 support - added support for MySQL > 4.0 - added transaction support for MySQL - improved character encoding handling - databases are now versioned - refdba:addstyle() can now read from stdin - added getref AX and TX pseudo targets - refdbnd now supports DocBook XML 4.3 - getref now supports query strings of unlimited size - getref now supports the AX (all authors/editors) and TX (all titles) pseudo targets - client/server protocol was improved and documented - moved to libdbi-0.8.x - integrated manual into sources - integrated DTD documentation into sources - new PHP-based web interface - now supports multiple UR and L1-L4 fields per dataset - now supports public or private extended notes - now supports titles instead of missing authornames in bibliographies - new command updatejo allows editing periodical synonyms - refdb-ms is now an integral part of RefDB - new scripts refdb-backup and refdb-restore help to backup databases - man pages for all user tools are now available - updated for most recent TEI stylesheets Backwards-incompatible changes: - The client/server communication protocol has changed as of 0.9.6-pre2. Old clients cannot talk to new servers and vice versa. - The Perl scripts en2ris.pl, marc2ris.pl, and med2ris.pl were renamed to en2ris, marc2ris, and med2ris, respectively. The scripts dos2unix and tex2mail were renamed to refdb_dos2unix and refdb_tex2mail, respectively. - The default locations of the default SQLite database directory has changed. It is now {prefix}/var/lib/refdb/db in compliance with the Filesystem Hierarchy Standard. - The builtin web interface has been removed. ______________________________ Version 0.9.5 (December 2004) Bugfixes: - a boatload of bibliography formatting bugs was fixed - sync'ed defaults in citestylex.dtd and refdbd to avoid segfaults - fixed a bug in the inline citation string spec which caused possible duplicate IDs - refdb.css is now usable also for xhtml output - refdbnd-generated Makefiles now properly remove .aux and .fo files - fixed some bugs in publication year input and output - fixed entity replacement in SGML/XML output - do not allow XML reserved chars and colons in citation keys - separate primary and secondary publication year logically to prevent unwanted side effects - fixed LOCK issue for MySQL 4.0.2 and later - fixed memory management in refdbxp to make it a gazillion times faster - getref -s switch now overrides the fields variable as expected - formatting of day output in bibliographies was fixed - med2ris.pl now handles the updated Pubmed output correctly - fixed unique suffix behaviour (if two or more works share the identical authorlist and pubyear, all receive a suffix) Improvements: - added a new config file refdbxmlrc to handle the configuration of XML tools - XSLT driver files were updated to match the current versions of the original stylesheets - pass through the -h command line option to the individual commands in refdbc and refdba to allow command-specific help in batch mode - added database typing for future support of additional database types - refdbnd and runbib now support character encodings - added an option to refdb-bug to protect passwords - added support for the YMD date format - added support for the ICAPS title and journalname formatting - refdbib now reports the number and IDs of cited works which are not in the database - added a new pseudo target TA to the getref query language to search for a phrase in all title levels - citestylex now supports the bibliography formatting in terms of indentation and font size - runbib now creates css stylesheets for the bibliography formatting which can be used either stand-alone or be included into a driver file - runbib now accepts a switch to set the server IP - refdbd now always reports the database name if it can't connect to the database engine - XSLT stylesheets can now be referenced via a XML catalog, obviating the need for configure-time decisions if catalog support is available - adapted the directory hierarchy expectations for TEI XSLT files to support both P4 and the upcoming P5 versions Backwards-incompatible changes: - The system database uses a different layout compared to previous versions. If you upgrade, make sure to create a new system database using the supplied dump files. - Running older and newer versions of RefDB in parallel now works a little different. By default, the system database is always called "refdb" but you can change this with the --with-main-db configure switch. - The TEI stylesheets as supplied by www.tei-c.org now use a different directory layout than in the past. RefDB now assumes this new layout which looks like this: value of --with-tei-xsl|generated by unpacking stylesheets |______________________|_________| /usr/local/share/xsl/tei/P4/fo /html /common - The default FO processor used to be PassiveTeX. Due to ongoing incompatibilities of this tool with recent DocBook stylesheets I've switched to FOP as the default processor. Please edit refdbxmlrc accordingly if you want to keep PassiveTeX as your processor of choice. - The in-text citation format had to be changed in order to avoid ambiguities. The refdbxp tool was adapted accordingly. Documents using the short citation style are not affected by this change. - runbib now uses the new -m option to set one or more include variables for marked sections. The previously used -i option now sets the server IP or hostname, just as in most other tools. ______________________________ Version 0.9.4 (February 2004) Bugfixes: - fixed risx output - fixed wrong mapping of titles in some risx types - added publication type HEAR to the risx DTD - fixed a possible segfault if messages are logged to stderr - fixed case mismatches in DocBook XML driver files - fixed bug in bibliography code for subsequent multiple citations - fixed deleteref return message if the requested reference does not exist - fixed junk error messages if refdbc was run in batch mode without specifying a default database. - fixed erroneus trailing spaces in middle names - fixed handling of hyphenated double-initials (K.-H.) - fixed error in handling of journal custom abbrev2 - fixed bug that would have blocked concurrent addref commands Improvements: - added XHTML support to the getref command and to DocBook XML bibliographies - added support for extended notes. Extended notes can be linked to any number of references, keywords, author names, and periodical names in your database. You can search for references and display all notes attached to them, or you can search for notes and display which references they are linked to. You can search for notes which are attached to particular references and vice versa. The new refdbc commands addnote, updatenote, deletenote, and getnote work essentially like their *ref counterparts. The new refdbc command addlink adds or removes links from notes to other database objects. - by default refdbd answers only connections from localhost. The new -I switch allows remote connections as well. - deleteref will refuse to delete a reference if it is in the personal lists of more than one user. - reference databases now carry additional meta information like the refdb version they were created with and the dates of creation and last modification. This information is available through the refdbc:whichdb command. - listdb now only returns RefDB reference databases - the refdbnd script was enhanced to simplify generating a Makefile for an existing SGML or XML document - server and clients can now be built and installed separately - if a default database is selected in refdbc, the program will try to select this database at startup to test for its presence. - the getref and getnote query language now uses literal string matches by default. Use the new "~" operator to obtain a regexp match. - the string quoting was improved to simplify running regexp queries in the batch mode. - refdbd now has built-in support for character encoding conversions. You can add datasets and notes in several encodings, including Unicode, and retrieve datasets in all encodings that your libiconv supports. Incoming data is automatically converted to the encoding used by the current database. Backwards-incompatible changes: - Both the system database (now called refdb instead of refdb1 to allow parallel installations of new and older versions) and the reference databases use different layouts compared to older versions. In order to use your existing reference data with 0.9.4, make sure to follow the instructions in UPGRADING. - For security reasons refdbd no longer accepts remote connections by default. If you want to continue accessing refdbd from a remote box, make sure to start refdbd with the -I switch or use the "remoteconnect" variable in refdbdrc. - The query language now performs literal string matches by default. Use the new operator "~" to request a regular expression match. ______________________________ Version 0.9.3 (August 2003) Bugfixes: - citation key case mismatches fixed for SGML and XML documents - fixed table locking problem in MySQL 4.02 and later - work around OSX sprintf() bug - fixed some build issues on OSX - fixed SQLite problems on OSX - assorted fixes in the backends - queries including journals now use regexp match instead of full match - fixed CGI problem caused by Windoze browsers - fixed CGI edit problem - fixed problem with t_periodical entries - fixed assorted segfaults in the bibliography code - fixed problems with queries if personal list is empty Improvements: - use xsltproc and a XSLT stylesheet to extract IDs/citation keys from XML documents - risx.dtd defines an additional XML reference data input format - improved support for availability strings - manual keyword scan - new risx backend - med2ris.pl now has full iconv support - the getref -S option is now honored by most backends - new RefDBClient::Client Perl module allows to access the functionality provided by refdbd through Perl scripts - refdbjade and refdbxml now use -s instead of -d to specify the stylesheet to avoid confusion with the -d switch of runbib - personal reference list is now also supported by SQLite - the refdbctl script now uses the reload and restart commands according to the LSB specifications Backwards-incompatible changes: - The med2ris.pl script now uses the uppercase "-T" switch to manually select the input data type. The lowercase "-t" switch is now used to select the output character encoding. ______________________________ Version 0.9.2 (February 2003): Bugfixes: - a few minor fixes for building on Cygwin - bibtex bibliographies now work again - fixed prefs-related crash (on selected platforms) of refdbib - fixed premature end due to debug code in refdbxp - now formats abbreviated first/middle names correctly in bibliographies if the database provides full names - fixed quoting problem in refdbc:getref command - fixed incorrect query results in getfoo and getref commands (if a getref query included a journal name, only the first reference containing this periodical was returned; commands like getjo returned as many identical hits as there were references using the particular journal name) - assorted fixes to run refdba/refdbc as regular apps within a CGI environment (think Perl or PHP). - a missing "SYSTEM" was added to Makefile.template for DocBook XML documents - refdbib now returns a proper error code for server-side errors Improvements: - now supports SQLite as an embedded database engine - med2ris.pl was extended to handle both tagged and XML Pubmed data, now runs as CGI script, the web interface now uses med2ris.pl by default - med2ris.pl and marc2ris.pl were extended to handle RefDB-style configuration and log files; they now depend on the separate RefDB-perlmod package - now strips off TeX special characters when building a citation key from an author name - refdbc:getref now displays the number of retrieved references - runbib automatically uses the refdb.cat catalog file for its (open)jade calls to make sure the driver files are found - Makefile.template and refdbnd were improved to allow changing the style by changing a single variable (this was advertised in the previous release but it actually required changing the names of the driver files too) - configure checks for the presence of the XSL stylesheets. You'll get a warning if you forget to set --with-docbook-xsl or --with-tei-xsl or if you specify incorrect paths - refdb will now use its own default SGML declarations if you don't specify other copies on the configure command line with the --with-sgml-declaration and --with-xml-declaration options. - if a runbib call fails, the refdbib output files are renamed to XY.err to give the refdbnd-created Makefile a second chance Backwards-incompatible changes: - A minor change in the client/server communication protocol was required to allow displaying the number of retrieved references with the refdbc:getref command. The server of this version accommodates both new and old clients. New clients will not be able to talk to older servers, though. ______________________________ Version 0.9.1 (December 2002): Bugfixes: - printf() conversion specifier incompatibility on Solaris was fixed. - refdbctl was fixed to run on Solaris out of the box - nmed2ris now handles datasets w/o end page or w/o page information or w/o volume/issue information properly. - selecting character encodings with PostgreSQL now works properly. - creating bibliographies with PostgreSQL should now work properly - citations.dsl was fixed - import of RIS data with non-tagged lines now works properly - runbib now creates the proper .bib file for DocBook XML - example documents were fixed and extended - refdbxp now treats strings containing "%" properly Improvements: - A new interactive shell script refdbnd (like "new document") creates a new skeleton document with a SGML or XML prolog and an entity declaration for your bibliography. It also creates a Makefile that controls all of the subsequent processing steps. - A new Perl script med2ris.pl converts Pubmed XML datasets to RIS. This script is intended to replace nmed2ris, although the latter will remain in the distribution for a while. - The marc2ris.pl Perl script was extended to handle UKMARC and UNIMARC data. - A new tutorial is available online at http://refdb.sourceforge.net/doc.html. This is targeted at new users (not administrators) and explains the basics with a lot of examples. ____________________________ Version 0.9 (November 2002): Bugfixes: - Fixed another segfault in refdbib - Changing databases in the web interface now actually works - All list* client commands now list everything if no regexp is given as an argument. Improvements: - RefDB now uses a database abstraction library (libdbi). Both MySQL and PostgreSQL are supported as SQL database servers. Support for additional servers is in preparation. - PostgreSQL users can choose between several character encodings including Unicode for each database. They also enjoy transaction support. - Reference databases now store a unique citation key in addition to the automatically assigned ID for each reference. This is a mnemonic string supplied by the user or auto-generated from the first author and the publication year. - The getref command uses a new tag :CK: to query the new citation key field. - SGML and XML documents can now use a greatly simplified short notation for citations. All you need to do is create a citation element and list the IDs or citation keys. A new tool refdbxp automatically expands the short to the full notation. - All configuration files are now installed in a subdirectory "refdb" of sysconfdir to unclutter the latter. - A new import filter for MARC data was added. - RefDB now offers an optional automatic keyword scan. The title and abstract fields of new references are scanned for existing keywords and all matches are added to the database. - A new teix backend allows export of reference data as TEI XML datasets. - The output of the db31 backend is improved. - All RefDB backends now treat non-abbreviated first and middle names correctly. - Deleted references are replaced by invisible skeleton entries. This greatly simplifies restoring a database with the same ID sequence from either a RIS or a SQL dump. - Bibliography styles can now be exported as XML files. - A set of example files: reference data in various formats, test documents with RefDB citations. Backwards-incompatible changes: - The configuration files moved again. This time they were collected into a subdirectory 'refdb' below the system configuration directory specified in the configuration step. E.g. if you specify --sysconfdir=/usr/local/etc (the default), the configuration files will end up in /usr/local/etc/refdb. This cleans up the system configuration directory and makes all global RefDB configuration files easier to access. - The schema of the common database refdb has changed. To allow old and new RefDB versions to run in parallel, versions 0.9 and later use refdb1 as the common database. Create this database after installation of the refdb components according to the user manual. - The refdbvar database used by refdb versions prior to 0.9 is obsolete. After upgrading to 0.9 you may safely drop this database. - The schema of the reference databases has changed. The main table t_refdb now has an additional column for the citation keys. In order to use your existing reference databases, please follow the instructions in the file UPGRADING. - The remoteadmin configuration variable for refdbd now uses 't' and 'f' as argument instead of '1' and '0'. - The cgiurl configuration variable for refdbc was renamed to cssurl which better reflects its purpose (it was a braino to call it cgiurl in the first place). - There are a few new configuration variables and command line switches to allow usage with PostgreSQL. However, all defaults still assume MySQL so your configuration should keep working. - The DocBook export format has changed considerably. Any applications or stylesheets that you wrote for the old format need to be adapted. ____________________________ Version 0.8.6 (August 2002): Bugfixes: - fixed a segfault in refdbib - the adduser command was fixed for host names containing wildcards - retrieving journal abbreviations through the web interface now works as expected - etc/Makefile now correctly creates the sysconfdir directory if it doesn't exist yet - fixed a protocol error in the bibliography code - fixed handling of visible and hidden user config files - the additional information in PY fields is now correctly added to the appropriate row Improvements: - a new command line option (-y) allows to specify the directory containing the configuration files. This is important only if you move around precompiled binaries, e.g. when relocating a rpm package. ____________________________ Version 0.8.5 (July 2002): Bugfixes: - Another password encryption bug (unterminated string) was fixed - The link color was changed in the CSS file for the web interface as the links to offprints were rendered white on white :-/ - access.js now uses an expiry time of 1 day for the cookies to avoid connection errors through the web interface - The refdbctl script now uses the standard "restart" argument instead of "reload" - If pdfroot uses a protocol (http or ftp), the links in the web interface and the other output formats now reflect this; otherwise the pseudo-protocol file:// will be used instead as before. - refdbd now properly cleans up its fifos regardless of the way it exits - The refdb-bug script now looks for the global configuration files in the system configuration directory and no longer uses $REFDBLIB. - make clean now works properly in all subdirectories Improvements: - The Makefiles use $(DESTDIR) to simplify package building - The reference converters bib2ris and nmed2ris are now accessible through the web interface - The path to shareable files which was previously defined by the $REFDBLIB environment variable can now be defined in the configuration files. The value is correctly set in the example configuration files which are created during the installation. $REFDBLIB will only be consulted if the variable refdblib is not set in the configuration file ($REFDBLIB will be dropped entirely in future versions). - The example configuration files are now installed in the system configuration directory (default: /usr/local/etc) instead of the package data directory (default: /usr/local/share/refdb). - The command help messages of refdba and refdbc were improved ____________________________ Version 0.8.4 (April 2002): Bugfixes: - Password encryption bug on PPC Linux (and other PPC OSes?) was fixed - It is now possible to specify empty variable values with the set command in refdba and refdbc - The RIS backend accidentally returned the value of USER1 for all USERX fields and MISC1 for all MISCX fields. This is corrected now. - The application server now handles SIGCHLD correctly to avoid zombies on BSD-style systems. - refdba and refdbc now correctly pass non-option arguments to the command if run in batch mode - the "'' could not be resolved as hostname" bug in refdbc and refdbib was fixed - a bug in the detection of unabbreviated words in journal names was fixed - a bug in the post-processing of the default_ris variable was fixed - the address, ISSN, URL, publisher, and city fields are now available for display in the screen and HTML backends as well as in the web interface Improvements: - New refdba functions addword and listword to manage reserved journal words - The getref HTML output now generates output suitable for CSS stylesheets. A new command-line option/configuration file variable allows to specify the URL of the CSS file to use. - All RefDB applications now look into /usr/local/etc (or whatever you choose as "sysconfdir" during configuration) to find their global configuration files. Only if they're not found there, the apps will consult $REFDBLIB. The latter is done in order not to break existing installations, but you should move your config files to the proper location now (unless you really share them between machines). This change was made to separate the shareable data in $REFDBLIB from machine-specific configuration data. - Building and installing is now possible from a separate build directory - The script refdb is now suitable for use on both SysV-style and BSD-style systems to start and stop the refdbd daemon Other changes: - ris.el is now no longer byte-compiled. This simplifies building Debian packages and does not really hurt speed-wise. You can still byte-compile this file manually if you believe it helps. Backwards-incompatible changes: - All RefDB applications now look into /usr/local/etc to find their global configuration files (this can be changed during configuration). Only if they're not found there, the apps will consult $REFDBLIB. The latter is done in order not to break existing installations, but you should move your config files to the proper location now. This change was made to separate shareable data from machine-specific configuration data. ____________________________ Version 0.8.3 (March 2002): Bugfixes: - Several less commonly used fields (e.g. SN or T3) were accidentally not implemented in the query code. With this version, queries work for all existing fields. - RefDB should now compile and install cleanly on Solaris. Improvements: - The data file installation was finally implemented. That is, all stylesheets, scripts, configuration files, and DTDs will be automatically installed and all paths and URLs will be customized according to your local installation. This should take out most of the pain of the RefDB installation, as it reduces your post-installation hassles essentially to creating or changing a few environment variables. - The configure script gained about half a dozen additional options in order to allow the automatic customization of the data files. - The interactive clients refdba and refdbc have a new command "set" which allows to modify configuration variables during a session. You can e.g. change your pager or connect to refdbd on a different server without leaving your session. The same command can be used to display the current values of the configuration variables. - refdbc, when run as a CGI application, can now automatically exit after a predetermined time. This prevents clogging the memory with hanging programs (should not happen, but you never know). - A new configuration variable for refdbc allows to display additional fields by default in every screen or html search result. - The runbib script now supports a -i option to include marked sections ____________________________ Version 0.8.2 (January 2002): Bugfixes: - refdbd now reads the pidfile setting from the config file - fixed some signal oddities that just happened to work on Linux and Cygwin (but not on FreeBSD) Improvements: - DocBook XML and TEI XML were added to the supported document types for generating bibliographies. A set of XSL stylesheets is available for both document types - textual citations (Miller et al. reported recently [1]...) are now supported - The CiteStyle DTD now supports month names and their abbreviations in the language required by the publication - configure options were added to simplify building on systems that put libraries into odd places - builds cleanly on FreeBSD (and runs, too) - The Makefiles were brushed up so "make dist" finally works Backwards-incompatible changes: - The DocBook bibliographic output was changed again to allow textual citations. Due to this change, citations in existing documents need to be slightly changed to work with new bibliographies. The new stylesheets will not work with old documents and vice versa. - The SGML versions of the CiteStyle DTD and the CitationList DTD were dropped. The XML versions are now authoritative. ____________________________ Version 0.8.1 (November 2001): Bugfixes: - fixed occasional crash during bibliography creation due to free() on uninitialized pointer - fixed server crash for client commands with a mandatory argument if they were called without an argument - fixed occasional "could not connect" problems when password authentication was used - fixed obscure "POSPOSPOS" output after running addstyle in refdba - fixed minor bugs in the DSSSL stylesheets for bibliography output - fixed CiteStyle XML DTD which used constructs only available in SGML - removed erroneous dependence of almost all backend output on a journalname Improvements: - refdbib now generates DSSSL files (.dsl) instead of style specification files (.spc). These DSSSL files act as driver files for the RefDB DSSSL stylesheets which in turn are driver files for the original DocBook DSSSL stylesheets. Therefore the final transformation of a DocBook document with a RefDB bibliography can now also be done with plain old Jade. - The DocBook bibliography output was slightly changed to make it smaller and better suited for subsequent SGML-to-SGML transformations. The stylesheets were changed accordingly. - A new DSSSL stylesheet performs the transformation of DocBook bibliography output into TEI bibliography output. - The web interface now allows to display additional fields in reference queries. - The log level and log destination can now also be specified verbosely on the command line and in the configuration files Backwards-incompatible changes: - refdbib now generates DSSSL files (.dsl) instead of style specification files (.spc). These DSSSL files act as driver files for the RefDB DSSSL stylesheets which in turn are driver files for the original DocBook DSSSL stylesheets. For this to work, a new catalog file must be included in your SGML_CATALOG_FILES environment variable. The refdbjade script was changed and will no longer work with .spc files. - The DocBook bibliographic output was slightly changed to make it more suitable for transformations into e.g. TEI. The DSSSL stylesheets were adapted accordingly. Use only old stylesheets for documents containing old-style bibliographies, or re-create them with the current version. ____________________________ Version 0.8.0 (October 2001): Bugfixes: - fixed two potential coredumps due to NULL or unassigned pointers - fixed canonicalize_path() which failed if the file does not exist - refdbc now correctly handles the -t switch in batch mode Improvements: - added bib2ris converter to import BibTeX reference data - refdbib can extract the citations from LaTeX documents and generate a .bib file for use with BibTeX - added db2ris converter to import DocBook bibliography entries - added a dos2unix script to help importing Windows reference databases - added an Emacs major mode for editing RIS files - the makefile now installs most of the scripts and the ris-mode ____________________________ Version 0.7.2 (August 2001): Bugfixes: - The example configuration file for refdbd used a wrong port. This is fixed now - fixed logging in refdba Improvements: - The timeout command line switch of refdbd is now also -T instead of -t just as in the clients. The old version will still work in this release but it will be dropped eventually. - refdbd can now also grok hostnames in addition to IP addresses Backwards-incompatible changes: - Now refdbd also uses -T instead of -t for the timeout switch, just like the clients. -t is still supported by this release but it will be dropped in upcoming versions. ____________________________ Version 0.7.1 (August 2001): Bugfixes: - configure now uses libncurses or libcurses if libtermcap is absent - sequence of configure tests was changed to avoid incorrect readline error message if libtermcap/libcurses/libncurses cannot be found. - changed the letters of a few command line options to achieve consistency across all programs and commands Improvements: - added the etc/ subdirectory with commented example configuration files for all programs - added logging capabilities to refdbc and refdba - added batch mode to refdba Backwards-incompatible changes: - Now all clients including refdbc and refdba support logging and a batch mode for use in scripts. Due to these modifications some command line option letters had to be changed. All options are now consistent in all applications. Use the -h switch of the applications or of the interactive commands to view the updated option lists. __________________________ Version 0.7.0 (July 2001): Bugfixes: - Now compiles and links cleanly with readline 4.2 - nmed2ris now correctly detects the new "URLF- " tag - syslog output in refdbd is fixed Improvements: - All new and shiny CGI-based web interface for the most common refdbc commands - The configuration files were renamed to rc - The global configuration files are no longer hidden. The RefDB applications now first look for hidden personal configuration files, then for non-hidden files. - New shell scripts to simplify the installation of refdbd as a daemon on Unix-like systems - The refdbd parent process now writes the process ID to a file on startup. This simplifies administration with the above scripts Backwards-incompatible changes: - All configuration files have been renamed to rc. The global files no longer have a leading dot, e.g. .refdbd-init is now refdbdrc. The personal configuration files may have a leading dot (the apps first look for a hidden config file, then for a non-hidden file if the former is not found). __________________________ Version 0.6.0 (June 2001): Bugfixes: Improvements: - Client-server dialog was changed to introduce versioned protocols - Passwords are now encrypted in the client-server dialog - The confserv command now has access control - Simplified user management: Missing entries in mysql.user and in mysql.db (for refdb and refdbvar) will be automatically created - The clients will use the login name as account name if no name is specified Backwards-incompatible changes: - The client-server communication protocol was changed. Old clients don't work with the new application server and vice versa __________________________ Version 0.5.2 (June 2001): Bugfixes: - Cygwin invented a mkfifo stub that screwed the configure process A new macro in acinclude.m4 checks whether mkfifo() actually works __________________________ Version 0.5.1 (June 2001): Bugfixes: - eliminated several potential memory leaks - fixed the client-server dialog for the bibliography tool - moved a homegrown m4 macro from aclocal.m4 to acinclude.m4 so the configure script can be recreated from the input files without problems Improvements: - better error reporting for SQL-related errors - improved whichdb output: now shows number of references and highest ID - it is possible to use hostnames instead of IP addresses on the command line or in the init files _______________________ Version 0.5 (May 2001): Initial public release. Alpha release. refdb-1.0.2/README000644 001750 001750 00000002711 11512721664 014330 0ustar00markusmarkus000000 000000 RefDB README ============ Please see the accompanying NEWS file for backwards-incompatible changes, bugfixes, and improvements. Overview ======== RefDB is a reference database and bibliography software. It helps scientists, publishers, and anyone else writing publications to keep track of journal articles, books, and other printed or electronic material, to associate notes with their material, and to automatically generate bibliographies for all kinds of publications. The primary output formats are RIS, DocBook SGML/XML, TEI XML, and TeX compatible with bibtex/natbib. Other SGML and XML document types can be added by creating suitable stylesheets. RefDB runs on Linux, FreeBSD, NetBSD, Darwin/OSX, Solaris, Windows/Cygwin, and probably a bunch of other Unixish systems. Precompiled binaries are (sometimes) available for Cygwin, Linux, and Solaris RefDB uses MySQL or PostgreSQL as external database servers, or SQLite as an embedded database engine. Creating DocBook SGML documents with automatically generated bibliographies requires a DSSSL engine and DSSSL stylesheets. Jade/OpenJade and Norm Walsh's DocBook stylesheets are a good choice here. Creating DocBook or TEI XML documents with automatically generated bibliographies requires a XSLT engine and DocBook or TEI XSL stylesheets, respectively. xsltproc is an excellent choice. RefDB is at home at http://refdb.sourceforge.net. RefDB is maintained by Markus Hoenicka refdb-1.0.2/AUTHORS000644 001750 001750 00000003201 11512721664 014513 0ustar00markusmarkus000000 000000 RefDB authors, contributors, and other honorable mentions ========================================================= +++++++++++++++++++++++++++++++++++ Developers (in order of appearance) +++++++++++++++++++++++++++++++++++ Markus Hoenicka - main code monkey - all blame goes here Michael Smith - refdb-mode (Emacs frontend for RefDB) David Nebauer - Debian package maintainer - refdb-ms (interactive bibliography style generator) - vimhelper (RIS editing environment for Vim) - refdbxml config file - refdb-backup script Paul A. Hoadley - FreeBSD port maintainer Dan O'Donnell - web interface ++++++++++++++++++++++++++++++++++++ Contributors (in alphabetical order) ++++++++++++++++++++++++++++++++++++ Alan Anderson - citations.xsl DocBook code Marc Herbert - testing and bugfixing - XML output indentation Marco Kuhlmann - build system fixes - first shot at Debianization Jeremy Malcolm - Murdoch.Law. style Dominik Reusser - web interface Stéphane Téletchéa - Mandriva rpm maintainer +++++++++++++++++++++++++++++++++++++++++++ Honorable mentions (in no particular order) +++++++++++++++++++++++++++++++++++++++++++ Bruce D'Arcus - ssh access to an OSX box - constant thoughtful input - MODS and RelaxNG evangelist +++++++++++++++++++++++++++++++ Copyright notice (out of order) +++++++++++++++++++++++++++++++ (c) Markus Hoenicka 2003-2007 refdb-1.0.2/ChangeLog000644 001750 001750 00000065535 12303477052 015235 0ustar00markusmarkus000000 000000 2014-02-26 mhoenicka * [r781] src/risxhandler.c: risx_end_handler(): fixed tofield size to avoid buffer overflow 2014-01-21 mhoenicka * [r780] ChangeLog, NEWS: final touches 2014-01-20 mhoenicka * [r779] configure.ac: bumped version number to 1.0.0 2013-12-31 mhoenicka * [r778] src/refdbd.c: main(): fixed strncpy size mismatch 2013-12-30 mhoenicka * [r777] src/backend.c: request_notes_by_ref(): changed %d to %zd as the parameter is size_t not int 2013-12-23 mhoenicka * [r776] scripts/refdb.3.dump.mysql41.in, scripts/refdb.3.dump.pgsql.in, scripts/refdb.3.dump.sqlite.in: added a couple of new words 2013-12-22 mhoenicka * [r775] INSTALL, conf/config.guess, conf/config.sub, conf/install-sh, conf/missing, conf/mkinstalldirs, phpweb/includes/functions.inc.php, phpweb/includes/refdblib.inc.php, phpweb/index.php.in, scripts/db2ris.in, scripts/en2ris.in, scripts/marc2ris.in, scripts/med2ris.in, scripts/refdb-pubmed, scripts/refdb.in, scripts/refdb_dos2unix.in, scripts/refdbctl.in, scripts/refdbjade.in, scripts/refdbnd.in, scripts/refdbrtf.in, scripts/refdbsru.in, scripts/rtfcitations, scripts/runbib.in, src/authorinfo.c, src/authorinfo.h, src/backend-bibtex.c, src/backend-bibtex.h, src/backend-citationlistx.c, src/backend-citationlistx.h, src/backend-db31.c, src/backend-db31.h, src/backend-dbib.c, src/backend-dbib.h, src/backend-dbiba.c, src/backend-html.c, src/backend-html.h, src/backend-mods.c, src/backend-mods.h, src/backend-ris.c, src/backend-ris.h, src/backend-risx.c, src/backend-risx.h, src/backend-rtfbib.c, src/backend-rtfbib.h, src/backend-scrn.c, src/backend-scrn.h, src/backend-teix.c, src/backend-teix.h, src/backend.c, src/backend.h, src/backendn-html.c, src/backendn-html.h, src/backendn-notex.c, src/backendn-notex.h, src/backendn-scrn.c, src/backendn-scrn.h, src/bib2ris.c, src/bib2ris.h, src/cgi.c, src/cgi.h, src/client-commands.c, src/client-commands.h, src/connect.c, src/dbfncs.c, src/dbfncs.h, src/eenc.c, src/enigma.c, src/enigma.h, src/linklist.c, src/linklist.h, src/mset.c, src/mset.h, src/nmed2ris.c, src/nmed2ris.h, src/noteshandler.c, src/noteshandler.h, src/outformats.h, src/page.c, src/page.h, src/passwd.c, src/passwd.h, src/pref.c, src/pref.h, src/readln.c, src/readln.h, src/readris.c, src/readris.h, src/refdb-client.c, src/refdb-client.h, src/refdb.h, src/refdba.c, src/refdba.h, src/refdbc.c, src/refdbc.h, src/refdbd.c, src/refdbda.c, src/refdbdbib.c, src/refdbdcheckref.c, src/refdbdcheckref.h, src/refdbdgetref.c, src/refdbdgetref.h, src/refdbdgetrefx.c, src/refdbdgetrefx.h, src/refdbdnote.c, src/refdbdref.c, src/refdbdupdb.c, src/refdbdupdb.h, src/refdbib.c, src/refdbib.h, src/refdbxp.c, src/risdata.c, src/risdata.h, src/risdb.c, src/risdb.h, src/risxhandler.c, src/risxhandler.h, src/rtfhelper.c, src/rtfhelper.h, src/strfncs.c, src/strfncs.h, src/tokenize.c, src/tokenize.h, src/writenote.c, src/writenote.h, src/writeris.c, src/writeris.h, src/xmlhandler.c, src/xmlhandler.h, src/xmlhelper.c, src/xmlhelper.h, src/xmlout.c, src/xmlout.h: updated GPL contact address * [r774] autogen.sh: instruct automake to copy files rather than symlink them 2013-12-21 mhoenicka * [r773] doc/RefDB.7.xml, doc/bib2ris.1.xml, doc/db2ris.1.xml, doc/eenc.1.xml, doc/en2ris.1.xml, doc/marc2ris.1.xml, doc/med2ris.1.xml, doc/refdb-backup.1.xml, doc/refdb-bug.1.xml, doc/refdb-init.8.xml, doc/refdb-ms.1.xml, doc/refdb-pubmed.1.xml, doc/refdb-restore.1.xml, doc/refdb-sruserver.1.xml, doc/refdb.8.xml, doc/refdb_dos2unix.1.xml, doc/refdb_latex2utf8txt.1.xml, doc/refdba.1.xml, doc/refdbc.1.xml, doc/refdbctl.1.xml, doc/refdbd.1.xml, doc/refdbib.1.xml, doc/refdbjade.1.xml, doc/refdbnd.1.xml, doc/refdbrtf.1.xml, doc/refdbsru.1.xml, doc/refdbxml.1.xml, doc/refdbxp.1.xml, doc/rtfcitations.1.xml, doc/runbib-missing.1.xml, doc/runbib.1.xml: replaced hard-coded /usr/local path with PREFIX * [r772] scripts/refdb-backup, scripts/refdb-restore: fixed bashisms in redirections 2013-12-20 mhoenicka * [r771] xsl/refdb/docbk-refdb-xsl/docbk-fo/Makefile.am, xsl/refdb/docbk-refdb-xsl/docbk-html/Makefile.am, xsl/refdb/docbk-refdb-xsl/docbk-xhtml/Makefile.am: fixed DocBook namespaced stylesheet build errors 2013-12-19 mhoenicka * [r770] scripts/refdb-init.in: suppress echoing the password 2013-12-05 mhoenicka * [r769] doc/Makefile.am: fixed html building problems 2013-12-03 mhoenicka * [r768] configure.ac: added check for log() as we have to link against libm on some systems * [r767] autogen.sh: added --force-missing to automake to get rid of warning about outdated missing script 2013-12-02 mhoenicka * [r766] configure.ac, configure.in: rename configure.in to configure.ac to make newer autotools happy 2013-11-29 mhoenicka * [r765] src/backend-dbib.h, src/refdbdbib.c, src/refdbdupdb.c, src/risdata.h: fixed build warnings and errors with latest libdbi revision 2012-12-20 mhoenicka * [r764] scripts/refdb-backup, scripts/refdb-init.in, scripts/refdb-restore, scripts/refdb.in, scripts/refdbnd.in: changed echo calls to printf calls or rewrote echo calls to be compatible with dash on Debian which does not support echo -e 2012-12-15 mhoenicka * [r763] src/risdb.c: fixed buffer overflow in process_ris_set(), see Debian bug #695846 * [r762] src/backend-mods.c: fixed char* vs. const char* problem in add_partinfo_mods(), see Debian bug #695846 2012-10-10 mhoenicka * [r761] configure.in: removed Term::Clui check as this is done when the Makestyle.pm module is built 2012-10-07 mhoenicka * [r760] scripts/Makefile.am: added refdb-missing to EXTRA_DIST 2012-10-03 mhoenicka * [r758] doc/chapter-installation.xml: added comment about PID file write access for PostgreSQL admins * [r757] src/bib2ris.c, src/cgi.c, src/refdb-client.c, src/refdba.c, src/refdbc.c, src/refdbd.c, src/refdbib.c: Mathieu's patch to fix improper use of fprintf() and related functions; bug ID 3573740 2012-09-11 mhoenicka * [r756] doc/chapter-bibliographies.xml: fixed include path in xsltproc example, thanks Tim 2012-02-01 mhoenicka * [r755] src/backend-db31.c: fixed missing edition in BOOK and related types 2012-01-26 mhoenicka * [r754] src/backend-db31.c: fixed VL export 2011-09-20 mhoenicka * [r753] src/dbfncs.c, src/refdbd.h.in: fixed LIBDBI_LIB_CURRENT checks 2011-09-15 mhoenicka * [r752] scripts/refdb-init.in: various fixes to connect to a database engine that requires explicit hostname or port settings 2011-07-26 mhoenicka * [r751] src/backend-dbiba.c: fixed lineage and honorific output for DocBook V5.0 2011-07-18 mhoenicka * [r750] scripts/med2ris.in: save article PMID as L2 2011-04-15 mhoenicka * [r747] scripts/refdb.3.dump.mysql41.in, scripts/refdb.3.dump.pgsql.in, scripts/refdb.3.dump.sqlite.in: added PHYSIOLOGY * [r746] scripts/runbib-missing: close infile when done * [r745] scripts/runbib.in: comment edits 2011-03-31 mhoenicka * [r744] styles/Ann.Thorac.Surg.xml: fixed DISPLAYAUTHOR vs. MAXAUTHOR errors 2011-03-09 mhoenicka * [r743] styles/authoryear-de.xml: changed to FULL pagerange 2011-03-08 mhoenicka * [r742] configure.in: added runbib-missing to client_scripts variable * [r741] doc/chapter-refdbib.xml: added runbib-missing man page * [r740] configure.in, doc/Makefile.am, doc/runbib-missing.1.xml: added runbib-missing man page 2011-03-07 mhoenicka * [r739] scripts/runbib-missing: added alternate invocation method * [r738] scripts/Makefile.am, scripts/runbib-missing: added runbib-missing script 2011-03-05 mhoenicka * [r737] styles/authoryear-de.xml: minor style fixes 2011-03-04 mhoenicka * [r736] styles/Z.Geburtsh.Neonatol.xml: minor style fixes * [r735] styles/Makefile.am: added Z.Geburtsh.Neonatol. style * [r734] styles/Z.Geburtsh.Neonatol.xml: added Z.Geburtsh.Neonatol. style 2011-03-03 mhoenicka * [r733] scripts/med2ris.in: added Abstract label handling 2011-02-20 mhoenicka * [r731] styles/J.Tissue_Eng.Regen.Med.xml: minor colon fixes * [r730] styles/J.Tissue_Eng.Regen.Med.xml, styles/Makefile.am: added J.Tissue_Eng.Regen.Med. style 2011-02-01 mhoenicka * [r729] styles/Ann.Thorac.Surg.xml: style fixes * [r728] xsl/refdb/docbk-refdb-xsl/docbk-fo/Makefile.am, xsl/refdb/docbk-refdb-xsl/docbk-html/Makefile.am, xsl/refdb/docbk-refdb-xsl/docbk-xhtml/Makefile.am: include proper namespaced base stylesheet if local copies of docbook stylesheets are used * [r727] styles/Ann.Thorac.Surg.xml, styles/Makefile.am: added Ann.Thorac.Surg. style 2011-01-16 mhoenicka * [r726] src/refdbdupdb.c: changed dbi_conn_new() calls to my_dbi_conn_new() * [r725] doc/Makefile.am: fixed dtd documentation installation problem 2011-01-15 mhoenicka * [r724] doc/Makefile.am: temporary workaround for a null pointer exception in fop 1.0 * [r723] doc/chapter-bibliographies.xml, doc/refdb-pubmed.1.xml: minor fixes to make fop-1.0 happy * [r722] acinclude.m4, configure.in: some fixes for newer autotools 2010-11-22 mhoenicka * [r721] styles/Makefile.am, styles/authoryear-de.xml: added authoryear-de style; simplified Makefile 2010-08-12 mhoenicka * [r720] scripts/refdbxml.in: added fop to rtf_generators; requires fop 1.0 or later 2010-05-25 mhoenicka * [r718] scripts/refdb.3.dump.mysql41.in, scripts/refdb.3.dump.pgsql.in, scripts/refdb.3.dump.sqlite.in: added a couple of reserved words 2010-02-22 mhoenicka * [r717] doc/chapter-bibliographies.xml: added note about removing duplicates from .aux files 2010-02-11 mhoenicka * [r716] dtd/risx.dtd: added conftitle element * [r715] src/backend-risx.c, src/risxhandler.c: added import and export of conftitle element 2010-02-09 mhoenicka * [r714] src/backend.c: has_periodical_data(): added CONF to let risx output export the proceedings title rather than the conference title 2010-01-09 mhoenicka * [r713] src/backend-html.c, src/backend-scrn.c: fixed inconsistent type string checking regarding L1-L4 fields 2009-12-19 mhoenicka * [r712] src/risdb.c: process_ris_set(): fixed off-by-one error in strncpy() 2009-11-23 mhoenicka * [r711] scripts/refdb.3.dump.mysql41.in, scripts/refdb.3.dump.pgsql.in, scripts/refdb.3.dump.sqlite.in: added BIOCHEMICA as journal word * [r710] scripts/refdb-pubmed: added defaults to help string 2009-10-29 mhoenicka * [r709] configure.in, doc/Makefile.am, doc/chapter-data-input.xml, doc/chapter-refdbc.xml, doc/refdb-pubmed.1.xml, scripts/Makefile.am: added refdb-pubmed * [r708] scripts/refdb-pubmed: implemented command line options, improved input data splitting * [r707] scripts/marc2ris.in, scripts/med2ris.in: added dependencies in comment 2009-10-28 mhoenicka * [r706] scripts/refdb-pubmed: initial version 2009-10-14 mhoenicka * [r705] src/refdbdgetref.c: allow retrieving references linked to public extended notes of other users 2009-10-05 mhoenicka * [r704] doc/chapter-data-input.xml, dtd/xnote.dtd: allow refid value for xnote link type attribute 2009-10-04 mhoenicka * [r703] src/refdbdgetref.c: group references before sending to speed up getref queries * [r702] src/refdbd.c: use sqlite3 as default db engine if none is specified 2009-09-17 mhoenicka * [r701] src/backend.c: request_ulinks():another fix for the ulink retrieval code to catch URL and DOI links even when private links are requested * [r699] styles/Biochem.Pharmacol.xml, styles/J.Vasc.Res.xml: minor style fixes * [r698] styles/Biochem.Pharmacol.xml, styles/Makefile.am: added Biochem.Pharmacol. style * [r697] styles/Biomaterials.xml: minor fix in authorlist 2009-09-15 mhoenicka * [r696] src/noteshandler.c, src/refdbdnote.c: addlink: fixed handling of :CK: as :ID: * [r695] src/backend.c: add_root_to_link(): fixed off-by-one error when assembling full links from partial links 2009-08-08 mhoenicka * [r693] src/xmlout.c: added TEXTED output 2009-08-04 mhoenicka * [r691] doc/chapter-bibliographies.xml, doc/runbib.1.xml: added or fixed comments about using xslt driver files 2009-07-31 mhoenicka * [r690] scripts/refdbxml.in: read fop_command correctly from config file 2009-07-30 mhoenicka * [r689] etc/refdbxmlrc, scripts/refdbxml.in: changed XML processing to call FOP shell script rather than trying to figure out the arcane java command line/classpath braindeadness ourselves 2009-07-29 mhoenicka * [r688] src/refdbd.c, src/refdbd.h.in, src/refdbda.c, src/refdbdbib.c, src/refdbdnote.c, src/refdbdref.c, src/risdb.c: changed new_addresult() to take a size parameter; allocate message string; remove allocations from calling functions 2009-07-28 mhoenicka * [r687] src/refdbdref.c: fixed writes to uninitialized addresult struct 2009-07-27 mhoenicka * [r686] src/refdbd.c: proper check for username prefix in list names 2009-07-23 mhoenicka * [r685] doc/chapter-data-input.xml: moved AB synonym from N2 to N1 according to the RIS spec 2009-06-15 mhoenicka * [r684] src/risdb.c, src/risxhandler.c: added ID to addref/updateref output 2009-06-04 mhoenicka * [r683] configure.in, scripts/refdb-bug.in: fixed refdb-bug * [r682] etc/nmed2riscgirc, etc/nmed2risrc: removed obsolete config files 2009-05-27 mhoenicka * [r681] styles/Br.J.Pharmacol.xml: fixed two authors separator * [r680] styles/Br.J.Pharmacol.xml: fixed last author separator * [r679] styles/Br.J.Pharmacol.xml: updated style to Wiley format 2009-05-23 mhoenicka * [r678] examples/xnoteset.xml: updated to match latest dtd revision * [r677] src/noteshandler.c, src/refdbdnote.c, src/refdbdref.c, src/risdb.c, src/risdb.h: remove_xnote_entries() now takes additional note_id parameter, fixes erroneous removal of too many links when running deletelink * [r676] src/backend.c: added aliases to SQL functions to fix sqlite/sqlite3 driver problems 2009-05-13 mhoenicka * [r675] scripts/Makefile.am, scripts/refdbctl.in: refdbctl now honors the pidfile setting in refdbdrc 2009-05-02 mhoenicka * [r674] src/refdba.c: make sure newuser_passwd is not encrypted if -x is used 2009-04-30 mhoenicka * [r673] doc/refdba.1.xml: documented -x options and usage of plain-text passwords * [r672] doc/chapter-refdbd-administration.xml, doc/refdba.1.xml, doc/refdbc.1.xml, doc/refdbd.1.xml, doc/refdbib.1.xml: documented -x options and usage of plain-text passwords 2009-04-29 mhoenicka * [r671] src/refdb-client.c, src/refdba.c, src/refdbc.c, src/refdbd.c, src/refdbib.c: added command line switches and configure options to use unencrypted passwords 2009-04-17 mhoenicka * [r670] src/backend.c: fixed ulink retrieval code to avoid retrieving public links if private ones are requested * [r669] src/backend-risx.c: set flag in link retrieval code to promote changes upstream even if only links are in pubinfo 2009-03-16 mhoenicka * [r668] doc/chapter-data-input.xml, doc/chapter-inout-formats.xml, doc/chapter-introduction.xml, doc/chapter-managing-notes.xml, doc/chapter-managing-references.xml, doc/chapter-refdbc.xml: changed urls of DTDs to point to the documentation rather than to the DTD files * [r667] dtd/xnote.dtd: made contents element optional 2009-03-03 mhoenicka * [r666] styles/Ann.Biomed.Eng.xml: fixed minor errors * [r664] styles/Ann.Biomed.Eng.xml, styles/Makefile.am: added Ann.Biomed.Eng. style * [r663] styles/Artif.Organs.xml: fixed CONF type 2009-03-01 mhoenicka * [r662] doc/chapter-cs-protocol.xml: fixed -s option description * [r661] doc/chapter-cs-protocol.xml: added updateref and checkref to addref protocol; fixed -p description 2009-02-28 mhoenicka * [r660] src/refdbdgetref.c, src/refdbdnote.c: fixed off-by-one error in string length of iconv results * [r659] src/risxhandler.c: risx_end_handler(): use full as default title type attribute * [r658] dtd/risx.dtd: removed + from entry content model; title type uses full as default instead of requiring the attribute; bumped up version number to 1.3.0 * [r657] src/backend-scrn.c: fixed uninitialized and unused role string in CHAP editor output * [r656] styles/Artif.Organs.xml: added more dots * [r654] styles/Artif.Organs.xml: couple of fixes 2009-02-27 mhoenicka * [r653] styles/Artif.Organs.xml, styles/Makefile.am: added Artif.Organs 2009-02-22 mhoenicka * [r652] doc/chapter-cs-protocol.xml: added bibliography style info to -s option 2009-02-18 mhoenicka * [r651] scripts/refdb.3.dump.mysql41.in, scripts/refdb.3.dump.pgsql.in, scripts/refdb.3.dump.sqlite.in: added STEM 2009-02-15 mhoenicka * [r650] doc/chapter-cs-protocol.xml: updated getref() protocol * [r649] src/refdbdgetref.c: getref() now checks requested buffer size * [r648] doc/chapter-cs-protocol.xml: fixed addref protocol errors found by Torsten 2009-02-13 mhoenicka * [r645] styles/ifmbe_proceedings.xml: removed comma from CHAP output * [r644] styles/Makefile.am: added ifmbe_proceedings.xml * [r643] styles/ifmbe_proceedings.xml: fixed texted vs. text * [r642] styles/ifmbe_proceedings.xml: initial version of IFMBE Proceedings style 2009-02-08 mhoenicka * [r641] doc/chapter-cs-protocol.xml: updated old protocol number, added hint where to find the constant 2009-01-31 mhoenicka * [r640] doc/refdba.1.xml: added hint about not using references as database name 2008-12-28 mhoenicka * [r639] styles/Br.J.Pharmacol.xml: minor style fixes * [r638] styles/Biochem.Biophys.Res.Commun.xml, styles/J.Vasc.Res.xml: minor style fixes 2008-12-27 mhoenicka * [r636] styles/Biochem.Biophys.Res.Commun.xml, styles/J.Vasc.Res.xml, styles/Makefile.am: added BBRC style 2008-12-23 mhoenicka * [r635] scripts/Makefile.am, scripts/bib2ris-utf8.in, scripts/refdb-bug.in, scripts/refdb-init.in, scripts/refdb.in, scripts/runbib.in: scripts now honor --program-prefix and --program-suffix 2008-11-18 mhoenicka * [r633] styles/Makefile.am: added Br.J.Pharmacol. * [r632] styles/Br.J.Pharmacol.xml: added Br.J.Pharmacol. style 2008-10-28 mhoenicka * [r630] styles/J.Vasc.Res.xml, styles/Makefile.am: implemented J.Vasc.Res. style * [r627] styles/J.Vasc.Res.xml: added J.Vasc.Res. style 2008-07-04 mhoenicka * [r625] src/backend-risx.c: fixed misplaced issue element in CHAP output 2008-06-09 mhoenicka * [r624] xsl/pubmed, xsl/pubmed/Makefile, xsl/pubmed/extractjournalwords.xsl, xsl/pubmed/extractjournalwordsxml.xsl, xsl/pubmed/extractserial.xsl: initial version of files to create a list of unabbreviated journal words and SQL scripts to load journal words and journal titles/abbreviations into RefDB databases 2008-06-06 mhoenicka * [r623] src/refdbd.c: fixed bug in nofork implementation 2008-05-28 mhoenicka * [r622] src/backend-db31.c, src/backend-teix.c, src/backendn-html.c, src/backendn-scrn.c, src/dbfncs.c, src/dbfncs.h, src/refdbd.c, src/refdbd.h.in, src/refdbdref.c: fixed compile problems on systems with libdbi 0.8.x * [r621] doc/include/manual-fo.xsl: fixed fop.extensions vs. fop1.extensions problem with newer fop version * [r620] configure.in: bumped up version number 2008-04-30 mhoenicka * [r619] src/risxhandler.c: fixed braindead empty author role checks in risx_end_handler(); fixes apparent loss of authors in bibtex output 2008-04-29 mhoenicka * [r618] doc/chapter-installation.xml: avoid naming refdb dump file versions explicitly * [r617] src/risxhandler.c: remove all ulink entries when updating; fixes URL duplication when updating risx datasets * [r616] src/refdbd.c: move Inst to ptr_clrequest->inst for initial connection; fixes refdbd -a segfault * [r615] src/dbfncs.c: added function comment * [r614] etc/refdbrtfrc: initial version 2008-03-10 mhoenicka * [r613] src/backend-bibtex.c, src/backend-dbib.c, src/backend-dbiba.c, src/backend-mods.c, src/backend-rtfbib.c, src/backend.c, src/dbfncs.c, src/dbfncs.h, src/refdbd.c, src/refdbd.h.in, src/refdbda.c, src/refdbdbib.c, src/refdbdref.c, src/refdbdupdb.c, src/rtfhelper.c, src/xmlhandler.c: updated for latest libdbi-1.0cvs interface * [r612] src/risdata.c, src/risdata.h, src/risdb.c, src/risxhandler.c: changed use dbi_conn_quote_string() instead of dbi_driver_quote_string() in set_risdata_dateinfo() 2008-02-09 mhoenicka * [r610] styles/J.Pharmacol.Exp.Ther.xml: updated style 2008-02-08 mhoenicka * [r609] src/xmlhandler.c: fixed ABBREVIATE bugs in style import 2008-02-05 mhoenicka * [r608] ChangeLog, NEWS, UPGRADING, configure.in, doc/Makefile.am, man/Makefile.am, scripts/refdbnd.in, scripts/refdbrtf.in, src/backend-rtfbib.c: updated for 1.0.0-pre1 2008-02-04 mhoenicka * [r607] doc/chapter-bibliographies.xml, doc/chapter-overview-clients.xml, doc/refdbib.1.xml, doc/refdbnd.1.xml, doc/refdbrtf.1.xml, doc/refdbxml.1.xml, scripts/refdbnd.in, scripts/refdbrtf.in, scripts/rtfcitations, src/backend-rtfbib.c: added some polish to RTF bibliographies; added RTF bibliographies to the manual and to the man pages 2008-02-02 mhoenicka * [r606] scripts/refdbrtf.in, scripts/rtfcitations, src/backend-rtfbib.c: first shot at multi-head RTF citations 2008-02-01 mhoenicka * [r605] doc/Makefile.am, doc/chapter-refdbib.xml, doc/refdbib.1.xml, examples/Makefile.am, examples/Makefile.rtf.template, scripts/refdbnd.in, scripts/runbib.in, src/backend-rtfbib.c, src/rtfhelper.c: first functional RTF bibliography support * [r604] configure.in, doc/refdbrtf.1.xml, doc/rtfcitations.1.xml, scripts/Makefile.am, scripts/refdbrtf.in, scripts/rtfcitations: added RTF helper scripts 2008-01-31 mhoenicka * [r603] src/backend-dbib.c, src/backend-rtfbib.c, src/refdbdbib.c, src/rtfhelper.c: fixed extra title in RTF references without authors * [r602] src/backend-dbiba.c, src/backend-rtfbib.c, src/refdbdbib.c, src/rtfhelper.c: fixed stack corruption in render_rtfbib() 2008-01-30 mhoenicka * [r601] src/Makefile.am, src/backend-dbib.c, src/backend-dbib.h, src/backend-dbiba.c, src/backend-rtfbib.c, src/backend-rtfbib.h, src/backend.c, src/backend.h, src/outformats.h, src/refdbd.c, src/refdbd.h.in, src/refdbdbib.c, src/refdbib.c, src/rtfhelper.c, src/rtfhelper.h, src/strfncs.c, src/strfncs.h: first shot at RTF bibliographies 2008-01-26 mhoenicka * [r600] doc/Makefile.am, doc/chapter-bibliographies.xml, doc/refdbmanualfig6.svg: added info about custom stylesheets 2008-01-24 mhoenicka * [r599] NEWS, configure.in, doc/chapter-bibliographies.xml, doc/chapter-refdbib.xml, doc/refdbc.1.xml, doc/runbib.1.xml, etc/runbibrc, examples/Makefile.template, scripts/Makefile.am, scripts/refdbnd.in, scripts/runbib.in, src/backend-dbiba.c, src/backend.c, xsl/refdb/docbk-refdb-xsl/docbk-fo/Makefile.am, xsl/refdb/docbk-refdb-xsl/docbk-fo/docbk-refdb-fo.xsl.in, xsl/refdb/docbk-refdb-xsl/docbk-html/Makefile.am, xsl/refdb/docbk-refdb-xsl/docbk-html/docbk-refdb-html.xsl.in, xsl/refdb/docbk-refdb-xsl/docbk-xhtml/Makefile.am, xsl/refdb/docbk-refdb-xsl/docbk-xhtml/docbk-refdb-xhtml.xsl.in, xsl/refdb/tei-refdb-xsl/tei-fo/Makefile.am, xsl/refdb/tei-refdb-xsl/tei-fo/tei-refdb-fo.xsl.in, xsl/refdb/tei-refdb-xsl/tei-html/Makefile.am, xsl/refdb/tei-refdb-xsl/tei-html/tei-refdb-html.xsl.in: made driver file configurable per user or per project 2008-01-19 mhoenicka * [r598] scripts/refdb-init.in: avoid adding schemas.xml as a style * [r597] styles/CHA-MC.xml: fixed title style and author name rendering 2008-01-17 mhoenicka * [r596] src/xmlout.c: fixed style output (PRIMARY vs. PART and so on) 2007-12-20 mhoenicka * [r584] styles/J.Pharmacol.Exp.Ther.xml: added J.Pharmacol.Exp.Ther. * [r583] styles/Makefile.am: added J.Pharmacol.Exp.Ther. 2007-12-03 mhoenicka * [r582] phpweb/css/refdb-frequency.css, phpweb/css/refdb.css, phpweb/index.php.in: implemented number of references or index entries per page as preferences 2007-12-02 mhoenicka * [r581] phpweb/index.php.in: implemented paging for index searches 2007-11-30 mhoenicka * [r580] phpweb/includes/refdblib.inc.php, phpweb/index.php.in: implemented result list paging 2007-11-24 mhoenicka * [r578] styles/Biomaterials.xml, styles/Tissue_Eng.xml: microfixes * [r577] scripts/xslns.pl: added xlink namespace for DocBook output;changed href to xl:href 2007-11-22 mhoenicka * [r576] src/backend-dbiba.c: avoid double trailing periods in journal names * [r574] src/backend-dbiba.c, src/xmlhandler.c: fixed double period problem after authornames; fixed sort order if journalname is used instead of missing authors * [r573] styles/AMA.xml, styles/Chicago.xml: additional polish * [r572] dtd/citestylex.dtd: added JOURNALNAME to ALTERNATETEXT, additional SEQUENCEs to PUBDATE, and a MAXTITLE attribute to TITLE 2007-11-21 mhoenicka * [r569] styles/J.Biol.Chem.xml, styles/Turabian.xml, styles/citekey.xml: fixed style issues * [r568] src/backend-dbiba.c: remove personname and firstname/lastname wrappers from DocBook V5 output to get valid XML * [r567] src/refdbc.c: fixed AU vs. AX bug 2007-11-18 mhoenicka * [r562] scripts/runbib.in: fixed REFDOCBK5 vs. REFDOCBKX5 typo * [r561] styles/J.Biol.Chem.xml, styles/MLA.xml, styles/Murdoch.Law.xml, styles/Tissue_Eng.xml: assorted style fixes * [r560] src/backend-db31.c, src/backend-dbib.c, src/backend-dbib.h, src/backend-dbiba.c, src/backend-html.c, src/backend-mods.c, src/backend-risx.c, src/backend-teix.c, src/backendn-html.c, src/strfncs.c, src/strfncs.h, src/xmlhelper.c, src/xmlout.c: sgml_entitize() now uses the output type to select which entities to replace 2007-11-17 mhoenicka * [r559] styles/Eur.J.Pharmacol.xml, styles/Harvard.xml: fixed styles 2007-11-16 mhoenicka * [r558] styles/APA.xml, styles/Biomaterials.xml, styles/CHA-MC.xml: fixed styles * [r557] styles/AMA.xml, styles/Chicago.xml, styles/Harvard.xml, styles/MLA.xml, styles/Makefile.am, styles/Turabian.xml: added new styles * [r556] src/backend-bibtex.c, src/backend-dbib.c, src/backend-dbib.h, src/backend-dbiba.c, src/xmlhandler.c: assorted fixes for rendering bibliographies 2007-11-14 mhoenicka * [r555] scripts/xslns.pl: namespaced docbook uses link-href instead of ulink-url 2007-11-13 mhoenicka * [r553] src/backend-dbib.c, src/backend-dbiba.c: style-related bibliography output fixes 2007-11-10 mhoenicka * [r550] phpweb/includes/functions.inc.php, phpweb/index.php.in: fixed unicode handling in the edit form 2007-11-09 mhoenicka * [r549] phpweb/includes/functions.inc.php: fixed ELECT vs. ELEC typo in texts array 2007-11-08 mhoenicka * [r548] styles/CHA-MC.xml: initial version * [r547] doc/chapter-refdbd-administration.xml: fixed adduser -W vs. -N typos 2007-11-07 mhoenicka * [r545] styles/APA.xml: initial version * [r544] ChangeLog, configure.in, doc/chapter-installation.xml, styles/Makefile.am, styles/schemas.xml.in: updated for 0.9.9-1 * [r543] phpweb/includes/Makefile.am: added missing refdblib.inc.php refdb-1.0.2/Makefile.in000644 001750 001750 00000062542 12303475765 015534 0ustar00markusmarkus000000 000000 # Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = . DIST_COMMON = INSTALL NEWS README AUTHORS ChangeLog \ $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/configure $(am__configure_deps) \ $(top_srcdir)/./conf/mkinstalldirs COPYING ./conf/compile \ ./conf/config.guess ./conf/config.rpath ./conf/config.sub \ ./conf/depcomp install-sh ./conf/install-sh missing \ ./conf/missing mkinstalldirs ./conf/mkinstalldirs \ $(top_srcdir)/./conf/compile $(top_srcdir)/./conf/config.guess \ $(top_srcdir)/./conf/config.rpath \ $(top_srcdir)/./conf/config.sub \ $(top_srcdir)/./conf/install-sh $(top_srcdir)/./conf/missing ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(SHELL) $(top_srcdir)/./conf/mkinstalldirs CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ cscope distdir dist dist-all distcheck am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags CSCOPE = cscope DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best DIST_TARGETS = dist-gzip distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BIB2RIS = @BIB2RIS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ ULLSPEC = @ULLSPEC@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bib2ris_LDADD = @bib2ris_LDADD@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ classpath_root = @classpath_root@ client1_mans = @client1_mans@ client_bins = @client_bins@ client_etc_distobjects = @client_etc_distobjects@ client_etc_objects = @client_etc_objects@ client_mans = @client_mans@ client_scripts = @client_scripts@ client_subdirs = @client_subdirs@ datadir = @datadir@ datarootdir = @datarootdir@ db_dir = @db_dir@ docbk_xsl = @docbk_xsl@ docbk_xsl_ns = @docbk_xsl_ns@ docdir = @docdir@ docs_subdirs = @docs_subdirs@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ log_dir = @log_dir@ main_db = @main_db@ man_subdirs = @man_subdirs@ mandir = @mandir@ mkdir_p = @mkdir_p@ mybatik = @mybatik@ mydtdformat = @mydtdformat@ mydtdparse = @mydtdparse@ myjade = @myjade@ myperl = @myperl@ mysgrep = @mysgrep@ myshell = @myshell@ mysvnversion = @mysvnversion@ mytidy = @mytidy@ myxmlcatalog = @myxmlcatalog@ myxsltproc = @myxsltproc@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psarg = @psarg@ psdir = @psdir@ refdba_LDADD = @refdba_LDADD@ refdbc_LDADD = @refdbc_LDADD@ refdbd_LDADD = @refdbd_LDADD@ sbindir = @sbindir@ server8_mans = @server8_mans@ server_bins = @server_bins@ server_etc_distobjects = @server_etc_distobjects@ server_etc_objects = @server_etc_objects@ server_mans = @server_mans@ server_scripts = @server_scripts@ server_subdirs = @server_subdirs@ sgml_decl = @sgml_decl@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ svnversioncommand = @svnversioncommand@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ tei_xsl = @tei_xsl@ tei_xsl_ns = @tei_xsl_ns@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ trang_cmd = @trang_cmd@ var_dir = @var_dir@ xml_decl = @xml_decl@ SUBDIRS = @client_subdirs@ @server_subdirs@ @docs_subdirs@ @man_subdirs@ EXTRA_DIST = autogen.sh UPGRADING all: all-recursive .SUFFIXES: am--refresh: Makefile @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files distdir: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-hook -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) dist-tarZ: distdir @echo WARNING: "Support for shar distribution archives is" \ "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir @echo WARNING: "Support for distribution archives compressed with" \ "legacy program 'compress' is deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__post_remove_distdir) dist dist-all: $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-data-local install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ am--refresh check check-am clean clean-cscope clean-generic \ cscope cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \ dist-gzip dist-hook dist-lzip dist-shar dist-tarZ dist-xz \ dist-zip distcheck distclean distclean-generic distclean-tags \ distcleancheck distdir distuninstallcheck dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-data-local install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am dist-hook: $(mkinstalldirs) $(distdir)/conf cp -p conf/config.guess conf/config.sub conf/install-sh conf/missing conf/mkinstalldirs conf/config.rpath $(distdir)/conf install-data-local: $(mkinstalldirs) $(DESTDIR)$(localstatedir)/lib/refdb/db # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: refdb-1.0.2/Makefile.am000755 001750 001750 00000000710 11512721664 015504 0ustar00markusmarkus000000 000000 ## Process this file with automake to produce Makefile.in SUBDIRS = @client_subdirs@ @server_subdirs@ @docs_subdirs@ @man_subdirs@ EXTRA_DIST = autogen.sh UPGRADING ## here we add more distribution files dist-hook: $(mkinstalldirs) $(distdir)/conf cp -p conf/config.guess conf/config.sub conf/install-sh conf/missing conf/mkinstalldirs conf/config.rpath $(distdir)/conf install-data-local: $(mkinstalldirs) $(DESTDIR)$(localstatedir)/lib/refdb/db refdb-1.0.2/configure000755 001750 001750 00001021660 12303475772 015371 0ustar00markusmarkus000000 000000 #! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for refdb 1.0.2. # # # Copyright (C) 1992-1996, 1998-2012 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=: # Pre-4.2 versions of Zsh do 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_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } 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.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= 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 $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do 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_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_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 || $as_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" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error 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 if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # 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 as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # 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" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # 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 } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac 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 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then 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 -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' 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='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # 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'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/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= # Identity of this package. PACKAGE_NAME='refdb' PACKAGE_TARNAME='refdb' PACKAGE_VERSION='1.0.2' PACKAGE_STRING='refdb 1.0.2' PACKAGE_BUGREPORT='' PACKAGE_URL='' ac_unique_file="src/backend-ris.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='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS client1_mans client_mans server8_mans server_mans client_etc_distobjects server_etc_distobjects client_etc_objects server_etc_objects client_scripts server_scripts client_bins server_bins man_subdirs docs_subdirs client_subdirs server_subdirs trang_cmd psarg ULLSPEC db_dir main_db var_dir log_dir classpath_root tei_xsl_ns tei_xsl docbk_xsl_ns docbk_xsl xml_decl sgml_decl mysvnversion BIB2RIS bib2ris_LDADD refdbd_LDADD refdbc_LDADD refdba_LDADD LTLIBICONV LIBICONV EGREP GREP HAVESVNWC_FALSE HAVESVNWC_TRUE HAVESERVER_FALSE HAVESERVER_TRUE HAVEBATIK_FALSE HAVEBATIK_TRUE svnversioncommand mybatik mytidy mysgrep mydtdformat mydtdparse myxmlcatalog myxsltproc myperl myjade myshell CPP am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM host_os host_vendor host_cpu host build_os build_vendor build_cpu build target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_dependency_tracking with_libdbi_lib with_expat_lib with_btparse_lib with_sgml_declaration with_xml_declaration with_docbook_xsl with_docbook_xsl_ns with_tei_xsl with_tei_xsl_ns with_classpath_root with_var_dir with_log_dir with_main_db with_db_dir with_trang_jar enable_docs enable_manpages enable_server enable_clients with_gnu_ld enable_rpath with_libiconv_prefix ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # 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_TARNAME}' 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= ;; *) 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_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=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_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$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_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=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 ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_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'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. 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 # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" 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 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 .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # 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 -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | 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 .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" 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 refdb 1.0.2 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/refdb] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of refdb 1.0.2:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --disable-docs do not build and install the documentation. --disable-manpages do not build and install the man pages. --disable-server Exclude server. --disable-clients Exclude clients. --disable-rpath do not hardcode runtime library paths Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-libdbi-lib=DIR Find libdbi lib in DIR --with-expat-lib=DIR Find expat lib in DIR --with-btparse-lib=DIR Find btparse lib in DIR --with-sgml-declaration=PATH Use this file as SGML declaration --with-xml-declaration=PATH Use this file as XML declaration --with-docbook-xsl=PATH Path to the DocBook XSL stylesheet root --with-docbook-xsl-ns=PATH Path to the DocBook XSL NS stylesheet root --with-tei-xsl=PATH Path to the TEI XSL stylesheet root --with-tei-xsl-ns=PATH Path to the TEI XSL NS stylesheet root --with-classpath-root=PATH Path to a Java class repository for XSL processors --with-var-dir=PATH Path of a directory for PID files --with-log-dir=PATH Path of a directory for log files --with-main-db=name The name of the RefDB system database --with-db-dir=PATH Directory for database files --with-trang-jar=PATH specify the full path to trang --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-libiconv-prefix[=DIR] search for libiconv in DIR/include and DIR/lib --without-libiconv-prefix don't search for libiconv in includedir and libdir 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 (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory 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. Report bugs to the package provider. _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" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && 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=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_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 $as_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 refdb configure 1.0.2 generated by GNU Autoconf 2.69 Copyright (C) 2012 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 ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack 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 ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack 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 ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_type LINENO TYPE VAR INCLUDES # ------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=yes" 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 eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* 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 $2 (); /* 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_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func 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 refdb $as_me 1.0.2, which was generated by GNU Autoconf 2.69. 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=. $as_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=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append 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 as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset 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 $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" 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_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; 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 $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_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'; as_fn_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 $as_echo "/* confdefs.h */" > 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 cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } 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. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_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,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_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 # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_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. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## 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_aux_dir= for ac_dir in ./conf "$srcdir"/./conf; 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 as_fn_error $? "cannot find install-sh, install.sh, or shtool in ./conf \"$srcdir\"/./conf" "$LINENO" 5 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. # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac am__api_version='1.14' # 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. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&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 as_fn_executable_p "$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 rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir 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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$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' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P 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. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='refdb' VERSION='1.0.2' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi $as_echo "#define _GNU_SOURCE 1" >>confdefs.h 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&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 as_fn_executable_p "$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" $as_echo "$as_me:${as_lineno-$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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "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:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM 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. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.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 ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; 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 | *.dSYM | *.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 if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; 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 | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* 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 ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; 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 | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else 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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes 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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* 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" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg 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) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : 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_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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" 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 DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i 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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } 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 "$GCC"; then case $host in *) CFLAGS=$CFLAGS" -O2";; esac fi # Check whether --with-libdbi-lib was given. if test "${with_libdbi_lib+set}" = set; then : withval=$with_libdbi_lib; CFLAGS=$CFLAGS" -L$withval" fi # Check whether --with-expat-lib was given. if test "${with_expat_lib+set}" = set; then : withval=$with_expat_lib; CFLAGS=$CFLAGS" -L$withval" fi # Check whether --with-btparse-lib was given. if test "${with_btparse_lib+set}" = set; then : withval=$with_btparse_lib; CFLAGS=$CFLAGS" -L$withval" fi # Check whether --with-sgml-declaration was given. if test "${with_sgml_declaration+set}" = set; then : withval=$with_sgml_declaration; sgml_decl=$withval else sgml_decl="\$(pkgdatadir)/declarations/docbook.dcl" fi # Check whether --with-xml-declaration was given. if test "${with_xml_declaration+set}" = set; then : withval=$with_xml_declaration; xml_decl=$withval else xml_decl="\$(pkgdatadir)/declarations/xml.dcl" fi # Check whether --with-docbook-xsl was given. if test "${with_docbook_xsl+set}" = set; then : withval=$with_docbook_xsl; docbk_xsl=$withval else docbk_xsl="http://docbook.sourceforge.net/release/xsl/current" fi # Check whether --with-docbook-xsl-ns was given. if test "${with_docbook_xsl_ns+set}" = set; then : withval=$with_docbook_xsl_ns; docbk_xsl_ns=$withval else docbk_xsl_ns="http://docbook.sourceforge.net/release/xsl-ns/current" fi # Check whether --with-tei-xsl was given. if test "${with_tei_xsl+set}" = set; then : withval=$with_tei_xsl; tei_xsl=$withval else tei_xsl="http://www.tei-c.org/Stylesheets" fi # Check whether --with-tei-xsl-ns was given. if test "${with_tei_xsl_ns+set}" = set; then : withval=$with_tei_xsl_ns; tei_xsl_ns=$withval else tei_xsl_ns="http://www.tei-c.org/Stylesheets" fi # Check whether --with-classpath_root was given. if test "${with_classpath_root+set}" = set; then : withval=$with_classpath_root; classpath_root=$withval else classpath_root="" fi # Check whether --with-var_dir was given. if test "${with_var_dir+set}" = set; then : withval=$with_var_dir; var_dir=$withval else var_dir="\$(localstatedir)/run" fi # Check whether --with-log_dir was given. if test "${with_log_dir+set}" = set; then : withval=$with_log_dir; log_dir=$withval else log_dir="\$(localstatedir)/log" fi # Check whether --with-main_db was given. if test "${with_main_db+set}" = set; then : withval=$with_main_db; main_db=$withval else main_db="refdb" fi # Check whether --with-db_dir was given. if test "${with_db_dir+set}" = set; then : withval=$with_db_dir; db_dir=$withval else db_dir="\$(localstatedir)/lib/refdb/db" fi # Check whether --with-trang_jar was given. if test "${with_trang_jar+set}" = set; then : withval=$with_trang_jar; trang_cmd="java -jar "$withval else trang_cmd="cp" fi ac_docs="YES" # Check whether --enable-docs was given. if test "${enable_docs+set}" = set; then : enableval=$enable_docs; ac_docs="NO" fi if test "$ac_docs" = "YES"; then docs_subdirs="doc" else docs_subdirs="" fi ac_manpages="YES" # Check whether --enable-manpages was given. if test "${enable_manpages+set}" = set; then : enableval=$enable_manpages; ac_manpages="NO" fi if test "$ac_manpages" = "YES"; then man_subdirs="man" else man_subdirs="" fi ac_server="YES" # Check whether --enable-server was given. if test "${enable_server+set}" = set; then : enableval=$enable_server; ac_server="NO" fi if test "$ac_server" = "YES"; then server_subdirs="etc scripts src phpweb sru" server_bins="refdbd\$(EXEEXT)" server_scripts="refdbctl refdb-init refdbsru refdb-sruserver" server_etc_objects="refdbdrc.mysql.example refdbdrc.pgsql.example refdbdrc.sqlite.example refdbdrc.sqlite3.example refdbsrurc.example" server_etc_distobjects="refdbdrc refdbsrurc" server_mans="refdb.8 refdbd.1 refdb-init.8 refdbctl.1 refdbsru.1 refdb-sruserver.1" server8_mans="refdb.sh.8" else server_subdirs="" server_bins="" server_scripts="" server_etc_objects="" server_etc_distobjects="" server_mans="" server8_mans="" fi ac_client="YES" # Check whether --enable-clients was given. if test "${enable_clients+set}" = set; then : enableval=$enable_clients; ac_client="NO" fi if test "$ac_client" = "YES" && test "$ac_server" = "YES"; then client_subdirs="declarations dsssl dtd examples styles xsl" client_bins="refdbib\$(EXEEXT) refdbc\$(EXEEXT) refdba\$(EXEEXT) refdbxp\$(EXEEXT) eenc\$(EXEEXT)" client_scripts="refdbjade runbib runbib-missing db2ris refdb-bug refdbxml refdbrtf marc2ris med2ris en2ris refdbnd refdb_dos2unix refdb-ms refdb-backup refdb-restore refdb_latex2utf8txt bib2ris-utf8 rtfcitations refdb-pubmed" client_etc_objects="bib2risrc.example bib2riscgirc.example db2risrc.example refdbarc.example refdbcrc.example refdbcgirc.example refdbibrc.example med2risrc.example med2riscgirc.example marc2risrc.example refdbxmlrc.example refdbrtfrc.example refdbjaderc.example runbibrc.example" client_etc_distobjects="bib2risrc bib2riscgirc db2risrc refdbarc refdbcrc refdbcgirc refdbibrc med2risrc med2riscgirc marc2risrc refdbxmlrc refdbrtfrc refdbjaderc runbibrc" client_mans="RefDB.7 refdba.1 refdbc.1 refdbib.1 bib2ris.1 db2ris.1 en2ris.1 marc2ris.1 med2ris.1 eenc.1 refdb-backup.1 refdb-ms.1 refdb-restore.1 refdbjade.1 refdbnd.1 refdbxml.1 refdbrtf.1 runbib.1 runbib-missing.1 refdbxp.1 refdb-bug.1 refdb_dos2unix.1 refdb_latex2utf8txt.1 rtfcitations.1 refdb-pubmed.1" client1_mans="bib2ris-utf8.1" elif test "$ac_client" = "YES"; then client_subdirs="declarations dsssl dtd etc examples scripts src styles xsl" client_bins="refdbib\$(EXEEXT) refdbc\$(EXEEXT) refdba\$(EXEEXT) refdbxp\$(EXEEXT) eenc\$(EXEEXT)" client_scripts="refdbjade runbib runbib-missing db2ris refdb-bug refdbxml refdbrtf marc2ris med2ris en2ris refdbnd refdb_dos2unix refdb-ms refdb-backup refdb-restore refdb_latex2utf8txt bib2ris-utf8 rtfcitations refdb-pubmed" client_etc_objects="bib2risrc.example bib2riscgirc.example db2risrc.example refdbarc.example refdbcrc.example refdbcgirc.example refdbibrc.example med2risrc.example med2riscgirc.example marc2risrc.example refdbxmlrc.example refdbrtfrc.example refdbjaderc.example runbibrc.example" client_etc_distobjects="bib2risrc bib2riscgirc db2risrc refdbarc refdbcrc refdbcgirc refdbibrc med2risrc med2riscgirc marc2risrc refdbxmlrc refdbrtfrc refdbjaderc runbibrc" client_mans="RefDB.7 refdba.1 refdbc.1 refdbib.1 bib2ris.1 db2ris.1 en2ris.1 marc2ris.1 med2ris.1 eenc.1 refdb-backup.1 refdb-ms.1 refdb-restore.1 refdbjade.1 refdbnd.1 refdbxml.1 refdbrtf.1 runbib.1 runbib-missing.1 refdbxp.1 refdb-bug.1 refdb_dos2unix.1 refdb_latex2utf8txt.1 rtfcitations.1 refdb-pubmed.1" client1_mans="bib2ris-utf8.1" else client_subdirs="" client_bins="" client_scripts="" client_etc_objects="" client_etc_distobjects="" client_mans="" client1_mans="" fi for ac_prog in bash sh do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_myshell+:} false; then : $as_echo_n "(cached) " >&6 else case $myshell in [\\/]* | ?:[\\/]*) ac_cv_path_myshell="$myshell" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_myshell="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi myshell=$ac_cv_path_myshell if test -n "$myshell"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $myshell" >&5 $as_echo "$myshell" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$myshell" && break done if test "$ac_client" = "YES"; then for ac_prog in openjade jade do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_myjade+:} false; then : $as_echo_n "(cached) " >&6 else case $myjade in [\\/]* | ?:[\\/]*) ac_cv_path_myjade="$myjade" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_myjade="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi myjade=$ac_cv_path_myjade if test -n "$myjade"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $myjade" >&5 $as_echo "$myjade" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$myjade" && break done # Extract the first word of "perl", so it can be a program name with args. set dummy perl; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_myperl+:} false; then : $as_echo_n "(cached) " >&6 else case $myperl in [\\/]* | ?:[\\/]*) ac_cv_path_myperl="$myperl" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_myperl="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi myperl=$ac_cv_path_myperl if test -n "$myperl"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $myperl" >&5 $as_echo "$myperl" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "xsltproc", so it can be a program name with args. set dummy xsltproc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_myxsltproc+:} false; then : $as_echo_n "(cached) " >&6 else case $myxsltproc in [\\/]* | ?:[\\/]*) ac_cv_path_myxsltproc="$myxsltproc" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_myxsltproc="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi myxsltproc=$ac_cv_path_myxsltproc if test -n "$myxsltproc"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $myxsltproc" >&5 $as_echo "$myxsltproc" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "xmlcatalog", so it can be a program name with args. set dummy xmlcatalog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_myxmlcatalog+:} false; then : $as_echo_n "(cached) " >&6 else case $myxmlcatalog in [\\/]* | ?:[\\/]*) ac_cv_path_myxmlcatalog="$myxmlcatalog" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_myxmlcatalog="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi myxmlcatalog=$ac_cv_path_myxmlcatalog if test -n "$myxmlcatalog"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $myxmlcatalog" >&5 $as_echo "$myxmlcatalog" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test "$ac_docs" = "YES"; then # Extract the first word of "dtdparse", so it can be a program name with args. set dummy dtdparse; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_mydtdparse+:} false; then : $as_echo_n "(cached) " >&6 else case $mydtdparse in [\\/]* | ?:[\\/]*) ac_cv_path_mydtdparse="$mydtdparse" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_mydtdparse="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi mydtdparse=$ac_cv_path_mydtdparse if test -n "$mydtdparse"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $mydtdparse" >&5 $as_echo "$mydtdparse" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "dtdformat", so it can be a program name with args. set dummy dtdformat; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_mydtdformat+:} false; then : $as_echo_n "(cached) " >&6 else case $mydtdformat in [\\/]* | ?:[\\/]*) ac_cv_path_mydtdformat="$mydtdformat" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_mydtdformat="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi mydtdformat=$ac_cv_path_mydtdformat if test -n "$mydtdformat"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $mydtdformat" >&5 $as_echo "$mydtdformat" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "sgrep", so it can be a program name with args. set dummy sgrep; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_mysgrep+:} false; then : $as_echo_n "(cached) " >&6 else case $mysgrep in [\\/]* | ?:[\\/]*) ac_cv_path_mysgrep="$mysgrep" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_mysgrep="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi mysgrep=$ac_cv_path_mysgrep if test -n "$mysgrep"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $mysgrep" >&5 $as_echo "$mysgrep" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "tidy", so it can be a program name with args. set dummy tidy; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_mytidy+:} false; then : $as_echo_n "(cached) " >&6 else case $mytidy in [\\/]* | ?:[\\/]*) ac_cv_path_mytidy="$mytidy" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_mytidy="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi mytidy=$ac_cv_path_mytidy if test -n "$mytidy"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $mytidy" >&5 $as_echo "$mytidy" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "batik-rasterizer", so it can be a program name with args. set dummy batik-rasterizer; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_mybatik+:} false; then : $as_echo_n "(cached) " >&6 else case $mybatik in [\\/]* | ?:[\\/]*) ac_cv_path_mybatik="$mybatik" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_mybatik="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi mybatik=$ac_cv_path_mybatik if test -n "$mybatik"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $mybatik" >&5 $as_echo "$mybatik" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi # Extract the first word of "svnversion", so it can be a program name with args. set dummy svnversion; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_svnversioncommand+:} false; then : $as_echo_n "(cached) " >&6 else case $svnversioncommand in [\\/]* | ?:[\\/]*) ac_cv_path_svnversioncommand="$svnversioncommand" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_svnversioncommand="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi svnversioncommand=$ac_cv_path_svnversioncommand if test -n "$svnversioncommand"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $svnversioncommand" >&5 $as_echo "$svnversioncommand" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "X$svnversioncommand" = "X" || test `$svnversioncommand -n '.'` = "exported"; then mysvnversion="cat svn_dist_version" else mysvnversion="svnversion -n '.'" fi if test x$mybatik != "x"; then HAVEBATIK_TRUE= HAVEBATIK_FALSE='#' else HAVEBATIK_TRUE='#' HAVEBATIK_FALSE= fi if test "$ac_server" = "YES"; then HAVESERVER_TRUE= HAVESERVER_FALSE='#' else HAVESERVER_TRUE='#' HAVESERVER_FALSE= fi if test "X$svnversioncommand" != "X" && test `$svnversioncommand -n '.'` != "exported"; then HAVESVNWC_TRUE= HAVESVNWC_FALSE='#' else HAVESVNWC_TRUE='#' HAVESVNWC_FALSE= fi if test "$ac_client" = "YES"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tputs in -ltermcap" >&5 $as_echo_n "checking for tputs in -ltermcap... " >&6; } if ${ac_cv_lib_termcap_tputs+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ltermcap $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* 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 if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_termcap_tputs=yes else ac_cv_lib_termcap_tputs=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_termcap_tputs" >&5 $as_echo "$ac_cv_lib_termcap_tputs" >&6; } if test "x$ac_cv_lib_termcap_tputs" = xyes; then : rltestlib="-ltermcap" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tputs in -lncurses" >&5 $as_echo_n "checking for tputs in -lncurses... " >&6; } if ${ac_cv_lib_ncurses_tputs+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lncurses $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* 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 if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ncurses_tputs=yes else ac_cv_lib_ncurses_tputs=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ncurses_tputs" >&5 $as_echo "$ac_cv_lib_ncurses_tputs" >&6; } if test "x$ac_cv_lib_ncurses_tputs" = xyes; then : rltestlib="-lncurses" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tputs in -lcurses" >&5 $as_echo_n "checking for tputs in -lcurses... " >&6; } if ${ac_cv_lib_curses_tputs+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcurses $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* 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 if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_curses_tputs=yes else ac_cv_lib_curses_tputs=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curses_tputs" >&5 $as_echo "$ac_cv_lib_curses_tputs" >&6; } if test "x$ac_cv_lib_curses_tputs" = xyes; then : rltestlib="-lcurses" else echo "Cannot build refdb without either libtermcap, libncurses, or libcurses" exit 1 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for readline in -lreadline" >&5 $as_echo_n "checking for readline in -lreadline... " >&6; } if ${ac_cv_lib_readline_readline+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lreadline $rltestlib $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* 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 readline (); int main () { return readline (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_readline_readline=yes else ac_cv_lib_readline_readline=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_readline" >&5 $as_echo "$ac_cv_lib_readline_readline" >&6; } if test "x$ac_cv_lib_readline_readline" = xyes; then : refdba_LDADD=$refdba_LDADD" -lreadline "$rltestlib refdbc_LDADD=$refdbc_LDADD" -lreadline "$rltestlib else echo "Cannot build refdb without libreadline" exit 1 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libreadline version" >&5 $as_echo_n "checking for libreadline version... " >&6; } if test "$cross_compiling" = yes; then : ac_cv_lib_readline=old else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include char* rl_readline_name; int main(void) { exit(0); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_lib_readline=old else ac_cv_lib_readline=new fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline" >&5 $as_echo "$ac_cv_lib_readline" >&6; } if test "$ac_cv_lib_readline" = "old" ; then $as_echo "#define READLINE41 1" >>confdefs.h else $as_echo "#define READLINE42 1" >>confdefs.h fi fi if test "$ac_server" = "YES"; then if test "X$prefix" = "XNONE"; then acl_final_prefix="$ac_default_prefix" else acl_final_prefix="$prefix" fi if test "X$exec_prefix" = "XNONE"; then acl_final_exec_prefix='${prefix}' else acl_final_exec_prefix="$exec_prefix" fi acl_save_prefix="$prefix" prefix="$acl_final_prefix" eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" prefix="$acl_save_prefix" # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which # contains only /bin. Note that ksh looks also at the FPATH variable, # so we have to set that as well for the test. PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \ && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \ || PATH_SEPARATOR=';' } fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`echo "$ac_prog"| sed 's%\\\\%/%g'` while echo "$ac_prog" | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${acl_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then acl_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$acl_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then acl_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$acl_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${acl_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$acl_cv_prog_gnu_ld" >&6; } with_gnu_ld=$acl_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shared library run path origin" >&5 $as_echo_n "checking for shared library run path origin... " >&6; } if ${acl_cv_rpath+:} false; then : $as_echo_n "(cached) " >&6 else CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh . ./conftest.sh rm -f ./conftest.sh acl_cv_rpath=done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_rpath" >&5 $as_echo "$acl_cv_rpath" >&6; } wl="$acl_cv_wl" acl_libext="$acl_cv_libext" acl_shlibext="$acl_cv_shlibext" acl_libname_spec="$acl_cv_libname_spec" acl_library_names_spec="$acl_cv_library_names_spec" acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" acl_hardcode_direct="$acl_cv_hardcode_direct" acl_hardcode_minus_L="$acl_cv_hardcode_minus_L" # Check whether --enable-rpath was given. if test "${enable_rpath+set}" = set; then : enableval=$enable_rpath; : else enable_rpath=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then 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" as_fn_executable_p "$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 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_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 as_fn_arith $ac_count + 1 && ac_count=$as_val 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 if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then 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" as_fn_executable_p "$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 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_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 as_fn_arith $ac_count + 1 && ac_count=$as_val 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 if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" acl_libdirstem=lib acl_libdirstem2= case "$host_os" in solaris*) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit host" >&5 $as_echo_n "checking for 64-bit host... " >&6; } if ${gl_cv_solaris_64bit+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef _LP64 sixtyfour bits #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "sixtyfour bits" >/dev/null 2>&1; then : gl_cv_solaris_64bit=yes else gl_cv_solaris_64bit=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_solaris_64bit" >&5 $as_echo "$gl_cv_solaris_64bit" >&6; } if test $gl_cv_solaris_64bit = yes; then acl_libdirstem=lib/64 case "$host_cpu" in sparc*) acl_libdirstem2=lib/sparcv9 ;; i*86 | x86_64) acl_libdirstem2=lib/amd64 ;; esac fi ;; *) searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'` if test -n "$searchpath"; then acl_save_IFS="${IFS= }"; IFS=":" for searchdir in $searchpath; do if test -d "$searchdir"; then case "$searchdir" in */lib64/ | */lib64 ) acl_libdirstem=lib64 ;; */../ | */.. ) # Better ignore directories of this form. They are misleading. ;; *) searchdir=`cd "$searchdir" && pwd` case "$searchdir" in */lib64 ) acl_libdirstem=lib64 ;; esac ;; esac fi done IFS="$acl_save_IFS" fi ;; esac test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem" use_additional=yes acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" # Check whether --with-libiconv-prefix was given. if test "${with_libiconv_prefix+set}" = set; then : withval=$with_libiconv_prefix; if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" if test "$acl_libdirstem2" != "$acl_libdirstem" \ && ! test -d "$withval/$acl_libdirstem"; then additional_libdir="$withval/$acl_libdirstem2" fi fi fi fi LIBICONV= LTLIBICONV= INCICONV= LIBICONV_PREFIX= HAVE_LIBICONV= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='iconv ' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIBICONV="${LIBICONV}${LIBICONV:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$value" else : fi else found_dir= found_la= found_so= found_a= eval libname=\"$acl_libname_spec\" # typically: libname=lib$name if test -n "$acl_shlibext"; then shrext=".$acl_shlibext" # typically: shrext=.so else shrext= fi if test $use_additional = yes; then dir="$additional_libdir" if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then if test "$enable_rpath" = no \ || test "X$found_dir" = "X/usr/$acl_libdirstem" \ || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi if test "$acl_hardcode_direct" = yes; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else haveit= for x in $LDFLAGS $LIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir" fi if test "$acl_hardcode_minus_L" != no; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_a" else LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir -l$name" fi fi additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` if test "$name" = 'iconv'; then LIBICONV_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; */$acl_libdirstem2 | */$acl_libdirstem2/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'` if test "$name" = 'iconv'; then LIBICONV_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INCICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then INCICONV="${INCICONV}${INCICONV:+ }-I$additional_includedir" fi fi fi fi fi if test -n "$found_la"; then save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \ && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then haveit= if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \ || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LIBICONV="${LIBICONV}${LIBICONV:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) LIBICONV="${LIBICONV}${LIBICONV:+ }$dep" LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$dep" ;; esac done fi else LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$acl_hardcode_libdir_separator"; then alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" else for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then for found_dir in $ltrpathdirs; do LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-R$found_dir" done fi am_save_CPPFLAGS="$CPPFLAGS" for element in $INCICONV; do haveit= for x in $CPPFLAGS; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5 $as_echo_n "checking for iconv... " >&6; } if ${am_cv_func_iconv+:} false; then : $as_echo_n "(cached) " >&6 else am_cv_func_iconv="no, consider installing GNU libiconv" am_cv_lib_iconv=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : am_cv_func_iconv=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$am_cv_func_iconv" != yes; then am_save_LIBS="$LIBS" LIBS="$LIBS $LIBICONV" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : am_cv_lib_iconv=yes am_cv_func_iconv=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$am_save_LIBS" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv" >&5 $as_echo "$am_cv_func_iconv" >&6; } if test "$am_cv_func_iconv" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working iconv" >&5 $as_echo_n "checking for working iconv... " >&6; } if ${am_cv_func_iconv_works+:} false; then : $as_echo_n "(cached) " >&6 else am_save_LIBS="$LIBS" if test $am_cv_lib_iconv = yes; then LIBS="$LIBS $LIBICONV" fi if test "$cross_compiling" = yes; then : case "$host_os" in aix* | hpux*) am_cv_func_iconv_works="guessing no" ;; *) am_cv_func_iconv_works="guessing yes" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { int result = 0; /* Test against AIX 5.1 bug: Failures are not distinguishable from successful returns. */ { iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8"); if (cd_utf8_to_88591 != (iconv_t)(-1)) { static const char input[] = "\342\202\254"; /* EURO SIGN */ char buf[10]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_utf8_to_88591, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if (res == 0) result |= 1; iconv_close (cd_utf8_to_88591); } } /* Test against Solaris 10 bug: Failures are not distinguishable from successful returns. */ { iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646"); if (cd_ascii_to_88591 != (iconv_t)(-1)) { static const char input[] = "\263"; char buf[10]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_ascii_to_88591, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if (res == 0) result |= 2; iconv_close (cd_ascii_to_88591); } } /* Test against AIX 6.1..7.1 bug: Buffer overrun. */ { iconv_t cd_88591_to_utf8 = iconv_open ("UTF-8", "ISO-8859-1"); if (cd_88591_to_utf8 != (iconv_t)(-1)) { static const char input[] = "\304"; static char buf[2] = { (char)0xDE, (char)0xAD }; const char *inptr = input; size_t inbytesleft = 1; char *outptr = buf; size_t outbytesleft = 1; size_t res = iconv (cd_88591_to_utf8, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if (res != (size_t)(-1) || outptr - buf > 1 || buf[1] != (char)0xAD) result |= 4; iconv_close (cd_88591_to_utf8); } } #if 0 /* This bug could be worked around by the caller. */ /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */ { iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591"); if (cd_88591_to_utf8 != (iconv_t)(-1)) { static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337"; char buf[50]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_88591_to_utf8, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if ((int)res > 0) result |= 8; iconv_close (cd_88591_to_utf8); } } #endif /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is provided. */ if (/* Try standardized names. */ iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1) /* Try IRIX, OSF/1 names. */ && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1) /* Try AIX names. */ && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1) /* Try HP-UX names. */ && iconv_open ("utf8", "eucJP") == (iconv_t)(-1)) result |= 16; return result; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : am_cv_func_iconv_works=yes else am_cv_func_iconv_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi LIBS="$am_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv_works" >&5 $as_echo "$am_cv_func_iconv_works" >&6; } case "$am_cv_func_iconv_works" in *no) am_func_iconv=no am_cv_lib_iconv=no ;; *) am_func_iconv=yes ;; esac else am_func_iconv=no am_cv_lib_iconv=no fi if test "$am_func_iconv" = yes; then $as_echo "#define HAVE_ICONV 1" >>confdefs.h fi if test "$am_cv_lib_iconv" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libiconv" >&5 $as_echo_n "checking how to link with libiconv... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBICONV" >&5 $as_echo "$LIBICONV" >&6; } else CPPFLAGS="$am_save_CPPFLAGS" LIBICONV= LTLIBICONV= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing log" >&5 $as_echo_n "checking for library containing log... " >&6; } if ${ac_cv_search_log+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS="$LIBS" ac_cv_search_log="no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* 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 log (); int main () { return log (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_log="none required" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext test "$ac_cv_search_log" = "no" && for i in m; do LIBS="-l$i $ac_func_search_save_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* 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 log (); int main () { return log (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_log="-l$i" break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext done LIBS="$ac_func_search_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_log" >&5 $as_echo "$ac_cv_search_log" >&6; } if test "$ac_cv_search_log" != "no"; then test "$ac_cv_search_log" = "none required" || refdbd_LDADD="$refdbd_LDADD $ac_cv_search_log" else : fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing dlopen" >&5 $as_echo_n "checking for library containing dlopen... " >&6; } if ${ac_cv_search_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS="$LIBS" ac_cv_search_dlopen="no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* 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 dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_dlopen="none required" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext test "$ac_cv_search_dlopen" = "no" && for i in dl; do LIBS="-l$i $ac_func_search_save_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* 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 dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_dlopen="-l$i" break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext done LIBS="$ac_func_search_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_dlopen" >&5 $as_echo "$ac_cv_search_dlopen" >&6; } if test "$ac_cv_search_dlopen" != "no"; then test "$ac_cv_search_dlopen" = "none required" || refdbd_LDADD="$refdbd_LDADD $ac_cv_search_dlopen" else : fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing lt_dlopen" >&5 $as_echo_n "checking for library containing lt_dlopen... " >&6; } if ${ac_cv_search_lt_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS="$LIBS" ac_cv_search_lt_dlopen="no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* 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 lt_dlopen (); int main () { return lt_dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_lt_dlopen="none required" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext test "$ac_cv_search_lt_dlopen" = "no" && for i in ltdl; do LIBS="-l$i $ac_func_search_save_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* 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 lt_dlopen (); int main () { return lt_dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_lt_dlopen="-l$i" break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext done LIBS="$ac_func_search_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_lt_dlopen" >&5 $as_echo "$ac_cv_search_lt_dlopen" >&6; } if test "$ac_cv_search_lt_dlopen" != "no"; then test "$ac_cv_search_lt_dlopen" = "none required" || refdbd_LDADD="$refdbd_LDADD $ac_cv_search_lt_dlopen" else : fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dbi_initialize in -ldbi" >&5 $as_echo_n "checking for dbi_initialize in -ldbi... " >&6; } if ${ac_cv_lib_dbi_dbi_initialize+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldbi $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* 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 dbi_initialize (); int main () { return dbi_initialize (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dbi_dbi_initialize=yes else ac_cv_lib_dbi_dbi_initialize=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dbi_dbi_initialize" >&5 $as_echo "$ac_cv_lib_dbi_dbi_initialize" >&6; } if test "x$ac_cv_lib_dbi_dbi_initialize" = xyes; then : refdbd_LDADD=$refdbd_LDADD" -ldbi" else echo "Cannot build refdb without libdbi" exit 1 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing compress" >&5 $as_echo_n "checking for library containing compress... " >&6; } if ${ac_cv_search_compress+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS="$LIBS" ac_cv_search_compress="no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* 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 compress (); int main () { return compress (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_compress="none required" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext test "$ac_cv_search_compress" = "no" && for i in z; do LIBS="-l$i $ac_func_search_save_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* 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 compress (); int main () { return compress (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_compress="-l$i" break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext done LIBS="$ac_func_search_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_compress" >&5 $as_echo "$ac_cv_search_compress" >&6; } if test "$ac_cv_search_compress" != "no"; then test "$ac_cv_search_compress" = "none required" || refdbd_LDADD="$refdbd_LDADD $ac_cv_search_compress" else : fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing setsockopt" >&5 $as_echo_n "checking for library containing setsockopt... " >&6; } if ${ac_cv_search_setsockopt+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* 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 setsockopt (); int main () { return setsockopt (); ; return 0; } _ACEOF for ac_lib in '' socket; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_setsockopt=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_setsockopt+:} false; then : break fi done if ${ac_cv_search_setsockopt+:} false; then : else ac_cv_search_setsockopt=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_setsockopt" >&5 $as_echo "$ac_cv_search_setsockopt" >&6; } ac_res=$ac_cv_search_setsockopt if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing gethostbyname" >&5 $as_echo_n "checking for library containing gethostbyname... " >&6; } if ${ac_cv_search_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* 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 gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF for ac_lib in '' nsl; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_gethostbyname=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_gethostbyname+:} false; then : break fi done if ${ac_cv_search_gethostbyname+:} false; then : else ac_cv_search_gethostbyname=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_gethostbyname" >&5 $as_echo "$ac_cv_search_gethostbyname" >&6; } ac_res=$ac_cv_search_gethostbyname if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi if test "$ac_server" = "YES"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XML_ParserCreate in -lexpat" >&5 $as_echo_n "checking for XML_ParserCreate in -lexpat... " >&6; } if ${ac_cv_lib_expat_XML_ParserCreate+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lexpat $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* 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 XML_ParserCreate (); int main () { return XML_ParserCreate (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_expat_XML_ParserCreate=yes else ac_cv_lib_expat_XML_ParserCreate=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_expat_XML_ParserCreate" >&5 $as_echo "$ac_cv_lib_expat_XML_ParserCreate" >&6; } if test "x$ac_cv_lib_expat_XML_ParserCreate" = xyes; then : refdbd_LDADD=$refdbd_LDADD" -lexpat" else echo "Cannot build refdb without libexpat" exit 1 fi fi if test "$ac_client" = "YES"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for bt_initialize in -lbtparse" >&5 $as_echo_n "checking for bt_initialize in -lbtparse... " >&6; } if ${ac_cv_lib_btparse_bt_initialize+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lbtparse $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* 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 bt_initialize (); int main () { return bt_initialize (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_btparse_bt_initialize=yes else ac_cv_lib_btparse_bt_initialize=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_btparse_bt_initialize" >&5 $as_echo "$ac_cv_lib_btparse_bt_initialize" >&6; } if test "x$ac_cv_lib_btparse_bt_initialize" = xyes; then : bib2ris_LDADD=$bib2ris_LDADD" -lbtparse" BIB2RIS="bib2ris\$(EXEEXT)" else echo "libbtparse not found; bib2ris import filter will not be built" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else 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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* 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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* 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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* 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 if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h 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=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done ac_fn_c_check_type "$LINENO" "socklen_t" "ac_cv_type_socklen_t" "$ac_includes_default" if test "x$ac_cv_type_socklen_t" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SOCKLEN_T 1 _ACEOF fi case $host in *-sun-solaris*) ULLSPEC="%llu" psarg="-e" ;; *) ULLSPEC="%llu" psarg="ax" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else 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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* 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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* 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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* 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 if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi for ac_header in fcntl.h limits.h sys/file.h sys/time.h sys/ioctl.h syslog.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 $as_echo_n "checking for an ANSI C-conforming const... " >&6; } if ${ac_cv_c_const+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __cplusplus /* Ultrix mips cc rejects this sort of thing. */ typedef int charset[2]; const charset cs = { 0, 0 }; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this sort of thing. */ char tx; char *t = &tx; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; } bx; struct s *b = &bx; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; if (!foo) return 0; } return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_const=yes else ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 $as_echo "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then $as_echo "#define const /**/" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "pid_t" "ac_cv_type_pid_t" "$ac_includes_default" if test "x$ac_cv_type_pid_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define pid_t int _ACEOF fi ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 $as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } if ${ac_cv_header_time+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { if ((struct tm *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_time=yes else ac_cv_header_time=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 $as_echo "$ac_cv_header_time" >&6; } if test $ac_cv_header_time = yes; then $as_echo "#define TIME_WITH_SYS_TIME 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct tm is in sys/time.h or time.h" >&5 $as_echo_n "checking whether struct tm is in sys/time.h or time.h... " >&6; } if ${ac_cv_struct_tm+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { struct tm tm; int *p = &tm.tm_sec; return !p; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_struct_tm=time.h else ac_cv_struct_tm=sys/time.h fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_tm" >&5 $as_echo "$ac_cv_struct_tm" >&6; } if test $ac_cv_struct_tm = sys/time.h; then $as_echo "#define TM_IN_SYS_TIME 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking return type of signal handlers" >&5 $as_echo_n "checking return type of signal handlers... " >&6; } if ${ac_cv_type_signal+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { return *(signal (0, 0)) (0) == 1; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_type_signal=int else ac_cv_type_signal=void fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_signal" >&5 $as_echo "$ac_cv_type_signal" >&6; } cat >>confdefs.h <<_ACEOF #define RETSIGTYPE $ac_cv_type_signal _ACEOF for ac_func in strftime do : ac_fn_c_check_func "$LINENO" "strftime" "ac_cv_func_strftime" if test "x$ac_cv_func_strftime" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRFTIME 1 _ACEOF else # strftime is in -lintl on SCO UNIX. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for strftime in -lintl" >&5 $as_echo_n "checking for strftime in -lintl... " >&6; } if ${ac_cv_lib_intl_strftime+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* 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 strftime (); int main () { return strftime (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_strftime=yes else ac_cv_lib_intl_strftime=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_strftime" >&5 $as_echo "$ac_cv_lib_intl_strftime" >&6; } if test "x$ac_cv_lib_intl_strftime" = xyes; then : $as_echo "#define HAVE_STRFTIME 1" >>confdefs.h LIBS="-lintl $LIBS" fi fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working mkfifo" >&5 $as_echo_n "checking for working mkfifo... " >&6; } if test "$cross_compiling" = yes; then : ac_cv_func_mkfifo=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main(){ int error = 0; if (mkfifo("test_the_fifo", 0777) != 0) { error=1; } else { unlink("test_the_fifo"); } exit (error); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_mkfifo=yes else ac_cv_func_mkfifo=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mkfifo" >&5 $as_echo "$ac_cv_func_mkfifo" >&6; } if test $ac_cv_func_mkfifo = yes ; then $as_echo "#define HAVE_MKFIFO 1" >>confdefs.h fi for ac_func in gethostname select socket strcspn strstr strtoll atoll do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done if test "$ac_client" = "YES"; then as_ac_File=`$as_echo "ac_cv_file_$docbk_xsl/fo/docbook.xsl" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $docbk_xsl/fo/docbook.xsl" >&5 $as_echo_n "checking for $docbk_xsl/fo/docbook.xsl... " >&6; } if eval \${$as_ac_File+:} false; then : $as_echo_n "(cached) " >&6 else test "$cross_compiling" = yes && as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 if test -r "$docbk_xsl/fo/docbook.xsl"; then eval "$as_ac_File=yes" else eval "$as_ac_File=no" fi fi eval ac_res=\$$as_ac_File { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_File"\" = x"yes"; then : echo "DocBook XSL stylesheets found" else if test -n "$myxmlcatalog"; then if test -r /etc/xml/catalog; then refdb_xml_catalog="/etc/xml/catalog" else refdb_xml_catalog=$XML_CATALOG_FILES fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XML file ${docbk_xsl}/fo/docbook.xsl" >&5 $as_echo_n "checking for XML file ${docbk_xsl}/fo/docbook.xsl... " >&6; } xml_file=`$myxmlcatalog $refdb_xml_catalog ${docbk_xsl}/fo/docbook.xsl` xml_file=`echo $xml_file | sed 's%file://%%'` as_ac_File=`$as_echo "ac_cv_file_$xml_file" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $xml_file" >&5 $as_echo_n "checking for $xml_file... " >&6; } if eval \${$as_ac_File+:} false; then : $as_echo_n "(cached) " >&6 else test "$cross_compiling" = yes && as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 if test -r "$xml_file"; then eval "$as_ac_File=yes" else eval "$as_ac_File=no" fi fi eval ac_res=\$$as_ac_File { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_File"\" = x"yes"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: XML file found" >&5 $as_echo "XML file found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: XML file not found" >&5 $as_echo "XML file not found" >&6; } fi else echo "cannot locate DocBook XSL stylesheets via XML catalog" fi fi as_ac_File=`$as_echo "ac_cv_file_$docbk_xsl_ns/fo/docbook.xsl" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $docbk_xsl_ns/fo/docbook.xsl" >&5 $as_echo_n "checking for $docbk_xsl_ns/fo/docbook.xsl... " >&6; } if eval \${$as_ac_File+:} false; then : $as_echo_n "(cached) " >&6 else test "$cross_compiling" = yes && as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 if test -r "$docbk_xsl_ns/fo/docbook.xsl"; then eval "$as_ac_File=yes" else eval "$as_ac_File=no" fi fi eval ac_res=\$$as_ac_File { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_File"\" = x"yes"; then : echo "DocBook XSL NS stylesheets found" else if test -n "$myxmlcatalog"; then if test -r /etc/xml/catalog; then refdb_xml_catalog="/etc/xml/catalog" else refdb_xml_catalog=$XML_CATALOG_FILES fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XML file ${docbk_xsl_ns}/fo/docbook.xsl" >&5 $as_echo_n "checking for XML file ${docbk_xsl_ns}/fo/docbook.xsl... " >&6; } xml_file=`$myxmlcatalog $refdb_xml_catalog ${docbk_xsl_ns}/fo/docbook.xsl` xml_file=`echo $xml_file | sed 's%file://%%'` as_ac_File=`$as_echo "ac_cv_file_$xml_file" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $xml_file" >&5 $as_echo_n "checking for $xml_file... " >&6; } if eval \${$as_ac_File+:} false; then : $as_echo_n "(cached) " >&6 else test "$cross_compiling" = yes && as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 if test -r "$xml_file"; then eval "$as_ac_File=yes" else eval "$as_ac_File=no" fi fi eval ac_res=\$$as_ac_File { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_File"\" = x"yes"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: XML file found" >&5 $as_echo "XML file found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: XML file not found" >&5 $as_echo "XML file not found" >&6; } fi else echo "cannot locate DocBook XSL NS stylesheets via XML catalog" fi fi as_ac_File=`$as_echo "ac_cv_file_$tei_xsl/p4/fo/tei.xsl" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $tei_xsl/p4/fo/tei.xsl" >&5 $as_echo_n "checking for $tei_xsl/p4/fo/tei.xsl... " >&6; } if eval \${$as_ac_File+:} false; then : $as_echo_n "(cached) " >&6 else test "$cross_compiling" = yes && as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 if test -r "$tei_xsl/p4/fo/tei.xsl"; then eval "$as_ac_File=yes" else eval "$as_ac_File=no" fi fi eval ac_res=\$$as_ac_File { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_File"\" = x"yes"; then : echo "TEI XSL stylesheets found" else if test -n "$myxmlcatalog"; then if test -r /etc/xml/catalog; then refdb_xml_catalog="/etc/xml/catalog" else refdb_xml_catalog=$XML_CATALOG_FILES fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XML file ${tei_xsl}/p4/fo/tei.xsl" >&5 $as_echo_n "checking for XML file ${tei_xsl}/p4/fo/tei.xsl... " >&6; } xml_file=`$myxmlcatalog $refdb_xml_catalog ${tei_xsl}/p4/fo/tei.xsl` xml_file=`echo $xml_file | sed 's%file://%%'` as_ac_File=`$as_echo "ac_cv_file_$xml_file" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $xml_file" >&5 $as_echo_n "checking for $xml_file... " >&6; } if eval \${$as_ac_File+:} false; then : $as_echo_n "(cached) " >&6 else test "$cross_compiling" = yes && as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 if test -r "$xml_file"; then eval "$as_ac_File=yes" else eval "$as_ac_File=no" fi fi eval ac_res=\$$as_ac_File { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_File"\" = x"yes"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: XML file found" >&5 $as_echo "XML file found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: XML file not found" >&5 $as_echo "XML file not found" >&6; } fi else echo "cannot locate TEI XSL stylesheets via XML catalog" fi fi as_ac_File=`$as_echo "ac_cv_file_$tei_xsl_ns/p5/fo/tei.xsl" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $tei_xsl_ns/p5/fo/tei.xsl" >&5 $as_echo_n "checking for $tei_xsl_ns/p5/fo/tei.xsl... " >&6; } if eval \${$as_ac_File+:} false; then : $as_echo_n "(cached) " >&6 else test "$cross_compiling" = yes && as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 if test -r "$tei_xsl_ns/p5/fo/tei.xsl"; then eval "$as_ac_File=yes" else eval "$as_ac_File=no" fi fi eval ac_res=\$$as_ac_File { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_File"\" = x"yes"; then : echo "TEI XSL NS stylesheets found" else if test -n "$myxmlcatalog"; then if test -r /etc/xml/catalog; then refdb_xml_catalog="/etc/xml/catalog" else refdb_xml_catalog=$XML_CATALOG_FILES fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XML file ${tei_xsl_ns}/p5/fo/tei.xsl" >&5 $as_echo_n "checking for XML file ${tei_xsl_ns}/p5/fo/tei.xsl... " >&6; } xml_file=`$myxmlcatalog $refdb_xml_catalog ${tei_xsl_ns}/p5/fo/tei.xsl` xml_file=`echo $xml_file | sed 's%file://%%'` as_ac_File=`$as_echo "ac_cv_file_$xml_file" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $xml_file" >&5 $as_echo_n "checking for $xml_file... " >&6; } if eval \${$as_ac_File+:} false; then : $as_echo_n "(cached) " >&6 else test "$cross_compiling" = yes && as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 if test -r "$xml_file"; then eval "$as_ac_File=yes" else eval "$as_ac_File=no" fi fi eval ac_res=\$$as_ac_File { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_File"\" = x"yes"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: XML file found" >&5 $as_echo "XML file found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: XML file not found" >&5 $as_echo "XML file not found" >&6; } fi else echo "cannot locate TEI XSL NS stylesheets via XML catalog" fi fi refdb_perl_command='print $]' { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Perl version" >&5 $as_echo_n "checking for Perl version... " >&6; } if ${refdb_cv_perl_version+:} false; then : $as_echo_n "(cached) " >&6 else if $myperl -e 'require 5.006;' > /dev/null 2>&1 ; then refdb_perl_version=`$myperl -e "$refdb_perl_command"` else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Perl 5.006 or greater is required for some scripts" >&5 $as_echo "$as_me: WARNING: Perl 5.006 or greater is required for some scripts" >&2;} fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $refdb_cv_perl_version" >&5 $as_echo "$refdb_cv_perl_version" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Perl module Text::Iconv" >&5 $as_echo_n "checking for Perl module Text::Iconv... " >&6; } if ${refdb_cv_iconv+:} false; then : $as_echo_n "(cached) " >&6 else if $myperl -e 'use Text::Iconv;' > /dev/null 2>&1 ; then refdb_cv_iconv=Text::Iconv else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Perl module Text::Iconv is required for some scripts" >&5 $as_echo "$as_me: WARNING: Perl module Text::Iconv is required for some scripts" >&2;} fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $refdb_cv_iconv" >&5 $as_echo "$refdb_cv_iconv" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Perl module RefDB::Makestyle" >&5 $as_echo_n "checking for Perl module RefDB::Makestyle... " >&6; } if ${refdb_cv_makestyle+:} false; then : $as_echo_n "(cached) " >&6 else if $myperl -e 'use RefDB::Makestyle;' > /dev/null 2>&1 ; then refdb_cv_makestyle=RefDB::Makestyle else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Perl module RefDB::Makestyle is required for some scripts" >&5 $as_echo "$as_me: WARNING: Perl module RefDB::Makestyle is required for some scripts" >&2;} fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $refdb_cv_makestyle" >&5 $as_echo "$refdb_cv_makestyle" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Perl module RefDB::Prefs" >&5 $as_echo_n "checking for Perl module RefDB::Prefs... " >&6; } if ${refdb_cv_prefs+:} false; then : $as_echo_n "(cached) " >&6 else if $myperl -e 'use RefDB::Prefs;' > /dev/null 2>&1 ; then refdb_cv_prefs=RefDB::Prefs else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Perl module RefDB::Prefs is required for some scripts" >&5 $as_echo "$as_me: WARNING: Perl module RefDB::Prefs is required for some scripts" >&2;} fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $refdb_cv_prefs" >&5 $as_echo "$refdb_cv_prefs" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Perl module RefDB::SRU" >&5 $as_echo_n "checking for Perl module RefDB::SRU... " >&6; } if ${refdb_cv_sru+:} false; then : $as_echo_n "(cached) " >&6 else if $myperl -e 'use RefDB::SRU;' > /dev/null 2>&1 ; then refdb_cv_sru=RefDB::SRU else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Perl module RefDB::SRU is required for some scripts" >&5 $as_echo "$as_me: WARNING: Perl module RefDB::SRU is required for some scripts" >&2;} fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $refdb_cv_sru" >&5 $as_echo "$refdb_cv_sru" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Perl module RefDB::SRUserver" >&5 $as_echo_n "checking for Perl module RefDB::SRUserver... " >&6; } if ${refdb_cv_sruserver+:} false; then : $as_echo_n "(cached) " >&6 else if $myperl -e 'use RefDB::SRUserver;' > /dev/null 2>&1 ; then refdb_cv_sruserver=RefDB::SRUserver else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Perl module RefDB::SRUserver is required for some scripts" >&5 $as_echo "$as_me: WARNING: Perl module RefDB::SRUserver is required for some scripts" >&2;} fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $refdb_cv_sruserver" >&5 $as_echo "$refdb_cv_sruserver" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Perl module XML::Parser" >&5 $as_echo_n "checking for Perl module XML::Parser... " >&6; } if ${refdb_cv_parser+:} false; then : $as_echo_n "(cached) " >&6 else if $myperl -e 'use XML::Parser;' > /dev/null 2>&1 ; then refdb_cv_parser=XML::Parser else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Perl module XML::Parser is required for some scripts" >&5 $as_echo "$as_me: WARNING: Perl module XML::Parser is required for some scripts" >&2;} fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $refdb_cv_parser" >&5 $as_echo "$refdb_cv_parser" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Perl module MARC::Record" >&5 $as_echo_n "checking for Perl module MARC::Record... " >&6; } if ${refdb_cv_record+:} false; then : $as_echo_n "(cached) " >&6 else if $myperl -e 'use MARC::Record;' > /dev/null 2>&1 ; then refdb_cv_record=MARC::Record else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Perl module MARC::Record is required for some scripts" >&5 $as_echo "$as_me: WARNING: Perl module MARC::Record is required for some scripts" >&2;} fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $refdb_cv_record" >&5 $as_echo "$refdb_cv_record" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Perl module MARC::Charset" >&5 $as_echo_n "checking for Perl module MARC::Charset... " >&6; } if ${refdb_cv_charset+:} false; then : $as_echo_n "(cached) " >&6 else if $myperl -e 'use MARC::Charset;' > /dev/null 2>&1 ; then refdb_cv_charset=MARC::Charset else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Perl module MARC::Charset is required for some scripts" >&5 $as_echo "$as_me: WARNING: Perl module MARC::Charset is required for some scripts" >&2;} fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $refdb_cv_charset" >&5 $as_echo "$refdb_cv_charset" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Perl module CGI" >&5 $as_echo_n "checking for Perl module CGI... " >&6; } if ${refdb_cv_cgi+:} false; then : $as_echo_n "(cached) " >&6 else if $myperl -e 'use CGI;' > /dev/null 2>&1 ; then refdb_cv_cgi=CGI else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Perl module CGI is required for some scripts" >&5 $as_echo "$as_me: WARNING: Perl module CGI is required for some scripts" >&2;} fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $refdb_cv_cgi" >&5 $as_echo "$refdb_cv_cgi" >&6; } fi ac_config_files="$ac_config_files src/Makefile scripts/Makefile etc/Makefile doc/Makefile dtd/Makefile declarations/Makefile examples/Makefile styles/Makefile phpweb/Makefile phpweb/css/Makefile phpweb/images/Makefile phpweb/includes/Makefile phpweb/xsl/Makefile sru/Makefile dsssl/Makefile dsssl/refdb/Makefile dsssl/refdb/html/Makefile dsssl/refdb/print/Makefile dsssl/refdb/lib/Makefile xsl/Makefile xsl/refdb/Makefile xsl/refdb/common-refdb/Makefile xsl/refdb/docbk-refdb-xsl/Makefile xsl/refdb/docbk-refdb-xsl/docbk-fo/Makefile xsl/refdb/docbk-refdb-xsl/docbk-html/Makefile xsl/refdb/docbk-refdb-xsl/docbk-xhtml/Makefile xsl/refdb/docbk-refdb-xsl/docbk-lib/Makefile xsl/refdb/tei-refdb-xsl/Makefile xsl/refdb/tei-refdb-xsl/tei-fo/Makefile xsl/refdb/tei-refdb-xsl/tei-html/Makefile xsl/refdb/tei-refdb-xsl/tei-lib/Makefile man/Makefile Makefile" 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_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; 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 if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_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}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= 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=`$as_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. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVEBATIK_TRUE}" && test -z "${HAVEBATIK_FALSE}"; then as_fn_error $? "conditional \"HAVEBATIK\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVESERVER_TRUE}" && test -z "${HAVESERVER_FALSE}"; then as_fn_error $? "conditional \"HAVESERVER\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVESVNWC_TRUE}" && test -z "${HAVESVNWC_FALSE}"; then as_fn_error $? "conditional \"HAVESVNWC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $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} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## 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=: # Pre-4.2 versions of Zsh do 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_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } 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.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= 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 $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith 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 if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # 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 ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac 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 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then 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 -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_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 || $as_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" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # 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 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=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 refdb $as_me 1.0.2, which was generated by GNU Autoconf 2.69. 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 case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent 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 Configuration files: $config_files Configuration commands: $config_commands Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ refdb config.status 1.0.2 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 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' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. 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=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= 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 ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_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. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append 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 || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "scripts/Makefile") CONFIG_FILES="$CONFIG_FILES scripts/Makefile" ;; "etc/Makefile") CONFIG_FILES="$CONFIG_FILES etc/Makefile" ;; "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; "dtd/Makefile") CONFIG_FILES="$CONFIG_FILES dtd/Makefile" ;; "declarations/Makefile") CONFIG_FILES="$CONFIG_FILES declarations/Makefile" ;; "examples/Makefile") CONFIG_FILES="$CONFIG_FILES examples/Makefile" ;; "styles/Makefile") CONFIG_FILES="$CONFIG_FILES styles/Makefile" ;; "phpweb/Makefile") CONFIG_FILES="$CONFIG_FILES phpweb/Makefile" ;; "phpweb/css/Makefile") CONFIG_FILES="$CONFIG_FILES phpweb/css/Makefile" ;; "phpweb/images/Makefile") CONFIG_FILES="$CONFIG_FILES phpweb/images/Makefile" ;; "phpweb/includes/Makefile") CONFIG_FILES="$CONFIG_FILES phpweb/includes/Makefile" ;; "phpweb/xsl/Makefile") CONFIG_FILES="$CONFIG_FILES phpweb/xsl/Makefile" ;; "sru/Makefile") CONFIG_FILES="$CONFIG_FILES sru/Makefile" ;; "dsssl/Makefile") CONFIG_FILES="$CONFIG_FILES dsssl/Makefile" ;; "dsssl/refdb/Makefile") CONFIG_FILES="$CONFIG_FILES dsssl/refdb/Makefile" ;; "dsssl/refdb/html/Makefile") CONFIG_FILES="$CONFIG_FILES dsssl/refdb/html/Makefile" ;; "dsssl/refdb/print/Makefile") CONFIG_FILES="$CONFIG_FILES dsssl/refdb/print/Makefile" ;; "dsssl/refdb/lib/Makefile") CONFIG_FILES="$CONFIG_FILES dsssl/refdb/lib/Makefile" ;; "xsl/Makefile") CONFIG_FILES="$CONFIG_FILES xsl/Makefile" ;; "xsl/refdb/Makefile") CONFIG_FILES="$CONFIG_FILES xsl/refdb/Makefile" ;; "xsl/refdb/common-refdb/Makefile") CONFIG_FILES="$CONFIG_FILES xsl/refdb/common-refdb/Makefile" ;; "xsl/refdb/docbk-refdb-xsl/Makefile") CONFIG_FILES="$CONFIG_FILES xsl/refdb/docbk-refdb-xsl/Makefile" ;; "xsl/refdb/docbk-refdb-xsl/docbk-fo/Makefile") CONFIG_FILES="$CONFIG_FILES xsl/refdb/docbk-refdb-xsl/docbk-fo/Makefile" ;; "xsl/refdb/docbk-refdb-xsl/docbk-html/Makefile") CONFIG_FILES="$CONFIG_FILES xsl/refdb/docbk-refdb-xsl/docbk-html/Makefile" ;; "xsl/refdb/docbk-refdb-xsl/docbk-xhtml/Makefile") CONFIG_FILES="$CONFIG_FILES xsl/refdb/docbk-refdb-xsl/docbk-xhtml/Makefile" ;; "xsl/refdb/docbk-refdb-xsl/docbk-lib/Makefile") CONFIG_FILES="$CONFIG_FILES xsl/refdb/docbk-refdb-xsl/docbk-lib/Makefile" ;; "xsl/refdb/tei-refdb-xsl/Makefile") CONFIG_FILES="$CONFIG_FILES xsl/refdb/tei-refdb-xsl/Makefile" ;; "xsl/refdb/tei-refdb-xsl/tei-fo/Makefile") CONFIG_FILES="$CONFIG_FILES xsl/refdb/tei-refdb-xsl/tei-fo/Makefile" ;; "xsl/refdb/tei-refdb-xsl/tei-html/Makefile") CONFIG_FILES="$CONFIG_FILES xsl/refdb/tei-refdb-xsl/tei-html/Makefile" ;; "xsl/refdb/tei-refdb-xsl/tei-lib/Makefile") CONFIG_FILES="$CONFIG_FILES xsl/refdb/tei-refdb-xsl/tei-lib/Makefile" ;; "man/Makefile") CONFIG_FILES="$CONFIG_FILES man/Makefile" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; 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_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands 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= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries 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[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[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="$ac_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 || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append 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 '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; 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 || $as_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"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_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 ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # 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= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 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 || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;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 s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_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 "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # 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 || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi echo if test "$ac_client" = "YES"; then if test -z "$refdb_cv_makestyle" || test -z "$refdb_cv_prefs" || test -z "$refdb_cv_parser" || test -z "$refdb_cv_record" || test -z "$refdb_cv_charset" || test -z "$refdb_cv_iconv" || test -z "$refdb_cv_clui" || test -z "$refdb_cv_sru" || test -z "$refdb_cv_sruserver" || test -z "$refdb_cv_cgi"; then echo "Your system seems to miss some of the recommended Perl modules. Please" echo "check the output above for details. It is safe to make and make install" echo "anyway, but some of the accessory Perl scripts will fail to run if the" echo " required modules are not installed. Please consult the manual where to" echo "get the missing modules from." echo fi fi echo "Configuration summary:" if test "$ac_client" = "YES"; then echo "will build clients" fi if test "$ac_server" = "YES"; then echo "will build server" fi if test "$ac_docs" = "YES"; then echo "will build docs" fi if test "$ac_manpages" = "YES"; then echo "will build man pages" fi echo "" echo "What you should do next:" echo "- run \"make\" to build RefDB." echo "- run \"make install\" as root to install everything." echo "- create the main database and the configuration files. Either run the" echo " refdb-init shell script as root, or peruse the handbook if you" echo " prefer a manual installation." echo "" refdb-1.0.2/acinclude.m4000644 001750 001750 00000005435 11514415522 015642 0ustar00markusmarkus000000 000000 dnl AC_SEARCH_LIBS_VAR(FUNCTION, SEARCH-LIBS [, ACTION-IF-FOUND dnl [, ACTION-IF-NOT-FOUND [, OTHER-LIBRARIES [, VAR]]]]) dnl Search for a library defining FUNC, if it's not already available. dnl If a library is needed, add it to VAR (typically prog_LDADD) but dnl not to LIBS AC_DEFUN([AC_SEARCH_LIBS_VAR], [AC_PREREQ([2.13]) AC_CACHE_CHECK([for library containing $1], [ac_cv_search_$1], [ac_func_search_save_LIBS="$LIBS" ac_cv_search_$1="no" AC_TRY_LINK_FUNC([$1], [ac_cv_search_$1="none required"]) test "$ac_cv_search_$1" = "no" && for i in $2; do LIBS="-l$i $5 $ac_func_search_save_LIBS" AC_TRY_LINK_FUNC([$1], [ac_cv_search_$1="-l$i" break]) done LIBS="$ac_func_search_save_LIBS"]) if test "$ac_cv_search_$1" != "no"; then test "$ac_cv_search_$1" = "none required" || $6="$$6 $ac_cv_search_$1" $3 else : $4 fi]) dnl AC_FUNC_MKFIFO dnl Test whether mkfifo(const char* pathname, mode_t mode) works dnl This is necessary to detect Cygwin mkfifo() which is a nonfunctional dnl stub AC_DEFUN([AC_FUNC_MKFIFO], [ AC_MSG_CHECKING(for working mkfifo) AC_TRY_RUN( changequote(<<, >>)dnl <<#include #include #include int main(){ int error = 0; if (mkfifo("test_the_fifo", 0777) != 0) { error=1; } else { unlink("test_the_fifo"); } exit (error); } >>, changequote([, ])dnl ac_cv_func_mkfifo=yes, ac_cv_func_mkfifo=no, ac_cv_func_mkfifo=no ) AC_MSG_RESULT($ac_cv_func_mkfifo) if test $ac_cv_func_mkfifo = yes ; then AC_DEFINE(HAVE_MKFIFO) fi ]) dnl Check for a required version of Perl. The separate shell variable and dnl the changequotes are necessary for autoconf 2.13; autoconf 2.50 will dnl provide a different interface that will allow this to work correctly. dnl stolen from Russ Allbery dnl REFDB_PERL_VERSION(perlbin, requiredversion) AC_DEFUN([REFDB_PERL_VERSION], [AC_CACHE_CHECK(for Perl version, refdb_cv_perl_version, [if $1 -e 'require $2;' > /dev/null 2>&1 ; then refdb_perl_version=`$1 -e "$refdb_perl_command"` else AC_MSG_WARN(Perl $2 or greater is required for some scripts) fi])]) dnl Dito, but check for the existence of a Perl module dnl REFDB_PERL_MODULE(perlbin,modulename,varname) AC_DEFUN([REFDB_PERL_MODULE], [AC_CACHE_CHECK(for Perl module $2, $3, [if $1 -e 'use $2;' > /dev/null 2>&1 ; then $3=$2 else AC_MSG_WARN(Perl module $2 is required for some scripts) fi])]) dnl Try to locate a stylesheet using xmlcatalog AC_DEFUN([REFDB_XML_FILE], [if test -r /etc/xml/catalog; then refdb_xml_catalog="/etc/xml/catalog" else refdb_xml_catalog=$XML_CATALOG_FILES fi AC_MSG_CHECKING(for XML file $2) xml_file=`$1 $refdb_xml_catalog $2` xml_file=`echo $xml_file | sed 's%file://%%'` AC_CHECK_FILE($xml_file,[ AC_MSG_RESULT(XML file found)],[ AC_MSG_RESULT(XML file not found, you may wish to check your XML catalog)] )]) refdb-1.0.2/configure.ac000755 001750 001750 00000041277 12303475740 015753 0ustar00markusmarkus000000 000000 dnl Process this file with autoconf to produce a configure script. dnl check for one of the source files AC_INIT(refdb, 1.0.2) AC_CONFIG_SRCDIR(src/backend-ris.c) dnl Find out host type AC_CONFIG_AUX_DIR(./conf) AC_CANONICAL_HOST dnl Use automake (shut off warnings about GNU make) AM_INIT_AUTOMAKE([-Wno-portability]) dnl switch on GNU extensions AC_DEFINE(_GNU_SOURCE) dnl see which compiler is available AC_PROG_CC AC_PROG_INSTALL AC_PROG_CPP dnl set some compile options (just a stub right now) if test -n "$GCC"; then case $host in *) CFLAGS=$CFLAGS" -O2";; esac fi dnl see where the libdbi lib is AC_ARG_WITH(libdbi-lib, [ --with-libdbi-lib=DIR Find libdbi lib in DIR], [CFLAGS=$CFLAGS" -L$withval"]) dnl see where expat lib is AC_ARG_WITH(expat-lib, [ --with-expat-lib=DIR Find expat lib in DIR], [CFLAGS=$CFLAGS" -L$withval"]) dnl see where btparse lib is AC_ARG_WITH(btparse-lib, [ --with-btparse-lib=DIR Find btparse lib in DIR], [CFLAGS=$CFLAGS" -L$withval"]) dnl need a sgml declaration AC_ARG_WITH(sgml-declaration, [ --with-sgml-declaration=PATH Use this file as SGML declaration], [sgml_decl=$withval], [sgml_decl="\$(pkgdatadir)/declarations/docbook.dcl"]) dnl need a xml declaration AC_ARG_WITH(xml-declaration, [ --with-xml-declaration=PATH Use this file as XML declaration], [xml_decl=$withval], [xml_decl="\$(pkgdatadir)/declarations/xml.dcl"]) dnl need the path to the docbook xsl stylesheets AC_ARG_WITH(docbook-xsl, [ --with-docbook-xsl=PATH Path to the DocBook XSL stylesheet root], [docbk_xsl=$withval], [docbk_xsl="http://docbook.sourceforge.net/release/xsl/current"]) dnl need the path to the docbook namespaced xsl stylesheets AC_ARG_WITH(docbook-xsl-ns, [ --with-docbook-xsl-ns=PATH Path to the DocBook XSL NS stylesheet root], [docbk_xsl_ns=$withval], [docbk_xsl_ns="http://docbook.sourceforge.net/release/xsl-ns/current"]) dnl need the path to the tei P4 xsl stylesheets AC_ARG_WITH(tei-xsl, [ --with-tei-xsl=PATH Path to the TEI XSL stylesheet root], [tei_xsl=$withval], [tei_xsl="http://www.tei-c.org/Stylesheets"]) dnl need the path to the tei P5 xsl stylesheets AC_ARG_WITH(tei-xsl-ns, [ --with-tei-xsl-ns=PATH Path to the TEI XSL NS stylesheet root], [tei_xsl_ns=$withval], [tei_xsl_ns="http://www.tei-c.org/Stylesheets"]) dnl need the path to the jars AC_ARG_WITH(classpath_root, [ --with-classpath-root=PATH Path to a Java class repository for XSL processors], [classpath_root=$withval], [classpath_root=""]) dnl need a path to write a pid file AC_ARG_WITH(var_dir, [ --with-var-dir=PATH Path of a directory for PID files], [var_dir=$withval], [var_dir="\$(localstatedir)/run"]) dnl need a path to write log files AC_ARG_WITH(log_dir, [ --with-log-dir=PATH Path of a directory for log files], [log_dir=$withval], [log_dir="\$(localstatedir)/log"]) dnl the main database AC_ARG_WITH(main_db, [ --with-main-db=name The name of the RefDB system database], [main_db=$withval], [main_db="refdb"]) dnl which directory will hold the databases? This does not only pertain dnl to SQLite, as the directory also holds the version file AC_ARG_WITH(db_dir, [ --with-db-dir=PATH Directory for database files], [db_dir=$withval], [db_dir="\$(localstatedir)/lib/refdb/db"], ]) dnl maintainers may need the trang jar AC_ARG_WITH(trang_jar, [ --with-trang-jar=PATH specify the full path to trang], [trang_cmd="java -jar "$withval], [trang_cmd="cp"]) dnl see whether we should build the docs ac_docs="YES" AC_ARG_ENABLE(docs, [ --disable-docs do not build and install the documentation.], [ ac_docs="NO" ]) if test "$ac_docs" = "YES"; then docs_subdirs="doc" else docs_subdirs="" fi dnl see whether we should build the man pages ac_manpages="YES" AC_ARG_ENABLE(manpages, [ --disable-manpages do not build and install the man pages.], [ ac_manpages="NO" ]) if test "$ac_manpages" = "YES"; then man_subdirs="man" else man_subdirs="" fi dnl see whether we should build the server ac_server="YES" AC_ARG_ENABLE(server, [ --disable-server Exclude server.], [ ac_server="NO" ]) if test "$ac_server" = "YES"; then server_subdirs="etc scripts src phpweb sru" server_bins="refdbd\$(EXEEXT)" server_scripts="refdbctl refdb-init refdbsru refdb-sruserver" server_etc_objects="refdbdrc.mysql.example refdbdrc.pgsql.example refdbdrc.sqlite.example refdbdrc.sqlite3.example refdbsrurc.example" server_etc_distobjects="refdbdrc refdbsrurc" server_mans="refdb.8 refdbd.1 refdb-init.8 refdbctl.1 refdbsru.1 refdb-sruserver.1" server8_mans="refdb.sh.8" else server_subdirs="" server_bins="" server_scripts="" server_etc_objects="" server_etc_distobjects="" server_mans="" server8_mans="" fi dnl see whether we should build the clients ac_client="YES" AC_ARG_ENABLE(clients, [ --disable-clients Exclude clients.], [ ac_client="NO" ]) if test "$ac_client" = "YES" && test "$ac_server" = "YES"; then client_subdirs="declarations dsssl dtd examples styles xsl" client_bins="refdbib\$(EXEEXT) refdbc\$(EXEEXT) refdba\$(EXEEXT) refdbxp\$(EXEEXT) eenc\$(EXEEXT)" client_scripts="refdbjade runbib runbib-missing db2ris refdb-bug refdbxml refdbrtf marc2ris med2ris en2ris refdbnd refdb_dos2unix refdb-ms refdb-backup refdb-restore refdb_latex2utf8txt bib2ris-utf8 rtfcitations refdb-pubmed" client_etc_objects="bib2risrc.example bib2riscgirc.example db2risrc.example refdbarc.example refdbcrc.example refdbcgirc.example refdbibrc.example med2risrc.example med2riscgirc.example marc2risrc.example refdbxmlrc.example refdbrtfrc.example refdbjaderc.example runbibrc.example" client_etc_distobjects="bib2risrc bib2riscgirc db2risrc refdbarc refdbcrc refdbcgirc refdbibrc med2risrc med2riscgirc marc2risrc refdbxmlrc refdbrtfrc refdbjaderc runbibrc" client_mans="RefDB.7 refdba.1 refdbc.1 refdbib.1 bib2ris.1 db2ris.1 en2ris.1 marc2ris.1 med2ris.1 eenc.1 refdb-backup.1 refdb-ms.1 refdb-restore.1 refdbjade.1 refdbnd.1 refdbxml.1 refdbrtf.1 runbib.1 runbib-missing.1 refdbxp.1 refdb-bug.1 refdb_dos2unix.1 refdb_latex2utf8txt.1 rtfcitations.1 refdb-pubmed.1" client1_mans="bib2ris-utf8.1" elif test "$ac_client" = "YES"; then client_subdirs="declarations dsssl dtd etc examples scripts src styles xsl" client_bins="refdbib\$(EXEEXT) refdbc\$(EXEEXT) refdba\$(EXEEXT) refdbxp\$(EXEEXT) eenc\$(EXEEXT)" client_scripts="refdbjade runbib runbib-missing db2ris refdb-bug refdbxml refdbrtf marc2ris med2ris en2ris refdbnd refdb_dos2unix refdb-ms refdb-backup refdb-restore refdb_latex2utf8txt bib2ris-utf8 rtfcitations refdb-pubmed" client_etc_objects="bib2risrc.example bib2riscgirc.example db2risrc.example refdbarc.example refdbcrc.example refdbcgirc.example refdbibrc.example med2risrc.example med2riscgirc.example marc2risrc.example refdbxmlrc.example refdbrtfrc.example refdbjaderc.example runbibrc.example" client_etc_distobjects="bib2risrc bib2riscgirc db2risrc refdbarc refdbcrc refdbcgirc refdbibrc med2risrc med2riscgirc marc2risrc refdbxmlrc refdbrtfrc refdbjaderc runbibrc" client_mans="RefDB.7 refdba.1 refdbc.1 refdbib.1 bib2ris.1 db2ris.1 en2ris.1 marc2ris.1 med2ris.1 eenc.1 refdb-backup.1 refdb-ms.1 refdb-restore.1 refdbjade.1 refdbnd.1 refdbxml.1 refdbrtf.1 runbib.1 runbib-missing.1 refdbxp.1 refdb-bug.1 refdb_dos2unix.1 refdb_latex2utf8txt.1 rtfcitations.1 refdb-pubmed.1" client1_mans="bib2ris-utf8.1" else client_subdirs="" client_bins="" client_scripts="" client_etc_objects="" client_etc_distobjects="" client_mans="" client1_mans="" fi dnl Checks for programs. AC_PATH_PROGS(myshell, bash sh) if test "$ac_client" = "YES"; then AC_PATH_PROGS(myjade, openjade jade) AC_PATH_PROG(myperl, perl) AC_PATH_PROG(myxsltproc, xsltproc) AC_PATH_PROG(myxmlcatalog, xmlcatalog) fi if test "$ac_docs" = "YES"; then AC_PATH_PROG(mydtdparse, dtdparse) AC_PATH_PROG(mydtdformat, dtdformat) AC_PATH_PROG(mysgrep, sgrep) AC_PATH_PROG(mytidy, tidy) AC_PATH_PROG(mybatik, batik-rasterizer) fi dnl see whether subversion is installed AC_PATH_PROG(svnversioncommand, svnversion) dnl use svnversion to record the current repository revision only if dnl subversion is installed and we are in a working copy if test "X$svnversioncommand" = "X" || test `$svnversioncommand -n '.'` = "exported"; then mysvnversion="cat svn_dist_version" else mysvnversion="svnversion -n '.'" fi dnl this is for building docs only, but the conditional must not be defined dnl inside of an if block AM_CONDITIONAL(HAVEBATIK, test x$mybatik != "x") AM_CONDITIONAL(HAVESERVER, test "$ac_server" = "YES") dnl this is used to make sure we create the file svn_dist_version only if dnl we have svnversion and if we are in a svn working copy. In all other dnl cases the distributed copy of svn_dist_version should be used AM_CONDITIONAL(HAVESVNWC, test "X$svnversioncommand" != "X" && test `$svnversioncommand -n '.'` != "exported") dnl dnl Checks for libraries. dnl if test "$ac_client" = "YES"; then dnl libtermcap; libreadline needs either libtermcap or lib(n)curses, so dnl we have to check this first AC_CHECK_LIB(termcap, tputs, [ rltestlib="-ltermcap"], [AC_CHECK_LIB(ncurses, tputs, [ rltestlib="-lncurses"], [AC_CHECK_LIB(curses, tputs, [ rltestlib="-lcurses"], [echo "Cannot build refdb without either libtermcap, libncurses, or libcurses" exit 1])])]) dnl libreadline AC_CHECK_LIB(readline, readline, [ refdba_LDADD=$refdba_LDADD" -lreadline "$rltestlib refdbc_LDADD=$refdbc_LDADD" -lreadline "$rltestlib], [ echo "Cannot build refdb without libreadline" exit 1], $rltestlib) AC_MSG_CHECKING(for libreadline version) AC_TRY_RUN( #include #include char* rl_readline_name; int main(void) { exit(0); } , ac_cv_lib_readline=old, ac_cv_lib_readline=new, ac_cv_lib_readline=old) AC_MSG_RESULT($ac_cv_lib_readline) if test "$ac_cv_lib_readline" = "old" ; then AC_DEFINE(READLINE41) else AC_DEFINE(READLINE42) fi fi dnl end if build clients if test "$ac_server" = "YES"; then dnl see how to get iconv support AM_ICONV_LINK dnl refdbd uses log() which requires a math library on some systems AC_SEARCH_LIBS_VAR(log, m,,,,refdbd_LDADD) dnl linking with libdl is necessary on some systems AC_SEARCH_LIBS_VAR(dlopen, dl,,,,refdbd_LDADD) dnl linking with libltdl may be required by libdbi AC_SEARCH_LIBS_VAR(lt_dlopen, ltdl,,,,refdbd_LDADD) dnl libdbi - depends on libdl on some systems AC_CHECK_LIB(dbi, dbi_initialize, [ refdbd_LDADD=$refdbd_LDADD" -ldbi"], [ echo "Cannot build refdb without libdbi" exit 1]) dnl compress is in glibc, but not in Cygwin newlib AC_SEARCH_LIBS_VAR(compress, z, , , , refdbd_LDADD) fi dnl end if build server dnl linking with libsocket may be necessary (Solaris?) AC_SEARCH_LIBS(setsockopt, socket,,) dnl in some cases Solaris seems to need libnsl too AC_SEARCH_LIBS(gethostbyname, nsl,,) dnl libexpat if test "$ac_server" = "YES"; then AC_CHECK_LIB(expat, XML_ParserCreate, [ refdbd_LDADD=$refdbd_LDADD" -lexpat"], [ echo "Cannot build refdb without libexpat" exit 1]) fi dnl btparse if test "$ac_client" = "YES"; then AC_CHECK_LIB(btparse, bt_initialize, [ bib2ris_LDADD=$bib2ris_LDADD" -lbtparse" BIB2RIS="bib2ris\$(EXEEXT)"], [ echo "libbtparse not found; bib2ris import filter will not be built"]) fi dnl check types that aren't really portable AC_CHECK_TYPES(socklen_t) dnl this is the dusty corner of configure and attempts to tackle the dnl following issues: dnl (1) printf uses non-standard conversion specifiers on some platforms dnl (2) ps uses different arguments on BSD/SysV style systems to list dnl all running processes. Some ps'es accept both styles which makes dnl the list a little less ugly case $host in *-sun-solaris*) ULLSPEC="%llu" psarg="-e" ;; *) ULLSPEC="%llu" psarg="ax" ;; esac AC_SUBST(refdba_LDADD) AC_SUBST(refdbc_LDADD) AC_SUBST(refdbd_LDADD) AC_SUBST(bib2ris_LDADD) AC_SUBST(BIB2RIS) AC_SUBST(myjade) AC_SUBST(myshell) AC_SUBST(myxsltproc) AC_SUBST(mysvnversion) AC_SUBST(sgml_decl) AC_SUBST(xml_decl) AC_SUBST(docbk_xsl) AC_SUBST(docbk_xsl_ns) AC_SUBST(tei_xsl) AC_SUBST(tei_xsl_ns) AC_SUBST(classpath_root) AC_SUBST(log_dir) AC_SUBST(var_dir) AC_SUBST(main_db) AC_SUBST(db_dir) AC_SUBST(ULLSPEC) AC_SUBST(psarg) AC_SUBST(trang_cmd) AC_SUBST(server_subdirs) AC_SUBST(client_subdirs) AC_SUBST(docs_subdirs) AC_SUBST(man_subdirs) AC_SUBST(server_bins) AC_SUBST(client_bins) AC_SUBST(server_scripts) AC_SUBST(client_scripts) AC_SUBST(server_etc_objects) AC_SUBST(client_etc_objects) AC_SUBST(server_etc_distobjects) AC_SUBST(client_etc_distobjects) AC_SUBST(server_mans) AC_SUBST(server8_mans) AC_SUBST(client_mans) AC_SUBST(client1_mans) dnl Checks for header files. AC_HEADER_STDC AC_CHECK_HEADERS(fcntl.h limits.h sys/file.h sys/time.h sys/ioctl.h syslog.h unistd.h) dnl Checks for typedefs, structures, and compiler characteristics. AC_C_CONST AC_TYPE_PID_T AC_TYPE_SIZE_T AC_HEADER_TIME AC_STRUCT_TM dnl Checks for library functions. AC_TYPE_SIGNAL AC_FUNC_STRFTIME AC_FUNC_MKFIFO AC_CHECK_FUNCS(gethostname select socket strcspn strstr strtoll atoll) dnl these checks are required only for clients if test "$ac_client" = "YES"; then dnl Check for XSL stylesheets AC_CHECK_FILE($docbk_xsl/fo/docbook.xsl, [echo "DocBook XSL stylesheets found"], [if test -n "$myxmlcatalog"; then REFDB_XML_FILE($myxmlcatalog,${docbk_xsl}/fo/docbook.xsl) else echo "cannot locate DocBook XSL stylesheets via XML catalog" fi]) dnl Check for XSL NS stylesheets AC_CHECK_FILE($docbk_xsl_ns/fo/docbook.xsl, [echo "DocBook XSL NS stylesheets found"], [if test -n "$myxmlcatalog"; then REFDB_XML_FILE($myxmlcatalog,${docbk_xsl_ns}/fo/docbook.xsl) else echo "cannot locate DocBook XSL NS stylesheets via XML catalog" fi]) AC_CHECK_FILE($tei_xsl/p4/fo/tei.xsl, [echo "TEI XSL stylesheets found"], [if test -n "$myxmlcatalog"; then REFDB_XML_FILE($myxmlcatalog,${tei_xsl}/p4/fo/tei.xsl) else echo "cannot locate TEI XSL stylesheets via XML catalog" fi]) AC_CHECK_FILE($tei_xsl_ns/p5/fo/tei.xsl, [echo "TEI XSL NS stylesheets found"], [if test -n "$myxmlcatalog"; then REFDB_XML_FILE($myxmlcatalog,${tei_xsl_ns}/p5/fo/tei.xsl) else echo "cannot locate TEI XSL NS stylesheets via XML catalog" fi]) dnl Check for Perl version and Perl modules changequote(<<,>>)dnl refdb_perl_command='print $]' changequote([,])dnl REFDB_PERL_VERSION($myperl, 5.006) REFDB_PERL_MODULE($myperl, Text::Iconv, refdb_cv_iconv) REFDB_PERL_MODULE($myperl, RefDB::Makestyle, refdb_cv_makestyle) REFDB_PERL_MODULE($myperl, RefDB::Prefs, refdb_cv_prefs) REFDB_PERL_MODULE($myperl, RefDB::SRU, refdb_cv_sru) REFDB_PERL_MODULE($myperl, RefDB::SRUserver, refdb_cv_sruserver) REFDB_PERL_MODULE($myperl, XML::Parser, refdb_cv_parser) REFDB_PERL_MODULE($myperl, MARC::Record, refdb_cv_record) REFDB_PERL_MODULE($myperl, MARC::Charset, refdb_cv_charset) REFDB_PERL_MODULE($myperl, CGI, refdb_cv_cgi) fi dnl end if build clients AC_OUTPUT(src/Makefile scripts/Makefile etc/Makefile doc/Makefile dtd/Makefile declarations/Makefile examples/Makefile styles/Makefile phpweb/Makefile phpweb/css/Makefile phpweb/images/Makefile phpweb/includes/Makefile phpweb/xsl/Makefile sru/Makefile dsssl/Makefile dsssl/refdb/Makefile dsssl/refdb/html/Makefile dsssl/refdb/print/Makefile dsssl/refdb/lib/Makefile xsl/Makefile xsl/refdb/Makefile xsl/refdb/common-refdb/Makefile xsl/refdb/docbk-refdb-xsl/Makefile xsl/refdb/docbk-refdb-xsl/docbk-fo/Makefile xsl/refdb/docbk-refdb-xsl/docbk-html/Makefile xsl/refdb/docbk-refdb-xsl/docbk-xhtml/Makefile xsl/refdb/docbk-refdb-xsl/docbk-lib/Makefile xsl/refdb/tei-refdb-xsl/Makefile xsl/refdb/tei-refdb-xsl/tei-fo/Makefile xsl/refdb/tei-refdb-xsl/tei-html/Makefile xsl/refdb/tei-refdb-xsl/tei-lib/Makefile man/Makefile Makefile) echo if test "$ac_client" = "YES"; then if test -z "$refdb_cv_makestyle" || test -z "$refdb_cv_prefs" || test -z "$refdb_cv_parser" || test -z "$refdb_cv_record" || test -z "$refdb_cv_charset" || test -z "$refdb_cv_iconv" || test -z "$refdb_cv_clui" || test -z "$refdb_cv_sru" || test -z "$refdb_cv_sruserver" || test -z "$refdb_cv_cgi"; then echo "Your system seems to miss some of the recommended Perl modules. Please" echo "check the output above for details. It is safe to make and make install" echo "anyway, but some of the accessory Perl scripts will fail to run if the" echo " required modules are not installed. Please consult the manual where to" echo "get the missing modules from." echo fi fi echo "Configuration summary:" if test "$ac_client" = "YES"; then echo "will build clients" fi if test "$ac_server" = "YES"; then echo "will build server" fi if test "$ac_docs" = "YES"; then echo "will build docs" fi if test "$ac_manpages" = "YES"; then echo "will build man pages" fi echo "" echo "What you should do next:" echo "- run \"make\" to build RefDB." echo "- run \"make install\" as root to install everything." echo "- create the main database and the configuration files. Either run the" echo " refdb-init shell script as root, or peruse the handbook if you" echo " prefer a manual installation." echo "" refdb-1.0.2/aclocal.m4000644 001750 001750 00000274010 12303475764 015321 0ustar00markusmarkus000000 000000 # generated automatically by aclocal 1.14 -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) # iconv.m4 serial 18 (gettext-0.18.2) dnl Copyright (C) 2000-2002, 2007-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. AC_DEFUN([AM_ICONV_LINKFLAGS_BODY], [ dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV dnl accordingly. AC_LIB_LINKFLAGS_BODY([iconv]) ]) AC_DEFUN([AM_ICONV_LINK], [ dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and dnl those with the standalone portable GNU libiconv installed). AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV dnl accordingly. AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) dnl Add $INCICONV to CPPFLAGS before performing the following checks, dnl because if the user has installed libiconv and not disabled its use dnl via --without-libiconv-prefix, he wants to use it. The first dnl AC_LINK_IFELSE will then fail, the second AC_LINK_IFELSE will succeed. am_save_CPPFLAGS="$CPPFLAGS" AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV]) AC_CACHE_CHECK([for iconv], [am_cv_func_iconv], [ am_cv_func_iconv="no, consider installing GNU libiconv" am_cv_lib_iconv=no AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[ #include #include ]], [[iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd);]])], [am_cv_func_iconv=yes]) if test "$am_cv_func_iconv" != yes; then am_save_LIBS="$LIBS" LIBS="$LIBS $LIBICONV" AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[ #include #include ]], [[iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd);]])], [am_cv_lib_iconv=yes] [am_cv_func_iconv=yes]) LIBS="$am_save_LIBS" fi ]) if test "$am_cv_func_iconv" = yes; then AC_CACHE_CHECK([for working iconv], [am_cv_func_iconv_works], [ dnl This tests against bugs in AIX 5.1, AIX 6.1..7.1, HP-UX 11.11, dnl Solaris 10. am_save_LIBS="$LIBS" if test $am_cv_lib_iconv = yes; then LIBS="$LIBS $LIBICONV" fi AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include int main () { int result = 0; /* Test against AIX 5.1 bug: Failures are not distinguishable from successful returns. */ { iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8"); if (cd_utf8_to_88591 != (iconv_t)(-1)) { static const char input[] = "\342\202\254"; /* EURO SIGN */ char buf[10]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_utf8_to_88591, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if (res == 0) result |= 1; iconv_close (cd_utf8_to_88591); } } /* Test against Solaris 10 bug: Failures are not distinguishable from successful returns. */ { iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646"); if (cd_ascii_to_88591 != (iconv_t)(-1)) { static const char input[] = "\263"; char buf[10]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_ascii_to_88591, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if (res == 0) result |= 2; iconv_close (cd_ascii_to_88591); } } /* Test against AIX 6.1..7.1 bug: Buffer overrun. */ { iconv_t cd_88591_to_utf8 = iconv_open ("UTF-8", "ISO-8859-1"); if (cd_88591_to_utf8 != (iconv_t)(-1)) { static const char input[] = "\304"; static char buf[2] = { (char)0xDE, (char)0xAD }; const char *inptr = input; size_t inbytesleft = 1; char *outptr = buf; size_t outbytesleft = 1; size_t res = iconv (cd_88591_to_utf8, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if (res != (size_t)(-1) || outptr - buf > 1 || buf[1] != (char)0xAD) result |= 4; iconv_close (cd_88591_to_utf8); } } #if 0 /* This bug could be worked around by the caller. */ /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */ { iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591"); if (cd_88591_to_utf8 != (iconv_t)(-1)) { static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337"; char buf[50]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_88591_to_utf8, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if ((int)res > 0) result |= 8; iconv_close (cd_88591_to_utf8); } } #endif /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is provided. */ if (/* Try standardized names. */ iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1) /* Try IRIX, OSF/1 names. */ && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1) /* Try AIX names. */ && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1) /* Try HP-UX names. */ && iconv_open ("utf8", "eucJP") == (iconv_t)(-1)) result |= 16; return result; }]])], [am_cv_func_iconv_works=yes], [am_cv_func_iconv_works=no], [ changequote(,)dnl case "$host_os" in aix* | hpux*) am_cv_func_iconv_works="guessing no" ;; *) am_cv_func_iconv_works="guessing yes" ;; esac changequote([,])dnl ]) LIBS="$am_save_LIBS" ]) case "$am_cv_func_iconv_works" in *no) am_func_iconv=no am_cv_lib_iconv=no ;; *) am_func_iconv=yes ;; esac else am_func_iconv=no am_cv_lib_iconv=no fi if test "$am_func_iconv" = yes; then AC_DEFINE([HAVE_ICONV], [1], [Define if you have the iconv() function and it works.]) fi if test "$am_cv_lib_iconv" = yes; then AC_MSG_CHECKING([how to link with libiconv]) AC_MSG_RESULT([$LIBICONV]) else dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV dnl either. CPPFLAGS="$am_save_CPPFLAGS" LIBICONV= LTLIBICONV= fi AC_SUBST([LIBICONV]) AC_SUBST([LTLIBICONV]) ]) dnl Define AM_ICONV using AC_DEFUN_ONCE for Autoconf >= 2.64, in order to dnl avoid warnings like dnl "warning: AC_REQUIRE: `AM_ICONV' was expanded before it was required". dnl This is tricky because of the way 'aclocal' is implemented: dnl - It requires defining an auxiliary macro whose name ends in AC_DEFUN. dnl Otherwise aclocal's initial scan pass would miss the macro definition. dnl - It requires a line break inside the AC_DEFUN_ONCE and AC_DEFUN expansions. dnl Otherwise aclocal would emit many "Use of uninitialized value $1" dnl warnings. m4_define([gl_iconv_AC_DEFUN], m4_version_prereq([2.64], [[AC_DEFUN_ONCE( [$1], [$2])]], [m4_ifdef([gl_00GNULIB], [[AC_DEFUN_ONCE( [$1], [$2])]], [[AC_DEFUN( [$1], [$2])]])])) gl_iconv_AC_DEFUN([AM_ICONV], [ AM_ICONV_LINK if test "$am_cv_func_iconv" = yes; then AC_MSG_CHECKING([for iconv declaration]) AC_CACHE_VAL([am_cv_proto_iconv], [ AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[ #include #include extern #ifdef __cplusplus "C" #endif #if defined(__STDC__) || defined(_MSC_VER) || defined(__cplusplus) size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); #else size_t iconv(); #endif ]], [[]])], [am_cv_proto_iconv_arg1=""], [am_cv_proto_iconv_arg1="const"]) am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"]) am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` AC_MSG_RESULT([ $am_cv_proto_iconv]) AC_DEFINE_UNQUOTED([ICONV_CONST], [$am_cv_proto_iconv_arg1], [Define as const if the declaration of iconv() needs const.]) dnl Also substitute ICONV_CONST in the gnulib generated . m4_ifdef([gl_ICONV_H_DEFAULTS], [AC_REQUIRE([gl_ICONV_H_DEFAULTS]) if test -n "$am_cv_proto_iconv_arg1"; then ICONV_CONST="const" fi ]) fi ]) # lib-ld.m4 serial 6 dnl Copyright (C) 1996-2003, 2009-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Subroutines of libtool.m4, dnl with replacements s/_*LT_PATH/AC_LIB_PROG/ and s/lt_/acl_/ to avoid dnl collision with libtool.m4. dnl From libtool-2.4. Sets the variable with_gnu_ld to yes or no. AC_DEFUN([AC_LIB_PROG_LD_GNU], [AC_CACHE_CHECK([if the linker ($LD) is GNU ld], [acl_cv_prog_gnu_ld], [# I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 /dev/null 2>&1 \ && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \ || PATH_SEPARATOR=';' } fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld ac_prog=`echo "$ac_prog"| sed 's%\\\\%/%g'` while echo "$ac_prog" | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL([acl_cv_path_LD], [if test -z "$LD"; then acl_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$acl_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then acl_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$acl_cv_path_LD" -v 2>&1 = 1.10 to complain if config.rpath is missing. m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([config.rpath])]) AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir AC_CACHE_CHECK([for shared library run path origin], [acl_cv_rpath], [ CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh . ./conftest.sh rm -f ./conftest.sh acl_cv_rpath=done ]) wl="$acl_cv_wl" acl_libext="$acl_cv_libext" acl_shlibext="$acl_cv_shlibext" acl_libname_spec="$acl_cv_libname_spec" acl_library_names_spec="$acl_cv_library_names_spec" acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" acl_hardcode_direct="$acl_cv_hardcode_direct" acl_hardcode_minus_L="$acl_cv_hardcode_minus_L" dnl Determine whether the user wants rpath handling at all. AC_ARG_ENABLE([rpath], [ --disable-rpath do not hardcode runtime library paths], :, enable_rpath=yes) ]) dnl AC_LIB_FROMPACKAGE(name, package) dnl declares that libname comes from the given package. The configure file dnl will then not have a --with-libname-prefix option but a dnl --with-package-prefix option. Several libraries can come from the same dnl package. This declaration must occur before an AC_LIB_LINKFLAGS or similar dnl macro call that searches for libname. AC_DEFUN([AC_LIB_FROMPACKAGE], [ pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])]) define([acl_frompackage_]NAME, [$2]) popdef([NAME]) pushdef([PACK],[$2]) pushdef([PACKUP],[m4_translit(PACK,[abcdefghijklmnopqrstuvwxyz./+-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])]) define([acl_libsinpackage_]PACKUP, m4_ifdef([acl_libsinpackage_]PACKUP, [m4_defn([acl_libsinpackage_]PACKUP)[, ]],)[lib$1]) popdef([PACKUP]) popdef([PACK]) ]) dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and dnl the libraries corresponding to explicit and implicit dependencies. dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables. dnl Also, sets the LIB${NAME}_PREFIX variable to nonempty if libname was found dnl in ${LIB${NAME}_PREFIX}/$acl_libdirstem. AC_DEFUN([AC_LIB_LINKFLAGS_BODY], [ AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])]) pushdef([PACK],[m4_ifdef([acl_frompackage_]NAME, [acl_frompackage_]NAME, lib[$1])]) pushdef([PACKUP],[m4_translit(PACK,[abcdefghijklmnopqrstuvwxyz./+-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])]) pushdef([PACKLIBS],[m4_ifdef([acl_frompackage_]NAME, [acl_libsinpackage_]PACKUP, lib[$1])]) dnl Autoconf >= 2.61 supports dots in --with options. pushdef([P_A_C_K],[m4_if(m4_version_compare(m4_defn([m4_PACKAGE_VERSION]),[2.61]),[-1],[m4_translit(PACK,[.],[_])],PACK)]) dnl By default, look in $includedir and $libdir. use_additional=yes AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) AC_ARG_WITH(P_A_C_K[-prefix], [[ --with-]]P_A_C_K[[-prefix[=DIR] search for ]PACKLIBS[ in DIR/include and DIR/lib --without-]]P_A_C_K[[-prefix don't search for ]PACKLIBS[ in includedir and libdir]], [ if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" if test "$acl_libdirstem2" != "$acl_libdirstem" \ && ! test -d "$withval/$acl_libdirstem"; then additional_libdir="$withval/$acl_libdirstem2" fi fi fi ]) dnl Search the library and its dependencies in $additional_libdir and dnl $LDFLAGS. Using breadth-first-seach. LIB[]NAME= LTLIB[]NAME= INC[]NAME= LIB[]NAME[]_PREFIX= dnl HAVE_LIB${NAME} is an indicator that LIB${NAME}, LTLIB${NAME} have been dnl computed. So it has to be reset here. HAVE_LIB[]NAME= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='$1 $2' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" dnl See if it was already located by an earlier AC_LIB_LINKFLAGS dnl or AC_LIB_HAVE_LINKFLAGS call. uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value" else dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined dnl that this library doesn't exist. So just drop it. : fi else dnl Search the library lib$name in $additional_libdir and $LDFLAGS dnl and the already constructed $LIBNAME/$LTLIBNAME. found_dir= found_la= found_so= found_a= eval libname=\"$acl_libname_spec\" # typically: libname=lib$name if test -n "$acl_shlibext"; then shrext=".$acl_shlibext" # typically: shrext=.so else shrext= fi if test $use_additional = yes; then dir="$additional_libdir" dnl The same code as in the loop below: dnl First look for a shared library. if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi dnl Then look for a static library. if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` dnl First look for a shared library. if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi dnl Then look for a static library. if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then dnl Found the library. LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then dnl Linking with a shared library. We attempt to hardcode its dnl directory into the executable's runpath, unless it's the dnl standard /usr/lib. if test "$enable_rpath" = no \ || test "X$found_dir" = "X/usr/$acl_libdirstem" \ || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then dnl No hardcoding is needed. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else dnl Use an explicit option to hardcode DIR into the resulting dnl binary. dnl Potentially add DIR to ltrpathdirs. dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi dnl The hardcoding into $LIBNAME is system dependent. if test "$acl_hardcode_direct" = yes; then dnl Using DIR/libNAME.so during linking hardcodes DIR into the dnl resulting binary. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then dnl Use an explicit option to hardcode DIR into the resulting dnl binary. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" dnl Potentially add DIR to rpathdirs. dnl The rpathdirs will be appended to $LIBNAME at the end. haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else dnl Rely on "-L$found_dir". dnl But don't add it if it's already contained in the LDFLAGS dnl or the already constructed $LIBNAME haveit= for x in $LDFLAGS $LIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir" fi if test "$acl_hardcode_minus_L" != no; then dnl FIXME: Not sure whether we should use dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" dnl here. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else dnl We cannot use $acl_hardcode_runpath_var and LD_RUN_PATH dnl here, because this doesn't fit in flags passed to the dnl compiler. So give up. No hardcoding. This affects only dnl very old systems. dnl FIXME: Not sure whether we should use dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" dnl here. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then dnl Linking with a static library. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a" else dnl We shouldn't come here, but anyway it's good to have a dnl fallback. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name" fi fi dnl Assume the include files are nearby. additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` if test "$name" = '$1'; then LIB[]NAME[]_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; */$acl_libdirstem2 | */$acl_libdirstem2/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'` if test "$name" = '$1'; then LIB[]NAME[]_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then dnl Potentially add $additional_includedir to $INCNAME. dnl But don't add it dnl 1. if it's the standard /usr/include, dnl 2. if it's /usr/local/include and we are using GCC on Linux, dnl 3. if it's already present in $CPPFLAGS or the already dnl constructed $INCNAME, dnl 4. if it doesn't exist as a directory. if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INC[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then dnl Really add $additional_includedir to $INCNAME. INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir" fi fi fi fi fi dnl Look for dependencies. if test -n "$found_la"; then dnl Read the .la file. It defines the variables dnl dlname, library_names, old_library, dependency_libs, current, dnl age, revision, installed, dlopen, dlpreopen, libdir. save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" dnl We use only dependency_libs. for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME. dnl But don't add it dnl 1. if it's the standard /usr/lib, dnl 2. if it's /usr/local/lib and we are using GCC on Linux, dnl 3. if it's already present in $LDFLAGS or the already dnl constructed $LIBNAME, dnl 4. if it doesn't exist as a directory. if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \ && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then haveit= if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \ || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LIBNAME. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LTLIBNAME. LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then dnl Potentially add DIR to rpathdirs. dnl The rpathdirs will be appended to $LIBNAME at the end. haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi dnl Potentially add DIR to ltrpathdirs. dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) dnl Handle this in the next round. names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) dnl Handle this in the next round. Throw away the .la's dnl directory; it is already contained in a preceding -L dnl option. names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) dnl Most likely an immediate library name. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep" LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep" ;; esac done fi else dnl Didn't find the library; assume it is in the system directories dnl known to the linker and runtime loader. (All the system dnl directories known to the linker should also be known to the dnl runtime loader, otherwise the system is severely misconfigured.) LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$acl_hardcode_libdir_separator"; then dnl Weird platform: only the last -rpath option counts, the user must dnl pass all path elements in one option. We can arrange that for a dnl single library, but not when more than one $LIBNAMEs are used. alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" done dnl Note: acl_hardcode_libdir_flag_spec uses $libdir and $wl. acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" else dnl The -rpath options are cumulative. for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then dnl When using libtool, the option that works for both libraries and dnl executables is -R. The -R options are cumulative. for found_dir in $ltrpathdirs; do LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir" done fi popdef([P_A_C_K]) popdef([PACKLIBS]) popdef([PACKUP]) popdef([PACK]) popdef([NAME]) ]) dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR, dnl unless already present in VAR. dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes dnl contains two or three consecutive elements that belong together. AC_DEFUN([AC_LIB_APPENDTOVAR], [ for element in [$2]; do haveit= for x in $[$1]; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then [$1]="${[$1]}${[$1]:+ }$element" fi done ]) dnl For those cases where a variable contains several -L and -l options dnl referring to unknown libraries and directories, this macro determines the dnl necessary additional linker options for the runtime path. dnl AC_LIB_LINKFLAGS_FROM_LIBS([LDADDVAR], [LIBSVALUE], [USE-LIBTOOL]) dnl sets LDADDVAR to linker options needed together with LIBSVALUE. dnl If USE-LIBTOOL evaluates to non-empty, linking with libtool is assumed, dnl otherwise linking without libtool is assumed. AC_DEFUN([AC_LIB_LINKFLAGS_FROM_LIBS], [ AC_REQUIRE([AC_LIB_RPATH]) AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) $1= if test "$enable_rpath" != no; then if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then dnl Use an explicit option to hardcode directories into the resulting dnl binary. rpathdirs= next= for opt in $2; do if test -n "$next"; then dir="$next" dnl No need to hardcode the standard /usr/lib. if test "X$dir" != "X/usr/$acl_libdirstem" \ && test "X$dir" != "X/usr/$acl_libdirstem2"; then rpathdirs="$rpathdirs $dir" fi next= else case $opt in -L) next=yes ;; -L*) dir=`echo "X$opt" | sed -e 's,^X-L,,'` dnl No need to hardcode the standard /usr/lib. if test "X$dir" != "X/usr/$acl_libdirstem" \ && test "X$dir" != "X/usr/$acl_libdirstem2"; then rpathdirs="$rpathdirs $dir" fi next= ;; *) next= ;; esac fi done if test "X$rpathdirs" != "X"; then if test -n ""$3""; then dnl libtool is used for linking. Use -R options. for dir in $rpathdirs; do $1="${$1}${$1:+ }-R$dir" done else dnl The linker is used for linking directly. if test -n "$acl_hardcode_libdir_separator"; then dnl Weird platform: only the last -rpath option counts, the user dnl must pass all path elements in one option. alldirs= for dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" $1="$flag" else dnl The -rpath options are cumulative. for dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" $1="${$1}${$1:+ }$flag" done fi fi fi fi fi AC_SUBST([$1]) ]) # lib-prefix.m4 serial 7 (gettext-0.18) dnl Copyright (C) 2001-2005, 2008-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. dnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't dnl require excessive bracketing. ifdef([AC_HELP_STRING], [AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])], [AC_DEFUN([AC_][LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])]) dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed dnl to access previously installed libraries. The basic assumption is that dnl a user will want packages to use other packages he previously installed dnl with the same --prefix option. dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate dnl libraries, but is otherwise very convenient. AC_DEFUN([AC_LIB_PREFIX], [ AC_BEFORE([$0], [AC_LIB_LINKFLAGS]) AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) dnl By default, look in $includedir and $libdir. use_additional=yes AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) AC_LIB_ARG_WITH([lib-prefix], [ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib --without-lib-prefix don't search for libraries in includedir and libdir], [ if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" fi fi ]) if test $use_additional = yes; then dnl Potentially add $additional_includedir to $CPPFLAGS. dnl But don't add it dnl 1. if it's the standard /usr/include, dnl 2. if it's already present in $CPPFLAGS, dnl 3. if it's /usr/local/include and we are using GCC on Linux, dnl 4. if it doesn't exist as a directory. if test "X$additional_includedir" != "X/usr/include"; then haveit= for x in $CPPFLAGS; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then if test -d "$additional_includedir"; then dnl Really add $additional_includedir to $CPPFLAGS. CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir" fi fi fi fi dnl Potentially add $additional_libdir to $LDFLAGS. dnl But don't add it dnl 1. if it's the standard /usr/lib, dnl 2. if it's already present in $LDFLAGS, dnl 3. if it's /usr/local/lib and we are using GCC on Linux, dnl 4. if it doesn't exist as a directory. if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then haveit= for x in $LDFLAGS; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then if test -n "$GCC"; then case $host_os in linux*) haveit=yes;; esac fi fi if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LDFLAGS. LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir" fi fi fi fi fi ]) dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix, dnl acl_final_exec_prefix, containing the values to which $prefix and dnl $exec_prefix will expand at the end of the configure script. AC_DEFUN([AC_LIB_PREPARE_PREFIX], [ dnl Unfortunately, prefix and exec_prefix get only finally determined dnl at the end of configure. if test "X$prefix" = "XNONE"; then acl_final_prefix="$ac_default_prefix" else acl_final_prefix="$prefix" fi if test "X$exec_prefix" = "XNONE"; then acl_final_exec_prefix='${prefix}' else acl_final_exec_prefix="$exec_prefix" fi acl_save_prefix="$prefix" prefix="$acl_final_prefix" eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" prefix="$acl_save_prefix" ]) dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the dnl variables prefix and exec_prefix bound to the values they will have dnl at the end of the configure script. AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX], [ acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" $1 exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" ]) dnl AC_LIB_PREPARE_MULTILIB creates dnl - a variable acl_libdirstem, containing the basename of the libdir, either dnl "lib" or "lib64" or "lib/64", dnl - a variable acl_libdirstem2, as a secondary possible value for dnl acl_libdirstem, either the same as acl_libdirstem or "lib/sparcv9" or dnl "lib/amd64". AC_DEFUN([AC_LIB_PREPARE_MULTILIB], [ dnl There is no formal standard regarding lib and lib64. dnl On glibc systems, the current practice is that on a system supporting dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under dnl $prefix/lib64 and 32-bit libraries go under $prefix/lib. We determine dnl the compiler's default mode by looking at the compiler's library search dnl path. If at least one of its elements ends in /lib64 or points to a dnl directory whose absolute pathname ends in /lib64, we assume a 64-bit ABI. dnl Otherwise we use the default, namely "lib". dnl On Solaris systems, the current practice is that on a system supporting dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under dnl $prefix/lib/64 (which is a symlink to either $prefix/lib/sparcv9 or dnl $prefix/lib/amd64) and 32-bit libraries go under $prefix/lib. AC_REQUIRE([AC_CANONICAL_HOST]) acl_libdirstem=lib acl_libdirstem2= case "$host_os" in solaris*) dnl See Solaris 10 Software Developer Collection > Solaris 64-bit Developer's Guide > The Development Environment dnl . dnl "Portable Makefiles should refer to any library directories using the 64 symbolic link." dnl But we want to recognize the sparcv9 or amd64 subdirectory also if the dnl symlink is missing, so we set acl_libdirstem2 too. AC_CACHE_CHECK([for 64-bit host], [gl_cv_solaris_64bit], [AC_EGREP_CPP([sixtyfour bits], [ #ifdef _LP64 sixtyfour bits #endif ], [gl_cv_solaris_64bit=yes], [gl_cv_solaris_64bit=no]) ]) if test $gl_cv_solaris_64bit = yes; then acl_libdirstem=lib/64 case "$host_cpu" in sparc*) acl_libdirstem2=lib/sparcv9 ;; i*86 | x86_64) acl_libdirstem2=lib/amd64 ;; esac fi ;; *) searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'` if test -n "$searchpath"; then acl_save_IFS="${IFS= }"; IFS=":" for searchdir in $searchpath; do if test -d "$searchdir"; then case "$searchdir" in */lib64/ | */lib64 ) acl_libdirstem=lib64 ;; */../ | */.. ) # Better ignore directories of this form. They are misleading. ;; *) searchdir=`cd "$searchdir" && pwd` case "$searchdir" in */lib64 ) acl_libdirstem=lib64 ;; esac ;; esac fi done IFS="$acl_save_IFS" fi ;; esac test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem" ]) # Copyright (C) 2002-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.14' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.14], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.14])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to # '$srcdir', '$srcdir/..', or '$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is '.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], [$1], [UPC], [depcc="$UPC" am_compiler_list=], [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each '.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC]) [_AM_PROG_CC_C_O ]) # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) fi fi]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) # Copyright (C) 2003-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it is modern enough. # If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_CC_C_O # --------------- # Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC # to automatically call this. AC_DEFUN([_AM_PROG_CC_C_O], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl AC_LANG_PUSH([C])dnl AC_CACHE_CHECK( [whether $CC understands -c and -o together], [am_cv_prog_cc_c_o], [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i]) if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi AC_LANG_POP([C])]) # For backward compatibility. AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_RUN_LOG(COMMAND) # ------------------- # Run COMMAND, save the exit status in ac_status, and log it. # (This has been adapted from Autoconf's _AC_RUN_LOG macro.) AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2009-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # ("yes" being less verbose, "no" or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar # AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([acinclude.m4]) refdb-1.0.2/COPYING000644 001750 001750 00000072064 11512721664 014513 0ustar00markusmarkus000000 000000 RefDB copyright information =========================== The RefDB package consists of tons of files written specifically for this package and a small number of files that were taken from other sources. The files written specifically for this package are released under the GNU General Public License (GPL) which is reproduced below. The files may contain short sections of code stolen from other sources. These other sources are in turn released under the GPL or are Public Domain. The stolen sections are marked in the code as such, mentioning the respective sources to give the authors due credit. The following files were taken from other packages. The corresponding licenses are reproduced below: scripts/tex2mail (no license information; Artistic license assumed) declarations/docbook.dcl (DocBook license) declarations/xml.dcl (no license information; W3C license assumed) GNU General Public License ************************** 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 Appendix: 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. DocBook License *************** Copyright 1992-2000 HaL Computer Systems, Inc., O'Reilly & Associates, Inc., ArborText, Inc., Fujitsu Software Corporation, and the Organization for the Advancement of Structured Information Standards (OASIS). Permission to use, copy, modify and distribute the DocBook DTD and its accompanying documentation for any purpose and without fee is hereby granted in perpetuity, provided that the above copyright notice and this paragraph appear in all copies. The copyright holders make no representation about the suitability of the DTD for any purpose. It is provided "as is" without expressed or implied warranty. If you modify the DocBook DTD in any way, except for declaring and referencing additional sets of general entities and declaring additional notations, label your DTD as a variant of DocBook. See the maintenance documentation for more information. Please direct all questions, bug reports, or suggestions for changes to the docbook@lists.oasis-open.org mailing list. For more information, see http://www.oasis-open.org/docbook/. Artistic License **************** The Artistic License August 15, 1997 Preamble The intent of this document is to state the conditions under which a Package may be copied, such that the Copyright Holder maintains some semblance of artistic control over the development of the package, while giving the users of the package the right to use and distribute the Package in a more-or-less customary fashion, plus the right to make reasonable modifications. Definitions "Package" refers to the collection of files distributed by the Copyright Holder, and derivatives of that collection of files created through textual modification. "Standard Version" refers to such a Package if it has not been modified, or has been modified in accordance with the wishes of the Copyright Holder as specified below. "Copyright Holder" is whoever is named in the copyright or copyrights for the package. "You" is you, if you're thinking about copying or distributing this Package. "Reasonable copying fee" is whatever you can justify on the basis of media cost, duplication charges, time of people involved, and so on. (You will not be required to justify it to the Copyright Holder, but only to the computing community at large as a market that must bear the fee.) "Freely Available" means that no fee is charged for the item itself, though there may be fees involved in handling the item. It also means that recipients of the item may redistribute it under the same conditions they received it. 1. You may make and give away verbatim copies of the source form of the Standard Version of this Package without restriction, provided that you duplicate all of the original copyright notices and associated disclaimers. 2. You may apply bug fixes, portability fixes and other modifications derived from the Public Domain or from the Copyright Holder. A Package modified in such a way shall still be considered the Standard Version. 3. You may otherwise modify your copy of this Package in any way, provided that you insert a prominent notice in each changed file stating how and when you changed that file, and provided that you do at least ONE of the following: 1. place your modifications in the Public Domain or otherwise make them Freely Available, such as by posting said modifications to Usenet or an equivalent medium, or placing the modifications on a major archive site such as uunet.uu.net, or by allowing the Copyright Holder to include your modifications in the Standard Version of the Package. 2. use the modified Package only within your corporation or organization. 3. rename any non-standard executables so the names do not conflict with standard executables, which must also be provided, and provide a separate manual page for each non-standard executable that clearly documents how it differs from the Standard Version. 4. make other distribution arrangements with the Copyright Holder. 4. You may distribute the programs of this Package in object code or executable form, provided that you do at least ONE of the following: 1. distribute a Standard Version of the executables and library files, together with instructions (in the manual page or equivalent) on where to get the Standard Version. 2. accompany the distribution with the machine-readable source of the Package with your modifications. 3. give non-standard executables non-standard names, and clearly document the differences in manual pages (or equivalent), together with instructions on where to get the Standard Version. 4. make other distribution arrangements with the Copyright Holder. 5. You may charge a reasonable copying fee for any distribution of this Package. You may charge any fee you choose for support of this Package. You may not charge a fee for this Package itself. However, you may distribute this Package in aggregate with other (possibly commercial) programs as part of a larger (possibly commercial) software distribution provided that you do not advertise this Package as a product of your own. You may embed this Package's interpreter within an executable of yours (by linking); this shall be construed as a mere form of aggregation, provided that the complete Standard Version of the interpreter is so embedded. 6. The scripts and library files supplied as input to or produced as output from the programs of this Package do not automatically fall under the copyright of this Package, but belong to whomever generated them, and may be sold commercially, and may be aggregated with this Package. If such scripts or library files are aggregated with this Package via the so-called "undump" or "unexec" methods of producing a binary executable image, then distribution of such an image shall neither be construed as a distribution of this Package nor shall it fall under the restrictions of Paragraphs 3 and 4, provided that you do not represent such an executable image as a Standard Version of this Package. 7. C subroutines (or comparably compiled subroutines in other languages) supplied by you and linked into this Package in order to emulate subroutines and variables of the language defined by this Package shall not be considered part of this Package, but are the equivalent of input as in Paragraph 6, provided these subroutines do not change the language in any way that would cause it to fail the regression tests for the language. 8. Aggregation of this Package with a commercial distribution is always permitted provided that the use of this Package is embedded; that is, when no overt attempt is made to make this Package's interfaces visible to the end user of the commercial distribution. Such use shall not be construed as a distribution of this Package. 9. The name of the Copyright Holder may not be used to endorse or promote products derived from this software without specific prior written permission. 10. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. The End W3C License *********** W3C(R) SOFTWARE NOTICE AND LICENSE http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231 This work (and included software, documentation such as READMEs, or other related items) is being provided by the copyright holders under the following license. By obtaining, using and/or copying this work, you (the licensee) agree that you have read, understood, and will comply with the following terms and conditions. Permission to copy, modify, and distribute this software and its documentation, with or without modification, for any purpose and without fee or royalty is hereby granted, provided that you include the following on ALL copies of the software and documentation or portions thereof, including modifications: 1. The full text of this NOTICE in a location viewable to users of the redistributed or derivative work. 2. Any pre-existing intellectual property disclaimers, notices, or terms and conditions. If none exist, the W3C Software Short Notice should be included (hypertext is preferred, text is permitted) within the body of any redistributed or derivative code. 3. Notice of any changes or modifications to the files, including the date changes were made. (We recommend you provide URIs to the location from which the code is derived.) THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS. COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR DOCUMENTATION. The name and trademarks of copyright holders may NOT be used in advertising or publicity pertaining to the software without specific, written prior permission. Title to copyright in this software and any associated documentation will at all times remain with copyright holders. refdb-1.0.2/install-sh000755 001750 001750 00000012736 11512721664 015464 0ustar00markusmarkus000000 000000 #!/bin/sh # # install - install a program, script, or datafile # This comes from X11R5 (mit/util/scripts/install.sh). # # Copyright 1991 by the Massachusetts Institute of Technology # # 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 M.I.T. not be used in advertising or # publicity pertaining to distribution of the software without specific, # written prior permission. M.I.T. makes no representations about the # suitability of this software for any purpose. It is provided "as is" # without express or implied warranty. # # 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. It can only install one file at a time, a restriction # shared with many OS's install programs. # 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}" transformbasename="" 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=: chmodcmd="" 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 refdb-1.0.2/missing000755 001750 001750 00000024050 11512721664 015047 0ustar00markusmarkus000000 000000 #! /bin/sh # Common stub for a few missing GNU programs while installing. # Copyright 1996, 1997, 1999, 2000 Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi run=: # In the cases where this matters, `missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi case "$1" in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case "$1" in -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file tar try tar, gnutar, gtar, then tar without non-portable flags yacc create \`y.tab.[ch]', if possible, from existing .[ch]" ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing 0.4 - GNU automake" ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; aclocal*) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified \`acconfig.h' or \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case "$f" in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; autom4te) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is needed, and you do not seem to have it handy on your system. You might have modified some files without having the proper tools for further handling them. You can get \`$1Help2man' as part of \`Autoconf' from any GNU archive site." file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'` test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo "#! /bin/sh" echo "# Created by GNU Automake missing as a replacement of" echo "# $ $@" echo "exit 0" chmod +x $file exit 1 fi ;; bison|yacc) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if [ $# -ne 1 ]; then eval LASTARG="\${$#}" case "$LASTARG" in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.h fi ;; esac fi if [ ! -f y.tab.h ]; then echo >y.tab.h fi if [ ! -f y.tab.c ]; then echo 'main() { return 0; }' >y.tab.c fi ;; lex|flex) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if [ $# -ne 1 ]; then eval LASTARG="\${$#}" case "$LASTARG" in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if [ ! -f lex.yy.c ]; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified a dependency of a manual page. You may need the \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` if test -z "$file"; then file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'` fi if [ -f "$file" ]; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit 1 fi ;; makeinfo) if test -z "$run" && (makeinfo --version) > /dev/null 2>&1; then # We have makeinfo, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` if test -z "$file"; then file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file` fi touch $file ;; tar) shift if test -n "$run"; then echo 1>&2 "ERROR: \`tar' requires --run" exit 1 fi # We have already tried tar in the generic part. # Look for gnutar/gtar before invocation to avoid ugly error # messages. if (gnutar --version > /dev/null 2>&1); then gnutar ${1+"$@"} && exit 0 fi if (gtar --version > /dev/null 2>&1); then gtar ${1+"$@"} && exit 0 fi firstarg="$1" if shift; then case "$firstarg" in *o*) firstarg=`echo "$firstarg" | sed s/o//` tar "$firstarg" ${1+"$@"} && exit 0 ;; esac case "$firstarg" in *h*) firstarg=`echo "$firstarg" | sed s/h//` tar "$firstarg" ${1+"$@"} && exit 0 ;; esac fi echo 1>&2 "\ WARNING: I can't seem to be able to run \`tar' with the given arguments. You may want to install GNU tar or Free paxutils, or check the command line arguments." exit 1 ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and you do not seem to have it handy on your system. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequirements for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 refdb-1.0.2/mkinstalldirs000755 001750 001750 00000001333 11512721664 016255 0ustar00markusmarkus000000 000000 #! /bin/sh # mkinstalldirs --- make directory hierarchy # Author: Noah Friedman # Created: 1993-05-16 # Public domain # $Id: mkinstalldirs,v 1.1.1.1 2001/05/22 05:33:52 mhoenicka 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" mkdir "$pathcomp" || lasterr=$? if test ! -d "$pathcomp"; then errstatus=$lasterr fi fi pathcomp="$pathcomp/" done done exit $errstatus # mkinstalldirs ends here refdb-1.0.2/autogen.sh000755 001750 001750 00000000274 12255432026 015447 0ustar00markusmarkus000000 000000 #!/bin/sh # autogen.sh - generates configure using the autotools # $Id: autogen.sh,v 1.1 2002/03/03 07:56:30 mhoenicka Exp $ aclocal automake --add-missing --force-missing --copy autoconf refdb-1.0.2/UPGRADING000644 001750 001750 00000046717 11512721664 014731 0ustar00markusmarkus000000 000000 UPGRADING REFDB =============== This file contains instructions how to upgrade RefDB without losing your precious data. There is one section for each version that introduced backwards-incompatible changes requiring a rebuild of your databases: 0.9.9 -> 1.0.0-preX 0.9.8 -> 0.9.9 0.9.7 -> 0.9.8 0.9.6 -> 0.9.7 0.9.5 -> 0.9.6 0.9.4 -> 0.9.5 0.9.3 -> 0.9.4 0.9/0.9.1/0.9.2 -> 0.9.3 <0.9 -> 0.9 Please visit the refdb-users mailing list archives for further hints on how to apply this information to pre-releases. Migrating your existing RefDB installation from 0.9.9 to 1.0.0 ============================================================== __________ Background The content model of UNPB (unpublished) references is not very well defined in the RIS "spec". RefDB so far treated this as a monograph, i.e. like a book or a report. However, in practical use it seems to be more convenient to treat UNPB as a maybe-submitted, but not-yet-accepted journal article, thus complementing INPR (in press) and JOUR (published). 1.0.0 therefore treats UNPB as an analytic/monographic reference just like JOUR and INPR. Updating from an older version to 1.0.0 may corrupt UNPB datasets. _________ Procedure - save all UNPB references as RIS or risx: refdbc -C getref :TY:=UNPB -t ris > unpb.ris - upgrade to 1.0.0 - update the saved references: refdbc -C updateref unpb.ris Migrating your existing RefDB installation from 0.9.8 to 0.9.9 ============================================================== __________ Background The RIS format is not very consistent in where it hides the volume, issue, doi, and edition information of various reference types. They seem to be scattered randomly among VL, IS, M1-M3 and a few other tags. RefDB versions until 0.9.8 imported the data straight. RIS data exported from the database were consistent with the input data, but other formats often showed inconsistent results. Both the import and the export of RIS data has been fixed accordingly. However, if you now export RIS data that were added to the database with an older RefDB version, the data of the above fields may end up in the wrong tags. It is therefore recommended to export the data using the older RefDB version and importing them again using the new version. The new version makes better use of the L1-L4 fields. The AV field should no longer be used for electronic offprints, but for physical copies only. Use L1 instead to provide paths to electronic offprints. All AV fields using the PATH: kludge (denoting a local PDF copy) need to be migrated to appropriately encoded L1 fields. To this end, use the following sed command, or perform a similar substitution using your favourite text editor: sed 's%AV - PATH:%L1 - file://' < oldversion.ris > newversion.ris The citestylex.dtd was changed to take the improved internal representation of authors and titles into account. This required a change in the main database. The upgrading procedure outlined below should automatically upgrade the main database for you. If you use the styles shipped with RefDB, you just have to add them again. If you use custom styles, you'll have to make a few minor adjustments to your custom styles and add them again. _________ Procedure - back up your reference data. Run these commands for each of your reference databases from refdbc: getref -t risx -o dbname.xml :ID:>0 getnote -o dbname.notes.xml :NID:>0 - migrate AV fields to L1 where appropriate (see above) - delete the reference databases deletedb dbname - if you have custom styles and you don't have the XML files handy, retrieve the styles now using refdba: getstyle -o stylename.xml stylename - stop refdbd - now install 0.9.9. Make sure to restart refdbd. - update the main database refdbd -a -u -w - create the reference databases createdb dbname - if necessary, add the required user accounts adduser -d dbname username - reload your reference and notes data: addref -t risx dbname.xml addnote dbname.notes.xml - add the styles shipped with RefDB: addstyle styles/*.xml - if you have custom styles, make the following substitutions in the AUTHORLIST ROLE and TITLE ROLE attributes: * for monographic items like books, reports, theses: PRIMARY -> PUB TERTIARY -> SERIES * for analytic items like journal or newspaper articles, book chapters: PRIMARY -> PART SECONDARY -> PUB TERTIARY -> SERIES If in doubt, consult the styles shipped with RefDB as it is strictly necessary to adhere to the analytic/monograpic/series distinction in the styles since 0.9.9-preX Also, take care of the ALTERNATETEXT attribute of AUTHORLIST. To pick a particular title as a replacement for missing author names, TITLEPART, TITLEPUB, TITLESERIES, and TITLEALL are now supported. The author lists inside CITSTYLE should use TITLEALL. The AUTHORLIST and TITLE entries inside CITSTYLE are supposed to have the role attribute set to "ALL". Finally, the styles now support different formatting of authorlists depending on their role. In addition to the TEXT element, which is used to format authors, you can define an additional TEXTED element which is used to format editors. This way a style can e.g. append a "(ed.)" after the names of book editors but not after the name of book authors. Migrating your existing RefDB installation from 0.9.7 to 0.9.8 ============================================================== __________ Background Support for citation keys in bibliographies and citations required an extension of the citestylex.dtd, which in turn required a couple of additional columns in the refdb database. _________ Procedure (0.9.8-pre4 and later) These versions have a still experimental feature to ease upgrading the main database. If you're sitting in front of your production system, please back up your main database before proceeding, or at least make sure you have citestylex copies of your citation styles. If anything goes wrong, you can still re-create the main database the hard way using the procedure described in the manual. MySQL: run as root: ~# refdbd -a -u username -w password PostgreSQL: run as root (or from a special postgres account): ~# refdbd -a -u username -w password SQLite, SQLite3: run as root: ~# refdbd -a "username" and "password" are the ones of your database administrator account. If no error message pops up, your main database should be up to date now. _________ Procedure (0.9.8-pre3 and older) As only one of the tables needs three additional columns, MySQL and PostgreSQL users may directly alter their existing databases like this: MySQL: - start the command line client using your database administrator account: mysql -u root -p refdb - run the following two SQL commands (each one in one line): mysql> alter table REFSTYLE add CITEKEYPRECEEDING tinytext, add CITEKEYFOLLOWING tinytext, add CITEKEYSTYLE varchar(12); mysql> update t_meta set meta_dbversion='2'; PostgreSQL: - start the command line client using your database administrator account: psql -U root refdb - run the following two SQL commands (each one in one line): refdb=> alter table REFSTYLE add CITEKEYPRECEEDING text, add CITEKEYFOLLOWING text, add CITEKEYSTYLE text; refdb=> update t_meta set meta_dbversion='2'; As SQLite and SQLite3 do not support the ALTER TABLE command, users of these database engines will have to recreate their system databases as described in the manual, using the new dump files shipped with RefDB version 0.9.8. Existing styles are not affected by the upgrade. They are still valid against the new version of the DTD, and they can be used right away as they do not make use of the newly added columns. Migrating your existing RefDB installation from 0.9.6 to 0.9.7 ============================================================== __________ Background Only MySQL users need to fix the following problem: The table definitions in refdb.dump.mysql and refdb.dump.mysql41 used field sizes too short to hold all available *NAMEORDER strings. The other databases use a text field with unlimited sizes here, so they are not affected, and upgrading is a piece of cake. _________ Procedure - pray that you have the XML files for all your styles (the handbook told you so!!), because RefDB may have truncated the *NAMEORDER fields. If not, export them using the refdba:getstyle command and fix the contents of the *NAMEORDER fields manually if needed - stop refdbd - Follow the instructions to generate the system database "refdb". Please be aware that there are two different dump files for MySQL: refdb.dump.mysql replaces the previous refdb.dump and is meant for MySQL versions prior to 4.1. For versions 4.1 and later, please use refdb.dump.mysql41. The SQL scripts remove the existing tables before re-creating them, so there is no need to delete the database before commencing this step. - Now install 0.9.7. Make sure to restart refdbd. - Add your styles using the refdba command addstyle: "addstyle stylename.xml" Migrating your existing RefDB installation from 0.9.5 to 0.9.6 ============================================================== __________ Background As of 0.9.6-pre1, both reference and the main database are versioned. The version numbers can be used by the server to avoid compatibility problems instead of getting stuck in obscure errors. Needless to say, this change once again requires updating your databases. To add some additional hassle, the libdbi drivers were renamed as of version 0.8.1. If you upgrade from libdbi-drivers-0.7.x, the old drivers may still be around and lead to confusing problems. _________ Procedure - While still running your existing installation, use the refdba command getstyle to retrieve existing styles: "getstyle -o stylename.xml stylename" (you may skip this step if you have the XML files for all your styles) - back up your reference data. Run these commands for each of your reference databases: getref -t risx -o dbname.xml :ID:>0 getnote -o dbname.notes.xml :NID:>0 - stop refdbd - use the command-line client of your database engine to make backups of your system and reference databases. - Use the command-line client of your database engine to remove your existing system database "refdb". - Follow the instructions to generate the system database "refdb". Please be aware that there are two different dump files for MySQL: refdb.dump.mysql replaces the previous refdb.dump and is meant for MySQL versions prior to 4.1. For versions 4.1 and later, please use refdb.dump.mysql41. - deinstall libdbi-drivers 0.7.x. If you built the drivers from source, remove all existing driver files in /usr/local/lib/dbd (or wherever you installed them). - install libdbi-0.8.1 and libdbi-drivers-0.8.1 - Now install 0.9.6. Make sure to restart refdbd. - Add your styles using the refdba command addstyle: "addstyle stylename.xml" - reload your reference and notes data: addref -t risx dbname.xml addnote dbname.notes.xml Migrating your existing RefDB installation from 0.9.4 to 0.9.5 ============================================================== __________ Background The extended bibliography formatting capabilities necessitated another change in the system database schema. Upgrading requires you to generate a new system database "refdb". The in-text citation format had to be changed in order to avoid ambiguities. This affects only documents that use the long citation style. _________ Procedure - While still running your existing installation, use the refdba command getstyle to retrieve existing styles: "getstyle -o stylename.xml stylename" (you may skip this step if you have the XML files for all your styles) - stop refdbd - Use the command-line client of your database to remove your existing system database "refdb". - Follow the instructions to generate the system database "refdb". - Now install 0.9.5. Make sure to restart refdbd. - Add your styles using the refdba command addstyle: "addstyle stylename.xml" NB Existing styles will import ok even if they use the older DTD from version 0.9.4. There is no need to rewrite the XML style files unless you want to use the new features. - If you're using MySQL as your database engine, you also have to migrate your reference databases. To this end, run the following command on each of your reference databases: mysql -p dbname < scripts/migrate_mysql_0.9.5 (use -u admin_name if you do not have admin permissions by default) - If you maintain your documents using the short citation style, e.g. by using refdbnd-generated Makefiles, the new in-text citation format will automatically be applied the next time the document is edited and re-processed. If in doubt, run "make clean" before transforming the document again. If you maintain your documents using the long citation format, you'll have to fix the citations by inserting a dash before the format specifier. For example, the old-style "ID442Y" has to be changed to "ID442-Y". Migrating your existing RefDB installation from 0.9.3 to 0.9.4 =============================================================== __________ Background The citation and bibliography styles now support the full range of fields in the reference databases. The system database uses a different schema to accommodate the new data. RefDB now supports extended notes which can be attached to any number of references, author names, keywords, or periodical names. To store these data, the reference database schema was changed as well. In order to use your existing data, you'll have to migrate your databases to the new version. _________ Procedure - Make all sorts of backups of your existing databases. Use the native tools of your database server to create SQL dumps. In case of MySQL or SQLite databases, you can also make copies of the subdirectories and files, respectively. - While still running your existing installation, use the refdbc command "getref -t ris -o dbname.ris :ID:>0" to dump your reference databases to RIS files. Please note that this will export the personal information of the current user only. If you share your database with other users, you should re-run this command for each user separately: "set username otheruser" "set passwd *" "getref -t ris -o dbname-otheruser.ris -P :ID:>0". Using risx output is not recommended as the output was not bug-free in 0.9.3. - Unless you kept copies of your bibliography styles in XML files, export these as well, using the refdba command getstyle: "getstyle -o stylename.xml stylename" - Now install 0.9.4. Make sure to restart refdbd if it is running. - Follow the instructions to generate the system database and make sure it is called "refdb". - Add any of your custom styles using the refdba command addstyle: "addstyle stylename.xml" - Create new reference databases and read back your existing data with the refdbc command "addref -t ris dbname.ris". If you have dumps for other users as well, run "updateref -t ris -P -U otheruser dbname-otheruser.ris" in turn for each user. Migrating your existing RefDB databases from 0.9/0.9.1/0.9.2 to 0.9.3 ===================================================================== __________ Background The automatic citation key generation code was not exactly brilliant in versions prior to 0.9.3. The bibliography scripts caused case mismatches that led to nasty problems. Part of this problem has been fixed by using xsltproc instead of Jade for extracting the citation keys from XML documents. SGML documents still have to rely on the citation keys being uppercase (this is a limitation imposed by the DocBook SGML declaration). The import routine of version 0.9.3 can be configured to ensure that the citation keys are all uppercase. In any case, refdbd makes sure that citation keys use only the 7-bit ASCII range to avoid character encoding hassles. _________ Procedure - Make all sorts of backups of your existing databases. Use the native tools of your database server to create SQL dumps. In case of MySQL or SQLite databases, you can also make copies of the subdirectories and files, respectively. - After upgrading to 0.9.3, use the refdbc command "getref -t risx -o dbname.xml :ID:>0" to dump your databases to XML files. - If you want to use RefDB for creating SGML bibliographies, make sure to restart refdbd with the -U command line option or set the upper_citekey configuration variable to "t". - Create a new database and read back your existing data with the refdbc command "addref -t risx dbname.xml" Upgrading your existing RefDB installation from <0.9 to 0.9 ============================================================= RefDB underwent a couple of modifications which are backwards-incompatible. The file README lists these changes. This file explains your options how to migrate existing reference databases to the new version. __________ Background The schema of the main table of the reference databases was changed to accommodate citation keys. This additional column has to be created and filled with suitable values before you can use existing databases with RefDB 0.9. __________ Procedures There's two ways to update your reference databases: Procedure 1: Dump all entries to a file and re-create the database from scratch using the new RefDB version. Procedure 2: Alter the table and fill in default values using a SQL script. Procedure 1: ------------ Pros: - Re-creating the database from scratch will fill in citation keys automatically, using the pattern AuthorYearSuffix, where Author is the first author, Year is the publication year, and Suffix is a sequential string to make the citation key unique if necessary. - If you feel like switching from MySQL to PostgreSQL, this is the easiest way to move on. Cons: - If you ever deleted references from your database, this procedure will not re-create the same numeric ID for all references after the "holes". If you rely on the association between the numeric ID and your paper copies or if you use documents with RefDB bibliographies, you'll get into trouble. BTW the "hole" problem was fixed in 0.9 so once you get there you're safe. Steps: 1) Dump your data Use the refdbc command "getref -t ris -o all.ris :ID:>0" to retrieve all references and save them to a file. For backup purposes you should also create a SQL dump with the mysqldump tool, just in case. To get around the "holes" problem, you can manually edit the resulting RIS file and insert new references from your queue wherever the ID sequence is not consecutive. However, this is advisable only for small collections and soon becomes a PITA. 2) Remove the database Use the refdba command deletedb. 3) Install 0.9 4) Create the database Use the refdba command createdb to create a fresh database. 5) Restore your data Use the refdbc command addref to add your reference data to the new database. Procedure 2: ------------ Pros: - A single command will fix your existing database - No problem with "holes" whatsoever Cons: - The automatically created citation keys follow the somewhat less flashy pattern ID-Year, where ID is the existing unique ID and Year is the publication year. Steps: 1) Backup your data Use mysqldump to backup your reference database, just in case (you did that on a regular schedule anyway, didn't you?). 2) Install 0.9 3) Run "mysql -u root -p dbname < refdb-upgrade.sql" where root is the username of the database administrator and dbname is the name of your reference database. The SQL script refdb-upgrade.sql is installed in /usr/local/share/refdb/sql or an equivalent location. Send questions about these procedures to refdb-users@lists.sourceforge.net refdb-1.0.2/declarations/000755 001750 001750 00000000000 12303477602 016116 5ustar00markusmarkus000000 000000 refdb-1.0.2/dsssl/000755 001750 001750 00000000000 12303477602 014576 5ustar00markusmarkus000000 000000 refdb-1.0.2/dtd/000755 001750 001750 00000000000 12303477602 014221 5ustar00markusmarkus000000 000000 refdb-1.0.2/examples/000755 001750 001750 00000000000 12303477602 015264 5ustar00markusmarkus000000 000000 refdb-1.0.2/styles/000755 001750 001750 00000000000 12303477602 014771 5ustar00markusmarkus000000 000000 refdb-1.0.2/xsl/000755 001750 001750 00000000000 12303477603 014255 5ustar00markusmarkus000000 000000 refdb-1.0.2/etc/000755 001750 001750 00000000000 12303477603 014222 5ustar00markusmarkus000000 000000 refdb-1.0.2/scripts/000755 001750 001750 00000000000 12303477603 015136 5ustar00markusmarkus000000 000000 refdb-1.0.2/src/000755 001750 001750 00000000000 12303477604 014237 5ustar00markusmarkus000000 000000 refdb-1.0.2/phpweb/000755 001750 001750 00000000000 12303477604 014735 5ustar00markusmarkus000000 000000 refdb-1.0.2/sru/000755 001750 001750 00000000000 12303477604 014261 5ustar00markusmarkus000000 000000 refdb-1.0.2/doc/000755 001750 001750 00000000000 12303477605 014216 5ustar00markusmarkus000000 000000 refdb-1.0.2/man/000755 001750 001750 00000000000 12303477605 014224 5ustar00markusmarkus000000 000000 refdb-1.0.2/man/Makefile.in000644 001750 001750 00000044370 12303475767 016310 0ustar00markusmarkus000000 000000 # Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = man DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/./conf/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/./conf/mkinstalldirs CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man1dir = $(mandir)/man1 am__installdirs = "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man8dir)" man8dir = $(mandir)/man8 NROFF = nroff MANS = $(man1_MANS) $(man8_MANS) $(man_MANS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BIB2RIS = @BIB2RIS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ ULLSPEC = @ULLSPEC@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bib2ris_LDADD = @bib2ris_LDADD@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ classpath_root = @classpath_root@ client1_mans = @client1_mans@ client_bins = @client_bins@ client_etc_distobjects = @client_etc_distobjects@ client_etc_objects = @client_etc_objects@ client_mans = @client_mans@ client_scripts = @client_scripts@ client_subdirs = @client_subdirs@ datadir = @datadir@ datarootdir = @datarootdir@ db_dir = @db_dir@ docbk_xsl = @docbk_xsl@ docbk_xsl_ns = @docbk_xsl_ns@ docdir = $(datadir)/doc/$(PACKAGE)-$(VERSION) docs_subdirs = @docs_subdirs@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ log_dir = @log_dir@ main_db = @main_db@ man_subdirs = @man_subdirs@ mandir = @mandir@ mkdir_p = @mkdir_p@ mybatik = @mybatik@ mydtdformat = @mydtdformat@ mydtdparse = @mydtdparse@ myjade = @myjade@ myperl = @myperl@ mysgrep = @mysgrep@ myshell = @myshell@ mysvnversion = @mysvnversion@ mytidy = @mytidy@ myxmlcatalog = @myxmlcatalog@ myxsltproc = @myxsltproc@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psarg = @psarg@ psdir = @psdir@ refdba_LDADD = @refdba_LDADD@ refdbc_LDADD = @refdbc_LDADD@ refdbd_LDADD = @refdbd_LDADD@ sbindir = @sbindir@ server8_mans = @server8_mans@ server_bins = @server_bins@ server_etc_distobjects = @server_etc_distobjects@ server_etc_objects = @server_etc_objects@ server_mans = @server_mans@ server_scripts = @server_scripts@ server_subdirs = @server_subdirs@ sgml_decl = @sgml_decl@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ svnversioncommand = @svnversioncommand@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ tei_xsl = @tei_xsl@ tei_xsl_ns = @tei_xsl_ns@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ trang_cmd = @trang_cmd@ var_dir = @var_dir@ xml_decl = @xml_decl@ EXTRA_MANS = RefDB.7 refdb.8 refdbd.1 refdba.1 refdbc.1 refdbib.1 bib2ris.1 db2ris.1 en2ris.1 marc2ris.1 med2ris.1 eenc.1 refdb-backup.1 refdb-ms.1 refdb-restore.1 refdbjade.1 refdbnd.1 refdbxml.1 runbib.1 refdbctl.1 refdbxp.1 refdb-init.8 refdb-bug.1 refdb_dos2unix.1 refdb_tex2mail.1 refdb.sh.8 refdb-init-pgsql.8 refdb_latex2utf8txt.1 bib2ris-utf8.1 rtfcitations.1 refdbrtf.1 man_MANS = @server_mans@ @client_mans@ # hack hack hack! refdb.sh.8 is automatically generated when we process # refdb.8.xml. refdb and refdb.sh are synonyms. To keep the processing of # the xml files simple, we can't include refdb.sh.8 into man_MANS. However, # we can include it into man1_MANS so it will be installed ok. The # dependency just makes sure man_MANS is processed before man1_MANS man1_MANS = @client1_mans@ man8_MANS = @server8_mans@ EXTRA_DIST = $(man_MANS) $(man1_MANS) $(man8_MANS) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu man/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu man/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-man1: $(man1_MANS) $(man_MANS) @$(NORMAL_INSTALL) @list1='$(man1_MANS)'; \ list2='$(man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list='$(man1_MANS)'; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) install-man8: $(man8_MANS) $(man_MANS) @$(NORMAL_INSTALL) @list1='$(man8_MANS)'; \ list2='$(man_MANS)'; \ test -n "$(man8dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man8dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man8dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.8[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^8][0-9a-z]*$$,8,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man8dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man8dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man8dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man8dir)" || exit $$?; }; \ done; } uninstall-man8: @$(NORMAL_UNINSTALL) @list='$(man8_MANS)'; test -n "$(man8dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.8[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^8][0-9a-z]*$$,8,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man8dir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(MANS) installdirs: for dir in "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man8dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-man install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-man1 install-man8 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-man uninstall-man: uninstall-man1 uninstall-man8 .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-man1 install-man8 \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic pdf pdf-am ps ps-am tags-am uninstall \ uninstall-am uninstall-man uninstall-man1 uninstall-man8 refdb.sh.8: refdb.8 refdb-init-pgsql.8: refdb-init.8 bib2ris-utf8.1: bib2ris.1 all: $(man_MANS) $(man1_MANS) $(man8_MANS) $(man_MANS): %: $(top_srcdir)/doc/%.xml xsltproc --nonet $(top_srcdir)/doc/include/manual-man.xsl $< # sed 's%%$(DESTDIR)$(docdir)%' < $< | \ # sed 's%%$(DESTDIR)$(pkgdatadir)/db%' | \ # sed 's%%$(DESTDIR)$(var_dir)%' | \ # sed 's%%$(DESTDIR)$(sysconfdir)/@PACKAGE@%' > $@ maintainer-clean: rm -f $(man_MANS) $(man1_MANS) $(man8_MANS) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: refdb-1.0.2/man/Makefile.am000644 001750 001750 00000002721 11512721663 016257 0ustar00markusmarkus000000 000000 ## Process this with automake to create Makefile.in docdir = $(datadir)/doc/$(PACKAGE)-$(VERSION) EXTRA_MANS = RefDB.7 refdb.8 refdbd.1 refdba.1 refdbc.1 refdbib.1 bib2ris.1 db2ris.1 en2ris.1 marc2ris.1 med2ris.1 eenc.1 refdb-backup.1 refdb-ms.1 refdb-restore.1 refdbjade.1 refdbnd.1 refdbxml.1 runbib.1 refdbctl.1 refdbxp.1 refdb-init.8 refdb-bug.1 refdb_dos2unix.1 refdb_tex2mail.1 refdb.sh.8 refdb-init-pgsql.8 refdb_latex2utf8txt.1 bib2ris-utf8.1 rtfcitations.1 refdbrtf.1 man_MANS = @server_mans@ @client_mans@ # hack hack hack! refdb.sh.8 is automatically generated when we process # refdb.8.xml. refdb and refdb.sh are synonyms. To keep the processing of # the xml files simple, we can't include refdb.sh.8 into man_MANS. However, # we can include it into man1_MANS so it will be installed ok. The # dependency just makes sure man_MANS is processed before man1_MANS man1_MANS = @client1_mans@ man8_MANS = @server8_mans@ refdb.sh.8: refdb.8 refdb-init-pgsql.8: refdb-init.8 bib2ris-utf8.1: bib2ris.1 EXTRA_DIST = $(man_MANS) $(man1_MANS) $(man8_MANS) all: $(man_MANS) $(man1_MANS) $(man8_MANS) $(man_MANS): %: $(top_srcdir)/doc/%.xml xsltproc --nonet $(top_srcdir)/doc/include/manual-man.xsl $< # sed 's%%$(DESTDIR)$(docdir)%' < $< | \ # sed 's%%$(DESTDIR)$(pkgdatadir)/db%' | \ # sed 's%%$(DESTDIR)$(var_dir)%' | \ # sed 's%%$(DESTDIR)$(sysconfdir)/@PACKAGE@%' > $@ maintainer-clean: rm -f $(man_MANS) $(man1_MANS) $(man8_MANS) refdb-1.0.2/man/refdb.8000644 001750 001750 00000004513 12255422767 015407 0ustar00markusmarkus000000 000000 '\" t .\" Title: refdb .\" Author: [see the "Author" section] .\" Generator: DocBook XSL Stylesheets v1.76.1 .\" Date: 2005-10-15 .\" Manual: RefDB Manual .\" Source: RefDB Manual .\" Language: English .\" .TH "REFDB" "8" "2005\-10\-15" "RefDB Manual" "RefDB Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" refdb, refdb.sh \- refdbd startup script .SH "SYNOPSIS" .HP \w'\fBrefdb\fR\ 'u \fBrefdb\fR \fIstart\fR | \fIstop\fR | \fIrestart\fR | \fIforce\-reload\fR .SH "DESCRIPTION" .PP refdb is a wrapper script for refdbd(1) to be used as a rc(8) or init(8) control script\&. The script is called refdb\&.sh on BSD\-style systems\&. See the documentation of your system how to integrate refdb into the start process to run refdbd(1) automatically as a daemon\&. .SH "OPTIONS" .PP \fIstart\fR .RS 4 Starts the refdbd(1) daemon .RE .PP \fIstop\fR .RS 4 Stops the refdbd(1) daemon .RE .PP \fIrestart\fR .RS 4 Restarts the refdbd(1) daemon .RE .PP \fIforce\-reload\fR .RS 4 Causes the refdbd(1) daemon to read its configuration file .RE .SH "SEE ALSO" .PP \fBRefDB\fR (7), \fBrefdbd\fR (1) \fBrefdbctl\fR (1)\&. .PP \fIRefDB manual (local copy) \fR PREFIX/share/doc/refdb\-/refdb\-manual/index\&.html .PP \fIRefDB manual (web) \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/manual/index\&.html\fR\m[]> .PP \fIRefDB on the web \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/\fR\m[]> .SH "AUTHOR" .PP refdb was written by Markus Hoenicka \&. refdb-1.0.2/man/refdbd.1000644 001750 001750 00000042234 12255422767 015546 0ustar00markusmarkus000000 000000 '\" t .\" Title: refdbd .\" Author: [see the "Author" section] .\" Generator: DocBook XSL Stylesheets v1.76.1 .\" Date: 2005-10-13 .\" Manual: RefDB Manual .\" Source: RefDB Manual .\" Language: English .\" .TH "REFDBD" "1" "2005\-10\-13" "RefDB Manual" "RefDB Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" refdbd \- the application server of RefDB .SH "SYNOPSIS" .HP \w'\fBrefdbd\fR\ 'u \fBrefdbd\fR [\fB\-b\fR\ \fIdbs\-port\fR] [\fB\-d\fR\ \fIdefault\-database\fR] [\fB\-D\fR\ \fIdbserver\fR] [\fB\-e\fR\ \fIlog\-destination\fR] [\fB\-E\fR\ \fIencoding\fR] [\fB\-h\fR] [\fB\-i\fR\ \fIIP\-address\fR] [\fB\-I\fR] [\fB\-k\fR] [\fB\-K\fR] [\fB\-l\fR\ \fIlog\-level\fR] [\fB\-L\fR\ \fIlog\-file\fR] [\fB\-p\fR\ \fIport\fR] [\fB\-P\fR\ \fIPID\-file\fR] [\fB\-q\fR] [\fB\-r\fR] [\fB\-s\fR] [\fB\-S\fR\ \fInote\-share\-mode\fR] [\fB\-T\fR\ \fItime\fR] [\fB\-U\fR] [\fB\-v\fR] [\fB\-V\fR] [\fB\-x\fR] [\fB\-y\fR\ \fIconfdir\fR] [\fB\-Y\fR\ \fIlibdbidir\fR] .HP \w'\fBrefdbd\fR\ 'u \fBrefdbd\fR {[\fB\-a\fR] | [\fB\-c\fR]} [\fB\-b\fR\ \fIdbs\-port\fR] [\fB\-D\fR\ \fIdbserver\fR] [\fB\-e\fR\ \fIlog\-destination\fR] [\fB\-E\fR\ \fIencoding\fR] [\fB\-h\fR] [\fB\-i\fR\ \fIIP\-address\fR] [\fB\-l\fR\ \fIlog\-level\fR] [\fB\-L\fR\ \fIlog\-file\fR] [\fB\-p\fR\ \fIport\fR] [\fB\-P\fR\ \fIPID\-file\fR] [\fB\-q\fR] [\fB\-u\fR\ \fIusername\fR] [\fB\-v\fR] [\fB\-V\fR] [\fB\-w\fR\ \fIpassword\fR] [\fB\-x\fR] [\fB\-y\fR\ \fIconfdir\fR] [\fB\-Y\fR\ \fIlibdbidir\fR] .SH "DESCRIPTION" .PP refdbd is the application server of RefDB(7)\&. refdbd contains most of the application logic of RefDB and interacts with the database engine\&. refdbd must run somewhere in your network to do anything useful with the RefDB clients\&. refdbd usually runs as a daemon and responds to client requests, but it can be started as a regular process for debugging purposes\&. To start refdbd as a server, use the first command synopsis shown above\&. .PP It is recommended to use a wrapper script to start and stop refdbd\&. If you want to start and stop refdbd manually, use refdbctl(1)\&. If you want to run refdbd as a daemon, use refdb(8)\&. Edit the configuration file (see below) to permanently configure refdbd\&. .PP In addition to being run as a server, refdbd can also be invoked to check, install, or upgrade the main database\&. Refer to the second command synopsis shown above\&. .SH "OPTIONS" .PP \fB\-a\fR .RS 4 Runs refdbd to install or upgrade the main database\&. refdbd will exit after performing the maintenance tasks\&. In order to perform the maintenance tasks you have to provide a database administrator username and password using the \fB\-u\fR and \fB\-w\fR options, respectively, if your database engine uses access control\&. Some database configurations (e\&.g\&. PostgreSQL on Debian) further require you to run the administrative tasks from a special privileged user account (often called pgsql or postgres)\&. If you use one of the file\-based engines (SQLite or SQLite3), you must run the tool from an account which has write permissions in the database folder\&. refdbd first checks whether a main database already exists\&. If not, it will attempt to install it\&. Otherwise, it will upgrade the database to the current version if required\&. refdbd will print an error message to stderr if the maintenance job fails, and exit with a non\-zero exit code\&. .RE .PP \fB\-b\fR \fIdbs\-port\fR .RS 4 Set the port on which the database server listens for incoming connections\&. The default is 3306 for MySQL and 5432 for PostgreSQL\&. This option does not apply if you use SQLite as your database engine\&. .RE .PP \fB\-c\fR .RS 4 Runs refdbd to check the main database version and the database engine connection\&. refdbd will exit after performing the maintenance tasks\&. In order to perform the maintenance tasks you have to provide a database administrator username and password using the \fB\-u\fR and \fB\-w\fR options, respectively, if your database engine uses access control\&. If you use one of the file\-based engines (SQLite or SQLite3), you must run the tool from an account which has read permissions for the main database file\&. refdbd will print an error message to stderr if the check fails, and exit with a non\-zero exit code\&. .RE .PP \fB\-d\fR \fIdefault\-database\fR .RS 4 Set a default database to be used for all client queries that do not specify a database\&. .RE .PP \fB\-D\fR \fIdbserver\fR .RS 4 Select the database server\&. Currently the values mysql, pgsql, and sqlite are supported to select MySQL, PostgreSQL, and SQLite, respectively\&. .RE .PP \fB\-e\fR \fIlog\-destination\fR .RS 4 This specifies the destination of the log information\&. If destination is 0 or "stderr", the log output is sent to stderr\&. This should only be used for debugging purposes when refdbd is not run as a daemon\&. If destination is 1 or "syslog", the syslog facility of the system is used\&. syslog has to be configured properly to accept refdb\*(Aqs log output\&. Consult the syslogd(8) man page how to achieve this\&. If destination is 2 or "file", a custom log file as defined by the \-L switch is used instead\&. If this log file cannot be written to, refdbd falls back to using syslog\&. .RE .PP \fB\-E\fR \fIencoding\fR .RS 4 Select the default character encoding for new reference databases\&. Specify the IANA name of the encoding\&. You can override this default by using the \-E option of the createdb command\&. .RE .PP \fB\-h\fR .RS 4 Displays help and usage screen, then exits\&. .RE .PP \fB\-i\fR \fIIP\-address\fR .RS 4 For external database servers, set the IP address of the box which is running the database server\&. Instead of the IP address you can also specify the hostname as long as it can be properly resolved by your system\&. If the database server runs on the same box as refdbd, use the string \fIlocalhost\fR\&. Note: If \fIlocalhost\fR does not seem to work, try specifying the real IP address of the box instead \- some database client libraries refuse to use TCP/IP for local connections which may cause mayhem on particular systems\&. For embedded database engines, this option sets the directory which contains the database files\&. The default is /usr/local/share/refdb/db\&. Note: SQLite on Cygwin has a bug which prevents the use of absolute paths\&. Use a relative path instead by leaving out the leading slash\&. This assumes that refdbd is started from the root directory\&. The start script refdbctl does this automatically\&. .RE .PP \fB\-I\fR .RS 4 Set this switch to allow remote connections to refdbd\&. Otherwise only connections from localhost (127\&.0\&.0\&.1) will be answered\&. .RE .PP \fB\-k\fR .RS 4 refdb stores up to four names (full name, official abbreviation, and two user\-defined abbreviations) of each periodical\&. These synonyms are shared by all references that use one of these periodical names\&. As it sometimes requires some effort to get at the synonyms (public reference data often contains only the official abbreviation), it is desirable to keep these synonyms even if you remove the last reference that uses a particular periodical name\&. If you use the \-k option, the synonyms will not be removed from the database and will be available immediately if you add a new reference using that particular periodical name\&. .RE .PP \fB\-K\fR .RS 4 If this option is used, refdbd will run an automatic keyword scan each time you add or update references\&. refdbd will scan the title fields and the abstract field of the modified references for any keywords already present in the database but not in the particular reference\&. This increases the usability of keywords in queries\&. There is no speed decrease for the user interaction as the keyword scan is performed in the background\&. See also the related refdba command scankw which performs a more thorough manual keyword scan\&. .RE .PP \fB\-l\fR \fIlog\-level\fR .RS 4 Set the log level to a value between 0 and 7 or to a string value as described in log level definitions\&. 0 means that only critical log messages will be logged, while a value of 7 means that every log message will be logged\&. Set level to \-1 to disable logging\&. .RE .PP \fB\-L\fR \fIlog\-file\fR .RS 4 This switch specifies a custom log file (full path please)\&. This will only be used if the \-e switch is set accordingly\&. .RE .PP \fB\-p\fR \fIport\fR .RS 4 Set the port on which refdbd listens for incoming connections\&. The default is 9734\&. .RE .PP \fB\-P\fR \fIPID\-file\fR .RS 4 Specify the full path of the file that refdbd writes its process ID to\&. This PID simplifies stopping and reconfiguring the application server from the command line\&. The default value is /var/log/refdbd\&.pid\&. .RE .PP \fB\-q\fR .RS 4 Start without reading the configuration file\&. Useful for debugging purposes .RE .PP \fB\-r\fR .RS 4 Enables remote administration via refdba\&. .RE .PP \fB\-s\fR .RS 4 Starts as a standalone application, not as daemon\&. .RE .PP \fB\-S\fR \fInote\-share\-mode\fR .RS 4 Set the default extended note share mode to either public or private\&. This setting affects the accessibility of extended notes if they do not explicitly carry a share attribute\&. See the section about notes sharing for more information\&. .RE .PP \fB\-T\fR \fItime\fR .RS 4 Set the timeout for client/application server dialogue in seconds\&. .RE .PP \fB\-u\fR \fIname\fR .RS 4 Set the username of the database administrator account\&. .RE .PP \fB\-U\fR .RS 4 This switch causes refdbd to automatically uppercase all citation keys of newly added references\&. This makes it more convenient to work with SGML bibliographies\&. .RE .PP \fB\-v\fR .RS 4 Prints version and copyright information, then exits\&. .RE .PP \fB\-V\fR .RS 4 Switches to verbose mode\&. To be honest, currently this doesn\*(Aqt make much of a difference\&. .RE .PP \fB\-w\fR \fIpassword\fR .RS 4 The password of the database administrator account\&. You can pass an asterisk to let refdbd ask for a password interactively\&. This keeps your password from showing up in the process list\&. Keep in mind that you have to protect the asterisk on the command line by surrounding it with single quotes\&. .RE .PP \fB\-x\fR .RS 4 Assume incoming passwords are unencrypted\&. .RE .PP \fB\-y\fR \fIconfdir\fR .RS 4 Specify the directory where the global configuration files are Note: By default, all RefDB applications look for their configuration files in a directory that is specified during the configure step when building the package\&. That is, you don\*(Aqt need the \fB\-y\fR option unless you use precompiled binaries in unusual locations, e\&.g\&. by relocating a rpm package\&. .RE .PP \fB\-Y\fR \fIlibdbidir\fR .RS 4 Specify the directory where the libdbi drivers are Note: By default, libdbi (the database abstraction library used by refdbd) looks for its driver files in a directory that is specified during the configure step when building the package\&. That is, you don\*(Aqt need the \fB\-Y\fR option unless you use precompiled libdbi binaries in unusual locations, e\&.g\&. by relocating a rpm package\&. .RE .SH "CONFIGURATION" .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&1.\ \&refdbdrc .TS allbox tab(:); lB lB lB. T{ Variable T}:T{ Default T}:T{ Comment T} .T& l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l. T{ refdblib T}:T{ /usr/local/share/refdb T}:T{ The path of the directory containing shareable refdb files like DTDs, HTML templates etc\&. Actually, most of the files are in subdirectories of refdblib\&. T} T{ dbsport T}:T{ 3306 T}:T{ The port on which the database server listens\&. Use either 3306 or 5432 for MySQL and PostgreSQL, respectively\&. This variable is ignored if you use SQLite as your database engine\&. T} T{ dbserver T}:T{ sqlite T}:T{ The database server you want to connect to\&. Use one of mysql, pgsql, or sqlite to select MySQL, PostgreSQL, or SQLite as your database engine, respectively\&. T} T{ dbpath T}:T{ /usr/local/var/lib/refdb/db T}:T{ The directory that contains the database files of an embedded database engine\&. Leave out the leading slash if you use SQLite on Cygwin\&. T} T{ logdest T}:T{ 2 T}:T{ The destination of the log information\&. 0 = print to stderr (for debugging only, don\*(Aqt use when running as a daemon); 1 = use the syslog facility; 2 = use a custom logfile\&. The latter needs a proper setting of logfile\&. T} T{ logfile T}:T{ /var/log/refdbd\&.log T}:T{ The full path of a custom log file\&. This is used only if logdest is set appropriately\&. If you start refdbd from the command line as a regular user, you should specify a file that you have write access to (you may not be allowed to create /var/log/refdbd\&.log or write to this file as a regular user)\&. T} T{ loglevel T}:T{ 6 T}:T{ The log level up to which messages will be sent\&. A low setting (0) will notify you only in case of a meltdown, whereas a high setting (7) allows all messages including debug messages (this is \fIa lot\fR)\&. \-1 means nothing will be logged\&. T} T{ pidfile T}:T{ /var/log/refdb\&.pid T}:T{ The file refdbd writes its process ID to\&. If you start refdbd from the command line as a regular user, you should specify a file that you have write access to (you may not be allowed to create /var/log/refdbd\&.pid or write to this file as a regular user)\&. T} T{ port T}:T{ 9734 T}:T{ The port on which refdbd listens\&. The server and all clients that are supposed to connect to it must agree on the same port\&. Obviously, this option allows to run several instances of refdbd on the same box if there is a good reason to do so\&. In this case you should also use separate log and pid files\&. T} T{ remoteadmin T}:T{ f T}:T{ Set this to \*(Aqt\*(Aq to allow remote administration via refdba\&. Be aware that this is a security risk\&. T} T{ serverip T}:T{ localhost T}:T{ The IP address or hostname of the machine where the database server runs\&. Use the default (localhost) address if the database server and refdbd run on the same machine\&. T} T{ timeout T}:T{ 180 T}:T{ The timeout in seconds\&. After this time has elapsed, a stalled connection is taken down\&. Increase this value if you encounter frequent timeout errors due to high network traffic\&. T} T{ keep_pnames T}:T{ t T}:T{ Set this to \*(Aqt\*(Aq to keep periodical names and synonyms if you remove references\&. If set to \*(Aqf\*(Aq, the names will be removed from the database if the last reference using these names is deleted\&. T} T{ db_encoding T}:T{ (none) T}:T{ Specify the default character encoding for new refdb reference databases\&. If the database server supports this feature (currently only PostgreSQL does), all new databases will use this encoding unless a different one is specified with the createdb command\&. T} T{ in_encoding T}:T{ ISO\-8859\-1 T}:T{ Specify the default character encoding for RIS data being added to databases\&. T} T{ dbi_driverdir T}:T{ (none) T}:T{ Specify the directory containing the libdbi driver files\&. As mentioned above, this is only necessary if you use precompiled libdbi binaries in funny locations\&. T} T{ keyword_scan T}:T{ t T}:T{ Set this to \*(Aqt\*(Aq to allow an automatic keyword scan after references are added or updated\&. \*(Aqf\*(Aq will switch off this feature\&. T} T{ upper_citekey T}:T{ f T}:T{ Set this to \*(Aqt\*(Aq to uppercase all citation keys of newly added references (this makes sure they work with SGML bibliographies)\&. T} T{ share_default T}:T{ public T}:T{ Whether ("public") or not ("private") to share extended notes between users by default\&. See the section about notes sharing for more information\&. T} T{ remoteconnect T}:T{ f T}:T{ Set this to \*(Aqt\*(Aq to allow remote connections to refdbd\&. By default, refdbd accepts only local connections due to security concerns\&. T} T{ no_decrypt T}:T{ f T}:T{ If set to \*(Aqt\*(Aq, incoming passwords are assumed to be unencrypted\&. The default is to expect encrypted passwords\&. T} .TE .sp 1 .SH "FILES" .PP PREFIX/etc/refdb/refdbdrc .PP The global configuration file of refdbd\&. .SH "SEE ALSO" .PP \fBRefDB\fR (7), \fBrefdb\fR (8), \fBrefdbctl\fR (1), \fBrefdba\fR (1), \fBrefdbc\fR (1)\&. .PP \fIRefDB manual (local copy) \fR PREFIX/share/doc/refdb\-/refdb\-manual/index\&.html .PP \fIRefDB manual (web) \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/manual/index\&.html\fR\m[]> .PP \fIRefDB on the web \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/\fR\m[]> .SH "AUTHOR" .PP refdbd was written by Markus Hoenicka \&. refdb-1.0.2/man/refdb-init.8000644 001750 001750 00000007767 12255422770 016360 0ustar00markusmarkus000000 000000 '\" t .\" Title: refdb-init .\" Author: [see the "Author" section] .\" Generator: DocBook XSL Stylesheets v1.76.1 .\" Date: 2005-10-15 .\" Manual: RefDB Manual .\" Source: RefDB Manual .\" Language: English .\" .TH "REFDB\-INIT" "8" "2005\-10\-15" "RefDB Manual" "RefDB Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" refdb-init \- RefDB setup script .SH "SYNOPSIS" .HP \w'\fBrefdb\-init\fR\ 'u \fBrefdb\-init\fR .SH "DESCRIPTION" .PP refdb\-init is an interactive shell script that guides the system administrator through the initial setup of RefDB(7)\&. refdb\-init asks all necessary questions and performs all necessary checks before any changes are committed\&. Your confirmation is required before your system will be touched\&. As many of the operations performed by this script require root permission, you have to run this script from a privileged account\&. .PP While refdb\-init does check for an existing installation of RefDB and offers to back up existing configuration files, it is not yet designed to upgrade an installation appropriately\&. If used to upgrade an existing installation, the administrator is responsible to back up and restore data that may be overwritten during the setup\&. .PP refdb\-init performs the following tasks (you can interactively skip some of the tasks): .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} Creates the main database refdb for the selected database engine\&. If a copy of the main database already exists, it asks for permission to delete this database before proceeding\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} Creates a configuration file for refdbd(1), the RefDB application server\&. If the file already exists, it will keep a copy of this version\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} Creates a configuration file for refdba(1), the RefDB administrative client, in the current login account\&. If the file already exists, it will keep a copy of this version\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} Starts refdbd, the RefDB application server .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} Loads the bibliography and citation styles shipped with RefDB .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} Creates a reference database .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} Creates a database user with permissions to work with the reference database .RE .SH "FILES" .PP PREFIX/etc/refdb/refdbdrc .RS 4 The configuration file for refdbd .RE .PP /root/\&.refdba .RS 4 The configuration file for refdba for the root account .RE .SH "SEE ALSO" .PP \fBRefDB\fR (7), \fBrefdbd\fR (1)\&. .PP \fIRefDB manual (local copy) \fR PREFIX/share/doc/refdb\-/refdb\-manual/index\&.html .PP \fIRefDB manual (web) \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/manual/index\&.html\fR\m[]> .PP \fIRefDB on the web \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/\fR\m[]> .SH "AUTHOR" .PP refdb\-init was written by Markus Hoenicka \&. refdb-1.0.2/man/refdbctl.1000644 001750 001750 00000005210 12255422771 016071 0ustar00markusmarkus000000 000000 '\" t .\" Title: refdbctl .\" Author: [see the "Author" section] .\" Generator: DocBook XSL Stylesheets v1.76.1 .\" Date: 2005-10-15 .\" Manual: RefDB Manual .\" Source: RefDB Manual .\" Language: English .\" .TH "REFDBCTL" "1" "2005\-10\-15" "RefDB Manual" "RefDB Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" refdbctl \- refdbd startup script .SH "SYNOPSIS" .HP \w'\fBrefdbctl\fR\ 'u \fBrefdbctl\fR \fIstart\fR | \fIstop\fR | \fIrestart\fR | \fIreload\fR .SH "DESCRIPTION" .PP refdbctl is a wrapper script to be used as a manual control script for the refdbd(1) daemon\&. It is also used by the refdb(8) startup script\&. The script takes care of avoiding multiple copies of the daemon and allows you to stop the daemon without knowing its process ID\&. .SH "OPTIONS" .PP \fIstart\fR .RS 4 Starts the refdbd(1) daemon unless it is already running .RE .PP \fIstop\fR .RS 4 Stops the refdbd(1) daemon .RE .PP \fIrestart\fR .RS 4 Restarts the refdbd(1) daemon if it is already running\&. The existing process is stopped, and a new process is started\&. .RE .PP \fIreload\fR .RS 4 Asks the refdbd(1) daemon to reload its configuration file\&. Use this command to let changes to your configuration file take effect without stopping the process\&. .RE .SH "FILES" .PP /var/run/refdbd\&.pid .PP The run file containing the process ID of the running refdbd process\&. .SH "SEE ALSO" .PP \fBRefDB\fR (7), \fBrefdbd\fR (1)\&. .PP \fIRefDB manual (local copy) \fR PREFIX/share/doc/refdb\-/refdb\-manual/index\&.html .PP \fIRefDB manual (web) \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/manual/index\&.html\fR\m[]> .PP \fIRefDB on the web \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/\fR\m[]> .SH "AUTHOR" .PP refdbctl was written by Markus Hoenicka \&. refdb-1.0.2/man/refdbsru.1000644 001750 001750 00000016027 12255422771 016130 0ustar00markusmarkus000000 000000 '\" t .\" Title: refdbsru .\" Author: [see the "Author" section] .\" Generator: DocBook XSL Stylesheets v1.76.1 .\" Date: 2005-10-16 .\" Manual: RefDB Manual .\" Source: RefDB Manual .\" Language: English .\" .TH "REFDBSRU" "1" "2005\-10\-16" "RefDB Manual" "RefDB Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" refdbsru \- CGI script providing SRU access to RefDB databases .SH "SYNOPSIS" .HP \w'\fBrefdbsru\fR\ 'u \fBrefdbsru\fR .SH "DESCRIPTION" .PP refdbsru is a CGI script which turns your web server into a proxy RefDB server providing SRU (Search and Retrieve via URL) access\&. Anyone with a web browser or some other tool capable of sending HTTP requests can query your RefDB databases\&. This script is not intended to be run by users\&. It is invoked by your web server\&. .PP The output of the script is a XML document as described in the SRU standard\&. .SH "CONFIGURATION" .PP \fBrefdbsru\fR evaluates the file refdbsrurc to initialize itself\&. .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBNote\fR .ps -1 .br .PP The parameters starting with "zeerex_" do not actually influence how the script operates\&. They provide some of the site\-specific information which appears in the SRU \fBexplain\fR output\&. .sp .5v .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&1.\ \&refdbsrurc .TS allbox tab(:); lB lB lB. T{ Variable T}:T{ Default T}:T{ Comment T} .T& l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l. T{ logfile T}:T{ /var/log/refdbsru\&.log T}:T{ The full path of a custom log file\&. This is used only if logdest is set appropriately\&. T} T{ logdest T}:T{ 1 T}:T{ The destination of the log information\&. 0 = print to stderr; 1 = use the syslog facility; 2 = use a custom logfile\&. The latter needs a proper setting of logfile\&. T} T{ loglevel T}:T{ 6 T}:T{ The log level up to which messages will be sent\&. A low setting (0) allows only the most important messages, a high setting (7) allows all messages including debug messages\&. \-1 means nothing will be logged\&. T} T{ serverip T}:T{ 127\&.0\&.0\&.1 T}:T{ The IP address or hostname of the machine where refdbd runs\&. Use the default (localhost) address if the clients and refdbs run on the same machine\&. T} T{ port T}:T{ 9734 T}:T{ The port on which refdbd listens\&. Change this for all clients and the server if this value interferes with another program using this port\&. T} T{ timeout T}:T{ 180 T}:T{ The timeout in seconds\&. After this time has elapsed, a stalled connection is taken down\&. Increase this value if you encounter frequent timeout errors due to high network traffic or refdbd overload\&. T} T{ username T}:T{ login name T}:T{ The username which is used for authentication with the database server\&. T} T{ passwd T}:T{ \ \& T}:T{ The password which is used for authentication with the database server\&. T} T{ pdfroot T}:T{ (none) T}:T{ This value will be used as the root of the paths to PDF or Postscript offprints that can be specified with the AV field in a RIS dataset\&. The path should not rely on shell expansion, e\&.g\&. use /home/me/literature/ instead of ~/literature/\&. The pdfroot allows you to shorten the paths that you enter for each dataset and to maintain a certain portability if you have to move the offprints to a different directory or want to access them remotely\&. The html output routine will concatenate the relative path of each dataset with the pdfroot to construct the link to the offprint\&. Instead of a local path name you can specify an URL starting with http:// or ftp:// if your offprints are accessible through a web server or ftp server\&. T} T{ cssurl T}:T{ (none) T}:T{ In spite of the parameter name, this may be the URL either of a Cascading Style Sheet (CSS) file, or of a XSLT file\&. This file, if specified, is used to format the SRU output in the web browser\&. T} T{ dbserver T}:T{ (none) T}:T{ This is the name of the database engine that refdbd uses (currently either mysql, pgsql, sqlite, or sqlite3)\&. refdbsru can obtain this value at runtime, but it has to send one additional query per searchRetrieve or scan operation\&. If you provide the value here instead, response times will be faster\&. T} T{ zeerex_host T}:T{ www\&.change\&.me T}:T{ The hostname of the computer that runs your web server and refdbsru T} T{ zeerex_port T}:T{ 80 T}:T{ The port that your web server listens to\&. T} T{ zeerex_database T}:T{ cgi\-bin/refdbsru T}:T{ The path section of the URL which provides SRU access to your database, without the leading slash\&. zeerex_host, a slash, and this option combined make up the URL which a user has to type into his web browser to access your SRU service\&. T} T{ zeerex_databaseInfo_title T}:T{ Reference Database T}:T{ A public name of your database\&. T} T{ zeerex_databaseInfo_description T}:T{ A reference database T}:T{ A brief description of your database\&. T} T{ zeerex_databaseInfo_author T}:T{ Your Name T}:T{ The name of the person who is in charge of running the database\&. T} T{ zeerex_databaseInfo_contact T}:T{ your@email T}:T{ How to contact the database maintainer\&. Usually the email address\&. T} .TE .sp 1 .SH "ENVIRONMENT" .PP As a CGI script, refdbsru evaluates a variety of environment variables that the web server provides\&. These are: .PP REQUEST_METHOD .RS 4 Either GET or POST .RE .PP QUERY_STRING .RS 4 The query string proper in a GET request\&. .RE .PP PATH_INFO .RS 4 This value, if present, is used as the name of a database (other than the preconfigured default database)\&. .RE .SH "FILES" .PP PREFIX/etc/refdb/refdbsrurc .RS 4 The global configuration file of refdbsru\&. .RE .SH "SEE ALSO" .PP \fBRefDB\fR (7) .PP \fBrefdb\-sruserver\fR (1) .PP \fIRefDB manual (local copy) \fR PREFIX/share/doc/refdb\-/refdb\-manual/index\&.html .PP \fIRefDB manual (web) \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/manual/index\&.html\fR\m[]> .PP \fIRefDB on the web \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/\fR\m[]> .PP \fISRU (Search and Retrieve via URL) \fR <\m[blue]\fBhttp://www\&.loc\&.gov/standards/sru/\fR\m[]> .SH "AUTHOR" .PP refdbsru was written by Markus Hoenicka \&. refdb-1.0.2/man/refdb-sruserver.1000644 001750 001750 00000016273 12255422772 017440 0ustar00markusmarkus000000 000000 '\" t .\" Title: refdb-sruserver .\" Author: [see the "Author" section] .\" Generator: DocBook XSL Stylesheets v1.76.1 .\" Date: 2007-08-11 .\" Manual: RefDB Manual .\" Source: RefDB Manual .\" Language: English .\" .TH "REFDB\-SRUSERVER" "1" "2007\-08\-11" "RefDB Manual" "RefDB Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" refdb-sruserver \- Simple SRU server for RefDB databases .SH "SYNOPSIS" .HP \w'\fBrefdb\-sruserver\fR\ 'u \fBrefdb\-sruserver\fR .SH "DESCRIPTION" .PP refdb\-sruserver is a simple standalone web server which povides a SRU service for RefDB databases\&. It is intended solely for local single\-user access\&. For anything more ambitious, please see the CGI version of the SRU service, refdbsru(1)\&. .PP Before starting the SRU service, make sure to set up the refdbsrurc configuration file which it shares with the CGI variant\&. The RefDB application server refdbd(1) must also be up and running\&. Now start the script which will run in the foreground until you kill it with Ctrl\-c\&. The SRU service is available at the URL http://localhost:8080\&. Pointing your web browser to this address should return the output of the SRU explain command in a nicely formatted page\&. To run real queries, append the SRU query strings to the above URL\&. .SH "CONFIGURATION" .PP \fBrefdb\-sruserver\fR evaluates the file refdbsrurc to initialize itself\&. It shares this configuration file with refdbsru(1), the CGI variant of the SRU service\&. .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBNote\fR .ps -1 .br .PP The parameters starting with "zeerex_" do not actually influence how the script operates\&. They provide some of the site\-specific information which appears in the SRU \fBexplain\fR output\&. .sp .5v .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&1.\ \&refdb-sruserverrc .TS allbox tab(:); lB lB lB. T{ Variable T}:T{ Default T}:T{ Comment T} .T& l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l. T{ logfile T}:T{ /var/log/refdb\-sruserver\&.log T}:T{ The full path of a custom log file\&. This is used only if logdest is set appropriately\&. T} T{ logdest T}:T{ 1 T}:T{ The destination of the log information\&. 0 = print to stderr; 1 = use the syslog facility; 2 = use a custom logfile\&. The latter needs a proper setting of logfile\&. T} T{ loglevel T}:T{ 6 T}:T{ The log level up to which messages will be sent\&. A low setting (0) allows only the most important messages, a high setting (7) allows all messages including debug messages\&. \-1 means nothing will be logged\&. T} T{ serverip T}:T{ 127\&.0\&.0\&.1 T}:T{ The IP address or hostname of the machine where refdbd runs\&. Use the default (localhost) address if the clients and refdbs run on the same machine\&. T} T{ port T}:T{ 9734 T}:T{ The port on which refdbd listens\&. Change this for all clients and the server if this value interferes with another program using this port\&. T} T{ timeout T}:T{ 180 T}:T{ The timeout in seconds\&. After this time has elapsed, a stalled connection is taken down\&. Increase this value if you encounter frequent timeout errors due to high network traffic or refdbd overload\&. T} T{ username T}:T{ login name T}:T{ The username which is used for authentication with the database server\&. T} T{ passwd T}:T{ \ \& T}:T{ The password which is used for authentication with the database server\&. T} T{ pdfroot T}:T{ (none) T}:T{ This value will be used as the root of the paths to PDF or Postscript offprints that can be specified with the AV field in a RIS dataset\&. The path should not rely on shell expansion, e\&.g\&. use /home/me/literature/ instead of ~/literature/\&. The pdfroot allows you to shorten the paths that you enter for each dataset and to maintain a certain portability if you have to move the offprints to a different directory or want to access them remotely\&. The html output routine will concatenate the relative path of each dataset with the pdfroot to construct the link to the offprint\&. Instead of a local path name you can specify an URL starting with http:// or ftp:// if your offprints are accessible through a web server or ftp server\&. T} T{ cssurl T}:T{ (none) T}:T{ In spite of the parameter name, this may be the URL either of a Cascading Style Sheet (CSS) file, or of a XSLT file\&. This file, if specified, is used to format the SRU output in the web browser\&. T} T{ dbserver T}:T{ (none) T}:T{ This is the name of the database engine that refdbd uses (currently either mysql, pgsql, sqlite, or sqlite3)\&. refdb\-sruserver can obtain this value at runtime, but it has to send one additional query per searchRetrieve or scan operation\&. If you provide the value here instead, response times will be faster\&. T} T{ zeerex_host T}:T{ www\&.change\&.me T}:T{ The hostname of the computer that runs your web server and refdb\-sruserver T} T{ zeerex_port T}:T{ 80 T}:T{ The port that your web server listens to\&. T} T{ zeerex_database T}:T{ cgi\-bin/refdb\-sruserver T}:T{ The path section of the URL which provides SRU access to your database, without the leading slash\&. zeerex_host, a slash, and this option combined make up the URL which a user has to type into his web browser to access your SRU service\&. T} T{ zeerex_databaseInfo_title T}:T{ Reference Database T}:T{ A public name of your database\&. T} T{ zeerex_databaseInfo_description T}:T{ A reference database T}:T{ A brief description of your database\&. T} T{ zeerex_databaseInfo_author T}:T{ Your Name T}:T{ The name of the person who is in charge of running the database\&. T} T{ zeerex_databaseInfo_contact T}:T{ your@email T}:T{ How to contact the database maintainer\&. Usually the email address\&. T} .TE .sp 1 .SH "FILES" .PP PREFIX/etc/refdb/refdbsrurc .RS 4 The global configuration file of refdb\-sruserver\&. .RE .SH "SEE ALSO" .PP \fBRefDB\fR (7) .PP \fBrefdbsru\fR (1) .PP \fIRefDB manual (local copy) \fR PREFIX/share/doc/refdb\-/refdb\-manual/index\&.html .PP \fIRefDB manual (web) \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/manual/index\&.html\fR\m[]> .PP \fIRefDB on the web \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/\fR\m[]> .PP \fISRU (Search and Retrieve via URL) \fR <\m[blue]\fBhttp://www\&.loc\&.gov/standards/sru/\fR\m[]> .SH "AUTHOR" .PP refdb\-sruserver was written by Markus Hoenicka \&. refdb-1.0.2/man/RefDB.7000644 001750 001750 00000023101 12255422773 015235 0ustar00markusmarkus000000 000000 '\" t .\" Title: RefDB .\" Author: [see the "Author" section] .\" Generator: DocBook XSL Stylesheets v1.76.1 .\" Date: 2005/10/16 .\" Manual: RefDB Manual .\" Source: RefDB Manual .\" Language: English .\" .TH "REFDB" "7" "2005/10/16" "RefDB Manual" "RefDB Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" RefDB \- a set of tools to manage bibliographic references, notes, and bibliographies for markup languages .SH "DESCRIPTION" .SS "General Features" .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} RefDB is a reference/notes database and bibliography tool for SGML, XML, and LaTeX documents\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} RefDB is mainly implemented in C, with a few Perl scripts inbetween, as well as shell scripts as "glue"\&. It can be compiled on all platforms with a decent C compiler (a small amount of porting may be required)\&. It builds and runs out of the box on Linux, FreeBSD, NetBSD, Solaris, OSX, Darwin, and Windows/Cygwin\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} RefDB is modular and accessible\&. You can plug in a variety of database engines to store your data, and you can choose between a variety of interfaces for interactive work\&. You can use RefDB in your projects through shell scripts or from Perl programs\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} The RefDB handbook (more than 300 printed pages) helps you to get RefDB up and running quickly and explains how to use the software for both administrators and users in great detail\&. In addition there is a tutorial targeted at plain users\&. .RE .SS "Application Design" .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} RefDB uses a SQL database engine to store the references, notes, and the bibliography styles\&. Choose either an external database server for optimum performance and flexibility, or an embedded database engine for convenience (see below for supported database engines)\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} Both reference and bibliography style databases use the relational features of SQL databases extensively to consolidate information and to save storage space\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} RefDB employs a three\-tier architecture with lots of flexibility: clients, an application server that can run as a daemon, and the database server\&. If you prefer the embedded SQL engine, there\*(Aqll be a two\-tier setup\&. In both cases, all tiers may run on a single workstation for individual use\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} The application server can generate log messages to monitor its operation\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} RefDB contains two standard interfaces: a command line interface for terminal addicts and for use in scripts, and a PHP\-based web interface for a more visual approach\&. In addition, both Emacs and Vim users can access RefDB from the editing environment they\*(Aqre used to\&. Finally, there is also a Perl client module to integrate RefDB functionality into your own Perl programs\&. .RE .SS "Reference and Notes Management" .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} The main input format for bibliographic data is RIS which can be generated and imported by all major reference databases on Windows (Reference Manager, EndNote and the like)\&. An XML representation of RIS using the risx DTD is also supported as a native format\&. The latter is well suited as a means to import SGML or XML bibliographic data\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} Import filters are provided for Medline (tagged and XML), BibTeX, MARC, and DocBook\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} The data can be retrieved as simple text, formatted as HTML, formatted as a DocBook bibliography element (SGML or XML), formatted as a TEI listBibl element (XML), formatted as MODS (XML), formatted as BibTeX reference list, or formatted as RIS or risx files\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} All character encodings supported by your platform can be used both for data input and for data export\&. This includes European character sets like Latin\-1 and of course Unicode\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} Extended notes can be linked to one or more references, authors, periodicals, or keywords to create topics or material collections\&. These are more powerful and flexible than folder systems and the like\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} The query language is fairly simple yet powerful\&. You can use booleans to combine queries on any combination of fields\&. You can use brackets to group queries\&. You can use Unix\-style regular expressions to formulate advanced queries\&. .RE .SS "Bibliographies" .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} Formatted bibliographies can be created automatically from DocBook SGML/XML and TEI XML documents\&. This does not require any changes or extensions to the DTDs\&. RefDB can also be integrated as a data source into the LaTeX/BibTeX workflow\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} RefDB is extensible in terms of the supported document types: support for new document types can be added without hacking the tool itself (you only need to hack stylesheets) .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} Citation and reference styles can be defined in XML to match the weirdest requirements of journals and publishers\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} Sophisticated shell scripts and makefiles take care of the document transformations\&. The whole process is transparent to the user as all he needs to do is e\&.g\&. type \fBmake pdf\fR to turn his document into a PDF file with formatted citations and bibliographies\&. .RE .SS "Networking Capabilities" .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} Due to the client/server design, RefDB is very well suited as a shared reference database for a workgroup or a department\&. However, it runs just fine on a single standalone workstation\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} Users can share databases and still have their personal reference lists\&. They can share their notes or keep them private on a per\-note base\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} Concurrent read and write access of several users is supported\&. There is no need to restrict access of other users to read\-only\&. However, if your database engine supports access control (MySQL and PostgreSQL), you can restrict access of some users to read\-only\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} A simple method to access electronic offprints (e\&.g\&. in PDF or PostScript format) is provided in the HTML output and in the web interface\&. This also works across networks using mounted shares\&. .RE .SS "Supported Database Servers" .PP RefDB versions 0\&.9 and later employ the libdbi database abstraction library to provide support for different SQL database engines\&. Currently the following external SQL database servers are supported: .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} MySQL .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} PostgreSQL .RE .PP The following embedded database engines are supported: .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} SQLite (versions 2\&.x and 3\&.x) .RE .SH "SEE ALSO" .PP \fBrefdbd\fR (1), \fBrefdba\fR (1), \fBrefdbc\fR (1), \fBrefdbbib\fR (1), \fBbib2ris\fR (1), \fBdb2ris\fR (1), \fBen2ris\fR (1), \fBmarc2ris\fR (1), \fBmed2ris\fR (1), \fBeenc\fR (1), \fBrefdb\-backup\fR (1), \fBrefdb\-ms\fR (1), \fBrefdb\-restore\fR (1), \fBrefdbjade\fR (1), \fBrefdbnd\fR (1), \fBrefdbxml\fR (1), \fBrefdbctl\fR (1), \fBrefdb\fR (8)\&. .PP \fIRefDB manual (local copy) \fR PREFIX/share/doc/refdb\-/refdb\-manual/index\&.html .PP \fIRefDB manual (web) \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/manual/index\&.html\fR\m[]> .PP \fIRefDB on the web \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/\fR\m[]> .SH "AUTHOR" .PP RefDB was originally written by Markus Hoenicka \&. For a list of current authors, see the file AUTHORS\&. refdb-1.0.2/man/refdba.1000644 001750 001750 00000142350 12255422774 015541 0ustar00markusmarkus000000 000000 '\" t .\" Title: refdba .\" Author: [see the "Author" section] .\" Generator: DocBook XSL Stylesheets v1.76.1 .\" Date: 2005-10-15 .\" Manual: RefDB Manual .\" Source: RefDB Manual .\" Language: English .\" .TH "REFDBA" "1" "2005\-10\-15" "RefDB Manual" "RefDB Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" refdba \- the administration client of RefDB .SH "SYNOPSIS" .PP Interactive mode: .HP \w'\fBrefdba\fR\ 'u \fBrefdba\fR [\fB\-c\fR\ \fIpager\-command\fR] [\fB\-e\fR\ \fIlog\-destination\fR] [\fB\-f\fR\ \fIstdin\fR] [\fB\-h\fR] [\fB\-i\fR\ \fIIP\-address\fR] [\fB\-l\fR\ \fIlog\-level\fR] [\fB\-L\fR\ \fIlog\-file\fR] [\fB\-p\fR\ \fIport\fR] [\fB\-q\fR] [\fB\-T\fR\ \fItime\fR] [\fB\-u\fR\ \fIname\fR] [\fB\-v\fR] [\fB\-V\fR] [\fB\-w\fR\ \fIpassword\fR] [\fB\-x\fR] [\fB\-y\fR\ \fIconfdir\fR] .br \fINon\-Interactive\fR \fImode:\fR .PP Batch mode: .HP \w'\fBrefdba\fR\ 'u \fBrefdba\fR \fB\-C\fR\ \fIcommand\fR [\fB\-c\fR\ \fIpager\-command\fR] [\fB\-e\fR\ \fIlog\-destination\fR] [\fB\-f\fR\ \fIstdin\fR] [\fB\-i\fR\ \fIIP\-address\fR] [\fB\-l\fR\ \fIlog\-level\fR] [\fB\-L\fR\ \fIlog\-file\fR] [\fB\-p\fR\ \fIport\fR] [\fB\-q\fR] [\fB\-T\fR\ \fItime\fR] [\fB\-u\fR\ \fIname\fR] [\fB\-w\fR\ \fIpassword\fR] [\fB\-x\fR] [\fB\-y\fR\ \fIconfdir\fR] .SH "DESCRIPTION" .PP refdba is a command\-line client providing the commands to administer RefDB(7) databases, users, and styles\&. refdba can be started in an interactive mode, providing a command prompt\&. Type \fB?\fR or \fBhelp\fR to see a list of available commands\&. Alternatively you can start refdba in non\-interactive mode\&. refdba will execute the requested command and return\&. In this mode refdba will accept input on stdin for a variety of commands, allowing Unix piping\&. .SH "OPTIONS" .PP \fB\-c\fR \fIpager\-command\fR .RS 4 The command line of the pager that is to be used\&. Instead of a pager you can of course specify any valid command that accepts data on stdin\&. Use "stdout" to request data output to stdout\&. This is the default, but you may want to specify it on the command line if you need to temporarily override a default pager setting in your configuration file\&. .RE .PP \fB\-C\fR \fIcommand\fR .RS 4 The command to be run in non\-interactive mode\&. You can supply all options and parameters that the command accepts on the refdba command line\&. .RE .PP \fB\-e\fR \fIlog\-destination\fR .RS 4 log\-destination can have the values 0, 1, or 2, or the equivalent strings \fIstderr\fR, \fIsyslog\fR, or \fIfile\fR, respectively\&. This value specifies where the log information goes to\&. 0 (zero) means the messages are sent to stderr\&. They are immediately available on the screen but they may interfere with command output\&. 1 will send the output to the syslog facility\&. Keep in mind that syslog must be configured to accept log messages from user programs, see the syslog(8) man page for further information\&. Unix\-like systems usually save these messages in /var/log/user\&.log\&. 2 will send the messages to a custom log file which can be specified with the \fB\-L\fR option\&. .RE .PP \fB\-f\fR \fIstdin\fR .RS 4 Read data from stdin\&. refdbc usually knows when it should read from stdin\&. However, a few commands use data supplied in the command line but also allow to read from a file\&. Use this option to force refdbc to read from stdin \fIin addition\fR to values supplied on the command line\&. .RE .PP \fB\-h\fR .RS 4 Displays help and usage screen, then exits\&. .RE .PP \fB\-i\fR \fIIP\-address\fR .RS 4 Set the IP address of the box which is running the application server refdbd(1)\&. Instead of the IP address you can also specify the hostname as long as it can be properly resolved by your system\&. .RE .PP \fB\-l\fR \fIlog\-level\fR .RS 4 Specify the priority up to which events are logged\&. This is either a number between 0 and 7 or one of the strings \fIemerg\fR, \fIalert\fR, \fIcrit\fR, \fIerr\fR, \fIwarning\fR, \fInotice\fR, \fIinfo\fR, \fIdebug\fR, respectively (see also Log level definitions)\&. \fB\-1\fR disables logging completely\&. A low log level like 0 means that only the most critical messages are logged\&. A higher log level means that less critical events are logged as well\&. 7 will include debug messages\&. The latter can be verbose and abundant, so you want to avoid this log level unless you need to track down problems\&. .RE .PP \fB\-L\fR \fIlog\-file\fR .RS 4 Specify the full path to a log file that will receive the log messages\&. Typically this would be /var/log/refdba\&. .RE .PP \fB\-p\fR \fIport\fR .RS 4 Set the port of the box which is running the application server\&. .RE .PP \fB\-q\fR .RS 4 Start without reading the configuration files\&. The client will use the compile\-time defaults for all values that you do not set with command\-line switches\&. Useful for debugging config files\&. .RE .PP \fB\-T\fR \fItime\fR .RS 4 Set the timeout for client/application server dialogue in seconds\&. A connection with unsuccessful read or write attempts will be considered as dead and taken down after this amount of time has elapsed\&. .RE .PP \fB\-u\fR \fIname\fR .RS 4 Set the username for the database access\&. Note: This username need not be identical to the login name of the user\&. This is the username required to access the database server\&. .RE .PP \fB\-v\fR .RS 4 Prints version and copyright information, then exits\&. .RE .PP \fB\-V\fR .RS 4 Switches to verbose mode\&. .RE .PP \fB\-w\fR \fIpassword\fR .RS 4 Set the password for the database access\&. Note: This password need not be identical to the login password of the user\&. This is the password required to access the database server\&. .RE .PP \fB\-x\fR .RS 4 Send passwords unencrypted\&. .RE .PP \fB\-y\fR \fIconfdir\fR .RS 4 Specify the directory where the global configuration files are Note: By default, all RefDB applications look for their configuration files in a directory that is specified during the configure step when building the package\&. That is, you don\*(Aqt need the \fB\-y\fR option unless you use precompiled binaries in unusual locations, e\&.g\&. by relocating a rpm package\&. .RE .SH "DIAGNOSTICS" .PP The exit code is 0 if all went fine\&. It will be 1 if the command (when run in batch mode) or the last command (when run in interactive mode) returned an error, or if there was a general error condition during startup like a lack of available memory\&. .SH "CONFIGURATION" .PP refdba evaluates the refdbarc configuration file at startup to initialize itself\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&1.\ \&refdbarc .TS allbox tab(:); lB lB lB. T{ Variable T}:T{ Default T}:T{ Comment T} .T& l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l. T{ logfile T}:T{ /var/log/refdba\&.log T}:T{ The full path of a custom log file\&. This is used only if logdest is set appropriately\&. If you start refdba from the command line as a regular user, you should specify a file that you have write access to (you may not be allowed to create /var/log/refdb\&.log or write to this file as a regular user)\&. T} T{ logdest T}:T{ 2 T}:T{ The destination of the log information\&. 0 = print to stderr (this is mainly intended for debugging, as it may visually interfere with command output); 1 = use the syslog facility; 2 = use a custom logfile\&. The latter needs a proper setting of logfile\&. T} T{ loglevel T}:T{ 6 T}:T{ The log level up to which messages will be logged\&. A low setting (0) allows only the most important messages, a high setting (7) allows all messages including debug messages\&. \-1 means nothing will be logged\&. T} T{ pager T}:T{ stdout T}:T{ The command line of a pager that accepts the output of refdb on stdin to allow scrolling and other nifty things\&. \(lqstdout\(rq sends the data to stdout\&. T} T{ passwd T}:T{ * T}:T{ The password which is used for authentication with the database server\&. It is potentially evil to store unencrypted passwords in disk files\&. At least make sure that the configuration file is not readable for anyone else\&. The default setting causes refdba to ask for your password interactively\&. T} T{ port T}:T{ 9734 T}:T{ The port on which refdbd listens\&. Change this for all clients and the server if this value interferes with another program using this port\&. T} T{ serverip T}:T{ 127\&.0\&.0\&.1 T}:T{ The IP address or hostname of the machine where refdbd runs\&. Use the default (localhost) address if the clients and refdbd run on the same machine\&. T} T{ timeout T}:T{ 180 T}:T{ The timeout in seconds\&. After this time has elapsed, a stalled connection is taken down\&. Increase this value if you encounter frequent timeout errors due to high network traffic or refdbd overload\&. T} T{ username T}:T{ login name T}:T{ The username which is used for authentication with the database server\&. This may be different from the login name of the user\&. T} T{ verbose T}:T{ f T}:T{ Set this to t if you prefer verbose error messages\&. T} T{ no_encrypt T}:T{ f T}:T{ If set to \*(Aqt\*(Aq, passwords are transmitted unencrypted\&. The default is to encrypt passwords\&. T} .TE .sp 1 .SH "COMMANDS" .PP All commands consist of a single word which specifies the command\&. This may be followed by arguments and/or switches\&. The general syntax rules of the getopts library apply\&. .SS "addstyle" .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBSynopsis\fR .RS 4 .HP \w'\fBaddstyle\fR\ 'u \fBaddstyle\fR [\fB\-c\fR\ \fIcommand\fR] [\fB\-h\fR] [[\fB\-o\fR\ \fIfilename\fR] | [\fB\-O\fR\ \fIfilename\fR]] {\fIstyle\-file\fR...} .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBDescription\fR .RS 4 .PP Adds one or more bibliography style specifications from the input file(s)\&. .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBOptions\fR .RS 4 .PP \fB\-c\fR \fIcommand\fR .RS 4 Specifies a command that will receive the output instead of the default pager\&. This may be a different pager, any command that takes input on stdin, or the string \(lqstdout\(rq to send the data to stdout without using a pager\&. .RE .PP \fB\-h\fR .RS 4 Displays the online help about the \fBaddstyle\fR command\&. .RE .PP \fB\-o\fR \fIfilename\fR .RS 4 Write the output to \fIfilename\fR instead of to stdout\&. .RE .PP \fB\-O\fR \fIfilename\fR .RS 4 Append the output to \fIfilename\fR instead of writing it to stdout\&. .RE .PP \fIstyle\-file\fR .RS 4 All other arguments are interpreted as the names of files containing style specifications\&. .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBExample\fR .RS 4 .sp .if n \{\ .RS 4 .\} .nf refdba: \fBaddstyle j\&.biol\&.chem\&.xml pharmacol\&.rev\&.xml\fR .fi .if n \{\ .RE .\} .PP This will add the style specifications contained in the files j\&.biol\&.chem\&.xml and pharmacol\&.rev\&.xml to the bibliography style database\&. .RE .SS "adduser" .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBSynopsis\fR .RS 4 .HP \w'\fBadduser\fR\ 'u \fBadduser\fR {\fB\-d\fR\ \fIdatabase\fR} [\fB\-h\fR] {\fB\-H\fR\ \fIhost\-IP\fR} [\fB\-R\fR] [\fB\-W\fR\ \fIpassword\fR] {[\fB\-f\fR\ \fIfile\fR] | [\fIusername\fR...]} .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBDescription\fR .RS 4 .PP Grants access rights to a refdb database to the given users\&. Specify the database with the \fB\-d\fR option\&. .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBNote\fR .ps -1 .br .PP If a user is not yet known to the database server, refdb will create an account with the default access rights (=none)\&. If you do not specify a password for the new user with the \fB\-W\fR option (see below), the user will have access to the database server with the default password "refdb"\&. In most cases this is not a good thing\&. .PP A new user will automatically get access to the internal refdb database refdb\&. .PP Some database engines like SQLite do not support access control\&. The \fBadduser\fR command is not supported with these engines and will just return an explanatory message\&. .sp .5v .RE .PP \fB\-d\fR \fIdatabase\fR .RS 4 Specifies the reference database for which the access rights should apply\&. .RE .PP \fB\-f\fR \fIfile\fR .RS 4 Reads a whitespace\-separated list of usernames from file\&. .RE .PP \fB\-h\fR .RS 4 Displays the online help about the \fBadduser\fR command\&. .RE .PP \fB\-H\fR \fIhostname\fR .RS 4 \fIhostname\fR specifies the host the refdb application server runs on\&. If it runs on the same machine as the database server, you may specify \(lqlocalhost\(rq as hostname\&. Use \(lq%\(rq as hostname to allow access from all addresses except localhost\&. Otherwise, the hostname argument can be either a hostname, an IP address, or a subnet that specifies one or more computers to allow access from\&. You can add the same user several times with different hostnames\&. .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBNote\fR .ps -1 .br This option is only supported by MySQL\&. It is ignored if you use PostgreSQL as your database server\&. Please see the PostgreSQL documentation for help on how to manipulate host\-based access control with the pg_hba\&.conf file\&. .sp .5v .RE .RE .PP \fB\-R\fR .RS 4 Use this option to grant read\-only access for the user\&. By default, users are granted read/write access\&. Users with read\-only access can basically only retrieve references and notes\&. .RE .PP \fB\-W\fR \fIpassword\fR .RS 4 Set the password for a new user\&. The password is encrypted before transferring it to the application server\&. If the user already exists, his password will be changed accordingly\&. .RE .PP \fIusername\fR .RS 4 All other arguments are interpreted as usernames\&. If neither a username argument nor an input file is specified, refdba attempts to read a whitespace\-separated list of names from stdin\&. To force refdba to read from stdin \fIin addition to\fR explicitly named users, use the \fB\-f stdin\fR option\&. .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBExamples\fR .RS 4 .sp .if n \{\ .RS 4 .\} .nf refdba: \fBadduser \fR\fB\fB\-d\fR\fR\fB \fR\fB\fIdb1\fR\fR\fB \fR\fB\fB\-N\fR\fR\fB \fR\fB\fInewpass\fR\fR\fBjim \fR .fi .if n \{\ .RE .\} .PP This will grant access to the database db1 for the new user jim\&. refdbd runs on the same computer as the database server (if you leave out the \fB\-H\fR option, localhost is assumed)\&. "jim" will have to provide "newpass" as a password when starting one of the refdb clients\&. .sp .if n \{\ .RS 4 .\} .nf refdba: \fBadduser \fR\fB\fB\-d\fR\fR\fB \fR\fB\fIdb1\fR\fR\fB \fR\fB\fB\-H\fR\fR\fB \fR\fB\fImono\&.mycomp\&.com\fR\fR\fB jim jane\fR .fi .if n \{\ .RE .\} .PP This will grant access to the database db1 for the users jim and jane\&. refdbd runs on the computer with the name "mono\&.mycomp\&.com"\&. If "jim" and "jane" are already known to the database server, they will keep their existing passwords\&. If not, they will have to use the default password "refdb"\&. .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBAlternatives on sites with restricted database server access\fR .RS 4 .PP If you as the refdb administrator do not have GRANT permission on your database server, the \fBadduser\fR command is bound to fail\&. As a security\-minded person your database administrator might refuse to run refdba regardless of how often you ensure him it doesn\*(Aqt contain malicious code\&. He\*(Aqll want to do it the hard way, and this is what he needs to do: .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} If you use MySQL as your database server, each new user needs at least entries in the mysql\&.user and mysql\&.db tables\&. Your database administrator might have set up his own rules, but in general the mysql\&.user table should grant no privileges to the user, whereas the mysql\&.db table should grant INSERT, SELECT, UPDATE, DELETE permissions to each user for the refdb database and SELECT, INSERT, UPDATE, DELETE, CREATE, DROP privileges for each reference database the user should have access to\&. Make sure to mention that the Host field in mysql\&.user must contain the name or address of the box that runs refdbd, which is not necessarily identical with the workstation of the user\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} If you prefer PostgreSQL instead, things are a little simpler\&. When you create a refdb database, a new group will be created to manage access to this database\&. All your database administrator needs to do is to add the new user to the groups refdbuser (granting access to the common refdb database) and user, where is the name of the reference database the user should be allowed to access\&. .RE .RE .SS "addword" .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBSynopsis\fR .RS 4 .HP \w'\fBaddword\fR\ 'u \fBaddword\fR [\fB\-h\fR] {[\fB\-f\fR\ \fIfile\fR] | [\fIword\fR...]...} .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBDescription\fR .RS 4 .PP Most bibliography styles use standardized abbreviations of the journal names\&. Most data sources specify these abbreviations without dots, as in "Mol Cell Biol"\&. If the words are to be abbreviated with dots (as in "Mol\&. Cell Biol\&.") in the bibliography, refdb needs to know which tokens in the abbreviated name are indeed abbreviated (e\&.g\&. "Mol\&."), and which are full words (e\&.g\&. "Cell")\&. To this end, refdb keeps a list of reserved words which are known not to be abbreviations of something else\&. refdb ships with a fairly complete list of such words, but if you detect errors or omissions, the \fBaddword\fR command comes in handy\&. .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBOptions\fR .RS 4 .PP \fB\-f\fR \fIfile\fR .RS 4 Read a whitespace\-separated list of journal title words from file\&. .RE .PP \fB\-h\fR .RS 4 Displays the online help about the \fBaddword\fR command\&. .RE .PP \fIword\fR .RS 4 All other arguments are interpreted as reserved words\&. If neither a word list nor an input file is specified, refdba attempts to read a whitespace\-separated list of words from stdin\&. To force refdba to read from stdin \fIin addition to\fR explicitly listed words, use the \fB\-f stdin\fR option\&. .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBNote\fR .ps -1 .br refdb will convert all reserved words to uppercase internally, so it does not matter which case you provide these words in\&. .sp .5v .RE .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBExample\fR .RS 4 .sp .if n \{\ .RS 4 .\} .nf refdba: \fBaddword \-f wordlist FOO BAR\fR .fi .if n \{\ .RE .\} .PP This will add all reserved words in the file wordlist as well as the words "FOO" and "BAR" to the list of reserved words\&. .RE .SS "confserv" .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBSynopsis\fR .RS 4 .HP \w'\fBconfserv\fR\ 'u \fBconfserv\fR {\fIcommand\fR} [\fIvalue\fR] .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBDescription\fR .RS 4 .PP Configures the application server while it is running and does some tricks with the refdb helper databases as well\&. Some of the commands modify variables that can be set as command line arguments or with the init file\&. See Running the refdbd daemon for more information about these variables\&. .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBNote\fR .ps -1 .br .PP This command will only reconfigure refdbd transiently\&. All changes are lost when the application server is restarted\&. To make permantent changes to the configuration, edit the init\-file or change the command\-line parameters in the script that starts refdbd\&. Please note also that remote administration must be enabled for this command to work\&. .sp .5v .RE .PP The following commands are available: .PP stop .RS 4 Stops the application server\&. .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBNote\fR .ps -1 .br This command affects only the refdbd parent process\&. Any children that may be currently serving clients will continue to do so until they are done\&. .sp .5v .RE .RE .PP ping .RS 4 Checks whether the application server is still alive and well\&. If this is the case, it will report the process IDs of the child that handles your query and of the parent\&. If not, the connection will time out with no response\&. .RE .PP serverip \fIvalue\fR .RS 4 Sets the database server IP address to \fIvalue\fR\&. .RE .PP timeout \fIvalue\fR .RS 4 Sets the timeout in seconds to \fIvalue\fR\&. .RE .PP logdest \fIvalue\fR .RS 4 Sets the destination of log output to \fIvalue\fR\&. Possible values are 0 (stderr), 1 (the system syslog facility), 2 (a private log file as defined by \fIlogfile\fR)\&. .RE .PP logfile \fIvalue\fR .RS 4 Sets the filename of the log file to \fIvalue\fR\&. .RE .PP loglevel \fIvalue\fR .RS 4 Sets the maximum level of messages to be logged to \fIvalue\fR\&. 0 means that only critical errors will be logged, 7 means that all messages including the extremely verbose debug messages will be logged\&. \-1 disables logging completely\&. .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBExample\fR .RS 4 .sp .if n \{\ .RS 4 .\} .nf refdba: confserv loglevel 7 .fi .if n \{\ .RE .\} .PP This will set the log level to 7\&. This temporary change will only be effective until refdbd is restarted\&. .RE .SS "createdb" .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBSynopsis\fR .RS 4 .HP \w'\fBcreatedb\fR\ 'u \fBcreatedb\fR [\fB\-E\fR\ \fIencoding\fR] [\fB\-h\fR] {\fIdbname\fR...} .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBDescription\fR .RS 4 .PP Creates a new database with the name \fIdbname\fR\&. Several databases may be specified in a single call of this command\&. .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBOptions\fR .RS 4 .PP \fB\-E\fR \fIencoding\fR .RS 4 Select a character encoding for the new database\&. This is currently only supported by MySQL and PostgreSQL\&. If you use a different engine, this option is ignored\&. Please see the documentation of your database engine installation for available encodings\&. The value passed with the \fB\-E\fR option should be the \m[blue]\fBIANA\fR\m[]\&\s-2\u[1]\d\s+2 encoding name\&. If you do not use this option, the new database will use the default encoding of the database server unless your refdbdrc configuration file sets a default with a "db_encoding" entry\&. .RE .PP \fB\-h\fR .RS 4 Displays the online help about the \fBcreatedb\fR command\&. .RE .PP \fIname\fR .RS 4 The name of the reference database\&. The name must not contain a colon (\*(Aq:\*(Aq) or a dash (\*(Aq\-\*(Aq) due to the citation formats in documents using RefDB\&. The allowed characters may be further restricted by the database engine you use\&. The database name should also be considered case\-insensitive, i\&.e\&. don\*(Aqt try to create a database "mybase" if you already have one called "MYBASE"\&. Also, avoid using names which are SQL reserved words as this is doomed to fail\&. Unfortunately, this includes the all too convenient name "references"\&. Try "refs" or "biblio" instead\&. .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBTip\fR .ps -1 .br Prepend a constant string like \(lqrd\(rq to all refdb database names\&. This speeds up retrieving refdb databases with the \fBlistdb\fR command if your database engine manages additional, non\-RefDB databases\&. Use a simple regular expression like \(lqrd%\(rq to restrict your search to RefDB databases\&. .sp .5v .RE .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBExample\fR .RS 4 .sp .if n \{\ .RS 4 .\} .nf refdba: \fBcreatedb \fR\fB\fIdb1\fR\fR\fB \fR\fB\fB\-E\fR\fR\fB \fR\fB\fIUTF\-8\fR\fR\fB \fR\fB\fIdb2\fR\fR .fi .if n \{\ .RE .\} .PP This will create the databases db1 and db2 with the character encoding UTF\-8\&. .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBUsing SQL scripts to create databases\fR .RS 4 .PP refdb contains two plain\-text SQL scripts (installed in /usr/local/share/refdb/sql) to create database tables just like the \fBcreatedb\fR command does\&. These scripts are preferable to the command in these cases: .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} You do not have database administrator permissions and have to ask your admin to create the databases for you\&. Your admin might prefer to run the script as he can easily find out what it is going to do\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} You want to integrate refdb with an existing or a custom database system\&. In that case you want the refdb\-specific tables in an existing database in addition to non\-refdb tables\&. .RE .PP The following procedures are equivalent to running the createdb command\&. If you want to add the tables to an existing database, please adapt the scripts and/or the procedures accordingly\&. .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} If you\*(Aqre running MySQL, use the following commands (provide additional options like username and password as required): .sp .if n \{\ .RS 4 .\} .nf #~ \fBmysql \-e "CREATE DATABASE dbname"\fR .fi .if n \{\ .RE .\} .sp .if n \{\ .RS 4 .\} .nf #~ \fBmysql dbname < empty\&.mysql\&.dump\fR .fi .if n \{\ .RE .\} .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} If you\*(Aqre using PostgreSQL, the following sequence should work (again, provide additional options like username and password as required): .sp .if n \{\ .RS 4 .\} .nf #~ \fBsed \*(Aqs/refdbtest/dbname/g\*(Aq < empty\&.pgsql\&.dump\&.in > empty\&.pgsql\&.dump\fR .fi .if n \{\ .RE .\} .sp .if n \{\ .RS 4 .\} .nf #~ \fBpsql template1 < empty\&.pgsql\&.dump\fR .fi .if n \{\ .RE .\} .RE .PP The empty\&.pgsql\&.dump\&.in script contains the commands to create a database and to set appropriate access rights for a new group of database users\&. Therefore it is a good idea to replace the string "refdbtest" with the intended name of your new database\&. The \fBsed\fR command in the first line does just this\&. You may also edit a few more things, like the encoding\&. The second command actually creates the database, a new group, grants privileges to this group, and creates all necessary tables and sequences\&. template1 is a PostgreSQL system database\&. The \fBpsql\fR command requires the name of an existing database as an argument, but in this case you could use any other existing database just as well\&. .RE .SS "deletedb" .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBSynopsis\fR .RS 4 .HP \w'\fBdeletedb\fR\ 'u \fBdeletedb\fR [\fB\-h\fR] {\fIdbname\fR...} .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBDescription\fR .RS 4 .PP Deletes the database with the name \fIdbname\fR\&. Several databases may be specified in a single call of this command\&. .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBCaution\fR .ps -1 .br .PP The database structure and the data will be gone, really gone, so be careful with this command\&. Think twice and, if in doubt, at least make a backup first to avoid extensive hairpulling\&. .sp .5v .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBOptions\fR .RS 4 .PP \fB\-h\fR .RS 4 Displays a brief usage message and returns to the prompt\&. .RE .PP \fIdbname\fR .RS 4 The name of the database to be deleted\&. .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBExample\fR .RS 4 .sp .if n \{\ .RS 4 .\} .nf refdba: \fBdeletedb \fR\fB\fIdb1\fR\fR\fB \fR\fB\fIdb2\fR\fR .fi .if n \{\ .RE .\} .PP This will delete the databases db1 and db2\&. .RE .SS "deletestyle" .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBSynopsis\fR .RS 4 .HP \w'\fBdeletestyle\fR\ 'u \fBdeletestyle\fR [\fB\-h\fR] {\fIunix\-regexp\fR} .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBDescription\fR .RS 4 .PP Deletes the bibliography styles whose names match the Unix regular expression \fIunix\-regexp\fR\&. .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBNote\fR .ps -1 .br .PP Some database engines, like SQLite, do not support Unix\-style regular expressions\&. Use SQL regular expressions instead\&. .sp .5v .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBOptions\fR .RS 4 .PP \fB\-h\fR .RS 4 Displays a brief usage message and returns to the prompt\&. .RE .PP \fIunix\-regexp\fR .RS 4 The remaining arguments are interpreted as a regular expression which specifies the style or styles to be deleted\&. .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBExample\fR .RS 4 .sp .if n \{\ .RS 4 .\} .nf refdba: \fBdeletestyle \fR\fB\fIJ\e\&.\&.*\fR\fR .fi .if n \{\ .RE .\} .PP This will delete all bibliography styles that start with \(lqJ\&.\(rq\&. .RE .SS "deleteuser" .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBSynopsis\fR .RS 4 .HP \w'\fBdeleteuser\fR\ 'u \fBdeleteuser\fR {\fB\-d\fR\ \fIdatabase\fR} [\fB\-h\fR] {\fB\-H\fR\ \fIhost\-IP\fR} {\fB\-R\fR} {[\fB\-f\fR\ \fIfile\fR] | [\fIusername\fR...]} .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBDescription\fR .RS 4 .PP Revokes access rights to a refdb database from the given users\&. .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBNote\fR .ps -1 .br .PP Some database engines like SQLite do not support access control\&. The \fBadduser\fR command is not supported with these engines and will just return an explanatory message\&. .PP refdb will only revoke the access rights to the specified database\&. It will revoke neither access rights to the internal database refdb, nor will it revoke database server access\&. You can revoke access to the internal database by specifying "refdb" with the \fB\-d\fR option\&. To revoke access to the database server, please use the command line utilities of your database server\&. .sp .5v .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBOptions\fR .RS 4 .PP \fB\-d\fR \fIdatabase\fR .RS 4 Specify the name of the database\&. .RE .PP \fB\-f\fR \fIfilename\fR .RS 4 Read the usernames from \fIfilename\fR .RE .PP \fB\-h\fR .RS 4 Displays the online help about the \fBdeleteuser\fR command\&. .RE .PP \fB\-H\fR \fIhostname\fR .RS 4 Specify the hostname or IP address for which to modify the access rights\&. This must be the same name that you used for a previous call to adduser\&. .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBNote\fR .ps -1 .br This option is only supported by MySQL\&. It is ignored if you useother database engines\&. .sp .5v .RE .RE .PP \fB\-R\fR .RS 4 Revokes read\-only access\&. .RE .PP \fIusername\fR .RS 4 All other arguments are interpreted as usernames\&. If neither a username argument nor an input file is specified, refdba attempts to read a whitespace\-separated list of names from stdin\&. To force refdba to read from stdin \fIin addition to\fR explicitly named users, use the \fB\-f stdin\fR option\&. .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBExamples\fR .RS 4 .sp .if n \{\ .RS 4 .\} .nf refdba: \fBdeleteuser \fR\fB\fB\-d\fR\fR\fB \fR\fB\fB\-H\fR\fR\fB \fR\fB\fI%\fR\fR\fB \fR\fB\fIdb1\fR\fR\fBjim\fR .fi .if n \{\ .RE .\} .PP This will revoke the access to the database db1 for the user jim for all but local connections\&. .RE .SS "deleteword" .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBSynopsis\fR .RS 4 .HP \w'\fBdeleteword\fR\ 'u \fBdeleteword\fR [\fB\-h\fR] {[\fB\-f\fR\ \fIfile\fR] | [\fIword\fR...]...} .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBDescription\fR .RS 4 .PP This command performs the reverse operation of addword\&. The specified reserved words will be removed from the list\&. .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBOptions\fR .RS 4 .PP \fB\-f\fR .RS 4 Read a whitespace\-separated list of words from file\&. .RE .PP \fB\-h\fR .RS 4 Displays the online help about the \fBaddword\fR command\&. .RE .PP \fIword\fR .RS 4 All other arguments are interpreted as reserved words\&. If neither a word list nor an input file is specified, refdba attempts to read a whitespace\-separated list of words from stdin\&. To force refdba to read from stdin \fIin addition to\fR explicitly listed words, use the \fB\-f stdin\fR option\&. .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBNote\fR .ps -1 .br refdb will convert all reserved words to uppercase internally, so it does not matter in which case you provide these words\&. .sp .5v .RE .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBExample\fR .RS 4 .sp .if n \{\ .RS 4 .\} .nf refdba: \fBdeleteword \-f wordlist FOO BAR\fR .fi .if n \{\ .RE .\} .PP This will delete all reserved words in the file wordlist as well as the words "FOO" and "BAR" from the list of reserved words\&. .RE .SS "getstyle" .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBSynopsis\fR .RS 4 .HP \w'\fBgetstyle\fR\ 'u \fBgetstyle\fR [\fB\-c\fR] [\fB\-h\fR] [[\fB\-o\fR] | [\fB\-O\fR]] {\fIstyle\fR...} .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBDescription\fR .RS 4 .PP Retrieves one or more bibliography style specifications from the database and formats them as an XML file\&. .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBOptions\fR .RS 4 .PP \fB\-c\fR \fIcommand\fR .RS 4 Specify a command that will receive the output instead of the default pager\&. This may be a different pager, any command that takes input on stdin, or the string \(lqstdout\(rq to send the data to stdout without using a pager\&. .RE .PP \fB\-h\fR .RS 4 Displays the online help about the \fBgetstyle\fR command\&. .RE .PP \fB\-o\fR .RS 4 Write the output to a file instead of to stdout\&. .RE .PP \fB\-O\fR .RS 4 Append the output to a file instead of writing it to stdout .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBWarning\fR .ps -1 .br Be careful with the append (\fB\-O\fR) option\&. refdb will output the processing instructions, the doctype line, and one CITESTYLE element for each individually requested style\&. If you concatenate the results of several \fBgetstyle\fR calls, the resulting XML file will not be well\-formed without further processing\&. In order to write several styles into a single XML file, use a single \fBgetstyle\fR call and list all required styles as arguments\&. This will output the styles wrapped in a STYLESET element, resulting in a valid XML file\&. .sp .5v .RE .RE .PP \fIstyle\fR .RS 4 All other arguments are interpreted as the names of bibliography styles\&. .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBExample\fR .RS 4 .sp .if n \{\ .RS 4 .\} .nf refdba: \fBgetstyle \-o j\&.biol\&.chem\&.xml J\&.Biol\&.Chem\&.\fR .fi .if n \{\ .RE .\} .PP This will write the style specification stored under the style name "J\&.Biol\&.Chem\&." to the file j\&.biol\&.chem\&.xml\&. .RE .SS "help" .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBSynopsis\fR .RS 4 .HP \w'\fBhelp\fR\ 'u \fBhelp\fR .HP \w'\fB?\fR\ 'u \fB?\fR .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBDescription\fR .RS 4 .PP Displays a brief summary of the available commands\&. .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBExample\fR .RS 4 .sp .if n \{\ .RS 4 .\} .nf refdba: \fBhelp\fR .fi .if n \{\ .RE .\} .RE .SS "listdb" .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBSynopsis\fR .RS 4 .HP \w'\fBlistdb\fR\ 'u \fBlistdb\fR [\fB\-h\fR] [\fIdatabase\-regexp\fR] .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBDescription\fR .RS 4 .PP Lists all available databases if no argument is specified\&. If \fIdatabase\-regexp\fR is specified, only the databases matching this expression will be listed\&. .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBNote\fR .ps -1 .br .PP In order to tell refdb reference databases apart from other databases maintained by your database server, refdbd has to peek into each database returned by the database server\&. Depending on the number of available databases this may take some time\&. Therefore it may be a good idea to use a common prefix for all refdb databases as explained in the section about the \fBcreatedb\fR command\&. .sp .5v .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBOptions\fR .RS 4 .PP \fB\-h\fR .RS 4 Displays a help message explaining the \fBlistdb\fR command\&. .RE .PP \fIdatabase\-regexp\fR .RS 4 A valid SQL regular expression which limits the output to matching database names\&. .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBExample\fR .RS 4 .sp .if n \{\ .RS 4 .\} .nf refdba: \fBlistdb \fR\fB\fIdb%\fR\fR .fi .if n \{\ .RE .\} .PP This will list all databases with names that start with the string \(lqdb\(rq\&. .RE .SS "liststyle" .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBSynopsis\fR .RS 4 .HP \w'\fBliststyle\fR\ 'u \fBliststyle\fR [\fB\-h\fR] [\fIstyle\-regexp\fR] .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBDescription\fR .RS 4 .PP Lists all available bibliography styles that match \fIstyle\-regexp\fR\&. If no argument is given, \fIall\fR available styles will be listed\&. This may or may not be what you want\&. .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBOptions\fR .RS 4 .PP \fB\-h\fR .RS 4 Displays a help message explaining the \fBlistdb\fR command\&. .RE .PP \fIstyle\-regexp\fR .RS 4 A valid Unix regular expression which limits the output to matching style names\&. .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBNote\fR .ps -1 .br Some database engines, like SQLite, do not support Unix\-style regular expressions\&. Use SQL regular expressions instead\&. .sp .5v .RE .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBExample\fR .RS 4 .sp .if n \{\ .RS 4 .\} .nf refdba: \fBliststyle \fR\fB\fI^J\&.*\fR\fR .fi .if n \{\ .RE .\} .PP This will list all bibliography styles that start with a capital \(lqJ\(rq\&. .RE .SS "listuser" .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBSynopsis\fR .RS 4 .HP \w'\fBlistuser\fR\ 'u \fBlistuser\fR {\-d\ \fIdatabase\fR} [\fB\-h\fR] [\fIname\-regexp\fR] .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBDescription\fR .RS 4 .PP Lists all available users of the specified database that match \fIname\-regexp\fR\&. If no argument is given, \fIall\fR available users will be listed\&. This may or may not be what you want\&. .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBOptions\fR .RS 4 .PP \fB\-d\fR \fIdatabase\fR .RS 4 Specify the database name\&. .RE .PP \fB\-h\fR .RS 4 Displays a help message explaining the \fBlistdb\fR command\&. .RE .PP \fIname\-regexp\fR .RS 4 A valid Unix regular expression which limits the output to matching database user names\&. .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBNote\fR .ps -1 .br Some database engines, like SQLite, do not support Unix\-style regular expressions\&. Use SQL regular expressions instead\&. .sp .5v .RE .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBExample\fR .RS 4 .sp .if n \{\ .RS 4 .\} .nf refdba: \fBlistuser \fR\fB\fB\-d\fR\fR\fB \fR\fB\fIrefs\fR\fR\fB \fR\fB\fI^mo\&.*\fR\fR .fi .if n \{\ .RE .\} .PP This will list all users of the database "refs" whose names start with \(lqmo\(rq\&. .RE .SS "listword" .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBSynopsis\fR .RS 4 .HP \w'\fBlistword\fR\ 'u \fBlistword\fR [\fB\-h\fR] {\fIword\-regexp\fR} .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBDescription\fR .RS 4 .PP Lists all available reserved journal words that match \fIunix\-regexp\fR\&. If no argument is given, \fIall\fR available words will be listed\&. This may or may not be what you want\&. .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBNote\fR .ps -1 .br .PP Keep in mind that the journal words are uppercased internally\&. You should write your \fIunix\-regexp\fR using all caps accordingly\&. .sp .5v .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBOptions\fR .RS 4 .PP \fB\-h\fR .RS 4 Displays a help message explaining the \fBlistdb\fR command\&. .RE .PP \fIword\-regexp\fR .RS 4 A valid Unix regular expression which limits the output to matching journal title words\&. .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBNote\fR .ps -1 .br Some database engines, like SQLite, do not support Unix\-style regular expressions\&. Use SQL regular expressions instead\&. .sp .5v .RE .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBNote\fR .ps -1 .br For a brief description of the purpose of reserved words, see the \fBaddword\fR command\&. .sp .5v .RE .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBExample\fR .RS 4 .sp .if n \{\ .RS 4 .\} .nf refdba: \fBlistword \fR\fB\fI^BIO\&.*\fR\fR .fi .if n \{\ .RE .\} .PP This will list all reserved journal words that start with \(lqBIO\(rq\&. .RE .SS "scankw" .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBSynopsis\fR .RS 4 .HP \w'\fBscankw\fR\ 'u \fBscankw\fR {\fB\-d\fR\ \fIdatabase\fR} [\fB\-h\fR] .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBDescription\fR .RS 4 .PP This command schedules a full keyword scan in the database specified with the \fB\-d\fR option\&. The abstract field as well as all title fields of all references found in the database are scanned for the presence of all keywords available in the database\&. If a match is found and the keyword is not yet associated with that reference, the keyword is added to that reference\&. As the time required to perform this operation increases with both the number of references and the number of keywords, the keyword scan is performed in the background and the command returns immediately on the client side\&. See the server log for the results\&. .PP As this command will cause a huge number of database accesses it is best scheduled to run automatically as a cron job at a time of low use, either nightly or on weekends\&. .PP Please note the difference between the full keyword scan and the automatic keyword scan which can be requested by the refdbd command line switch \fB\-K\fR or the corresponding configuration variable \fIkeyword_scan\fR\&. The full keyword scan is "retrospective", i\&.e\&. it will add keywords that were added later to previously existing references\&. The automatic keyword scan will only add existing keywords to newly added references, thus causing less impact on the database performance while users are likely to access the database\&. .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBOptions\fR .RS 4 .PP \fB\-d\fR \fIdatabase\fR .RS 4 Specify the database name\&. .RE .PP \fB\-h\fR .RS 4 Displays a help message explaining the \fBlistdb\fR command\&. .RE .RE .SS "set" .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBSynopsis\fR .RS 4 .HP \w'\fBset\fR\ 'u \fBset\fR [\fB\-h\fR] [\fIvarname\fR] [\fIvarvalue\fR] .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBDescription\fR .RS 4 .PP The \fBset\fR command displays or modifies the values of configuration variables\&. .PP If you call \fBset\fR without any arguments, it will display a list of all configuration variables with their current values\&. .PP If you call \fBset\fR with one argument, it will display the current value of this particular variable\&. .PP If you call \fBset\fR with two arguments, it will set the variable (first argument) to the new value (second argument) for the current session\&. To specify an empty value, use two quotation marks like this:""\&. .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBNote\fR .ps -1 .br .PP For obvious reasons, \fBset\fR will never display the current password although you can certainly change the password with this command\&. To make sure no one else sees the new password that you enter, run the command \fBset passwd *\fR\&. You will then be asked to enter a password which will not be echoed on the screen\&. .PP This command is not available in batch mode, use the command line switches instead\&. In the interactive mode, the changes to the configuration variables are limited to the current session\&. If you want to change the values permanently, you should rather edit one of the configuration files\&. .sp .5v .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBOptions\fR .RS 4 .PP \fB\-h\fR .RS 4 Displays a help message explaining the \fBlistdb\fR command\&. .RE .PP \fIvarname\fR .RS 4 The name of the variable whose value should be displayed or set\&. .RE .PP \fIvarvalue\fR .RS 4 The new value of the variable to be set\&. .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBExample\fR .RS 4 .sp .if n \{\ .RS 4 .\} .nf refdba: \fBset timeout 90\fR .fi .if n \{\ .RE .\} .PP This command will set the timeout to 90 seconds for the current session\&. .RE .SS "verbose" .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBSynopsis\fR .RS 4 .HP \w'\fBverbose\fR\ 'u \fBverbose\fR [\fB\-h\fR] .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBDescription\fR .RS 4 .PP Toggles the verbose mode on or off\&. If the verbose mode is on, the error messages and warnings may be some more comprehensible\&. .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBOptions\fR .RS 4 .PP \fB\-h\fR .RS 4 Displays a help message explaining the \fBlistdb\fR command\&. .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBExample\fR .RS 4 .sp .if n \{\ .RS 4 .\} .nf refdba: \fBverbose\fR .fi .if n \{\ .RE .\} .PP Depending on the previous setting, this will toggle the verbose mode on or off\&. .RE .SS "viewstat" .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBSynopsis\fR .RS 4 .HP \w'\fBviewstat\fR\ 'u \fBviewstat\fR [\fB\-h\fR] .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBDescription\fR .RS 4 .PP Shows the version numbers of the libdbi driver used to connect to your database server as well as the version information of that server\&. It also shows the current values of the variables that can be modified with \fBconfserv\fR\&. .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBOptions\fR .RS 4 .PP \fB\-h\fR .RS 4 Displays a help message explaining the \fBlistdb\fR command\&. .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBExample\fR .RS 4 .sp .if n \{\ .RS 4 .\} .nf refdba: \fBviewstat\fR .fi .if n \{\ .RE .\} .PP This will print some connection statistics and informations on the screen\&. .RE .SH "FILES" .PP PREFIX/etc/refdb/refdbarc .RS 4 The global configuration file of refdba\&. .RE .PP $HOME/\&.refdbarc .RS 4 The user configuration file of refdba\&. .RE .SH "SEE ALSO" .PP \fBRefDB\fR (7), \fBrefdbd\fR (1), \fBrefdb\-backup\fR (1), \fBrefdb\-restore\fR (1), \fBrefdbc\fR (1)\&. .PP \fIRefDB manual (local copy) \fR PREFIX/share/doc/refdb\-/refdb\-manual/index\&.html .PP \fIRefDB manual (web) \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/manual/index\&.html\fR\m[]> .PP \fIRefDB on the web \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/\fR\m[]> .SH "AUTHOR" .PP refdba was written by Markus Hoenicka \&. .SH "NOTES" .IP " 1." 4 IANA .RS 4 \%http://www.iana.org .RE refdb-1.0.2/man/refdbc.1000644 001750 001750 00000223502 12255422776 015544 0ustar00markusmarkus000000 000000 '\" t .\" Title: refdbc .\" Author: [see the "Author" section] .\" Generator: DocBook XSL Stylesheets v1.76.1 .\" Date: 2005-10-15 .\" Manual: RefDB Manual .\" Source: RefDB Manual .\" Language: English .\" .TH "REFDBC" "1" "2005\-10\-15" "RefDB Manual" "RefDB Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" refdbc \- the reference and note management client of RefDB .SH "SYNOPSIS" .PP Interactive mode: .HP \w'\fBrefdbc\fR\ 'u \fBrefdbc\fR [\fB\-c\fR\ \fIpager\-command\fR] [\fB\-d\fR\ \fIdatabase\fR] [\fB\-e\fR\ \fIlog\-destination\fR] [\fB\-f\fR\ \fIstdin\fR] [\fB\-F\fR\ \fIfields\fR] [\fB\-g\fR\ \fIdeffile\fR] [\fB\-G\fR\ \fICSS\-file\fR] [\fB\-h\fR] [\fB\-i\fR\ \fIIP\-address\fR] [\fB\-l\fR\ \fIlog\-level\fR] [\fB\-L\fR\ \fIlog\-file\fR] [\fB\-p\fR\ \fIport\fR] [\fB\-q\fR] [\fB\-R\fR\ \fIpdfroot\fR] [\fB\-T\fR\ \fItime\fR] [\fB\-u\fR\ \fIname\fR] [\fB\-v\fR] [\fB\-V\fR] [\fB\-w\fR\ \fIpassword\fR] [\fB\-x\fR] [\fB\-y\fR\ \fIconfdir\fR] .PP Batch mode: .HP \w'\fBrefdbc\fR\ 'u \fBrefdbc\fR \fB\-C\fR\ \fIcommand\fR [\fB\-c\fR\ \fIpager\-command\fR] [\fB\-d\fR\ \fIdatabase\fR] [\fB\-e\fR\ \fIlog\-destination\fR] [\fB\-f\fR\ \fIstdin\fR] [\fB\-F\fR\ \fIfields\fR] [\fB\-g\fR\ \fIdeffile\fR] [\fB\-G\fR\ \fICSS\-file\fR] [\fB\-i\fR\ \fIIP\-address\fR] [\fB\-l\fR\ \fIlog\-level\fR] [\fB\-\fRL\ \fIlog\-file\fR] [\fB\-p\fR\ \fIport\fR] [\fB\-q\fR] [\fB\-R\fR\ \fIpdfroot\fR] [\fB\-T\fR\ \fItime\fR] [\fB\-u\fR\ \fIname\fR] [\fB\-v\fR] [\fB\-V\fR] [\fB\-w\fR\ \fIpassword\fR] [\fB\-x\fR] [\fB\-y\fR\ \fIconfdir\fR] .SH "DESCRIPTION" .PP refdbc is a command\-line client providing the commands to manage references and notes with RefDB(7)\&. refdbc can be started in an interactive mode, providing a command prompt\&. Type \fB?\fR or \fBhelp\fR to see a list of available commands\&. Alternatively you can start refdbc in non\-interactive mode\&. refdbc will execute the requested command and return\&. In this mode refdbc will accept input on stdin for a variety of commands, allowing Unix piping\&. .SH "OPTIONS" .PP \fB\-c\fR \fIpager\-command\fR .RS 4 The command line of the pager that is to be used\&. Instead of a pager you can of course specify any valid command that accepts data on stdin\&. Use "stdout" to request data output to stdout\&. This is the default, but you may want to specify it on the command line if you need to temporarily override a default pager setting in your configuration file\&. .RE .PP \fB\-C\fR \fIcommand\fR .RS 4 The command to be run in non\-interactive mode\&. You can supply all options and parameters that the command accepts on the refdba command line\&. .RE .PP \fB\-d\fR \fIdatabase\fR .RS 4 The name of the default database\&. You can change the database anytime during an interactive session\&. .RE .PP \fB\-e\fR \fIlog\-destination\fR .RS 4 log\-destination can have the values 0, 1, or 2, or the equivalent strings \fIstderr\fR, \fIsyslog\fR, or \fIfile\fR, respectively\&. This value specifies where the log information goes to\&. 0 (zero) means the messages are sent to stderr\&. They are immediately available on the screen but they may interfere with command output\&. 1 will send the output to the syslog facility\&. Keep in mind that syslog must be configured to accept log messages from user programs, see the syslog(8) man page for further information\&. Unix\-like systems usually save these messages in /var/log/user\&.log\&. 2 will send the messages to a custom log file which can be specified with the \fB\-L\fR option\&. .RE .PP \fB\-f\fR \fIstdin\fR .RS 4 Read data from stdin\&. refdbc usually knows when it should read from stdin\&. However, a few commands use data supplied in the command line but also allow to read from a file\&. Use this option to force refdbc to read from stdin \fIin addition\fR to values supplied on the command line\&. .RE .PP \fB\-F\fR \fIfields\fR .RS 4 Specify the default fields that are to be displayed in a \fBgetref\fR query\&. .RE .PP \fB\-g\fR \fIdeffile\fR .RS 4 This option can be used to add some default fields to all RIS references that are added or updated\&. The argument deffile is the filename of a RIS file containing these additional fields\&. refdbc first tries the filename as is, so it should be a valid relative or absolute path\&. If the file is not found, refdb looks for the file in \fB$HOME\fR\&. The command aborts if the file cannot be found\&. .RE .PP \fB\-G\fR \fICSS\-file\fR .RS 4 Specify the URL of a Cascading Style Sheets (CSS) file\&. This file will be used to customize the HTML output of the \fBgetref\fR command\&. The URL can be either a local path (e\&.g\&. refdb\&.css, /home/myname/custom\&.css) or the web address of a file on a web server (e\&.g\&. \fI\m[blue]\fBhttp://www\&.mycomp\&.com/refdb\&.css\fR\m[]\fR)\&. .RE .PP \fB\-h\fR .RS 4 Displays help and usage screen, then exits\&. .RE .PP \fB\-i\fR \fIIP\-address\fR .RS 4 Set the IP address of the box which is running the application server refdbd(1)\&. Instead of the IP address you can also specify the hostname as long as it can be properly resolved by your system\&. .RE .PP \fB\-l\fR \fIlog\-level\fR .RS 4 Specify the priority up to which events are logged\&. This is either a number between 0 and 7 or one of the strings \fIemerg\fR, \fIalert\fR, \fIcrit\fR, \fIerr\fR, \fIwarning\fR, \fInotice\fR, \fIinfo\fR, \fIdebug\fR, respectively (see also Log level definitions)\&. \fB\-1\fR disables logging completely\&. A low log level like 0 means that only the most critical messages are logged\&. A higher log level means that less critical events are logged as well\&. 7 will include debug messages\&. The latter can be verbose and abundant, so you want to avoid this log level unless you need to track down problems\&. .RE .PP \fB\-L\fR \fIlog\-file\fR .RS 4 Specify the full path to a log file that will receive the log messages\&. Typically this would be /var/log/refdba\&. .RE .PP \fB\-p\fR \fIport\fR .RS 4 Set the port of the box which is running the application server\&. .RE .PP \fB\-q\fR .RS 4 Start without reading the configuration files\&. The client will use the compile\-time defaults for all values that you do not set with command\-line switches\&. Useful for debugging configuration files\&. .RE .PP \fB\-R\fR \fIpdfroot\fR .RS 4 Specify the root path of your collection of electronic offprints\&. .RE .PP \fB\-T\fR \fItime\fR .RS 4 Set the timeout for client/application server dialogue in seconds\&. A connection with unsuccessful read or write attempts will be considered as dead and taken down after this amount of time has elapsed\&. .RE .PP \fB\-u\fR \fIname\fR .RS 4 Set the username for the database access\&. Note: This username need not be identical to the login name of the user\&. This is the username required to access the database server\&. .RE .PP \fB\-v\fR .RS 4 Prints version and copyright information, then exits\&. .RE .PP \fB\-V\fR .RS 4 Switches to verbose mode\&. .RE .PP \fB\-w\fR \fIpassword\fR .RS 4 Set the password for the database access\&. Note: This password need not be identical to the login password of the user\&. This is the password required to access the database server\&. .RE .PP \fB\-x\fR .RS 4 Send passwords unencrypted\&. .RE .PP \fB\-y\fR \fIconfdir\fR .RS 4 Specify the directory where the global configuration files are Note: By default, all RefDB applications look for their configuration files in a directory that is specified during the configure step when building the package\&. That is, you don\*(Aqt need the \fB\-y\fR option unless you use precompiled binaries in unusual locations, e\&.g\&. by relocating a rpm package\&. .RE .SH "DIAGNOSTICS" .PP The exit code is 0 if all went fine\&. It will be 1 if the command (when run in batch mode) or the last command (when run in interactive mode) returned an error, or if there was a general error condition during startup like a lack of available memory\&. .SH "CONFIGURATION" .PP refdbc evaluates the refdbcrc configuration file at startup to initialize itself\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&1.\ \&refdbcrc .TS allbox tab(:); lB lB lB. T{ Variable T}:T{ Default T}:T{ Comment T} .T& l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l. T{ cssurl T}:T{ (none) T}:T{ The URL of a Cascading Style Sheet (CSS) file\&. This file, if specified, is used to customize the visual appearance of the HTML output of the \fBgetref\fR command\&. T} T{ defaultdb T}:T{ (none) T}:T{ The default database\&. refdbc will try to use this database unless you select a different one with the selectdb command\&. T} T{ defaultris T}:T{ (none) T}:T{ The path of a RIS file with entries that should be added to all new or updated references\&. This is typically used to set some default value for the RP field or to specify additional keywords\&. T} T{ fields T}:T{ (none) T}:T{ A list of additional fields which should be displayed by default in the reference output\&. The list is a simple concatenation of the field names\&. Possible fields are N1, N2, NX, AB, AD, RP, SN, PB, CY, UR, U1 through U5, M1 through M3\&. Use the string "ALL" to request all available fields\&. T} T{ fromencoding T}:T{ ISO\-8859\-1 T}:T{ The default encoding of RIS input data\&. You can use any encoding that your local libiconv implementation supports\&. T} T{ logdest T}:T{ file T}:T{ Where the log output should be written to\&. Use either stderr, syslog, or file\&. For the latter to work, the logfile variable must be set appropriately T} T{ logfile T}:T{ /var/log/refdbc\&.log T}:T{ The full path of a custom log file\&. T} T{ loglevel T}:T{ info T}:T{ Set the level of log information that you would receive\&. Possible values, in order of increasing verbosity, are: emerg, alert, crit, err, warning, notice, info, debug T} T{ pager T}:T{ stdout T}:T{ The command line of a pager that accepts the output of refdb on stdin to allow scrolling and other nifty things\&. \(lqstdout\(rq sends the data to stdout\&. T} T{ passwd T}:T{ * T}:T{ The password which is used for authentication with the database server\&. It is potentially evil to store unencrypted passwords in disk files\&. At least make sure that the configuration file is not readable for anyone else\&. The default setting causes refdbc to ask for your password interactively\&. T} T{ pdfroot T}:T{ (none) T}:T{ This value will be used as the root of the paths to PDF or Postscript offprints that can be specified with the AV field in a RIS dataset\&. The path should not rely on shell expansion, e\&.g\&. use /home/me/literature/ instead of ~/literature/\&. The pdfroot allows you to shorten the paths that you enter for each dataset and to maintain a certain portability if you have to move the offprints to a different directory or want to access them remotely\&. The html output routine will concatenate the relative path of each dataset with the pdfroot to construct the link to the offprint\&. Instead of a local path name you can specify an URL starting with http:// or ftp:// if your offprints are accessible through a web server or ftp server\&. T} T{ port T}:T{ 9734 T}:T{ The port on which refdbd listens\&. Change this for all clients and the server if this value interferes with another program using this port\&. T} T{ serverip T}:T{ 127\&.0\&.0\&.1 T}:T{ The IP address or hostname of the machine where refdbd runs\&. Use the default (localhost) address if the clients and refdbs run on the same machine\&. T} T{ timeout T}:T{ 180 T}:T{ The timeout in seconds\&. After this time has elapsed, a stalled connection is taken down\&. Increase this value if you encounter frequent timeout errors due to high network traffic or refdbd overload\&. T} T{ toencoding T}:T{ (none) T}:T{ The default encoding of output data\&. You can use any encoding that your local libiconv implementation supports\&. If this value is not set, the encoding of the database will be used without conversion\&. T} T{ username T}:T{ login name T}:T{ The username which is used for authentication with the database server\&. This may be different from the login name of the user\&. T} T{ verbose T}:T{ f T}:T{ Set this to t if you prefer verbose error messages\&. T} T{ no_encrypt T}:T{ f T}:T{ If set to \*(Aqt\*(Aq, passwords are transmitted unencrypted\&. The default is to encrypt passwords\&. T} .TE .sp 1 .SH "COMMANDS" .PP All commands consist of a single word which specifies the command\&. This may be followed by arguments and/or switches\&. The general syntax rules of the getopts library apply\&. .SS "addlink" .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBSynopsis\fR .RS 4 .HP \w'\fBaddlink\fR\ 'u \fBaddlink\fR [\fB\-d\fR\ \fIdatabase\fR] [\fB\-h\fR] [[\fB\-c\fR\ \fIcommand\fR] | [\fB\-o\fR\ \fIoutfile\fR] | [\fB\-O\fR\ \fIoutfile\fR]] {note\-specifier} {link\-target...} .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBDescription\fR .RS 4 .PP The \fBaddlink\fR command links an extended note to one or more link targets\&. .PP You have to specify exactly one note on the command line, either by using the :NID: field selector to specify the note ID, or by using the :NCK: field selector to specify the note key\&. Then you need at least one link target\&. This can be one of :ID: (reference by ID), :CK: (reference by citation key), :AU: (author by name), :KW: (keyword by name), or one of :JF:, :JO:, :J1:, :J2: (periodical by full name, abbreviated name, or user abbreviations 1 and 2)\&. .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBOptions\fR .RS 4 .PP \fB\-c\fR \fIcommand\fR .RS 4 Pipe the output through \fIcommand\fR\&. .RE .PP \fB\-d\fR \fIdatabase\fR .RS 4 Specify the database\&. .RE .PP \fB\-h\fR .RS 4 Display a help message explaining the command\&. .RE .PP \fB\-o\fR \fIfilename\fR .RS 4 Write the output to filename instead of to stdout\&. .RE .PP \fB\-O\fR \fIfilename\fR .RS 4 Append the output to filename instead of sending it to stdout\&. .RE .PP \fInote\-specifier\fR .RS 4 Specify one note by either its :NID: or its :NCK: value\&. .RE .PP \fIlink\-target\fR .RS 4 Specify one or more link targets by means of their :ID:, :CK:, :AU:, :KW:, :JF:, :JO:, :J1:, or :J2: values\&. .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBExample\fR .RS 4 .sp .if n \{\ .RS 4 .\} .nf refdbc: \fBaddlink :NID:=12 :CK:=Miller1999 :KW:=biochemistry\fR .fi .if n \{\ .RE .\} .PP This command will link the note carrying the ID 12 with a reference specified by its citation key "Miller1999" and with the keyword "biochemistry"\&. .RE .SS "addnote" .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBSynopsis\fR .RS 4 .HP \w'\fBaddnote\fR\ 'u \fBaddnote\fR [\fB\-d\fR\ \fIdatabase\fR] [\fB\-E\fR\ \fIencoding\fR] [\fB\-h\fR] [[\fB\-c\fR\ \fIcommand\fR] | [\fB\-o\fR\ \fIoutfile\fR] | [\fB\-O\fR\ \fIoutfile\fR]] [\fIfile\fR...] .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBDescription\fR .RS 4 .PP Adds the extended notes in \fIfile\fR to the current database\&. You can specify several files in one run\&. Any ID fields in the notes are ignored\&. .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBOptions\fR .RS 4 .PP \fB\-c\fR \fIcommand\fR .RS 4 Pipe the output through \fIcommand\fR\&. .RE .PP \fB\-d\fR \fIdatabase\fR .RS 4 Specify the database\&. .RE .PP \fB\-E\fR \fIencoding\fR .RS 4 Select the character encoding for the input data if it is different from the default UTF\-8\&. .RE .PP \fB\-h\fR .RS 4 Display a help message explaining the command\&. .RE .PP \fB\-o\fR \fIfilename\fR .RS 4 Write the output to filename instead of to stdout\&. .RE .PP \fB\-O\fR \fIfilename\fR .RS 4 Append the output to filename instead of sending it to stdout\&. .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBExample\fR .RS 4 .sp .if n \{\ .RS 4 .\} .nf refdbc: \fBaddnote foo\&.xml\fR .fi .if n \{\ .RE .\} .PP This command will add the extended notes in foo\&.ris to the currently selected database\&. If the notes do not specify a date, refdbd will insert a timestamp automatically\&. .RE .SS "addref" .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBSynopsis\fR .RS 4 .HP \w'\fBaddref\fR\ 'u \fBaddref\fR [\fB\-d\fR\ \fIdatabase\fR] [\fB\-E\fR\ \fIencoding\fR] [\fB\-h\fR] [[\fB\-c\fR\ \fIcommand\fR] | [\fB\-o\fR\ \fIoutfile\fR] | [\fB\-O\fR\ \fIoutfile\fR]] [\fB\-t\fR\ \fItype\fR] [\fB\-U\fR\ \fIusername\fR] [\fIfile\fR...] .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBDescription\fR .RS 4 .PP Adds the references in \fIfile\fR to the current database\&. You can specify several files in one run\&. Any ID fields in the references are ignored unless you specify the \fB\-k\fR option\&. .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBOptions\fR .RS 4 .PP \fB\-c\fR \fIcommand\fR .RS 4 Pipe the output through \fIcommand\fR\&. .RE .PP \fB\-d\fR \fIdatabase\fR .RS 4 Specify the database\&. .RE .PP \fB\-E\fR \fIencoding\fR .RS 4 Select the character encoding for the input data if it is different from the default setting\&. RIS datasets can use any encoding that your local libiconv supports (see \fBman iconv_open\fR for a list of available encodings), except UTF\-16 and UTF\-32\&. RISX datasets carry the encoding in the processing instructions, therefore this option is not needed and ignored\&. .RE .PP \fB\-h\fR .RS 4 Display a help message explaining the command\&. .RE .PP \fB\-o\fR \fIfilename\fR .RS 4 Write the output to filename instead of to stdout\&. .RE .PP \fB\-O\fR \fIfilename\fR .RS 4 Append the output to filename instead of sending it to stdout\&. .RE .PP \fB\-t\fR \fItype\fR .RS 4 Select the input data type\&. Possible values are "ris" (default) and "risx"\&. Other data types have to be converted to one of these types before adding them to the database\&. .RE .PP \fB\-U\fR \fIusername\fR .RS 4 Provide a different username than that of the current user, so e\&.g\&. some technician or administrative staff can add references in behalf of a researcher\&. .RE .PP \fIfile\fR .RS 4 All other command\-line arguments will be interpreted as filenames to read references from\&. If no filenames are specified, the data will be read from stdin\&. .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBExample\fR .RS 4 .sp .if n \{\ .RS 4 .\} .nf refdbc: \fBaddref \-U doe \-g \&.refdbdefault\&.ris \-E ISO\-8859\-1 foo\&.ris\fR .fi .if n \{\ .RE .\} .sp .if n \{\ .RS 4 .\} .nf $ \fBrefdbc \-C addref \-U doe \-g \&.refdbdefault\&.ris \-d db1 < foo\&.ris\fR .fi .if n \{\ .RE .\} .PP These commands will add the references in foo\&.ris\&. The references will be associated with the user \(lqdoe\(rq\&. Every reference will use the specified values in \&.refdbdefault\&.ris in the appropriate fields\&. In the first (interactive) command, the active database will be used, and the encoding is set to ISO\-8859\-1, aka Latin\-1\&. In the second (non\-interactive) command, the database has to be specified explicitly with the \fB\-d\fR option, and the default encoding (UTF\-8) is assumed\&. .RE .SS "checkref" .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBSynopsis\fR .RS 4 .HP \w'\fBcheckref\fR\ 'u \fBcheckref\fR [\fB\-A\fR\ \fIoutput\-type\fR] [\fB\-d\fR\ \fIdatabase\fR] [\fB\-E\fR\ \fIencoding\fR] [\fB\-h\fR] [[\fB\-c\fR\ \fIcommand\fR] | [\fB\-o\fR\ \fIoutfile\fR] | [\fB\-O\fR\ \fIoutfile\fR]] [\fB\-r\fR\ \fIfield\-list\fR] [\fB\-s\fR\ \fIfield\-list\fR] [\fB\-t\fR\ \fIinput\-type\fR] [\fB\-U\fR\ \fIusername\fR] [\fIfile\fR...] .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBDescription\fR .RS 4 .PP Adds the references in \fIfile\fR to temporary tables in the current database\&. The command is similar to the addref command, except that it does not add the references permanently to your database\&. Instead, the import is "simulated" in temporary tables, and the resulting datasets are analyzed in terms of similarities to existing permanent entries\&. If a reference is similar to an existing one in terms of the location (periodical, volume, issue, startpage), of the titles, or of the citekey, you may want to check these references manually as they are probably duplicates\&. If an abbreviated periodical name is reported to match an existing full name, you may want to add both names to the new reference to make refdb aware that it is dealing with the same journal\&. If an author name using abbreviated first or middle names is reported to be a possible duplicate of an existing author or vice versa, you may want to check if these authors are indeed identical, and change the abbreviated one to the full version\&. In addition, keywords are checked for similar existing keywords (often there are singular and plural forms of the same keyword)\&. You should prefer to use existing keywords if possible to make your database more consistent and easier to search\&. .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBOptions\fR .RS 4 .PP \fB\-A\fR \fIouttype\fR .RS 4 Select the output type of the report\&. Currently supported values are "scrn" for a terse screen output, and "xhtml" for a voluptuous xhtml report, bells and whistles included\&. .RE .PP \fB\-c\fR \fIcommand\fR .RS 4 Pipe the output through \fIcommand\fR\&. .RE .PP \fB\-d\fR \fIdatabase\fR .RS 4 Specify the database\&. .RE .PP \fB\-E\fR \fIencoding\fR .RS 4 Select the character encoding for the input data if it is different from the default setting\&. RIS datasets can use any encoding that your local libiconv supports (see \fBman iconv_open\fR for a list of available encodings), except UTF\-16 and UTF\-32\&. RISX datasets carry the encoding in the processing instructions, therefore this option is not needed and ignored\&. .RE .PP \fB\-G\fR \fIcssfile\fR .RS 4 Select the CSS stylesheet that is to be used for the xhtml output\&. .RE .PP \fB\-h\fR .RS 4 Display a help message explaining the command\&. .RE .PP \fB\-o\fR \fIfilename\fR .RS 4 Write the output to filename instead of to stdout\&. .RE .PP \fB\-O\fR \fIfilename\fR .RS 4 Append the output to filename instead of sending it to stdout\&. .RE .PP \fB\-r\fR \fIfieldlist\fR .RS 4 Select fields to check\&. If this option is not used, all available checks are performed\&. This may result in a more comprehensive report than you want\&. You can instead check for particular fields, or a subset of the available fields\&. \fIfieldlist\fR is a concatenation of the two\-letter (pseudo) field codes: TX (all titles), PY (pubdate, volume, issue, pages), AX (all authors), JO (all journal names), CK, and KW\&. .RE .PP \fB\-s\fR \fIfieldlist\fR .RS 4 Select additional fields to display with the default xhtml output\&. \fIfieldlist\fR is a concatenation of the two\-letter field codes of those fields which are not printed by default: N1, N2, NX, AB, AD, PB, CY, RP, SN, LX, U1\-U5, and M1\-M3\&. .RE .PP \fB\-t\fR \fIinput\-type\fR .RS 4 Select the input data type\&. Possible values are "ris" (default) and "risx"\&. Other data types have to be converted to one of these types before adding them to the database\&. .RE .PP \fB\-U\fR \fIusername\fR .RS 4 Provide a different username than that of the current user, so e\&.g\&. some technician or administrative staff can add references in behalf of a researcher\&. .RE .PP \fIfile\fR .RS 4 All other command\-line arguments will be interpreted as filenames to read references from\&. If no filenames are specified, the data will be read from stdin\&. .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBExample\fR .RS 4 .sp .if n \{\ .RS 4 .\} .nf refdbc: \fBcheckref \-A xhtml \-G /usr/local/share/refdb/css/refdb\-frequency\&.css \-E ISO\-8859\-1 \-s KW foo\&.ris\fR .fi .if n \{\ .RE .\} .PP This command adds the data in foo\&.ris to temporary tables in the current database, using the \fIISO\-8859\-1\fR encoding\&. The result of the duplicate checks is requested in \fIxhtml\fR format using a stylesheet that displays frequency information graphically\&. In addition to the default fields the keywords will be listed as well\&. .RE .SS "deletelink" .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBSynopsis\fR .RS 4 .HP \w'\fBdeletelink\fR\ 'u \fBdeletelink\fR [\fB\-d\fR\ \fIdatabase\fR] [\fB\-h\fR] [[\fB\-c\fR\ \fIcommand\fR] | [\fB\-o\fR\ \fIoutfile\fR] | [\fB\-O\fR\ \fIoutfile\fR]] {note\-specifier} {link\-target...} .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBDescription\fR .RS 4 .PP The \fBdeletelink\fR command removes links from an extended note to one or more link targets\&. .PP You have to specify exactly one note on the command line, either by using the :NID: field selector to specify the note ID, or by using the :NCK: field selector to specify the note key\&. Then you need at least one link target\&. This can be one of :ID: (reference by ID), :CK: (reference by citation key), :AU: (author by name), :KW: (keyword by name), or one of :JF:, :JO:, :J1:, :J2: (periodical by full name, abbreviated name, or user abbreviations 1 and 2)\&. .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBOptions\fR .RS 4 .PP \fB\-c\fR \fIcommand\fR .RS 4 Pipe the output through \fIcommand\fR\&. .RE .PP \fB\-d\fR \fIdatabase\fR .RS 4 Specify the database\&. .RE .PP \fB\-h\fR .RS 4 Display a help message explaining the command\&. .RE .PP \fB\-o\fR \fIfilename\fR .RS 4 Write the output to filename instead of to stdout\&. .RE .PP \fB\-O\fR \fIfilename\fR .RS 4 Append the output to filename instead of sending it to stdout\&. .RE .PP \fInote\-specifier\fR .RS 4 Specify one note by either its :NID: or its :NCK: value\&. .RE .PP \fIlink\-target\fR .RS 4 Specify one or more link targets by means of their :ID:, :CK:, :AU:, :KW:, :JF:, :JO:, :J1:, or :J2: values\&. .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBExample\fR .RS 4 .sp .if n \{\ .RS 4 .\} .nf refdbc: \fBdeletelink :NID:=12 :CK:=Miller1999 :KW:=biochemistry\fR .fi .if n \{\ .RE .\} .PP This command will delete the links from the note carrying the ID 12 to a reference specified by its citation key "Miller1999" and to the keyword "biochemistry"\&. .RE .SS "deletenote" .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBSynopsis\fR .RS 4 .HP \w'\fBdeletenote\fR\ 'u \fBdeletenote\fR [\fB\-d\fR\ \fIdatabase\fR] [\fB\-h\fR] [[\fB\-c\fR\ \fIcommand\fR] | [\fB\-o\fR\ \fIoutfile\fR] | [\fB\-O\fR\ \fIoutfile\fR]] {{\fIID\fR...} | {\fB\-f\fR\ \fIinfile\fR}} .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBDescription\fR .RS 4 .PP Deletes the extended note with the identifier \fIID\fR from the current database\&. Several extended notes may be specified in a single call of this command\&. Notes with consecutive ID values may be specified as ranges\&. .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBCaution\fR .ps -1 .br .PP It is not possible to delete a note if it belongs to a different user\&. .sp .5v .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBOptions\fR .RS 4 .PP \fB\-c\fR \fIcommand\fR .RS 4 Pipe the output through \fIcommand\fR\&. .RE .PP \fB\-d\fR \fIdatabase\fR .RS 4 Specify the database\&. .RE .PP \fB\-f\fR \fIinfile\fR .RS 4 Read a list of NID values in the RIS format from \fIinfile\fR\&. .RE .PP \fB\-h\fR .RS 4 Display a help message explaining the command\&. .RE .PP \fB\-o\fR \fIfilename\fR .RS 4 Write the output to filename instead of to stdout\&. .RE .PP \fB\-O\fR \fIfilename\fR .RS 4 Append the output to filename instead of sending it to stdout\&. .RE .PP \fINID\fR .RS 4 All other arguments are interpreted as a list of noteID values\&. Ranges may be used to specify consecutive NIDs\&. If neither NIDs nor an \fIinfile\fR are provided, refdbc attempts to read the NIDs from stdin\&. You can ask refdbc to read NID values from stdin \fIin addition\fR to other NIDs by using the \fB\-f stdin\fR option\&. .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBExample\fR .RS 4 .sp .if n \{\ .RS 4 .\} .nf refdbc: \fBdeletenote 3 5\-10 26\fR .fi .if n \{\ .RE .\} .PP This command will delete the extended notes with the ID values 3, 5 through 10, and 26\&. .RE .SS "deleteref" .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBSynopsis\fR .RS 4 .HP \w'\fBdeleteref\fR\ 'u \fBdeleteref\fR [\fB\-d\fR\ \fIdatabase\fR] [\fB\-h\fR] [[\fB\-c\fR\ \fIcommand\fR] | [\fB\-o\fR\ \fIoutfile\fR] | [\fB\-O\fR\ \fIoutfile\fR]] {{\fIID\fR...} | {\fB\-f\fR\ \fIinfile\fR}} .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBDescription\fR .RS 4 .PP Deletes the reference with the identifier \fIID\fR from the current database\&. Several references may be specified in a single call of this command\&. References with consecutive ID values may be specified as ranges\&. .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBCaution\fR .ps -1 .br .PP It is not possible to delete a reference if it belongs to the personal reference list of more than one user\&. .PP If you\*(Aqre the only user of this reference and go ahead and delete it, all data saved in the specified references will be gone, so be careful with this command\&. Make sure you understand the difference between the \fBdeleteref\fR command and the \fBdumpref\fR command\&. The former deletes the data, the latter deletes only your personal data associated with the specified references (the notes, availability, and reprint data) and removes your association with this reference\&. In other words, \fBdeleteref\fR removes the reference from the database, whereas \fBdumpref\fR removes the reference from your personal reference list, leaving the remaining data for the other users of the database\&. .sp .5v .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBOptions\fR .RS 4 .PP \fB\-c\fR \fIcommand\fR .RS 4 Pipe the output through \fIcommand\fR\&. .RE .PP \fB\-d\fR \fIdatabase\fR .RS 4 Specify the database\&. .RE .PP \fB\-f\fR \fIinfile\fR .RS 4 Read a list of ID values in the RIS format from \fIinfile\fR\&. This list may be the result of a previous getref command\&. .RE .PP \fB\-h\fR .RS 4 Display a help message explaining the command\&. .RE .PP \fB\-o\fR \fIfilename\fR .RS 4 Write the output to filename instead of to stdout\&. .RE .PP \fB\-O\fR \fIfilename\fR .RS 4 Append the output to filename instead of sending it to stdout\&. .RE .PP \fIID\fR .RS 4 All other arguments are interpreted as a list of ID values\&. Ranges may be used to specify consecutive IDs\&. If neither IDs nor an \fIinfile\fR are provided, refdbc attempts to read the IDs from stdin\&. You can ask refdbc to read ID values from stdin \fIin addition\fR to other IDs by using the \fB\-f stdin\fR option\&. .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBExample\fR .RS 4 .sp .if n \{\ .RS 4 .\} .nf refdbc: \fBdeleteref 3 5\-10 26\fR .fi .if n \{\ .RE .\} .PP This command will delete the references with the ID values 3, 5 through 10, and 26\&. .RE .SS "dumpref" .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBSynopsis\fR .RS 4 .HP \w'\fBdumpref\fR\ 'u \fBdumpref\fR [\fB\-b\fR\ \fIlistname\fR] [\fB\-d\fR\ \fIdatabase\fR] [\fB\-h\fR] [[\fB\-c\fR\ \fIcommand\fR] | [\fB\-o\fR\ \fIoutfile\fR] | [\fB\-O\fR\ \fIoutfile\fR]] {[\fIID\fR...] | [\fB\-f\fR\ \fIfile\fR]...} .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBDescription\fR .RS 4 .PP Removes references from the specified personal reference list in the current database\&. If no personal reference list is specified, the default list (carrying the same name as your database username) will be used instead\&. .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBOptions\fR .RS 4 .PP \fB\-b\fR \fIlistname\fR .RS 4 Use the personal reference list named \fIlistname\fR\&. .RE .PP \fB\-c\fR \fIcommand\fR .RS 4 Pipe the output through \fIcommand\fR\&. .RE .PP \fB\-d\fR \fIdatabase\fR .RS 4 Specify the database\&. .RE .PP \fB\-f\fR \fIinfile\fR .RS 4 Read a list of ID values in the RIS format from \fIinfile\fR\&. This list may be the result of a previous getref command\&. .RE .PP \fB\-h\fR .RS 4 Display a help message explaining the command\&. .RE .PP \fB\-o\fR \fIfilename\fR .RS 4 Write the output to filename instead of to stdout\&. .RE .PP \fB\-O\fR \fIfilename\fR .RS 4 Append the output to filename instead of sending it to stdout\&. .RE .PP \fIID\fR .RS 4 All other arguments are interpreted as a list of ID values\&. Ranges may be used to specify consecutive IDs\&. If neither IDs nor an \fIinfile\fR are provided, refdbc attempts to read the IDs from stdin\&. You can ask refdbc to read ID values from stdin \fIin addition\fR to other IDs by using the \fB\-f stdin\fR option\&. .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBExample\fR .RS 4 .sp .if n \{\ .RS 4 .\} .nf refdbc: \fBdumpref \-f foo\&.ris 3 5\-10 26\fR .fi .if n \{\ .RE .\} .PP This command will remove the references 3, 5 through 10, and 26 as well as those listed in the file foo\&.ris from your personal reference list\&. .RE .SS "getau, geted, getas, getax" .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBSynopsis\fR .RS 4 .HP \w'\fBgetau\fR\ 'u \fBgetau\fR [\fB\-d\fR\ \fIdatabase\fR] [\fB\-h\fR] [[\fB\-c\fR\ \fIcommand\fR] | [\fB\-o\fR\ \fIoutfile\fR] | [\fB\-O\fR\ \fIoutfile\fR]] [\fB\-N\fR\ \fIlimit[:offset]\fR] [\fB\-s\fR\ \fIformat\fR] {\fIunix\-regexp\fR} .HP \w'\fB\fR\fBgeted\fR\ 'u \fB\fR\fBgeted\fR [\fB\-d\fR\ \fIdatabase\fR] [\fB\-h\fR] [[\fB\-c\fR\ \fIcommand\fR] | [\fB\-o\fR\ \fIoutfile\fR] | [\fB\-O\fR\ \fIoutfile\fR]] [\fB\-N\fR\ \fIlimit[:offset]\fR] [\fB\-s\fR\ \fIformat\fR] {\fIunix\-regexp\fR} .HP \w'\fB\fR\fBgetas\fR\ 'u \fB\fR\fBgetas\fR [\fB\-d\fR\ \fIdatabase\fR] [\fB\-h\fR] [[\fB\-c\fR\ \fIcommand\fR] | [\fB\-o\fR\ \fIoutfile\fR] | [\fB\-O\fR\ \fIoutfile\fR]] [\fB\-N\fR\ \fIlimit[:offset]\fR] [\fB\-s\fR\ \fIformat\fR] {\fIregexp\fR} .HP \w'\fB\fR\fBgetas\fR\ 'u \fB\fR\fBgetas\fR [\fB\-d\fR\ \fIdatabase\fR] [\fB\-h\fR] [[\fB\-c\fR\ \fIcommand\fR] | [\fB\-o\fR\ \fIoutfile\fR] | [\fB\-O\fR\ \fIoutfile\fR]] [\fB\-N\fR\ \fIlimit[:offset]\fR] [\fB\-s\fR\ \fIformat\fR] {\fIregexp\fR} .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBDescription\fR .RS 4 .PP Retrieve all author names that match the regular expression \fIregexp\fR in the current database\&. If no regexp argument is given, \fIall\fR author names will be listed, which may or may not be what you want\&. \fBgetau\fR retrieves the \fIprimary\fR authors which is the most common case if you want to locate a publication\&. \fBgeted\fR and \fBgetas\fR retrieve book or periodical editors and series authors, respectively\&. \fBgetax\fR retrieves authors from any level\&. .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBOptions\fR .RS 4 .PP \fB\-c\fR \fIcommand\fR .RS 4 Pipe the output through \fIcommand\fR\&. .RE .PP \fB\-d\fR \fIdatabase\fR .RS 4 Specify the database\&. .RE .PP \fB\-h\fR .RS 4 Display a help message explaining the command\&. .RE .PP \fB\-N\fR \fIlimit[:offset]\fR .RS 4 Limit the number of returned datasets\&. If \fIlimit\fR is used all by itself, the first \fIlimit\fR author names are returned\&. If the optional \fIoffset\fR argument is used as well, the first \fIoffset\fR author names will be skipped, and the next \fIlimit\fR author names will be returned\&. .RE .PP \fB\-o\fR \fIfilename\fR .RS 4 Write the output to filename instead of to stdout\&. .RE .PP \fB\-O\fR \fIfilename\fR .RS 4 Append the output to filename instead of sending it to stdout\&. .RE .PP \fB\-s\fR \fIformat\fR .RS 4 Request additional frequency information\&. "freq" provides the absolute number of references that contain the given author\&. "relfreq" reports a relative frequency indicator as an integer between 0 and 10\&. .RE .PP \fIregexp\fR .RS 4 All other arguments are interpreted as a unix regular expression which limits the results to matching author names\&. .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBNote\fR .ps -1 .br Some database engines, like SQLite, do not support Unix\-style regular expressions\&. Use SQL regular expressions instead\&. .sp .5v .RE .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBExample\fR .RS 4 .sp .if n \{\ .RS 4 .\} .nf refdbc: \fBgetau \-o authors\&.txt \*(Aq^Simpson\*(Aq\fR .fi .if n \{\ .RE .\} .PP This command will write a list of all authors starting with \(lqSimpson\(rq to the file authors\&.txt\&. .sp .if n \{\ .RS 4 .\} .nf refdbc: \fBgetau \-N 5:10\fR .fi .if n \{\ .RE .\} .PP This command prints the author names 11 through 15\&. .RE .SS "getjo, getjf, getj1, getj2" .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBSynopsis\fR .RS 4 .HP \w'\fBgetjo\fR\ 'u \fBgetjo\fR [\fB\-a\fR] [\fB\-d\fR\ \fIdatabase\fR] [\fB\-h\fR] [[\fB\-c\fR\ \fIcommand\fR] | [\fB\-o\fR\ \fIoutfile\fR] | [\fB\-O\fR\ \fIoutfile\fR]] [\fB\-N\fR\ \fIlimit[:offset]\fR] [\fB\-s\fR\ \fIformat\fR] {\fIregexp\fR} .HP \w'\fB\fR\fBgetjf\fR\ 'u \fB\fR\fBgetjf\fR [\fB\-a\fR] [\fB\-d\fR\ \fIdatabase\fR] [\fB\-h\fR] [[\fB\-c\fR\ \fIcommand\fR] | [\fB\-o\fR\ \fIoutfile\fR] | [\fB\-O\fR\ \fIoutfile\fR]] [\fB\-N\fR\ \fIlimit[:offset]\fR] [\fB\-s\fR\ \fIformat\fR] {\fIregexp\fR} .HP \w'\fB\fR\fBgetj1\fR\ 'u \fB\fR\fBgetj1\fR [\fB\-a\fR] [\fB\-d\fR\ \fIdatabase\fR] [\fB\-h\fR] [[\fB\-c\fR\ \fIcommand\fR] | [\fB\-o\fR\ \fIoutfile\fR] | [\fB\-O\fR\ \fIoutfile\fR]] [\fB\-N\fR\ \fIlimit[:offset]\fR] [\fB\-s\fR\ \fIformat\fR] {\fIregexp\fR} .HP \w'\fB\fR\fBgetj2\fR\ 'u \fB\fR\fBgetj2\fR [\fB\-a\fR] [\fB\-d\fR\ \fIdatabase\fR] [\fB\-h\fR] [[\fB\-c\fR\ \fIcommand\fR] | [\fB\-o\fR\ \fIoutfile\fR] | [\fB\-O\fR\ \fIoutfile\fR]] [\fB\-N\fR\ \fIlimit[:offset]\fR] [\fB\-s\fR\ \fIformat\fR] {\fIregexp\fR} .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBDescription\fR .RS 4 .PP Retrieve all journal names that match the regular expression \fIregexp\fR in the current database\&. The \fIregexp\fR will be matched to the journal abbreviation, the full name, the custom abbreviation 1, and the custom abbreviation 2, respectively\&. If no regexp argument is given, \fIall\fR available journal names will be listed\&. .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBOptions\fR .RS 4 .PP \fB\-a\fR .RS 4 Return all synonymous journal names, i\&.e\&. full name, abbreviation, custom abbreviation\ \&1, and custom abbreviation\ \&2\&. If the option is absent, only the name that you search for will be returned, e\&.g\&. only the full name in the case of \fBgetjf\fR\&. .RE .PP \fB\-c\fR \fIcommand\fR .RS 4 Pipe the output through \fIcommand\fR\&. .RE .PP \fB\-d\fR \fIdatabase\fR .RS 4 Specify the database\&. .RE .PP \fB\-h\fR .RS 4 Display a help message explaining the command\&. .RE .PP \fB\-N\fR \fIlimit[:offset]\fR .RS 4 Limit the number of returned datasets\&. If \fIlimit\fR is used all by itself, the first \fIlimit\fR journal names are returned\&. If the optional \fIoffset\fR argument is used as well, the first \fIoffset\fR journal names will be skipped, and the next \fIlimit\fR journal names will be returned\&. .RE .PP \fB\-o\fR \fIfilename\fR .RS 4 Write the output to filename instead of to stdout\&. .RE .PP \fB\-O\fR \fIfilename\fR .RS 4 Append the output to filename instead of sending it to stdout\&. .RE .PP \fB\-s\fR \fIformat\fR .RS 4 Request additional frequency information\&. "freq" provides the absolute number of references that contain the given journal name\&. "relfreq" reports a relative frequency indicator as an integer between 0 and 10\&. .RE .PP \fIregexp\fR .RS 4 All other arguments are interpreted as a unix regular expression which limits the results to matching journal names\&. .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBNote\fR .ps -1 .br Some database engines, like SQLite, do not support Unix\-style regular expressions\&. Use SQL regular expressions instead\&. .sp .5v .RE .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBExample\fR .RS 4 .sp .if n \{\ .RS 4 .\} .nf refdbc: \fBgetjo \-a \-o journals\&.txt \*(Aq^J\*(Aq\fR .fi .if n \{\ .RE .\} .PP This command will list all synonyms of the journals whose abbreviations start with a capital J\&. The output will be redirected into the file journals\&.txt\&. .RE .SS "getkw" .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBSynopsis\fR .RS 4 .HP \w'\fBgetkw\fR\ 'u \fBgetkw\fR [\fB\-d\fR\ \fIdatabase\fR] [\fB\-h\fR] [[\fB\-c\fR\ \fIcommand\fR] | [\fB\-o\fR\ \fIoutfile\fR] | [\fB\-O\fR\ \fIoutfile\fR]] [\fB\-N\fR\ \fIlimit[:offset]\fR] [\fB\-s\fR\ \fIformat\fR] {\fIregexp\fR} .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBDescription\fR .RS 4 .PP Retrieve all keywords that match the regular expression \fIregexp\fR in the current database\&. If no regexp argument is specified, all keywords in the database will be listed\&. .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBOptions\fR .RS 4 .PP \fB\-c\fR \fIcommand\fR .RS 4 Pipe the output through \fIcommand\fR\&. .RE .PP \fB\-d\fR \fIdatabase\fR .RS 4 Specify the database\&. .RE .PP \fB\-h\fR .RS 4 Display a help message explaining the command\&. .RE .PP \fB\-N\fR \fIlimit[:offset]\fR .RS 4 Limit the number of returned datasets\&. If \fIlimit\fR is used all by itself, the first \fIlimit\fR keywords are returned\&. If the optional \fIoffset\fR argument is used as well, the first \fIoffset\fR keywords will be skipped, and the next \fIlimit\fR keywords will be returned\&. .RE .PP \fB\-o\fR \fIfilename\fR .RS 4 Write the output to filename instead of to stdout\&. .RE .PP \fB\-O\fR \fIfilename\fR .RS 4 Append the output to filename instead of sending it to stdout\&. .RE .PP \fB\-s\fR \fIformat\fR .RS 4 Request additional frequency information\&. "freq" provides the absolute number of references that contain the given keyword\&. "relfreq" reports a relative frequency indicator as an integer between 0 and 10\&. .RE .PP \fIregexp\fR .RS 4 All other arguments are interpreted as a unix regular expression which limits the results to matching keywords\&. .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBNote\fR .ps -1 .br Some database engines, like SQLite, do not support Unix\-style regular expressions\&. Use SQL regular expressions instead\&. .sp .5v .RE .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBExamples\fR .RS 4 .sp .if n \{\ .RS 4 .\} .nf refdbc: \fBgetkw \-o keywords\&.txt \*(Aq^An\&.*l$\*(Aq\fR .fi .if n \{\ .RE .\} .PP This command will request a list of all keywords that start with \(lqAn\(rq and end with the letter \(lql\(rq, like \(lqAnimal\(rq, and write the result to the file keywords\&.txt\&. .sp .if n \{\ .RS 4 .\} .nf ~# \fBrefdbc \-C getkw \-s freq \-c "sort \-r|cut \-d \*(Aq:\*(Aq \-f 2"|less\fR .fi .if n \{\ .RE .\} .PP Here we run the \fBgetkw\fR command from the shell\&. The result list contains the frequency of each returned keyword\&. The data are sorted in descending order according to the frequency, and the frequency information itself is stripped off\&. Of course there is more than one way to arrive here\&. E\&.g\&. you could use the \fB\-c\fR option to send the data to \fIstdout\fR and pipe them through the argument of the \fB\-c\fR option in the example shown above\&. .RE .SS "getnote" .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBSynopsis\fR .RS 4 .HP \w'\fBgetnote\fR\ 'u \fBgetnote\fR [\fB\-d\fR\ \fIdatabase\fR] [\fB\-E\fR\ \fIencoding\fR] [\fB\-h\fR] [[\fB\-c\fR\ \fIcommand\fR] | [\fB\-o\fR\ \fIoutfile\fR] | [\fB\-O\fR\ \fIoutfile\fR]] [\fB\-N\fR\ \fIlimit[:offset]\fR] [\fB\-P\fR] [\fB\-S\fR\ \fIsort\-string\fR] [\fB\-t\fR\ \fIoutput\-type\fR] {[\fIsearch\-string\fR] | [\fB\-f\fR\ \fIfile\fR]} .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBDescription\fR .RS 4 .PP Displays all extended notes which match the \fIsearch\-string\fR in the current database\&. Refer to the section The query language for a description of the syntax of a search string\&. .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBOptions\fR .RS 4 .PP \fB\-c\fR \fIcommand\fR .RS 4 Pipe the output through \fIcommand\fR\&. .RE .PP \fB\-d\fR \fIdatabase\fR .RS 4 Specify the database\&. .RE .PP \fB\-E\fR \fIencoding\fR .RS 4 Select the character encoding for the output data if it is different from the database encoding\&. You can request any encoding that your local libiconv supports (see \fBman iconv_open\fR for a list of available encodings)\&. .RE .PP \fB\-f\fR \fIinfile\fR .RS 4 Read the search string from \fIinfile\fR\&. This is a simple way to re\-run saved queries\&. .RE .PP \fB\-h\fR .RS 4 Display a help message explaining the command\&. .RE .PP \fB\-N\fR \fIlimit[:offset]\fR .RS 4 Limit the number of returned datasets\&. If \fIlimit\fR is used all by itself, the first \fIlimit\fR extended notes are returned\&. If the optional \fIoffset\fR argument is used as well, the first \fIoffset\fR notes will be skipped, and the next \fIlimit\fR notes will be returned\&. .RE .PP \fB\-o\fR \fIfilename\fR .RS 4 Write the output to filename instead of to stdout\&. .RE .PP \fB\-O\fR \fIfilename\fR .RS 4 Append the output to filename instead of sending it to stdout\&. .RE .PP \fB\-P\fR .RS 4 Limit the search to the notes which were added by the current user\&. If this switch is absent, the whole database will be searched\&. .RE .PP \fB\-S\fR \fIsort\-string\fR .RS 4 Sort the output\&. Currently you can sort only by ID (the default) or by PY (publication year)\&. .RE .PP \fB\-t\fR \fIoutput\-type\fR .RS 4 Select the type of output\&. Available are "scrn", "html", "xhtml", and "xnote" for a compact format suitable for terminal browsing, HTML, XHTML, or the native XML format, respectively\&. .RE .PP \fIsearch\-string\fR .RS 4 The remainder of the arguments is interpreted as a search string\&. The syntax of the queries is described in the section query language\&. .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBExample\fR .RS 4 .sp .if n \{\ .RS 4 .\} .nf refdbc: \fBgetnote \-t xnote :CK:=Miller1999\fR .fi .if n \{\ .RE .\} .PP This command retrieves notes which are attached to the reference with the citation key "Miller1999" and displays them in the xnote format\&. .RE .SS "getref" .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBSynopsis\fR .RS 4 .HP \w'\fBgetref\fR\ 'u \fBgetref\fR [\fB\-b\fR\ \fIlistname\fR] [\fB\-d\fR\ \fIdatabase\fR] [\fB\-E\fR\ \fIencoding\fR] [\fB\-h\fR] [[\fB\-c\fR\ \fIcommand\fR] | [\fB\-o\fR\ \fIoutfile\fR] | [\fB\-O\fR\ \fIoutfile\fR]] [\fB\-N\fR\ \fIlimit[:offset]\fR] [\fB\-s\fR\ \fIformat\-string\fR] [\fB\-S\fR\ \fIsort\-string\fR] [\fB\-t\fR\ \fIoutput\-format\fR] {[\fIsearch\-string\fR] | [\fB\-f\fR\ \fIfile\fR]} .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBDescription\fR .RS 4 .PP Displays all datasets which match the \fIsearch\-string\fR in the current database\&. Refer to the section The query language for a description of the syntax of a search string\&. See the countref command if you want to know how many references match your current query without actually retrieving a possibly large amount of reference data\&. .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBOptions\fR .RS 4 .PP \fB\-b\fR \fIlistname\fR .RS 4 Limit the search to the personal reference list named \fIlistname\fR\&. .RE .PP \fB\-c\fR \fIcommand\fR .RS 4 Pipe the output through \fIcommand\fR\&. .RE .PP \fB\-d\fR \fIdatabase\fR .RS 4 Specify the database\&. .RE .PP \fB\-E\fR \fIencoding\fR .RS 4 Select the character encoding for the output data if it is different from the database encoding\&. You can request any encoding that your local libiconv supports (see \fBman iconv_open\fR for a list of available encodings)\&. .RE .PP \fB\-f\fR \fIinfile\fR .RS 4 Read the search string from \fIinfile\fR\&. This is a simple way to re\-run saved queries\&. .RE .PP \fB\-h\fR .RS 4 Display a help message explaining the command\&. .RE .PP \fB\-N\fR \fIlimit[:offset]\fR .RS 4 Limit the number of returned datasets\&. If \fIlimit\fR is used all by itself, the first \fIlimit\fR matching references are returned\&. If the optional \fIoffset\fR argument is used as well, the first \fIoffset\fR matching references will be skipped, and the next \fIlimit\fR matching references will be returned\&. .RE .PP \fB\-o\fR \fIfilename\fR .RS 4 Write the output to filename instead of to stdout\&. .RE .PP \fB\-O\fR \fIfilename\fR .RS 4 Append the output to filename instead of sending it to stdout\&. .RE .PP \fB\-s\fR \fIformat\-string\fR .RS 4 Specify additional fields and pseudo\-fields (N1, N2/AB, NX, RP, SN, AD, CY, PB, LX, U1 through U5, M1 through M3) that are not displayed by default, except for the RIS and risx output formats\&. Use "ALL" as an argument to display all available fields\&. If several fields are specified, the argument has to be enclosed by single quotation marks\&. If applied to RIS output, you can specify ID as \fIformat\-string\fR to get only a list of ID values in RIS format for all references that match the search\&. This is a convenient way to generate ID lists for later operations like \fBdeleteref\fR\&. .RE .PP \fB\-S\fR \fIsort\-string\fR .RS 4 Sort the output\&. Currently you can sort only by ID (the default) or by PY (publication year)\&. .RE .PP \fB\-t\fR \fIoutput\-type\fR .RS 4 Select the type of output\&. Available are "scrn", "ris", "risx", "html", "xhtml", "db31", "db31x", "db50x, "teix", "tei5x", "mods", and "bibtex" for a compact format suitable for terminal browsing, the native RIS and risx (XML) formats, HTML, XHTML, DocBook SGML, DocBook XML (DTD\-based), DocBook XML (schema\-based), TEI P4 XML, TEI P5 XML, MODS, or BibTeX format, respectively\&. .RE .PP \fIsearch\-string\fR .RS 4 The remainder of the arguments is interpreted as a search string\&. The syntax of the queries is described in the section query language\&. .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBExample\fR .RS 4 .sp .if n \{\ .RS 4 .\} .nf refdbc: \fBgetref \-t ris \-o temp\&.sgml \-E ISO\-8859\-15 ":AU:=\*(Aq& ^Doe ^Jones\*(Aq AND :KW:=circular\e dichroism"\fR .fi .if n \{\ .RE .\} .PP This command retrieves articles with both an author starting with \(lqDoe\(rq and an author starting with \(lqJones\(rq that have the keyword \(lqcircular dichroism\(rq\&. The output will be saved in RIS format to the file temp\&.sgml using the character encoding ISO\-8859\-15\&. .RE .SS "help, ?" .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBSynopsis\fR .RS 4 .HP \w'\fBhelp\fR\ 'u \fBhelp\fR .HP \w'\fB?\fR\ 'u \fB?\fR .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBDescription\fR .RS 4 .PP Displays a brief summary of the available commands\&. .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBNote\fR .ps -1 .br .PP This command is not available in the batch mode (use the \fB\-h\fR option instead to review the command line usage)\&. .sp .5v .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBExample\fR .RS 4 .sp .if n \{\ .RS 4 .\} .nf refdbc: \fBhelp\fR .fi .if n \{\ .RE .\} .PP This will list the available commands\&. .RE .SS "listdb" .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBSynopsis\fR .RS 4 .HP \w'\fBlistdb\fR\ 'u \fBlistdb\fR [\fB\-h\fR] [\fIdatabase\-regexp\fR] .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBDescription\fR .RS 4 .PP Lists all available databases if no argument is specified\&. If \fIdatabase\-regexp\fR is specified, only the databases matching this expression will be listed\&. .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBOptions\fR .RS 4 .PP \fB\-h\fR .RS 4 Displays a help message explaining the \fBlistdb\fR command\&. .RE .PP \fIdatabase\-regexp\fR .RS 4 A valid SQL regular expression which limits the output to matching database names\&. .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBExample\fR .RS 4 .sp .if n \{\ .RS 4 .\} .nf refdbc: \fBlistdb db%\fR .fi .if n \{\ .RE .\} .PP This command will list all available databases that start with \(lqdb\(rq\&. .RE .SS "liststyle" .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBSynopsis\fR .RS 4 .HP \w'\fBliststyle\fR\ 'u \fBliststyle\fR {\fIstyle\-regexp\fR} .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBDescription\fR .RS 4 .PP Lists all available bibliography styles that match \fIstyle\-regexp\fR\&.If no argument is specified, all available styles will be listed\&. .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBOptions\fR .RS 4 .PP \fB\-h\fR .RS 4 Displays a help message explaining the \fBlistdb\fR command\&. .RE .PP \fIstyle\-regexp\fR .RS 4 A valid Unix regular expression which limits the output to matching style names\&. .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBNote\fR .ps -1 .br Some database engines, like SQLite, do not support Unix\-style regular expressions\&. Use SQL regular expressions instead\&. .sp .5v .RE .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBExample\fR .RS 4 .sp .if n \{\ .RS 4 .\} .nf refdbc: \fBliststyle \fR\fB\fI^J\&.*\fR\fR .fi .if n \{\ .RE .\} .PP This will list all bibliography styles that start with a capital \(lqJ\(rq\&. .RE .SS "pickref" .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBSynopsis\fR .RS 4 .HP \w'\fBpickref\fR\ 'u \fBpickref\fR [\fB\-b\fR\ \fIlistname\fR] [\fB\-d\fR\ \fIdatabase\fR] [\fB\-h\fR] [[\fB\-c\fR\ \fIcommand\fR] | [\fB\-o\fR\ \fIoutfile\fR] | [\fB\-O\fR\ \fIoutfile\fR]] {[\fIID\fR...] | [\fB\-f\fR\ \fIfile\fR]} .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBDescription\fR .RS 4 .PP Adds references to the specified personal reference list in the current database\&. If no personal reference list is specified, the default list (carrying the same name as your database username) will be used instead\&. .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBOptions\fR .RS 4 .PP \fB\-b\fR \fIlistname\fR .RS 4 Use the personal reference list named \fIlistname\fR\&. .RE .PP \fB\-c\fR \fIcommand\fR .RS 4 Pipe the output through \fIcommand\fR\&. .RE .PP \fB\-d\fR \fIdatabase\fR .RS 4 Specify the database\&. .RE .PP \fB\-f\fR \fIinfile\fR .RS 4 Read a list of ID values in the RIS format from \fIinfile\fR\&. This list may be the result of a previous getref command\&. .RE .PP \fB\-h\fR .RS 4 Display a help message explaining the command\&. .RE .PP \fB\-o\fR \fIfilename\fR .RS 4 Write the output to filename instead of to stdout\&. .RE .PP \fB\-O\fR \fIfilename\fR .RS 4 Append the output to filename instead of sending it to stdout\&. .RE .PP \fIID\fR .RS 4 All other arguments are interpreted as a list of ID values\&. Ranges may be used to specify consecutive IDs\&. If neither IDs nor an \fIinfile\fR are provided, refdbc attempts to read the IDs from stdin\&. You can ask refdbc to read ID values from stdin \fIin addition\fR to other IDs by using the \fB\-f stdin\fR option\&. .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBExample\fR .RS 4 .sp .if n \{\ .RS 4 .\} .nf refdbc: \fBpickref \-f foo\&.ris 3 5\-10 26\fR .fi .if n \{\ .RE .\} .PP This command will add the references 3, 5 through 10, and 26 as well as those listed in the file foo\&.ris to your personal reference list\&. .RE .SS "countnote" .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBSynopsis\fR .RS 4 .HP \w'\fBcountnote\fR\ 'u \fBcountnote\fR [\fB\-b\fR\ \fIlistname\fR] [\fB\-c\fR\ \fIcommand\fR] [\fB\-d\fR\ \fIdatabase\fR] [\fB\-h\fR] [\fB\-N\fR\ \fIlimit[:offset]\fR] {[\fIsearch\-string\fR] | [\fB\-f\fR\ \fIfile\fR]} .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBDescription\fR .RS 4 .PP Counts all extended notes which match the \fIsearch\-string\fR in the current database\&. Refer to the section The query language for a description of the syntax of a search string\&. This command is equivalent to the getnote command except that it does not return the matching notes\&. It just counts them\&. .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBOptions\fR .RS 4 .PP \fB\-b\fR \fIlistname\fR .RS 4 Limit the search to the personal reference list named \fIlistname\fR\&. .RE .PP \fB\-c\fR \fIcommand\fR .RS 4 Pipe the output through \fIcommand\fR\&. .RE .PP \fB\-d\fR \fIdatabase\fR .RS 4 Specify the database\&. .RE .PP \fB\-f\fR \fIinfile\fR .RS 4 Read the search string from \fIinfile\fR\&. This is a simple way to re\-run saved queries\&. .RE .PP \fB\-h\fR .RS 4 Display a help message explaining the command\&. .RE .PP \fB\-N\fR \fIlimit[:offset]\fR .RS 4 Limit the number of returned datasets\&. If \fIlimit\fR is used all by itself, the first \fIlimit\fR matching references are returned\&. If the optional \fIoffset\fR argument is used as well, the first \fIoffset\fR matching references will be skipped, and the next \fIlimit\fR matching references will be returned\&. .RE .PP \fIsearch\-string\fR .RS 4 The remainder of the arguments is interpreted as a search string\&. The syntax of the queries is described in the section query language\&. .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBExample\fR .RS 4 .sp .if n \{\ .RS 4 .\} .nf refdbc: \fBcountnote :KW:~[rR]eview\fR .fi .if n \{\ .RE .\} .PP This command looks for extended notes that are linked to references which contain keywords like "review" or "Review"\&. The command will return the number of matching notes in the result summary\&. .RE .SS "countref" .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBSynopsis\fR .RS 4 .HP \w'\fBcountref\fR\ 'u \fBcountref\fR [\fB\-b\fR\ \fIlistname\fR] [\fB\-c\fR\ \fIcommand\fR] [\fB\-d\fR\ \fIdatabase\fR] [\fB\-h\fR] [\fB\-N\fR\ \fIlimit[:offset]\fR] {[\fIsearch\-string\fR] | [\fB\-f\fR\ \fIfile\fR]} .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBDescription\fR .RS 4 .PP Counts all datasets which match the \fIsearch\-string\fR in the current database\&. Refer to the section The query language for a description of the syntax of a search string\&. This command is equivalent to the getref command except that it does not return the matching references\&. It just counts them\&. .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBOptions\fR .RS 4 .PP \fB\-b\fR \fIlistname\fR .RS 4 Limit the search to the personal reference list named \fIlistname\fR\&. .RE .PP \fB\-c\fR \fIcommand\fR .RS 4 Pipe the output through \fIcommand\fR\&. .RE .PP \fB\-d\fR \fIdatabase\fR .RS 4 Specify the database\&. .RE .PP \fB\-f\fR \fIinfile\fR .RS 4 Read the search string from \fIinfile\fR\&. This is a simple way to re\-run saved queries\&. .RE .PP \fB\-h\fR .RS 4 Display a help message explaining the command\&. .RE .PP \fB\-N\fR \fIlimit[:offset]\fR .RS 4 Limit the number of returned datasets\&. If \fIlimit\fR is used all by itself, the first \fIlimit\fR matching references are returned\&. If the optional \fIoffset\fR argument is used as well, the first \fIoffset\fR matching references will be skipped, and the next \fIlimit\fR matching references will be returned\&. .RE .PP \fIsearch\-string\fR .RS 4 The remainder of the arguments is interpreted as a search string\&. The syntax of the queries is described in the section query language\&. .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBExample\fR .RS 4 .sp .if n \{\ .RS 4 .\} .nf refdbc: \fBcountref ":AU:=\*(Aq& ^Doe ^Jones\*(Aq AND :KW:=circular\e dichroism"\fR .fi .if n \{\ .RE .\} .PP This command looks for articles with both an author starting with \(lqDoe\(rq and an author starting with \(lqJones\(rq that have the keyword \(lqcircular dichroism\(rq\&. The command will return the number of matching references in the result summary\&. .RE .SS "selectdb" .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBSynopsis\fR .RS 4 .HP \w'\fBselectdb\fR\ 'u \fBselectdb\fR [\fB\-h\fR] {\fIdatabase\fR} .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBDescription\fR .RS 4 .PP Select \fIdatabase\fR as the current database\&. This current database will be used in all queries unless you specify a different database with the \fB\-d\fR option of the query commands\&. .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBNote\fR .ps -1 .br .PP This command is not available in the batch mode\&. Use the \fB\-d\fR command line option instead\&. .sp .5v .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBOptions\fR .RS 4 .PP \fB\-h\fR .RS 4 Display a help message explaining the command\&. .RE .PP \fIdatabase\fR .RS 4 The name of the database to be selected\&. .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBExample\fR .RS 4 .sp .if n \{\ .RS 4 .\} .nf refdbc: \fBselectdb db1\fR .fi .if n \{\ .RE .\} .PP This command will make the database db1 the active database\&. All further queries and operations will affect this database\&. .RE .SS "set" .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBSynopsis\fR .RS 4 .HP \w'\fBset\fR\ 'u \fBset\fR [\fB\-h\fR] [\fIvarname\fR] [\fIvarvalue\fR] .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBDescription\fR .RS 4 .PP The \fBset\fR command displays or modifies the values of configuration variables\&. .PP If you call \fBset\fR without any arguments, it will display a list of all configuration variables with their current values\&. .PP If you call \fBset\fR with one argument, it will display the value of this particular variable\&. .PP If you call \fBset\fR with two arguments, it will set the variable (first argument) to the new value (second argument)\&. To specify an empty value, use two quotation marks like this:""\&. .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBNote\fR .ps -1 .br .PP For obvious reasons, \fBset\fR will never display the current password although you can certainly change the password with this command\&. To make sure no one else sees the new password that you enter, run the command \fBset passwd *\fR\&. You will then be asked to enter a password which will not be echoed on the screen\&. .PP This command is not available in batch mode, use the command line switches instead\&. In the interactive mode, the changes to the configuration variables are limited to the current session\&. If you want to change the values permanently, you should rather edit one of the configuration files\&. .sp .5v .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBOptions\fR .RS 4 .PP \fB\-h\fR .RS 4 Displays a help message explaining the \fBset\fR command\&. .RE .PP \fIvarname\fR .RS 4 The name of the variable whose value should be displayed or set\&. .RE .PP \fIvarvalue\fR .RS 4 The new value of the variable to be set\&. .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBExample\fR .RS 4 .sp .if n \{\ .RS 4 .\} .nf refdbc: \fBset timeout 90\fR .fi .if n \{\ .RE .\} .PP This command will set the timeout to 90 seconds for the current session\&. .RE .SS "updatejo" .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBSynopsis\fR .RS 4 .HP \w'\fBupdatejo\fR\ 'u \fBupdatejo\fR [\fB\-d\fR\ \fIdatabase\fR] [\fB\-h\fR] [[\fB\-c\fR\ \fIcommand\fR] | [\fB\-o\fR\ \fIoutfile\fR] | [\fB\-O\fR\ \fIoutfile\fR]] {:XY:=\fIname\fR} {:XY:=\fIname\fR...} .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBDescription\fR .RS 4 .PP Updates the list of synonyms of a particular periodical\&. .PP Each periodical can have up to four synonymous names\&. The full name and an official abbreviation (e\&.g\&. according to the Index Medicus for biomedical publications) should always be supplied if available\&. In addition, refdb can store up to two user\-defined abbreviations which may serve as shorthands when adding datasets\&. .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBOptions\fR .RS 4 .PP \fB\-c\fR \fIcommand\fR .RS 4 Pipe the output through \fIcommand\fR\&. .RE .PP \fB\-d\fR \fIdatabase\fR .RS 4 Specify the database\&. .RE .PP \fB\-h\fR .RS 4 Display a help message explaining the command\&. .RE .PP \fB\-o\fR \fIfilename\fR .RS 4 Write the output to filename instead of to stdout\&. .RE .PP \fB\-O\fR \fIfilename\fR .RS 4 Append the output to filename instead of sending it to stdout\&. .RE .PP \fI:XY:=\fR\fIname\fR .RS 4 XY stands for one of JF, JO, J1, or J2 which denote the full name, the abbreviated name, and the user abbreviations 1 and 2, respectively\&. You have to supply at least two of these items\&. The first one selects the periodical by one of its existing names in the database\&. All other items update or add the names as provided\&. .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBExample\fR .RS 4 .sp .if n \{\ .RS 4 .\} .nf refdbc: \fBupdatejo :JO:="J\&.Biol\&.Chem\&." :JF:="The Journal of Biological Chemistry"\fR .fi .if n \{\ .RE .\} .PP Adds (or changes) the full name of the periodical known by its official abbreviation as "J\&.Biol\&.Chem\&." to read "The Journal of Biological Chemistry"\&. .RE .SS "updatenote" .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBSynopsis\fR .RS 4 .HP \w'\fBupdatenote\fR\ 'u \fBupdatenote\fR [\fB\-d\fR\ \fIdatabase\fR] [\fB\-E\fR\ \fIencoding\fR] [\fB\-h\fR] [[\fB\-c\fR\ \fIcommand\fR] | [\fB\-o\fR\ \fIoutfile\fR] | [\fB\-O\fR\ \fIoutfile\fR]] [\fIfile\fR...] .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBDescription\fR .RS 4 .PP Updates the extended notes in \fIfile\fR in the current database\&. .PP This command is essentially the same as addnote, but it uses the citekey or id attributes (in this order) to update an existing note in the database\&. If the specified note does not exist in the database, a new one will be created\&. .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBOptions\fR .RS 4 .PP \fB\-c\fR \fIcommand\fR .RS 4 Pipe the output through \fIcommand\fR\&. .RE .PP \fB\-d\fR \fIdatabase\fR .RS 4 Specify the database\&. .RE .PP \fB\-E\fR \fIencoding\fR .RS 4 Select the character encoding for the input data if it is different from the default UTF\-8\&. .RE .PP \fB\-h\fR .RS 4 Display a help message explaining the command\&. .RE .PP \fB\-o\fR \fIfilename\fR .RS 4 Write the output to filename instead of to stdout\&. .RE .PP \fB\-O\fR \fIfilename\fR .RS 4 Append the output to filename instead of sending it to stdout\&. .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBExample\fR .RS 4 .sp .if n \{\ .RS 4 .\} .nf refdbc: \fBupdatenote foo\&.xml\fR .fi .if n \{\ .RE .\} .PP This command will update the extended notes in foo\&.ris in the currently selected database\&. If the notes do not specify a date, refdbd will insert a timestamp automatically\&. .RE .SS "updateref" .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBSynopsis\fR .RS 4 .HP \w'\fBupdateref\fR\ 'u \fBupdateref\fR [\fB\-d\fR\ \fIdatabase\fR] [\fB\-E\fR\ \fIencoding\fR] [\fB\-h\fR] [[\fB\-c\fR\ \fIcommand\fR] | [\fB\-o\fR\ \fIoutfile\fR] | [\fB\-O\fR\ \fIoutfile\fR]] [\fB\-t\fR\ \fItype\fR] [\fB\-P\fR] [\fB\-U\fR\ \fIusername\fR] [\fIfile\fR] .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBDescription\fR .RS 4 .PP Updates the references in RIS format in \fIfile\fR in the current database\&. .PP This command is essentially the same as addref, but it uses the ID fields in the input data to update existing references with the same ID\&. If the ID of a reference is not existent in the database, a new entry is created, ignoring the ID specified in the RIS or risx file\&. Currently refdb does not check whether the new dataset has any similarity with the old one having the same ID\&. If you tell refdb to update a reference, it uses whatever you send to this end\&. .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBOptions\fR .RS 4 .PP \fB\-c\fR \fIcommand\fR .RS 4 Pipe the output through \fIcommand\fR\&. .RE .PP \fB\-d\fR \fIdatabase\fR .RS 4 Specify the database\&. .RE .PP \fB\-E\fR \fIencoding\fR .RS 4 Select the character encoding for the input data if it is different from the default setting\&. RIS datasets can use any encoding that your local libiconv supports (see \fBman iconv_open\fR for a list of available encodings), except UTF\-16 and UTF\-32\&. RISX datasets carry the encoding in the processing instructions, therefore this option is not needed and ignored\&. .RE .PP \fB\-h\fR .RS 4 Display a help message explaining the command\&. .RE .PP \fB\-o\fR \fIfilename\fR .RS 4 Write the output to filename instead of to stdout\&. .RE .PP \fB\-O\fR \fIfilename\fR .RS 4 Append the output to filename instead of sending it to stdout\&. .RE .PP \fB\-t\fR \fItype\fR .RS 4 Select the input data type\&. Possible values are "ris" (default) and "risx"\&. Other data types have to be converted to one of these types before adding them to the database\&. .RE .PP \fB\-P\fR .RS 4 Update only the personal information for this reference, i\&.e\&. the N1 (notes), RP (reprint status), and AV (availability) fields\&. This will automatically add the reference to your personal reference list\&. All other fields will be ignored\&. Combine this option with the \fB\-g\fR option e\&.g\&. to quickly change the reprint status of existing references to \(lqIN FILE\(rq from \(lqNOT IN FILE\(rq or from \(lqON REQUEST\(rq\&. .RE .PP \fB\-U\fR \fIusername\fR .RS 4 Provide a different username than that of the current user, so e\&.g\&. some technician or administrative staff can add references in behalf of a researcher\&. .RE .PP \fIfile\fR .RS 4 All other command\-line arguments will be interpreted as filenames to read references from\&. If no filenames are specified, the data will be read from stdin\&. .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBExample\fR .RS 4 .sp .if n \{\ .RS 4 .\} .nf refdbc: \fBupdateref \-P foo\&.ris\fR .fi .if n \{\ .RE .\} .PP This command will update the references in foo\&.ris in the previously selected active database\&. Only the personal information (AV, N1, RP) will be added or modified for the current user\&. .RE .SS "verbose" .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBSynopsis\fR .RS 4 .HP \w'\fBverbose\fR\ 'u \fBverbose\fR [\fB\-h\fR] .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBDescription\fR .RS 4 .PP Toggles the verbose mode on or off\&. If the verbose mode is on, the error messages and warnings may be some more comprehensible\&. .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBOptions\fR .RS 4 .PP \fB\-h\fR .RS 4 Displays a help message explaining the \fBverbose\fR command\&. .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBExample\fR .RS 4 .sp .if n \{\ .RS 4 .\} .nf refdbc: \fBverbose\fR .fi .if n \{\ .RE .\} .PP Depending on the previous value, this command will either turn the verbose mode on or off\&. .RE .SS "whichdb" .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBSynopsis\fR .RS 4 .HP \w'\fBwhichdb\fR\ 'u \fBwhichdb\fR [\fB\-h\fR] .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBDescription\fR .RS 4 .PP Displays a plethora of information about the currently selected database\&. .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBOptions\fR .RS 4 .PP \fB\-h\fR .RS 4 Displays a help message explaining the \fBwhichdb\fR command\&. .RE .RE .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBExample\fR .RS 4 .sp .if n \{\ .RS 4 .\} .nf refdbc: \fBwhichdb\fR .fi .if n \{\ .RE .\} .PP This will print the information about the active database\&. Refer to the \fBselectdb\fR command for information how to change the active database\&. The \fBwhichdb\fR output looks like this: .sp .if n \{\ .RS 4 .\} .nf Current database: alltypes Number of references: 45 Highest reference ID: 45 Number of notes: 2 Highest note ID: 2 Encoding: ISO\-8859\-1 Database type: risx Server type: pgsql Created: 2003\-12\-24 22:27:43 UTC Using refdb version: 0\&.9\&.4\-pre2 Last modified: 2003\-12\-24 22:29:05 UTC .fi .if n \{\ .RE .\} .RE .SH "FILES" .PP PREFIX/etc/refdb/refdbcrc .RS 4 The global configuration file of refdbc\&. .RE .PP $HOME/\&.refdbcrc .RS 4 The user configuration file of refdbc\&. .RE .SH "SEE ALSO" .PP \fBRefDB\fR (7), \fBrefdbd\fR (1), \fBrefdba\fR (1)\&. .PP \fIRefDB manual (local copy) \fR PREFIX/share/doc/refdb\-/refdb\-manual/index\&.html .PP \fIRefDB manual (web) \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/manual/index\&.html\fR\m[]> .PP \fIRefDB on the web \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/\fR\m[]> .SH "AUTHOR" .PP refdbc was written by Markus Hoenicka \&. refdb-1.0.2/man/refdbib.1000644 001750 001750 00000040662 12255422777 015721 0ustar00markusmarkus000000 000000 '\" t .\" Title: refdbib .\" Author: [see the "Author" section] .\" Generator: DocBook XSL Stylesheets v1.76.1 .\" Date: 2005-10-15 .\" Manual: RefDB Manual .\" Source: RefDB Manual .\" Language: English .\" .TH "REFDBIB" "1" "2005\-10\-15" "RefDB Manual" "RefDB Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" refdbib \- the bibliography client of RefDB .SH "SYNOPSIS" .HP \w'\fBrefdbib\fR\ 'u \fBrefdbib\fR [\fB\-d\fR\ \fIdatabase\fR] [\fB\-D\fR\ \fIstylespec\-directory\fR] [\fB\-e\fR\ \fIlog\-destination\fR] [\fB\-E\fR\ \fIencoding\fR] [\fB\-f\fR\ \fIstdin\fR] [\fB\-h\fR] [\fB\-i\fR\ \fIIP\-address\fR] [\fB\-l\fR\ \fIlog\-level\fR] [\fB\-L\fR\ \fIlog\-file\fR] [\fB\-m\fR] [\fB\-N\fR\ \fInumber\fR] [\fB\-p\fR\ \fIport\fR] [\fB\-q\fR] [\fB\-r\fR] [\fB\-S\fR\ \fIstyle\fR] [\fB\-t\fR\ \fIoutput\-type\fR] [\fB\-T\fR\ \fItime\fR] [\fB\-u\fR\ \fIname\fR] [\fB\-v\fR] [\fB\-V\fR] [\fB\-w\fR\ \fIpassword\fR] [\fB\-x\fR] [\fB\-y\fR\ \fIconfdir\fR] \fIfilename\fR .SH "DESCRIPTION" .PP refdbib is a command\-line client to generate bibliographies with RefDB(7)\&. refdbib reads the contents of \fIfilename\fR, which contains a list of citations as an XML document according to \fIcitationlistx\&.dtd\fR, and sends a bibliography in the requested format to stdout\&. If no input file is specified, refdbib tries to read the data from stdin\&. Unless suppressed, it also writes a style specification file (either a DSSSL or an XSLT stylesheet) and a CSS stylesheet for HTML output to your disk\&. .PP refdbib is a low\-level tool\&. It is advisable to use one of the wrappers shipped with RefDB\&. runbib(1) is a shell script which creates the list of citations, runs refdbib on this list, and transforms the document\&. refdbnd(1) is a Makefile\-based system that encapsulates the bibliography generation and document transformation conveniently\&. .PP This man page describes only the startup options of refdbib\&. Please consult the RefDB manual (see below) for a description of the input and output formats, as well as for post\-processing instructions that are required for some output types\&. .SH "OPTIONS" .PP \fB\-d\fR \fIdatabase\fR .RS 4 The name of the default database\&. You can change the database anytime during an interactive session\&. .RE .PP \fB\-D\fR \fIstylespec\-directory\fR .RS 4 Specify either a full path or \&. to use the current working directory for the output of the style specification and CSS files\&. The latter case is what you usually want if you run refdbib from the directory where your LaTeX or SMGL/XML document is stored\&. This is also the default if you do not specify a directory at all\&. .RE .PP \fB\-e\fR \fIlog\-destination\fR .RS 4 log\-destination can have the values 0, 1, or 2, or the equivalent strings \fIstderr\fR, \fIsyslog\fR, or \fIfile\fR, respectively\&. This value specifies where the log information goes to\&. 0 (zero) means the messages are sent to stderr\&. They are immediately available on the screen but they may interfere with command output\&. 1 will send the output to the syslog facility\&. Keep in mind that syslog must be configured to accept log messages from user programs, see the syslog(8) man page for further information\&. Unix\-like systems usually save these messages in /var/log/user\&.log\&. 2 will send the messages to a custom log file which can be specified with the \fB\-L\fR option\&. .RE .PP \fB\-E\fR \fIencoding\fR .RS 4 Select an output character encoding\&. If this option is not used, the bibliography data will use the character encoding of the database\&. See iconv_open(3) for a list of available encodings\&. .RE .PP \fB\-f\fR \fIstdin\fR .RS 4 This is a crutch to make reading data from stdin possible on platforms that do not allow automatic detection of data on stdin, like Windows/Cygwin\&. On other platforms, refdbib automatically reads data from stdin if data are available\&. .RE .PP \fB\-h\fR .RS 4 Displays help and usage screen, then exits\&. .RE .PP \fB\-i\fR \fIIP\-address\fR .RS 4 Set the IP address of the box which is running the application server refdbd(1)\&. Instead of the IP address you can also specify the hostname as long as it can be properly resolved by your system\&. .RE .PP \fB\-l\fR \fIlog\-level\fR .RS 4 Specify the priority up to which events are logged\&. This is either a number between 0 and 7 or one of the strings \fIemerg\fR, \fIalert\fR, \fIcrit\fR, \fIerr\fR, \fIwarning\fR, \fInotice\fR, \fIinfo\fR, \fIdebug\fR, respectively (see also Log level definitions)\&. \fB\-1\fR disables logging completely\&. A low log level like 0 means that only the most critical messages are logged\&. A higher log level means that less critical events are logged as well\&. 7 will include debug messages\&. The latter can be verbose and abundant, so you want to avoid this log level unless you need to track down problems\&. .RE .PP \fB\-L\fR \fIlog\-file\fR .RS 4 Specify the full path to a log file that will receive the log messages\&. Typically this would be /var/log/refdba\&. .RE .PP \fB\-m\fR .RS 4 This switch turns errors caused by missing references (i\&.e\&. cited but not available in the database) into warnings, causing refdbib to return 0 instead of an error code\&. .RE .PP \fB\-N\fR \fInumber\fR .RS 4 Use this option to specify where the numbering of the references is supposed to start\&. The default is 1\&. This option comes in handy if you need to cobble together composite bibliographies or per\-chapter bibliographies that still need to be numbered consecutively\&. .RE .PP \fB\-p\fR \fIport\fR .RS 4 Set the port of the box which is running the application server\&. .RE .PP \fB\-q\fR .RS 4 Start without reading the configuration files\&. The client will use the compile\-time defaults for all values that you do not set with command\-line switches\&. .RE .PP \fB\-r\fR .RS 4 Use this option to request a raw instead of a cooked bibliography\&. Raw bibliographies are not formatted in any way and are processed with the standard DocBook or TEI stylesheets instead of with the RefDB driver files\&. .RE .PP \fB\-S\fR \fIstyle\fR .RS 4 Specifies the bibliography style\&. This controls the formatting of the bibliography and the in\-text citations when the document is processed\&. .RE .PP \fB\-t\fR \fIoutput\-type\fR .RS 4 Select the output type\&. Use \fIdb31\fR to generate DocBook SGML bibliographies, \fIdb31x\fR for DocBook XML bibliographies (DTD\-based, up to 4\&.3), \fIdb50x\fR for Docbook V5 XML bibliographies (schema\-based), \fIteix\fR for TEI P4 XML bibliographies, \fItei5x\fR for TEI P5 XML bibliographies, \fIbibtex\fR for BibTeX bibliographies, and \fIrtf\fR for RTF bibliographies\&. The type of output also determines the type of style specification file, if any, that will be generated in addition to the bibliography for formatting purposes\&. This is only a matter of concern if you want to process a DocBook XML document with the DSSSL stylesheets: In this case you should use \fIdb31\fR with this option\&. The SGML bibliography element is also a valid XML element, but you will get a DSSSL driver file instead of a XSL driver file when you use \fIdb31x\fR\&. .sp Note: In the current implementation, the \fB\-t\fR \fIteix\fR option will also return a DocBook bibliography which needs to be transformed to a TEI bibliography with the \fIbibdb2tei\&.xsl\fR stylesheet\&. The \fB\-t\fR \fItei5x\fR option creates a directly usable TEI bibliography\&. .RE .PP \fB\-T\fR \fItime\fR .RS 4 Set the timeout for client/application server dialogue in seconds\&. A connection with unsuccessful read or write attempts will be considered as dead and taken down after this amount of time has elapsed\&. .RE .PP \fB\-u\fR \fIname\fR .RS 4 Set the username for the database access\&. Note: This username need not be identical to the login name of the user\&. This is the username required to access the database server\&. .RE .PP \fB\-v\fR .RS 4 Prints version and copyright information, then exits\&. .RE .PP \fB\-V\fR .RS 4 Switches to verbose mode\&. .RE .PP \fB\-w\fR \fIpassword\fR .RS 4 Set the password for the database access\&. Note: This password need not be identical to the login password of the user\&. This is the password required to access the database server\&. .RE .PP \fB\-x\fR .RS 4 Send passwords unencrypted\&. .RE .PP \fB\-y\fR \fIconfdir\fR .RS 4 Specify the directory where the global configuration files are Note: By default, all RefDB applications look for their configuration files in a directory that is specified during the configure step when building the package\&. That is, you don\*(Aqt need the \fB\-y\fR option unless you use precompiled binaries in unusual locations, e\&.g\&. by relocating a rpm package\&. .RE .SH "DIAGNOSTICS" .PP The exit code is 0 if all went fine\&. It will be 1 if the command returned an error, or if there was a general error condition during startup like a lack of available memory\&. .SH "CONFIGURATION" .PP refdbib evaluates the refdbibrc configuration file at startup to initialize itself\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&1.\ \&refdbibrc .TS allbox tab(:); lB lB lB. T{ Variable T}:T{ Default T}:T{ Comment T} .T& l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l. T{ refdblib T}:T{ (none) T}:T{ The path of a directory containing shareable files like DTDs, HTML templates etc\&. T} T{ defaultdb T}:T{ (none) T}:T{ The default database\&. refdbib will use this database unless you specify the databases in the citation elements of your documents\&. T} T{ pager T}:T{ stdout T}:T{ The command line of a pager that accepts the output of refdb on stdin to allow scrolling and other nifty things\&. \(lqstdout\(rq sends the data to stdout\&. T} T{ passwd T}:T{ * T}:T{ The password which is used for authentication with the database server\&. It is potentially evil to store unencrypted passwords in disk files\&. At least make sure that the init file is not readable for anyone else\&. The default setting causes refdbib to ask for your password interactively\&. T} T{ port T}:T{ 9734 T}:T{ The port on which refdbd listens\&. Change this for all clients and the server if this value interferes with another program using this port\&. T} T{ serverip T}:T{ 127\&.0\&.0\&.1 T}:T{ The IP address or hostname of the machine where refdbd runs\&. Use the default (localhost) address if the clients and refdbd run on the same machine\&. T} T{ timeout T}:T{ 180 T}:T{ The timeout in seconds\&. After this time has elapsed, a stalled connection is taken down\&. Increase this value if you encounter frequent timeout errors due to high network traffic or refdbs overload\&. T} T{ username T}:T{ login name T}:T{ The username which is used for authentication with the database server\&. This may be different from the login name of the user\&. T} T{ verbose T}:T{ f T}:T{ Set this to t if you prefer verbose error messages\&. T} T{ logfile T}:T{ /var/log/refdbib\&.log T}:T{ The full path of a custom log file\&. This is used only if logdest is set appropriately\&. T} T{ logdest T}:T{ 1 T}:T{ The destination of the log information\&. 0 = print to stderr; 1 = use the syslog facility; 2 = use a custom logfile\&. The latter needs a proper setting of logfile\&. T} T{ loglevel T}:T{ 6 T}:T{ The log level up to which messages will be sent\&. A low setting (0) allows only the most important messages, a high setting (7) allows all messages including debug messages\&. \-1 means nothing will be logged\&. T} T{ outtype T}:T{ db31 T}:T{ The type of output generated\&. Use \fIdb31\fR for DocBook SGML bibliographies, \fIdb31x\fR for DocBook XML bibliographies, \fIteix\fR for TEI XML bibliographies, and \fIbibtex\fR for BibTeX bibliographies\&. T} T{ outformat T}:T{ (none) T}:T{ The bibliographic style to be used for the output\&. This is the name of a style as it was previously added to the database\&. T} T{ stylespecdir T}:T{ \&. T}:T{ A path to a directory (including the trailing directory separator) that will receive the stylesheet driver files\&. The default setting will direct the driver files to the current working directory that most likely contains the input files\&. It should rarely be necessary to use a different setting\&. T} T{ startnumber T}:T{ 1 T}:T{ The number where the reference numbering starts at\&. This option is mostly useful for compiling advanced bibliographies or for C boneheads who insist that counting starts at zero\&. T} T{ toencoding T}:T{ (the database encoding) T}:T{ The character encoding for the bibliography output\&. If this is not specified, the data will use the same encoding as the database\&. T} T{ ignore_missing T}:T{ f T}:T{ If this is set to "f", missing references (i\&.e\&. cited but not in the database) will throw an error\&. If set to "t", you\*(Aqll get a warning but missing references will not cause refdbib to return an error\&. T} T{ no_encrypt T}:T{ f T}:T{ If set to \*(Aqt\*(Aq, passwords are transmitted unencrypted\&. The default is to encrypt passwords\&. T} .TE .sp 1 .SH "EXAMPLES" .PP The first example shows how to create a DocBook SGML bibliography file\&. .sp .if n \{\ .RS 4 .\} .nf $~ \fBrefdbib \-d myrefs \-S "Br\&.J\&.Pharmacol\&." \-t db31 \-D "\&." mypaper\&.id\&.xml > mypaper\&.bib\&.sgml\fR .fi .if n \{\ .RE .\} .PP This command will use the database \(lqmyrefs\(rq to retrieve the references defined in mypaper\&.id\&.xml\&. They will be formatted according to the bibliography style called \(lqBr\&.J\&.Pharmacol\&.\(rq and will be redirected into the bibliography file mypaper\&.bib\&.sgml\&. The DSSSL driver file (it will be automatically named after the bibliography style, that is Br\&.J\&.Pharmacol\&.dsl) will be stored in the current working directory\&. .PP The second example shows how to create the BibTeX bibliography from your LaTeX document (it is assumed that you ran \fBlatex\fR at least once before this command\&. .sp .if n \{\ .RS 4 .\} .nf $~ \fBrefdbib \-d myrefs \-S "name" \-t bibtex mypaper\&.aux > mypaper\&.bib\fR .fi .if n \{\ .RE .\} .PP This command will use the database \(lqmyrefs\(rq to retrieve the references defined in mypaper\&.aux\&. The intermediate bibliography database will be stored in mypaper\&.bib and will serve as an input file for \fBbibtex\fR\&. .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBNote\fR .ps -1 .br .PP For the sake of consistency with \fBbibtex\fR, it is possible to specify the auxiliary file without the \&.aux extension (mypaper in the above example)\&. .sp .5v .RE .PP If you are working on a long document that cites the same references over and over again, it may be prudent to preprocess the \&.aux file in order to eliminate duplicates (duplicates do not confuse \fBbibtex\fR but they waste space): .sp .if n \{\ .RS 4 .\} .nf $~ \fBsort mypaper\&.aux | uniq | refdbib \-d myrefs \-S "name" \-t bibtex > mypaper\&.bib\fR .fi .if n \{\ .RE .\} .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBNote\fR .ps -1 .br .PP The runbib script does exactly this kind of preprocessing automatically\&. .sp .5v .RE .SH "FILES" .PP PREFIX/etc/refdb/refdbibrc .RS 4 The global configuration file of refdbib\&. .RE .PP \fI$HOME/\&.refdbibrc\fR .RS 4 The user configuration file of refdbib\&. .RE .SH "SEE ALSO" .PP \fBRefDB\fR (7), \fBrefdbd\fR (1), \fBrunbib\fR (1), \fBrefdbnd\fR (1), \fBrefdba\fR (1), \fBrefdbc\fR (1)\&. .PP \fIRefDB manual (local copy) \fR PREFIX/share/doc/refdb\-/refdb\-manual/index\&.html .PP \fIRefDB manual (web) \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/manual/index\&.html\fR\m[]> .PP \fIRefDB on the web \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/\fR\m[]> .SH "AUTHOR" .PP refdbib was written by Markus Hoenicka \&. refdb-1.0.2/man/bib2ris.1000644 001750 001750 00000036104 12255422766 015652 0ustar00markusmarkus000000 000000 '\" t .\" Title: bib2ris .\" Author: [see the "Author" section] .\" Generator: DocBook XSL Stylesheets v1.76.1 .\" Date: 2005-10-16 .\" Manual: RefDB Manual .\" Source: RefDB Manual .\" Language: English .\" .TH "BIB2RIS" "1" "2005\-10\-16" "RefDB Manual" "RefDB Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" bib2ris, bib2ris-utf8 \- converts bibtex bibliographic data to the RIS format .SH "SYNOPSIS" .HP \w'\fBbib2ris\fR\ 'u \fBbib2ris\fR [\-e\ \fIlog\-destination\fR] [\-h] [\-j] [\-l\ \fIlog\-level\fR] [\-L\ \fIlog\-file\fR] [\-q] [\-s\ \fIseparator\fR] [\-v] [\-y\ \fIconfdir\fR] \fIfile\fR .HP \w'\fBbib2ris\-utf8\fR\ 'u \fBbib2ris\-utf8\fR [\-e\ \fIlog\-destination\fR] [\-h] [\-j] [\-l\ \fIlog\-level\fR] [\-L\ \fIlog\-file\fR] [\-q] [\-s\ \fIseparator\fR] [\-v] [\-y\ \fIconfdir\fR] \fIfile\fR .SH "DESCRIPTION" .PP bib2ris converts BibTeX bibliography files into RIS files\&. Latex commands, including non\-ASCII characters written as commands, are preserved in the output\&. Importing the output of the bib2ris utility directly into RefDB is useful only if you use the data exclusively for LaTeX\&. .PP bib2ris\-utf8 is a variant which converts foreign characters to UTF\-8 and strips all other LaTeX commands by means of the refdb_latex2utf8txt (1) tool\&. The output of bib2ris\-utf8 is the preferred format for import into RefDB as it is suitable for both LaTeX and SGML/XML bibliographies\&. .PP Unfortunately the concepts underlying BibTeX and RIS bibliographic data are quite different so that BibTeX data do not readily lend themselves to a clean conversion to the RIS format\&. This is not meant as an excuse to provide a bad filter but you should be aware that a few compile\-time assumptions have to be made in order to get reasonable results\&. In any case, as the data models differ considerably, a loss\-free round\-trip conversion between the two data types is not possible: If you convert a BibTeX bibliography file to RIS and then back, the result will differ considerably from your input\&. .PP The following considerations apply to the data import into RefDB and the data export from RefDB: .sp .RS 4 .ie n \{\ \h'-04' 1.\h'+01'\c .\} .el \{\ .sp -1 .IP " 1." 4.2 .\} BibTeX input data that are not written in UTF\-8, that use formatting commands like font name, weight, or posture specifications, or that use LaTeX commands to write foreign and special characters should always be converted with bib2ris\-utf8\&. .RE .sp .RS 4 .ie n \{\ \h'-04' 2.\h'+01'\c .\} .el \{\ .sp -1 .IP " 2." 4.2 .\} BibTeX output data will have the LaTeX command characters properly escaped\&. The data will use the default encoding of your reference database unless you specifically request a different encoding with the getref command or with the refdbib tool\&. Keep in mind that recent LaTeX installations can work with UTF\-8 data using the following incantation in the prolog, allowing the easiest support for all kinds of foreign characters: .sp .if n \{\ .RS 4 .\} .nf \eusepackage[utf8]{inputenc} .fi .if n \{\ .RE .\} .RE .SH "OPTIONS" .PP \fB\-e\fR \fIlog\-destination\fR .RS 4 log\-destination can have the values 0, 1, or 2, or the equivalent strings \fIstderr\fR, \fIsyslog\fR, or \fIfile\fR, respectively\&. This value specifies where the log information goes to\&. 0 (zero) means the messages are sent to stderr\&. They are immediately available on the screen but they may interfere with command output\&. 1 will send the output to the syslog facility\&. Keep in mind that syslog must be configured to accept log messages from user programs, see the syslog(8) man page for further information\&. Unix\-like systems usually save these messages in /var/log/user\&.log\&. 2 will send the messages to a custom log file which can be specified with the \fB\-L\fR option\&. .RE .PP \fB\-h\fR .RS 4 Displays help and usage screen, then exits\&. .RE .PP \fB\-j\fR .RS 4 Force bib2ris to use \fBJO\fR RIS fields in all cases\&. If this option is not used, bib2ris tries to infer whether a journal name is an abbreviation or not\&. If the string contains at least one period, \fBJO\fR will be used, otherwise \fBJF\fR will be used\&. .RE .PP \fB\-l\fR \fIlog\-level\fR .RS 4 Specify the priority up to which events are logged\&. This is either a number between 0 and 7 or one of the strings \fIemerg\fR, \fIalert\fR, \fIcrit\fR, \fIerr\fR, \fIwarning\fR, \fInotice\fR, \fIinfo\fR, \fIdebug\fR, respectively (see also Log level definitions)\&. \fB\-1\fR disables logging completely\&. A low log level like 0 means that only the most critical messages are logged\&. A higher log level means that less critical events are logged as well\&. 7 will include debug messages\&. The latter can be verbose and abundant, so you want to avoid this log level unless you need to track down problems\&. .RE .PP \fB\-L\fR \fIlog\-file\fR .RS 4 Specify the full path to a log file that will receive the log messages\&. Typically this would be /var/log/refdba\&. .RE .PP \fB\-q\fR .RS 4 Start without reading the configuration files\&. The client will use the compile\-time defaults for all values that you do not set with command\-line switches\&. .RE .PP \fB\-s\fR \fIseparator\fR .RS 4 Specify the delimiter which separates individual keywords in a non\-standard keyword field\&. Use the string \fBspc\fR for whitespace\-separated lists (spaces and tabs)\&. .RE .PP \fB\-v\fR .RS 4 Prints version and copyright information, then exits\&. .RE .PP \fB\-y\fR \fIconfdir\fR .RS 4 Specify the directory where the global configuration files are Note: By default, all RefDB applications look for their configuration files in a directory that is specified during the configure step when building the package\&. That is, you don\*(Aqt need the \fB\-y\fR option unless you use precompiled binaries in unusual locations, e\&.g\&. by relocating a rpm package\&. .RE .PP \fIfile\fR .RS 4 If used, this parameter denotes the names of one or more bibtex files\&. If no file is specified, bib2ris tries to read the data from stdin\&. Output is always sent to stdout\&. .RE .SH "DIAGNOSTICS" .PP The exit code of \fBbib2ris\fR indicates what went wrong in general (the details can be found in the log output)\&. The code is the sum of the following error values: .PP \fI1\fR .RS 4 general error; includes out of memory situations and invalid command\-line options .RE .PP \fI2\fR .RS 4 incomplete entry (at least one essential field in an entry was missing) .RE .PP \fI4\fR .RS 4 unknown field name .RE .PP \fI8\fR .RS 4 unknown publication type .RE .PP \fI16\fR .RS 4 invalid BibTeX\->RIS type mapping .RE .PP \fI32\fR .RS 4 parse error; includes file access errors .RE .SH "CONFIGURATION" .PP \fBbib2ris\fR evaluates the file bib2risrc to initialize itself\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&1.\ \&bib2risrc .TS allbox tab(:); lB lB lB. T{ Variable T}:T{ Default T}:T{ Comment T} .T& l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l. T{ logfile T}:T{ /var/log/bib2ris\&.log T}:T{ The full path of a custom log file\&. This is used only if logdest is set appropriately\&. T} T{ logdest T}:T{ 1 T}:T{ The destination of the log information\&. 0 = print to stderr; 1 = use the syslog facility; 2 = use a custom logfile\&. The latter needs a proper setting of logfile\&. T} T{ loglevel T}:T{ 6 T}:T{ The log level up to which messages will be sent\&. A low setting (0) allows only the most important messages, a high setting (7) allows all messages including debug messages\&. \-1 means nothing will be logged\&. T} T{ abbrevfirst T}:T{ t T}:T{ If this option is set to "t", the first names of all authors and editors will be abbreviated to the initials\&. If set to "f", the first names will be used as they are found in the BibTeX bibliography file\&. T} T{ listsep T}:T{ ; T}:T{ This is the delimiter which separates individual keywords in a non\-standard keyword field\&. Use the string "spc" for whitespace\-separated lists (spaces and tabs)\&. T} T{ forcejabbrev T}:T{ f T}:T{ If this is set to "t", journal names will be wrapped in RIS "JO" entries\&. If it is set to "f", bib2ris will use "JO" entries only if the journal name contains at least one period, otherwise it will use "JF"\&. T} T{ maparticle T}:T{ JOUR T}:T{ map the BibTeX article publication type to a RIS type T} T{ mapbook T}:T{ BOOK T}:T{ map the BibTeX book publication type to a RIS type T} T{ mapbooklet T}:T{ PAMP T}:T{ map the BibTeX booklet publication type to a RIS type T} T{ mapconference T}:T{ CHAP T}:T{ map the BibTeX conference publication type to a RIS type T} T{ mapinbook T}:T{ CHAP T}:T{ map the BibTeX inbook publication type to a RIS type T} T{ mapincollection T}:T{ CHAP T}:T{ map the BibTeX incollection publication type to a RIS type T} T{ mapinproceedings T}:T{ CHAP T}:T{ map the BibTeX inproceedings publication type to a RIS type T} T{ mapmanual T}:T{ BOOK T}:T{ map the BibTeX manual publication type to a RIS type T} T{ mapmastersthesis T}:T{ THES T}:T{ map the BibTeX mastersthesis publication type to a RIS type T} T{ mapmisc T}:T{ GEN T}:T{ map the BibTeX misc publication type to a RIS type T} T{ mapphdthesis T}:T{ THES T}:T{ map the BibTeX phdthesis publication type to a RIS type T} T{ mapproceedings T}:T{ CONF T}:T{ map the BibTeX proceedings publication type to a RIS type T} T{ maptechreport T}:T{ RPRT T}:T{ map the BibTeX techreport publication type to a RIS type T} T{ mapunpublished T}:T{ UNPB T}:T{ map the BibTeX unpublished publication type to a RIS type T} T{ nsf_xyz T}:T{ (none) T}:T{ You can specify an unlimited number of these entries to map non\-standard BibTeX fields to RIS tags\&. The BibTeX field name in this variable has to be in lowercase, regardless of the case in your input data (bib2ris treats field names as case\-insensitive)\&. The two\-letter RIS tag has to be in uppercase\&. E\&.g\&. to map your BibTeX "Abstract" field to the RIS "N2" tag, the entry would read: "nsf_abstract N2"\&. T} .TE .sp 1 .SH "DATA PROCESSING" .PP This section provides a few hints about the data conversion itself and the BibTeX format requirements\&. .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} The parsing of the input data is done by the btparse library\&. All limitations of that library apply to bib2ris as well\&. This applies very specifically to two hardcoded settings in btparse which, simply put, limit the size and complexity (in terms of macros) of an input file that btparse can handle\&. If you run into this kind of problem (I had to pull a 2\ \&MB BibTeX bibliography from the net in order to verify this limit) you should increase the values of \fINUM_MACROS\fR and \fISTRING_SIZE\fR in the source file macros\&.c and recompile the btparse library\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} All entry names and field names in the BibTeX input file are treated as case\-insensitive, i\&.e\&. "BoOk" is the same as "book" and "AUTHOR" is the same as "aUthoR"\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} The entries are checked for completeness\&. An error is generated if an entry lacks fields which are considered essential for the particular publication type\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} Non\-standard fields can be imported in addition to the predefined BibTeX fields\&. Create an entry for each non\-standard BibTeX field name that your input data use in your bib2ris configuration file\&. The data are handled differently based on the type of RIS field they are imported to\&. If the data are imported to the RIS fields AD, N1, or N2, which basically have an unlimited size, all occurrences of these fields will be concatenated into a single AD, N1, or N2 tag line, respectively\&. If the data are mapped to the RIS KW field, the string will be tokenized based on the list separator specified in the listsep configuration variable\&. Each token will be written as a separate KW tag line\&. A special case is the RIS pseudo\-field "PY\&.day"\&. Data imported to this tag are integrated as the day part in the publication date tag line "PY" (year and month, but not day, are standard BibTeX fields and are recognized by default)\&. All other fields will be printed with their requested RIS tag\&. It is at the discretion of any RIS importing application to decide what to do with duplicate tag lines\&. Multiples are allowed for author tags (AU, A2, A3) and the keyword tag (KW)\&. refdb will use the \fIlast\fR occurrence of a tag line that does not allow multiple occurrences\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} Abbreviated journal names are detected only if they use periods\&. E\&.g\&. \(lqJ\&. Biol\&. Chem\&.\(rq will be mapped to a "JO" RIS element whereas \(lqJ Biol Chem\(rq will be (incorrectly) mapped to a "JF" element (\(lqJournal of Biological Chemistry\(rq would correctly end up here too)\&. Spaces after periods are optional\&. To capture \(lqJ Biol Chem\(rq in a "JO" element, use the \fB\-j\fR command line option or the "forcejabbrev" configuration file variable\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} The mapping of BibTeX publication types (book, inproceedings\&.\&.\&.) to RIS types as specified in the configuration file is checked for valid RIS types\&. If an invalid RIS type is specified, an error is generated and the compile\-time default is used instead\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} By default the first names of authors and editors are not abbreviated\&. If you wish you can configure \fBbib2ris\fR to abbreviate first and middle names\&. .RE .SH "FILES" .PP PREFIX/etc/refdb/bib2risrc .RS 4 The global configuration file of bib2ris\&. .RE .PP $HOME/\&.bib2risrc .RS 4 The user configuration file of bib2ris\&. .RE .SH "SEE ALSO" .PP \fBRefDB\fR (7), \fBrefdb_latex2utf8txt\fR (1), \fBdb2ris\fR (1), \fBen2ris\fR (1), \fBmarc2ris\fR (1), \fBmed2ris\fR (1)\&. .PP \fIRefDB manual (local copy) \fR PREFIX/share/doc/refdb\-/refdb\-manual/index\&.html .PP \fIRefDB manual (web) \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/manual/index\&.html\fR\m[]> .PP \fIRefDB on the web \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/\fR\m[]> .SH "AUTHOR" .PP bib2ris was written by Markus Hoenicka \&. refdb-1.0.2/man/db2ris.1000644 001750 001750 00000017626 12255422777 015515 0ustar00markusmarkus000000 000000 '\" t .\" Title: db2ris .\" Author: [see the "Author" section] .\" Generator: DocBook XSL Stylesheets v1.76.1 .\" Date: 2005-10-16 .\" Manual: RefDB Manual .\" Source: RefDB Manual .\" Language: English .\" .TH "DB2RIS" "1" "2005\-10\-16" "RefDB Manual" "RefDB Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" db2ris \- converts DocBook bibliographic data to the RIS format .SH "SYNOPSIS" .HP \w'\fBdb2ris\fR\ 'u \fBdb2ris\fR [\-a] [\-e\ \fIlog\-destination\fR] [\-h] [\-L\ \fIlog\-file\fR] [\-o\ \fIfile\fR] [\-O\ \fIfile\fR] [\-r\ \fIreftype\fR] \fIfile\fR .SH "DESCRIPTION" .PP db2ris converts DocBook bibliographic data into RIS files\&. The design and purpose of the DocBook bibliography information is too different from the RIS format to warrant a simple and straightforward conversion, let alone a bi\-directional one\&. The DocBook bibliography definition allows for a lot of freedom how to encode your information\&. To accommodate as wide a range of uses and abuses of the bibliographic elements as possible, this import filter is implemented as a DSSSL stylesheet rather than as a C application\&. This allows you to quickly change or extend the stylesheet to adapt it to your needs\&. db2ris is a wrapper script which invokes OpenJade to do the actual transformation\&. .SH "OPTIONS" .PP \fB\-a\fR .RS 4 Use full first\- and othernames if they are present in the DocBook source\&. By default, all first\- and othernames will be abbreviated\&. .RE .PP \fB\-e\fR \fIlog\-destination\fR .RS 4 log\-destination can have the values 0, 1, or 2, or the equivalent strings \fIstderr\fR, \fIsyslog\fR, or \fIfile\fR, respectively\&. This value specifies where the log information goes to\&. 0 (zero) means the messages are sent to stderr\&. They are immediately available on the screen but they may interfere with command output\&. 1 will send the output to the syslog facility\&. Keep in mind that syslog must be configured to accept log messages from user programs, see the syslog(8) man page for further information\&. Unix\-like systems usually save these messages in /var/log/user\&.log\&. 2 will send the messages to a custom log file which can be specified with the \fB\-L\fR option\&. .RE .PP \fB\-h\fR .RS 4 Displays help and usage screen, then exits\&. .RE .PP \fB\-L\fR \fIlog\-file\fR .RS 4 Specify the full path to a log file that will receive the log messages\&. Typically this would be /var/log/refdba\&. .RE .PP \fB\-o\fR \fIfile\fR .RS 4 Send output to \fIfile\fR instead of to stdout\&. If \fIfile\fR exists, its contents will be overwritten\&. .RE .PP \fB\-O\fR \fIfile\fR .RS 4 Send output to \fIfile\fR instead of to stdout\&. If \fIfile\fR exists, the output will be appended\&. .RE .PP \fB\-r\fR \fIreftype\fR .RS 4 Set the default RIS reference type\&. This type will be used if db2ris cannot infer the reference type from the \fIBiblioEntry\fR element\&. .RE .PP \fIfile\fR .RS 4 The names of one or more DocBook files\&. .RE .SH "CONFIGURATION" .PP \fBdb2ris\fR evaluates the file db2risrc to initialize itself\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&1.\ \&db2risrc .TS allbox tab(:); lB lB lB. T{ Variable T}:T{ Default T}:T{ Comment T} .T& l l l l l l l l l l l l. T{ logfile T}:T{ /var/log/db2ris\&.log T}:T{ The full path of a custom log file\&. This is used only if logdest is set appropriately\&. T} T{ logdest T}:T{ 0 T}:T{ The destination of the log information\&. 0 = print to stderr; 2 = use a custom logfile\&. The latter needs a proper setting of logfile\&. T} T{ authorlong T}:T{ f T}:T{ Set this to t if full first\- and othernames should be used if possible\&. T} T{ defaultreftype T}:T{ GEN T}:T{ The default RIS reference type will be used if a BiblioEntry element does not specify the type\&. T} .TE .sp 1 .SH "DATA PROCESSING" .PP We have to make a bunch of assumptions to arrive at a suitable output: .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} db2ris will handle only \(lqraw\(rq (as opposed to \(lqcooked\(rq) bibliographic data\&. This basically means that you must encode all bibliographic data in BiblioEntry elements, not in BiblioMixed elements\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} db2ris discards all publication date information from the PubDate except the first 4 characters of #PCDATA so these should better be a 4\-digit year\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} By default, the publication type is neither explicitly encoded in a BiblioEntry element nor can it be easily inferred\&. Therefore db2ris assumes that the BiblioEntry carry a \fIrole\fR attribute with the RIS publication type as the value\&. If the attribute is missing, a default type is used instead\&. This means that you should add these attributes before the conversion in order to get useful RIS datasets (or fix the TY entries in the RIS file afterwards)\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} DocBook does not have a special element to encode the name of a journal or magazine that published an article\&. Instead the same Title element is used as for the article title, a book title, or a series title\&. To distinguish between a journal or magazine name and \(lqreal\(rq titles, the Title element encoding the journal name is assumed to be nested in a BiblioSet whose \fIrelation\fR attribute is set to \(lqjournal\(rq, \(lqpub\(rq, \(lqabbrev\(rq, or \(lqfull\(rq (this more or less arbitrary list can of course be extended or changed, see below)\&. The values \(lqabbrev\(rq and \(lqfull\(rq furthermore decide whether the RIS tag \(lqJO\(rq or \(lqJF\(rq will be used\&. .RE .SH "MODIFYING DB2RIS" .PP As previously stated, db2ris is implemented as a DSSSL stylesheet that can be easily and quickly adapted to your needs\&. It may be prudent to create copies of the script and modify these in order to adapt them for particular \(lqabuses\(rq of the DocBook bibliographic elements in various documents or data sources\&. This section briefly lists the functions which you would most likely want to change\&. .PP reftype\-heuristic .RS 4 This function attempts to infer the correct RIS publication type\&. .RE .PP titletype\-heuristic .RS 4 This function gives a hint whether a Title element is used as a journal/magazine name or as an article title or book title\&. .RE .PP process\-date .RS 4 This function creates a valid string for the RIS PY tag from the PubDate element\&. .RE .SH "FILES" .PP PREFIX/etc/refdb/db2risrc .RS 4 The global configuration file of db2ris\&. .RE .PP $HOME/\&.db2risrc .RS 4 The user configuration file of db2ris\&. .RE .SH "SEE ALSO" .PP \fBRefDB\fR (7), \fBbib2ris\fR (1), \fBen2ris\fR (1), \fBmarc2ris\fR (1), \fBmed2ris\fR (1)\&. .PP \fIRefDB manual (local copy) \fR PREFIX/share/doc/refdb\-/refdb\-manual/index\&.html .PP \fIRefDB manual (web) \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/manual/index\&.html\fR\m[]> .PP \fIRefDB on the web \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/\fR\m[]> .SH "AUTHOR" .PP db2ris was written by Markus Hoenicka \&. refdb-1.0.2/man/en2ris.1000644 001750 001750 00000015450 12255423000 015477 0ustar00markusmarkus000000 000000 '\" t .\" Title: en2ris .\" Author: [see the "Author" section] .\" Generator: DocBook XSL Stylesheets v1.76.1 .\" Date: 2005-10-16 .\" Manual: RefDB Manual .\" Source: RefDB Manual .\" Language: English .\" .TH "EN2RIS" "1" "2005\-10\-16" "RefDB Manual" "RefDB Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" en2ris \- converts EndNote bibliographic data to the RIS format .SH "SYNOPSIS" .HP \w'\fBen2ris\fR\ 'u \fBen2ris\fR [\-e\ \fIlogdest\fR] [\-f\ \fIfrom\-encoding\fR] [\-h] [\-l\ \fIloglevel\fR] [\-L\ \fIlogfile\fR] [\-o\ \fIfile\fR] [\-O\ \fIfile\fR] [\-q] [\-t\ \fIto\-encoding\fR] [\-y\ \fIpath\fR] .SH "DESCRIPTION" .PP en2ris fixes the markup errors encountered in EndNote "RIS" output and writes RIS output to stdout\&. .SH "OPTIONS" .PP \fB\-e\fR \fIlog\-destination\fR .RS 4 log\-destination can have the values 0, 1, or 2, or the equivalent strings \fIstderr\fR, \fIsyslog\fR, or \fIfile\fR, respectively\&. This value specifies where the log information goes to\&. 0 (zero) means the messages are sent to stderr\&. They are immediately available on the screen but they may interfere with command output\&. 1 will send the output to the syslog facility\&. Keep in mind that syslog must be configured to accept log messages from user programs, see the syslog(8) man page for further information\&. Unix\-like systems usually save these messages in /var/log/user\&.log\&. 2 will send the messages to a custom log file which can be specified with the \fB\-L\fR option\&. .RE .PP \fB\-f\fR \fIfrom\-encoding\fR .RS 4 Select the input character encoding\&. Supported encodings are platform\-dependent and can usually be found in iconv_open(3)\&. If no encodings are specified, \fBISO\-8859\-1\fR aka Latin\-1 is assumed\&. .RE .PP \fB\-h\fR .RS 4 Displays help and usage screen, then exits\&. .RE .PP \fB\-l\fR \fIlog\-level\fR .RS 4 Specify the priority up to which events are logged\&. This is either a number between 0 and 7 or one of the strings \fIemerg\fR, \fIalert\fR, \fIcrit\fR, \fIerr\fR, \fIwarning\fR, \fInotice\fR, \fIinfo\fR, \fIdebug\fR, respectively (see also Log level definitions)\&. \fB\-1\fR disables logging completely\&. A low log level like 0 means that only the most critical messages are logged\&. A higher log level means that less critical events are logged as well\&. 7 will include debug messages\&. The latter can be verbose and abundant, so you want to avoid this log level unless you need to track down problems\&. .RE .PP \fB\-L\fR \fIlog\-file\fR .RS 4 Specify the full path to a log file that will receive the log messages\&. Typically this would be /var/log/refdba\&. .RE .PP \fB\-o\fR \fIfile\fR .RS 4 Send output to \fIfile\fR\&. If \fIfile\fR exists, its contents will be overwritten\&. .RE .PP \fB\-O\fR \fIfile\fR .RS 4 Send output to \fIfile\fR\&. If \fIfile\fR exists, the output will be appended\&. .RE .PP \fB\-q\fR .RS 4 Start without reading the configuration files\&. The client will use the compile\-time defaults for all values that you do not set with command\-line switches\&. .RE .PP \fB\-t\fR \fIto\-encoding\fR .RS 4 Select the output character encoding\&. Supported encodings are platform\-dependent and can usually be found in iconv_open(3)\&. If no encodings are specified, \fBUTF\-8\fR is assumed\&. .RE .PP \fB\-y\fR \fIconfdir\fR .RS 4 Specify the directory where the global configuration files are Note: By default, all RefDB applications look for their configuration files in a directory that is specified during the configure step when building the package\&. That is, you don\*(Aqt need the \fB\-y\fR option unless you use precompiled binaries in unusual locations, e\&.g\&. by relocating a rpm package\&. .RE .SH "CONFIGURATION" .PP \fBen2ris\fR evaluates the file en2risrc to initialize itself\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&1.\ \&en2risrc .TS allbox tab(:); lB lB lB. T{ Variable T}:T{ Default T}:T{ Comment T} .T& l l l l l l l l l l l l l l l l l l l l l. T{ outfile T}:T{ (none) T}:T{ The default output file name\&. T} T{ outappend T}:T{ t T}:T{ Determines whether output is appended (\fIt\fR) to an existing file or overwrites (\fIf\fR) an existing file\&. T} T{ from_enc T}:T{ ISO\-8859\-1 T}:T{ The character encoding of the input data T} T{ to_enc T}:T{ ISO\-8859\-1 T}:T{ The character encoding of the output data T} T{ logfile T}:T{ /var/log/med2ris\&.log T}:T{ The full path of a custom log file\&. This is used only if logdest is set appropriately\&. T} T{ logdest T}:T{ 1 T}:T{ The destination of the log information\&. 0 = print to stderr; 1 = use the syslog facility; 2 = use a custom logfile\&. The latter needs a proper setting of logfile\&. T} T{ loglevel T}:T{ 6 T}:T{ The log level up to which messages will be sent\&. A low setting (0) allows only the most important messages, a high setting (7) allows all messages including debug messages\&. \-1 means nothing will be logged\&. T} .TE .sp 1 .SH "DATA PROCESSING" .PP en2ris fixes a couple of problems found in RIS data exported from EndNote\&. The main issues are the incomplete date formats, the export of page ranges into a single "SP" tag line, and the export of keywords as a list into a single "KW" tag line\&. .PP \fBen2ris\fR does not validate the input files\&. That is, the input files must stick to the rules of the data sources, otherwise the conversion results are not predictable\&. .SH "FILES" .PP PREFIX/etc/refdb/en2risrc .RS 4 The global configuration file of en2ris\&. .RE .PP $HOME/\&.en2risrc .RS 4 The user configuration file of en2ris\&. .RE .SH "SEE ALSO" .PP \fBRefDB\fR (7), \fBbib2ris\fR (1), \fBdb2ris\fR (1), \fBmarc2ris\fR (1), \fBmed2ris\fR (1)\&. .PP \fIRefDB manual (local copy) \fR PREFIX/share/doc/refdb\-/refdb\-manual/index\&.html .PP \fIRefDB manual (web) \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/manual/index\&.html\fR\m[]> .PP \fIRefDB on the web \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/\fR\m[]> .SH "AUTHOR" .PP en2ris was written by Markus Hoenicka \&. refdb-1.0.2/man/marc2ris.1000644 001750 001750 00000023774 12255423001 016030 0ustar00markusmarkus000000 000000 '\" t .\" Title: marc2ris .\" Author: [see the "Author" section] .\" Generator: DocBook XSL Stylesheets v1.76.1 .\" Date: 2005-10-16 .\" Manual: RefDB Manual .\" Source: RefDB Manual .\" Language: English .\" .TH "MARC2RIS" "1" "2005\-10\-16" "RefDB Manual" "RefDB Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" marc2ris \- converts MARC bibliographic data to the RIS format .SH "SYNOPSIS" .HP \w'\fBmarc2ris\fR\ 'u \fBmarc2ris\fR [\-e\ \fIlog\-destination\fR] [\-h] [\-l\ \fIlog\-level\fR] [\-L\ \fIlog\-file\fR] [\-m] [\-o\ \fIoutfile\fR] [\-O\ \fIoutfile\fR] [\-t\ \fIinput_type\fR] [\-u\ \fIt|f\fR] \fIfile\fR .SH "DESCRIPTION" .PP marc2ris attempts to extract the information useful to RefDB from MARC datasets\&. MARC (Machine Readable Catalogue Format) is a standard originating from the 1960s and is widely used by libraries and bibliographic agencies\&. Most libraries that offer Z39\&.50 access can provide the records in at least one MARC format (like with most other "standards" there\*(Aqs a couple to choose from)\&. Currently the following MARC dialects are supported: .PP \fBMARC21\fR .RS 4 This is an attempt to consolidate existing MARC variants (mainly USMARC and CANMARC) and will most likely be the format supported by all libraries in the near future\&. The format is described on the \m[blue]\fBLibrary of Congress MARC pages\fR\m[]\&\s-2\u[1]\d\s+2\&. .RE .PP \fBUNIMARC\fR .RS 4 This is the European equivalent of a standardization attempt\&. The specification can be found \m[blue]\fBhere\fR\m[]\&\s-2\u[2]\d\s+2\&. .RE .PP \fBUKMARC\fR .RS 4 This format is fairly close to the USMARC variant and is mainly used by libraries in the United Kingdom and in Ireland\&. Libraries supporting this format may switch to MARC21 in the future\&. Unfortunately there is no online description of this format, but this \m[blue]\fBPDF document\fR\m[]\&\s-2\u[3]\d\s+2 describes the main differences between USMARC and UKMARC\&. .RE .SH "OPTIONS" .PP By default the script reads USMARC data from stdin and sends RIS data to stdout\&. .PP \fB\-e\fR \fIlog\-destination\fR .RS 4 log\-destination can have the values 0, 1, or 2, or the equivalent strings \fIstderr\fR, \fIsyslog\fR, or \fIfile\fR, respectively\&. This value specifies where the log information goes to\&. 0 (zero) means the messages are sent to stderr\&. They are immediately available on the screen but they may interfere with command output\&. 1 will send the output to the syslog facility\&. Keep in mind that syslog must be configured to accept log messages from user programs, see the syslog(8) man page for further information\&. Unix\-like systems usually save these messages in /var/log/user\&.log\&. 2 will send the messages to a custom log file which can be specified with the \fB\-L\fR option\&. .RE .PP \fB\-h\fR .RS 4 Displays help and usage screen, then exits\&. .RE .PP \fB\-l\fR \fIlog\-level\fR .RS 4 Specify the priority up to which events are logged\&. This is either a number between 0 and 7 or one of the strings \fIemerg\fR, \fIalert\fR, \fIcrit\fR, \fIerr\fR, \fIwarning\fR, \fInotice\fR, \fIinfo\fR, \fIdebug\fR, respectively (see also Log level definitions)\&. \fB\-1\fR disables logging completely\&. A low log level like 0 means that only the most critical messages are logged\&. A higher log level means that less critical events are logged as well\&. 7 will include debug messages\&. The latter can be verbose and abundant, so you want to avoid this log level unless you need to track down problems\&. .RE .PP \fB\-L\fR \fIlog\-file\fR .RS 4 Specify the full path to a log file that will receive the log messages\&. Typically this would be /var/log/refdba\&. .RE .PP \fB\-m\fR .RS 4 Switch on additional MARC output\&. The output data will be the RIS output interspersed with the source MARC data used to generate the output\&. This is useful to fix conversion errors manually\&. .RE .PP \fB\-o\fR \fIfile\fR .RS 4 Send output to \fIfile\fR\&. If \fIfile\fR exists, its contents will be overwritten\&. .RE .PP \fB\-O\fR \fIfile\fR .RS 4 Send output to \fIfile\fR\&. If \fIfile\fR exists, the output will be appended\&. .RE .PP \fB\-t\fR \fIinput_type\fR .RS 4 Specify the MARC input type\&. The default is \fIMARC21\fR\&. Other available types are \fIUNIMARC\fR and \fIUKMARC\fR\&. .RE .PP \fB\-u \fR\fB\fIt|f\fR\fR .RS 4 Request Unicode output if set to "t" (this is the default)\&. marc2ris attempts to convert the input data into Unicode (unless the dataset explicitly states that it already uses Unicode)\&. If the conversion does not seem to work, set this to "f" as some MARC variants do not state the character encoding explicitly\&. .RE .SH "CONFIGURATION" .PP \fBmarc2ris\fR evaluates the file marc2risrc to initialize itself\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&1.\ \&marc2risrc .TS allbox tab(:); lB lB lB. T{ Variable T}:T{ Default T}:T{ Comment T} .T& l l l l l l l l l l l l l l l l l l. T{ outfile T}:T{ (none) T}:T{ The default output file name\&. T} T{ outappend T}:T{ t T}:T{ Determines whether output is appended (\fIt\fR) to an existing file or overwrites (\fIf\fR) an existing file\&. T} T{ unmapped T}:T{ t T}:T{ If set to \fIt\fR, unknown tags in the input data will be output following a tag; the resulting data can be inspected and then be sent through \fBsed\fR to strip off these additional lines\&. If set to \fIf\fR, unknown tags will be gracefully ignored\&. T} T{ logfile T}:T{ /var/log/med2ris\&.log T}:T{ The full path of a custom log file\&. This is used only if logdest is set appropriately\&. T} T{ logdest T}:T{ 1 T}:T{ The destination of the log information\&. 0 = print to stderr; 1 = use the syslog facility; 2 = use a custom logfile\&. The latter needs a proper setting of logfile\&. T} T{ loglevel T}:T{ 6 T}:T{ The log level up to which messages will be sent\&. A low setting (0) allows only the most important messages, a high setting (7) allows all messages including debug messages\&. \-1 means nothing will be logged\&. T} .TE .sp 1 .SH "DATA PROCESSING" .PP The purpose of the MARC format is entirely different from the purpose of the RIS format, so you shouldn\*(Aqt be too surprised that the import of MARC data is somewhat rough at the edges\&. The filter apparently deals fine with quite a lot of datasets, but the following shortcomings are known (and more are likely to be discovered by the interested reader): .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} Some fields, like 846, are currently ignored completely\&. This, of course, is bound to change\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} Author names specified in the natural order, i\&.e\&. something like First Middle Last, are not normalized due to the problems with multiple middle or last names\&. Author names in the inverse order, i\&.e\&. something like Last, First Middle, are normalized correctly in most cases\&. Handling of non\-European names is a matter of trial and error\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} Character set handling is somewhat limited\&. Only the unaltered input character encoding or UTF\-8 are available for the output data\&. .RE .PP That said, there is still some hope\&. The \fB\-m\fR command line option switches on additional MARC output\&. That is, the generated output will contain interspersed lines that show the contents of the original MARC fields used to generate the following RIS line or lines\&. For example, the following output snippet shows how \fBmarc2ris\fR generated the author lines from the MARC input: .sp .if n \{\ .RS 4 .\} .nf empty author field (100) :Author(Ind1): 1 :Author($a): Ershov, A\&. P\&. :Author($b): :Author($c): :Author(Ind1): 1 :Author($a): Knuth, Donald Ervin, :Author($b): :Author($c): AU \- Ershov,A\&.P\&. AU \- Knuth,Donald Ervin .fi .if n \{\ .RE .\} .PP If you feel marc2ris does not translate your data appropriately, the easiest way might be to use the \fB\-m\fR switch and redirect the output into a file\&. Then you can analyze the situation and fix the RIS lines as you see fit\&. Finally you can strip the MARC lines off with a command like: .sp .if n \{\ .RS 4 .\} .nf ~$ grep \-v "" < withmarc\&.ris > womarc\&.ris .fi .if n \{\ .RE .\} .SH "FILES" .PP PREFIX/etc/refdb/marc2risrc .RS 4 The global configuration file of marc2ris\&. .RE .PP $HOME/\&.marc2risrc .RS 4 The user configuration file of marc2ris\&. .RE .SH "SEE ALSO" .PP \fBRefDB\fR (7), \fBbib2ris\fR (1), \fBdb2ris\fR (1), \fBen2ris\fR (1), \fBmed2ris\fR (1)\&. .PP \fIRefDB manual (local copy) \fR PREFIX/share/doc/refdb\-/refdb\-manual/index\&.html .PP \fIRefDB manual (web) \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/manual/index\&.html\fR\m[]> .PP \fIRefDB on the web \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/\fR\m[]> .SH "AUTHOR" .PP marc2ris was written by Markus Hoenicka \&. .SH "NOTES" .IP " 1." 4 Library of Congress MARC pages .RS 4 \%http://www.loc.gov/marc/ .RE .IP " 2." 4 here .RS 4 \%http://www.ifla.org/VI/3/p1996-1/sec-uni.htm .RE .IP " 3." 4 PDF document .RS 4 \%[set $man.base.url.for.relative.links]/www.bl.uk/services/bibliographic/marcchange.pdf .RE refdb-1.0.2/man/med2ris.1000644 001750 001750 00000017360 12255423001 015645 0ustar00markusmarkus000000 000000 '\" t .\" Title: med2ris .\" Author: [see the "Author" section] .\" Generator: DocBook XSL Stylesheets v1.76.1 .\" Date: 2005-10-16 .\" Manual: RefDB Manual .\" Source: RefDB Manual .\" Language: English .\" .TH "MED2RIS" "1" "2005\-10\-16" "RefDB Manual" "RefDB Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" med2ris \- converts Medline/Pubmed bibliographic data to the RIS format .SH "SYNOPSIS" .HP \w'\fBmed2ris\fR\ 'u \fBmed2ris\fR [\-e\ \fIlogdest\fR] [\-f\ \fIfrom\-encoding\fR] [\-h] [\-i] [\-l\ \fIloglevel\fR] [\-L\ \fIlogfile\fR] [\-o\ \fIfile\fR] [\-O\ \fIfile\fR] [\-q] [\-t\ \fIto\-encoding\fR] [\-T\ \fItype\fR] [\-y\ \fIpath\fR] .SH "DESCRIPTION" .PP med2ris converts Pubmed reference data into RIS data\&. The converter understands both the tagged Pubmed format (which superficially resembles RIS) and the XML format according to the \m[blue]\fBPubMedArticle DTD\fR\m[]\&\s-2\u[1]\d\s+2\&. In most cases med2ris is able to automatically detect the input data type\&. .SH "OPTIONS" .PP \fB\-e\fR \fIlog\-destination\fR .RS 4 log\-destination can have the values 0, 1, or 2, or the equivalent strings \fIstderr\fR, \fIsyslog\fR, or \fIfile\fR, respectively\&. This value specifies where the log information goes to\&. 0 (zero) means the messages are sent to stderr\&. They are immediately available on the screen but they may interfere with command output\&. 1 will send the output to the syslog facility\&. Keep in mind that syslog must be configured to accept log messages from user programs, see the syslog(8) man page for further information\&. Unix\-like systems usually save these messages in /var/log/user\&.log\&. 2 will send the messages to a custom log file which can be specified with the \fB\-L\fR option\&. .RE .PP \fB\-f\fR \fIfrom\-encoding\fR .RS 4 Select the input character encoding\&. Supported encodings are platform\-dependent and can usually be found in iconv_open(3)\&. If no encodings are specified, \fBISO\-8859\-1\fR aka Latin\-1 is assumed\&. .RE .PP \fB\-h\fR .RS 4 Displays help and usage screen, then exits\&. .RE .PP \fB\-i\fR .RS 4 Output additional information about unknown or unused tags\&. Mainly useful to debug the conversion if the input format has changed\&. .RE .PP \fB\-l\fR \fIlog\-level\fR .RS 4 Specify the priority up to which events are logged\&. This is either a number between 0 and 7 or one of the strings \fIemerg\fR, \fIalert\fR, \fIcrit\fR, \fIerr\fR, \fIwarning\fR, \fInotice\fR, \fIinfo\fR, \fIdebug\fR, respectively (see also Log level definitions)\&. \fB\-1\fR disables logging completely\&. A low log level like 0 means that only the most critical messages are logged\&. A higher log level means that less critical events are logged as well\&. 7 will include debug messages\&. The latter can be verbose and abundant, so you want to avoid this log level unless you need to track down problems\&. .RE .PP \fB\-L\fR \fIlog\-file\fR .RS 4 Specify the full path to a log file that will receive the log messages\&. Typically this would be /var/log/refdba\&. .RE .PP \fB\-o\fR \fIfile\fR .RS 4 Send output to \fIfile\fR\&. If \fIfile\fR exists, its contents will be overwritten\&. .RE .PP \fB\-O\fR \fIfile\fR .RS 4 Send output to \fIfile\fR\&. If \fIfile\fR exists, the output will be appended\&. .RE .PP \fB\-q\fR .RS 4 Start without reading the configuration files\&. The client will use the compile\-time defaults for all values that you do not set with command\-line switches\&. .RE .PP \fB\-t\fR \fIto\-encoding\fR .RS 4 Select the output character encoding\&. Supported encodings are platform\-dependent and can usually be found in iconv_open(3)\&. If no encodings are specified, \fBISO\-8859\-1\fR aka Latin\-1 is assumed\&. .RE .PP \fB\-T\fR \fItype\fR .RS 4 Overrides the automatic type detection\&. Allowed values for \fItype\fR are "tag" and "xml" for the tagged Pubmed format and the XML Pubmed format, respectively\&. .RE .PP \fB\-y\fR \fIconfdir\fR .RS 4 Specify the directory where the global configuration files are Note: By default, all RefDB applications look for their configuration files in a directory that is specified during the configure step when building the package\&. That is, you don\*(Aqt need the \fB\-y\fR option unless you use precompiled binaries in unusual locations, e\&.g\&. by relocating a rpm package\&. .RE .SH "CONFIGURATION" .PP \fBmed2ris\fR evaluates the file med2risrc to initialize itself\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&1.\ \&med2risrc .TS allbox tab(:); lB lB lB. T{ Variable T}:T{ Default T}:T{ Comment T} .T& l l l l l l l l l l l l l l l l l l l l l l l l. T{ outfile T}:T{ (none) T}:T{ The default output file name\&. T} T{ outappend T}:T{ t T}:T{ Determines whether output is appended (\fIt\fR) to an existing file or overwrites (\fIf\fR) an existing file\&. T} T{ unmapped T}:T{ t T}:T{ If set to \fIt\fR, unknown tags in the input data will be output following a tag; the resulting data can be inspected and then be sent through \fBsed\fR to strip off these additional lines\&. If set to \fIf\fR, unknown tags will be gracefully ignored\&. T} T{ from_enc T}:T{ ISO\-8859\-1 T}:T{ The character encoding of the input data T} T{ to_enc T}:T{ ISO\-8859\-1 T}:T{ The character encoding of the output data T} T{ logfile T}:T{ /var/log/med2ris\&.log T}:T{ The full path of a custom log file\&. This is used only if logdest is set appropriately\&. T} T{ logdest T}:T{ 1 T}:T{ The destination of the log information\&. 0 = print to stderr; 1 = use the syslog facility; 2 = use a custom logfile\&. The latter needs a proper setting of logfile\&. T} T{ loglevel T}:T{ 6 T}:T{ The log level up to which messages will be sent\&. A low setting (0) allows only the most important messages, a high setting (7) allows all messages including debug messages\&. \-1 means nothing will be logged\&. T} .TE .sp 1 .SH "DATA PROCESSING" .PP Keywords with multiple MeSH subheadings are split into multiple keywords with one MeSH subheading each\&. This simplifies searching for MeSH subheadings greatly\&. .PP \fBmed2ris\fR does not validate the input files\&. That is, the input files must stick to the rules of the data sources, otherwise the conversion results are not predictable\&. .SH "FILES" .PP PREFIX/etc/refdb/med2risrc .RS 4 The global configuration file of med2ris\&. .RE .PP $HOME/\&.med2risrc .RS 4 The user configuration file of med2ris\&. .RE .SH "SEE ALSO" .PP \fBRefDB\fR (7), \fBbib2ris\fR (1), \fBdb2ris\fR (1), \fBen2ris\fR (1), \fBmarc2ris\fR (1)\&. .PP \fIRefDB manual (local copy) \fR PREFIX/share/doc/refdb\-/refdb\-manual/index\&.html .PP \fIRefDB manual (web) \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/manual/index\&.html\fR\m[]> .PP \fIRefDB on the web \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/\fR\m[]> .SH "AUTHOR" .PP med2ris was written by Markus Hoenicka \&. .SH "NOTES" .IP " 1." 4 PubMedArticle DTD .RS 4 \%http://www.ncbi.nlm.nih.gov/entrez/query/DTD/pubmed_020114.dtd .RE refdb-1.0.2/man/eenc.1000644 001750 001750 00000005621 12255423002 015210 0ustar00markusmarkus000000 000000 '\" t .\" Title: eenc .\" Author: [see the "Author" section] .\" Generator: DocBook XSL Stylesheets v1.76.1 .\" Date: 2005-10-16 .\" Manual: RefDB Manual .\" Source: RefDB Manual .\" Language: English .\" .TH "EENC" "1" "2005\-10\-16" "RefDB Manual" "RefDB Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" eenc \- perform password encryption for RefDB clients .SH "SYNOPSIS" .HP \w'\fBeenc\fR\ 'u \fBeenc\fR [\-p\ \fIABC\-DE\-FG\-HI\fR] \fIpassword\fR .SH "DESCRIPTION" .PP RefDB(7) clients send passwords to refdbd(1) in an encrypted form\&. Programmers that implement custom clients in languages other than C or Perl may use this program to perform the password encryption if implementing the algorithm in the target language is too cumbersome\&. The program writes the encoded password to stdout\&. As the encoding algorithm is symmetrical, you can use this utility to encode plain text passwords as well as to decode encrypted passwords\&. .PP The algorithm used by eenc is derived from the ENIGMA algorithm\&. Security is limited but should be sufficient for the purposes of a reference management software\&. Please see the RefDB manual (see below) for further information about the client\-server protocol\&. .SH "OPTIONS" .PP \fB\-p\fR \fIABC\-DE\-FG\-HI\fR .RS 4 The slot and rotor position string sent back by refdbd(1) during the first stage of the client\-server protocol\&. ABC denotes which wheel goes into which slot, and the remaining digits encode the positions of the wheels in slots 0 through 2\&. .RE .PP \fIpassword\fR .RS 4 The plain\-text password when encrypting, or the encoded password when decrypting\&. .RE .SH "SEE ALSO" .PP \fBRefDB\fR (7), \fBrefdbd\fR (1)\&. .PP \fIRefDB manual (local copy) \fR PREFIX/share/doc/refdb\-/refdb\-manual/index\&.html .PP \fIRefDB manual (web) \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/manual/index\&.html\fR\m[]> .PP \fIRefDB on the web \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/\fR\m[]> .SH "AUTHOR" .PP eenc was written by Markus Hoenicka \&. refdb-1.0.2/man/refdb-backup.1000644 001750 001750 00000005717 12255423003 016632 0ustar00markusmarkus000000 000000 '\" t .\" Title: refdb-backup .\" Author: [see the "Author" section] .\" Generator: DocBook XSL Stylesheets v1.76.1 .\" Date: 12/22/2013 .\" Manual: RefDB Manual .\" Source: February 26, 2005 .\" Language: English .\" .TH "REFDB\-BACKUP" "1" "12/22/2013" "February 26, 2005" "RefDB Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" refdb-backup \- RefDB tool: back up RefDB references, notes and styles .SH "SYNOPSIS" .HP \w'\fBrefdb\-backup\fR\ 'u \fBrefdb\-backup\fR [\fB\-h\fR] [\fB\-u\fR\ \fIuser\fR] [\fB\-w\fR\ \fIpwd\fR] [\fB\-f\fR\ \fIformat\fR] [\fB\-d\fR\ \fIdir\fR] [\fB\-s\fR] .SH "DESCRIPTION" .PP refdb\-backup is a tool for backing up RefDB(7) references, notes and styles\&. A gzipped tarfile of the form \*(Aqrefdb_backup_YYYYMMDD_HHMM\&.tar\&.gz\*(Aq is created\&. .PP While users can restore data from the backup archive manually, it is expressly designed to restored by the companion tool \fIrefdb\-restore\fR\&. .SH "OPTIONS" .PP \fB\-d\fR \fIdir\fR .RS 4 directory in which to place backup file (default: current directory) .RE .PP \fB\-f\fR \fIformat\fR .RS 4 references storage format (\*(Aqris\*(Aq (default)|\*(Aqrisx\*(Aq) .RE .PP \fB\-h\fR .RS 4 print help and exit .RE .PP \fB\-s\fR .RS 4 silent, no screen feedback .RE .PP \fB\-u\fR \fIuser\fR .RS 4 username for RefDB clients (refdba, refdbc) not required if clients are configured for automatic access .RE .PP \fB\-w\fR \fIpwd\fR .RS 4 password for RefDB clients (refdba, refdbc) not required if clients are configured for automatic access .RE .SH "SEE ALSO" .PP \fBRefDB\fR (7), \fBrefdb\-restore\fR (1), \fBrefdba\fR (1), \fBrefdbc\fR (1)\&. .PP \fIRefDB manual (local copy) \fR PREFIX/share/doc/refdb\-/refdb\-manual/index\&.html .PP \fIRefDB manual (web) \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/manual/index\&.html\fR\m[]> .PP \fIRefDB on the web \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/\fR\m[]> .SH "AUTHOR" .PP refdb\-backup was written by David Nebauer .PP This manual page was written by David Nebauer for the Debian project (but may be used by others)\&. refdb-1.0.2/man/refdb-ms.1000644 001750 001750 00000012370 12255423003 015775 0ustar00markusmarkus000000 000000 '\" t .\" Title: refdb-ms .\" Author: [see the "Author" section] .\" Generator: DocBook XSL Stylesheets v1.76.1 .\" Date: 2005-07-17 .\" Manual: RefDB Manual .\" Source: RefDB Manual .\" Language: English .\" .TH "REFDB\-MS" "1" "2005\-07\-17" "RefDB Manual" "RefDB Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" refdb-ms \- a console\-based style generator for RefDB .SH "SYNOPSIS" .HP \w'\fBrefdb\-ms\fR\ 'u \fBrefdb\-ms\fR .SH "DESCRIPTION" .PP refdb\-ms is a console\-based style generator for RefDB\&. .PP In short, this utility consists of a loop in which you are asked to: .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} select an element from a list of elements allowed in that part of the style, .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} enter or select appropriate values for mandatory attributes, .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} select optional attributes for that element and enter their values, .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} select an element from a list of elements \&.\&.\&. .RE .PP This process ends when you have exhausted the DTD\&. .PP Every time you are presented with a list of elements you have the option of selecting help\&. Doing so will present a screen with a summary of each element on the list\&. The same thing happens when you are presented with a list of attributes\&. .PP When an attribute or element is required by the DTD this utility will select it automatically\&. For some objects you will not need to provide input and so this utility will create the object(s) automatically\&. This can be disconcerting at first\&. Please read the console feedback carefully\&. .PP Whenever you are asked to enter or select a value for an attribute or element, you are given a brief prompt explaining the purpose of the element or attribute\&. After each element is added to the style you are presented with a "progress report" showing the (major) elements\&. It may take a little while to understand this feedback\&. As you add elements they will be appended to the report\&. When you complete a major element, such as a PUBTYPE or AUTHORLIST, however, its subsidiary elements are no longer displayed \-\- they are "folded"\&. This saves space and makes it easier to quickly understand where in the style you are at that point in time\&. As you become more familiar with the structure of the style DTD this display will become increasingly useful\&. .PP At certain times within PUBTYPE, AUTHORONLY, YEARONLY and INTEXTDEF elements you are able to delete the previous "major" element\&. "Major" elements are those corresponding to ris fields\&. These elements may contain other elements\&. For example, deleting an AUTHORLIST element will delete all the children elements of that author list style\&. You can view the complete element before deletion occurs\&. .PP When you select some elements (in general, those corresponding to ris fields) you will be given an opportunity to copy the most recently entered element of that type\&. If you choose to copy, all attributes and sub\-elements will be copied\&. This can save you a lot of time if, for example, your author lists will always have the same formatting\&. .PP After you have created your style this utility will save it to a disk file\&. It will also generate a brief summary of it in html format\&. This summary can be of great help when entering references in your reference database\&. .PP This utility will then offer to upload the style to RefDB\&. There is no foreseeable way in which this operation could damage your reference data, but you use it at your own risk\&. .SH "FILES" .PP \fIRefDB::Makestyle\fR .PP This module is required by refdb\-ms\&. It is available as a tar\&.gz archive or a Debian package from the RefDB website \&. .SH "SEE ALSO" .PP \fBRefDB::Makestyle\fR (3)\&. .PP \fIRefDB manual (local copy) \fR PREFIX/share/doc/refdb\-/refdb\-manual/index\&.html .PP \fIRefDB manual (web) \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/manual/index\&.html\fR\m[]> .PP \fIRefDB on the web \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/\fR\m[]> .SH "AUTHOR" .PP refdb\-ms was written by David Nebauer \&. .PP This manual page was written by David Nebauer for the Debian project (but may be used by others)\&. refdb-1.0.2/man/refdb-restore.1000644 001750 001750 00000005340 12255423004 017041 0ustar00markusmarkus000000 000000 '\" t .\" Title: refdb-restore .\" Author: [see the "Author" section] .\" Generator: DocBook XSL Stylesheets v1.76.1 .\" Date: 12/22/2013 .\" Manual: RefDB Manual .\" Source: February 26, 2005 .\" Language: English .\" .TH "REFDB\-RESTORE" "1" "12/22/2013" "February 26, 2005" "RefDB Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" refdb-restore \- RefDB tool: restore RefDB references, notes and styles .SH "SYNOPSIS" .HP \w'\fBrefdb\-restore\fR\ 'u \fBrefdb\-restore\fR [\-h] [\-u\ \fIuser\fR] [\-w\ \fIpwd\fR] \fIbackup\-archive\fR .SH "DESCRIPTION" .PP refdb\-restore is a tool for restoring RefDB(7) references, notes and styles\&. The backup archive must have been created by the companion tool \fIrefdb\-backup\fR\&. .PP Before performing the restore all reference databases must be removed (archived) from /var/lib/refdb/db/\&. The system database in that directory (\*(Aqrefdb\*(Aq) must be recreated from the sql dump (see \fIManual\fR)\&. .SH "OPTIONS" .PP \fB\-h\fR .RS 4 print help and exit .RE .PP \fB\-u\fR \fIuser\fR .RS 4 username for RefDB clients (refdba, refdbc) not required if clients are configured for automatic access .RE .PP \fB\-w\fR \fIpwd\fR .RS 4 password for RefDB clients (refdba, refdbc) not required if clients are configured for automatic access .RE .SH "SEE ALSO" .PP \fBRefDB\fR (7), \fBrefdb\-backup\fR (1), \fBrefdba\fR (1), \fBrefdbc\fR (1)\&. .PP \fIRefDB manual (local copy) \fR PREFIX/share/doc/refdb\-/refdb\-manual/index\&.html .PP \fIRefDB manual (web) \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/manual/index\&.html\fR\m[]> .PP \fIRefDB on the web \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/\fR\m[]> .SH "AUTHOR" .PP refdb\-restore was written by David Nebauer .PP This manual page was written by David Nebauer for the Debian project (but may be used by others)\&. refdb-1.0.2/man/refdbjade.1000644 001750 001750 00000014533 12255423005 016211 0ustar00markusmarkus000000 000000 '\" t .\" Title: refdbjade .\" Author: [see the "Author" section] .\" Generator: DocBook XSL Stylesheets v1.76.1 .\" Date: 2005-10-17 .\" Manual: RefDB Manual .\" Source: RefDB Manual .\" Language: English .\" .TH "REFDBJADE" "1" "2005\-10\-17" "RefDB Manual" "RefDB Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" refdbjade \- transform SGML and XML documents containing RefDB bibliographies .SH "SYNOPSIS" .HP \w'\fBrefdbjade\fR\ 'u \fBrefdbjade\fR [\fB\-h\fR] [\fB\-I\fR\ \fIname\fR] [\fB\-j\fR\ \fIjade\-args\fR] [\fB\-p\fR\ \fIprefix\fR] [\fB\-s\fR\ \fIstylesheet\fR] [\fB\-t\fR\ \fIformat\fR] [\fB\-v\fR\ \fIvariable[=name]\fR] \fIfile\fR .SH "DESCRIPTION" .PP refdbjade uses the stylesheet driver file that you created with runbib(1) and feeds it to Jade/OpenJade to transform your DocBook SGML or XML document to one of the supported output formats\&. .PP Note: If you prefer to transform your DocBook XML document with the XSL stylesheets as most people do these days, please use refdbxml(1) instead\&. .SH "OPTIONS" .PP \fB\-h\fR .RS 4 Prints a command synopsis on the screen and exits .RE .PP \fB\-I\fR \fIname\fR .RS 4 Change the value of an entity declaration to include marked sections\&. Multiple entries are possible\&. These are passed as \fB\-i\fR options to Jade/OpenJade\&. .RE .PP \fB\-j\fR \fIjade\-args\fR .RS 4 Set additional command line options for Jade/OpenJade .RE .PP \fB\-p\fR \fIprefix\fR .RS 4 This determines a prefix that is added to all filenames that Jade/OpenJade create\&. This can be useful to avoid filename conflicts if you transform or use several DocBook documents in the same folder\&. .RE .PP \fB\-s\fR \fIstylesheet\fR .RS 4 This selects the stylesheet driver file\&. This file is generated by refdbib(1) (which in turn is called by runbib(1)) and contains additional formatting information\&. .RE .PP \fB\-t\fR \fIformat\fR .RS 4 Select an output format with this option\&. Possible values are \fIhtml\fR, \fIrtf\fR, \fIdvi\fR, \fIpdf\fR, \fIps\fR, \fItex\fR, to generate HTML, RTF, DVI, PDF, PostScript, or JadeTeX output, respectively\&. Use \fItps\fR and \fItpdf\fR to create PostScript or PDF output, respectively, from the intermediate JadeTeX output generated by any of the switches \fIdvi\fR, \fIpdf\fR, \fIps\fR, or \fItex\fR\&. This is useful if you have to edit the intermediate JadeTeX file, e\&.g\&. to manually shift pagebreaks\&. If your DSSSL engine of choice is OpenJade, you can use \fIhtmlr\fR to generate raw HTML output (the same as HTML but without these funny linefeeds in the end tags)\&. .RE .PP \fB\-v\fR \fIvariable[=value]\fR .RS 4 Change the value of a variable in the stylesheet\&. Multiple entries are possible\&. These are passed as such to Jade/OpenJade\&. The syntax "variable" causes "variable" to be set to "#t"\&. The extended syntax "variable[=value]" sets the variable to the given value\&. .RE .PP \fIfile\fR .RS 4 The names of one or more SGML or XML files\&. Each document will be processed separately\&. .RE .SH "CONFIGURATION" .PP Instead of using the command\-line switches, refdbjade can also be configured by means of the refdbjaderc configuration file\&. As with all refdb configuration files, you may maintain a global copy in /usr/local/etc/refdb/ and one copy per user in \fB$HOME\fR\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&1.\ \&refdbjaderc .TS allbox tab(:); lB lB lB. T{ Variable T}:T{ Default T}:T{ Comment T} .T& l l l l l l l l l l l l. T{ jade_includearg T}:T{ none T}:T{ Change the value of an entity declaration to include marked sections\&. Multiple entries are possible\&. These are passed as \fB\-i\fR options to Jade/OpenJade\&. T} T{ jade_variable T}:T{ none T}:T{ Change the value of a variable in the stylesheet\&. Multiple entries are possible\&. These are passed as \fB\-v\fR options to Jade/OpenJade\&. The syntax "variable" causes "variable" to be set to "#t"\&. The extended syntax "variable[=value]" sets the variable to the given value\&. T} T{ jadeargs T}:T{ none T}:T{ Set additional command line options for Jade/OpenJade\&. Use e\&.g\&. "\-E 0" to disable the maximum error limit T} T{ outformat T}:T{ tex T}:T{ Set the default output format\&. Supported values are tex, html, rtf, dvi, pdf, ps, tps, and tpdf T} .TE .sp 1 .SH "ENVIRONMENT" .PP \fISGML_CATALOG_FILES\fR .PP This environment variable is consulted to resolve public identifiers in the SGML source documents\&. It is advisable to keep local copies of the DTD files and add \fBOVERRIDE YES\fR to the top of your catalog files\&. This ensures that the local copies are used and avoids unnecessary network traffic\&. .SH "EXAMPLE" .PP Here we\*(Aqll use the files generated in the last example above (see runbib) and generate a nicely formatted PDF file: .sp .if n \{\ .RS 4 .\} .nf ~$ \fBrefdbjade \-d J\&.Biol\&.Chem\&.dsl \-t pdf mypaper\&.sgml\fR .fi .if n \{\ .RE .\} .PP To obtain HTML output, you just change the output type switch: .sp .if n \{\ .RS 4 .\} .nf ~$ \fBrefdbjade \-d J\&.Biol\&.Chem\&.dsl \-t html mypaper\&.sgml\fR .fi .if n \{\ .RE .\} .SH "SEE ALSO" .PP \fBRefDB\fR (7), \fBrefdbib\fR (1), \fBrunbib\fR (1), \fBrefdbxml\fR (1)\&. .PP \fIRefDB manual (local copy) \fR PREFIX/share/doc/refdb\-/refdb\-manual/index\&.html .PP \fIRefDB manual (web) \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/manual/index\&.html\fR\m[]> .PP \fIRefDB on the web \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/\fR\m[]> .SH "AUTHOR" .PP refdbjade was written by Markus Hoenicka \&. refdb-1.0.2/man/refdbnd.1000644 001750 001750 00000015172 12255423005 015707 0ustar00markusmarkus000000 000000 '\" t .\" Title: refdbnd .\" Author: [see the "Author" section] .\" Generator: DocBook XSL Stylesheets v1.76.1 .\" Date: 2005-10-16 .\" Manual: RefDB Manual .\" Source: RefDB Manual .\" Language: English .\" .TH "REFDBND" "1" "2005\-10\-16" "RefDB Manual" "RefDB Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" refdbnd \- creates a skeleton document and a Makefile for RefDB .SH "SYNOPSIS" .PP Interactive mode: .HP \w'\fBrefdbnd\fR\ 'u \fBrefdbnd\fR .PP Non\-interactive mode: .HP \w'\fBrefdbnd\fR\ 'u \fBrefdbnd\fR \fIbasename\fR \fIdoctype\fR \fIpubtype\fR \fIdatabase\fR \fIstyle\fR \fIencoding\fR [\fIcss\-file\fR] [\fIfo\-driver\fR] [\fIhtml\-driver\fR] [\fIxhtml\-driver\fR] .SH "DESCRIPTION" .PP This script should be the first choice for novices for creating new SGML,XML, or RTF documents for use with RefDB(7)\&. If called without arguments, the script runs in a novice\-friendly interactive mode and collects a few answers about the new document\&. Based on these answers it will create a skeleton document as well as a custom\-tailored Makefile that performs all necessary steps to create formatted output from the document\&. .PP Alternatively you can call this script from a directory that contains an existing SGML, XML, or RTF file\&. Pass the full name to the script when it asks for a filename, and the script will try to guess some of the settings from the existing file\&. .PP The script can create the following document types: .PP \fBDocBook SGML\fR .RS 4 Versions 3\&.1, 4\&.0, 4\&.1 .RE .PP \fBDocBook XML\fR .RS 4 Versions 4\&.1\&.2, 4\&.2, 4\&.3, 5\&.0 .RE .PP \fBTEI XML\fR .RS 4 Versions P4, P5 .RE .PP \fBRich Text Format (RTF)\fR .RS 4 Version 1\&.9 (M$ Word 2007 and earlier, OpenOffice, AbiWord, and most other contemporary word processors) .RE .PP The skeleton documents created by the script contain the appropriate prolog for the selected document type\&. If required (SGML, DTD\-based XML), an external entity is declared in the internal subset in order to include the bibliography\&. .SH "OPTIONS" .PP \fIbasename\fR .RS 4 The basename of the document, i\&.e\&. sans extension\&. If you want to end up with \fIfoo\&.pdf\fR, use \fIfoo\fR .RE .PP \fIdoctype\fR .RS 4 Available options are \fIdb31\fR, \fIdb40\fR, and \fIdb41\fR for DocBook SGML; \fIdb41x\fR, \fIdb42x\fR, and \fIdb43x\fR for DocBook XML; \fIteix\fR for TEI XML; \fIrtf\fR for RTF .RE .PP \fIpubtype\fR .RS 4 This is one of \fIset\fR, \fIbook\fR, or \fIarticle\fR for DocBook, and \fITEI\&.2\fR for TEI\&. This argument is ignored by the other document types, but must be present nonetheless (pass "foo" or "bar", depending on your mood)\&. .RE .PP \fIdatabase\fR .RS 4 The name of the database that contains your references\&. .RE .PP \fIstyle\fR .RS 4 The name of the bibliography style\&. .RE .PP \fIencoding\fR .RS 4 The character encoding of the document\&. .RE .PP \fIcss\-file\fR .RS 4 The name of a CSS file for the HTML output\&. This option is meaningless for RTF documents and can be left out\&. .RE .PP \fIfo\-driver\fR .RS 4 A custom driver file for fo output\&. Please consult the manual for the requirements of such a driver\&. This option is meaningless for RTF documents and can be left out\&. .RE .PP \fIhtml\-driver\fR .RS 4 A custom driver file for html output\&. Please consult the manual for the requirements of such a driver\&. This option is meaningless for RTF documents and can be left out\&. .RE .PP \fIxhtml\-driver\fR .RS 4 A custom driver file for xhtml output\&. Please consult the manual for the requirements of such a driver\&. This option is meaningless for RTF documents and can be left out\&. .RE .SH "MAKEFILE TARGETS" .PP The Makefile is set up to process your document properly depending on its type\&. The following targets are available for SGML and XML documents: .PP \fIhtml\fR .RS 4 Creates a set of HTML files\&. .RE .PP \fIpdf\fR .RS 4 Creates a PDF file\&. .RE .PP \fIps\fR .RS 4 Creates a Postscript file (SGML documents only)\&. .RE .PP \fIrtf\fR .RS 4 Creates a RTF file\&. The Rich Text Format can be edited by most Word Processors\&. .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBNote\fR .ps -1 .br Not all FO processors offer RTF output, so this target may not work for XML documents with your setup\&. .sp .5v .RE .RE .PP \fIall\fR .RS 4 This is the default if you call \fBmake\fR without specifying a target\&. It will build all of the above targets\&. .RE .PP \fIhtmldist\fR .RS 4 Creates a \&.tar\&.gz archive of the HTML files\&. .RE .PP \fIpdfdist\fR .RS 4 Creates a \&.tar\&.gz archive of the PDF file\&. .RE .PP \fIps\fR .RS 4 Creates a \&.tar\&.gz archive of the Postscript file (SGML documents only)\&. .RE .PP \fIrtf\fR .RS 4 Creates a \&.tar\&.gz archive of the RTF file\&. .RE .PP \fIdist\fR .RS 4 This will build all of the above archives\&. .RE .PP \fIclean\fR .RS 4 This will remove all built files, except for the source document using the full citation format\&. .RE .PP \fIshortclean\fR .RS 4 This will remove all built files, including the source document using the full citation format\&. .RE .PP For RTF output there is only a default target which you can invoke by running \fBmake\fR without an argument, and the "clean" target which removes generated files\&. .SH "FILES" .PP PREFIX/share/refdb/db/examples/Makefile\&.template .PP PREFIX/share/refdb/db/examples/Makefile\&.rtf\&.template .PP The templates used to create the Makefile\&. .SH "SEE ALSO" .PP \fBRefDB\fR (7)\&. .PP \fIRefDB manual (local copy) \fR PREFIX/share/doc/refdb\-/refdb\-manual/index\&.html .PP \fIRefDB manual (web) \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/manual/index\&.html\fR\m[]> .PP \fIRefDB on the web \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/\fR\m[]> .SH "AUTHOR" .PP refdbnd was written by Markus Hoenicka \&. refdb-1.0.2/man/refdbxml.1000644 001750 001750 00000015362 12255423006 016110 0ustar00markusmarkus000000 000000 '\" t .\" Title: refdbxml .\" Author: [see the "Author" section] .\" Generator: DocBook XSL Stylesheets v1.76.1 .\" Date: 2005-10-17 .\" Manual: RefDB Manual .\" Source: RefDB Manual .\" Language: English .\" .TH "REFDBXML" "1" "2005\-10\-17" "RefDB Manual" "RefDB Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" refdbxml \- transform XML documents containing RefDB bibliographies .SH "SYNOPSIS" .HP \w'\fBrefdbxml\fR\ 'u \fBrefdbxml\fR [\fB\-c\fR\ \fIfop_config_file\fR] [\fB\-f\fR\ \fIfo_processor\fR] [\fB\-h\fR] [\fB\-p\fR\ \fIxslt\-processor\fR] [\fB\-s\fR\ \fIstylesheet\fR] [\fB\-t\fR\ \fIformat\fR] \fIfile\fR .SH "DESCRIPTION" .PP refdbxml uses the stylesheet driver file that you created with runbib(1) and feeds it to an XSLT processor to transform your DocBook or TEI XML document to one of the supported output formats\&. If printable output is requested, the intermediate FO output will be further processed by a FO processor\&. .SH "OPTIONS" .PP \fB\-c\fR \fIfop_config_file\fR .RS 4 The path to a custom configuration file for the FO processor \m[blue]\fBFOP\fR\m[]\&\s-2\u[1]\d\s+2\&. .RE .PP \fB\-f\fR \fIfo_processor\fR .RS 4 The name of the FO processor used to transform FO files into printable output\&. Supported values are \fIfop\fR (default), \fIpassivetex\fR, \fIxep\fR, and \fIxfor\fR\&. .RE .PP \fB\-h\fR .RS 4 Prints a command synopsis on the screen and exits .RE .PP \fB\-i\fR \fIvariable\fR .RS 4 Define a variable that is passed to Jade/OpenJade\&. Multiple entries are possible\&. This can be used to conditionally include or exclude parts of the document according to which variable is set\&. .RE .PP \fB\-p\fR \fIxslt\-processor\fR .RS 4 This determines the XSL processor that is to be used\&. refdbxml currently knows to handle \fIXalan\fR, \fIXT\fR, \fISaxon\fR, and \fIxsltproc\fR\&. .RE .PP \fB\-s\fR \fIstylesheet\fR .RS 4 This selects the stylesheet driver file\&. This file is generated by refdbib(1) (which in turn is called by runbib(1)) and contains additional formatting information\&. .RE .PP \fB\-t\fR \fIformat\fR .RS 4 Select an output format with this option\&. Possible values are \fIhtml\efr, rtf\fR, and \fIpdf\fR\&. .RE .PP \fIfile\fR .RS 4 The names of one or more XML files\&. Each document will be processed separately\&. .RE .SH "CONFIGURATION" .PP Instead of using the command\-line switches, refdbxml can also be configured by means of the refdbxmlrc configuration file\&. As with all refdb configuration files, you may maintain a global copy in /usr/local/etc/refdb/ and one copy per user in \fB$HOME\fR\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&1.\ \&refdbxmlrc .TS allbox tab(:); lB lB lB. T{ Variable T}:T{ Default T}:T{ Comment T} .T& l l l l l l l l l l l l l l l l l l. T{ xslt_processor T}:T{ xsltproc T}:T{ The name of the XSLT processor used to transform XML documents to html or fo files\&. Supported values are xsltproc (default), xalan, xt, saxon, saxon\-xerces (using the xerces parser instead of the built\-in parser) T} T{ xslt_classpath T}:T{ /usr/share/java T}:T{ Specify the directory which contains the Java classes for Java\-based XSLT processors\&. This variable is not required if you use a non\-Java processor (xsltproc)\&. T} T{ fo_processor T}:T{ fop T}:T{ The name of the FO processor used to transform FO files into printable output\&. Supported values are fop (default), passivetex, xep, and xfor\&. T} T{ fo_classpath T}:T{ /usr/share/java T}:T{ Specify the directory which contains the Java classes for Java\-based FO processors\&. This variable is not required if you use a non\-Java processor (passivetex)\&. T} T{ fop_config_file T}:T{ (none) T}:T{ The path to a custom configuration file for FOP\&. T} T{ outformat T}:T{ html T}:T{ Set the default output format\&. Supported values are html, xhtml, pdf, and rtf\&. Be aware that pdf and rtf are not supported by all FO processors\&. T} .TE .sp 1 .SH "RESOLVING PUBLIC IDENTIFIERS" .PP Public identifiers can be resolved to local files if you have a working XML catalog on your system and if your XSLT processor supports XML catalogs\&. xalan and saxon require additional Java classes to support XML catalogs\&. For further information, please consult Bob Stayton\*(Aqs \m[blue]\fBbook\fR\m[]\&\s-2\u[2]\d\s+2 about XSLT\&. .SH "FILES" .PP /usr/local/etc/refdb/refdbxmlrc .RS 4 The global configuration file of refdbxml .RE .PP \fI$HOME/\&.refdbxmlrc\fR .RS 4 The user configuration file of refdbxml\&. .RE .PP /etc/xml/catalog .RS 4 The global XML catalog file, used to resolve public identifiers\&. Please note that the location of this file is system\-dependent\&. Also, some XSLT processors do not support catalogs, and others require additional classes or plugins to do so\&. .RE .SH "EXAMPLE" .PP We\*(Aqll transform our document (which is either a DocBook or TEI XML document) to a nice\-looking PDF file with the following command: .sp .if n \{\ .RS 4 .\} .nf ~$ \fBrefdbxml \-d J\&.Biol\&.Chem\&.fo\&.xsl \-t pdf mypaper\&.xml\fR .fi .if n \{\ .RE .\} .PP Note that we used the FO stylesheet for this purpose\&. If we want HTML output, we need to change the output type switch and use the corresponding HTML stylesheet: .sp .if n \{\ .RS 4 .\} .nf ~$ \fBrefdbxml \-d J\&.Biol\&.Chem\&.html\&.xsl \-t html mypaper\&.xml\fR .fi .if n \{\ .RE .\} .SH "SEE ALSO" .PP \fBRefDB\fR (7), \fBrefdbib\fR (1), \fBrunbib\fR (1), \fBrefdbjade\fR (1)\&. .PP \fIRefDB manual (local copy) \fR PREFIX/share/doc/refdb\-/refdb\-manual/index\&.html .PP \fIRefDB manual (web) \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/manual/index\&.html\fR\m[]> .PP \fIRefDB on the web \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/\fR\m[]> .SH "AUTHOR" .PP refdbxml was written by Markus Hoenicka \&. .SH "NOTES" .IP " 1." 4 FOP .RS 4 \%http://xmlgraphics.apache.org/fop/ .RE .IP " 2." 4 book .RS 4 \%http://www.sagehill.net/docbookxsl/UseCatalog.html .RE refdb-1.0.2/man/refdbrtf.1000644 001750 001750 00000005325 12255423007 016102 0ustar00markusmarkus000000 000000 '\" t .\" Title: refdbrtf .\" Author: [see the "Author" section] .\" Generator: DocBook XSL Stylesheets v1.76.1 .\" Date: 2005-10-17 .\" Manual: RefDB Manual .\" Source: RefDB Manual .\" Language: English .\" .TH "REFDBRTF" "1" "2005\-10\-17" "RefDB Manual" "RefDB Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" refdbrtf \- build RTF documents with RefDB bibliographies .SH "SYNOPSIS" .HP \w'\fBrefdbrtf\fR\ 'u \fBrefdbrtf\fR [\fB\-b\fR\ \fIbibfile\fR] [\fB\-h\fR] .SH "DESCRIPTION" .PP refdbrtf takes a RTF bibliography file (such as created with refdbib) and inserts the citations and the bibliographic listing into the file the bibliography was created from\&. The source RTF document is read from stdin, and the compound RTF document is sent to stdout\&. .SH "OPTIONS" .PP \fB\-b\fR \fIbibfile\fR .RS 4 The path to the RTF bibliography file\&. .RE .PP \fB\-h\fR .RS 4 Prints a command synopsis on the screen and exits .RE .SH "EXAMPLE" .PP We have authored a source document called mypaper\&.rtf which contains a variety of citations\&. Then we invoked runbib which provided a matching bibliography file called mypaper\&.bib\&.rtf\&. The following command will combine the two RTF files to a new compound document with resolved references and a bibliographic listing: .sp .if n \{\ .RS 4 .\} .nf ~$ \fBrefdbrtf \-b mypaper\&.bib\&.rtf < mypaper\&.rtf > mypaper\&.refdb\&.rtf\fR .fi .if n \{\ .RE .\} .SH "SEE ALSO" .PP \fBRefDB\fR (7), \fBrefdbib\fR (1), \fBrunbib\fR (1)\&. .PP \fIRefDB manual (local copy) \fR PREFIX/share/doc/refdb\-/refdb\-manual/index\&.html .PP \fIRefDB manual (web) \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/manual/index\&.html\fR\m[]> .PP \fIRefDB on the web \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/\fR\m[]> .SH "AUTHOR" .PP refdbrtf was written by Markus Hoenicka \&. refdb-1.0.2/man/runbib.1000644 001750 001750 00000026135 12255423010 015561 0ustar00markusmarkus000000 000000 '\" t .\" Title: runbib .\" Author: [see the "Author" section] .\" Generator: DocBook XSL Stylesheets v1.76.1 .\" Date: 2005-10-16 .\" Manual: RefDB Manual .\" Source: RefDB Manual .\" Language: English .\" .TH "RUNBIB" "1" "2005\-10\-16" "RefDB Manual" "RefDB Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" runbib \- creates RefDB bibliographies .SH "SYNOPSIS" .HP \w'\fBrunbib\fR\ 'u \fBrunbib\fR [\fB\-a\fR\ \fIfo\-driver\fR] [\fB\-b\fR\ \fIhtml\-driver\fR] [\fB\-c\fR\ \fIxhtml\-driver\fR] [\fB\-d\fR\ \fIdatabase\fR] [\fB\-E\fR\ \fIencoding\fR] [\fB\-G\fR\ \fIcss\-file\fR] [\fB\-h\fR] [\fB\-i\fR\ \fIIP\-address\fR] [\fB\-I\fR\ \fIname\fR] [\fB\-j\fR\ \fIjade\-args\fR] [\fB\-N\fR\ \fInumber\fR] [\fB\-r\fR] [\fB\-s\fR] [\fB\-S\fR\ \fIstyle\fR] [\fB\-t\fR\ \fIoutput\-type\fR] [\fB\-u\fR\ \fIname\fR] [\fB\-w\fR\ \fIpassword\fR] \fIfilename\fR .SH "DESCRIPTION" .PP This shell script is a wrapper for the bibliography client refdbib(1) to simplify the creation of bibliographies\&. For SGML and XML documents, runbib first runs openjade or xsltproc(1), respectively, to retrieve a list of citations from your source document\&. Then it runs refdbib(1) to generate the bibliography as an external entity based on the extracted citation information\&. It will also create stylesheet driver files with the formatting information for subsequent document transformations\&. For BibTeX documents, runbib uses the information in the \&.aux file to retrieve a bibliography file that you can use as an input file for bibtex(1)\&. .SH "OPTIONS" .PP \fB\-a\fR \fIfo\-driver\fR .RS 4 The full path of a custom XSL driver file for printed output\&. This file has to import the appropriate RefDB fo driver file\&. .RE .PP \fB\-b\fR \fIhtml\-driver\fR .RS 4 The full path of a custom XSL driver file for HTML output\&. This file has to import the appropriate RefDB html driver file\&. .RE .PP \fB\-c\fR \fIxhtml\-driver\fR .RS 4 The full path of a custom XSL driver file for XHTML output\&. This file has to import the appropriate RefDB xhtml driver file\&. .RE .PP \fB\-d\fR \fIdatabase\fR .RS 4 The name of the default database\&. .RE .PP \fB\-E\fR \fIencoding\fR .RS 4 Select an output character encoding\&. If this option is not used, the bibliography data will use the character encoding of the database\&. See iconv_open(3) for a list of available encodings\&. .RE .PP \fB\-G\fR \fICSS\-file\fR .RS 4 Set the path or the URL of a CSS file to be used by the (x)html output .RE .PP \fB\-h\fR .RS 4 Displays help and usage screen, then exits\&. .RE .PP \fB\-i\fR \fIIP\-address\fR .RS 4 Set the IP address of the box which is running the application server refdbd(1)\&. Instead of the IP address you can also specify the hostname as long as it can be properly resolved by your system\&. .RE .PP \fB\-I\fR \fIname\fR .RS 4 Change the value of an entity declaration to include marked sections\&. Multiple entries are possible\&. These are passed as \fB\-i\fR options to Jade/OpenJade\&. .RE .PP \fB\-j\fR \fIjade\-args\fR .RS 4 Set additional command line options for Jade/OpenJade .RE .PP \fB\-N\fR \fInumber\fR .RS 4 Use this option to specify where the numbering of the references is supposed to start\&. The default is 1\&. This option comes in handy if you need to cobble together composite bibliographies or per\-chapter bibliographies that still need to be numbered consecutively\&. .RE .PP \fB\-r\fR .RS 4 Use this option to request a raw instead of a cooked bibliography\&. Raw bibliographies are not formatted in any way and are processed with the standard DocBook or TEI stylesheets instead of with the RefDB driver files\&. .RE .PP \fB\-s\fR .RS 4 Skip the ID extraction step of runbib\&. You have to provide an aptly named XML file containing the requested IDs\&. .RE .PP \fB\-S\fR \fIstyle\fR .RS 4 Specifies the bibliography style\&. This controls the formatting of the bibliography and the in\-text citations when the document is processed\&. .RE .PP \fB\-t\fR \fIoutput\-type\fR .RS 4 Select the output type\&. Use \fIdb31\fR to generate DocBook SGML bibliographies, \fIdb31x\fR for DocBook XML bibliographies, \fIteix\fR for TEI XML bibliographies, \fIbibtex\fR for BibTeX bibliographies, and \fIrtf\fR for RTF bibliographies\&. .RE .PP \fB\-u\fR \fIname\fR .RS 4 Set the username for the database access\&. Note: This username need not be identical to the login name of the user\&. This is the username required to access the database server\&. .RE .PP \fB\-w\fR \fIpassword\fR .RS 4 Set the password for the database access\&. Note: This password need not be identical to the login password of the user\&. This is the password required to access the database server\&. .RE .SH "CONFIGURATION" .PP Instead of using the command\-line switches, runbib can also be configured by means of the runbib configuration file\&. As with all refdb configuration files, you may maintain a global copy in /usr/local/etc/refdb/ and one copy per user in \fB$HOME\fR\&. Keep in mind that the runbib configuration file covers only those options which are not passed to refdbib(1) as that tool has its own configuration file\&. .sp .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .B Table\ \&1.\ \&refdbjaderc .TS allbox tab(:); lB lB lB. T{ Variable T}:T{ Default T}:T{ Comment T} .T& l l l l l l l l l. T{ jade_includearg T}:T{ none T}:T{ Change the value of an entity declaration to include marked sections\&. Multiple entries are possible\&. These are passed as \fB\-i\fR options to Jade/OpenJade\&. T} T{ jadeargs T}:T{ none T}:T{ Set additional command line options for Jade/OpenJade\&. Use e\&.g\&. "\-E 0" to disable the maximum error limit T} T{ outformat T}:T{ db31 T}:T{ Set the default output format\&. Supported values are db31 (DocBook SGML 3\&.1 and later), db31x (DocBook XML 3\&.1 and later), db50x (DocBook XML 5\&.0 and later), teix (TEI P4), bibtex, and rtf\&. T} .TE .sp 1 .SH "SGML OUTPUT" .PP refdbib generates two output files in addition to the ID listing created by Jade/OpenJade\&. runbib creates another output file from these\&. Assuming you have a source file foo\&.sgml and use the bibliography style J\&.Biol\&.Chem\&. you will get: .PP J\&.Biol\&.Chem\&.dsl .RS 4 This is the DSSSL driver file file that encodes some additional formatting information specific for the chosen bibliography style for use in subsequent document transformations\&. This file will be written to the present working directory\&. The driver file is a dual\-purpose stylesheet for HTML and printable output\&. .RE .PP foo\&.id\&.xml .RS 4 This is the intermediate XML file that encodes the citations in foo\&.sgml\&. .RE .PP foo\&.bib\&.sgml .RS 4 This is the file that holds the DocBook bibliography element\&. You have to include this file as an external entity into your source document to integrate the bibliography into your text\&. .RE .PP J\&.Biol\&.Chem\&.css .RS 4 This is a CSS file which contains formatting information used by the html output\&. .RE .SH "XML OUTPUT" .PP refdbib again generates two output files as for the DocBook SGML output above, and we also count the ID listing created by xsltproc\&. However, runbib does a little post\-processing, so you\*(Aqll get two additional files in the end\&. Assuming you have a source file foo\&.xml and use the bibliography style J\&.Biol\&.Chem\&. you will get: .PP J\&.Biol\&.Chem\&.fo\&.xsl .RS 4 This is the XSL driver file used for printable output, containing additional formatting information specific for the chosen bibliography style\&. This file will be written to the present working directory\&. .RE .PP J\&.Biol\&.Chem\&.html\&.xsl .RS 4 This is the XSL driver file used for HTML output, containing additional formatting information specific for the chosen bibliography style\&. This file will be written to the present working directory\&. .RE .PP foo\&.id\&.xml .RS 4 This is the intermediate XML file that encodes the citations in foo\&.xml\&. .RE .PP foo\&.bib\&.xml .RS 4 This is the file that holds the DocBook or TEI bibliography\&. You have to include this file as an external entity into your source document to integrate the bibliography into your text\&. .RE .PP J\&.Biol\&.Chem\&.css .RS 4 This is a CSS file which contains formatting information used by the html or xhtml output\&. .RE .SH "BIBTEX OUTPUT" .PP refdbib creates one output file with the reference information\&. If your document is named foo\&.tex, \fBlatex\fR will create a file foo\&.aux which refdbib uses as an input file\&. The refdbib output file will then be named foo\&.bib and can be used by \fBbibtex\fR as an input file\&. .SH "RTF OUTPUT" .PP refdbib creates one output file with the reference information\&. If your document is named foo\&.rtf, \fBrtfcitations\fR extracts the citations and writes them into foo\&.id\&.xml which refdbib uses as an input file\&. The refdbib output file will then be named foo\&.bib\&.rtf and can be used by \fBrefdbrtf\fR as an input file\&. .SH "EXAMPLE" .PP You should run this script from the directory where your document files are stored, as all output will be written to the present working directory by default\&. .PP The following command will create a DocBook SGML bibliography file together with a DSSSL stylesheet driver file for the DocBook SGML document mypaper\&.sgml\&. The output files are tweaked to match the citation and bibliography style of the "Journal of Biological Chemistry", which was added to the database with the name "J\&.Biol\&.Chem\&." previously\&. All references which do not contain a hard\-coded database name are assumed to be in the database bar\&. .sp .if n \{\ .RS 4 .\} .nf ~$ \fBrunbib \-d bar \-S "J\&.Biol\&.Chem\&." \-t db31 mypaper\&.sgml\fR .fi .if n \{\ .RE .\} .SH "FILES" .PP PREFIX/etc/refdb/refdbibrc .RS 4 The global configuration file of refdbib(1), which does most of the work of runbib\&. .RE .PP $HOME/\&.refdbibrc .RS 4 The user configuration file of refdbib\&. .RE .SH "SEE ALSO" .PP \fBRefDB\fR (7), \fBrefdbd\fR (1), \fBrefdbib\fR (1), \fBrefdbnd\fR (1), \fBrefdba\fR (1), \fBrefdbc\fR (1)\&. .PP \fIRefDB manual (local copy) \fR PREFIX/share/doc/refdb\-/refdb\-manual/index\&.html .PP \fIRefDB manual (web) \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/manual/index\&.html\fR\m[]> .PP \fIRefDB on the web \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/\fR\m[]> .SH "AUTHOR" .PP runbib was written by Markus Hoenicka \&. refdb-1.0.2/man/runbib-missing.1000644 001750 001750 00000007120 12255423010 017221 0ustar00markusmarkus000000 000000 '\" t .\" Title: runbib-missing .\" Author: [see the "Author" section] .\" Generator: DocBook XSL Stylesheets v1.76.1 .\" Date: 2011-03-08 .\" Manual: RefDB Manual .\" Source: RefDB Manual .\" Language: English .\" .TH "RUNBIB\-MISSING" "1" "2011\-03\-08" "RefDB Manual" "RefDB Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" runbib-missing \- displays references not found by runbib(1) .SH "SYNOPSIS" .HP \w'\fBrunbib\-missing\fR\ 'u \fBrunbib\-missing\fR [\fB\-b\fR\ \fIbasename\fR] .HP \w'\fBrunbib\-missing\fR\ 'u \fBrunbib\-missing\fR [\fB\-f\fR\ \fIbasename\&.bib\&.xml\fR] \fIbasename\&.id\&.xml\fR .HP \w'\fBrunbib\-missing\fR\ 'u \fBrunbib\-missing\fR [\fB\-\fR] .SH "DESCRIPTION" .PP runbib(1) may report that it was unable to locate some or all of the references cited in the document, but it will not tell you which ones were missing\&. runbib\-missing collects a list of the ID values which caused these failures and sends them to stdout\&. .SH "OPTIONS" .PP \fB\-b\fR \fIbasename\fR .RS 4 The basename, optionally including a path, of your document\&. runbib\-missing assumes that the ID file is called basename\&.id\&.xml, and the bibliography file is called basename\&.bib\&.xml\&. This is always the case if you use tools like runbib(1) and refdbnd(1) to create your bibliographies\&. Using this option is the simplest and recommended way to run the script\&. .RE .PP \fB\-f\fR \fIbasename\&.bib\&.xml\fR .RS 4 The relative or full path of the bibliography file created by runbib(1)\&. .RE .PP \fB\-h\fR .RS 4 Displays help and usage screen, then exits\&. .RE .PP \fIbasename\&.id\&.xml\fR .RS 4 The relative or full path of the ID file created by runbib(1)\&. Optionally you can pipe the data into stdin instead of specifying the file as a parameter\&. .RE .SH "CONFIGURATION" .PP runbib\-missing does not use any configuration files\&. .SH "EXAMPLE" .PP For the least amount of typing, you should run this script from the directory where your document files are stored\&. Then the following command will diplay the IDs, if any, of all RefDB citations which were not found in the database during the most recent runbib(1) invocation on your document thesis\&.xml\&. .sp .if n \{\ .RS 4 .\} .nf ~$ \fBrunbib\-missing \-b thesis\fR .fi .if n \{\ .RE .\} .SH "SEE ALSO" .PP \fBRefDB\fR (7), \fBrefdbib\fR (1), \fBrefdbnd\fR (1), \fBrunbib\fR (1)\&. .PP \fIRefDB manual (local copy) \fR PREFIX/share/doc/refdb\-/refdb\-manual/index\&.html .PP \fIRefDB manual (web) \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/manual/index\&.html\fR\m[]> .PP \fIRefDB on the web \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/\fR\m[]> .SH "AUTHOR" .PP runbib\-missing was written by Markus Hoenicka \&. refdb-1.0.2/man/refdbxp.1000644 001750 001750 00000017731 12255423011 015735 0ustar00markusmarkus000000 000000 '\" t .\" Title: refdbxp .\" Author: [see the "Author" section] .\" Generator: DocBook XSL Stylesheets v1.76.1 .\" Date: 2005-10-17 .\" Manual: RefDB Manual .\" Source: RefDB Manual .\" Language: English .\" .TH "REFDBXP" "1" "2005\-10\-17" "RefDB Manual" "RefDB Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" refdbxp \- converts short and full citation formats in SGML and XML documents containing RefDB citations\&. .SH "SYNOPSIS" .HP \w'\fBrefdbxp\fR\ 'u \fBrefdbxp\fR [\fB\-h\fR] [\fB\-s\fR] [\fB\-t\fR\ \fIinput\-format\fR] \fIrefdbxp\fR .SH "DESCRIPTION" .PP refdbxp allows the interconversion of the short and full notation of citations in the supported SGML and XML documents of RefDB(7)\&. See the RefDB manual (see below) for information about the two notations\&. The conversion is round\-trip safe, and it supports mixing short and full notation in the same source document\&. Full\-notation citations will use the correct encoding for first and subsequent citations of the same reference\&. .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBNote\fR .ps -1 .br .PP You should be aware that refdbxp is not a SGML or XML\-aware tool\&. It is a simple text replacement tool with some restrictions: .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} If you comment out citation elements, they still count as if they were present when the first/subsequent citation issue is resolved (refdbxp simply doesn\*(Aqt know about the concept of a comment)\&. In the following example, the citation in the last line will be the only one transformed, but it will be formatted as a subsequent citation of reference 9, not as the first citation: .sp .if n \{\ .RS 4 .\} .nf 9; first occurrence \-\-> 9; .fi .if n \{\ .RE .\} .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} If you use SGML/XML tags within a comment and nest this comment ingeniously between the start tag and the end tag of an element relevant for refdbxp, you shoot yourself in the foot\&. You do not want to use code like this (why would you, anyways?): .sp .if n \{\ .RS 4 .\} .nf \-\->2;5;9; .fi .if n \{\ .RE .\} .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} refdbxp does not include external entities\&. The whole document refdbxp is supposed to convert needs to be in one chunk\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} refdbxp currently does not support multiple databases per document\&. .RE .PP One way to work around the problem with comments is to create a copy of your master source and use a small script to remove comments just before you process and transform your text\&. To work around the fact that refdbxp does not treat external entities correctly, use a tool like \fBsgmlnorm\fR (shipped with the Jade/OpenJade packages) to preprocess the document\&. To work around the missing support of multiple databases, well\&.\&.\&. just wait\&. .sp .5v .RE .SH "OPTIONS" .PP \fB\-h\fR .RS 4 Prints a command synopsis on the screen and exits\&. .RE .PP \fB\-s\fR .RS 4 Create citations using the short notation\&. The default is to use the full notation\&. .RE .PP \fB\-t\fR \fIinput\-format\fR .RS 4 Select the type of input\&. Currently supported values are \fIdb31\fR (DocBook SGML version 3\&.1 or later), \fIdb31x\fR (DocBook XML, all versions), and \fIteix\fR (TEI XML)\&. .RE .SH "EXAMPLE" .PP Lets first try the most common usage of refdbxp\&. The following command expands all citations, regardless of whether they are written in short or full notation, to the full notation and writes the result to a new file foo\&.full\&.sgml\&. The input from foo\&.sgml is assumed to be DocBook SGML: .sp .if n \{\ .RS 4 .\} .nf ~$ \fBrefdbxp \-t db31 < foo\&.sgml > foo\&.full\&.sgml\fR .fi .if n \{\ .RE .\} .PP The following command goes the other way\&. This time we convert all citations of a TEI XML document, regardless of whether they are written in short or full notation, to the short notation and write the result to a new file: .sp .if n \{\ .RS 4 .\} .nf ~$ \fBrefdbxp \-t teix \-s < bar\&.xml > bar\&.short\&.xml\fR .fi .if n \{\ .RE .\} .PP The last example shows how to treat documents that consist of several files\&. The DocBook SGML master file foo_master\&.sgml includes several other subdocuments as external entities\&. Treating those files individually with refdbxp would screw up things as the first/subsequent citation issue would not be treated correctly and collisions of automatically created element IDs would result\&. The following command comes to the rescue and expands all citations in the document correctly: .sp .if n \{\ .RS 4 .\} .nf ~$ \fBosgmlnorm \-dn /usr/local/share/sgml/docbook/4\&.1/docbook\&.dcl foo_master\&.sgml | refdbxp \-t db31 > foo\&.full\&.sgml\fR .fi .if n \{\ .RE .\} .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBNote\fR .ps -1 .br .PP You may have realized that there\*(Aqs two small problems with this procedure\&. First, using (o)sgmlnorm will also include the external entity that contains (or will contain once it\*(Aqs created) the bibliography element created by refdb\&. One way around this is to use a mock file that just contains the entity reference in a comment\&. Lets assume your document foo\&.sgml wants to include the bibliography by using the entity declaration %bibliography; at the proper location\&. The entity is declared in the declaration subset at the top of your sourcefile as the external file foo\&.bib\&.sgml\&. Then you should create a file foo\&.bib\&.sgml with the following contents: .sp .if n \{\ .RS 4 .\} .nf .fi .if n \{\ .RE .\} .PP We have to outcomment the entity reference as these may be nested, i\&.e\&. the parser would try to replace this entity again and fail because the entity is already opened\&. After the conversion you just need to uncomment the parameter entity\&. If you like long commands, you could do this on the fly like this: .sp .if n \{\ .RS 4 .\} .nf ~$ \fBosgmlnorm \-dn /usr/local/share/sgml/docbook/4\&.1/docbook\&.dcl foo_master\&.sgml | refdbxp \-t db31 | sed \*(Aqs%%\e&bibliography;%\*(Aq > foo\&.full\&.sgml\fR .fi .if n \{\ .RE .\} .PP Second, (o)nsgmlnorm will not output the internal declaration subset that we need at least to declare the parameter entity for the bibliography\&. You could fix this with a sed command along the lines of the command shown above or add it back manually\&. .sp .5v .RE .SH "SEE ALSO" .PP \fBRefDB\fR (7), \fBrefdbnd\fR (1)\&. .PP \fIRefDB manual (local copy) \fR PREFIX/share/doc/refdb\-/refdb\-manual/index\&.html .PP \fIRefDB manual (web) \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/manual/index\&.html\fR\m[]> .PP \fIRefDB on the web \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/\fR\m[]> .SH "AUTHOR" .PP refdbxp was written by Markus Hoenicka \&. refdb-1.0.2/man/refdb-bug.1000644 001750 001750 00000004335 12255423012 016135 0ustar00markusmarkus000000 000000 '\" t .\" Title: refdb-bug .\" Author: [see the "Author" section] .\" Generator: DocBook XSL Stylesheets v1.76.1 .\" Date: 12/22/2013 .\" Manual: RefDB Manual .\" Source: February 26, 2005 .\" Language: English .\" .TH "REFDB\-BUG" "1" "12/22/2013" "February 26, 2005" "RefDB Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" refdb-bug \- RefDB tool: writes text file containing summary of RefDB\*(Aqs configuration .SH "SYNOPSIS" .HP \w'\fBrefdb\-bug\fR\ 'u \fBrefdb\-bug\fR .SH "DESCRIPTION" .PP RefDB is a free and portable reference and notes database as well as a bibliography application that serves a similar purpose for SGML, XML, and LaTeX documents as \fIReference Manager\fR or \fIEndNote\fR do for word processor documents\&. .PP This script creates a text file (\&./refdb\-bug\&.txt) containing useful information about RefDB\*(Aqs configuration\&. This file can be attached to bug reports to aid in debugging\&. .SH "SEE ALSO" .PP \fIRefDB manual (local copy) \fR PREFIX/share/doc/refdb\-/refdb\-manual/index\&.html .PP \fIRefDB manual (web) \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/manual/index\&.html\fR\m[]> .SH "AUTHOR" .PP RefDB was written by Markus Hoenicka \&. .PP This manual page was written by David Nebauer for the Debian project (but may be used by others)\&. refdb-1.0.2/man/refdb_dos2unix.1000644 001750 001750 00000005112 12255423012 017207 0ustar00markusmarkus000000 000000 '\" t .\" Title: refdb_dos2unix .\" Author: [see the "Author" section] .\" Generator: DocBook XSL Stylesheets v1.76.1 .\" Date: 12/22/2013 .\" Manual: RefDB Manual .\" Source: February 26, 2005 .\" Language: English .\" .TH "REFDB_DOS2UNIX" "1" "12/22/2013" "February 26, 2005" "RefDB Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" refdb_dos2unix \- RefDB tool: convert file formats from DOS to Unix .SH "SYNOPSIS" .HP \w'\fBrefdb_dos2unix\fR\ 'u \fBrefdb_dos2unix\fR [\-h] \fIfile1\fR [\fIfile2\fR...] .SH "DESCRIPTION" .PP RefDB is a free and portable reference and notes database as well as a bibliography application that serves a similar purpose for SGML, XML, and LaTeX documents as \fIReference Manager\fR or \fIEndNote\fR do for word processor documents\&. The bibliography part is something like bibtex for markup languages\&. RefDB consists of an application server which interacts with a relational database on the server side and a variety of clients (including refdba and refdbc) on the workstation side\&. These clients perform the common tasks of a reference database, like adding and searching entries, as well as generating bibliographies\&. .PP refdb_dos2unix is a helper utility that converts a file from DOS format (newline = \er\en) to Unix format (newline = \en)\&. .SH "SEE ALSO" .PP \fIRefDB manual (local copy) \fR PREFIX/share/doc/refdb\-/refdb\-manual/index\&.html .PP \fIRefDB manual (web) \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/manual/index\&.html\fR\m[]> .SH "AUTHOR" .PP RefDB was written by Markus Hoenicka \&. .PP This manual page was written by David Nebauer for the Debian project (but may be used by others)\&. refdb-1.0.2/man/refdb_latex2utf8txt.1000644 001750 001750 00000005321 12255423013 020205 0ustar00markusmarkus000000 000000 '\" t .\" Title: refdb_latex2utf8txt .\" Author: [see the "Author" section] .\" Generator: DocBook XSL Stylesheets v1.76.1 .\" Date: 2006-08-11 .\" Manual: RefDB Manual .\" Source: RefDB Manual .\" Language: English .\" .TH "REFDB_LATEX2UTF8TXT" "1" "2006\-08\-11" "RefDB Manual" "RefDB Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" refdb_latex2utf8txt \- converts bibtex bibliographic data to UTF\-8 plain text .SH "SYNOPSIS" .HP \w'\fBrefdb_latex2utf8txt\fR\ 'u \fBrefdb_latex2utf8txt\fR .SH "DESCRIPTION" .PP refdb_latex2utf8txt is a helper tool which is used by bib2ris\-utf8 to clean up the output of bib2ris\&. It is implemented as a filter which reads from stdin and writes to stdout, without any command\-line options\&. .SH "DIAGNOSTICS" .PP The exit code of \fBrefdb_latex2utf8txt\fR is always 0 (zero)\&. .SH "DATA PROCESSING" .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} The conversion that this tool performs was designed to facilitate the import of reference data from bibtex, through bib2ris (1), to RefDB\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} Foreign and special characters which are encoded as LaTeX commands are converted to their UTF\-8 counterparts\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} All other LaTeX command are stripped off\&. .RE .SH "SEE ALSO" .PP \fBRefDB\fR (7), \fBbib2ris\fR (1)\&. .PP \fIRefDB manual (local copy) \fR PREFIX/share/doc/refdb\-/refdb\-manual/index\&.html .PP \fIRefDB manual (web) \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/manual/index\&.html\fR\m[]> .PP \fIRefDB on the web \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/\fR\m[]> .SH "AUTHOR" .PP refdb_latex2utf8txt was written by Markus Hoenicka based on a similar script by Peter Csizmadia\&. refdb-1.0.2/man/rtfcitations.1000644 001750 001750 00000005721 12255423014 017013 0ustar00markusmarkus000000 000000 '\" t .\" Title: rtfcitations .\" Author: [see the "Author" section] .\" Generator: DocBook XSL Stylesheets v1.76.1 .\" Date: 2005-10-17 .\" Manual: RefDB Manual .\" Source: RefDB Manual .\" Language: English .\" .TH "RTFCITATIONS" "1" "2005\-10\-17" "RefDB Manual" "RefDB Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" rtfcitations \- Extracts RefDB citations from a text file and writes them into an XML file using the citationlistx\&.dtd\&. .SH "SYNOPSIS" .HP \w'\fBrtfcitations\fR\ 'u \fBrtfcitations\fR [\fB\-h\fR] .SH "DESCRIPTION" .PP rtfcitations reads a plain text document (such as the word processor format RTF, hence its name) from stdin and scans it for particular character sequences which denote RefDB citations\&. The citations are converted to an XML document following the citationlistx\&.dtd and sent to stdout\&. The input document may be any structured or non\-structured text which sticks to the following conventions: .PP Simple citations .RS 4 Enclose the RefDB citation key in double square brackets, as in "[[Miller1999]]"\&. .RE .PP Multi\-head citations .RS 4 Enclose each RefDB citation key in square brackets, and surround the entire multi\-head citation with another pair of square brackets, as in "[[Miller1999][Doe2001]]"\&. .RE .PP The resulting XML file can be fed to refdbib to generate a bibliography file containing the cited works\&. .SH "OPTIONS" .PP \fB\-h\fR .RS 4 Prints a command synopsis on the screen and exits\&. .RE .SH "EXAMPLE" .PP The following command extracts all citations from foo\&.rtf and writes them to foo\&.id\&.xml: .sp .if n \{\ .RS 4 .\} .nf ~$ \fBrtfcitations < foo\&.rtf > foo\&.id\&.xml\fR .fi .if n \{\ .RE .\} .SH "SEE ALSO" .PP \fBRefDB\fR (7), \fBrefdbib\fR (1)\&. .PP \fIRefDB manual (local copy) \fR PREFIX/share/doc/refdb\-/refdb\-manual/index\&.html .PP \fIRefDB manual (web) \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/manual/index\&.html\fR\m[]> .PP \fIRefDB on the web \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/\fR\m[]> .SH "AUTHOR" .PP rtfcitations was written by Markus Hoenicka \&. refdb-1.0.2/man/refdb-pubmed.1000644 001750 001750 00000005703 12255423014 016636 0ustar00markusmarkus000000 000000 '\" t .\" Title: refdb-pubmed .\" Author: [see the "Author" section] .\" Generator: DocBook XSL Stylesheets v1.76.1 .\" Date: 2009-10-28 .\" Manual: RefDB Manual .\" Source: RefDB Manual .\" Language: English .\" .TH "REFDB\-PUBMED" "1" "2009\-10\-28" "RefDB Manual" "RefDB Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" refdb-pubmed \- retrieves an XML representation of Pubmed (http://pubmed\&.org) entries by their Pubmed IDs .SH "SYNOPSIS" .HP \w'\fBrefdb\-pubmed\fR\ 'u \fBrefdb\-pubmed\fR [\-d\ \fIdatabase\fR] [\-h] [\-m\ \fImode\fR] [\-t\ \fItype\fR] [PMID...] .SH "DESCRIPTION" .PP refdb\-pubmed retrieves datasets from the Pubmed database using the \m[blue]\fBefetch utility\fR\m[]\&\s-2\u[1]\d\s+2\&. refdb\-pubmed reads Pubmed IDs (PMIDs) either as parameters from the command line, or on stdin\&. Input data should contain PMIDs separated by non\-digits (spaces, tabs, newlines, commas,\&.\&.\&.)\&. All results are written to stdout\&. .SH "OPTIONS" .PP \fB\-d\fR \fIdatabase\fR .RS 4 Specify the Pubmed database to query\&. Allowed values are \fIpubmed\fR, \fIpmc\fR, \fIjournals\fR, or \fIomim\fR\&. Default is pubmed\&. .RE .PP \fB\-h\fR .RS 4 Displays help and usage screen, then exits\&. .RE .PP \fB\-m\fR \fImode\fR .RS 4 Specify the retrieval mode\&. Allowed values are \fIxml\fR, \fIhtml\fR, \fItext\fR, and \fIasn\&.1\fR\&. Default is xml\&. .RE .PP \fB\-t\fR \fItype\fR .RS 4 Select the retrieval type\&. Allowed values are \fIuilist\fR, \fIabstract\fR, \fIcitation\fR, \fImedline\fR, or \fIfull\fR\&. Default is full\&. .RE .SH "SEE ALSO" .PP \fBRefDB\fR (7), \fBmed2ris\fR (1)\&. .PP \fIRefDB manual (local copy) \fR PREFIX/share/doc/refdb\-/refdb\-manual/index\&.html .PP \fIRefDB manual (web) \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/manual/index\&.html\fR\m[]> .PP \fIRefDB on the web \fR <\m[blue]\fBhttp://refdb\&.sourceforge\&.net/\fR\m[]> .SH "AUTHOR" .PP refdb\-pubmed was written by Markus Hoenicka \&. .SH "NOTES" .IP " 1." 4 efetch utility .RS 4 \%http://eutils.ncbi.nlm.nih.gov/corehtml/query/static/efetchlit_help.html .RE refdb-1.0.2/man/bib2ris-utf8.1000644 001750 001750 00000000016 12255422766 016527 0ustar00markusmarkus000000 000000 .so bib2ris.1 refdb-1.0.2/man/refdb.sh.8000644 001750 001750 00000000014 12255422767 016010 0ustar00markusmarkus000000 000000 .so refdb.8 refdb-1.0.2/doc/citationlistx/000755 001750 001750 00000000000 12303477605 017114 5ustar00markusmarkus000000 000000 refdb-1.0.2/doc/citestylex/000755 001750 001750 00000000000 12303477604 016412 5ustar00markusmarkus000000 000000 refdb-1.0.2/doc/risx/000755 001750 001750 00000000000 12303477605 015203 5ustar00markusmarkus000000 000000 refdb-1.0.2/doc/xnote/000755 001750 001750 00000000000 12303477605 015353 5ustar00markusmarkus000000 000000 refdb-1.0.2/doc/include/000755 001750 001750 00000000000 12303477605 015641 5ustar00markusmarkus000000 000000 refdb-1.0.2/doc/refdb-manual/000755 001750 001750 00000000000 12303477604 016552 5ustar00markusmarkus000000 000000 refdb-1.0.2/doc/Makefile.in000644 001750 001750 00000123330 12303475766 016273 0ustar00markusmarkus000000 000000 # Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = doc DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/./conf/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/./conf/mkinstalldirs CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(citationlistxdir)" \ "$(DESTDIR)$(citationlistxdtdelemdir)" \ "$(DESTDIR)$(citationlistxeledescdir)" \ "$(DESTDIR)$(citationlistxelementsdir)" \ "$(DESTDIR)$(citestylexdir)" \ "$(DESTDIR)$(citestylexdtdelemdir)" \ "$(DESTDIR)$(citestylexeledescdir)" \ "$(DESTDIR)$(citestylexelementsdir)" "$(DESTDIR)$(docdir)" \ "$(DESTDIR)$(indexdir)" "$(DESTDIR)$(risxdir)" \ "$(DESTDIR)$(risxdtdelemdir)" "$(DESTDIR)$(risxeledescdir)" \ "$(DESTDIR)$(risxelementsdir)" "$(DESTDIR)$(xnotedir)" \ "$(DESTDIR)$(xnotedtdelemdir)" "$(DESTDIR)$(xnoteeledescdir)" \ "$(DESTDIR)$(xnoteelementsdir)" DATA = $(citationlistx_DATA) $(citationlistxdtdelem_DATA) \ $(citationlistxeledesc_DATA) $(citationlistxelements_DATA) \ $(citestylex_DATA) $(citestylexdtdelem_DATA) \ $(citestylexeledesc_DATA) $(citestylexelements_DATA) \ $(doc_DATA) $(index_DATA) $(risx_DATA) $(risxdtdelem_DATA) \ $(risxeledesc_DATA) $(risxelements_DATA) $(xnote_DATA) \ $(xnotedtdelem_DATA) $(xnoteeledesc_DATA) \ $(xnoteelements_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BIB2RIS = @BIB2RIS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ ULLSPEC = @ULLSPEC@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bib2ris_LDADD = @bib2ris_LDADD@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ classpath_root = @classpath_root@ client1_mans = @client1_mans@ client_bins = @client_bins@ client_etc_distobjects = @client_etc_distobjects@ client_etc_objects = @client_etc_objects@ client_mans = @client_mans@ client_scripts = @client_scripts@ client_subdirs = @client_subdirs@ datadir = @datadir@ datarootdir = @datarootdir@ db_dir = @db_dir@ docbk_xsl = @docbk_xsl@ docbk_xsl_ns = @docbk_xsl_ns@ docdir = $(datadir)/doc/$(PACKAGE)-$(VERSION)/refdb-manual docs_subdirs = @docs_subdirs@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ log_dir = @log_dir@ main_db = @main_db@ man_subdirs = @man_subdirs@ mandir = @mandir@ mkdir_p = @mkdir_p@ mybatik = @mybatik@ mydtdformat = @mydtdformat@ mydtdparse = @mydtdparse@ myjade = @myjade@ myperl = @myperl@ mysgrep = @mysgrep@ myshell = @myshell@ mysvnversion = @mysvnversion@ mytidy = @mytidy@ myxmlcatalog = @myxmlcatalog@ myxsltproc = @myxsltproc@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psarg = @psarg@ psdir = @psdir@ refdba_LDADD = @refdba_LDADD@ refdbc_LDADD = @refdbc_LDADD@ refdbd_LDADD = @refdbd_LDADD@ sbindir = @sbindir@ server8_mans = @server8_mans@ server_bins = @server_bins@ server_etc_distobjects = @server_etc_distobjects@ server_etc_objects = @server_etc_objects@ server_mans = @server_mans@ server_scripts = @server_scripts@ server_subdirs = @server_subdirs@ sgml_decl = @sgml_decl@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ svnversioncommand = @svnversioncommand@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ tei_xsl = @tei_xsl@ tei_xsl_ns = @tei_xsl_ns@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ trang_cmd = @trang_cmd@ var_dir = @var_dir@ xml_decl = @xml_decl@ doc_DATA = refdb-manual.pdf refdb-manual/* indexdir = $(datadir)/doc/$(PACKAGE)-$(VERSION)/ index_DATA = index.html citestylexdir = $(datadir)/doc/$(PACKAGE)-$(VERSION)/citestylex citestylex_DATA = citestylex/*.html citestylexdtdelemdir = $(datadir)/doc/$(PACKAGE)-$(VERSION)/citestylex/dtdelem citestylexdtdelem_DATA = citestylex/dtdelem/* citestylexeledescdir = $(datadir)/doc/$(PACKAGE)-$(VERSION)/citestylex/ele-desc citestylexeledesc_DATA = $(top_srcdir)/doc/citestylex/ele-desc/*.html citestylexelementsdir = $(datadir)/doc/$(PACKAGE)-$(VERSION)/citestylex/elements citestylexelements_DATA = citestylex/elements/* risxdir = $(datadir)/doc/$(PACKAGE)-$(VERSION)/risx risx_DATA = risx/*.html risxdtdelemdir = $(datadir)/doc/$(PACKAGE)-$(VERSION)/risx/dtdelem risxdtdelem_DATA = risx/dtdelem/* risxeledescdir = $(datadir)/doc/$(PACKAGE)-$(VERSION)/risx/ele-desc risxeledesc_DATA = $(top_srcdir)/doc/risx/ele-desc/*.html risxelementsdir = $(datadir)/doc/$(PACKAGE)-$(VERSION)/risx/elements risxelements_DATA = risx/elements/* citationlistxdir = $(datadir)/doc/$(PACKAGE)-$(VERSION)/citationlistx citationlistx_DATA = citationlistx/*.html citationlistxdtdelemdir = $(datadir)/doc/$(PACKAGE)-$(VERSION)/citationlistx/dtdelem citationlistxdtdelem_DATA = citationlistx/dtdelem/* citationlistxeledescdir = $(datadir)/doc/$(PACKAGE)-$(VERSION)/citationlistx/ele-desc citationlistxeledesc_DATA = $(top_srcdir)/doc/citationlistx/ele-desc/*.html citationlistxelementsdir = $(datadir)/doc/$(PACKAGE)-$(VERSION)/citationlistx/elements citationlistxelements_DATA = citationlistx/elements/* xnotedir = $(datadir)/doc/$(PACKAGE)-$(VERSION)/xnote xnote_DATA = xnote/*.html xnotedtdelemdir = $(datadir)/doc/$(PACKAGE)-$(VERSION)/xnote/dtdelem xnotedtdelem_DATA = xnote/dtdelem/* xnoteeledescdir = $(datadir)/doc/$(PACKAGE)-$(VERSION)/xnote/ele-desc xnoteeledesc_DATA = $(top_srcdir)/doc/xnote/ele-desc/*.html xnoteelementsdir = $(datadir)/doc/$(PACKAGE)-$(VERSION)/xnote/elements xnoteelements_DATA = xnote/elements/* #################################################################### # the manual manual_sources = refdb-manual.xml chapter-backend-api.xml chapter-bibliographies.xml chapter-cs-protocol.xml chapter-data-input.xml chapter-inout-formats.xml chapter-installation.xml chapter-introduction.xml chapter-limitations.xml chapter-managing-notes.xml chapter-managing-references.xml chapter-overview-clients.xml chapter-perl-client-module.xml chapter-refdb-database-design.xml chapter-refdba.xml chapter-refdbc.xml chapter-refdbd-administration.xml chapter-refdbd.xml chapter-refdbib.xml chapter-reference-database-design.xml chapter-ris-risx-format.xml chapter-system-requirements.xml chapter-programming.xml chapter-sru.xml manpage_sources = RefDB.7.xml bib2ris.1.xml db2ris.1.xml eenc.1.xml en2ris.1.xml marc2ris.1.xml med2ris.1.xml refdb-backup.1.xml refdb-ms.1.xml refdb-restore.1.xml refdb.8.xml refdba.1.xml refdbc.1.xml refdbctl.1.xml refdbd.1.xml refdbib.1.xml refdbjade.1.xml refdbnd.1.xml refdbxml.1.xml refdbxp.1.xml runbib.1.xml runbib-missing.1.xml refdb-init.8.xml refdb-bug.1.xml refdb_dos2unix.1.xml refdb_latex2utf8txt.1.xml refdbsru.1.xml refdb-sruserver.1.xml rtfcitations.1.xml refdbrtf.1.xml refdb-pubmed.1.xml svg_images = refdbmanualfig1.svg refdbmanualfig2.svg refdbmanualfig3.svg refdbmanualfig4.svg refdbmanualfig5.svg refdbmanualfig6.svg png_images = $(top_srcdir)/doc/refdbmanualfig1.png $(top_srcdir)/doc/refdbmanualfig2.png $(top_srcdir)/doc/refdbmanualfig3.png $(top_srcdir)/doc/refdbmanualfig4.png $(top_srcdir)/doc/refdbmanualfig5.png $(top_srcdir)/doc/refdbmanualfig6.png html_extra_files = $(top_srcdir)/doc/manual.css $(png_images) manual_include_files = include/fotitlepage.templates.xml include/fotitlepages.xsl include/manual-fo.xsl include/manual-man.xsl include/manual-xhtml.xsl #################################################################### # the dtd documentation dtdparsefiles = citestylex.xml citestylex/elements.html risx.xml risx/elements.html citationlistx.xml citationlistx/elements.html xnote.xml xnote/elements.html EXTRA_DIST = $(doc_DATA) $(manual_sources) $(manpage_sources) $(html_extra_files) $(svg_images) $(citestylex_DATA) $(citestylexdtdelem_DATA) $(citestylexeledesc_DATA) $(citestylexelements_DATA) $(risx_DATA) $(risxdtdelem_DATA) $(risxeledesc_DATA) $(risxelements_DATA) $(citationlistx_DATA) $(citationlistxdtdelem_DATA) $(citationlistxeledesc_DATA) $(citationlistxelements_DATA) $(xnote_DATA) $(xnotedtdelem_DATA) $(xnoteeledesc_DATA) $(xnoteelements_DATA) $(index_DATA) $(dtdparsefiles) $(manual_include_files) refdb-manual-statustable.xml all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu doc/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-citationlistxDATA: $(citationlistx_DATA) @$(NORMAL_INSTALL) @list='$(citationlistx_DATA)'; test -n "$(citationlistxdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(citationlistxdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(citationlistxdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(citationlistxdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(citationlistxdir)" || exit $$?; \ done uninstall-citationlistxDATA: @$(NORMAL_UNINSTALL) @list='$(citationlistx_DATA)'; test -n "$(citationlistxdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(citationlistxdir)'; $(am__uninstall_files_from_dir) install-citationlistxdtdelemDATA: $(citationlistxdtdelem_DATA) @$(NORMAL_INSTALL) @list='$(citationlistxdtdelem_DATA)'; test -n "$(citationlistxdtdelemdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(citationlistxdtdelemdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(citationlistxdtdelemdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(citationlistxdtdelemdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(citationlistxdtdelemdir)" || exit $$?; \ done uninstall-citationlistxdtdelemDATA: @$(NORMAL_UNINSTALL) @list='$(citationlistxdtdelem_DATA)'; test -n "$(citationlistxdtdelemdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(citationlistxdtdelemdir)'; $(am__uninstall_files_from_dir) install-citationlistxeledescDATA: $(citationlistxeledesc_DATA) @$(NORMAL_INSTALL) @list='$(citationlistxeledesc_DATA)'; test -n "$(citationlistxeledescdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(citationlistxeledescdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(citationlistxeledescdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(citationlistxeledescdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(citationlistxeledescdir)" || exit $$?; \ done uninstall-citationlistxeledescDATA: @$(NORMAL_UNINSTALL) @list='$(citationlistxeledesc_DATA)'; test -n "$(citationlistxeledescdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(citationlistxeledescdir)'; $(am__uninstall_files_from_dir) install-citationlistxelementsDATA: $(citationlistxelements_DATA) @$(NORMAL_INSTALL) @list='$(citationlistxelements_DATA)'; test -n "$(citationlistxelementsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(citationlistxelementsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(citationlistxelementsdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(citationlistxelementsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(citationlistxelementsdir)" || exit $$?; \ done uninstall-citationlistxelementsDATA: @$(NORMAL_UNINSTALL) @list='$(citationlistxelements_DATA)'; test -n "$(citationlistxelementsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(citationlistxelementsdir)'; $(am__uninstall_files_from_dir) install-citestylexDATA: $(citestylex_DATA) @$(NORMAL_INSTALL) @list='$(citestylex_DATA)'; test -n "$(citestylexdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(citestylexdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(citestylexdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(citestylexdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(citestylexdir)" || exit $$?; \ done uninstall-citestylexDATA: @$(NORMAL_UNINSTALL) @list='$(citestylex_DATA)'; test -n "$(citestylexdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(citestylexdir)'; $(am__uninstall_files_from_dir) install-citestylexdtdelemDATA: $(citestylexdtdelem_DATA) @$(NORMAL_INSTALL) @list='$(citestylexdtdelem_DATA)'; test -n "$(citestylexdtdelemdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(citestylexdtdelemdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(citestylexdtdelemdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(citestylexdtdelemdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(citestylexdtdelemdir)" || exit $$?; \ done uninstall-citestylexdtdelemDATA: @$(NORMAL_UNINSTALL) @list='$(citestylexdtdelem_DATA)'; test -n "$(citestylexdtdelemdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(citestylexdtdelemdir)'; $(am__uninstall_files_from_dir) install-citestylexeledescDATA: $(citestylexeledesc_DATA) @$(NORMAL_INSTALL) @list='$(citestylexeledesc_DATA)'; test -n "$(citestylexeledescdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(citestylexeledescdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(citestylexeledescdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(citestylexeledescdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(citestylexeledescdir)" || exit $$?; \ done uninstall-citestylexeledescDATA: @$(NORMAL_UNINSTALL) @list='$(citestylexeledesc_DATA)'; test -n "$(citestylexeledescdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(citestylexeledescdir)'; $(am__uninstall_files_from_dir) install-citestylexelementsDATA: $(citestylexelements_DATA) @$(NORMAL_INSTALL) @list='$(citestylexelements_DATA)'; test -n "$(citestylexelementsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(citestylexelementsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(citestylexelementsdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(citestylexelementsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(citestylexelementsdir)" || exit $$?; \ done uninstall-citestylexelementsDATA: @$(NORMAL_UNINSTALL) @list='$(citestylexelements_DATA)'; test -n "$(citestylexelementsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(citestylexelementsdir)'; $(am__uninstall_files_from_dir) install-docDATA: $(doc_DATA) @$(NORMAL_INSTALL) @list='$(doc_DATA)'; test -n "$(docdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(docdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(docdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(docdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(docdir)" || exit $$?; \ done uninstall-docDATA: @$(NORMAL_UNINSTALL) @list='$(doc_DATA)'; test -n "$(docdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(docdir)'; $(am__uninstall_files_from_dir) install-indexDATA: $(index_DATA) @$(NORMAL_INSTALL) @list='$(index_DATA)'; test -n "$(indexdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(indexdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(indexdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(indexdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(indexdir)" || exit $$?; \ done uninstall-indexDATA: @$(NORMAL_UNINSTALL) @list='$(index_DATA)'; test -n "$(indexdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(indexdir)'; $(am__uninstall_files_from_dir) install-risxDATA: $(risx_DATA) @$(NORMAL_INSTALL) @list='$(risx_DATA)'; test -n "$(risxdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(risxdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(risxdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(risxdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(risxdir)" || exit $$?; \ done uninstall-risxDATA: @$(NORMAL_UNINSTALL) @list='$(risx_DATA)'; test -n "$(risxdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(risxdir)'; $(am__uninstall_files_from_dir) install-risxdtdelemDATA: $(risxdtdelem_DATA) @$(NORMAL_INSTALL) @list='$(risxdtdelem_DATA)'; test -n "$(risxdtdelemdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(risxdtdelemdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(risxdtdelemdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(risxdtdelemdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(risxdtdelemdir)" || exit $$?; \ done uninstall-risxdtdelemDATA: @$(NORMAL_UNINSTALL) @list='$(risxdtdelem_DATA)'; test -n "$(risxdtdelemdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(risxdtdelemdir)'; $(am__uninstall_files_from_dir) install-risxeledescDATA: $(risxeledesc_DATA) @$(NORMAL_INSTALL) @list='$(risxeledesc_DATA)'; test -n "$(risxeledescdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(risxeledescdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(risxeledescdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(risxeledescdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(risxeledescdir)" || exit $$?; \ done uninstall-risxeledescDATA: @$(NORMAL_UNINSTALL) @list='$(risxeledesc_DATA)'; test -n "$(risxeledescdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(risxeledescdir)'; $(am__uninstall_files_from_dir) install-risxelementsDATA: $(risxelements_DATA) @$(NORMAL_INSTALL) @list='$(risxelements_DATA)'; test -n "$(risxelementsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(risxelementsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(risxelementsdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(risxelementsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(risxelementsdir)" || exit $$?; \ done uninstall-risxelementsDATA: @$(NORMAL_UNINSTALL) @list='$(risxelements_DATA)'; test -n "$(risxelementsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(risxelementsdir)'; $(am__uninstall_files_from_dir) install-xnoteDATA: $(xnote_DATA) @$(NORMAL_INSTALL) @list='$(xnote_DATA)'; test -n "$(xnotedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(xnotedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(xnotedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(xnotedir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(xnotedir)" || exit $$?; \ done uninstall-xnoteDATA: @$(NORMAL_UNINSTALL) @list='$(xnote_DATA)'; test -n "$(xnotedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(xnotedir)'; $(am__uninstall_files_from_dir) install-xnotedtdelemDATA: $(xnotedtdelem_DATA) @$(NORMAL_INSTALL) @list='$(xnotedtdelem_DATA)'; test -n "$(xnotedtdelemdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(xnotedtdelemdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(xnotedtdelemdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(xnotedtdelemdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(xnotedtdelemdir)" || exit $$?; \ done uninstall-xnotedtdelemDATA: @$(NORMAL_UNINSTALL) @list='$(xnotedtdelem_DATA)'; test -n "$(xnotedtdelemdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(xnotedtdelemdir)'; $(am__uninstall_files_from_dir) install-xnoteeledescDATA: $(xnoteeledesc_DATA) @$(NORMAL_INSTALL) @list='$(xnoteeledesc_DATA)'; test -n "$(xnoteeledescdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(xnoteeledescdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(xnoteeledescdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(xnoteeledescdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(xnoteeledescdir)" || exit $$?; \ done uninstall-xnoteeledescDATA: @$(NORMAL_UNINSTALL) @list='$(xnoteeledesc_DATA)'; test -n "$(xnoteeledescdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(xnoteeledescdir)'; $(am__uninstall_files_from_dir) install-xnoteelementsDATA: $(xnoteelements_DATA) @$(NORMAL_INSTALL) @list='$(xnoteelements_DATA)'; test -n "$(xnoteelementsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(xnoteelementsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(xnoteelementsdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(xnoteelementsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(xnoteelementsdir)" || exit $$?; \ done uninstall-xnoteelementsDATA: @$(NORMAL_UNINSTALL) @list='$(xnoteelements_DATA)'; test -n "$(xnoteelementsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(xnoteelementsdir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-hook check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(citationlistxdir)" "$(DESTDIR)$(citationlistxdtdelemdir)" "$(DESTDIR)$(citationlistxeledescdir)" "$(DESTDIR)$(citationlistxelementsdir)" "$(DESTDIR)$(citestylexdir)" "$(DESTDIR)$(citestylexdtdelemdir)" "$(DESTDIR)$(citestylexeledescdir)" "$(DESTDIR)$(citestylexelementsdir)" "$(DESTDIR)$(docdir)" "$(DESTDIR)$(indexdir)" "$(DESTDIR)$(risxdir)" "$(DESTDIR)$(risxdtdelemdir)" "$(DESTDIR)$(risxeledescdir)" "$(DESTDIR)$(risxelementsdir)" "$(DESTDIR)$(xnotedir)" "$(DESTDIR)$(xnotedtdelemdir)" "$(DESTDIR)$(xnoteeledescdir)" "$(DESTDIR)$(xnoteelementsdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-citationlistxDATA \ install-citationlistxdtdelemDATA \ install-citationlistxeledescDATA \ install-citationlistxelementsDATA install-citestylexDATA \ install-citestylexdtdelemDATA install-citestylexeledescDATA \ install-citestylexelementsDATA install-docDATA \ install-indexDATA install-risxDATA install-risxdtdelemDATA \ install-risxeledescDATA install-risxelementsDATA \ install-xnoteDATA install-xnotedtdelemDATA \ install-xnoteeledescDATA install-xnoteelementsDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-citationlistxDATA \ uninstall-citationlistxdtdelemDATA \ uninstall-citationlistxeledescDATA \ uninstall-citationlistxelementsDATA uninstall-citestylexDATA \ uninstall-citestylexdtdelemDATA \ uninstall-citestylexeledescDATA \ uninstall-citestylexelementsDATA uninstall-docDATA \ uninstall-indexDATA uninstall-risxDATA \ uninstall-risxdtdelemDATA uninstall-risxeledescDATA \ uninstall-risxelementsDATA uninstall-xnoteDATA \ uninstall-xnotedtdelemDATA uninstall-xnoteeledescDATA \ uninstall-xnoteelementsDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am dist-hook distclean distclean-generic distdir dvi \ dvi-am html html-am info info-am install install-am \ install-citationlistxDATA install-citationlistxdtdelemDATA \ install-citationlistxeledescDATA \ install-citationlistxelementsDATA install-citestylexDATA \ install-citestylexdtdelemDATA install-citestylexeledescDATA \ install-citestylexelementsDATA install-data install-data-am \ install-docDATA install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-indexDATA \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-risxDATA \ install-risxdtdelemDATA install-risxeledescDATA \ install-risxelementsDATA install-strip install-xnoteDATA \ install-xnotedtdelemDATA install-xnoteeledescDATA \ install-xnoteelementsDATA installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic pdf pdf-am ps ps-am tags-am \ uninstall uninstall-am uninstall-citationlistxDATA \ uninstall-citationlistxdtdelemDATA \ uninstall-citationlistxeledescDATA \ uninstall-citationlistxelementsDATA uninstall-citestylexDATA \ uninstall-citestylexdtdelemDATA \ uninstall-citestylexeledescDATA \ uninstall-citestylexelementsDATA uninstall-docDATA \ uninstall-indexDATA uninstall-risxDATA \ uninstall-risxdtdelemDATA uninstall-risxeledescDATA \ uninstall-risxelementsDATA uninstall-xnoteDATA \ uninstall-xnotedtdelemDATA uninstall-xnoteeledescDATA \ uninstall-xnoteelementsDATA all: refdb-manual.pdf refdb-manual/* citestylex/elements.html risx/elements.html citationlistx/elements.html xnote/elements.html #################################################################### # building the manual # this is how we could validate the manual: # xmllint --noout --xinclude --relaxng /usr/local/share/emacs/21.3/site-lisp/nxml/schema/docbook.rng refdb-manual.xml 2>&1|less refdb-manual-statustable.xml: $(top_srcdir)/scripts/statgen.pl $(top_srcdir)/scripts/statgen.pl docbook > refdb-manual-statustable.xml @HAVEBATIK_TRUE@$(png_images): %.png: %.svg @HAVEBATIK_TRUE@ batik-rasterizer -m image/png $< @HAVEBATIK_FALSE@$(png_images): %.png: %.svg @HAVEBATIK_FALSE@ convert $< $@ include/fotitlepages.xsl: include/fotitlepage.templates.xml xsltproc -output include/fotitlepages.xsl $(docbk_xsl)/template/titlepage.xsl include/fotitlepage.templates.xml refdb-manual.pdf: $(manual_sources) $(manpage_sources) $(svg_images) refdb-manual-statustable.xml include/fotitlepages.xsl include/manual-fo.xsl @echo "Creating PDF manual..."; # xsltproc -o refdb-manual.fo --nonet --xinclude $(top_srcdir)/doc/include/manual-fo.xsl $(top_srcdir)/doc/refdb-manual.xml # workaround for a null pointer exception in fop 1.0: disable hyphenation @echo "hyphenation temporarily unavailable" xsltproc -o refdb-manual.fo --stringparam hyphenate 0 --nonet --xinclude $(top_srcdir)/doc/include/manual-fo.xsl $(top_srcdir)/doc/refdb-manual.xml # we have to give Java a little extra memory lest fop will die a horrible death JAVA_OPTS=-Xmx256M fop -fo refdb-manual.fo -pdf refdb-manual.pdf refdb-manual/*: $(manual_sources) $(manpage_sources) $(png_images) refdb-manual-statustable.xml include/manual-xhtml.xsl @echo "Creating HTML manual..."; rm -rf refdb-manual/* # building outside the source dir won't work here because the docbook # stylesheets screw up the location of the image files for HTML output mkdir -p refdb-manual && cp $(html_extra_files) refdb-manual/ && xsltproc -o refdb-manual/ --nonet --xinclude include/manual-xhtml.xsl refdb-manual.xml #################################################################### # building the DTD doc citestylex.xml: $(top_srcdir)/dtd/citestylex.dtd # dtdparse does not grok CATALOG directives, therefore we have to temporarily # disable all entries in SGML_CATALOG_FILES SGML_CATALOG_FILES="" dtdparse --title "citestyle XML DTD" --output citestylex.xml --declaration $(top_srcdir)/declarations/xml.dcl --system-id "http://refdb.sourceforge.net/dtd/citestylex.dtd" $(top_srcdir)/dtd/citestylex.dtd citestylex/elements.html: citestylex.xml $(top_srcdir)/doc/citestylex/ele-desc/* dtdformat --html citestylex.xml $(top_srcdir)/scripts/dtdparseweave citestylex citestylex/dtdelem/*: citestylex/elements.html citestylex/elements/*: citestylex/elements.html citestylex/*.html: citestylex/elements.html risx.xml: $(top_srcdir)/dtd/risx.dtd SGML_CATALOG_FILES="" dtdparse --title "risx XML DTD" --output risx.xml --declaration $(top_srcdir)/declarations/xml.dcl --system-id "http://refdb.sourceforge.net/dtd/risx.dtd" $(top_srcdir)/dtd/risx.dtd risx/elements.html: risx.xml $(top_srcdir)/doc/risx/ele-desc/* dtdformat --html risx.xml $(top_srcdir)/scripts/dtdparseweave risx risx/dtdelem/*: risx/elements.html risx/elements/*: risx/elements.html risx/*.html: risx/elements.html citationlistx.xml: $(top_srcdir)/dtd/citationlistx.dtd SGML_CATALOG_FILES="" dtdparse --title "citationlistx XML DTD" --output citationlistx.xml --declaration $(top_srcdir)/declarations/xml.dcl --system-id "http://refdb.sourceforge.net/dtd/citationlistx.dtd" $(top_srcdir)/dtd/citationlistx.dtd citationlistx/elements.html: citationlistx.xml $(top_srcdir)/doc/citationlistx/ele-desc/* dtdformat --html citationlistx.xml $(top_srcdir)/scripts/dtdparseweave citationlistx citationlistx/dtdelem/*: citationlistx/elements.html citationlistx/elements/*: citationlistx/elements.html citationlistx/*.html: citationlistx/elements.html xnote.xml: $(top_srcdir)/dtd/xnote.dtd SGML_CATALOG_FILES="" dtdparse --title "xnote XML DTD" --output xnote.xml --declaration $(top_srcdir)/declarations/xml.dcl --system-id "http://refdb.sourceforge.net/dtd/xnote.dtd" $(top_srcdir)/dtd/xnote.dtd xnote/elements.html: xnote.xml $(top_srcdir)/doc/xnote/ele-desc/* dtdformat --html xnote.xml $(top_srcdir)/scripts/dtdparseweave xnote xnote/dtdelem/*: xnote/elements.html xnote/elements/*: xnote/elements.html xnote/*.html: xnote/elements.html maintainer-clean: clean rm -f refdb-manual.pdf refdb-manual.tex refdb-manual.aux refdb-manual.log refdb-manual.out rm -rf refdb-manual/ rm -f $(png_images) rm -f include/fotitlepages.xsl rm -f citestylex.xml risx.xml citationlistx.xml xnote.xml rm -f citestylex/*.html rm -rf citestylex/dtdelem citestylex/dtdent citestylex/elements citestylex/entities citestylex/notations rm -f risx/*.html rm -rf risx/dtdelem risx/dtdent risx/elements risx/entities risx/notations rm -f citationlistx/*.html rm -rf citationlistx/dtdelem citationlistx/dtdent citationlistx/elements citationlistx/entities citationlistx/notations rm -f xnote/*.html rm -rf xnote/dtdelem xnote/dtdent xnote/elements xnote/entities xnote/notations dist-hook: # remove the subversion housekeeping directories from the tarball rm -rf `find $(distdir) -name .svn` rm -f `find $(distdir) -name *~` # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: refdb-1.0.2/doc/Makefile.am000644 001750 001750 00000023505 12247734370 016261 0ustar00markusmarkus000000 000000 ## Process this with automake to create Makefile.in docdir = $(datadir)/doc/$(PACKAGE)-$(VERSION)/refdb-manual doc_DATA = refdb-manual.pdf refdb-manual/* indexdir = $(datadir)/doc/$(PACKAGE)-$(VERSION)/ index_DATA = index.html citestylexdir = $(datadir)/doc/$(PACKAGE)-$(VERSION)/citestylex citestylex_DATA = citestylex/*.html citestylexdtdelemdir = $(datadir)/doc/$(PACKAGE)-$(VERSION)/citestylex/dtdelem citestylexdtdelem_DATA = citestylex/dtdelem/* citestylexeledescdir = $(datadir)/doc/$(PACKAGE)-$(VERSION)/citestylex/ele-desc citestylexeledesc_DATA = $(top_srcdir)/doc/citestylex/ele-desc/*.html citestylexelementsdir = $(datadir)/doc/$(PACKAGE)-$(VERSION)/citestylex/elements citestylexelements_DATA = citestylex/elements/* risxdir = $(datadir)/doc/$(PACKAGE)-$(VERSION)/risx risx_DATA = risx/*.html risxdtdelemdir = $(datadir)/doc/$(PACKAGE)-$(VERSION)/risx/dtdelem risxdtdelem_DATA = risx/dtdelem/* risxeledescdir = $(datadir)/doc/$(PACKAGE)-$(VERSION)/risx/ele-desc risxeledesc_DATA = $(top_srcdir)/doc/risx/ele-desc/*.html risxelementsdir = $(datadir)/doc/$(PACKAGE)-$(VERSION)/risx/elements risxelements_DATA = risx/elements/* citationlistxdir = $(datadir)/doc/$(PACKAGE)-$(VERSION)/citationlistx citationlistx_DATA = citationlistx/*.html citationlistxdtdelemdir = $(datadir)/doc/$(PACKAGE)-$(VERSION)/citationlistx/dtdelem citationlistxdtdelem_DATA = citationlistx/dtdelem/* citationlistxeledescdir = $(datadir)/doc/$(PACKAGE)-$(VERSION)/citationlistx/ele-desc citationlistxeledesc_DATA = $(top_srcdir)/doc/citationlistx/ele-desc/*.html citationlistxelementsdir = $(datadir)/doc/$(PACKAGE)-$(VERSION)/citationlistx/elements citationlistxelements_DATA = citationlistx/elements/* xnotedir = $(datadir)/doc/$(PACKAGE)-$(VERSION)/xnote xnote_DATA = xnote/*.html xnotedtdelemdir = $(datadir)/doc/$(PACKAGE)-$(VERSION)/xnote/dtdelem xnotedtdelem_DATA = xnote/dtdelem/* xnoteeledescdir = $(datadir)/doc/$(PACKAGE)-$(VERSION)/xnote/ele-desc xnoteeledesc_DATA = $(top_srcdir)/doc/xnote/ele-desc/*.html xnoteelementsdir = $(datadir)/doc/$(PACKAGE)-$(VERSION)/xnote/elements xnoteelements_DATA = xnote/elements/* #################################################################### # the manual manual_sources = refdb-manual.xml chapter-backend-api.xml chapter-bibliographies.xml chapter-cs-protocol.xml chapter-data-input.xml chapter-inout-formats.xml chapter-installation.xml chapter-introduction.xml chapter-limitations.xml chapter-managing-notes.xml chapter-managing-references.xml chapter-overview-clients.xml chapter-perl-client-module.xml chapter-refdb-database-design.xml chapter-refdba.xml chapter-refdbc.xml chapter-refdbd-administration.xml chapter-refdbd.xml chapter-refdbib.xml chapter-reference-database-design.xml chapter-ris-risx-format.xml chapter-system-requirements.xml chapter-programming.xml chapter-sru.xml manpage_sources = RefDB.7.xml bib2ris.1.xml db2ris.1.xml eenc.1.xml en2ris.1.xml marc2ris.1.xml med2ris.1.xml refdb-backup.1.xml refdb-ms.1.xml refdb-restore.1.xml refdb.8.xml refdba.1.xml refdbc.1.xml refdbctl.1.xml refdbd.1.xml refdbib.1.xml refdbjade.1.xml refdbnd.1.xml refdbxml.1.xml refdbxp.1.xml runbib.1.xml runbib-missing.1.xml refdb-init.8.xml refdb-bug.1.xml refdb_dos2unix.1.xml refdb_latex2utf8txt.1.xml refdbsru.1.xml refdb-sruserver.1.xml rtfcitations.1.xml refdbrtf.1.xml refdb-pubmed.1.xml svg_images = refdbmanualfig1.svg refdbmanualfig2.svg refdbmanualfig3.svg refdbmanualfig4.svg refdbmanualfig5.svg refdbmanualfig6.svg png_images = $(top_srcdir)/doc/refdbmanualfig1.png $(top_srcdir)/doc/refdbmanualfig2.png $(top_srcdir)/doc/refdbmanualfig3.png $(top_srcdir)/doc/refdbmanualfig4.png $(top_srcdir)/doc/refdbmanualfig5.png $(top_srcdir)/doc/refdbmanualfig6.png html_extra_files = $(top_srcdir)/doc/manual.css $(png_images) manual_include_files = include/fotitlepage.templates.xml include/fotitlepages.xsl include/manual-fo.xsl include/manual-man.xsl include/manual-xhtml.xsl #################################################################### # the dtd documentation dtdparsefiles = citestylex.xml citestylex/elements.html risx.xml risx/elements.html citationlistx.xml citationlistx/elements.html xnote.xml xnote/elements.html EXTRA_DIST = $(doc_DATA) $(manual_sources) $(manpage_sources) $(html_extra_files) $(svg_images) $(citestylex_DATA) $(citestylexdtdelem_DATA) $(citestylexeledesc_DATA) $(citestylexelements_DATA) $(risx_DATA) $(risxdtdelem_DATA) $(risxeledesc_DATA) $(risxelements_DATA) $(citationlistx_DATA) $(citationlistxdtdelem_DATA) $(citationlistxeledesc_DATA) $(citationlistxelements_DATA) $(xnote_DATA) $(xnotedtdelem_DATA) $(xnoteeledesc_DATA) $(xnoteelements_DATA) $(index_DATA) $(dtdparsefiles) $(manual_include_files) refdb-manual-statustable.xml all: refdb-manual.pdf refdb-manual/* citestylex/elements.html risx/elements.html citationlistx/elements.html xnote/elements.html #################################################################### # building the manual # this is how we could validate the manual: # xmllint --noout --xinclude --relaxng /usr/local/share/emacs/21.3/site-lisp/nxml/schema/docbook.rng refdb-manual.xml 2>&1|less refdb-manual-statustable.xml: $(top_srcdir)/scripts/statgen.pl $(top_srcdir)/scripts/statgen.pl docbook > refdb-manual-statustable.xml if HAVEBATIK $(png_images): %.png: %.svg batik-rasterizer -m image/png $< else $(png_images): %.png: %.svg convert $< $@ endif include/fotitlepages.xsl: include/fotitlepage.templates.xml xsltproc -output include/fotitlepages.xsl $(docbk_xsl)/template/titlepage.xsl include/fotitlepage.templates.xml refdb-manual.pdf: $(manual_sources) $(manpage_sources) $(svg_images) refdb-manual-statustable.xml include/fotitlepages.xsl include/manual-fo.xsl @echo "Creating PDF manual..."; # xsltproc -o refdb-manual.fo --nonet --xinclude $(top_srcdir)/doc/include/manual-fo.xsl $(top_srcdir)/doc/refdb-manual.xml # workaround for a null pointer exception in fop 1.0: disable hyphenation @echo "hyphenation temporarily unavailable" xsltproc -o refdb-manual.fo --stringparam hyphenate 0 --nonet --xinclude $(top_srcdir)/doc/include/manual-fo.xsl $(top_srcdir)/doc/refdb-manual.xml # we have to give Java a little extra memory lest fop will die a horrible death JAVA_OPTS=-Xmx256M fop -fo refdb-manual.fo -pdf refdb-manual.pdf refdb-manual/*: $(manual_sources) $(manpage_sources) $(png_images) refdb-manual-statustable.xml include/manual-xhtml.xsl @echo "Creating HTML manual..."; rm -rf refdb-manual/* # building outside the source dir won't work here because the docbook # stylesheets screw up the location of the image files for HTML output mkdir -p refdb-manual && cp $(html_extra_files) refdb-manual/ && xsltproc -o refdb-manual/ --nonet --xinclude include/manual-xhtml.xsl refdb-manual.xml #################################################################### # building the DTD doc citestylex.xml: $(top_srcdir)/dtd/citestylex.dtd # dtdparse does not grok CATALOG directives, therefore we have to temporarily # disable all entries in SGML_CATALOG_FILES SGML_CATALOG_FILES="" dtdparse --title "citestyle XML DTD" --output citestylex.xml --declaration $(top_srcdir)/declarations/xml.dcl --system-id "http://refdb.sourceforge.net/dtd/citestylex.dtd" $(top_srcdir)/dtd/citestylex.dtd citestylex/elements.html: citestylex.xml $(top_srcdir)/doc/citestylex/ele-desc/* dtdformat --html citestylex.xml $(top_srcdir)/scripts/dtdparseweave citestylex citestylex/dtdelem/*: citestylex/elements.html citestylex/elements/*: citestylex/elements.html citestylex/*.html: citestylex/elements.html risx.xml: $(top_srcdir)/dtd/risx.dtd SGML_CATALOG_FILES="" dtdparse --title "risx XML DTD" --output risx.xml --declaration $(top_srcdir)/declarations/xml.dcl --system-id "http://refdb.sourceforge.net/dtd/risx.dtd" $(top_srcdir)/dtd/risx.dtd risx/elements.html: risx.xml $(top_srcdir)/doc/risx/ele-desc/* dtdformat --html risx.xml $(top_srcdir)/scripts/dtdparseweave risx risx/dtdelem/*: risx/elements.html risx/elements/*: risx/elements.html risx/*.html: risx/elements.html citationlistx.xml: $(top_srcdir)/dtd/citationlistx.dtd SGML_CATALOG_FILES="" dtdparse --title "citationlistx XML DTD" --output citationlistx.xml --declaration $(top_srcdir)/declarations/xml.dcl --system-id "http://refdb.sourceforge.net/dtd/citationlistx.dtd" $(top_srcdir)/dtd/citationlistx.dtd citationlistx/elements.html: citationlistx.xml $(top_srcdir)/doc/citationlistx/ele-desc/* dtdformat --html citationlistx.xml $(top_srcdir)/scripts/dtdparseweave citationlistx citationlistx/dtdelem/*: citationlistx/elements.html citationlistx/elements/*: citationlistx/elements.html citationlistx/*.html: citationlistx/elements.html xnote.xml: $(top_srcdir)/dtd/xnote.dtd SGML_CATALOG_FILES="" dtdparse --title "xnote XML DTD" --output xnote.xml --declaration $(top_srcdir)/declarations/xml.dcl --system-id "http://refdb.sourceforge.net/dtd/xnote.dtd" $(top_srcdir)/dtd/xnote.dtd xnote/elements.html: xnote.xml $(top_srcdir)/doc/xnote/ele-desc/* dtdformat --html xnote.xml $(top_srcdir)/scripts/dtdparseweave xnote xnote/dtdelem/*: xnote/elements.html xnote/elements/*: xnote/elements.html xnote/*.html: xnote/elements.html maintainer-clean: clean rm -f refdb-manual.pdf refdb-manual.tex refdb-manual.aux refdb-manual.log refdb-manual.out rm -rf refdb-manual/ rm -f $(png_images) rm -f include/fotitlepages.xsl rm -f citestylex.xml risx.xml citationlistx.xml xnote.xml rm -f citestylex/*.html rm -rf citestylex/dtdelem citestylex/dtdent citestylex/elements citestylex/entities citestylex/notations rm -f risx/*.html rm -rf risx/dtdelem risx/dtdent risx/elements risx/entities risx/notations rm -f citationlistx/*.html rm -rf citationlistx/dtdelem citationlistx/dtdent citationlistx/elements citationlistx/entities citationlistx/notations rm -f xnote/*.html rm -rf xnote/dtdelem xnote/dtdent xnote/elements xnote/entities xnote/notations dist-hook: # remove the subversion housekeeping directories from the tarball rm -rf `find $(distdir) -name .svn` rm -f `find $(distdir) -name *~` refdb-1.0.2/doc/refdb-manual.pdf000644 001750 001750 00006772721 12255431171 017266 0ustar00markusmarkus000000 000000 %PDF-1.4 %ª«¬­ 4 0 obj << /Title (RefDB handbook - covers version 0.9.9) /Author (Markus Hoenicka) /Creator (DocBook XSL Stylesheets with Apache FOP) /Producer (Apache FOP Version 1.1) /CreationDate (D:20131222012918+01'00') >> endobj 5 0 obj << /N 3 /Length 11 0 R /Filter /FlateDecode >> stream xœ–wTSهϽ7½P’Š”ÐkhRH ½H‘.*1 JÀ"6DTpDQ‘¦2(à€£C‘±"Š…Q±ëDÔqp–Id­ß¼yïÍ›ß÷~kŸ½ÏÝgï}ÖºüƒÂLX € ¡Xáçň‹g` ðlàp³³BøF™|ØŒl™ø½º ùû*Ó?ŒÁÿŸ”¹Y"1P˜ŒçòøÙ\É8=Wœ%·Oɘ¶4MÎ0JÎ"Y‚2V“sò,[|ö™e9ó2„<ËsÎâeðäÜ'ã9¾Œ‘`çø¹2¾&cƒtI†@Æoä±|N6(’Ü.æsSdl-c’(2‚-ãyàHÉ_ðÒ/XÌÏËÅÎÌZ.$§ˆ&\S†“‹áÏÏMç‹ÅÌ07#â1Ø™YárfÏüYym²";Ø8980m-m¾(Ô]ü›’÷v–^„îDøÃöW~™ °¦eµÙú‡mi]ëP»ý‡Í`/в¾u}qº|^RÄâ,g+«ÜÜ\KŸk)/èïúŸC_|ÏR¾Ýïåaxó“8’t1C^7nfz¦DÄÈÎâpù 柇øþuü$¾ˆ/”ED˦L L–µ[Ȉ™B†@øŸšøÃþ¤Ù¹–‰ÚøЖX¥!@~(* {d+Ðï} ÆGù͋љ˜ûÏ‚þ}W¸LþÈ$ŽcGD2¸QÎìšüZ4 E@ê@èÀ¶À¸àA(ˆq`1à‚D €µ ”‚­`'¨u 4ƒ6ptcà48.Ë`ÜR0ž€)ð Ì@„…ÈR‡t CȲ…XäCP”%CBH@ë R¨ª†ê¡fè[è(tº C· Qhúz#0 ¦ÁZ°l³`O8Ž„ÁÉð28.‚·À•p|î„O×àX ?§€:¢‹0ÂFB‘x$ !«¤i@Ú¤¹ŠH‘§È[EE1PL” Ê…⢖¡V¡6£ªQP¨>ÔUÔ(j õMFk¢ÍÑÎèt,:‹.FW ›Ðè³èô8úƒ¡cŒ1ŽL&³³³ÓŽ9…ÆŒa¦±X¬:ÖëŠ År°bl1¶ {{{;Ž}ƒ#âtp¶8_\¡8áú"ãEy‹.,ÖXœ¾øøÅ%œ%Gщ1‰-‰ï9¡œÎôÒ€¥µK§¸lî.îžoo’ïÊ/çO$¹&•'=JvMÞž<™âžR‘òTÀT ž§ú§Ö¥¾N MÛŸö)=&½=—‘˜qTH¦ û2µ3ó2‡³Ì³Š³¤Ëœ—í\6% 5eCÙ‹²»Å4ÙÏÔ€ÄD²^2šã–S“ó&7:÷Hžrž0o`¹ÙòMË'ò}ó¿^ZÁ]Ñ[ [°¶`t¥çÊúUЪ¥«zWë¯.Z=¾Æo͵„µik(´.,/|¹.f]O‘VÑš¢±õ~ë[‹ŠEÅ76¸l¨ÛˆÚ(Ø8¸iMKx%K­K+Jßoæn¾ø•ÍW•_}Ú’´e°Ì¡lÏVÌVáÖëÛÜ·(W.Ï/Û²½scGÉŽ—;—ì¼PaWQ·‹°K²KZ\Ù]ePµµê}uJõHWM{­fí¦Ú×»y»¯ìñØÓV§UWZ÷n¯`ïÍz¿úΣ†Š}˜}9û6F7öÍúº¹I£©´éÃ~á~éˆ}ÍŽÍÍ-š-e­p«¤uò`ÂÁËßxÓÝÆl«o§·—‡$‡›øíõÃA‡{°Ž´}gø]mµ£¤ê\Þ9Õ•Ò%íŽë>x´·Ç¥§ã{Ëï÷Ó=Vs\åx٠‰¢ŸN柜>•uêééäÓc½Kz=s­/¼oðlÐÙóç|Ïé÷ì?yÞõü± ÎŽ^d]ìºäp©sÀ~ ãû:;‡‡º/;]îž7|âŠû•ÓW½¯ž»píÒÈü‘áëQ×oÞH¸!½É»ùèVú­ç·snÏÜYs}·äžÒ½Šûš÷~4ý±]ê =>ê=:ð`Áƒ;cܱ'?eÿô~¼è!ùaÅ„ÎDó#ÛGÇ&}'/?^øxüIÖ“™§Å?+ÿ\ûÌäÙw¿xü20;5þ\ôüÓ¯›_¨¿ØÿÒîeïtØôýW¯f^—¼Qsà-ëmÿ»˜w3¹ï±ï+?˜~èùôñî§ŒOŸ~÷„óû endstream endobj 6 0 obj [/ICCBased 5 0 R] endobj 7 0 obj << /Type /Metadata /Subtype /XML /Length 12 0 R >> stream en application/pdf RefDB handbook - covers version 0.9.9 Markus Hoenicka 2013-12-22T01:29:18+01:00 1.4 Apache FOP Version 1.1 2013-12-22T01:29:18+01:00 DocBook XSL Stylesheets with Apache FOP 2013-12-22T01:29:18+01:00 endstream endobj 10 0 obj << /Length 13 0 R /Filter /FlateDecode >> stream xœ]ÁN! @ï|Ez°R(½nÔk¸ã8«›ÉÙÙè÷[CåQ^› ÕuUÔ¦$0Ìñ‡°+Ú®!3£mÉÿ_\…zÅ(Ö)]ÞÍ&›ë;®ÓND ïþ*“bv,“¦ºÄÖÚ!àùâiÜÝlࣟß^K™._ ?4y3ŸµY›\;#òêé¢G RðÍ9”¯q9AÝöeV™ üš›’XÛ¨_ÖÖÐaà(R ˜j¬C8Kûeú<Á}çý0õÍw›u<[ó O€ endstream endobj 8 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 10 0 R >> endobj 11 0 obj 2596 endobj 12 0 obj 979 endobj 13 0 obj 219 endobj 15 0 obj << /Length 16 0 R /Filter /FlateDecode >> stream xœÍ”ËNÃ0E÷ó³¤ ÌØŽó`Yñ‹B$U!M ‰ÕVÀï3ŽS)tEÊŒ¯=×Ç+Hü\»FR¤i†e‡^—˜(Ôq/‘2De$”ÁCÉà§«$êœqÖòx‡ïÐá#,W¼fÄu?@Ì;«7X ØúœO‰oH¨‰D:=ÀEØà$IßÙh¯±âÝT2ú]ÅŸÀÇ‹Èô‡˜þÿ¢çžO®o÷„ØÆVŽ‹p ónº{a¾þ¤ZfD¤x¦ÁåÕkµ¹›ã®h×ÖÖ·XÚïêxB÷ÚÛ–÷ËD6[aþÌŽ|xù)#bÉvKï÷Rë¯>٪ݗuáKïóŽöûî| endstream endobj 14 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 15 0 R >> endobj 16 0 obj 279 endobj 18 0 obj << /URI (mailto:mhoenicka@users.sourceforge.net) /S /URI >> endobj 19 0 obj << /Type /Annot /Subtype /Link /Rect [ 219.44 701.389 290.81 710.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 18 0 R /H /I >> endobj 21 0 obj << /Type /Annot /Subtype /Link /Rect [ 296.64 701.389 463.04 710.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 18 0 R /H /I >> endobj 22 0 obj << /Length 23 0 R /Filter /FlateDecode >> stream xœÍVÉnÛ0½ë+xL€†¡H­=A›.@¦5ÐC-ÑIt(*Nþ¾#Ë6)ÉêÙöAóÈYÞ Ÿ–ÏGþ7ý% |œ$)Êjïå°î£˜"–B‚Â`¢—BTõ1ŽA\F¾€Kô×k<‚¾zOà“#q;,$ß§úã=8Ü`_?‚ ïnåÝÞ‡È'hµ±#ަ”B|ŠÌhÚÿ(ZÕèñê—ž‰ë'´úá}Yúd„àäÒÚ|Q™ÄqŒÉT>û4lXƒ•!c¿5"2…C•ÑÊÐÁp]¤LfŒ‰Kx®œ‹!·,𨥸išD°ƒ“‘hÞäÿôr1ÍÍ¥B{^Ë=Éìþ(ù«@×è†FPñŠ[³P*·HæÂÙÛ•ÜXTË¢t`Æ»ÖIiJ¬»Â¥­-^EcÑ"©-7YùÁÁ•àn±V4ùBi-¶J;4ZpÌK5œ¿;8J&“«dkð>,À1ºúÞX{­LiQ[ ßUgAÍß-ØÉÖ ;Ü۲ɪ.ÎféÕ™mg¼Ypºº½§Â )Å̧Ä÷AB³NᚯoàìŽñ3a1b’B< çá¶~›i¹u‡¶*eëö_UÎØ´àÆ!Ï­¹‘ÕቷÅþ&Š.€XzFñ ZcýË!a“v°y3‡4¨8×–O£y8ЈNúC9™Ã”{«ÈМðNégÙ'œK-2£ô»õ(eVžP¦ÃeÓžø~*ƒÝ‚†íÎþ d6J×ÜHeYñµê,ОË:&íý›Ïw¨¦Ûâ¹{u‡S¬sÏ[äh ­#ý ÆAq4æ9~rýܵè›Ìžù$–ú NÈ)£y,zœºƒD"ÖË¥sw`Yõ±.µ>Á³J·¸…Ùd&XÜ3IÉR“ž}žaÿ4ó†‘FP?„Ï‘™7vÞ,Þ?Ž:à endstream endobj 20 0 obj [ 19 0 R 21 0 R ] endobj 17 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 20 0 R /Contents 22 0 R >> endobj 23 0 obj 715 endobj 25 0 obj << /Length 26 0 R /Filter /FlateDecode >> stream xœÍ”MOÃ0 †ïþ>Âà8m>®“‚ LDâ0í€`l“V¤Uhûû8M'šÂîUvÞÚΓ¾j ‘ä¹IÁWZyð½C¯ktŒÆöRMªâšÈ ®ר`)Õ¸O=ƒ„Ï™„¢VÖ[|…/ ¼‡åJj>¤ïtax7ê¶¾@ò)ñ ‘òÓ\”;çïÆ˜¬‰’'¦WÈx™w)”|‚/"Óbúÿ‹ž=Ÿ$\o÷„ØÆNsâJ]6‹Ún`ávn+ùù9„€ñó÷VІ{‚³YKîˆÈZŒ .¯žßÚo|Pøt\·ÇÝút½Âøw±Ûø“õÞë endstream endobj 24 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 25 0 R >> endobj 26 0 obj 253 endobj 28 0 obj << /Type /Action /S /GoTo /D [27 0 R /XYZ 72.0 698.655 null] >> endobj 29 0 obj << /Type /Action /S /GoTo /D [27 0 R /XYZ 72.0 395.93 null] >> endobj 30 0 obj << /Type /Annot /Subtype /Link /Rect [ 298.908 724.155 473.723 733.155 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 28 0 R /H /I >> endobj 32 0 obj << /URI (http://www.mysql.com) /S /URI >> endobj 33 0 obj << /Type /Annot /Subtype /Link /Rect [ 456.748 503.781 489.528 512.781 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 32 0 R /H /I >> endobj 34 0 obj << /Type /Annot /Subtype /Link /Rect [ 499.374 503.781 523.274 512.781 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 32 0 R /H /I >> endobj 35 0 obj << /Type /Annot /Subtype /Link /Rect [ 130.0 491.781 198.33 500.781 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 32 0 R /H /I >> endobj 36 0 obj << /URI (http://www.postgresql.org) /S /URI >> endobj 37 0 obj << /Type /Annot /Subtype /Link /Rect [ 221.101 491.781 269.991 500.781 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 36 0 R /H /I >> endobj 38 0 obj << /Type /Annot /Subtype /Link /Rect [ 275.821 491.781 380.821 500.781 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 36 0 R /H /I >> endobj 39 0 obj << /URI (http://www.sqlite.org) /S /URI >> endobj 40 0 obj << /Type /Annot /Subtype /Link /Rect [ 350.766 479.781 379.656 488.781 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 39 0 R /H /I >> endobj 41 0 obj << /Type /Annot /Subtype /Link /Rect [ 385.03 479.781 470.59 488.781 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 39 0 R /H /I >> endobj 42 0 obj << /Type /Annot /Subtype /Link /Rect [ 442.097 433.43 523.275 442.43 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 29 0 R /H /I >> endobj 43 0 obj << /Type /Annot /Subtype /Link /Rect [ 130.0 421.43 246.22 430.43 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 29 0 R /H /I >> endobj 44 0 obj << /Length 45 0 R /Filter /FlateDecode >> stream xœí][·±~ß_Ñ+Àjó~9oq;9ˆ‘ãXÁ äa´;ÒN2—õ̬ýûSU¼w÷¬"†²/¿î"§ù±ªXd“ìŸnøÀàßKüãóÃÝîæ§xV ÒÄKšJhÆäÀÕ(ô°ÚKzØbž*!R þ4²€†ÿ½Ùß°á»›¿þdîùÞݰ …SQ?ÞüP=[€ôçô|lx{óÍ«›¯¿Õgë7…b”÷‚1¦ÝàF)<þ'†W»á¯·¿ßŸ‡û§»óæ°ñ÷áÕßüöUSYÉØè>·ºþÐ<"芵vdS¢bd¸WB‰x«y) ¿Ò\ 5/>2›=1«x®>ŸÍÃ]Ö+F˹÷Ö{¸5ºFuÔsúòÙTn®*Ÿ s¸tŒU—ƒ`£—SWrX¸èÁtd¬4å8|·Þ¯«íðf½:?×§@Ò¸À¡rƒ’£6˜ã.”ò7!tÈTŒtAìOë7¿ùfx1¼4fäÃíÓi}*hU’ç‡ãzýò¼Y«ÛÇ»‡Íy}‡X®þíö´®àä„0£gŽ1eÍüi¾Ý¼mÊâ#ÿª*Y9yÞ=dQ“'PŒV€šq¯h{QýàÝaڜΛýÛ9“ZOrÞ`F?zȷݬ÷çSƇ}NžÖ9ýîpüçé¼B¿˜¯6÷ë¯2Zíï«tI>>n7w“ŒëãÏ… R~ýÝz»]º^?Ê?ü!§ïWçÕëÕi}©èäÅk6Œ6c@k` ù°JcÈòõ·và¢í9Üàåh*A%j5€Ö‡ÐàU;×Í›ÝÃOd´É¡LÎìÈ­'ÒÑGŒL0§´“$TAÐH¡¥Uއ.è%Úƒ™+ÉÂk».L¸dWäU¦—¨ôFÌ¡ôp{RÈnc7è{8X8Vå%—\€ó7c™áZðwLA§¾Â@¥”Sà^„ñZr9[oÈ a½”ÔÚÙ\M£¬RXh¾ð üR¸‘sàFrTЬNƒ[t,FÀsZ…µÃŠsÏäȬõB?íííô¶Â8K3ÇL‰µ,?skZh ŸÝ n 9#5¸í!¤!½iUÙ‘*$n®Ž›·±ƒ‚$ö ÿ¸ ú)5|ÕõƒÝ:.‘Wrno~üÿ÷òÓýš1Ç…žÜܶ7%ÐÕ[WSÂå³÷¦…¾&\ñHU H¤–GâØ½ •>¿‡¶ ¿u»†4»{”Ãí›Ø p7îá†6ñúëÜ5!̵0ºl‰d”N ƹL:X’Qâ“XçgE͇Œ)Ø]`ãw%g߯ét„º}Û\ud›8®Ê='¦£~IÃyTÁ*%º³M¢`wKÜ•œÛ¦±¹’ê“Øæ†„ Šáz?fŠãd¦”Žª5öQ«d”èÎL‰‚Ý6.qWröm¦Ö³Aq’™>ÖF×ÚimÁÛbŽw”£¹Tk[ľ.ý܉ƒ´0€ žJsaBzÒ Ò$S§£LO¦¬(!q°»ÈÇ%þJÞ¾Yâ¼¹d0˜ÿî}'j”äÉBürÒ0JƒVYìQP¦Nwh¡VX8Ø]äã%oßj4g•…^6>œ`öƒ½èÛ Qò¾íÈû0d¯@ï ‹¡§ÂéÛ„r¨~$U§£PO¦Ì¡N.°»HÈe «ì}›³÷ÜdrbÎàçŠ9ã«Ëž,0v¥QcB_@ìHªNwØ™нé%B.SXeÿbKêÔEO(¥-H «w:[`BZ ’°»HÈe «ì•rï½’.³Æ­D¯*ª¬ “LØV0!iRny7jî´VÆ×÷¶Ó{ òjì<ÃNzRìn7%ÿ;¶§$fáÀòä©•v´Î1h dNB+yÁPÔ D9ãu0 ꔢ¶‰*ý §y úÈ‹ú¨¤åâ²F†ÛIÒ;*ù¹{—tò» Ã,EË ´…š^ò9qá¥B’ù$vùYò %ÖÝ8|Í"™Ç•†fj_z|‰Rd®•‡™ÒÉG c`hÍ"?bM%?ÉŒõgÈX…bPCM}—° ýÂ…u)fiƒ¯»‹ÌµjX…ð¸TGÑ+ZÏÖ7zŽœ t‘¹Vž± Î<yOi«>É:¥Ï…ØWHÉèM Ã˜CrÒ sêÈ·•̵jYÖ—[âAàÊïÀƒ§a‘·Á*¢ÌµòðœUH¨;÷6XpÂÅ'~†,ľB1KK̾ïu¡ÀÁ²4ä‹ÌµjZ¸A‰C@ä[]Ñldyެ"É\+ÏFP¨ÜS…kE˜×iZè ½FmÐ÷´q†ãSHcäÒYæZµÏÐâ¬Àƒ îX_H£_¤t‘¹V.[Ô°è‰7™‡ë´ #êT[gt¶ Hg«(2ת ßÝxÉ]æÁ›¬ÂQT¬¢È\+—­ÂiSôÄkwíV!Áî­ÅåçÎ2eO–  ¤I™kÕ´ Üá!˜%« 1Ž–/x iM3EæZyxÎ*ÐKFËc$½R…ê1¿Äü°:®‡ÓÓããáx^ß«ÓM:éäB:;)&(ë µUiÔ•_Ýßo’ÿú*_%Ç’•_ ‚A„tvHâSÜgt(…L ¶n´F¿ô>dúð ›ó´:’ÙÑ@dË´3 yòOM“Þ˜ã6/g—©Z~v©!ñ•=ô0ÎV EL[­OÏáRÉçž”ÜQäûçÕf»z½]µÐˆÞO­ðas÷ì}Ôy»=¼;\#¢Æ/â…;ÊZɳ߆Ã*Âtž+ì^žÞC7³«r…s,"¨px¹Ù߯×ð¿ý¹H¼Ùl«Ÿ·9?žÎózJÎ'õ\íß«ûÝf¿9á|ŒtSÐå-ô+RªJ€½™çú•¹Ü7ä¨9Wt^ÆúÍ º¾¯ªK›=x; ¢–ŠG¸ ÇœDtwØÃcžÉÒµó¡~õíKWgß×¢ØbMÞpÊGºûÚ>Â|>KÄSÕµÀyQ?Xͼæå„–˜¢®y>£eFe&…Ý=¬Ž«»sèr¹Uèî÷‰8¼ØÂ9.p{‚ÎÔ eÿíŘ ùãÓùí¡.57‚»TQúõº\nÚ¯ÄÁäb¥òÔ—ëqÊW6oÑnòÔûõú~}ž\Žr¸ýÝáÝ:ZáJ>'ÀôôâãS¢©žKzSeX•$üÊû‚Þl×ÿÚ¼ÞVåíVû}¬!áÈF(æô}wZ« …£ð ‰¤@çZ²×?=mŽë§j½=ÀEø e¿ŸôpA}²‚zöìéͨXì$ÚÃgD:|¦4o~¬ø«—ÏŸQ |0‹s:€†ÛQÅaR‚/¹•T^1è-^ Ã&%½P˜3ÇF®¤cZÃ( —] ã-—’^ƒÁm))¥—“ÛÛémnD N3f´ ÚêÂ?p{Zx:¯†ŽºŠ«¡ at¨”Âa$„D:‚mœöCl£\‹¢`5°¼BƆ˜iÑ·Ö±ÈÉî9†žãµ*£^¥xDÕsYõ7,©^ÃׄJ’kQ÷ª'$ž¬‘Tï2CÏñZ•q媇ûâå5Ø\Ø¢y ]-“(Ö€ÞõN[®‹Ú]¢çJ«®[çÒÉpt‚Ö´áÆHÍBzÒ&,N'™:e®];»ÑR«Á2R'ª9¥1Þú |›&™RN¬vf¬é*Í M ¡®Ó6¤%¦UH“ §´´P¦òÒ`:ÈHbÙWi=K—ÖêýTó]HGk­-JQMzÑÒ ƒ=°Vü`ËZH³¤wZsôÒ"é©ÖI—%¦ƒŒBy&’¾Cš';ÐÊûÜ*—Ò½øÙRóÔ f=’ÖªbGM™ª¼~Ö ;3ÖT•öIïŒ4"é£Á×QO!í“þiQ&VfeÒwƒï죤´š¥KkõÀ~ªù.¤£¯¬#'#…nÒ LÕ öÀZbgÊZHû¤w±'}„´MzãÒß'@Z¦øÁ„x#êr‰ºLˆ7–ÓÝôr¥æ»&&Ū1†ì˜)S5ƒŸ†5|ïRÑbµôkÒXŽKHšÛÛéíH‹‚çõ´–¢-ü·§…xC+ NíÑù¸OÖpÉ˶U‹ïßx8Õì¥á£Bݼ=áé,~´ûö_Ó­ª_x4<€å‘Ç?ã´¿‚Ÿ|¸}õbà£Á_ºýöÅ ÝÈØÀíËpÞ𣷮FÓ÷”»ÁZ&iï7ºPÛ<7qï9ˆ5 Š]·‡ù4Üûé¹ ÂÎ/³â9åNyÄJi]W(Z OU@ ²…ó}8® žü#'1ŠÙ˜"MIŒw5P  4_M‘êžçH¦^4²*[pÁ &» ¯ò“òï³âg8²‚àYu­É.D1yφ`MÒp`ËëJ#]ÝøãR÷ÜeE"æý—µ¢¦HÌøj˜ì€¼BÑœæá"•M$€È~êæë )JÝw$ßÚ„^ÒÕ‚%¾&; ¯P4%/—Õ0…¤ LVÝJR§ ¿•Ã2„˜‰¤%>ÁeÐK×Xê¾kÃÛÅÀWÖÉ_ “×MÞÇj9W ÊNòê¬9kGƒßê»]¥é‡«5i ¤Áïû¹É­×35s ³#[¿°Ïög_&>8© Jä26ìç¤4q¸ 2u:Ê\·ÉÓë*<#ÄáîŒ]dÁÓK’#ÎzHòMšdJ9=°VØ™±¦J<™Ã=~”6˜'W9°]O_;΢ í6x¸0¤ƒ¼ÕX~”‘˜VUšÍÒ¥µz`?Õ|ÒÑZkË…zÊ&½hé…ÁX+~°e-¤uÒ;H³¤VÑùQ¤§–I!O£Cyf“¾CÚ$;€´*­r)݉Ÿ-5Ͻ˯OëÉ*]±£§LÕ ^?k…kªJg½£eQÃkU_š¬¿ôÒA>è~^ í ¥ý,]Z«öSÍã îè+ëȉ–Ôé¦j{`-±3e-¤Uһؿ“>‚ˆHzãÒß'в€?¾Ç¸‚ì Æáw/¥{éåJÍwML:UC Ù1S¦j¯›µzJ<'Ê1÷„}£J)GéMü®’ö£tÊ„¬­ ~쿈Fw¬Ñ“ÕûzàËHF7Gç`¸ùÅýŠÞ¯Ã¡â ÏP¾ýÕ ¢QH­ð#äO­øk(ÖŽZ÷¹ý=–…'˜ãg~ßAëä•§`qÁ,"¤·!Í™¥Ó¡H¨QêºMp…3'hwJàÁQ5'€%·ò´€ÄªÒz ¯¢hN/Àyƒ€»$šúÇ¡@ã yp×€(ÆèG} ô ÔÍ×AS”ºïˆ&\›3÷’5éePÓØs•‡lˆ‹i–ÐK¡“fBZ$•¥³¢.C:Èx”ç"i?¤y2 Þ—†¹”îÄÿ–šçþ)&}•Ÿø òzÊTÍàõ³VØ™±fJÚð¤wÏy‹úhðýUÔS²ñ¤¿¿‡zÍÓ/ê;¤m²ƒ”V³ti­ØO5ß…tr–MPeð' X «&±â2?3æ"ÈÓ,©»'µD`“¾¦9t+HõSÀA6‘B‘ø—A/½^U÷]¶.´!ÔMÙ_ “×MÞG{-øPïU\4ÿ§Œh ŽN›éŒH?Ž8UÒ"2÷èò~t&~÷ÂÄK3gÀë;¢žÆÑõ~qjá¹Y 3r\~QÂC”×Õr% ¸ùFqÊw wBb ˆb×í'—À;BÝMâF"(¨Z`E¾ä@yĪÒz ¯¢hFž45à$쮈î 1z[öLb<äá–~'ˆñ@¸ª›ƒªùzhŠ\÷]цƒVÂè Xv“=WùÉ y謆XVP.è[OAuȬԂ˜ <ÜfCà"j8šG›§'¸ :ñÇUÝK—Åóê…¶ÿ\Sdf|5L^?yEsòT |VCZÆ”Þ'Õ¥ÄI©éÍ1‚¼”!B FÉÀÏîI«ºÇWóÉ6¡-chÁ_ “=§K\1!Ï–Î?¨a ‚‚ ËóÚ†J¥ŽA­nHáG0„˜‰!Kz‚Ë “®±ªû® o—ßÇ< hu¿ƒøø#wîã×p©}|ùÞlWhÆÒÍvÃúÞÖðåt„ùé ýD½ãgW%øQ£_éwU‚0ùJü BŠ%$#¦CG·Q¬QìºÍ›bU…ï¼~”g—‰ ˜h¥iÃ]ÌÓ€ V•ÖyEsòx˜A@û—H´\{O@Äx$Fï­<ŠÕõ5Ð3P7_MQ꾋 ÚpcÐ0¾b°èj&; ¯ö“-y °¬†’K€Èª+¹pY©%;$ £<«C äÂOà—·ëµ ¿î`(û‘Ëh¡³’ò—Ÿžxi‘Âáò!íž”J®9óÔAs…#%îæŠÓ‘*¨Ó¶ñ•tæO»v_PNÿ¢œ3C`›V°9âmÓº| Bt²?²âg9[<.YȨhx¦² Á@àHÌE€bI9AÄþ(«Z¥íºhŠT÷]VhY,;éZ°ÄWÃäu“—&d­Ã †#ÕÝ·ÞF°€‡È(ˆ5 Š]7Môy‡[š¸Ñû'"è¤ïVx+SžXUZäUÍÉDe# ˆðµ¡ÏKXëHL™HL…<ø”ð;Q,®jÀf n¾š¢Ô}A´áÆ H>‹N f²òj?Ù’—€ÎjH_1K ʸ¶YuȬԂmŒäÊfC ¯¥&aa’%=ÁeЉ?®ê^º,"b¡ÿbÜ×ù_ “×O^EÑ”<ê˜ 0Y ø¬ Þq™U€ÉJ €ÄtÈ#X6"›H~êæë )JÝwDwÚ„^SLÀ_ “W(š’—€Êj  0ˆ¬º1”Jƒ ,‡>…,2›H YÒ\tUÝwmx»ø²š"6ã«aòºÉû¸™D'}Ø‘g¾l)ûHæžkÀq;è—ÃfŸŸMÁ©Qo…¥Ùœ %°=Å®ÝD«ÉÙ2Ýж ï+äEŒ6 ÈUöÀ_MRš¤«(#ä㼦“`<+s¡€xš „âl(mõ%cÖ*NëêÀL ™žëDzé!«U|Ò¥ÏF§<×NQ>GTãngCh<êQ+À6£ÃZk@»nšˆ"°)u7)ŠD³ÌŠÑ´}4åi@+¥uA^¡hNž45 VT`‡F“"PX(F¯ÜpÓ1Ä¢¢ #áGu ø(Í×ES¤ºï"H¦^4£[pÁ &» ¯ò“òX“ÕÏ ªYø¶©.••@˜G»ll6ºj¤Ë \ê^º¬@ļÿÒœU5 Õý^H„sY3E äÙ h‘ՀΠÀgÕõÚˆ¬ÔPÌÄ<ÆdCಉD©¥ùºhŠT÷]É·6¡—×ܵ`‰¯†É.ÈKÍÉ @g5La)(™U7…¤Ô)È`røA†2‘²Ä'¸ zéKÝwmx»øòš">ã«aòºÉûÈojj<îCã×£é5ço^ /•…ÖÓÍ"wxÇ_z~Soåi¤ðONŒtØå€[üèðKßÍßaY£„peh÷ ý¡ƒ¨ÙX†1\wnbcM^áNÿH{F¿ùÜΠèúÈSÿÌ1©×ß*í4FþN‚¥mé» ¡Ë˜}‚º9š›pæ’pe<ÐfDÜß’òµ(HVevÁaÅÓ‡t†iAx:iØQ¦5¥ñ "¤óè‘ÈG<7Ïç1%¢2ˆÕ(µY‹ªöì¢]ríÓ=û€ÆÎìÆ]ò£]pXûÑ)‡ñ¢•Ì:S4–Y'‹63›õ^Å¥mi¶‘,ÂlÒ{´žx}~–çP/~»ª}Õ¿.–z»ô‰¦˜¯E›° +ž–8T òE+-X’4ÖÒéI›-ü4ÝÒÛ$°‚˜VDD ±áëÑz2ÒKHw¥ÛUíw %ÿÛÆn6œ|Ú EÖZF»àPW1É”C[E A+S44+Úœ¢ é)B±áÔ½ I‘M°žõ¤gyõÒŸVµßM"å Q´lx’sÖZF¯›Ã_2E¹bâˉ¨ÿA’ñËMÜ;ñe½ý¿91a¼£cçl#pJ•QG¢ØuÛwð‘xè³S¶LIXd…´l›ó4 ˆ•Òº ¯P4'SàL™ˆPæ!”ieÂ)]&!”‘ Ve@i¾.š"Õ= £ 7—TÔà‚(LvA^ñ“Sò(³P@™tPæŒ7eÊ@™qP&”ù¬j¤Ë \ê^º,"b¡ÿ²ŒŠ0Ñ}ÓÇ$CEÑyª>©!!’‚"0Iuø¤Ô$ŠÙ˜GÊd²‰d ïH«ºï"ˆî´ ½Œt –øj˜ì‚<žãŠ)y2wþA cXÔ)Z'T7†A©c@¦ð#B L‚‰Ä%=ÁeÐI×XÕ}׆·‹¯¨)3¾&¯›¼_2y`ñÈõÿìúŠæ”Ïj¼üÛjY@³^ Yñ—ú¿¬ÂøÀ* ¯nCü2SñïÍT€[v>,Gdàß l#àLê4(—¯Û„¹ <3 *oÓx[F´L œsÌ×¢ Y•Ù‡O Jß EHå¡¢4Þ³„ÒÆ’46¥Åö¤¾yÅíäÎ3®n³UíÙE»äÚïÒìOôµ•㜅kÁEßPÑÙ•ðG ­•è[Ó„θ¹jMsIÝAÁ¤ù;Ì“¦ì$Š%]‡Ç «vº zñÓ¥î¥3 DÌ{6 yЪ¿écìWQ´@žªÏjèŒô’‚0Yuø¬ÔžáaÎÆR¨]©¿×%~µ÷ËÌÄÂÌ„"wͬý25ñHŽã77ðtLx`å}Y#F¾¸s×ÅwNYìÚmŸX‘ø‚´EÐPƒáÛN77c_eD8×Q1Ž3òtès•§ Š”SépÇ@¿lYq¬ ~ë‚ A 8æ–d=ºâ ‚·>lìVŒñ¼Ü£äé‚"å4žʼn ZÐe^ʬ:þDÝÉ’}0܉Ä0úŽóaN‚):Ž+èRt5tt[•«’,3ƒ—tî;WøVß3Ÿ:,þ¼>fx·Úçôñ©¤W§’Ì©ûÕzw(2›ý‚Ìþ°ùxÜü¼Ù®ß®ï‹ÀÝÝái.yßTOt÷tܜߗg:ìïÖÇ}y‚ãú§§Í±Ôáü°9}³>mî×§¯˜pjÂÄTËå0M•éÓyuW¯·ë¯J Dx3!âüpxzûp~ó´NëóÓãðn³Ý«íöðn8T…þøj;Ü7ëÓpx3œA¢þ@Í­vëáõá_èÂã ¤·ëíØ¨óÿÐ=ƒ1 endstream endobj 31 0 obj [ 30 0 R 33 0 R 34 0 R 35 0 R 37 0 R 38 0 R 40 0 R 41 0 R 42 0 R 43 0 R ] endobj 27 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 31 0 R /Contents 44 0 R >> endobj 45 0 obj 8546 endobj 47 0 obj << /URI (http://www.loc.gov/standards/sru/) /S /URI >> endobj 48 0 obj << /Type /Annot /Subtype /Link /Rect [ 472.023 629.13 491.473 638.13 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 47 0 R /H /I >> endobj 50 0 obj << /Type /Annot /Subtype /Link /Rect [ 499.374 629.13 523.274 638.13 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 47 0 R /H /I >> endobj 51 0 obj << /Type /Annot /Subtype /Link /Rect [ 130.0 617.13 242.21 626.13 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 47 0 R /H /I >> endobj 52 0 obj << /URI (http://refdb.sourceforge.net/risx/index.html) /S /URI >> endobj 53 0 obj << /Type /Annot /Subtype /Link /Rect [ 374.49 426.871 404.77 435.871 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 52 0 R /H /I >> endobj 54 0 obj << /Type /Annot /Subtype /Link /Rect [ 411.074 426.871 523.274 435.871 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 52 0 R /H /I >> endobj 55 0 obj << /Type /Annot /Subtype /Link /Rect [ 130.0 414.871 190.84 423.871 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 52 0 R /H /I >> endobj 56 0 obj << /URI (http://refdb.sourceforge.net/xnote/index.html) /S /URI >> endobj 57 0 obj << /Type /Annot /Subtype /Link /Rect [ 367.693 281.839 405.193 290.839 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 56 0 R /H /I >> endobj 58 0 obj << /Type /Annot /Subtype /Link /Rect [ 411.074 281.839 523.274 290.839 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 56 0 R /H /I >> endobj 59 0 obj << /Type /Annot /Subtype /Link /Rect [ 130.0 269.839 198.06 278.839 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 56 0 R /H /I >> endobj 60 0 obj << /Length 61 0 R /Filter /FlateDecode >> stream xœÍZKsä6¾ûWèè©òÈz?ö6¯d½e'·SÉVœƒºÅîVZTô°Ýÿ~A)5»³»§™9Ä‚Hö_W¾ãÁÿ÷âOùn–åÎæpõñ}' œ0!Vì¹Q{^èø‘ÄÎÁ™³b§} "Pü™µ¼w~»j®<çÇ«?þ„6¥ãA¿×+ïÌàr¨ÕÕ/†lÔèïI>ÏÙ]}|ººý!v|ÏyÚj‹öyày^œ9™¹ø8Oçë»fèx9n†Š7ïþtžþuõåi¦lèynö½éúËLDð•4M]oéCr˜yÀÁŧ™ Kˆ³Ì8¨þ=+²w"±g |ê>ßpç=' ÜÔ÷ó<Ísøäf3׉/ùËw£Ü©«B.Ñ+VGª‡Nà¹)„S}è‘3‡­’Ò¾¹lÖm‹ ëÑ€ëE™¡-Ža3û?ÙMoOK³§=sÞÁGßÍëG¶ýüQà ?Ц|_WÑhSW¬zÍ(:ãkÃ5½-£UÛÖÕ¦Û¿¿Ñìõh´éŠaÏ:£)K]3<4o5ÝŠº6Æmy7ëšš &8¯¥:yæ\W‡¶fP•«QÔ‡ŸVwŠþ¤ˆ+ª…µâÝAAH‘ ƒ%ì‹î¨hÄ÷}U²iœ¢ÿ6‰Á§9‹fêÔÖÅ`NðZ û©Ù©¢I¼P´)šÁùäÀ¶UÍ:wÑ ü(‹ÝÜóÁaÐ ~tÒŒü(Ÿ¹Qnó¢|áDˆ‹f¢×ºY7jv¥ÉÂäÂ)À1^t¯/5àu=[1lö³®î„L¥Àö0Ó©%òta‰ªwÆžmÇÚµrúMWµCÕìœvìZÞ3˜â´qŠÞY›o¬){œy×íöH->vN5m~Ë:ù~æÄ  /-Ôi»Î×~Õƒ;à¦üµwÀ•ÿx?8¸ˆx¸gaßñq·w ç•­u›laæÆ³(.ÊvÒnòœÀK]_l¡ž°íø ì˜Þ`ŽDœW0á~6ègàÁ±Øˆi0–”„‘¢ŸÍ©,a cÐK{@šò‚\DdâW¿.;ø¹¥ý<²t0fúcÙ3HݲH@æ<í¹†ö··–u€|6oúúúêÖ|ãîøËm?Àî-º²¿í»qÙÛO! ïORß2Ο'Í!ø‚€9Ô†–æ2|ç.¯Ÿ¯W¬èp‘BhðȆ®b¸å‘óRüúxÿüNCí«š÷A“½Œù– ×¼1xèfÓ%ÁB±·aÓô¼Á}ìÁ çÓw¸/lñÆ…=¤ÍR6˜o,Øù/°ùER-^ŠªI̶DzÀV̳$¹¸ÇNÚ­X[Àžfõ³¥/XMeðZMÅŽõKXr':<£hx;62Ou5ç}¹¿Š9´Z_D/ÕáÆ€ÃØ5"†œ=ë-ÉöÌB]VVïpûB¥å˜jTj^1{ÞÑ|ÈbÍKÕñæ0ÅÉÝbrAð™o>rþͦ1Æ|úr§AÉ7ãb(•Ëiº¢?É uªlà% eA³#;§c[Ö±¢»ˆ_÷ `ä …â ¸˜æOšQFL}7¹JÖ¢ˆ±Cz0~e]­mƒ™uÑìFð6Í9T»ý áÚøT²Z|Ä5£ù¸¦¿5ð•$ÅpF.麟Îlí ÌçºCm0âÉtbé5VZf*W -ï("ÒeÕA5‹[9¢LQ!S(¯Èt–A¸\—SÔ˜uäXZ#cìÉÜ$ËÞ˜å“EùØŸ+OyÖužöPਚFš¥*‚qÍ[áÔ¢’ÙŒýÀÎd¹”k1^LyÕU'›é˜töŒd>¤RÈYš©CRìŠÉÙ¡Î’BlYAãïÏM¡¹Y”b¶½°NÛéi߯`¥@$žˆ©"ÒQÜvü@äÀÞÅ…Z¼'ZF”EÓ~(eé*‡nÔXìm6´ô®ÿfà©! .â‚mÑÚOZ“–ïÓ\îQ(—k «^ÓÛ¢êпojQüNöknîI PˆÛ’åbù9¬v²¤Qdìñn¥ºž¬³”P ϱé¤'ï[¶©¶tL5¤BJ÷ú­jJØ ï…3—šÝÞ¡úIïì,< ²…HcSBKQˆPÍ2›©qSˆs%rd鎽Á]óao@2¸BÅnÇJsš»•Ä‘€ò4E?k½6§çÓñd‹Ò‘·PÚØ¾0B”º¬ß¯tÀJ« hú÷‡{ ´ÔÔp³á]I1Yè‚Dﲆ^àF8”ñ©»ªsË¡\ö WP(}K/=Û²Š!ïx)bß6Uñ2¸=$û ]wÌmØ`©íÃ8°È{ NËÞÜýp¨—:œ3Q¡'adé|RÐë‹;†ÌO-ͨ­¡®ìÄé¼ÊRˆÀyÅ… %Œw±9mw×´˜à’D^6U5Tù½fЕ¬Vþ‹½€ºð²¨1è侯¸˜ ½]ÅGã3.IoŸ€Ü ÁÙH&¡ '*VqhQüR¤ Sð©ÄËSKWC ¹?\Íø4v )”$ÛgñR D¸|½î÷UÛOˆj¬÷>7ãcµ~b¿küðáñ“F”Ý$­ëiÄ´ÀîÄø7uG̸ذc`¶“äØk6fC”·«fH`3@ž.  â\âź""t‚”<¥ÌHŠãD7ŒÉHèInãõºßØëY5“dÓ1, Ê-€$¤ú…º×(k(Ù5 ÅÔX–ìyùÂ:èòâ¢UUÓ™‰ÀØ©„Œ¶kˆÒ®fÉ‚sB¯ÅñF#ex5œŽÈ €c j¬1GÒtQ«O¯`IB}z±˜"ð¦0Ï5àa:!¨M÷P±×Æ·µÑi:F:sÑ—7ÐÃèE!A]õÆx>CzVŸ, *}‰¬Þ¿0†Ô×e‚½-F —a«âe6M…ÃÄó!ª(/ ¨PîÍÎò Ýf­~|¸¯!úÒPE™dMÅ«D†jÈ oA@çMIƒõ+ªe%º¢éEwspªh%-r¬FÓÙ áçÕjuoÑ]Ü×Ïtm~_Ý?9ýp„:~ÏØ`» Ž :g™çyQv1ƒž¶û"]uˆÅA°áf.‰¨ê’t?Šç£i¡ÛQÝ%iuâ FfÑë3plAcËiÇn’ÃIju‹ÜoBNkÉ%íl·i¶‹×i¿ÿ±âŠ YXä½Prp:‰¡†JãÄÒû´äÊÝP”£y˜[š[<$oA(+ØKrÚN½BXKœë¿F†/X„ÍØF, ÕôÆM+2Žl0PË_Y·k×àa’Wˆv¨N_ÓìæWz~S²T¬.ûsm‡™žên âÐ[˜ˆLtüH¦ZC’ªæÅç5Óðq….'ãlEx‚SñË ?°Èðá§ÏçϾÁÅ®7?7ø[âÁ±¥ûÏç'ŽäÍ3²YôÿMenœøp‰Ë?ýüt~î$s=ñ{‚0ò-]§¥áÓÒqQvL ¥=+Á›(~zñ æ*ÞÙe·ø b>ÿº¯~˜z"ÿâY Ü@ìöL(r2Ðóõó»³FðÅ$ -¬M=9„%½ëøØj¨ xi ä’19Ð> ÎªV%\Wâí¶ÖŒƒx‹e†Y¸Ñºc»Q%m²XŒG }iÃ{1ÝÝÎP»/šñÀºjc°˜ŒçëÊ¥G$d¨:‘ {Û°vÆpwfsfµãº6®šˆ{‹?¿3{©˜à®za&>R„¤(Kà@j±œóæÙÖì­ZWôN“ø´#rr ñV²«˜\þÄWo䉼“.Jzä°®ÀÍ»£ñ±'z˜ºÈwn55–ò31p™ùΟè—_[N—yLe‘Ô8 èØFùBjÔúÀ¿^Ôé9FÊA<ˆw"£º±§Ñ4¹e¯|cGèÉ¿±Þœ¹4ÅzO¿}@ &;h„Ûé/«íqÞÒb’|¡€‡N8vž ‰ïAäM±ºP0œ¶£‚!‘¾8Õ é©*pJ°6:–UßÖÅ‘®ibW¹Ñ…&Åõ ŒIðŒƒ4ø®æÌÄSÛ† êÇZDužV}€Áš‹)‚`aŠ>=Ü«£ª¨’øcõ‘.Bˆa¼"ãYžn4&¡áîŸß½é}Qõ\~~øùóêÒ÷Ç»ÕÍl&‹†a´ÐN9ijœ¦Ü‰ñAn+¤§Ë„¸ðHOI¡t$_*ö*]€ÆÐ}¦;ú¢»ÓöCPLT+.Þol0ý­”†XÃÇ;f³Q”,lD¯ÍP¤(Rtý‚@Šƒä™æmÕêæ[£½¾@A|(šª…4)’Š;qÕ)Ó¿¢YÎ3è?|½›hC®é7rßûl?AËö˜¶XµOÕ29x›FæWŽd âzU]–†Æåý|À¸@=ÇÒoèÖo‡‡ë‹4Ö)ÓO &š\Áäæ/Nû¯Êoz;¦æ|"§»J‹îÀgº‹D5³˜x=:°®à®ñ‹Ù_®þ¥Õ=ç endstream endobj 49 0 obj [ 48 0 R 50 0 R 51 0 R 53 0 R 54 0 R 55 0 R 57 0 R 58 0 R 59 0 R ] endobj 46 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 49 0 R /Contents 60 0 R >> endobj 61 0 obj 3468 endobj 63 0 obj << /URI (http://www.ctan.org/tex-archive/biblio/bibtex/utils/btOOL/) /S /URI >> endobj 64 0 obj << /Type /Annot /Subtype /Link /Rect [ 130.0 550.506 158.88 559.506 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 63 0 R /H /I >> endobj 66 0 obj << /Type /Annot /Subtype /Link /Rect [ 164.71 550.506 400.82 559.506 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 63 0 R /H /I >> endobj 67 0 obj << /URI (http://expat.sourceforge.net) /S /URI >> endobj 68 0 obj << /Type /Annot /Subtype /Link /Rect [ 130.0 528.506 151.66 537.506 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 67 0 R /H /I >> endobj 69 0 obj << /Type /Annot /Subtype /Link /Rect [ 157.49 528.506 267.47 537.506 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 67 0 R /H /I >> endobj 70 0 obj << /URI (http://www.gnu.org) /S /URI >> endobj 71 0 obj << /Type /Annot /Subtype /Link /Rect [ 130.0 506.506 155.0 515.506 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 70 0 R /H /I >> endobj 72 0 obj << /Type /Annot /Subtype /Link /Rect [ 160.83 506.506 239.72 515.506 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 70 0 R /H /I >> endobj 73 0 obj << /URI (http://libdbi.sourceforge.net) /S /URI >> endobj 74 0 obj << /Type /Annot /Subtype /Link /Rect [ 130.0 484.506 153.34 493.506 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 73 0 R /H /I >> endobj 75 0 obj << /Type /Annot /Subtype /Link /Rect [ 159.17 484.506 270.83 493.506 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 73 0 R /H /I >> endobj 76 0 obj << /URI (http://libdbi-drivers.sourceforge.net) /S /URI >> endobj 77 0 obj << /Type /Annot /Subtype /Link /Rect [ 130.0 462.506 184.44 471.506 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 76 0 R /H /I >> endobj 78 0 obj << /Type /Annot /Subtype /Link /Rect [ 190.27 462.506 333.03 471.506 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 76 0 R /H /I >> endobj 79 0 obj << /URI (http://libslack.org) /S /URI >> endobj 80 0 obj << /Type /Annot /Subtype /Link /Rect [ 130.0 440.506 161.11 449.506 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 79 0 R /H /I >> endobj 81 0 obj << /Type /Annot /Subtype /Link /Rect [ 166.94 440.506 237.78 449.506 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 79 0 R /H /I >> endobj 82 0 obj << /Type /Annot /Subtype /Link /Rect [ 130.0 418.506 162.78 427.506 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 32 0 R /H /I >> endobj 83 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.61 418.506 260.84 427.506 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 32 0 R /H /I >> endobj 84 0 obj << /URI (http://www.ncftpd.com/ncftp) /S /URI >> endobj 85 0 obj << /Type /Annot /Subtype /Link /Rect [ 130.0 396.506 150.55 405.506 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 84 0 R /H /I >> endobj 86 0 obj << /Type /Annot /Subtype /Link /Rect [ 156.38 396.506 273.04 405.506 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 84 0 R /H /I >> endobj 87 0 obj << /Type /Annot /Subtype /Link /Rect [ 130.0 374.506 178.89 383.506 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 36 0 R /H /I >> endobj 88 0 obj << /Type /Annot /Subtype /Link /Rect [ 184.72 374.506 289.72 383.506 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 36 0 R /H /I >> endobj 89 0 obj << /URI (ftp://ftp.gnu.org/pub/readline) /S /URI >> endobj 90 0 obj << /Type /Annot /Subtype /Link /Rect [ 130.0 352.506 162.21 361.506 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 89 0 R /H /I >> endobj 91 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.04 352.506 284.7 361.506 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 89 0 R /H /I >> endobj 92 0 obj << /Type /Annot /Subtype /Link /Rect [ 130.0 330.506 158.89 339.506 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 39 0 R /H /I >> endobj 93 0 obj << /Type /Annot /Subtype /Link /Rect [ 164.72 330.506 250.28 339.506 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 39 0 R /H /I >> endobj 94 0 obj << /URI (http://www.gnu.org/software/wget/wget.html) /S /URI >> endobj 95 0 obj << /Type /Annot /Subtype /Link /Rect [ 130.0 308.506 149.44 317.506 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 94 0 R /H /I >> endobj 96 0 obj << /Type /Annot /Subtype /Link /Rect [ 155.27 308.506 336.65 317.506 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 94 0 R /H /I >> endobj 97 0 obj << /Length 98 0 R /Filter /FlateDecode >> stream xœÍY[¯Û¸~÷¯Ðã °‡&© ¥¾5m·h‘b7Hò Û´¥®,*Çÿ¾CQiRNü˜ÈáPsûf†3äÉ— ‰0ü}Õ?ò„ ¾ü£UR‡ƒªEûæs´ûçæo»;°1Æ(ÿÙ°¾¿sj…1†°_C£šØìÁŽÑ¨?Ý9â“ÆÊÝŽA`~>tc×á°|~çW£ˆR¬(àÊïJ‡}¯^~pa©Pí×cÌIxH>Qš°öL…\ÿæ§¿¾ÞD¯i޽$/ïíFi—oëýŽÿ×ÒûzßÔâ,Ë®ºÙÝSÝp‡§ìùÑ’¢µkU9|u{òRêín®úa@AØÆ g‘ M)£¹À€ñËPKÞ#Ï.´Å,óì®÷Å€mH ­æ¥ãR·¨ÞÙmssÈÒYåÒýÔÔ—Úë…ù"†V¹ÊNaš¡šrk7JU¢ç úVõ¡r J—»®í+oš0$,÷BÒ]q¤1bS™å2 ùé…£3ZÈ1¥X!«ËºåŽvu˺çwÓ(̆×(̦.ŸÞzwZµÑƒ3ëîm!øå ñ‚Ð9;–ks¡†Þœ2C•û½ä_ë©©O›ÿƒ:nËÆn´åÅRÂQð¬Ýù ¸ß¹#<4¾ÁOoÝù³ûY€¨ ƒB°ß±œB…ÎÞð“ŠÀymxœ Û)Õý zØÍ#WOmlæö8±¼šÜ. —žrç0—b,ÄPô ãBõßÝpæIZ J`”±$1Ò»JŠá\‰±ógÌŽ1³›–¹{˜ñ4Î|ãÌ2D/NêjŽR¨¥àPÊ…Ü )ÅuÌûdEæöèhmmÞÚ+À,~·lI±oงݎ0â!ŸF÷k£bJ¬%8ÓNWþ(ÏÓœw¦A1®KG´‚‚Óæp^˲ÔÛiÊŽÄÄY¥³­c}šm“ˆëÖ ;Ñ»n¹¬'Éyê—•ð䱞ò4_Òð°i¥æûÜHœDÓˆëÔ’Í–Á1IÚe%:®ÛÍnÄ¥k¸rÔ5u¯,eÐ,>XR =îâj®–½,eÍïsW˜\l#­c’å|ñ»ŽU‘ú±jMùT¼é ¬¡FÏ\EfPÂÙƒéUQ¢’§(Éuó5ö)*£dîõÐëϵܷ« %az*Pº¢i w¦»T ì»°}6(7ÑùæaŒ!XHÍ<¸n§Îí  ÀGm—Ñ¡/¾pì3?è³Áq>îkßwC•ÅI("eˆèÇINXÈ=!5f~˜V7f¾¦Ð1NŸ°o^N›ôg!pCMÀ õˆè û‹†Ÿe+ìwðgƒ?ƒN7֯✭ø¾Êž ƒÏ^õ L_?Ÿ"ðÂÇ8#¡LØêT,Ñò¹-üÑÐj¡§ˆ±¬/¿6)žë³ýëöáý;ßwìØöB¤Ê–¸øÜΉ¾Üú/ :w|2¶„éX Ö ²§šVÀÖNªó[uŽÒT·jœ†ᑆ§ó<înêh騱n׌R •¬Ç´õ¬!.žêbÛï¢WgÉà œéÿ4Ñ.¡ØÊa¦¶íìðÎÔ‰kZOâÇZV`'ä©>°ÁâØÔ­Y²¦óí#Y+k¬0.hÈ}ÿóœÚvÃ~ûÀ.La¤;a‘i¨j wüTã Ø ÏuðŸÜÉt ±zC›Sp;‰† ƒ©µÆ¥ß­só4¬MŸj\ÛõLÆì„ øÃÃÛp‡7‘íüšÙjËã?¨Rÿ×54KP–Láöµ~vþÏãýæÿÒ¢Æ endstream endobj 65 0 obj [ 64 0 R 66 0 R 68 0 R 69 0 R 71 0 R 72 0 R 74 0 R 75 0 R 77 0 R 78 0 R 80 0 R 81 0 R 82 0 R 83 0 R 85 0 R 86 0 R 87 0 R 88 0 R 90 0 R 91 0 R 92 0 R 93 0 R 95 0 R 96 0 R ] endobj 62 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 65 0 R /Contents 97 0 R >> endobj 98 0 obj 1895 endobj 100 0 obj << /URI (http://www.cygwin.com) /S /URI >> endobj 101 0 obj << /Type /Annot /Subtype /Link /Rect [ 196.871 455.119 228.541 464.119 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 100 0 R /H /I >> endobj 103 0 obj << /Type /Annot /Subtype /Link /Rect [ 234.626 455.119 331.846 464.119 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 100 0 R /H /I >> endobj 104 0 obj << /Type /Annot /Subtype /Link /Rect [ 243.59 443.119 287.2 452.119 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 70 0 R /H /I >> endobj 105 0 obj << /Type /Annot /Subtype /Link /Rect [ 293.03 443.119 371.92 452.119 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 70 0 R /H /I >> endobj 106 0 obj << /Length 107 0 R /Filter /FlateDecode >> stream xœÍËnÜ6ð¾_Á£84E½Û[Ò&HÄ ì â´wWµ$*zd³ýúER¤$Úí1Éa9Ùáp8OùÛÎCþ¿?Iàá$IQ^ï¾)¼‡bŠüH¡B‚â#/À4D5Z¢BT kAõ ~´ŸÐç]³#èíîËW )¾óŽ6.Ùg–=‚šØqã(XÞøó©TÑK|½ÊÞ[Þ Ù¾¬ÊábaÙ¼!ÕX¨CÖä6ÉÛOï,hϪʦÖIBBg8s¨XmáÊÁêìqqØbóáªæ½OV]^,®a¥)uQî°N-­£&T<“uÀg´|Çiyʺâœu3¬.9Ñ[ž3!¤ç!Ù ×>mËÌIÜà¿3¬W|r”µ2yUŠbåЈ7O’åÍáèªÌAgyÕ4ÂTäçîû>ñ±* œóºUî$6sVUç9 ¡ü]ÓšeÁr69¹‚_o޳RѪ cžcÝCh³µî[Kˆga‰½²)öÐUÃͺí8xTÝÌ`íΞ3ÆwÈ­­ƒNƒYÃGKRÑAzlPo¦Ü •Ø b„§±59YJ ¤HæB[i^õ3x«Ô¨›†x °=tC+°Á®¤x¢áŠ=¨Ít+Ι’½0ÂaÄ·,æ /k¾H)ÇÄ¡ùiÚ_nnÎç3ΧS1(¿’@Ã'°%þVÀ×51”X/,yVM™Iå:3Ë?oïÞýeÀ*»H– t¹xkmÌÞß§ÖAÈÇ*½¨óOJW¹œæ0V¨g˧@‡#„ç´¼¡"£µ•c‡ ô*‘l…A7„\¾D=p3ÑáDi¸åB매ÐѤ'±Ccë)͈yw\³§)N)ôh~àoÙ×éC) ­…Ó"hæAr ;µ{ÙXG‰0w_Ö/ ¥bPCYÿhò1 Ьnt%Æ´øŠÛ>‹«&e†íâ¢õ1ùÕ©N›åÙÑÆ€3ØäÙ8ðœ7¶šPCv “•]§(ØøÿJ~ ØT¼:õ¤Ã×ûrßAcz5Pú>ë.àbh?–PtDEƒ$»Òˆ ü-ÒÁiæ¥ÿš²‚À©4ðôû.‰jÖE$B5‚ v§¦ 5\ˆ{zÁâ-ƒ(†ð!ÐêGª=ýÀ¦96: ŽÔÞNk³NâA|*JÔâ^Õg…iÆz¯ ”ööÜÜI°*Uß$Á‚Û’ø°Rˆf€-de Š°Ð ^t_ŠÛ>K>¨÷KXô«w넼Kë¨Á5œš`x7%´l%ÒT×M-kŸu¿ AmYð$N=‡-°7ˆ¿Ç~ØòÌ`s+ýÖÙSÜS$P¨OqFzÄU¦‡ <+%=Â…^÷c.Bò{uÁù^ÛD¶÷„K×™kùÍ›hí—4†N1ó%‰ºÁ ô¤KSÖ}r‰}ë|%è|®5p*§ÿ«3D¦Ã|4^“õýXƒ¥À§1 BDô¦ypù…€ Å¡sèÇz^­eC•®§B…RÙ÷¦€ëÊý(Ško¶á,ZÖfò ‰Q¹Ùb8¨Þ/µÜF_¥­ŽIT3j›¸Åµ"ou-]! HDßýU¼­Uó­°³tl!ß5À»B½—„U¤KÀDº„M¤KøÐñÚæ]hÔC¢ÍU‘’=F*acó$oÇú±ä0Dì¯ aÍ>0“Ьa"²ž j ]+Ä…CÜžëôåˆ è#åGBp3/.-\ÚcySWCý…sª81¦‰øÚ¸*®¡Ø(±Š«7ÛœÿW‰Œ ’ˆŸ˜ 9yr,ÝNÀóhMã¿ZðÃulF_ÔBކL“˜¹PyP xÜ™·ÓÂ碬D53ñ”.ÅBm(sÙÜZòý^QLÉóŸÛ¶tÂ,+ª²aèaÎXÌZÅDz÷ðÂq4× ¥„zÁóçmè༬ƒ eÀþ|Ô¯Hr»]Ñ{aå#pçN}Ò|ÚO“ôù¯y[:ØôÕ5ÊP?@€f]¡\ì"ŽWßú®‘øX¶_vRS{¢?8cëïwÿㆦk endstream endobj 102 0 obj [ 101 0 R 103 0 R 104 0 R 105 0 R ] endobj 99 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 102 0 R /Contents 106 0 R >> endobj 107 0 obj 2113 endobj 109 0 obj << /Type /Annot /Subtype /Link /Rect [ 130.0 658.877 153.34 667.877 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 73 0 R /H /I >> endobj 111 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.792 658.877 280.452 667.877 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 73 0 R /H /I >> endobj 112 0 obj << /Type /Annot /Subtype /Link /Rect [ 402.812 658.877 457.252 667.877 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 76 0 R /H /I >> endobj 113 0 obj << /Type /Annot /Subtype /Link /Rect [ 472.704 658.877 523.274 667.877 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 76 0 R /H /I >> endobj 114 0 obj << /Type /Annot /Subtype /Link /Rect [ 130.0 646.877 222.19 655.877 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 76 0 R /H /I >> endobj 115 0 obj << /Type /Annot /Subtype /Link /Rect [ 130.0 514.301 158.89 523.301 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 39 0 R /H /I >> endobj 116 0 obj << /Type /Annot /Subtype /Link /Rect [ 165.182 514.301 250.742 523.301 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 39 0 R /H /I >> endobj 117 0 obj << /Type /Annot /Subtype /Link /Rect [ 130.0 479.709 162.22 488.709 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 67 0 R /H /I >> endobj 118 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.05 479.709 278.03 488.709 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 67 0 R /H /I >> endobj 119 0 obj << /Type /Annot /Subtype /Link /Rect [ 130.0 457.117 158.88 466.117 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 63 0 R /H /I >> endobj 120 0 obj << /Type /Annot /Subtype /Link /Rect [ 164.105 457.117 400.215 466.117 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 63 0 R /H /I >> endobj 121 0 obj << /URI (http://www.cpan.org) /S /URI >> endobj 122 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 363.05 146.67 372.05 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 121 0 R /H /I >> endobj 123 0 obj << /Type /Annot /Subtype /Link /Rect [ 152.93 363.05 235.7 372.05 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 121 0 R /H /I >> endobj 124 0 obj << /URI (http://sourceforge.net/projects/refdb) /S /URI >> endobj 125 0 obj << /Type /Annot /Subtype /Link /Rect [ 272.73 339.05 345.48 348.05 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 124 0 R /H /I >> endobj 126 0 obj << /Type /Annot /Subtype /Link /Rect [ 351.31 339.05 495.45 348.05 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 124 0 R /H /I >> endobj 127 0 obj << /Length 128 0 R /Filter /FlateDecode >> stream xœÍËrÛ8ò®¯àm’-ƃ Hï)“ÚÙš­dòòÖ¤*Î"!‰ŠTHÊŠþ~B$(ÏÜbŒnu7º~@þ¾"†ß[õ' Šã$Èö«ïOAÇ(¤cQìƒKJÅã,è°‚?´ï‚?WÕ ÿ^}ù 4y€ï´Â Â{QŸVÝ ¬&ýp°]ýú°ºû›ÑÅŒ!ÂH?"ˆ£j•Ðàa|yñéÜvr4òû±hä^V]ûòkððŸÕ¿.lf£øg3ùÃ…Š2B„§¡Ô‹a-Q}t¡ÈÔ»\`´úï¢Êx¦1vžGÑO£Ür ŠI¡ø"‚’kñòÓ7ªôZ¶9Œgwå‘R®µT|NUë¼¼ ^\)öÂܬÜ"êÊ.Ó²´ë¶¿ˆ­…»]ÚY ¯í²ªGtQeå1—ϸÎËØõæXe]QW£ôMÝŒ”2-‹jkáSÑíÆÏUº/2 ƒuMÚ²;‚â‰'Š*Pµ]Zåi“¯Í}FfðuHQB)Æêö^qöŒ $Y]=)‡ßr‚è…Ç ¦w¹YkŸ`tºA¯¨w»Yk¿`t¼ås€l—6iÖÉfDÉ*«síä”–M[¸ºÙsšÎÉáÏ9·¿.˜‚€f ñ ‰S ƒræP~J"1…–L‘ú Þø&˜œ·º/þËBpŒâ:rü'8§Sf]L(c‚ƒPŠXèaQ.K"ª|öe˜DH$ªØÅÔøëºÃýÝÞµõ±É$Ü…­D•ì&’(p‡Dq•Èf¢¾NÉ A"VY2òYé¨üøÂ9yƒƒl‰~<¾t0p®4ÙŒ1` "|fjûnó¦P;MycyxCý=߆Ô1QQôŒso=Gâ’Ã(øÌA¨ŒN]†!Óƒ œ!®®JH…‡\ÙGC¨“ƒ08s÷*uÖyڥ봕îÇë¶S÷ýRN™žu0ð¦I÷òT7ß\N}ÄžmZÙ9P½ñ8“Q0LE' 3j·íAfÅ’öà^ÍÝ'ð²°CðZ&œ$,âZÎu'Žy+1ìL#ð/”X'ÜTHTØšú©Èek¦.õk×£kÑŒ²•È£,Ï•>¥E™®Ë‘È9ƒ06[D#7ùÚBÙ±i É-Ï*»’pbW{<ê¦ëëC$ÔI˜<¯·çOÞÜŒðûºí¶¼DTtÒA˜Cw?e#ÂQß`þÜÉj„ llŠí±1µÄj57‡âÈ{LCVèï9dYptûFøfßÒ­ÖÙ`Jib^Ãûô›µÇƺz\«vê†T¦?7%VCçú8»ôiAªé²&e%‰'Vš#йuæš½Ôò”VݰÖû¨ÕúX”¹%Ñm&e7#™Þ Ê8âR$'Ì£Öí­x»?·ßËÅÛ۸&ãæY%aÐüB†&ôЇíU% >\‘ñ”€3£‚%q5xQ ÏYª¢vy¿—Å•dz˜”‚aˆäÍÆ.•%4BI“MŒ¹G˜QV+Â5¡0]‘2jtúp ?š ÔP–Vv­“øÙÂéÈ´O«?ÆøŒÎÝJi×›¢{|ééÁ)ÎÕÀ_máæt:M[¸H=ëÀK<,*ŠÂÈÛÁ1DT•Pâá3MÆétBúPt Ó@ÄH¨¢z·ž5 PаòHüM/ú¢ª]Á>âÌš¡èl: IF¹_Ë<×SŠÆ€«mQÉ>íŠl7‚&•iÂÆsHŸØq„ ^T0ð¤yPoúéAþ€)¥JËÀ–ÑV6}8õµ-sƢ拘8Fªĉ¸13:¨EòÇ!fôFvÕºJ=L§ÙÇ0éc¦n݌܄J¿Ï³½>HRÃk,|ÚÎz}œ B†øô… „#¢¢ >¿}@KÓÚ±Ê73È$&Iœ~Í¥sºu× ÷ÜB‚rQÔÏõ3ÏRD”k‹þ×®‡ôayš ñeÿÂ,G9éHÚbådMqèÆû¼ê¡3†#‹xØÉvÜÒ­ç–A|_z¢Ÿ¾`œFB5ÙÇC?c H—#`“æˆ2:  ÑÊÁ•+­Éõhh`Ý€ 9º¤0J@ö98sf^ÝL£º¨‡> 9ã”ÅMS£zœÃáÄ[¯ß¿úcÚÀõ4A‰ð0ôÕŠÍó DdÂT"eÄÃåæ™ƒÎ3ÓÚ1¤vM¢„{ÌJ= L6ÏÏÉo5Õ2«÷‡FÂÖO9¸Z›¤7€P\ÔxkE•›õ¯õ© ¡ŠÛaG­Z©zDÓÕc‹Õ¹åõ©*ëÔÁ4à„‚F¬Ï㺂‘àƒËØÏ㓲@Zp#Ë ÚÕô*ÌA¦ïe8öØ­$ŒŒms ÌÔÚµ~•lHªêä¹`™ú•®ÛÿdÖ¬í4iÀ@ƒÂ:œ$þYkB´X^yèMdOº’;£@{×ë3uxßÈi¬‡0Ù1ÄúŒ|ùU(…Õ{3PîþÊ£b€–;â NÌsÔï:/ÑP1Dú/&õh„yN7Ð&Ýe‘6j¿ h3¬MôÝ8¨lä/­‹¨O”BtµÝÂX»ÚBøìPe´vÍPý4’ùýÄùÊ%ÐÌ^ºäÕÆ|)@`ÎÔóˆ Zó”cpC×É-7*Û¥ÕÖ¥)*S@|ºúp[Ê'Y:¸JbÖÕÍÙÁû}" Þõ_gäNûÚ¾‚ÑӉѿMïw˜=“¡¼éõOb6“c‘ -5Ô#ñ cA y›~“ЩHôþÍò;Ô&œ˜·Ò¹<+kHÕ*Êq›¬‘i'-˜Ú•þ ÉM®qêùV7w}kçy¯‰PBàNÇܧÙ`ÜÕÆŽEá5Ȫô _ÿÆA„pÚaõfhõ ¸èôAÂÔ¾°¸ñÄ 'Dú¹.Xß­Ç(V¯Åª„ên½G¬ÇÏ–Š ˜BýæÛ˜çL-¤³ïŒ¾HJ üO’0A£Ú.³Ì¾ìƆ¯ûÒ²èúO£+z‹o,BÕ3&2N 8˜ïfž1Ñd­å£Ãê ˜oYH¯YÙ—t£c]wÃ0Ó2ý0ãÖq΢!ŒzœÐA§&£MáŒ-ÑÀ³ê'Yœƒ…‡ìí«¯ïï?Ê ÚlÄU§úøÒl1E!M0‰Èuù3:½Áëäº+;D˜C¯ -@„—¿Ó>:OG´àÔˆB<šˆ›·‡½Ì—}qŒ(ŒõD<£ÒŒîóÛ7÷÷ïõìzÅdõŸ"Њ'/¿ ÝT™ûûßÕ·â×ä'±fp—G„ÎãÒþ?V>¬þÙÒõe endstream endobj 110 0 obj [ 109 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 119 0 R 120 0 R 122 0 R 123 0 R 125 0 R 126 0 R ] endobj 108 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 110 0 R /Contents 127 0 R >> endobj 128 0 obj 2753 endobj 130 0 obj << /URI (http://www.xemacs.org) /S /URI >> endobj 131 0 obj << /Type /Annot /Subtype /Link /Rect [ 256.958 759.389 290.838 768.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 130 0 R /H /I >> endobj 133 0 obj << /Type /Annot /Subtype /Link /Rect [ 298.573 759.389 392.453 768.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 130 0 R /H /I >> endobj 134 0 obj << /URI (http://www.xemacs.org/Download/win32/) /S /URI >> endobj 135 0 obj << /Type /Annot /Subtype /Link /Rect [ 219.65 747.389 287.7 756.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 134 0 R /H /I >> endobj 136 0 obj << /Type /Annot /Subtype /Link /Rect [ 293.53 747.389 462.41 756.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 134 0 R /H /I >> endobj 137 0 obj << /URI (http://sourceforge.net/projects/psgml/) /S /URI >> endobj 138 0 obj << /Type /Annot /Subtype /Link /Rect [ 238.477 644.387 271.817 653.387 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 137 0 R /H /I >> endobj 139 0 obj << /Type /Annot /Subtype /Link /Rect [ 278.646 644.387 428.916 653.387 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 137 0 R /H /I >> endobj 140 0 obj << /URI (http://www.thaiopensource.com/download/) /S /URI >> endobj 141 0 obj << /Type /Annot /Subtype /Link /Rect [ 281.343 632.387 301.903 641.387 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 140 0 R /H /I >> endobj 142 0 obj << /Type /Annot /Subtype /Link /Rect [ 307.736 632.387 481.056 641.387 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 140 0 R /H /I >> endobj 143 0 obj << /Type /Annot /Subtype /Link /Rect [ 138.0 397.385 164.67 406.385 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 121 0 R /H /I >> endobj 144 0 obj << /Type /Annot /Subtype /Link /Rect [ 170.5 397.385 253.27 406.385 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 121 0 R /H /I >> endobj 145 0 obj << /URI (http://www.indexdata.dk/yaz/) /S /URI >> endobj 146 0 obj << /Type /Annot /Subtype /Link /Rect [ 344.262 351.884 394.333 360.884 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 145 0 R /H /I >> endobj 147 0 obj << /Type /Annot /Subtype /Link /Rect [ 401.064 351.884 519.944 360.884 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 145 0 R /H /I >> endobj 148 0 obj << /URI (http://refdb.sourceforge.net) /S /URI >> endobj 149 0 obj << /Type /Annot /Subtype /Link /Rect [ 188.035 271.999 260.595 280.999 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 148 0 R /H /I >> endobj 150 0 obj << /Type /Annot /Subtype /Link /Rect [ 268.27 271.999 377.69 280.999 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 148 0 R /H /I >> endobj 151 0 obj << /URI (http://www.gnu.org/software/emacs/) /S /URI >> endobj 152 0 obj << /Type /Annot /Subtype /Link /Rect [ 182.49 238.498 209.15 247.498 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 151 0 R /H /I >> endobj 153 0 obj << /Type /Annot /Subtype /Link /Rect [ 214.98 238.498 361.63 247.498 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 151 0 R /H /I >> endobj 154 0 obj << /Type /Annot /Subtype /Link /Rect [ 193.59 216.997 220.25 225.997 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 151 0 R /H /I >> endobj 155 0 obj << /Type /Annot /Subtype /Link /Rect [ 226.08 216.997 372.73 225.997 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 151 0 R /H /I >> endobj 156 0 obj << /URI (http://www.vim.org) /S /URI >> endobj 157 0 obj << /Type /Annot /Subtype /Link /Rect [ 293.86 195.496 309.42 204.496 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 156 0 R /H /I >> endobj 158 0 obj << /Type /Annot /Subtype /Link /Rect [ 315.25 195.496 394.7 204.496 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 156 0 R /H /I >> endobj 159 0 obj << /URI (http://www.perl.org) /S /URI >> endobj 160 0 obj << /Type /Annot /Subtype /Link /Rect [ 203.485 140.494 219.595 149.494 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 159 0 R /H /I >> endobj 161 0 obj << /Type /Annot /Subtype /Link /Rect [ 227.027 140.494 306.467 149.494 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 159 0 R /H /I >> endobj 162 0 obj << /URI (http://www.ruby-lang.org) /S /URI >> endobj 163 0 obj << /Type /Annot /Subtype /Link /Rect [ 145.551 85.492 167.221 94.492 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 162 0 R /H /I >> endobj 164 0 obj << /Type /Annot /Subtype /Link /Rect [ 178.882 85.492 281.652 94.492 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 162 0 R /H /I >> endobj 165 0 obj << /Length 166 0 R /Filter /FlateDecode >> stream xœÍ]sÜ6îÝ¿B÷tÉŒMK¢>ýæÄI.7MÇu|Ó\›>h%î.k­´Ñ‡7{¿þ@‚¹"½7×§435@Ô·‹Àóáß•ø“EɲÜ+wß>ðÒУ‰BÅ>‰ÂØ÷©D$Œ½wŠŠ½ZðƒpÁŸZ€·Þ¯Í…ï}¸øý ©<øþ Â¥¨Ï¿º)ÿHúùÞæâÍãÅõûØ |ïq­ML) hé—ŠQz;ï÷WŸýÀv^Ǿ¼c;Ö ýë?¼Ç^¼{I$}·ÑŒQæ‰JNa¦ ÌTyùðé§ë/Ÿ~òXҶó¾¾êXÙî ÎT¬ºôVãà5íàíÀêü~üúZÉ÷6'.‹éBðG¹ÓhNÂy£!°¯1Z=.;V LÃ+¾ª¹pØ~ËYù‚¼]qÔ@ÃX¥¡Bçuεà^›Àp0ôµú¶é‰Æ¼ç]?\Ú›Ä + [±ž !éÉrŽ3²޵&é÷¬äkéýŒÞÏšFZLIÔØCLJ53\hn\5Ž«¶e1c¾¾›šõÑ·;Ö6Z2«{Ç…:~ºÒ­œ1ŽIŽl›¡ã;ÒˆëÇr;ÅAÐÅ‘ ðf4=ŽxaãðFM¾+²b=°IN]_â¨oOç´WøËD€õ°ÓŸ˜ë꼚¯™¡ÏY‡‰‚ùè“¡—C}ôVBøÝу¥oü4ly³ñ*ˆ#☠…åû)ÅÉeñ¼Æ*vYž“\¦Òî$,S’(M}¨–¶ì{a…%ˆÉ`hä`ÑY¹ßO ÈÄP*üÜÁ¨’æ+DÙ†‘† ×PvþdåÐ_ïûÍ®¶²œ<ˆó,‡L+ý'Ð4E Ôöð¬ê»¶2,¦²wwW«¢g•Ã74^HTx…fv‰1ðf^A Î'‡ÊurlÙ3'4 s7ßwµU}a ¾,¿™ƒcžÈò¦<FÔÁg”ía[ðvÏô"jx]Må{!4õý87—é–®‹‚Ð T°ª¨­Š€:.*¶={I¾\ŽÏ•Н1(w-¸°„sàÑÈ[ƒ•­f —IÌܤ‘7Ù_©±ÚÚr\†홆‹ºo5¤.ä*Œ_G“Q­ûÜS7н­‹’]Ó4†L>¸õ<Õf[µ[9EQŠƒv}tØ'Z¦ãŽAgÇ ™Â&ak »ƒÎ¯kÇÍVt€Þç‡y³Þç+H˜@½£‘DY®š1ÖI=áJÅÙƒï¦ Ä ýqüéöá­† ª@aðˆ¨sÌ÷ãj‡ÎAX5+IÖ»¦ú¹Åƒ)">~v[{X-Ö¿‡Œpí h™E‡ü†¯ÙOÍ®’É…û— i˜% á[u ‰&o2µ¥À=8CÂöP<¼.Vµ)EõE½SÅzB4G‚¤2ÃŽ¸)ÕNp9vTCmòAüö/k~ªœÌQœgKCØšõ7‚54²NˆI§ÃeH¨è˜“j ÀÐÈtr¬ƒK‚*¶äXÇ‘š¨ƒc Yò[:ÍÙë¹æQÓ6WsKe¯Npÿ#ÀDvÄ{¶Ÿ îØq)HÒ3~˜)Å‹±^ª×]»›×8e‰HÞ'"O\¿Ï­gÈ㙸»Ž“À±4ºê­àzFI³süZS±ÍÈ ªm#ÇÂå3‡ËJÇÚ™8U¸ãĆÇs9c¦Jc¦Z¢„51†¡»5~€vÚ ¼ÉV¨š¯º¢Ã›ß™šZUg!¼3Å@86¦2ªùµã% â… ¦KJ_$SeĆª<´pŽÔ¨¦¯ xz½@¨ÐCtшGs¢uÇ hy$L‚<§QàÐøß·¿iÖ¡më'¾ÜXý¨ï§™K‚f_Æ>+ˆŸP¨ÇÔe,cð¦bßEêéúXüǺg‹R’G„w9$-7ƒðM˜.ˆxSÖc…±&2Cêa_ˆT¤a4¸†[.Ÿ/&òm;Ö•†Wk?®×¼ hJõå‚Å`uAñ¡O§Ô&7’ê¦å·½Úc×òs„ej ³œ$TÄ_æXè2hBhrñÞ!r‰­ë®øbE>_ˆ ÷$Sqw?†ÔyeÉYë[tr7¼ìñ}†p@B#³ÓQ&>D²‰mëÃÕÏDÀ¢múÿÛüâ+¬þøyîgoZ˜^¾7ʼnK]hœ¹S¤ùÅÎpØ]t!õÃ0:ow‹îv*âCšg^‰]ŠÛ¯÷xƒ%R…ý¹L6µ¦¶Ìgn}ŽÛ! T‹m3ØßãDT:Ï¢4œ³8?“ IŠÉÇ¥šý¡éÛüR&8Ó€m ù:Ë”óÒ‡h­Õs†~ª8e•¯q¿åû½laƒ¯òí5%~¼XÓ aš@Æ…HósF²é¤À››·²‡“Wox3Ÿ¾=ñ•ƒÈÚ1F©-R,Ùñ½Ù\òmc*;‡ÄGpˆ ]ÚQ+üìÛF$‡Ðºa[€•³a?¥9§~z^Qt½˜èêÄ4Ù±1€v%¾m¸j;>ä'²²TÇ1…–W·Â}â‹*Û}2“È@SßìíXç¨!I"R`âƒû²³AbÑ© —¢ÛÕ ¸Á_¼ˆx— LB^„ΙßBÔ*áˆûR g"S$Ðh¥ñY-:|ÜʨãX—RÇPz!ñÙ|ãjyY ý,Õ~’:Œy¬`õq© rêRшÖf½ª‹fã Yh6“8À·„X@—‘u”ÐóÚêsšBà‘ÿh`¾B^ì^Ôµ‰]\=)ìôœ©„OO_åÑB©±ÙA¶—U›Þlä'׿\üC²° endstream endobj 132 0 obj [ 131 0 R 133 0 R 135 0 R 136 0 R 138 0 R 139 0 R 141 0 R 142 0 R 143 0 R 144 0 R 146 0 R 147 0 R 149 0 R 150 0 R 152 0 R 153 0 R 154 0 R 155 0 R 157 0 R 158 0 R 160 0 R 161 0 R 163 0 R 164 0 R ] endobj 129 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 132 0 R /Contents 165 0 R >> endobj 166 0 obj 3695 endobj 168 0 obj << /Type /Action /S /GoTo /D [99 0 R /XYZ 72.0 740.03 null] >> endobj 169 0 obj << /Type /Annot /Subtype /Link /Rect [ 281.93 121.105 305.81 130.105 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 168 0 R /H /I >> endobj 171 0 obj << /Length 172 0 R /Filter /FlateDecode >> stream xœÍYK“Û¸¾ëW '«fh¾)]Rµö®SNíÆëxR›ÔÎ ’! ™ G£Ÿ/RÇ{³}˜þšh Ñè /«„ÄðÿNýYçI´^oHÝ®¾~Bª”d¥aq”§Eg$É£´ -™² Ò(™€H-&cÉo«n“¿­~ÿÆìH rçUüÂäzªÏ«OnfÐß“~¡†YGëïOÁOÓ®ª*Šç¯§ÉœQ}š(2‡¸Ê„ƒ;À¿/ª_i/[Ôžùw£\L«·÷«7ïA§˜Üï}DU0*I6›j³OÑ:ݨ)¹oÉï7Iöúrÿ÷ÕO÷KóÝìîÚWR¥—’*7q ÜÞl?#iéCmrb…˜¤I”®«8ŽË÷þîHOëI‘wcß³n où@.:Ih·CÛsI”ä…²_‚sœ:ìEß.åÈ$ ¨³X8ˆ|Mªuçpeaìä’¼&wymÈMm4rŒmÏÙ¾¹xFÃåìÆžœó‘×GiÏ<`|8†³wbðàÂÀÛSÃZ°Ûy¦è_\f'ºWøYôz ÀefU0Ë&ž™EÅØè¥³,ªìÒH»¥ 4k!Úñýž©£D£éna€gÙ3”‘çÝ™dGÞ¤Ç- ¦ßg†»Ö~ÏŸÙܯÀIœÎLÀ;²Õá’ž5ŒJ&o’'Vü‰5—Èú„ú¿vþ8ª PN=?¥óB¹~•áäY”DägïìÿÏo“bm²ü¾2Áó¦ÅlÅÒ80¤Ú|ç æMÝp° 8;ã2¥¡Ð¥£-¯ÎvTÇ0†pÞžÑ]øm¢ÓŽáÜû^´/Ž¥§SÃkm³€+YÿÄú(àØ°6ÜeÁV˜§¶‚ãmRIñΑo™ÑpømïÈ‹ýÄÙÙ ¡ê%Z@MíåÏ  Ž:ÑZÑL@½655!^Ní­aCûƒ_Œ¶bì‚Å„WÖûjƒG¶`¡u:³Ð–Ö‡fßa¬Bªc OÓ'Áw.Œ5<õb á ‘äX|x%ÃãÎæœ ˜»g;ÞCøyΗ‘A‚–ázt ~;•Œ®ÞLÈûlò™ ´ yšQ²ç ‹®³Iš”ß®×ãT¸ª]]ˆõ8w":H§æ¤èUbÛ^ȇÉÃÍŽí)Œyx­j%9[Fû%½²oK#×ã>§,®c*­t"ŬjÐ$­TÓžÖ¦žëj±³¹Üʲëv!ÇD7›Ì`°þ–ʆ?r~r8ôìó§ŸÃI•†á*taãÅ<'%ÍÓ¯É;mTÒôZŸM§iöÉ MCÓøÍÖB4~Øè­Äý\Ø¿ö¤DôØ¢mËR°G;(³Ü¶miD~ýsWŽ¬È¢uÓÙW½ázÜ»ËáŒ%z]D)X/IØY#k'°ú!2í‚ ÍWÚbSŒðÄOL¾yÿáýG컑۳ýnŒÒ^ï+ç O;s{ T?òfw·°é²˜mú¯'êÒ)ÜLoZ&%=ØàWº·yD![ô—Yw¨xX<š,£h8ÄG†ŒÆ½šþ6X…˯¨|dí¨RáüŠ¡öZU³½Ú&0ÇvÄ“káìhñ,Ýixèî­ØDÉÅi¶|ð@6âl.Ÿ?Øô}%Öˆ@ìR1Ö÷¢¿ƒ¾®cІø i·8·sB„Ê ,µÞÌ,¥Ö¤M eÔ¬(W W9[2 ú(\+¦":ɧ0%É“"ÊKÈHë„ó?„­KÏ6 mP™äq’•Jü  TP19#i¼Á´߸u ˆˆ±qBÚš‘I‡À›¡‹óXG’:K"9MsF2˜¤s${†®€«¡´™Ù\í:Ÿé^ÍÛ†’Ou„wŽÄðˆþ08Òd$˜6﨣ԪöšIúÖ)ùO¶ÿñ­ÿ0ð¦ñ“`Ô+[æ.×-욟éž!q˜½]—õ|ÏF/'òëq>‘g….ea"G–MäˆL"G0ɬÈ2Iψ²A½Iˆ`lQ‘V½µÉUf¼¹š¡˜vxªÃeêè±]’V÷­ @íŸZ@Ý‘%(BÀ‰õ*T„†K?G³:Jµç­zl¡;2vÐ!H¢¤Ô#„Þ®‰Ó«®%K ï®M•¾^ùn ¾çY±ùš¼j [•~Þ¹¦ðÚ9Šdž*–ãzœy IKø‰B¶z§î@…í¨E¦œ¥öAËá%ÛBwæüÓàáA‹l¥hF?Û‰GlR<}KJºgÒ)sÆÇ·Ôö^šÂ^@h¿àE6O0A¯eþáGãášî…ékÀ'¥Qs&ƒõêÕ=?y¨W¬‡ÆÏfû'\“{°õ øk¶å˜¨ióJ†ü`%ÈGüÉR¶]0J>Ï@`GµwÍõû}¸á´ £0-U‡ Ôá-*¯—\³ü¶¼u=îlkÖ9 惘Ñð­mX ǶZF\„ §T ;àQÎ-ª¾(·°çÊ‹Ðß c?võàn­ tîl ã7ÞíÄy^"”QªyB°“ƒt©;>­ê­ƒê‰Ÿ9„—ìN%[Ü,"¨Êê:A»š¼Ž6úÕÁL,—TÚsh€?Mº!4ûrX·HþÌ»ñù2å®×ó,´Ö:C¤‰Jÿ¿\y`ëiã0T­r8 YGh@±7C¤#Í»Á¡°."Má"_‡BÌÑâI©âu™Z؈/vÏS”î8_CîÒ¿¨g $c­ôŸ„#·Á˜VmD¼“|ç?¢ÂHZvvû¤…ø?úiüíéÕža„D _ 5•Cs,ðeÍèæ%û±ë o,!¹JI ixµ2W* (ñ^D¶âùR’Ç…,Õõ›²Ðõ¸ªö¥™òü±×6JMªU[ú_íÔŠö•O!t"WKÕÐúÑÂÎêÛs…ön²VôVlò•bØVTѶ±(¯ è.«ªŠãu\.lËý&±Ô“T›(Ϫ8IªtAÔ¬l:j½›nfól¹`ß|žÐÀnƒÐ)'•êÁÔªë„Wôt¢4ÞDõoZ.MI·‚s‘,‹Öú=¨(Dn‰zÓ ¿A·êÍû–|x¥D<;qþKð›ù§Õÿ$ði¶ endstream endobj 170 0 obj [ 169 0 R ] endobj 167 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 170 0 R /Contents 171 0 R >> endobj 172 0 obj 2639 endobj 175 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 730.013 180.531 739.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 174 0 R /H /I >> endobj 177 0 obj << /Type /Annot /Subtype /Link /Rect [ 520.455 730.013 525.455 739.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 174 0 R /H /I >> endobj 179 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 718.013 230.557 727.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 178 0 R /H /I >> endobj 180 0 obj << /Type /Annot /Subtype /Link /Rect [ 520.241 718.013 525.241 727.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 178 0 R /H /I >> endobj 182 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 706.013 264.656 715.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 181 0 R /H /I >> endobj 183 0 obj << /Type /Annot /Subtype /Link /Rect [ 519.993 706.013 524.993 715.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 181 0 R /H /I >> endobj 184 0 obj << /Type /Action /S /GoTo /D [27 0 R /XYZ 72.0 769.889 null] >> endobj 185 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 694.013 229.28 703.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 184 0 R /H /I >> endobj 186 0 obj << /Type /Annot /Subtype /Link /Rect [ 520.253 694.013 525.253 703.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 184 0 R /H /I >> endobj 187 0 obj << /Type /Action /S /GoTo /D [46 0 R /XYZ 72.0 769.889 null] >> endobj 188 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 682.013 202.009 691.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 187 0 R /H /I >> endobj 189 0 obj << /Type /Annot /Subtype /Link /Rect [ 520.451 682.013 525.451 691.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 187 0 R /H /I >> endobj 190 0 obj << /Type /Action /S /GoTo /D [46 0 R /XYZ 72.0 514.942 null] >> endobj 191 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 670.013 292.065 679.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 190 0 R /H /I >> endobj 192 0 obj << /Type /Annot /Subtype /Link /Rect [ 519.793 670.013 524.793 679.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 190 0 R /H /I >> endobj 194 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 658.013 269.026 667.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 193 0 R /H /I >> endobj 195 0 obj << /Type /Annot /Subtype /Link /Rect [ 519.961 658.013 524.961 667.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 193 0 R /H /I >> endobj 197 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 646.013 265.212 655.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 196 0 R /H /I >> endobj 198 0 obj << /Type /Annot /Subtype /Link /Rect [ 520.119 646.013 525.119 655.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 196 0 R /H /I >> endobj 200 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 634.013 222.411 643.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 199 0 R /H /I >> endobj 201 0 obj << /Type /Annot /Subtype /Link /Rect [ 520.455 634.013 525.455 643.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 199 0 R /H /I >> endobj 202 0 obj << /Type /Action /S /GoTo /D [62 0 R /XYZ 72.0 663.889 null] >> endobj 203 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 622.013 191.517 631.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 202 0 R /H /I >> endobj 204 0 obj << /Type /Annot /Subtype /Link /Rect [ 520.527 622.013 525.527 631.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 202 0 R /H /I >> endobj 205 0 obj << /Type /Action /S /GoTo /D [99 0 R /XYZ 72.0 769.889 null] >> endobj 206 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 610.013 216.1 619.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 205 0 R /H /I >> endobj 207 0 obj << /Type /Annot /Subtype /Link /Rect [ 520.213 610.013 525.213 619.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 205 0 R /H /I >> endobj 208 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 598.013 233.717 607.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 168 0 R /H /I >> endobj 209 0 obj << /Type /Annot /Subtype /Link /Rect [ 520.219 598.013 525.219 607.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 168 0 R /H /I >> endobj 210 0 obj << /Type /Action /S /GoTo /D [99 0 R /XYZ 72.0 407.227 null] >> endobj 211 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 586.013 332.969 595.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 210 0 R /H /I >> endobj 212 0 obj << /Type /Annot /Subtype /Link /Rect [ 519.495 586.013 524.495 595.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 210 0 R /H /I >> endobj 213 0 obj << /Type /Action /S /GoTo /D [99 0 R /XYZ 72.0 192.701 null] >> endobj 214 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 574.013 259.611 583.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 213 0 R /H /I >> endobj 215 0 obj << /Type /Annot /Subtype /Link /Rect [ 520.163 574.013 525.163 583.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 213 0 R /H /I >> endobj 216 0 obj << /Type /Action /S /GoTo /D [108 0 R /XYZ 72.0 711.297 null] >> endobj 217 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 562.013 252.983 571.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 216 0 R /H /I >> endobj 218 0 obj << /Type /Annot /Subtype /Link /Rect [ 520.215 562.013 525.215 571.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 216 0 R /H /I >> endobj 219 0 obj << /Type /Action /S /GoTo /D [108 0 R /XYZ 72.0 443.617 null] >> endobj 220 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 550.013 216.076 559.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 219 0 R /H /I >> endobj 221 0 obj << /Type /Annot /Subtype /Link /Rect [ 520.349 550.013 525.349 559.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 219 0 R /H /I >> endobj 223 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 538.013 248.017 547.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 222 0 R /H /I >> endobj 224 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.079 538.013 525.079 547.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 222 0 R /H /I >> endobj 225 0 obj << /Type /Action /S /GoTo /D [129 0 R /XYZ 72.0 326.384 null] >> endobj 226 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 526.013 232.569 535.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 225 0 R /H /I >> endobj 227 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.191 526.013 525.191 535.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 225 0 R /H /I >> endobj 228 0 obj << /Type /Action /S /GoTo /D [167 0 R /XYZ 72.0 769.889 null] >> endobj 229 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 514.013 289.625 523.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 228 0 R /H /I >> endobj 230 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.677 514.013 524.677 523.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 228 0 R /H /I >> endobj 231 0 obj << /Type /Action /S /GoTo /D [167 0 R /XYZ 72.0 664.171 null] >> endobj 232 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 502.013 208.666 511.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 231 0 R /H /I >> endobj 233 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.365 502.013 525.365 511.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 231 0 R /H /I >> endobj 234 0 obj << /Type /Action /S /GoTo /D [167 0 R /XYZ 72.0 469.288 null] >> endobj 235 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 490.013 224.866 499.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 234 0 R /H /I >> endobj 236 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.249 490.013 525.249 499.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 234 0 R /H /I >> endobj 237 0 obj << /Length 238 0 R /Filter /FlateDecode >> stream xœÍÝÁnG’€á;Ÿ¢šÃöffDdFœ°×kìƒỸ9PRË"@‘6IaÖo¿Õ¤›ê*üo¶Û)}"Y™¬Êüõ¢îÊü÷ßò?®uï»÷Ÿ/~}|½îFÛI|ÉÊ^›•"»ªûf»Ï»¯_²ÝuóìíéWó?_µóíO»¿]Ü\”Ý÷ÿøçl>ìÊ<î_å…“/§úéâÇgÛc0ýGúøž„RÊÞÿxà_1öå~9_›¯Ϙÿë«äüÍã{ùê•ãïàøß?ä²úˆËöŸè“ùæƒ+»Ÿ/¾y{ñïÿ5?¦²{ûñô5Ú~Ô1"æÿÚ{‹ü§íÞ~ÞýãMûÓ?woÿçâ»·[_þ0¿¹õ_•–×ï¿çùkì›—RêW¿uõü=ŒÇßòñwüöòÝõawûq÷ííÍÃáæáþø'°ñ7–±¥ÏÓ6?]÷»?ÍÿWb_woþûæáîö×÷W·7dzü~l-¾7)Þd}–gç8?®¶}mm¶ÝÖÇíWµ¡ÚIÝ*ªÕƒÔRf=ÿki¯©ÕÕAjm¨6T;©­¢ZQ=HÝ‘eG–Yvd9å@–Y:²tdéÈ2e Ë@–A,[!–­ËVˆe«Ä²UbÙ*±œ_ŒQM,[#–­!KA–‚,Y*²Td©ÈÒ¥!KëÇïÜÑ6®ŽÖuº7TªÔ£¢ZQ=HíÕ‚jdéÈ2e Ë –Rˆ¥b)…XJ%–R‰¥Tb)•XJ#–Òˆ¥4d)ÈR¥ KE–Š,Y*²4diÈÒeG–Yvd9å@–YdéÈÒ‘¥#Ë@–,ƒXj!–Zˆ¥b©…Xj%–Z‰¥Vb©Xj#–Ú¥ KA–‚,YÎk{ïZêü2DæþT}¯¦áÝ6Ž“³z´ÝüÊ>;yœŸœHº{ó·O—§·®îO¿þëáã~ó«‰ß›RºëúÔ§ƒWó(m_´–Rd¬[ϺªÔóªÔŠêAêyÕNjAuGu:e Ë –­ËVˆe+IJUbÙ*±l•XÎA:©±lX¶†,Y ²d©ÈR‘¥"KE–†, YZZ–p«õu¯¨VTR‚jAuGuÚª ÕÈ2e Ë –ùófRK)ÄR ±”J,¥K©ÄR±”F,¥!KA–‚,Y ²Td©ÈR‘¥!KC–†,;²ìȲ#ËŽ,²Èr KG–Ž,Y² dÈ2ˆ¥b©…Xj!–Z‰¥Vb©•Xj#–Úˆ¥6b© Y ²d)ÈR‘¥ê~Xw05’:sÈ1dãlLèÌ‹ëó ¶LèxÏéœÛ§_Þºýrýáé­/÷‡§_nOìÌQ}·yZ›Éê]<º:hþ5¨3ì:Ö­÷꼃Ԇj'u~JƒZQ=HŸÒ T˼Ô‚,Y ²Td©ÈR‘¥!KC–––Q[}M¤Î©\PªÔ9• jEõ uNå‚ZP,Y² dÄ2oÀ 5±Ì0@]‰eÞ€Ajb™7`€º˼ƒÔÈR¥ KA–Š,Y*²TdiÈÒ¥!ËŽ,;²ìÈr Ë,²ÈÒ‘¥#KG–,Y±Ì0HM,ó R˼ƒÔÄ2oÀu#–y©‘¥ KA–‚,YÎkû.-ÂúFý€Wç%~ļX©[—áƒõùeè|°.Ç»/b÷æûÃÍáîòúé͇ˇ/w‡ûóa³}áÃ×ç{:øü ^öc”R&æú Õȼ ª;ªƒÔù "¨ ÕNj¯¨VTR² dÈ2ˆeÎàšXæ ¨+±ÌRËœÁ!5±ÌR#KA–‚,Y*²Td©ÈÒ¥!K›–}~ÍR_S©{Cµ¡ÚI=*ªÕƒÔ^P-¨F–Ž,Y² b™38¤&–9ƒêJ,s‡ÔÄ2gp@݈eÎàY ²d)ÈR‘¥"KE–Š, Y²4dÙ‘eG–Yd9å@–Y:²tdéÈ2e Ë –9ƒCjb™38¤&–9ƒCjb™38 nÄ2gpH,Y ²d)È2¯í»ä%u¼zbd¹ÝÂZDÙšÑõ N~:ŸÍàèãú>¾e}ŸÃÝÇË÷ëy›œ+QJë±>˳3¬Ž“½…—²õÎW#òùç â±6‰ÄVI¬$ î…ÄD°ÁNDpA'‚N "D0€`ΠæüÙëã sö Ä@0çÎ@ sæ ÄDPˆ A!‚J•*4"hDÐRpDÔÐ×ÔAêÞPm¨vRŠjEõ µT ª‘¥#Ë@–,ƒXæ|©‰eΗºËœ/#5±Ìù2P7b™óe¤F–‚,Y ²Td©ÈR‘¥"KC–†, YvdÙ‘eG–Yd9å@–Ž,Y:² dÈ2ˆeΗ‘šXæ|©‰eΗ‘šXæ|¨±Ìù2R#KA–‚,Y ²\–œ™аJ&¤ŽKΔpc}œ­§Ìb½ ¶-SfãøôÑáîpóþðôÂç˛˟Ÿ7O¯¼p#ÔòôK·Ræeý>žÞJÓˆ¶>hk Hê õ ’ÚPí¤ž£AR+ª©ç€ÔÈÒÒÒfÐêkê uo¨6T;©GEµ¢zÚ ªÕÈÒ‘e Ë@–A,sHHjb™CBPWb™CBRË‚ºË’Y ²d)ÈR‘¥"KE–Š, Y²4dÙ‘eG–Yd9å@–Y:²tdéÈ2e Ë –9$$5±Ì!!©‰e IM,sHêF,sHHjd)ÈR¥ KA–ù£™W)[Ô/Œ¨ò˜¹[Rëƒ6†ƒ¹éùx°W¬Ð\㛫w×W·?ß]þòé·Ó«··×§·^z6&;kóÔstºñ~NÇŸ_—åç^_FÂ[ßê2.?ùHÞY(ÏÏ?’Ëåù)Hreù@¹0UaªÂT…©*SU¦ªLÕ˜ª1Ucª©v¦Ú™jgªƒ©¦:˜ª3UgªÎTƒ©S ¦HU R•‚T¥ U©HU*R•ŠT¥!UiHUR•ÆT…© S¦ªLU™ª2UcªÆT©SíLµ3ÕÎTSLu0UgªÎT©:S ¦L5ª¤ª©jAªZ‘ªV¤ª©jEªÚª6¤ª© S¦*LU™j®mQG)*A†ÅËò=7$6Ý8®ŸåÑ— €×cûÇ F¦æîÍOßÿù‡Ó[—7NoüýÏ?¬Æó²ŸãÛR¬·sŸ]×÷]4B­nwþç“7aƒ¯÷P®,(Ÿ×{(–#Õüq<É…© S¦ªLU™ª2UcªÆT-U­”ãUy ¼7–Ë売\Y>Pî…åÂr¦êL5˜j0Õ@ªùcz”#ÕüA=É+RÍÕ£©æëIÞjþ¸åLU˜ª0UaªÊT•©*SU¦jLÕ˜ª1ÕÎT;SíLu0ÕÁTSLÕ™ª3UgªÁTƒ©R͟㣩æOòQŽTógù(GªùÓ|’7¤š?ÏG9S¦*LU˜ª0ÕÌq|U%ƒè¼Ï»V÷²uÜÖè?ׂ(!ÝN£ÿ¶¶}é—o?~Ïñ…Îÿ¦¾qŽ—7?ÍçûçG” Dl·åç6F¯¯s#P ª;ªƒÔ¹¨ ÕNêÜÆÔÈÒ‘e Ë@–,ƒX.{ž€šX.{ž¼¾®ÄrÙóÔÄryêÔÄrÙóÔÈR¥ KA–Š,Y*²4diÈ2÷<)m~Ó«[ߘ¶¦•Hž»žÜXî(ÏOH®,(ϽOH.,gªÎTƒ©S ¤ºlBr¤ºl‚òŠT—mPHŽT—P@Þê² É™ª0UaªÂT•©*SU¦ªLÕ˜ª1Ucª©v¦Ú™ê`ªƒ©¦:˜ª3UgªÎTƒ©S ¤ºì‘Br¤ºì’Br¤ºì“Br¤ºì”ò†T—½RHÎT…© S¦*LuY?@K_ŸÐ´Íq ï¶uàùÄR>2¢¶šXÇi¥\Àu÷æÛ»Ã‡«‡Õã ¹~PÍD[lœãÙñçÎac1êÖ«Qý7¢

GŽ(7–;ÊçàåÊòò9~D9S5¦jLµ3ÕÎT;SLu0ÕÁT©:Su¦êL5˜j0Õ@ªó+9Ë‘j+HµU¤Ú*Rm©¶ŠT[Cª­!ÕÖ˜ª0UaªÂT•©*SU¦ªLÕ˜ª1UKÕyuÔÔ^“÷Êreù@ù(,–w–ʽ±ÜXÎTƒ©S ¤*©JAªRª¤*©JEªR‘ª4¤* ©JcªÂT…© S¦ªLU™ª2UcªÆT©v¦Ú™jgª©¦:˜ê`ªÎT©:S ¦L5˜j U-HU RÕ‚Tµ"U­HU+RÕ†Tµ!UmHUS¦*LU˜ª2ÕœŒù°É½œ~´y‰[¼ôÇyîËc_GÇ{Úbžü§ß޺;üúåênY½t5™SaeþÓëÆ ŸN°1!f¹Kè¶qÔÖ„Ê…ååòÜVäÆrGyî¬@re9Su¦êLÕ™ª3Õ`ªÁT©æ„Ê‘jNˆ‘¼"ÕœC9RÍ 1’7¤šb(gªÂT…© SU¦ªLU™ª2UcªÆT©v¦Ú™jgªƒ©¦:˜ê`ªÎT©:S ¦L5jNˆ¡©æ„Ê‘jNˆ¡©æ„ÉRÍ 1”3UaªÂT…© SU¦ªLU™ª1UcªÆT;SíLµ3ÕÎTSLu0UgªÎT©S ¦L5jNˆ¡©æ„É+RÍ 1”#ÕœC9RÍ 1”3UaªÂT…©*SÍ °UJ­:^?Å´ì€]çQmë ?«óf¼«Ù°ÇžF>Fú—_w—W7?Ÿ^º_&ÉVS2u?òîúÓo`õ±Þ3”O ®ŽÛ3<À'¹°¼³œó?šš’$$Ï͆Q.,ï,”ç…$ÉåŽò†Ts³a”3UaªÂT…© SU¦ªLU™ª1UcªÆT;SíLµ3ÕÎTSLu0UgªÎT©S ¦L5jn6Œr¤š› “¼"ÕÜlåH57F9RÍ͆QÎT…© S¦ªLU™ª2UcªÆT©SíLµ3ÕÎTSLu0UgªÎT©:S ¦L5jn6Œr¤š› “¼"ÕÜlåH57&yCª¹Ù0Ê™ª0UaªÂT•©æÏ"ëe+qŒ¾l7ÔçÕŠo·1¯ž¬çž–fÈ©‹¿<|:ÜÞ|yZ¡ìÃ¥”:êÆYO'X§{5™ò°ãVóó*•äó*åÂòÎò yî\ƒrc¹£|^¥¢©æö5$oH57°A9RÍ-lH.LU˜ª0UeªÊT•©S5¦j©:¿ÕϯP¯Êå½±ÜXî(•åÊòr/,–3UgªÁTƒ©RͽlPŽTs/’W¤š{Ù ©æ^6$oH5÷²A9S¦*LU˜ª2UeªÊT•©S5¦jLµ3ÕÎT;SLu0ÕÁTSu¦êLÕ™j0Õ`ªTs/”#ÕÜËåH5÷²A9RͽlHÞjîeƒr¦*LU˜ª0UaªÇGç{ƒ€ãÔÑeë¸8ËG[†‹ç“ò¸C²ì}÷æw×ÏÞü|ûáËõzÆ"çÜG/e~nlœòÙñ«óŠ9òp­®†ýs\ƒraygy |ŽkPn,w”Ïq Ê•åLÕ™ª3UgªÎTƒ©S ¤šË  ©æ²$¯H5—@9RÍeHÞj.+€r¦*LU˜ª0UeªÊT•©*S5¦jLÕRõqÿ¹Wä½²\Y>P> Ë…ååro,7–3Õ`ªÁT©æ#B(GªùˆÊ‘j>"„r¤š‘¼!Õ|DåLU˜ª0UaªÂT•©*SU¦jLÕ˜ª1ÕÎT;SíLµ3ÕÁTSLÕ™ª3UgªÁTƒ©S ¤š¡©æ#B$¯H5B9RÍG„PŽTó!”3UaªÂT…©*SÍVj-E»¢Y¦œ›ß"¢lÍxmM‹µõ¢’z¼“§äÊßýßÃáîæòúôÊå/¿\_½¿|¸º½YÍŽå#òOû>¯Ï|:Çê¸Økµ×±qÜz梱ÜXî(Ï ~’+ËÉó'” Ë;Ë‘j>â„r¤š8‘¼!Õ|Ä åLU˜ª0UaªÂT•©*SU¦jL՘꼞ß1çy•×äóBåÂòÎò@ù¼F¹±ÜQ>/„Q®,gªÁTƒ©S ¤š8¡©æ#N$¯H5qB9RÍGœPŽTó'”3UaªÂT…©*SU¦ªLÕ˜ª1UcªÆT;SíLµ3ÕÁTSLÕ™ª3UgªÎTƒ©S ¤š8¡©æ#N$¯H5qB9RÍGœHÞj>â„r¦*LU˜jN“Y¨o]2¿8 º¬.óxÛÐê¸Z6f.t½$¢g.l»7=\_>>œ^øéöãÿ.ïçCìÜá¨×|Ü8ééøÕqº/mäðÀ7Ž[äs-CçZ†$–w–Ês-C’Ëå¹ É™j Õe ’#Õe ’#Õe ’#Õe 7¤º,ACr¦*LU˜ª0UaªÊT•©*S5¦jL5— i^ªÕ­/ô[ó3(–w–Ês ’Ëå¹ É•åL5˜j0Õ`ªT—%hHŽT—%h@^‘ê² É‘ê² É‘ê² É™ª0UaªÂT•©*SU¦jLÕ˜ª1Ucª©v¦Ú™ê`ªƒ©¦êLÕ™ª3UgªÁTƒ©R]– !9R]– yEªË4$GªË4 oHuY‚†äLU˜ª0Õ9:R#´ ™ìÐe×¼ZJØÖÌKmç½/k-|]·eßvo¾ýrww¸y8½p}õùêáxWÉéÅÇ])Žoür}ùðñöîóé•«ûû/«G´ò¶—ÞlãýŸ\÷ÊÞ[îˆê[Ç­‡‡ÂòÎò@ù¼|@¹±ÜQ>ÿf \Y>PnLÕ˜ª1Ucª©v¦Ú™ê`ªƒ©¦êLÕ™ª3UgªÁTƒ©R͵APŽTsm’W¤škƒ ©æÚ $oH5×A9S¦*LU˜ª2UeªÊT•©S5¦jLµ3ÕÎT;SLu0ÕÁTSu¦êLÕ™j0Õ`ªTsm”#Õ\åH5×A9R͵AHÞj® ‚r¦*LU˜jÞ <¬”^ÉpKóá¸1J©±õ^ªœõùÃþ~¾Ä‡> endobj 238 0 obj 6644 endobj 240 0 obj << /Length 241 0 R /Filter /FlateDecode >> stream xœÍ”=OÃ0†wÿŠaÀœíøk, 2Qa‰¡êµ‚Vªƒ‚øûœãTÄîQ†;¿¹;?ΫøÄ =7)¸Jpç»¶î>ZˆuóU¯7žØ}è!~JGã¼ endstream endobj 239 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 240 0 R >> endobj 241 0 obj 263 endobj 243 0 obj << /Length 244 0 R /Filter /FlateDecode >> stream xœÍZK“ܶ¾ï¯`•’ªvi¾¾¸¬²ì(NRQ¼)WÊòCb†(‘Ĉ w4þõi A¢Éá*ñMÖañ5Fw£_ÀøÓ]èðïAÿ)’Ð/ŠÒ«º»O–zyäÅ™%¥ŸDiÄ^˜øQêuÞš”z­^CÑ<‚?«¹€ï×»þ.ð~ºûíw˜S{¬»ÜÏ07¬~¹{Od³`ü5Éx§»7wßü˜zaà=‰ÓÈÏÃ(ÂÂ+ü8*õ‘÷Øy¿½z׫‘µ-…ì_ÿî=þõîíãJ×8üâkSõýJDp•<Ïý`ëB†MŒ4  Gýi%Èâ.+ j€Ÿ9¸‘8 ßzÏW#ÜóŽ“Ã¬0,˼,á“_¬\'Ì¿ä0_v·¾i¹¾-·Q2²CË•÷Ú ýÈ{%–Q//ópR¼žÇ£œG¯äàè Ÿ‡òÒóA5⼎óˆ¹ÅG>ð¾Z VÎêÛ%„qÇ»ÃÿÏOªÝE«²Ð/‘žaÙ³ÖQZ¡FßÁG#“WS;*GèØÕßÝâ F¦ž>ój4V¶4qt㫜Èäói`5ájNÄŽ¿ô /bläDvê,Eº5Nù1ø7$ÒØ:(Y³‘ù8×xjÁüá®I+÷£B/XyXàÁNIªÍ†È’›ûž–-Ÿyö¼3ïÌü$H˲ˆ¬¢(½öfš>‘ŽÁyj‰Lq¯ç¼VN`àÕÀ™60ØU›\Úûûõ—÷ó˜ò˜[Åû“è9Q9s ƒûäP·×Ú†aá'f-ꂲ ÙlÿQÒåÀÍÎP“†ñOš4LC(På‚`L¼È<ïaDW· /¼mo©°‡¹£o\D+Y%YïéR×àÛצÀ~•n¼qÜ^ÃÛ³9µšW‚îbì-{®?žEõÑ¿Ý8‚j’)‰$›.Â4ñsïÕQ j$X(5ñ&àÒpˆÃPl2˜¿³žòÂ\`Á0õ1 ÈiÌ$r 3 Ï„$½Ä”háÛçYîØ(Š66rçÿB a÷еœàG+ 0EZбþJ Ä÷šYÃÊlÎAOž˜2<òIÔ”«*®èúJöã [Ÿæ“G4[}Çq²±=Ž2Ò¹›X ¬UÒ¡‰Îíä@Ð<ü?ü©µ•ÕGHRd¯Ö Õ‘=ÐáÉ–­i ,m²p´«ø¼ ¯w´M²¶—£ù!ƒÎÊZ–«û…a|Õ‚ÇÆÍ^RB h·R´í´Ê»<@18HoGô|ä¸+«¿Pþ"/ê~Gï´½“²ÈÒÜÕX¸ h¿®%8#Ä”7{šõ/ëUžöα™”™Ø¿¡¨}š´ÐÚñ¤gš!íö«;Ç8ææc3Ô7?æ;• *B?ÎS[&Œ7(6S_„¾3›jRf~çA¥ÙšÙ»£[mS‚Zjá(ú‘cÜ!Æ †ã%híÊ9fï ÏŲ"[Bîë­s#Ýò!-‰Îâ 6VÏ(€M£åÚ_w޹Œ.ìzçÆ{SFtkhó˜<=ÝŸyè¿;…$¡L'iƉ “ïÁ?æjÃÔ ÝØº7‚ ¶¤ ái«`(M„­mjY–‹aÍÀwÐ…æ­|S/>­dï)W6’/d<)* Û1ZTlŒ¦ÀZ¼Cè28T ÈT4…¢¯ùÜXˆÕÙÍ=S‡›êb]Ƽh@Ç>Ú”.Áë\At?¤5œ2ZÈr‘jù,Žæú²ÈsŸw”L‚’ƽãÒÔÉó?¸ï¶! •)ôÐíwèH˜è×¹¶ Rò Ó(*f¯/H‡#ë1¨q,‡™?‹Å‡œ<÷D¼¿ €Ú±Fm¬¡{ȉ÷@1Q­2â´É¡((<.°pÆ ÞÀÏ­ÑÁÛ\{öófœC½“²Ìâd<¡´AÙ{ù|)y&1ôûqšìpÄ Š,lBP±^׉Ü´êÉž~éäHÄr- b<—e‹Á¡U„¤¯´EÇÆ¦U$.ýÂùa¡ Ëu¿svp“[«­&¡= *î‡×ž>ü†=™v{„(óŒ”&†ÎÍŽ’+¦Qm"NŽù 69ïmrõ„¾äÙÄ[5RT{ù6 J?ÖW¹2·åù˜)óØO<£½Cpå ;Ø{6B›UÐC 9Ë›;ßQ¾'Ü‚ š[]DKE@xœúšu@è~ ržmë úõ£p£¾Õ"*u®ýw/>;ê·µƒ^= ‡žPo;VaÅFüóoŸ™ùS&3Ñ;qܳŽÈÂÜðÈ/^“E‰¦BD ÒE[^n9Ñæ°SÔ“8ÞXgñu¨EšŒ›.è(u§<ßA éÒHØ@&+Þ‰ˆbqr"+§BHk­¾n ;«:¢ù’>ó²—Vu'ÑŽÖIºÑz‡ ®¯šŽèÝ­òÞÞŸ[èý4¡®ß~)}&é¢>ÊŠuú,Kíž/bßçÓgî'E^–E™ípÄô‰,lúDÀZ}E¹:Â|s2@ö6X/º_}î:\é~­‡îà™­±Ï™Ù»AöúÀø±Ï~ûž§m\‹Y'ZÁ4«8ÕO¥6­ @ýp¼ôÃ탛c@hdž¿œÏ v-8âIM&[Ï|ûÂÅ©Qd÷•ÕO ’؉+"!wÅ5)pÇp][ÀêÕÁ®XWvª@B!Ž’2OÓW½1A͸ÎÄ(sáÀ!zŽk¹ ±NÛ)ÜñiÇléÒ§_ã'ÒufÎï¾[ðȶs<ƒ¼e¶ÿD øÁmmÖŠd_ß3çp8n ä¥Q¶±“KWaéºÞÍmex¤BM¾pŒKqy ñœ¸¹ÌuO¹¬öµÑ²+ÅyÎRQ ƸPZÙÉ68–dÂmGý¸Ø¨ï~ÒpÍ„ÇAŠV_Ú/½nbtzÑïý( @;›|k_£!‰™‚~aÏ33(Ð%ô¹eº<,þ‰¤›‰dË£„ö¬/È%ϦØêáíÂwøˆ^AØ Õxê¬ûm©C B;DÞ*¨åË3ûÒM›_GéYæeaU&Å‚dn¼Fþ¬PzEœøQ¦ÈƒrycøKt­`þ­ÅŒ CXÆóÝÅ€­GjÚró \×mÆ Â;Ž »0ÂT¿]Æ›2«I #{é›"«ÜÏÓ+ ¡k^kh³<¶} 5?²©µO²Hr¡ÓVG‘’eßRÞö¥ÁlD¶‚Yôn&¶)²üͯ‹T¨w^;ª§ÅFõå•;(ÍQ#¬®…VÀ¾=#ñÌYÅ ¶aŽnƒ5ÇAv³ÝÓéúæá š ‰ÎHX 7§Döèwm 蟧W6¯gÓìEîÖ–—„æñpXtp윱îâÔxmÝÚŸ¦Ötˆùçó)J{„ÛÏœáÌ^Ö jÅGÇÊtì8D¿°ä†¤cpGá"Ú(¬,¸¯/o’ÉJ4Gt¿[‚<º±5?%ºs»¼ó%ÆŠ8;|i·ÕuI† G8—íÛ¯Ö¯Üf,èßåò+$”,—-|ò?¼¿û/y”Û) endstream endobj 242 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 243 0 R >> endobj 244 0 obj 2821 endobj 246 0 obj << /Type /Action /S /GoTo /D [245 0 R /XYZ 72.0 321.863 null] >> endobj 247 0 obj << /Type /Annot /Subtype /Link /Rect [ 323.375 359.363 517.446 368.363 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 246 0 R /H /I >> endobj 249 0 obj << /Length 250 0 R /Filter /FlateDecode >> stream xœÜ½IÏ&Iv¹Ï_ñíDdÈm6צAu‹„jlfC Q‹¨ŒÈÊcHFD²:ÿ}Û=ç˜ÙõwÈJµ6D°æóYøënópíÿò]x9ÆÿþÚþÓsxÕûùòÇïþEéá¥Å—T•TŽW9–ãH/!¿ŠååÃË5©¼¼·ß8ˆ“Æ.ÏŽ¿zùoß}üîxù»ïþûÿϼy9ÆïþôÝñäåxÕ?~÷.oz`ð¿¥ü/üî?~ÿÝ¿ÿÛòŽ—ïÜU\â«âq„þÒ_¥xÚÿÅ—ï?¼ü÷¿øÏ¿|}ýþýë¯ï>}üËÿñòýÿùÝúþRÖt¯ú¿µ¢þÃ%‹£«´Ö^·]¯IL)|£ýÓ%#·ò+—–€ÿ}šåã.LJÏð}ïù7“¹ç§§B8ÏvžãŸ^õK× ý·:Ì¿™ÒÝ÷•hùÂK8?«ô£‹µW±cœ\*ݨ©ì,ú(Û«øêå¿ýôöóÛ—7Ÿ^¾þôöå‡O~þôñíǯ_^þøécÕXÍ>¨ÖÜ_ò1^Yϳ·ÂWþÍ——¿ÿ–ê«öòÿ÷Ûÿÿèþ~çÿñµã¯?}~ûö¯¿¾ùxã’xÿnd䯿¼ýü¯o?ûŸþüóûw?`°ÿ•KþõÓ/^ÿë[ÿ®O¿¼{óöóë?¼÷É?Ž¿ùôÁçå“ûãÍ»/_?¿ûÃ/_ß²&|Ùm:º”ݪoütü2Ø÷V=®´×>}üãþsä÷óõã;Ÿ¿¼ÚióþëOŸ~ùãO;eU)ÿüòÓ»oÝÞ}t_Ûøñí×?}úüÏ;áíÇ}÷ùÓÇ#µS¿¢#ì—}¹/tµ>ÔŽ#–ÊB¿þ×OïG¾ßÿúòñÓËÏŸ?úýð2*ñó/_Æ”ì;Ô§‘òòåÝÇ?Ž&óõÇ7¯ßy±¬?­9_ñ‹èÅùÒÙj}9ã«P²Uxç·ÿë§Ù.zçøA#áˆ}ô÷”ø‹¿ÿöõ±¤1êþâŸß¾ýyÿÅÚ#x÷ñÍþëëO¯¿ú¿F=ý»/;ÁJ±ÿõ;+ÿzÿö‹{ðÝ›Õ]ùÇ?}úä3¦¾Ä?þñþË»¯îï·þðöÍ›·.o^}ý‡Q²›³:ˆç¨ƒó8ê©{ûñ£Ó —ÖÇ¿ç§Àó=_VÊŸÞ6œ¼~ÿ§×¿îûÃþá§ ¿º÷ýøn”ÿ×/_ß~ØOþøðɯ°¾ìþ5Ž?F_Ú_ýüöÇ7x³þü§ñè]Oµ‚íØµào>½ýòñß}}yûÿþðþ—7o_Æpû::#¦=dôãËýÛ|ùòÓë1FsY+a*y=æÃOo^>4|L˜_>ýÓ_¾º$ÁF‰&«ÝQ£ï~x³Ïë—Qz̲—™íç7oǺðúËË—·ãï×ï_Þ}X3Ü—ÿðཿÊíýúÈüÌ?ÅXnž+žû¿^ü#üM»ÇÝ—™öÃë_ÿðƒú.þš ñ;ÿZs³ý5Úéã;MqÇj_ÃÙ±®¿{5ÿüþ§_Ö—>¸,þüöÓÏûc#s÷e›2®Œ§¼‡ùËëûßÙ™ò§w6ß~}øÓŸ_czàèÄzË/j*”ûþwö•õÇkL*Rõ0ƒtoÚzȯª!Ä›jPCi`=è¦Ñ¦ùÓ6Ôé7{Ñýsc-ÒË«|¿®2õçן¿î¿8äÉêóǶæ©Ç0éí?~ò¿åžüFó¬ÞúËWûòïøŒïè¯vò÷6¯¹'Gå>êb¹ßTÀç×¶`£m©|Ï~¥¿nS?¼þuÿñ÷ø—_~üñÝ6!ì4íBÀ{ êo®Ló­ßýüË8ù¸ªðüú֫ýç÷·ÿ6G¥ò‚qù  ê1ª œ½Z|¿Œ‘òÞ2’£uK[î'ÚøzÑ›·?°„üSÝò¯VÂÚéðÏUôõ+ê˜ ?}uϾÞ¼ùåË×_×_¹×ÇÙôº~òé—Ñ]wæÝ?í ÿüúç·ŸÿôöÝúú >Z¼­wxû2NÇÃ5!žåÕ9ã3§þ›ƒíî¹ÿççÑL\‘C,¯âìèúc66ÿúòéǯzýÙ'Í\~óØû_]Âë|ûÃ×§o¼ô}doÈõ õÈG¿w›õ»W¼r)ß߯â£:ÒÑnªÃM8¿ŽÕøÍ/cp¼`+mÃîý§×oþêe´§eâ2?޾-Ûcäý‚}ó‚½Ù8üË/£g¾ÿõA«¥^Õ”Ç~·ž{=ÇrôêuùéË×ýטÍ>|ú¸ÿþ2:üëÏï>}ÙIc¶Ùüòe­•öçÞÚãÏÙlüëî«þ¯7¾yk³îM#zÔ}îÝÇ/_ß}ýå«{“?ðulÈßyP79ÝÔÍ“=ýËyûõßÙÞæíËOŸþd-3zÓ®œ7ïFüüæQs¬æ<Íòð*ßœbS ¯Æ§GÙcë/ÒaãaŽþÜ©6õU*ÅNvkÇu¨´½&‘?ýá_ß}úå G“æÞ|±­Ü[v¦ü0Ó«ýç÷þiî ¿üÕ“—ÝŒ%}CéÙOüð}ò¼}ýø¾©óÑo*ÄïêhÛ–k5æŸÈ!‘ù!kÆ?~þé×±1~ý~%ìCÿþ§¿°N3ÿºÉW,#ul³ï3÷·ïþøËçý»±°ýÕ~eŒiŽ´»œ¾ÞùÜg&¹4^’ok) D®GÈùAŽ. 9wÝ í4–Íòš¦ù—ÍRï>¿Ã›‰šNøÇWÿc—ÙÈ~;Ÿ~í^ôzã÷ÿûßÿûÿü÷ûo7GÜ¿åGÜÛ7¯Ü ~º<ñÅ¿Ê62¯?»b½~ cÈ)ÞÔ‹ŠÛí?ß¿þõíç/ûo.Žä5¥òÏ}|åß6aÿòÑ”{ß¿¾{½ÿØ•Á¿¿|úáŸß~å&ROø¬ùG_¿yóYÛ6&„ñŸcü/ì$îIf¹>=¨Šœoªb,_~~ûûßlœH(³ûø£uy6·Ž²þ ùåÅÆ¸’ü$¢ex QÚKˆw">Ûé„vcν ¯lS.køÏεÿé{HPÿn 0펽ŠeŒ˜pê†dÔNŒGËcÝ? .]¶Wý¨ÇYB¥ÿ¯S‹OL­&ýð])HÈGî§ýúýMJ9Ç1Ñd¢gôýõ¿ùö®Ÿ¾3‘m †•Aÿœ˜Æã]^µTãÙK/ #§©§Öϱ}9ãùêäJÆVååGÈp­Xã”vÔ¸Jy†QÈþ2V4Žã³mäqîï@yc°%iÔA cÔ[îãGi=l¼:jM}üÎÿÓûë?å|Ž?Òq#{VÊË;û_¯¯eu¯ê¨XVI²|ÆqùIelÁGÃÕñd*–§qr"ã˜z&p5î|¦ã«£fOc>ÛàÀ¡ .|Œo… ÎÝŽ¾ ï9´c0¹Ø{ŸÉ–~ãH?NrHƒ;ÞŸÎñ­ƒßM#idŸ\Çw|‚³ý6!ŸãÿGr°ßŽÿg|ØopìÙÎä±G§r±t–7&K¯x´Û”“ßyÌòŽg£g¦€w&¼'´hŒç­šÆ•ÏŒúg¼ßzÞ`ÔIHöüo…hï9Ê=GÇöÛƒïŒöÎ#Ýñx4t–ñ°û’ÞñÝ£Bú”ï9£\G#ÿV­¡³NËÏäéÖOÆ! l¶²›äÝxtÊÅÉqÈ‹ûé¸9.esªëýÿkŒw6Çý·Ùòƒ~88ͺŒúiwí™ó£Ÿ ½bC?9ú=wëî™ÈÕ¸Ýs˜},¶ž¬ïñ·Í¸w\ì·ynÙúFáo#žaŽÕ·cí}s;6[;NNîù`Ï”w,‹ ÆÂ®msÙï/i¿ßV’Éù<7÷¸¹Ú;1ÿÄœÛætlxg¼å„ú·¾ãTœñþŽms8½¹áùŽQÿìo#s6Ï ìÑú$çŸÆÅglŽ=âA¶9-ýOp|ÌÁ¤²)’³q!ÆíŽ6çÕÁö|æ{{&Ç'\6³Žò§'œ?[þKùŸäúûù\m-[le/íŽcØœÚæâžiî™ÞIv3ÚHœÎÍãó‹›{¦Ÿù¬+Ï™ù$‡²ê$£‰KÜÜwz çcŽÑñ~‰õ1ç]‡¥ìz.Íýö<Ö;ë±óYãÎOeÝ–9ÍþPkßÜóâÆ¾Guõ·–âæŒw¢ß¶š6·sóYwŒ 1ËHfÉ,#× –‘Ì6Ÿ,#™e$³Œd–‘\÷;ϾßyžëckSs\yÜfŒ5ßíwœñ~ìC¬KÅ£ò·Õ¾Å½Ð…Ñ·1Îkov pO³¯nû»'ÞîÙ~Û¸§Â\ÄýaØ7reu´¿Š¶çÌÜw%{†ß²½ÖØ»r_dí>`°Õ³öÃÁö¥‘{Ô Û>3êVÞ¨w޵c î|ÇÝž?‘ÿ`eIʧÍ3c·i­¤Œ÷Û~r¬Ú[Ú3Úz¶þ–N¼?Z¹rÀû£õ½Ì½n´=pÎ|ÿ*X$Á–νô=Ÿâú‚Ålî3°Þl¶ï>bÿÌå·vhÑ>üÂɘe±ù³çæpÜó(cáùù/Ž¿wŒ¼u>Ÿí·å²¾ñˆÇ²7¸­:_|<æx:v¿µq÷ˆƒå­«o û›‡‹úgµr©/¡>Õÿ‘ŸsíùHç·9§œ…c0m¶9ªœ•ã=nFÞt^aò˜g‡ÎùçØlãbrqéÌ9ôÍÇN·£Èâ7—¶m!Ž;˜‡Å˜Ÿ'ãŒ-®û[-»ô”6»¼µcç¡ö‡ÚvjÙy¨yà¾7–Íǹؚa±å­ÜßÚZóˆsßlëÔd;ÃN¶3¬m´±^×Í éÜëÚ¸˜lùœ]úq.N'òÀým뛫KÏm3ó¦ý0Ò±Î&æû^æMûác3óFNçfÛKÔCûƾ80oäÖ6׸9»ô„

QóIÆø£±÷óIFF«"jˆ ĔトnGDË&«“¥LDŸ#Ú–Xˆ‡m· ´ýxÔ‰&=™ØÊÂr.Ìyaìm€=G=‘_«j¬'i€To0ákVm5ŽuE§MV%¥[~±Ç,¶¬Öle+hA"j‡ìb²Ñнc>Ë#´MvÅÁgºŠ}`FáÛ Ô6ØÅöÑ2¿’,¢ÀRZ3¤âY¼{Û= Œ(RQ;©¨ÛcTì%°„V,¡ÕVý†U nÃB†u¸a]j©ö2œÚV Ú&ûV‘ZÑš¦öé×î„ý@jGH ­Û mÔ5Ì’˜l…ÖÏæ<ô>¢I,'Z[mÞÖj³¬Ðªš8FÝ]ºÕ6¿ìܶ¸¶Í=n>wzisì›ó*p¥oné1÷ý[8&‡s³õâɶá›\wþcßùç.o²ÍîdÛhNF>Åȧ¸¹ô¾Z!@¨Ñ¸ØdäMŒ¼‰‘7.6¹–ÍÈ›˜yæÌ¼‘™7.HÌ›*—μa­Ì9›™72ó† ·¢ÞÄÌùÜéy#3odæÌ¼‘›KG›r‘ëÌ™õFfÞÈè{âêÒ»Kwy;]Þ.ìòyf—^Üo›Kï+ÿÑL+—ž\zvéÕ¥7—Ži Phˆy@]zréÅ¥c.Pö´ùÜé‘Ó9ºt¶ …¡åÜÜòæ¾ÓÓ±ÓSpéÉ¥g—^]z[ýì¥WÿgØcstéyÍP<$Ln.½ïtlª&—ž\z^sBÄÅáäV7cä…GÅ(Ž.=¹tÎØpsŒˆ»K?wºO Aäç¸}OÜð‹MèÌþƒ=F¤°{)v\ù§ï¾9e©²ŒòÙÕÉ–¾ƒÄð^ÕÛõVì{Ž¿ŸÓ-ë=Å}˳]µp¶¦ªF§è *-Ý3®†õ<®˜;WÞõŽy…M‘Ôļ¿g\µWŠ­JØÌë{2ÔEÄGžyÀŽl1Ô Ä¸ÎC}ELõ‰¶ŽÅPí˜Ì«vЧjÚÌë{r ›CÙ|³®Æ®6o†êŽ* âÔ6£-ÄǪóP¡J!nesÙï¬y¿³ÆýN“dM.ç~§‹W¼'’’ÏÍ)?fÔ9÷¶¹æ'\f_ ¶J Îdü¶Þ³Õÿ™æ{F¿å‰ W–±Þ³õí$¶q‘Éy]ÅÞpß\‚ãø˜[Ú|n.PK§ò˜Ýû!•˜ÜÝ{Îu5jțӱ9×Í5nnî·çþ-Ä?“ãþmËasi›[ÚÜ÷o;¯€Éqÿ¶§ýÛ¾¯¹) žÜ÷oÏ}Í=ÆÝÎÏ™v=Ÿ®]Κsß×úDZ¯ãq›œêæ’7·}Mô­>ÁëZ1æIqNeÏíeŠñ¥‚©ûä C=&ιtdötsr¹áomUœ¯ÍoÉVDk"Åa¸íž„‰§cþ«u+ý‚oñô­ÕØñª/¥X^SO^øþy~õhGÐDõ›kØu› É~ÜaÛÔõ³G_û–«:˜ˆ`ÌTuä'˜ˆ 1Z™ú‘¡œKW2Ôc§×èÒ¡''..‹ÜÁÉ 16I8Ú„†Í“8ºôìÒ±ð‹ôn㜸'wæ-pâ>63odæíàÄ]7w—n›ê‰Bt¶Ø6“3Òµñê›[Úly£Ž/7p“ƒK‡>ë©;ÎcsEº&î°™y»ãÀ|–9cw‡Iß妶œ›[Ù ý`²é†~RF}Y2ôŒqü‡þÜâvlîȆ²‡¶™zº¯&:[ŒòŠQ^Ǩ*Î(#uy3Êø€sÙ\ñfZŽ+-­4œ@¨{P_i«%Ì´çs%¯´²ÒÚJë3šÍ °Ò¨À7¾Ts›TWZ[igTK¡Ì(®´´ÒÊJS9òKëiÒ9ÓºÊQ^ºÊ1(Ïöí¥OR›×—®rŒ-ë1{m†Ai¥e¦kM“ÚJ;™f~U)÷b·Õl•¤Y±ìTvG8K<ûì®!¤…‘©¶×g‰€e§²Lv :SG—澊v*Ëe{Þ{b˜D– È¢Ù¤Y6CÞ»Â}lŠy!ޏ6J(Qƒ3Ø*-<ùlœ'.ŒTĈ™©£¹œ [ž#=÷sb9˜jGÂp.LyÎ%3ud½h^0lLY§õ Üœ`P6"Ëfû¹ZòšŸê¹§ª2‘š!›­ÀT°™Š _YX™j›ÃVžLµïQF¦š„!1ÕåXXË-¶)i@)(ˆAcQ¦Ô(Ú¡Ô:Oé’y$lÁ†švÜ S:Ä@N>¶RŸh€ Úìr¸IšŒNñ˜T‰0Ì¢R…q§BŠH,}aÛ©¸O \œÒ°SqHÄ]!W|Ä~,<‘ ÙçKC1.”Åô-@..½!K,.ÉvÜ^\:üPÕÑŽð‹Y“Kÿ|ñ¹ÓMdxz†ûbØ¡‹áoj›óMîeqÂåïT#­›qY<ÕH]zué ²aêäŸËÇB°“¦lðC†-¼8õÍÅ¥W—Þ]:ìÓi÷9ßäèÒ§üûÊ?Ùé Gó̱ùýâôÛlÛÖHH—”ͬ(B§"Ý…áÝ!È*×¥-Øÿö~›ñ<φ1Øæy`â Al´sÐö»]g„j[7nŒ¥Søã…šZcj¨/TÔ ¦“°å v[›UÍÇ8áÅP°³{ÂNꂽM4»×‰£ƒ=À|,,ûÙæ'l³*´ å!…¾pì#¨LLú?qL¥Êºýgâ˜Ù)M &ùç¦ ˜˜B%6áÅÄr.´ŠêÒ\°—ql£¢ˆ1.Lö2Nc²›hµÃúµF¿G;ÍN maŠ ózƒ©"Nìûg(¾f·_Q6äÌ–þ‰õXØê,›õ,•Ø&‘‰ÖX¬¨nÅê3KªT³çœØûl»”S y çÂTfÚ5©ZÞ”™xÆç:n„ó´æ–Š‚õ>LG´—a4›ûDk·&Œ}‚bk7)_Y»UéÄ…ÖnÒȲΑ‹^-Õ‘$SóWš‚¤²0ÙA‰æ¹.¬qa³OðNìLÓq.´ª–C’t.´q1Ý—„…6.äìÄÆÅô{Ò¦õ‰œ×'LHÙ±Yrâ¹JQBx„Öª“6«ÄDˆª>¼šçTM0“táåÐò0µò’ƒ<È,‰ñî虄îж¥yc½ÅÓŽ¦|v4K¦¤ß¶å™"e³£.ZõFJ¡¤˜Ï…ªsp¦² Zæº@­¿í‚Vd0ë¥&1¬t+{*âg“ÜKõÈ+-Ómé\Hí»ãj--äBrÁqè”^½aÔ{ÛKÏÇÂÒΗ ìúÚ8puaÔçË9³3púøØâÂÞ'Ž…«lŽasrÏÈÛ‡›ŽfF°½c{æ,‹Ã±2>¶¹á1ϼ[‚´*pÞ`Ýs ³½ ÑÒsî›kÞ<Ëâ9΃39ÎúIv·š<ÄÝæ!Îv²3µdÿàÝì:4³Œ)–Í9®zÐ] Y÷ ¶c6/*p·Ài\¬Ûè G;j—ÅYy8lë;W«ÎÁ¼¢!«®ì¨šç·,ýÌ‹Ë|g|Á<óPÒêš:€³JÝíRÜåˆ.ÃÌ CìÁêÜW›à0¬9/Ðj6ˆây—„}`Õì!×ä3’²ÏxÎ j¿jßÒþÓ®œªö¥¸™Ó¹ 45]G\oð·Ö*'Û „ª;’!.Têfäs^©äÍ@ÌK•´Þq¡÷bܦkaƒ8µ.C©Á(c€ÀZÌ2r­E‹[¤·;NùJú\u…“+å ñ€ Ó掻ƒïÑ- žA}BK¦²?Ïr+‚÷dîEðžÌÍn~¨{a”]ÏàJh2ú@¹c\ä¥Â9¹CŠ/ÆMAæ> âîÌÞb´—í…þ†#âb\_d©KÇ͸À'—޼%zÀ$“Û±¹”ÍÙ¥#obälëèbäMŒ›'qÞy†g¸Éaç¹ð‚@êÒus ›ÑÏY?™ã‘˪Ûvý'äMÜÎÕ^¶+šmrß̼¡­ï.xq})b ¢¿éxõCLÓê«Á¼ø¨Ú«oCÉB}žX5‚‰ý5vBÀüÃë'x—äø /¼m {~Wõž³ãä8>ä£ãò„‡L´÷î/UÈ( ·ìç“ó†ON-–å¥Â¨ƒ IÚ÷Ÿ˜pl½`âQÉèFH+ÄŒžçh)eV ãDB°ÑΕÃÔø]3¡D=ˆ…Î Âc_âDêðq>¸&–õ êïùû m‰_êîK›Šy•A(|”­z›j;D\¦Ugºk²Y¬R©½C üÚÒ×R]Ç®$´?3âÄÌ<ؽBÌ Õš‡n.@Ø_˜Šý2‚0öL!òd1%ÈŽ@xQ›Î,V:{šQ™·‡;J[Ûèh"î‹Alêñ;ʆ@y¥ÑŸ…QÈ"W‚zœTÛ=•0)Í÷Ñ{ˆ}—š9FÜ‹X‰ŠÊq¾”’T™ÜÙXk”x¨Ð_—™ƒðb–ºìø;s°IZäé›ÖB6V¶¶™x,Xˆ>ÎJÁ®ô6ær‡y?` ÞÒÌÇÏ‚ˆùá ~ËUmÅv­H¼Ú­vµÛE…WˆŽâ¼ø5â=Ÿ¯™ÇL³;ˆ—Ú®üohü‚7’ö]^ò*/ž¾åº‡þ¥]]~°{™òÂ[LcŽ:LǶ…-ḻnìë½ú𿽪γ¢qkd½l‰K`éý˜v/…­ù8¦ð GÇÙq}ÂÐ$Öûû¼pæÅí!ã\,Yu@:Õ“fž¯üíµRœf>vÀ·-ÚzªÈS“ÑTTy|û!)®šÎW™—PG5–('{õ¥DÊûK¡¨ÎãÈD¡[N¶^Kë1JI%Z£Ò»dLˆBÐîÐÄ…R‹+y•sñ3Š,íH¯¥û¶™m>cFÔ‹ø¼g{'ÆÜû„ )‹ ¨ze««pŠMÅîÛ»È•× ªoTd\ßåmÕ¡ÁÇŽm~WѨ“ºÓ=›¤œ>µQ iÿ욃þ(#n-xr2?û~ºÙ¦Ôw½2Ú…·Ø¦68ëñTŸÆö èIû¬?„$½k“gÐ/§‰aFC±K¢_ñ[æª.]CÀú§‰g“gÑï9uN¢ØñMÇ Ö7¨“ìdƒ#¢ñ˜zOšÚe­&I;Mo6îª|™ÃÊ–mZ1ÁUE/8ªð”Õfx¹tKЩ±ïñØŸÒ, æœèÔV"L(Ki`š ,šaL±í`%CìJk¼jë #/idŸl @M.èðr®J1ÔV§òé•3®æênD.PvÛ%#µñcN2 Óf<]dzâè8ÿ®O¸=ássvùÉá Ç'œ»üäö„»cWWϸÇq·KIO8ßs™†´ØõŸrî~UÃ=·ymûˆÓ=/EëÉú® úµÈÞ3Lj-Eã‚|Þs¸azÿÁUI™ ýs<Ú5Kié·9Ï«i^×”V~›a¼¬ü·[îOXù4ÏÜ3ËbWg¥Ç5o{uF[½Ä2Ú’cq¨Á)Ì»1TÓ\‹¡š9– 6º<ÆšŸÒ¹Yµ¦ ô³‡«C¼ó?÷æ;`nDÍøÜ|ÂþV›O;µÎÍ'œ0„yf<מÞÇë¨j„#x¼œ°“9:ï{y4Ó^ÆþÚˆ^˜·oh‹†ƒ’¼žÙ<Ì ;TÐ~ìÊÇÚ¬ÒˆùoØÄžR%°|Jj€ 6×îÆ}—Ô ê*£ æ!åÊPk¢ŽiÄÁ„  Dˆç:€àyd´oI«"×;—úT„Æ5 òoÜe± æoÑÖÌlS&£­¥êjûXõ¥Î=žT3,?§ƽëôØeïT=[»«,'TºX‡ˆ9ŽÎX§‘ÕI˜3À2$páÊTõ ‡0²µQRI ¸%„,3â>÷ÌôúÇŽ¥þfçg,nïéá ZàP¥±ƒ ¥’æcYûvxû ‡„{¶ö’ùáp¤Q‹ŽTjqÀ!ç>¯|cÀ/…}cfB I9ÏÌÊK¡ =Å04Û±“ÒV 㨈¶??©Že]ƒ’­hÓ¦ôMIŽÌ†œ·ØaP1"ÍUy¯w8æ»N•#¦v‰cM¤Fw¦PK ü—vùh6ù“äË&ðafHn$nÓÿƒÍÓêÀá˜%[–Ô¹L¯6uó2ò‚ãõmÚT,QÛžWY ŒŠªô†`›F镚‚T±lkBŒ+†éAÂö7 ô@ w8zþTs5¯ô‘PàW‚9«KJdd‚ÛÀ0QZ}@6Ëå_ðÛ»ºpwy&4õ§ÔÖ*ZÆl¨”Ý%óÚ?˜Ûç‰0™¥ìÒ{DIUí MÆù2¡L„Ò²/#Zc s]Ï…a=‹ !nMÊ-ZÙ„Ùž•„ /ÄËx–7}ka;šöƒÙ!¦caÈóeâÆjÈŽì:NšÅ©Næ D‡Fó’7÷WGçæ…|îÌÔµH¸e]™[sŸ­ÓÍ(†FŒæçþ>Úõ‡¶Óù…¡¾°Èr áÀ à:v®©ó¸âo¸g-uû ª·TïSwüDÝÞ«ä{UýÇêüßn-n㨓§qTûÆQÞ€ª_{o|õ ×"ïx²å±€CTpuœùuàìaÞ'Ñ|&L§¥¸¸¥úMXJÖ 2/S2³õÄþ὘Ê$ÍDeºŒ¼2.>uô4ùZH:§â‚“ïÁ™¿*ç”Dø 4PŒªàÒü â|Ñá7°ïå˜U®Œ!£Œ ö~ϲ|ÍŽËr(éøÛí)Áƒ!æüÀ°š2n£äŠÎ‘àù4dIöLZ•$m»°I;©Ü×x(=ØÔ{öÏ8®Äö;¶µ(;—È4¼yæº=Ëråo¸õ ó6Áñ‡ÅºäÏëNŒ,³Ÿ ·u¯†:‰Z#º¶ºá°î9åúzOtß½cí×í·’Ù“Û=—uùý< àN¬¯#÷¼Û±Î9ï©.ìÔ0¹ëîkÕÛ•¿áž²ö±{ß[Üž-ÿÆžmŒ1·Ç noyìýïæafï3«{Å­ÕŽ>¸†] ™Û÷þ¶ÀPNìöáôøˆó4¹¢Qžn¼®tå¶z Œa‹ÔÚr^7Ð.|¿©×Pˆ‹Yȓ缘/ló#‚iHH«t~\!Ý2n¼(»€ó–r,õ˜9"áìEr4Ó¶™W>Ö  u¥%€8-Ò ¸0Ê(m˜TÖ(1!ð¼áþ3“Qçz'¿%iÛÖB¸rY³T¦\qåÊwl;Ídpæ#-8*:®'Ü8¶Õ¯tãxáv[ }Õ^6«Ívô\¡‰Â÷´ó`»#Õ?nû4+_8áFŸí›öMyÁm«òsaø +]R†ÂñuÞ1Ç ò|l†ßJžCë±Ïª›ÍY©‘æÍmŸkßçÓÆ±¬ÛÁ°™çÖû3õæoyö…ÃI©Ö'íš Ÿpʬy·ð•qG/sçs?Ï÷<à¶ßOŽŽÓ {µžL‹füÇ–¤ãU5ÝïÏ:ÙyÆ.¹>ØÃÜ€ò„aæ<6š9AÖ™¨dù ¦B*Ïßv*¿æ6ë~вÊC¨yÆžh—@ É6ÎíyÆtVðŸ`dð »ÔÌ<˜™X;ˆÀ¬¢xi0ó¼í -;<{™yùÑ2íÇÌš)cÒ -˜¹êÄ1ÁÓ vCšRvÇ# *Ó¨Î\L:l°hÌ_ÂÂdÖV¼k6ˤëú2ÑÜzÎ-:Œ´4òûœFKmsä© ßÂU«´úëÂr<ÂTäSÞÄ#M„OÔçd>±¬¯Ù¶`b\_3uUeÒüM´Þ¼WÔ‰yÓ*Iõ`M­Ú±N(´³‘j2ÁÆm)NÌǬu»íhQ7?æèa'£þs6lÄË$½_¦qæ)Jýá¡ÁÜÅ¢ÎÛÙ=6ÄÛ–zÎ~ﱟy|Kò f•`ˆ¤¥ì–óºîÉR´v“¦ž•mzo™”é¿:M¿H­Üá¨É"ó×xÌ›µÃn.uie×z¯ÝùéréX%†Ú¿šC•⦥*“†ºž ‡Œzð²*åÕG&¸W]g¹ûØ´÷jûûgM†ó~6ï7”ãά›N€²^ä@ÕUxCi¶ίÙÅ«däUV?@¹òcS^/ºèmqJÕ°¨…‚\3¹FZµpP7úž£^’–R;¹¬æŸdz!ºŠ¤žSÚ¬RB&¦b‚UÎØ·ÁøÔ;MG×&¹ˆÓñá±  ¦ æ™õ€ŽÑìȦ—6{²é¥©k€¥+ VÓÚ©'9oæÒÏ&ŸeqÖ=.X½ ¬q.ûkŒåeÚ .r݈SXÜùœ:ÇiË Èµ¯òêtvP÷ñ¼ã¸w¡tÓAWpTޱ{Aør—Ü®`V9qAB¿1v§ƒ9z«ëleÇtø6×c?3{”ç°Œ ~³‘+{ç$Þi‰wf✜MòZæ-…ùé˜jèF&Oq;À¡3™,³(øá×½pZmA§4ÒæDÞ´D"oZ÷PçÓÊâ˜mNë š^Rj¥ o†ñÎÜP‹ÑF[ÕC®¬ÑуÔ ñYež†»?öj8YŒsS”S 'g±Ëyíæ÷ð¬çÏƒîœøì,éÏ›þêϧOϰîœëÏ¿ÏÎÈþíÏ×îÜíÏãOÏìþ\9ï?‘ x¹—'<•?À‘Ÿ·ÙCÚðO%ˆNÊ襩¤—V>•hz©§—†>“˜:©ª—¶>“ÈÂAÖM4Þ—Ä3#}oÈï üŸ9p޼ÇFú4ËŠ÷k+]–µÍü²Þ¹p{"õ¶V8FÖÖÕ:ÖxF,â†äÚE@¢Alj¡!R4°=ÓúK²è¸ú êJÚÿˆp5Ž-MWðU=Až©½€Y¡.­ßª\ÚÿÓcpZýÄ4¿ýÔR#±,Ж–E܉¶f¿5­ÞÙF'¬ 8f2S;7ÄEЧì÷¡~Þq;—¦ø ÍlêÜÂ`¤îëÍlÞÆb×JoZO"E v šÎ9íœÕWe‚K B_Û–T ð Ÿ@‡„4žšÓmFØ`œ)š"Gìh Íéyo§AlXÞ˹â¡8óÐþç·"LO‹ü5ÔéŠ+š¡ÃÔÒFNZrF˜Ô*„ž)ןқ6ãSº±ˆÝ þó-Ž,) ½ÎSn,B›ºÛfñÈ3n¬'– ÷Æäò‚l§rJ ;T^nw3‹å·}í\:Öˆ†Ij"—élLéôŠ ™v¹1±¢Ž;îðdÖf^`÷[×ñþÊÞ_åû+~õïT¼ªÀE…À«x•ƒÇWêóµLØè0{ˆjëØQNAâ´ýŽ f4¸0ÌZf,U¨´Ù(AQÐPof¨ó@o¨ŒâÒxŸ Õ'âªòxxeØöË»)ê_ïï03æûÑ^rÓâ‘– ‹ÚÁ²˜õ)0£–Ô§lI;·+kõ?Û“¨3_Ðz%ÕÑÑñù3³ÅžNûëêŠäéÌá*ÛæRçOg7#Odzy}rrL‹2?à¾ÙîýQŽmûv,LžßJÓÒF,çµ™k1à ʱ0‚¤ì˜ÝÎ?—ð6õ"ÂBKêZ°ÖÐ)1÷ÒUÆç´^‹î~öÓ 0BMËM îþÀ÷5ò¦Ãý¼Ê…»HxNuž cÁ^Wö´Zäûaù©°ÄS—Æþ““ffø9ÆŸã3V…ìÞ¸ßa2jçÞ„èƒ,Ïb˜V‹} çÉÇNˆ‡¦ùáÅ8‹IG©â¸¬ay#?›n”¬; ¸¥Ðˆ4þ€µÏdœ+YvZÀž² Z–“ñhÛÙ²yï˜õvaÜ#‹£Kç eòtÚŒ= |mNƹF–Ti[ž°2ÕþäÜ·;°ÚÒ­ö'º%²ˆÇóüˆýŒ,r 1 jo–ŒâdŒOYߥ)Óˆ’¤¥Õo)“ªÅeÉIÆXÈS~ÊC¸÷ÃÔžÐ3Æû´²ëSVi½œtuvLÙN tæÌ­dYœ#êMŒ6MrþuLÙÑØ<´Í*Ã;Êú¤ÙX6C#Îm3œ*‹›û-d\²rCŸÔV-.™U„‡åóÂeɯà­mÖCƼÇ:,ŒÎÊù?®öå<_µU€“çCæjÇœ[`æf8h<Õ½¦ÏuÄ3æ"­¡ôdÁõ‹Úzý¸¦œ8‹›éÀœ¬õ ¬ýX[šsYY_ÎítzÓiÿSÇþÍ9ÿ÷A|°€â‚,/'7A² F]¼ º ° î+Ï"ÜMðÁî. ïí7Y¶wœÒæYÏØ²îß³½Ú BAÖ~ ¬Ø$`õ·³.«×‚SK\ØV/Ñq 8C’$ùÓŠ¶j2ñ4««óœ­Ï*§œŸ!¨IŸ½²É{:hŸ{¼"›)lWˆ)‡ÓñönMÅ]_v¨¶sk@£ÿ4ÕQ3ßz&I—sÏlKñ©3Iu†ªÎ|uµ:S×'¶°ÎXÖ™Ð>¶±uF¸Î4wì:3^oÜëL~!°3vFÃ­Š·Ù±3Fö&ÊÎpÙ™3;#ggúì ¢·™´3žö&ÕÎÐÚ™_{«lo­í­¸½u·³úöÖà+qo=î­Ê½µ¹·B÷ÖéÛjÝ[³_­Ü½õ»·Š÷ÖòÞŠÞ[×{«{gï­ô/ÖûÞªÿ™å¿÷à½xoÎË€÷>pñJà½x/Þ»÷zà½!x/ Þ{‚÷ªpëmazaðÞžypð^¼÷ïÂ{‹ð^$œw ïuâ™g ï½ââÕÂ{»xæÃ{ÍðÞ4¼— ç}Ã{å¸xëð^<¼wïõÃ{ñ^Bœ÷ïUäâmÄ{!ñÞI¼×ïÍÄ{9ñÞOœWï-åâEÅ{Wñ^W¼7ï¥Å{oñ^]œ·ïæâÆ{ñÞd¼—ï}Æ{¥ñÞjœïÝæâõÆ{Ãñ^r¼÷ïUç™çïçâµç‰gçýÇ{ºx ò^„žyòÞˆ¼—¢ßãÕèwyGòÞ”¼—¥gž˜â-óŽû©§'ç Ê{‰zêIÊ{›j·ÜŸ°”•¼—«ßãË{Ñú=^·¼—®gž¼¼·/ïì™§°íMÌ{{î‰Ì{+ó^Ìp÷šžp¼çgžÔ¼·µ;/l垟yv{æ Î{‹»õ"÷ÈÓ\¼åî¸=áê8ÿŽO8óùëý{ÁÞ°÷/ìý;ÄÞOñű÷kìý?ó‰ìý&;ÊÞÏòÅÿ²÷ËüÌw³óïìý>?õ íýG_üJç—Ǿ§½jç·ú™oë‹ÿë²)O}g{ÿÚÎïö3ßÜÿÝÞ¯÷3ßßÞ?¸÷îü‰?ó9~ñKîý•{?æÞ¿¹÷{îý¡{?éκs«î­?öÆîܵ;'îε»søîÜÀ;çðÛe¼s$ïÝË;§óνsPïÜÖ;göÛŽs|ïÝá;'ùÎu¾s¨ïÜìoçûÎ%ÿŸýΩ¿sõ︰.X€ !à <Ž<àBì€.Œ nàB¸@.<‚ šàB)¸ .ì‚ Æð,^ƒ éà=<ŽáBEì.¬„6áBP¸À.\… báB[¸€; † ŽáCf¸@.¼† ºáBq¸;l‡ æáC|¸À.ˆ âB‡¸€"+̈ >r Iò8f‰ jâB¸(.,Ê–ò8šŠ·â‚°¸Ð,.`‹ 㲃»¸/>Œ ã‚Æ¸P2c͸`4>D \ãÂÙ¸ 7.ôÍãØ8.xŽ©ãí<ŠÄãBõø>.¬ öó8 ä‚=Œ2äÂùàD.dÑ#ï‡ÂºqiAdE"÷ØWŒô6­¦ž†K¿ÆSwQÖ„awqÚwôöÇáÝGR×µZ}IºE±Xñ÷˜ûÂѱҌ×d°RO{@ª@q|˜ÍboZ˜{é…%{€Mho8WPHê„7¬Î•ÔðuD3Md‡‘ãúnyûðÝÅu˜s(æÜŒmçcÎ%™wTöØ“™su¶ 9·hÞYšs¡æ«=ö¼¶]³9‡mÞ›sîæ\¾9GpÛ=œsç]É9sÎíœsF·]Ô9ÇuO<Û9×wÎ!žs“·ç9—zÞÑžs¿çœò9W}Οsëçœý=öèÜ:'‚Þµ s8xuC8:—…Û‘¡soè:Wˆ}%ngŠÎÅâCŒÎIãÅu£sè¸Ý<:çÞ%¤séÜG:§’ÎÕäÅårKéœU:–αåvwéœ`nטÎa¦w£éœk:—›Î§sÏéœv:WžÎÁçvûéœ>ñê܉:'£Îõ¨sHºÝ”:ç¥Þ¥©stêÜŸ:§¨ÛUªs êݪ:g«Îëc­Û‰«síê¾:7°Î9¬s»É:÷²OüÏ:µÎm­sf»]Ü:Ç·Þ®s’ûÈñâÅ3£÷׸½8>róøÍÙð¿üÝwÝ„n6|¢Cmª£7wÓ°ïñXx0uC9!SÇA•§)bfê8Òs s^ÖÛ n,~ÇDŽu"51Ï3ZGçBô[ºÇjGÕº“©ë6X™Ú¦L¹ãÊ å…©0òÉieÙe|I,L…2j^™jWY©@ž ±ÄáŽ3aMDSàÖ7¡lD”Í Ò«Ɠ϶)m$V¦B Ã7”)Á!†¾ð`jžº5 æ--,;•AvMäE»"CôžaÚë;SqÛ–ŠÝaƒR†2‘e9aoP[i,Xo:.‚ÒJc©ÆÜ{²P¦Ç‚]!‚,’Kd”WZäsY"„—™ÖXØÛ¤'¥•WÚÁ´(ÍP[iu¥1 ±mÊRœVÚ1ÓJŸiä°rÎr"3-j>ÝáY&†°R©‘BäP–Úv*ûV‰kŽªf—DŸ¨ºSI‰¸³ÏṲì¤i|IÌ«ð©¬ÂÓzÆŠIÙÉS'„Î…)/,ǺSûN=g;É ‘s_YªIJSÛNí³oHu]ÚäçBevóçÂÕõÆÆäX¨ì؆'„…q§*;†;;<ÃwvúÎNßÙé»vz^uÖkyˆûgmŸÐ[½A»jÑúhj8ÓœiÌPªŠ}%õØ^uî}°ÛãFjn/ømn‡máèØ “Ööô™–‰¾#ŒLSœÝs4Ï­=Nø¿™v v@V«':%ö4p¤Ïo<ßBIŸHß@¨èá=‚ ¼ÇÇÒ¸ÕCfT…´Å (6 @„ˆ’áøCWV}! CÌëg¸¢èj*,l³ÓŽ Æ¹V)D¸–‹·âDh¢ × °Ú¤=X5 ©<.Äѹ°Í™WSR ÈÙá}Èt}Ó4‰qß'„6oQ,;Bês¡"ƚxã6¨A“Ë>`N©Wˆ *8^Òù 6«¶bBÂÔ!ÄÄÖ®† ë…ƒnû4ܾP@ WØ$[[å-»7åáÉZ)g>æªíi®Ã Ä ûqGßâ&Ú½G4mÍÆ™üž®qZ%Ž~òˆMEsqÙÏ›¿ÐÅ£k.>öûm™XÜñÎvÇçf»&^Ðk–-LˆVgÓã|ï¹Zj~´ÁyêFßf¯©6{áj¬‹Ãò¤5ïög wÜÛb8^™œòc¶óëd¾ŸlëI+ ì@Ŧ±8¶Í6KN.çæV6ŸûðŒ09îwÂrlrÙïDÔ”É=/ÆÕÎd[)Cä"=Ùö““m_7ÙVúɶ <§šÙ±9–Í9l¶ ïä–6÷>9š»ÖÅïä6(•Í%lF»‹)˜¯w|öÅXƒ&Û‚ðÛʃ‰9UWÑ!õ¥¶oõ:9Êq­TpÉõç¹ü6ÛÜ0­[mE×¹2æÂ´ö—c¬‘sZóÍ•Ûær8ι–ÍÝýöìÿ¸ü~ÆÜ™3J¦ñy‘° ‰>¯Üû®ÿnõ ºÍ‹ò‚taŒ#êiŽSÕ§ëWžñ|UžÅð‚úˆú$Oð%onõ1ŸxžÜwdö[rΛ+¾ÅãÇï>6‰3ÇÅ='¼ŸGtÎ dÌŸbŽ5îÏs16Æ“YFr96cüJCsÔ=CF5ÙŽ“9'à=ˆ.3¹í÷WÎ-<.ûySo òßfjMAè8”óv%â» ÛVñ¤—(\0˦·ÜT¾a+#U*É¡ìgØ÷~·‡ 5„“‡½nå’£Ì甪ß0¤í™lâv:/0m Lðžõž%À¿²Íùõ ‰3ï¼"¬Í{Ô3ö<Î`9qÀ3’ü¶=o"”¤çM Óc>êâÚ÷óµígx÷Ç|ÖùNˆìâfÕg^17Ä-n.îj˜ÞóÌ›1ô=/ϪÑâä5U¬z³ñðÏÍ!/–ög‡·Ó7W—^ÂæT6Çc³Ê‹Ã–Ê V½Á¢¬ì> ç}äØ6‡°úU8Ëæ~¬¾'i%9÷Í)mýžqLN‹×·µ X}â6G—®|šsGêÒ•ËØešMCãHÇ6V¬¥h^/òÄ®º3oêÆ£tÕœ¡*.FÝ G¨þ‡4±©EGã45èøRS{Žª º1)Õ\‰°@Á<›°@¦é©aÌ[‰RÍÉ dúŸêc )õ2i´*Whý˜*±Ñެr&dêI´­v¤ÿ˜:qÑŽ¼rrס4¯Ô ‹ÿh›Qzt¦F”s[HßH6Ê…i )R‹i IãÚôhÿÙ8Ix:^ÞGÓæ‘3 »Üä­q´ÛEÞ%G»€à ó“ôA"”?Ø96çÚ2#®]Jò½¶h·t‡iÊʱCŸØÖ·Øöʾƒ¼^'†õÞÈN 5-a†Ü­Pù#,T)L$¤…Sö<0¯—Éó°­—IÝP¡r€qåLÊø@­´†íX¨†(C`hwhº­ya g¥V©tGÓÔ¨³vÌðäX8³“¥Bä|ìçšZUY¨µ½N¬hú,­¤…3;f¬S&öY6þu¡º}5³¾S¦éµtuOóN<)ÞjÛQº¬N£ÝôkÓÜòE‹mœç’Õ\à¤_B¤œ7«ÅÀªeÛ¾ Q0§î{Öh«˜e/ äYд–)Ž„Í³¬q-Idmí FÔX«á\-Vs‰„s-dÝÐäí°Œ¬!“÷ÒLÖ k»h[h-ñ䶯o´%k«ç5šJÉê¬w¬ž V׫¼%­ò‚cܬöåaÙ¬z÷ýŒ–rLyæ 7jy³&jÛb5Í[Ø.jhÚ3}Þn§ºòÙˮ󮶀’Iwl[š9PLŒ@-‘:bªœlb%=o–j‹Ó~g…¶ g`[1ÎN61Ôtt–ûfnÅ%Ú̋Ͷlq?6ÛŠ¼mÁ×°¶ñ¸]}Ä!.ƯË<­‡ÍµL%ú€žÌ£å¡ ãâHµÝY>9‡àè:Ù¶¦“y$¡‘ÝÑ›©t`àŸh÷ ‹Ë¹Ç1ÊHk(8y¡>P„C‡GŒòŠQ^qAžucV6CoHN]<9œýÜÜP‰³úfôUqlóF§œâμ‘!*”Óyˆ+ÅÅ¥'¤C´Ø! ã+‡§–·“öظ9ž 1… ’<ÙêprØéõÜéÇùCF¹msYÇLø¹\]:óF@…ÉÍ¥W”¢ZÓå|ÈÇéZ.äÅ/ˆq ×mÄÂââÒ“K.ýXÇgúMPÔ)„Bž ±‰.àl.œ\zpé«’áDãäÝÆÈdˆwÄ;èö âD±Ý³‹D=¼– ØcŠ«KÏ.ÝŽE“D ²ÞŠ‹¾Óá›`2Dr†±­8ºtˆ›ÀçYv¤BK òp"ÄäDHωà4±÷•Ú!iÁÏNMóN…˜‹É:5\Ï•Jm"ÆÖ=";SAy!~vÞ¢•Vľހó’GÔöm8ež²DDˆ/AW!20ª<ýr§Ö©ã+B4¶ ¬(ì’X}¸d¥b?ϪÆòÈÀÖ“ÍRvc)pò#JÈÂxÙ&[ûYR+ŠêiU×—øNrΩ¦wnNK„Iÿrr‚@Q“1ÿÉOÅ40 aóÃ3PÔäÒ7cÎãuDÄ\HF¼]q@ÍcrÚW+Pjš\÷Õ Ôš&c^$S,*ŽûjNfæU’gˆ<»ž·ïžKíO¢å+ùkNªëZ,mŠÀ/l¾›“ãú˜ƒãä8·Gü-^Cbp˜Áð"]‚ŸPi;¨7GÛéáêˆ"Æ¡õB‹gÛ|p7ôíY`8<Ε{xΧÛA뇵»Ä½ƒ#jLÃåù€z×@{Ï‚ñ]öÅí>îà/md—€€¦ó6ækÁK`ApÐ"ô ]àBÐðèpê$'1ÝLœå.À"Lê*ï ȵ”²êdp<–›ÖKÀÇK Ⱦ=]GB+n¯À+Ðdvn7)¡¦7ÏÞ…­°y¾4ê ˆiü(h¦‹«é¢mºœ;2§‹×é£xºØž.â§‹ꢃ^c†ÎH¢.¾¨‹:zEú8X©‹fºã·> ‚šv”T³ù^Ëä£@¬.RëŽßꢺúX¯×°3.ìŽëbÈúȲ;Þ¬‹BëbÓ>^ë¢Ûº˜·.®‹»£æºXº>®‹»ë¢ñ>×k¡©gàò(NpSØGvñ‡]Tb«øa0cíØÇ@v‘‘]¼dEyÇVv—}fÙÅlv‘œ]|çõÙÅ‚ö¢]ÜhMÚŘޑ§][ÈÄÁBÛ§éó(,´qÁ–·Å}¢5Ö=ëY»ÉœhµseNðy¤<˜—œ4=x×Yb‹Ý úE×6´ÍžÁÔâò>u乩ZP°UË+N8¯¦ÙòXç¡0c ˜Ö)/&ˆà‘ÆNštc‚zZ61 }O› †·•&©áe幤ï¼ÏõóÁþ|@ðYAZNËÙ,Þ)FDŒu3ú‰\ᢌ Xi©˜æð÷Ì@‡Ú€…Í*J®p) nûýµlidM;ÁÅÇÎsá{tî>Vy\u2ßsÏx'ë³Àf‹õœÙ¦d¶)eølS PoqmÄÔÖ˜¡Õí¦Å-óŒûyö«ÀÀ©iß_H¦„ 3uŠBÒìÃôÇ^åçºf<Î#Î2Ç ïS臫Ü%¿×ýK¥î€qJ7ÌÞŠh²ƒ{:"ûAˆ"ÞëÞ§‰’®»Gø2ª÷laŒÎïb×x‡Ewd®Àq<ö a3½"‘1§›Šu¿¦ Õ|gÞóC̨7I…àìB ”±.ùØ,/tµê4OM«ž/W[ǒ׸‹¥ì=Rá<ÏgÚZ× \¾Ï¹÷St¯á^±2¨XÀ7$ó\aœe.fpŸ3D9;¯ª¥ ¨n¬ä"Ã\NH'.,§Wbö+ò|gšÁnøþ<ßçíó0¼Þ±¾eíûgƒ½&÷LXbŸ“ý6Ïò‘þáÆ‰úkõóM@Qžy"}–á½EA[ëòo½³H¬jZ×S¯qú߯1C~ûo1.y®¶èO"ªú«.« Ïê‚¶îP®.À«ûú8.¬ ëÂɺ ³.ôìHëÂÔúàµ.¤­ tëÂߺ ¸.T®  [_v\Ý6åâðúø¼>n¯;*ú8¿—ø¿>.ð³ØÁ3¾0œ9Ä5¬rr\ÖoÉ|ç•Mr’öfœMqùØÏš:À½Ýs_u‚©CjéäÔ7G÷ÌŒÝ|Îh²À–ýÀŒÿÜ_Ιõ>ƒÛZN¤# l+ß½¬¬v†$°šè1/<Ú¬«¶ÃP{œ/³›ìºp‡£nqµˆ¢ ›gÖ:ë%ΠÄÖ|ZäMAYçÞ²mÜâìIËÌÇ:I©«¯iE¦8;u yöú<—¨1EõcŽÙöà–S#äóÆ4‡æƒ8.„ ñ(~Ä·6õ82ŸÍóç?î…´8Ëm#…=M3méæÍ3l,ÕÈ¿e{Ú¨j d}a3BšQ­M1ú›"uxƼLƒãÆ ç[ÖóÌ›Í:‹ó>7Û¦{r ûNŽóÊÏSÎx^õ‰÷h‚sñ~ÇPÖ—ÐNÏÞÎô;8þ&ÃKšž¯®-f¸ò·ÖûÑßénL¯¡&ÌhèôÓÆ ºöš.q=£.¹Ñ„ÒxÓåx‡cÓpÏÝõÓ¼ÚÿYÿõ}Ü÷ýçãÃ!?¶žŒ??FýØ}6¾ýp™ö—kŸò}íiߌË^vúóý½ìï^8N÷ûØúÙ²–‚6R¹,ŸÚ­ÚxmÓ_NY¼úÀ•¿¹þþ*¾üQ^sLdÇ·òp£¬âý$‘NZqW/ÜÏ¥`YEÏ£v‹BéÐï4í$x-»eë)ôÖŽëqò”ùÚ•í2ˆv¾-\øÇŽÕŠk1~fÌÜ+Û3Ó‹i›¦lô¾#åÒ+[Yx›‹ôYbÅ1÷ìDТ0š5ˆ׈"hš¼P¤L¦XX¦0i3EÊ2©‹EÐ2µ97C´"†8å»ßÿ|{Âõ–£ûí3û[ úôŒ!Ê–Ë=Ö³D÷K‰ú†á,Ue‡v5¿Q*Í›. ‘Û±1F¹®¬(ÈÉ=GÇÁ½ç¸çssX 'ÿÛWŽèce•]ý ¶ŠeÖ‹3Á=ø<ÌSGJÞ#Ú—ý­ŽkÒ.Í—c峟»\'â¡‹Ùçy „1Å:Á=/ŒÀYÎmæõ®–ŠÌÝ0ÖÄ¥<æ¶EOÎ|ˆ-Î1ņòx”V[Ë…­cMÞtú9ûFD,ã*m8z ¦è8t…×7Ã}­têp5IN¸Šân,Å-:KÉ¥Cìÿ€á{ULÇÈNTxHTWÞrÚùÏôg¬ÝG\õ–YWÚ„ÙÖ­äh e¬Þ¾ó¡V Ÿûª×êV1W—)N<–ˆó¶D|nNŽvC<æj®®–g™#›$FJõÅiUb§+5Eˆú§Ö^?¦"½8Kc¢¹¸d3!{çN!Måyñ¿O©Lšáw¹Ëˆs· Ï"móÜe7÷L yÊ`†îÞ3E¯PªwÜöµûôÖv×ñÇ *ÙNœ¿=ûÊÎZ8%`ê‡Â×^pLòÛd~’äÚÌ:ˆ¬ö­yÏ`ЙHë®Gå×6­ÇŒáèî_u;ß ?ÃM1œÛJžË´#¸2Õ² Ñ ¯†\ SKá¹éb3â–ŠŽ2å”w:£‚—P[[ªÂ´B†ÐãŽcœÑ–#¬ºb”r› 7¾Ú£"zÚpˆºñÏÛQÍ•í=YJ—é–Ë#Òt’¾&Þð[¦! Ⱥ¥ÅF Ã7raM‡Ãn)-Ð¥hLð·L \óyÎò/|a´Û"Áq®êm­÷;ÎèÍÙH– ÛKâG¦ë ~„Õ$—ÔAî&9‹³EÕ-3çô gß5ã:¹×²Òòºi.v„Á\Rhö®SdjY4"M¾E ÞÌcŽÝÉuÔ<侦ç4£‹0!<¨žá¦W`6½HEîp,õ«„. ðcÉ$qå­ÎUÍ®©¹>" w’Zæ^É!t•œÄcPHÕ–!©` 7ºZ»íÊ5Ês‚²Ù^ÇÕùͼeΙ¸ŒÜK[£É F°èLj¹+E{O»gtrî=`Î.£'ºÍå¾ÑÌgC’ Š•KSˆ‘æU©­E¦æ|·ê:5Í(,Ü - Þú¨Žƒ³Ô¨è¥2Óœ‘@¨ÄP%RmÃÁ?,s{&K½ÄÖ5^Ícï-x€Ë-Þó9¯ºëyšYð©l]9á»{8ófZÖ¾·â*ªß1Ôøf€hϸ«÷lõI놵U¡±¶òj†Ç)IṬ6‚w 4÷ùmª²®¢öÛ¶ŸŒŠ]meLsîm­ ßýç|‹e·[^…áaЈDËÄ’ '&háLƒ;ÜÐY]È(û õøÞ–ú1¼Ò(gC*=ò<›å6  ÏPÍÆîY¤È{a8zÖÙÙê'O5‰cõ˜îf0^8bïÄóµõÛ,ϲȃ¼ÏzFß“ 0ú•”±ÑßX–+wÇp Ãouº‡¹aœß©2dê:2¢L8ûË ø…qŒ<ÀÕŒ1‚H厩Ê"ŽŽó=Û·¦é´}«írMŽa믜§ú"UYá› ^mÿ9¿ÉvîV>qÅ_¤63e,WþÖ¤JA2%xñ„’IRÇ<€uT›½‹ãï8†Å¦D¿xôÇŒßJÕ³®÷‹ë=Û;›vö­éºf*)ˆúÿÃÄ~²yÌMów<æ1 ¢œÄ‘Î;[>{xÌÜŒ©ž³ãㆿÙ>fg[âívjì##£)BZ¿úRi¿ÅÜ šðÙ'˹úÉ…Ç`ôa¶Kµoñò^ã Þî¹8æ!¨–Ýîž;ú Ït!lËmLº5½pXýÁT€æøZuråo·×gG óØkí›th%‡;®Ñ±Koñ1÷ñ{þÌÙÄ=‹cØœÊΫ_Ù~á`ÀÖÖéžÃ±Øš0Æy[Ý6s^}À»ÏÛž‚à¸æ“+§ÝßÌ›¾\Ü­ú¿ò7ÛßL¦ä]ÄÅ$ÎÙÚ}ºô³~"·–žãf³î_ÜÀT³°¹è£Eä^7šw(—æn5ʪòÊÈ'û ú¶ÔálN“JÛ•í©ù±ŒrSgßåYùÂÖTöвg1|˜Ö{¶²Gõaû­tfÌsü,£ç°ÙÄÁ‹›ãò„+¾+¶ fÛ‘ÏÍÔ½²ímªž9w{Ÿö€³cÿ|»cî±åO£î~…5ú·œCg$´û­gìµtÛæcÇßj0±"Êÿ> #,›¦ÛDÈîÑžÅ*ÙqèAÚ/ëHGW->h"àgëÃüV«> ¢]“~0+ºƒüžQôcKEqá<`óø®a„R˜ÂÛÖ&VñÕ\8œes‹›óù„1,:â"æÇ¶]Q–sžm«§»^§,óòÜRÝ0¶c|Þ)q«µëêÊßlßÀTjíûÁ,][gÇ8jˆû¶¥8QÝIË/}vœX*ãŽi!z®ãû ÷)ÃmÑlk“œH$sÃuõ l¢DËa‰/l·Q‹ëî‡ÑõI³*{Ì·ýß ]ƒ`¼¬qô{¸=âoµòXi^>L–¡Ä §Žžu-鮎ÛêK>üÑW'oQãüvÏaÿÖ<ö-ÆQàÛÒ-/ðÕ(B–zEmðŒíŒLIºãêâs‰|.Üç<+úªŽãçÔ'¬ã~XÛUq|Âzg\âŸÕ^WþVûç ©D4‰ÏY„æÃ¤Îs¹iáUñ1ã—‰ 槃"¡rÏ{¾<°¦m_¥P¹c¬Œcßc"˜(O¯žmÝ‹òÝi×óè‚®fÎÙ²':]·8Ä žNe è¡ã´«hã·Ú7Åá„êtC-ð"“cynеÀ —9¦ )§cMàõEyƺ^>æ±) XmœÖöŽkÜŒýR^W ‹gœö·pµ¢kRó­>ç™×t,WâšÎ+_ìØï=g¹Ä {-];FÝ>åàøØÎþVûž…ëÂRðQ µZ ²”p¯!ËêE[±ÓA|!ªji-©æÃK;»† 1ô<渗)ÐŽCH+¢Åè‚Ú bf¬/:ò±a-"˜öå\B™ŽŽ‹ÍAÇœˆóˆð:.¹Ëª¨ ~«ÝЧ:ZCRG\h:.Žñ Û°×Ö•£ããžq×om Rlwlqt ðŒieÆt·¶àpUžË®O¸Ýð·Ú¦ [ Ó [äqhy³|š„|²ÝÜ.›sňÍK•Q º±ÉÅ ïÄ6±#>¶ØÆúdÄ VüO«bÈr&[]m‹íf²m['C\3·Úu³õÕ0·ïÙXÛý¾¹¤ÍVFÃMë#>êb3~XlËðäŠtÞ å¼9ž›¾+›¼¾¹»tDÆ—¸9¹tæmkŒI›Ï°¹¹tæM’ê¼™y#‡™72ó&…Ö¶™y#§º9î<Äc§‡sç!¸¼—·àò\ÞBØy8\ÞLó{±ËÛáòv¸¼.oÇάQï¼!ÖÈâ78.SýÃWôd³ˆYÜãæêÒKØÌ¼‘ã±™mJmÉs§›ëëÅÌÛ=g÷¼{§y«˜lcWÇ9>æ„÷Ë¡òLJŒAjo^ØÄa::³t®Ð| 2¬Û"UñaõCZ–qQaÌ’ R3‚‘–Wæ3dŒilbŒ‹1öئVç¹ØŒëÛ¾`r®›kÜÜö·p(Æmà丿Åv—ý-Ó°]Ü÷·°1›ö·,Þì⼿eñ÷ýN‹)öˆ-Ô⸿{æý]Z'·ý]s,+Ž8NF+nÜ7‹§bÌ-Åk9wÂ\$§Ol r.›ÑoÅl òG¶…nLÒfô±¢[•¼™m¡Cä_fq3ۂ̶ ³-d‘7c-+ËT!Ê3Ifý“YÿÒЋ›Yÿû¶}2ëÿŽ Û‚Ì¶ ³-¶–B˜)Úf´Åt¡1HqÆ…m‘·hi2Æ…´8ìJ`2Æ…æçæˆw¢ÏXpÅÅ¥nnqsï‹ÍÁâpnNûÿ_{粫Ée繞"‡jÀVóNÆÐlÀ†=0\3ì’ªRn© ©Ü¨·÷‰µ6¹ÿˆTÝ5J7߉ŒŸÁ`𺯣çæerN6>¼žú›qòzÅßýhþîàX[Çš£r`‹à´úÀÎý¶;ãxl÷àDõÂI8 ‡>ïïÁËéRˆj^ø¬óA†åöáùôæx(ümISž­CÉáW>æ1>h½±÷ÎbŽÂgc–žó­Jî˜÷ÃJ¢ü÷ßžåñ¸gr>îù\[Ga”“®|>¾×9–éIÁ2‹½ïÆE8œlíPï¹É=¥8ŸßˆÀóéAgüÞ÷ºó¹¦[Þ†3°ñâœs™uNgž¶Å!->³º-îѹV眓—‰¹ñŠaqï÷ܼüÓãcq–ëÑŸ‹½½qþ\XµM>ûáäìõ9ãŸ.}µIe=ÍB¬97o7X?–”88DzøŒ±±xdç6æwä~~rîÎI®‡6û ÷ó“ÙOÌb$8³Ÿ˜gñáý:öó“Y7ZA´î̺‘Ïõ‚žMÜÏO>×cìçg¦ÔÍøû“Q7côaºIîœã!\î9«žÆÅï1onåÔÙoYX^™‡¸2¬ÔÌ‹œcß,=¢3ÄŽæÙ§ õçag¥SfE/¹„ììG¾0ÔHæ&Ëœg êZ Ë"óo„E¢1ç=s¥„U­Ä!5†nzTç–ø¬Ûp v³”3ÎW>ŸkÞ2:–S—Pg¨Šãr휜1Ï?q2v+ÙŒ¹½”{6òòšO–—äÊÓ›Ì1 푯œWÛÂ+dqò{6«}2­.ÍU¶ù;*C&JoÍLU¹ëÖî^fÀ³Øhñ˜®ì––,gØœàV—7lÞ®cõã|e´!­­Ðþ-¬9'›uÖÆiõŽ‹dü•i©;Ö5c'Wn«Ï$ƒÍ mk–`ò×,ʼ?@þiýD™f.óÜgÑëöð:lL d2Æ1ôaÆ98Óúð­éZØVdî¯È°*7Î;ôän‚«@ œì–ÈÚñÌ V|`ά‡³åÑ©k>$3GÕÎó<=¹F'¹ç…g™EžU¤àœgÀya1Ù9 ª§\b°nØUDäØüžX^™eRŽÍg—_âàïH¯Ÿ¥¨¥q¼rnÖaªðwÎÐY°|¨v)Ÿ\7Ž~åóì3òú.‹›ß³1Ê ë›2A¤ªwÊ^¹UgËÓ7|¾£EA¿ ÂñÊ092OpÌKÜ3®5ìÿ4á"SùLƺÃ…qN1Æ·½Í;®œ…±&wðð9á‘M^ 5pZlÞI;§ÙVÆM®‹ß×ö´G_LY/_Ù×µåþX®Œú4áÃÙÂŒlœ¦pr>. = 1æc˜{Ú~`ãèåw©¾c¬÷l×ÛlûŸ16á"œ®|ΙÝêV„qO|àôÀåÊgùv¾@ÿœç¸´úÕÎyê^'WáñÊÙ §¡Ž_ <Û{o\V2t3<ÎYgÛK_98·ã9Ggèõšïo±·´2ùíŒ!ó7Î^‡D™˜õ϶ãh2ô>Æõu?ÃZœ['CïcÑQ ÷é>×M†ìÑ2IcÈ*gºÂòMFlÀú5²PcÈH¡S0NÕ9¬2ß¿Nqîãž›—?Š—ûˆÉÑëÖù¾äá÷ôæÏ¢®Ö8{ùÔÕ’áÉ8yxù0aœ\½|x¹NŽ^~ƒn‹\‡·CmÇa/Ÿz¨Î^ç*õ/Ò0Ú\W?‰{ª;ö÷-ìW…Œ¶ªf¿¥™2dþ– zË›ˆ¾Á½bFß0ÓgÈ{©ãò^š_sn‰ð@‰f6õÑL®aþÅè%;¯µ ÙÄû·µÿ<—öiËa|\¹Ì5‘­–m‰ÏQ;Cþl S9cìC,Q¬Üæz¬ê³9.ç;¶ûõ^9­ùù…Ñnümò6ÉiÈo‘Ó/sŸû ¸™í–“¼£2×Y2×S3Å+\½}È,¦öq\y¬w‡©_<ŒÓê“7Ü…›p¹rë&¢Ó,ŽÑ»qX}»o7Œ){Ç“pñvc4c®¡7ìý¶ ïçexÿß¹¯¾aL“DÌÿG»2öÉÙÚvÖ>goŸ£ Þ>wo+ì'­­iáŠñ’Lÿ~8·èìû;NΖԌܮ\V»‘ƒ\g»í\W߫҆´á¹ã$\ü·x_+óʇ³%t“±£|ä]̹‹\…e<îœV[‘9֌˕óÜó¿3Þ%;te__h2Yî¹ðQÏgñÕ>œSn¯Üƒ°Ì]]ÆcomÍóWæsÉ3âY[cgçcÍ?´±™,÷¼ò,³Ë³ºÔAy¬=6í:&ÇrÏiC'Ë=”qmŒó—%óhˆ´ö Üœ-½PÕaâk<‰M¾úÂqÊEißbÑÒ:dà ÙuO/ y }¯à\åž—Œ:BŸ8£Ïµ%[~awáë]çaRœg9¯lïÕ¤ ÑÇfr7á"mžü{±o“±ï}fÛdçØÇ/ÝoŒG»2Ü1lYò®Øú²ªÞYdÅt…šÜo™®Ps,ê;ù=¹]9:S×ÓÖ¼ôÌ]øp¶6Üz¢±æ½<í¸™¤\9L½ ò´™Þùئ¼z糯&;³œ}ØÚ ú÷™T9y™uÙ9DFP¡;ÇÎç»0ê##T0²"#±X›(giCØÄg[+Û¯È$‘ÑŠxNœºÈ;Î\®¼ôª‘“8îIÉÖÜ+û^b–ONWÎ^gèÔì]¨wk.Þ÷j’vÞn…Þ7Wÿ)#æÖÂ÷5.ë[ß0÷º=¯þc|\¹ gØ{\ùLœ°85gê\®Ì¾š…åŽÙa›a|ÊJ¶³puF=1.Œ‹ÜŸê=G¿?K™ÐwOÆa̺á»Ãor”ëÁ¯C_9¹Ëõ*ס{2†ý€1lo¸ÆAß7íoÜäz•ëY®'¹› ö+Ø#Mîr6ÆÐ—'¹×u˜ù¿ŠIŒbö«°B!Â@C˜Ç›_-~/û0ú½a]…‹‘a_ï sXüªŽÓ07ëBC¯ça´mcwò+ãº{s~ÛÚ×gƬbXÊ-®!@„$•7`ÁSĻḃYÉO» Ìt+ <ŸF#¦ VGŒ6Œàv,ìÑ1ßbm 1°^Ñl˪ a°C„ÃË=,+opÍKPŸr ´«ù—ýÑ ‰RÖ¹R(b¯€½Lî¹å£öµ¼ ÁÈÏA•ˆp¼&ÂHÊ,E8—5:¢…ù´~¬ELq,3¤ë9ì¤Ø×c{ALchì’Ù:8€ÐPJC„…Ñïp¯¸¶Á8pƒè%|!E¨4a2ÃxRÅ÷ˆñÙ$¨ŒJ:Gá²³T„ÕÌÁ±yÌÅ6óÜç( ¤ûϰÉih_ø(vG`ƒŒÈ††ñÃz "μCZ†D쿈Üb®AvA6IbC-LWÔ+Böxp–[*܉^/ˆPЙ3B?¤©µ¾ ÂÝ´Uª×‚T ~(Óœ@è«Ùh’0O¢ê Æ$ãÃlIHK8Dn El žªØYcðbóÇ^}EÆ]uv,/ˆ¹Û&X³Ï« íiÞÆ)õM«’%¾ Ž¥Î§eXucçaVj~˜ž@#Àx†g*;d@Ǿ£ˆ§¡\náqZ`·y>Íñ ¢,uµBòr™y( LQ1ZàÆXñ|ÌfÇêxNæv(b«‚q „‚ž GÁ'„ïZEß„WŽá¹1lv"Á¯'ôa³9Å÷5®r“Ò wÔ³‘‡3¾û•a<S1¾—q•û1W¿Ÿþ Æ8²1Ò-üØî˜mBÆ÷2>üžŠCžEÆü`̶%W¹§·{f™`ú|'/¾­Å’Zó}ÉØ|cÿN†ídÌÆ=c>4n^&7ÿƇ—É“–1ß—Ìv#W×ãáeÂ/ÿŽ“×ùÈ^>ìv­(0Þ>&˜¯X\ß‹¾k“Ëê9´äìý0Ã}5Çœ!ûAÿϰכ\×XËðÉàØÌòŒß̱seÊf°¶ûq È‘GS>—¾>V¾ûmŒ] ë› óWCÜnóv¦ý5˧m/ »Ì™/Œý:ëse±Ïã´S`†Îʇm}ï¢ÛÂdÚ%™¯!t›ÅüêN]h2¿ºSß%>jaúÕ½ßìûn\O¦?Üù]‚ùž{Ø`>ˆÊçw æçwÎÛ¡«ÿ„:®|ÆŸh,ó<ðÌßžíøMwnÓ‹e„» æƒ8ã^ìüé\y`Å‹('ƒÖó\µÀ¦Qãþ¿_9ÎêûjÖæ€^ý¦yº2ó¸ÓpŽñ–Óa÷ŸGCJ–¬[æ³^9[™uiÊQ·È]ÕÎcY DÖ˜\ýžWžeB³eÏ[.Ü«ó,ßÚ|çÏ5ê µA§æìÍ¢LíZ[ÖÛï ­j¿2ÚдJ}ÎÜÍY;ß°Yή5¤õv¸pum1­Œ£kiµpǸ§:W¹NÍèÎii"aiaïÎbjÅ+£Á3ÇÇí.î­Añlÿ?ÛþV»÷·Ú½Aºls´zÖOvF8„‹p¸0â’38Îñ“±:YÐ8ö™v­6¹Úõ4…X/¼¤_´jšäÎ]i²wîK« +«ToxŸQ®Áû "&LÎãž‹÷ÉZ…%ÈœðgÛß2-κ ýÝ Ü‹Sµ­_ðØ4‹Š1§ÑZßÎr³á»[]e÷A ßŰª¼aXdrý¥•g7kθúÆÆŒõßÈè3´Ô ¾7Ø^µÆÐÜ›eäl“?×> š:E*gd1x>3³*£{2ÿ"h˜‡äÎËÚƒ'óræÚ”`Åe¹Êh¹ÅöÙ¹­~Òù-ì~(_Â…1N™—+¬zÞ0uÖaðtÜæ%¸s˜{ûD œåsB™7<äZeÇöoGµ#(uZð\eZiª Óú3ߌ2½ÄÙ7bvÆØÖâ=3w”õó³¯Ò«ê@ûÃ3ÙŠ7ãêžêÎ ÆôÀçX>VtƒLçá'Èl§À²¢$dxãÌ/W¶{ªÿãËÊTfÔ2æ½ÂÓ'æ4‹tC/Ðzá´ö*9pã³s4¬w™‘w`åiyhÅÎràÅa§Þ+Ûý„UÎŒ¤Œûí]`a߬mÏ3#S»o ‹jã.Œ3#ƒ…o ïÎK˜ç'3’Q¹r’{’—ƒè]ö¬aµÌµƒ‘Œ8çg÷ÜVÑÃ9šTlYoïŒ éÆµ;cn¹az/+í„èi橸3$:uµ§y¥²Ì\.\…Ë᜘É.l]^JeFù´<|5Áå*­uŠãÎÖÓ1Ïx=mM¡÷u‹W>KÏ7x¯Ùº¶ö;®û¥&éLk{0FÅyÏá1й¡RO0¬Õg¸Kø`¡ü‚˜¥ˆ¡„O-ÌoW„ B(¦„t€ƒ“‘×þF‘Ÿ+°ÍMð@4FpdæC qTö‰C<_ð˜Q ùˆÕ¾~®½ !0sœY’é;`1v0£`„úã\ŸvrοÄY8 Ç+cÆ=ֳ̙þ£Ë¸ × {2°+Qû°„²~xÉ\~·¹;³ø™<É™/óqÏ3“¯”óÈcúv1Sê|ŒG{Ç+³>¥x[­ •›Üã>\‰>,ÆŒå~ø‡' úÀÚõ´ê¹sœ¾‡ÌxkߢÃGž§ê+ó4`ÌSÆ”l”Q>w@ôIçé™±yù]~…û/söú”îïR=ÎÆ ó$©|´Ó°Ï!ÃËØýmßOfãžÑæ“}—:rz`ÌÛÆhÿ¾~KŸ¸;¦„cǤìóñÊÇÚÑôa“X ›$cc0¤±w±1²óòs¤ÄÂæØQ}ظ 3–y<ðácúõɱ?0üC¹ FüöOìOìoØ~+'!üÖNHÂŒ7nŒØ¶Æðm4IO`YÚÜlgÄh&èΈÑm\½Löyċ|.c_“û׸{=o¼Ù\ä'BÎÆÑûc³Ï0F±1bD°­`ï99ûi•ë q(‹é7mÜýÔ»1b‰³ÝȈ‡l1Iaø‡×~ψ³Áù¶hiÆöÄÚ×.<âÚ×e‰5´ö~;®{݈¸Ä§DíÍRZY¶ÀÔƒ‘Üæ¡`ç!-³< ŒƒwÃiJ£é›c±Å"Òé…vahM©åFüRÓ~Óžƒ¾™;»Æ#Rû:ÈÐ’¥ c¯hŒä ’;´%|_ú«²}h5P/ )}aÇÃnï A¼0·q›ÒPÿF;¶}2Ó_V$ùXŽ%Ôh™o&¹¦+Ãi…'Hý§f VòùÂt¡ ¶Jü(3¤,Ó¶U˜>×r¿=‹~¯éÊÕëL¶ëíÃô±Ý¸Fç$×1vòxe¤ä4‹¦ü¤ý(â…Òå…—[ãÒ0ö¯Ù3VÆÎ}J²ù[z©°ÌYå& ­”q¦è /·æE2?wÆå;î ³^¶e1ò}ëÓÞš1®9?Ð?ꆃ3ìíì·Œ³]¸ç_d´'m”ãwa.Æ;Vó‘L«_±؆£oC~E?nļchãSwf¬×öþŒ¸Ð”brÞfÚ!\ª2ÿwÎÛÔZÄW†]#µ‘1çÙ·»ÞR,nŒ±p½Ÿ0=ûÒÎiÕ-@Xìz]ï¸1Æ>-50ŸOF굦÷ ç|ÄŽ¶µkœÕyãºÆâ•Q+Wö(/|0Ä5=0sAlÇ`ûéWq[r=L8 ¾?#®y ¹|2­YBÔw[ÌÇ™…~‚ô!æ[Dògº¢¡ðât \£•õ)=–ß N†0º'Ò·3Z"=DÃl!b„êf2 ¯aÐlLïÓ°:ÆdL2É:vrŽÝ9û³¢8ŒGè8|ò1>ÜQÁÒ'‹:<Œ«;³'qx§ƒ‡à þ,:xg<ŒéEæ¦(“qœ^&<Œ‹—IGÂ]¸]9~XšO… Œ=(ÁÆÅƒ90»1ƒ9pÁ=ân›®ðÕiŸÁü¾N§Œ·/ÚÙ[àƒçi¡|ÐÁóç/¿r5¿mÉœ=ųf~Þ3B?e.nhÄg®‰Ý®ÊÉþ°ý c]¦ZœÝAÆ£è‡øðLN}›†úsþ‚~gK½Ù6`Ê çú™€Ê Tžð$s.£´@'×~ÇŸy»”÷½™ì)Ú^¿»îagÏãÅNOÆfø_‡ê"tD 0Da"zÁcáûZ8 ×'®SqLUxˆGb+ Ö¸sžJ†È`ÉÃ1q„{îÇoç2•ìÈÔIÃ,áÎZÔ?­zÎwTfàmwšž,‰‘cyb(ÙxȦ™÷ÑÈY¢ce*‚Œq?Ü0‘4!åÆKááLgAI&KReM¶ü˜™ŠS i\YÄ ¼TнpŠ£˜$81 [pÊQ&ï›$~ 0|8kpâ§ÆäXƒKPd –¼QÖàÊtYƒ1Kf ÞüàYƒ@kpè§ÒTf’8Ü„‹Õ™´ÍtÞË ëÆÈ<")ÐäÞï¹-%jL ŽWߘ SÅn°ìÜý ²-Ⱥ È»3ËáØg964ç9áîü9/2Œ5†i)9É{}˜0Ra¥—±'lp©ƒiîÛR‘ÁîÝÊÙö‚øbĸl?M©ø‚áˆØ¹cv_~6lŽÇBŸsaÀO‰ µ®ØåsþI/è&ƒÖ ´V‹³0E1N»÷´šä1›¢\ŸpG] yEìS1ƒÓg€¡±°y²àZ‚c®†¨/ˆ|° ‡š=<³ÃA`½ÇeÍAÓÈ-ö²ÍØpYɰ#bŸSÙ†ËùÀ:‹ñŽ\•sgâØÇáØo±:ú6§§üœgZl¼ÿðÍŒ4¡4gO­´â„1ðñ‚Ù19Æ[LËU¹>“ ÿðÁœTŸ0þ2~Ο¥U3Á~û¢1ÿãlá<|Ž7úÝ2ü™ ¶W •+YìN æ¢Ɇ°!Fa4wŽ÷A»$ª—Äú’`Ì£…I 1,vz,/GXA1;’ºÒ•G݈ˆM37ÂØ!gómø9w˜Yìm =&Éî#–A¥Â(Ї„õåíkÒ"í‹UÒ˜F¯]üÌS.]±¿ ׋öŠ87 aÓ@!+ÒÂPZª˜æÙŒñã û-®sYó|vµ¿b™KãZ[¯ÆF`¼âZyé9ÏqÑÖIH/`çjŠK^/ß=r¿b[Ç 'ÏýÎÚ)öµybzÃx‡eíÚhÊHä^nìˆÐ„—iRs™€âXvaDNW¸Á"0.”<î–Æ}¬šqø3‰;ÐsÖ3…;p„õˆÁ$õ@æ¨Çš…õDì5ˆ0þ"Â&Œ¢bl8‰Ì¬Nòú6.†ØUñB¯C8œSu.ѹv瞇ÿŠãH…dä;’ù’v>OÎ|MS¸£LS¦‹ß”ÌW%ó]ÉÍ›ø¶d¾ã…á=9y9¹x9¹zhä&îÚÑÜô™øÞαՙíFf»‘1*¦‹XŒ‚wŒs²…šÀØBP I߯ŠÙBœÏb¨*fH‰³ž”‰`Ý »²óù\Ê8ŠÁq"VÎhI.”ñ¾Æè?ÁÃ`LF»ãÄfŒs¯1ÎÿÆø.d֞ܽ|DŠœ\Ú=ç!ìÏ¥ìà†ƒ3Œ'K)û Ü®öwŒŸÉ†ð-ŒñŒñí¦Lçp†{Ÿ1„ d&k3îþ[ȼ&ÿ-åÆÑÿ-efÀ†±cŒ15 Û¢3Æ`/ OTCŒ^"5‚`böŸ¡7©©¤B«-„(“xÐÃGž}í&vÖç”<q8ÖišjOÌË ‚û]jK± ·{СrÁM'b¯pvÝQ©˜¾U°ºö‡Á-\¸Ã‚{¹¯(ë%­ zÅ.&Æ¥èåÈ®°~¶-Ñšëj_ëS¾a˜ÞÜ™TÊQ±¿*ËçfÃ<ðTZhfàÚ±#¤)U™æ¹y7Ä#"¶ôý¹-C¹0äd8\ØÐÀ6K™˜UãŸ{¼û˜²tVCÑJ€ÚÛ¶ŸÛvzyÆ­¨ˆo{TÄíýí}ÔÅÏ­ õH’gÈÛ·/N›,8˜}÷LÞ+NiÈìVY)ÅøÁO|ïϵñÞógŒO,xn ‚"xè" 0N ˆœ\;ÇIXñ3 ºŒŸ¡ï—±°ághKœ-¬‹ˆÃs…z ÇïJcs!1<×—ÊsB 3’ö'öÐ"Â1£yçcá9wWL€ð¨¸âè!*5ŒÇÂ\Öõ3¸yÿÙ±~†Í±a޳:ضU_HߪYܭפ ÝäÔÙ@¶#>œÙDfÒ˜G6’IøË=çõ"RgOnÇü†ñô ™œØÈxÕnš è\Vyß'çóØÅ>êÙ-èÏpÆ×¤F&#`552™u#³n¦ññë¦aݨ bÝȬTµè̺‘Y7î|цÔt`G\™î‰Á´Q7ã&×Q7ÚhÀ¥Æ¸¡n4£ÄŠ;¹Èõ&×ÏíÇ4S6s³nh·Îº‘kvnr}ÈuÖ mˆg“Y·+³žd´¡1ú!BGÆÁz‚Ö“Ìz’³\g=ɬ'™mw7˜¸NŽÕ™ucxa|_cÖŒïkŒïKæ1Fß3f’ù}Éè{ÆdŽ ãèuà¸0–ºq\wÖ¹W™Ìqaœ¼9{8. a‚ÕôbÖ ÌåÁ˜u#cö6ÆeÜä:ëFfÝèFçäu€ÛñäêuÀI‘KÔÎçÎÛ¸ù2–Z”ëY®¹Žzãû~cÄ8yýmŒ˜K¨×¿7/#ȯÛq÷ÊÉÅûähÞWe\$ V}Õx¥èœå:–sCÄÚc<’óÑ'g˜“sNȰçš\²s•ë]®¿}‘áb59ç"×[uÁùðë°PžœêªóÎÃ9GáüÀk~0f¨[ã~å³­’ •!y96šøWxû=ãÛAªaïe×1_…ð«Ì¼l!ýÉžÞ C²Å;#´¸q’ë!Žój)oÜåz“ë0“?,ÐRtŽr=¬ëïý³93åÝj™ \äz’ëѯï3sÑáî¶“ªÝ˜iÈI®¿¿~Á¼˜¶ u¾¯¹ÛÊux G¹ü:Õw¹^åz‘ëI®G¿ÎôXÆC®7¿Ÿ©áŒ³ÜÏlåÃt½5.ï3žq•ëÅÛÍR0£ßŸáKÁo}×ä&׫\Ïr=Éõàד§¨@|»Ùg’§´€Ùêâ,×£Üü:ÃÓÞÆ¹Êõ"ד\GŠŒHv¹Þäz]cð½ Ã9Éõ°®Gz“cÍ¢d "óÉœO°_…_Ìä(׃_Gðž[®ÂE8Ý3¹pÿÆd1dÎQØãÁ–äŽY>¹ ·zÏX;‚íW“3Öý`ûÛ°¸±|Ûwg¦Ž±½tuŽÃ™mÅ}8ö7Œ½Sý|}¾1ö®Æa­ ”¦O滓±ÎZ0ÜSÈ695çsì#ý{µôØw£oXÚy¬AÆØ÷cOb.›HÞc®œø¾Æh7ãœÑnÑ4Ã{³xD[Ý0ö$ÓrR8=qÎèÛ±]ßÎ\χ_GÉØg¹žä:ö«‘Žph*šà ›_…(ƒˆ­‘µ¢•OšÈñFd•h•ÔæÓ†Whx}?;­³ÖÕÞW%¡Î4,KÔ³_eu¨LÛXW«CiðúÕ¡åÃúìÕ´’­C±î±­9jY½«²:ÀèWÙm abu€¬°®>\X³›Vç‚kÌ–uCH/È9%®§Y¶¬z‹íÇJ.ÉÍ%»îSziίìÿµÈ¥îlêÌÕ;j.ÈñÓº—» ÜÛׂªÈºãðŽ?;!ì)|M‚BúšÐGá-˜¡5«È8˜Ö†îÙÎ eؾ¿®µç…׺•9³_YïÙ~çùÂÍÏÜçEçqÃggµ3ö—Åêp~ódgxqÚÙ¦MwãŒ5ƒ-ýÂq†È .Ì0PÊtÕgÐVhiB“!OI3%Ìr{áS;ij\d:x”O+ü”¯¼ÌBrdx(ÞÏpv¼¡f¬Lh„­Lhiy>„{´z†>fùÔ ®T(ç»Èv>gÁ™jåÜGKsöñ™veãá)X  œgupÿ×s÷2ääϽI?£)j¶Ô5cµÏ–êFRàhjœ-eަÒÑ;Oix4U¦ðyJ󣩀4EÐS!M5¤)ˆžÒi*#Mq¤©$%ÒcÚ$I­´¥\ÒTLš¢IS7IJ'Mõ´¥€ÒÔPš2JSIyŠ)M=µ§¤ÒTUšÂJS[iÊ«‡´Xš:kK©¥©¶4—¦æ’”]šÊkKñ¥©¿4%˜¦ Ób’ZLSŽm©È4E™¦.Ó”f’êLS =¦IÓTjšbMS¯IJ6MÕ¶¥pÓÔnOéß4Eœ¤ŽÓ”r[ª9MA§©é4e¤²û;)v÷”{šŠOSôIê>Mé·¥úÓ€šPSJ*AM1¸¥Ô”„šªPSjjCOy¨©÷‰š:QS*jªEIÁ¨©·”šÊQS¥ÉÔTššbSRojJÎ-U§¦ðÔÔž’òSS>¦ Õ”¢šjTSJjRMYº¥2Õ§šúTS¢jªTI¡ª©U·”«šŠUS´jêVI骩^·°šö)}¬¦˜ÕÔ³’’VSÕn)l5µ­¦¼ÕT¸ž"W2çj>]ɲ+¹w%#¯äéõì½’ÓW3ýJþ_É ,¹‚=ƒ°äÖlÃ’ƒX2K¾bÉbì¹%ã±æA–ìÈ’3Y2){~eɺ¬¹˜%C³äm–lÎ÷éž%´g‰~8á>œ†oOÎr´–÷ý‰\ìr¿=é‹(@"6pa‚ˆTð âRˆèB.æᇊDDP"⪌;ŒŠeò­G;"îq!ˆ†T`$b$.‰Èi܉§Th%¢,p‰ØK„a."SÉÙ.QSI›JàT2';•ä=JûT"¸I ¤‰*qTI䃴R%š›¤S% *U‰©JREª’×M"«’Z•àªdW$¾* Þ$Ä*9V‰²JšE­’éMb­’l•p«äûA:®ôM²®w•Ä«„^$÷*Ñß$ýªPÍÀ“ö@5 ªyxÐN¨cÓl¨ÆãI+²iNT£r¯uQÍ̦±QMŽjxTó£!שi×,©ÆI5Qª¡RÍ•h´TÓµiÀT3¦3Õ¤‰†M5o›FN5uªÁSÍžjüD¨ÂMs¨EÕ4ªR5“¢±TMæ¦áTͧjDUS*TÕ¬nWÕΆV5·ªÑM¯j€7ͰjŒU“¬fÑ<«FzÓT«[5ÛªñVM¸hÈUs¾iÔUÓ®xÕÌ«Æ^4ùªáß4ÿj –jAà–jq°["¨…‚Z.¨EƒZ:ˆ„ZFljIñdm¡b©ñ[,;~“…ˆZ”¨¥É“5Êf±ò[,\Ä"F-e­i^-n¦%ΓµŽXô¨¥Ï“5X ©%Ñfa¤–Gj‘¤–JjÁ$–Mjñ´YB©…”ZN©E•[Z©Ön™¥[jÉ¥^jù%aj)¶Y©e™Zœ©%šX¨©åÚfѦ–nj§–qj1'–tja·YÞ©EžZ꩟Zö‰ÅŸZ>Z ªE¡Zª¢X&ªÅâfɨŽjù¨‘j))”jY¹Y\ª%¦Zhªå¦Xtª¥çfª–¡j1ª–¤ja*–§j‘ºYªª«Z¶ªÅ«Xª…ìf9«µji«¸j™ë»jÉ»[øªå¯Z«¥°X«eñfq¬–Èj¡üdÅ,–Îj½YF«Å´ZR«…µZ^‹E¶ZjoÜjÙ­ßj .âj9¾Y”«¥¹Z «eºZ¬‹%»Z¸o–ïj¯–òjA¯–õbq¯–ø›…¾Zî«E¿Zú‹€zlêI êy  â©  ›gƒz<¨'Ä“·„xT¨§Å桞걡žîá!Žê"N"â:"%îf"Î'ê’"Ž*â¾"N-âêâ0âóà7#Ž5ân#N8îš#;êÆ#Î=âò#Ž@î$NCêJ$Fâv$ÎHâ¢äŽKâΤNNâú$Qâ&uïG¥ŽVâ~uçŸ%\êÖukY±™^¸AƽÅ·ìÄä÷†U˜`ó­ Ë|2úUñÿRLëÝ€Ôñs#ïŠgÔºø³s5ÖLñýs7ó;¯"„šºQ(x³=7ÏÝfƒÒɆ×<•°³„óHÒ.¢N"T *hø„·D)âù3úªž³vCT ¨ñ üì¬$œdcvœƒ¡1 L +~ÿ·žžãˆì^†çØl™bçz‡ç69„ Ó*y› ñnľ*‰u¶YòÇu«²aóݰ†žÓ«á(³Iž~rlÎ9ÎdèüÉ-ÍFŽØL>òâÈ&§”/•ùÕv·s•ë¬&=ÕÏÕÁ8±ž˜É±š°p•™\š3ëIF=-š#z£–cu›Œ¾aœå:êF‰+VOv}®ªÆ˜Q&£n”vbužŒºQ’‰Õ|rïάÚ»‚ÉI®³nh“ʺ‘›\gÝÐVØ¥7Ö m‚]Íä"×›\G§3F¯£ô+ÉdÔRJì¾&£ç7¹>ä:êFÆ®¯Q’‰ÝࣞÆhCJ/±Ûœ|øõƒõ$³žä,×YO|£ƒõ$£ ™2cÄmhœå:¾¯1ë†%Lj1¾/9¿ŽÝþd¶!ßÒQž&c\9.Œ1~Ñ÷Œ‹\Ǹ€d•§›É¿dŽ cŒYcŒYcÖ§§œY70W‚à§¶É99—îÜä:ë&§EJPyŠ4Æ’Rž:q5Æé†qª%ó´K©)¢ŠMÆÆÅûc¬²Æ8!RRŠÈ@Æõ$CrbÌz’¡02fÝÈØë‘¤ÖÆÑŸ…,Ó‹\o^Új^$ žœ¼òM®^ĬSÊ×'g¤<™Œ]«1$<ÆüС´'CRDØÀºÑ {ÌÃlΚ3´-fãźÑ Ò!³]Ãމé©Q2æŽZ$c´EÛ¹ 7áñëŒo:9>°”_ÖyÂm[wþíx—©ôÛßfVMë5F8·Í0ØDôß‚=-¦šÂÈâ±Rb2Éw™ÇLQ3fÊÁ©ƒ±åîc‰lÁFŽ‚ä>FÉÄäX¡MîcŸhp”ì!SÊ]L º"¡X$@‹„m‘`.âE¿H8 ã¡c$ Œ†™‘à3÷Ñi4|µ¹z£aqÜGBþx ¤Aƒ$”’°CŒHBià" g$AŽ$ô‘Dò0IO‘”öhK…I£3iÔ&‰æ¤Qž¶èOJ£Ei)‰.¥Q§¶hT¥J£WiT+‰v¥Q°#ei4-²%Ñ·4*×cä.î¥Q¿ž"ƒiô0*&ÑÆ4 ÙL£–i43r&ÑÏ4*Ú-í)¢Zóç6i‡.íÀôÐSK/\{î^gh1.&K™ Gh\ý¹ Hh<¼ÎLÅKfŠ^ci·ƒíƽ6ëFf?$³n¶oÎüÖ¶—ëˆ"8÷àÝyÈu„‚$GÖœg¯[bdvc¯Ü&'©[’º%©[’º%©[^‡$uËÑë¥nYê–¥nYê–¯C ~]ÆÈû¼;×äÜäúÈÎÇúv0°YœÖøM6L»œ}nÁ¶mrc»‘S¼çÜëš÷lY'Ó÷Zµ°æëK–É99—áܲs?œ:—Ú·ONÍ™K ΰnœÜ‹³/;´·ŸÌ…‡Ì•‡\׊EÛþÉ£ÌE¾aî»Û=ç0{eŒ‘é s®QÁbRl\Ü·å<[LŸ—s š>2Ê ¾3üíy¶5y(U¶:ã]ŒñŽÆxwc´‰1ÚÊmHfÛw/“߸¬ºÙ·3Æ7%ó[ÃßǸegllŒ3ÊÌ«Ma¶ ûäd¾cY}x2ß±®>?™ïX×x™ÌwD¨|G2ß‘Ìw¼r8ø@ÁR.‹kufÝÈ)Ü3Ëìœs„Ç÷äŒMšq–{’ܼ>i çîõ‡ßd©sJrO(ìíCxü:ÓwŒÜªs-œ‹ü¶ä{NRfðûÃðz†î}&ðY¾&NŽÃ9¬¾a 1¹•{.Ã9Ëýìó\ǽÏÓ or;œ½ÏÓb2¿‘ï=Œ¹U7îþÛ^ý·²<9y}zðßB3¹ç–œ‹ÿÉÑ[ÿm¥Ÿ ÚáT/®Ñ9×{ŽÞ¶iMîÂ5=°—_ä»”Ò½?Ä…ÃK}¤Ïœ§é[îþ޹úo3׋vá¸Æ-v'¿'5¹ÇÇ ³+MŽk¼DøôMî‡sKÎeÍ'–•“ãš+x†ºã.\…sqŽ‹ãûš «Æ°¬))v Ú ‡Ï¡Ã§¾á3Ÿ ªñ‚œªü¢ô§À¢O ÕXˆ®C‘Î]Îט<˜éà³òÏ=ïâæ÷8Žýk%exÛ²6H.Éð y<„äˆÐÌ’OB²LHî ÉHáy*${…æ´L’ÿB²bx®ŒûdšmCrpÜ'éÐ,K¨}ŸüC³ƒHÎû¤"’uDr‘<$+9«Ãl&’ãä> ŠdIñÜ)’Qå!åŠäd‘L-÷©\$׋f€ô¿¿à%‡LšÕ¹I=S“cøp“ÒFrÞH&œûT9÷iuîSðHŽÉÜ#ù|$Ëçþ‘Œ@)ƒÎFep‰ uW{¸ ãknxrqá‡÷ ìCèDb¡˜^‘^ާr*FÇð‚çÊÜ[œ£;±*I›9A¼P£ª&̹ÿ!Ï•$ÂÒôXk›¡( ¶$íÖ}^.IÜ%é¼n³TI+In¥)¯îsbIÒ,I¥õk«ÌþÐ~WÑK°ÝÚp½œpCh³p¼bm†ª[b)DÈÉù¡T$"t _þ”¢â[\ÉãóXXü*QÌŽ5-Dÿµ‰ôÏq̃7s£}Nmìëž/Ï/ŸqC Š5WMÒ×|Æ`B…ñ-³cuă‰hI~nÁry/ô·œt1 Ç-â»Á²2òxsÌ¡§ˆ{ã1Ë-‰‹Fl{Å5L!“(õÅF{ì80 a;Ø$X7Ùù3^“‹pX8âD8ÓsŽ„^ÅÊEx&>mÔ9l˜g}¡šaëÐï Ó†a¾±]=ÖϘ¶Sq\ˆpàbVNø)á2Dë‹ÿ±ÄÑ=î0.l‡cw¬ëLÓò-Æ…•%@Gpq„[ÖD„Iíã´4 æ´n`úA¸´ñ4â±n o!sü!^žÄæ7à8ÆÔ€8må5s]~™ÄìWñnD ‘ì}8à²GŒëiÈQi3 "‚½fØÃayg˜ü*¾±®·`#âXUg¼# å*““\/r½Êõ^õ²ÌD6V%h\f"›\åz“ëC®~=!h…qZßÙbƒ£¿c ¿ýødx¯g¹^ä:Æa¦®ó˜1y {9Õ{f#7¹ÃÍXÊ„îor^c Ò³ö†á œáì÷Ð&wcx£MÈÅ'¦QÏÉU8ÿòYÚö·+·¹òY\õX‡\±Ò_É“—ÏøI“Ûx`œÛMÎ|–ÙÍÆà|mKÓ§*Ü®ÜçR¹ >,êÞ·õÊy}SHC’Å"ƒT¢…{žeJviseäo7Yä¹=™Ë=#;7Ç…±ÜC¿–q&%wÏÏØk«óŒzùcºr™—HÉÒd¹ç•g™MžÕ¤Êè«§´MFßN>…jÝç´ÅrÏ…¹¦0·=Ëå^w<œç<ý•]Ç §“£· 6ç· 9uw¶(>äpe¼ ×SÄ_µ5b·†Durõß²ÍÃ7góõÁüÛÎ) × ·è Œq\òJî ­}v>j³ jJK_¸¯>øâ%¢Ü™òÊá̱S¤ wî«ÝŒYÿÑV»í\WŸ/#v=û;*7ï'EÆ#"EMO<¼­bð¶‚­©µr8¼}`×79yû\¹ wáqå°úô†”,ÇsË8ÇÚÎuµ±A¼M6–ñ˜Ëp–¹kçæåC.i~xÉÛíW8þ2£?X™yõ Ä„œï®ÿmD9Y¸^¹¯q—KÙî—wNÒV©û:…¸å“sz`ÜÃseö~ ¿«Ã óÜš½ÿÆÊÚdgôÚxï'ðq±y{ç°úU¢&ÝëÌXß/Œ2y¾‘ÙóWn«ý™ÆúFÂ^Îü>¯ìvì³­’´¡r‹cïÎÐï>r{àzå¾¾¢yYý#=æ+·µöE:z°œr–¿Ë‘q·qŽ‹ΰßâXs ÜèXÅÃÕšÿBŒNÆPÚc€Ý0õ äª|Ü37p^#/F óÉp21†!¸1 Á–i2Ë1‡n¿'%¿'±2´´Æ,']öFêÆÐŠŸƒdróßÂ$Æf,““ÿNgw ÃcÖÇgÎ}19 Ãøè†ÙnÆEø¸çá¿mÜŸa!'g/ÂŽÉÍë‰CòäÃËïRÓ/¿K=ûðò»´Ãˆ^>œ»'/òåÉ}ÜóáÏ:‚×óHÞGñò¶nr÷ò±ÊL!dçx8çêÌvƒ!8'ãÕ¯ÌÉÄ8 göm²s21>VŸ7'㔜sw®klB^²x,«¶÷uvÍ ›’É9:—þÙÊ,^‡1· Þ_ËœühüÍrgßÐÐ Ý8qÃ=¸ Ó™‹V¸òš€â2Îp—˜Ë§ŽW.saC gùí•‹póo7Æ=[xϾ0ãX¯ç&À8Ù{%oCe7¹HÜTsCðÄ]˜åCX“â=[}Ȭ?6[±Ru#¼ÎäèeÙËÄžÓÚ„yªŒafŒ4RÁ‚#$gôacö“æ· ³Ÿ\yÈ=lÛN>îùXÿŸ© Òœg^8Îy)Ãxq2ÖÄ;®Âɹ÷<Ö\ʤ§4Šš.ŒsÊLzç:’mÅvÀnï A¹žP>ç[Úá¿ó:ǽŸDú<‡fȨyÖæ7Š,.A®òÄü-eb¬³ËÀ_8 'árÏ”‰UgK‹{,à…2âgÍ€gùðz_F–sT‚ã/]¢ÒQªsZþQ§«Úb$œ Í0ÇdÈ$!«4† Ó²M2]¸Œ»—iN\dzq‘“—)~\ ¶È“»×ö“qÖã;2’˜qôwGÒÉ?³­`¤8.jÆôQCÛV:©‘¡'Ó8à†Ýg-Áév2‚.ñÛAy?9.'8,í‹ûò©ƒMßâ2œsvŽÝJwÛÃæ %ƒ‰ °Ådœ‹„kž)ÆâÈþF†LÒzcô7c| cô72$YÀ: š\¨;Ó]ЃMLæ·°`xσl2ÛßΉݙíOfû“Ùþ(àE¹qɶ7 ³©ú„7 FƱãàŒ䡎½ÇÇËü„~šcï½óÍŒ_§“Ur‡.¦w4#Èõ˜ZŘîðäêÎ]LÔmœ‚sð2™¨ÛX½ètg\üYIÌ ‹3F»Éß›?+Š£Z„c^2;¨î Ù…!%brµÉt4%ÃGÓ2cÈRø1õ¨£¯'!=qzâ²ó……ðÐU÷8nb Â#,i}7¡U„ªÁ:j™R]D…3?eÁêH‰ðpåOˆŒùÚ6Yä€Pä&ýxÅ2¥Èh! 5ø˜#½âÒxêÒúÊz2ì¼Ê‹T¶šåâÙ æ¸1„ÏôìBÔË<7~ònÊÅ=»Ð1&C1A/¯ó¼0¿•/ôn5/Çò@g'4/8 v¬Îã+ËA³š%(òñÊçýfà‡ù…B*ÔÊ ŸerãJ…8 bŒîÕ¶qêÎy8Ÿ‚Ž;†ÞÂ.zOQ1wÇhC¾#Ûͼ|ûúŽ;/Å=©\ A#…{¿ÆE¸^yL¡M>´8tÝ¿á"Üä·ÍËTvA¢µƒ½ËáýD™ J;La»Æ­j Þ†§ê\„¡83OŒqN+m†£H>™³þ;ש€àoËÌÞV›lÌP üí±R‘JCÖaãäÞ•XŒ&‹×åÎÞŸízYóÀÎiÎk‘ Dš]ȼg7ï\Sf‘1~i¼±3Ær w„ÆV‡ [ÑOì]ywáBO]rr\†­3Oæ17ûüCÅŸyìpSñÄ]x/üÉüYÎCÍ›ù¹Ì6s\eJXæK;'aÆ£!s{h>AñƒîúáÏ"Wöc4|ØgYˆd’ù7mŒm²ÝÕ+J}™0Üp’{̧ItÓÃÌœ…±ÊMŸüÀØ·[¯^çù-vþ4=oÊÞ,fzßÚÎ8Fß0#,–Õ×ÍÐJî4Ç€2Œ{ìþóéM’驜/\åÍÐדEk¨Œc+aØaóò‰ë»óù¾ôf w‘ÍMÉ{œð§s¦=Vk!ŒÝ•š0öëïæy5®Z[_D óµÞy³5™oüÁ(,Øý Gátå¼¾glŽzš‚˜¯Žr†Ú}úóc‡vÇãocìdÌ þ]4Q£Q3–öwþd7ÎÖ}³´Ö_:Ñë?ʗܸ{_Çe>!Ž–©)3Õ˜@Ôßlã.LñŽygìaïØ Ð" ù^8*˜G’2¤ œï!pµžµÚjçO&Zµ~¤¯‡á}=ÈÌ ŒÌñ““ßLä·œüË$ŸaÊ|Ù7Žë<Ï]¯ÅÃDÜn›v†I‰•—yYŒ4qk¯ õódÎÍäÔx¬¯²›B½jkÅÎK„Åã¨ÕYrm-Ú_ÌÄܘµxê`\Óz岿úW{—îßËù“e»™_›kÂðZ؇†á•r¥ì[öfe­@;ÃØ•ç£ä3”YÖ_7¦Áï§!"Ï«8¿H&Íl^aŽÝáK˜3ßbY&U8Ýsú¡¡-eDŠmÊ´ H°;Ú+Ÿ-p‚œäzéwü‰Ò‡Ó¸çŒDzªL˜òš”Ã^±.ÿÀ]ǰÖpÌŽî2<:¢–Þ n¨Žb¢ $XÕP•Œ”âêxÅå¦ÉȾ‰÷–õ`Á²<ý†;² ÈýýÝú±¼H»;[*b«hØóBdX”}ŸØ^Z2"rD$Lº ´Ñ­Ï–4åÆ^Âù¬±o×;t"F{ºEw~„“”a¿Åá¸atEÜÐãú½V_ßðÓèÈØá¾-6Üe,>9^qJÍø5¬]?³R$3¸p‘{h„aœ/ iz&:Z˜ÃOö{6®sö¦#Ó¬ΙӹHƈÒd9³Mvþd¹=Îz³\¢ÖZ¶;æÓ¸÷kWŽ^#ÌVS(Lì „ÏålqöVú™›0MFÛRŒ½0T„fJºÔš°Ä_~c¶ß·tçÙ&;Ÿ­5¬½ ÷[­EƒÇ>æºGd:gܱ݃V4IwèÙøp‡8ÅNö3Û › v fLC°ðÀ…Œúwç¯|¬÷%f€ær¹3vEÆ¡þZ{~:M<íÌýf&ÈVgʽ.ÌH–“£ó¨÷Ü…[ó^PŸøl•ÃçJTŒG»rZ_ƒ†z½ §¶ùÅw#ÆíÂØUŸ¿’aÏïµó§ÓL.‡ñü’Pk“èž9s7B‹]¯ i ïÇ @7œÃÝ]ƒ9›eéc’¸ôî\„±·2nŒ-]ãžšY7œ~è¹3$¬'C(t/ó†±w3f¬%2ãjÝ0ž•­MÐÓÍ]E™î‰ŒÐ¬'Ì¿[¿ršgõÉ|_º<” ÃÌÕîû€q«^Ž2OÜ|Öf&–W~+ižñÍ-Â8Š{ÅÆgÝÌ}#¬Søä~aÆË««œé6ŲÞj.!8éš‹Ç2dÔl®@ÊeÉYßyÌÕ?º4ò]°{7ŒUŒÏ¸8‚p¼p9ü˜ÀÙo±“á ñÐ'ìŒrF_ßq2Ëá·‹¾Ë=‚»XÒÍܘ;ôæºáì;m„ñ™«ó!«6Ý]oøX;²ÍèŒ]/ K€j\×nqimg²±ìjÁÜÓÚû=LÝ@EÄ™µð ;c=n~¿å>dåQ¾Âô.+æÕ;k•`ŒWk+œ±z¹rZç¿.² ì¾æ*ªŒ9»YÔÓBÀÉù‰}õ “ßnß‹ 7Õ~aÿv«Úa¹ÈÚ•Ó‡é2ŒÜ_ææ ·sßû§nýÌgÑ-=_9zÐǸN¾LOÄtls{Ç¥ËO”ûæzaHÑŒ!1É6_›6Žk7tˆTŸ^Ù%vX#¬ŸÐüŽßbgôy[sýD×3 M°3,4|¶vÃú›mžWÆ|Ø‹ÏEÜ¡¬ýÃΟì\{®oÓ1‹%!Zþd:푳¯0µFg¨ŒÇ’j›3™í{¸ÂPN}•£óq‹Î” »|˜Î=Æpæ0†3[ˆÎsÍg¦Éõg½Òw2œóŒ˜Í¸z™tò›=7­ç"Ì\Éc~`ÙDo7ããÊÐØýg/³e§£|w3àÎ` 9ä wáæ;,¼ïCH))Œ‘Y4Á˜›‘_8ÌÝg, ØfZŒãÊÞ7`Žn}fp·¯ -€Ýs–ÑgÜ/ìMÍëƒqòwTNC8¯Ýèˆã–»GâMŒ¾n\Ó£ý¹°³p¸0T3}ûý7?ý»›WNû«ûóûcý*Ÿ¿ûëbTË.ÿð£ÿñ—Ÿ¾ùã_¾[þüÃÂoÙ7ýŸ>ù¯>þùÏß½×Ýv^[_ŸÊ¿è/úø&5á‹y±?Ýþæë?üýÇŸ¾yzÔ{ÇÚFåÿÏJ´; endstream endobj 248 0 obj [ 247 0 R ] endobj 245 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 248 0 R /Contents 249 0 R >> endobj 250 0 obj 47446 endobj 252 0 obj << /Length 253 0 R /Filter /FlateDecode >> stream xœÍZK“Ü6¾÷¯`%‡Œ·ÆŠzçæìz7NU*ëòlåÉ-±»•Q‹mQ=3ýï|H¤Ô”oB„áÏ[ùW‡Až¨zˆ2‚¢ÔÄ$Á8BaÑ”” FÊ82Œà¯ /àúuÓn0úÏæ·ß§Bäž7xar5Õ§ÍGG7Ãã¯I?Œö›î7wÿNPˆÑýΚ8!AŒÃåAD ùA÷GôÛ͇Vô´ih_óöÍïèþ§ÍûûÉ^#ŒƒükÛêljŠà*Y–xîBjšHÓ€¢g”Ÿ&ŠÌ¡^eBÑ;Ð/ªŒ¯4Æ®Â×ÞóÕ(·ì8p…aQdEŸ‚|â:¯9ÌW³»k_!R¯åMÇ×QÂO2>Ðô6MƒÝô܎ʼn•õîâ|<0 ªºceÏ»K`iÜ™µ°¨¤Â‘½ð³úÄþŠ»sÓXt¢ýáÖÂ:`Ž^ú8Á†Êâ)êö`žbnž(Ç`‡„„W†ºc}y×±]µ5“¡½×ÄñÊî.õ,îÑ÷y¾@ÔN’áß?΢ƒv L*X³¦ àºÝ §ÿØòçï¯Ï'ŒÂ „<ŒãÜlçì4ãK||ïT²;ÆÒ‹v¼;jhb ðåŒRûåDëÎ"zø|¨{&N´do;Q0…3|:Š[+ֲɄ·qÈhyAS·*™i¤cVw N?YÇc ˆú©)L¾Ï ŽU¹Eƒë‹nëý¥¥Gv»À-¸Ie±Töï¬õD›³Iñ ÿ:ž€Ç`Ÿ© ŽŒ¶É“à:Âq#%*$ìéV¦WDÛ‹tßmÝ*OñäÓ0˃D†eœ„«ÞxÅ÷þ‰uåíÒÙåV»zè¸E*HÔû=Ü|ûðkê@‚(Q!„:&¯T‡,À/ÝÖ£¦LBÐ…À?Q±¦æ5Ÿ¹Â8üЬ­T´ZŠIêý¯­_ÞŠþҸćüâ[‡ÒòÞAÿúåÓ• HDSˆÞ¸StlO» ÒŽ«Œ¾° è'á'&“U»÷Ø Œf6®úê|K å#‰L¸iá&Ü(@ïf™Ò\Ô_J·$M‚B$\Û$ ˆÌ<¼±h~ùjªèϻ݈Žôb¿ð³ Jè8ÚÖýdγkÝ:bã°a–ó,Æ!¤oËÂù£]£÷,'jiÿ.<þ -ÑÔ Æ’0}Ý4p·È,LaT·e}’·RCë ñsè–?ù*¤B ’‘š%é$â4”šíxÓðg¶–¦Ë\¨3njÑOYµOðº¢4Ì‹ IÈ$õ¨wwÝ]ÃKÚØUÿ·ìÊUÏŠÒ&N1.â™øÖUûÜ9hßð-m‚^ÎcLˆ¥é¤×•‚L´ªS0Gøýb)%'ŒÒ #²$"¦DþÒ¡Ì}ú¤fžUà¾G‹jÆùlV¨%!?×'h¾áOè‘JñLêÄ»Y{˜32g¦{¦owϸûúȤۆ9ö°×VÜ,#LZ<ß4Z¬DUç@ Œö,"C\¿ÇzÕ› 0ÙÖ ’wp_¸º.&ôÓe"¤RÃu•4¢Ýâôªò«Nå® Ðb™¾ÃP¨;Õë"4“€d±º1®ít';‘;ÏÄñŒóÎî‚W…n©àZ~5tb¨’bè&BˆG_è¨æïONœ³9µWË‹ØÃ]„3n¹¦,ì\Ô/P€=z:2]-"Äs…Ð?‡ÎÔ*rgÓЉ<‘“@xO¹ÇÈ –C'‰Š™Ôjè$) r(>ChàL+¢®ÉBö ú!DKÚŽcÁØ8ÖÙW—‡ãêëRe`Ã<¸µ†´:Öm­n@n%‡³UÞ®I:8ôøÃùªÓ¥”Æ7‹Ž¥yË4RßF‡<ºlž0]“‡ÚwTªè½æêIÏæ‘™yQ‡Œx$t/5Ϫc¡r‹ÊbydzVX‚~¹0ãƒ#ißI†™>Ÿ¡Œ%Ùœ*‘êp,t?¹è]YsYXVУƒv¼³€ê÷3 œ4*¡¯îJòtf&ãAÐk^xk1‡æ)Pg¥ÿAß †ÏŠ<Ã¥q”kç~DzÃÔVµ…`„¯ËÞ’Xåpfž Ú z©Š‚ô´,îÛtÅvÐGUvo»`£ç¦ŸíÆçñpWá8…* ûTP)y9£Ua{š‡(rŸC,iš:EGT'êEUC¯‰Ë‹L@/>!H€g(ÿ=~JH@BèÎÂÂ$~(§ÿ¤/¡Û›º7QÑZ> fbÂeä«8?˜v61q9Œ_錑|.„b?Obª_ôF’$kòƒ2tÔ–}sTýP£èðLbHÆìf ðçöeyâ°È¡ðèf‹†¥Nü|E~PF¾‹3ZþÑS`§Q<“¦JWoeÁOTÂjÅ„ ‹S´Ù9:cízîG±À9T&–"üÜTaëNÄZ~Þ‡òäOòÝDc&\iˆ~|®1üp9wuŦRsÅéÌ\ó’®ñÌ\Xb„ê­^ubÓã±}ÔPV™ÁˆVÒ¥gGÐL¦‘G¡/V$‰ÖäG´ëIhçRùJ”D©g²Õrƒ@·¶"ké¬ÉtNÑc(àÆ dÕÎ2C}gOCv[·#žßŸÒ$Ÿ)c HJî鬽M'Œö}@cÕGXVúè ¶Û±²,Ádc †¨ÔÈîÛVÎ' Š:²$$žm }ÇâE$^“·<ȇõRoz:™rÐl×ÙÀÖÙZUÃÎ;(=ç ~›vÜu\¿•çj ó»ª ßëßÄ4lMµ§Ñ7ÐX}£ŠhC0‰]ƒEó…*SCQËX¹ÒF÷_ËÆkÒv}}¶z<<öçÚU;ùs%X×Óø¹6¿üæÖ¬z GëìÐT»ž%*ÚÓíð“´6MYzÛÖ4Ÿß4ÃTP¥2¿÷yÄ£¥èÑã ë²Å¥ÃÉ·¸(&ž¿`ñ0ÅkÒvý]Íôõ¢á`FJj®t uÿël„»[vvkŒìÙ®R›w•k°-ûúÉ4,ž)+Ï]Ý_> endobj 253 0 obj 2565 endobj 255 0 obj << /Type /Annot /Subtype /Link /Rect [ 457.8 434.25 490.58 443.25 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 32 0 R /H /I >> endobj 257 0 obj << /Type /Annot /Subtype /Link /Rect [ 499.374 434.25 523.274 443.25 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 32 0 R /H /I >> endobj 258 0 obj << /Type /Annot /Subtype /Link /Rect [ 130.0 422.25 198.33 431.25 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 32 0 R /H /I >> endobj 259 0 obj << /Type /Annot /Subtype /Link /Rect [ 301.351 422.25 350.241 431.25 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 36 0 R /H /I >> endobj 260 0 obj << /Type /Annot /Subtype /Link /Rect [ 355.515 422.25 460.515 431.25 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 36 0 R /H /I >> endobj 261 0 obj << /Type /Annot /Subtype /Link /Rect [ 350.48 375.877 379.37 384.877 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 39 0 R /H /I >> endobj 262 0 obj << /Type /Annot /Subtype /Link /Rect [ 385.2 375.877 470.76 384.877 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 39 0 R /H /I >> endobj 263 0 obj << /URI (ftp://ftp.gnu.org/readline/) /S /URI >> endobj 264 0 obj << /Type /Annot /Subtype /Link /Rect [ 246.62 341.504 304.508 350.504 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 263 0 R /H /I >> endobj 265 0 obj << /Type /Annot /Subtype /Link /Rect [ 310.392 341.504 412.052 350.504 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 263 0 R /H /I >> endobj 266 0 obj << /URI (http://sourceforge.net/projects/libdbi) /S /URI >> endobj 267 0 obj << /Type /Annot /Subtype /Link /Rect [ 145.469 329.504 198.718 338.504 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 266 0 R /H /I >> endobj 268 0 obj << /Type /Annot /Subtype /Link /Rect [ 205.297 329.504 351.677 338.504 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 266 0 R /H /I >> endobj 269 0 obj << /URI (http://sourceforge.net/projects/libdbi-drivers) /S /URI >> endobj 270 0 obj << /Type /Annot /Subtype /Link /Rect [ 468.833 329.504 523.273 338.504 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 269 0 R /H /I >> endobj 271 0 obj << /Type /Annot /Subtype /Link /Rect [ 133.33 317.504 310.81 326.504 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 269 0 R /H /I >> endobj 272 0 obj << /URI (http://sourceforge.net/projects/expat) /S /URI >> endobj 273 0 obj << /Type /Annot /Subtype /Link /Rect [ 471.884 317.504 493.544 326.504 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 272 0 R /H /I >> endobj 274 0 obj << /Type /Annot /Subtype /Link /Rect [ 499.374 317.504 523.274 326.504 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 272 0 R /H /I >> endobj 275 0 obj << /Type /Annot /Subtype /Link /Rect [ 130.0 305.504 250.8 314.504 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 272 0 R /H /I >> endobj 276 0 obj << /Type /Annot /Subtype /Link /Rect [ 166.1 293.504 194.98 302.504 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 63 0 R /H /I >> endobj 277 0 obj << /Type /Annot /Subtype /Link /Rect [ 200.81 293.504 436.92 302.504 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 63 0 R /H /I >> endobj 278 0 obj << /Type /Annot /Subtype /Link /Rect [ 432.24 197.585 490.0 206.585 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 124 0 R /H /I >> endobj 279 0 obj << /Type /Annot /Subtype /Link /Rect [ 499.375 197.585 523.275 206.585 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 124 0 R /H /I >> endobj 280 0 obj << /Type /Annot /Subtype /Link /Rect [ 130.0 185.585 250.24 194.585 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 124 0 R /H /I >> endobj 281 0 obj << /Type /Annot /Subtype /Link /Rect [ 465.737 161.585 492.407 170.585 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 121 0 R /H /I >> endobj 282 0 obj << /Type /Annot /Subtype /Link /Rect [ 499.374 161.585 523.274 170.585 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 121 0 R /H /I >> endobj 283 0 obj << /Type /Annot /Subtype /Link /Rect [ 130.0 149.585 188.87 158.585 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 121 0 R /H /I >> endobj 284 0 obj << /Length 285 0 R /Filter /FlateDecode >> stream xœÍÙrÜ6ò]_·•«, ðÔ›ã¬SÞ²ÙRjSe¥j93˜!×bL:þ>ƒ$†€&Ç“m—…n¢èFŸ€¾]Áß+õ# Îómß,ž Œ"–ZTá˜&Qĉ1MТÔ(g@Çü8™ p…þ{Ñ^Dè§‹/¿Ãœ-Š€îñ"z¹fu{ñÉÙ›ãïiÚ_üpw±z— ¡»Ý¬â„âŒÐ("9Ê1£…úCÑÝ}¹|ßʾlš²¯Eûêwt÷Ÿ‹ßÈÊ¢çß›¨ŸN¶¦’eŽ–&¤Ù0ƒŒá¨>ld šUN0FóóÅ-GÞŽ#wþõ|7›{Ùp2˜EHQdEŸp~b:”ž3˜ïF:ßV¨Ú×ËB§©ç%÷”&FXXAï'E݈ Oc>±ìK‹ö¡õŠØ#AÑöeÝJÔWývûá•í½½½E²n¸¬8ï%êø·¡îøõIÞ£á¨çß~þÀî¡Þp³°+‹p©Åù²yÔf;gå#„út³„R@ÄЮN#¾n÷h]¯›Zì»òX=[¹±/PÂp”¥QÑ"Gý$›?;-fF•sDø¯m$ÎQ–à8ÎÁÕÃs5ÈnÕˆMÙ¬JÕëUÇwÛõj»>»?e½Ù)«J4[‰^ÁWJqŽ.•ÌжìËu)]”9‰;à‡5ßnÁèβàí¾nO˜(v güÀ; ég± ' ­ŸàXn¾–û€ÕÅ©Jj'í!¹éêc?±:¦ÈC êWÃFÁ”0€ÜZ@ŒcŒÜ\Šà߇ºž´ã Py‡~më§ÅÖ€W’bBXQ@dxÁq×eÛŸw*°’\¤P&±¡üÌw?þêH\ ËÇRNã-—õ¾Õ‡f?Ö}5GÑÁÖMÝ?O¸º†‡ºÝâ º«ÊöëÌBÏ4ÔveÆ?ýüë4.‡^ôB4ÒaîhjD:ÃCÙÎ; ¨MI_°…ô£Þ”=dÊã.kg,û®¬÷U¶ôXvÛ×ó}8ÎÌ–ã¶_Ûæy†ÊyÚꕸäåW[xFÝUÎ÷hñ¨âÚ¼?PC7l”œõx¨·eéKO£d!ý~š|èÎF§ÑCPõ8Tʼjê¯Ó4ù,{~x„on<Ù|å|f"Å86'­‡UmT¾\Sù¦ÞÕ›GÞÁykñÝ…'ö}€9o·ÙI¶âS_ÁaK®u‰gON":û2ÐÑÂ6Y¸3Sœå¸s’ÎîL0ú‰·¼ÜsšyÇg X2UAÑæ±ËØÞt\gnY÷’:•´º"7Ê™aFeÎgò$Ç„ ²”r8ÌsúÊ(×qR3vMÒ`¤Øõày²X’v»N;wC«wQ6J;´>‹¡›€8‡žÏÑù§Ì9•¸i.-ïE÷­9XW8H¸e×_x0†ãÂ~Lâem07G¡yo”÷Ñ"Uîwû郹¹Î¢L®ÃæIX*[wòHn´t†¥*ßx÷ÚÁl*!N¦¬Aœ»¬‚±<ÁP¸y–?>ƒ`K‘'@“§I qÖú²¤¤f¤1 5¬OYõýñzµ ¨>NSñáY~k0ØÉ‚€Ð3¦\¬Â'ýÝ›^àTjL¾Þt“aRtyï” à ¿O€>L3„”Å»ûW¡O‹µ)¬Í’HõN4°öý¾ãþÐ,Ç4VtŒœÛóòhÎp‰Ó$@g@)÷h–VÝÞ3šü›¥†YApCËØßÓp†‰£Å€a$Ù‚™Õ½ò3Ä6»ê¡ãA6î3}ºÕãVôã°*&]Åèô²†ª[g}é†vŠiÔÏ‹¯ÅÓý%—Ú*4âê‰é«ŠO#ë¦lýmX h -ÐõÝkT÷H%»a鵿-@;‹+7.%´Mb'†}¥B2—Í“ZCŸHd ã÷;QÐk€a¿S¹?騄»×èh*]Žû6C¦%`Æþ`óø–†AüH!Z%ª[\’ ¥µ3i³#þtÇØÁÊa±¡9ÖM\‘e>‡¥ÇU÷KE‘²8°=u†¼Ü. )(V×V$6„gR?ïižHŠÈ®eç@¥û©íXP»…ªÖACÃØAAÌÝ©c f  vÌ]¶sÛg§wÜ ÇÝ@æâ¦t¶H°•éârÚ-ž-8¶šê`E[¢žnó9 õ§ ±»OTú1{—|Y>”uS®ME®qºè1C»$%Iã”XÃó5}Œ¡|ww3¥o”Q¨7!{&) pšH½ÈÍr &Y—º¶eøïÛAòjTã2²8ÂQ¢îy‹$ÀÈ‹Ý1Ã,'Ež',0ÝDZ³å ÅèVš ´Q2pŒ Ü)_{ öÂ;ŒLÕ >éS‚­l×õL¶U#d¢œG€ÉL¾<U T7y£Ðê6¨H¨A7ªôÜs quÝÚÿ¡í+³;/B’eöH<žË#QI:{$gön}ÁŽ3Ø¯Îø‘ÿô¿œ;U^®*­,'/žÄÕ¶«UZœz-(–ÊNÉ\Èù³ÿš®_X_ùS™§È óy{:)V÷/EÁŠÀtdï”0z7tê¦à]Çk•$ÿŠÕáN+r©¿çy F˜†˜ò§cÙ{4ÁI $)KBû8[q¿¨ÂÀÙ¤t1õE5‡¶I2¥]USCöóyy%x®´ Óã<´´2À¼Àtrf¾ùüÖUs)y/_;¸ãx="öüdõÊýæE3Àê¡ È¨_Ò® 4áÝ0“Vœ¥Â‰8 ½˜ƒÝ©/æ`½Õ@¦P)DI\xù9* ¨A£ *bºH©z®¿œjuW™W nDÓ˜[viß pZu@Pð0¶•sÂozžQƬÆïƒ»œy@™YO%šM¦èl¹l¡Ñö,8[®E˜"A:YÕÇã Gû~6‚Ú_±ƒoéGxÔŠ­Œ»h :Üò£ÿ’§QºÜ eFÎëëÏ|#º±iwðo+Upôî‡ß>~¸¾¾QèÎEO׺ãOýõõûhN&¹ý÷ˆëÀ«™zYÕw@·7o~öü ‚”E„q€ÂYêl©ìS¾è¦)ÉSuét4¥ÓÒË´LÊË(ÄŸÒ¿›†h¡êÁ´Mwްο3¥1à Hñ$ÍÝw&ºxÞuâ ËRiNÞ¼ª+MQš(%3çýêlÕ¥(Šz:Û3ŽOUp*i¡žæO¾ U×QNļ£Îž¼7ݪÄñ(¤ö@ë a‡Î*:Ñž²×u‰…+18Ÿ×3 3fl]Û~úÂxÜ`ý©?ýŠþÕ§O0ÙŸÁ endstream endobj 256 0 obj [ 255 0 R 257 0 R 258 0 R 259 0 R 260 0 R 261 0 R 262 0 R 264 0 R 265 0 R 267 0 R 268 0 R 270 0 R 271 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 ] endobj 254 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 256 0 R /Contents 284 0 R >> endobj 285 0 obj 3027 endobj 287 0 obj << /Length 288 0 R /Filter /FlateDecode >> stream xœÍZK“Û6¾Ï¯@ådW8øDª|ˆËqv¶’­Ø–k]ç@QÄ5EÈ$5ù×oãE€ÉÊÍžƒð5€F£_h€þzG†¿…üÉ"dCÅþî«¡”R&†ã ¢1Æ!"Q@c´GCRŒ*9ÇkPÛ‚ŸÁXÀ;ôß»ú£ßîþúƬ†y§;|¹bõáî'›íI>Œ¶w¯—wocD0ZnœŠc¤„bL2”!eòEË=úëÅcÝvyUå])ê—£å¿ï~]öbd?ÚVß DWIÓ4ÀcRlBMŠæ(»‚Œ¡^e@Ñ;пEƉ±/ðÔ{~á.;N £a,e º‚là:4¼æ0?ÌB¥\—7M£„z«ý˜d:æc}È‹/è%Z¤Òû_t;î@Þ»òÉ#”µ×éš…¨Ÿx]òºs´uÙð¢ÍùgGÓâ<¼MÇÂÓ8 ¢(a ³t"b—7ŽÅâùÛÆ¡†oÖ«Åsp¾0,Ø~³KLô&i@HŠq²ÉŽã瑊î˜WoÊŠ×ùžOKñˆçšx½n‘¨‘dùÄ›²Õç—c£€á"*=€±,aÆIg,7ô¸AgqDkjÑ¡SÚïZËjJ½h+ŽMÁQo‹{T4<ï8ÊkÄ÷‡îl†÷f„K`ãÒpHR½n8#ÜdP!eq¤5?!=<]ÅE‚š-‰DBy¦b0R6ÃÓ³¶a‡¶s¦&,½Âe¢$-+h³A-?äTÑH3SÅdIÈ1 5æâm<èc«Ü‹8`W""K GL §<‚ˆ¸M¹=6>¯ÅbÇ«ÃÅ ™3OYz|@´Ü_"÷ÚUÙvŸÅ®¬·­GŽêP‘×>:¶Ø—ßxà7gÛK"õ¶s$eÅ©YX6Ú¿"rrè/ê-y á²öxò(‡¼Ûyƒ…kßæùÓ€¥žâ©l½±¯z=à°Œ¥3<œ<:‡ÏlÊÄE]Rp´bï(÷Ñt¹Nûš$²&k§'pEÊþ³õVUY ü?da‚!¡F¡žñÑñ‹þ-gÄ Ö€ÀÇ Ñ3~©dò&2uK µäõÚ6?¾ÿ½'+ÝwªæFT•8C[‚Ù£…íN«žÝªŸÇ!oxßq*;Øõô+5yYyÜÛ*owõšDm|f ËŒ)†³ Lb½ÏÅâÙ±|~õçû_ß>~rŽ2P GÓ^Ÿu¨$àp`mòcÕÝ{¤\©Ï"yøµ>•ƒî÷@©+tµ}Gó€u=n 8Ã1MÀ¾,›ÙÍñm*QäÕÕ@ éU.¾Œ ·IIá>w›”¾6´WøýÂÇÁÔ|`Šã‘ ër³‚è2ÊD`lƒ[ÏS8F˜¬J¨ªPÆ+H…]Ï)„\›/OÎ-Gã@/,ŠÉœ  ¼ë‚DìÚüëáBÁà–7IÖ‡Ë:ïrHp¯Þ<¾Ÿ²Ñ¤¥òØ”b¦÷ÀÆ…F&*4X¹)~DXJß¼Q‹ò†çÆpO˜ èüÿ¡ÝAv}PÓõXˆà3YiÌpìå;Ö°E·G} ›®ÖíÑ„„: Æ5‘TmLfU»ˆzÅ.¼ôÒ§–qZéSŠK'‘wl|£jãPÖ‰ $šŠNr‹.q ,BL0cy–»¼³Ò·÷¦ÕxQnÎú„Ÿœ‹*³Îh1 G+x¦ÿI±ÑY·umþõX>啹¨E^šŠü¤ùç#¬ø.*¡Jméϰ…Jn3¡&?åM™¯*o =Ä'fˆpÐ4‚Ðf3T6¨ÊÕµ€¦ñhÖç§]YÈêŒP}뢀ºãZ5ó#”¡ :(±:÷Ô-¯¹¬)×=E Ô«T›?çûCåðXšªrÅç—=ÞU­ÁA”µCÊ0ý:3ÓÚ{¾yó©ßè.¤ÆCÈÃ@ù¬Ií¹•²_ÍŽ!%£yÆSJ«ÄJ_›5ž8†&»‚‚y†1håñVÌ=Eèö!žgd†³ŸÍlÀËž¼+nˆ÷_åçÄë“§Á=§Ö ÃpÄÀä$i+—Üv@øŽmc¸A ÁU8²¶•Eè"h½*åÏC©5œ¬‹ŸØÜTV‰½’ßõ‰¾iwà¦9~š¶½*1jÓåeÝÎÎÕða“{ŒÊk:ŽžÄò½¤'×óâéä7c§”c——Œë‰à’g.õC‹ðg˜|Ý œýÃ¹Ú ‘y¶SÛÓ 7ˆé}Ó$ò^û¢áƒ×« Ù7>ké\%œ=4Vö0M7ÊXÛ#rOŒ3Ò]²GD“‘^þ=¢, ÔSQ2´Çª;äMË¿c‘f›ûA–¡»hän¦W¸¶³J?Õã3¨gl¿.!4ò,37ßìÅœy AÙǶ=ƾüÚD¶£¬5c¨‡ª±ÅÄ?0‹šQL(§Ýî«ÅšU®Ï“Wþ²ü×¼‰bœŒx|pº‰Wòh°9êH#û¦c ×Î]³=–-n4åÃoüî'¨·ŽhPÏŽf«2pX?‹Yɵ4r¦q9~ƒ‘ê ¨ƒ°ŒFæ Æ˜5¤`YɯïÔÕDíéÜu ìZÄ©v ‡³×µqí[Ëò$H f,‹£ñ×¢X ñ%Xß»òÓklœTm' :vxÓˆ½CÖWx#Š×°¶GX¾™QyˆÇ2—m×”«£º¡¥4¢²¹ï(yÕ tÍ—IWÉ‘,¡ywF AR4k¯ÇOÓ LSÆpJñó|{ø$ш…>Œzᣠlø˜Âµo}¼ˆ‚4#pÛ¶ñ]»S8®°pÙ‚:°fvh£S£Ql%èØÖà“?ܳÆ:˜í*³›&#‘M˜ƒ€2tuÄê@Uñ)ÃRF£ B{2än‹4Ff–»EÉP¹ÎÌDZ¥æqTú2úŸ¼ëlÊú;uk̲ JC8ÒñÐqM´/žÛêŠÓ&¦[§•–T.ª<Ó|œ’ojþ· ¢ÚàþôáwÔvg°ÛŽóÎFÜÌ{5j0 á´!úË ÖjJÌ‚(ƒ2´éai_!ÓÁ«¢& zy¡o̵ÈL¨«óznvßû l%aàZxÀœ í¡Äe†G2ÎmP×ÎJlÛÀ£=nF>­öœ’Ñží ˜$ªRR:¬wlúxçÀñàÚ‡Fx£·®):áèvÃ[QéÏ5føqU•…·ÆnWå¦ä·XU~ñ¦t;ÑzPkÂvyà2s›ÎÂѦ=·RK±ú^uö€U°FVÁ÷­â¹ù ¥±þÀ`QÿBm:õƒœG¹øù1¤Üm!î©ì£/R³ŸÛã M8eàokÇ‹/¾˜§—GÜœY<âc¿"$D›Ù MkYSóÆŸ–ÜÏK(âîý™Â§¼ÓçƒÁVÏ™”oošÞó|k2¿¡™Ï›ô%´ú?)ïîþ°@ endstream endobj 286 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 287 0 R >> endobj 288 0 obj 2624 endobj 290 0 obj << /URI (http://www.tei-c.org) /S /URI >> endobj 291 0 obj << /Type /Annot /Subtype /Link /Rect [ 489.725 485.789 505.275 494.789 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 290 0 R /H /I >> endobj 293 0 obj << /Type /Annot /Subtype /Link /Rect [ 176.0 473.789 223.23 482.789 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 290 0 R /H /I >> endobj 294 0 obj << /Type /Annot /Subtype /Link /Rect [ 231.106 473.789 312.766 482.789 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 290 0 R /H /I >> endobj 295 0 obj << /URI (http://sourceforge.net/project/showfiles.php?group_id=106328&package_id=141124) /S /URI >> endobj 296 0 obj << /Type /Annot /Subtype /Link /Rect [ 345.748 473.789 408.798 482.789 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 295 0 R /H /I >> endobj 297 0 obj << /Type /Annot /Subtype /Link /Rect [ 416.674 473.789 505.274 482.789 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 295 0 R /H /I >> endobj 298 0 obj << /Type /Annot /Subtype /Link /Rect [ 176.0 461.789 427.53 470.789 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 295 0 R /H /I >> endobj 299 0 obj << /Type /Annot /Subtype /Link /Rect [ 489.725 324.989 505.275 333.989 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 290 0 R /H /I >> endobj 300 0 obj << /Type /Annot /Subtype /Link /Rect [ 176.0 312.989 223.23 321.989 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 290 0 R /H /I >> endobj 301 0 obj << /Type /Annot /Subtype /Link /Rect [ 231.106 312.989 312.766 321.989 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 290 0 R /H /I >> endobj 302 0 obj << /Type /Annot /Subtype /Link /Rect [ 345.748 312.989 408.798 321.989 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 295 0 R /H /I >> endobj 303 0 obj << /Type /Annot /Subtype /Link /Rect [ 416.674 312.989 505.274 321.989 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 295 0 R /H /I >> endobj 304 0 obj << /Type /Annot /Subtype /Link /Rect [ 176.0 300.989 427.53 309.989 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 295 0 R /H /I >> endobj 305 0 obj << /Length 306 0 R /Filter /FlateDecode >> stream xœÝZmÛ¸þî_¡O½XÓEê¥@P\šK»‡»CÒøÚ+’ eÚVW½ÄñýúEJ¤(­²´@š,‚å 9CùÌ<”´VžãÂÏZüŠˆ‡¢(vÒóêƒÒ{Nˆ?P*ê"‚©ëúŽG¦ÎÙ«¨“ £ûüùäücU¬\ç/«·ïaÌÞqÁî²rïqÞ¹z³zm¬M €ö×´>×9®žoW›—Ôñ\g{Ð[L1 =ìº^äDÈDZø‡íÙyû䶨›$Ï“&ãÅÓ÷ÎöÇÕÛQ¬¾ë¢èk õõh‰•0 ‘kC¨sãKh¤GÑ5Zˆ-ÊYFü}ï’ÝÉŠ]sÁSô|5‹»8!Œò¼8ãºP4‚&K€ùj¢›b‹uÝ´ç’IšÔÍ5gõ‰±¦vž:k¢Èy’&ÅwwL·¼-ö7ZfYsb•–3™vZÝgcü!û¤…+o+sV°äÇÚÍî¶f¦×ÌX//u–¢Å®nÃSRíS¾g¬Ì)“愤¡‹‚δ:jAä8n8y(1¾t±^_ æõž§;ÎïÖŸê|]ÔÏ^}¿ý«òã¢À¡åàMÉÒìpí–¼n‡†ö¡U{'±8=ŠÏTœ7ƒ°Ï*–6¼Ò¾ùaÖêOŸÃâù·7?­y3ˆïà˜«{ÿ"w’boí;„DVÈP†Yõî©c MíúæeW1m˜ÆÅaùéGÒÃ/¼a½Å,°=ì!Oœu Ò™lF<ßC¸‰¡õVìC »·7 Šü: ¡¾Ö ;›šSÒâžBÁÍ®s’ ü7T¿ýü“!õ‰€ ÝíaÞžï#Ol4‰Ô6õèúUjYF¬úX£…¶Ôí²â%«dèR#¡'Û«yþ‘ÃÛ]ž¥Æ{V4Ù!c•1YžÝ&͉׆(w¢ï2:•sAjmÕ0Š{ UëjýKiTi”.g‰ Kɼm ©¯7}g‡%dhzl†66}LàHã(ðý™µ§¼8dǶºÜ~@ñ° æ‚7Ã:±ôÎ\æåÄDužÛDZ~ÔÎ{'ÙH©²wYj“Ê4KÒ”Õu¶ËÙiÉ á’4éÉû}–’ª;JbU5’Ïà<92•Rw{0b.Ø ^FÌ7Æz^äÙ‡ûhÚî 4Å{ Ëç-öllõŒ'¦î®c6X”Pt ¦™ Kh·?Ü:ÿ&c8¯È2q`àëP0~(q`@G,ˆÊäûn“I Äb“e"tšdÇeè$…×®­2¨kœÙÉF7ƒR­2Îô¬šª¤D4w¹c/<ërðT¤a¦Äg#U¡˜I)Œâ®4}LRÒµ^)¬bßS ‚ ÝväÈŠ†bBq¿ ¼™¨ sÑǾ5îϼ¨yÕdíÙNBÅPú3v]F¹òàÉÛ‰%Tj/¬jÆòÔ4å7›Ëå‚DZ¤ˆWGË&. ðpÆÃûÉp‚ܘƱ?¢±Ôú”•µ!ÛŽB…€žˆFsŽT¯)Â(F¿g¥eîûcÈa>nË|ˆ ‰ëyxn³Õ–ÕΔAö*X³™9`*ÐØpõo¨›úÄ/‡ ò •§òOÇŠ·å¿²ý38(G(“ôH¢ÓX±H)¢ÂoF3“Ø'âÓžú`4õéÌp±4ÂâŠv9e’Ù” Ô.®yõ\lxë@ºü=q§³“ÔÉB#Û;Þ=H¡$CîâZMÑÐÞ¾Õó‚Ìç©éc”ݓڰ»ªÅO3R^œã`x ³‹U‡^ß5žM¤0zŠ‘ªak¥Øïì=º-Qm¹'}ÕíºÝõeLeÙÁÐi©'IÒ=¬‚&7/ãé-D8$¶ñL¤›¶®69O“|çÄ.x5p5Û@znFiªÙv†É0Á3ž–9^Ü,ÇãÇ¿ü\ë‡6†ÿ›4O—iž@"RAó4¢äyµÄsãøÿŠç ÁÖ¿žŸF5Ïó„kÜÃx~j÷PžŸZ>–ç§y~q©áù©£Gñü£¶lÄó÷nÙxžÀÃþØöÀóÓIy~:üËxž„‘} ß8ϓخ²ß*ÏO#]æyêÚïKy~êi™ç)4C&D.Ô&“çÓ<©kAÒk—¥wØ~dyPužbù¶è°ß}:çZS§UV6Z†yÚ3«µ¢]ªºsÃöÇäc¢¥n¦¥¢âÞ »Ï°LªZñ•šDBD °ÛÆü¬8f…9I2·ØêZ»Pªä!Æò=n'ºÙÅ ÅŠ•¼Îòo SÄa,7dêU,…:9ÒO†ã[CoŸÕ3&Z%€1>³‚ÝGa¼õ‰0”¯åd[–%Ü1Vj©Ïg"÷%geùQšþD¥d@A*äÆÈö>; $™Ö“¼'ãwwÊkÅ’ÆXE}=çYq7vHì°+'mçìw¸áöYpNŠðú™¬ŒíœRYù1©Ö°ô…t <ˆ¿Ê+¦ïCÎXJú’©z¹n뢮‰nŽËs§ºˆ¢¯Å.བážiŒ­²Æ›5Æ’^ݾЂ`x-½3—0îRlöÝKì¶ٽ欸xíܾx÷9ϯΞ’6o *÷^#·¿BL§ØÀImª¶øLÁ—|8— R}ÇxHØ/& ÷”q¸î0ÔÆšŒPx‘ÂÕLJ¦‹”“¡eBEjz¤Héoìðâù Á©«ä¬§”¸Q† 6R‚Ȇvw4Öu3´»Ç¡Áà8ÐNˆY® 8D™¨LvÄ<_Là&ȘPofº,°¼e°Ä> endobj 306 0 obj 2342 endobj 308 0 obj << /Length 309 0 R /Filter /FlateDecode >> stream xœÍÙŽÛ8òÝ_A H7Ðfë>ò˜L²ØÙMÒ˜Á`zh‰¶‰–E %¹·_öÛ·xH¤%Yid_’¦«J¬bU±.Òn|äÁ[ù'‹|œe9*N›? ÝGi€ÂÄbGAìy!ò#Äè„.I1ª$.Ö~D¿nê‡þºùýXS"øž7ÞáJÔ×ÍgG7³àI?6ï6÷cä{èao]8õÏó3”á0Èå¿=œÐï7«ÛŽTé¯oÿ@ß|x¸°5ô<œýh¦~¾PB%MSìMCH‰ 5 (Z¢üt¡ÈÕ»\P´úïU•½™Æž«ðºéެµX#xAË^PK´í«ÎYÃj · õÁYM…à¢'Ú¶ä@Û;KzáýÅ~;²«^,¥oiÄY I½çâäjN:G+GÚ;Ú¾i¸èh©×õKàMóB;ŒŽ‘¾;‚¤i-éh‹’bX}@tŠtH~G%m ÁYoߣx¥M=¡Gé)åÞ†cÑWDSIÅã-ÖÊȳŽ@q€“S5!º8;E1Îã0ϳ8Õ*Âì㣲³T†×jSØ‘–J¹ò@ß"¦ë $ôõ—OèLE;ÖD,Ë‘’d8ƒìÈSˆ7µÝ¯GVÉñA³¹‘ù~ÏÀ1Õ€ ZQÒŽŸÍv­]>@_èþçwBÄÈa!xGÛÎÂ#Øñ:X"0xgUeN#¸söÀy±;Ì##ó&~`uG! Œ€-MpjÔ1 VØ ÊK®Èŧ’žiÅ›­UBiâO*¡4 JwýˆÕ¤-h]²ŸðHzp„Ës`ãðgVþ¡'¤]V½à§Žxî‚<˜¸@K—up0QÁ:UÞ´#Á1r¤9Ù« 7E/,Q¹¯i¥ï¾þ<â öoïFt×[yúø4¼'¬GIZŠ™-Iÿ¨ùs=7Ü÷¢‰å»þ Í‹œ[køHÎtDv”Ö#²gÿ¡åý¦t×pMŸG˜×ô’ AËÏì.Ä2?ÓªÂ#öÉÙcO!¦Ä•}vvvj lÁ‘€â ^ñ“™WT•fYèÙáè ¦kDíaàgÑâ2šj©ŽÅ~ãý›3uù•c DÔ´t–ën¦aÓ\4Òv¬ª\ÆÚÙW¥€LŽ”¨ƒÖ™þ¨1~†þ³à§Jhæy^”e¦©€NµÌ>زäoX ÑÇ~¾ sÍâãɪdiÕûãØ{a/Y¢øˆj{6TFM(ô´Ž‹<’t%Ñð³qšB ò ‚-JÝrìj¨¸ªÊhÔ4Õá<œè.—O»NÉègÐâ¼EWº/wëmË[`íî…ì‡ ÕaÁÉI0aßóªâÏ’ŠÓ.œ^Û»ÁÒáM}éUHg¡Ž1j»áH‚}"ui 7¤$ª$ŒtdjŒÌ BVšÈö6i¢3qi¤å';ÒY¡Ú¼!½ÿå«£«àP.êéh% ΓKƒeC†Ì†¤Á$Q($¯oMf,„È ‚gp¸^Eæ\õ¿ÉÖ>°Î×þå¿÷»žUåtµ,oë×ßôý©:j[{®Á*t캦}{(na¦)(tÅ5í$MpÞÝ«˜6ÿïD_?!'ʯ؇Kj,³¤,i ÷¸&‡Q¨Yþ5tÄLÏñz¤Ñ¡¦i'^ö•j׃‚‹#-žFL×p ë)NïËù Œ0Ì´0wÃä=׳¡¢MV³>€ñeEĨÐã0¬(ìß ùª±:ÅŒá×˜ŠŠ™ÁF¡Û "^o"+K'J© ^å (yäéӞˡk›Uïøþª¤½òáDŠ™ ÚÃØŽW×’Ð˱C6IæÞ ÃTÎ ¦˜hDÇ‚A.†æ‘æ,¶ sEi0õð– FÓÌœ{ç®R7‡Âp:uqt>šj§S…ZG¥Š×‡þÄà?$ËW»Z¸Â8Â)8ßóƒà[…k¾v¥p…I²&øZáš³™ÂµÝ zfêÑÿSǶÀ¿êHïÑ|Æö½%—Úû/:l¶Îá¤õVðªæ¹÷]šÏؾSsÍ´½ß‘âiÛñ-Ùú[M4&_3#ò‚%3®6˜r¢®LA,9|Í.Šù*3œN¡ÐÈ8+ÌLã ~¢´q¾¢ÚŽA¹#ÏŒMoÚw¯Úw:¼1—‚À¹g-¨Ñ7¥}GNa131[¸xbKe# “‰? Þ¼ ^A!$èY>¯`$§A5 c V'$ïJL?ït¼ÙVÒ"¤ÃÃ÷jñ‰’Ë™{Aø­â3_;| %(Êü5ñ×ÒaÎ&ÓAû{Õš<\ÚnmŠýÇy”§žy>{Ïë–•0ÁF¾ÜíäôÇ.¬3¨8·èD˜z;ƒ>Û!¸d›¨‹,\lÙžAC#;9Q™'cAMG¬žædN &Ò<ó¢ñ oîÊùª‡1º7Ü÷­Ç*H‘Ö¢d ðD=Ïp9_o´¦‚˜^¬¿©Ž-þ››ÉEr$Nr$î½Ð|;Ò“ÅdàZÌI©+‡ëÄ‚ýQ>±PÜ(˜JæáñРÜ>«[K!lOƒ4ªžiÞñ®ªñW®ò~˜*=ã+:ƒŸq{\ÎÂ`UŠUJKî;m=I×qM‚ê24‚ _'þdG¸ÕÛ’.«i!_íAºñâµ”„ÜÂY.¿Y`æk¿Y`/Y­ÀÌÙðýôh–íIüliÃEýÎw1§'(‰äÕ>ÉÓ I4Ë'nëØìì%Œ`yÃd'n®G¡›°íH)HíÀz€ÕX ! ,*Ÿ®ˆœ¬°n;vÒÉ®QÕ˜Íw÷?[Ì><8»[éêÇžvúX(-„QíÒB!ïþpi’î¯K5ß‹q&0¤Äù‚ÀW¦šŸ¬JT2W?õK†z™Iíï tn ©þý î!Y^î‚ì'ëúá:-i%Ûï©0×ÅÉÏ"zÛé{’ô ‹S›FðFÈŸ¡T-Ì ºÑÍ|p°q{jiC ¦3§ätÅXÏ ûkOäéz ‘g#æüVƒ¡|CŸ) å@š†+úl}œ]Õ) Bf`Y/ɰZ˜w0Ïf ;°3uÐí:õ\bpóC(v~&þ¼ù<„Œ endstream endobj 307 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 308 0 R >> endobj 309 0 obj 2430 endobj 311 0 obj << /URI (http://xml.apache.org/batik/svgrasterizer.html) /S /URI >> endobj 312 0 obj << /Type /Annot /Subtype /Link /Rect [ 150.0 678.261 241.191 687.261 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 311 0 R /H /I >> endobj 314 0 obj << /Type /Annot /Subtype /Link /Rect [ 249.011 678.261 432.051 687.261 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 311 0 R /H /I >> endobj 315 0 obj << /URI (http://dtdparse.sourceforge.net) /S /URI >> endobj 316 0 obj << /Type /Annot /Subtype /Link /Rect [ 150.0 631.697 183.88 640.697 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 315 0 R /H /I >> endobj 317 0 obj << /Type /Annot /Subtype /Link /Rect [ 190.127 631.697 312.327 640.697 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 315 0 R /H /I >> endobj 318 0 obj << /URI (http://www.thaiopensource.com/relaxng/trang.html) /S /URI >> endobj 319 0 obj << /Type /Annot /Subtype /Link /Rect [ 150.0 597.133 170.55 606.133 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 318 0 R /H /I >> endobj 320 0 obj << /Type /Annot /Subtype /Link /Rect [ 176.413 597.133 381.673 606.133 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 318 0 R /H /I >> endobj 321 0 obj << /Type /Action /S /GoTo /D [254 0 R /XYZ 72.0 148.085 null] >> endobj 322 0 obj << /Type /Annot /Subtype /Link /Rect [ 376.51 494.877 441.21 503.877 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 321 0 R /H /I >> endobj 323 0 obj << /URI (http://refdb.sourceforge.net/download.html) /S /URI >> endobj 324 0 obj << /Type /Annot /Subtype /Link /Rect [ 344.122 472.313 405.093 481.313 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 323 0 R /H /I >> endobj 325 0 obj << /Type /Annot /Subtype /Link /Rect [ 411.074 472.313 523.274 481.313 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 323 0 R /H /I >> endobj 326 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 460.313 180.28 469.313 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 323 0 R /H /I >> endobj 327 0 obj << /Length 328 0 R /Filter /FlateDecode >> stream xœÍZI“Û¶¾Ï¯@å»jq_¦êâŒíç,Nâ™$•Êä€!!‰’¹Œ¬÷ë_c!‘âÜlÝ  —¯A}¼ò‘ÿWüOù8ËrT4WßGi€ÂD±bGAìy!ò#ĨA§¬Õ|ŽÕ¦ü9 ôý~Õ^yèíÕŸÁ˜y0ïpå.DÝ]ýbé¦@ûKÒÏCÛ«W÷Wë71ò=t¿1G8õÏó3”á0Èù¿Ý7èÏïÚ~ uM†Šµ/ÿB÷ß]½¾?Ùkèy8ûÒ¶úˉŠ`*išbonBBL(yÀ‘y׉"sR®r‘;Ϫì-4öl…—ÖóÅ(wÞpRåûyžæ9táìÄt‚ô’Á|1»[ÚJÀõ:¿é,YxÉýŽ¢—(HpŽ^´à+φ$ãÀÆê^sú]µßÓRÓ‡jØiâMGé«»[MÇ82¢Z3 <’v¦§3 ŽíØ“ÇÚ06Ì d£iïÇnÏzÚ_Ëk²÷x³ ÙóV}ôbGÄþ50Ó®d´°:wÖÈm;®ìãPì=)žÈ–žJ¡¤Ä†óÇç-ß°²Ú }”ÛU”ÜæúM>¿ÐÈËqFyæËÿüÍý§™.S‚ICì åPh_OhÜ#¾{¸(¸©kÄ/oS•%\Œ¸pÞ×D¨!EȰëQÕ"Ö•p­ ¢§TN¯¶»Ïn(ÊPá,`YÏ—ËÆóA‰c²S÷èÅÝoïuû™v=xM“ºgš¨á~zÓ¥[zÐmºvšvU»5S»ªØÑ¡j‹z,¥/(†%ÄŒëá" C¤{3ë±æ¼3óÄ.Ï"Ià,BU~®ï©è(¸‘¼ŠªïAiÔãfsÀr¾;n)èÆ»7¬®Ù eYñdHj$ìøf¹T–ã(΄MÈ¥‚ ž KÃ^Aäxâö •ßÏ[Ýþ@À#ºê‹ùIŽýÜËó(H–õü?çÓx:ô}çËi»aØß¬×ŸšpÎŬۮ¹vëþyÛieðnhê™è0ñ°s²t)ú¯Åè‡اŸ;ô¿Ñ ­nV ‚*X Æ;,ΤÎä½0µ(Ɖ ²©ì@÷ìL[¬ÖkrÓ±Æ9NÞ–lKkÖ)÷ÖÀÉÝTµaÜ’5EŒ”¢«öƒQ¤ÕMÖ$ÁClj,ZÊ£€\'2c‚º­+êñòÃÙ ‰K^u3sã¹Ðýü4rˆ@ÒÝ«õãž'˜’dznlÁ‘€ùy&ˆì÷uUPÉÛÛwÜ@}t1?L°: ýô’;-Ç•C¹']OçÆïC9ˆ%O9ÈZÌâ¦Gêð?Ã~ä9Éå<å5Ó¢XZ$ß-Å-f²‚ˆ'g.%æ~D!Nbž:OäÆ(MLógÚÕ†Òö¤è—CX˜jcgQ%ÝÓ¶ì ƒµÎeF°VwÜR”Ít‡¤=Ö€BtÊ«¬’CcÁ›ýÃKeZ[ÚÒÌ¥ÃoïoQÉŠ±¡í æ¸l€*4Ü\]´¡Å¸¡#ív60Ïp (Ò ½Ø1ƒŸ5‡ùxŽ|À ç;æ)û9xØ‘ŠÁ‘KÂk֭ɧv»ú8ã.€˜$é‘ïÒjxÁoA“<÷î.‡ßè]ÝâéNý8V§S¯i*ã‘„D€¢ýnn_9N= fËÃr82?ð}¿‹zHC éwx1ö¼qô&ACÖ=!Ò±@D@ÃM/’:à­#:và1 ÒÁ,¹O@/‡º\?æ¸0K+â5¤¡Mµ;z*† À!‰?TíøÉ©ÁÃËë‰vך•–»Œ˜œîòÕÝ­RbZýAðJ(Ÿ!yþÚVpCây‹õ-:ð”úØŠ<¼Ä<ßfž…P,=y¾‘9‹³‹kÌ´³´4@^Õ(Oqls‘œ’ò û(,FrKBO^%%E6‰nÝÒÇŠ˜Ž·ï]O÷¢dˆCÄšþ]†á¹œº†Ú¬Ìs‡Yx£›ü%Àq‰I|z ÚC!x§üµ-¥ÉI† *²Ýï šÈGª› gHBÅ/‰À$ªCFÔÅ(õh¡ѧ éŸZÝ„Hxœ3ò>ïe#LÍ{îâ,Öt(Öà\:°C”¦§Ã?¼þæöÇ×K-§!(Å+ú{=ìÀ­ù)ËE†žZv@¬CÀæ t@aö *ž^ ƒÜð Öuâ[G§'%‡ÆyŽó“¬ë;0örÔú\Épì™2M¶÷¤# [h–xXŽÔxT’Ÿw=@¨R1xºïPL䪋Dü“ÒŸ©e’ñEòs¹ˆÜyQÏÐ÷.‰Ð •¿eÖ5G¸¸ã¸§gðiž‰­ŽÇ8æÓ&ç\ù‰x®©Tá (»§eƒ!ø'›²b!Š23^Â1ZBX7\‰U””)w_^Ágk­:•(‚ŸAÌÂ2£*a`’VŸ‚¶‰Zôª´œ—¢ü8‚pv“xcÓQl¢'Å$e'‰'@ ¶üi×î;zVàÙQA U|Î_ú¼Ô¡4¤Þ»û?~x}þä_˜o©À±‘®%KÙ€ÒŸžœ³ˆ¯Þÿô•EZ†åw\GÏ4+醌õ€žI=R N¾yÅà’jgò ³ë›×|зl/¬–Wðú$aÊiI^dð¡ÌMùgµ$Œ—Ëýsøò“Kó-UÙ¿Ö,嫪–]H^f¾sñ’íy1F)å@’h”ñ«“U¶/©Ê:ci²M?Ñb¸ ÞÌ·êzƒËBìÇ©çy´T«Ø5ÌR'cCˆ;L%õNe¨Ã±®Ðu}f’Àó¼ —"\f •ƒ°Mbõlºìv1êÛ髸Š@ŽÍ#««B3 Jße%¥êKIÐg*²‰¤ ,­Sk†p$g؉ºC­4A@EªZR ›JI5‘éæ¿gË=_@gü.”Óñÿìm¹kšHHà,Üñê¬ñùcŸû r‡Àº52V½iÛûºÎºº"€ž»<¼ls`ñ8õC0ýÔ±¸¥ÿ½ o™yµ±´©,-{$7%kÞ”j%I:k$qÜŠŸÎeÛŠ¶ƒ¨ ûªÙóŸ=ñŠ[rdÙT­|{ïéÇ‘¶jò¨çaoX¿é‘¨oùS/–!ñ+‡A>S@Jâ{Pϸˆ¶(ÛÌÍõDÉH¾Ç=¦Ø1ÖÓ‰"Zâ®Úî4wjèW²Ù`K´z±íuÖÓ‹ž"ÏÜ<åLuO¶ 0øtÛp¿5ýTlÛ‘ýŽ6ùƒg6M ÅyæA¤ëm×Ï&æ£ÞÉ¢P¨Ù’šm†¡Þ BûKûê 6ö†ÃáÓµ!§zÖðgŠxЬ,M¦ˆ§H+ä)Žó´‚ò±E-'¢žãÒxvýÀäo{ä¥aôk? l <0~w¼wÒ¡QS ¾#õððR¸EÜŽB!Œ›³‡kgØO|HÇ¡Ž6d–±E…ßžRÄOð~¹ú?DŽX endstream endobj 313 0 obj [ 312 0 R 314 0 R 316 0 R 317 0 R 319 0 R 320 0 R 322 0 R 324 0 R 325 0 R 326 0 R ] endobj 310 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 313 0 R /Contents 327 0 R >> endobj 328 0 obj 3321 endobj 330 0 obj << /Type /Action /S /GoTo /D [254 0 R /XYZ 72.0 548.258 null] >> endobj 331 0 obj << /Type /Annot /Subtype /Link /Rect [ 138.05 235.245 216.65 244.245 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 330 0 R /H /I >> endobj 333 0 obj << /URI (http://www.debian.org) /S /URI >> endobj 334 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 190.141 148.88 199.141 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 333 0 R /H /I >> endobj 335 0 obj << /Type /Annot /Subtype /Link /Rect [ 156.477 190.141 247.027 199.141 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 333 0 R /H /I >> endobj 336 0 obj << /Length 337 0 R /Filter /FlateDecode >> stream xœåZK“Ü6¾Ï¯`e±«fØ’¨§·ö’J6›”דJ¥lÔjv·jÔ’¢‡Û“Ãþö ¾ôèžñÍU놠Aü:ÞøÄƒÿîÄŸ4ôišf¤8Ýü©æ}’„Åj*òhDžÇˆÒ "'2ŠH%xœA Gðg²è#ùý¦¾ñÈ7ï?šñ€ï|ã].E½»yëè¦ÀøkÒÏ#‡›ïîo6o"â{ä~o]4ñÏóS’Rdâ_@îOäý‹ë~È«*ʦ~ù‘Üÿtóú~b+ó<š~m¦¾¨¡’$ õæ!$Å0œƒ”(>M™“¸Ëd-À¿Uö{®ÂËèùj”»8 ¬òý,K² >Ñt:Az-`¾ë–±½ŒÑÉÜèxyKªšÜõdÇbSÖå@w›Žïw[œéŠ&þxr}²âË0%AFãÔb}”Q\îî½Xôþ©ägò’Ü¥õÉ‹áÈ-Ñóa(ëCogÊúÒÒ¢+ÛÁÒ¸5¸L:8&ÝÔÎæj£a‰–ºI“‹¡R²ÈaÍò ò¯ˆ° eq´äöÑŽw|Ÿ•£|9±Xæ0¾[wÂóìdiDƒ„eiœ®(¹ûnS5E^m–'åkºz[Ö›«?,˜¨Ð˜EÒ/þÝôƒ¥ªòW–V‡Š„=T¤Ïyo‰¶kZÞ¹¼ÅØÍ©ü }…sû¦³Äc3:TÿØüditëŠÛ±¬‘ÀÕ:T3‘¿t`Äf¾Ø5õ·9æŸ8RóúÀI^?Gˆõù‹•DÔc,Ëâ(E¿9F@ Ç.6µÄ¶i†[KóÊ%Ñ8î¸Xki}›$a]³²GlFô‡¢¹Ãyâ}ŸxïlZ_Ú¤è¸kÈÀ« ¼œy^R’¿Ö˜-V™Î zc¦]…ã6ïòx×›)™§–+ÍeEò™]Ü€ÅP2#E1§½Ô“…W<¥ô3µ„x„†<ËÂ4YÙD%â«z2ß»&Â(´+;^ Lž8Óì×Ý NÁ¾~€€íûwrä>›mø„aïéCÑuÊ…"'ßjì•ÐzÁÝ&[2Í¢Û×/©3ýŽ»Ìºh#õ)¯F—nö—ÚZ`x»2ßN”Ö9eÙg>õxýyðhZ:nø»û?~~}9'±ì¿«t³âý š1|óÇëwßWJ3"‚k¢o*3nÇ®mzCJçÈ‘::9vÜ iûE9:åÜòš¡ê q 6sæSÅe©@‘µÑŽç§ VV·æ£Ñjµ%X2³ý˜C³%$Ʋûnô¨ÈeþŽm+/‡9ïAeˆ¶ÃJNÊnLŽj.zµ¼“ ¡ì²µü£êf ÅJóP$¸~©zA¨]øn5ßåí¼UF‡ÙÌh¡†­[âYѯåïÄ£iÙÁ‹4±–¾ç‹þÙ´ø2‚¸Ìì{)ç]…ÏËx¢ëñDÀgéÊŽO§e?¹ÆïjÛ|¹n™G½4ïÆÁR¶óÂEPCƒ´?^ÏÐQzE¬£¥jš¥î–ñ·êBYº®/û•Ó„·ýd#þ™ã nô+r¹)õcê…`ž@"æ"Šã©ÙÁ[2"O;c­¤& õC8:–-e»_8aKcÂ_4[½[¬oƒûf¿2áYü°¡‘ $°ÞãX!AêƒzŸKÂA‚p†>Ò ºÈ«5¡1E*ÔGQK,c!<ˆÓ(öWLup­âUäG¼@ ˜fi­H»]wþ¬¸Ÿ±™ iDh Ùá¼÷!« Žü™Ê `#™@¡Ð' :ÔHô@©¤iAseè (ùõÝ]ßò¢Ü—KüÄÓXØ’g -‡˜> Ä†[¿B!51Bzõan>çz°—åSå®fÁ¶MèÁŠ „»6'³²mÚ±Ê;MþV—ŸïDª6\ùù€Tì AŽGCÇŸ`ì̕䒔Y¹®ô)ù¹¬ÇÏO90b”^&=è f³ì McçÈ ó.dÔÀ ¯t£ôø¼_õÃÆª3\ ЉõÜtDx¬ÂÛÛæ3uç$*<š ’“4Œ¸ÀÅUX1Š"šÄDHƦ.'}Ï·e^“~ùmãøë‚¯ ¿è@ Bî™±ILSñ€I‚h…E>ùaIB^¼Ÿ1ŠXNb`dk{‡¡}µÙœÏgº“ÛÒ¦;Ìý,~ @D°&áãbuJY«Ã˜]×ôûӡõ/HÁ½Ú—‡±3°¨šÙßå*ÝÏì¹|(úâxÒ-U“ëo3–]ãwMÂ̯¨~Üj@­œØ `[Þì—Y5J³™pÓ¬ÆxÄ{¯·ä6/ô 8!Áw5Vu ‰…{q!¯•õç#BAz#¸E†ÈyèXþâÔNÜ7vÜmÛtƒ»Cé(_—…³Ãžç¼^o—N‰=ælL‚Tü\wÎëÁøË…æ»_Dæ|xGMœÕWE9¦”÷Kí =êŠg…ùE·ˆÁÅv‹Ÿ{Éú‘w¼dE.O7쪪Uº?=ÝßcRƒ§øû¢ñÏù©­ Â2U(§x?Ä‚[ÚN`ºJ1ŽóAE½1;6fÇÕ¤.\D3£ ’=£©Ec)šGK©}[!¼ƒ$tó‘R¿Ê9‚fõCb²c¯%¤0=฀¤ÿî0>¶ÎZ±%¾šþÚ_4L7̨ÁCÙ®øÍÓ®,îÿú*ï¼ÿðòÕÅk.ø!>³Øý,QwRü›Wݵ…ûï|™þ‹ò6o|q?ÖxèÆÆÙ"Ùœÿ5ìíÍÿ8ŸØ\ endstream endobj 332 0 obj [ 331 0 R 334 0 R 335 0 R ] endobj 329 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 332 0 R /Contents 336 0 R >> endobj 337 0 obj 2857 endobj 339 0 obj << /URI (http://fink.sourceforge.net) /S /URI >> endobj 340 0 obj << /Type /Annot /Subtype /Link /Rect [ 138.151 193.781 154.261 202.781 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 339 0 R /H /I >> endobj 342 0 obj << /Type /Annot /Subtype /Link /Rect [ 160.192 193.781 264.622 202.781 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 339 0 R /H /I >> endobj 343 0 obj << /Length 344 0 R /Filter /FlateDecode >> stream xœÕYÝÛ6÷_A¤m5Å/}ÈÃ%iŠr½¦»E ¤ÁA–h[]YrDy½ûr{‡%QÖ÷pHw,g4Î ‡3?2_Vø]ë? 8BV_ Ÿ"Ÿ!î–K°`.!Q™‹hÈrQ¦çXÖŽàÏ@è=úm•¯úqõé3È$ˆÀ¼óŠ\P^«º]}´l30þšì#h·z}·rÞ¹ˆt·íCì2ìSF P€9 õCwôé»÷¹ª¢,‹ª´È¿ÿŒîþ¹úánà+'_›«&Bªø¾É8…j5¼á§Ñ¨? “Í*NãAó÷¢Édb1± žfÏWcÜåÄñAŠÒ0ôÃ>á`:,\J˜¯Æ»i®0mWç4¥c¯E}L\íªç5¾"ý³^ŸÓj¿NŠxS÷ëG•½rNªtÔ>*¥£v‡Ì1ßU=eRí¥¬sòs”©=úã&böJŒ`îøñèt©J¦ý2YG™“¥›f©ábç]8ã gÓ%y:rå¦ÖGL &äú$ W4sA3øEïJ)_ß¾míæò÷CÌC)DÃFÁÝ^¢ïá#Ñ òh°¨Y*(D§ØZDë¤?^‡rC;ïs6]ñÝËvêÄDê˜ù"„Ó™ÖÚq”çEe1öQžd¶+ÕÀ±èTUQdj½“¹,£J&Ö×IÛöÏ^¡(KWÙ¶˜¿*[é®wÅŽqHGv§PÕe”Üè©Lo?Ø“'¥deQoÞ}øÇ·¯Öï­£(Î"¥t˜×eQT¶¶¦6þ=DN-¤3~)¤>/rñäjñcêCwâ¾oWÀ;xz餥’¨ŠÚ±Ì;öéØŽÒ¼™’VWF‚½¦:N¬¥.ä£ç" rL ™Ä ”Ûd³X-Yà.i¼ií«zLJ®f¶…¥&Îi}ÀêñFþ¯Î F¡Jê&ÎE½vv®·¹#Á& ²Š¯åsðµ‹q‚‰âúƒÖÅ1úIVWt.°™ ÖlÇÿ§uM—¼ºwM§þMšóÄÈð®{éÒ¬;•6n[dYqÖu^æiYä™Wè!*Óh£MÙH(ð•§<¯»Ô¥xsÉD#šéÚV•¼v8£X£âÐ¥lFÅbÏ`!ÌõÜÅÄRϘŠÍö NÂKÚ.ôŒé 0D5­½0½ãx¿ë:Çl;Yèä c¼XÆŸtlåŒ+®€ãªA·¿˜©Ø|`<ï’¶K™Ì0ùð¶ÌÀcè}¿ è!éžÔ—l9,~0¶qꈀkW( Ä]ËTl6,‚±KÚ.„e:cGÔ¾ÆY '²Gƒ@´’›ê•JÎaŽõú=!}ìf/ÅNÔUsàÈN®‹¢#íšP›Ò$„îQ’¤ºFYÏ+Žš£,!kœK™È÷ Ó¢†6ÐÃP¦!ª"†¨Áˆ×ÚŒ¯ëÑœrì°“Çg<î6åZ8"ø¢¾›Þ>¨Ï3¹Ur8cVš²+PU +—ðp@éÁœúÎÁëàƒJ² íjœ!B†½2r™3F·EýI=4\Ðø‚0. Ry]T{^½ªëÍ ÷š<‰Ê¤ç¼é‡p#:BXËžc®}W)Òý¹§Ì¨g´‰ÛPO4Ä.}–I¤JÍih¥TpCS–޽̧éã2o”Í)ÍÝÛ‘Û·¯1ÒGxÇ5J¨±2Àáê­s]Š}×mRÀÚ:£ßþþì¶ù. ƒ€ƒ¢µ˜¶‡Öª¥˜º´ÐÓ™Û4¿MÏy0nC3úu>瘆ú±—‹™yûª:¾t½VÅ©Œ5lÚIœËj¤‡ê¼fs`f}žˆ»€¢À]´W÷v áAæºodO=×\Þ{Æ€èjýeP¹ž*¶ÕJ\ϱÊuø›O9¸¢%3]’=Žƒïé·gˆ8@øÏãIJ|ìqPˆ`FAglZÒMº÷k5Ù‹£ø>ÚÕ0½aÔ=Åv湊ˠ¾í›ËÔ2G—K¬Ç`º ” wɱÍS7ÐU5¯L3nvW€–c_Z^w%xyqÃô^ÀZcÞN4Vçæ¾háß+ ÿ€¯±îà)åÓœ¢ÿ´ðùòÀž~=à2;³¸U²¼¾d1‚}Ç@á|{~[´ `Ùÿ‘ƒàßo,ÅY¡ŸîšÎï?÷K¸p¢ûºèc¦Û ¯ã†OÁH.úe(F?—²”_N©J+ùlkótãp›¡í£Ý{sEæ5È*“¦Yº­ 5W9‹ª‹¾ECØ¿mËo1™EFÖx+Ï%+Yv£>¶èî¢_S‡BU™ŽE ÍÓæU{ó4Ú*,åà«M½yÚAOËŠQ¬ê+x=Ó÷°«;eï-ZôCÚ¼ÑNdÍÓÇuý’Ùó†¦åšg‹†h5Ÿ€,Ï©²yp6g@¦m2›Ýfœe¤#´—¶þ£èãê/'a û endstream endobj 341 0 obj [ 340 0 R 342 0 R ] endobj 338 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 341 0 R /Contents 343 0 R >> endobj 344 0 obj 2054 endobj 346 0 obj << /Length 347 0 R /Filter /FlateDecode >> stream xœÍZK“Û6¾ëW rY»jÄáû±U>Äë8ë”w+ö(µ®Jr (Pš"d’šå×o—HJ£½9> ¾Ðè7T¾-âÿ¥ø“Ç—ç©ö‹oŠ,$QªH‰ïÅaâû b/LÈžœ“Òˆ=Î Ô#øs¶ðŽügÑ.|òóâ÷?a͆ø°ïiá_`.Y=,>9²©0þžäóÉvñvµ¸ŸÀ'«Úš8 ½,}?ÈIîEa!þ ÉjO~õ¡í‡²iÊñöõŸdõËâ§Õ™®‘ï{ù÷¦ê§3!T²,óüqI6Ò€‚ÅÔ™ cˆ§œQPü{Qd"±ï <žïF¸Ë“Áª (Ь(`ÊËÏB' ®Ìw£Ý4VB!×e¥ãi–DªjÖ¤Ó5ÿØ•í–Öœ ;JZúDpH%uHI·…‹ñägQø¾ŸÄÅ„mGëÍzù켿7²“: òËLHÏ]EɆu´xw"¼CIO0Azz(»r d}dÍÆ®k –‰B/C)‰u¬Ý¿ÏÆ"¥3˽ûŠ·5Û;J–ËmzûD#Øž¤£í«ëÉkgàùWßïËvcðk6¬?4åÉàÒŒÖðÚ ‡k·–;XÆžT¶v|ì¾gQÏ>Ô³»Ðš±vFcy+¶²ýÝ4âÒ|dcOe¨uTðGJå°#àÕã. Ùךåvl½b¶:|Îú=-"Ç3sû•.–`Ý£Ò?zì0våGé‰ö쬩SâÉU7ÿ‡s&]¾rN¿Ý7Ë ­šï“7¿þ¸úçåc?X[GÓò ¨x!’XìBnÇ¥öG6èæ)?ÿë£EŽ Î9âá¤ü*wa·¼!=‹åÇ'#9:‘ 0ĬŸqËä!¤Ü…àÑÉoî,ÄnÂ@};›µ°¡·€?µTüpr¦j;¾µ-O½,ð‹"Oâñ7¼ZsþÕÛT/=ùÃkl¬TýÀ¡;¶¸îøÞ"+¼ãÕ[8Û!¬ÞMMžLÞTÖ[åãˆÈoœÒçn ”MÏÉï¾öD„JID M‡ r¢#pX=’Iû¬òçùæôI&½´“>Eè¤>ˆtú¨…ÜŽoýx{YÀkwVPãE¿‡az…•H¿ÄÄšÑPg'¢Qn+#`n#øâ.·ÉŒ“YŸ2—°É¤ÅWiŠÔÅŒÅD•ù)ÒRd£HB™{"ånË´"˜9î#GQ4³“ IÕÇQËä¿â­S³ö…¾5™y“ÈÀUÙ¾|î›kA;éÄuÐ OÊÕ_ÎåçtÎݶì%¨:¹¿<|$ýp¿í(zóóÇäsuàÇ$ Ú²´È2¨2/°–[bç›û£Ç2€2ž}UDÂÙl'ôz© ms:ƒ€—Ý@÷.ÝI(¸áPwƒB{h1D›áTp+TÁ³³á[ pEûPbZê,:ì3õ ˜¦²’RZŒ«9:Xp<Øñ¡ãÚ¡êHÁ‚ƒãŽö¼y¤Îòãºa•sÆ^W¬f´skØWg˰ã½ÑzÊ™€™S:MFJ;a%-–ùâݱ>9@‘6ðCkh‰j)Œ?0hd¾P«Iü çP.þš…1¼m“"O!¹§²~.š+ °'ŽRÈÂtNyW­­¾ºb>í¨¸âæŒ˜e#>úW„4@7;逤±•‘Zvî¶²ªà}Π‰»swr<•Þ k;#R%_!ÚugxÌË­ªüІ¥_i -•…:v5bÂÌË寕,į&8®ù±Å†1e²u0Xÿ¬`0½wÖ×ìÙ£úT'‘ÄiÕj®Ì‘ƒpFßÌ—BÈà]Ùm*¾Á_>7ƒüß>-þ<©•= endstream endobj 345 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 346 0 R >> endobj 347 0 obj 2424 endobj 349 0 obj << /Type /Annot /Subtype /Link /Rect [ 489.725 521.789 505.275 530.789 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 290 0 R /H /I >> endobj 351 0 obj << /Type /Annot /Subtype /Link /Rect [ 176.0 509.789 223.23 518.789 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 290 0 R /H /I >> endobj 352 0 obj << /Type /Annot /Subtype /Link /Rect [ 231.106 509.789 312.766 518.789 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 290 0 R /H /I >> endobj 353 0 obj << /Type /Annot /Subtype /Link /Rect [ 345.748 509.789 408.798 518.789 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 295 0 R /H /I >> endobj 354 0 obj << /Type /Annot /Subtype /Link /Rect [ 416.674 509.789 505.274 518.789 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 295 0 R /H /I >> endobj 355 0 obj << /Type /Annot /Subtype /Link /Rect [ 176.0 497.789 427.53 506.789 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 295 0 R /H /I >> endobj 356 0 obj << /Type /Annot /Subtype /Link /Rect [ 489.725 360.989 505.275 369.989 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 290 0 R /H /I >> endobj 357 0 obj << /Type /Annot /Subtype /Link /Rect [ 176.0 348.989 223.23 357.989 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 290 0 R /H /I >> endobj 358 0 obj << /Type /Annot /Subtype /Link /Rect [ 231.106 348.989 312.766 357.989 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 290 0 R /H /I >> endobj 359 0 obj << /Type /Annot /Subtype /Link /Rect [ 345.748 348.989 408.798 357.989 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 295 0 R /H /I >> endobj 360 0 obj << /Type /Annot /Subtype /Link /Rect [ 416.674 348.989 505.274 357.989 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 295 0 R /H /I >> endobj 361 0 obj << /Type /Annot /Subtype /Link /Rect [ 176.0 336.989 427.53 345.989 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 295 0 R /H /I >> endobj 362 0 obj << /Length 363 0 R /Filter /FlateDecode >> stream xœÝZëÛÆÿ®¿‚Ÿš3pZñý`v·¤]«i Û((j%²G‘2'+}g9KîpI)wF ¸ŽÜþfwfwfçERŸ–a¿¥øº ÃÈH‹O’nm8¾$y&smÏ4Ãr™ícLòŒ\ðÝàÏh-àÔøÇ¢X˜ÆŸï?š­aßia^Þ‰z·xKÎ&Àøk:Ÿiì/׋ÕkϰLc½S&ölX¶iZ¡2ǎͱ>ïo‰ó€cܤjU9ËP•e3€mVñ¤)+%»ÜÍr½*“—pøÿúî§åÏïøáfWVÿâ1sq±Eµ©ÊŽÍðH5ª ©…WžusÎyrÞÔ ÙV¯»,@mn™®áE, `E(áç²á=Çä–Gè1K˜9€;ï8ÖiV‹cZŽÅl°ÄQd7BÍVüS ÆÛR†"? õ¹nø hÒ¸!p[P”têgEÿÒ¯ý‰ $†d\îkFhw;ÍÊBå(ÐT>—mwm¾a'©0*,çx£@{TãcUy…š#ǯËü“åí&ϲǖM¶ËxE6˳{ÂÒ¤eM ¢Ÿ"à“3:[f¤)M|ª3¤«È¸Ùœ è틨·ï-¡åõ»ì³}Œö»_DRI¦ÛšS©9/:᜾®§é œÆÕ6)·Ü-êŠL¿¤Òšgù‘&CV½†g¢â])wVhi¬}½[wõ­«kp(Aèê—ª[P¯uýÃñOë…!œã{½lØfÈ‚À‡R>²lØà‘Û—,/:#»A$<®FÆ@è(ñ¦Ä<Ñ!é¯ÝXFP7&³ÃDÛ(ïV2gjWU©Bš¹f®y|ð¬‹ׇ>_¹™„½ŸH…,L’@’»¤ô:!R¹^´dß/“„Úz$HÓÆµˆŽÍ·f´W˜ÓÞ ´u*‹º¬š¬=èË=¨ b©83|]D™.ÄÁÍû 'D ¹×­δiŽß¯V§Ó‰‰°HXYí5 ¶k²À ¾ÌHø8Yî23ò¢È™U‘µN³cM°.(pXÞzᜠÅKÙ,b¿eGÝq|ÌÖ÷4“9 ¸Ð·ÙsÆ–&«Á9ѳç¬àÍjî‚!yÁ¯þ YbU§åi—A<±czüã¾*Û㿲ís¸(ÇÿpŒ“{(Å…S¸ú=yBn„3›è7âx!<ÇÀjÏñf– Kx¡-:´Sšae“J»èòê9Ý EjÒÅG`‰Žz\†‰Ç›²{*@pt‡!tâŠì±a¼&²åÓú´€”^DBÔL\(Æ®#”‡žeC]œ«Áv¤gYÌwŽIžLŒža4˜aoÙ :“È1Ú¤ŸðÔ¸n7ýFǤŒœí™B}‘t»ÇO_”ÉÕëhÚ£Ì\ÛhFÓU[W«¼Lâ|ÎÏSOx5Ôj¾‚ð\ÂTUÛ™Jf»öŒ¤ë5Jµõãý©Öquþo–yïz™w =Qæ½Ð{dw"—Ж@ ý_Õy×ôµƒ u~ªÕ|w­P[÷¸:?å{lŸr>µÎO%\­óWú”:?ô¤:ÿ$“êüE“=¢Î»hǼÿƒ:?ÝäjŸ.ÿ²:ﺶ~!ßxw==Ë~«u~ªéõ:ïúzÂûÒ:?•t½Î»‘îͲÎ'y\×¢H/…»\©õž©û±Ìóžo‹vÛÍçC®(uReÇFaا=ðZú·¥r:'¼?ƱBÝ)§,Ž~‰ñWµ¬Wrt`m²?/öYA7‰'Î-¬`ÁCF MÈñò=R)_’E6¾RãX ;¬ø±¬3áù·„•qF˜Ñ S©Rau| hˆ'"‡|ièù³z†E‘„cŒ—ÏÂö5C¢Ž+ñµŽ1½HpÏùQ¡>ž]´KÎ0ýHJ£ˆˆ+  ƒãm¶ÛAJ¢Ü“¸wÇïî¤ÔŠÇ 9E}>äYq?§¶êjWFÒ‚²ß Ãí£à-\àùzTz¢EI“QùWK8úµp tGü;¶˜Ž l¸cDªÉ”³¥«¤. ±ŽÓsG:‰¤¯`§ðVaè3ÉÚ*kÈÚ¬!Gzs÷JQáú@0ž’Õ +ôÞKX$Ô=²{ÍY•â}´q÷êÃ3f¼<[¾‹Û¼oxTº·¢ˆ™} 1Ýb7µªÚâwvpM†qÊ Ô7Ü€‡„íu‡ñ-sÞa Ýÿ‡ñmÝ×Ða ç A0¸‹œ+‡¡rÄñ0¢®‚”ÞSýï^½ÜʾŠjKôÉ(Ýh6Œ»NœëvwCÃ~ÖA|GÐÏ ´Œe$bŸ/qÛ…NÈÈõ¬™í:gã]w–È‚§Ó4£ ˜‘ñgñô\%E||\n7Ï·›ªÇw tOëopi‡¢[jeFÏÍ ä‡MD[xÝÄ5™—_±Cl€ËŠL%Y÷¹ª_pÎéN²„Ëm‡o0rm»Û1…×}²B˜1üsœ4ø…sÐ`ÆeB=hêVv§¶®R޲®t #?©QÔ¾¼:ô‹¼”‡þ¦…,ïˆé…Q ¾›G‘:3t)ûª :öUL蟲¬ÛxígRù)Õ!¿[Àq’ÆÅžÎÍö~¤{~o Ëß5ñýŽes@>¼H„ãÒ4™8‘™Q〤èáÖjE)ÉŽC,ÈÃÁÐs•óü–pVÏý]Etê"Ð]Å9Õcj¢ÀÔ+I’–ò³ºçÐ÷Bˆ¨³"E˜”)ø"oҲݧŠÒ÷ÖèÃúš4…0ØpÜáŽ79Y!»ÿn wÓd~K~GôvñÅ6wV endstream endobj 350 0 obj [ 349 0 R 351 0 R 352 0 R 353 0 R 354 0 R 355 0 R 356 0 R 357 0 R 358 0 R 359 0 R 360 0 R 361 0 R ] endobj 348 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 350 0 R /Contents 362 0 R >> endobj 363 0 obj 2483 endobj 366 0 obj << /Type /Annot /Subtype /Link /Rect [ 301.793 747.389 366.807 756.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 365 0 R /H /I >> endobj 368 0 obj << /Type /Annot /Subtype /Link /Rect [ 130.0 695.065 191.469 704.065 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 100 0 R /H /I >> endobj 369 0 obj << /Type /Annot /Subtype /Link /Rect [ 198.478 695.065 295.698 704.065 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 100 0 R /H /I >> endobj 370 0 obj << /Type /Annot /Subtype /Link /Rect [ 387.244 623.543 420.024 632.543 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 32 0 R /H /I >> endobj 371 0 obj << /Type /Annot /Subtype /Link /Rect [ 427.714 623.543 519.944 632.543 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 32 0 R /H /I >> endobj 372 0 obj << /Type /Annot /Subtype /Link /Rect [ 222.097 611.543 270.987 620.543 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 36 0 R /H /I >> endobj 373 0 obj << /Type /Annot /Subtype /Link /Rect [ 276.792 611.543 381.792 620.543 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 36 0 R /H /I >> endobj 374 0 obj << /Type /Annot /Subtype /Link /Rect [ 491.607 611.543 523.277 620.543 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 39 0 R /H /I >> endobj 375 0 obj << /Type /Annot /Subtype /Link /Rect [ 130.0 599.543 163.89 608.543 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 39 0 R /H /I >> endobj 376 0 obj << /Type /Annot /Subtype /Link /Rect [ 170.299 599.543 255.859 608.543 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 39 0 R /H /I >> endobj 377 0 obj << /URI (http://www.neuro.gatech.edu/users/cwilson/cygutils/cygipc/index.hml) /S /URI >> endobj 378 0 obj << /Type /Annot /Subtype /Link /Rect [ 259.14 504.021 276.35 513.021 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 377 0 R /H /I >> endobj 379 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.015 504.021 523.275 513.021 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 377 0 R /H /I >> endobj 380 0 obj << /Type /Annot /Subtype /Link /Rect [ 130.0 492.021 170.28 501.021 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 377 0 R /H /I >> endobj 381 0 obj << /Type /Annot /Subtype /Link /Rect [ 271.668 420.977 329.428 429.977 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 124 0 R /H /I >> endobj 382 0 obj << /Type /Annot /Subtype /Link /Rect [ 336.651 420.977 480.791 429.977 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 124 0 R /H /I >> endobj 383 0 obj << /Type /Annot /Subtype /Link /Rect [ 178.32 384.977 204.99 393.977 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 121 0 R /H /I >> endobj 384 0 obj << /Type /Annot /Subtype /Link /Rect [ 210.82 384.977 293.59 393.977 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 121 0 R /H /I >> endobj 385 0 obj << /Type /Annot /Subtype /Link /Rect [ 150.918 297.131 206.286 306.131 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 266 0 R /H /I >> endobj 386 0 obj << /Type /Annot /Subtype /Link /Rect [ 214.984 297.131 361.364 306.131 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 266 0 R /H /I >> endobj 387 0 obj << /Type /Annot /Subtype /Link /Rect [ 496.604 297.131 523.274 306.131 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 269 0 R /H /I >> endobj 388 0 obj << /Type /Annot /Subtype /Link /Rect [ 130.0 285.131 157.77 294.131 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 269 0 R /H /I >> endobj 389 0 obj << /Type /Annot /Subtype /Link /Rect [ 163.787 285.131 341.267 294.131 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 269 0 R /H /I >> endobj 390 0 obj << /URI (http://libdbi.sourceforge.net/downloads/) /S /URI >> endobj 391 0 obj << /Type /Annot /Subtype /Link /Rect [ 303.31 261.131 320.52 270.131 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 390 0 R /H /I >> endobj 392 0 obj << /Type /Annot /Subtype /Link /Rect [ 326.35 261.131 486.9 270.131 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 390 0 R /H /I >> endobj 393 0 obj << /Type /Annot /Subtype /Link /Rect [ 389.914 237.609 418.794 246.609 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 63 0 R /H /I >> endobj 394 0 obj << /Type /Annot /Subtype /Link /Rect [ 424.396 237.609 523.276 246.609 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 63 0 R /H /I >> endobj 395 0 obj << /Type /Annot /Subtype /Link /Rect [ 130.0 225.609 267.23 234.609 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 63 0 R /H /I >> endobj 396 0 obj << /Length 397 0 R /Filter /FlateDecode >> stream xœÍ]sÛ6òÝ¿‚o—ÌØ~çžÒ¤½ÉMÚ:­oÚ›ºE‰¼P„BR–_ ,H€ìö1ñL„]b‹Å~‚ürþnÄO‡$Ï‹ :^}Qø0ÈX¥ •P³„Ò(cÂ’à¬QIÐ cÀæü¬æÜ¿]õW4ø×Õœ]@îrEŸa.YýzõÉMM€ñ·$ WßÝ]m~H‚w{­â„‘,d”†y“ˆâ îŽÁ¯>ôãTv]9µ¼ýgp÷ï«ïïV{(%ù·¶ÕO+ÁT²,#Ô6!É&B`£x´Äq•w€¿ÏŠL‰©)°k=ߌpÏN³Â°(²¢€G$_™ND_2˜ofw®­0!×ó›Ž]/y»ÛµÂCÀSž‚×A’4xõÄÏÿèºlʇz&¾ ·ç¶Û-ôp;•m¿€§¡S§ñP#¬9j‚ý2,—Ѿ¾,ã®ÝåÐÖšäÒ´U£©-aÏõJ§r˜|«LMGlê†QK9@ú]9ˆ=²D½{:\äÆܵã4´Û³Pà‚¼uî»zhsŸÇz[0V¬ë³ÌÅÐ!RoÛ^*ÄæRÄ$§¥i»\ê©)5«Š÷ê¼.åÙã¸çý£†å4î_\_Xj  °;Ñâ•åÑ ÎHS%EQ Ž’þ‚ï§zû ÊÓ©k+¯Ç™ëá3ÎI“¸E²»g,±T‘x¦-x†)„9óîs;Y¤HœW²Ìebÿa²”Ä•4\ÂfšNo6›ËåB*)©øÑ1ƒˆ¤",å4q9üé̆ìÀ`v‘{v{mHúþãGRh`B8jÀÒg²hmÂ÷ ¸:CÝO/.PŽ&÷½{Xyl‰?5­  aþe€(Õ®(„ Ù 5åwÞ[é€9p0üe¼+§r‹ÚGDÝÚ¾& üO_b0£á¸*{=n87mëéR×ú±%c&„ÅD.{¤ýñ ¤´Iâ¤9ó,+Ùa9J耮`©‡ÎˆËǧñKç Ë1ä¯"Ž)¥Ì'¬—…þ“Ô>'#*2(ð^E„EóX:¾É`‹Î!a;Å@-H Èð4džEth³éŠœ€âÀ>“ÐC7¯f«ŽÑX”%”fqâ!3Tw•…þøp°O€Šê n1Óecë/ #ð°jÁ|šœ…u4šsþ¥BÑ}º!ï§t§‘gYPj;ÕÏY§¹wjdM-äu€…‡F˜oâ-+àè Žƒò?õGº‡U=êóZX:J" [ýaŠ’&Þµ ÷f-¯pŒääQƒ˜Ñ]GüSá/NÅ|¬0˜’`F-Ä@î¨ ;îËËaN­Í`»p“†„-­Ž‚TÒ”ãSó4IPâ†s¯nŒçÜ(-¼%jeº4õ`ÌPñT-Ô•½_•F4â—zÿþ»kc‚±•Öåx<ï÷mÕª M=ß?GçQZÁ,¥•U-N åU05ƒ(±ç">>ÛY X0öKYk•â`›‘( ÷`J.õš•ÇwiT˜3=ÖQPãî!:ˆ^aô«ºSAªôÄãS(Õ{**@C.<1o=E‘(Ùך˜kéT˜í$×´fu?Ÿâ.å“p5+sD ÔÃU†O×¾‚07Á'FÃ$a0æk:r©˜À}wƳ-0Öo ²cùäQRTXJÚή.ø©.m7ò~J€æª7¨ O­Â2;CkZ?’æØyªyµù¨œš‚}†TíÝ™îË EAD…,3«&PSHç¾óm#BØ~S¢®‰Ó2Fıh¨úòXo Ákl¦ÙaȈŠï´¢¹_4VÿJã—Ñ Z ÏN#8ÞõNÿ+[@NVÅÅÍ X@1¾§'°S)ªŒoc=‰4$ç,Þ»kèƒ99·OŒ"(ÜcXZ¬—úDwÞ™ ã”dK4EàRbBSŽÛã‰ƳÛóöˆÁa¬ìpüãÛ_ÞiHìö6^kÔr `u  u#àB×GêacÌ­¼9ÊK¨+àJÄœ•JV‘B‚qW£ #Q"CÞ êÉ€æŒÓ¨AîK3¼vEêýn{s‚ÝùÎ#>b–CÛD#©±¦€Rqû&Ü·ðí_ jƒª†jDÓæ4ðÿŽ)”mƒ4‡–ø%aèaiÇ8„"“à"/Š®âºÏÍ’Ü"»ÃR.-Ä™WîëJÝ‹!J–}8Tö¨öÜÕšÔà2Ô_Îàv»×Røì¬Y«[©b媋¤ÂðµÌìFBÄš°&FX׋’£…ŒZZ}^è@´Êd+¥ÊA„gßP ÞýŒ™ïÌ%0ÜÕ§ZÙ:"¸ùTìïÍ›_ꊻkÿ®)ð~óÁï?~|óæV ‡kÏærö¬kŠZÄÎI)‰B‘ÀÓÂCúîöíO6…(< Ó¦I죜 ÿ('¹ˆìYÄ<óÍÿSÙ{:sÆB"ó"b÷Â?&â¥ÈÃÌ3Ý“bÐx7H˜d³SȳgLxÓ³kD]êíixÔÙ›it?=™õx<ŸæT€ˆr\qÖÀŽWg±º¹Ž±È\/+1á1K+D׎*i¨u¹·ÆòcÃÏ'…ZÂÜR t'>7µ<Ø·‘i8T 4 €Ùñ  ï¶Õ|£ˆ0IgÏBeÿuXœ,‹e½g¼c$ø8¿\û«w`1øy’çPS¼xìL›?OIî$Ÿ,óR¹Ç¡ìÚínÛÄø"ÐîßB¨(XžEâ“Ò wœ)çË#¼¥rÿ*¡t¶¿ä3à˜Ã(õlÈñ®‚AÙªny_’\%w5ÐûAœ¾6't\Y+‹5#8½t1øxJAЍŸ;„ÏAC4XÍÜ ­¸$±fæ`xâ8Mc—DÆá\„aç 2$Yžb’Ô%û{GsãˆA2c)ˆ”³ÂeíQ œçqîDË?W £»„u÷ð\”I˹›ñTWí¾­<Ú.âõÒÎ}ªð]BeUñ#ä'Úru-PR› ¸1Wµ@3·ÞŒâ71êŒ|?]ÊÕ¨[ýEÁÌ^}R 1p”îÎH(«Ë-¨Ø dZŸv ¾Í0êgë8£Dâ³€ ìÊáìë°ãœ$"áÆ0É!pò3KtCî²G³Ey‰m½Ð†õ/w£ÝDÇÏç[|‡§[ÖBž‰ óƒMº³=ù:‰(“ó$J^Šëî<Ù·AÖË—oN丯erG­Çßµ[ñvr—âA,>¯M–øQ‚e'3.ª1TKh¼ºNw—v^÷dv â…qêÙØv:‰zÐyM‚Ö)Ìs‰–µÜ—PžRZxèÌ’mÂ’m3Õž€›@ºZÓ–CÕ€Ño¶PD´\üå/d¶ÓÏ?´M),ÂÄ':Iyø9w,2{‹3=Pù˜²ï‘áb” ThBýS9lE€ œQ¯$”KFDIC«lI úÒ¦†E¦ë¨Z̯-ƒýÀr=t©U%#¿4™¦iR¨#ˆé™zsþŸÔi{JAÀRùù^–„Hð^ö ª@‹—.DŽuhZçc;._§Hœº]Áލå%·ŽêÎ]óK"Å›ëñ|ï.ºú@/;Õ§Ñlà'u-/á{(ž- ›‡–cµy·x’ˆ51KHÖ÷¯(¿Ë>(wǶß^”> endobj 397 0 obj 3568 endobj 399 0 obj << /Length 400 0 R /Filter /FlateDecode >> stream xœÍËnÜ8òÞ_Asp›M½¥`/ÎL²ðb²@Æ ìa<¹Åv P‹=ÒãË~ûY¤DêÑãÁ^’Ì*±ŠõfûÛÆ# þßÉ?ièÑ4ÍÈþ´ù¦ñI|Ä1úcñBêGäD\TD*Ic-|³‚?Î^€ä?›zÃÈ?7¿ÿ{ €î²a+Ì«ÇÍWK6½Ö?’|Œ¼l>î6ÛÏñÙFG>M<Ÿ1/%) üLþóÉîD~¿y¨Û.¯ª¼+Eýþ²û׿ÓÎÑ5`Œ¦?šª_!T’$¡lBŠM€8À GùÉd â)5À¿«"³™ÄÌx=?Œpë“À.Ï˲$ËàMÐ âkóÃh7_Ê%©B@5Zw`¡£=ì÷iàeŒ1?DCšRÀQòsÃ!gêÒ9)ò.Î[Þ¢A¤=Œ¦$€#âL#»¿‡o^FSró?üòÑ‚ [ µu——uë N'Q[ˆ²>ˆæ¤2ÚÂvǼ³7Ù,ÚcÞðÂB<¿Z” jø7¼ÞóA[j!A74‡m€0v pU%.ÒŽ’0ÌÀ¡7-ßKÙ[ Åÿ²» g¥Å‡¹¢t1 b_ZWº“׺C¢.ù«Y¢ÓäªfUñÎ,ñ¤íçdy^Ê( dbÄñìtphñ\ÚYÔú,¥™J*ÍhÍÉǼ.ªA‰nÔ§´®—[ƒ|î‘!RÍRy*¯ Xs^´džϭWí`‡|ng¨^aƒä¡®Xo÷M©üBŽâBÀŠ-˜¯?»YLúvšÙÉ쫒×]K¹ jø“š‘P{R8ÕÜšáQòåõñ믫¦‘=ys&@ígšúÃ/ iLn 2¤ð:W—?‹ïüÖB˜Ô@hQ«ƒÊP ØËÊfs@i ?îW÷´“ÉR¼DTÙ®ÜôµËwîQÏ'æ ˆTÂq"§ i„èH¾ß‹¾î>«gKV2ˆ”±0Ò‘Bä¿ÉùÉÒÆÿþ4Ý&ù%Þ:¿ígϛݳK4˜˜ä.'w=„$oêüÄÉÝ…œó¶½ˆ¦¸ªRÌE¸y>ƒþ*…Ô†þ Ué|Uy0/-lÎ' Üœ§².Û®É;ˆmz:7ïGÔ ¡ÄLöpÀ«#¤ÙSü÷Uga i!gí2¯ŸÍ¦p*-ì=Brká0ìKTJY{e)ºµçŠײBôäŠï^qšA#ö¼è›…÷ƒdbYCy^Lª•Ê4cx»¹= |?öh¦Y§:þ-:¾ ’‚'Ž’,Í"Ç;A,3S79ª{b€h^–b0Lõ¡ø²,ó;½¶ßªâj·äAïµÎÀˆ“›§ÁÞ«kÁN BówÞ<½·Pº,io-OˆÓ͹µnøIt6÷gñ§MרŒàŠ ]Oß”Ýë$"¤7²ÈU¢@¶žJâ0@¾õ%Þˆ(»ÛÐM '¬ü˜!¬Æ¸Ö­?-`µêøð=ePA’hA軣RšˆÐOYÄ>ÌY–FA4gqm'‹ÐjèrFY%U€"¶E¿üý‚(¡a#Pà-é׿A¿²"Ìe ™³0Ev½Lûáòíú}à'ÔO€Žù v¹›‡\Àwª¶pŸ\S.õiÈù0ÈLî¬y¾ì ¹²-tVÁÐW[ÝE `ºýIçBo«\¾Ñ(…‘7 ù$ªt]­\~xÞ›I ‘ÛZµÐ¡Úª¬Må‘ëcÞŒšÑKQ×#Þš»¦ôÃT%§Ÿ™ÛIö® †—혣Úòd»ðZ!S(ˆÁB‘§ÛÇ'hß'û¢¥}5ɇ±¬’‡@\ˆË-‘EZ*8ŸÞ ›´!œñûrã»õ)ùêÃí8ÂIf¡¿Âlq~c ª¼ÈÙMÍ¡w ÄÏ¿}ºß}"¿Üïî?Þ?~"¨ÔU¢p&†3K.raQ–úIpÍcó}»#¯mûƒõ+›ÔX]V)ëÁ-”|†”ÇR ªÒ¾;B^„ÔSî½ê©.Å,†Š’°+žšïZôTe=‹Sæ%¼ÅSs×SÊ+äd۷Ͷû¼ÚªÒ­ú°…­¸¢E:S«XQî©|×](‰äO6äkè¢;ZL¬<76oL.Áü¢çÄë–O¡ùKä~œ^±ülײå!ã—™­Y~Fð[>ô®© 3ôL¿´} "bQ–®ßàŠü¬Úéq^ÐÐ9Ç^È|«;ñõÑBÈ’¦€úW½ZXœ5 / íE}(_zýZ¯‘ÃïKœûuÉeÛ Œ{賦3¨´ T7×&­8ñ‹z–åÕðáÄÐ…ÆžºœwîÌsÞg4õ@\J|ˆ×Ÿ‡ËáÎf¥«ÔâÂÞ/¯÷_Fo?:"vÇÒbe¯>‡’ ÛoDè&Ëì\°T[×m>‹¦ÓÏ ,¶Ð¯MˆÒÏå*m`xÔBÐ> endobj 400 0 obj 2276 endobj 402 0 obj << /Type /Annot /Subtype /Link /Rect [ 490.495 701.121 523.275 710.121 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 32 0 R /H /I >> endobj 404 0 obj << /Type /Annot /Subtype /Link /Rect [ 130.0 689.121 189.44 698.121 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 32 0 R /H /I >> endobj 405 0 obj << /Type /Annot /Subtype /Link /Rect [ 195.917 689.121 288.147 698.121 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 32 0 R /H /I >> endobj 406 0 obj << /Length 407 0 R /Filter /FlateDecode >> stream xœÍÙŽÛ8òÝ_A ¤´i‘ºƒ}I&É¢›™dÒÁÎ"Ƀڢma$Q¥öXì·oñD]îÙ·t˜U"‹UÅ:Éï‚ø·•?‘GpÅh_l¾&Y.çÌÏ v&L*R†;k‡üCGÖÁB\äÈ´ûzÀÜþ£\4Çšõg¾à/^„ˆbßuã86‰óVò,?tS´ÚC X·¥ñ tàyÎÏYy´ppER¦†eš»e5/,°s–nC)0Ùïy[6·Š_!–XcQ±}–ä&MàÈ1=©/žh%I‹¬ÌDS'Þ0$Øëù_oRV±25jÐHmAzÜɧ!<p8³—YõÑ×xøð[k‘mN™ Kíæ3·ödMgá’Ed"» Ô骅¬áÏ£}Í’†!i+E’•¨ÓúËÕÐ/™ˆ}¹`ÙNèZ±š—&Îs 'Ói¸No1.­ÑŠ@ÛDæ°V°ºL †¶gT%Bœy^IƤ ×\“BŒwB5ßÔ;Ÿ¤ .J—ýöòœ»ý? e`’ÑØn¹âAŒrÝÈ!ÔD »ƒòˆ0ñàèJÙ!ióÆÂÖ´Õh†Ø×ÙƒN‰¡óqD…ëàhÀ’¶™ öAÁÌe,·¢ÊY"lâí³?ŽS†@Í÷,më…X@Á¾Gš‘É’OÜŸÙ¶´½Ñ¹”§jC(dМë/¼a«– WP¡çH£}Ö qüyÜ0ÈYÈêðÊR S$ êNBC§Äœš;Uj¨ª³G(“Žæ$Ínç:kØÚÇ1±wo&Ú—¢C¨‹.ë2IÉ(~WZ@sJ ÜÃYÜZp’¦$xÁ nCи<ûƒYàªCS8êCc-ßœÇíU£9.ÐÍî1©wMQéš8ÅU¶K]ˆŸ4‚JÀs£º¶¤|$¶Í´‰þ Ê„´6&˜C‰¢X…Âìª>È2¦’U(åµx€uXÐc½t<ª? P}\Ò”dÊñ¡(¥A´ÀA¦[$àQµ!‡ŽKŠ¡ô*•©¯}…¬À±gh\{ ÄR(»¿¾0:›š±ÎÀ¶ZtF7*ZP4ã˜Áš\;Buûÿ³šFÙ¡ue¥l-ô Ysঋ\³ïmV÷Ó3]ºëè†Æ¿å°sgµ ïF&\Nö^5~7ðqH\°}º$ëVõ>Ä@`J# FÑ'87™Þ®†ÅЬ«ßuõ U¨ôª7•q¡­qÈÙígI:L¯‰$wñ#èþƒp‰J—±WE"‘sm½%¯¤Ÿ [Pn}•¾ªƒ§œ–(ÈQ$öX© I»î®Qpm½ÅÏ>ÏL7l‰-–8ñ³-˃ÔmÁ_o .ìÕ‡š‰Ó‚CFÓ : ê`íB[tHåèjô¹ÌþÜŠæ¢z<…[E?U;‘>«Ž ¡gh®Ô¸äݨ/Ú œô”ô‰©¡©µ$ЧÉÁ kÄQ §]à}¦üt9B%Ôƒ¯›à‡~8R–F´¢‹¤*JhœOœ=ªÎOÃ}TËæ9Óø®7𡵕zÛÿ‘U^׈V´@èÒÃÏ^Ù‚?Ãý‡_Ë~ø†=dÉê`©Ç²ºìåWzø0°óãÑš” „Ô!vl)i O•V¡xörA^: ‡¬VfM©ªÕv-ò°ç¹²Eˆˆˆ¶§ Ûèõ¸C\ D?º@å¶'‡P>Íq# å2 ¯óÔiäJ<”iÆsÏ_bL7Ã67O–"±‹£0PEÛœÞ_­DükDzŽT2¨Ž÷CeFz¨z&=Ôݺ9¬¶,uU:ÿ¦ uØÂ>œÃrg²‚VÊvÙ’W¬.2!/¡™O…¶ †ÞÉûFép–×8ëîËRÖ$Y.ZJÏ÷qìÈðN4<õÈÎ öj…’pÕˆäå½¼ ©¿@è‰ â¹P[€[xгÍWßÊíÁý“\ðÕ Ã㸟ַzHg­©+K¡ÃS0þ˜x1Shæ7~óyÐÇ$¨»¸Qu9D攟o‘Lç’;óqýâèúj±íá`>kñåÀ§Þ ±•§ƒù­ÜôA ¥’"Ú¾EŸ¹ûé×7oŸ~ðÝ`ÆÀ“O¾áÐóã:½èÞT@¡ºå‡£ ¾a ñP3kàœåùe…IŽ\ÚD,úãë…«¯Ä&µ5ýóý»m4æ ¹…YbNœ,ø0î®>ôVåìp`òåaáœCg¢1Vü£+!k7ÊÕ‰z‘6š¤I¥ñúj§³]y¿PËÅùe!*øƒèÂÐñ¯9È|Þ½L?Ú ;û+ÎлjzÒÝ´,9Ã|Ö¢3n¼BlÅæ *eÿ#(ëÿ?^ÑÔª«âúdÆáÓfPœË¾: ¡†°_̈3º¢QwAË™Ft/fê^Ì44¼˜iؼ˜iÀz1ÓˆîÅLCý}Ÿ‚¬3è_Ì4h¿˜iÌ+ešËBT‰½SÃNꎱJ4+gÞ×™"®AËÚ{œêäõP;­ƒ+²c[+¹5ª“DCÊõ°j‡-ìÝMô2tþ{(q‡å•ÖÒò°€åBÝßhè^?h Rïç7ÿ°7 endstream endobj 403 0 obj [ 402 0 R 404 0 R 405 0 R ] endobj 401 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 403 0 R /Contents 406 0 R >> endobj 407 0 obj 2555 endobj 409 0 obj << /Length 410 0 R /Filter /FlateDecode >> stream xœÍkoܸñûþ âPàÀ–%ê]ô‹/u¾Ø±7hŠË!ÐJÜ]ÕZq#Q6Üýír(‰z¬â~ËåÏŒÈyq^ä~_9ĆçòOä9VÅ$=¬¾kºCBJÜ@“|Ûò¨oÛ.q<‹úä@†$ŸrЂ?ƒµ€ïÉ?WåÊ&Vü k2bþç•}‚¹bõ°údè¦ü3ég“Ýê·õêâ½O›¬·½‹}j…µm'"‘åÒXþGÉú@þxs]Ö")ŠDä¼|û'YÿcuµØêÚ¶ýl¦~¨¡†¡eCH±q‘ä(? £(e@A ðïI•í‰Æ¶©ð4z~åNN«'ŽÃ8†OV47Z ˜ŸÆºi¬P©×B¶L³¤N«ü(È[rîZ!yóœE‡ìXɪD°Ž ö=\²”ÕuR½ô_“MÑÏØ6/s™|uGKʬƒ·¦¤¼ì×ô+Øs?%EÃj«Ãïx-v{øt3¯zÉEž2Üß~¾C²´à—%ãøOýHãɆS¸¿ü¸&W7WïÖäö#yw½~XÿëæêŒÜÝ>\¯¯o?>œ‘û«÷šøpuwy¹¾½ªøöoÞTeR|ƒPÌjI80‘õíÿåÇq&Pÿµ› YÒÁ&¨|®où¶bG¸Ç³"‹Z.ü#P rÁÚÝ“‚éø!ŒgAèàöû¦”‰L¶¼(ø³¬)?díÚVü@ bT¤â\HÞ”BæÁD§c8–B#jÅ )¶l6yÊ5ÙI]é“|âƒéÓÝD'–ÔX¥`›z§sCZ;–Éô ÃÑãh›[Ø…›ÉÚîi~sqÎíAOódIuêøSQK'LÝÐrdÉb_†[Ù(häq×Ô4m+i aPj& ä˜+dÏ̠ܰ%þ4àÂYm ÐL†Mn¢*žŒµŒÉüé Ç‚Ái„f€ ÕïcÖ`Pñ”eM5n‡Ò5^õ–øóž•„±c›ïš ãKR0úçã±ÈSuÛ²4I¥ÙP礩¦ <2vœ±Îhh¡NÀlÜEFÝQj~`ÏÒ[…8€ †iƒ°V[Á'k uŒº1U'Û±?Yx¨ï.íîÄC„åzÚB‚š¢LÕ~ÍT6øØƒ°³IXT«t9t½p‰G§Nð8DÑˬO»24=W×FÌeɩ𝠲§Vì,^¬¥IÁõl+„‹¿íPzzVš®šv/ÉL>#Ì2›m]ö̆4#?,', ¼‰ðAóœëinXž “Rè/^$¦ëNO7Æ,Ñ•^ù©à²%hêâÐíÁ ‹Âœ;^pú\¦«fÏÅsé f'Îeº&\õû7óŒê}R1}B° !ë‹•5‡£…Û õ¼‰nËÇ&7¾CÓÂ0ÆMŸkt÷>ßÁÝQ)Àݘ‘²9làÆóë—_I½ÏG¨áϹØãü™6•ªÞØHžXU˺ۦ8V U-Ôë’7™=ê?‚ÚäFfÏ"²?|øýæâËï7¤nŽG^ ¥O½X? $}µnÚÛiõÉèy?&é#Ü’ "ŽMWæöhbÀúm ý’eê¥!) "¾l˜üôóCû]¼€U{Æk¶¼201°@eˆ1H|;†|¨CGlòM‘ó]•÷¹~Å 4’Ý}­ z\yÚÀ“Êüšã“&ŽžÍ@Z}3=ŒÝæ;Ô¦4í+4Ê„˜´×õ!7ò-B­qã™7ã27-7²s1ð`ÆÙýõ-h¨É\¹suÐŽà›Öv8³–¼iD âÈ‚‹÷¼):.õ‘õ,“€j!TW˜È=Ì;ù¥`;ýžèÑý`|ä†ìjÆG¾=²Ræ)©_``?ÌÌä~ íA_¡ž§óQJ8÷ƒ…ãܬQ0êÌ@!£k™Á—|gPT½êÑWŽ-N`…A×8¸ëO•=Q©±Jƒ ËåÈŽ€·Å™:3¼MÓLŸôŽŸ¿zú‘7â$àÛ»ËõåÍí‡oï¯o®N–:ð”H‡èõä<å/8“#­ ­Ž²ÆSCÄ“:$U‡ö‡…¸®©ˆhÅ;s"j‹ýÀö8©.K% ÒŠÀÚ%{F‘C‰Ú¼`wzuW (µœÐ³‡ºfWò±+A©aºªÿ¨Ô"”uâpxÑ”rû—B‘uö ºq rǪ¥µÏxÑØ b·¤~e¦Dò' ˆæÈ÷f,32e“—Ëc~è,qêën“Çr¨‘tÏkÃÆd,ŽX›ÎsÇvä˯vŽAQÏj=šµWÍ–Ð^@UF´ÄËÚ@º“Õx" :êÒ$Lù^V™2Û÷”V`%S ÔLPª^RxÌøjÌÐ'›&W}EN’ú™¦VÍ ê•Á®!ŠïI«G{M6~’AŠ2AñÛ¶Ž„´©?äÿé÷ =Œh™ÙVGP×y1ô:¯ˆé þDü6ϲbÎ+‘3òJ7õÅÆONˆ´¾?;ñ½­—uOj(…¤K*=Ù(Â!©õ4ãoHÐKcwŽT§QÐw˜©psåk÷yëåö·±ÖuÝ…UÞˆ¯ —yߥp÷gØš‰>üØ#sãi»#®,I÷º°ZÆŸŸVÿ44Áñ endstream endobj 408 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 409 0 R >> endobj 410 0 obj 2417 endobj 412 0 obj << /Type /Action /S /GoTo /D [411 0 R /XYZ 72.0 699.53 null] >> endobj 413 0 obj << /Type /Annot /Subtype /Link /Rect [ 154.99 747.389 231.38 756.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 412 0 R /H /I >> endobj 415 0 obj << /Type /Action /S /GoTo /D [408 0 R /XYZ 72.0 300.294 null] >> endobj 416 0 obj << /Type /Annot /Subtype /Link /Rect [ 183.86 701.03 258.85 710.03 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 415 0 R /H /I >> endobj 418 0 obj << /Type /Annot /Subtype /Link /Rect [ 418.457 619.937 489.056 628.937 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 417 0 R /H /I >> endobj 419 0 obj << /Length 420 0 R /Filter /FlateDecode >> stream xœÍËrä¶ñ®¯`íÅÞ* DðÍTå`o¼Ž\Þd7+W–+Eq0f9Ä,’æïÓ@ãE3VnkÔÝF¿g¿^Ñ „ÿ7âO‘PReP®¾*: ò(ˆ3EJC’DiÆMH”‡`NJƒVìq€HCðg¶ð}ðï«î* ~¾úýX³ BØ÷|ža.Y}¾úäȦü-ÉW?Þ]ݼOw;«â4"9ÂAAâ¨ÿEÁÝ!øýûÛn«¶­Æ†woÿî~¹úénv×8 Iñ­]õÓLD0•<ÏI¸4!É&FP£ø4d‰â)3 Þÿž9\Iº¯­ç›î¼áä°ŠÒ²ÌË>‘bf:qzÉ`¾™Û­m%r¿t²ö’¼ (\èûß6»†m‰&ÜíYÏv¼7+šÑ@ƒ††jg¾\CÛþ´é§Î|Ø;ê¾9ZFf ï·¬÷pbu³5'<ïÙ¸·ËN|ÒàDuöïÙü<|OWQ¸Ð‚ýrã|m‘²€ey‘­7ªnªÚ Yų¦%‰‹0 “Âs(Y –D$+ÄÓäš;y™M‘“ÌQŸÂëžU#,atW*©`…m«±z¨v}f5¨pû°µxÕm+ç`ÞíšÇ©—w¶ä]Ó²Á9 åÕöœtÕSÕ´ÕCËÖJH“…†ñ¤'8‡{q$T”¶ÀºšY’¾»³o·Ú¼^9 Ò²ôÒºæS7Kù¡m-2î«Ñb#`ËvÎiâúHF‹jO~#_ë*Ë@We‚a¡®Æê ê —ï|M)T%˜d˜ÑõîÏ?øvƒ=óÇ@<çrw‘A<³YÙ³ŒkaúGDâr ' ³xe ëBxç$E )HD‚èW§£e™8 Àæ¼h”C1ç…ËŒ’àÝÌX¥j®g%Mr’"CdŠÛ?ø³´Ý‚”úQÖFHsp1na´Ø3Û[þPµÎâ•{I²Ý¢[&âÁÛ:‚ugNXÜŽV'ƒGÉ9]HÖ³š¬Û¢ý$&ó"XóãÉ :ZšJÁ~RV¦ö†£Ã½T‡cë®X–¤»NLU°f>T‹läýÉgOE¼¸ê2 Mä:‘@ªÞÐUGáá¹÷V‚p˜v»æEcoˆºâ³”æO¼1ÜDñÜ7#>¦$±—fpñ•rŒ¸¾[Bðœß‘Ê"~@E[C8Vã~0^[ÁÓÈpd­òRµ, c‰ˆ¢Jv+ kC¸»x°Ëõx„1Ð#çöhàÞ Mù ¹eÈ9ò¦¨\pª>¾`y[K}ÚŒâЄBZKòYÝѰ T¤®WÆ(nh 9-Ë=L±Æêë‹…Æé ¡Ö6c¿ 5/—WËE«%üØ('pXõü° ñÎS¹EP¿Îå…"öÑ,†tlüÈ  \GršøÊ8žÅ¢)‚Ú¡È=ÇjM“ÃiøÚj'½ÉÁ£.p¼þÿeŒiFò<.‹¬ˆ.Éx||­Œ d› ¯_'—x(¨±ÏH²4#{•8TtE+NRSâyÌy ~lQ“°„jÚÙ?2~•”1”%¡èõi™xxZ EqßoUDFFs„e<1¤é¦ö¹„,š€ûÒˆvoZ Ö=6#¯­l£2" ÔÙ4Îr·²le+D–Ò™3 i„óge®0PC Ÿ§ó°'ª¤BT˜»jjG‡âFz‡¬¼‘ ;"… ÓñÈ{Uh¾N—¥H¨”ÁݸçSëîzp×ÿw\¹v°ÙEÑðÖO]§^UQþÅvûÑ“bø¢Tš´í¾g¬ê»öênYšX;Uç`M¦M!·Ÿÿ IZnèµC­¾Tö+Xy·¡Äݶs,Ú5ffP†™+`³“C Ÿˆ×gYî«'O€ÛY(C•œ §rshº|EÌè]pf¡¿ŠZk:‡ôS£ænš0 ç¹kóÍW‘=‹tI_cß%d¢Þž5þ¨Œ Mó²(SÏæÙýèW6­ŠŠÌ¦BšË¹ÎÚ%%‘αë£6emÏôŽÒÅjã›ü={Iš'8÷J…E`XC¸ÚnÄ‚o´|Þ³ßØ…`ŽýÉ¢ªù[²¦fc:Kq¢Ô|t//¿,NiYèúŸ8øÜ6*®#ª "fdèд ­q‘i05ýÙíô4kwË+«»L#OÊ2.=ww hžÝx/ƒ¹ôõRÃÍ-4ç/— °ÌÇFê6—#ÃÛÎÂ:=(TÅüÁR0ê+Dõüˆˆ"½·(«ê½ÅÜlŽ”{ÕÄ#¶#¼>·YÚÖý[v’eÌ?T§@„Ä@ä0Œ§ªoø46ícðMÖ³’dÊûó\r³¾4Çÿtl¥š%øª,på ŒŒ$˜P< †D5ß"5%.(l ~Ê4Ÿ«ã±çǾ³O\Z¯&×—J˔椤4¤!¤‘Yi ­ÂG>Œ=û“ú2MB’ÇI¹šéàsv3£G‚kôƒ%cØFXýþ§9¸ÁBRl9‚¸ñÅJy bÆcý­ÃQœâÄë/ltsÊ‘`r÷ý¤’ŠW0S‚¢\akÖ£›"Åô š€V‹°q[Dá¡[5Œ24[ Kô¹‘M”Zß>W§Ár®Ú/áÞ5{ù?5•eïQA–,Tp÷îãÍíGaýù\³ÄÐ>¶LÅ ‰jW—ˆvõ•néÒ4v¾vŒJ’‚q‚@©G¸#é¡FÝñúêGH7y–`g·æ`DPS_%èž­dóLyb’'y–‘Oq›æ¬L1Äê ;eË’Ö઴EĶkÝÂ]ê½çq…*f'Á~õ¾ªÙ»f²’0*Ê’.Æ1 ¼4#»a2¯E …V™§³–Š Êl‹¿H Áµc\aºZ‰â½w«$Eäåþ­ÁÜfV xÖ¿ªÓlu‰”ÊíF~8Bpötgó몟“Ä>Þ_ nÛRCº×}¨¼ÒÐþíîý¦ Em"¼ãýA^Q†U6¦«e;b;ª–ñî;»;@-ÍÉÀ¦ûô¨ º¹*ðöBª8’ •×BXJ J0ž‹0tÜS#%GÂCÓAIÈdTFÊ­Ÿ‹Ór<²e«LäÚÝùŒÆˆÊT#ÒÝ”?¨qæŽ×fšHË…&¦AÌ*Ä«ˆÞÌvñèÅž‚ÚSѰ,‹T¥{å z˜“0*Ý7¢}ŸÄÜJZKF,'’êåͰäyß@mv"§kr¦&&iR®©‡(Ë> endobj 420 0 obj 2920 endobj 422 0 obj << /Length 423 0 R /Filter /FlateDecode >> stream xœÍZK“Û6¾Ï¯@ÕbWI¾¹Åëõ®S©]g=[ÙTœ$B3¡€äȺìoß/‘”âÜœÜ4º~€óûCDBø-ÿ)Ó((ËŠl¿ëñˆ1Ir=”…Aga˜( âŒÉõPFZ¹Æ#bCÁ?WsÈOÝCHþþð˯0§&!¬;?„7˜+V~ôdÓ€þšä ÉþáÍÓÃ㻌D!yÚ9gqPDqF%)ƒ$®ä1y:’_^½ïú¶-Þ½þ•<}ÿð·§+]“0 ʯMÕ¯DW)Š"§.¤Ø$8#ÈQþt%Èâ.W#¨þ{Säp&qè <÷ž¯F¸ÛŽSÀ¬(ªª¢ªà§ ¼r¤ºç0_vs_‰¥\Vi劾ÒyN¢(¨Š" Ã8E]ÿɆÚ.X $9*¬ª2Ó ÞïÈkK¼ºðÑÒgÚ  Ü’cÏ,M-õ=}qà¿°ôIð-ë{.ãf88ÆÇ ¥Ã(3æDìA…jªBœÇAš¥U™gÅ\Ávõæó±Õ¼È~É 8ÈmVž~+šÓ°ò­óMÛZx /lÉ@ÛÛ>û ¢,þ¤ådÏÚŽ’Ù:?yÅw–4'93CFALÂ8ž³ûëß}üøá»§Üt„(Ën/·»7%ñ FÃ?y¿]krûÁ:l‹ évikaË·*Ê/AL¬óG“†U w¹ lðw½Î+'‹vMËzB»šH5¶£ nË =ˆÝé)à f,Vf)dˆb&$ƒ ¯TCØ*×;¥A'ÖM·'Jùf–ož–@õ,v…‰g°^”òè`h¼øŠÜóÁÍhzCï¨X-ÌîGÁÚ‹A:fàbnç0f'LxŒ„›5Œ'Ð!<Æ\<÷AO|IBÖÕ¾„“['‘Dׯ8RÜ ÷$Ï­ä@‰±³ƒfÈo[~–ça~ƒãé N¡I£¸äoŒËÀq:±N«ø†´zË»Ö5¬Û2ïgËûÀÇÖîtbbÇÅqAç4¹ÖYYL ~D(Ù z:4[¸|¬{iïŽÒ‘AïNê2·ŒÂÜáÌ ÈÓó–мæç>XØ,σ$÷Írx£é¬|i` ñ®úèè]#0|(d¬Œ¨q?4n´f}#è¦en·¤ØfæfÜ;4Ÿ :8£l;(ÄHqM+™v"d.ß¹çI•‹r¢²=¾( 8ÍŠÁ"•ÄÜ;Á êyœ»Et»åcç°N³š??ºeý‰mnŸ¨ G6@ð ìØ£Â=Gw×[uâ-k\…·4^—eÉlðÌ’qÄ!š4B¯× æŽî¸7Ëœ."êHkMuEâÍmèsñV û¯Ü öC¶¥X9 !ÞÏ­‡ñÔ :Ê­“Äå2I÷—~`GƒÐkÕ¸ö Öv‘tMÙ½U"7~ÍH-OÁ:UKÒcj`ËGŒ^ žUì(úÙ£iwYÐTÑWšj³kk3ð­÷Q<á;NTI³“d?B]`Žn³¶p³ø‘¦U¦Pí—a¦«B&r•ù´¿üo:MrË£[ÜßEÑtÉx¶B) ƒô?ݽH¦›Ý.Øaz•P«B3c;aUÅ…ËÅ`ÂÑ€vŽfB`ŒExCÓ½7·§íˆ'‚â'(RhËÓ¤ZçS'FûoÏŸp@ßW;ˆV5¬L'{IYBG“.íå@$ì®ìà)è×HÞ–¿Y=?ý$,'»€±á­c¬ª ÏAÆDvT³å÷Kï8¹·ö*¿PѨt·BZ‡¼(îÛËBN ÂɤcÉÆFq‹ð|V…Y„u¹Š%ÎÌ’ÏÝ­I²¢sóT6F²ã–äºìCdC2B‘S!}cåI}"õ\KíënÃΉ¤S¡^ŽÙoÁ,P*]›-=4¬W^ ë!üý¤…ÑKD °(Ñ´7NÙ3™næF>Cæ=zsûåu\%Ú¢ZæçÓ©m\«¤ñÆ!0Iq.ÞY4¾ªZ° ´‰×6ñ+%ÈRýPClE–•gzY‘³ÝÛ7è7ŒôbVd3BègÄVT2NÉŠø›ž`eÁ»»Á>j"¯ [­²øN°ŸO[ ö)dåÜnûù íÁ랬™œÖ’âž)¤ÇÉ–fúìQGî—¡”Uî†ÞyÕ‘+ò,Èã:ÔÒÖY§)4Ç&I ÄÅÜÑPA꺱+œë:ÔÌvdÝìvLuÀvhÃ?¯nìï Aͨí=!t]¥¥;xà¦}“Rq•ã[ÆÌë÷7í–TÉ…žÄ@ðåÂmî{iQLÖSY^U\4hž:ð}ù:°‘³òk˜†à Ñ•AЪ®º=„'Ñ(c뱸GP7tßñ~h¶v躹Á1ºá£ãШÆJsÊÑÛËçÊõ·HëŒàLÇq§Ê ¤·-4±C¿ v$;’ª¨ Õcw*=!ªtû+-ØŸ•!;Òì3iÓ&GFfHšÇÞ¨li™7~âhHDÍΛå¸Ù{P4ûÃà`íDÆúF/R§oר޹OH#N'ÆØB[‚1:ÉÜ)iðáý[äsTààªh–yôùpñ€Ç[§1úÚiÀ°Gä5O8@=Zö£+7£·PÙVÓ:hŽ-õ·æŽ–ÅŽºkR´J1 Lò‰Ñ ½gkÿÚ¾`+Âaø öÓ+ƒµß(ÚQvýžóÚNmŽv3¥ÐÕ»pê²4ÎPñX‘x'Í»±“Øz Bè€?/õßYZNlWf](cb-¼ÃVôí׿H–©Â,[à½þp»ÚMBWàÎWÚ­ùÉ”1…óƒB»ÜKS/ |¢ê(gk¨¥ô=)Ì5ñØ`Ï\xYàóÜ‹›eˤâ*Ì6lœè\ÔªÔ5s''f×OÇ•eáJŒDùxÏj¢q)u”IP”iU$Q:IkÕ¶iÇë½mAô³VÓ6ÃÅÆ7w ÚfSoo ¦ÝÐÞçSƒ¸LøûÔ£0]åÒÆ.Ó˜]`3=ø4ÿ‚jWÙDm÷œ¡»Ûž4]-ËcF(Ѩ»Ú|k¾䊯Ø_mƒÇ—ЦÅE™à¶‡†ŠY…RíM[Nk­,ô*XíMh6º9×K䯬AσÐÝÒNwʈ¡ énóå›ß M:,Üc¦z0³tÄ*ÆMô؈¹‘s¸»×6À ž‹‹ûðàAyOØTd[C$©¥ä+~ÇÒ½ :(»fgI“6$½¬!ÿ£Þ¶…ÜÝ>K×XyŒK››¯€ÎDóÍd¹5¯ÿò,¨n\®ŒÒL®ý£øì©ÐVÞõçCÝwî<,;íO¯½£†ú‚™Õ`–-ëƒÙ~þvØ.jtäúÁ¡éÚíäqàçm¿^0@žO リy2ùø»k25@ñ}9óÞk¼éP—q ¾ðË0WU˜WU!}w&ÎãØ‹GùiñþÇá¸\Š0Š«t‹•is±dÍvtl±TUÿê,i^Þ(×t&°î€ð-Û4´[-ض˜£ÿl Œè Yè¥EmÓ=ãÉ!®9º!"]BütÄžÒf×è íÝjZ@“G ’:³?‚óÝÿ.gw9±vÜSÍ‹‡¡‹‡èô8òäi´k>û&kú%kWÓ°w’_ÁÔ9åA ž[×–þ2É*( ¡‚ÊŠdÿŸ°‘|h¿ÃÉÊ…·çOˆÇy ?VE¶d‚G6lÛZæ*èÌvð÷wY9;vÎŽØ€ø?¾+fŒåcUCŸœ-ðmk)Y³¿Ýï—P4TÔ¢Qµ°þÓ«òÓë••B9’Èê’¹³á4åé/Å¡¬Íý€#øq9ÄBô<ìýø…~UAœƒFI-ˆ‚~õGMÕWâ2Zvà#cqŽ,.å» þ¡ÉœyðhMkY­×ÖžnbVQZ‚ÄÙ=q1HhzæÏ¬*b¼zŽQöãÃÿ_Ûõ endstream endobj 421 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 422 0 R >> endobj 423 0 obj 3066 endobj 425 0 obj << /Length 426 0 R /Filter /FlateDecode >> stream xœÍYÝܶß¿‚Il{2õ-E ua'Eœ®Dݪ§×’öÖׇüír(qVÒ.úhûáø‘Ùá|‘ûeã3ÿïôŸ,ò½,ËYqØ|±tŸ¥ Kй1ç!ó#/ˆÙ]’bÖè5dŒ#øs1ðž}Ú´Îþ±ùíw˜S2ëÎ~…¹aõËæ#‘ÍN€ñ·$g›ï7¯ßÆÌçì¾r&Ž/õÎýŒe^äú_Àîì·—ïÚ~M#†Zµ¯~g÷ÿÜüt¡kȹ—}kª~¼\%MSÏ]Ȱ ‘ä¨?]2‡¸Ë5À¿WEæ ‰9xé=ߌp×'…Y¾ŸçižÃ'/»pˆßr˜oF»¥¯Z.î%†Ô]Ó=Y˯­Ø5’ ŠÕm=Ô¢©ÿ'YSïÊ]ý{/%ëOdÏêÄú£,ꪖ%ì &–¬ìê'Ù±²îd1¨î§m?m™%,à³=ÿÌ^±» ô½€½ì÷êÔ”” %A‚Œ+y&¨©[Ù¼“•êèÒa_ÓïÙ÷âN8ïëbÁQëMVABU%´NVå®DÝ©Þaà…à9¢BÔ[ ƒ<i”PD寧^zýT{ÜÚÎÜKJY‰S3• I¨;Ž[E枯¼ÆØ(LVŠNnRD g‹~£‘ql‚jæízUˆÁ}1öÄá±SGÙ5Ïdª(?Ǻ‘¢wHµŽ[)±=!xþ ×ÊååþÌÅ^útýÀ÷üÉG,rab 5©¸„,Ú’ ƒN&š´â xÓ‹'¹ä)) c…I k‡£%FDl1‘ÐKõ}ÎôÿYäagÂ/Ê0HÌÞŒ’8<¨ÞÑûç¼'‹ä4F›Ý¹øBòQ˜“×îSY÷CWƒ3ØäQtà@ÆMTuê@w\QÏgê‘„ÜL¥°„)1",T;8GQ­Á¢Ñ= ¨:qgÕ=nM‡äZåÆÖž£ÜÛ¤Hvæ„¢éÉbU§ŽL®«åƒyÊÐyË:ט}´àº+ŒÞó  *¦ ,AIaZ=k²I¹¹ArÒµ:tkÁS›*ŠD4‰ ö§¢€rTcG$êˆï²élÄõ0 Ï5Èîæõî žŽÅ“¨›ˆB‚œù‘ðƒt²“«œqÙŠ’`fÑ|Óβ}€²mú ¨w ÎZË/˹=#à–%Ъeœ¡mÂ5«/fý[™.!‹MÄœë]1\ 7,몂:ÑŽôuÝLÆdf¹¢#S­ÿ#0'MXM |=G¸§³ñ+Á¢u,V]dä~"ßuì¯X$Ïf-ö+ç2ÓgtŠ¢€â8l Ɇ«EV;²º…  Ð4EßC„PR/‡¡nzBÚ‹'ÊeÜþâË^õ«ŠîLÆ£‹- ø|nòí.äW= ×%â“|U !äˆGÛÄN¡iìw¬ QËØéÖg  vY[nû)ç±'¶k;õT—T2EÙ¬é3 u8L'a3ÓJ+ZÂhj@¼Ž@Z_- Ô›e$|~‰r½~›Îo"A{aœ@VNÂYÏý—f\¼¸Æ9$ZCªYYL5 â\&äp+Šγ5YŽ·D ƒÄóÃ8Ï’pm-Ù½ºåýó/ÿEðåÁ|€®âAÂŒíÊÁ†Ñl“Nêî{€”Ü<~¥Ùĺ}wD@<¾ÆÈCú úG,¿ˆmrB@=Ú²A9PF t» #«åt§± Эç—­e4Ïê;ì7’‘˜›DTmiCu$·Uýpê\SjÈUݵãe#2òD_7^¿Íþ=DžÁÆOýÉþxíaÎï wÁXuÛð›­˶õ*ÎÌ0…7Æè¶,ÚýèÈ µÍc]7Òä±GçIh{dÆØÊ{ÆbÚ_þ˜OÓÜüô·×o}¾¿f¼XñtSæ Ÿïrõøõô8ð2Ž•ÆÉør`Ó^‚K¦ÏÓÍô%P]usjÞôUAŠò¶³ÌU\L[5 (uÛ.WØ&x [vwf—1ã"fM©ÈæbܲpÆ^Ä(¢ÜYx§†½±moŒm; ûâ‡M4¸¾N[g÷]±LŸa“\È b0×.XXB ~8+—…¢:Ѻ·þ­\–³~ÐQ˜âÅÕ†8" Vꇽû2˜÷cÆÅ1¾[¦ö-m©KÉ Ç?Ëêï?N4z€Ke?:)Jº®v\æ5m”»‘=ågrÀšö0ãRû{…NÆÝ2Ô__0´´•juÖõÆú’=“›ó*@>“7a9 ÷x³ ±Ÿ]cy%–+ ×Þ”:äó-nyz‡^A*Éx8>bÊOÉ彜#°ÅŒ‹S7^7S[¦Îɰù6CA.ÚC}]­oúØÉ¥ä&o¹ÛǶQŒ^’¥ÍIºm™x†ª¶r к_ª?¾‡º,Ÿ…½ì"´ý$ûZfQ}8ªn-!Mz8ôÆ!Ú‘ÚïØó À´æðç™lª}Av³?4 ¨ Æ(ªùÃ’6CšÎÌ`_HLgÛè·þn‚ØŠ‡¶G†³¯‡ç‰ßCk¶på==ì?¿róʌóķŸ9î¾G;#°æB@äx÷Á±)Kh¡/ã{K¶;õ•Ð…ÛrF¿b¡,ŸYÁ´wú×Ô—?ôÓð,§¡ óê|ôÀ±))#@ép<]?¢_,§M·\„ª]g†F·üºÀѼ¡OоjÛUf#»µèI¸¿â6èo`vT¢>ꇱïõÛ%d&Ïÿ~¥à%z— zÚ,ŽQ¼’ò—³ìëXšñ# ”÷à ‘pCrÍX®\æÎÃs„Oäã©—ÿ'{ÛY#*•MUÙ_µtòË©î×ëïAI˜ÌŒ"Ìk,þt}ˆIჴ“~ÆRª;jHÀ­þájP¶4^7VÝ›Õ1I}/÷}èáou‰‹Y×kc’…W^)‹Oµ> endobj 426 0 obj 2542 endobj 428 0 obj << /Length 429 0 R /Filter /FlateDecode >> stream xœÍÙŽÛ8òÝ_Aô¾t0ݲD݃ÁÙ¹¶9ÄÁÎb2XÐmi"‰%µÛ/ûí[<$Ò’ìí™§ttU‰,VëdYyÈ…÷âWxN’¤(«W_4ÝC1F~¤I¡ë8t]yƒCT£sRˆ*±ÇðÁ¯³µ€è_«få¢_V¿ýkrä¾ãʽÀ\²ú°zgɦü5Éç¢ýêï›Õúçy.Ú쌉CìÄv]/A‰ããTü`´©Ño·MÛ‘ª"]Éš¿£Í?W?mÎtõ]×I¾6U߉®DZãN]H²ñ (Š£øt&ÈU§œQ”ê÷E‘ݙĮ-ðÜ{¾á.;N «÷Ý£õ/8ÚÍ÷ â'î/ñóRˆý ÃËœ¢7¬¡ »S|a÷ۃгE?Ê éRJ .må9܆´Ú]N›ÓÂ^/º&4Î ,ìÄ‹¦[¶[0f&ºŒ8ÂŽƒ4õSµúç²Y ‚l§€4#ò› qé„[ÎŽàˆâ[E¥oB”fiö:‘¦(DgÖ]õ œg  Rù¡:ü¿…õ¼éŠù•í³®d¿*)²œÈ48ãå"š"@g šP6ÏÁÒµŒ‚ï?Zε¬ˆ´íûNˆ«ïŃ=¹J‘èö¤RBª’ÂÀ–#,3ýˆÉ”oÖò¼ú)âÇPN/È8æöëUSäŽËLŒLg‰U‘†–ÉÖ—lÙ£¥‰Ì§­õ¹±Ö¤½`€gÊ hN„eu ™ÝA¢´C[J¶%œY“z$¢lˆj!®¨-X_åk¡Þ²šB¥½*áRD3tÕ«ý(vÂÀM“\øY^=ßQµèŽ_NŒWÓ «œŸø½øFœ±¡cAi…Pèaôšp(  ߆0²Ûœ±M½ ÛQ#9N ¼Øñ‚زýÖÑ‹iH쀬…“ú ¦[qÇ~h]¸BL¯ðœîH_u†PZs±¡>³ÿvÁ­Z™È_êÚ…\lÇÁ“xÀŒ;稔´‰ÛS½eU™JU6Ÿ ¦²†Þ6½:aÙOޤO¤>Ènă>Tä6aëhÂ{Z«õÆæW@ ‘A`*L”qªºeIÖ¿VMùk\wÈçÌÉA4/I7-àB—(˜èÂŽ åmQÊp$¼€’|¡ ’òXâz¡ðÜ¡ÊØá$þ33ª9¡’ ^à¨[¥5§»|Ûòþzbu±é‰mÎʪ> \÷yï…ÆÁfÕ²Ñkî˜ìJ®¦*˜©&ÝàÿKUóÙ Jþ…|Âôõ'%˜íÈ ˜¥ùæéÂù“K¸  \çl¯¶Ma(ž´Â4ñ݈@/'¢ Q4 #Âé¡*ÕS‚"UÍòëëW³uë|£'o…Ùðzö5Ërg`:I¾ôÐ%©1uf¯G¨ùÄ€”{Nj›/±w50‚äÖÖŽÍã.„áóÜf»žƒ|òÉ%Õµ\ÌJ#®…—pN:r7bÌlR P‚-µw׿Tñ£眑ô°[<èÜH’4ÚHb¥Œ~I’ðÐßT¢Ó[ óó¹aоVS°,][:ܘ*o#“ƒ¾;i“YÓÝðàÒÀ±¶®'7÷Ý¡7¼´Œ:*9J³  <7››ÅÓ艶ÖÖï gă¤Æê|‰æ vJ݉Ôݾ˜©ÁyÅì7~ýðjc°¶;AlAã£zLE<eVT?=(„ )¸Áµfš·2BŒí^Z\ˆå¥ÞCẢ~ Pôllf·kÒÍ• Hœ+ÿé¶f* @w›õ|x èð²‰Gwl¼íÆÇ•ƒ™¬æ8ääÔ~zá èÆþ6±¦ é¬&À¾Õ/ŸâôÓÈO5jwãªX,<FÞ4·Ô‹xÒ7ÜÊ2ýñý+ñ.AEà"aBS°Pö#ÒO“®h{%ÛRé{ž“Œ³™BH%nêdr6Ÿ •ûF?pjÚŽUÚyÜBÔëýQ{«&‹Þê˜æ%6vXg µÖêI!¢#X°ALl0¼&‚Ùϼþ€(þ®ùi»ÏœÙç;êÏн ûô^‹¿Vv¸*B‚ÿ¬³CÏÀÿª i0ሬ¿¨¼[ýµú0 endstream endobj 427 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 428 0 R >> endobj 429 0 obj 2165 endobj 432 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 730.013 149.98 739.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 431 0 R /H /I >> endobj 434 0 obj << /Type /Annot /Subtype /Link /Rect [ 520.663 730.013 525.663 739.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 431 0 R /H /I >> endobj 436 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 718.013 237.561 727.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 435 0 R /H /I >> endobj 437 0 obj << /Type /Annot /Subtype /Link /Rect [ 520.191 718.013 525.191 727.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 435 0 R /H /I >> endobj 439 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 706.013 269.308 715.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 438 0 R /H /I >> endobj 440 0 obj << /Type /Annot /Subtype /Link /Rect [ 519.959 706.013 524.959 715.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 438 0 R /H /I >> endobj 442 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 694.013 235.097 703.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 441 0 R /H /I >> endobj 443 0 obj << /Type /Annot /Subtype /Link /Rect [ 520.209 694.013 525.209 703.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 441 0 R /H /I >> endobj 444 0 obj << /Type /Action /S /GoTo /D [24 0 R /XYZ 72.0 769.889 null] >> endobj 445 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 682.013 168.89 691.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 444 0 R /H /I >> endobj 446 0 obj << /Type /Annot /Subtype /Link /Rect [ 520.533 682.013 525.533 691.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 444 0 R /H /I >> endobj 447 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 670.013 204.519 679.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 174 0 R /H /I >> endobj 448 0 obj << /Type /Annot /Subtype /Link /Rect [ 520.431 670.013 525.431 679.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 174 0 R /H /I >> endobj 449 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 658.013 254.497 667.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 178 0 R /H /I >> endobj 450 0 obj << /Type /Annot /Subtype /Link /Rect [ 520.203 658.013 525.203 667.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 178 0 R /H /I >> endobj 451 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 646.013 288.541 655.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 181 0 R /H /I >> endobj 452 0 obj << /Type /Annot /Subtype /Link /Rect [ 519.937 646.013 524.937 655.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 181 0 R /H /I >> endobj 453 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 634.013 253.241 643.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 184 0 R /H /I >> endobj 454 0 obj << /Type /Annot /Subtype /Link /Rect [ 520.213 634.013 525.213 643.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 184 0 R /H /I >> endobj 455 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 622.013 225.997 631.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 187 0 R /H /I >> endobj 456 0 obj << /Type /Annot /Subtype /Link /Rect [ 520.427 622.013 525.427 631.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 187 0 R /H /I >> endobj 457 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 610.013 315.956 619.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 190 0 R /H /I >> endobj 458 0 obj << /Type /Annot /Subtype /Link /Rect [ 519.721 610.013 524.721 619.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 190 0 R /H /I >> endobj 459 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 598.013 292.936 607.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 193 0 R /H /I >> endobj 460 0 obj << /Type /Annot /Subtype /Link /Rect [ 519.901 598.013 524.901 607.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 193 0 R /H /I >> endobj 461 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 586.013 289.133 595.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 196 0 R /H /I >> endobj 462 0 obj << /Type /Annot /Subtype /Link /Rect [ 520.067 586.013 525.067 595.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 196 0 R /H /I >> endobj 463 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 574.013 246.398 583.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 199 0 R /H /I >> endobj 464 0 obj << /Type /Annot /Subtype /Link /Rect [ 520.429 574.013 525.429 583.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 199 0 R /H /I >> endobj 465 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 562.013 215.508 571.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 202 0 R /H /I >> endobj 466 0 obj << /Type /Annot /Subtype /Link /Rect [ 520.509 562.013 525.509 571.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 202 0 R /H /I >> endobj 467 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 550.013 240.061 559.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 205 0 R /H /I >> endobj 468 0 obj << /Type /Annot /Subtype /Link /Rect [ 520.173 550.013 525.173 559.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 205 0 R /H /I >> endobj 469 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 538.013 257.677 547.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 168 0 R /H /I >> endobj 470 0 obj << /Type /Annot /Subtype /Link /Rect [ 520.179 538.013 525.179 547.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 168 0 R /H /I >> endobj 471 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 526.013 356.642 535.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 210 0 R /H /I >> endobj 472 0 obj << /Type /Annot /Subtype /Link /Rect [ 519.402 526.013 524.402 535.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 210 0 R /H /I >> endobj 473 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 514.013 283.562 523.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 213 0 R /H /I >> endobj 474 0 obj << /Type /Annot /Subtype /Link /Rect [ 520.112 514.013 525.112 523.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 213 0 R /H /I >> endobj 475 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 502.013 276.938 511.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 216 0 R /H /I >> endobj 476 0 obj << /Type /Annot /Subtype /Link /Rect [ 520.169 502.013 525.169 511.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 216 0 R /H /I >> endobj 477 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 490.013 240.045 499.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 219 0 R /H /I >> endobj 478 0 obj << /Type /Annot /Subtype /Link /Rect [ 520.317 490.013 525.317 499.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 219 0 R /H /I >> endobj 479 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 478.013 271.965 487.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 222 0 R /H /I >> endobj 480 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.027 478.013 525.027 487.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 222 0 R /H /I >> endobj 481 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 466.013 256.526 475.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 225 0 R /H /I >> endobj 482 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.147 466.013 525.147 475.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 225 0 R /H /I >> endobj 483 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 454.013 313.438 463.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 228 0 R /H /I >> endobj 484 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.603 454.013 524.603 463.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 228 0 R /H /I >> endobj 485 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 442.013 232.652 451.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 231 0 R /H /I >> endobj 486 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.337 442.013 525.337 451.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 231 0 R /H /I >> endobj 487 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 430.013 248.827 439.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 234 0 R /H /I >> endobj 488 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.209 430.013 525.209 439.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 234 0 R /H /I >> endobj 489 0 obj << /Type /Action /S /GoTo /D [239 0 R /XYZ 72.0 769.889 null] >> endobj 490 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 418.013 221.579 427.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 489 0 R /H /I >> endobj 491 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.141 418.013 525.141 427.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 489 0 R /H /I >> endobj 493 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 406.013 200.078 415.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 492 0 R /H /I >> endobj 494 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.429 406.013 525.429 415.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 492 0 R /H /I >> endobj 496 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 394.013 253.778 403.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 495 0 R /H /I >> endobj 497 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.169 394.013 525.169 403.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 495 0 R /H /I >> endobj 499 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 382.013 320.579 391.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 498 0 R /H /I >> endobj 500 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.645 382.013 524.645 391.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 498 0 R /H /I >> endobj 502 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 370.013 238.092 379.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 501 0 R /H /I >> endobj 503 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.457 370.013 525.457 379.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 501 0 R /H /I >> endobj 505 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 358.013 238.092 367.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 504 0 R /H /I >> endobj 506 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.457 358.013 525.457 367.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 504 0 R /H /I >> endobj 507 0 obj << /Type /Action /S /GoTo /D [242 0 R /XYZ 72.0 733.889 null] >> endobj 508 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 346.013 238.092 355.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 507 0 R /H /I >> endobj 509 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.457 346.013 525.457 355.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 507 0 R /H /I >> endobj 510 0 obj << /Type /Action /S /GoTo /D [242 0 R /XYZ 72.0 679.813 null] >> endobj 511 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 334.013 317.733 343.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 510 0 R /H /I >> endobj 512 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.669 334.013 524.669 343.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 510 0 R /H /I >> endobj 513 0 obj << /Type /Action /S /GoTo /D [242 0 R /XYZ 72.0 644.26 null] >> endobj 514 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 322.013 314.271 331.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 513 0 R /H /I >> endobj 515 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.811 322.013 524.811 331.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 513 0 R /H /I >> endobj 516 0 obj << /Type /Action /S /GoTo /D [245 0 R /XYZ 72.0 769.889 null] >> endobj 517 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 310.013 341.906 319.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 516 0 R /H /I >> endobj 518 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.579 310.013 524.579 319.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 516 0 R /H /I >> endobj 519 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 298.013 372.073 307.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 417 0 R /H /I >> endobj 520 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.321 298.013 524.321 307.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 417 0 R /H /I >> endobj 522 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 286.013 309.401 295.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 521 0 R /H /I >> endobj 523 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.852 286.013 524.852 295.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 521 0 R /H /I >> endobj 525 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 274.013 337.578 283.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 524 0 R /H /I >> endobj 526 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.615 274.013 524.615 283.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 524 0 R /H /I >> endobj 527 0 obj << /Type /Action /S /GoTo /D [254 0 R /XYZ 72.0 666.77 null] >> endobj 528 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 262.013 369.513 271.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 527 0 R /H /I >> endobj 529 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.263 262.013 524.263 271.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 527 0 R /H /I >> endobj 530 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 250.013 299.485 259.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 330 0 R /H /I >> endobj 531 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.936 250.013 524.936 259.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 330 0 R /H /I >> endobj 532 0 obj << /Type /Action /S /GoTo /D [329 0 R /XYZ 72.0 333.169 null] >> endobj 533 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 238.013 287.923 247.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 532 0 R /H /I >> endobj 534 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.034 238.013 525.034 247.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 532 0 R /H /I >> endobj 535 0 obj << /Type /Action /S /GoTo /D [338 0 R /XYZ 72.0 168.281 null] >> endobj 536 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 226.013 340.448 235.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 535 0 R /H /I >> endobj 537 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.107 226.013 525.107 235.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 535 0 R /H /I >> endobj 538 0 obj << /Type /Action /S /GoTo /D [338 0 R /XYZ 72.0 134.506 null] >> endobj 539 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 214.013 269.619 223.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 538 0 R /H /I >> endobj 540 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.191 214.013 525.191 223.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 538 0 R /H /I >> endobj 541 0 obj << /Type /Action /S /GoTo /D [364 0 R /XYZ 72.0 224.109 null] >> endobj 542 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 202.013 333.898 211.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 541 0 R /H /I >> endobj 543 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.645 202.013 524.645 211.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 541 0 R /H /I >> endobj 544 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 190.013 343.191 199.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 365 0 R /H /I >> endobj 545 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.567 190.013 524.567 199.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 365 0 R /H /I >> endobj 547 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 178.013 329.51 187.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 546 0 R /H /I >> endobj 548 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.236 178.013 525.236 187.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 546 0 R /H /I >> endobj 550 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 166.013 285.188 175.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 549 0 R /H /I >> endobj 551 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.923 166.013 524.923 175.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 549 0 R /H /I >> endobj 553 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 154.013 318.571 163.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 552 0 R /H /I >> endobj 554 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.662 154.013 524.662 163.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 552 0 R /H /I >> endobj 556 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 142.013 351.709 151.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 555 0 R /H /I >> endobj 557 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.493 142.013 524.493 151.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 555 0 R /H /I >> endobj 558 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 130.013 273.049 139.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 412 0 R /H /I >> endobj 559 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.16 130.013 525.16 139.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 412 0 R /H /I >> endobj 560 0 obj << /Type /Action /S /GoTo /D [421 0 R /XYZ 72.0 706.008 null] >> endobj 561 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 118.013 285.752 127.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 560 0 R /H /I >> endobj 562 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.919 118.013 524.919 127.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 560 0 R /H /I >> endobj 564 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 106.013 244.421 115.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 563 0 R /H /I >> endobj 565 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.243 106.013 525.243 115.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 563 0 R /H /I >> endobj 567 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 94.013 394.603 103.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 566 0 R /H /I >> endobj 568 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.133 94.013 524.133 103.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 566 0 R /H /I >> endobj 570 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 82.013 441.833 91.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 569 0 R /H /I >> endobj 571 0 obj << /Type /Annot /Subtype /Link /Rect [ 513.73 82.013 523.73 91.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 569 0 R /H /I >> endobj 572 0 obj << /Length 573 0 R /Filter /FlateDecode >> stream xœÍÝMsÉ‘ á{ÿ 1‡)E„»G¸ŸÆV¬×¤ÕG·Lc664Y$a ThMï¯ßô,  U™”ò½iæ Tõ€ dDeFþõ›zU¦ÿÿ×ü׺s«wŸ¿ùëËóõj´+é/OYÙi³Räªê®ÙÕç«ó§ìê.Ǽù ½~4ýÏY;=þtõ—oî¿)W¿ùæ¿þ{jÞ_•iÜß¾)_yñù¥¾ûæo¾¶—`úøŸéë{ûJ);ÿçûÿx<ÆØ•KøùeäøÜôÌñó?}!—Ÿåì™ãwpü߯~Éeñ—õ?ÑWóš/®\}üæ—ßó‹ÿ˜¾¦rõý‡Ó¿¨QwEkDx›þÓÎ[äÿµ«ï?_ý×õííí¿ü÷Õ÷ÿû›_¿ö7æŸæÛ[þeiùuýü]OµÆ®y)¥ž}óêù=Œ—oúø=óÃÝþêáÃÕ¯îŸö÷OÇ?•?ºi´ŒÝ(}zÙæÇÑ8ì?ܼÛÇœþÇ.ò³ËôSj1äê_¦¤ÆN¯®/†yÝõ¡Ó°•Q»ËVA;¶·Q@+ í ím-ÄFbqvµ¼Z^m€¯6àW¬-%Âbl¨¥¡ÚPí¤ÖŠjEõ µT ª;ª‘eG–Yvd9å@–Y:²tdéÈÒ‘e Ë@–A,[!–­ËVˆe«Ä²UbÙ*±l•X¶F,[#–­!KA–‚,Y*²Td©ÈR‘¥!KC–v<è©ÓÁÁ†ºWT+ª©GAµ º£:Hí Õ†jdÈ2eËœm’šXJ!–Rˆ¥Tb)•XJ%–Òˆ¥4b) Y ²d)ÈR¥"KE–Š, Y²4dÙ‘eG–Yvd9å@–Y:²tdéÈ2e Ë@–A,µK-ÄR ±ÔJ,µK­ÄR±ÔF,µKmÈR¥ KA–Š,UwÑ=bB%Ë»š?÷{›ÆÉÊJòÿ\®!·«iVpÞÔ]¾ú4ÑŽ«ë?í?üû/OoïOßœ>¼~zü´¿»[Yx±^KÑ®ËOs¾»ÒÊ4¬å°å*ICµ¡ÚI=ýÜ%µ¢zzú¹KjAuG5±l…X¶B,[!–­ËV‰e«Ä²5bÙ±lX¶†,Y ²d©ÈR‘¥"KC–†,m²œþ¹y”º¥R÷†jCµ“:ßYµ¢zÚ ªÕÈÒ‘e Ë@–A,¥K)ÄR ±”J,¥K©ÄR*±”F,¥KiÈR¥ KA–Š,Y*²TdiÈÒ¥!ËŽ,;²ìÈr Ë,²ÈÒ‘¥#KG–,Y±ÔB,µK-ÄR ±ÔJ,µK­ÄR±ÔF,§CLR ²d)ÈRåtl?¦_±¡]À‚D.©Ô¨¥„­,—¬,©L?@Ï›6/©xžÙxýûÃÇ›ûÛÿwótûpzöáÃéã§O·§GŸoîŸoK+Ó¿½égúÆ{_~ºÓàÅ$¸ìºMßI _[N™ÕÕAê|Ó Ô†j'u¾éjEõ µ KA–‚,Y*²Td©ÈÒ¥!KC–YvdÙ‘eG–Yd9¥#KG–Ž,Y² dÄR ±”B,¥K©ÄR*±”J,¥KiÄR±”†,Y ²d©ÈR‘¥"KC–†, Y²ìȲ#ËŽ,²Èr KG–Ž,Y:² dÈ2ˆ¥b©…Xj!–Z‰¥Vb©•Xj%–Úˆ¥6b© Y ²d)ÈR‘eþ´¯1ÍÉÁ$V§ûaÓ„_=–ÃV¦ãC.9žáÐw~uýχ§OûÃé‰Ûû‡ÏóôürÒ=w—yÁßÊ‹ž^a1¬ï¬[)Mu9ìò%Ï~õtNjCµ“z:'µ¢zz:'µ Y±Ì³HM,óìPWb™g?šXæÙ¤&–yö©‘¥ KA–‚,Y*²TdiÈÒ¥!KC–YvdÙ‘å@–YdéÈÒ‘¥#KG–,Y±Ì³HM,óìPWb™g?šXæÙ nÄ2Ï~ 5²d)ÈR¥"KE–Š,Y²4diȲ#ËŽ,;²Èr Ë,²tdéÈÒ‘e Ë@–A,óìRË<ûÔÄ2Ï~ 5±Ì³@݈ežý@jd)ÈR¥ KA–yöÃÄ?/·l_¾È³ZyYnY »\nQ¿šþAŸ7ß«äÉ?î?Þîÿv1*?±çnIËá?¾œ]ç¿©Üdªw]ŽZÌÅóߨ;ªƒÔùo Ô†j'uþ›µ¢z:ÿM½žë¾¡TwT©µ¡ÚPí¤¶ŠjEõ uG–YvdÙ‘å@–YdéÈÒ‘¥#Ë@–,Y±œ×RAM,çµÔíu%–óZ*¨‰å¼– jb9¯¥‚Y ²d)ÈR‘¥"KE–†, YÚñØg>§vC¤î Õ†j'õ¨¨VTR{Aµ Y:² dÈ2ˆå¼– jb9¯¥n¯+±œ×RAM,çµÔíu#–óZ*¨‘¥ KA–‚,Y*²Td©ÈÒ¥!KC–YvdÙ‘å@–Yd9¥#KG–Ž,Y² b©…Xj!–Zˆ¥b©•Xj%–Z‰¥6b©XjC–‚,Y ²d™»ó”é¸ÃêÊêÖ×V,s)Õd:¶ [ªñhWq¹}Ïqkž:’ÄÕõ·÷O‡‡÷ÏïÖÎTË)SõˆQcù*o^ce©¬ä¦òkŸ|m¥l{¬ÄFb±U+‰ˆ{!±˜v"8ˆà ‚ƒ:t"èD0ˆ`Á ‚çí•¶Ç@pÞ\is\༵ÒöÎ+m༭Òö˜ "(DP‰ A%‚FæfJ1"jè–:H›)ÚPí¤ÎÍ”@­¨¤ÎÍ”@-¨F–Ž,Y² b9o¦jb9o¦´½®ÄrÞL ÔÄrÞLi{݈弙¨‘¥ KA–‚,Y*²Td©ÈÒ¥!KC–YvdÙ‘å@–Yd9¥#KG–Ž,Y² b9o¦jb9o¦jb9o¦jb9o¦´½nÄrÞL ÔÈR¥ KA–‚,§ãz·ÃÈS.‚MßsDŒ¾'uôùìºËe°úz§]]ÿåÓÍÓéÑqë¤ãÇóîÕÿ¶˜æ·FÐÒV^û4z1ÎvÑ[)Öׯ-WåÓÏ”+ËÉs›(” Ë;ËåÓ”#ÕÜ,Šä ©ævQ(gªÂT…© S¦ªLU™ª2UcªÆT©v¦Ú™jgª©¦:˜ê`ªÎT©:S ¦L5˜j ÕÜH åH5·’"yEª¹™Ê‘jn'…r¤šJ¡œ© S¦*LU™ª2UeªÆT©S5¦Ú™jgª©¦:˜ê`ªÎT©:Su¦L5˜j ÕÜi åH5÷š"yEª¹ÛÊ‘jî7Eò†TsÇ)”3UaªÂT…©*S·öRºY8^ )¥L‡[+ãÖ–.ÚåöTu÷²´ìZ.]<œ<~zx¾{züü¸?=X]ÊÈ{9›æv[2V>×iôb\ì|LßH­+ÖÓ̆jCµ“zúKGjEõ õô7ŽÔ‚êŽjdiÈÒ¥¥e 7×-y¯,W–”Âraygy ÜËåL5˜j0Õ@ªyg”#Õ¼Ë3Ê‘jÞçåH5ïôLò†Tó^Ï(gªÂT…© S¦ªLU™ª2UcªÆT©v¦Ú™jgª©¦:˜ê`ªÎT©:S ¦L5˜j Õ¼ 4Ê‘jÞšä©æ QŽTó^Ð(Gªy7h”3UaªÂT…©æÈÅÊ4™ 2›·@–1—¶2nm&*¹sEH·×™èË6Èãêú7ûûýáæîõá‡ýÍÓóaÿxñ2yê}{Ý@hù‚¯££¦Ùv~ƒnº2êò$ÏÂ'ùôåÂòÎò yžrc¹£|úƒr¤šg擼!Õ<;åH5ÏÐ'¹0UaªÂT•©*SU¦jLÕ˜ª1Ucª©v¦Ú™ê`ªƒ©¦êLÕ™ª3UgªÁTƒ©RÍSøQŽTó$~’W¤š§ñ£©æ‰ü$oH5OåG9S¦*LU˜ª2UeªÊT•©S5¦jLµ3ÕÎT;SLu0ÕÁTSu¦êLÕ™j0Õ`ªTó”#Õ<ËåH5ÏóG9RÍ3ýIÞjžër¦*LU˜ª0UaªóÂÓaJÕ±}þ?¿k^§Qmm®,U¨-–*ôç/ƼñÅþðáæÝr"O­úùÔþÅ˼y‰ÅÀ±³1ý‹³*+óüÜá”äÂòÎò@yîrJrc¹£<7:%¹²œ©S ¦L5ê¼ß)É‘ê¼ã)È+R÷<%9Rw=%9R÷=%9S¦*LU˜ª2UeªÊT©S5¦jLµ3ÕÎT;SLu0ÕÁT©:Su¦êL5˜j0Õ@ªó†¨$Gªó–¨ ¯HuÞ•äHuÞä ©Î£’œ© S¦*LU™ª2UeªÊT©S5¦Ú™jgª©¦:˜ê`ªƒ©:Su¦êL5˜j0Õ@ªóŽ©$Gªóž©$Gªó®©$Gªó¾© oHuÞ9•äLU˜ª0UaªÂTçÍ#J)½¢…šyóˆ6J©a+me5ÉÆb5ÉæÕ¤Ñv:_X±?ìïßíOO}¾¹¿ù¸ÿ¼¿:=÷•SbòÌþ°—W_~ªÓø•éN1®¯Œ[›î \XÞY(Ÿ¦;(7–;ʧéÊ•åLÕ™ª3UgªÎTƒ©S ¤šÓ”#Õœî¼"՜æt‡ä ©ætåLU˜ª0UaªÊT•©*SU¦jLÕ˜ª1ÕÎT;SíLu0ÕÁTSLÕ™ª3UgªÁTƒ©RÍéÊ‘jNwPŽTsºƒr¤šÓ’7¤šÓ”3UaªÂT…© S¦;Ó´%ÚZþÕiBžç?Z-ÅeeØÚl§Çb¶Óœ×|ý_ÞþpwûðñpóåÓO§gŸîN¾6ÕÉÍk¤—¢]W>Ïiübœîš­ŒXôM¶…Óß„¡l ûÖ06†Ú¶†¶5ô¡Õ­áVÛ*Ó·Êô­2}«Lß*3¶ÊŒ­2c«Œo•ñ­2¾U&¶ÊÄV™Ø*erã°áF™Ü,l[X7ÊäaÃ2¹)ØÆp£Ln¶1Ü*#[ed«Œl•Ñ­2ºUF·ÊØVÛ*c[el«Lß*Ó·Êô­2c«ÌØ*3¶ÊøVß*ã[e|«Ll•‰­2±Q&·ÜÚn”Ém¶¶…u£Ln­µ1Ü(“Ûim ÛF™ÜBkc¸UF¶ÊÈVÙ*£[eòÌ-/»im?П/J.¹UøÊ¸~‘×Væó?—Ó•ãæÞy%×Õõw¿ùÝoOnîߟüçï~{y¤1ýέÓ/µ°^W^û4tejcÓ°ðá+ã–aygy |¾;:ÈåŽòùé W–”S5¦jLÕ˜jgª©v¦:˜ê`ªƒ©:Su¦êLÕ™j0Õ`ªTçsIŽTçsA^‘ê|Ž É‘ê|Ž ÈRÏ$9S¦*LU˜ª2UeªÊT•©S5¦jLµ3ÕÎT;SLu0ÕÁTSu¦êLÕ™j0Õ`ªTçsIŽTçsIŽTçsIŽTçsAÞê|Ž É™ª0UaªÂT…©ææXyªßô{ÌæòÁÒ{x/kŸfuËݱúËNÍy"¢_]ÿöæûý^Žt%o˜e+¯ðfìbØ4QS;¢­ ¼üs¨¹=É…ååò܉žäÆr'yËèI®,Gª­"ÕV‘jî Žr¤š;‚£©æžà$¦*LU˜ª2UeªÊT•©S5¦j©Ú§ŸæÕ·ä½²\Y>P> Ë…ååro,7–3Õ`ªÁT©æîà(Gª¹;8Ê‘jîŽr¤š»ƒ“¼!ÕÜåLU˜ª0UaªÂT•©*SU¦jLÕ˜ª1ÕÎT;SíLµ3ÕÁTSLÕ™ª3UgªÁTƒ©S ¤š»ƒ£©æîà$¯H5wG9RÍÝÁQŽTswp”3UaªÂT…©ï°ýµüë Ç«$=ÜúʸËèÇ­¥/Ö?Æqõ#÷¿ºþÕaÿþöi±ßV.Ø—q|¿}ùoÆ/Ž]m½”Q|eàbžŸ—?’\XÞY(ÏËIn,w”çå$W–3UgªÎT©:S ¦L5j®k¡©æºÉ+RÍu-”#Õ\×"yCª¹®…r¦*LU˜ª0UeªÊT•©*S5¦jLÕ˜jgª©v¦:˜ê`ªƒ©¦êLÕ™ª3Õ`ªÁT©æºÊ‘j®k¡©æºÊ‘j®k‘¼!Õ\×B9S¦*LU˜ª0UeªÊT•©S5¦jLµ3ÕÎT;SíLu0ÕÁTSu¦êLÕ™j0Õ`ªÁT©æºÊ‘j®k‘¼"Õ\×B9RÍu-”#Õ\×B9S¦*LU˜ª2Õ\‹QÊe0+QJë±2p\ä£oSvÏ »ºþî§Ç§ýç×G‡ý_Ÿoó&a‹U±žçÕã…òËW|}…•¥«Ó¨j±2jmiååy’=É…ååò<ÉžäÆr'y.Í ©æÒ É+RÍ¥”#Õ\š!yCª¹4ƒr¦*LU˜ª0UeªÊT•©*S5¦jL5O²¯%¼‹lÉó${’+ËÊó${’ Ë;Ëåy’=ÉåL5˜j0Õ@ª¹4ƒr¤šK3(Gª¹4ƒr¤šK3$oH5—fPÎT…© S¦*LU™ª2UeªÆT©SíLµ3ÕÎT;SLu0ÕÁT©:Su¦L5˜j0Õ@ª¹4ƒr¤šK3$¯H5—fPŽTsiåH5—fPÎT…© S¦ªL5ïØZD °Ô‘ë2uLÇBZme”_äy~R»ÜM¤½ì2ÍÞåêú÷_ö‡›§Ûû§§çåšÅR‚íúxÙ>~ù¢§Ñ+Kuú‚‹º¯Œ[[‚@¹±ÜI>ŸBreù@yžBrayg9RÏ!9RϹ0UaªÂT•©*SU¦ªLÕ˜ª1Ucª©v¦Ú™ê`ªƒ©¦:˜ª3UgªÎTƒ©S ¤:ŸBr¤:ŸBr¤:ŸBr¤:Ÿò†Tç³CHÎT…© S¦*LU™ª2UeªÆT©SíLµ3ÕÎT;SLu0ÕÁT©:Su¦L5˜j0Õ@ªóÙ!$GªóÙ! ¯Hu>;„äHu>;„äHu>;„äLU˜ª0UaªÊTç%ˆ—kªÀ”þ¸q¼Fj9lm B/w’i/;ÄäNW׿½ýáps¸Ý?žžºß¿Û?>Þ~:=õôpúø‡çÛ»÷§‡/››žïß<ØxÿÃâTw]k„·XùÚNƒãr½eL¾CVÆ-. Ë…ååAòÜOåÆrGy­,W–#ÕÜsåH5÷ŸG9S¦*LU˜ª2UeªÊT©S5¦jLµ3ÕÎT;SLu0ÕÁT©:Su¦êL5˜j0Õ@ª¹+>Ê‘jîOòŠTs·|”#ÕÜ9Ÿä ©æ.ú(gªÂT…© SU¦:ý:yÙiÃåNûÓL¬/kÇ¥—¯¹Ãa³Ëmòèõå=´vvvóôèîõXöò,ßôíÓAg×¾ò’¯Ã£t>Ò.+£–oË ”çv$–w–Ês» ’ËåÓ_$”3UeªÆT©S5¦Ú™jgª©¦:˜ê`ªÎT©:Su¦L5˜j ÕܼåH57ï'yEª¹y?Ê‘jnÞOò†Tsó~”3UaªÂT…©*SU¦ªLU™ª1UcªÆT;SíLµ3ÕÁTSLu0UgªÎT©S ¦H57ïG9RÍÍûQŽTsó~”#ÕܼŸä ©ææý(gªÂT…© S¦š›÷G=n¿y¦8¿)S§OVWF­Nlûåu½9±}¹lWóªàß?}ÚN¿:·Íc$ñRÄtåUO/°ç;™¾ÍãEi‹qËÙme¹²| |š;£\XÞY(ŸæÎ(7–3UeªÊT•©S5¦j©j/§ˆoÈå½±ÜXî(•åÊòr/,–3UgªÁTƒ©R͹3Ê‘jÎI^‘jÎQŽTsîLò†TsîŒr¦*LU˜ª0UeªÊT•©*S5¦jLÕ˜jgª©v¦:˜ê`ªƒ©¦êLÕ™ª3Õ`ªÁT©æÜåH5çÎ(Gª9wF9R͹3ÉR͹3Ê™ª0UaªÂT…©Î§4ÖR|­þêDtž<÷(¥‹­Œ‹‹<ýíæ°¿œÿæ[Þt¬„¯¼èiübܘæÍÓ1ÓP]wùS§Ã<” Ë;˃äm:ÔC¹±ÜQ>í¡\YŽTç=HŽTç=HÎT…© S¦ªLU™ª2UcªÆTs>umlªƒÔ¹Ã¨ ÕNêÜ^ÔŠêAêÜ[Ô‚jdéÈ2e Ë –ó¦ &–ó–ÛëJ,ç @M,çí¶×XΛ €Y ²d)ÈR‘¥"KE–Š, Y²4dÙ‘eG–Yd9å@–Y:²tdéÈ2e Ë –óž &–óŽ &–ó~ &–ónÛëF,ç½@,Y ²”œ¦OSýªk³ñ¯Nœs®_ušëK]û4µ]ô£Í¿ÈÏ«ãÕ}ÞïWχÃþþéôÄÝíçÛ§ã›Ý§'_vQ>>ørwóôááðùôÌíããóòÒÿiV¢¯—þ/¿ˆÓè•éI/ÓŒ »¬Œ[›ž|šž \XÞY(Ÿ&((7–;ʧ9 Ê™ê`ªÎT©:Su¦L5˜j Õü‘‚r¤šó’W¤šÊ‘jÎYHÞjÎZPÎT…© S¦ªLU™ª2UeªÆT©SíLµ3ÕÎTSLu0ÕÁT©:Su¦L5˜j ՜Π©æ„åH5§4(Gª9©!yCª9­A9S¦*LušÚèô/н99îWý»^U.ú|³]^-/»o×éobËÛÇü<™¹]ûôg`5"¿ÈÅ˼y‰Å8ÝUŸþ]ØÐ•—5ï ò¼;$É…ååò¼;$ÉåŽò¼;$É™j ÕVjžŽr¤š'‡“¼"Õ<9åH5OG9RÍ“ÃI.LU˜ª0UaªÊT•©*S5¦jL5ïéQtí'ýr¤°\XÞY(Ï»C’ÜXî(Ï»C’\YÎTƒ©S ¦H5ÏG9RͳÅI^‘jž/Žr¤šgŒ£©æ9ã(gªÂT…© SU¦ªLU™ª1UcªÆT©v¦Ú™jgªƒ©¦:˜ª3UgªÎT©S ¦H5O&G9RÍÓÉI^‘jžPŽr¤š§”“¼!Õ<©åLU˜ª0ÕivàE#Zg«ùvóÏ÷R[\]“‘Ë‹°åuãøžûëýáÍ»ÇÇgVß=ε ŸŽÃÜV^ó4z±NPv-^öÍ[Ž[.+Ë;ËåÓÏ”Ëä¹ãÊ•å婿Žs(Gª¹ãÉRÍçPÎT…© S¦ªLU™ª2UeªÆT©Zª¾ì‡±!ï•åÊòòQX.,ï,”{c¹±œ©S ¦H5wœC9RÍçPŽTsÇ9”#ÕÜqŽä ©æŽs(gªÂT…© S¦ªLU™ª2UcªÆT©v¦Ú™jgª©¦:˜ê`ªÎT©:S ¦L5˜j ÕÜqåH5wœ#yEª¹ãÊ‘jî8‡r¤š;Ρœ© S¦š§Èk‰RÉ @®Y´¥ªÇʸŚE® èåEóß~ûz5¼^]ÿ¯÷ŸoïoŸ7O‡ÓÓŸoîŸoî.gÙ¹qõð¶òº§Ñ—ãLvÓŸL)EceÜb2oåòÞXn,w”Êreù@¹–3UgªÎTƒ©S ¤šËK(Gª¹¼DòŠTsy åH5——HÞj./¡œ© S¦*LU™ª2UeªÊT©S5¦Ú™jgª©¦:˜ê`ªƒ©:Su¦êL5˜j0Õ@ª¹¼„r¤šËK(Gª¹¼„r¤šËK$oH5——PÎT…© S¦*LU™ª2UeªÆT©SíLµ3ÕÎT;SLu0ÕÁT©:Su¦L5˜j0Õ@ª¹¼„r¤šËK$¯H5——PŽTsy åH5——PÎT…© Sw`S>„,Ôw`(µÕ•qU/úÜ¡_îÓ /)\¿úöþñéæîn¾LérRӯᥴ•—yó"—óŠ_류÷•‹É{^ñKòò¼â—äÂòÎò@y^ñKrc¹£¼3ÕÎT;SLu0ÕÁTSu¦êLÕ™j0Õ`ªTóZ5”#Õ¼V åH5¯UC9RÍkÕHÞj^«†r¦*LU˜ª0UaªÊT•©*S5¦jLÕ˜jgª©v¦Ú™ê`ªƒ©¦êLÕ™ª3Õ`ªÁTƒ©RÍkÕPŽTóZ5’W¤š×ª¡©æµj(Gªy­Ê™ª0UaªÂT•©*SU¦jLÕ˜ª1Ucª©v¦Ú™ê`ªƒ©¦êLÕ™ª3UgªÁTƒ©RÍkÕPŽTóZ5’W¤š×ª¡©æµj$oH5¯UC9SekKÊÖ–ækÕ¬–*ÕÑ’W.ÌMßI¸­}šÚ/ò¼Tm\n2¤/ÛMSìéüñùöÝÿ}|º9<žûø|û~y”é³î+/z¼²¬ÐÚ”Žh+ãÖ–Hž—\Y>HžË (–w–Êóò’#Õ\V yCª¹¬€r¦*LU˜ª0UaªÊT•©*S5¦jL5/hýåGê?Îóò’ Ë;ËåyùÉåŽò¼|€äÊr¦L5˜j0Õ@ª¹¬€r¤šË $¯H5—PŽTsYåH5—PÎT…© S¦ªLU™ª2UcªÆT©SíLµ3ÕÎTSLu0UgªÎT©:S ¦L5j.+ ©æ²É+RÍe”#Õ\V yCª¹¬€r¦*LU˜jžîÓj)¹¹ðö)ú|¶ORºØÊ¸ÕU¿Ü&G_6ÀÉ%Ñ«ë?ùx¸y{ÿñôÔ‡ÃÃçÓ£›ûÓÇwï÷‡ÓÃ÷‡ÇåYB9Ù8]s¶øô§á+³ŽñzÃÙ帵YÊÇ”[©Ú×¾ªµYÊ…ååòiÖrc¹£ÍúäÅ–{²Éënж“œ¼ì_ÞB™¾8}üôéÍx÷ðùËÃýþþéñôÜLJŜ&×÷Ë˽¶–Ÿü4tq8+»iÌËÛU‹qË£ßÎò@¹7–ËåQY®,$—RXŽT¥ U)HU*R•ŠT¥"UiHUR•ÆT…© S¦*LU™ª2UeªÆT©SíLµ3ÕÎT;SLu0ÕÁT©:Su¦L5˜j0Õ@ªZª¤ª©jEªZ‘ªV¤ª ©jCªÚª6¦*LU˜j.ôçÕ9 ÌƒeQ¦Ãåº2®.¶ÈɃå¾Ü]G^NM²¶Ó<5izðù§Ç§ýá§ÓN?½-ß=ܸýø|¸yº}¸?=ýáönÿ¸v„5Z„[ù‚Nƒ×µ¢‡kx/Æ­j‘Ô"9S¦*L5ï_=å1Ê ‡y¨5ý’-UueX]Üï!´|y‘½ìôxNE\]ÿúþÇÛÃÃýçýýÓëS?Þno~X05;Íü¾òº¯Ã/GååOQ¦ÃÊÖWF-–Éòò'’w–Êóò'’Ë}ʧ?ϰ¶%ÏËŸH®,(ÏËŸH.,ï,”çåO$7–3Õ`ªÁT©æ”åH5gB(Gª9B9RÍ™ÉR͙ʙª0UaªÂT…©*SU¦ªLÕ˜ª1Ucª©v¦Ú™jgªƒ©¦:˜ª3UgªÎTƒ©S ¦H5gB(Gª9"yEª9B9R͙ʑj΄PÎT…© SÍ34z+µŽµü+sŠùü «á1leT«k¡X»ÖŽçgŒ]½ºþîáóþôèþáiÿxzx\M>~üz¶Æü`^ZÎõéÏ‹#jË[u—ÒBV>ûéã|7Ô#Z´•q˃ßÊreù@yÞ”äÂòÎò@yÞ”äÆr¤šûÒ ©æ¾4$¯H5÷¥A9RÍ}iHÞjîKƒr¦*LU˜ª0UeªÊT•©*S5¦jLÕ˜jgª©v¦:˜ê`ªƒ©¦êLÕ™ª3Õ`ªÁT©æ¾4(Gª¹/ Ê‘jîKƒr¤šûÒ¼!ÕÜ—åLU˜ª0Õ<ŸCódéÜ'wûñç|åf}Ý f1nqpýÊÊòÂÍã[ Óu»ºþöþñéæîîç“2ŽÏ¾ýø··÷ÏÿszxsÿþM7oNÿ|û¦œß¬¸Z¼W1ýû²*Ó7¯±ò寝¬€ZÖëʸµP”w–ʧh(7–;ʧh(W–” S¦*LU˜ª2UeªÊT©S5¦Ú™jgª©v¦:˜ê`ªƒ©:Su¦êL5˜j0Õ`ªTsåH5W@I^‘j®€¢©æ (Ê‘j®€¢œ© S¦šç‚t/Åd#•ýE@¹²| \ Ë…ååLÕ˜ª1UKÕéG·õ-u¯¨VTR‚jAuGuÚª ÕÈ2e Ë –ù&©‰e¾ÅGjb™oð‘šXæÛ{ nÄ2ßÜ#5²d)ÈR¥ KE–Š,Y²4diȲ#ËŽ,;²ìÈr Ë,²tdéÈÒ‘e Ë@–,ƒXæ[x¤&–ù¨+±Ì·ïHM,óÍ;RË|ëŽÔÈR¥ Ëœš”jUÉ+ïâU¦_ÑÍWƵËÝròì*]^ÂýrÝBÍÏpyvÕñÙ·ÿåöþýÃßOOüŸïѦ#ö_üçžSÇMq–Ÿøô ‹ƒÒº³×½†–ã–ǰÊòòÜs—äÂòÎò@yî¹Krc¹“<¯B@9RÍ«H^‘j^…€r¤šW!¼!Õ¼ åLU˜ª0UaªÊT•©*SU¦jLÕ˜ª1ÕÎT;SíLu0ÕÁTSLÕ™ª3UgªÁTƒ©RÍ«PŽTó*”#Õ¼ åH5¯B yCªyÊ™ª0UaªÂT§Ãê¼MSi~æQu-=B»¬Œkk;#™-/¶—“áò.lW×8ìû¿>ß>Þ>-6Cª¹³J2˯¼Òé5.À¦#ªòzQðrÜâxm:¢Bù@y-,–w–ʧ#*”ËåÂT…© SU¦ªLU™ª2UcªÆT©v¦Ú™jgªƒ©¦:˜ê`ªÎT©:S ¦L5êqb#Õyëa’#Õyëa’#Õyëa7¤:o=Lr¦*LU˜ª0UaªÊT•©*S5¦jLÕ˜jgª©v¦Ú™ê`ªƒ©¦êLÕ™ª3Õ`ªÁTƒ©R·&9R·yEªóÖÃ$GªóÖÃ$GªóÖÃ$gªÂT…©N¿†Ô—™òö‰ë<Ã~Ý×k9n}†Ý—ÛØë-Ñ|×WÞºšŸýpxø|zôºÛÖüàñáùðn¹3ñt¤îᥖf+Ÿõ4|1nú³s-U=VÆ-Ù売\Y>Pî…åÂòÎò@y4–3Õ@ªùžÊ‘j¾'FòŠTó=1”#Õ|OŒä ©æ{b(gªÂT…© SU¦ªLU™ª2UcªÆT©v¦Ú™jgªƒ©¦:˜ê`ªÎT©:S ¦L5j¾'†r¤šï‰¡©æ{b(GªùžÉRÍ÷ÄPÎT…© S¦šyY|-ÿêÑí¼‘—jø4teœ”µCö±Ü!Â^nÌ–û®²ÏÏoÈvüøËaÿÃóíÝÓé™nïo·ËÃöéù4§X|æÓø•#e‘ép¿•akÊ žŽ“I-¨î¨ROÇȤ6T;¨ó™ÔÄ2A]‰e“šXæ¡1¨±ÌcR#KA–‚,Y*²Td©ÈR‘¥!KC–†,;²ìȲ#Ë,²Èr KG–Ž,Y² dÄ2IM,óè—ÔÄ2}IM,óÈÔXæq/©‘¥ KA–‚,ç{Ï;U 92œïEÜ_/ï_Œ½èóê _^vßw/w;Ö•ãÝùÙ·¿½ºb~"ìá¿øÝ¯/£r{Ëùöyc¬|ÚӸŲsÙõ>ýC«ºöå.W©…ååò¼ÓÉåŽò¼ÓÉ•ååÁTƒ©S ¤š;k¡©æÎZ$¯H5wÖB9R͵PŽTsg-”3UaªÂT…©*SU¦ªLÕ˜ª1UcªÆT;SíLµ3ÕÁTSLÕ™ª3UgªÎTƒ©S ¤š;k¡©æÎZ$¯H5wÖB9R͵HÞjr¦*LU˜êüg^„<„ çy(múMׯ­á÷²¼~z·Õj¹±òï_ï/q|øðe˜Žöï?žž:Þßm¹Ë–ìª{)bºòINÃãúéÞËq‹c³¼Ôäy©)ÉåŽò¼Ô”äÊòò¼Ô”äÂr¦ªLÕ˜ª1Ucª©v¦Ú™ê`ªƒ©¦:˜ª3UgªÎTƒ©S ¤:߇‡äHu¾É‘ê|’#Õù>< oHu¾É™ª0UaªÂT…©*SU¦ªLÕ˜ª1Ucª©v¦Ú™jgªƒ©¦:˜ª3UgªÎTƒ©S ¦Hu¾É‘ê|W¤:߇‡äHu¾É‘ê|’3UaªÂTó×AŒˆh67oõüº×òrÜê„´.wðã[Nó~þãöþöñÓË ôøÔëEóƒ?í?üû/Ooß¼Cµ6)%¦ïÊV>íé5Vf'£÷RºŽ•qk³”Ë}ʧ¢¶º%ÏÛñ’\Y>Pž·ã%¹°¼³deØbn’W€ô¶¼hÛ_¶Eëõêúϯ“zš–Ôœ…<í7ïžnüù©ÇýÓ󗟼;Ü~yZ;"-/—¶,?óëØ•SϽ×òÎöËQk¦(w”Ge¹²|<LQ.,ï,”W¤š¦(Gªy`Šr¤š¦$¦*LU˜ª0UeªÊT•©S5¦jLµ3ÕÎT;SíLu0ÕÁTSu¦êLÕ™j0Õ`ªÁT©jAªZª¤ª©jEªZ‘ª6¤ª ©jCªÚ˜ª0Uaªy×#oÇ»Ýo>‚ËãR )µæ ðbÔú©,/Mö—Ý„¦ƒ*½ºþÝÍýóÍÝéñ|üyy@•Û·LG›a1V^ò4x1nz6¦ï³·¶2nqÜVÊka¹°¼³PžM“\XÎT©S ¦HuÞhšäHuÞhä©ÎM“©ÎMƒ¼!Õy£i’3UaªÂT…©*SU¦ªLU™ª1UcªÆT;SíLµ3ÕÁTSLu0UgªÎT©S ¦HuÞhšäHuÞhšäHuÞhšäHuÞhä ©ÎM“œ© S¦*Lu¾jšZºÉÜ|T¾cÜeíÀ\.o “Ҿܒc:˜缞ç1~÷§?Ÿ<>ùòp¸–[¼L ÇË(U®®¿Û?½¾åž×IÎÿá¸ò‘¾¬{¼>¼yüù£×~õ›o_?ürxøx¸ù¼òÛ¾—û}~|âøýå?§¼ù­þR>ž ¼y“>ÝÜ¿¿¹{¸ßŸžûÛþ‡7Áþðãþ°øÉ;—éÏex]ùÒO£?¹òæIm:ÎmeÜò±ÜQž{a’\Y>Pž{a’\XÞY$Ÿ÷Â$9R÷ÂyEªó^˜$Gªó^˜$Gªó^˜$gªÂT…©N?YK©ÓOâä'ˆê49’±öCSŽý¯¿ÿæÓÿÿ?^£ endstream endobj 433 0 obj [ 432 0 R 434 0 R 436 0 R 437 0 R 439 0 R 440 0 R 442 0 R 443 0 R 445 0 R 446 0 R 447 0 R 448 0 R 449 0 R 450 0 R 451 0 R 452 0 R 453 0 R 454 0 R 455 0 R 456 0 R 457 0 R 458 0 R 459 0 R 460 0 R 461 0 R 462 0 R 463 0 R 464 0 R 465 0 R 466 0 R 467 0 R 468 0 R 469 0 R 470 0 R 471 0 R 472 0 R 473 0 R 474 0 R 475 0 R 476 0 R 477 0 R 478 0 R 479 0 R 480 0 R 481 0 R 482 0 R 483 0 R 484 0 R 485 0 R 486 0 R 487 0 R 488 0 R 490 0 R 491 0 R 493 0 R 494 0 R 496 0 R 497 0 R 499 0 R 500 0 R 502 0 R 503 0 R 505 0 R 506 0 R 508 0 R 509 0 R 511 0 R 512 0 R 514 0 R 515 0 R 517 0 R 518 0 R 519 0 R 520 0 R 522 0 R 523 0 R 525 0 R 526 0 R 528 0 R 529 0 R 530 0 R 531 0 R 533 0 R 534 0 R 536 0 R 537 0 R 539 0 R 540 0 R 542 0 R 543 0 R 544 0 R 545 0 R 547 0 R 548 0 R 550 0 R 551 0 R 553 0 R 554 0 R 556 0 R 557 0 R 558 0 R 559 0 R 561 0 R 562 0 R 564 0 R 565 0 R 567 0 R 568 0 R 570 0 R 571 0 R ] endobj 430 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 433 0 R /Contents 572 0 R >> endobj 573 0 obj 15090 endobj 575 0 obj << /URI (http://httpd.apache.org) /S /URI >> endobj 576 0 obj << /Type /Annot /Subtype /Link /Rect [ 138.0 555.135 168.54 564.135 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 575 0 R /H /I >> endobj 578 0 obj << /Type /Annot /Subtype /Link /Rect [ 174.95 555.135 265.5 564.135 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 575 0 R /H /I >> endobj 579 0 obj << /URI (http://www.php.net) /S /URI >> endobj 580 0 obj << /Type /Annot /Subtype /Link /Rect [ 179.04 509.008 202.38 518.008 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 579 0 R /H /I >> endobj 581 0 obj << /Type /Annot /Subtype /Link /Rect [ 208.18 509.008 285.96 518.008 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 579 0 R /H /I >> endobj 582 0 obj << /Length 583 0 R /Filter /FlateDecode >> stream xœÍYÝoÜ6ß¿‚ðK`KKÔwQÐÔ—kÉ9©}H‹$(¸׫Z+®õ‘ÿûjH‘ÒjÝöžâ<,#Îg†Ã!ó¸ò‰ÿ¾U?ièÓ4ÍH¾_=jºOF‚X“"†,ò¼€ø!eÙ“))"•âqÌŒàg2ð޼_Õ+ükõáÌ)ˆ|Ç•wFø êvõαMO€ñ×dŸGîW/ïVW¯"â{änk]1šøÌóü”¤4`™úcänO>\þ\·¯*Þ•²~ñ‰Üý{õÏ»ÉZÏ£é×¶Ôw!U’$¡Þ<…1Ò€‚Õ§‰!sˆZ&\þž5Ù;±Øs >Íž¯Æ¸ó‰“À,ßϲ$ËàM'©†Ï%ÌW³ºÓ\aÊ®ó‹OwI#ö²ä|ލO.s¹?ôh,¥¯+Ѷ?ÉÞ^oËû¾“ï÷¶lĶ¡¥ðᑇ¦ä¨ž¨¥ÿ$â³hÖÎLGk%ëûå/s{j‘w>wÝÌ›-¼’9˜õD{»“}UFä¢ü,H·DöøÈí€nù/_/kÚóº ¨C…(-Í=8˜—€¡´ !™ð¥)ÒjY¬ùÞCÚBè¡|Z¿q eÉ›qüP‰™øNÖ#@9w;ÞY„›Ç9?ðM%,AníØdÞHÐÛR+É›òÉg)?;¼º¤#(dýM7‘kÿ‹kàõìÄõ,Ê1>›;æÀ!ñf3³˜F!ÄɃÓã”Eé‰RrùaÆå{ûPMÌ¢¶]×¾»ºR?åƒZ*›y¹ó³€.q:™Ó4P6 ž±ã§F¼—Xd÷Rfœïd™ ƒ0áÕr½é 8–ÝŽðRv;3†´Ð{*|Ð/£¾ºXˆ gf3à8–°±Ž²y ôP·e-è³ûƒ…1Ü ¼,K£P×s¼B…èÎn’(±ý6äa@.k! „ºó13N€ÞhÎõ3P…5LÓÔr’IALýD5/ñ“ΤãñH»­Å¼b~@3è@¼8ñøç¹Ä†âê eZ˜¾F#±ÂÁ@VxpÃ&qtÔÛ6P;˜âàýNÔ8ÚôeU`y@.-sϴКʅ ¾}j feè&Âv£HÒeA+·Ý‘»Ÿ'ͨ;ñŒpodÖ ‹÷²è+ßÃùj‘ZsG-ÆŠ‡c]ñ8‡‰¶rÁ)›9R{РØ´ù`,Ïø½X[ŠVƒ`½ ‚š?Щ8nEµÅ¼¶cñ¥kø‰BGŽ>;Ax:è [÷»3Ù‰…cäàÒ…õgálýpf“ál?އ!=å |U&SÏgº{y_bÅb®=¸¶\ÔãÁHÁã¡SÚÖýÔö‡ƒlºõ¢$Ó$#Òçà0Ïû‘ÒˆªÄÞåÊJ'&Z`5æºEÀVðÒ¾uL]X:xt²tUðîN¿éSw:9Àbš±'B’É=AÚ±“½HPj,r<§ è:wÆ7öv˜œÜ‘2‘!÷ 9„ÞtÁíS v0Lm¬¡GÑ«Fˆ—·×kK¹P^¾°¸Âá®egÁ^àÆÐŒe÷3spàµÝí0§À Ű 5ηґØªÒщ$ÊU¼ZðHĦÑ;® ª4¨ ó Šß]hby}ófM~}ózMàÜ&¿Þ¾&&jN°þæE"Háö‚‡š{‘`”Øn–˜Šî¼â¿S„^DS¥‹eº}¸ÓM¸?E=˜Ù‚¬+ÑåWØ´êVúl„ØúŒDu7ýk–©61a*¥[2­o›«áyçÿ02„óáÙóEù9Èh…YG:?26ïú¢¥y¯ÁF}Ö9'ÆpºäãÁðâú©æû27øv=LaÐÍæs>úxy}{óñÅ8·)–EøÑ\ª(· ÊM‹Ã·¡¦·fTI^ˆy¯Öù³5âÍ‹(xP.×êõpRAJñ¸1¿C‰ !W²SèÕ“mùƼxƒ*£×ÖÂ_UnÄ1Æ š@[¹`r–ÎÄ¿±c©ÊDÌ£ÌK³4 Òçâ}:÷uaðiÅcEš4Fqi‡Ã‰a„º P÷”ÖrÉq¸±súCYW8³ì´!!pˆeÇ;^, U±\²Pg ʳ‘¢qì±$5—ðÂØb—/x8Žg|º4¥aØãïLäæÓ^õ:Á‡6T]À±6ãád7@¿#k´é|œ`7¶‚º!6Ï$@ù¡*Õû)5øÇFè1‘S‹£Êzü¬nâ¥c™î¬ÞÓ¥ÂpºT½)ËöÙˆÅAHcÜ3lô<Œ'WÐ*›+ráÔáVU,ýn©W –À5óTä÷×e¶Ëæé9yÿX7ÅSyh&T›8rõþpà7\¯–¹ouÙåJƺõÓo¶äœQ3Ù6r¯8ÿÇônõ?µŽ0Œ endstream endobj 577 0 obj [ 576 0 R 578 0 R 580 0 R 581 0 R ] endobj 574 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 577 0 R /Contents 582 0 R >> endobj 583 0 obj 2299 endobj 585 0 obj << /Length 586 0 R /Filter /FlateDecode >> stream xœÍVMÛ6½ëWLÑC6@LSÔwQH¦MÅn+ ‡4Z¢-¡²¨Pt\÷ÐßÞ¡¨OË^ô¸Z`Å!9Ã÷gFþâ¸@ñoc^±ï’8N ;:_úy"^ØO”ø, Ô×',€#,§¨ŒÏlÀ†¾{Ñ.à§v(üä|úŒ{r èwvèà]¨ß§¶~Ž_> ç]êl?àRH÷“Ä#‘Ë(ucˆ‰Çó0HðéácÝj^U\—²~ýÒ_œÓWR¿4ªO ˆ˜*QzB]ÏÎáŒh–@®M{ÊbÆ2°ï»é 1^gÏ‹w?q"ÜåºI% .‘x‘:~ð\¼vë\a×H:YUKW%a†–*ôÏÛÌ,Nž/äq~€¬r1[åJ°‚×±€¶V)НTДˆa>™¬÷å àY&U^Ö‡êB®¢ù1&(½ ÷'cÁúÔõ¾eIsdû “§à_ ^•Є· ÏðÕ õù*±Q‚çPêWmâì@~7TÌ­JwÙu‰ýûíXb®»jˆá Þ¡Ét…H° ”¶þ]Û¢ Õƒá,",6,!i×·¢ùûQßo|âºÄ#b<ènüñçGqˆ¸ÕŒîQ@hˆÌg}ÀT¢X¢ÓnÉÜ)ÏŒToP+…§ù_(ìI™ÍܪmK}ÖóáËÔ©®ñúïklà$øqNŽGýÿ¡16ݵ‡û|g$ž |›> endobj 586 0 obj 890 endobj 588 0 obj << /Type /Action /S /GoTo /D [587 0 R /XYZ 72.0 272.413 null] >> endobj 589 0 obj << /Type /Annot /Subtype /Link /Rect [ 403.087 759.389 427.527 768.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 588 0 R /H /I >> endobj 591 0 obj << /Length 592 0 R /Filter /FlateDecode >> stream xœíÙnäÆñ]_Á7k‰K6ï `'vàÀ1bHAX~ fzfsس<¤Ìß§º«úà5Òn¼Žv÷AUÍîªêêêºÈùpzü¿•ò8ôó¼ð6Ç«4z󢔆’ÀY‘Æ>K¼£7J¼Z®q¦!ø3š øÁû×Usx½úù˜³õX÷|¬W¤î®~rd£ ¿%ùoõÍýÕûï/ ¼ûUqÄü€…EQ€Fs?b…üǼû£÷óuËwÛÇ­WnUSu}[ö•hÞýâÝÿíêÛûÑ®£ ðó·¶éŸF"‚ÑdYæScRd"ƒ¤(™¢Èe4‚;À¿«"3‰W๽áÖM(ƒY!˜PVðÈÏG6”— æÍìnn+Lʵ¾é8Ÿ]—¯½wÞmú™w=t|7Ô/O§V”›ƒ©: ÷µØ;Ëj‡Æ‘w]¹çκçªw(–+DjþÄ2×ü?§º¬¾µƒxFÖ)D!\”,’”ͶùÈkñ<]$~Â`AÌÝÈÃ;ËHì,œú¾?¸ yCíH·¯žø„!¨Ÿ>g1È5…ÏH Ú ±5ˆxâíSÅŸGéÜÀƒÔµ¶s'uöë¾-xz›m(¬öɦú~…3ž‚wUÍ-m}Þ ÙòÇa?× øó.Wæj¥jv¢=*×-õ '[x×w@JY#¢ÊDî“å –H4õÙ Õ΀xwCwâ›Þà¥@lK©µ Ä‘î}ÂÛÖ™W6[7œ[uˆ0\>+øŠ¦âx]Shdh¶¼ízÉO’†“~¬ùÑŸJc?#ða„¾SâÞ&º˜£E¤jàÔËMm‡ÎAÐÒ–nêŠ7}gà¤öU³wˆw.ÍœÇÙõÂ7Ò™´ç;Ö ÃA~µ]°Ià ÚÍÌ÷qΕ–¥¥¡L!À¥ZMopg§ /ë^ì9h§5C‚¥»ÎÂZ<œ¾3à±íÝçšÊó‰¦èúݲPúuÿ–w¨?ªph/Ð öXnݵϭhö¾Å¿ÞC\¸Y¦MÞÞlÄÐЖ‰ô°w ç ]f½TÞæn….†³í¤4Íf®œòˆ±vÔm÷L°|<{C'5RzRÝhpü]d•6 ¶{ˆóAf>Ë¥[…{È XæÇ!ð‹ÂR?õ™ïý…w}Õ(·Ñišû•”A&A‰R’‘{°be+EÅ`¼.ÒZî 'Ñuø ;²uX»Ëœ)dcˆ¸)ŽlÊÆ"κŽ. ‘¾Eîxž}‰¸É÷LÄ…ÓKÙD:Ä1HÚ®y¥ï¸B‰‚‘Öû’ÃÒ8…L³ú )‘^>;#y@Qœ@9Ä Ë ÿ§²­J: 5P5‹rnD³«ö–NfT†uƒˆÜa9vév^€ÎE¼å«›‹»´Ò°v.žpmkÇ#cÄkH)}ƒ}¿tÜYYƒóU(Žd,ÆD á£èz ™ˆÛÊñpªØcR5tZðÛÜ¡ø|àŨDzȻœ‰¥ó ´ JPËZ4ÜáÙ ™ß9ó›íÄ,¥¢`¢’,Ž@ÙN¾‰8^'„Q0„”¶>ûfØèÑ-¦!ˆ`.Šð±üÕÒ=Êí¸ö‘JEÄŒa.‰Q% ìÈnå(ùq‰¤2b6QÆÍí¼-ïeé¾kÅQUàÓ;¼ìáÞ–m?œn<Èže±.†þ ä²´8Î,èáÝ v Î8¸±¥«‹´jÇY¤BíasíulÐãÒ\´C""é•§S eš#¢—ùÑäŒå¦“t²i•jɉ1uÿxo@Kq[¤#Ž·Ø7¸R#‚äÀLa%¦Øºµl…÷Â% U‘ö—ZëJa`rÆ•žiaëi>Ùz/D-!ÊT[£Rñ ‘}ËO¡FÂϿބÚ` Æá]嬨z;G´–…É/ÅΜµ˜=( ´º‚”‘{yļ¶‹!õìy¹½“¢ò¤ R³ £+ƒ˜$é¬E¤Šññ Ì´oU•nŠM¶Â „Q O£§ã ¡=)]Zz€b‡¦J•¡:Zj ÎE‘ÖK²(ñƒ$(Š8Ï´"H¾ë±|/µ¾ÜÝÝ´œt¶5wÝqÈ&¤Ne[9ömX쇺tQ Õ: ^¯¯#È(ˆ#,ÍÜþ°^ZC¸º°Ò°¶u%â5Z ‰{ÒlÄ¿9ì©êþÆ (¯l0Ç;vfPß)£€Êª ‡ØjWBÅë‚®<X1Þ¨‰µ‘8Ž?½L‹|ÔBZÈ&Ëß1‰F¤Z‹(7AãªóHÃ;E½›:µUÙ;c* m«ý¡·(Ö<†RgסÎh–|w±¥n ”Œ¢¼ÈÁ$^å  T®­¸Ã×Lf‰Ïm…í‚„ >ž P6qCVØ $Û讃Ÿ¿ûéÀBhÄã¬)@XÖ,È\ŠQ g:ÓV“UI0} w•‡“]Ñë°8³)bæTNù‚¾u1S ©m"HQ;³.a°‚¢©%©<)‚˜Æø¿whtåÑ"#Íy¸Ù5.>ÌÞÊmÑdÛÃI¶@¤èIshP„NŸU>$5ûª{ÈÒÔO£d‰­¹‘§}÷¡¾x£$¸Déc›Ê ƒ‰+ c›Ê‘ïý {Õ/¶”(lÃ(°"Ý,²í]™Ù®-`2³&ð‰·ßWdöµFfßOdn.…ØNC¶}‘E¦ŠRð#63Óo› ´–%v=Ô²³†l0Fñ•Ý:R®†(©”$™(ö¢ô¹ê]Šta•dÇ ™8ϹjØtr6ê «jî6W'd½¿A¢ž$AçKû¸]߃<÷ÂJw/¶s[`Uи2ŸÆ{ÄVÂ¥3>Fõ@m`…ÃÙÏ;¢IšM„Ã<9%a!×Dý)ÐmƪÝUˆh–Ìz®4N­WÂTÓÅp¾’±Ñµ@µ§ã±oP‹g_cßBt¹h£Y1;[©·\55’ÕcΘŸ§E@M='áaW„éò„U9Àƒò+Š,\¢æ ¡§Ú¬ç<}„Ý-íÌ«åqÚ¼vðŽ÷± $涘óB—& ƒ8‹ãÛªÓ·ÓÜÛ†S7ãTC~ŒLügç,)¬¹'ÛÕÖxËðuO‹ bm)K™óLXxÏÞêkF¯›6-/å‹MzŸ‹o¥¬+ÇÒ"Nã îÎTUŽUæU"-ٹ®vÕèÈ`šäé÷¬6¶› ;©‡-÷Г¾*œ‡YèË/7‚¢æœ öUüÃÅÈÉÂâ?hCϼMonÊR?£ Ì’œò5eWàqÈí95ßÀÙoÌõõY VÆ1~wËä}§¦^£©oß 'ó)œƒÒ§pò3÷S¸[vù[8$MŸÃÍÈÑ÷¬“ñÑÌ0…@3æ C‹²¬ˆð*ò3IðÒü4’¦ÁvçÜid]†ÀÖãiJm–)shŽæ­L%f›‘ŒÕ‡ÙÔbõqet‘Ä”ÔØŒfò}e˜Ç~š½`_ì3ûbaŸdaÿƒ-¹çúIæDácùƒ]ð—á«ÍÉýt÷3˜ÓüûÝ5sš³‰u}&ƒûbm/[›J°›õßP€L˜Ÿ.ZÜ?õ–"¡¶¢ÏfR³ .˜ÿØ`ù·&~1¥7iJÿO‹áGÞî/¼7j3“ÃüŽ¡í‹a½Ê°ðõ·jY7ƒj;\ ri±’V½ ÏÄò™ÁÐof@šüL|0ž[舣! ¦ €&ærÑÈ¥Rx‰O>·,=mÄþåÐ÷¢S{S¤?ÊØÂËqï‹u}¤u±ßмاØ×oeIù'x®²æm)$¾QsZ ‰ê(Gƒ+^²6W®Ïkm1{óÖ¶1Ÿ²$y(?®8ø™¨ÆñW)SÝãI«9ð›­ŽG¾•o¦ê³cÊòÿ–rtæ endstream endobj 590 0 obj [ 589 0 R ] endobj 587 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 590 0 R /Contents 591 0 R >> endobj 592 0 obj 3540 endobj 594 0 obj << /Type /Action /S /GoTo /D [587 0 R /XYZ 72.0 163.049 null] >> endobj 595 0 obj << /Type /Annot /Subtype /Link /Rect [ 458.78 321.863 482.66 330.863 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 594 0 R /H /I >> endobj 597 0 obj << /Length 598 0 R /Filter /FlateDecode >> stream xœí\ëÛ6ÿî¿‚è—n€¬J=)-Ðw¸öâ \-‚CS´DÛÄÊ’£Ç:{ý )Yònó¸U7@wfD‡Ãß<(¯÷ýÊEþ]‹qà:qœ t¿z¯å."ò#- ±x!Æ>rÇ Ñ E!ÊÅ‹ð: ~ Æ¿CoWÅ £®~ÿÆdüã Ï(—ªÞ¬^[¶é@/É>Œ¶«¿ß®~ø9D.F·ãbßs°ç&IßKĺݣ߯*¶ÉÖ¢Ùž¼n*Úð²xñºýeõÓí`×>ÆN¼´M¿˜ !„8x &©ÆW2(âÑÀ1«VHÔÔÏY“ñ‰ÅØ6øG‹1nBF¹!’$ðȉ Ýs€YÌîN±â aÊÁ×òÿòÁµ'H­˜P ñäc·Åj»}×Il»¯½ó†+ÕÚöu:ùŒäƒ‘näÑÊ š´eÆ„'©?±D=¾8ÖÃ`»§«kɼzg–“n3‹êã±Íò¼±é¬ød3ƒ¸ ã¸À2‚! T4äìžå“áÆ‘³ó¾ ļ Æ> cŸ€&û\?P÷¬Z—5›Î±nâ¸O”k¿ Nî F†Þ__r¼= oìÃ!§Å|#¨Ê$¨ŸÄÜ"r•ŸDŸ-WuêO,Qºè†Á~OW×’³.èÔÍ.=&K YÔ±p4ª§1•½ü|·ˆO{DïlE¼€i‰`zn̤oÎT½e‚ft…1£ ²žYÍŽ¡è:rCÇCWõCݰ½%àµÍC-ZÀ“§T÷úÖrž7rYdü‘zb/KCó·Þûï—ÔÓÏÓ¤=ÁþÙzzÓÁôܘaUu¦œ.3³åô‹_/Àú+å´bª&-€¬¬ÐS*^ä.±ûÖ±´ØŠœ­x0-LÏ™#­ ^lÏT½eâæRõ¾p™ª‡4ΞTöYbŸõ­¿‘Xì‹ÓðlÙ»€i‰`znÌeÃÓs.6—W§_¶äP× C€­ÚÓÜ–¬ÛÆfk¾-ø†§´h>ÏkR/ò­ÿ·Þ‹-öÖÿÜñ‚¦%¢é¹AËMyîƒÇe¢æriü  EÑ¡­Xþ€Æ xŠrtÏêšn§[6]ø \.°g[H;f‹’® uÔ'7jy¡ì ùü·Éäc°GÎ× ÀþÀ¼Ïˆ°¯ò*±u{îÝêB5ÍLþ¿wÌä1ÀÙv}YÀ.Ú œ®’â·s@GŒ®¶¬`mXÖKš²'%<̓{üJ‡.«£;è¼A @â`'I{’JÞ°¦/ƒ_ €8>Ò¿l¤è¼4rùE3ªìIÚS[~ÏŠž»§ykTí-jkÚyn ë}¦GÞì&–:T¼¬xó0c^{˜²ÔÞÚ„­#‡ oÅîÈ[GÞë¡«5ëIðÔ–eNÏÿäl Ã7=ùP¶=]³¦§{Ó<ËëÞ`[žÙ QO½»:îxº3«Õ=I{ªb´†Öm›e2¶¡mnL>x÷⥙mmux.ž:— ‡%þÈaÂ?زL 6U¹ïÜSÍ®*Ûí®ç£žÒÎWŒt¾"•ó_šqâ£Z÷¼e|§¨1úÏXØy_qå¦'É£6ñmQV€å£~–ß´ƒ1Šç'y4r•³ÞÚN°˜`Ç'Q’ĉšó[-9Ð'é Ó1ÚzÍCêýk.¥­H!Ž‘Üî,t_¶Ecx醩õ,7k ·è´,jžAþSì”™aêv³á)göjM9B™ðAè }PçåQx‹Yy,zFÅ•¢­téôÂÿÈ€Tt½+Û<ëÙ¢lzº­™¥SîK1=D$ÇÍÊ ¯2ú`«xÙ3e‘›'2¬5YÑôn°•‰íGlŸ`7p#µ¨5*+KTêWZj$S¬H7{°©8DVi<ʯ&b¨Š¨Ú*pBPÇcwTԼă€N°+ÉOxœÈ ôJh;TLÖáeë–Ø­³)D¾ Š\ µ,ð•âW2KZÉpœwdNªúGµÂI`£”6€±êeÇj?ϨíØCUÀsšër¼Iñj ‡-«/øO3÷4uú9Dè­jáØ My™é¥tu—¹•³ÁëiÞfÝ9À^R°tϯNðêâÓ_€H—”«Ðv„Q¡¯÷ßPΠʥִ­ÈÖÒž‹Ó.ïjqLJ›.e%SGM°ãú Æ$$ú5çÍg?z¹yÓè—6‡ÞŠíŸÜ„СÖn¬`E€j&T7´‚˜ÍŽb©Äuü€ì Wßò@¡ pÀBÅÒr[ðÿ2¹­M™Cê®Ûp–gç÷¸žùvüÀtxv…ãFûúOžÝ4|Ïn/J°ImÕ\L¾‡&1 ÃÁ¨[ÀD•‚ Í»)Š×ºªÑZ|¾Ý'D‹xÐ)_ ¯ˆïÕ;H$~ÙÔH@W~·Š‹)#ÄøqähLâ‰å麼?i§ ?Ž"H1þ¤ÅΉž‰ˆãâ‹øPã ªg|B’ÑŒ[•¶Ã–¸²H¾Šî´v<ÄLG¾»¢F^3Ù> endobj 598 0 obj 2609 endobj 563 0 obj << /Type /Action /S /GoTo /D [599 0 R /XYZ 72.0 345.179 null] >> endobj 566 0 obj << /Type /Action /S /GoTo /D [599 0 R /XYZ 72.0 244.012 null] >> endobj 601 0 obj << /Type /Annot /Subtype /Link /Rect [ 140.83 346.679 228.58 355.679 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 600 0 R /H /I >> endobj 603 0 obj << /Type /Annot /Subtype /Link /Rect [ 183.491 281.512 202.941 290.512 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 47 0 R /H /I >> endobj 604 0 obj << /Type /Annot /Subtype /Link /Rect [ 209.411 281.512 345.521 290.512 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 47 0 R /H /I >> endobj 605 0 obj << /URI (http://hoohoo.ncsa.uiuc.edu/cgi/) /S /URI >> endobj 606 0 obj << /Type /Annot /Subtype /Link /Rect [ 385.967 196.492 403.187 205.492 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 605 0 R /H /I >> endobj 607 0 obj << /Type /Annot /Subtype /Link /Rect [ 409.664 196.492 523.274 205.492 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 605 0 R /H /I >> endobj 608 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 184.492 135.0 193.492 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 605 0 R /H /I >> endobj 609 0 obj << /URI (http://httpd.apache.org/) /S /URI >> endobj 610 0 obj << /Type /Annot /Subtype /Link /Rect [ 461.121 184.492 491.661 193.492 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 609 0 R /H /I >> endobj 611 0 obj << /Type /Annot /Subtype /Link /Rect [ 499.374 184.492 523.274 193.492 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 609 0 R /H /I >> endobj 612 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 172.492 189.43 181.492 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 609 0 R /H /I >> endobj 613 0 obj << /Length 614 0 R /Filter /FlateDecode >> stream xœÍÙŽä6BÈËÌÝ*Ë·û-™$³³‚9:™ PÙª*o»ì][¿”(K*[ÝÉãÌ&i‰¢HЇÔ_o àïü‘ÇŒæyAÊãÍWMg$ I”jRÐ8L‚ ",¦aBŽäš”FÎq€p†àÇÕXÀä÷›ö& ïnþøÆT$€yç›àæŠÕ盎lzÀß’|Ùßüðp³ù9!, ;«â$¤ ƒ€å$§QXÈ?!y8’?^¿o‡‘7 ë®}ó'yø÷ÍOW{‚€æßÚV?^‰®’e –.¤ØDH r”Ÿ®Y¢¸Êw€?Ÿ9XI¸¯½ç›îyÇÉ`cE‘|¢ù•ëÄì%‡ùfv·ö•PÊõü¦Óõ)ù,žDÏò†Ä9¬ùz<Ôí~0hÉ[øé$Zjð÷;^ºÉÀ{1xXpoêVXæeÐMãio­¢±{ï| £…+>ò-„³~ 1]-„ÁB Ó *Â[ø¯˜s²gÒ‹]µ­Èïk¾mÄpK@ŒW½ ;Ø%‡z (89ò iºî‘4õ£ R¦]×4ÝöpËo~.<æˆÁи!p%Ç`ŸVP‚Wd{¹'ŸÄîÇÀì×øw5ÿmS‹v$ï?ÜBà€¿l=+³º¶å >ÕœœöÃ׆T} ª#_^ƒ þBÒS@3ʾ¼Y3ÌÒk†cwO>tøïÅ翌†”‘®%u”§w§®·Mu·ë…Øœ¦[RvÇSݨ“woß’ Ö åùõBhàútÚ/ys€5דX°ÐòXt”žál¡Ôj;ü%…¾'I…ž áBŸM·ßÁnîÉæÐÅæÈûÇiØœún¿Q>µ9 bªºQ 㦙‰ÐÊgV€¼rìZ‹;‚¦à ¼RÅXJú½×ŒAFJŠ"JÏ•»iNdï5Gü"+Rûßk¤ªuè`„È4\+Ãc#¨:®—‡Ê®ïNPæ(E&4¼Ò”Âs+Låˆz{>v†+÷-?š)=xâÃpîzƒŸ¢5œåùÀx¡pŒtF®[hã.·ž}$ËH *êÉphÄ’ŒC´”M&}Rb}ÔÔÛžC T~5{ÅMRÏR÷²$  eHq)<+I$ËÌù´ fÓâ n,–¬ –s_™kŒ»#åíê4âûä,²Å¯'Ý„yA³8‡âÊßµ–Á¡;v)tFD”¢P¨TƒªžAOâÍ£OXŒÏ>›æñBœ­*öÔfFDTZÑô©·¬ÿÊ™‚h¤sX ;ªC‚öƒ«RF0"¼u˜L·NÝêÌf(ó1Ù̇£…"]hAçTe&:œÝ%rý±ív‚N<ˆàîv‡Ù£>8ƒ¹e=L'Y \îÆ |ÆpÒJ>§¤«\Ž xÎz¿2Í]ïWF1hjHH¯©h÷ЩfLò‚“{e½«UG¬B̤ª–x×_<‡;‚pœyÀh­Õê߃¸Y„nR«¨…Ø©¥B+hÐE@Šqð;s°”ˆqé;ׯ Ä¿;råâˆ9VÒS»Î.ÛX•c (µ0Æï¨¡|ae MãÅVT¦¹c²}ºƒ3Ͷ"v”ƒh5öM”eŠkhÖXâ 3[_¾l¡0y‰‡#$ü]íÊ/mFüC#´Î3æÑ쑳e_Á›f4‘WdyæS|µu¯Ö<;ŒYòÒ|G„ùzÍcï,]L;ò¶çÍDíSz-6•¤B¨¹ëzymsÅŽCûB ¦ _H2ˬ-NTd4ˆƒ È“x.ù0Fx©àÀ\õÐó‡ÑÂ#´ŒÎ8Ý· Œ)aÆt×¢¶.-º›ZusÀAÒ‹%«\£a]i ¼~:Q‹ÿ–º¨›]g qéÚÊà¹Í ˆ¢Âåúº[ë+Š…¾tN.‰’‡@b: h›'•åté Y¬(Ñ^ u‹Lüh¹vâÍ-Š‹ì61ú–v‡Û#JÈ¢ ~–Fó(oG‘g†q}³Ð×ûø J,Ii’?˃̗s0Q%À¸ÉKè,J¯NM@âÚö‚AÏ””|þôѥ׋‘Eî>‹id HÍOa²ø”w°Ð¸UõˆI Xª*°·$Ÿ„A±ÄW¹ x+m¸âÅ"ZLË /Ô3à€Vvî|s£å9ô:‹êÏ:‹í´ˆ:Þ—ýót¡hoÇ®ìÔ)Me‡Â#×4ûqÑ9‹˜‡˜b9! hþ_Äaê™0/óÇjZFcӯ̇q<Ýo6çó™6]I÷ÝÓZå¶â}5l†~Ú,Û:(ñ™TÒ ð°ûs5¢kÂ1ßê³Ð_^VZžqlêøIŒ}-”—(\>hð·O¿|yCg BnoFñ~êåî‹|±þxîpíAƒ%ŒÎGÑr,É5.ŠAл¨%ü.^5EwuaÑJ e_onÜ‚oß½·ˆwrfžõ¬$‰Ö®°‡ß Q¡r¦ª†R#Ðî®ÕfZ¨§_'hiÔ§ªì¹œK\…ù1°¹ÅATÅuÑÃÔ 58^vèoäþ¯vü3×RÇÄg-ú¤êã©qD@—nºÖã ó0H‹,™ûÞ#9‘ùSnó4õЖÁZÒ3凨¸S©6¿¿IÚÌ2¨“eô^a84䯉„„a]OB:s"²lQ9‘î!ßxz~ü»@‘†i‘Yâ„h骃«0ß"j|]6 }÷TW¬³këÖ¥,…žk=²øíÕG‹´Â¸çb}HbÁ…í"°m‘fP¹%ž½‚¢–ã#FYãYz&Øu–!4‚š¦1¶:ë‰:„ºþѶ8ꩤ¢ZEOi•„õSi‚©&óa˜Žî\Ó39L_0kli¼ ,„ú% =;ÿþÄËÕtÌ °!$¢ ‹_ÖÖÒúq­XáEæz¦¶¾ÇÐEâZQ®Ä£]¿_NǤ±´h%ÁzúÒþLÖv)ŒYì[ŠäsÊ mg ¢£Üµ¯Äœæ:2OG¤¤&̾¤øà³ž»þQƒúÞF‚òwÌXu3¨Dj/êtѯ…Z+1 ²Å¶tpVΣÕ ¢¢“NŽ vSQ’cÅUü…üV5ÄòùMiMêËmEŸ¹©ü]1¨¬¡fŸËâf¡ÂÍ~…“0‹ë„i,ÈYÆ^œ‘£§“ñ2Ò¯«F³é™Êpª¸fÎKÂGÙwl+œõïÚÏ,8ìTLÏ â1µ ¾WªC×e¨­¦¡S:EPÿ²ÌŒâ#ÂòùôÖ`© ª}›áÓñUÀBâV¸Ã± Ex¾ûÐ’ÄìÄ+Æó‘ÃiÚ§¸®b´XõêRBêÊæ….´#ôEu/ñÄ¡<‚ êã¹úP¿Löñæÿò©-Ü endstream endobj 602 0 obj [ 601 0 R 603 0 R 604 0 R 606 0 R 607 0 R 608 0 R 610 0 R 611 0 R 612 0 R ] endobj 599 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 602 0 R /Contents 613 0 R >> endobj 614 0 obj 3275 endobj 616 0 obj << /Length 617 0 R /Filter /FlateDecode >> stream xœÍZ[¯Ü¶~?¿‚ 8Ϊº_üR$uÚ8Ha9E¤yஸ»¬µ’¬ËÙœß!‡·•¨ûfûáÌ7"g†ÃápHˆ„ð'þ”i”eE—‡OŠ‘"&I®XY¤q† ‰Ò Îȅܲ2Òˆ>k þÜ´|&¿<´!ùçÃo¿C›š„Ðïún—¢~~øàئý%Ù’ÓÃwOýGF¢<­‹“8㨪*ðh$q%þÅäéB~ûz`Çz_Z_xËÇi ïÚo~'O?>|ÿt3ê$ ƒòKô‡!hŠ¢Âe0I1 ò€ƒŧC–µÜppøwÓäpeq輎£/Ƹí* U!TT| Ê›ÊÒ{óÅŒn+±°k{ÐY¹Z.Où†ìò,¨È×ú‘YôÒ̓E5螎Î÷‘ ÏlpñaØ£eô »épL-Ù²ë=UÎbîôpèæv²Œ+ŸÎÎgœDwôq¸~ÍG60ÒÒ #´­Éس?¾Jz:Ž×n¨$f#Qà |›Yä׿!É„ˆ©*ŠT(e@~è®dêÈ0·ddà4Ú™¦olj¶6j 'ß´¥%) 檰ªÊ2E¹o[hT%Œ³i ½Ÿ'Ë7ÔQºéxv|4ðLŸy{2°k™¡U&Õ°¦ìÒY­½œ{¤[6Ÿ>ÌGkÄ~ìšybÍ‹aóñÈœxH8ÆÚ5aZ~(ó…è N PHထ–6è*ä1nè }14kkCϽ!a[ô–êÒ9²¦3m @?"­'Ù~±qÚÕ†„Bl†1Æ+£=“‘EA–Wàå8½;«v8•3•RÖ&Å¡šÀä[¡cDV2@'p” ɵ›hÞB s?á‚@%g+]Ïôµ«(°0š†Õš`4ÕÚcŠ8ˆ2¿´¸¥«vè˜]\ÈÖYºí& ”Ïšœf"g[ W«ÂtthGΔ ‹½¤ÛÊŒ­À ŸÇÀâ·àFëGËaôp¾mïȆ9i“öÌQ³o˜;*¿Êtá/1^øÝµ%‡®!¬pØëY‰Ã4(Ò¼ªÒ06Þ~…c‹Â,ˆåöˆžUàеG~š·ª‚ÖአEÅ•æð¶æcfðéKàðß·Åj*Q8L®L\ù W¸V÷/îGW Ä¿ÇKQ¾ðíû†äÁDvŽr]M=ÜÃRUՒĪ@R‚eˆ,Bªe¥sDqy!öè ÐÃánµGñÆ ={·Ã8ò†qûSÒ2â_-†æM^õZYeKþòû}¯û®ˆÅ½¾FwÍv€¢òÅp Žº«EžùŒË…´‘_z\i ”í0•ÓÜb JË ¤uʑׅ$U‘´ÚUÜঈ´M7bR’dÛµ;áìZ6Xø­m9ÐV¥C=b½†$x¼† /¨NEtš9-–ó’'\ì™iæ‘!ô05›ÓZÁa8„îyáémÕ‡÷“Åè_¤!p§¡kœ®á¦",OedËP¾SºLVXd i{ó­ë7ã,Ž–q¡­Ljßgñ2£ ’2 pyY t €Ä3tYTbA&Ô“ ªÞ5¼u¸]/ÖõèêÜ.NæF–ΰˆœ4ŒU–FöÓy­Ò3Þ\ì3EVq‰ã½ž9¨k”`ìy°æl¥± e~+D.!¹tÄ’Qû‰©Èa±ÁV×Ú*yßýAàHá)”c02I ôÊlU›yrWæë±{³ØEèiÛA|'E,'Q™OßÔW÷:Å›º£0rq$“ȧ|¿©\&îôÔÊUµË”j˜j#‰o/ ÆºÚØþö½E]Žî¨<âún0Z¸¡‹‚€]k¤€È6(©uåÌwíjÅŠP€¼u;Æ}šaïX<‘N޼®a‘7p˜Þ>6ŒžsCÁÉ0N«²(ªÏ‹Íu»›ëö0`(Œ3‘Ö"@À2Þ À¯DÞ2ŸòŸ¶c%Œîõ4ªe° ‰ é‘õtÀ|‡Œ¦;ZW+ É»%%íl{ˆéÐôÍö€¬'¬à%Ò{+ÎQœ >[Ù3mf×>µÍë‘À¹aNP×,Ü0¾Œ0°GBqH;eF3»> ^dÉbÎ|`‚A S "½g"²gÄε‘â8©]Xð´Tä4¼Ì££wï44yæÑ+.ß®|tšq_·ôºða™,|±öj‚k 7ܨÍPÀKP;´âËÔyb, “ ¯¢ªÌCµÓ¿ÃÂ6Tw‚ ExϤЋ9ˆ"–¥‚AêfH÷dÓ†ŽÍà‰#qÕ&êаò-¼¿HqßëëŒpyÂBö3…NìÕpK«âïÿLRTA!b=öÜYIÝéèDV˜–!JMÏäGÙBV„"jT8‰¹§gõaãëL'¹ÊÓ•/Ú>ç?M…!òv-Õ·øU@¾£‡sOä –Ø”ÿìÎ*ô È`i„…*Óñ((”~]ÁEè2¸Ü )z4·&¤¯0F¦^^Tâ·™XÝܤÙ“jé ôif£Ž&m†Z'žµrùøÚÐ_‰›g+öÔY¡ÔP{é¡GÏÔ–ÑÂu'²¨ÿÛWùVÌ,ì¢}ÇaÚx‹>nø‘ÉÉÄ–hãÅ:o?º——‘*6óõq¤²jHsz8în‡u’q]Ã8ñt%êÉ„®'e!,ñ4– _ÙÄ«Ã+¼-LƒTxj„n0 ! Ë ®ôÅi=9_ì+bê •j0ÞM!­ã ì5"é9"_[øïѯcàãN§ùâês4Ìýþð“Ç_âI5Ä]ºZùB°,±œ­ ie¥?RñjH(†®Xoa\â«¶²äUÜ鋟H/ Cc¹†äÓÑ=9¦ ú:Y¦¾_ìß4:¿#ÓWò ÅùÂEBjqæìá–c 20Q£G‘†)±Ñ¡¤C‘> endobj 617 0 obj 3167 endobj 619 0 obj << /Length 620 0 R /Filter /FlateDecode >> stream xœÍXYoã6~÷¯}È1—Ô­ X ›£M±í6¢X, Ùbl!²äˆÒºù÷R”%Q’“¼Å~0‡ÎÅoùiÆ€âw.‡‘ aµ=é}¾¶§·\JË¥ÔæË…-ô·\Hå™ÎÂjVøÓãEzϲ…_fß¾#O ÏígtB¸u?»ëئpýžì£°ž}^Ì>Þ¸À(,ÚÛ¡ Ã#Û åǂžü!^ÆÅÛ$KDYDe’g¾Ãâ·Ùõ¢çµM) Þ›Ów=4¾ïj‚I‰±ë=Ü©%ÊG=CL²ÖÒÛ©=¨'M¦‹i×à!ŽÞqÓò‘‹!„ü0ÄG$èaÈuæÝx7ÄŠ%í:8šN;X”ØÅÇj_¡võÀã:C•S«s“Åa&ŽŠûxØ©%Ø×¼Dá0/¡HÄ0ðÇ×_¿~¹¾‡yQš܆óÛ«óO´<æ•ã˜f¨OsdpûxÄóˆJY`×G`úÓIex,´Äë E ù(ÁbqàT;2i³BBÝR×w†¢ZSò¬`-½OÒ´¥âj»k)ñÈS^v¹1º¼àÙŠ‹vï!/Ž3”›¨l©ç¼êè“ xÜVäÛîI>‰ÎÅQ-#Á ,6x¿"ÙîÒä!A >_kv¶”"Úr¸½‚QZáã$ƒ2¾‡ƒ„Z›Ê#j¡Æb±Æ’ê+*{!Ç4¡ñe²ûLÛâ’X.­Üß}ÖFôzAÌf„zn:–×@(©£(￳\rQˆ8ÏøØ'åæ@”›öÁ*ßn£,>ÐiÒ9UæyÚJ›d·ãñ¸Ìæò”f´ö$/~ð‚è:Ìb“Wiܱ'UZ/—9¶éÚ^E)䀇ë‚Zã,«RÝïCž¦ù^Æ];Œh¨/¹ÌH/zäâ|D³çšo•:(ª ~–׉ ýÈr~¬ `g 4DÙ6u&ëäé§‘‰mf\ÔDòoŸÅSª}ŽÎåy s\α0@¼Ìd†|Ò Òâv¢ü[¶iÌ‹•ÒrÌ8kœ;! á4¢Úò–ÖÅ£&N¤¹'2é²ñÃZùЈ™f©î®!:èÕŠÛ/oÙ¢Õ*¯²Ö‚:‰´5u”^eÏÈEº8‰yØfBWÏ &¼ÉÈ!?4u@úg.ÊuÁ%R“L”<ŠÏ BK_Gaj3y(½m”xÆ@j[É>n°ïÖÿ6Ý­­0¿|36mÛ7lxš¶kF·)Á8ßù]l꦳ÕÔ‰²õ¤ÝHz¬¼%4B5¥ ª×£šê–Xm‚ÒfûÓf£.öÚ°¨ã–Ü ÏŒP(›_Q;´Í æR¾Çàt ÐlÞQ³èú)éf è3á…Ÿ5DÕ2ëȲ~›c.§¥ ÏJÑ.Ç:MŽ9팦[ÜÐk‡º†×7x?ªmœ©ÖTð§*)P£À… G“ѱÓqÀ3–ŒŽËÞ’ŒvÕ/z½‚ÃÉå_׋k¸ºX\|¾¸¿ÖIyrÔ!Ϭ.„ì1†fæŽxnòŒyîÒñNx>`x®kÐϯ­A®e†þÅäêÈëû ÎÓ8xôÇ›½jâ\m—E²zá¶Å–ë¿áÏh„ƒ·EØdßé×U¾ä8¹G%g¯°GFXý}ÒáÏ¡ٔY¾®OÉnòF$?vñSÛòÍH/ *ä\)rØsœ.E•È—™2õÖÁa­+dò©^zëR «¾T©³’ªÿîfÿþ­Ì endstream endobj 618 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 619 0 R >> endobj 620 0 obj 1363 endobj 622 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 730.013 176.089 739.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 492 0 R /H /I >> endobj 624 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.451 730.013 525.451 739.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 492 0 R /H /I >> endobj 625 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 718.013 229.82 727.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 495 0 R /H /I >> endobj 626 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.213 718.013 525.213 727.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 495 0 R /H /I >> endobj 627 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 706.013 296.772 715.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 498 0 R /H /I >> endobj 628 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.723 706.013 524.723 715.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 498 0 R /H /I >> endobj 629 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 694.013 214.103 703.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 501 0 R /H /I >> endobj 630 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.478 694.013 525.478 703.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 501 0 R /H /I >> endobj 631 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 682.013 214.103 691.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 504 0 R /H /I >> endobj 632 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.478 682.013 525.478 691.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 504 0 R /H /I >> endobj 633 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 670.013 214.103 679.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 507 0 R /H /I >> endobj 634 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.478 670.013 525.478 679.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 507 0 R /H /I >> endobj 635 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 658.013 293.959 667.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 510 0 R /H /I >> endobj 636 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.745 658.013 524.745 667.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 510 0 R /H /I >> endobj 637 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 646.013 290.377 655.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 513 0 R /H /I >> endobj 638 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.883 646.013 524.883 655.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 513 0 R /H /I >> endobj 639 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 634.013 318.127 643.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 516 0 R /H /I >> endobj 640 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.665 634.013 524.665 643.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 516 0 R /H /I >> endobj 641 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 622.013 348.393 631.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 417 0 R /H /I >> endobj 642 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.429 622.013 524.429 631.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 417 0 R /H /I >> endobj 643 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 610.013 285.47 619.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 521 0 R /H /I >> endobj 644 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.921 610.013 524.921 619.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 521 0 R /H /I >> endobj 645 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 598.013 313.792 607.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 524 0 R /H /I >> endobj 646 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.699 598.013 524.699 607.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 524 0 R /H /I >> endobj 647 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 586.013 345.873 595.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 527 0 R /H /I >> endobj 648 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.367 586.013 524.367 595.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 527 0 R /H /I >> endobj 649 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 574.013 275.547 583.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 330 0 R /H /I >> endobj 650 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.999 574.013 524.999 583.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 330 0 R /H /I >> endobj 651 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 562.013 263.978 571.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 532 0 R /H /I >> endobj 652 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.089 562.013 525.089 571.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 532 0 R /H /I >> endobj 653 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 550.013 316.626 559.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 535 0 R /H /I >> endobj 654 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.24 550.013 525.24 559.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 535 0 R /H /I >> endobj 655 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 538.013 245.64 547.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 538 0 R /H /I >> endobj 656 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.232 538.013 525.232 547.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 538 0 R /H /I >> endobj 657 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 526.013 310.066 535.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 541 0 R /H /I >> endobj 658 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.729 526.013 524.729 535.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 541 0 R /H /I >> endobj 659 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 514.013 319.369 523.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 365 0 R /H /I >> endobj 660 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.656 514.013 524.656 523.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 365 0 R /H /I >> endobj 661 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 502.013 305.676 511.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 546 0 R /H /I >> endobj 662 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.36 502.013 525.36 511.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 546 0 R /H /I >> endobj 663 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 490.013 261.277 499.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 549 0 R /H /I >> endobj 664 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.981 490.013 524.981 499.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 549 0 R /H /I >> endobj 665 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 478.013 294.725 487.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 552 0 R /H /I >> endobj 666 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.739 478.013 524.739 487.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 552 0 R /H /I >> endobj 667 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 466.013 327.945 475.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 555 0 R /H /I >> endobj 668 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.591 466.013 524.591 475.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 555 0 R /H /I >> endobj 669 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 454.013 249.094 463.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 412 0 R /H /I >> endobj 670 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.205 454.013 525.205 463.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 412 0 R /H /I >> endobj 671 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 442.013 261.84 451.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 560 0 R /H /I >> endobj 672 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.977 442.013 524.977 451.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 560 0 R /H /I >> endobj 673 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 430.013 220.458 439.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 563 0 R /H /I >> endobj 674 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.281 430.013 525.281 439.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 563 0 R /H /I >> endobj 675 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 418.013 371.08 427.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 566 0 R /H /I >> endobj 676 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.251 418.013 524.251 427.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 566 0 R /H /I >> endobj 677 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 406.013 418.5 415.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 569 0 R /H /I >> endobj 678 0 obj << /Type /Annot /Subtype /Link /Rect [ 513.879 406.013 523.879 415.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 569 0 R /H /I >> endobj 679 0 obj << /Type /Action /S /GoTo /D [574 0 R /XYZ 72.0 745.889 null] >> endobj 680 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 394.013 267.866 403.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 679 0 R /H /I >> endobj 681 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.933 394.013 524.933 403.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 679 0 R /H /I >> endobj 682 0 obj << /Type /Action /S /GoTo /D [574 0 R /XYZ 72.0 664.752 null] >> endobj 683 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 382.013 250.62 391.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 682 0 R /H /I >> endobj 684 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.192 382.013 525.192 391.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 682 0 R /H /I >> endobj 685 0 obj << /Type /Action /S /GoTo /D [574 0 R /XYZ 72.0 413.381 null] >> endobj 686 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 370.013 302.465 379.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 685 0 R /H /I >> endobj 687 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.789 370.013 524.789 379.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 685 0 R /H /I >> endobj 688 0 obj << /Type /Action /S /GoTo /D [584 0 R /XYZ 72.0 643.889 null] >> endobj 689 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 358.013 297.483 367.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 688 0 R /H /I >> endobj 690 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.829 358.013 524.829 367.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 688 0 R /H /I >> endobj 692 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 346.013 218.271 355.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 691 0 R /H /I >> endobj 693 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.163 346.013 525.163 355.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 691 0 R /H /I >> endobj 695 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 334.013 234.331 343.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 694 0 R /H /I >> endobj 696 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.177 334.013 525.177 343.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 694 0 R /H /I >> endobj 698 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 322.013 234.331 331.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 697 0 R /H /I >> endobj 699 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.177 322.013 525.177 331.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 697 0 R /H /I >> endobj 701 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 310.013 252.576 319.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 700 0 R /H /I >> endobj 702 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.045 310.013 525.045 319.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 700 0 R /H /I >> endobj 704 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 298.013 235.312 307.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 703 0 R /H /I >> endobj 705 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.313 298.013 525.313 307.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 703 0 R /H /I >> endobj 707 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 286.013 251.297 295.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 706 0 R /H /I >> endobj 708 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.189 286.013 525.189 295.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 706 0 R /H /I >> endobj 710 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 274.013 293.591 283.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 709 0 R /H /I >> endobj 711 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.747 274.013 524.747 283.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 709 0 R /H /I >> endobj 713 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 262.013 290.96 271.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 712 0 R /H /I >> endobj 714 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.879 262.013 524.879 271.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 712 0 R /H /I >> endobj 716 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 250.013 355.172 259.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 715 0 R /H /I >> endobj 717 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.375 250.013 524.375 259.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 715 0 R /H /I >> endobj 719 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 238.013 321.145 247.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 718 0 R /H /I >> endobj 720 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.547 238.013 524.547 247.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 718 0 R /H /I >> endobj 722 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 226.013 216.586 235.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 721 0 R /H /I >> endobj 723 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.309 226.013 525.309 235.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 721 0 R /H /I >> endobj 725 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 214.013 243.192 223.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 724 0 R /H /I >> endobj 726 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.253 214.013 525.253 223.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 724 0 R /H /I >> endobj 727 0 obj << /Type /Action /S /GoTo /D [587 0 R /XYZ 72.0 665.575 null] >> endobj 728 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 202.013 243.986 211.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 727 0 R /H /I >> endobj 729 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.244 202.013 525.244 211.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 727 0 R /H /I >> endobj 730 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 190.013 236.969 199.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 588 0 R /H /I >> endobj 731 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.301 190.013 525.301 199.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 588 0 R /H /I >> endobj 732 0 obj << /Type /Action /S /GoTo /D [593 0 R /XYZ 72.0 501.842 null] >> endobj 733 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 178.013 322.649 187.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 732 0 R /H /I >> endobj 734 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.631 178.013 524.631 187.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 732 0 R /H /I >> endobj 735 0 obj << /Type /Action /S /GoTo /D [593 0 R /XYZ 72.0 151.367 null] >> endobj 736 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 166.013 223.208 175.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 735 0 R /H /I >> endobj 737 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.261 166.013 525.261 175.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 735 0 R /H /I >> endobj 739 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 154.013 236.238 163.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 738 0 R /H /I >> endobj 740 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.309 154.013 525.309 163.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 738 0 R /H /I >> endobj 741 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 142.013 318.238 151.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 600 0 R /H /I >> endobj 742 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.665 142.013 524.665 151.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 600 0 R /H /I >> endobj 743 0 obj << /Type /Action /S /GoTo /D [615 0 R /XYZ 72.0 745.889 null] >> endobj 744 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 130.013 304.812 139.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 743 0 R /H /I >> endobj 745 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.665 130.013 524.665 139.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 743 0 R /H /I >> endobj 746 0 obj << /Type /Action /S /GoTo /D [615 0 R /XYZ 72.0 350.527 null] >> endobj 747 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 118.013 234.895 127.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 746 0 R /H /I >> endobj 748 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.173 118.013 525.173 127.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 746 0 R /H /I >> endobj 749 0 obj << /Type /Action /S /GoTo /D [615 0 R /XYZ 72.0 133.899 null] >> endobj 750 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 106.013 280.537 115.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 749 0 R /H /I >> endobj 751 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.96 106.013 524.96 115.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 749 0 R /H /I >> endobj 752 0 obj << /Type /Action /S /GoTo /D [618 0 R /XYZ 72.0 687.889 null] >> endobj 753 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 94.013 284.367 103.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 752 0 R /H /I >> endobj 754 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.93 94.013 524.93 103.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 752 0 R /H /I >> endobj 755 0 obj << /Length 756 0 R /Filter /FlateDecode >> stream xœÍÝQsÉqàñ÷ýx¤#ÎPUefUæÓ…-ɶ.|gÉ» ]„ÃXrÈE˜ PpåýöWÙ3à`¦{ÅùǽèqÂ`ÿ=ù#Á®êªî?SoÊü¿¿Ïÿq­·îqóöÇoþ|ü|½íFúñSVnµY)rSõ¶ÙÍ7矲›yÌ«ÚËGóÎÚùú‡›?}óðM¹ùçoþã?góî¦ÌãþòMù…7_ÞêÛoþðê{;óã¿¥ïïõw(¥ÜúßÞ7ø‡sà1Æm¹„_ÞFŸ›Ÿ9¼cþ§³oäòå᫜}æð+8üï/~Ëeõ—íßÑó¿™o®Ü|øæ¿ûæWÿ4¿§róÝûÓߨ1«Z#FÄüO·Þ"ÿ_»ùîÇ›ÿxSíïþóæ»ÿõÍo¿Ûúó7ó«[ÿYiù}}ùEÏ?Yã¶y)¥žýÚÕó×0Ž¿æÃ/ù»»ï?înßßüúñáy÷ðütøØø›G˸¥Ï·m~8Zooþnþ·â·qóæwOÏw?Þ=ß?>Þå˱µèüÃì}þ‰^½Ë«÷X7nû˜¿’ùwkuØíe<=A,$î$·Fb#±Ïxþ1—1®¨¥¢ZQ=H­Õ‚êŽê µ5Tª‘eG–Yvd9å@–YdéÈÒ‘¥#Ë@–,ƒX¶B,[!–­ËVˆe«Ä²UbÙ*±lX¶F,[C–‚,Y ²d©ÈR‘¥"KC–†,íxÒó´ïëu/¨TwT©GCµ¡ÚIíÕŠjdÈ2e Ë –Rˆ¥b)…XJ%–R‰¥Tb)XJ#–Òˆ¥4d)ÈR¥ KE–Š,Y²4diÈÒeG–Yvd9å@–Y:²tdéÈÒ‘e Ë@–A,µK-ÄR ±ÔJ,µK­ÄR+±ÔF,µKmÈR¥ Ëynï½F„U2é§*·j%ܷΖk¿ÈG»ÑXÍKÖef2ÆÍ›?|¾û_OÏwûç—Ï|ø|ÿn·šb·>ǸeÈÆû½¹1ÓÒ|þç?±ëƒ¶fZH=HóÚ TwT©½¡ÚPí¤dÈ2ˆeδšXæL ©‰eδšXæL ¨±Ì™R#KA–‚,Y ²Td©ÈR‘¥!KC–ó‡þs—â¦WÔ½ ZPÝQ¤ Õ†j'µWT+ª‘e Ë@–,ƒXæL ©‰eδ€ºËœi!5±Ì™RËœi!5²d)ÈR¥"KE–Š, Y²4diȲ#ËŽ,;²Èr Ë,Y:²tdéÈ2e Ë –9ÓBjb™3- ®Ä2gZHM,s¦ÔXæL ©‘¥ KA–óÜ~¨”Zu\=y‘Ó,­ÎƒÚÆ1[³,½®fYÚ2Ë2Ï/íæÍ?}Øß½»øpúÔûýã§Ww§?¾ÛíO/ÚíŸÖ«Ær`6ÆÏóõW?½1B‹èZ6¾é­©ÕÕAê9B#µ¡ÚI=Gh¤VT§å(%fñõºT ª;ªƒÔ£¡ÚPí¤öŠjE5² dÈ2eË¡‘šXæ Ô•XæÔÄ2Gh¤&–9B#5²d)ÈR¥"KE–Š, Y²4diȲ#ËŽ,;²Èr Ë,Y:²tdéÈ2e Ë –9B#5±Ì¨+±Ì©‰eŽÐ@݈eŽÐH,Y ²œçö#Ü\ÁPFçIþh󤯯a«AZô›!ƒ´ÃÅðÜ#7oæ“Û¸8°Î¯SKËý9²~‹W¯Ž³ÙZÄüy¹>îò7¡Îa¨­¢ZQ=H=‡¤TwT©çŸ)R#Ë,Y:²tdÈ2e Ë –­ËVˆe+IJUbÙ*±l•X¶F,[#–­Ëù#šÔ‚,Y ²Td©ÈR‘¥!KC–†, YvdÙ‘eG–Yd9¥#KG–Ž,Y² dÄR ±”B,¥K©ÄR*±”J,¥KiÄR±”†,Y ²d©ÈR‘¥"KE–†, Y²ìȲ#ËŽ,²Èr Ë,Y:²tdÈ2eK-ÄR ±ÔB,µK­ÄR+±ÔJ,µKmÄR²d)ÈRen¿á/Oç,;/rŸòæ4ÐÖtÓò÷órº©]N7ù_›nZ½Å•ÓM«ãþêtÓ×ë×ÓMWÔŠêAê×ÓMWÔ‚êŽê õëé¦+jd9¥#KG–Ž,Y² dÄòlºéŠšXžM7}½®ÄòlºéŠšXžM7]Q˳é¦+jd)ÈR¥ KE–Š,Y²4diÈÒeG–Yvd9å@–Y:²tdéÈÒ‘e Ë@–A,Ϧ›®¨‰åÙtÓ×ëJ,Ϧ›®¨‰åÙtÓ×ëF,Ϧ›®¨‘¥ KA–‚,Y*²Td©ÈÒ¥!KC–YvdÙ‘å@–Yd9¥#KG–Ž,Y² by6ÝtEM,Ϧ›®¨‰åÙtÓ5±<›núz݈åÙtÓ5²d)ÈRåqº LçœM7­ŽÛšnŠË»ät“\N7¿6Ý´z‹+§›VÇýÕ馯ׯ§›®¨ÕƒÔ¯§›®¨ÕÕAê×ÓMWÔÈr KG–Ž,Y² dÈ2ˆåÙtÓ5±<›núz]‰åÙtÓ5±<›nº¢&–gÓMWÔÈR¥ KA–Š,Y*²4diÈÒ¥!ËŽ,;²ìÈr Ë,²tdéÈÒ‘¥#Ë@–,ƒXžM7]Q˳馯וXžM7]Q˳馯×XžM7]Q#KA–‚,Y*²Td©ÈR‘¥!KC–†,;²ìȲ#Ë,²Èr KG–Ž,Y² dÄòlºéŠšXžM7]Q˳é¦+jby6Ýôõº˳é¦+jd)ÈR¥ Ëãt˜Î9›nZW/gF»©e}cÙÃlS>ªææÍw?Ü?|x:½~~<}ü_9½ú~÷þq¿;½þùñóéÅrsÚÕ˜«Þ†å »l|§ƒWÇÙm ;ÜÇv}Üzhç(ŸÿÚ£\Y>P>ÿÁG¹°¼³

ÿÑG9S5¦Ú™jgª©¦:˜ê`ªƒ©:Su¦êL5˜j0Õ@ªùE”#U)HU R•ŠT¥"U©HUR•†T¥1UaªÂT…© SU¦ªLU™ª1UcªÆT;SíLµ3ÕÎTSLu0UgªÎT©S ¦L5ª¤ª©jAªZ‘ªV¤ª©jCªÚª6¤ª© S¦:ÿ9°¥´dµÜrE5Z²õeVÃÄè7µ­ïŒ)Ç›®x>ÑùÍŸ~¸ûÃéå»»ç»ïïžv§Ï<íö?íöÿóò$kžÈè_ätôÆØ±çÃLºëÆqë1 ²| <Ÿ5Iraygy <Ÿ7Irc¹£Ü˜ª1Ucª©v¦Ú™jgªƒ©¦:˜ª3UgªÎTƒ©S ¦Huy%É‘êòJW¤º<‡’äHuy%É‘êò,J’3UaªÂT…©*SU¦ªLÕ˜ª1UcªÆT;SíLµ3ÕÁTSLÕ™ª3UgªÎTƒ©S ¤º<¤’äHuyL%È+R]TIr¤º<ªä ©.«$9S¦*L5‡ŒùxËybCÆ[9dtŸç+ÖëÆq›CÆ×—F¿ 7NȳÙ2î /ß=ž>~þáÕxûøã§Ç‡ÝÃóÓésW#ɼšÕŽ#ÉÕ×>¹:,n%ï?êÅ6Ž["ËåŽò^Y®,(…åÂòÎr¦êLÕ™ª3Õ`ªÁT©æU-”#Õ¼ª…r¤šWµPŽTóªÉRÍ«Z(gªÂT…© S¦ªLU™ª2UcªÆT©v¦Ú™jgª©¦:˜ê`ªÎT©:S ¦L5˜j Õ¼ª…r¤šWµH^‘j^ÕB9RÍ«Z(GªyU åLU˜ª0Õ|Ž@÷ˆ @NäsˆÒ»ž'·>®^Þ¡-‡(¯w¿~¢–?νžËw§?þüô¼Ûÿ|úÄãûÓÇϯ˷ïï?|Þß=ß?>œ>ýþþãîiëÄ6æi–ÉØø†Noœáê¨ó—+‡mà’ÚPí¤žg·¤VTPç©-©ÕÕÄ2OkIM,ó¤ÔXæ)-©‘¥ KA–‚,Y*²Td©ÈÒ¥!KC–YvdÙ‘eG–Yd9¥#KG–Ž,Y² dÄ2O\IM,ó´Ô•XæI+©‰ež²’šXæ +©‘¥ KA–9waµÔù'9{Ë“Umn[g¡õòáUy®úúŽ'_ÎUõ°k¾ÙÍ›ß>üt¿|øq÷ð|úäOwûû»ï7N;kò”œÃoï}zƒÕqýv„–ÒÅ6Ž[‘åž_ç¦_’Ëå¹ï—äÊòòÜúKra9SU¦jLÕ˜ª1ÕÎT;SíLu0ÕÁTSLÕ™ª3UgªÁTƒ©RÍ%Ê‘j-QŽTsp‰r¤šÃK’7¤šL”3UaªÂT…© SU¦ªLU™ª1UcªÆT;SíLµ3ÕÎTSLu0UgªÎT©S ¦L5j=QŽTsðIòŠTsø‰r¤šP”#Õ‚¢œ© S¦šËº¢‡«oq4—ÃÐh%ò& ǵº1}}Ë/ãP;Ü2¢æ=)¾}üqwzõðø¼{:½<\9||¼drx±\É ,?®ùG°•2Ô6¾úéVÇÙm)VŠºo·Ó8Êç?b(W–”ÏÄP.,ï,”ÏÄPÎTSu¦êLÕ™j0Õ`ªÁT©æV”#ÕܪBòŠTs« Ê‘jnUA9RÍ­*(gªÂT…© SU¦ªLU™ª1UcªÆT©v¦Ú™jgªƒ©¦:˜ª3UgªÎT©S ¦H5·ª ©æV’W¤š[UPŽTs« ÉRÍ­*(gªÂT…©æB ŸES!çýË:°ˆù•êÖq«1MÞïõÝícšÃ•µœ{ºy󻇧ç»O«¹–Ͼþø_ï>ÿ÷éåÝûWÝçìO/ÿøpÿª\®Ï=<¯W…É­n¹­gõíŽß˜òϱR•üM[·5åOro,7–;Ê£²\Y>HžSþ(–#Õœò'yEª9år¤šSþ(Gª9åOraªÂT…© SU¦ªLU™ª1UcªÆT;SíLµ3ÕÎTSLu0UgªÎT©S ¦L5jNù£©æ”?É+RÍ)”#ÕœòG9RÍ)”3UaªÂT—]såx¯°ëÏóôXú˜gáǵ¶1å—›)òôøx󯞧àÿ¼{Øíïßž>q?Ϙ÷Ÿßæ óêÔvžû˜Î3ôQÆÆ[ŸÞcuÜĪó<Ân·:Ë“ çIÉåŽò< "¹²| ž?ʼ‹¡å² .ÁµhÇm‰ÏÐûeL|¸»Ù< ó›7ÿöíß?}Ú½½>ùÃýúZOÍ /mZ¿ïéàÕqv; ”R-6Ž»üÍ©óïÈÛüû‡reù@y>íŠäÂòÎò@ùüû‡r¤š{ÚH.LU˜ª0UeªÊT•©*S5¦jL5ïèÇdWäy@’+ËÊó>€$–w–Êó>€$7–3Õ`ªÁT©.÷$9R]îHr¤ºÜäHu¹ ÈR]îHr¦*LU˜ª0UaªÊT•©*S5¦jLÕ˜jgª©v¦Ú™ê`ªƒ©¦êLÕ™ª3Õ`ªÁTƒ©R]îHr¤ºÜä©.÷$9R]îHr¤ºÜäLU˜ª0ÕåAF%"ÆÖpû‡Åù äâ>‡ómë¸vyÀÑæˆn}o•ÃŽ¶ny3ôËõŸ‡Ï¾þøO÷ïÿòtúÄÿùîWyqþWÿ÷÷«q†Þö6G£øÆ>½Ã긙z-żo·A– Ë;Ëå½±ÜXî(•åÊr¦êLÕ™ª3UgªÁTƒ©R•‚T¥ U)HU*R•ŠT¥"U©HUR•†T¥1UaªÂT…©*SU¦ªLU™ª1UcªÆT;SíLµ3ÕÁTSLu0UgªÎT©S ¦HU RÕ‚Tµ U-HU+RÕŠTµ"UmHURÕÆT…© S¦:ÿ9(®U·ò_<ïÏáL›Ãí(M6Žk·Šlm}‹;®×9`úý~·ßýùóýÓýóê¾5Ÿœ_.$6Þèå-VGÛZãðDáõQ—¿užÆ¢\XÞY(Ÿ§±(7–;Éó"-Ê•åH5/Ò¢©æEZ”#Õ¼H‹r¤šiI.LU˜ª0UeªÊT•©*S5¦jLÕ˜jgª©v¦:˜ê`ªƒ©¦êLÕ™ª3Õ`ªÁT©æEZ”#Õ¼H‹r¤šiQŽTó"-ÉRÍ‹´(gªÂT…© S¦ªLU™ª2UcªÆT©v¦Ú™jgª©¦:˜ê`ªÎT©:S ¦L5˜j Õ¼H‹r¤šiI^‘j^¤E9RÍ‹´(Gªy‘åLU˜ª0Õ¼µÍa¨Ö­y‡_˜.8Ìi̯¢]6ŽÚœÓÐõ-zì¸Þzþ4òõEÚÃgßï<½z¹ãèòâéñóþíúÁyº>¿¶­¯z:|54©·í厭ëãÖ#eù@¹– Ë;Ëå½±ÜXî(Lu0ÕÁT©:Su¦êL5˜j0Õ@ªyõåH5¯þ’¼"Õ¼ú‹r¤šWIÞj^ýE9S¦*LU˜ª2UeªÊT•©S5¦jLµ3ÕÎT;SLu0ÕÁTSu¦êLÕ™j0Õ`ªTóê/Ê‘j^ýE9RÍ«¿(Gªyõ—ä ©æÕ_”3UaªÂT…©æJ=®ú¼~T‘;SG‹Ræ_˜ã¤lŒ”l}·&;>ÔºÏ?[ËY—Ïf}øøÓ~÷ýçûϧÏ|ÿp·¿_–æ¸Dz~²ñ…O‡oŒO¬ÏßíºqÜÖøååò9>A¹±ÜQ>Ç'(W–”;Su¦êLÕ™j0Õ`ªTs|‚r¤šã’W¤šã”#ÕŸ¼!ÕŸ œ© S¦*LU™ª2UeªÊT©S5¦Ú™jgª©¦:˜ê`ªƒ©:Su¦êL5˜j0Õ@ª9>A9RÍñ Ê‘jŽOPŽTs|Bò†Ts|‚r¦*LU˜j>=¡ËqÜõgæËÓ¬Wµ®Ž½ès÷\_ß §¿ 7¶vÏÅ«Ýsq¹{nùDدÂõ¿{y5ú˜_I}l|ÙÓñ«ãú­ç3ÝÛÖw»:Y›¿u ž¿a¤6T;©­¢ZQ=HÝ ªÕȲ#Ë,²ÈÒ‘¥#KG–,Y² b™·%5±Ì›‰‚º˼•(©‰eÞH”ÔÄ2o#Jjd)ÈR¥ KE–Š,Y²4diÈÒeG–Yvd9å@–Y:²tdéÈÒ‘e Ë@–A,ón¡¤&–y¯PPWb™w %5±Ìû„‚º˼K(©‘¥ KA–¹›¥[)nJF¹bmþœ ·¼Ü³:nsX4Ö7‡gfX>Šûß^ wxùøi·ŸC¤‡§O‡½Ú¡— oFh¾ñ5NG_6ÿ®v)}lvùû”ÛÖHí ÎMk¤VTRÏ¿«¤TwT©±ÌÍj¤F–‚,Y ²Td©ÈR‘¥"KC–†,--k©5¯ =ï•åÊòòQX.,ï,”{c¹±œ©S ¦H5w¨¡©æ5”#ÕÜ¡†r¤š;ÔHÞjîPC9S¦*LU˜ª0UeªÊT•©S5¦jLµ3ÕÎT;SíLu0ÕÁTSu¦êLÕ™j0Õ`ªÁT©æ5”#ÕÜ¡FòŠTs‡Ê‘jîPC9RÍj(gªÂT…©æ?ódò°CíúñòòL/áÃlã¸Í¿¯ï»ã‡j’Où§û‡û§ŽCüç^6¤-/þ}÷þ7ÿxzyÿêºéÆp4+¥×¯zz‹‘`؈hùkZ·5$y>Û…äÊòò9D¹°¼³

‡„(gª–ª^Êð­?<[ƒB”+ËÊGa¹°¼³ž^/'ÿo”_(1ÇÍs<¹ñ–§ƒ/Ë6X>a϶¾•Ëß—|Ê;ËåyÃ’Ë乤åÊòòŠTsY+Ê‘j.l%yCªyAåLU˜ª0UaªÊT•©*SU¦jLÕ˜ª1ÕÎT;SíLu0ÕÁTSLÕ™ª3UgªÁTƒ©RÍ š(GªyAåH5/h¢©æM’7¤š4QÎT…© S¦*LU™ª2UeªÆT©SíLµ3ÕÎT;SLu0ÕÁT©:Su¦L5˜j0Õ@ªyAåH5/h’¼"Õ¼ ‰r¤š4QŽTó‚&Ê™ª0Uaªù†— “``yCÑðn[lj]ô£á|1e/ûZÛÍ›ïvO¯¶±ÎOüüøyzõWVµæ €ç³'»èÆ—9½Çj°.·5Z™¿ú­ãÖcûÎò y˧¨ÜXî(ϧ¨\Y>PžOQ!9Rm ©æSGH.LU˜ª0UeªÊT•©S5¦j©ZçϧâWåò\½@rc¹£Pž«H.,gªÎTƒ©S ¤º¬^ 9R]V/€¼"ÕeõÉ‘ê²zä ©.«HÎT…© S¦ªLU™ª2UeªÆT©SíLµ3ÕÎTSLu0ÕÁT©:Su¦L5˜j ÕeõÉ‘ê²zäHuY½@r¤º¬^yCªËê’3UaªÂT…©.^  —½®£‡ÇØ:N.ŸÇ˜³²¾»Õ<»È/QçŸq½yóí¿ÿñÕ«§ÏŸ>=î/W)Wõ[}Ùº¸~ËWÇ_˜{búFXßú^VcøÜCòòÜCraygy <÷ÄÜXî(w¦êLÕ™j0Õ`ªÁT©æ$Ê‘jNB‘¼"Õœ„B9RÍI(”#Õœ„B9S¦*LU˜ª2UeªÊT©S5¦jLµ3ÕÎT;SLu0ÕÁT©:Su¦êL5˜j0Õ@ª9 …r¤š“P$¯H5'¡PŽTsŠä ©æ©4Ê™ª0UaªÂT•©*SU¦ªLÕ˜ª1Ucª©v¦Ú™ê`ªƒ©¦:˜ª3UgªÎTƒ©S ¤š“P(Gª9 …r¤š“P(Gª9 Eò†Ts åLU˜ª0Õ\`2F)^:š©YV˜x=$·4Ý8n}>e,w”ÏÑ8Ê•åås4Žraygy \˜ª0UaªÊT•©*S5¦jLÕ˜ª1ÕÎT;SíLu0ÕÁTSu¦êLÕ™ª3Õ`ªÁT©æ³jPŽTói5$¯H5ŸWƒr¤šO¬!yCªùÌ”3UaªÂTçéWëuZÉ©G^Ùk6ϾF^;\ŸWm}õõ ‹æ’ÞäyŽ)gg_‡OξŽÿñpöuxñêìëX>x÷*}¾{xw÷ññawúÜ_vß¿ vûŸvû™ÛøžO‡mÌ H‘R¢ÈÆq[s(7–;Êgreù@ù(,–w–3UgªÎT©S ¦H5çPŽTsnåH5çPŽTsn€ä ©æÜÊ™ª0Uaª’ãb ÷1Èb]¦é÷þÕ‘‹>¼¿ÿðy¿ùàô9ÞÒ®Ç[L®¾ÐéM6^c\rÂê°­q©ƒÔùBPªÔsÈEjEõ,Ú<É­±å´5àB¹°¼³

ËåŽr¯,W–3Õ`ªÁTƒ©RÍÊ‘j¸H^‘j¸PŽTsÀ…r¤š.”3UaªÂT…©*SU¦ªLÕ˜ª1UcªÆT;SíLµ3ÕÁTSLÕ™ª3UgªÎTƒ©S ¤š.”#Õp‘¼"Õp¡©æ€‹ä ©æ€ åLU˜ª0Õ|Ä‹¼ìœ¾~¬²<¤Ü£”ª›ƒ©!W.ØrÉaÈ5ò‹ämýO¯^îéxu\]}xñKë«óYmêsPGÝø‚§7X7Múüm¨Ç­GS•åÊòr-,–w–Ê­±ÜXžª%¼‹\“çö’+ËÊGa¹°¼³´ åH5Ú†r¤šm#yCªùÐ6”3UaªÂT…© SU¦ªLU™ª1UcªÆT;SíLµ3ÕÎTSLu0UgªÎT©S ¦L5j>´ åH5ÚFòŠTó¡m(GªùÐ6”#Õ|hÊ™ª0UaªË3îþ&[VoådË긿>Ùòõül²åŠ\Y>P~6ÙrE.,ï,”ŸM¶\‘3Õ@ªç“-WäHõ|²åëyEªç“-WäHõ|²åëyCªç“-WäLU˜ª0UaªÊT•©*SU¦jLÕ˜êëÉ–¯×¯'[®¨ÕƒÔ¯'[®¨ÕÕAêד-WÔ†jdÈ2e˳ɖ+jby6ÙrEM,Ï&[®¨‰åÙdË×ëF,Ï&[®¨‘¥ KA–‚,Y*²Td©ÈÒ¥!KC–YvdÙ‘eG–Yd9¥#KG–Ž,Y² dÄòl²åŠšXžM¶|½®Äòl²åŠšXžM¶\Q˳ɖ+jd)ÈRåëÉ–ëç+Î'[VÇmN¶Øåí6ìxyúÕoÞüûw§ûÓÇûÝ?íN¯ïN~~Z=õ6§lôy_dãkžŽÝ˜gˆÞJ±¾õ½nÍ3 P^ Ë‘jÎ3 ©æ<Ê‘jÎ3\˜ª0UaªÊT•©*SU¦jLÕ˜ª1ÕÎT;SíLu0ÕÁTSLÕ™ª3UgªÁTƒ©RÍY”#Õœw@9RÍ™”#Õœ{ yCª9û€r¦*LU˜ª0UaªÊT•©*S5¦jLÕ˜jgª©v¦Ú™ê`ªƒ©¦êLÕ™ª3Õ`ªÁTƒ©RÍy ”#Õœ™ yEª97r¤š³(Gª9?r¦*LU˜j>ÕÑ7¤ÄúV«zx¬ëü7o~ýøðþþÃçýîô©ç^½¸ûôéãýÛå9@§O>íö?­ö¤ä`Тo7»ú²§£7F…Þ¼”y–·qÜÖ¨ä9—Draygy |yÎÈåŽò9*D9S5¦Ú™jgª©v¦:˜ê`ªƒ©:Su¦êL5˜j0Õ`ªTsTˆr¤š£B’W¤š£B”#Õ¢©æ¨åLU˜ª0UaªÊT•©*S5¦jLÕ˜ª1ÕÎT;SíLu0ÕÁTSu¦êLÕ™ª3Õ`ªÁT©æ¨åH5G…$¯H5G…(Gª9*$yCª9*D9S¦*L5;ÇO%Æ ¨|ìÐ1Ë+Ó«ãV£Âè7VÖ÷„Ôã€ù#@NãÂ/#¿Ã§ïžO?=ßíŸ?ºÿ {+µ%××óüG‡äÊòòüG‡äÂòÎò@yþ£Crc9S ¦L5ê2ûMr¤ºÌ~“©.³ß$GªËì7ÈR]f¿IÎT…© S¦*LU™ª2UeªÆT©SíLµ3ÕÎT;SLu0ÕÁT©:Su¦L5˜j0Õ@ªËì7É‘ê2û òŠT—Ùo’#Õeö›äHu™ý&9S¦*Luþs ¹fjþÀ!gæ91=ÞTc}œÆÆ@D×wóèÇ{¦Öܬó¯>ç¶ŸÉçç^¼QU½5Ÿïâ¦oùêàÕ~[ËmIÔ/cêü·åÊòòùo Ê…ååòùo ÊåLÕ™ª3UgªÁTƒ©S ¤š·•E9RÍÛÊ’¼"Õ¼­,Ê‘jÞVåH5o+‹r¦*LU˜ª0UeªÊT•©S5¦jLÕ˜jgª©v¦:˜ê`ªƒ©:Su¦êLÕ™j0Õ`ªTóâ9Ê‘j^<'yEªyñåH5/ž“¼!Õ¼xŽr¦*LU˜ª0UeªÊT•©*S5¦jLÕ˜jgª©v¦:˜ê`ªƒ©¦êLÕ™ª3Õ`ªÁT©æÅs”#Õ¼xŽr¤šÏQŽTóâ9ÉRÍ‹ç(gªÂT…© S]îB[­nå¿<´Ü‡¶xDQß8p5s• 7m}˜~ÜíqóæO?¶õåÇÏ/}|ü°š¬˜šÑJ>khãM_\¥·ÝçQÝ·ŽZψ ”ÏS`” Ë;ËåóåÆr'y>åH5€LòŠTóÈ(Gªùd’7¤šYQÎT…© S¦ªLU™ª2UeªÆT©SíLµ3ÕÎTSLu0ÕÁT©:Su¦L5˜j Õ\ʃr¤šKyPŽTs)Ê‘j.å!yCª¹”åLU˜ª0UaªÂT•©*SU¦jLÕ˜ª1ÕÎT;SíLµ3ÕÁTSLÕ™ª3UgªÁTƒ©S ¤šKyPŽTs)É+RÍ¥<(Gª¹”åH5—ò œ© S¦š3"_ö½^;»Ó!óÜ<¢äÕQ›Ó!}}ó£þòXžåË¿Ù==ß?,·>Z?§ÞF®ß™£“w:½Çê8»Õ‘)ªmã¸õ,ˆ£|þàB¹²| |þàB¹°¼³ŒyžüÆÍ›ß=<ïöŸö»çãmdŸ=>ùðâãã«ÿrÿðþqÿã²Neuj_n»F)­øÆ>½Åê¸WÏ~[·At–Ê_?§ñšÜXî(ýœÆkreù@ùëç4^“3UgªÎTƒ©S ¤*©JAªRªT¤*©JEªR‘ª4¤* ©JcªÂT…© SU¦ªLU™ª2UcªÆT©v¦Ú™jgªƒ©¦:˜ê`ªÎT©:S ¦L5j^àE9RÍ ¼(GªyåH5/ð’¼!Õ¼À‹r¦*LU˜jN(Y07rª· ìóŸüZ·Çõ¢í¦—õ-(ÇqŽQ¾Ý½ý¼¿þùô™û§§Ï«ÛÙç½![Ílã=OG¯ŽÓ™¥ëã.cò&‘$ï…åÂòÎò@ùh,7–;ʽ²œ©:S ¦L5˜j ÕÜ €r¤š›H^‘jn@9RÍÍ(Gª¹åLU˜ª0UaªÊT•©*S5¦jLÕ˜ª1ÕÎT;SíLu0ÕÁTSu¦êLÕ™ª3Õ`ªÁT©JAª9W„r¤šsE(Gª9W„r¤šsE(Gª9WDraªÂT…©*SU¦ªLU™ª1UcªÆT;SíLµ3ÕÁTSLu0UgªÎT©S ¦H5çŠPŽTs®åH5çŠPŽTs®ˆä ©æ\Ê™ª0UaªÂT—["ôoA&j–ͽ„w‘­I£Ë©¥è7½®ï9Ž÷ˆ<Þˆò÷wOOyÜ¿ÛÚ0‡=¥t‹÷ù+4É£6Û>6Ž[Ï‚T ª;ªƒÔùÔ†j'uþøµ¢šX¶B,[!–­ËVˆe«Ä²UbÙ*±lX¶F,[C–‚,Y ²d©ÈR‘¥"KC–†,sÞúá*ÃyN“\XÞY(ÏIx’Ëå9 Ore9S ¦L5˜j U)HU R•‚T¥"U©HU*R•†T¥!UiHUS¦*LU˜ª2UeªÊT©S5¦jLµ3ÕÎT;SLu0ÕÁT©:Su¦êL5˜j0Õ@ªZª¤ª©jEªZ‘ªV¤ª©jCªÚª6¦*LU˜êëgm гgmlÌ´y”¶¾¹ä8Þ\2ïŒ{óæ7wÏwßß=íNŸyÚíÚíO¯ïÞ¾Ý==^¿}|xÞ?~\1ú«i—Õ—=¾:.nço`)6tã¸õ¢±ÜXî3—ãïð×óÜ‚Lreù@ynA&¹°¼³¾ú¯»÷ï¾?½¼xz¾{x»Úw+o}ŽÙ¢kßøV~yÄ2ÿy-åxO¼õq«¾ùûIòùÛˆrc¹£|þóŠreù@ùüçåÂr¦Ú™ê`ªƒ©¦êLÕ™ª3Õ`ªÁTƒ©RÍ‹A(Gªy1ˆä©æÅ ”#Õ¼„r¤šƒPÎT…© S¦ªLU™ª2UcªÆT©SíLµ3ÕÎTSLu0UgªÎT©:S ¦L5j^ B9RÍ‹A$¯H5/¡©æÅ ’7¤šƒPÎT…© S=m]?9m­ÇQº1ÚÒõ Ÿâ°]ÛnÞüãÝÛÿúüéåÕÏŸ÷/¿»{¾»x·š·BŠùÕµ÷}9ruT¿µ|ZÏÖwsù[“›žI>O±Qn,w”ÏSl”+ËÊç)6Ê…åL5jnzF9RÍMÏ$¯H57=£©æ¦g”#ÕÜôŒr¦*LU˜ª0UeªÊT•©S5¦jLÕ˜jgª©v¦:˜ê`ªƒ©:Su¦êLÕ™j0Õ`ªTsÓ3Ê‘jnz&yEª¹éåH57=“¼!ÕÜôŒr¦*LU˜ª0UeªÊT•©*S5¦jLÕ˜jgª©v¦:˜ê`ªƒ©¦êLÕ™ª3Õ`ªÁT©æ¦g”#ÕÜôŒr¤š›žQŽTsÓ3ÉRÍMÏ(gªÂT…© SÍÕºsx5ôú©Ž\ª[‡”2Ù¶&^.§gr©n_ßM/Ž[žsËÍ›_ïww/÷â>|æîôáþþé¿O¯Þ}þñÓÆX׿Á2_ìtìÆ ×½6ø­Ûó’zzŽxI-¨î¨RçBPªÔŠ,Y*²4diÈ2oïÇ[Y^“Êsî“äÆrGyÞžäÊòò¼ <É…åLÕ™j0Õ`ªT—ÛÀ“©.·yEªËmàIŽT—ÛÀƒ¼!Õå6ð$gªÂT…© SU¦ªLU™ª2UcªÆT©v¦Ú™jgªƒ©¦:˜ê`ªÎT©:S ¦L5êrx’#Õå6ð$GªËmàIŽT—ÛÀƒ¼!Õå6ð$gªÂT…©Îak¯³RÉh/×Ä,£êætkà:Ö÷êŠãÓùw:.®ËgîN~û‡=½Ø·æÿ(¡\Y>P>ÿ(¡\XÞY(Ï…,$gªÊT©SµTí¥ª^S÷‚jAuGuz4TªÔ^Q­¨F–,Y² b™ ÜIM,sy;¨+±ÌÅí¤&–¹´ÔÄ2¶“Y ²d)ÈR‘¥"KE–†, Y²4dÙ‘eG–Yd9å@–Ž,Y:²tdÈ2eË\¿Njb™«×A]‰e®]'5±Ì•ë nÄ2×­“Y ²d™gøeE¥:‘-cËy­ogvèûÝ7˜ÿ÷ÿÓ6w endstream endobj 623 0 obj [ 622 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 633 0 R 634 0 R 635 0 R 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 645 0 R 646 0 R 647 0 R 648 0 R 649 0 R 650 0 R 651 0 R 652 0 R 653 0 R 654 0 R 655 0 R 656 0 R 657 0 R 658 0 R 659 0 R 660 0 R 661 0 R 662 0 R 663 0 R 664 0 R 665 0 R 666 0 R 667 0 R 668 0 R 669 0 R 670 0 R 671 0 R 672 0 R 673 0 R 674 0 R 675 0 R 676 0 R 677 0 R 678 0 R 680 0 R 681 0 R 683 0 R 684 0 R 686 0 R 687 0 R 689 0 R 690 0 R 692 0 R 693 0 R 695 0 R 696 0 R 698 0 R 699 0 R 701 0 R 702 0 R 704 0 R 705 0 R 707 0 R 708 0 R 710 0 R 711 0 R 713 0 R 714 0 R 716 0 R 717 0 R 719 0 R 720 0 R 722 0 R 723 0 R 725 0 R 726 0 R 728 0 R 729 0 R 730 0 R 731 0 R 733 0 R 734 0 R 736 0 R 737 0 R 739 0 R 740 0 R 741 0 R 742 0 R 744 0 R 745 0 R 747 0 R 748 0 R 750 0 R 751 0 R 753 0 R 754 0 R ] endobj 621 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 623 0 R /Contents 755 0 R >> endobj 756 0 obj 15018 endobj 758 0 obj << /Length 759 0 R /Filter /FlateDecode >> stream xœÍ”=OÃ0†÷ûïæl'þX‘…‰ #†ªCT¾†¦Rˆ¿§"t2ÜùÍÝùq^Å’àø\¤à*)œóØvtu « Í(Õ,*U3kÈJ¨J©Æ.õLuÌb(jãúO´'Æ-­7±æû¾‰O F=ÐjÂ6Ä|I|SBÍ,ÜòW¥ÁÖZÁsã‡1:kQÉÓ«d¾Ì»J>AŽ'‘ù1ÿÿEž/n´{Als§UâJ]ƳŠjÿFW.o4T~å½Gxý½$ÁÒyo¥‡’B9ËÌÆ tXŸÝ·ý'š¦xüxéѵû¯vw¾A¸£ë0ìþô²à^ endstream endobj 757 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 758 0 R >> endobj 759 0 obj 256 endobj 761 0 obj << /Type /Annot /Subtype /Link /Rect [ 174.816 421.739 257.752 430.739 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 594 0 R /H /I >> endobj 763 0 obj << /Length 764 0 R /Filter /FlateDecode >> stream xœÍÙŽä¶ñ}¾Bè§]`[CÝXñ±‰á¬³cäÁã¶Äž&,‰½:¦=ùúY”H3A^Ö¦ªÄ*‹Å:Èþzç9þ=Ê?iè¹iš9yu÷UÓ='ñ Ö¤ˆ¸¡8~èú‘S9SRä”ÀcþÁŸÉXÀ/οïê;âüx÷Ûï0¦pðÝîȆp%êËÝ/–nzÀß’~Äyºûîáîþ‡Èñˆóp6&ö7 q–e¾ç¤nàgòßy¨œßÞýó™5ÏœÝqvº sþÅÎß÷þwçáï†?ð]â{À;â“™€\T­‹cÉkæä%gu×"ÿß&V qÓoÍh¿LT§K’Ä%sg„ÿC7@PP¢ü4QdŽâ, ®ÿnªL[á¥~3Êm»`£–¥óÞ9&næ¼Ó‡eÄû–°<ŠüãÏ¿ŽðëĵÑ’ŸÚ¼61‚WÚlÈÓ'ÖR3wľÜx—_˜Q+§õŸ&RNÀhÄ<¾Ã]¼ÿ!["Ÿ„@²…EŽô”Œk\®T‹7—…HK+ £Ö°MÅ<’ºD*gÑr¦#ÝT̃ÁÛŒo™Ù\/ò!Ùʧ홃h‡ñ-3©ëû !k+ÞÞ y&¶Øß[vGÏZÛöµgunQ쭤͉wƒ3#iÇ£ü$s“Nh˜®™o{ãüÌÛa|ƒùü,tÓ€Èd¸fÀ탼øn”ÿ׿ƒ8s3˜”x‰÷¿)›z;Œo™9\¥YFÖÎðÎY²ÃøøÞ5“ë`Š„E.êvVº€ ¨^XñÒeÐ  Á±euË;þÌœO“RÀBÊñãî]cqäÖj¦xÁÆn&‹¬ÔK–¬µèvNfæÊêNÅ¢å¤Ò‡”ëP3ûÒ«eR6µµîœ'ßßa„íBN[$9š§ÉÞD²“kÆ4êÍæŠ p%r®0^rꬦ§ƒœ¼¢lîƒß ‘ïX˜ºÉ$5"AUµ#5òw6ß•>±ÆþF;ƒáÖ_„O–Èý…kÐOuÛ1Z¬ÏL7ç}½µÌÛKþ\ôº4@¼½²œŸ_f'l•¤3[ÑZFgÏ“éþ™–¼1c8ĵ¡yήªÐA¼ Q`Û¼vGôW¥$Â3å|ˆki®ÉRÍGß@–è;€Ây3Cà<ûT¼,\²šˆldÞj» õûîÚwkl¨YÎÃ…Ï£Ø8#3 Ð[poSµ)¤`gÚ—ÝC9õAôÞ#RуÜhmÓ%¢‚õηŠzC»~T„áhç ¥jÆŠu=:V]ä~^®x¡Gü™‰ô¬ / ¢9Ú(„–u¯Ÿ^;0sãä¢>󧾡258g^²ýpäAkèerªPOudoŒGKÖR<à6& MÄ{Ãעؤ—ؘ㠷íðaÅ/ zMÑ0éÐ2¡—/*˜BË)ÝKž< U°p<œÙcnÖØcôJ5êZ¯Ï¢©ÐÇ õILvÂÖè@öøî?¬XDkRÅhÝNç_±@Lf¨XÛÂI@ƒKëQ\…‚ÛakÔÖ CW[âŽ8dÄ—U¼ªXÁiæ5ߟ)/é©4£Ð ±íj–¼aÌ|Ò±kfêÐ…Ökΰ+kOüÙÚ¡o½¨rêóIBj×ÞÁ 7®kI…¥,Ρ·ÄXÅÆ@ôjƒŸiÎKÞ½Xüƒ±«ÁxmàŠO Ý\ðŠEÒyªz•µŽPŽŽåÂC`Ä€Œ4\ ˜± ®W‚ˆídH97¢2Ô2Á®xjhÕ~0¤–Yªh£é/jmïR< z>ŒlZÌlM,šCdó(yî˜F*å)6ëĺ#ñךÿy,ùl¤€6™ÚïÛž–Ê÷õwŒ²Þ°ŽÖ`–†)GpHA¡ºŠeZk  HôÉrE÷Ï´¹SÝKc»£?lÔ½¡,ô6e¹Kúd[þÁQ‡D ¹iãÁq¨“ƒ¯HG‘Û¹]x~qdR¿"lá¨Cª¶|»q7–}Päù+zÚéã=N;Äý Àˆ‘^Ö3¸ú³‘ßóöZÒ—Ö¹°òêÈàÓK9ù>Èe×û“wí+:Ä¡K`³Ò$É´|¯ ‰ÝX^‘Ø[aýôùH‹2cûZgä'ñŒ÷ Ã`ß "òé³µxCÀ^c…ë$þ4:ȈrK@Ó×µ,ãÖ¥Ðëµäù˜n‘§àYG}Ù°sq*ô}ÖÚtU¯húéóÊ™HÓ™}ÌÊÓ}%¦÷R -[1À¦ÞNLèSàE´]÷;È5J-…²ÄŒª õùT§‘‚î•5å8¨)Êgíqä‹¥t3ª§âݾsDÞ(A‹O²Á9Ë7:ç’¢EÉ Z{Í5ß›q~- 6¦^„¯  dÚ‘Ð_Í81‚ƒ"jà]<¢Xö Z>awޏ.'±@Æu’Ñ"F¨î«“õáĺ–Bˆc1¨™TÞ×ôÄÐ×ò\3«Õ‡…ž*ÃÎ#ˆÆAØTäˆXÅ,¾5Jø¦³ 9ÓÆ‡ú]£7ÚÈÓj“jÑñœÙ™qm¼`§Þf±K÷••†Ñl¥ºˆð2ëŒ!2c—íc •2ñÒlEÐOª²ANå‹#­%¯ùÚ¥¢—B ö¯Jă2GUdj¼•…rkæÇÂ8‡8Ԭגuº{AÚGkôÍæÜÐz(`pzbfWÅŠi£d¦¿®6¬åU Œ)°í8Dz„ãrüf*ŸÀ4 ´’D?À…?郣G ^šŒ-‘VÆ(Yb ^Õõʲãy,ÒÞÕ ¦ÇËv„o¬,]ƒâ)¾é61^çe_Xb•×t0•%MßFj-h×aRÓ—lX#r²Bê;‰Ö"èÎG#§¾.h7GúnJ¬˜$Y™ÐÔ呬ðž—uÄ;¹A¸3}­l/Ç©Ë×54ÿÃ)Ä­v »W¯T;!(&SD:èo/¡À¾òÞ7VXA5Y}¾–OB(ħŒ&Ÿ!e¦—Sȹ×ݡ®T7š8P˜pèýŸ—Ì­Û9…§Â–3þÌ6ô˜x’^®ÒùËÉ:ô{N&ú²0èÉ’ý¶®$„p7¼ä.­x¿ô*ùô;4t.BN–<ÝÝ-/NWd¼âRaæ¦ÒIâ`è®û×xéðj±d½Š¦{ÕŸboÆ%Kg¹u’{øi,±è€-j\ùÁ®h±Ý_^¸I,³ñôò¾®÷(aÍF~éhƒ3vÔ‰èG´ÚÓQ`Þ8½GÕDéÔ­;`Öhõ»3IY0þÂa)½º‚¬cÇ«‘¦ïuÛq2Ñ ø÷ÒÍ"’ÌVªï9Õa“ª”%òŠ›ÐÉï–Zý£‡W^«|ȤÒQ|0üÃCÕ’U®ö5¿Š 8šraKæ¥&!k¤áV"ŽöB÷ã~Ú7á§±mB´àNfoÄr{(xA¡6 Í¢®eñf Ö—qˆôuÛç9„+ˆ£+[³E6C“–©‡ÝÆÀ7HïÌ 2?Vø²4 Ðѱ“5”lyÁ†+¯Ì¼¡#\L&Õ ‘Žþ7—z¤LnfäYçh=VÇ[ý±=^ºêµœ­‘èî»Ð•*%Š£™iXI¯ò©pßOÓÄeD“¿q@?íßÿ–¬2D¿ê§Y6ã⟼žR}­tHIg'ùøN•G¸ƒZ#_w,±ièÄ>$g –ÿ³èØæýäS×O³,II0<ïêçWHlïFmÂð$…ˆèFødÆ€ÓÔCM‰ýˆ«À‹GïpQš=~~s¨Ë»›¨js³#“¥Çd¶tùnÉ,ËÐÚÓÀÿïJqê»ò§Ÿ I´'=¯§š8 §?CŸ 'fhe`*×—jýα.`WîÅÔï¹û/p H{ endstream endobj 762 0 obj [ 761 0 R ] endobj 760 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 762 0 R /Contents 763 0 R >> endobj 764 0 obj 3068 endobj 766 0 obj << /Length 767 0 R /Filter /FlateDecode >> stream xœÍËŽÛ6ðî¯ rɦØe¨—%]ƒ6E{h‘®Ñ Hr eÚ&V½”d×ßá[’e£ÇÍ"ðÌpÞ3Ž^"ð÷¤~Š4ÂEQ¢ê°xµôå1J––”œÆ! ŠSgè€Æ¤ Õ 3bÁψð=úºhýºøöx6ˆ€ÜyAn(תž_¾Y€ß’íŸV‹Ÿ3´Ú†Ç9NȲ,Ë8BNâRý‹Ñꀾ=üybòÄÙ‰-êö ýŶ?úð­~òIŒI T$&•8h³yªyÃPUsÖt­‘ÿe5ÊZB.ÞZÒ¾Œ\„¦Ëó“i3Âÿ'†£Q™¢ÆÊˆb"0¿7]&W“¡Ã×}øfœ»Ý‚9pEÐByYÂ.F-´Lî5Ì›‰îºWbåÁKM’·bO‹«[÷ô·‰X%Ìó-gn×ó™wÕžµ¨nêZ´ Ća+lÍ¥1N {$*kÀÇÏàÜÄ¿e„Iªm¦×’GÚ¶g!7Áß™Áó,>³N§m…Ô„ íèšB´ªXÛbçX•i-R”—¸ÌaråIa´þ!:æ®Üˆ$8RÌ¡lZbµç-úÇ9œ Ï€Ô06BE7ÀÖl€ð L7^Ñz@ƒÂ ý½;ÞÜ· S÷–tß2‰ø$’“™­re“\x${í¹„°Á{S†qiÀ4tÛÝÒD)Á¹ªMlKó•ʆ7»»ÕY&¸TÅK+ô›çèá"ú€(Wæ3ãŽB…XiGOÓ@\Òë˜| 4ÞøÌë:`ë䉷|]®º×.J¡’:S“<›d æmiÙÔšïö1J ì›O¥&yQ–ižÍ8¶7KÁ­Íâ’Àr°œ‘ô¦m"=þýv©m¦n¹ƒ©‡Ö’³­ÇŽLr´‰pÒñ{ôX—­žÍ…Ù3‚hÖ³ä›Ëx‘O²•Ê œŽ›ÉPÚNB=¾À´¦'Á‡Ü{*Mù,ºXÞSoëk±‘/’éDZÌŒ†6ÐWoGgÂ.ËIØí^ôµr$WB Ü`Òa/ŒlÈ'îk\7üW%š-ßõ’v\x†-×7EóÂPsà;õ(ðýOïßmÇè;\½ëð`™˜„ç®mÁºðPQcÉ¢.Ñ+î€Õõ’ã¦íK@ì|2ˆéó9õ£’k o`ÚЪã'V_ù;È™)nÙ0­[1Ò?“‚x:L7lKûZ‡G pëA뻆7¢y˜lž4lãаåÕÐ(§),GÉŒOç›Ó&&ÙAo¸Õ+Gip•š X£¹€öôÄl„"ËKÈM3õ¨•gržLg¤js;+¢x‰þ±˜‚½¹Ï'¡cUÀÝ{¡`è»ù ‘FKø^{ѹKfMPùÒb`Žl[_™k÷Ì>q ÛJq˜‰4ŽMöï’®f¼–ÐÒ°9 õx©/G•…ˆz‹¨z)•i¸/Š}›FÕ y¹¿´ÆËéÄzºÜØ’‹éå>²Šo/f‰qæÐ&Ó´]-Ö°µ•qšJvoÍIHŽ3µædEöÿVPXƒq«pDà[GK|RmÇꥲWôÑLOØ &{r<Ö°k*W[O¬…xñˆ™A†(yÀ¦Ùòë€ÆÃ þùäÅúZ™™QœÀ7Ã8ÞVWƒë­Úì§›Þ>’ÃE×ÀÎÕ@ùôÔ°ñȺçõæ–¢#­^èŽaOXÏݺüèa3 ­gvvŒ>&KõÌTqÃò4ŽÛõëL_À~uͯ®`Jày<º;­°¾©™Ù}f·>0“Zp»a';B=7Ž´æ l"Ì ò¾íÍ7‹Bka›êÑQÞa¯æâ É §[éG±/—“X(’Çr5|ÏYü”ªü endstream endobj 765 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 766 0 R >> endobj 767 0 obj 1458 endobj 769 0 obj << /Length 770 0 R /Filter /FlateDecode >> stream xœÍÙrÛ8ò]_Ê“Så ¼yØ*_Éj'²KÙÔîx ’X¡H$íõ~ý4Hq^3óàîf£/ôåçÌEüÿÿI'IвÃì§¢»(ö)RèàÀ ÇGn€½Ð1)D?c^ÁŸ#^À÷èû¬œ9èóì?gƒ8÷:s΢–³¯–mŠà_É>íf׫ÙÇO!r´Úš‡ÀxŽã„ J°ï¥ü?­è‹[Ò”—u×¾ÿ­þ5»[¹ê;N~5O¿™™Ç1vN3Hˆñ% (R"ÿtdÈ)*µQ¤òïY“ÅŽmð0y~ãÎçM \®›¦qšÂ'œ%NM%Ì/ãÝ0WùÓz|ßî¯ç_¾€¦®¤%ÉZºAë¼(>2ÚTEwNŸÓÆpƒh²õ ù¾Ý?^ mu·.òfú^+ö®hK-³Ñ0ú> ·4€L«ðý2ìô½@†UÃ<€ö ޳‘$ȇý-Ž}Çuú–}÷¤ Ý±eQt¹Úç ¢‡º}C-Ù¡ -«–6.QHÅj+@í.FóAŸnÑšŠ/˜ŸNJ²=zš/ÑvƆ¶xÚê$Æn[gâDÒ–ùí«Óô„SXý}H`Â_pí=l‘».KóT†^æ?;Z¼™3àt›o ûÕÃÚsÃ^Ž2rŸ×à5Ö”•õõ…³’æ „J”†ŽÌq׎ò|ìr ¤5ØÝÞ^tGKÊ¿`MzÝÓÒ`Ä€GžKRn˼›Ë+J)£<Ô‡æÒ*6Ê)]6x–Ë&b(?è ÿx’!BLâ]¤me%ž‘Ò k‹±éêºÈ¥Sêë›[[&¤Ão \V–*ËI "#ª”×4Ë·GÚûË‘Ùðf`áÔ—u9?< NŸa(2¨FH×V°8#…(IíóưiH_™D-%ܽÔÏ‚Æ,.Z —ä`j;ʳÍYÓÚFïEF)´ÜŒD!8m7Rž¡ ÑܳÞnNy£DÜ.‡ûhqXÅŠƒ£2"!ýAŽˆºä@_þÞ K9Cß½ÔѦgatGئ M£" Bÿžò~1â^xÚ# ÒwÁS2­f,ÐÕ‚6¯êèã'ñÚ¶Ÿ8I *Н©£Fï= †þÄàQ'B¦ìf)LO»-%°³©4'ŒZHñJÞ¬ew€.‘Q¤ç ŠwØàï\÷ÝóûKC€ÈÀ…XBìÊ“Ãy ê=ÑjOÂËsapºðfqÓþ} z·€Œ Œ/Š`Ïikâ'}þÓCëž§Âò}ŸBµ [¤ZÕD%‘-£&›«„³}U5Ö7R¾„‡Vúµ­Ä†¤¨6$‘ç 9‰•ì2J¶õ%o-Ø¢›¾-ñW˜jy9 ù¸´‚¡z*,Ûžêb%±@š}ÕƒC„wyØd A…LÀº\{fÊ<•°Ô=@RðNˆ-nKŠ„w%<\-Ûxó Aäž„À´u×ó°LL¦–©K‹´îZ Ëmä@Þ,¬z¡ì•å­-OÎ>…ÐÿåM{¬–!fËÈ·¢/C`]½!Dz-ØìŒ#A€Äq®TÒyޏ8 7rH¤ÈK±FHLZ£ØúÌPŒ”¼ÐQyâ¶™• 0LÂé¡F[–SK0Ѻ&oYu°õ! O‚Ðç?b(®jÓƒu!ïÃ2­Ã£ E"àTëíÒç¸*|qÀˆ4ü½Z5·ª‡¥‡òpÓC0§ø-Ûµ4pÄÛô´šï®ùPmäâ#Tñæ!ÈYUÃÜ*¬×ë~E#¿ËEnŒƒ(qÜ8LôúT1ÐôÛÙÑåBµú1ôïÞDC hSzÛã?œiÝÐç“ÞÄA¢ü»9î¹¾Ýsù[»Bæi˜¦>°ÆÅ².AYÝ~%e;¦O¼ø5"C*‘åçÅlª ˆ²m.¹b&öñF±çbSQq†÷ L /Ê2Sg^ÕQ³Ç‹×wU¯æã¯ê( N9å«:Ä‘ªn©µ[€y[hDnæ"=`íѸ§}’‹9¯~×gDk øEÁzhXêÿÆ(5¤Ô1†ë•&’¶þQâëì/W¥S endstream endobj 768 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 769 0 R >> endobj 770 0 obj 2119 endobj 772 0 obj << /Length 773 0 R /Filter /FlateDecode >> stream xœíYës·ÿοßBÍPî}ço’e·r«LÉɸ’>€$H¢¹}w”™üñ]<àb-¹éx:u2£Ý½Åb÷‡Ý½ÅñËÄCþ;ÒÐÃiš¡E1ù¢åJ|ÄZú!òBìG¨@]Q„r±Æ!ü:ºÀoЯ“rBÐ_&w ³DÖ=MÈ3Æ¥©›ÉGÇ7­ô÷äAëÉÅíäì}„<‚nWâ´BŸ¥(ÅŸ‰>º-ÐÝô’¶ñr»kOÐí‡É»ÛN¨!8ýÞ"ýØq2%ILú$ÍJeQ<ê8ÒgÕ.‰Š@ý}Öe2𘸓ç»qîù¼I@Ëó²,É2x„ÓNâÄɱ„ùn¢æŠ/ü2AÇý ãxP#﫺 íïNY†ˆ›xi0X‹ÎQÓÖ¼\£'ÞnЮÌyÁ[¶D9+×í+£ÇÒX½¶VÃù)Ža,È”µ[_ë£uÇãô7¼Að»a¨a‹ª\ÒzZÞæ U+DÑv7Ïù‚¶¼*gˆá5–ªóªúMk­ªÔÞþõü'T³«Y¹`øÁj1Á OH¿¶ÁâoÂ-õ°ƒ1ÚŒ‚#Ç- úŠn-«[þU°5¬æ¬y-pžà(§g/Gn¸ú› ó‚^Æ`;LSeîüÓ8v^õ4oöeUî‹7èD$d€¦ç6´DöÀ8¤Àï@—´° àmÈÒŠé®ÝÂ#Z®%‹¼]YM:Ô3’ µ¾»¼åÛ¼¿y3SˆtЈ’Œ.6°ÐO:^+VƯÈfË|ÅáxyjfaiÈóO†léÚЕՠÖ*ÛÒš¶Ìr^J,w»±OÊ]1gÖ5 ¨ë´uuë¨ý|ucè%Ì kG@‰³(*pѹ§eÕZg(6í ¤öe§H ”‹’l=Ç]ÉóòˆZλýÏsÃÌ­ê’A(¹¥­êª5{ðr…Ôë¡@eƒÙ#ºÝ2ZÃø%»ˆ€TCy´_øÄÇ^&ºV¾¼_ WC§ØžJ÷«3R1»­!ÛÊ~z±Ü[tɳЋ$hІ^)Û…âþN›V´€»Ùýô=þã=¯›öþäî~zÿ¸æËeÎîO0ÆCˆ¡÷‚º›ÝìV+þûÃHª(ÆšJƒ†£åÒÐ…´nXáDc¸…¬AE3@BVbçv ÏköÈiˬÙÊjB™ç¹ûh×ZÇ>5Ö¯–vw‰±¶¡‹z$~?îÅÏK/¯¼™ t“À¬™fK2FÍ«£ÔÏló0ÚÒûSðÚ WNÍÊ`5mðÔ¼[þpÒV¢@ÖÌÜy@ªÞVϤ=„yŒn*Ø„ýN èâ|5?Òœ/+[ñÊ~3b)J¡œ¥‰{ßz IGáoP$³ |GÌ$)N ¼•“(>jm wÁJèÇëÙMËY‰Þއ‚ƒyyþQã½kqŽåð˜}¨6`½Ú­i=ûPìx Ôb”Óc» õ~Ãü¤[«ƒ8:qA†1¼?ÐÇ3Sny=Mgâ8… @Ów—ØÐzâPŒCê$éCJF¾W©²Q’lÉ[•Û}%×$fv¡_mPŽâÆ{»úiÛ‘ʃ6ý=ÁkGίÍF¼jÅ+¶á¯äÛ£ ¿†—¯YåÑ ª ÆxOåûãsc†˜„Y–&‰CÏŸ™¹ƒ,îi*Œqr8)Ek@s8+Å)ØM-©GqÃ[°‡Ë:Ö»¨ëÔ»”_göˆ7®š8`7lǺšwÍšái‡$ía(ÓbpïøsÏ<„ûiQ âOŸŸ¹ŸŠñ¹£i*÷³'ܲ·®mÍ qérnZb*:~… áþ'0àaðò‘h¸Z ˆ6¯f"EÚ¡Hñ‡©Hq:™£àµ|ï}`±9 H4²;´Ùà3ü;»¾>»¼<«ÄÈÁËUò°g)ðRì'™È„tÄÒÌñŒ8 û–[2˜ÆU¢ŽF³«OG’0ñ{Û-ùšË¨Åןéfۙᮯ ©I_^R9aØCuJú©:í/ªR¡?°¸¤{»kÍÄýªå,w¤®ºA·çG30ô¸nÀ´ÜËe‘läz4Ô¬°)²€W¥rFqj”V´À­‡iÅØi[áÕÊÒ]'œàOÃ, C]Û8þ9´º‹ì=RžÓy®;¡RvžëQM1ó‘a,„ßÅ)g«Áð8Cs˜ å'“œBKjP±ƒr.Ê|-a&~'{n¯^ ¦âvø#ÖE½ˆ)çìììí¦†‹]mLth€~¬f¢ÐÞdžÖD#¢zLT%¼ F çP‚) eáó3óKý²«9þ™îE­/ 3ì§0?¦ä­o¸ú¿Ùú†»¿¶õ -ý©­/нÞvÿã­/‚X7àÿ·¾±Ö¥Q§ÿdëZÿ–Ö7´öÒÖ“Gòîé1ôGo¼õÅ^ÒÓt¯n ± çÂaîá Õ9iA‡Ñ§¦¹¼ZC¿Ì í¬tu›jW.ݧ9ÿuœ€È!éfŽl¾s-\ýP¸övµ»¼=ôš1¯©C׌6ª<šå0b?ëÁöóÕͰȓ^5Ü!äG%Å`p+Ùߟ`#RR-kÛ}$Ó¦df+zn—¨S´¨iÃÈbÓ:K•oò”Èi3#Ô@+f[ñR!T‚¶ ?ôzá/ªºM­*÷u Sß¹€ý§¨¨-X•Ψ¾Nç•®;x½¶ò’¾ þ+Ö‚VŸð!ð^ñµu¸úßü:s¼ÞRûâY¢ç‡Ÿ™4â,ì*Š4 s•Ùê—¬~ôòwÜ“«ó endstream endobj 771 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 772 0 R >> endobj 773 0 obj 2132 endobj 775 0 obj << /Length 776 0 R /Filter /FlateDecode >> stream xœÍXK“Ó8¾çW¨8A«‘eK¶¸±ÅÌÖðÜa²PpP%öâØÆfóï·e9‘l'YÈìaàu«»ÕúÔýIžï3øÿ›þ‰G‘@ñfö½×{(¤È罊PFˆ¼S†6h¨b(Ó>΀îFð3°9AgùŒ ?fŸ¿‚Íð»›‘#Á»P·³'·ÞÆ)?‚Ö³ß糋+†<‚æ+ 1«€BX„"ìS¡ÿQ4ß Ï_ÈF¢4/ÛæÉW49»œ¶ê‚£‡¶Ó›AŠP)ab2® .Œot 1õÔ ‘±hVhÌÌïÑ”É$câ&<-ž“Üñº ÁÊó„…€) ‡G§ æÁìnZ+Tçµß4ošóI\ÕF6ÏÌ~à$öaßÄ‹ü‰/zŽê¦Jó5ºK›µy–nÒF-Q¦òu“˜˜ó.Vµ¶AƒÑD@àÀÄzõ±7GëA¾Ú=GO`ÆÃ!züMmïŠj‰­æzeÇÒËv‘¥±lÒ"·ÊDÖVØ´Y“–™š¯ŸZ•’qb¥u¡œndgåZ•²’7KsG*++µÈö* ¥Â…Ñ! M’Ö¨‘kŒ^õ‰"Y)WmœÊ 5Z¥ùUj¥*•Çjš£LVkU¡%ÐâB֪ƻS?T(!¬AwD‚ÿz¥LœÇ¥Rê)c(N ¸QU}²\ÅŒ‡ÜïxÿçázñH0²œ' p(añrM[£b…¤Å£¹F3–9Z($ó­žoÀkUdYq§“6¹×ϦãÑó€Cg†}W|¡”ìÂCv×oÑÕõëË!ƒ‡ºÙ¹w2âØìí»9:”8"œ0Ø©¨»woÑûË›¿.oçèÍ›‹/.>}:yT^4Ÿ²]bÏ?9+ÁG–ú¬lýi&i–6[«MóUWˆÐÌNçw'hmêƒÝ˜è°–Àñ[q[´Vе°ºN:È+ɶ^É¿¢tR-*g¼Z™t4v Õ6=2J¢<¶dOu.nÞDŒŸAòSï.Mΰ‡zö5㾟­¢ël+B[ºÝ ºï­d;ÚýöFýIÁJªr åÒ—™LóßõOã(—ªŽ«´ÜßF›¥ß\@C8mT“Ë.;hARdKU=µŠZÅ…©#/+ygòíªbc¥¦(­æÎ„é#¬+¥œ¹#WUÇ·J³˜•™ewrûÈÉ·pr“îYv¸‹†ˆäíf¡*|ú¾} ´""æõÅ|{„ÁiÄF–š€¹«•r­vì¼o†S½à8[xæ æÑ SïûÞc>…ˆ.ræù&âå|?Yj”Õ¯ƒÀBLÈxÌ Îaâ}oà“Æg\ˆ€÷[{ùî‘YjäbQ©©ÔOÍ\n”¹Ïÿ.Ú*2†b.U•KMÍ'‰Š >ÜÉ?—©·îÁËÝð¤Zš4òŽ%dHÒŒ GšqO‘F1¤QöWeoQlÊ"WyS; 'E›-­¼pìwïRwzkÇÒ±„ä³¼Po´ûº”q·D¨¹Co³h›½,÷#s8vbÕj4’s´ûPúy‹÷¢yäwÃþÎîÆm­FK˜·{Ø¢3m‘éļ°i.¬•yý©å½ûþhï^·ýú4 ÌÇ ¾å¼€÷«—WG>{àNZêó^µYv¿Šne‡~:‡ ¦Þ÷eËCˆx;@¼Ã€0/K*BÿL&@_t‰TÖEßþÞ—''ñb@Â!£p Þ_ASï{ã\ùD_@ô^\Œ,ÿ¼èá|-`ÑÐ?§¾¦Þ÷Å‹GÃG(| òÐDüðú0^ølh©ñúQdífÙö8]üd³ñ€bÂá+Ø?§x¦Þ÷ƒS |"BÊûˆ×·GÀƒ‘¥#­ëö'¡¦”º^t¢û ÞÍì_!á« endstream endobj 774 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 775 0 R >> endobj 776 0 obj 1482 endobj 778 0 obj << /Length 779 0 R /Filter /FlateDecode >> stream xœÍW[sÓ:~ϯÐ#Ì4Žï—ÇPZh)mHr`†ÅVj ¶e$¹!ÿþ¬¬Pß”mfjk³»ÚË·Ÿ”ß3Ùð™«Gì;V'(-g¿OrE.ò“(°-ß lÛCŽo¹*ÑP BÙô^Ü¿oðèÂ:GßfÕÌFf?~‚N†l°;Ìì3Î[W›Ù—^l'xMñÙèqön;[\ȱÑvß•8-ßµm;ˆQlyn¢þ\´-Ñ7ï±ÄˆVu#ßþDÛÛÙÕvªgÛVüÚ2ý2E‘eÔºñ´ $Ú£újÈx©wHtúy6d{±Ýx žWÜyÜD å8I% |eÅàDöK€y5ÙM±âª¸Z§¶ B~Ê Yn Sâ ŠÐÂ(:å~JÝr,ßBWpYDè:¨2jèÇÈ‹-'ð“$Žbm¿Í z‹æ~`…èÍž;Ðê±TÈ@äì º%îY“C· §€: ÛwïO¸ Y·\ßlºE, ˆV'Ú^¸¬[É~ü§MÏ8ÞÓþW´ÒµêWº6¬Në]—ÔòÛI‹ëd\Ûе"EkŽëNÝ,ÁKq±9ædÁÉ>Û-È¿4Íõã<£Œr’JÆ–ö҂dž¢È·âÄ»Ø×v÷L’¿“-Á \y0?žëiƒ;¦A¸Pˆ7¤’œêæjAA‘n…wBrœÊžÂðžBFŸhF²N@+ɺ• O„ã¢ï¾êïÖÚFXäDFK¶9í©÷ßûÛ”¸4•#@@;Õ¡dGÞ”¸šs‚3¼LíGRíÒÂÆU†`Lš"C“hGP# YZ!0)øs·&@:ž" »ø4äh UÇw‡:ÛïÍÑíÃkƒ²:uÊŽRÞ΋cYç,=J¨îž³âå%„Ø&ˆj©diJ EuN cMÇÅ- û„ápŸŒî÷ÐøJjï0N”£”5•$¼ÆBõ6à[5|W0–µõ»|ïÍQžq·(î&š"Ø ’—ëûå©9JŸ²rG+,)«€“>á–ÙIEÐzùaî¶HFX¶…û¡Cª‹[kjã򨃾3ÆBêâ«ÉÄñM&kJv„_¬Lnh²¸æ4ýE.>š,¼Qµ¾·  Cuáôêú¦ôWϘ0˜„*s×v|'ìÛlQJŠÂ ùgô»Æ¬âÐhõ¢MmhY6+Øãqjã9¶ÑiPvÍ©·ƒdP÷Ì™/³¦ÓR÷Í)·ãbPÆÙ®WJýæ]ßÜ] ¢qª›Ö´ãq®W'mÏ0B^2NõöZi_5œÕXæ–5¼‚Ù‡ûÁÍ íðíq n—'?Ö­u²4àÞwÆÅøz×Ft½qîÝpºÍÓ*Â-™ÔÀŠþTæ-ÅäÇšÁSÀI s,[V5±—ï«8!Ýš3uL†¨¤)g¤z¢œV¥âÓ×íÙUM]3Þr6îŒ; ócÙˆ9äCjÿÀß3SSMà·?†ÂTÙpÜ‘«µª–A3×UŸVï>™naãÊèãjÅx¡¢=!J"ábõ³ÔàÉg®irSBË.>YŸ Yî8«¿D™‰2ðÌܲz)°ÀÌ-Ÿÿ!§3$»©á#•3É 4üˆ~À#g™øipr†y…v"RVF0˜0¯æ•û‡íyn &Ô{Ùö~Y ¸dØpŽ„æ]½kG½€‹!%mRªº§)Z5;ø‰’+ð_ª‘¬ q‡r>ÔpB´¨——+ƒö„gO@Í‚*S7%$d“©»2L”"¸€pÚp"!øšÔíqI Sà^Öø½#8ç)\?–‡~ÖV+Î$”übi¶šð´á‚ÐþÀþ2ûHÈO endstream endobj 777 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 778 0 R >> endobj 779 0 obj 1441 endobj 781 0 obj << /URI (http://refdb.sourceforge.net/emacs.html) /S /URI >> endobj 782 0 obj << /Type /Annot /Subtype /Link /Rect [ 448.893 165.834 492.213 174.834 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 781 0 R /H /I >> endobj 784 0 obj << /Type /Annot /Subtype /Link /Rect [ 499.374 165.834 523.274 174.834 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 781 0 R /H /I >> endobj 785 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 153.834 254.13 162.834 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 781 0 R /H /I >> endobj 786 0 obj << /URI (http://refdb.sourceforge.net/doc/elisp/index.html) /S /URI >> endobj 787 0 obj << /Type /Annot /Subtype /Link /Rect [ 462.436 117.834 491.876 126.834 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 786 0 R /H /I >> endobj 788 0 obj << /Type /Annot /Subtype /Link /Rect [ 499.374 117.834 523.274 126.834 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 786 0 R /H /I >> endobj 789 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 105.834 290.25 114.834 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 786 0 R /H /I >> endobj 790 0 obj << /Length 791 0 R /Filter /FlateDecode >> stream xœÍXKsÛ6¾ëWàVgƦÁ7™›eËMZÇUdµi&Î&!‘ E²eGÿ¾ ‚ZgzŒ}v±Ï‹Àg6¡ð!"϶¢(&ÉnöoÏ·Iè7èY>µ<ǧÔ%¶g9>Ù‘c–O ©£ œa?G²@gäÓ¬œQòëìËWI ½—}ÅxgêaöQ‹­€ñÏ%ÛÙ|=»¼õ‰MÉz3A샔çPJýˆD–ëÄòÏ!ëùrvÃZFò²Þ·o¾’õo³Åú(U—R+úÙ2ýx"TJ†5+¨3ã*p”E9uˆI*/G•ú}5dz1Õ>-žŸ&¸×ë&)ÛŽã0ŽaÊŠŽ '´T0?Mv§µâȸƤc3i¯Û#¾Ì4Tª÷6!äªmrV{¿û†·yB–¼nó”B®Y“æ,!âP¶¹ ¬L‰à‰¬JRmÈ¥ÂKwäPË `_ÒÀVž®î—`lÅ·û‚ z’÷+/9Y|¯.„dc2+^p&8æÇu?+ž@øU#ÀÚ<¯Šj ]%Ò¤lΖ—hÊgóûåãÌ›çÞ@’<´Í>iÁˆò6ážæ]ÖC €±…œ»¾Xj41?0\á¡^w¡âiÂùP¥L‰¾PAô?ü\þ +™âb³áI«Œìq2/ªäoˆ«È¬ ÍÔ=ß· à³(Óªî¼Ê_fùSÞE¿ª .Û£UCüÄfM,yÞò” 8 È2;ˆ«CWÇ7¹èJ‹w°MË˾ ¯«rËE›?sò²l æÉ¦fAܲ¼P¥ð°¯öÌK5%hÈš%Ù5Mvh³]Îdq^%ûV‚WBæ7±Ù—Ýê!Žl³~ÿ$wn9!(9æÚ*¥«û[DØ3Wg^"¾ ±n†‡¨&TJeŽÚñt¯QáO3ÓkPx¾É´îY·îµ¢ˆû5žsþ‚È;8‰j°ˆ‚‹£ÐŒ Ññp0¶²Íò±Í"ŠíΆÈw}]ñ‡:¡ƒê<ÉÞŠˆG*.†ЍÄîAë³È¡@#Tk(OìÁ³Ï‡„¨¸xòõØ`G ‘÷ñìE»O1ëžvßÅ1 "¬~°7<ÇÄgµ”6Þß“Û÷w ì¸7áyèlêĈ´o±è¥}‘L þº“Ò"š¹¯)ªŸXoÉ’µY5ß9ml[V°Aλ“î+Ù–ïà@B·>`Z¶‰Òû©؈¬cbtýYÊÞóò¹j¾!® Õr.5Vò$&KY%çä®M±À<ƒÅJª*Iy@¶ÙÂÍÚ•×Ûñúíš?Œ,úÔvœ¾÷†–c‘5ÜX;–8P X11XÜb/y%£ò«À‡aц¼I×µlrv¨öFòTö'QéÂIVåp?›"«öEª1žôY§fK7üw7{®qäeL3Ík¨—–ÉžáüdO….h€ïB}G1<¯|7D’oø&}ºàE.jsÕùŒspLOsøåD1´ÜÐ…¼ùN5³¶­ß^b—eÛÅ‚³,IÂ7U³åVÉÛK.²²vg6u;r,˜RØqˆµ¯'â¾åÉÓ<mD2ôA€œÕ,ù›{¤_ò¢‰¤ÚM3p†t…ƒ5’KõÆHÁ§±ZæÁ€hYÑ¿Ït¦<ÃåËAÍñÀá’ÕÂË:ôlx쪸ÔPyScìH²&ÉàffŒµ&; hpͯ#£Û½¡q´cÿtEÞSU:xö;c p˜xÉò$Ó躩žåùÿŠy5”O¯‰³i`}.øQ`]ޱ⛛¹¥1¦H4f.Žô+ /6Ш«Þlö*šúÂèY}·RDš‹d/O5^Æ]¤««`ÚxgÈDPŒ}gSŒzØ Cí‡1¦ìxî¨ñõÎŽŸâ™/¦–'oëp@°Ø±rz-´A,bøiÎ~ÜôN4_ozÚ‘Oš^Z%—]—¾ÌË”ÇÚŸcGòûÕ©E³ñÁ jù4>;rqYzδÿ»aÓ•›£ïiGÛÒÝ8aå0L«aÔN66UQT/y¹æ€Óôhá·ØÇÇ‚Ð)…¨»@Ç7Ä|DìVî7ùåD¹¾ð­plâŠW‡‘çãXíŽn(êªx±ï#É›F~EHµ-”UÊj̶©…¨yïUÖ'Â}Çñ£¼8 ÄÅÄ~3yŸÞTš ‰Pì#Ô§éu›ýD !)^žÅbÇp,hùfŒ¿4Ú\ÙÃ×ð*çЇ¬‰³Ö 'ÃÄfTì 4™î-Òhѱ­6ݯA7~*öš©þHóÓ>Gœý$NÁ endstream endobj 783 0 obj [ 782 0 R 784 0 R 785 0 R 787 0 R 788 0 R 789 0 R ] endobj 780 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 783 0 R /Contents 790 0 R >> endobj 791 0 obj 1897 endobj 793 0 obj << /Type /Annot /Subtype /Link /Rect [ 193.192 700.827 269.825 709.827 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 52 0 R /H /I >> endobj 795 0 obj << /Type /Annot /Subtype /Link /Rect [ 275.348 700.827 448.388 709.827 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 52 0 R /H /I >> endobj 796 0 obj << /Type /Annot /Subtype /Link /Rect [ 355.194 295.762 402.854 304.762 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 56 0 R /H /I >> endobj 797 0 obj << /Type /Annot /Subtype /Link /Rect [ 411.074 295.762 523.274 304.762 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 56 0 R /H /I >> endobj 798 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 283.762 188.06 292.762 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 56 0 R /H /I >> endobj 799 0 obj << /Length 800 0 R /Filter /FlateDecode >> stream xœÍÙ’ÜÆí}¿‚¥—HU»ïCÇeGrJIœØÖºœ*Ë=dÏLg9äˆÇ®öï4úâ1£<Ê~XÓÆÕhÔ§›Ð àÿ;üS$¡_¥Wn>)zèå‘gŠ”~¥A{aâG©wòæ¤ÔkpD‚?³µ€½ßnÚ›ÀûÛÍïÀšÚ `ßÓMp¹dõáægG6µà¯I¾À;Ü|óú‡Ô ï~oMœÂª$ ‚ -¼Â£ÿ‹¼û“÷ûË·ldžhÏÓøêïþï7ïîgªÆAà_›¦?ÏD„HÉóÜ–$ÙÄD qÄŸf‚,Q:eF! èïE‘ƒ•Ä+ð:x¾á.ÇM«Â°,󲄟üb8yr-`¾íÖ±¡\—•NÖwäc¥¤¬½RëU÷Gî½B;%ÞKZýú‡reÒÔ/“6…éŠÁÀG½o%U_ÞgNå ?ñv4xÕõ=Î][†6vtx/¸]ÕðGÞø½? ûÛ¹ïEí,í¾ëOl]khl×M£³¢°gb%ü4¬ åÆ#C>wpý½—GöÈ ²ã¼5ÈyÚ5b8òÚPØ`A»Œõ–[·ßXA†¸5x#øÆ²]×=X²R–°Šöè'1E{ñœ-Yõ0ç½¶Sù1\µ ,b²Ó‰N¬ÐgwaÃÕÐ^Ó¨M™ðHóìPX]»[(B46÷³Ù¢•ßÜ3бqqÒss©µˆæÜÖ_X¼¶K’,ìÂk1výà/–Â-Ï2¿(!»AZ£¥?5œ xHø¹÷²ç{ÞLÞí¢Û0 ý°„§6Œ“õ½>›uWMèiÏ%›2‡l›”eV¦k6†Åï‹mØ&NŠ €·ÚuÇó›×¯A«zçÝÔWÜyà~ËÇ×(Ùk¸¥ü³OÍ‚oœg~\ß )׌ÿX­.ý<ÌË"²+ÂÃážz0ªÅk>2Ñ,Ý >Ë‹;Š>ôÈ0öS5N=÷ Æ€žT¿åü0ý$M‚ Š 7}ß…iìWx–ûibž$L±Ã[r1‡Aym»#€{[‰Ru,¢Ò8“¹é*™`5þâØMàü,Úà ç‡åE&ªºš„0Ƥ)ª©a½CνïàïXuÜ0s/T¬¡Þ„‡NîLr?ô s=;˜ÒÒ¡\tÜ1÷™G'}ÑÕ—·;è8rHÊX i¹‹õ®r]ïþ†VsÙ<;c³µÃ™Wb/èIÓëá9qPíÿ/*‰r?Ê!Ä冢(ÓE#¡£t±ƒc/vÓÈ}ïW¸f#¾3:^!O’àÏòV¶Ýˆ¯)‚=?÷V ò& azG:{„»Îv¢ã³ç„æÖ­M ?³ È’|VteWõÏRè/ ,*’ qèÝË&»²ßœï”_™ë@YMé¹›þôh%>L|¤ƒ ïÅá8ÚÕ££œ–Òd®×ÉW‹··l„Ï}ƒ°Ö‚;È™¬ZVhç,X(‰Î‚­SÛˆ”nµ×N§dlâ??u=Ô ˜ÑåéÆ;Oý¹¸Î½X¥gÀ¿?€…c,órhï]+Cy^†~Yd`æ4T=†ŸúÞo½‘#ÿ ¨ñhŒ)Íöp!j£üA)™«ï;º9moŽÂ~yÿÁÁTݱ¹R=á¥`ÜÍMÓ=¹Û;Á\ì xóî†é|nÔ-Wt© ƒS²Ñ›Œ ,­áía¦扵[#x]]›pÈÙ2Ä2¨Ôì;$SB:C˜zNeºÂŸTN'Œl mÍ¥† n»z¹ˆÈ?ŸÖ2(Ü\6ËgK1h:çh"ãYŠ$ìÈúzÃ.I4³ËN@3Ñzv>ŠÊC³Üz;Yf€Ø 4ÀÃ(šÆºÂ6E9f#qEYï>dà0ÉèŒw:šA¸2Å¢ÇxPõòÀÏ£ÅO29•îDÛ÷ÝÉbJkBLJ°$ÒÉ »iœíu®L<ñêÈZ1¸‡vnDû`1¾YDðÏ‚&À]ElZUË´¥àÙ ’ÊF§C°QŸº:Åo³¡e§Ùï:©9$wùÚ®ªÞrXøÿ©$¾¡xQ,g˜*ÚÕ¯`ö=Ü)¬gE[5SÍ߬Å!´Iq˜_U¬×aR…§WæRŠho÷âÓŸtŸ¯9$4ÏšÀ†?2z襔rÓ†hqìçAÀ{Y^mµî˜ vóûçñY3ò’‚€ôãË“>¾‚¶Qƒ'o=9õ5µ|žôdž`iÅP½Up]°Õº#s!¼dúÍEPœÎðŠjlp×ßn¬ëö{Q š þÄw<³7[d IÊCÈ *MJœUàŽÁÈ0ŸÁÈ“» zo¾¨àòlhœ å¸D†#d7åô(ã’Žÿ‚ˆ(Z{ÃØeàØçExÕØ«uïð €>Àõºu7˜hxn»öù4¸%ÈZ€j·¸LÊ"Ly‘³¾: ùfxO©• NÁ ÝP÷S˜¼D?\áeIÿrÙSÛ#A5Ö*–‰G,B¥ F±lheû\s(Û!«´™96SÓÀÓö/œ ‚žÂ÷¢­çû|‹¾o-¬ßö[K‚ˆ¶HÅœÅdKç•o3×1æLª6ÓoÍZrfAÛÄn˜ Šƒ¹©fUô]Jå²Ì.A¹Ê¡ÈÛ'·D5d D´p§p£ÉŸ:П òßXT™‘eFB¬ ß»2Ù˜Ü0BR.Œ ­ŒeÂ,댤K6J$‡*>…·&Èãu©A êÔ·ˆ©BGÂÿùñŸÖ2geU½éºEU×Íý¿íFÙO©èålqu³g´»w‡Ñëå7ÅéŒÅË»©î¬¦Mfˆ=¨¦¥QnEw]t† ÒXuÑ¢¾:†Ì2/‹âÅžïd±á'”V|š¸ÆD 㸸הÙd°0¹Ü~÷A»ã}¶”8opk}êÂFcs¤ùIZèmÍI”VR…¦Ü^›ß™Zþ´ˆÔ9N:£ki„9Zàgã˜öà$™vâ0uÓ û1¢Òðn%°úòDHÕA¯Ñ z•@݆çŠhaŽ.’­A !g ”Ô2;X XÔ¾)Cgj„a`Y¨zXÆù³A™”o AÖʵAŸpújãÚŠCßäÆûQ;¿lÊÃø!Z¥LVÑŸ®0h}çŸAý|ó?”êj endstream endobj 794 0 obj [ 793 0 R 795 0 R 796 0 R 797 0 R 798 0 R ] endobj 792 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 794 0 R /Contents 799 0 R >> endobj 800 0 obj 3111 endobj 802 0 obj << /Length 803 0 R /Filter /FlateDecode >> stream xœÍËŽ9îÞ_!䔎ºÞÜ6èì äMƒÅdr•lפN=âx¾~)Q¯*—ÝÙÝK’C“”H‘ER*{ð‰ÿߊ?YäÓ,ËIÑ<|StŸ¤ EŠ=±ç…Äh“†ÌI1©‚?³¹€ÉoíƒGþñðû0§$ð¼Â¥¨ÏŸÝÔ€%ý*ÓÀ{´Y¸lÅ_IBoÁô|¬òF=š’×.<¹EZÖ8X·¿1M¨à±Ña:·7¥w#§Ý:â/Ýd‘²›ñXd˜N§úbq6×|cÑžïË]iñsU×3ýg*¢;]† !†L²{ì7­¯¬ÆÃG¾4ènYÅÆ&ÞB°*ã"(à€nGÒ° ÙA´ÔàS2BÉ#TÖNÏZhw]û®®»sÕˆ©m¦Äï~²ËΊŠD˜GA¢øåôb›ãçñ‚Kõ9QDýÙÑ54¹¯â¾"¬öÇŽÁê>ÑðÎ’Á¥¥Û)gp®áMbРTšXõÆÎ€½h,ú{š ×íMॠë1Âë %ŸE0NTîÑÇíÇDÚ»)ó“j`yz~zü\y#nÜdµCzq÷‚ §©J/š'®Ì®¼—¹²Ê9Ôâw«`îÝcµk; xrV‘¤0 k;#®5:·]3u­3 {«¦@a¶l,Q•—ĦñèJ±ãŽwýÊN¤É˜UWÂ!¨•HšÓxY¤“s÷?äèÀ rdžïGéÏçŽÐ÷\Ïúv*îð:hTß~ql6Sï‘dýÔ¡Øë¶D1hl7[¥½¹¦Ù­ÍœX•.÷Ê¥¨ uIvSiz?Õõ²M–—Ýpá5Ÿív=ÿ¾! -&¸+J’¿B ~6w„ô1Ô$Hæj÷¤_Ü?¸ûÍùŒ›ýa²‰¦Ø¬¢)z wP¶cƒ%t»?y1:sٸʨ!®q즺4èÎŽˆ ávd쨷íªàb¦ÍÞZ¶²eI¾ðÅ,Z|± ê™a\áí“¿è¨GTF×—7—IÁ¢™ª«H€0»#uÁµªeeòå@-š9«€ †—- iÅ)æNQDŸs2À.›6ЋP«ï¼¾¬™Èƒ,ŸAÙ ¢Ð¼ð¬9ÕPºø(ê”y*Ñ!z+¨­p2êHU+rµ:‘|ILn Êá#o1ÁʺÓÐ?Ö(ý8YÏe7÷¨tîž (Œï‰Ö§—àù•ê…â!1 “™$%4N¡uO«WXš@/)žï‰8VÐ>¶ˆÿû-ðlùxk“’P\ísð”<£a²”!Œ¯A›6XM,h ºyo0/Ž“LáˆáÃe¬Ùâ!ø/¾zO ºµøb…pÕœð&¹\_‘²±C­Õ¸f#¾¹H¬çÇøwkk5®„d-7©öS¼\êÃ‚ð€ºˆì»¾aRë‰JIƒËäŠ úaèÍz™ô¹’ÒpÇ_V¢€Øe­¸.׃Զp”8+gZ¯ø$K>Qá—«T‡ÂôæØÊKt:mìP×pù,êN>Gùò”•Ò2©÷™dì¬è9QV–•y!DRÕâ6u-åÙÂNUc_<‡ "“É<¸ˆ&;*w Aþï|?cÁCäÞ®òAÀ÷Ñ'T";~¬0®}祵*x‹™qæÌ;/cŠºÎ2ì»ÞÕÆI]±Øäå§4χþ"Å4iäaÙüå‹ füNdùÇ;€ê½Ü3±0,øRZ‹ã€f¤Ç0 tZÕ<‚uÕû;‚{~¶ˆ¬}ÕQ£§VuíŒVŽ@q+ùžMõh ßY=¹‚ñ¹aÕ~(N<ÿÎT|€GX=À«%eku™ j¨Eug†˜ ¦ëPŽáþ4w”¼‘ºO Ò+ïVX³”Æìw©Sð%âżxmÞVE'‘‰LbZCÁÈDØù€Õû!¢¾€ ²s$ Cuh.f ©­¾Mvf;5І¯J¸‰Ü"“Ò”+Õ 6pveRR’áF¹b=Ü”æÖC3ÂEã^_äJŒ8¸Óhý F"…ü’¡¸Éus •¡èû¥ÃÓ–qü©(Ø.YE.†8¨z‹nŸ¨EÔÍMX¸r—®Ï첌:pJÁ¹S0'—–Ñg®òEGÑ£rÑÔµ™²!¹¢0OÙ>™üÐ}”VÒwF4ð²<‹Âì^à^Ï{½²ØïP}޳¾F’Š\ »‘ꯃÃýmªdAT¬²ŠõéÈœ0•D裩A~«­¬Lm×U£nV‘èWŒŽ’…Ѹ¡An¾ªi¸ßUcÏú‹% ²R¸ú@7£áµ ášpù_^ã•O³ÁAá¦.oFF—Ò³ßø¥¬~Q„­³°:ajfga•c•96Ǫ%Wüg 9÷´T=ïl4¬KŠDTö’0Æ¿ÆðM"U/A(ˆ…HTS·F:Ö”·×Ô¼¹¦×ONKžÓ´Ó¯¤štá¬×ðj„ˆŸƒÌ,–ÅC=7ÍhnP Ö¸—V¿r°Ôt9y_õv6^©F·ƒŒM ›ÐËM–ÎmßœÛÔ¿1b +E‘õeô eÚï«V4ëGs—š¹" –® \ ¾b½b¯ <ûn:íØ_¯6Î o.‡Mõh–‰AHrãÑòWƒŇ‘[ž ¬ª­4‡®RŒ­}w%oßMmI ú|t˜p•èúÐõ†šåË, òåë«ÈÕ³[»x€(µ°Â ‡|/oÕó¾ ‹(‘?‘˜¬ƒø˜"è¢dPççHŸþPp¶” endstream endobj 801 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 802 0 R >> endobj 803 0 obj 2934 endobj 805 0 obj << /Length 806 0 R /Filter /FlateDecode >> stream xœÍTÏOƒ0¾÷¯ø²“&³> ¸x0S“ÝæH%‰Bùð.$*tSe»çÀ?ž5¬s<³šÙìÕbRÝ·at¢ø®Ô”M¸íÖ?'~„v—°ë Ì?±´¨@‘Œq_Äí#T˜]Œ”Q(êÅÚ\¾"³û¤3ªOÄ£s›tÒ¡h•†!§cíÊø.g3®b»Ô!rº.Œ›ÀÙ“”©Ç˜ ÷Ås6äNë&´(Ï‹ã0Ží: ÿs6Óõµ"Z^§‡úgäEé†ý=R}Ô`¤³!Ƙpu‹]4æS>8Úiëûô¯=ØàIÕ©®†cUÛÚ+î'ûý¤à¾ý/äE¾+”äJÕd_ªZ”š\o˜\lõz…´½6EY¢Öo*ó"K¡”ºþh­É³-S¼Âè6r÷æzU)Ãä1aßàÓEF endstream endobj 804 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 805 0 R >> endobj 806 0 obj 396 endobj 809 0 obj << /Type /Annot /Subtype /Link /Rect [ 431.131 627.454 456.671 636.454 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 808 0 R /H /I >> endobj 811 0 obj << /URI (http://www.referencemanager.com/support/docs/ReferenceManager11.pdf) /S /URI >> endobj 812 0 obj << /Type /Annot /Subtype /Link /Rect [ 155.976 530.721 303.448 539.721 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 811 0 R /H /I >> endobj 813 0 obj << /Type /Annot /Subtype /Link /Rect [ 327.204 530.721 523.274 539.721 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 811 0 R /H /I >> endobj 814 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 518.721 221.9 527.721 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 811 0 R /H /I >> endobj 815 0 obj << /Length 816 0 R /Filter /FlateDecode >> stream xœÍYÍ—Ó8¿ç¯Ð x¯QËß67ØafÙ–zË£9(Ž’xqlc;“îýë§J%ÙŠí„=’¢*«>TRUýä|_yLÀ÷9þ¤¡ÇÓ4cùaõÝð=–ø,ˆ +<ô#!æ…ÜØ³"V¢Œ3ðí~Îæ½gŸVÕJ°ßV_¾Âœ  wZ‰ ʵª«÷ŽofŒ&ÿ\!xúó9øþ|ƒ“$ábºñZM@<àF|tæÈ”$+gZý^tYÌ<˵{þÓ8'Ønõênuû+ø$ØÝv̨fy^–%YxêgøñÙÝ}y‡Ï¾²»¬^ß-˜Ÿfuó³â£_(gÂnk–0?„ò‹<‹‚`¾Çý4BÄ1­ýo{Ùôªe g¿È^²¢jŽ=…£¹Ê0eaÂ}´@DIËݾèØ3ö< ¹ÇžæFçÀPM)‹Ê™ÒïÕHœä£óh_ŸFâ±>:ze5;U©VöŽšVmU«ªÜaÉjãzÑ«j£NU»ò\ÿ@uÇ¢—ëÒy¾­[ ŒŠ(›„âƒÚþò …¼0ä!i]ËNuÜa~ROÊÒ¡óúOŠ—¡²:Jw‚YmQW³Þ:ć7j[”ªshKûúÚò3*ð¡»b¡†M[ˆ@GÊ!µ‚”"°.ÖeQïZÙìµ…(b‹ÃSÑïÍNŽöªlÌPÛÄ>Šf ë¥cˆäçúHD¢T²­ÌX®ëAæÔ}Qí Õ݃u¦ÎUõÝ•2¿•:™ÑÞþ>_iLVjV•ðXŸ©¥6ª+v•>kšîk;êŠCSÛÇAîXUª$?5LÛaÝÚÑÇßFî4¾dÐq¥¨Fsú8rK™ Ьnpn¯æ‹Í¢Éb_&%b8KÖ”¶IücY>ZâØeñ¿AFûó¤³d.¹† }A ¢™¿•t4œL²€Éz2ì°&×4¦÷`©ßË~¾JO$“e‚e*@°Û‘Y•˦Q”G†Þl LIÊTâEÅäÑ\I½þ¯ÊûΕÇPîÚ‘²¥Ãn—•æPwuKq6¼¡^°%¢áe“h@°Ù¶Tî;j¾ B“ŠCh6m蚟i+y4›I 8þuÛ$•·ª;–fC‰CEÆNéÈMtÌçzl å0Š7çØ©E¹ÉÒ¨í^àai »!žÊ¤!‘¥Øzç2ƒ©¼>¨&­‹ÞàÑBŒ#¢ loÖ9³Š ‚(–—”µ&;fZ.$ì9.²‚ì`¦3sÛà9lИAðîç€ÁK}žx¾QlÐRÂ=Î>™Ìà ²3*,AµdX ˆÃ›A‘B…­3‹FÍ ûº? uú ñƒ˜gYнע}ü½$ó±¬M¢§>K"„€þ\ôƒ‹¬‚·²’;Ó—Gç‰f?ðx&¨0š«vÅ¿L%#¨²"Ȳ0YÜ÷}óâööt:ñ!™ä‡}¿íŽ æÒ-ô³îv~fü0½°H³0ÏãÍfz‚½0ãxzñ Í4|Nް%Âä( æ³qåÐF\ô§£"`(Â4–ΤFåŶȇr:Ÿm€$aáQT•ùȰÕ}<Òî³…BéÇ‚ãIJ£4¤µör·ƒdCÜÅŒ2 tпm=Ó…`\ÉÚ#À³ z!ÛD hKFï½ïG“yÑÒ¼—d!ò¾.7¬†rÝâP·Š`n1%ß^pÍâ|Þk™#ŽóÎzet½lu©Ö”|z,íÀ-ni³!4©ìj;>(Y °‹Û±ÒÍÉ´õz¨ñc?ªAÏ¡é=Ú¥…0Á…Êà dyWÃ4›E©¥}YÃŽTÐ qkะJË%saÄ=·Ú_°6†UŽ]ö Xxu ÖjWTžBÈä^²ÇÜKál§~zÕølÕ_ìT ó¡Hÿ®èú&ˆOóNõ8M6pç*ºT=‚þÞ(@tÑ“°kð±Ñ-ž(J9 ‰±~\4Ù5Òb”“£1Ùí~µqÆK7!ŒH’N"¢Õ/Å8Ó@K¼¸ãÙ<Œñ¶h!˜¸ÏH…i8æäF墡gÜ?½ûÌž³ûgs'B_Ã!’(¹æÄ|:QÊùðbF.¼þpÉ…Ðãð pÁ…Ù¸dIàÝÛ¬Ãã$)Ç4M:ÊL<ób!‚ÐwŽéAd‡¢*Pn±uêžy¬¬ëoоAõ€~ü†’fÀ£:ôžî‹6{ãØŠdK ì…€Rd¶=~fP^½{÷O6ý\¶í=WÆ“‹Æ}¸†¤x Ô]e Áƒ«Þ ®(¦æÀ惯¯UUäßäÍ[þû:Suï'âj ²x"q÷cÙ£ëíaé&’±H'’ècñ\˜í{<óC€ì¾…upöâçú"çª`‘K&ÃpVóÇS³ðæ$|ž [´m°¢ŸðÌ”ZšÛ¼[XG”¾[¾;Þ œõ8SžÉl•3 ®Ï­ÌéÕ6qñòþ™ã¨D4­ÊÕFþYÈJ”y»Aªù`O˜UX~N–j*‹í4ÂÕpHd~5kã8Ç?¹@z ñ7m_?Hè#.¹Ñ‘1s…ƒ+{SéšÂrý2椞@Ârƒˆ#© @ëvÚõò RÇ þ›#’y:-® 3ü@:ñx2¼'Ât_"Æ»ÛÀÂcáʶê‚,Þz58M[7ôBhêåK¢æ8ð‘õ’þ10FÏ^=¹ uªåfá0eþ$»šiìå¤ÊÒù+ìýê/*[C? endstream endobj 810 0 obj [ 809 0 R 812 0 R 813 0 R 814 0 R ] endobj 807 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 810 0 R /Contents 815 0 R >> endobj 816 0 obj 2366 endobj 818 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 759.389 291.743 768.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 679 0 R /H /I >> endobj 820 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.873 759.389 524.873 768.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 679 0 R /H /I >> endobj 821 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 747.389 274.598 756.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 682 0 R /H /I >> endobj 822 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.149 747.389 525.149 756.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 682 0 R /H /I >> endobj 823 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 735.389 326.348 744.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 685 0 R /H /I >> endobj 824 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.709 735.389 524.709 744.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 685 0 R /H /I >> endobj 825 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 723.389 321.331 732.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 688 0 R /H /I >> endobj 826 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.753 723.389 524.753 732.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 688 0 R /H /I >> endobj 827 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 711.389 242.229 720.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 691 0 R /H /I >> endobj 828 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.121 711.389 525.121 720.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 691 0 R /H /I >> endobj 829 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 699.389 258.264 708.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 694 0 R /H /I >> endobj 830 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.135 699.389 525.135 708.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 694 0 R /H /I >> endobj 831 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 687.389 258.264 696.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 697 0 R /H /I >> endobj 832 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.135 687.389 525.135 696.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 697 0 R /H /I >> endobj 833 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 675.389 276.443 684.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 700 0 R /H /I >> endobj 834 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.991 675.389 524.991 684.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 700 0 R /H /I >> endobj 835 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 663.389 259.275 672.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 703 0 R /H /I >> endobj 836 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.277 663.389 525.277 672.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 703 0 R /H /I >> endobj 837 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 651.389 275.25 660.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 706 0 R /H /I >> endobj 838 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.14 651.389 525.14 660.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 706 0 R /H /I >> endobj 839 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 639.389 317.439 648.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 709 0 R /H /I >> endobj 840 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.67 639.389 524.67 648.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 709 0 R /H /I >> endobj 841 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 627.389 314.852 636.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 712 0 R /H /I >> endobj 842 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.806 627.389 524.806 636.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 712 0 R /H /I >> endobj 843 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 615.389 378.894 624.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 715 0 R /H /I >> endobj 844 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.263 615.389 524.263 624.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 715 0 R /H /I >> endobj 845 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 603.389 344.875 612.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 718 0 R /H /I >> endobj 846 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.455 603.389 524.455 612.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 718 0 R /H /I >> endobj 847 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 591.389 240.551 600.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 721 0 R /H /I >> endobj 848 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.273 591.389 525.273 600.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 721 0 R /H /I >> endobj 849 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 579.389 267.13 588.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 724 0 R /H /I >> endobj 850 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.211 579.389 525.211 588.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 724 0 R /H /I >> endobj 851 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 567.389 267.966 576.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 727 0 R /H /I >> endobj 852 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.205 567.389 525.205 576.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 727 0 R /H /I >> endobj 853 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 555.389 260.931 564.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 588 0 R /H /I >> endobj 854 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.263 555.389 525.263 564.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 588 0 R /H /I >> endobj 855 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 543.389 346.466 552.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 732 0 R /H /I >> endobj 856 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.539 543.389 524.539 552.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 732 0 R /H /I >> endobj 857 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 531.389 247.17 540.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 735 0 R /H /I >> endobj 858 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.221 531.389 525.221 540.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 735 0 R /H /I >> endobj 859 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 519.389 260.219 528.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 738 0 R /H /I >> endobj 860 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.271 519.389 525.271 528.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 738 0 R /H /I >> endobj 861 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 507.389 342.06 516.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 600 0 R /H /I >> endobj 862 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.577 507.389 524.577 516.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 600 0 R /H /I >> endobj 863 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 495.389 328.568 504.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 743 0 R /H /I >> endobj 864 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.583 495.389 524.583 504.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 743 0 R /H /I >> endobj 865 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 483.389 258.828 492.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 746 0 R /H /I >> endobj 866 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.131 483.389 525.131 492.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 746 0 R /H /I >> endobj 867 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 471.389 304.408 480.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 749 0 R /H /I >> endobj 868 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.895 471.389 524.895 480.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 749 0 R /H /I >> endobj 869 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 459.389 308.233 468.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 752 0 R /H /I >> endobj 870 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.863 459.389 524.863 468.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 752 0 R /H /I >> endobj 871 0 obj << /Type /Action /S /GoTo /D [757 0 R /XYZ 72.0 769.889 null] >> endobj 872 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 447.389 187.908 456.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 871 0 R /H /I >> endobj 873 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.371 447.389 525.371 456.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 871 0 R /H /I >> endobj 875 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 435.389 342.058 444.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 874 0 R /H /I >> endobj 876 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.395 435.389 524.395 444.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 874 0 R /H /I >> endobj 878 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 423.389 253.778 432.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 877 0 R /H /I >> endobj 879 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.169 423.389 525.169 432.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 877 0 R /H /I >> endobj 881 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 411.389 358.115 420.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 880 0 R /H /I >> endobj 882 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.353 411.389 524.353 420.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 880 0 R /H /I >> endobj 884 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 399.389 375.956 408.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 883 0 R /H /I >> endobj 885 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.213 399.389 524.213 408.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 883 0 R /H /I >> endobj 887 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 387.389 334.191 396.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 886 0 R /H /I >> endobj 888 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.538 387.389 524.538 396.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 886 0 R /H /I >> endobj 890 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 375.389 373.112 384.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 889 0 R /H /I >> endobj 891 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.235 375.389 524.235 384.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 889 0 R /H /I >> endobj 892 0 obj << /Type /Action /S /GoTo /D [807 0 R /XYZ 72.0 769.889 null] >> endobj 893 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 363.389 198.11 372.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 892 0 R /H /I >> endobj 894 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.443 363.389 525.443 372.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 892 0 R /H /I >> endobj 895 0 obj << /Type /Action /S /GoTo /D [807 0 R /XYZ 72.0 613.954 null] >> endobj 896 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 351.389 271.469 360.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 895 0 R /H /I >> endobj 897 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.031 351.389 525.031 360.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 895 0 R /H /I >> endobj 898 0 obj << /Type /Action /S /GoTo /D [807 0 R /XYZ 72.0 580.033 null] >> endobj 899 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 339.389 257.44 348.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 898 0 R /H /I >> endobj 900 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.293 339.389 525.293 348.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 898 0 R /H /I >> endobj 902 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 327.389 300.575 336.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 901 0 R /H /I >> endobj 903 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.927 327.389 524.927 336.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 901 0 R /H /I >> endobj 905 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 315.389 253.226 324.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 904 0 R /H /I >> endobj 906 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.327 315.389 525.327 324.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 904 0 R /H /I >> endobj 907 0 obj << /Type /Action /S /GoTo /D [777 0 R /XYZ 72.0 769.889 null] >> endobj 908 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 303.389 257.45 312.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 907 0 R /H /I >> endobj 909 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.293 303.389 525.293 312.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 907 0 R /H /I >> endobj 910 0 obj << /Type /Action /S /GoTo /D [780 0 R /XYZ 72.0 217.889 null] >> endobj 911 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 291.389 264.313 300.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 910 0 R /H /I >> endobj 912 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.087 291.389 525.087 300.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 910 0 R /H /I >> endobj 914 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 279.389 234.489 288.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 913 0 R /H /I >> endobj 915 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.321 279.389 525.321 288.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 913 0 R /H /I >> endobj 917 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 267.389 270.916 276.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 916 0 R /H /I >> endobj 918 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.035 267.389 525.035 276.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 916 0 R /H /I >> endobj 919 0 obj << /Type /Action /S /GoTo /D [792 0 R /XYZ 72.0 606.203 null] >> endobj 920 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 255.389 281.343 264.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 919 0 R /H /I >> endobj 921 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.953 255.389 524.953 264.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 919 0 R /H /I >> endobj 922 0 obj << /Type /Action /S /GoTo /D [801 0 R /XYZ 72.0 361.733 null] >> endobj 923 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 243.389 268.722 252.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 922 0 R /H /I >> endobj 924 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.053 243.389 525.053 252.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 922 0 R /H /I >> endobj 925 0 obj << /Type /Action /S /GoTo /D [801 0 R /XYZ 72.0 267.482 null] >> endobj 926 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 231.389 387.774 240.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 925 0 R /H /I >> endobj 927 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.189 231.389 524.189 240.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 925 0 R /H /I >> endobj 929 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 219.389 351.382 228.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 928 0 R /H /I >> endobj 930 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.497 219.389 524.497 228.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 928 0 R /H /I >> endobj 932 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 207.389 249.923 216.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 931 0 R /H /I >> endobj 933 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.065 207.389 525.065 216.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 931 0 R /H /I >> endobj 934 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 195.389 248.241 204.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 808 0 R /H /I >> endobj 935 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.213 195.389 525.213 204.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 808 0 R /H /I >> endobj 937 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 183.389 268.646 192.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 936 0 R /H /I >> endobj 938 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.197 183.389 525.197 192.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 936 0 R /H /I >> endobj 940 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 171.389 268.09 180.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 939 0 R /H /I >> endobj 941 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.201 171.389 525.201 180.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 939 0 R /H /I >> endobj 943 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 159.389 289.536 168.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 942 0 R /H /I >> endobj 944 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.89 159.389 524.89 168.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 942 0 R /H /I >> endobj 946 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 147.389 257.052 156.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 945 0 R /H /I >> endobj 947 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.143 147.389 525.143 156.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 945 0 R /H /I >> endobj 949 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 135.389 247.695 144.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 948 0 R /H /I >> endobj 950 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.217 135.389 525.217 144.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 948 0 R /H /I >> endobj 952 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 123.389 250.454 132.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 951 0 R /H /I >> endobj 953 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.195 123.389 525.195 132.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 951 0 R /H /I >> endobj 955 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 111.389 323.445 120.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 954 0 R /H /I >> endobj 956 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.624 111.389 524.624 120.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 954 0 R /H /I >> endobj 958 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 99.389 400.228 108.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 957 0 R /H /I >> endobj 959 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.082 99.389 524.082 108.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 957 0 R /H /I >> endobj 961 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 87.389 408.869 96.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 960 0 R /H /I >> endobj 962 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.01 87.389 524.01 96.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 960 0 R /H /I >> endobj 964 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 75.389 381.796 84.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 963 0 R /H /I >> endobj 965 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.239 75.389 524.239 84.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 963 0 R /H /I >> endobj 966 0 obj << /Length 967 0 R /Filter /FlateDecode >> stream xœÍÝMs$Éq áûü [fËÚˆp÷÷#É¡V³¦µåǬñ Ó¡¦QÓS70ÐCñßoxÐ Tf“xw/”DaÞ( ñà##32ê?¿©Weþÿ¯ò\ëÁ=®Þúæ?ŸÞ_¯F»’þô.+mVŠ\U=4»útõú]võ1Ǽx£=¿5ÿçU;ÿtõçon¿)Wÿã›û÷Ù\_•9î/ß”¯<ùòTúæ/>·§`¾ýôù•«ßüæûoþû?ÛU-Wßÿ¸~‰µÊèÑû•¤Eþ_»úþÓÕ¿½ûãéÇosõÓñöú‡»»ÿø§¿úþ~ó»ï_ýs¥”ƒÿ£ýkÿðêSœß-cŒC¹ü.ZžFÎï›ï9?cþ§WŸÈåÃóGyõžó¿àü¿_ý”Ëæ3./?áí7Ð?Ì'÷õïQç7Lð>ÿËÁ_}ïÜüò·¾_þaþqÛo•–Ÿ××ÿͱý1ÑC­‡«ºú•—«wßÝ><?~|~øøÓéùÍßÿËïŸß¼¹}<Ýÿx|:¾<ùüb†Î'ï­m>ÌóàË1M%ÇD›1‡MÜI –Fb#±ƒxþ½±’x€x~³˜4"؉`'‚"8ˆà ‚N:t"D0ˆ`A)@P ”¥A©@P*” ¥Ai@P"(DPˆ A%‚J•4"hD°ÁN;DpÁAt"èDЉ`Á ‚µA-@P ÔµA­@P+ÔµAmDPˆ A!‚3ñboÛ¨¶ƒÏ1n®Ûi—^Ôµ•«Vö&gçéYÈÁç4ìþtúÏÏ77§‡ËÜÒ6?Á2g›gZŸb3j~Ä"L};ls(•ßÉo¯ó[Ô†j'u~7ƒZQ=HßРT#KA–Š,Y*²4diÈÒÒ²—Z†¾¡îÕ‚êŽê õh¨6T;©½¢ZQ,Y² dÄR ±”B,¥K©ÄR*±”J,¥KiÄR±”†,Y ²d©ÈR‘¥"KC–†, Y²ìȲ#ËŽ,²Èr KG–Ž,Y:² dÈ2ˆ¥b©…Xj!–Z‰¥Vb©•Xj%–Úˆ¥6b© Y ²d9íG-s¾j;õW'ƒªr¨êáÝwæ»sÖù'K¤”R]^ÌYÛ2g¿xæÇøóé‡õÁÃéþ—ÓýúøýÝí7>ßoînwÝEÏÚ͇YŸbçÞz/%lgØÞ!<©ÕÕAêyOjCµ“z“ZQ,Y² dÄ2áIM,óÔ•Xæ!<©‰e“šXæ!<©‘¥ KA–‚,Y*²TdiÈÒ¥!KC–YvdÙ‘å@–YdéÈÒ‘¥#KG–,Y±ÌCxRË<„u%–yOjb™‡ð nÄ2áI,Y ²œ‡ðó~H‡¿yÕi”(y¿sp¾w?õïÂËù^¯Þ}zx|~û¯wŸïŸß~Z˜o~uM F>wÄüí¸ý8Ï£7GðÓwþ"êΠí){Cõô3£ªú†¸W+‰ˆG!±¸“8@ìÄFb"D0ˆ`Á\8 b (ÎDW (J‚Ò€ 4 ( "(DPˆ A%‚J4"؉`'‚v"8ˆà ‚ƒ:t"èD0ˆ`Á ‚µA-@P Ô µA­@PÔµAmDPˆ Áüe^3ÑxóÁñr|o-"ÏŠoÜí"Ÿ‘õ‹ÈÎ ÊÚa>ûýéÇë®×ÇÇëO7·7»'äë<m-J‘¨Û§]Ÿd3L=?åpß»üªÔyLJê õ<*%µ¡ÚI=LI­¨ nóØ”ÔÄ2’šXæâBRË\\êF,sq!©‘¥ KA–‚,Y*²Td©ÈÒ¥!KKK)Õª¾¡îÕ‚êŽê õh¨6T;©½¢ZQ,Y² dÄ2¯L’šXæ•IPWb™W&IM,óÊ$©‰e^™$5²d)ÈR¥"KE–Š, Y²4diȲ#ËŽ,;²Èr Ë,Y:²tdéÈ2e Ë –ye’ÔÄ2¯L‚º˼2Ijb™W&A݈e^™$5²d)È2í£G”à4À²¸°ÕRÚÎ9 íuô«ù‹èòÄÅ—{áêÕ»ßÞŸŽ§õñq}óúøxüáøpy5²ÎãÖµ”acûìëðͰü÷Ú&m;l;ûn¨6T;¨[þ<ƒZQ=H?Ï TwTËÖˆekIJ5d)ÈR¥ KE–Š,Y*²4diÈÒeG–Yvd9å@–YdéÈÒ‘¥#Ë@–,ƒXJ!–¹È€ÔÄ2—€ºË\h@jb™K HM,s±¨Y ²d)ÈR‘¥"KE–†, Y²ìȲ#ËŽ,;²Èr Ë,Y:²tdÈ2e Ë –¹ ÔÄ2×!€ºË\‰@jb™kHM,s5©‘¥ KA–yÛ`Ñ2'éL—™½Ìcg^½7µ÷²™Ú·SûoOOÿSûͳ¿mj¿ö7§öo¨ ÕêWSû7ÔŠêAê—Sû7Ô‚êŽjbùjjÿ†šX¾šÚÿýZ¥ KA–Š,Y*²TdiÈÒ¥!ËŽ,;²ìÈr Ë,²ÈÒ‘¥#KG–,Y±|5µCM,_MíßPËWSû7ÔÄòÕÔþï×X¾šÚ¿¡F–‚,Y ²d©ÈR‘¥"KC–†, YvdÙ‘eG–Yd9å@–Ž,Y:² dÈ2eËWSû7ÔÄòÕÔþïוX¾šÚ¿¡&–¯¦öo¨‰å«©ýjd)ÈRåË©ýÛ'ȯ¦ö›a{Sû¸¼çØžn%ž‡jqõî×××냻ûõíûÓ§»_Nëããúæç‡ÓýΔVs÷^©;rº3·õÒf¶¶7·%µ º£:H=綤6T;©çÜ–ÔŠjd©ÈR‘¥"KE–†, Y²ìȲ#ËŽ,²Èr Ë,Y:²tdÈ2e˜ےšXæÜ–ÔÄ2綤&–9·u#–9·%5²d)ÈR¥ KE–Š,Y²4diȲ#ËŽ,;²ìÈr Ë,²tdéÈÒ‘e Ë@–,ƒXæÜ–ÔÄ2ç¶ ®Ä2綤&–9·%5±Ì¹-©‘¥ KA–y&Sj¸›€É`ÞJÏ;lm†mæ¶¹UV-—wÜçìö¼*}άíË÷éQN]/_¨¥ÎÞ6tÎ]cç _ ¾7ŒG¾Ümóq—_”:ŒIÝQ Î¦!µ¡ÚI=ŒI­¨¤nÄ2_&•ÔÄ2_(Ô‚,Y ²Td©ÈR‘¥!KC–––£/ýMy ¼7–Ë売\Y>Pî…åÂr¦êL5˜j0Õ@ªùzª(Gªùšª$¯H5_WåH5_[•ä ©æë«¢œ© S¦*LU™ª2UeªÊT©S5¦Ú™jgª©¦:˜ê`ªƒ©:Su¦êL5˜j0Õ@ªùЬ(Gªùª¬(Gªùʬ(Gªùê¬$oH5_¡åLU˜ª0Õ¼týÿ0_Îk×íëf‚_·»åɺ6]¯ÞýñËuêóã½~î’ÖlçÉÖa›ýÐ}þtØÐqÛio <â‘ÜXî(ϵx$W–”çr<’ Ë™ª0UeªÊT•©S5¦šëò\"Šú[ò\˜Graygy <ç‘ÜXî(Ïõy$W–3Õ`ªÁTƒ©R]vR#9R]öRyEªËnj$GªË~j$GªËŽj$gªÂT…© SU¦ªLU™ª1UcªÆT©v¦Ú™jgªƒ©¦:˜ª3UgªÎT©S ¦HuÙjäHuÙl ä©.Û­‘©.®¼!ÕeË5’3UaªÂT—Üv~-%0µ<¿¨ë,uwœúEs²Ü¶[¯é2žÇ²qõî·O¯ÚzZßõøÓ‹ÇŸþxó~ÙB~}çù¥_w&%:’Ãdïî£÷f'ó×ѲwþvÜîì„äÊòòœ\XÞY(ÏÙ ÉåLÕ™ª3UgªÁTƒ©S ¤ºÌNHŽT—Ù È+R]f'$GªËì„äHu™œ© S¦*LU™ª2UeªÆT©S5¦Ú™jgª©¦:˜ê`ªÎT©:Su¦L5˜j ÕevBr¤ºÌN@^‘ê2;!9R]f' oHu™œ© S¦š/W;j)3Çñ¹·YŠîÛLN–ktºÝ=JŸáæeýu~òer~÷ñq}ûáñxÿøùçÍ´¢ÜZ)¶óQÖÁ›QýPk¾.–ì Û^X R[Cµ¡Úgíá^ô-y¯,W–”Âraygy ÜËåL5˜j0Õ@ªó?²©æý€(GªyG Ê‘jÞHò†Tó®@”3UaªÂT…© SU¦ªLU™ª1UcªÆT;SíLµ3ÕÎTSLu0UgªÎT©S ¦L5jÞ/ˆr¤šw ’¼"Õ¼gåH5ïD9RÍûQÎT…© SÍáßôyy„óërϸEÄØ·?q±íÞ8ú´¸pN ,¾šºÜÜ~Xß}\ß¼ÿ|{ûê¿­¯à{~üóýÝûÓÃåŠÄe+„˜û¦¶óy¬ÃwŽÜ㼯îvÜÞ1ÊåŽòÜäÊòòÜäÂòÎr¦ªLU™ª2UcªÆT©v¦Ú™jgª©¦:˜ê`ªÎT©:S ¦L5˜j ÕeÏ’#Õe×W¤ºì›@r¤ºìœ@r¤ºì@r¦*LU˜êüsк—b²—õà Z—§SÄ›q»+Kúv[€,rûÁ___ÿ·õÑéúæñÅÃóvç·¯¿¼DÀùñ7?|¼¹ûpüù§¿®ï}xüëÇÓæîŒüÅ7lçsYn†Ø!z/eþ)Ü·=è(Ÿ¿üP®,(Ÿ¿üP.,ï,’ç:”#Õ\Ç@òŠTsÊ‘j®c@9RÍu (gªÂT…© SU¦ªLU™ª1UcªÆT©v¦Ú™jgªƒ©¦:˜ª3UgªÎT©S ¦H5×1 ©æ:’W¤šëPŽTsÉRÍu (gªÂT…©Îcaéó;Gú Gˆy,¬¦áÝöÆiì í½Æýy+±«wÿz÷áÃÓ™¾åq¾òÕåIÅù[άD¨§û2ôrØ<._vù%©óàåŽòyð‹reù@ù<øE¹°¼³mó¸£äÞgo>qÞ¦í«Ã6gN–•T¾½A½?Ý’W˜®Þýù§óÝçGwëÛï>l&Úv¨ùlê¾óÔëÐÍ8?XxD”¶3n;…®,W–”Ï#2” Ë;Ëåóˆ åÆr¦*LU˜ª0UeªÊT•©*S5¦jLÕ˜jgª©v¦:˜ê`ªƒ©¦êLÕ™ª3Õ`ªÁT©ÎÿÈr¤š ~QŽTs/Ê‘j®ó%yCª¹ÎåLU˜ª0UaªÂT•©*SU¦jLÕ˜ª1ÕÎT;SíLµ3ÕÁTSLÕ™ª3UgªÁTƒ©S ¤šë|QŽTs/É+RÍu¾(Gª¹ÎåH5×ù¢œ© S¦šôùå)š;©¿}ž»ÌÐk‰pÓq»3ôùQvfèíy†Þ¯Þ}{zx¼¹]¶hؼBÚËeAÛgZŸc3.óKXJwÝ·27–ËåógåÊòòù3„rayg9S¦*LU˜ª2UeªÊT©S5¦jLµ3ÕÎT;SLu0ÕÁT©:Su¦êL5˜j0Õ@ªyÅåH5¯˜“¼"Õ¼bŽr¤šWÌIÞj^1G9S¦*LU˜ª2UeªÊT•©S5¦jLµ3ÕÎT;SLu0ÕÁTSu¦êLÕ™j0Õ`ªTóŠ9Ê‘j^1G9RÍ+æ(GªyÅœä ©æs”3UaªÂT…©æ„\â|³Á6ÿê¬>ž~9}ܾr¹BÊyÓ“í®£7óòùí8ø—…Ûq—_–œþ£ÜIž—áQ®,(ÏÃ<’ Ë;Ëå ©æex”3UaªÂT…©*SU¦ªLU™ª1UcªÆT;SíLµ3ÕÁTSLu0UgªÎT©S ¦HU RÍËð(Gªyžä©æex”#Õ¼ r¤š—áI.LU˜ª0UaªÊT•©*S5¦jLÕ˜jgª©v¦Ú™ê`ªƒ©¦êLÕ™ª3Õ`ªÁTƒ©RÍËð(Gªyžä©æex”#Õ¼ r¤š—áQÎT…© SÍYÿóv[`½ÌúŸ·ÛÚ™ÎïÎúÛv¿­þüZnr«wßÝ>žî¾?=>í5p~ïó˹->Þ½ø/7·?ÞÝZ.ÛoIç÷Ó—«ö›¼>ÅfÜ‹õÛqÛƒÍÂraygy <ËåNryy?Â[re9R•ŠT¥"U©HU*R•†T¥!UiLU˜ª0UaªÊT•©*SU¦jLÕ˜ª1ÕÎT;SíLu0ÕÁTSLÕ™ª3UgªÁTƒ©RÕ‚Tµ U-HU RÕŠTµ"U­HURÕ†Tµ1UaªÂTóÌF™‡|æòånY_vÝß9F­}ÌJ¶»eóÕ«‘¯zü§ÓûÏ÷7]ßsóððy³ùknfUûü÷y;ϹŽÞŒóCŸÿÜ5vÆ]~arW+”+ËÊó¥iI.,ï,’ç]”Ë‘j®ÑE9RÍ5º$oH5×袩æ]’ S¦*LU™ª2UeªÆT©æKÓêÓË€¼%”çKÓ’ÜXî(Ï—¦%¹²| <_š–äÂr¦êL5˜j0Õ@ªyÎåH5ÏY¼"ÕF¶«wÿr÷—õÁùE^Îoß¾]<œæaóñã‹ÿzúñú‡õáÍíÃãñöýf­p®–³>"¤î}*ëlÆÍyD›m Ý·=}ÝXn,w”çÙ’+ËÊólÉ…ååL5˜j0Õ@ª¹låH5—Í‘¼"Õ\6‡r¤šËæHÞj.›C9S¦*LU˜ª2UeªÊT•©S5¦jLµ3ÕÎT;SLu0ÕÁTSu¦êLÕ™j0Õ`ªTsÙÊ‘j.›C9RÍes(Gª¹lŽä ©æ²9”3UaªÂT—£~/%Šƒáå¨ß¥”áuïx^wŽúçtýò¨?ΫàZž~ÿÍñý|þy}ü×»Ï÷ë£ëããñò„û<ÒóüÜ[Èγ¯c/ÇåÌÞF)2|gÜå—(oœCygyéÎÕtu!Ôº*àò„Á²šnN¥·g ÎwÎy=Ô«w¿½?Ÿ·¸<¿ç¸¾yóð_ë£ëÏŸ~Þ™viñR4_øbóÁÖ±;ó¯ñ徼͸½ùÉ—õè W–”/ëÑA.,ï,”/ëÑAÎT;SLu0ÕÁT©:Su¦êL5˜j0Õ@ªËX’#Õå ,È+R]®À’©.W`AÞêr–äLU˜ª0UaªÊT•©*SU¦jLÕ˜ª1ÕÎT;SíLu0ÕÁTSLÕ™ª3UgªÁTƒ©RÕ‚Tµ U-HU RÕŠTµ"U­HURÕ†Tµ1UaªÂTç„Ê\KU2 É+°¥îÍ”ö&Ty¿óvBu¾=i,/NðrBu~Ïq}óOø×õÁî|jN%ó.©:êÎÇZÇnÆÍ÷¶‘Û·úθí¦±ÜXî(·Êreù˜¹—jó{é y/,–w–ÊGc¹±ÜQî•åÊr¦L5˜j0Õ@ª¹Ê‘j$¯H5÷o@9RÍýPŽTsÿ”3UaªÂT…©*SU¦ªLÕ˜ª1UcªÆT;SíLµ3ÕÁTSLÕ™ª3UgªÎTƒ©S ¤šû7 ©æþ $¯H5÷o@9RÍýHÞjî߀r¦*LU˜jΞï׳Še‚”/¬Ö-öf>vÙûò7ùuõÝwß-³£:¿ãêÝÿy8ïÔðôðÓñöóñrg†:gÆQFnÞ.;Ïøbøf`4¯•±7ðòëRó…ºIn,w”ç u“\Y>Pž/ÔMrayg9S5¦jLÕ˜jgª©v¦:˜ê`ªƒ©¦êLÕ™ª3Õ`ªÁT©æö°(Gª¹=,Ê‘jn‹r¤šÛÃ’¼!ÕÜåLU˜ª0UaªÂT•©*SU¦jLÕ˜ª1ÕÎT;SíLµ3ÕÁTSLÕ™ª3UgªÁTƒ©S ¤š§QŽTsÒ@òŠTóô"Ê‘j(GªyzåLU˜ª0UaªÊT•©*S5¦jLÕ˜ª1ÕÎT;SíLu0ÕÁTSu¦êLÕ™ª3Õ`ªÁT©æéE”#Õ<½HòŠTóô"Ê‘ª²sKÊÎ-);·¤ìÜ’²sKÊÎ-åéEo5¢Ä@§ërEûü5RJk;ã¬_ä£-×^W}9¹8íÖ«wÿû—Óý/7§¿¬ï¹ûq}ûñ§Óúà§¿ýÍúðýݧOÇÛë_}¼¹}½ÿxsº}Üì~µìë¥ÎÜOh¾'‡Z=Ü‹îŒÛw–ʽ±ÜXî(Êreù yî‹r¤šûÆ¢©æ¾±(Gª¹o,ÉRÍ}cQÎT…© S¦*LU™ª2UeªÆT©SíLµ3ÕÎT;SLu0ÕÁT©:Su¦L5˜j0Õ@ª¹o,Ê‘jîKòŠTsßX”#ÕÜ7åH5÷E9S¦*Luþ9yZ¿ (óò¼<¯_ÞŽ³¸è£/çV.ŸŸ^GQ~õîŸoÞÿÇÃãñþq}߇Ï7×§‹§ªùê\ãyîæI×Á›qvhÍ"F;oÆ]~e–—oyÞINreù y^–C¹°¼³çèuï÷Ó&Ï× ¹°¼³ Ì·ÖÊ|ôt@ùå?\P梞0‹˜sõOèyìfT?Dž£V;£¶GYòùs‚rc¹£|þœ \Y>P>NP.,gªÂT•©*SU¦jLÕ˜ª1ÕÎT;SíLµ3ÕÁTSLÕ™ª3UgªÁTƒ©S ¤šk{PŽTsmÉ+R͵=(Gª¹¶åH5×ö œ© S¦š—èç\­º—åH"›Z£ÚÞ ^wŽšürù|?èù¡å _Ž›ÎvŽœÎÿáùØéüè|ôt~{9Lºùáò¬UŸÇîQK k;ŸÂ:|3Îf:g-–|lÆmNŽ-_‚·ç£²\Y>P¾ –w–Ê£±œ©RÍSž(GªyÊ“ä©æ)O”#Õ<åIò†Tó”'Ê™ª0UaªÂT•©*SU¦ªLÕ˜ª1Ucª©v¦Ú™ê`ªƒ©¦:˜ª3UgªÎTƒ©S ¤š§¸>>N›+¡5_E¡?½õö#¬ã7sãvpÿð<Ѹ¶IªÔó'…ÔŠêAêùcBjAuGuZ¥ KA–Š,Y*²4diÈÒÒrDÔØû™ÛæòÞXn,w”Êreù@¹– Ë™ª3Õ`ªÁT©æò”#Õ\5CòŠTsÕ Ê‘j®š!yCª¹jåLU˜ª0UaªÊT•©*SU¦jLÕ˜ª1ÕÎT;SíLu0ÕÁTSLÕ™ª3UgªÁTƒ©RÍU3(Gª¹jåH5WÍ ©æª’7¤š«fPÎT…© SÍó¨ÖJñ²7³ýê¼3çÍeþÉ/æ{ã6óæÚʲ[Ùvâ\Ÿüx=˱ùÚºó›»Ì‰ÆÎ“|¾æ‡Ðˆèa;Ã.¿¹™7Ê•åƒä¹™7Ê…ååòÜ8‚äÆr¤š›y£©æfÞ$¦*LU˜ª0UeªÊT•©S5¦šGX)u~ó¼%Ï#H.,ï,”çÆ$7–;Êsã’+Ë™j0Õ`ªÁT©æfÞ(Gª¹™7É+RÍͼQŽTs3o”#ÕÜÌåLU˜ª0UaªÊT•©*S5¦jLÕ˜ª1ÕÎT;SíLu0ÕÁTSu¦êLÕ™ª3Õ`ªÁT©æfÞ(Gª¹™7É+RÍͼQŽTs3o’7¤š›y£œ© S¦š›y{ ß=bþÚ”;Ï ´˜i´±3lÿ¬€^Þ°œgÎÛy{;Œ«w¿ýé˜;î×wnßß]ßÜ~ؼVîü˜6ôéHóÌël&Có‹Yêü¼}gØvꤨ¤ž©ÕÕAjk¨6TÏŸŒò|’êïç½²\Y>P> Ë…ååro,7–3Õ`ªÁT©æ g”#ÕecW’#ÕecW’#ÕecW7¤ºlìJr¦*LU˜ª0UaªÊT•©*S5¦jLÕ˜jgª©v¦Ú™ê`ªƒ©¦êLÕ™ª3Õ`ªÁTƒ©R]6v%9R]6vyEªËÆ®$GªËÆ®$GªËÆ®$gªÂT…©æ…Úç-Þ>±Ñe¿ï1ç}»¢n{32»ÜÖ gdòtvù(OKšŸ=7±ê/^nuû„/oêaØ<¾²ð—_–:k|þÖ@¹°¼³*Ë•åå^X.,gªÎTƒ©S ¤š‹¿QŽTsñ7É+RÍÅß(Gª¹ø›ä ©æâo”3UaªÂT…©*SU¦ªLU™ª1UcªÆT;SíLµ3ÕÁTSLu0UgªÎT©S ¦H5£©æâo”#Õ\ür¤š‹¿IÞj.þF9S¦*LU˜j^ŽYŒhN¯Ë ôsÛ¸¢owM¬O/1³\zþÝ?ýüñ´=ñ‹ÅŸ×znžäo.Ïó+=o ß ÛNÝ+Ë•åƒäËbq’ Ë;Ëåy1ŠäÆr¤º,'9R]‹ƒ\˜ª0UaªÂT•©*SU¦jLÕ˜ê²X|þ¾©Úß’/‹ÅA.,ï,”/‹ÅAn,w”/‹ÅA®,gªÁTƒ©S ¤z^,r¤z^,þö¼"Õóbq#Õóbq#Õóbq3UaªÂT…©*SU¦ªLÕ˜ª1UcªÆT;SíLµ3ÕÁTSLÕ™ª3UgªÎTƒ©S ¤z^,r¤z^,þö¼"Õóbq#Õóbñ·ç ©ž‹ƒœ© S¦úr±ø›§Ü¯‹o§ûå¢Ï­×ÆvëµóJñ¼®ÿåUgÏ~÷éøþa}øÓéãϧûí¾kí UJÓ§_‡oÆÙảw®§ß·Ñ;És?u”+ËÊóÚÉ…ååò¼¶Cr¤šw\˜ª0UaªÊT•©*SU¦jLÕ˜ª1ÕÎT;SíLu0ÕÁTSLÕ™ª3UgªÁTƒ©RÍ» PŽTón”#Õ¼ÛåH5ï6 yCªy·Ê™ª0UaªÂT…©*SU¦ªLÕ˜ª1Ucª©v¦Ú™jgªƒ©¦:˜ª3UgªÎTƒ©S ¦H5ï6@9RÍ» H^‘jÞm€r¤šw ©æÝ(gªÂT…©æÝy­¿u'Óâe[8¥Xßû0c票շ»Â­÷èÕ»ïò_<þñæããÎD¾Ïÿè>ŸGëÎs¾¿Ø%Ï›™üü•Jòù+åÆrGùü•Šreù@ùüB¹°œ©RÍ[1PŽTóV ’W¤š·b ©æ­(Gªy+Ê™ª0UaªÂT•©*SU¦jLÕ˜ª1Ucª©v¦Ú™ê`ªƒ©¦êLÕ™ª3UgªÁTƒ©RÍ[1PŽTóV ’W¤š·b ©æ­$oH5oÅ@9S¦*LU˜ª2UeªÊT•©S5¦jLµ3ÕÎT;SLu0ÕÁTSu¦êLÕ™j0Õ`ªTóV ”#Õ¼åH5oÅ@9RÍ[1HÞjÞŠr¦*LU˜ª0ÕåVŒ1Ê@g;ηbÔRs+ýí™—¶=?ce»?ßù6Œ9¼¾~¹»å÷7ÿµ>úêëÝù!j.³–±ó!Öñ;3ïöüߎۛy£ÜQ>gÞ(W–”Ï™7Ê…ååraªÂT…©*SU¦ªLÕ˜ª1UcªÆT;SíLµ3ÕÁTSLÕ™ª3UgªÎTƒ©S ¤š3o”#Õœy“¼"Õœy£©æÌ›ä ©æÌåLU˜ª0UaªÊT•©*SU¦jLÕ˜ª1ÕÎT;SíLu0ÕÁTSLÕ™ª3UgªÁTƒ©RÍ™7Ê‘jμQŽTsær¤š3o’7¤š3o”3UaªÂT…©./˜'Í[ϯ—7HßRËÎÄ{~Cˆ”RG‰ç‰·'ÞúzÚ=žþëñt{}º~~|{÷¸Ù!oÍŸžJ™Ó­gº™†¶C÷å³Ýûœ¶³Vc¹£|~_¢\Y>P>¿/Q.,ï,”+SU¦ªLÕ˜ª1UKÕ9SØû¶ßÎ+ Ë…ååòÑXn,w”{e¹²œ©S ¦L5jÞ¡r¤šw蓼"Õ¼CåH5ïÐG9RÍ;ôQÎT…© S¦ªLU™ª2UcªÆT©SíLµ3ÕÎTSLu0UgªÎT©:S ¦L5jÞ¡r¤šw蓼"Õ¼CåH5ïÐ'yCªy‡>Ê™ª0Uaª9;ÈËËÝâíS¿åÅrKíy8´7½|9·œ´Î×夵Ÿ'­ñb)>È+ÃÏo:Þ~ø8§³O¸l¨ßη-ì<õóèÍ<·j­augÔæh¬Ë;Ëåó«Œrc¹£|ζQ®,(¦*LU˜ª0UeªÊT•©S5¦jLµ3ÕÎT;SíLu0ÕÁTSu¦êLÕ™j0Õ`ªÁT©ælåH5gÛ$¯H5gÛ(Gª9ÛF9RÍÙ6Ê™ª0UaªÂT•©*SU¦jLÕ˜ª1Ucª©v¦Ú™ê`ªƒ©¦êLÕ™ª3UgªÁTƒ©RÍÙ6Ê‘jζI^‘jζQŽTs¶Mò†Ts¶r¦*LU˜jζû<îPñ·O[—KÄ9ÛŽ"{óè½]òmN[¶ÓíºL¸ç$ÂsÊýãÝý§ããÍÝíúÎÇŸŽë£?ž~üö7ëçÛÓýññô°¾k>Åúà¯wŸ7Çvcþ`uo;ŸÒ:t3ÎCæ—U»ìŒÛþɯ,W–”çî=$–w–Ês÷’Ë™ª1UcªÆT;SíLµ3ÕÎTSLu0UgªÎT©S ¦L5ê²{É‘ê²{È+R]vï!9R]vï!9R]vï!9S¦*Luþ9hR‡ù{œçûkî¡3ÇìZìÌßöÛ#󦼹àwsr~çóÈùÑ—#óÃåjÀvùÚˆÃüµî&;v¾9wÕóèÄ‹îŒÛžê2–;Ê£²\Y>H>ÿ#Ë…ååòŠTóåH5LQŽTóÈ”äÂT…© S¦ªLU™ª2UcªÆT©v¦Ú™jgª©¦:˜ê`ªÎT©:S ¦L5˜j Õ<2E9RÍ#S’W¤šG¦(GªydŠr¤šG¦(gªÂT…©JÃY)19†Óåï˜ãšïrö‹~´+›¿0_Wþ´åЗ#ÎÓýéöýi}×<ê<~8}:Ý>^ææKÑÌãé¢Õvžv}†Ëqó7ÍP>Ó \XÞY$ÏMPn,w”W¤š›> ©æ¦(Gª¹éÊ™ª0UaªÂT•©*SU¦jLÕ˜ª1Ucª©v¦Ú™ê`ªƒ©¦êLÕ™ª3UgªÁTƒ©RÍMPŽTsÓ’W¤š›> ©æ¦$oH57}@9S¦*LU˜ª2UeªÊT•©S5¦jLµ3ÕÎT;SLu0ÕÁTSu¦êLÕ™j0Õ`ªTsÓ”#ÕÜôåH57}@9RÍMHÞjnú€r¦*LU˜ª0ÕeAÏÌ» 3Ë’žnùQö>Ìð‹>o —·ÙøÓzžWï~}}ýüæýóŒÍÖŠ¹ùÌü>Œ!uçéžÇoFÅaÔ9ÊMwFmÏ>4–Ëåùbm$W–’çÝG(–w–#Õ¼ûåH5ï>"yCªy÷Ê™ª0UaªÂT…©*SU¦ªLÕ˜ª1Ucª©v¦Ú™jgªƒ©¦:˜ª3UgªÎTƒ©S ¦H5ï>B9RÍ»H^‘jÞ}„r¤šw¡©æÝG(gªÂT…© SU¦ªLU™ª1UcªÆT©v¦Ú™jgªƒ©¦:˜ª3UgªÎT©S ¦H5ï>B9RÍ»H^‘jÞ}„r¤šw‘¼!Õ¼ûåLU˜ª0Õœ¨”Zu¼}þŸ§*Z£ÚÞ Í™Šeé¯_Þ£”§*žNVôe]ïwZ|õ• ú¡«Eôù,Û§\Çï̳kñlëθ½y6Ê;Ëå¹ËÉåŽòÜåƒäÊòraªÂT…© SU¦ªLU™ª1UcªÆT;SíLµ3ÕÎTSLu0UgªÎT©S ¦L5ê²ËÉ‘ê²ËÈ+R]vù 9R]vù 9R]vù 9S¦*LU˜ª2UeªÊT©S5¦jLµ3ÕÎT;SLu0ÕÁT©:Su¦êL5˜j0Õ@ªË.$GªË. ¯HuÙåƒäHuÙåä ©.»|œ© S¦ºlº sVž‹Þ>qÍ™vÍœ(s¾·?ÕŽË›qsªÝž§Úº¾êâùÑߘk9×ÝyÎuüf\Ì´”â¶3n;n,7–;ÊçÁÊ•ååóà åÂòÎr¦*LU˜ª0UeªÊT•©S5¦j©:ÿ YS¤î Õ†j'õ¨¨VTR{Aµ Y:² dÈ2ˆe.Ð'5±Ìåù ®Ä2瓚XæÒ|P7b™ óI,Y ²d©ÈR‘¥"KE–†, Y²ìȲ#ËŽ,²Èr Ë,Y:²tdÈ2eË\Ojb™«ïIM,sí=©‰e®¼u#–¹îžÔÈR¥ KA–Ëìº?m¹ùö©êr»”pÏ6ãF\ôѯz¹ÜOÀŸ¦ÖóH0®ÞýóÍíõúèøòÁ/7§¿¬¾º$™%ŠÍ‹ú·[Ÿagºèj³mmgÜÞtååò9]D¹±ÜQ>§‹(W–”S5¦jLÕ˜jgª©v¦:˜ê`ªƒ©:Su¦êLÕ™j0Õ`ªTsöˆr¤šóG’W¤š3H”#ÕœC’¼!ÕœE¢œ© S¦*LU™ª2UeªÊT©S5¦Ú™jgª©¦:˜ê`ªƒ©:Su¦êL5˜j0Õ@ª9½D9RÍ &Ê‘jN1QŽTs’Iò†Tsš‰r¦*LU˜êœ<š—éFæ[¹ÍœÇLuwœ—ÉcÛn3'çë²sr|õîÛÓÇÓãi}üõÛ¶çt±9u­a;Ϻ>ÃfœÔŸ&ÊÛq—_š¼WåÊòAò\Ãraygy <7 &¹±©æn”#Õ\ÃMraªÂT…© SU¦ªLU™ª1UcªÆT;SíLµ3ÕÎTSLu0UgªÎT©S ¦L5j®áF9RÍ5Ü$¯H5×p£©æn”#Õ\Ãr¦*LU˜ª0UeªÊT•©S5¦jLÕ˜jgª©v¦:˜ê`ªƒ©:Su¦êLÕ™j0Õ`ªTs 7Ê‘j®á&yEª¹†åH5×p“¼!Õ\Ãr¦*LU˜j^eÎ%ßÃ÷ò¯Nº—5Ü:[“±w `ïDl7vÓ§Ýr•øï®o×Gcw7;ô°ùKÛyÎõ6ãâPû˜ãÔvÆm&òÞXn,w”Ge¹²||¹ïœäÂòÎr¤ºÜwNr¤ºÜwò†T—ûÎIÎT…© S¦*LU™ª2UeªÆT©æ}ç}þzo5Þ’ç}ç$–w–Êó¾s’Ëåyß9É•åL5˜j0Õ`ªT—ûÎIŽT—ûÎA^‘êrß9É‘êrß9É‘êrß9É™ª0UaªÂT•©*SU¦jLÕ˜ª1Ucª©v¦Ú™ê`ªƒ©¦êLÕ™ª3UgªÁTƒ©R]î;'9R]î;yEªË}ç$GªË}ç oHu¹ïœäLU˜ª0Õe7Í3è Ày‡·QjÙ;ÒöºsÊB·¼Ùó=çõêÝïïonׇ㜅Ô$B‡í<éú ›ÓõuþKçŸãqÛ³ ÊòòyÔ‰raygyö™¿:¥?o~÷¼|a{~aï,„m÷¾ëËYˆùË«_½û_ÇÛ㇛Ûë{~>Ý?ÜÝ?®ïùrjb}×Ç›‡ÍþxË‚k}þì6w¼§‡Þj)moØvB0HÝ ªÕÕAêÑPm¨vR{E5²tdÈ2e Ë –yÕ’ÔÄ2¯Y‚º˼bIjb™×+IM,ój%©‘¥ KA–‚,Y*²TdiÈÒ¥!KC–YvdÙ‘å@–YdéÈÒ‘¥#KG–,Y±Ì‹’¤&–yIÔ•XæIR˼ êF,ób$©‘¥ KA–yk¥ŽÏ+Šo?Zλ¬{“ˆ{f3È °{ßîÑÕŸ^k*÷…¼z÷ÛûÓññip~ÏÓN]ç×yö«ÿür–p~Ï«YÂù]{³„ÌóQËï¾ÿæóÿÿ/  y endstream endobj 819 0 obj [ 818 0 R 820 0 R 821 0 R 822 0 R 823 0 R 824 0 R 825 0 R 826 0 R 827 0 R 828 0 R 829 0 R 830 0 R 831 0 R 832 0 R 833 0 R 834 0 R 835 0 R 836 0 R 837 0 R 838 0 R 839 0 R 840 0 R 841 0 R 842 0 R 843 0 R 844 0 R 845 0 R 846 0 R 847 0 R 848 0 R 849 0 R 850 0 R 851 0 R 852 0 R 853 0 R 854 0 R 855 0 R 856 0 R 857 0 R 858 0 R 859 0 R 860 0 R 861 0 R 862 0 R 863 0 R 864 0 R 865 0 R 866 0 R 867 0 R 868 0 R 869 0 R 870 0 R 872 0 R 873 0 R 875 0 R 876 0 R 878 0 R 879 0 R 881 0 R 882 0 R 884 0 R 885 0 R 887 0 R 888 0 R 890 0 R 891 0 R 893 0 R 894 0 R 896 0 R 897 0 R 899 0 R 900 0 R 902 0 R 903 0 R 905 0 R 906 0 R 908 0 R 909 0 R 911 0 R 912 0 R 914 0 R 915 0 R 917 0 R 918 0 R 920 0 R 921 0 R 923 0 R 924 0 R 926 0 R 927 0 R 929 0 R 930 0 R 932 0 R 933 0 R 934 0 R 935 0 R 937 0 R 938 0 R 940 0 R 941 0 R 943 0 R 944 0 R 946 0 R 947 0 R 949 0 R 950 0 R 952 0 R 953 0 R 955 0 R 956 0 R 958 0 R 959 0 R 961 0 R 962 0 R 964 0 R 965 0 R ] endobj 817 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 819 0 R /Contents 966 0 R >> endobj 967 0 obj 15141 endobj 970 0 obj << /Type /Annot /Subtype /Link /Rect [ 461.54 374.897 489.87 383.897 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 969 0 R /H /I >> endobj 972 0 obj << /URI (http://www.doi.org) /S /URI >> endobj 973 0 obj << /Type /Annot /Subtype /Link /Rect [ 497.715 130.265 523.275 139.265 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 972 0 R /H /I >> endobj 974 0 obj << /Type /Annot /Subtype /Link /Rect [ 138.0 118.265 203.107 127.265 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 972 0 R /H /I >> endobj 975 0 obj << /Type /Annot /Subtype /Link /Rect [ 210.444 118.265 287.114 127.265 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 972 0 R /H /I >> endobj 976 0 obj << /Type /Annot /Subtype /Link /Rect [ 377.401 118.265 492.036 127.265 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 811 0 R /H /I >> endobj 977 0 obj << /Type /Annot /Subtype /Link /Rect [ 499.373 118.265 523.273 127.265 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 811 0 R /H /I >> endobj 978 0 obj << /Type /Annot /Subtype /Link /Rect [ 138.0 106.265 412.07 115.265 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 811 0 R /H /I >> endobj 979 0 obj << /Length 980 0 R /Filter /FlateDecode >> stream xœÍÙ’Ô8ò½¾Â1û°jÉ–/Þ`v™‚£;6&hTeU•wm«Æ’»©ùúMY’-Õ;À LÄ™VžÊKÅ`øï©þ+£eYìêÍ–N‚4 ¢Ä’bŒhc„¢0ê`JŠƒJóx@è økrðcðïM³ÁÁ?7Ÿ¿À™"ÀÀw¿Á„÷¢>m>x¶ÙÿLöáà°yq½¹z×û1Ä1œ¢!Æ8΂ Ea®ÿ„Áu|~ô’)”Í©S¿׿m~½ž¸aŒ²ŸÍÓ!SÒ4ExžA½˜ÈЀb$êOCæ¨Ñ2¡ÌßMÆ ‹±oð2y~ã.çM §Éó4ÏáÊ&‰“ä%ÌOãÝ2WBmFIOj/ùN—¥òßÇ:`ù$ B±æü`LrŠšÀµ¦á·ÇdÁü£1!$F”¤ú²S#ñÓ»õ 0¼ç_zñNâõ§O«·¼}Ð{B3Drð&¤ôÛÝ_rÿ°ÿI†ò²,NlDŸ¿¼à†g'µÿ!<Ú‰FºgEÑr)Ÿ „Nv¬ªÎ®EÃ×ÄíÙW‡I òpså®6v¢­'ÑúFX§ŽâátAYEyÅÑ·§Ã’{L°¨kª²./‚Š7u|0¦<Žó<±Ù}óñB{¤Éô Nƒ›oú–”BDï ñlŸÔiùž·¼Ùñ‡£‘¤(L3LbòűäþÑâ³ ašçYšÚü†€;­èÇà ]ž˜S&Ô9ö”ê)úh_òª#~U1b&9-aõöe`aÖøôý ¼T#åöGäÁ÷/_yœ­÷*KîÚòäÉÙ‰Óùöñ“u&–RüëıW¼YQDÂY€Ø”.ÛV½<‚S”ƒÉÒCþuýö‡–°(JÛ- nyDÀaë‚%··¼bºZ|Š]»ã>»é$ëÂ|#Êš&Œº3ð*ïxå&ä$,!…åmW©òd¢aD Ç5Î\Ž£Þ~d»ãˆ©óÉc<ñvD†bI¬õ‘ª÷¼@#åu3ºӷL*O•ðà£'èæã÷YïéØŠ;Oò• DÉ,(¶zú¢)›}ßôíßKp¿”Pñ¢…K„/A‘N‚ï’Ÿ âÕ…ÈÇ ,ðã<õ'[˜ 4Ð%ï@çƒÁJ9€5g}ù¬‡{cÆžØJìÜ3„þ*Ço•÷Á”·DéµZµBÈ‘s´ö¤{6urÝ¢_öeÅŸ]]ý²!ئ:µB‰ÐV> ³¡*4¨³¼ÜŸ‡/Ð-ÂÁ'¦Ž¾…(±Vé6m)}· u4ÙÛ ¯˜¾™¢×ÐMS~Žœ¥âµ¼}<k¶ô¥•èÛ³–žùm+^¯c®÷ÈS¶Èz|Ç$¿pÔ9o°RŽ0ÿ ësaZ¡¸P¬‰)ö­j$H®\ aË÷¢õ8Jµ®¶(å©bg_¯­é¥V]Nk‘‚Íh©©mQGP´çLu­ÞþèJhƒðž€åæ¨ têÀ!}ËÆ^ˆBÅ`‰Ð¯,W»ÁLk”å(Ö¯”,¦+ú¥îµb>`ƒGYK|L¦ÿóš‹PœÃºE¿g=YrÿèzBáF¢6±4"6æãzr¯¯'Ö·)Óµã±YÓyû´àû>üÕ[YzœŒ Ó7b4Âãæ³*ÆNƒ4&• 펻B°zÄo'2«Ê?ç Æ`-$—¨=ÎRÉeòÒ8›Åļ8ˆ6d1È’~5sVƒSlk ]£2º9²;Ggî;Wä·]ÕÏs ß™Zªuwª„¶ƒZ3ñ§;·>QiŠg¾š[Y©išD b˜Àömhú¥^ïà!&K»²Š™+Ù»¦k7ÅÉ·! ^zpß Ú4¿cvS±‡ám“Ó?n»Ÿ÷‰^IY˜gy¼âÒmFƒÿÑ9W”¢$ ¡\£l…mÔ¦g¿ç¬NO.›- Ãû‘4¼d‹þ³b áéIIž%ø/س¼ÌG3–c e;DøöñJÄ:hŽ:WlÏú]týJS½ÒÖììa¬’ÂCm>XÌ<³lï!CzX|ÌwÀ»ky? |vÓ#æŽÁƒWÉKúæ—­!#±ùQeé±¾”=l›Ð×Ò$ M`CM¢5扙}u;Ô%º3P¿• ˆâ™DyO4§ëAÒN-+åð™ t's„5lÇÙðE8H´Ö”Ïðüqð ¹_D{Òo]¿qZE²<4+Ê$«n¦[iJ1Mgnö&ÑdÌ ïÐeÁ†œ±hß Ìúµ“Î|ðäô÷b-¯D¿AÑ10Ôsˆú9U:7ЀäúvÇ}ÎzTp¥˜=æÿJ@â|½Hõáë·"÷è û;2K²ä¬…á¯xXJöà6Ãn›d!ÆIöÛÌ’û‡ÆÑ8ÊÓÜ5¨·ã6ó6ZßfýcÝ„Én3!¡öúº”;^U¬á¢“ÝA†@<Ø[i,%B2,5—dÙµÆbÐ Ýž=䎵åÔ°ÉÛÜÙOyÿŒË„IÂxˆ‚3óÜ"XgÛð¦2¨K É™éÖᨮqY´\6÷)ûÒÇXs¾×«¼Gâ•4oýáH1‘ïŸí$;øxQî!"ÒW׊z%0¯§p'1Uhq¨ðûÆDéyã!e}­2Oü6•“T›ö1¨9úJu«öÐþ7s·h[š‹œÓ"/ [ì1J‰DË`å¡T¬Z‰ÍçqÛþ‡ïì¨ÂýO LÓÒ|> H¤ÿ‰ ^S4‰Vy">/83D)íÿ%c…ó¨ÔéÙÕÕýý=*D‰`*ÍøC#Bà1•Q²ÂÿeqüAuȳô}Å™ÛFzB_‘î–<þ~â°ùn€¡&1­y¶¢õ£_êVÂ[̇‰: t‹{£!F8‚މÓ5< S¥° ÇÙ_I“dÞõå ݪ6v£¨¯dwÒårUˆ¼œ´ž‚NÅ~±;)Ä)ÂMóÛŒh„"ýï³Q¾rZ;Á}[€ÃÜÏk˜Tg/8Ôb%=Š˜›©ÃÎçYC&o¨õy›ä…!܈ÿöy»äþËó¶ÿý›ÿ8¿rJ endstream endobj 971 0 obj [ 970 0 R 973 0 R 974 0 R 975 0 R 976 0 R 977 0 R 978 0 R ] endobj 968 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 971 0 R /Contents 979 0 R >> endobj 980 0 obj 2524 endobj 982 0 obj << /Type /Action /S /GoTo /D [981 0 R /XYZ 72.0 324.893 null] >> endobj 983 0 obj << /URI (http://refdb.sourceforge.net/citestylex/index.html) /S /URI >> endobj 984 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 590.769 292.49 599.769 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 983 0 R /H /I >> endobj 986 0 obj << /Type /Annot /Subtype /Link /Rect [ 298.32 590.769 494.69 599.769 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 983 0 R /H /I >> endobj 987 0 obj << /Type /Annot /Subtype /Link /Rect [ 420.641 446.393 523.274 455.393 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 982 0 R /H /I >> endobj 988 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 434.393 294.152 443.393 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 982 0 R /H /I >> endobj 989 0 obj << /Length 990 0 R /Filter /FlateDecode >> stream xœí=M“Ü6®÷ùº­]eËü’(¾[œŒ³Î&ÙJ<¯vSqšnõ´u«#©=žÿ@‚_RK3ÙWI­ËÝÉÁ €ÅÖü~Eÿ¿Ôÿ‚¦E¡’ÕîêwÛNÉžÛ¦Œ¤‚e„ð„Š”eÉ.7eI£y"€9þѾMþuµ¿"É×W?ÿ4ë„ßýYèÜtõîê‡H6Kð§$Iî®^ß\½z“%”$7› b‘¥2Ï•*˜JŠ”3¥ÿcÉÍ.ùùÙëú¶©Û»®í©Ú˜èp¨Ê¸ûz¿ØalFiÔþ.îpÓNféÂV>¶Ô4lYkX uÀ „‰‹â”Ù¬ŠJ‹Y2í6-Þ"wÕò¾|Ø=,]À~=öåpߤ7ÃFxˆH¼-#Öuµ©÷µ·hK;ã<”Lƒcd©¬HY°ÄÆ®àÛb‘É€Tå)ìe„dª˜ú=cüëëïá1ad VI'zŬÌaÀà jå×ÈŠôp¨Ò€Bé#í¢!r;šêq¿¨ S£yÁÞlvò<éîÀ´ÔÔ´¸¢)“„.ØŒÔ`üCõñåÌ¢ÐiàFÇK?î;rr7gË”Í1ƒØ°™s˜™ÂlT@Hâ°`TÒ™ží t¨yR6ÆíÊ f¢‚hJÿ‰¼,§)•0ˆ ÙÌ Æ}—R=Úg]wÕjh»ßbÂæ©Ü=¸ÓªŠøú¡«oÚ@ÓÉÊ ð AR% !ÍU†#¾Õþ-ÌøYÝ{°\ïêöPãߨ´o=X•}hÊþ·€¢û®*­ÚNOÈã“ý}ôAtÓµ»ðlÕ•Ãj›ú†Hð]ú¸­b1k³Èv¨WAærFM›¨ eݘ]2fEõØûgõÆ#z× êÞƒ° ¾î1t„wíºÞ<ž!tÖzv‚0¾Nÿ\âèÛ}4|4d:ÇPåûðð=擈@`┺íê*̬ýPuêjšdW/â0š˜õPuÇQƒÏ/PêêP‚]N7>­™O4²nWǰÁƒ;뮾'yg¦þïï¾M¾ºùêdc‚¤ BdBÍô™ü|BŸ§œ½äl†~; ‡ÿyõª«6ëÛCèá®J÷Õðj²˜eøø ¬¡ú˜nsÃÌKseÓ™Óþ9!‡ ªáB:CžºX e)aÀb¢.”—2e BG±“$Œ@£=yf«L(±YJÓä_&Ú€XW*“Q„AëÚÔODgX7¦žAþ rÈ—PÍ[“Ô„²vk¹F›R¾VÒµ –øP6õºtYnÑËmÁj]h¾kêß<ÿõ®\õ¯ömÆÅWƒL©iÃhzj™LÐñ ½+<$lQÉH°Oßd¥A,6 Ø Æ‹A ìª>îÙf“{ðÕ­¡]äx°Oe VШ4 ýXÈñP÷íþoºj÷X¥Õd|¬S”ê riöœQz„õzÄobˆZù)•I¼»Qm÷Âã>!Ú÷¶»?¶Wý±±f…-ÚÆ#Ò®=ÞÍ?2H;dÙõU7£”<¥ä²•µbL*´»]ÓkŸƒÔ¬©¡ ¾ÕÁ¤JÊõZ÷ :k5»Ö®„¬ †+oaR3i +`]($í¥ñaÐËœ‡lx&Ëó4/¨>_£3}|ùöæúÝÍOß^/Öf¢ë# *¬ÍB–B}h(8uFlõЍ­i±2"°C½:b¶aÛ¢¢ÉrDMMÒ» Û~j3jVj2C]›Ü’¾‚ÍF°æ 륅2ÖdLØXÝÒ:@A•ò\'²9Å,»ë›Åu`’¥Ü®Èx6ßÜwºèï» 3Ä…}˜ i]÷º\™ÀÁ$Õ;õ¢ìô ¸ÊÅL'Ä„ä#ü‘‘ ÙC—àA‡#úX®,ªm˳>‡íáeKÕœö÷ó~ZsQ¤¹1)Xú©œoê»#¦L¶ØW鋸C(ß­¶•N™V3êç|ÒcW 8Åç”fæÐ`!e/®…š˜+®”¤jf¤?°F{¬ƒH«ÊÙÈ32ln¶ïŸ§Q/6x=5/–‘´çèww']š)}ÿÅwËÓâD¿„5UâñiEÑʶ #ýáÝÌÙz¡&>Ä“…Ì{ÆD6‘ÆÛsÙ—¿Å(èžé­±†dô!jtRXtÕ›u„߯½ÕkXÂzeϘ°Í¥¾»˜ÁŸ@ÍH3¦Œ¯,q!>Ç#oÛ¹Tƒgr¢¡é¶AIáå#¼"Ä.싨©JïÒžzØ\©¬ÈfdÐnþMúºn›ôKpötÎ ’Hª{`b¦‡hhW’ÍÉÁ `„Z…PNçt¡å¸n`O‚~Fu@!aÑdŽ;ž¿óÅXй£4aŽd„BˆœéñÇë7‡.Õcüñú„}À¶¸}`ÆHr5ïF ½’æ°;Ђƒ‡¨9F?Þý¶ÆDÇ`q¤ç®uOJ¨ftª¦;Ç4±ùê,1qS?@üÆÊî·Õ^§—¡Å&º~í›ÜÐ ya€eÝ”·±4îA¼¹!ÒU¿«~ˆå1çõ§Šdºi}Ñ [[@1ï>‚²×BëßHšÒÁB•>]ZUž­6æ©áÚ‘ÔŽ«ºvgr>–O˜;·dyôú…YÒÿN­J¢‚Bd„ð<3¡GÌMå)ÀÈæøb ÜÂ0Œ.3z¤ÓðWa.Nuñ}ò^DIÅS„ÊË9!Ä ®ïYä"ŸrÂÇã5£ì1~7~Ö ÞEÃI‰!]q3Ìè…Ãê4Ì.bˆYîW¾ÅÞ_soÓ´fÙt?pãj™2|mì È€¦þvÍÕÇ!uÈ›¢ccâð”gYõPŸe:mÕ¯0N%zýöõªò1~7~P½Aƒê§‚ºâüP‡‡F‹S²øâÅL#Ä4ÂB&§ÏGR7 …Èô´P€»)*¡"URº~J_1%“r$,}9Mé´g–CQ© –RÍŒqRñœˆÆ9T+¶?åwu´¿Œô»¹"ä.üèyéWºúV…½’”Æ¥ 1¯È< °„Hjï¼éÊ@gwŠ®t§»+ ›ib¤ÈôAo3m’Pþ§zÊú<O:yâ±îp{¥ï:ÑäÎLÆÅ€C€¼™Î{Áœ3ù”•Šä‰Ì!¨\JÉ…€uJ6æöLê+Á™póuèK¨{ˆ!Y!ÉÓF`$3Š‚¤8Í“VЬ<åúu´¢¹VÄe¨Ø¨>L“tü´™>Í…ÌR3Èàñ¨ãGNúEµèWšPmÂêv¨Ÿœƒcæ…– Rp 73=³ÆD ¥Ø^}ž »Á;rê¿‚)Ý_‰ä»+ª ‚Eìt²¤ÁÀÙ\½ûS´–Ó ®²,ÖÄÒ\Ÿ6Ó§N1°Ñ7ãŽ}8éµ¶ 1{5R×v£«0‡2Jì»îwæ €W3}iâ9(dÕg—±A"!Uû`sÊüàÒˆfš/"úï Œ$ף˖Ÿ™ægšñ‚;‡6°3GèØ9t"ÅŸåПš‚žrh­ˆÝ‚N–48/­SA}œÉ¾ÎýÔ8åÈYßh„æ žü?üþœüXLßÓáF0ÂAi,€ª¶DççÌJo(F»E­,ë1p_º º)\¡ðÇ:ÚŠÿ7€ñNüZ;9:ö¨›Ïʳ¥Âyvžç™3H[441|¶~q½· _/ieI‹÷âÕàÕD¼È«¿F,8;É©ÏÉuºÇõ†M˜ lÓ=žC¬ÂŒ0‘âü|Ѥ½F»,i0p^l±[ÐÉ’çŇ }çßw„Ü6rá¨õâÂOgŘ\Vl`›Ï j`CÖæü¼Ød¶F»E­,i1ð^üX¿¾S’ëË…½qóåÇïÎÏ1YÁrç˜væ%˜ôfÁ–æLÓhb·¨•%-Þ‹cÇÌX·ì7fÿ¤É³FuktÐt†‡HŒrê½RÃ椑&†‘æL½Òhb·¨•%-Þ‹W¯äúÊzFOÒÞØ/cøgå˜æ}ƒÍcñƒMÁ±y—¡Šá³ÍdÍ››É.ieYûâœúGL…’Q.ûô–Î.RÄéå®Åœ¯ÛÔØ¾NĬÎ,¦rhÉ|¶É±ñV›/ieYûâëúm®¿žæÓã¨n?B>ߣ%4/Ì•­yašgÌí*†Ï5[ÆË˜-/ieYûâ¦ÚM‰"Q¾oœÑN<êoÛñ^»räìÓæÏÙÇO­—»œj Z`±§¿R™}¶Æø¨"1?ÃǪW§ÖÉÎQ°Sêï:nšþ"Žø|+†'ÁÅKr„ëxÏW$e²!€ê(K2žK#YÆ,Ò8Då:éDªF¢óK`'Ϫb·¨–eEF쟩‰ý‡¿{ȵ|RÚŒ½Õ;zž‚Æô·ü0€]|7WfKgëLj€ÉCïjûÔ|“„1üYïÿúƒÕ`„Á·3áLÂHF…E‹d™¹Äo¨bØŸoëŸÐ¡&v‹ZYÖcà¾x¶ölVèX¨‹gÿžÉ<öl¦ïåËw™[¤±HÆ b¨bØ¡g mŒÌèkI+Ëz ÜÏÖå»þbeFHvñì¿æ\NèŸe»s9ƒøW<-Ü©ÓF¢3tló²«0KZYÖcà¾8¶vìŒæ½8öŸ_hg,g®Ð–e®> endobj 990 0 obj 4641 endobj 992 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 730.013 318.323 739.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 874 0 R /H /I >> endobj 994 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.483 730.013 524.483 739.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 874 0 R /H /I >> endobj 995 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 718.013 229.82 727.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 877 0 R /H /I >> endobj 996 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.213 718.013 525.213 727.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 877 0 R /H /I >> endobj 997 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 706.013 334.454 715.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 880 0 R /H /I >> endobj 998 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.451 706.013 524.451 715.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 880 0 R /H /I >> endobj 999 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 694.013 352.328 703.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 883 0 R /H /I >> endobj 1000 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.319 694.013 524.319 703.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 883 0 R /H /I >> endobj 1001 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 682.013 310.404 691.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 886 0 R /H /I >> endobj 1002 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.625 682.013 524.625 691.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 886 0 R /H /I >> endobj 1003 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 670.013 349.427 679.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 889 0 R /H /I >> endobj 1004 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.341 670.013 524.341 679.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 889 0 R /H /I >> endobj 1005 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 658.013 174.132 667.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 892 0 R /H /I >> endobj 1006 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.465 658.013 525.465 667.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 892 0 R /H /I >> endobj 1007 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 646.013 247.547 655.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 895 0 R /H /I >> endobj 1008 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.081 646.013 525.081 655.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 895 0 R /H /I >> endobj 1009 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 634.013 233.457 643.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 898 0 R /H /I >> endobj 1010 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.326 634.013 525.326 643.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 898 0 R /H /I >> endobj 1011 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 622.013 276.639 631.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 901 0 R /H /I >> endobj 1012 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.991 622.013 524.991 631.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 901 0 R /H /I >> endobj 1013 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 610.013 229.26 619.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 904 0 R /H /I >> endobj 1014 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.361 610.013 525.361 619.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 904 0 R /H /I >> endobj 1015 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 598.013 233.467 607.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 907 0 R /H /I >> endobj 1016 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.326 598.013 525.326 607.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 907 0 R /H /I >> endobj 1017 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 586.013 240.385 595.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 910 0 R /H /I >> endobj 1018 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.133 586.013 525.133 595.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 910 0 R /H /I >> endobj 1019 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 574.013 210.52 583.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 913 0 R /H /I >> endobj 1020 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.353 574.013 525.353 583.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 913 0 R /H /I >> endobj 1021 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 562.013 246.993 571.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 916 0 R /H /I >> endobj 1022 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.085 562.013 525.085 571.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 916 0 R /H /I >> endobj 1023 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 550.013 257.429 559.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 919 0 R /H /I >> endobj 1024 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.009 550.013 525.009 559.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 919 0 R /H /I >> endobj 1025 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 538.013 244.797 547.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 922 0 R /H /I >> endobj 1026 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.101 538.013 525.101 547.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 922 0 R /H /I >> endobj 1027 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 526.013 364.123 535.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 925 0 R /H /I >> endobj 1028 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.305 526.013 524.305 535.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 925 0 R /H /I >> endobj 1029 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 514.013 327.57 523.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 928 0 R /H /I >> endobj 1030 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.592 514.013 524.592 523.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 928 0 R /H /I >> endobj 1031 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 502.013 225.969 511.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 931 0 R /H /I >> endobj 1032 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.111 502.013 525.111 511.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 931 0 R /H /I >> endobj 1033 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 490.013 224.28 499.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 808 0 R /H /I >> endobj 1034 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.253 490.013 525.253 499.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 808 0 R /H /I >> endobj 1035 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 478.013 244.689 487.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 936 0 R /H /I >> endobj 1036 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.241 478.013 525.241 487.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 936 0 R /H /I >> endobj 1037 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 466.013 244.133 475.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 939 0 R /H /I >> endobj 1038 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.245 466.013 525.245 475.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 939 0 R /H /I >> endobj 1039 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 454.013 265.658 463.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 942 0 R /H /I >> endobj 1040 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.949 454.013 524.949 463.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 942 0 R /H /I >> endobj 1041 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 442.013 233.096 451.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 945 0 R /H /I >> endobj 1042 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.189 442.013 525.189 451.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 945 0 R /H /I >> endobj 1043 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 430.013 223.734 439.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 948 0 R /H /I >> endobj 1044 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.257 430.013 525.257 439.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 948 0 R /H /I >> endobj 1045 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 418.013 226.494 427.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 951 0 R /H /I >> endobj 1046 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.237 418.013 525.237 427.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 951 0 R /H /I >> endobj 1047 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 406.013 299.604 415.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 954 0 R /H /I >> endobj 1048 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.703 406.013 524.703 415.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 954 0 R /H /I >> endobj 1049 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 394.013 376.6 403.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 957 0 R /H /I >> endobj 1050 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.207 394.013 524.207 403.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 957 0 R /H /I >> endobj 1051 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 382.013 385.257 391.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 960 0 R /H /I >> endobj 1052 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.139 382.013 524.139 391.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 960 0 R /H /I >> endobj 1053 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 370.013 358.134 379.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 963 0 R /H /I >> endobj 1054 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.353 370.013 524.353 379.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 963 0 R /H /I >> endobj 1056 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 358.013 252.463 367.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1055 0 R /H /I >> endobj 1057 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.045 358.013 525.045 367.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1055 0 R /H /I >> endobj 1059 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 346.013 275.56 355.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1058 0 R /H /I >> endobj 1060 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.877 346.013 524.877 355.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1058 0 R /H /I >> endobj 1062 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 334.013 268.409 343.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1061 0 R /H /I >> endobj 1063 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.929 334.013 524.929 343.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1061 0 R /H /I >> endobj 1065 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 322.013 329.185 331.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1064 0 R /H /I >> endobj 1066 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.578 322.013 524.578 331.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1064 0 R /H /I >> endobj 1068 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 310.013 346.451 319.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1067 0 R /H /I >> endobj 1069 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.442 310.013 524.442 319.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1067 0 R /H /I >> endobj 1071 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 298.013 345.354 307.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1070 0 R /H /I >> endobj 1072 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.451 298.013 524.451 307.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1070 0 R /H /I >> endobj 1073 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 286.013 216.03 295.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 969 0 R /H /I >> endobj 1074 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.313 286.013 525.313 295.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 969 0 R /H /I >> endobj 1076 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 274.013 318.232 283.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1075 0 R /H /I >> endobj 1077 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.567 274.013 524.567 283.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1075 0 R /H /I >> endobj 1079 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 262.013 224.064 271.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1078 0 R /H /I >> endobj 1080 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.4 262.013 525.4 271.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1078 0 R /H /I >> endobj 1082 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 250.013 228.477 259.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1081 0 R /H /I >> endobj 1083 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.366 250.013 525.366 259.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1081 0 R /H /I >> endobj 1085 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 238.013 208.885 247.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1084 0 R /H /I >> endobj 1086 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.227 238.013 525.227 247.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1084 0 R /H /I >> endobj 1088 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 226.013 243.689 235.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1087 0 R /H /I >> endobj 1089 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.109 226.013 525.109 235.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1087 0 R /H /I >> endobj 1091 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 214.013 284.78 223.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1090 0 R /H /I >> endobj 1092 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.811 214.013 524.811 223.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1090 0 R /H /I >> endobj 1094 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 202.013 252.473 211.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1093 0 R /H /I >> endobj 1095 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.045 202.013 525.045 211.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1093 0 R /H /I >> endobj 1097 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 190.013 243.145 199.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1096 0 R /H /I >> endobj 1098 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.113 190.013 525.113 199.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1096 0 R /H /I >> endobj 1100 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 178.013 368.448 187.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1099 0 R /H /I >> endobj 1101 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.2 178.013 524.2 187.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1099 0 R /H /I >> endobj 1103 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 166.013 323.443 175.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1102 0 R /H /I >> endobj 1104 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.529 166.013 524.529 175.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1102 0 R /H /I >> endobj 1106 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 154.013 270.076 163.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1105 0 R /H /I >> endobj 1107 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.043 154.013 525.043 163.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1105 0 R /H /I >> endobj 1109 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 142.013 368.15 151.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1108 0 R /H /I >> endobj 1110 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.275 142.013 524.275 151.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1108 0 R /H /I >> endobj 1112 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 130.013 246.326 139.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1111 0 R /H /I >> endobj 1113 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.227 130.013 525.227 139.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1111 0 R /H /I >> endobj 1115 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 118.013 194.915 127.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1114 0 R /H /I >> endobj 1116 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.323 118.013 525.323 127.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1114 0 R /H /I >> endobj 1118 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 106.013 234.783 115.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1117 0 R /H /I >> endobj 1119 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.175 106.013 525.175 115.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1117 0 R /H /I >> endobj 1121 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 94.013 279.962 103.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1120 0 R /H /I >> endobj 1122 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.845 94.013 524.845 103.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1120 0 R /H /I >> endobj 1123 0 obj << /Type /Action /S /GoTo /D [981 0 R /XYZ 72.0 589.269 null] >> endobj 1124 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 82.013 364.374 91.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1123 0 R /H /I >> endobj 1125 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.303 82.013 524.303 91.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1123 0 R /H /I >> endobj 1126 0 obj << /Length 1127 0 R /Filter /FlateDecode >> stream xœÍÝMsIr á{ÿ ©Ã”2ÂÝÃÝš/Ù¬­vwF½«ƒL4Q$±"ˆî™þ÷ ÏX`erïm$3‰UýfäC"£2"ÿë»vµÌÿýUý¿ÐvˆÈ«·Ÿ¾û¯§çÛ•÷+OOÙrÐnË"WMÝ®>]}ý”]}¬c^ü¢?ÿjþ¿¯ÚùøÃÕ¿}w÷ÝrõÏßýûÌææj™Çýù»å/¾¾Ô¿~÷ÇßÛS0ý÷ôý½üeYñ÷÷ þñk`w?,—ðëËÈé¹ùÌéë?}õ\><}•¯ž9ýNÿÿ›ßò²ùŽ—ý?Ñgó¿›on¹zÿݯ¿ÿî?¿§åêûwçQ>«Ö2=sþ§Cô¬ÿéWߺú÷7æÿðWßÿï~÷ýÞ_˜¿›ßÝöïJ¯ïëËozþÍòCeYÚW¿wú=øÓïùô[þþú‡Ç«ûwW¿¹¿{<Þ=~>ý ìüÉͣžŒù²=NGÃÕ?\ýjÔwýæÿ||øùöøçó3óU¿üúñÃñüàOÇw¿ýõùáÛûOŸ®ïn~õñöîEôöãíùûùò]téów‹m¿ŸóÑ›ÃrþANtqßv¸¬­£ÚP³ž89Qÿv=ªÕNj_P-¨¨NRGGµ¡Y&²Ld™Ä²ÞÐHM,e!–²KiÄR±”F,¥KéÄR:²d)ÈR¥ KE–Š,Y²4diÈr Ë,²ÈÒ‘¥#KG–,Y²Ld™È2‘eK]ˆ¥.ÄRb©Xj#–Úˆ¥vb©Xj'–Ú‘¥ KA–óÝ~x3—šxõ@\ëm?æ¤yÛfy‘Ïמ#÷Ë“Ž¶žv¤_½ùãO·oÿóóãõÃãó3ﺽ9^¼J›ïÂÑçùËÎë=yyÐz÷˜'JÒs{ÐåG›CoR;©ë¤Ô‚êê$õz“ÚP¤Nd™È2‰åü[ˆjbÙbÙbÙ±ìXöF,{'–½ËÞ‘¥ KA–‚,Y*²Td©ÈÒ¥!Ëù¦ßs¾é‡é+êùÓŠÔ‚êê$õz“ÚP¤žCoR+ª‘e"ËD–‰,“XÊB,e!–²KiÄR±”F,¥KéÄR:±œo:¤d)ÈR¥"KE–Š, Y²4diÈr Ë,²tdéÈÒ‘e Ë@–,Y&²Ld™ÄRb© ±Ô…Xj#–Úˆ¥6b©Xj'–Ú‰¥vd)ÈRåÛ»ÊÒšú«'/T'R›õcöfYFÛ̲ôu–ÅâWo¾?}|{zp{÷x|¸~ûxûó‹'?Ýß¼xtúè÷ôë‡ã»›®Ï¯ïn.þãÛÍ¸Ôæ?ùýl¿³óÁ›Ãì`ZŸnÏßõæ°í8;H=ßyI­¨vRÏw^R ªª“Ôó—ÔÈ2‰åügjb) ±”F,¥KiÄR±”N,¥KéÈR¥ KA–Š,Y*²TdiÈÒ¥!Ë,²ÈÒ‘¥#KG–Ž,Y² d™È2‘eK]ˆ¥.ÄRb© ±ÔF,µKmÄR;±ÔN,µ#KA–‚,ëÍÑfmdй~ iKFøÎËv¨=ß-.‡Úrj÷ƒœ‡Ú냻û»_]·×ÿðe¸½>zn¯¿~1Ü^?·Ïÿq3Üž#J©~{Êö»;¼3´kK“ÛÃö†–¤NRÏ¡%© ÕêZ’ZQí¤žCKRËZ’šXÖÐ’ÔIJ†– d)ÈR¥"KE–Š,Y²4diÈr Ë,²tdéÈÒ‘¥#Ë@–,Y&²Ld™Ä²†–¤&–5´$5±¬¡%©‰e -A݉e -I,Y ²¬Ë3Ò²®]¬ZΞ˘éΨ±m‡–ó_ÝåÐROKtü0¾ -Ov†–§ÿð<´<=zZijþz=Þþp9B’8è2ÿ-ŒÛïà|ôåa:Ï*ÖEJ!ÛÃ6Ã0UT;©mAµ zž!zf ó×ÔIêÑQm¨R×ì8¨ÕNêšµ Y²Ld™È2‰å:;jb¹ÎŽ¿¾nÄr5±\gÇ__wb¹ÎŽƒY ²d)ÈR‘¥"KE–Š, Y²4d9å@–Y:²tdéÈÒ‘e Ë@–,Y&²Lb¹ÎŽƒšX®³ã &–ëì8¨‰å:;þúºËuvÔÈR¥ ËZÜ©ó\ÄÚΨ÷›ƒü:…ÝvNLvÎ^r»½€&Æå Wo~sÿéÓýÝùñå¶§gï|¼½¿û|~âÝýÃùÁõÇ/^`‡¯¥a>¿´í·t>zgà©c™ž¦ÛÃöž¤¨NRÏ'© Õêx’ZQí¤nIJž¤&–5ðu'–5ð$5²d)ÈR¥"KE–Š,Y²4diÈr Ë,²tdéÈÒ‘¥#Ë@–,Y&²Ld™Ä²ž¤&–5ð$5±¬'©‰e n>”o^ËG¦/¾óÎÇoŽ‹CZ[­ûmlŽÛN24–+Ëåów„raù`y’¼Ï7)”Ë‘joHµ7¤ÚRí©öŽT{Gª½3UaªÂT…©*SU¦ªLÕ˜ª1U+Õ§5ƯÉ壳ÜX(÷Ære¹£<– Ë™j0ÕdªÉT©Ö¥](GªuqÉR­Ë»PŽTë/’w¤Z—x¡œ© S¦*LU™ª2UeªÊT©S5¦:˜ê`ªƒ©:Su¦êLÕ™j0Õ`ªÁT“©&SM¤Z×~¡©ÖÕ_(GªuýÊ‘j]FòŽTë0”3UaªÂT%ß.Ë35ƒ±Ä’)cï¸Í FŽ«VSó‹ù2ƒÑž®ë?ßìðò,¹.•5_ï4²ó2/^`sà” ™­í¸9¯wQ×»(É…åƒå‰òz%¹±L;_?#¹°|°l§aâ ¡O×Îl^øùàÍìD;D³eéª;Gm'3”åŽòúÔ‘äÂòÁòDy}òHrcy¼nè‚r¤ZËŒHÞj-4B9R­¥F$ïHµ¡œ© S¦*LU™ª2UeªÊT©S5¦:˜ê`ªƒ©:Su¦êLÕ™j0Õ`ªÁT“©&SM¤ZëŽPŽTkÝÊ‘j­;B9R­uG$ïHµÖ¡œ© S¦*LU˜ª2UeªÊT©S5¦:˜ê`ªƒ©¦êLÕ™ª3Õ`ªÁTƒ©&SM¦šL5‘j­;B9R­uG$oHµÖ¡©Öº#”#ÕZw„r¦*LU˜jM¢,sÜÑS^?Q3(Mz¦½) ¿¼+vÍ äv/Ô/kŽ®Þü¡nƒýåÑ»Û;'ë˲h÷×ûrôåaóGX…éu-Ïæ°Íüü†ò@ùü†re¹£|þC¹°|°]ß½ÿx{÷þòtû«qíæ œß7½Íßv˜î·9«÷Dyt–ËåóåÊr'yÍw \XŽTk¾ƒä ©Ö|Ê‘jÍw ©Ö|É…© S¦*LU™ª2UeªÆT©SLu0ÕÁTSu¦êLÕ™j0Õ`ªÁT“©&SM¦šHµæ;PŽTk¾ƒä ©Ö|Ê‘jÍw ©Ö|Ê™ª0UaªÂT•©*SU¦jLÕ˜ª1Ucªƒ©¦:˜ª3UgªÎTƒ©S ¦L5™j2ÕDª5ßr¤Zó$oHµæ;PŽTk¾ƒä©Ö|Ê™ª0Uaª5ß¾´¶;#ñÍ ƒu£”eþ¯´Ø›Éع¿O]®½ïhëŒÇçšñxwÿðéúñöþîüäã‡ëÇó£?ßýö×ç‡ïwLJëÇãçóSó%Î~¹ÿi3Äê‡6¿áõöÕÛoé|èæ8;4Éeqóã¶#¹ y]‹re¹£|þÓE¹°|°ÿ颩Öå±$¦*LU˜ª2UeªÊT•©S5¦jLu0ÕÁTSu¦êLÕ™ª3Õ`ªÁTƒ©&SM¦šHµ.E9R­ËcQŽTëòX”#Õº<–ä©Öå±(gªÂT…© S­iá˜ùzëëÇAªý0‡™}ÄÞnoàgÛòÆÓ]ÆvØ7^ úÆË!_=X?÷Ú\*[ûc›/ó÷.}çË=¼9*.óO`Ž–wŽÚN¹6–+Ëåó}åÂòÁòDù|ßG¹±œ©&SM¦šHµ¶ÉF9R­m²QŽTk›l”#ÕÚ&›ä©Ö6Ù(gªÂT…© S¦ªLU™ª2UcªÆT©¦:˜ê`ªƒ©:Su¦êL5˜j0Õ`ªÉT“©&SM¤ZÛd£©Ö6Ù$oHµ¶ÉF9R­m²QŽTk›l”3UaªÂTçƒù–eÔtèkGÎu`Ùç±½Ñý¸ÌcÝ3âë*ž/uËuˆ|8Þ½=žŸšýë÷ÇOǻNjkuÉ™ó¯ÌÎËž_asœ$¢vÙÎã.ÿ`j i” ËËåóíåÆò@yí¨Dre9SM¦šL5™j"ÕuG%’#ÕuG%7¤ºî¨Dr¤ºî¨Dr¤ºî¨Dr¦*LU˜ª0UeªÊT•©S5¦jLÕ˜ê`ªƒ©¦êLÕ™ª3Õ`ªÁTƒ©SM¦šL5‘꺣ɑ꺣ÈR]wT"9R]wTyGªëŽJ$gªÂT…© SU¦ªLU™ª2UcªÆT©¦:˜ê`ªÎT©:Su¦L5˜j0ÕdªÉT©®;*‘©®;*‘©®;*‘©®;*¼#ÕuG%’3UaªÂT…©Öµ‚Ù2Ʋ7¡óÍ™—õZÁšê*;Çy\ôu%¢_® Œ§+s¾þ?ÝÜ<ÿòáyæh³{Ò|ÿïž™á±órÏÇoŽšß?݉m{Ôæ ¾>Ay}‚Lre¹£¼>A&¹°|°A&¹°|°?úöÚ :‹·Xõ±óåί°s>Ÿ9æÂÞw¹w>ÿúºÎçIm¨RÏóyR+ªÔó|žÔ‚jbYçó d)ÈR¥"KE–Š, Y²4diÈr Ë,²tdéÈÒ‘e Ë@–,Y&²Ld™Ä²~’šXÖé;¨±¬‚ÔIJNÝA݉e¸“Y ²d)ÈR‘¥"KE–Š, Y²4d9å@–Y:²tdéÈÒ‘e Ë@–,Y&²LbYçç¤&–uvNjbYçæ¤&–ufêN,뼜ÔÈR¥ ËÚ`ãy£ p^ZÛ±¦Î“sk{ÇŲs’Ý·û±ÊéÊ«¯ðÛãÇããñüøÛçÒósÉz¡šGؼêù6ÇéÁlþËXÂvŽÛœLÏ7O’ÏwO” ËËåóåÆò@ù|E9SM¤Z‹?PŽTkñÊ‘j-þ@9R­Å$ïHµ œ© S¦*LU˜ª2UeªÊT©SµR• ¯©Ç‚jAõ@u’Ú;ª ÕAêh¨VT#ËD–‰,Y&±¬Õ¤&–µÖÔXÖJRËZçAjbY«Ë•åŽr_X.,,O”Gg9S ¦šL5™j"ÕšïA9R­ù”#ÕšïA9R­ù’w¤Zó=(gªÂT…© S¦ªLU™ª2UcªÆT­TÇÒ¤Åkò±°\X>Xž(÷Îrcy <Ë•åL5™j2Õdª‰TkúåHµ&€HÞjM¡©Ö$Ê‘jM¡œ© S¦*LU™ª2UeªÆT©S5¦:˜ê`ªƒ©:Su¦êL5˜j0Õ`ªÁT“©&SM¤ZóC(Gª5CDò†TkŽåHµf‰HÞ‘jÍ¡œ© S¦ºnfjKÓY€™—Óv¦O›„ì̵¹"ÝngjÏ[}̯ðnïÏÿÊd‘4õ´~óšçØæ‡ô瓃ÍqÛé™…åÂòÁòDùí£ÜX(Ÿ£}”+Ë™j2ÕdªÉT©®ë§HŽT×T oHu]CEr¤º®¢"9R]×Q‘œ© S¦*LU™ª2UeªÆT©ÖŠ*þ9ùŠXž(×Îrcy ÜË•åŽòÁTSLu0UgªÎT©S ¦L5™j2Õdª‰TëS{”#ÕúÔžä ©Ö§ö(Gªõ©=Ê‘j}jr¦*LU˜ª0UeªÊT•©S5¦jLÕ˜ê`ªƒ©¦êLÕ™ª3Õ`ªÁTƒ©SM¦šL5‘j}jr¤ZŸÚ“¼!ÕúÔåHµ>µ'yGªõ©=Ê™ª0Uaªóì`ž³-˰$§8µ†/2¿JÊÞ)Ùå‰[ݢ÷{Uާ›ê8øÕ›ß<¯ŸNÝNÏ<íXyzpSûl|õŸ_žÙžùêÌîôÔޙݺË÷ü3ZFÛù¾ÎÇîÌeÛc‰ãöæ²Q.,,O”×'’Ë嵯‰äÊr¦ªLU™ª2UeªÆT©SLu0ÕÁT©:Su¦êL5˜j0Õ`ªÉT“©&R­¹l”#ÕšËF9R­¹l”#ÕšË&yGª5—r¦*LU˜j-s’Ì\ºÁA ‰úâsPá{ÇEßÅvg±ñ´÷ü±!WoþéíÛãçÏσžõ©óåŒççnïοþjPôõç§vEí啘›oí|ðÎ@äiÄ©;Çí DH^÷Ë#¹±"(–3UeªÆT©SLu0ÕÁT©:Su¦êL5˜j0Õ`ªÉT“©&R­Ê‘j DPŽTk ‚r¤Z’w¤Z”3UaªÂT…©Ö¸å¹?¾kÜÒd~7ß‘ì[r»YÇxÚÕtŽZn~¾žÃ›çÇ?}>>ÿòþÝó¯^ŽSêñW£”zb÷#ùºãòüÁwº·ÊæÛx>tsTÝ¢W—ÖjH·9êòO²¯7^¹±(¯Éåò‘\Yî(¯É…åLU˜ª2UeªÊT©S5¦:˜ê`ªƒ©¦êLÕ™ª3Õ`ªÁTƒ©&SM¦šL5‘꺎—äHu]Ç ò†T×u¼$Gªë:^’#Õu/É™ª0UaªÂT•©*SU¦jLÕ˜ª1Ucªƒ©¦:˜ª3UgªÎTƒ©S ¦L5™j2ÕDªë:^’#Õu/ÈR]×ñ’©®ëxAޑ꺎—äLU˜ª0Õº³ÏÝyEN-ëSûp_Ú”Ø;õ•dÙ®ãÍÓ r¯{ÁýæÃõÃõÛÇãÃù©ãÝÛyŠ|ZÄrzæöó矶ÜÏQ–.Ïgù›/s>zsÜ<±ÞEj{Üöü¸³ÜX(ŸÃ-”+Ëås¸…raù`9S¦*LU˜ª2UeªÊT©S5¦jLu0ÕÁTSu¦êLÕ™j0Õ`ªÁTƒ©&SM¦šHµ.°G9R­ ìIÞj]`r¤ZØ“¼#Õõ¾°$gªÂT…© SU¦ªLU™ª2UcªÆT©¦:˜ê`ªÎT©:Su¦L5˜j0ÕdªÉT©Öö(Gªu=Ê‘j]`r¤ZØ“¼#ÕºÀåLU˜ª0Õúxzi§Ý’Á‰k}ç;ÕÝØwN«/O¾sVºÝ1"Ÿ6Ñšc_¹8ý>=õ|úýùüÔiæé×7××?\ÞœŽ×çj-ôéãêÍ>¿ÀfT½DbiÝwÛŽÁÕÕIjï¨6T©£¡ZQí¤Nd™È2‘eËúHÔIJ>Pu#–õq©‰e}˜FjbY¥‘Y ²d)ÈR‘¥"KE–†, Y²4d9å@–Y:²tdéÈ2e Ë@–,Y&²LbYŸ˜‘šXÖçe nIJ>-#5±¬ÏÊ@݉e}RFjd)ÈReívÛ5Ã=Ɉ¶ÆéæqÚívg¾7P·í)ù´µ[m“y1P?=õÕ@ýôÔÓ~)ë¯o?ýxÿðø´­ÊúL ÝwfÕ–Œù›Üù.ÎÇîL?›ÔYŒëÎq{ÓÏ(––'ÊçÊåAòš~F¹²©®;“©®;“©®;“©®;ƒ\˜ª0UaªÊT•©*SU¦jLÕ˜ª1ÕÁTSLÕ™ª3UgªÎTƒ©S ¦šL5™j"ÕuÇb’#ÕuÇb’#ÕuÇb’#ÕuÇbw¤ºîXLr¦*LU˜jmØb#S‡!_ kuž'¬#ï XugX;¶[¶äóÎó—Ûamn‡µùbX[ÿù/_ kóÃÚyªdO÷âÛ~çc7Çù{ì3m{ßývž6QåÆò@ù|C¹²ÜI^{ \XŽTk’7¤Z{ ©Ö(GªµGÉ…© S¦*LU™ª2UeªÆT©SLu0ÕÁTSu¦êLÕ™j0Õ`ªÁT“©&SM¦šHµö@9R­=HÞjí€r¤Z{ ©Ö(gªÂT…©Ö(øËЉ××Qð— Óíøör\K b»G@[ÖAp[úÕ›ÿ{Úïzýõ7ïîï/^¤©–ù[ËðØy¹/Go›§¶ÌQðb;‡]þ‘4[X.,,O”Îrcy ¼n‚Gre9S ¦L5˜j0ÕdªÉT©Ö¶–(Gªµ­%ÉR­m-QŽTk[K’w¤ZÛZ¢œ© S¦*LU™ª2UeªÊT©S­))ͧÏbÿv^Sï$W–;ÊkêäÂòÁòDyM½“ÜXÎT“©&SM¤ZSV(Gª5e…r¤ZSV(Gª5eEòŽTkÊ åLU˜ª0UaªÂT•©*SU¦jLÕ˜ª1ÕÁTSLu0UgªÎT©S ¦L5™j2Õdª‰TkÊ åHµ¦¬HÞjMY¡©Ö”Ê‘jMY¡œ© S¦:xÖ4P]¾øêY ÚÕòË :væ¢öf¬r»iG{Z6¤u3Û?Ü=ësÛÛû»ó“¾}üp~tüËLžnØvzæúÇ?Þ¾½®ƒ6‹‡æ©É<{úLzóÕϯ±sŽ2ßÂ2k^lsØÞ) © ÕAêy~BjEµ“zžœZP=P,Y² d™È2‘eË:%!5±¬RË:!5±¬“PwbY§"¤F–‚,Y ²d©ÈR‘¥"KC–†, Yd9å@–Y:²tdéÈ2e Ë@–‰,Y&²LbY'¤&–uºêF,ëdƒÔIJN5HM,ëDƒÔÈR¥ ËuÑÓò´þëGâ뢧1ž®Ýž?ØEŸãÊ–íîóïF{úd|ôêÍïnnï.Žms¿Œù÷ßdïU^¾9УÇ2óØ9ðòÏ¢Í1=Éç åÊrGù×£\X>Xž(Ÿc{”3Õ`ªÉT“©&Rÿ0YŽTëÎ(Gªuç”#ÕºsÉ;R­;G œ© S¦*LU˜ª2UeªÊT©SµRõÌÅûkò±°\X>Xž(÷Îrcy <Ë•åL5™j2Õdª‰Tk›”#ÕÚè†ä ©ÖV7(GªµÙ Ê‘jmwƒr¦*LU˜ª0UeªÊT•©S5¦jLÕ˜ê`ªƒ©¦êLÕ™ª3Õ`ªÁTƒ©SM¦šL5‘j탃r¤Z;á¼!ÕÚ åHµvÃ!yGªµÊ™ª0Uaªu_¹ùV–aЦ^ÖO¡sþäÞÄÏÞôPÛî‰3Ç ýizh„ú·Ç?·ÓCópŸÃú×xqðf‚e9,]—¥/±sàv>FX>Xž(Ÿãu”Ëås¼Žre¹£<™j2Õdª‰TëÖ#(Gªuë’7¤Z·A9R­[ ©Ö­GPÎT…© S¦ªLU™ª2UcªÆT­TçiDUž(åÆò@¹7–+Ëå±°\XÎTƒ©&SM¦šHµö~C9R­½ßHÞjíý†r¤Z{¿‘¼#ÕÚû åLU˜ª0UaªÊT•©*SU¦jLÕ˜ª1ÕÁTSLÕ™ª3UgªÎTƒ©S ¦šL5™j"ÕÚû åHµö~C9R­½ßPŽTkï7’w¤Z{¿¡œ© S¦*Lµf{æôb+šKYg{Æl]ÚÞDÎåtÎ|¿ÜKãt›ÐºÏÕ›ÿuÿxü|~øéúîúýñÓñn³SÆü FÝ…D­í¼äù.›?ø¾l²=ns"¿þþ@>Xž(¯e $7–ÊkeÉ•åŽrgªÎT©:S ¦L5˜j2Õdª‰Të"(”#Õº åHµ.‚B9R­‹ HÞ‘j]…r¦*LU˜ª0UaªÊT•©*S5¦jLÕ˜ê`ªƒ©¦:˜ª3UgªÎTƒ©S ¦šL5™j2ÕDªë½¾HŽT×»}¼!Õõ~_$Gªë¿HŽT×{~‘œ© S¦*LU™ª2UeªÆT©S5¦:˜ê`ªƒ©:Su¦êL5˜j0Õ`ªÁT“©&SM¤ºÞ ŒäHu½ÈR]oFr¤ºÞ ä©®7#9S¦*Lµ6â02½Tóa}?#w‹qÑ×µXz¹SÇó{ç¹x\½ù§››óƒÚlãîæøâ™»š0ÛÌ@´ÃˆxZ7·yýóÁ›ãìЖ§;FlÛNtÊçÈåÊrGùÙ¢\X>Xž$¯Ë…PŽTër!’7¤Z— ¡©ÖåB(Gªu¹Ê™ª0UaªÂT•©*SU¦jLÕ˜ª1Ucªƒ©¦:˜ª3UgªÎTƒ©S ¦L5™j2ÕDªu¹Ê‘j].Dò†Tër!”#Õº\ˆä©ÖåB(gªÂT…© SU¦ªLU™ª2UcªÆT©¦:˜ê`ªÎT©:Su¦L5˜j0ÕdªÉT©ÖåB(Gªu¹Ê‘j].„r¤Z— ‘¼#Õº\åLU˜ª0UaªµuD¶eIÛ›¿øæü‚®?rYÂsç¸ÝÙ»Üaèùvéóí%¯Þüþöîæüèú僟o>?z9srzfoæ¤>¶wºÏökŸÞ7‹ÖŒKúÎqÛÓÚDy]ÇLrcy ¼®c&¹²ÜQ^×1“\XÎT•©S5¦Z×1k.­uyM^×1“\Yî(¯ë˜I.,,O”×uÌ$7–3ÕdªÉT©Ö®µ(Gªµo-Ê‘jí\‹r¤Z{×’¼#ÕÚ½åLU˜ª0UaªÂT•©*SU¦jLÕ˜ª1ÕÁTSLu0UgªÎT©S ¦L5™j2Õdª‰Tk_[”#ÕÚÙ–ä ©ÖÞ¶(Gªµ»-Ê‘jío‹r¦*LU˜êz_¥–9Ï·ÈÙ\íqmžßêÐãvÏSÇåV'yõ<µv!½zóÛãÇããñüøåéèé™Ýòc9¨ÏÓîW8»9LaóTALvŽ»ücª{{¢Ë•åŽr_X.,,O”Gg¹±œ©&SM¦šHµ¦$PŽTkJåHµ¦$PŽTkJ‚ä©Ö”Ê™ª0UaªÂT…©*SU¦ªLÕ˜ª1Ucªƒ©¦:˜ê`ªÎT©:S ¦L5˜j2ÕdªÉT©Ö”Ê‘jMI¼!Õš’@9R­) ”#Õš’@9S¦*Lµ>:¯!óü?ä”^×O.ít»žíq»S~¹Gô´° Ÿn¸óüë¯Vôo¯)hóX´ûÎK?º9Jó»­}Etç¨ÍÙü,H Ë…åƒå‰òì,7–ÉkZåHµ¦EHÞjM‹ ©Ö´É;R­i”3UaªÂT…©*SU¦ªLU™ª1UcªÆTSLu0UgªÎT©:S ¦L5˜j2Õdª‰TkZåHµ¦EPŽTkZåHµ¦EHÞ‘jM‹ œ© S¦*LU˜ª2UeªÊT©S5¦:˜ê`ªƒ©¦êLÕ™ª3Õ`ªÁTƒ©&SM¦šL5‘jM‹ ©Ö´ÉR­i”#ÕšA9R­i”3UaªÂT×}m¼~va]OÐæheXî¾3)ÛÝGmÑõn6ÿóöî?ÏŽ¹ýüx{÷þüÌÝóþ¤§‡÷ç_ß?~8>¼xøÃÿ?¾}|ÑÞÞ½8îÃñüàæúñú‡ëÏÇÍ mþWǫ̃Ül¾ïóñ›ãò0ÿÚg¸ì¶^uTªƒÔóŸ*©ÕNêùï”Ô‚êjd)ÈR¥ KE–Š,Y²4diÈÒå@–YdéÈÒ‘¥#Ë@–,Y²Ld™È2‰eí‚EjbY{`ºËÚ‹ÔIJö¿u'–µû©‘¥ KA–s<Öëö]÷òoŽ=êÊÙ¾,Kë½í·7"Ëvÿ«±ŽÈæ;`\½ùþþüëÏ®Žç‡÷ç_ÏÙùÁã·yùY×—#·ë@ç)þü½œÆ£Ûïð|ðæ¸yþàKf6Û9n;õ;ϼ-m’_Qש>¨ÕÕIê:͵¡:H]çø VT#ËD–‰,Y&±¬ÓRË:]u#–uº@jbY§ ¤&–uº@jd)ÈR¥ KE–Š,Y²4diÈÒå@–YdéÈÒ‘¥#Ë@–,Y²Ld™È2‰e.šXÖ騱¬ÓRË:]u'–uº@jd)ÈRå<]˜WæÀ?ƒ —ëtÁzÌѲï¶9[È9oÛý`ÆÓ~¹õ‰û<_øpùëÇLJÛ~z|ñÝ¿;ÿúñå·úòÁÓ3»Ö]tþ‰IþÕ¯¼9,Íž'F6Çí}º‚rcy ¼îìBre¹£¼îìBraù`9S¦*LU˜ª2UeªÊT©S5¦jLu0ÕÁTSu¦êLÕ™j0Õ`ªÁTƒ©&SM¦šHµ>~A9R­`HÞj}ƒr¤Z¼#ÕúåLU˜ª0ÕºrËç_´ŒTÖ+·\¿1À‰ØÊvñ´éáéæˆ¿½~¼>?úñáöçë·¿\¼Pí0ü>}ö²yÉoÞi±¶ ˆåy,¸9îò¥¶ @¹°|°GعìM¡|s²c½ƒ‹k†ï~™Ý ¿Ü¯ ë¯wÎý—ë»ë÷ÇóãÎ×jýr~öóã/·«üçÐ&G_{_è|ôÞ)¯Æ²´¶sØî/¨Ôu¾ jAõ@u’ºÎuAm¨R+²Td©ÈÒ¥!Ë:ÇUϰÐWå‰ò:Ç%¹±> endobj 1127 0 obj 15334 endobj 1129 0 obj << /Length 1130 0 R /Filter /FlateDecode >> stream xœÍZY“·~ß_r¥¼Rw4÷áJReEZ[.ËZ[Lœ”åp$ ÔK1ùíi f8\çQR©ˆ¯Gw£/útþÞÉŸ<¼!OÖ[«â8ñ²4-Š<,HîEa!ÿ„d} ¿={É75»–÷œuÏ'ën^¯'âF¾ïå_š´?OXkɲÌóçV¤¦‰œQ~š02‡¸Ê„‚àïU–ý Ž}—áKúb˜»n;ô ‚¢ÈŠ>yùÄxŠè)ƒùb¤»´•Pò%GÅ@jµìÊÀâ‰ôÐ?ô¢ ð}?ŒQfPBäð¬[Út[Ñx³#g1´¤åp`MZ‘J]òÆœD‘—)E&zÒõž‘·ô#Ûòšu¤líYE6gÒ²mµi*"¶[Ö’ºmE]‹“\²§íŽõÝ7z5/U+€4îRIäå1¬”Ç.u¬¶–½±gš’4™õ\ïyGž“0‚™Ÿáb#ܱ†µÀ¤í@ÇÖëû±-² ‡(…Ð(mG£GoqN¾´è‰W¬>ÛeÉŽR‡ó)QvWnˆS¹å–R)ê]œz™œºß[´m³è‘³k;ç³h-`]KrZ+Î4åжÐÅÄQêUnïHêÎ]Ïg)/艶ì÷.ëè¯,|ÿîRy1·•V” ƒ?<:P'oHïšý?ßþ8Z}÷á¹¶S¹[bèCï=iœ_xE΄:¢ìûC½lžAÌújû¼ 2˜…ª !))!а²ç0\l‰’LÅž?د$–9¶(ÒH®¶¿M‚4u· 6=sŠ!¸!ÅШÓþ…—{®Ùgwôýè´šðáÙ/ë{°HK‘zî S†Ž5ëvœ.°/0 >â~. qmµ°ÁY>SÖèy8V…½¦gm¹§ÍŽY¢Ë•ÄCSA8ê…¨,ms¶íƒèœÞNôA‚dÏ"ëþ+—²* ôö½mÿ 3¬$,ü™„²ãk·`…+~HÞI¿ÛnyÉ^¼ãÀ¦G~‚&}ùþqÂÆØacçý^ »ýÓæ²˜?J³@«¹[¶Þ0 g=µ±D±ŠÆv:_D£B=úHy­R0;`ûýw*œ c¨7’ÞØ”0Æ%½ÈØz€½íÊ–û‹i-˜‚ÈÀq¹U!|œÊŽÙ]'õ‚ÙJš¦ÝAµeüÁÐðG°IZ[’Ö¦8v¬°hlûï ÿl‘Ά– mg%un.Ž­ô§gé ìëó‚ CNÜ8"ãT-lÕ?tö—Øn¶Üdi±Æ»lJ7™|¶¦4M—ò`–§IfKB`6 •‡éÚÐRhÝ ‹”;tÎWÛܲ“Ñ:sèÒ³”{ 8Å€k–pº¼Ñx¼œtÒÙ]”/³Y PVw*«-è'Ëgú¹ý3®ô׊wý­œ(„4¹‰EN{94Fê uÚ&‚ÄêБÊò⾘ñ¡Ue99(’æ<`ÂÛýçÉs@Çò'¦pÙƒ°ÏQÇš‚›aÞO>a<´ãl+wÆZ`7*ÒeІ¼ï¶Bø”E ±¸äÝ*€ìö·÷ïu«ëÏPMì™ÚIà[Ý ÇcÍKé(ž¦ ¥nM Á-øÐíJ³‡I¼j*ô5rœ£b[:ÔËB¬3Dsk>wGVòíÙÌw)tä‡3¡ó‚“©±ã_Ügó½Î¡nJåVCö»œòÞm†^˜Iàg^$«¿X¼»²«o^c9‹XWÀ8¹H“KQc0†¤|[‚[J‡¬ÏÎ:ÆÞÌÔqkÝQa×Ù¸BË^Šˆ‘¼>˜ˆú-ú\j¹FžªV#A3…í‘'oËšÑævÄ-;@ÄêF¬9RmÙ¬âºô׋Õnw‡êí¶±ßô¡fÑž-cb‘_Ñò”gA á<-t=p¶¤.HZq¢ŽÁ$D‘dSÝ"Ü™»2ìƒ&tPFÕãçÍ8C7ÈrŒëœ-)ú Ù$›R=ÝÐ=È+Â÷âÄ Ëjœ…±zlÃÉzA°$Ÿ ¦´F2›Uè¼!2qÐMUÆË/kÍw3ŠVôØ_¿cLॆ cUçi€ùQ¶Øgz8ê» ]d ;aê_àR5êQõ’rAêÌŸIg“,SU¦–KC4+lwÊ1Û!6©Ž.9’ڦˤ&• ‡ í6öùì0#…ó,¾£Ô÷òä-²lAö'd”Ëz5Æ£ÅåX‡a]2TÃy{¢¨…mÈÃ%㻃ã<å%·¼b–òH[>YE¹,ý:gTcÛ&”* /$,¡æ jákoç ¾µm4? N÷M¯àòk¾ÖZäåH:}ÌC¸”‹x¦k:“P–@d™LØO93ïÕM”Ç ·¢s÷ŠðæQ|Õ\µ—$ñbs#rÉÄÓö¥V&o¹²¬XKj+÷pÜûÆLqQýä1DæÔ—‡3ŽË£ÄE¯ÿþiÞKÎåWæzqóÅå´óR`¢Òùúk¢Ð±Ú¢Öz`ùêõÐz?x{ º.Eí}õ¤p‰?cÈôV¯6sn2ÈÔàx~’êë)8³³«{'GPúú°I”8À¹4U5ƒäzA@éò"X˜iœÅ¦yijԎD“ü)gÁfçûÔ<š7sƒPâ—½fá‰ècwWb¶•÷ æöB¾jø!Þ_(•g^˜KcŸ½M$à—Ayä¾M„™>êá} ì|ENôüGoI{IžH•êYß`¤ñ£†lw\'@„P×·BŸ]°Êö0E…*¡«B ô=5Î;p Æå›T¼r¿m}îG&¡$³@,2±ÿ®†Jd¡æJ’t¦€yr Ì¢î,é!T–²q:ÿ¶¯^zÿ¢€åuît¶ÝQ¬li9˜ Žsl¨3‡ú2™\>'c~Ǧ©õCÓ‚Ò|¦ïß`¢jŽ(Vµ»¾wA4tÌAæѨl·Ç¨=ħ=Ô¦XÕh’‘Q;4Rר./gw=~ÐÕ f4Ù­=G>¹ËD‡Wâ úÈý™>*&oƒ6`ÃRVÈ_­ñáNIR7ã; 5×ìã%Q×prà®ôŽŽïÇŽç_>H¦~쥤¬, '^xä¡eGy%gþß"SHQŸúAîë#†²Õ[su< fŠ8Ö¹íNÇÖÕkyQZÀ™6ZXß]ïj“ð‰)FXÍÌýgŽ—QÔ‚R4=åÃ:^³ª¶óbdª°)ÞÑ*Ú¿–ŠÆ¾MÙÑN[8 -Åœ‹‰b56–ŽˆÚ¦¹Ôô©´°wôÌ]í|qä5Nº£p>Ì5Âñ¤[,˜ˆ™@&åÅTA<m=²R7U˜|Ú"2ê“þ$ˆ:îñ[¾DNÞÜ¿YXGþç…Ö‰‚\»ÊÅëš¿ÐëWˆE**¤Œ–c¬ñ«õ«» íÌer0¹¿whžqÏÜšã@Q¾â£C‰½ÏÒ¯=Ö¯ß8è!þð|å`ö¹gËÀxå>aÇíp>ÎÏ™Rx8àL…¯XYÓv<ëéG†Þ¶Íi_ Ûñ¦ÑúÑO [Û6VrñaæÎWµ0»²¸mðASšž÷gÏÖnÿ-o»ÞnŽëwæÍfAp˜*CÅiJÌÆ©'›™Á©ÿûòóÍÿãœtv endstream endobj 1128 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 1129 0 R >> endobj 1130 0 obj 2996 endobj 1132 0 obj << /Length 1133 0 R /Filter /FlateDecode >> stream xœÍ]sÛ6ò]¿õL¯ÎŒ ‘àw.I§ŽŽ{ùpjõêL’Š‚,Œ)B!©Èþ÷· ¤ ]#?xwµ»Üï]êÛÄGü‹ièã4ÍP±ž|St%±"EIäyòCL"´FCR„J!cDCðoÀ ø ý=©&ú}òù+ð,r»‰w@y§êvòѲM1ü#Ùç¡ûÉÅl2}!ßC³¥ qá$޳,%Jq@2ñ!h¶FŸO/ؼdü¾Î7+F›g_ÑìÉÕlànày8ýѼý80ª%I쫨SHP¤FñÕÀ1*Ÿ2 Häÿƒ&{{{¶ÁûôÃw¸vàòý,K² ¾Âé x²ðXÁü0Þí× võNgc§cOôI$üÝüuñöú5:9ŸN?üv{};^Î.Ñ%/.8@ÿ °?^½?AŸe€lÍÄÃAìÁ'ö¥j$>/~ºz?»ž}BsÓOèdÉ9 nî×åÉ«}eq)ûêà C'ÆxŸ5Š]¬’ÏQ" ‘Ä8s%Õáš­(jhÁ«¢ùzSºâ»åhvuîÞ½E ^l×´jŸkÅ®4d Žb°Å‡Î–yøõq]¢ï´n¯^žøØ;ùõÚ÷Á÷²‘¤ ³N#˜‰Ga×M(ù.g•Èfg š=m¨Lçɪm7ϧÓÝn‡[ÊÎ ÌëûéMx'¤¦@!xÑ.œi÷‰ï6Håýç΢{ZÑ:/Ñ/×ï_¿ýëòêG&ý MP!‰kªò5mð"ois\l‡ÿ¯­dÕ«îkŠ’ I¤þ¨–8;ªeзŸngWïÐIM—‹9xÚvÍòèî?õ]š]ÍâgÎ;»…xÎkBbì™ç%Qbúå:¡Ð©HÁøÒÀ­Í¥ÉÚ'ƒ³Æ-TðmÝXrO·tr‹uÅyCÏ a¾m ²mD ôè(ÌûLx‡‡_ ìÜŽ5$ !‚HqäÐ`žœ[æC£Zá±c #cA:R b›š¶ÍmŠšmZöºr¥8 ‰ç…jâ¿WT@2œ˜I¬)VtŸÏó†.z¢žzMOùrÊ0Å=ªwˆÆ#üØÃ¼îA1­4|}yvÖcP#5í1fTqRˤÖд(sKt9‚7Á0ƒžÌ[$ÊtNïYU‰x@- ‚ö|Ö0…‡ù8amûD]Äü=®ëª(· *Ÿç°’Éjð´ÙðAÑäl£–ÖLXÕ=Kˆ)Ìn•¥>;G—Ràû8Kà"ŠÓ@â  FlÝ`ø—mé¿bAäs?"L\¼ÇfO§8Š<W©*þßÊ.$¢ä˧3´…YñÈtd9b‡‚ 7(ñ¼4Ã~d™‰?¼ÐóGlr <²çÚ Lý—ŽÑïPæ.eÀ\5ÏÙK{­ï‚n§CyûÓ;U`®mgæ!—yYÎóâáÕžm(ßlhÓâ:§hÍ11^Lm!Ç£‚Äù¨© †óàzPÝû×àÒOQ˜8ô@ÄW¥ñž·ô`1 ‚ NÅ@~·\î.".óÓ»Û·3ƒmj^ЦárûHZM¿mYm‰ä,øzW‹s8>,†fÇÚbeðn(jáÅ‚µpB÷´’Í뼆—[C’+O©Ûn6¼nGñß"/ù¦»¢Ó:ðÐéõRb¥*°­óª©²î&¬ è¾P(ÜÁÛRWBƵ`·Ûdu+4#kZ(•3…ÂeÝlËÖˆ:ì÷!ÿ°L“@$Zد ÉEˆÄXîÌîrÔ§Æõ:À.ˆá¥Î Õ¼ÿÄ·"€YÖo’–aÐ: n¶u·«¼5pOVqí«mõ yÊt0¼{‘FCßó’õ’NõΪž¾Së±CžŒ#»Üð´Ü…ÈEAÏ!X–)NÁ¤÷°µÅ;üöw8{55ÝÃw}>ø-Æ°×æòý ¥FAnŽÝ2èù¡> endobj 1133 0 obj 2066 endobj 1135 0 obj << /Type /Action /S /GoTo /D [1134 0 R /XYZ 72.0 546.987 null] >> endobj 1136 0 obj << /Type /Annot /Subtype /Link /Rect [ 489.66 548.487 509.1 557.487 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1135 0 R /H /I >> endobj 1138 0 obj << /Length 1139 0 R /Filter /FlateDecode >> stream xœå]“Û6î}'/·™Ù¨õAëÞ’Kr“›k{iwæÒéö¶éµ&²äJr6þ÷¤H‰’×I“‰oÒtfˆ’þó*"!ü{&ÿ,’(X,r²Ú]ý©éa”Ä™&¥aÐ4 c%MÉŽ I))e ‚?ƒ¶€oɯª«üóê÷? Íš„Ðïá*œa®XýzõÖ‘M7ø’ä ÉýÕ‹Û«^§$ ÉíÆš8I–ey¾ 9Y1Íå”ÜîÈï×/ŠeYÔ÷ ßo Ñ>ýƒÜþëêÕí@Ý8 ƒÅ¥iûv "x c,Ç^¤ØÄH r”Ÿ‚ŒQe@A ðï¬È¡'qè ì;ÐÅ7ï; ZEQž³<‡OÁbà<9;å0£ï+TÊÕ+{ f!×I*5Í2T•‚ºþðüÖoƒÊÊ8‰¶ÍÍ2Ócª„æA¥Â$Ç·[AžÂÇ4 r}/*ÑðòÙþÐìëÖýb˜zRGé"Ó< S–øì[q?+NIJ=±E)v¢êÊCÑm´Ûž%*Mã`‘3˜§ˆùvǽ˜••Â:Ÿïê λ®)–‡Î¨®ì]}ެq’4OÃ(NbÀ_^½~ùâonŸß¾ùù§Y¡šœàáHQ´Cc"G×o Y{¯ŠŽwE]‘â{ÑMݺþìêF¥âW¤шj%Úà¤CƒžC³S S:ì_I×È`eë¡†Ú ÓS”l÷bUl ±¶LŽ=È{è„“…Až.ä"Ž}éö]3ïcÙzæa”@Bñzö#ÛÕ€øÃWê#rÅ1ìwš/X˜ùÜ;ÞÜ‹nV´8c':[ó8ί…­VõZXëN:W–ŽާíY®Â@Õ5Çë¶¼ët`ö“»zÚsûY|Ü—¼¨Ôô꾕ÃSôðËzõ¢®ß;ùn_Ч±3ªºLÚBöñ5†h2ÔVÏŽ(•Ö5˜«ª;‚Žx$’ßšw|É[qzñä2טÆfñ°ðÔâYøÙÿ嘫ºiD»¯«uQÝÏ-g¢"±+"éP/¬Út¹CCz‹"ØF°ÒY’àØ?ÕÝ|ü•=bH4°4`‰0ìñ[}Pq‹¹^×Õß:‹nùa1süz-Ê—õÁégR ~3þÜZºËDcí Î@`©­Ã¬q¾É !”¢ONŽ2ò i 3Ck(Ï®TPn¥ëcgÈï*:¸2è/¯ÞôðZlø¡ìl;Wñ¡6ÆÚ=ˆª ¬®™TGX#à;†ÐÕSýu.Gä±yùbBÛŒŽ´½»>Ö‡†¼ûñßD¬‹²ÎCQ–zÚŽ”Å{QɪB˜oGø¡«w`›/á‹ÌUÐýîi0 Q´ˆÃÞ3Éâ~‹„S—¦AÞÏ#"­ø 7L–ðÀ­ÅÐï†õ²†<Ùã&ƒ:Íyµ¶ˆ “I- ½E¹uÄëÄÇ.°¨^0FôR¬:Grˆ>æÈÓ‘9ŽŠ ¥0óB¹¬UŽ”×»†%N¾DW|ê–+E×)S¨ £ðêà ¢o^jàÎióäÝ ) Àºþ``½4[˜pMQ~¦aé8¾â4d#ŵ?ÁÀE’ÁÜ#asq.eÝ –RußZÎÂz¶qfüh©›¢tÚôAÑw˜-v`û÷®艺ÝÑUBzN”•iÂQ>2Ǿ©å¾ê„nS| Fš Œê*,séÚ¢½!¼%í¶~¨XDbS—eý dÁ!Ë OÅ |IÀS¼$›ÄO G˜E=þn #§QšÄAž@é¹Sä²òb&ÊòÁždØÂ/U%!MåVœbaúŒJ’.I± Íó ^dy{¨®OÅš" ÏèéYëÕc§O—FôAË( Øhd MÊ2#ÂYì=Iðƒ²<¯ÐÍ@]tM™·@ÏàÄÐÃfÊlvP==Τ9–·2” ô”‘«c6Þê„êÄ#M ‚HõÖè?¸Æ&=h*Ï1Ùi£ÖŲø »ø˜aÿ¸ÉbÏ徊þ¿¸à_p6wÚ?Ïß0DOú›Žg, ؤ·} §úäÀÅ|—a_0p±9¯aƒùcÖküÑÙ3É|¯a^ÃÜÀÅËxÐŒ;#ÄÀØØ¼J-ôlß\êJÃHæP˜¢¾[û–n¥®Ó8 2(¢eågÑU½ÛÕ•KÇ'~«o4:@ºçMÑ´ãÊ(„Êa$N½Zs¬˜D#×õ¦y¹§H1{zÄ”$ªM;‚KÛ|]´PéÅÚ“)NyþB «e:tm±Æs9'ý‰…B6°Û¶˜vªY_D"ú¦²pu؉FÕ–dÊZO¸$ ×® 2Ç2–²O: U½E±¼ÑH[ï„9]04Y÷;è“»kz÷ôÉC*|±ÒÅH,~è¶uóì(¸¬J³4ˆ­R=ÁÊŽ¸–‘?ö°A<˜˜6€#ZÂÿêC%:ÂËàF.J©Np"+Ç ›Ù^DV^,¼( ¤/% {Oü`biúú£kÊIv³C›©Dl=#+Ÿ#Ä |ºÃŸ>=™•/Õ•f³²ë\ß»¿}K·2y•.œ‹è´¢±–ï\”»-ßÝ8Èè5&o^.ÃòDõÉÙšš\Ý!JH (Á>iš Õ” ä㮨V“IÏËÈh,”¯®‹Ý¾n:ŽWÛš¦ÕÓ˜Ls:ÌM†úY)7¥¡½DSȾ)ªÎù$zxsÀD¬»k”P!N÷RðÖbüñD[ÖÕ½h“Ç\Ý*õ,^ÈQu`snªµA³è`jM_nª«ò¨)öõáãuð¬UJ¬åÇ»$„wIHr®]4E`=¾‹6WIQHíõžFíA=µs5ãÌe’F¹Wò[9è®­âoï½#8Üã5$³é a÷¾ ):Å!¢y²‰s@$ºÖBÊœµ¼£8k‘D½Õ3ž8/JÞ–%Ì‘ik|‰žŠ:^Åú¦§pûqâ&Î;ƒ{b*œAy£ü}êIy“ÁBÒ,fç=)Ïh„ñ"¤ã_C%ê· 9¾ET?kÔWŽHÓÅi¢$[§·])7K=ùˆÙâ uç)mw,–Ú‰|hµ·¢Í,×eÃWïE7v©}̆ڷ°ªxRšGÎÖ ëå–¦÷ àU]uM 5«ÃŸšN0ëUÓ(þh ÷,MÖ»:D¸÷¼éŠÕ¡äÎgÇ5'tMò¡®æ”]šHõl·¢ ,ÍlXõÏVø{á b³ÑO§ÍOpDe1| ­üE]'^[?ùÕ¿£Á9Ðí^µê÷!Ó,6EÅÇï—¥ÆY4Ôx]¯2$O¼yÏUh†få=W7Ý %Ëz]H›ª€‡¤îÏFƒ‚á +*õhyÊb¿lz-„°þÉ"»CÙø# ÍÜ<’¿±|•A´t^K+%Þm!«Ž••SýFÍi:öiy¦äZÿ³©ÇùÙài~`(*¿)H?OQ°|Š‚ © ¨î2ïmfl ÀþÙ‡!ôgR S¡!+æžßÀ„7ª¾½úö!¢ endstream endobj 1137 0 obj [ 1136 0 R ] endobj 1134 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1137 0 R /Contents 1138 0 R >> endobj 1139 0 obj 3154 endobj 1141 0 obj << /Length 1142 0 R /Filter /FlateDecode >> stream xœÍËrÜ8îî¯PùäTÙ²Þ­dªÆëx§g“™MÒS›­ÉØÝ´[e=:’Úžþû ¾$QŠsKr0$‚õ×3ßñàÿû“E¾›e¹³­Î¾ ºï¤&‚{nÄž:~ä±S9CR씌Ç ÁŸÁ\À÷ÎÏê3Ïù×ÙŸÁœãßó™7³8_êÓÙC61àI>Ïy8»YŸ]ßÅŽï9ë{mâ(vÓ$Éó,ÈÌ ƒœý œuåüyqSlÊ¢yhÉa_ÐîÕ_Îú׳·ëº¡ç¹Ù¦í‡ˆà-išºÞØ‹ø2!Ò€‚+²¡ cwPPü;+²7‘Ø3ž:Ð#ܼï¤0Ë÷ó<Ísr³óäÙ’Ãü0ÚM}%`r-\˜lrO>5u^Á`º™sQ+Ú[R´mÑ“¾hjƒÔõ§’v¡¥_Ek®ÔïIo ã>nŒ÷´¥õv°ÚsÑïMšº£Ûc_Qî{žï‡¸òoMO%ÃÄôÀd®ƒ¿¥’áE)ê¦DDn>QVP e…˜ˆÐC‹²4q¦šÆÊ¢~4GïÛ¦š¬NÈœÑ §ìÊfÞHÙ‰Ä9EO+Ááh„’í^c1$] ±Š<cǃ†‰± 3”«ñŸë“FhM[Â\C‘ö§m•¹ö ¶*œ#…Á, sƒ—"ƒQçâÐu¯Q´"ÂMmÌÛ6U…÷ML$í5…™!e©‘Š*?ëÞ3yDz/¥¹§ôyMZ¼pAŒUM¸nú©5|/™cG;Ü´‰ç\|¹ îƒ+1´ƒ)=(*ú!Õ0„”âr0¤¨Y¿¬ß¿“ð¡¥­Uüb$4É€£Û´î‹{ôLFÙ5[…uÿåÕ¥$š£EQ?)Z‘“Ó<Ѷ-vÔáfÛÐ=y*šcëìŽ-»íL±\±Ã`Äd¡õ¾¨!öÊÍÝi<óÃÔMR–¸¼÷[¡bnšµ;Ú*L•¸ÙƒQ¶%ÆŽÚ†¹üéRQ@o×Táhƒ¢Þ–Ç^“(hw¬ª“ÂhI™b Þ7†$]Sjäplæ`ÑY¬å#kp™ .E\“§‚Ë„8Qó&…¤V TÌÂXƒÄèžugŒRc°Ú5Ý]‚PuÔ4U‘ÐõÌ7\…¯ñÆ!b€Ý¾y®-¦Hü‘)X” Îm³½išGåSŽHt÷MY6ÏÌéߤ‚P ’]n)ü,„z)$yôµR …S{sþñíÝíÍùOÁòÔõ`M½ YÇyý7ØÄ¡õ®§mõæ|õ~ýËÛ»ÕÇOës‡ ñÖ?‹¿ÿãÝzõ¶\ßAB‹ÉH“;I²¤T®ÆyGcñLI®>Ÿÿä|ûß‚tžm/.]”*›H1ñ,ÅO¿€;aŽR óµ8ì9!º<ÿ\­^¯~ÿÍÖ5ˆcÏÍBÈí©—ë®Á¡oź“ã°‡ßï¬cùæüÄh?l.ì"¿9þóë¥ÖOXvþVë'†t Ý<÷‚p$«]4ÞKõ½} ,±lü­>P Yû{D}·Z¯nþsµº l"[Ž-˾Óñ‹ÖM<ϲî58”m²L'/V’I»q,¬÷÷¢þ$A7p“a%éózÙ„eçȰ„´…¢ ª¥,Ž,[‚µj’x‰Uon<Û‘ ÚGSMí#1\ÃFûÈ<°}„´µiŽÉî,¤N«Í$JF È÷/¼¬Rѽ@pÖ˜yîúðó‚$·¬ÇÂʼ1ƒp‰×Ãì8 Iv¾€ˆz|Cò Ü$ΠôŠ3Ëö/è8Àµ_XÀÕ2ˆŽƒÐFtZ¼7FŒŽƒ`¬5¬;†Ò–†Êt(•(Ö|/ÐeÄæo Š<˜¦eMŒ;óçÌrVÁ?òc ·!À W!‰* jö+ìjðž…D”7¨©âa€¨è\HtcN•U®@Å´í8Hò–S`¿gèl^Ð ?ÑiX®Í‘iC J8M^›ÌÂV= ïñ7 bËÆœÈz U?÷àë,»­ ±YÛ¤%Ö8“caûy¬î’_À*Ÿr—’À?ÔK„;‡jµÀ3/¯=õ±Cè$jàÙ\„H@|hôÄw;ìHsLþ@¬êJËA~.ùüéEë|œð‡9{JùS5T¢‘#/hF/@X6ÃÿX©¬Ô?)L½ vŠÄ] A¢ #¹ Áøò)ævV‘„ñÄ®ñ»¬gÿ Ùf endstream endobj 1140 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 1141 0 R >> endobj 1142 0 obj 2839 endobj 1144 0 obj << /Length 1145 0 R /Filter /FlateDecode >> stream xœÕZ[sݶ~ׯउ=#Q¼_úЙºvgœiS+Ód¢<à8:ˆIâ ¥£—üö.° €CRÊ¥}påñh¿%°Ø]î. >^ÄAÿ®Ô¯*‹Ãªªƒ¦¿øhøqP&AZV…Y’GQÄY˜äAœ³ò Ss<"™)øu6ð!ø÷Åp_^üøŒiƒæ=\DO×¢Þ_|ëéfý)éw¯n.®¿Èƒ8 nöÎÅY–EQ×URU˜&µúI‚›>øñÅ+¶ë¿äx`T¾ü)¸ùúâÍÍ™¹i…Õ§fí·g*B´”eFË(ÒbRä%ªGgŠ,!®rÆA ð÷“*G+#_áu}2Ê=;E–q\×e]ã°: ž8Šž‹˜OƼu°$J/ku½Ê˜J%J®L- ´5P?h­V®‡ýòçå •DaZDðSÄ+a×_ÄñrùrcŠ˜†ÛWmÐ?jBWcÐîòèìˆO}7 Ü2'MÖ*Ìã×£ rȵH½ìØŒ¿90¼ ®’<þâuC d¤G òàÀΛGÇÝ Þ;4{j±Ts CãŒÜ’{Ö¶{òÀƃvpØ0RÑÓ–aU@æ÷ß¼óùb¬qr>Œ„ rSpǤ3E{ I¯°°fÃ'i±ðÉœOŒ1¤Íì#òÀ§®µðŽ[ ãÞji¿²…–ûƒv6Ò ,MZ'}? $,^i椧‘í¯®ï´Ýo¸"«®Àˆ€îI—®¦ôÊH²¡é¦–Z< ikñq‚å22>è¸G.Æ=Ò~Nš9‚7´õV—ŽlkÆXC@,å6Äï¿üæÝ†ÑE´0Úß: 8&ÊDG÷lh/ÜMÞ8(ƒ„Â-La7\|Þ÷dh¥÷˜;óÀ€Yo,óh «±»Ã¸çâŠ@èž|Åè=—Æ–ËÚøpG>pñA©¬©tpK«ø£QÿÛ–©—HºK¦ '&àMëáÓØ±è…Wn¬\ÃN˜@µâ¹A´{C¹j,Íø &٬雓ªÍ¸'è\‡?ËíÀnšòÉý$'qFu®1’¿S›%ðU^|MZ¸°ä?Žt8{f‚.ñÒ é߸íÖIXVªyÞT RÈdL+Ÿo7’2A L­³ AV-9>vT(ÖÜ’¶KCH,eªªñÇ~ÓbëwËyûz¹û(+“j¡œîîTZªèËàV%þ=/ï'è!d³íDbZ3¨ëÒzð@ON¬ŸzǘóËÀŽõltPg©¡ÍVh×ñFÁiMl«Ãwª{w˜à=ÌŠ-5÷LHO‘õ4tðo{8Ol¸)Ïnše¦:Ý­L ¡+;vtô‰”Ýš.wîëRïÀŽ`>Ehû!ËÑÑíËKDZ>Lý[3‚¾z³ë4‡ìøäéO†Ç Ëšíµp.uu R­ãNWT¨öŠ0lèºÙ"à*8Ó.»:µDY§uU'æŽ ;XЪ“œ´ˆè@Ú¤öræËD ŽpbÈ=@6ºéß¿·ÅEhY7ºgÝZw|à–nÙ^·-£å¸i£ÀgQ¼0•ÜÖ‘]‡×6Y5ï{HÏ—[Š&x2[i`;§îÑîì¾=´üW\—ªWw‚ÍM›¢çû#EKÒokõúæõ•ºÚ¨—Yœ. ¼µG¨,<]7oÞÿÌn_ÊÙhOPVàæv`m=Ünܲ¸ Ó*û¿hÜN²U¨WWp–%¿“@žæÃ/vm¼!ݵ<@Ä]Ã6Üî®aÖµkïºU;ýWMÛÚ«A[.Pws¿Ç«ñÿ@Rü!/”Õo]sˆ²¬ˆ¢$®KœüVÒ¤Ö'“A5ÞÃH¼]A8g”Ø 8̼đ’©Äas¢G`®¶¬xâÉóî¶¶–g¤q¯½è­;ï¶<}á¥aRfuÖ¾™_Õs'èV8Ÿe \Q«ùÉ•«<,Ò æõ†Œç;ר~n®[Ük] Ç4aS™pPÀø{¼Ø22Ž‚í¦Ñ`d¾õ0O6ÙIÞÁXܬ‘×Ñ;Òy rO9{I7+ã ›£Ã©½.Òy/]ïötu·ç÷’–á;E3ÌÅ¡"å‘6lÿh±»D±¬ùî§Hc+oWŽL#s/fF üÞa£l–Õ÷¨æéÒÀã‘1Ý8»Lݘ^æaª*EY™JñJœqˆzKøõ%Q›ýnÞT5š{1Dó~­wóc8->¼£°I­l‹ããÑ›ªšB‡>Nlô`Ã… Í:Ϋ3%Áóµø†ªráìèÔ¬jþüVé÷Ž:4ØÑñêU MåQ$ÞÞÚÙè˜ÅùÝo?#ÖB¨±=£âÒäLw”Ü›6º²G)MΉz¦¦‰0ýœvÝÕ†Åu½°XUJŠ™úÈlOe¡å|Át #˜Ž–4m'¿íD…Lãn:à f'K›¬F`^8‚ž éG˸uoÇÈ´Ôü~™´¶¾ˆã…õêŨ>6I›idÐÕœ¸) =d„V,¹}¹‘D´ÃI~M‹Üì˜úè§ö#ÒÊ!ÌÅLƒÅWdš½PÓs±ÓàÖ}cÑ“õ!ØÐÛ+·Ü’æd=+a>¥(ðó$GoÁ“ ;3ÐM2Yºáˆ,_8ByÍââ"Qûì¬"ïó2zòúÏ'áCkö ý‡‚Ê©óÿI£90|O:æ/L('óu–ÏŸ\ìïfÏxǤ¿ä÷«O&Ê-y¹p +tÕÊÃØÝ© šLK¥±ì WZeXuÔì#¯4D…5)(ißÄšs(i ÝŒ–Þ3{=e†š?'0BÜ40ÀÒ½þŠjÄuì¸áØ¢Ï0Ÿî°ÏˆÂZ}kéÅ·DäÍ]’fóŽ›+™ð§êdþ8é}9tlüŠfÀ2çk’m1P(Âþa×™}U¼²«½ž÷þ‡÷7o¾qØU|ÇÃË"¤Ï&/­òµD`^†>> endobj 1145 0 obj 3066 endobj 1147 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 730.013 257.171 739.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 28 0 R /H /I >> endobj 1149 0 obj << /Type /Annot /Subtype /Link /Rect [ 519.93 730.013 524.93 739.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 28 0 R /H /I >> endobj 1150 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 718.013 279.647 727.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 29 0 R /H /I >> endobj 1151 0 obj << /Type /Annot /Subtype /Link /Rect [ 519.779 718.013 524.779 727.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 29 0 R /H /I >> endobj 1152 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 706.013 283.873 715.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 246 0 R /H /I >> endobj 1153 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.717 706.013 524.717 715.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 246 0 R /H /I >> endobj 1155 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 694.013 224.242 703.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1154 0 R /H /I >> endobj 1156 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.121 694.013 525.121 703.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1154 0 R /H /I >> endobj 1157 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 682.013 354.63 691.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 982 0 R /H /I >> endobj 1158 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.234 682.013 524.234 691.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 982 0 R /H /I >> endobj 1160 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 670.013 359.892 679.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1159 0 R /H /I >> endobj 1161 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.165 670.013 524.165 679.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1159 0 R /H /I >> endobj 1162 0 obj << /Length 1163 0 R /Filter /FlateDecode >> stream xœÍÜMoÛÆ‡ñ½>—é"êÌœy;ÛÞ›\´è&7.Š¢ CfbáÚR*))úí;c:¡-ÊÀyvI¦&ÿ!‡úÑÊœ!í?W~píïëþ¥F¿®U‡ÍýêÏÇv?”0H~lJnCrN×! ÷Ãó¦4Üõ>O6Â×­öåY¶½¾þ·Ú­ÜðŸÕï´ÌÍàZ¿¿Vî…?ìêýêÝ“±=Úö÷4¾§#çÖõûà»çÀ¥”µ;‡ØLm­eÚcÿ§g99åYËtÓׇì#v—ßѯæßÍàÜðqõÓÕêÇ·mLn¸ú0GåºNÑ«j íŸÖ5hÿ†«ûá÷W_¶Ûí W¿¬Þ\]ºd¾›ó[^-¡ëÛi·k«¬CuÎùggk?‡òxÖÓIÿº=ž†ý‡áíöãçÃxœÎÿÂ;×úJY—ÛNCúúµ_? ¯kXëðê¿ã‡ÿ4¿<ÝÆñõi;æ¶ëÃæv{7§v¨éHßöïkZûâKí4Gšw±èÖD—ùõyL½-m±b‰çl1±Å²-¦¦˜¶X²ÅL !˜B0)„`S›‚ØĦ 6…hSˆ6…hSH6…dSH6…lSÈ6…lSÈ6…bS(6…bS¨6…jS¨6µ)¨MAm jRgRgRgRoRoRoR`R`R`R`S›‚ØĦm Ѧm ɦl ɦl Ù¦m Ù¦Pl ŦPl Õ¦Pm Õ¦Pm jSP›‚š¢3)DgRˆÎ¤½I!z“Bô&…V‡™bÁ¤Ðª$[̦ 6±)ˆM!ÚÚÇ`vÞyñj²+¥Ø>µW~!_èÏÓuˆº(÷ÂC¹×æAò¤Ü›^nn¯×›ÓTíMMãn³¿Ùî>Î-ÇÏŸ>í§EÉRÖ9–Väú²<êÜ{Qt´ª¼²¢Ë^Ë EH8“°‚p»˜A8‘pávyƒp$á‘F"‰`$‚‰&"˜ˆ`&‚™f"Xˆ`!‚…"X‰`%‚•*T"¨@ðamÓ‚†8 (Š‚í¿T@P”@… "(D0ÁH#LD0ÁD3ÌD0ÁL ,D°ÁJ+¬DP‰ A%‚ £‚ÑÁè€`ô@0z =ŒÆc‚1A!‚B…öu¹ÐN/T/Öo½ -¥åRÕw¡m3Þ³ÌãíÇöIžÖ£/÷»yûzÞ<ž®w7×wûÝ8·ýµ?ü¿µŸ¶ûÝ¢¶k×fiS$ï—‡Ÿw°è•ÖNS†e·eýXIºÍ9H:¢t!é6í iAéŒÒJÒmêAÒÈ2"Ë„,²LÈ2#ËŒ,3²ÌȲ Ë‚, ²¬È²"ËŠ,Y*²Td©Ä²ßÿ#ibÙï‚´'–ýÞ IË~§¤‰e¿oHÒÈR¥ KA–YFd‘eB– Y&d™eF–YfdYeA–YVdY‘eE–Y*²Td©Ä²ßæ$ibÙoz‚´'–ý(IË~C¤±ì·GIY ²dÙæöQ£jòÒ/–`±Mò‹/λ´ìå벸,²(.§›í;&>).§—Sq9m_Ï›»ñÔkɳ½ûÔFƒsí\–Ç™{/º¥uνª–²ìvþ>ùTIº½'$Qºtq(-(QZIº”F–Y*²Td©Ä²?ïLÒIJ?ýLÒIJ? MÒIJ¯î€t –}u‡¤‘¥ KA–‚,YFd‘eD– Y&d™ºeÒš¼7¤³CiAéŒÒJÒ% tBéJÒÕ£tDid©ÈR‘¥"K%–}u‡¤‰e_ÝiO,ûêI˾ºCÒIJ¯î4²d)ÈReD–YFd™eB– Y&d™‘eF–YdYeA–YVdY‘eE–Š,Y*±ì«;$M,ûêH{bÙWwHšXöÕIJ¯î4²d)ȲÏí5«:½0ë}qi$FYûà aÙËëru§•ßg!÷øì@›ÒûáÕûÍíx}Únæ¦Ãøé0ÇÝô\Àܾÿ0o_Ï›Ó1|«ç?7íÛLkU­Ñ/Çñ¯Ÿ¯Þ¼¿úí×7_û/~î:ôÇö_ì?`¼ïÛh“ËvI«*b½ð.œÿI·v=y§¢,»-g°•¤ûzHG”. Ý}%iAéŒÒJÒ}½¤‰e¤±ìÀ’4²d)ÈR¥ ˈ,#²ŒÈ2!Ë„,²ÌÈ2#ËŒ,3²,Ȳ Ë‚,+²¬È²"KE–Š,Y*±ìÇ’4±ìÇ‚´'–ýY’&–ýY’&–ý!Y’F–‚,Y¶OûB›Á–&Xýþdè\-ºì¦n9…ÕÅ/ßqw(ûªF›Âžþ¾·ãx:ÎÛÝ—ýÝ—ñæi˼ýé°ßŒÇããOhNmßntN/oö›Ï}Zy¼°hYÕ÷ߣ¤Ë¡Íý/¬^ÖV^ûP–½.-^‚p&aµ‡ûÊ%'® ÜE¶‡# @°/Y‚0ì –ö°A!‚B#ŒD0ÁDLD0ÁL3ÌD°ÁB ¬D°ÁJ+T"¨DP`_˜a Ø—%íaû¢$Á¾$i Ø$A˜J\_UÛLÌ<ú¯àð9µ WºÐÍ;™ò¿øñÝê¬c) endstream endobj 1148 0 obj [ 1147 0 R 1149 0 R 1150 0 R 1151 0 R 1152 0 R 1153 0 R 1155 0 R 1156 0 R 1157 0 R 1158 0 R 1160 0 R 1161 0 R ] endobj 1146 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1148 0 R /Contents 1162 0 R >> endobj 1163 0 obj 2013 endobj 1165 0 obj << /Length 1166 0 R /Filter /FlateDecode >> stream xœÕZYo$·~ׯ —]@ê%Ù÷>ˆb¯ád7öz؀凞ŽÄ¨§{Ôì–VÈñÛS<š¬>f¼@^66`ñ«&‹UźÈñã#þ½ÒŠ„EEQ’íáâÑÑÉ9‰3GJi”ð”Ò˜°$â)9))%µ^ƒ|ÁŸÉ\À÷äç‹æ‚’ï.~ý æì…uÏôsÃêÓÅG$››ã¯I>Jî.®o.Þ¼K £äfLœ¤QžeeYð’QÌKý'7òë«k¹©e{×UÇ{)ÔëßÈÍ_.¾½™¨S_›¶'"‚·äyѹ6±¥ÅrÔŸ&‚Ì¡ÝeB±Ø¿'E¦ ‰)xé@_p§}'Ë£œ±²ÌË>EÅÄyMÎyÌW£ÞÒY¸–ëLÄ‹@yiòšðö{uìÚ­PÊcøÖy l…‡»v;DÓGžò}£zQí Z>ˆ¥%e3SØÜ]F yõM»½nÛÇT¡ÞzÒ·¬Õy芔Fs;¶&µcU@ùÔìIر«>f<­2†„$ÅüuþŒ<‚h°x+&`ñÌÎp±NéG±•û‡ì6zÑ_éCsðAŒSL•œÎŧû’aæ£átº+î¶ ›ùÇc-·x»ç{¹½wcdAç]ÑÏ3œ6Q\èHù¡óC{~vŒT/BÌÛ1Þ´°IàÀ38…¢Ú0š-lþ}ƒ6*Ìî—«rÙà°ãã` ¸0¸ËŠ9ây²3¹m'÷fMOFíÓ\ˆFJ'U{O¢S&pk%:ÀˆÖáíXÊ•RÊ2eI ›ÓÂn~{«KÉ??@Ï#:èt˯ˆœóÙ*â–Õ;6Ç·^@¨Vlmq‘ÌŸ+öœæQ\¯8wÓmaQ®û‘ÎĆNÿjyÔú°û¿!8ÿ˜ÏC1e° *3œ)ÅË,bT·?àòKyo9ƒ9%³õqRFeß(WÖ»ÊfEJäú+¥Lci'®„gålWa¸ÎË“p·¤iÀ;š CDÅ%‡£‚oÆJl[Ûì©õàÁxXa&EÊPÜy-§Ž'¶¢sÌf:»Óä::góÁ? }œ9e+ ÍiŽî½r˜,.#žèåñÚr¿©=M2…ãó\ŽSèžS}ï(ÖÔÒÒÙ\Çg×F~ÏkEhÚ^ a«þrM 8ܾ«l8Ú™­~úîÃû7¿|x&»£R—+‡„¥ƒzÃÀU¡'š•¾4ÀMeG6/¤"Û¶ÿ4©SO÷Ñ =¿±è=2Ù$¨£ g•+žÅ:pü­ÁáÓWÎ £2Ë’®··›ð¢ôrú¶CHRÛÝ/¹ A\É(ºãTWÐ`àÂ/žhíÊæMó°>_W¬›3 °€máá29ŽuL·C?Bwß5[_”+Ò¶JŽÅö¾•ÛÀеùlÄ cíLNaƒ¶©+ïÝ86ް¢aIgúz<²yÑÇ\d$fY”¦à-G¸¥ÎÅF¢[¬(š%SE!‹ª¶– X[ß8teÜtz-ÑzLbêÄËL\ä¢E^Ú øÙ·3?ÕÍYææÿ¹ú9HN5|–µ¬:»Û¹¦ ê_¤ (-¹óóŸÛ»ÖÀì31éãØ ø/1å\ò ‘h,í-zëò/„‚yúÌHw·ÖÐÆ®1Ô·,NVdØ·m»;^änMøòÛ·¯ œ*dÕ1—¾õ/¾ø™=K\–åúUÕ¼¨.$¥ "¨°s†&„Ì[‰b9ëÿ™Ï¢æAÇÐŽ°§7xÓZÌ·gÖ9yS $Mg{ —îOå°QÉ¢V1ÊS¼•Ž~¸ÅöiÁ­q¶KD©­mEnÝÄÚ^ðež¢ŸÓX†Mâ51µ§€·Ÿõžñs,"$Ó\kó2«°–+¨¶ëñW[‡nœ}7'ªeÍJ¡uœÊ8 hEôk‡–µ#úµxªa£Äã c°eïš&xdd8ÓŒéeƒÒ=™‰p = ˆì[¼•´”ò,âE¢ä‰%>›–ôüzò{[² "c3Cô•¬[ý….6(GĽ±=ë'"{íèþû²ž S(p9+ÿO2¡Ž<₟ü‹ |„?ãïAW;rx1ƒOĪ«^û›Ží?šUþ—ºÖ1f D \Ù‹ÀuŒY©-Ö¿¯$åäjwŒ/ÎŒÂ%8a¹þ¹aÁñw“#ãŹõAœÑÃ- ¯óoÐ7h\ 4£¿ïÚáî±ÐGè‘»*Y`Ž3|R“}Ÿ›Á¿ÑÆ®½´‹žZ9ÿ½BÛ¼à3 wƒ}4‚¦“öñÎt58Wn¦9XX•®çøÁ›ÎÈ&aœ¾‰êÿ¯Öqð¢%ÈßÈ=—ÞÉõïKd+«‰º×ÃjÛÉ#êyô/Éÿ4n@„ endstream endobj 1164 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 1165 0 R >> endobj 1166 0 obj 2484 endobj 1168 0 obj << /Length 1169 0 R /Filter /FlateDecode >> stream xœÕÛ®·ñ]_A E| œCïý’·ºƒvÛ œ '+‰Òn½»”÷b½ôÛ;ä\îMvûäÚ43Kç>CúÓÆ%ü}?IàÒ$IɾÚ|Rt—Äñ#E x¡ãøÄ ¨’ŠŒI!)Å ð4?£µ€çäæÞ8äÇÍšq`ßeã¬0—¬ÞoÞZ²©Kò9ä´y¹Ý¼x×!Ûã`â ¤q¥iâ¥$¡¾—Š?ÙVä»—Å®,ø©ÉÎyÁÚç’í?7?lGêúŽC“oMÛ·#!Zâ8¦Î4Š$i@AŽâÓH)ЧŒ(¨þ®ŠìÌ$vlçôÍ·;QLc×MÓ8MáMFÁã:á­ˆùfÔ›‹§åRz§S½â9Ôø¹¨-!µ5‹Üd¾ê/ÿž®rˆï­±zñÊu§G×Ù†¦¯wÅŽ<Hu•À{Rg#´cOäȹf¹ LL%°wÃû ü£>øÓqw¾c«v¬!ÏIÒ”ÜuyÖY3ð.k™”Røqqݱ(Ù2·†íYñ™µËì­Òµ7Ô¢>ò¦Êº‚׆öx‡ÚBlÈHŠHsZ²“Ÿ¦4 ˆï%ÅÁÂÎT¬Èi±ÔB/[ç` 9‰X8“Õ¼6Rš;ö”Uç’=>7”ªo»ɺ}n04ÂÊþˆœÀ–µÁŠzq‡Ž¢xª›F4  ÄN<—ÖòÆU³˜™ÇwÁ<Њ’ÈYP؈°çU•Õ‡/Iú:Û²ß vàû¾buGç¦u`rÔV²y}ˆˆ²¶/»¢> $[›ªUa—¢,lÏë.“‚*BfmØ‘5¬ÞËPV4éš|·×êYÛ±ƒuxÃ+{³µZbAm7š¨ml$¬C6Üýt4à•÷ÎW\J†È¾èdnµ†ÒñÌ‹®Ïº_< Ï>³%P蘢ءNhàÙ¦þ|È:‹]ÎŒáM³±¨;ÖTìPà^Ï{'ŽG¢ò;"wEg ¯Ÿ XÞ7R ˆŠ#¬s#𥔠“^siVñÏl5³¼4¦i ™•ÆáÂns¼í?¥Æ•‘´1ˆÎ/ÄŒ?lLS¹ËyÊŸS-°÷l0@$dŽ'ÄM?ón]A±>õ©+Ž ’w¼âBÚÆ •l³–-GB m)Uﯚt)º\ÃëeÏ…Á2ua¤¼°ý®û%ðaø†Ýn˜.ì¾×ǢB¨ÕЙ·-„£ÑåQ™Uã57›jh”m›5WÙ!Ð ÜØãÌöÅñ:ñÔs‰<ŠYÿT”ð"2î…‘xßià¯j£žãK¢ØÎÏ pÀÍ&êyÑ­ý„=[Ñà¿¶±{±O˜$a°ÀÑÌNk¥î­íª’4Ü2”˜V=mD(㥓½] ¼H­ãD«õï >~!äľp–)"Ësè1÷„}fÍJ5ô;¨¶-ÉZ" TU¾o¡ã@àÈš Óÿ\áç{3.Ú—+1$b’^›¡×ß›ÓîÒ =Ÿ`¿0CÏ6|Õ  ­Ê+×kÐÀ'öoúU®ŸùµÌ¾àV?r'ǘm²Ao,ÚºX1J–Á¨Ø]Š=¾=1 Âlb$MqÊ»eûQðäb4x˜|÷1Èÿên¬(ލ)R{_Üöb?šÞ­Â€†~ %>ˆô½˜†”ü½ab²x·}Ev ¯,k7P+ñ¨ƒ~N•› 9ÞDZ¸°¦í8?ÒîjÀŠ·ÃÒ o†E熋>Ä›–Ú‡§'ÄÞ±ã?^ìÀµ5Fú§ÁDìtžO="Ç6°$ÎlšÂ ‚s½AvYc`9 øæ¯ü€ª¨%Ãê_άþåx„ü¹Îj;¼ ©Å/­AÕ臢 Râ|­‡µzn™Ð‰&–Qæpƒ‘ý’®í@jaö¶6eÖ'¬í_:Rá[ïfÃÙòš=\²ëL¦pÉ1š å oø W#¨fµ©¨³rÁn2±…)zb· PrÇû}ÎÔ"þ.}¢±}V[\ìýꚥ—òêÌûú`‘ÎÌF Z¼èhtÌ[H sùh©q-¢Æ· ¦ð‰)0ŸÑªâò f.>2 ýº¹ æV‰)¦×ù)´¿YÌ\/¸µß’G…ì%Ü:œÐæi¸$?t·…ƒÖvcÿ½%Юï, "ô^î!×>FT¹‘¶Ë{3Œˆ¶ªê b¶æ6#ˆB I™íá–óz툼6Á´Ï@YRj»òÊ”gõ‰Ùí&‰à•Ô^¯/—Ô"nÅÔyÄ7M3jJìÈEÍTï/ŠÖŠN,Ò£U9¢_`º1Í*y‹±Oåc,N;Ïûß¼~ñÛ›×°Ówe©“Ù°¾ #j|leïE\H&ž´tÕaó%—oqˆô-ª˜n’ˆI±ÜãH¡ÑYçЂ4Ã)PDôŒ¦}dè¦a|¿°/f‰{sΕëá*çéåëá2Ùपº5ñFîÔ!šBZàf1ó¨ñ§[Rd£W°n,ˆÙÙ„èE9Zþ¬±˜ßx¸‰)lj%Áeeyµ®×_9|×£A ³¤Ÿº ¼èÀæ×vÕ * Š™î´¬Ý7ÅŽM#CÜ›FƱo€½œ†b ù/55ØOõ§‰¨‰MÂpvg1ÐYŒ˜~[CD Ѝž$Ü·Ã2k‰zrDj-–+µløRr™^3º}³§3oºóøÓ¡:$¨¨Ôê²|áæEÓZëÝ̹ÞΜ÷¢ÇŒòF(ÎE£ÝÌ¢dêÔŸùE„CÊVµ/Ätš f§ R°¯(xU¯BD8•¨lZáxˆÈÎú€“Âp;i,öj”×ë®±xì!Ãp¢Eüé=ëŒ~É•éÔ•}ÛËTA!‚á_â¿XZV²=¾~ÉPU!ªœ-½’µ”Rr(²’Ÿ¨u|»ùÎ" o endstream endobj 1167 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 1168 0 R >> endobj 1169 0 obj 2275 endobj 174 0 obj << /Type /Action /S /GoTo /D [1170 0 R /XYZ 72.0 769.889 null] >> endobj 178 0 obj << /Type /Action /S /GoTo /D [1170 0 R /XYZ 72.0 740.03 null] >> endobj 181 0 obj << /Type /Action /S /GoTo /D [1170 0 R /XYZ 72.0 571.147 null] >> endobj 1172 0 obj << /Type /Annot /Subtype /Link /Rect [ 464.055 584.647 520.776 593.647 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1171 0 R /H /I >> endobj 1174 0 obj << /Length 1175 0 R /Filter /FlateDecode >> stream xœÍZÝ“Ü4ß¿ÂÅK jclχÇ÷B—¡BÈR4¶fF¬Çd{‡Í_-uKj{«Ü[’‡í_KjµZêÉó÷Mždðÿ¹ý³[çénW%õùæoâçIY$«-±6Yº.6Y¶JòuZl’s2em’ÖŽaDá)ø3é ø”üzÓÝdÉ·7¿ÿ }š$ƒqכ쨷7?1ݨП’~\ÃU–¥»OOÁŸ¦\–ešÍ7Þ‰Y!8(Ñ6M™CœeÂÁàߪœ=Ñ8[¶¨ßóOF¹,9Þ|}wóå7 S–Ü¢G•EZæyU•UM鮨ì¿"¹;'¿¾úâÏäîû›—wKçå“YÜÓ£RX½ì¨m•À5´úUR¬!zØ5NŒ%Ež»2˲í—þŸ“¸ Ò$yš¼ê£›±”îÐ N4ÊuB³´„ø3•¸©Òµjµ)Qbž‚¬_ObHTŸü,/¾þÊK;.íÌz—ìàÈ—°9;Rê¢Øà˜Ðkó´—“|­›t—|³ZDÒȃ4²«%kíš:=°¦F b/z™FÖ/=kWC¤é³èÄ‘õ{Ô£‰¨Öm+]#O8}¸Õ ýrs_+Ù ê ê§F©ª©Q.ã¾Uµ°sõ·VÄj—®Aœ‰4¬z´ícd‰Ž=œ$ë>Užº"í4—Íò\Ò5ºSuä5ºÏ’VKó·º;FxUÃ)"k˧ Ïó|¶riz݉6±;Ú§³pÊòÕFpö‹Õÿ:gOû…“¶÷ñ' iÑöš¡Hîl„>q9=Fî uÑM…à,Ìýx‰¸Ýq„CÕ§‘ww’ÿß °ÍúÚóÖH×FŠA.¬]ÎÖï¶Xì[7yQB°¢M&ºkUÇÚ&Œ,¿£ˆ`Ýg1СAV­<´‘EnŠ€-VIÖé`ô9¢ºþZëûÈxûí¯¿\X⦚-ñ·^ß&w/_%ްS¿wò·¤‡ÃW/§ÝêãŽÓ“~þ8A<­`å¢ 4&½426õ‘ ” W±¿S5@<\H{—¦ñ—Kˆià¾Óã¢NRM}œb8Ez¶ðUU¤Ùf )v»d‚·?ÿFÚða¢žÅõz—–å’Uµ$âvÁÔÕÜsÁVa«èiZ·±o¾{“´jo„±' <Â*' òîÌaì\¼­“Fˆa-¡›N\`××.¹ýðýÉø˜TYÏvy–»ÜçÊÂæJô'=¶ÓõãRf±Ù¤ÕJ0Ì,HUYšƒÇ¹C ‘½:vèoÔL‰7’@'eÃÆb¬GZD’’R?D–ê"}V]“FøoÖ­•‚ÒäŠ(Ó|üÜϘžWmîŸzi±-ÁNkȾ>KŒˆk!Œ ¿€Ü!@6 uÆ„@>ˆv/âBî$ySE‘ÉStÙ¯ºHw:Òƒ:3 —8‰Ö$تe ú°`—²šÙeR„@ ¬B&wô›ßDpù¬ß`«½€HEWw®lÕ½dãt¤…©Oê5âi¢F&P<~hâ{)/­&Ò0éø2ÅÖÚ{È,r!¾U>³÷°|•–`|ÙºÙᢑvËBÒªùFÔ÷¹³M 'í¢*¢‹°¥L€ûÇ@ºŒç "P¾p rp?Al€Û3)Ú8Ë­ó ±ÊV3C0cÚŒ¹µK}t‘˜€— ÀÈB/xOLõ2‚PÉyF­Ï®žˆýqA^œ;·÷PIŒ¬¯Ô‰w»‚§J®ÀÂÊóÍlå˜w®òP.8Õq¤w#ÿ@/r´ðÔK÷a¬^2©›çŒöþã‹Û -Î/šFaÆòœéyßQÕåI2·£½µ–_Ìc'D-yÔF½w‚œfµ™;ÍËÙ5˜zàŽÑmÀèAØzƒ?isz/§ ƒá†Çe‚kÃa¤ØL<º°ypQõdDÇut…ó•šH}¯kõ´”¶æØÎ]g²SÏ·ë…Ø„LŸ Å5ÞF¦÷8Æ#ÄÃ9ц­Vº±—?L<Ƚ;á…ÑQK†‚ ßËGFB çuaÉåÜg Á?·ìúw §×sËêÔhQŸƒ®Â;LÁ Yö¾ƒëÅÑ-`<ÆÑ­ÎFN¤BEèÕFùýx¹hw•¥Ó¾›;;íP‚†“ni,4åŒï掓#N¾T‚&0]’³$^ÙšØû|Kô~"÷ñɔʥ¹ù|Â-ÔÏç5;Èî,Æj^=ÙCP¯Wj7ª¿´§ƒ¶ Ö[sçxëË%ܦ–uP¦K|ª@l˼ˆìÃŒXŠP/"Ù{[«§‘óƒ6l˜=Vp‰e³½(Þù,Ï{´•Ÿô°8éÑh¼Î“ÞäϤ‘:«VÌŸ5¬QVs÷ËJ[ÙÁe¸/¹Ñ‡ëÕÈPp•è²± Ôß‘ê;Ò—šØ¿‹bä"TœCÅ!R0ÍÐ4‹’OQp0ŒC§‘JNBEè‚eÖsgƒ¬T3Ú·,ë`Ú(ýØú*©À\ÈfÄ«¯ œòFUĸlx$­AX'B_w"Âxƒ4«d¼r1Ü‘FT¸Í¯³vÅ›¹—Å=.¬@ý†@ž„»7!@ÿ¦åu½nUƒK.h‰QÂ$õ ï‚/HÜ’ÔSáö0 ðU'J4K£zÙ¶\gÁT;_ZÉôò¦X°D9/+dw¤7§í:,™h&M.ªÈ!‹øÌ¥zPñ3&íÄDûи0ÓEÊ{&vøîZøŒ ñK ™xá¦í'-˜e÷´2·u"F« ¯”NÿÅxü9Àwë9`tÝZó}é£ÌT®¿Å2®Ž#Hv$dMÇ'/· ÑÛ:‰— :ÅÐJÓèÛTó@zöƒÿHãó¼ ÿM\”¸õ ̵Žôµ ô:;ä#†ûl"•çàÑRJ^=MI{øKáD©…À¸ÉæÑ_‹·.ÕÐYvé©¡JÜ!* -)ÿ±»©Ì8ÎÝA$¾âlã#Ζ=aGqŽÀ¦Û(Ö{Á$!nc /VHÓÍŠ”ã¬*öaÝÑ †É+÷F–—Y…†¹ÂÓÕ*Ýξ» ‹R=YšÞ½‘…* í“Ú ¯“š÷ ’ðwú*Án'£ù\Š)Ï?Hƒ÷‚gÖñiº•ß®H<“1.ÅÔÍ*ŸYD0.;±6þ-”ozŒã_>@¤ý—¥<ÛÒÃÈ3*§‘áÕ$HW)îi¬?M‡íËkDÖ3S†ßÍçòdKsÁiçm~/»žOuàŠù7™ Š\Œ­òaÉÈîù‘I´öU-´®°&èd„ßù%#ŒŸ9³—Ϻú B¨x+ÅU‚Ñ{#å{Þ“ìãÕr¯4“v I3«D¾.¼‹ÞNš,TΔ®µ1а8µñ‰¾YbÿìJñC¶‹Qý^uñ¢«÷8®ñîUl"GsôÕÐÉñ-qÿå+0Æžž ¶ì©{>ïbnßTs÷ 7Q;Ð=yÛ¯[à:ùc¿¸{Ñ/õ‘+…ß¼<ò«¹ œp3³‘v7Ó)4:zþ™p‚›§«Þº·F¾jÜ*û)(HE0ùbˆ,Åúú}Aä—’FÞ™ö„ÈÓEä_§‚X¦ë†uôÇëJ5èBgn¯ åó°ËŸºòðü_}KL‘ÙÑ ŸŸ£¡ò~!Üãkølc飈2ò/W$¤ËS|ñ~¢\ÈÏÊsÕ“f±°ìbHup5‘{Ñ]%ŸÿºÂUë+‚ßH÷tµÂW˜["ý¶4_KIÑ+—´,0òù`D×Û %–^M<ÜB\°¥Âþ[ †Èõ=½¯öÂWóP7d¡÷vî*?bÆZ•îë~|ÔB¥=þ¼-ÄY#†ÑÐÏqû£™M½`šrî#ñ=)nïr¼~ê{Ű‘µºÄ_[ðÌ‹ð*úîÙñÅŽèéq Yüb…œø¼ÄõlÆËh.Úß‘…W Ê6t(ü6$$j¤ýAjX°Ænî:®@°Ña/áZl?:ÃvX|õ=ìmÊ~÷ÓÍ!(VT endstream endobj 1173 0 obj [ 1172 0 R ] endobj 1170 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1173 0 R /Contents 1174 0 R >> endobj 1175 0 obj 3113 endobj 1177 0 obj << /URI (http://www.loc.gov/standards/sru/cql/dc-context-set.html) /S /URI >> endobj 1178 0 obj << /Type /Annot /Subtype /Link /Rect [ 265.447 618.709 317.98 627.709 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1177 0 R /H /I >> endobj 1180 0 obj << /Type /Annot /Subtype /Link /Rect [ 326.623 618.709 523.273 627.709 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1177 0 R /H /I >> endobj 1181 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 606.709 151.95 615.709 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1177 0 R /H /I >> endobj 1182 0 obj << /URI (http://www.loc.gov/standards/sru/cql-bibliographic-searching.html) /S /URI >> endobj 1183 0 obj << /Type /Annot /Subtype /Link /Rect [ 315.685 606.709 436.481 615.709 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1182 0 R /H /I >> endobj 1184 0 obj << /Type /Annot /Subtype /Link /Rect [ 442.714 606.709 523.274 615.709 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1182 0 R /H /I >> endobj 1185 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 594.709 306.92 603.709 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1182 0 R /H /I >> endobj 1186 0 obj << /URI (http://rfc.net/rfc3986.html#s2.1.) /S /URI >> endobj 1187 0 obj << /Type /Annot /Subtype /Link /Rect [ 299.088 217.503 360.168 226.503 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1186 0 R /H /I >> endobj 1188 0 obj << /Type /Annot /Subtype /Link /Rect [ 366.393 217.503 494.723 226.503 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1186 0 R /H /I >> endobj 1189 0 obj << /Length 1190 0 R /Filter /FlateDecode >> stream xœíýoÛ6ÇÏ_!tØ MQï†aízwÝ ‡vÍÝîÐöY¦cm²äJr¼ü÷÷P”LZ¦µMjÞ… ЈøòüðáW²¬|<³- ?—ìWèÚ( #+YŸ}lí¶Ëñ[“‡‘K<ŒËvñ¬µuhò¬Œ•‘Hw¿òBzeýv–Ÿaë¯gï>@ž……¡Üî TÞTõöìä[›Žuò[×gϯÎfñ,K1ÄŽ‡`ŒÇ ‘C"öXWkëÝù¯tùÓsëí¯ÿ´Ò¼¦å2NèÓÖÕÏg/¯úì`ŒBݺüæÀE@&„û(5Õ8Ü^#;uàH?É[9°ðð߃.ã#±ìð1EÚ87  À¶£(ˆ"8…‚l£M÷Ža!̯}¯-rÐkÌúJ|/bïúŠü°ÿ­Ÿè2ÞfuÅ;¯57´Ù*£¶‚WKë©uéÂxZç±8ü¸¥å­Hå”\›¸¬EjQÐJ¤òB:Umh’.¥’q.ŽÓ|Aÿ”O-”m—4‹ë´È/„‰‡Ž}2+Š?$–r'ê•´\Ëídã£)¡ëõÆ0ÞÖ«¢¼°þ ·»¢\\XÌç:­3j5¡Õ³ãZa7„HˆÏkYÕõæÙl¶¾¢¤XÏ’ëôržæ³’.óªÜÎ~(6´l:ý}Eã2YýJë2¥7ô»ZVÌl#û»fR¾Oâú¸Í0‚bl6oój•6#dG(’¦“'wi–‰T-Ÿª q¼Lù ñ8KKš'Tª·^ŵH%E^Ç|»ÓT$*èQ~-ÒO #ODR.GS(YÔÓ ÿ…HÇâp?M{K!ÕçÇãfc»7p|Ê­<^SÔ­7Õz%>²}X¯¡ô¬ƒ¬0ôÏÚªèø¢µÝa µ¸ž-o’à3 ¡&µífS”u%™ÚÑhSIÛ”T„dïuÚŽäºÆ>qíÿ´g|*Úâ/в¿R¬ #/PU!~×/é¹Ú…á¶Ûu²ÛíPV$躸™U5¬¸¸\T3¶L’Ùl‘\¶]¾TL§o÷ê„Á@«zõò@„ ùüÈSúÐË:ˆ°þ†ª‰&¨`ÖÝ÷ç‹äýS‘î"–¦'º Ù$n©”(–Ë4Iã,»6ˆˆ4®¨TÙÑŒ8È¡Cç+<|ñæQôy 3\\—ñf•&Âü¶‰;°B{U;¾ á Cß=ÕP‰ úsí¶r‚)Qù¤˜lÅ|N>û@@ •úsYuÝPÍ:q\Ùí¢=®»?íÄ Ùž~œ:m{Èg­¿Šö†«f’ùñ²È²bÇc·Ôñ<ç³´jj{N*Ùí€Õ*ÝìÅRΫ«Ðë¹ÙnQÖ‚B$z`]CÉŠZ‰ž¬[f·xèY¦4[TrèsšouØUìí÷¢¦ƒqŽ•€÷|yßõå8}JŠm .¥ëMÜ×€}œU…µ{Ì3˜fÙç½sA?.Ã0°Ã¶Ý°ÝįšQŸmU`))¤š×ˆ8@ÞåRò’0S+÷ á52‘‹Y駸ƒíµ–¾$ãz’×ËÛ8ªŒ_öÌr>ÛGÁa«`Q¹1Ðú„ªû>p{3 l…´¹ ›G-·†áŽïË·{˜«,Ñd;#ÒU÷Ï™ìÙD«¤L7ìJGÉX«ÆÃEJÄLH:µîîÈy0ŒŽ.&ññ§Í ÁqémÒ!=IéäµÅ€Âný{\=L &€ÉíL-\:q¬&‡bù+é`CÒ$¥5]ó–«)ì`oàjËÄÿg)¬Ò´†}X8eä¨h™Òêê.ekp1¸4ÊÖU¶ƒÉe«!&FÙêIߟ¬á[/­´%¶n×J­„}\Àr?¸tU÷}àönØ»\ÐÏ£–[ÃhϻچÚ=ÌÕ¨YÑäi;ŇŽäæ•ÒÖ°  0åŸv»öÇù¼¤7£ÒÖàbp\~þq\ÚL &´½•¶úa2$m%n I' é÷b[æqóM¦¦Û/§ôÎÆ!½¢q³«¥qMÕÏiµ¢˜}»L/[ƒ‹û ¹øž@ëªîûÀíÝ„u¹ ŸG-»zÞÕ6Ôîa®F‹&'ˆâ)>(7?™À¤¤q]”€cÏ—é| ¹G•0ÈéƒÜ)Ébß›€Ëöš–Uqð8»ã¢ÐÁÛ¡#²¿(ÊMQÆõøíjƒ¡Á€ùqüA ƒ‰ÁdЦד!M/qcH:IüëßUóEºHA.>aÝ.í‡Z>›\mç¿Ó¤¾°’↖ñõøsÊ'}pÒ€šQlP1¨*ÿm\ L &²~˜˜ç9ô$©}ÇÒ˜*vq ÛåÖ£EEKU¼ºû× aC>”WUµø”¬Õ†C £åõFµ°ÁÄ`2áÙf 11ZXO’6ìe™Ióª>kPÓ´š˜8º]a=ZdNýÕ=Â>,œ2|ÜÙv=ú„!ÅÂHù×/ãÊÖ`b0™ lõÃÄ([=IÚÐ2- m3kd—j¥­«ÝÓ5–™“K[Â6,œ2~¤ì¦í¨²5 PØ_)z;®l &“ ÊV?LŒ²Õ“$IÙoR­°õ|Ý®—-2'¶†mX8eø¨ê¸¬_=È݉[‹`yûz\ÜL &Ä­~˜q«'IÍîdm†¶§VÖŽnK–“ËZÂ6,œ2pÐ|q§¨5¨T•—wˆZƒ‰Ád‚¨Õ#jõ$ ö¦;%mév‰tzT$KÐ ÌîèKú<©»wãþunð©T5ÏnW+:þ:4Ö$°Èý‘¥ItR `ÃÂãdaúОKcè‹D³~ Šæà«)æ`œ.Ù¡‡¤«wµ !]*ÉÓv,›ô {$@NàE;_S6AhÙÈEÖË<)i~Í+R´î†–Ǥ¹ícì¸ÝË+öªd'‚Nß[‘XÇ·"±Šo¨HåE&tq!,i-K5æ4¡U—RUu!Ž{/'%Ð?Q¸®ÂÕ -š×—”u”öˆÀˆ° eE›ïú#9‘ƒ±ç¨ ®êzól6+— ÊiÍ~;Qè£U½Î¾©ØÈ÷ªs A)¶#U>e÷´Œq„Q·cq¸¤»~-0³>é•­64I›7aû>Ьód—qRÓ²Ú›Ò|X¯èþx×rî-S~Ÿ);ôëÀ" ÉcnâlÛýõD‘Äf¯¸ñ0ƾ­(öí¿D×Hé*ý¸•ºX¥×¢GïÏŸ|ÿäýÓ}:®ØéJY ÷Sœ*ÆÇ¥RŒàö¼go+„9 `N­óEÑTߦ`‰D·¶xŠ/~<—ìú–¿;zCË )O;m²ën›Ü¥õª™ð®¥•Tý‹7¿ˆÄÇ-å+¶­§.!¬ˆôûóÝ*MVÂVµ*VŒ VÊØÈKqÜúÅ:6î³E(p#@Çóõ7]äÎ&¬p±ÂðqaÑü~ÆŽZãz[Õ"5—¼=ŒP|²ø™WRÛ0ËÛJ*‹C(ξÅL”d)T. T!ŽËm~Ð@©˜„(T RJ+Lj IT«b›-Dº¥–'ö;B“jƒzsœÄ¥t&ž[©Ln%MŠ®Ò"¯°òÁRx´•ËÆâpGç—ó²ØUMÈjE©Ì[¥ë4‹ããÛýè» 7°Ï]X̶.SXÒ Ïe‘eÅŽ- Ñ«ŽçµÀÅå6{Ö¡ôwqÖã#Ç'°ã ý€MÑf3·^Ë ±&º8.â÷^*ôo¹ù.l‚N¨Ð¢üˆ€ÀóCŒí~Š 08vk˜(Q÷mUÆåVÏ,çë“hµ]}7ZŸPu߇»îÙ¹2Ijµ{çgË_|ÃmX}jõÙ(bÏåà•t“ÅÉÀ{Ÿ<a?‡Š<UÄ`õ X=Ô̆˜®Pßb€ÂÐ7€>;9\Naw*C¡ýp uußÅС¡Ý'êþ3€}f„jU“ï"_É–‰C§ÖG2'½G÷l\|´Áç””|ëÄã2Èpb8NfãBG?J…ÏWÒ4¤»YŽ©šÐPÌ8ÜH–i_}>Ÿ§vtzüê‡qc€š¹?¢þç’£H{d2ô͸6ÒŸAm|5aŒÃ%;ôpõD¡†p}K /öó_mÌân endstream endobj 1179 0 obj [ 1178 0 R 1180 0 R 1181 0 R 1183 0 R 1184 0 R 1185 0 R 1187 0 R 1188 0 R ] endobj 1176 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1179 0 R /Contents 1189 0 R >> endobj 1190 0 obj 3281 endobj 1192 0 obj << /Type /Action /S /GoTo /D [1176 0 R /XYZ 72.0 263.155 null] >> endobj 1193 0 obj << /Type /Annot /Subtype /Link /Rect [ 190.54 437.269 214.98 446.269 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1192 0 R /H /I >> endobj 1195 0 obj << /URI (http://www.loc.gov/standards/sru/cql/index.html#conformance) /S /URI >> endobj 1196 0 obj << /Type /Annot /Subtype /Link /Rect [ 300.336 326.897 361.924 335.897 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1195 0 R /H /I >> endobj 1197 0 obj << /Type /Annot /Subtype /Link /Rect [ 372.163 326.897 523.273 335.897 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1195 0 R /H /I >> endobj 1198 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 314.897 220.26 323.897 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1195 0 R /H /I >> endobj 1199 0 obj << /Length 1200 0 R /Filter /FlateDecode >> stream xœÍksÛ¸ñ»FKœ¹&øæÍdnš¤×6µÛó㦹Iò¢`‰ E(Yÿ¾ , €©O±?»Ä.ö½ øë#ü¾RÒÑ4ÍH±½øÚáI|Ä*òhèGžR?"[2DE¤R4ÎÂïWðg°à ùçE}á‘?_|ü {VĺÅw‚¹fuqëÈÖm€õ÷$ŸGÖo.®~‰óÈã5qÀhøžç%IiàgêÇ'[òñòŽ?¾{Cîï~#eÝòæ1/ø‹ÏäáýÅŸ:žGÓïMåÛˆ2I’PoJšM€8À Gõi ÈÄSÔÿžÙ›Hì¹O£è»îtÅ M˲$ËàMļì\Ä|7êMƒÅWrÖ:L'ÙòÉ÷#TÖ슦»6m»ûéêj{\Š'ZˆíU±._-Ëúªá«¥löW?‹oò¶õkþ´«ò²~ö7RÁŒ²Ñ d0hìÇxÄÆ“`bÊÈåow×f½Ë›Ö¢ªÄ¡¬×Ó:d_÷\* b›7_ ðérñóâÓ —õ,“vS6+ñ§|»«ì×RÎIž7ÅæÕ@Öæ,6*D-KÙÊ©%Â,ÖNƒ-!êUÄÙXæ[uìõ·¼Úó…ý´ËËFZp _WlÅšƒ„ÅÊvc!P Ü“×+‡XèXˆZÌáÒY¹‡Ú‚p"wiøTß(é»)òV4Gò(’W•.Þ&ž$É%9ð瀗œ8°i«#2†J'1ðŽlDAHßC Ä o÷MMròáæš¬D±ßòº%+.‹¦\ªR-ò]¾,«²-¹$à…›i(Ýé:}=$hÖoPÊê§Ôlv^LSË:á£>ü%$FÏo›’ãVóþõ‰\fDI%,Š™›Dªx\Ž˜vXûGè€Ö«ÖÒŠÚ,÷RGîý*/Ú=8êØÃkýr#*C #yÌJI]8?ï×G±Þ˜/•_À3SW3Hš¡æ:*n“€†äòw±o €!ÐCZ_\J僯ÍeÅ5}õ óÆög±Gcè YÄüyô©=õÄy,;KlŽ7g0}U™hc³¨Ç¨l²:9[MX‹ýÑRñƒYwÕOþ4ã8¦aà I|®“L÷ý½d†M’ŽØØ~3Œt·í¸>âl×ó‚”Zæòôù]aD tŽtØÛÐAx/à@¸·b»í'óU²`d•[-Èu^¯÷ùº¿1hù#…pmˆÓæ(9\ô9¯ûw¬y·„¡zÆ/{ÙÐ-êÔ\¼ÅXXÝg,$÷»hZÓåtP]!02ï§4"¸ÖEáŒ,oo¯Úk˜I*O~šÑÌ=Æü`†™CùqD©žhX m7 æLÒÍY‡ÃV¢ kñíJ¶jp† y¥Æ¬âku5sEü£²^ñ'ºi·ÕбœN)L8 $Þ”Ççñv¸4G)lƒpf;&«}Yó¦=UõUüÝUy·«Ž3ãz˜D4ÌB¼pœM§ûLÜøM!áD—·ªEk'†¡†Õ©kÒî+—ˆ·’ZðAM`NþÒâÌ<§€Ó²À iÊâ,½9=ðà{Þ><\ŸÌ£æ“3<\5tŸwt–ÏMÓdÄêЖç5x¨|IT‘*[heІVN ßìe9'éÀb¤Tï0aK%˜W½™&1•ª‡øÉ9·O÷·G)­ÛêÜŽ€ãvD|ø5ï^4ÈŸv ¹ÔáiXJp ÷²òñè|C#€Jcˆ Æ„È Š3’FÔOÀA6£1Þ‹´ð'ãC™Ê‡º§ž­¹'ìcBaÔò£û.Ñt¸ÞˆÔXQƒø]ìͺУ,®uÿëÐÐþt»CPç»…j»î½€ÐÐ W{°;¡*1c”åj\×”‚pdlš 4ˆ÷èß-'°‚iTÂ0=÷¹2¸E†gKÒtß=„v蘙GY\ûÒ¥Õ6A ×]¨òÕKƒÂù×h\ŸŽ"ßWu"'`ñŒp lû7~”'cÈOüsôF7Œ&zºZ©(‹*5¸wxÕˆ»—_}‘ëvW‡ü8ži•™ãt$É’©­E–Gò×w3Ì a± ƒ[ItÖƒ“}z49ia(ÂŒº^Û§´˜§¿æ…}œ{a‹ÂsLì¸ÛW]”Üé ™BAsuÇ` ¸k~¸¹ž ç&o–&0³$gÃyºK­®°Ž pd…/µº>–êÕ]ëRˆ z‡ƒ…f Æ+Õà;'ZA¦G³`â§9ûGs$ÊO'­ú3Ë*ãåF|¬š- q”Ñn<¾ç·ådŸ ,c¸3·^FÕ_–†É h¸•üt3u¥R—¹˜ÍOŸÑ0…ùÞsñÙÔ™îë§úTgglOí›o4|­/ü1jňüt¹ØæR%ÓÂ"ñ9 ×\úßf¸â;ÞýÛÂÙÛºÒ¹—3Ä,!k˜ZÌãÇ¥vŽÔ{B…;ªY©Ø}_›„”©ûÛk¸<êDÁe@åÞ^ü°9 endstream endobj 1194 0 obj [ 1193 0 R 1196 0 R 1197 0 R 1198 0 R ] endobj 1191 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1194 0 R /Contents 1199 0 R >> endobj 1200 0 obj 2569 endobj 1203 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 759.389 327.334 768.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1202 0 R /H /I >> endobj 1205 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.5 759.389 524.5 768.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1202 0 R /H /I >> endobj 1207 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 747.389 326.315 756.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1206 0 R /H /I >> endobj 1208 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.6 747.389 524.6 756.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1206 0 R /H /I >> endobj 1209 0 obj << /Type /Action /S /GoTo /D [1128 0 R /XYZ 72.0 270.609 null] >> endobj 1210 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 735.389 316.356 744.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1209 0 R /H /I >> endobj 1211 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.68 735.389 524.68 744.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1209 0 R /H /I >> endobj 1213 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 723.389 324.043 732.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1212 0 R /H /I >> endobj 1214 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.579 723.389 524.579 732.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1212 0 R /H /I >> endobj 1216 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 711.389 320.01 720.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1215 0 R /H /I >> endobj 1217 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.517 711.389 524.517 720.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1215 0 R /H /I >> endobj 1218 0 obj << /Type /Action /S /GoTo /D [1167 0 R /XYZ 72.0 345.089 null] >> endobj 1219 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 699.389 275.516 708.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1218 0 R /H /I >> endobj 1220 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.843 699.389 524.843 708.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1218 0 R /H /I >> endobj 1222 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 687.389 378.453 696.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1221 0 R /H /I >> endobj 1223 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.155 687.389 524.155 696.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1221 0 R /H /I >> endobj 1225 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 675.389 383.012 684.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1224 0 R /H /I >> endobj 1226 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.119 675.389 524.119 684.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1224 0 R /H /I >> endobj 1228 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 663.389 297.495 672.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1227 0 R /H /I >> endobj 1229 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.789 663.389 524.789 672.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1227 0 R /H /I >> endobj 1231 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 651.389 437.768 660.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1230 0 R /H /I >> endobj 1232 0 obj << /Type /Annot /Subtype /Link /Rect [ 508.661 651.389 523.661 660.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1230 0 R /H /I >> endobj 1233 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 639.389 225.472 648.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1171 0 R /H /I >> endobj 1234 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.081 639.389 525.081 648.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1171 0 R /H /I >> endobj 1236 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 627.389 260.697 636.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1235 0 R /H /I >> endobj 1237 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.949 627.389 524.949 636.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1235 0 R /H /I >> endobj 1239 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 615.389 234.201 624.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1238 0 R /H /I >> endobj 1240 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.143 615.389 525.143 624.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1238 0 R /H /I >> endobj 1242 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 603.389 288.145 612.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1241 0 R /H /I >> endobj 1243 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.863 603.389 524.863 612.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1241 0 R /H /I >> endobj 1244 0 obj << /Type /Action /S /GoTo /D [1191 0 R /XYZ 72.0 688.543 null] >> endobj 1245 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 591.389 317.777 600.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1244 0 R /H /I >> endobj 1246 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.631 591.389 524.631 600.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1244 0 R /H /I >> endobj 1248 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 579.389 276.61 588.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1247 0 R /H /I >> endobj 1249 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.953 579.389 524.953 588.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1247 0 R /H /I >> endobj 1250 0 obj << /Length 1251 0 R /Filter /FlateDecode >> stream xœÍÝMs¹‘‡ñ;?Eå» @æuÖ/»Þ°g†žˆ (©5d„DÊ$eÙß~‘]Í)’(*ôÜF:¨«øGu5¥j$Uýϳ¼KãïïâÓ¼7óÝ›gÿ<­Ï»^vÒN«jÚk©)É.ë¾Ô݇ÝÓUu÷>ÚÙÅq¨ôÞ÷éù!tÜŒ,ëÆše‹ñ£';ò|qy–'k–W°üûâ.§iÓãžž_Íν|àô‘ÊãÀéîãG{{räTûÒó«yuó±Rb¿¾ð¢ËôŸd¼vÙï~³û]Ë{ݽú¯ÛÃÅýa]þþÏÿ÷—uéâúíºðã㟼¾zýþêæçÛ‹—W‡»å·÷ËÓ–Z÷"2ž´É´ë6¦V¶W>–êÔjÿ<›øú°’páqX°p#aa+$\I˜:t"è@0þƒ0”%AÉ@P2” ¥A)@P "(DPˆ A%‚J•V"X‰`%‚6"؈`#‚v"؉ A#‚F:t"è@PÔ5AÍ@P3Ô µA-@P ÔB… 's±êÖô`uœÕçm{~ó¶¿ìny^:æ-6ý¿‡ÃÇ«ëŸ×W÷ë㻫ßÖåÏW÷—ëÒíáÝÛ××o§îõ(cF]‘Šêüükë©Ù8ˆºJÄóÜlî<'””n(í$gs®(m$'tV”F–Ž,Y:²tb)‰XJ"–’ˆ¥db)™XJ&–Rˆ¥b)…XJA–‚,Y ²Td©ÈR‘eE–YVdY‘eC– Y6dÙ‘eG–Y²4diÈÒ¥#KG–N,5KMÄR±ÔL,5KÍÄR3±ÔB,µK-ÈR¥ Ëž‘–’6Òý.ýh”RÛxŽ­žýxÃùlò¨g_Ž=û,Þ½úæÉÐùo×Ü_օˋ۷ëÒç‹ÿ<ïw˜q¶ÝyËó“®-§f}_ëx ½nìëÔño5$-(ÝPÚIz¼ÕtEi#éñVCÒŠÒÈÒ¥!KC–†,Y:²tb)‰XJ"–’ˆ¥db)™XJ&–’‰¥b)…XJA–‚,Y ²Td©ÈR‘¥"ËŠ,+²¬È²!ˆ,²ìȲ#ËŽ,;²4diÈÒ¥#KG–N,5KMÄR±ÔD,5KÍÄR3±ÔB,µK-ÈR¥ Ë(,zKY²Žø±°èQK´f.seþ¹²8Mæ©{Ù½úï›ÏëÂýÍúøÓÝa]xóéîþæÃº|wÿŸ÷‡»ËÃá~žÇSöI£ä)}~úu S³ºÏ¿À\çfsÏÞFzüþT¿"Ë{ÛÿvEçrUxŒ.>.;—å‹õá©]ÞÞ¼ùôáp}¿®yws».œæƒ- Ÿ6sx÷‡o¦þEÛk{6ºSóN®m§fÕzʣʘ›Í]‡‚Ò¥¤GJÒŠÒ¤GJÒ‚Ò ¥‘¥"KE–Š,+²¬È²"ˆ,²lȲ!ËŽ,;²ìÈÒ¥!KC–Ž,Y:²tbs_HšXÆìÎÄ2æ¿4±Œ0$M,c I#ËÑ-)£Ob^6z/¾)G·$WõÑ/±­G›»%¾qIk=]Ò'ú'Ý’ãò›«û‹û«›ë»uÕÕõúøóÍrmë²ôñöæÍáîîÔ?9®zè¾<;¡‹wñuï¼[kû©™ìG“eBÿÔlî,4”v’½Z’®(m$-¥¥;IkBid©ÈR‘eE–YVdÙeC– YvdÙ‘eG–Y²4diÈÒ‘¥#K'–qIË¸Ž¤‰e\GÒÄ2.€éB,ã8’F–‚,enüõï²ÇžE67KÍ6{9m\ÓVO×´ÅÇY»W[z늇OÚ /uJÜ¥ÄÇë­¹l<˺©í{ŒtT·vÓG@ãMÅ•Å;Š÷Qo,î(>ÞKQ¼²x¨÷Ô·Ž†)Þ2‹+‹wï‰Å…Å‹;Š[añÊâLÕ™ª3UGªã‡,ŽTc¼Å‘j Ô¢8R¡Z/H5kQœ© S¦*LU˜ª2UeªÊT+S­Lµ2ÕÆTSmLµ1ÕÎT;SíLÕ˜ª1UcªÎT©:Su¤ø(ŽTc —Ä3R¡\Gª1˜‹âH5†sQœ©ÆçÌ’G§Ö¶*£k–¨»ºùˆêvEõ¼ðнÉW6¶cÙ÷ŽÜ½úáîtóñeq½gȲüèž!ëÊåŽ#ËãkÙ¶¬ø¥R[W=|ð¼,}qÒtÌ»éÍÆïFúÆÎ¯[™ÚÙ^[íÚÖ‹žOh™Å•Å;ŠÇ½aI\X¼±¸£xÜ–Ä+‹#Õã-bI©o â©oKâHõx£X/Hõx«Xgª£÷ì­§œ*9#èèE·–G³®›§ÁçgKµ].ÓôeRŽïìtœ2³.~ÿÝëÂÕõýáöÝśó­æãm¹Kl³llÝÀÔ®í­·”zÚگ翤s!A<&C’xeqCñ˜IâÊâÅcJ$‰ ‹3UcªÎT©:R- ©–„TKBª%#Õ’‘jÉHµd¤Z RqgªÂT…© SU¦ªLU™ª2ÕÊT+S­Lµ1ÕÆTSíLµ3ÕÎT;S5¦jLÕ˜ª3UgªŽTc Å‘j „£8RpGª1Nâ©Æ@8Š3UaªÂT…© SU¦ªLU™jeª•©V¦Ú˜jcª©6¦Ú™jgª©S5¦jLÕ™ª3UgªŽTc Å‘j „“xFª1ŽâH5ÂQ©Æ@8Š3ÕQ´ÞGÂ+Q±}²ä.m«]N¶1®Óè|ºâ*JøÝ«¿_^ܯK§±eáên}|ñþý£…×7Ÿî§šÝöÍÇ‹jE6žum¼Q¼'©)óãF»­âÅÄ£xGqeñŽâ£xGqañÆâŽâ©FñŽâLU˜ª0UaªÊT•©*SU¦Z™jeª•©6¦Ú˜jcª©v¦Ú™jgªÆT©Su¦êLÕ‘jï(ŽT£xGq¤Å;Š#Õ(ÞI¼ Õ(ÞQœ© S¦*LU˜ª2UeªÊT+S­Lµ2ÕÆTSmLµ1ÕÎT;SíLÕ˜ª1UcªÎT©:Su¤Å;Š#Õ(ÞI<#Õ(ÞQ©FñŽâH5ŠwgªQ¼çQ„ž9©sc›«§TóV»íâ½NWåÓuÉã@¯ëTŒãÂ_?n—«’ŸÁqÓÐøZM²±Íu S»ºoñ•¹úF»©Ön†â=³¸²xGqK,.,ÞXÜQÜ ‹3UGª1‚‚âH5FPH<#ÕAAq¤#($^jŒ  8S¦*LU˜ª2UeªÊT•©V¦Z™j ÕêÖdëD¿5‚‚âÊâÅ{bqañÆâŽâVX¼²8Su¦êLÕ‘jŒ  8RGª1‚‚âH5FPH¼ ÕAAq¦*LU˜ª0UaªÊT•©*S­Lµ2ÕÊTSmLµ1ÕÆT;SíLµ3UcªÆT©:Su¦êLÕ‘jŒ  8RÏH5FPP©Æ Š#ÕAAq¦w I–R·L†#búCV9]#7L#(q–6].#(ˈÑÉÏr~yXÿþøþb¹•Û²âæaPe£øËZSÒÒ7žeÝÀF¨:¢Eu£ÝVˆâ•Å ÅGˆâÊâÅGˆâÂâÅ™jeª•©V¦Ú˜jcª©v¦Ú™jgª©S5¦jLÕ™ª3UGªQ¢8R=Þ½›Ä‘jT(ŽT£ $ñ‚T£ Dq¦*LU˜ª0UaªÊT•©*S­Lµ2ÕÊTSmLµ1ÕÆT;SíLµ3UcªÆT©:Su¦êLÕ‘jT(ŽT£ $ñŒT£ Dq¤U Š#Õ¨Qœ©ÆÝ`Zw—¼U¦½X@¿v¤l‹Dæòn³ ìÓm¢ \>IûÿþR. w‡‹Û7—ßîo¯ÿz´þÅb0nÖ›{±çZÛOÍlﵞæóOíæ~}fqeñŽâãmÅ…Å‹;Š· ¯,ÎT©S5¦êLÕ™ª3UGªñ„(ŽTã+I<#ÕøBGªñ5„(ŽTã‹Qœ© S¦*LU™ª2Ueª•©V¦Z™jeª©6¦Ú˜jgª©v¦jLÕ˜ª1UcªÎT©:R›¢¡8R›¢‘xFªqS4GªqS4/H5nІâL5>S¨Ù½ÚVüÅ®¶§˜åønÍr ùFÕ`wE+§›÷›þR3Äû7×_¬ÒqæðøÓòÆÆšO­Žó†Ý[\,<µš:Mq¤‘¸°xcqGñ8ÒH¼²¸¡x|‰+‹3UeªÊT•©*S­Lµ2Õø"¡:¥lý§š+ÅÌâÊâÅãË„H\X¼±¸£x|¡‰WgªÎT©:R•„TãÃ.Gªña‰g¤v¡8R»P©Æ‡]$.LU˜ª0UaªÊT•©*S­Lµ2ÕÊTSmLµ1ÕÆT;SíLµ3UcªÆT©:Su¦êLÕ‘ª&¤ª ©jBªš‘ªf¤ª©jAªZª¤ª…©/•Ó‡V_[ú/}øZú­j4/ þx~öíøûÿAú,$ endstream endobj 1204 0 obj [ 1203 0 R 1205 0 R 1207 0 R 1208 0 R 1210 0 R 1211 0 R 1213 0 R 1214 0 R 1216 0 R 1217 0 R 1219 0 R 1220 0 R 1222 0 R 1223 0 R 1225 0 R 1226 0 R 1228 0 R 1229 0 R 1231 0 R 1232 0 R 1233 0 R 1234 0 R 1236 0 R 1237 0 R 1239 0 R 1240 0 R 1242 0 R 1243 0 R 1245 0 R 1246 0 R 1248 0 R 1249 0 R ] endobj 1201 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1204 0 R /Contents 1250 0 R >> endobj 1251 0 obj 4211 endobj 1253 0 obj << /Length 1254 0 R /Filter /FlateDecode >> stream xœÍSMSƒ0½çWì±=7 iÂÑŽ3Þhq<” ‚â"êß7TR†žI»y»YÞË> endobj 1254 0 obj 310 endobj 1256 0 obj << /Length 1257 0 R /Filter /FlateDecode >> stream xœÍ”±NÄ0 †w?…GŽ“6ÉŠ&"N7Tw=®•®ñú¸MO4…Û«vþØî—üj ‘ä¹êƒ·ZypÛÀqÔ5:FSŽRAÊrAdP[Å6˜KúžI§LBV+ë|ƒïa½‘š’ô}>ŒzÕ„m,|I|SBC¤üòW¹ÁÎ9Esã‡1&i¢¤‰ýV2_¦·dJ:AŠg‘é1ý£'Ï 7Ú½ ¶¹ÓÜsõ]e µ{‡›×wÙÊÇÏ!Œûß¿‚c¥­Avµb,16¸¾xªºO|xUø\ïë®n·56UûU.7á6?«\áã endstream endobj 1255 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 1256 0 R >> endobj 1257 0 obj 258 endobj 1108 0 obj << /Type /Action /S /GoTo /D [1258 0 R /XYZ 72.0 673.089 null] >> endobj 1111 0 obj << /Type /Action /S /GoTo /D [1258 0 R /XYZ 72.0 477.253 null] >> endobj 1260 0 obj << /Type /Annot /Subtype /Link /Rect [ 211.831 759.389 299.091 768.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1259 0 R /H /I >> endobj 1262 0 obj << /Type /Annot /Subtype /Link /Rect [ 139.675 621.853 177.175 630.853 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 56 0 R /H /I >> endobj 1263 0 obj << /Type /Annot /Subtype /Link /Rect [ 184.63 621.853 364.89 630.853 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 56 0 R /H /I >> endobj 1264 0 obj << /Length 1265 0 R /Filter /FlateDecode >> stream xœíZëܶÿ¾‘/O¤V¯|Kà8hQpo‹ 0Œ‚«å®„ÓJ‰{ëë_ßáSÔk}íäÚ¬ýá8#΃Ã9#íü²"(€ÿ7òOº&8M3”W¿>A EalXQ€×4 ‚‘5¦:¢!+B•”ñÔŽàÏ`.ÐúyU¯ôÓêý˜³CÈWÁ‚r¥ênõÎóÍL€ñKò/@‡Õ›ÕíÛ‘mö}ˆÃ'ë$H¡‡4“ÿ(ÚÑûoÿÖÞ¡#«Ùy-^}@›¿¬~Ü N_Úzß \¼$I‚ƒ1Ž”šPó€£5ÊGGƤ¶2àèè¿‹.ßá)„^ŒsËèI`!Y–d<Âé>iz 0/fuS¬Pé×ò¢×éä¤ÜqŽ^¡›4Eߊ ó‚=ÞZ’m›“°„ÓI §aeáÌ9lù~·Ý95»cY—h™(›z¤‡RÀyF`‰k:Ñc5ìçÓþÔ‚ÃŽÜqÁʪÖþ¾›YVÍŽÜñËãCõôz¸ªÛ·±ñ=“Å8 aï“”L{8m«2·ÂÓ€‡tYÖš>—U5 l FÓì^-„à5„²ªÜ¸V—{òq`ÛªŸ+7ä¼}rÔ©ÓñSĶçïøž*ã®<‚ÎÖ„K±–ãEÓÇqÇÓU<´å#|1b¬ ÒμŒ™#Z˜*sÑÇ Ïy×ÍÀ€Á-wµc`Ÿ¤¡¶y.Äv;¾CRXA¬\ŒþÑqõ”Apáe}@`¦”5GÌÎE `å I?5§•u'`#ÕiÀ6"*ø8D ΙêH¦}ú™µ5XYŒ"Ȥ»® %ó½Zxb 9-ïqÌÉ2”…—¡ä¹í¾ó8ݹy1Ô –äMÑñð,´ÍÑ#¿1HøÆã™²ÔÙòŸƒÕÂÜD†Jšñ&Ââ³p´xV×Í©ÎU1€lØâqØqJ$Þâlª£?§3'²Ü³¸™ˆ"V•¼†Õê—ȃ«êMSÿI 8“5 ¨¬ï‘¾gKaÀ ²C@Á@{ÐÈH0M¥i8”àÈX×3cŠÑFÂÝžT² Ÿ†8ŠÒ,K匉¦®`-÷À9«‚„³,hÎè@LÀÝž`ýÍ^þQðZž)uyÙå’YG8#hH´Æ9Ç1…D9NIq‚ãD&Ë šý(MâØYa²,æ™{?–$Çv¿§’…ßÝÞª\ˆ;ØÿœÃi;p\sq«¼¹-!q!ŽãD@3ŠSˆ+YÇsª?L¦Ã¶SyJ/¯A_NÇaµG4òRbÕ$È·o³É• J¥Ñ$œ3:ÐtwÉEaß?‹¡éMà‚Ê‹2/@8Â,f¿‡óf)Ô°ƒzÀŽó¢)sÞ‹ØÑ#«NÜ ³Y5öª3”ÎVbÛÕÔ® ™dY”Fƒ¦–(±éèIû»fÏÉ›Z´MÕ3Ìä†e®!ÎŒz‡Rë#î ÕN´´F _Íáõ¡¬g/Â4ÒY$éðžÑtÙ?Ò­1†]»!s#Ø:76ÁЄê€ìM°^ضúXÛ5Ï{1ÓCjr7Þ6ç Á6övÔõôÚWЛ:«fL§o&Rë`|a«ó  ±n*÷’§ßz0¯mÙâÉËVv²ÜwBµüÚ•~Þ­þtHnv endstream endobj 1261 0 obj [ 1260 0 R 1262 0 R 1263 0 R ] endobj 1258 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1261 0 R /Contents 1264 0 R >> endobj 1265 0 obj 2274 endobj 1267 0 obj << /Length 1268 0 R /Filter /FlateDecode >> stream xœÍËrܸñ®¯àQ®ò0Ä‹$®[Þ¤œl²öZI*µÒš¡4ŒgÈ19#­óø÷4Ø ’D9¯Fƒì'ýz¿\‘(?õWÎIœç2Ú¯¾è}e4b©ÞIÌ©HS£é–ˆ ÇZÐaMÞxýýª¾J¢?\ýzïì¢ðž¯ñžÔ§«–lúXOò%ÑãÕ7W¿û½ˆHÝ<Œ&f@!¡I’ä$ÊcF¥úF7Çè×ë›}§Ó¡Ú窩£®lŸÊöÍ]tóÇ«o&j³$‰óïMëÁk²,‹“¹7õdîÁRT&‚ÌAä2ÙA ðo¯ÈÉBâÄxéHßp~J³8#DÊLJxç'"$ yÌw£ÞÒY¨’«'šPØlµúàcYLs¸2db…Þ2­<êþ—âX¢òÊxËñ<¢2NR¡prDjˇÝý.B<óf–ÆøÏ–(·”f³÷óÐûÑÙy³£æ!ú¥|x÷à ³¥zHo‘Å‚HØWOýO_ëæÔU­»tèž³8‘)PL3[wDs˜+çK”èM´É¸„#¾þu@\ð’„6.e*Å’ÂæÞË$2€h±(þœD?•K»ûnsjÚ³_‚T‰£Kô»UÚÀ“8|JÚûÍM¤ðã­Rž&Š‚rê~W>—Ãy³+ÎÅ}Ñ•^AXBdÖ‘DùJ„¢²Kã,x+(3©Â5Í–6?ú92@4œ!^2ÏÊzÛìªúÑÏ?çôUªK; .ãmö^Öê>û ç52P’Æ)‡àÂæ¯ü2Ð<€¸Âün5T‚*:|îý‡M±Ûµe×ù%Š@žñ­¾Î‹ ò%wÙÿ½?&âÇ{•ùx?W1UR‡6Ÿ1‘_'PˆA!ȉpÈð'¿ Pqø_'C ]–Pé,e8Âs@\á†,‡È!Àó”- ¨y(ŸJ¿øñ×èÎù˜–ª/ã3I²ÙK?y¥Üñ:È$x8o(\n¨Y”Uªƒ?q‘„…ðïŒàHh,R]°-IlN~攇0WhO(”íª5!Â%~¸R„¶FP<ÍoÔ\Ș0%¿“ÄæƒŸwFB˜k4ÏT °Ä[Røðþ]øà)%!ü5êSè“ ¶*$âRÿ‹Ÿ9'!LÃ{•‚Â¥TÉ)sݸ¿`¤)a¾NŠŒCwžô¥¿Cˆ@n„ÆÓø:¤Šòp¢Œ».ÃæS _!Ìî¨-Ë„¹nÎå¦Ûm¹96»@ ø(¬Ñƒ“‹S÷?_¸ÌºCf¥*°T˹¤p®Ž­y½s$è§/ù­"À¤,ÑÁ}·ù«W¬”…£»ÈÏ.BoÎ,O]<ŸüÊ4„ä)¡ÂUw¨ÏKž 4CI3ÈTõCpq@`áÔô·`CÀ såÖ„ÀÁõk ße!Ì(kÒ$æ~ÌmS?ìª@œMh=¤-…°’*Gä¹Ëó7ÿä7 hK¡¦ ~ÌCu¿»¯‚úB¥ pçbð:§Êua°rÄ·ÄQ¦-ºþwðÖPÆáXHê ±)‚·&€yg±ÿµ85ƒr(&/Uñf)ÊÖ/ g!Ì»ÿ®ã/¤)¸hÆ…‹`à™Ñ¦Å=TÊåÐCÜ^ ±¸Ý K×Zhz¡5•>öXwì=J/Í ¯g@¢ÛëÜçÇ]eñÝ/«‚¡z¼´ÖPnb È|Sk¨6+º—.£ûòÐ<ß¾‰@p0\0É2Ò'é Ë“˜©…@¤Ð‰YtܨCR S@_Pf"5®Ó—M®›$:NÔˇn$«UýÔ|.ws¶Û}¹ýüÖ¼Îu8 †X\Nm±( Yò dU‡ò‚ΔRW¬¾Æ†«Ü‘®#¸ïŠË¾º`Qß %\&„P†¼îk•áËmèÔ“Šëçž@3O¡ÛÏ’|ú3‹§ÎJ9ÃùEç >8)GôZ_ÚèÖÚ]–íì½ ©3°ÀÑÔþÏÕ„_ù&% çÒ–|²ÉQ»ç(Äìä•%™YBIw.ë¢Þö2Kè·è>cêAﮡÁBæúÕf\k9¬‡{‹¨ŸÓb¤ÒÀ¾x*=ŒÚæ©ÚY‹q9ý´{¢bšJ1ï·k»m.X€+ð0¸ð¸…ZÎë¥f6ΧÇîKÏR¨t £-®OhÞN7“¸Ù—:z­m‚€.s5™Ú,”¡‰ëU]lÔÑïÆ=ô­nܸ½†ó­Î¥[F|Ænß¼õˆeº¾‚sEÎõT8V›Ía„†“C‹ ½O7ž÷Õv?‚{,_ô³V«„ ª¨ª®Ü7+‹øD"ûÆh©šdŠxܰ²7ÍÆö…N·4…HæñÚbuc5ˇªW:×"`‰¤ß;´e±ûj`H«v«÷~„˺9¿5@Ÿ|q©³¦w>—ÇÓø°¿„ÅÔ ‰‘ÍÏJøçª+_æ k ‡Qˆ €Bf©H§þ1? Ó!SëÈ”¹/m«»eBÍÚé¢W}HîW:æìâqã°*•¾Å­F‚…¡U¶­.˜8B.¢ugð–vÉßYÇõ“ÎD}»ºøgs=ÕJ„}õÔ/ЍnêͿʶÁÍm³3ìK…§€Û* ä<*É‹µ¤‰ãýÀS)…°Ä˜~¸â/pàO1?•8?“c»¥Eo„t›Ó¯Mlp`Ù.…;ÖÀ¯‡p—J=Âë7ô€ª†&b蟤îûjU @x‰ÇÝ› Sü×z‹/ó{hJé ghÁÔ÷g¹UôF ô¹Á~ˆn¢¡¡ÃÒ í«zËŠnzg8x=±¼$2î/´XÚ>e|¦¾‰›¹úÁÁ4x=4öw=8kïú½!÷À¬³Òo˜aìápmz8ýj³`öjN#Þç0Ogº;0œ©_qmuw¸QŒKûhôÃY§·­&nxQ‘ÇØÆm`-ÐÞB üEã$Ï’"°CÇ@'ÇrÂôˆøzŸÇL&RJ\‚ø{9h'C˜#ï¡™s.42S¬yŸGxLtxÃ¥îó°7ÌmCP÷r˜VA«“Ã÷&6 ³n,ÚÍøºžJöëI` å(PÓlíþ€dc€ëi€{C°Ïìþ!ÝÐ!0*t€ÐÐ TXHV€&Ó#¨»ÍJäš5š“­³>Kóy¸b´X”¸£  õC™´ªb ™BÁ¢lŠM­r7ôcX˜’aL¿Â®~0éGËŠµ¥Åß’tåƒÜç½Ã> endobj 1268 0 obj 4042 endobj 1270 0 obj << /Type /Action /S /GoTo /D [1266 0 R /XYZ 72.0 769.889 null] >> endobj 1271 0 obj << /Type /Annot /Subtype /Link /Rect [ 165.82 291.093 191.93 299.973 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1270 0 R /H /I >> endobj 1273 0 obj << /URI (http://refdb.sourceforge.net/manual/index.html) /S /URI >> endobj 1274 0 obj << /Type /Annot /Subtype /Link /Rect [ 215.07 246.973 402.55 255.973 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1273 0 R /H /I >> endobj 1275 0 obj << /URI (http://refdb.sourceforge.net/) /S /URI >> endobj 1276 0 obj << /Type /Annot /Subtype /Link /Rect [ 203.13 224.973 315.33 233.973 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1275 0 R /H /I >> endobj 1277 0 obj << /Length 1278 0 R /Filter /FlateDecode >> stream xœÍXYÛ6~÷¯àãHh"X4A’6z$ë¢â<(½V–\I^gþøEɺ•lŸv÷ÁäxŽïÍ )ÿ³¢ˆÀÿ û¡<Š•Ò(<¬þ©åI†¸¨E>Áó áˆz˜ùè€ú"%Ö¦³`Í >zº°ß£¿V銠ŸVŸ>ƒN„ØWdÆyåêfõ¡ƒ­V€õSÂGÐíêõfµ~ç#JÐfצ˜ƒÂ!Š"…9Óö¡Í}ºÚì ŽÇ$ƒ2ÎRT˜üÞäÏ>£Í/«·›mNVOõ‡D¨)%&ÃjªÜp'‰óh¿ên]”žÄ1pŸ³É1éÒ“7_CBbI©ÖRkø «^Q*–*æÉÐ ³¸*§„0¯éCIÌ´ íe¡ª#Y“wÜ Æ‘·É›Èœ§Ó˜ßÚ(g”›]ô%,ä,/ºŠb§æÉ±Ñ–19Ð×Kú¨Š¡¢ òòtDE˜ÇDzÁÚ¡¼Äחاäöëõæ!ÍŽE\t9ë Î@EÙ¡Cµßçì '¥ÅØ5Ú ;TWðÈGÙÙ”M¡âPîOÊŽóq|ýø8BLÙäf™#§Äè$¥Ü$Y=²@(µ æÁd`µ›7ÆU'ßj Êáxà0S<>ê ô*𣫏h×A»<çpl™¼¸ í¾ÌÚõÓ®O…‰:§½‚ôt@„YZæY2m—u ”ûN<×…Û+º}Ö £À²·‚÷å ã¤ÈMoóæ‰AÞV>Çø>´ëŒÛT`¶WÊaq²f>´‚Šn›®‹–yí?¸3E» ƒ¼£œíÚupŸÅQœÞ¶’Ã))ãcÒѳcÜõÖµïq œÈŒ¯™ ÒI’ ô”…m]d½9'è—ûìT¢»4;[|qY cž…¦(Ðû7ø± ¡Öš@Cðzdþ^õB31±¨t+/bê° 3éhM5ši3­$bŒÌn¬YQíÖ`Mú”&–_\"(· ÉM= ü”¦ïEêù#¤ÍP\ G “\+¡XN”œß EêÓÞÜ\@£éÀð£3´EH–Mݹu¿™¬Nh³wí²l—­¿&ÙŸ.éø"Øtš¯qQº¦q‚¦0'ÛìMô¼”Fíú²JÍyÐ7Nø M P%ÄDø;gþèatO–¹gÁù°2^wÕ0€q'.ÀmcÕ /¢±ÈºC»ËŽk˜ï»øö”»— ‹x'·Û? ÓE÷.Ý¡Sv4÷Azkº´†Þ¦ÂÖ3Ì®õaZtÈŽ_dv;–—AV‚-›±ú9>vŒqx’Lh¥e}®¿ƒp—!æUWqá¼LÝÿ<Â0Ü ÑR:ûõ}¯¡Ø×îÑác¼\Ö óNlo€ÇÝžÊAœ˜ÂÌFpn”N³ú¶¾ ÿÏTx>Ãžà„²Ä—æËÁìàO5‚'–ž€y™-»7¯g¯rÒÔ ‡™¢í•Ü>{~¹Õâi޵סÇÖ.ó÷Uª±†·5ˆM'CC—áÙÈ–)ÜÆÇLQ}Ú^%YŸpº?Øv…!®)øc—èoß½ÿ{]ìáŠ±Ž²ÐÒ‹—÷&/ ®ë½ ºŽÓÈ|Åûò,÷(¾–T¨Iägóe2Ü`µ}dbÊz9èmêqL$$Zr6¡¿/ËãkGÐò¡›å­Á©)×3ÄÚßyì=pWRê ß׋yðØd`ÌØF‚,,ä€1 sn> endobj 1278 0 obj 1441 endobj 1280 0 obj << /Length 1281 0 R /Filter /FlateDecode >> stream xœÍ]sã¸í=¿B³/ÝI}X²Ô·ëÞ]gÛëuw’N§s{´EۜȒW”âõ¿/H€úHœÇ½¹‚€¤¿ÝÄAÿîÔŸb‡EQÛãÍ7¢ÇÁ: ÒœHY®’,ŠÒ ^…Iƒ1) jÅã‰àÏh,à‡à¿7ÍMüýæ?aLDÀw¾‰^®E=Ü|ñt£ÿHúEÁþæo7÷¿fA;gâ$DIEEaš”ê¿$x<¼<ð€NµØ²^´M y÷Ì»ÿ¸ùåq´ì4ŠÂâG[õ—‘Š5ëõ:Œ¦Ñ¤Å¤H JTŸFŠLQœeDÁàßUŽfG¾Âó@úa”{9†òu¸Žã²\—%| ‹QÅqñZÄü0Ë›K¢ôŠÂ\“:Z|9]üª˜í›» W¼dªh6:0ƒaèttšOÇW|džº¿«XÏ6LrdWÞYš/’h"à÷ HL`Ä}lx0H^»¶ X]ÛZ𦾠¼\ýÁø6hÚ>'¾»‹DBRÄlÙZ«4L¢<Šâ¤ sýüš¹fïÙkÆPmüÄõ²¡²lÂøÀk¾íƒÁ¨ý¾‡lH µá(?4èÇ¡ëÀnõeõ™Õ˜’°ãE~«o vÚûk*+ÿ[-z+‚unâátj»žÛ‘àD«“R×ì¯6ëx•ÿº<|ùí6øÜÊ~ßq «©€9oƒŽ+W÷â™×—·º¸Œ ͪ¢²NÉÅü5φ_sñŒ¡n÷w—½ht¥ºæé8J&B9e®Àr:´·tŸ½I ©Ý-Œ… (ØNGÍÚ§Ý+&‘£3Ð;ÙW¼ëÞݾ>i;ô§aÁû1äÛñÊõlwy¦"¦é Œq¤©z¾Ð d(üth‡º2XÛ`À+xà ¤ó Á;½ V|3ì÷¢ÙÂièN­äVöùÀw|Wm¬7¿ÊCfÈ`G3û-¬?É'ë¯?¢gîÖaL®Apì¤áìŒ-„ëÒà;y‘àí¤Ðæ×0~´èŽmìì‹´{‰­çÇ%”y×ĘˆÕà†/Ø%-&vÙ¶ÍNì‡N»/ÍÃ|Ôµ'Þi/#A Em·üÔ[T»ì/Òâ¨Â›¡Å?¶T•ÈJÕ+GWT}}_|ý`‰GÖ8ØÞ>´çeÝ‚?/­:›&’Â[Û3)“h@"ºáĿۉšc< 9p;Ⱦ=:œ¼‡ˆâ󸤯ÊN4¸¯°¹8˜‘»ß,Ϣߖu7Û”¾4o¬bÁzù4‹*ëj Zõ-kÔ…\pîDßÃ~î[UOôfÞA!ƒ Û>©Æc* ³ßZdâb–ôœI–Q•ùåµ*3­ÌÌ9x³m+Põj)ó §í% Y'!l:1ƒo¬cÛžw–b¦µ̤7üla0.‡Öcë §VEG5’¨u[ÒåÓO¿ÿä$³£û¢S“e˜GC/+ þ×*‚º¤NTÐkª@1ë†àEÿ+Eî~ Ú“Þc0¡"l;ΠÁÙÛö¿zkx$ii monšÃÕVzÇ1ÏÏBžjv‘Á×'Ý Re jñæViØü»èå›õÊópÁñ*'½Äka;-lçŸ>ß±ª‚NN^µÀº˜ðþJ¹L%Rþ¢²aµ%ø°&`',o=Boa“™üé³I5‹cœqlÚï>e2… Ç }@C]ÅLÀ ʆ ± æÄ‚˜5.Áè#‚8ÂzUºU!~=`à­.`4®–­E¤ÝšsÙhÐiG§^·zÍ3ºèçÜ8!^MG(ÝÖϼš[%…®yl,;«XÖ×9 ;–а’"lŽCñÔ+Ä«Ýâpð©tVßAmCE "ÌãÇúsëƒ?÷XbßQ,!nö]>ÛÖqÆQÅ`3Õí–ÕÊ}/îóÕ ¶ÝzU–éÿB„¦ÐÇýÞöü¯ºÇSצÕð‹zǬ«Œ¡‚§ë‘×õŽÓuXæÀTd«N…ªÅÖ1jÜ‘œZ[QŸªásÛ=ÝzŸº‹Ç…;…üC¨eÖ”Ú3Çg{ù íîDˆPS´à‹d–ÑWœ”ú4ÙbXê‡;‘è–Åj±éX‡PCƒ°F\h(BÆŸ?~¾Ç^F¼r«?Û4ê„ß6þ„6Å~dŸ‡ r¡ HÓiù¶ú7ŽVÚØ‡œX׋íP³Î#bîÀ6œHT„ãÇ ¯*lX‰42+jà|ɱ©§Ã«Qådšy33ïåh¸/¯X©í. ËΦõÂY/ƒM¡mÜ3AF’‘ŽØhHRM4Y cÛ6ŠðÅ›vd¥ïEó’d C”—E‘¥ ˸dw¯ãå^BWÊïuö¼¯6¯ö«äU¡þ’tÖZ0h>Íxœi¤ø´ÛüxÙŸ…CñЋ0³ÐfØ[Øø±SGæwLtüÔ0î+šrçän Fž:'Ö´«ýÇætèxÍÔ=ÚˆË"/§—õ4­bÙ…vö2gÏ”5gk S€™q•?NÖLB‹š[0)‡#—ž愺»zl²gæ&Rã»O¶3]º¶uòì®ò•YÊ,Å4ÉêùT#.N=ž*·}èB£÷9àh ‡à}ûÍå**ìȰ a.ÿt­g^%ñ„çãm†Í8 ´ÇoMo åèÒBÙöØbPåÓ¬<âA„„ýlÛ…4Œt·,ƒœ’æÁ´ºV”¦“}}'ë0‚ñ×ÁYÔµ:׳Fžá¼ùæ3Ù*ËÃUžDQ–›§’§«ÖÍ‹ ^¾îÊ¢Lí áCWêHNB7âˆìL“Ѝj§}ƯïwC]OÜzx»Û‰­`þ¶Ù@ú^Èj®ïI‹³¯¤•îŽ.q¬_D“ûsH}v—¯ÜQ aΰâ M½€Ó7¸8tDØYXa•—¦m.Gé(ô´@ŸUƯŽi‡¢™±·ž$“4üiÛÆG.–Ve21@oÓx¼:¨½z„Ÿ¤‡ˆÞCTSÖ r>Ñ:þm݈d{7Dù)_ õ`ˆì¹ÿ‰Æ|1¾Ù‰ôõýiØÔb;·EÍÇ,üíO†9z‹´»^ßœ#æõô³CæeeÃgC ~Ð}ýpkéÚ™Ëþ¤—¢c›Ú ÔÆAð‰ó“?©t£Œ1V«d—ë,¦û¤g|(ÖÚŸ;ãÙš•EŸ¹ÃMéÑ”½ÞêLiG3oÀ@/ˆ1ŽW¢‚i*&C‡~zIiÚ › 92MRŒMƒ¬N?iæÕ[Dü€CŠNà£ã"MY9‚©é “ø ,R(.ÍèOž™¨)rˆ$ŽG^Aäñz¡ÙÎVÑxñ Ê–p¬ X nC[ͽ"øÔó˜ç(íŸ7V¯,OC8àDP ©xýóê“ò:³`äë0u§ÄÜaqÿ›º¿u¨÷¦qc[ú:xR˜›†È‘žøÙž(¹õ9lIA}fCÄ(|ItåÉ W>Ôüq±ÐÎeÜ#ø‚õ*¦ël³PÛ…jÌê{Ï„ˆ¾öÐàu%N‘¹À}¯.ß'¼¥Š;ç’ŽÂêÚyoœaÌã-Dã`s¥¥‘Ñm›¦l2Á!ãä‡4»ØÐÑ̩ˆSWùP~“ÇcË–* ’mì3)’È %g¤ âÓoWBG&¨ó¤ ±i,OœœYb}Cíżf—^*4 óÎצç*¤Ìî.ñŒ5â]0I2I6n«®õy‘¢üÉ*y§~oÀÝHáÆÑðH̶Oû®}’@ÚwßébzΨϱž|½K™Eéf¤èÓÙ¢úô½°Þt’)ipŽ ŽÐßCoAÙý!ádnc%þ­<‡ž#‰Ó²(sSW¿öö2ííeΡ~šRCëR_«9ØgÌŠÇHH6ÀÆWb‚•h7ªµ ³þÉ‘Å6¼?sÝH!9í4„×ÒQþŠt{I¾4™s¡A„£ú†»9Dó†éS’П…kð¼H&6‹t¡kÏ‘3¼pK©Übg‡˜ùµ b Yo7¤ÐK¼‘$Õ«Ÿ'̶3£vÆ0î©ZÓнã#ÊhleTÚ9xýÆe€­ºËhò#•«‰‘h=ö:‡ 84?¸˜áÿ•º7SCÔ[®÷[Î/7ÿcòw endstream endobj 1279 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 1280 0 R >> endobj 1281 0 obj 3237 endobj 1283 0 obj << /Length 1284 0 R /Filter /FlateDecode >> stream xœÕYÝ㸠Ï_¡·î3Çî[{=\{=ìvæZnïA±•DÇòúc²óß—2õe;ç¡¶· I“E‘?QÊ×M@|øw/ÿdqàeYNŠÓæ«’d’(U¢Ä÷â0ñýˆ±&äD¦¢„TÒÆ!BMÁŸ‰.ðGòïM½ñÉ›ßÿ’ø`wÞøo >õ¸ùìø¦€þžüóÉaóáióðׄ>yÚÛG0‚ú¾Ÿ$ó¢0—ÿ…äéD~÷td„6MÅ ÚsQ“޵/¬}ÿyúÛæ‡§É²#ß÷²ïmÕŸ'.BÖl·[ÏŸgÓ8L„2àˆòÓÄ‘9‹³L$¸üû¦ËþÂcßux™HßsoçPºõ¶AçÛ<‡O^6I"øp-c¾›å-“%”~ù^:ŠZµø|¾ø8[ÔÍýϸâK¡òÚD+ƒê\;Ïçú•8ÜïyÅÐLîÊ¥yRú‹ræyO¼ëμ/ކkXÁ÷œ™ÏTÅÐõâ¤9˜Z“ÒMy·ªJs íÍÀMÅhǾ¼÷´ÀõáÌ­‘¨«WMïÌÀCÇJMó½¦ú£Q¸gÓaLÜ(D¡AªùAa`þŽõ„…hK^ªWOEÒîôåmN"È–ÆJô>7×öy¡¾¶Ñ ƒF´ýÚ.§ %yžnÑæÖ&$m `öùÈaŸ[¶/w%©x׳º#{Ñ^âë'…¨kVH€ï<"!¿d{:T=HåÛ(¾5Ú…gh]<#óÉQêø Ni]À(êEÓÀö.+"ˆžÆƒÖ£—iêm¥×{~Z™F¬–ŒŒÛ!v–ß·ì!óN“I+^3ϲO®²NG#x¡Õà|ǘ ýðBÛ@©‡ ËÃÙ²q¼†—·¦xG^àg€&[ã_ײ/H’™ÍcO¡6¯Žbè¡4©„¡±huä1²2³<òkÇ 'Ç’-Ùn8¤r3´èXw«ßÛÔó£P"É”ßíªßY6³ù¡¦» R¬e'ÑCgX| (o_8E˜¡·F3ô3/—x—šhv«‡œjS›1š¡ð?ézÈ*Z‰zÒ·Þ‘ZôR¡¤ày}³{ãÕæ ’\¹÷x Жúkˆ¶´GÙ}w¤-»?‰rýˆ‡#c:€„¨† ÊœRœSHJ¾ÁqPâ«DÒ‡}qxé•;pGƒŒFP‚fØÁ81ùÚòÚcÙ+‘8=9ë{BJB÷{8ªºé—µ©˜eIž¥‘:õḀå;^ñß7ˆîO!y…N3ܨÁdƸ޲Gfï+£Vж5 Õ„ ë(íû–ï )ydÌ™Òá)}a¹p­™-w'¡W!ç’Q”r0-¯<¥qs-Àš¡[Ýû<]­……þj-,,z~Z-€H^7&Vºÿ‘Ö2rÕEÅYÝ?,¯²¤ä€‡AÆD¿ewkH¢(ð¶àzjàa¸’¥þZH–5½!$pFM­tH ›nåò^ò%íéÚsÉ!Z²3êþæ8¤±—¦1`Pœª8üºê#œGSUù°âȹœ [PðÜ~5m²#!I¸«Àþ´ ¥CÓ°¶ë4zc‹§ç½îcPðÌ^í\#B Y³³3(--ŒK¬e5@Œwáé…Åžè3,Š÷X“z/¬–iJ`AgÑ> yüñ?“‡–6GÎnNÐØÏ½$ƒ~'bµ1/k‡ÁÌæ`.K'£$»¶B4¯-?{IîdJÕ„}ƒ¾öfcHs8ºòÀ\þµêaÏlÇlXBàÀÍôEDSp™î’GhºþŽC {$¡¹—ñ/ëê?õã>Óù›Möj/o^Å6ñâ8ôõusu¾Ký5 XZ4´ë IÊÕheÛ™¥j­ãÔˈÆJðHDºwU XÉ5¬XÁ‡•ü&Ë´žÎïX:_(\T[Þ=;ÞKWØå c¯YÚôyY„qžÏ±s/Äs)'"(€ìg-…ƒ÷…U¯ž+¼Bæ™±Ær¯bhßOÝŠéŽâŒ òCãÌkHÜ5ž¹)"/oôÖ«¿ƒ#˵'A0[û8ø=Ø$ÐÑq¼ˆ!§/°È½âÎ!s¤/ÌQ–§zèMÜQMw+Q"ê7T{! ä½Ðr»WKwPÍg¥êQÈFø´êò¥çB§˜„ĈTaó×A6M7? ű¥Û<ós}ø}[«É$Ig6éºáÄ싌N¸ÒÀÑ0Ô€FíkÓ³›ï© 4„aGN%ʭ׫OU ýÕ·ª……¼»–|õZ §ËÌÐy ýÈÍ ä`PH.Ѻg¸h°7-•ØÑÊLïÕV.oØÃÓÉ ¿@&üÙá?¸¨ËÔk]¹sþ“í?~X&\ê³õ;m)ú";ŠJˆgà T! +å–[.L?IÙ¡¸ý@ 5 ªût…6Ö\¿ —ÖÖ< iþ\¨´4ˆf \x]‘ÜÏZ‘»Wªª%‹£Kª¡Å3=Œ—$É>¡¿’äÝ¢°$U y¸#]³Ñûép:Áõ#˜?ˆ!tK¯¯TR„×,ÕÄ¢Q›%™¡®ΧÞYµ|;5°£å…˜†Élޝá¶'Ë€c訃J¨ìº#Ì;x`´e(„0SÒ6'¢ƒ{#À¤pÔ†ò_=;ßÿv _êkð²0¨ø®Üñð%M²©¥…—­o»¤Ý*@‰–¥.z`M[.{bÃSÇLrìèh\ôËÔ;Ûr©9v²Ûzã yÈZ:.-† ˆù1™•cÿôå½Hìé ‡àƒ4¾Y#°j s”bmHj-œh£Da޲±æ.æ([9Úúædá4&ÿ3wúJmMgnø?œ<¾T—ä¿;ã/ÄŸ7ÿfÆ* endstream endobj 1282 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 1283 0 R >> endobj 1284 0 obj 2285 endobj 1286 0 obj << /Length 1287 0 R /Filter /FlateDecode >> stream xœí\[Û¸}÷¯Ð[=ÀŒ,QÊXäa›4íY ÁNÛ‡} -Ú*KŽDá¿¼Š”)ÉJ:ÄÉCx>ñÎCòð#/3ßñèß'öOún’,õ~öEÚ}'ˆ¥)òÜDž8~è‚ÈÙ;mSää,*DÿiÅ¥xçüwVÌ<çï³ßÿ qRÇ£éN3¯'sžÕo³ÏFÝdžRý¨®WÑh{íÒ¥e° Tv½E·£ñOêêaÓ˜J´Ødß­\=[¯r¥•g«Á½ðN¨Iê;ð†øÁ"nôÿr‰ǺZäåå‹z‡*¼l2’ÐÅ» s¢”»8“i‹&á—·\ϘçÁy‚1 žÙ°Ü€´b¦Y…פ¬Îש». ‚²"+¶,½@Ú€9ç=?Ájç¸7YŽk+ÿ t“€¯“@äŸgÿc¹@Ú4gþáùCýØ <ÿú©ï9"¸n,˜¬]+ÿ0¾Èÿç59¢M’O·¤q»Dq‹<[-¸Ûx1x4U&ÝÅËÄé¦ÄË2`'ýæ^Ȱ‘"”÷Au+Æo)Œ@±tÍ‹ÄRž€ àý §)¶)–Zié/È/»¤°|ÂèÕŒQ‰ºšcI•£TÞ‰‰N¨sTï4î–ŠO€c5jæºb) çýy{ÊŠ!u„Ó¼E––$±¦75½ÙôVÙ[5Ô$QÑh{íÒ¥e° Tv½E·£qA¢ ¡NÆT¢5ïÍâGÏû¼Ü¦¸¾9ºjš„º%oÀ€™*_zEˆfÐT·$•!1LØ¥ [—²Bü*I[…8€´еìºþÈŠMYíy®B Dl1ž{Fø>T™ò̀ƹ¡@MR\ÙŽKŒ¼¨ë!$\^áÕq»•²AÚÊB¾MQqÊâ/ÄÀ]—/–9í0ï+?v3¯ŽEó^‡¤D„u0Ex_/?i“¯ƒï®Ë©e@d¼0 >×tT4Þ u–gäü“6|§ƒ­,Ñõk§õ±&åž_¹).0Yéj‹$—üŒÎ8 ŒSû:-¥ çP•š°Æ„°®¥lT% (²0&y*SϾ}âb¶7[íšì7í uüi"²wåv ”iø];°^¸ˆÈå˜Qôq6ª&­±U…¯‘gŒ\ƒòìή©³ë¶þ£r+üG©Ûl“âmªlêo¿îœ› çäf ö´~¾9æ¹Õûd •»‡d„õž. £^³íS™²ïd42ÃTb¤1ýeÄÛèpëˆ<$óDæËDÜö ÐɆ*CD=âö_6:¬œC"5A•] %÷Ä„6¤ÏM!¶~øx0€R7ðù×%öžê#´•w¶üóS&%¾€+l€Ä5ðÏF˜* ëÂZyÛ¤«7f:Ì{y0°*^B*Ť€”ªÚ®ËiuÈ:#+ °–wÉŠ3‹ÈïqNÒòTدÜ,]}ÚaªðX'K%rEh—mw ÐøeyÓe"¦!mÕdij$ú'äÿWk¥)+ÖùQ]eK÷S_×ÏFn!*™ˆS—€FPd¶ø[*2qà ¡- »Ü®*}^•…5+’Øõ GYêGvT6™<ùMpQa÷ž%›)Ÿv¬k8Í(·éüÚâtHpƽÿ÷É$A`Ý&Ù–o_¬e^æJÉMRèÉÏ£d^ðµOFÙ£ÏC–^õ²Þ´o@o8pmצKÇq@hMu{…V3‚?ø( m¸B‘Þÿ—€Ü¹P70#:|¨JæÔ¹.m~ù@Ó@ ^Ó³÷Ò±€pý°÷ÏÉpS ¤ŽgÐñ|ÌR6†ONø˜KÎpEn(¤ƒ†ãM¸ßÍ >ûû'‡Êç} endstream endobj 1285 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 1286 0 R >> endobj 1287 0 obj 2650 endobj 1289 0 obj << /Type /Annot /Subtype /Link /Rect [ 165.82 389.829 191.93 398.709 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1270 0 R /H /I >> endobj 1291 0 obj << /Type /Action /S /GoTo /D [1269 0 R /XYZ 72.0 769.889 null] >> endobj 1292 0 obj << /Type /Annot /Subtype /Link /Rect [ 208.59 389.829 239.7 398.709 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1291 0 R /H /I >> endobj 1293 0 obj << /Type /Annot /Subtype /Link /Rect [ 215.07 345.709 402.55 354.709 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1273 0 R /H /I >> endobj 1294 0 obj << /Type /Annot /Subtype /Link /Rect [ 203.13 323.709 315.33 332.709 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1275 0 R /H /I >> endobj 1295 0 obj << /Length 1296 0 R /Filter /FlateDecode >> stream xœÍWÛnã6}÷WÌclh^$‘,‚ Mw· —l ´Àz™Ž…ÕÅ+Éu ôã;ÔÅ‘eJiº/ILRœ3çŒf†Ô—ŠÿWöGyŒ(¥!Jg_Úu’ƒÚ%Ÿû” `á>¤pºäCbmzÞðçd/Î7ðÇ,›QøaöñîYE»ýŒŽ€×P÷³»·vŽ_? ³ÛÅlþÞFa±~ ±@Ê)¥Š"‚kûÇa‘ÂÇ‹ÅÆ@¸Ý&qVqžAiŠ¿Lqù ?ÏÞ-Nd J‰zmªïN(bÖH) fS #š5\ií£"Ãiãåd¥QÐüŽR¦gŒiŸðy"½rã9H"ÓZjˆ:I"ÆÅTƼyçÉÂ-¯”r\,Zù˜c’p…%ÃN¢Pç‘lÅ7Ú SÓˆ·ÁsDÎSÀ5¡omTcT˜õêá Ô?¤Ü@p4aTÛÖ:Þ¹ñ’s94`SŸ”UXT»-”Qo«ŽtOû”p_Ÿi\·O,êý!Ë·e\öÅk‡x…ÝÝv¦ýžøÆÊ.é°€n7îlWöÅŸÔJG]0æ4‚&ü0Œ‹ÓQ¾÷ƒÛ‹ýxÊeS˜g$éÿ!I;%­ó"2W…Iòpõ±徇]‚·`oM“lx´m§h©žç”j)»`®ßÞŽÍ Ü.¬ä3[X^Èåå›ãsæQ ¢˜½–ÚaÞ„iâÌÖDã}½3·óº¯ùf»dwAqUɸ{¼ÿ wÔ=uÁƺsÒ0Û… $9¶+L‡í¡'ÄA„Ö9Ç„ß?¼{ÿÓŸórfŽí{^K»ºÆºì¦7^çq¶2“M•&“Ô9Ÿ¦¾7“œñd×öÎÌ\o³ž Tâ)¸cÿ¦ª¶ßÌçí1‡‡Pd°X ÉL5öô-l?†ñ†¢¤Ôì›É8xž3¶¢±Ð1 1@WÚ& Tè<‚fóÝS.Ç“1@q §°PL ÔÍ û'9ñAo¾ÛU›¼xîzçé€HÛçýÛÝOç}W•Éàá¿„Åç] ?æ&‹£Ï!\§õ·é¦]!+sCz›w³ªÌ/é endstream endobj 1290 0 obj [ 1289 0 R 1292 0 R 1293 0 R 1294 0 R ] endobj 1288 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1290 0 R /Contents 1295 0 R >> endobj 1296 0 obj 1201 endobj 1298 0 obj << /Length 1299 0 R /Filter /FlateDecode >> stream xœí\[oÜ6~÷¯ úä5CQw}H“ÝnÝ¢MœvºXÐŽGX4ÑÅŽûë÷ð&RÒŒf’M`™ÌƒyŽ(òððã9))ï/òLC´ECUˆ qS ¦uAÞ ß/Ê ‚~¼øãO¨³Bî{¸ —M½½øÕ±MW€ò’ì#èîâ‡ë‹ç‘GÐõں؇%„$J°OSñ¢ë-úãòzÃÛíŠ ”1/«rßu5‡•x_¬÷S Ž $òö…¶=±( 1ìÌ£tz7â÷¬èXË9°u.@¬LÀL‡‘Ð$ÌzEºNÃØ?lUÍÆIêÍ5"2H^æmΊü/Žò¶áÅ›Jf7࢑<"N“˜èˆýsÕòƒ®w$b:(ä˜ÐBÀ˜â Ö±òo hµ:˜øºUáOkL¬QÒ7q^óÿùƪV•-뵤–µ+ŠG«ÉËuÑñ2sŒØTVh]óìšUrµãµ˜Ëñã„ãqŠnÃ'&¦ó^Ö¡O 2–©¢ê]×É[~Õìx–¯ó¬×‚ýU½UdßèLÞRl C4Î{›WIE•ÍN„Sì`;§CävË˃ÓÑÓ( $ãéÝvü2P`Ç:^•>¥Ø'À8R ®e>ð(¦ÐXKCI }H©¢±WT¨4Õ!Tôªx±e³Ž¨Ù,0ŽÔe³WtžÎª¦5£4§7¥#ý ¦áxÔ3¨öÚrÀ„“šŸX¢.H߈í®Ãö®5‡=Ð70Óõ°št›íTO3iŽç­M³É`DÇr¯0Á<‘¤0QSgßX ¼íÝ%yI€£øÄèÄ=ƒì“@öÀÉ×OBÔ+¾f]Ñîßv{§O†“»ÿpšîÂÁidH@GèúB€;£í8Ú^V[Áµ÷¢MçÇ ÁÉ^´-"Fd™€|¾ešŸX¢.ß›j0ÞiïÁ .0ÍìzXMæ>Û)vtN§1€“Ûýþ“C2=/,ª;±‘™Ï†g@-PO‰›ç÷¬~àyn;a..C£Cn«±¨:í)¦Î"ñÜârÝE/ì˜ÅŸµH@=%n¼¹t¾P¼LçAgP=%¨ô#ƒ(NÄq±ˆKyiNÀV=ÔB;¸¡'™sYÛ9W΂StIúÒ÷} RmÙö’|4§ŠM»âuý]/{Çs÷÷ò!&øJ„¾¬­—åæ±QD‰k–åEÞ>~×kh_46é;ˆÆ¼AðšX>\í)õî÷ ͦÔEÖ¶ò1­KÎWã牅ɤ/ÁQà>`4òÑÌ–éf†±¡¿Hþ¯5I2‰Iòùbi~b‰º`V”©ãö®5³.0ÍìzXM’Ûé Œå#AÂíþcKÁïy1KYΈZ&¢ž8Ñ eY*^R‹ 3¨žTš²„A¢Sª+‰0åÈÝÎÔ»>Zös—-ovÇå;4O.ryêaDõÖ^¶Ø‘_8å¢z8N[LËÕ[iD½=¦eV@C£Ð§FŠsœ¡l+y$ÃÐe¾ÝUuËJ«1£þ¶×°¾´Éï¦~›Ðg^JU¼¹ŒÕ8´lÇaŽdL˜t“QWy™~©ïÊO"Edo;W6­aGw5e‘ û‰³²AeÕnDûræa¾sw|5G¯ÂàÐÆE$ïv«µÈ!õò_¾›¥WgD-QOz"DcLà7w2´TÜœO†.M³‘oÑåë_­VµøJÂjÔ»çZع(ûo?æØ•:Yòã@GÚ² r®«yØðÚ•å“ÎÕqJUw¥ÊûA,5½k¸Ú#¬Ô‹CVqœ-c…ÏͳŽ}¬[b›‡Pº¬{RBVä@šús%¨G¸Ç9–xG½Rou7àn¤]6ÇK"-rÓõµ/ôEò±+˜å$g4-MO š4ö|ñ(éÈR!s¦# Ç•¢#a$ÎnD`êõ±FÔŸéô’â½XäMËËÉ÷%{XÉË +ïÔ© TîV_”iq­ØŽ–ô±…–œÌn®—'pͼP~Îf>ZÔ²¢ªlLQ’øÊ¹Q|ÞV¯%MÉĬ˜Ä)¬0²ÿFP)vuuW³­Ut>aQ¢°ã8C5KGáY`4Ð:yyªùôu®ÛrךTiB /ŸÄèǾêìô}ò ló-¯º#Œà<¡&ô 'ÎKÈ\F^è”ÌÈý”}åÓª7è4JeŽR«ÓÑÈÐð¬*Wj¬U/Ö­ùïL没É8©ÊÀŸ«/˵¸aîE^°]ÃWß:*æ@Oüþ—e  endstream endobj 1297 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 1298 0 R >> endobj 1299 0 obj 2562 endobj 1171 0 obj << /Type /Action /S /GoTo /D [1300 0 R /XYZ 72.0 769.889 null] >> endobj 1235 0 obj << /Type /Action /S /GoTo /D [1300 0 R /XYZ 72.0 740.03 null] >> endobj 1238 0 obj << /Type /Action /S /GoTo /D [1300 0 R /XYZ 72.0 517.399 null] >> endobj 1241 0 obj << /Type /Action /S /GoTo /D [1300 0 R /XYZ 72.0 192.388 null] >> endobj 1301 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 684.815 139.45 693.815 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 47 0 R /H /I >> endobj 1303 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.852 684.815 280.962 693.815 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 47 0 R /H /I >> endobj 1304 0 obj << /URI (http://www.loc.gov) /S /URI >> endobj 1305 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.976 672.815 274.953 681.815 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1304 0 R /H /I >> endobj 1306 0 obj << /Type /Annot /Subtype /Link /Rect [ 281.501 672.815 359.281 681.815 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1304 0 R /H /I >> endobj 1307 0 obj << /URI (http://www.loc.gov/standards/cql/index.html) /S /URI >> endobj 1308 0 obj << /Type /Annot /Subtype /Link /Rect [ 314.638 660.815 334.638 669.815 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1307 0 R /H /I >> endobj 1309 0 obj << /Type /Annot /Subtype /Link /Rect [ 340.774 660.815 519.944 669.815 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1307 0 R /H /I >> endobj 1310 0 obj << /URI (http://www.gnu.org/software/wget/) /S /URI >> endobj 1311 0 obj << /Type /Annot /Subtype /Link /Rect [ 335.852 624.815 355.292 633.815 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1310 0 R /H /I >> endobj 1312 0 obj << /Type /Annot /Subtype /Link /Rect [ 361.094 624.815 502.194 633.815 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1310 0 R /H /I >> endobj 1313 0 obj << /URI (http://www.indexdata.dk/yaz) /S /URI >> endobj 1314 0 obj << /Type /Annot /Subtype /Link /Rect [ 212.975 612.815 233.525 621.815 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1313 0 R /H /I >> endobj 1315 0 obj << /Type /Annot /Subtype /Link /Rect [ 240.103 612.815 356.203 621.815 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1313 0 R /H /I >> endobj 1316 0 obj << /URI (http://xbiblio.sourceforge.net/citeproc/) /S /URI >> endobj 1317 0 obj << /Type /Annot /Subtype /Link /Rect [ 140.27 588.815 172.48 597.815 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1316 0 R /H /I >> endobj 1318 0 obj << /Type /Annot /Subtype /Link /Rect [ 178.31 588.815 332.74 597.815 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1316 0 R /H /I >> endobj 1319 0 obj << /Type /Action /S /GoTo /D [1297 0 R /XYZ 72.0 769.889 null] >> endobj 1320 0 obj << /Type /Annot /Subtype /Link /Rect [ 333.446 566.899 374.81 575.899 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1319 0 R /H /I >> endobj 1321 0 obj << /Type /Annot /Subtype /Link /Rect [ 351.211 530.899 427.174 539.899 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 563 0 R /H /I >> endobj 1322 0 obj << /Type /Annot /Subtype /Link /Rect [ 381.638 435.468 445.752 444.468 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 566 0 R /H /I >> endobj 1323 0 obj << /URI (http://www.loc.gov/standards/sru/explain/) /S /URI >> endobj 1324 0 obj << /Type /Annot /Subtype /Link /Rect [ 308.52 343.636 325.73 352.636 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1323 0 R /H /I >> endobj 1325 0 obj << /Type /Annot /Subtype /Link /Rect [ 331.56 343.636 499.89 352.636 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1323 0 R /H /I >> endobj 1326 0 obj << /URI (http://www.loc.gov/standards/sru/sru-spec.html) /S /URI >> endobj 1327 0 obj << /Type /Annot /Subtype /Link /Rect [ 506.065 309.72 523.275 318.72 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1326 0 R /H /I >> endobj 1328 0 obj << /Type /Annot /Subtype /Link /Rect [ 141.33 297.72 331.6 306.72 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1326 0 R /H /I >> endobj 1329 0 obj << /URI (http://www.loc.gov/standards/sru/scan/index.html) /S /URI >> endobj 1330 0 obj << /Type /Annot /Subtype /Link /Rect [ 200.77 251.804 217.98 260.804 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1329 0 R /H /I >> endobj 1331 0 obj << /Type /Annot /Subtype /Link /Rect [ 223.81 251.804 423.53 260.804 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1329 0 R /H /I >> endobj 1332 0 obj << /Length 1333 0 R /Filter /FlateDecode >> stream xœÍÙrܸñ]_ÁÚ—XU†o¿¤¼ÎÆÙ”rØ–ËIl?p8˜–9䘇Ž|}h HÊ£³•rwh4}~\Ð „ÿ®Å?yLIžAuºø¡è4ÈX¥Š”„$fIF K‚S°&%A#ö,6CðÏj-àÇàóE{ï.¾|ƒ5» „}÷áÌ%«ï²©ÿLò-%ŒÂä?Ÿ€ïלe 퇗l"¤9ŠO+AlOYQðøï“"‡ŽÄ¡_£ó›ÿ4Â…Ááâ×Û‹ÍŸA¦0¸ÝJ3’QZYQÀ'’³Bü·§àË+æ—߂ۿ^üv볘Ÿæz®±0!—Ø•!j¯î,†ø!n¹RC0JXž…a˜¦xù·Çò<ò> ”øþO¿?| êhû²â¨yò—ÌC’A$ZsN2’ÐH¨5Vj¥x~>–#²‚²i‚rÛMãÌõà{«8rFŠPðŠ"ä pÏòEãV¤Eâ..ƒ˜‘Ü|½Ô¨[sÐÐ|CXŸuî»±«ºÆ^¤ˆ-w FÓ¹àuQ±{ûhàñÈ b±£`?E–od.ã›zÛ—ý‚U·7ðÛ®=ô|œ—}&௬ˆ\Žf»m,,HRx“ÐsE×ìíyÞÛ“»Áä<~š“,‹Š<Í™gã³Ñ úÑlêvÇÈq<9îg¤ˆcˆÅƶ]ˆÇ ¹µè«0õ‘?ŒSÙˆ+äâ=ßϺ•ØRí×K¢ioZóœùЗ'"ÏHU¶¸ 1ˆ”úËíí?5òî·[ ÷y0¼Ðä¬Ý=?u#7gÔ ´èѼR‚ÖÒB¥¦žW¼–Áî¢}ªƒ "¦f¬Ûƒ!ýëo7ÙuÕtâíh(2$*¼¨–øhHÃ2î ^.–—Tn‚HÕÔp1„Ûãò”%̇3¯êõ‘c?-n´ïzZbf©å±›zØÄT@˜ÁmßÝ\Á´!Aà;ƒUw:Á—ë¦nùL›Æº©ÇZú;ðñ]t|&’ 4‡øííþÀG'FFö å2ZxvÌç8Ι$,À#b¨¯Ým ç<´éúÃfèöã}ÙóÂNÕ1-f—tØ9.E$ashp–_iOöuÅ‹%±µ^ZO‹;¾»Sv†$´!ƒ+õ+ÌαÌÀœzú÷›ÿØëS 7B)*<ëÍ1¶þ)G é´Hóȳq¡wåX’Ý÷Ícù_ç!¡Ý Ujv9IRj10°äYyOå£A¶ }º~U]{ÇÛµ~Ñ"JRÃgZ,ƒ`ãyÛ4µD:u XÌ2".²¡È¿†ò¦º«Å†îÄ—Ú°¡œËê;ÄøÁPz^î ¶­·M-âüùXW†,ÞÃ`û¾;­¿‰"bÁËH…¸µ¶¸x–[ÿúŠ“\Ì*ËsÂRQ–§±gOÒRe4Z±Èàtî®À1NÈ©Rà¾õÊ8P7d€xYqxõ'-„†Y§œOE[\Cy¸:–šÆ$T1Ÿz.=E%S{ä2l¹.E÷$ò…°‘´MÂtƒ0„÷;á­Ês¹5±;Q9²ï¦ÃQ㥆ù)tPiHãØ#×Ûw¿›c«¾>Û.‚’;ŸßÀÝ¿GVˆ@êZHßj¸;uתܨTÑBµ%sÆ—\<‰RôWk09Æ¡³êˆÆUžFä¾–!2—Ü k;™*ç•ãÑ|›KoDe„ JÑj#†o‹éÄÔ¹; ÷‹®OVNïÑ„hþWšPá +” dàl„ÖÑ(›fä}[ŽP‰5WŠ8sʸA ^V~š¯*Œ¹’ [ï§AÓj”âÍ@yWÖM¹mbDô3ï%¿a97’“×ÕŒ/… T*dNs5„ú;4!¸Ë7„#,Q¹c6 ¸Õü$Ø ÐRè¯*´Å&²I°ŸZ³‚Ï 2¢9Œ×•þ2 ØÄØ;œ€[˜>×6Šy>7¢ÈÉmYD²„A̧¾«“™Ãï{Ͻ”K()í¼üâØâ·Š×`«Ë° pa/PÑ\ ¤ÀrXì(wàUM "Ÿ>Ü ÃÂ=G¯T{ˆ¤_TapzÜvZ¡Mu¨¯·u»ùÅs›$µn#cÿÌ£é {¸‡˜~ æO}ˆŽvnd‡×Êü¥3IwZÅ s(´³\yŠuÆi–÷‹!]®—ï¸Hô[¬ Å@zVµ„u<Ö”=¨WH’ÉEíåýÉ|À^ˆõkÕÉ $¢Cuä§r¸zæ Ùa,NÁܨ¶w挖hø£Læp÷ycÈ‘ëë—H=9‡ŽþîÞõõ¡†²$­û^ù”˜dÛá ,¡2f™‡õ‘÷¶¿°×B .Gã"ËC5W~)’Q&†â*’¹Û=†H…[g*’¹;Üæ=¡¦qôœð¢QÂÛ?={1ïîy–{¸Ûv%Ð*%¢,ÏrOVO"ˆ˜bøAÄÄ¡›,‘®)ÿƒ˜êã†ý·BL­x=,¿-x@Gg¸wÆVF»aØq€Ýìí »ÁŠr°›ùçWC=ßï¶àÓÏÿ9ÔÏð0"AäyèxÖpš`×%îd̺‰×Á“MÂ,ífÑÖ&óŸ]È~Tü,²­ÕÛ¦!4ZX4-{[ŠE¦ªÌL+ðÒG¤,%¨Cþ8¡ZV9~ÉE“3³›qÍVSpÄ’›^ a]Ël¨vî5ˆƒ8KûU°†]gȰ{ÃG”:ºûn7UÜ/Ác;–¾ó—«Ð—5?ôeO †^ÙR“Ž T³ý„ãFÄÔ0cÐL$ltŠø*## xUŸ÷^.«°()ª{UKñ)ƒ›uQ.Žˆùq1¼ôÜ> ­Û _®Çמ¥#Uµ'ήK¬u‰oÝË®â9­ˆ ‹(”¤aöìiκ—OûãâϸÞ_üWKÊÉ endstream endobj 1302 0 obj [ 1301 0 R 1303 0 R 1305 0 R 1306 0 R 1308 0 R 1309 0 R 1311 0 R 1312 0 R 1314 0 R 1315 0 R 1317 0 R 1318 0 R 1320 0 R 1321 0 R 1322 0 R 1324 0 R 1325 0 R 1327 0 R 1328 0 R 1330 0 R 1331 0 R ] endobj 1300 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1302 0 R /Contents 1332 0 R >> endobj 1333 0 obj 3079 endobj 1247 0 obj << /Type /Action /S /GoTo /D [1334 0 R /XYZ 72.0 274.773 null] >> endobj 1335 0 obj << /URI (http://www.loc.gov/standards/mods/) /S /URI >> endobj 1336 0 obj << /Type /Annot /Subtype /Link /Rect [ 138.0 526.088 166.89 535.088 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1335 0 R /H /I >> endobj 1338 0 obj << /Type /Annot /Subtype /Link /Rect [ 175.439 526.088 320.999 535.088 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1335 0 R /H /I >> endobj 1339 0 obj << /Type /Annot /Subtype /Link /Rect [ 452.459 405.287 481.899 414.287 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1241 0 R /H /I >> endobj 1340 0 obj << /Type /Annot /Subtype /Link /Rect [ 176.615 381.287 209.935 390.287 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1319 0 R /H /I >> endobj 1341 0 obj << /Length 1342 0 R /Filter /FlateDecode >> stream xœí]msÛ¸þ®_ÁfªØicßÓ¦í$é½ÍÝÜ$q¦‰ó¢ ‹JTHÊŠÿ}\_ÄäœäÌŽéÌØØ%°X,ì>PbæÃÌ4(ü9?|Û$¾ÑföAêMÃc†åJ•C‰ÍJ-ô sŒÑT9F"Æh VµàG£/Èkã?³íŒßÏÞ¾ƒ>KƒÂ¸ÃŒ1^šz={©ù&;@{LþQãjöìbvþc˜Ô¸X©[&±,F)õ,Ã' Ä3.6ÆÛÓW|õâ™ñúÕ#Þ<[…ôθøiöï‹Æš-J‰?¶%¿l¸ñ<Ð6”J3ê@ƒÅ£†#mgihpøó¨Ë´ã1Õî¢h4ÎëÏ4ƒÀ xDü‚LÓBÌh–× kâÄ);Ÿ•ßËgL4¥QœÒÑÀ'ŽëSj¶%œ –)B>cÃ^£]œ£c óNK­÷3]â5gMŸGfÿ ÓmP_D Wö‚evf–Šã ¯ÇŸ·Ù« –šROZ¼•GƒÐÎRgÁkŸZžÇ†àØx2¾KŽåMÓ1 uý!X±o…+6ëwë ¤oå­Qtˆ‹u/„˜#ø‘;Ah‚Ð$"ËaÄ£öç¡È7¿Š*ÛŸBQÓßlcêë£l‚Ød)dO`·]S.ºkžTæ›"¨ss ÝûÂÛAž4h,ºkœÌgƒthBÊ„DÊ»AÂ3:œ4 ÐÄm&(}fÒy1Àn,&ÌŽJ÷'£e7ÿd7€Æ »ÆÉܦƒìfBÊ„DÊŸÙÍèp2±›ñBiÎúÿªÙŒŒ(ß[œŒ–ÝüyÝL €î'sf²› )R)ÙÍèp2±›ñBiÎÜvã:##Ê÷'£e7'ƒìfÐXt×8™3oÝLH™‚H¹<¤7£ÊDoÆ‹¥9óèÏFÆ”ï-NFKo. ò› AcAÐ]e΂A~3!eB "å/ƒôft8™èÍx¡4gá½eŒ‹)ß[œŒ–ÞüuÝL €î's¶d7R&¤ R²›Ñádb7ã…ÒœEC¿5e:#cÊ÷(£¥7þµ© AcAÐ]en ó› *T$TžÿâÔè€21œñbin-‡ŽeŽŒ-ß=P4Wñªõ¥ºó©Ýøú´Ç»¦†9Ï„©ÏÀûz ú¿LKÌfCˆ&} D†yÒè t”'yIò†ñ¥;ô-ñÕ"ˆ#Åל1 aâ=†6tˤ…ò—vÛ†g‹¹”ÚÔªÞÃHXùÇx­ù&ÌѤp¤Ç êgà“YàEóe à9 ˆeœFáV“2^ì3]Q¬¹&-Ã"Ìy‘kª}o¯ô‡T¯V<ãÛBÓý÷—Ÿ5)Ç…hšÃ:ŽÖš|“îüý°ç¹n]¼¼¨é?Æèü;“öˆQ¯ ŒGi¶ÄøVC;¡5íjìÂ,Üð‚gO䯷Ûܘ”ĵh¸üåׯÕVÖ]]×`¶y¬kÝ-°Å»uáË ºýE,)0ª·ò¨EP‹ØV@)µ;p]»'çç‡Ã$iD®Òëó¼·Ë0[æç›¾µÌ1Û'Aàc<:æÞµ{Cfµô¶á< yçšjmDަX¥™&-âE§WY¸%½yõ³ÒÕ‘1Érž]Ç‘öô²Ù9Ýj‚¬S(ð­<ÉrŠTµ¯¸æ/V3l·vvØN@MÛz¢Â?î’0Þ¶ÙPö|H¾볞Aj² ¶r¯þÅhc <»5J"Xbä=ØûjQe»ŠD),å^¥úq›<\jVª]ss~ͳ0QŠ(ÝÅ<ï[íG)<ÿþGÍL”Å»¢ß]}cKÅ&͸n4ìÂâ»­°ÈUÃYcjÕ•ªSpmâšvxâíkpØ–‹<Û·GY ,1Êé¥f “$=äJÆc»J·êáZs]œx%ax¥Íîú”kg½p¹ŒEiÄMDÝ.”ÄLÅ< ô‰{‚ ¿¹`1œebYêÃaã¡ø¥’ÔYJz;7qfšéTµ _uùt¥û+Í“P3U„Ñ{%ê+’72¥ˆÄý³'.nЊ‹ ­]òä|¿øGåµåU›á¾XkbÉ~U¿mÝ„íÙZB<ÚêQKÈ å¼5ÏsU)ÁVL^öD°ÚÚmÀ–÷‰ª²Uš*ƒõDÁ7[QXÅ> endobj 1342 0 obj 2556 endobj 1344 0 obj << /Type /Annot /Subtype /Link /Rect [ 491.585 501.139 521.025 510.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 969 0 R /H /I >> endobj 1346 0 obj << /Length 1347 0 R /Filter /FlateDecode >> stream xœí[Msä¶½ëW𨭒(üß’uœRʇx%;®²|À ÈZ19RtÉo€HàŒÆŠdq+ã-ïâ5Atx@7˜‡3ßñøŸKñOúnš®œlsö ä¾“ 'ˆ•(òÜEž8~è¢ÈÙ8cQäÔ⣀t‰ÿ3ªËqéüë¬9󜿟ýö;¯“;ïéÌÛÓ¸lêæì'Ã6U——dŸçÜŸýõöìê‡Èñ=綺8à-xÈó¼ÔwR7@+ñrn7Îoç·%qðv[Wî*Ú8-a„}úݹýÇÙßnGŸxž›.í«™ÈY“$‰ëMÙ$› @Æ%Тx42d AËH_ÿî5Ù³,öLƒm"-ƸýŠ7ñýÕ*Y­ø#7‘ÈGÑ!Æ,æól² 1O"YùRþ-\"QTr¡rýd°Û€ÊîÀwW¦Ý—è°áд²ÝjN-?ù¨¦»ÉD3ÍڲDŽ£š·,²o‘U5þ¹¶v%Ùß}T«Én”ªá1ÍèùÁ¦ƒxÖÇŒ&F2žœQÈgCÂtø³ ¯k2;'ü4tãä ÉÐ;² hö*šý„2ÇõÕœúžxWwóˬ¿rý# e.·ï@({ÍÝG¨‰!!šðë(wâÛq|ûL7ÒÌó ¼$oz–o‹X§bd‘&Fo·Néæ-Kàî}]¯­]Ivnn¯êq5饮Á¡=„:ƈ¡LõsníÄŠ%²âÐ2‡~²¡$Nüx~ìßJzN:Ù?¶®k’;ŸœËÔ xëçm’ÉŒÄ ¬Ztø+iÀ=-£éÖ4§O+^ W¾›:ç×MÆn‰!êJhXÁG\ïÌÇUaiáýšò½­ç§hy¦;ñ†$|œ“&£»¦#ÌŒ<ì¸C5D]µ!t×Y­‡á¤uÂeÂĘÓÀ9Ï¥yPîh_,«û² éž(û:Ôc¸(ªÌÒÅ]”9Œù:wè#a5Ź{ HR1àK›òJzÖl½·›ÍºyËx ç„®Æ¿×ÖѺ¹½ªÇÕ¤Û”cÄhš›êMs+O´k kðæðÆøÄ©%r꣩SÓûªqö’"eRgo2éįæ—8‘>_xf½N ’§²ÊÊê€AUÎTPf%h¢ ﺒÇúÌE¼,ŽIΟª®P§L’ Ç^ó¸ÅŽE¦ÑœàòÚ>Ÿ, ŒÔÿß§ÀbÝö·íS~ÐiŸ(µHJ½sföýËû“ÛývÜnì ß)×ÊòAÒ»]€àv¡¬Ý. oÂíF«%†§Jx¡5„ìÍ&A¯À2F=Ñdê+òž±@‹öDßä~&¥Ï5Tá²d4OF&ü1œŒÒùó˜Þ Ÿ¶l‚}<îÎÚ»O6Ñ eÑ^wnðêĵ%qíVåÕ#$N­‡¼ºÂOU]pm>ÓÎ]AܾìÜ•Û|y: ÖJÒÂãš[Ü•­ù”àŸßÿð²ç§2ÏçÆü ÚvmƪmgiQlYÕt­!ëJlVɰ}˜N“óÐGI˜Š7Ú-ɪ¢‚ŽR2É(¨¾T¡¿üb§ÿÓ‰Þ^ =ï­Ä¹AÕå/×7aRK:×ñÈÎR—xu¢óewóqFü“JºõJШQÄHýl@áúWI][ ÓéA ù÷7-þ.€^2x$î½kÀ]K mzn(ZåÝÈî9ýWSú¯5£½ÈVzUÒ ¹²Œ[M‰Ä+ÕUGîvL×3nfº¥¡ýºdç-ÃÖv熄Ç}ˆ˜ÇSÚýçh³’tæuÑ·(F@´åIwø·,å=èÅþL£ðÇ4ÖŸ2×5}’- ĽS}6§Lo8ßXGóñ ký`޶­&ßj˜Ë * }¨pAMDpVÚÃ)…Ô“§‡‘˜Ì¸Éå æ †y«ªÅŒ0ñÌVMÉ´å=ƒ×x9å|þ~ ÎB  =•ø‘P™`Cgº5ž²Z®âX¾4Z4• ZUå¼* Âú K¦šdʼb$ë(“Å©TÆ ð„áœVAPªÎ2ÒÚîÈ_M9Â?f£ö§±Xº6´ãË—;ˆ†­/e·©DwÝvæ`ySZ0^³j 8TÖ^UÁŒ6|·Kþ¿!c9ò§àË-ß(ËQ xHèèÕ€t©PîÁÀTÀÂ%Íxï=cÏ=Ÿj¶5ke™RÛ±]f>6_®«æ«­0˜²@4èßö ιZp=,¤ð\—°.Ô4öãá¾`«C0ïõñ- ñ`À@àèŸ ÉL¬€bˆÒ8J@áÏ_~䯈̌#.X0N”û^ e×m¿»ºê±œ P,ä[[N´ÁÊ€¼D­ Ì€ãðd˜ÉYUõw¦MUi)Vbûòl Hx( U‚ðF#Âã¥tæÖæ4À…ŽO—Ô9ÿŒÛ ç"iÙM÷\—DmÁß¾¹ÑsñPÞ¦¨jr»0ø}VJ”°.üzóã­.‹·\ t2M?°{ÖÊåÈ …F¦èB dS¢ òl¢(ãaQàûÓÜÎJé1Yœ›/?;°eqø¾S “ÂÖŒïÃÇMœ.m©Ò¿ÐAvYÈÞlêØ??BvÆ××ÑK4Å©"Ì3ÖiÑ¡ßÎk›É/÷ÇV¼Z½lÅt óÑ«°|}àì:¶:Ñî5´CoÌ;ôJâ½ÃÞñm¡Û„ù½àÏcáË÷'P0Dß u8@Îkt6 N4)1ÇPóåM_‘ÑqiîUÒ°NR?é11ì|©‹Ýg;&¸êˆ~ä3„uJ°ynê C°½‚—C0^‹G³„­‘UqxÜ}r ¡ü’–í ÑÜ1xѵNÀG!¤[ÕA¨DÃ9¨„ÐuPf»Fü(èb¬gÒÀVüUÁáC$ó­%n ¤N3´ ¤0† á<¯Äµ¨™d¦u õ°#2{ŽdJ|+GÊ-Á,+¿ŽUä‘ôbjÔ˜ëBë,‹nÅy7GŽGÊ´øua}ÈhËèc•C2{’c+ ƒ±òEs¶™P£]"FÚ-mfn„ÙGQb,[GfäùF¦À¼­Q8,þü‚{dÎ endstream endobj 1345 0 obj [ 1344 0 R ] endobj 1343 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1345 0 R /Contents 1346 0 R >> endobj 1347 0 obj 2561 endobj 1349 0 obj << /Type /Annot /Subtype /Link /Rect [ 215.07 116.309 402.55 125.309 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1273 0 R /H /I >> endobj 1351 0 obj << /Type /Annot /Subtype /Link /Rect [ 203.13 94.903 315.33 103.903 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1275 0 R /H /I >> endobj 1352 0 obj << /Type /Annot /Subtype /Link /Rect [ 275.33 73.497 411.44 82.497 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 47 0 R /H /I >> endobj 1353 0 obj << /Length 1354 0 R /Filter /FlateDecode >> stream xœí\moÛ8þî_Á Ð0$õÊÅ¢¸î6}YìµÛÄÙ»Åf(2 gK®$Ç›ûõ;)‹z±ì¦ ¢¢n€†3"g†ä3œ!Eåóˆ"?'ò—oSìû…‹ÑgͧÈcÈr5Ë!Øf!¢6fZ :ËAsÙÆ(°²¿juž¡ÿŒâAoGþu&ˆ@»õˆl^ˆº}2lÓ <$ûºý4¾q%h<­†Ø „B|Š|l1.ÿ14^ ?Æ3‚år…A%1ÊDz'Òã¿Ðø—ÑÙ¸Öm‹ì­×Ÿj&j<Ï䉦BŒ¥xÀQ壚!MRi©qTÔï­&“–ÅÄ4¸ ¤Á·C®‡=J9÷8‡Gدˆ2·1ƒé^,¬Ž§¨|Rü_<8a²¨…á(C-†©WÙmÚn‹bnÚ}Âú W¢µí-qzùiðk5©‹½†f`uڲń½Ä·,Qб‘@ÖÕ »míš³}6zT׫ÃV)ÕÓcLš1ò•M½VgjŽá5ƒîàØà Ž­Üá÷ ‚›¹èô êÛØõzAÆžeì³Áì+eÎëƒ1õZLƒÕ<ï^f)ÇtO@™Ëíª½ænTÛ5ðõD;àm?¼ýœ,"îÆ›Š’ ºoƒX§lÒMo*Å·,QÊÑ/«AÛÚí=† ·Uu½Z+¥ØÀÐ@ícD P¦úíÙ"içˆÿ"_Ï’¬Te\<Àjˆ°znô¬×k΂øVàEw^¥‚à0ÑÓØÔTœ Oˆ=7ÄäIÈ1<ãàèH®Sq°0YÉÔ òZí0Y,Wyynbha¬¡%Ÿ¹lȘ‹9:JWqf÷É*5ȵ¸1(u4c0‚xÒRhÙØ‡m7¡¾¥¦b:¹ÉÒUO$wŠ$ahN£9Ìoù°ÍJñ-KÔƒUe5èo[»æôA)n«êzµ"xWJ÷ˆäûQsSýC"ù2Iû#ùVC„Õs£Ç'=á{˜Ù¾+põܸÒá[‡F¹8d#êîfwGòy”å¢wžàžØê;CLHË3ÒN6%ïÑàºQÐ>`!µÌoSQr´-(Yý‡,¤s6 hTTÇÇäK6Ì{YR?‚!_¹ežypdýÇÉœ gϦð6:¹‰âÓÞ ÃÃÓÖ0lÀë¹!ANÇd‹: ûhä3ƒÌDXÜ8¨8jƒ­‰¼Ööòü×Ýy=‹ÂBƒKýBašÜE‘¬‹óKƒ ÂPdÙî=tž¦8 »Uò Éru~aðÖQ>KV¹ÁÞ´ÔØnCÍ\“(¾•ÍÈE(ŒÑ<ÈfØ`§¨/ vÐîø á…¨¢ïc«8<¨ˆ|e•,ˉQt˜,`áíÃ4”,‚ÿ³Æ)öÐÑjY•õt*f³"6³¦ÈÀhŸuäa>kèœÊtÌž(U¼_Š ÅÆ“²¯²¬S¿¢|“&ë.¼ 9¨À‚Ä”L£Pôe‚VÕnn¾÷»Íû»ò¿Gy÷€ìï}¿©°¬òYÒý]Ñ&â`6D˜=7šþ›„AﵿBçf¿|©—“'Ýz›ªˆ"šªbnÔYŠ4+¢®"׳dS.–u1Þ{ÃYÞ zÒUË“©g¯ˆìð!¦•¹Âj²hËûÚË­¼•¿1dWœþò¯ô±‚t˜Äyößê;@ï ¡Ç{ì[¼X-7"ÿ‹ š÷EðaÂjûÍ}ZßO <º u¦]O‹ºÆ· EÝ»d-7Ã6ãEO B/sæcõvZSõs¾ QQ,Òâ%½å»ØGG—Ù*˜Ïï Ny™AQ†/ôÝ:&“Td™™Ÿ¿O”ê¡°õ0óe»ÆˆXÌÆÔ÷9w,W <‹ï¢4‰«ïúä€vŒ¦íƒ1ö=sâ•§™ºÎ€mýŽ^~û¾"ԙċŠQÞ5ª8â.˜¯‚\tK» ÒHä÷C_ QM+óë-ä·Ö†¼ò²gI‰ŠÐ¯ûµµ›ï)]^Á©‘ëS}8 kÌ RñƒJìõa^j } ³cqî:¾~wöéòìb|ýï³ñ»¯«y¨þÒ‚‹,n5ZEн=£$E¿}¼÷ªµ)k `¶þž”žÿq}1>ÿám·R›¹623þ¼é=ÊòT¦§0Bý¢(FAaJ*àq–ã~[lîRâú·Wãw×ï?¼ù¸Å—ÔëË \N÷|¥®ÚH*š–¥%x à¢z²i±ÊĤ,®F…_½š*ÊÉF`PÊÅ ¤¯Ž’b*6‚‚¸C(Ø«Ì4º]¥•ú‰ù w­Ë«w¹Tzu\Ž­éø}^os޹csßu<%ëMÞQÎ-kÂ<Rx‡ã;Ì®mqŸòrºÎÏÞ¼ÿï©ÈCuups0 {Wè—ŽU&!u;On‚9*ÇGýÝ™)XYì„´ð/í·ãZ²¢á¡üsž%¦‘nW}SÎuÝÍ»ò×?©VÝòÀ³`¦ˆ%û×lЮ޼«ã²m—6—ÀÆ–û„1Û5>Ð:.›Ï;SqŒÈàCºÄ€jºCµŽEl+ 3zŠA ñ ÚÏ“°˜—åýÕ1Únø'•f¸Üé‰4^2ØÜŠÓI¢Qsò#ô-ƒ™~©i¥õ4Š'âo<Ëó^ÓŠmè»gQ»ÓtXØ{m†àÊeäfn—0ôcÃ'©maâÁ,{ЭvýYž/8UÁ¤·¡˜&°•DZÈO·tl#Û’Ž ÜTÆ“Ù/{Ç Ÿ:Z£î#—ž"¸mÈ]8$ÜóÝ–˜vÿ!;¤2±ý¶ÒÞÞ71H«Ìjš‚ú»ÊmÌå¾ík„Ë{vWàÖAμ¾x. ,‰;î¢]žÿÚ‹îjutkËn#¦á­úz ägÉà5ø6¹;Ír°)H'Ù)ørs,‹cÛÞªþ¥‘ã}ýÀŽCª endstream endobj 1350 0 obj [ 1349 0 R 1351 0 R 1352 0 R ] endobj 1348 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1350 0 R /Contents 1353 0 R >> endobj 1354 0 obj 2400 endobj 1356 0 obj << /Length 1357 0 R /Filter /FlateDecode >> stream xœÍSËNÃ0¼û+öÌÚyØ–$BâP‰CÕCÚº$j“¶NJÅßã$F[Ê9ÉÁë±=žY·„ÚÿªdȨ” fÙ:œàÄІ Ò`ÄÏP,¨`L)¡”]¢Ò ãâ¿Ä ÆÞiXx£«%EnAãìÛŒ Ê¥}2ÌëB›#áÌwÞïwu¶v¦iß½ %Šb[:鎽˜O+³ƒ}ZÁÞäu­K˜~Ã[j–» ^ÖºÌgËnЏ+2‡Ð¹¾¥½nÈÈ endstream endobj 1355 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 1356 0 R >> endobj 1357 0 obj 357 endobj 1359 0 obj << /Length 1360 0 R /Filter /FlateDecode >> stream xœí[[oÜ6~÷¯úä1MQ÷û°I¶E‹¢Mœö¡.ò Ç#T#Mt±ëþú=äáM—‘'Ù ö<øœ#‘çÂ<‡”ôñÌ÷(ü.Ä¿4ôIšfÞjwöQÉ}/a^+QDIÈ"JÏ ‹¼7E^)Ú8ÓüÜ üÖûõ¬:£Þg¿ý÷¬= íîÏèÎeWïÏ~vlS7}JöQïöìÕÕÙå÷‘çSïjcC@”QJSßKIÀ2ñǼ«÷ÛùÕ–{ù~_«¼+êÊkysÇ›¿{Wÿ>û×ÕÀí€R’žš×?LÔ$IBèM²›e ÁÅ¥!cµ $èþ?h2XL]ƒ§@:ãc(NHâûY–d\"éD>K—s2îMÁ„]²SÊ@Ø(÷c a)L‰£D9¾ÿ˜ï8:/‚7¹0õXFh‰6)6jøf}sÑ6=N7;0M|ß'‘ÔžÓÆ×Œ%ãl©÷¾ØíKî½÷AÍooS7Þ;¾yóÊ[ç]~“·¼ÕN8±X D”ÈÏ@.®-ïªzß­Œl&)%4‚ÕÈÏ¢Ù`|¢>I…€L¦ú{ÃÛUSìÅröØÀø+–¦ÃàÐÈx"´ÞyÑ27T‹q5l—W뼬++ºç7öò°Çûm±Ún_ßk>§DŒšÛE±²Ý‹aÔ4§æÌ°’T„×p‡^¿í áEš(?‘ª:^­ùZóm]òòAs¨Y’e½ÊKsWQÝ–üB„O‹òÕŠ·-Ñì÷¶e^=t[h ù]ÝpsmwSÀöíK-PƒCF7d·5äëÞÎø#aZ‘íê'뉡}éI®ÏýësÑKno¯øFÁB'`ÐtÊ+)PöIGSݨUjÁ.ÿÃé¦wúìj§Ugè~?«D»Ð¬ŒhUW›â¶o0Ëké¦(m+ Hä «¥Ýæ^‘H£Q$î‹NB’…¶iCßåM‘W1‚+çFƒbɹ•‰–Ùi$YéëZ–‘íú¶³}”mm˜«IÆNÝR­m}UÁàYë~¬ï­n1´3È’Q Ôh0F2h%—#Ë›@+¶(KË~Ë=èRî¶©{i¸’õUW8=Ô½eþè(\cpÈ÷ºkÊ‹±‚+W«¯òʬEº×ÖÒù]^”ùMɧÁb4+—æøX·”—È|x÷Ël»nÿíå¥\m¶uÛ}›RH%öúO5¬XjÚ¡"ÐX—bÅÜ4õ½Z¢”ÞÚµ]A._¯ýŽ ÝÖ}¹¶|û¾©¸P÷ݾŸ Ëô °A«ÐêЉ¹¤ùŸû2GLH~Uïvˆ]äK¹¡*$\·C…œ]ÞuܶÚç·œîª6¤‚"Ò×xÉ|ìySp\™QÛ~Ï;Ù/Ú=ÌÄ"¯¨m×ÀH¶ŒŠè+¿©ï¸h ŸX°ª¿Bq¨*åµ»ºåA2W·¥Œ$I¥qÊj•™ÚÂ÷#â‹,†*gÚŒH ‡ô./û¼“™_‰tô$£Whä”Á$”…pŒîOŠ,?Í X‡x°€òAf‡Åòˆ…‹½8öÖ–.*HÚyYüå]t-/7Ä °Ú@s‹ë|áp“¬eƒ2£,Ù(×¶A>)ñ$²‘ÊB3%Ñ£*·¦ƒMPì~Jâ„f©ÝÔ?ˆÑ"„‚7 )üÀî¹ÁH¡˜} ì :(H¬Ì­ P¢Wiä¾ù‹ó†ÿùßo¬h][ºª;Ëä«®ÏK\PRT›²çÕÊ1b+sœb:×<›»¯÷¼pFÂшMz£¤àh#K\÷õÎ2rñCÕ«{ŠŽ_´{¾*6ÅÊHÁ¹ˆ!&P¦s*rb=ÊeDu‹ÙîqmBZádFü0¤> £Õš|!…â3†I”Ì4·‰‚8f°ñr$‘ÀõƒPX¤X¸“Ä-MzvÖÜny#¹RИ…¸%¿`B¤¶ÍÀD¸ÀéÄîÌVíÌŸdîÎü‚-oͱkµ;Ÿt§ØFòÁ¾Øç 5ƒhÖ–&Õýļ c#ŽjÔmàîT»’Ž€é`Aõð66«T 3hNä­M‹Љ3B±<÷˜€ŸÊñ½Î¢1÷‹X8Me7:ññZqòÄØWÄ{Ùgìÿ€“;®Ÿ…¨7|“÷e7„ègÄ?NîaâW€ÓôDñœF†„l„®¯¸g´=޶װiâÕ<Ú0?B®'Á,ÚNb‚zr ™~¹5Jw?±/èØëÛÀß©öðˆèîªÞ&sŸUJ€Ó1F à䪟 B§Ï>ÊúÖnGdÃg@& ž7—°½ð\Žêv²…LxªP=·³ ®g¼=%ÞðÐ!å±/Oƒ‘Ùçòh¹G27Ôªo»zgX¨í –¾ñQõ›(—§:~ N‰x_+²®äù„¼¼QhYsyŒ?hÕòña*õ(õð”÷û¦ÞÃ6¥ãåYÊôâÕ“œMJ1O”8ürEw?±/h¸éÛÀß©v%Y îî êám2¹[¥GdúcŒÌ Wý§dzÈåLÿ ¨“ÔSâÆ_Jç'Š—ƒéÜ"èTO *õ !NRqx,Ö¥¢2OI”Ÿ(*¦40EæRÖvÎÙÅÓ›0$Ì;§†ú‡¡ ÕVáäó $ÛnÍ›æ;ÃûçnÑëE*öêe癪¤Û‡Kd7ùª(‹îá;#a†t6ÑÆãºAÔ5òA¿-y$«6yÄT5…ÅãÔÆ°çëñËÔ‹Ò‰.Q£@;¨hä³-­f¡b‰h|’õ¿’¤éd-HÓ/·èî'–à=£ômàïT»’,†@wwPõð6Y¤X¥GT,Ç1X$\õŸR±”üŽ—‹%Ë3¢NQO œx¡d9U¼,Y,‚žAõ” R%K¦*¥ºœX¦^½ØˆŒzùù ÿñÚeÇÛ6¿Å7KX",Ø÷ì½áÓr|!Qóÿtè²¾¼lÑY\”XAÓäüúœÊW5Ÿ—ÐQëÔ©‡f¡Äy¼BÙÕøf##±w^ìöuÓå••h¯_In¨mq;Û¤,qüð3&JÅëóýP¼õà N›0Q•Бª¢Z•ýZ) Ò Ù›ÞåuoÄ‘]L«È”ãÄóªõª_/–#ã ˜»åëÅò*;ô ñ$’áßv«u’Bx`_ì—Ë«gD$¢žôDˆ%„ÂoédèTqó|2tâàReV(ò­wþö'‡q^eWüG1â­úÊ|ζT]áÉR„ªpq¸]¾‚œëJî·¼qyübãñ’ªé+Ìûa"5}h¹eô;Ò’YãûCVp}n¾¸~qı KâýJÑJ2«²€BѹS½} ¾iüx%Þ«¯+ùÚq áöTÈ–ê’8ÊNrÓ¥$Ádû2•|þŒbqx f¦aðëØ*”aË¢íx5ùâa&-¾ÞæÕ-+Г‡ú(YõѬâÔ¾YqNjÑ׫#’¤þØ,ÒŸä©Ú$y ióQ›äÄWGNCñ­o³áæ+O9Ä–³ endstream endobj 1358 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 1359 0 R >> endobj 1360 0 obj 2756 endobj 1362 0 obj << /Type /Annot /Subtype /Link /Rect [ 491.585 448.639 521.025 457.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 969 0 R /H /I >> endobj 1364 0 obj << /Length 1365 0 R /Filter /FlateDecode >> stream xœí\_s¤6÷§àÑ[ecÌyËm.W{•‡ËÚÉ]Uœ C-ƒÆ‚YÇ/÷ÙORKƒ@0ƒ7v™Ôͺv­nýé–ô“ºÕûxá;ÿ¹¿âÐwã8qÒíÅ£âûN„œ`­X+Ï ÑÊóÇ]´r¶NŸµr*QÇH â¿ze9]8ÿ¾¨/<ç¿ýÎËdŽÇë=]x˦n/~6tSxzIúyÎÃÅßî.n~\9¾çÜåݼyžûNì(s·u~»¼+ˆƒw»ªLq[ÒÚiûJ؇߻^üý®×íÀóÜxi½þ¹§"GME®7D“l&ç@‹"«§È)=ô~OªìY{¦Â6£Ü4†Ö‘ù~’DI³ܸ"%dz˜îÙ`A}œ¬dákù¯Ì¸F"©åÄ  ëGÞ©ô|71õ¾FLJ¦•îVsjûð{%ýµ $sÖ¨.*ÌjÞÒ2äØ «b¼»¶tÅ™CGD÷‹Éa넪é1&ÍùN§£xVgz #. O.‡UÈWÃ*„åð+f%ÞTdtMøq讣£ Coˆ2t†Ù7ÁìOÊœ×oÆÔ$ÇûªßfýÄõgÊÜnßPöž;¨"!àë wÆÛ<¼}¤Û-©ÇñV’7=Š·EìSÈ zÅ} Máõfu¸±¥£s‰lÜ Ü Ó¢ž9ÔšÔ%z€2Å™µ3*–ˆŠ7ž|0@ËœúÁ¢ã ÛÔœññzø˜>JzN<8?>•má|p®W;—¸¦mAXÇØ1úÀð¶c웲~èȶ(0T† 4<¤î(kÝ#ö,DBù¥ÁWqâØB&g½2uó–&¡çWãýµ¥+ÎÑ!ÐÍMŠî“&¬:ÞÍQ¢YSü1ÈZ1¶Üºw´1¯#ba÷ßÙjEñHu1¶(J€·éÁpø×,æ#è­ý‘6z?D0®*ú$ZˆOQôõœ¢`y+‚㵤6³GPëc°m4ø’n-+RITÑ—ŠÎ©Iœ¶Äp!µÀäâJ,f\g‚ôóúUE»dJ˜È³®†`¨ð¦ä/—œÏë‹KåÜ ô½'PþJ R©Ä–~Öõp’Õvµ^ËJ½MSñ UE`#•yNØá ³)&"$+I[ÊdÇVëX cñ„áªV‘ T8MIc›#?b„wf«Î§k±umiË·/·cuG_Ní¶ê(ºow#wÃÈ‚ñ’e íÀ½²¶ªŠLiÍO»¤æ îÊ‘?„ßnùAYÎj¸‘£wk ¤I…¤Àðè ´0I#Ö{bî¹…à‹B­öŽ¡V­Ló.5-Û§f¶Y¹*ë/¶À`ˆÐàPÛ70çjƧn#…|Â:QÑÛ†‡Û‚ S‡`ÝëëÔÛ2ŃCÿlpF|´‡(^¯"øËçŸx™qÄ ÖÂ3J`(Gˆ¢mwßÝÜh¹ ™Ë[Z¤Á΀¼Hí Ì ûîð0#&%WUyøŒÊ¯¢Ú‚Ãþ"6j<ŒôÙDe 5 Þ;[^äŽì¬àË‹¥™'²:G¯øÐ9šzèõžGÝCg[z4ãñqd?tŽF:GæçÑK>˜£DïhÍ|mŒÒ¦Ù³êh,ç ©EB꽑3#~³PäLÆo"ûÓŒ3¼Þ ^ŸàØÀùât´+[bÐÊùB;M@í0ãþŒ~ô<áá\Í`ês—"Ç—gƒ‚€‡"´H À½Ñ)õW$ŠA퇛Và|¸u(z~ÄMŠ3õ¥‰âݶÏ1邨#Ð÷—ooõZ<·ÉËŠ\Á)L{ þ!*%RX'þsûÓN‹Z®&t0MgØ#kÅr¤K†B#Rt¥²)‘Pq6‘”þ°HðóéVg%wNçöó/Y~îÓ$œ° ãçð~S,1Ô¬8‰õ’Üæ|û&¤Ú27ÉRž‹Êžå¸$/}tnÈ~ÑömŽü1Ïå<©ã“úΓ7ÇuXæÔMº‡©;OïÁ@Dé:>”=(¬PWò´ÉÖ"dD)’ï$Hý ãP‘zE!QEÂg§M27Hpg¬D êþ2Ý3ÖƒÀ¿âvÆ^1¶ÏÍce[DËïD90£±¨ÈIîã˜mìàþƒk0eW®O›ß†í»èƒˆsø]`(ºÑZÅо"åÙió …HL Û×âÓ’+ƒµÙ›J“Pßï(ª¥§/Pç8YË.À¤+ gY)žÖàÊ`>î {>}ù±ƒŠå%ƒYZ|&-+ Ä•Uí•:ÜšÉíLüüû}„ endstream endobj 1363 0 obj [ 1362 0 R ] endobj 1361 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1363 0 R /Contents 1364 0 R >> endobj 1365 0 obj 2616 endobj 1367 0 obj << /Type /Annot /Subtype /Link /Rect [ 215.07 249.417 402.55 258.417 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1273 0 R /H /I >> endobj 1369 0 obj << /Type /Annot /Subtype /Link /Rect [ 203.13 227.417 315.33 236.417 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1275 0 R /H /I >> endobj 1370 0 obj << /Type /Annot /Subtype /Link /Rect [ 275.33 205.417 411.44 214.417 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 47 0 R /H /I >> endobj 1371 0 obj << /Length 1372 0 R /Filter /FlateDecode >> stream xœí\ëÛ6ÿî¿‚7@–¦¨÷!Ú^škж¸l6w-š¢ ez%D–\I^wﯿáC6õ´7ÙÅ*ˆw]͈œä ö_3 ø½ÿÇÂA¢h=ûKó-äSd{šåìP—Y¦.Z£&ËE©¨c<Ðú þ5Ê£ÿβAÿšýþ”Y"õv32 \Šz7{kئ Àó”ì#èföÝõlþÚEA׫ƒ‹m@(!$°P€mŠŠ®×è÷‹ë˜#¶Ù¤IĪ$ÏPÉ‹[^<û]ÿ8ûþºÑl›L­Õo&j|ßǤ&)ÆV<à(‰âUÃ6©´48ªêÿ É¤c11 îi2Æ cÈó±oYaè‡!¼ÂAD–MÆ3™æuÁB›8qeáKùW¾¸¤âQ ÂU†Ú[þÁnƒÔvÛM»/é¸áJ´¶½#NO?-~£¤åa¿¥X½¶ ˜p’øŽ%ê…ô².Ííjלa쌨n“n;(ÕÝctšáùƒM£NcÃo "‡ƒëÀhp5þÊ„-RÞ;&¬ÀÁž? 2úˆ(£g˜}Ì>Pf¿~2¦^ñÛ¦Uÿ4k…Ø:Pætû€êιC€jâо rg¼†·æë5Ïúñ¦¢$ˆîÅÛ$æ);è€X6OÕâ;–¨µ÷ëbÐÞ®vÍuA-nPu³˜Œ€¥ØÀРN1¢(S}_X;£bЍxäÎWhš]ßZP80œññø^J´Öù†rû£gèÒöÐÅ›•AÜå[ƒÚùm²ä§Šu¶mh¡íeê-K·²’Z€×‹˜&™deÅÙò¹Á*x¹É³²+<Àê–X­dWÉš—h—¤)Zp´b ªÀ#ÑÓu„«¦6X4Ç!qà‡µøŽ%êE¦º´·«Ý9Áµ¸AÕÍb2`”ž=O1¢1@Lõc¤³Ãò?XýûÏ8/ûS²:üža5EX=5zv»Žb–Ýp¼îß•P|šèŒà ç“,idÏ\:/YŬ?”=mâ@{z8E7Éå"Éæ§¬ ô¾ø4A5 ˜¡7%èéèl[.Ⱦذ*6È’GòߣVÜš¨uß_ýt<6ïâ$’<+ Õ®{i°Þ]½7(E¼,/ª«\šâR½³_d=M?7x»¤Šómepú¶û¯¥&ål™d7r;² |”²2ÆÃØV}n°YG¸´„KQ²N`[î&ˆ*NÊ•oêŽQt”¯aáÝÝŸ´”¬ÙGÙk¡…}t±Ýžuw*zó@ì{M‘̨_öddAû #fÊtL‘î(õx·á{"ÉŒ7u[ųNåó¢Èw}Ã8(ä ‰)1§&Ë )u¦¸ÌùÚïIµ¯ãKäBË'¤o²Uþg•TGnéQ6I”=5˜®ø ДE½[V¨üo¢ÎÿûÞh'í[§DîÅliÕ”>[‘Ï2Í#ÆŽŒ|®ç¹ÑªN{¦̯}pêg ë¨Hd†;HÏX›"ÖžRߢbJGwèt(&ŠÎg_ÔÄß ÄQ$|eÐÆ,fps³ˆ®Ç÷LN »^8Å|ðkÇçvÙ¶ŠóþMç}Ä=ÃlŠ0{j4ý& ¿°Ñ{€…Î9Ì~øR‡.;Ýz™ªMÕce”Ùð¢”QW‘»8ß?Ëeý˜½QÌŠŽ@O±Í2±ó/ôœ‘CŠiåDî´š,«õýÜÛ®ŸxMoȱ8}ÿ+°ÖCé(Ï*ßï;CïžÐ£ˆ=ú%Þ´ ‘oøš%éXŸ&¬†¯ò[ÍðýØÀ³Ž¡Î´ëqQ×ú0ÃDQ÷C¾‹a‡†2€ç¡§9óµ:ÖTs_g,‚¨AT’ñBÐúx_nYšÞœú2ƒ¢Œ±0vë€-—/K3ß&CÀŸ¨Ð®°‘åcˆz-Øž /h„®’÷:I¹¾ì@°# bOÈ™¿Ûþtd>v=ÐÕý÷Õ÷¯ßü:çU¤î©¿e±-"-Ýô~‡ì0l Y×Mš/XŠ ;VÉÍV} ­ÀJ™5¯+áZ…ေÖ;+$utóßqŽXZ榭^OÑÀ‰oŸ²jÇ]ñÕ«ïTµžæù¡eĆvvë¢þ‡guå^}  Y§öë Ê@~ÿüØaOuPiQz}MDk–r¡~šG²c6wž¡A3,`K˜á˜®L¤SBšËçË\Ãæòtg ]ýRÓJë<É–üoWëtÌt× ÆMßñŨÍ0ÌB1†©×' ½hK˱1ñ¡{}›ö”«jó¹j.!ÐE|•CR3^Ͷ—m‹ï9sÂ0ðý°GöËQ?ÀÄØçAb²‘÷Z}óX(ðã^ ® VXbjr‚>Å£>h‰¢àN»žåº¢Æ›ìµ—¸yó6+¢‰ MW¼*~ËÑmÂÐû«ŸF‘º€^0…:NìŽ(1Mï”×^Ÿ\„уoòÛyYM¬X–sÌmOØvˆgPýË{Îwn(¥«úHm;n338Õ³\Lì¬{?@†v¬D»"©*ž¡Åú™·%ú!çY}dèÅZ2¾YÇšƒ—ü¥²ÞÎþm¥ü endstream endobj 1368 0 obj [ 1367 0 R 1369 0 R 1370 0 R ] endobj 1366 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1368 0 R /Contents 1371 0 R >> endobj 1372 0 obj 2275 endobj 1374 0 obj << /Length 1375 0 R /Filter /FlateDecode >> stream xœÍUÍ’›8¾ó}Lª2¬¶Ü’©ìVíi§Ö•’dF‰ˆ$Æë·O y0Ì–c»JêVwýï_Q¿wþÈ7Iœç”môëÂO £î.¬-‰7tKH É&¦[haÎÚ‚ô:“ }ºá1“Eº/‘Šü}ýŽ2Ô;Eäラ£‡‰o¼¿&ÿ¦¦„Äùësða^à,Ëbr]øÁLxÈ ýÓÌ‘k2 Ì8!‚p¾è2YxLÖ3úTóWãcôqýñ'úD`_µËâ,IŠ"+ |ŠsZø…} _ß$iòö;ìÿŽ>í×:æÕ„·lêýòZ»‚PäšKü)Ð îå, hÓ<#„ìv!øû†uŽHÒ>T­PÂ:ÜРœÖÒ†ÌøÌ®¤u“ã/NpSE’ƒû†C­¥Ô'¡Žà˜ýi¡d :njmZ^ÁI¸JPq[qÀ°@àÖû?Ì„P›üFéöJl»"öOP1J'˜{¶Ž·`¹ë»%RAoBZˆÝΦ* Lr¼V̱³ÜÆK”û똥܇ªz†·ú‘¿Ð wFðGqB ëš3Xw–ëÈé.Ôn›îþy!‡È@½åÆ®Øßæ·Ù_È]Ù7±;~èÞ(¬ÛI›j 0'·.ä> ~ÂDaß['J;€—Z)^“ ”oa*VòH ½ v)w¯U-޽áCW²®“¢ ³7làÔ‰ñ÷Já0­ ÓÍmÈ ¹Ibv6c“•?ûn%¿tsÝ~ØßÂ[ oja¬I{IÞ3ƒÿ×I&”9nªÞ[vœº~A®Ôm‹~ßI¡¦\)¸š ^W6ÒbâHÝK9RwLÈxd̃zZe+éXôí%ä!Âb`ÑU_ò‘åNz$üÞëÜD+^6“wÑbSÔç‰z3µ…ëu¤BÊÂÝÑ/àgFßw_ög"Ô&;ø,É©òJ.²ë‘ÂpÃU9Ù~€žq„qžpÖ¤œÔðßûýä ›j endstream endobj 1373 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 1374 0 R >> endobj 1375 0 obj 788 endobj 1377 0 obj << /Length 1378 0 R /Filter /FlateDecode >> stream xœÍ[K“ܶ¾ï¯`å´ªÚ¡ð "—”lj’”#Ûë¤RÖ¸3-ËrDrv5ùõ霱´N²Bƒøú4ÝÀì§øƒÿä ó\FÛÃͧ±ŸF‚E<»R',%„G4‰Y¢yWÕˆqÌ´àŸÙX Ÿ¢ÿÜ47$úëͯ0fÀ½ÜæŠÕÏ7?:º ý5éG¢7ßÞß¼ý>(‰î÷vŠ9e*!‚GyÌ™ÄÿXtˆ~½ýfw¨šªºb¨Ú&Ú¶îßs!ÊYÈc¾ó®…¡^Š)aÐÙæƒ‰˜å°aèl”‰ÑxmûÅ¡ÔÆãäyf.É#&c’¥ˆÉ5¨+÷»Ç"Ò¸i¤Èb’€LózùÀ˜¸Ÿ‡ÆGÃSó½½­«²¢výTî¿ûÖ¨íX2=qJ%ôãñó¹i}Õ¿f~Nã„‚¢4É4ð]3”]±ªç2:´»òšÃÛï¥M ËÐÌÙìÌ•Ä<ñ`¢7цg<ºýuQ–äq¢fø„n¶‹)ICÈI´aðK”Æi 2îSþX|,»Í¶=Šf·¬F.CLVL#,æ¸öIîƒrQ8ÃM¾Œ\1Œ¡‚úIJ=êöãfWöCÕ(_^T„CtJ)…øÂYàŒÇ¸Ås!¤oöËÂyB®˜©P‚,Xæ›Ç~ØUÛE¼ÊöW†»Ÿ1ŸíOËÂeBN²×h‘Ð4†ˆ!%e>_ØT‹Z$L„+V d‰ àß¾{¿¹Ã£@ßù°b·ëʾ_ÔSHMMÂãp˜‚].ádeœyXlêåø€Afie‡â¤suÍ÷h]>—²<Ä`ÕP‘Ç"Î}ðÏeá’€«ì‡3‚¤àäT¦ öï«:%awð«Ì‡¬&ÎHmÀÕ}ö—¥g ‰Ì%¡_8,KãT@œgÒ7‡Ç¶–Åãù´Œ]g/Kç,„ü˜$jˆDJîÝž3 NÆù /ªš&žáÑC´¬Ä… ó,ó@7/‹¢ \£eGÈ!˜/Eß¿´] [fy²•rs¦nS˜ÏØÏËBBg”±ü–©à>©çe©°_ÈÀS•Í2rÛ6û]ÕŠ‚?’0ðW./ÆÿÐ6§t\¶—ûÐ!3¼>¸†ÌjS_e‹k’é²g¼ø¶¶O+ŠÚœáµÄÚrÖ±AÆ™ ‘Wìó Ò<4#3äæÏËÙhî‡\ ó̘*1¥ásE_-W!Ây“ÐÀ^€}D)xV†µ†kc JϨ³ÆÈŒÇ¯0’tŽ]W™cÚç…?¬°ó=)L]åÚÈ33æÇ¬°U¥x’å…²«+ðtÁky–Ä9£czäZ¨ºEæÇ¬°– 'è’ͱáJ*L?l …üM$„RÆç6êZNü˜6ªŠ2N÷;X-+“iÀš*Ö®Œ§yçÁÍ ƒàÜ ‘ÌàÁÚ•û1ŽÄPÙ ¶HÕÝÒ ½¢` àÌ‚ä_b+Ì6‡M *綆ÊÔÄYg+Är‘R\í+S_©M3/p¡,±˜|Ì54TJ?f•¡üÆSÀ®l†¡0=^Ô:39ì{Šw½êrÈ53Py2êÇ8WJçp´ã§b.=Po&¹³j’yÊâ|ºÖuÐá"²µÒL(ñr™JØ|»†*K)ý˜Uf&DW™ÍÐárJ/j™ ä›Lp™gùÜmµäMŒÉœüã•24sÇ ’ÚŠÈ… ˆ¬^L¸”‰ËM4“(bâÇóznË-óZá‚kç>üÎ73Æ!–Ó”–$šÃwe¿íª£Í φ)ø¾ˆLgæÝ0Ú@èL¢Ûª·m§{ÌG7uÕ”N¯~ý›èc×>Wä|´]øfxÉÅ1´Ž¸ñi±ìlŸzUüp+>¼±}»b(‹¾ìïlß©/»þî:õ`‚\ òÆX,"ÈÈÎuÙÇ=M†&·E3µKUtCi¹Tv”¨œIÓ‡EÜÝD¹³5­h=SîØÃq°šÞŸ–­qºì:-Ìbš£ù"óLÅŸqˆ†€“ä¶[¡8,IÓ%^Oe½|žã bv9C(Ÿá/³ú²œÚÅÔªÁ‰&¢ÝÛÏEUµÅ‡Œ§žojX6,G …;O½çöd1j‘Gùè 5¹&+;®i›ÍÜ!t?:D|÷81FòÙ¼Tu­ž¢Ûòs¹= ¥!Ç ‡Í®üt‚êJ¹ªê°^¥H§Ù•ékbC¾k,;°ÚZ€‰H¹úÛmy U5ÇÓD´[U b¯ÜHƒ¯­ç,gÖ?]UgüÕYÀ»¨¨ëö7Ó/Mõ9:VGhÇ¿3¶rpUsª$ýKEUós¨‰ˆa⻂á]©P×üÕ˃ŒxÆN¨¿SÂs]°þá8å°ûæð{í-ÑÍ‚ÎØa¢½¦ÔNÛƒ‹S:¸ßŠÁRÚ}Æ/­m?: zïbK¾kÀi‹_r±(WoRc‹Ú¥ü¶=u½#»?–Ûj¾ð;œ,<óÉ*Œϛ碮v†°ó&ô‘§ìWm½zCâÑeÚj3¨–Ú ±¡~QÚ©æàK{þ0qnMkÜÚ^¾§Ao¹ ˆæ5‰¹2?³™ ¡fn´^?¨ŒØ´êšØ•ûâTw¶çQïtMŒ«¡‰Cq¶ÄKÑ8ã´Oèö¸¶£rêàáQÄq[ÝaÜvä±_Pª)Ë_¡<@ÉQ¦öøEñh>EísÙuÄÆ"'%ҮٗÀ! BHî"L«§ñ·SX;Ç+C þA@²Já,xõîBËõø×BË5bePÁ¢cÔA%¥»6ŠT“¬ZÓîÔ˜f5µ®LÕmÎKEüW-¦SLÈþt<ª“[Q…:—T³Õ±|úbµ:e lúˆ[سò)½°ýИh¶:þâºÇÒ|EŸ\½ØŠ ™€œäõ‹Y\ì«ñ¯.öÂ{Xt,gB p3Q"A– Å#õT¨å4专G Â*„5§ƒÜ9u 3Œ[ü2çQ³cÑ2vöC›Ô•º˜Ëâ[7T×øþD=s!"Aà­:‹s!…¼Üƒ¾[¥Ä{x*ó$÷ñèÏ=,Dà¹Z„Ћ³HîÓÒ%Bi"< ƒ×ƒ À‚ë 2ž (ÅÅ ®Ä3Cgë ¤çúl›åS¥˜ª´ß_žÊÎ~×þ¢Û0“S»j K=×Ö}[‡ÍÐZùë6|¾Ä£œ{¬!;7N’?Üþ¯ìZU-ëŽCY4½×ºCÙ÷pJy’€}οèô.âªØîÍþáN o¾©-;=pœrΪ:Ê]U ºØšÆ8…šéC woŒÌmW–îç1±ƒ]æc.bÀCf_Δz©†'Ϭ@MŒ—è9•|v@j$>˜èÔ+¶ô}qÄ×®¬’e˜kÊ1MÁr9:NSgv>¶ u\±ô¾ØVu5œ[ÿQ–GKUmª¹Å°Ìøpꯥg8¿ZVét.ƒiºXRm[‘jz¨ ³ lϾk–›%K»ö#$ ãÕ“êÒwFì“ChÛ>Üæãí•–§OÑHv·Ž¤ý©fÇþ$½°ß‰Mz=îo¬ƒ7uõ[i»@!Hm{ÛqêO!ætc¸èÒ*Ý3®²°AÀÂz;[Ho8•qžåúÀ¸6å-ÔöoaÒÞâ´ÇÓQ¶t£ { À,¾TÎûã+ò ó”R x>å! ›Ñ³Š©¸@¨mŠþ3M3ø0$°!ÀÑgñ4^žªíS„9¤Ðæ4ÛE³zùìI!ìãŸpé‘x=Ĥgé¼zmn› ’ƒ)·]~†Ïˆgük¹í5Âyx_ÎhSI/`?wêEbª± i¢ÄHN5¼éPùÿÖép÷šîù­i_z‡†L¤qH]üþOí©ÞÍøÏ´{M¿µ/%”©wN×ÌšòåÚG3ü©úlJÜ |ITp4M3=ØV5X¥Ã1Ò:L`kŒØtNO$MÑŽíñüÆfQ÷­m×íËÄiê63m3 jøÔ‰…¶!~±*Þ+ ú8³Z{8nGˆ³Û±´Û"­D+™ã…æRžÌ¤Tø‡Uœ¤ -v»*ø#†¿¹cã½Ã5 Tg,Ÿ¦éKÑ/©A3žÅ2'r¼u5¨±¼…2Hèç˜ïªþXç>Â[þu8ah‹tÆv‡Ú5Qù¹úÕzá$@9ÿÚO\ ~\-~\#Þ½ßÌ~¶˜|¬˜a.•+çN-ªÚïÞOÍ‘÷DëÛÊ+ÄcûyjëCÀP•Åv§¦ßß®èÛ©:W}pÊ>ëüFÃѳwné‡7±UÕ^džô{÷Þ³—ðåb6ÖXaïl…½±UÍqÓ ç~ÖZ¢j>µý€¯éjâZ·j .z«Á#êq‚Cjw,»z’j¶õs¹›Fž¥»I=•RÞ«þXõÇ›ÿÅqÞ¢ endstream endobj 1376 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 1377 0 R >> endobj 1378 0 obj 3595 endobj 1380 0 obj << /Length 1381 0 R /Filter /FlateDecode >> stream xœÍË’Û¸ñ®¯À-㪠‚ïÜìl’Jj+µÎ(Éa½H‚$”)BÉ‘'_ŸÆƒø’´®ì9Ýlt7Ðtþº †¿µúÉã0ÈóíΫ¯¢Œ (µ¨1I0ŽP$Ag4D%¨Ts¼éFð3 ø„þ³ªVýuõëo@³Gæ]Wx¹fõ²úäéf `ü#é‡Ñqõq³zÿ—…mn‹£((’ cœE("R¨mÎè×§û3¯xÝHÚpQ¡Fˆ²~÷Úü}õçÍ`ÑÆAþ£­ùÓ@Eð™,Ë<ö%Í&28ÀŽêÓ@‘1h¤ 0fæwQe<Ñû OÝè‡QnÙƒÒ,Ȱ(²¢€OA>p¡0Šny̳¼©³¥R’vñÅxñq>‰šuiV<·UxB:b SÐ|L_Šãºd¯Ì Qf™”"‚G3_.lÇoèZCRMÑSsb¸H.$o¼ÏíÅ#n|=ñÝÉ KÕÔ¦Òã ÚÙ>pˆÍ‰{´þ˜qÐGz|ܰjÏ[ÿÓ–5WÆ*‡èöpj ΙDàœùtCð¢â0Zžæ©XíÑ!ŠL ÅæxÆ*Ù²1¾1Ï Ò°ð‘ ‚ÃarQi«„!ÄÛ“8¸±u@ªçÕ±vˆN¹t¬\åAÂÁ=•ÆÎL¦Qâ"°˜™ûüˆô4H˜EBâ)Z2Ù,KÏ3sã4úNé Q³™rØA- '8…mrœ~çÒ |'¦e3²™”Ë¢IÄ1øPÎøÇC¢I$I>˜Íp¸RYó,ËO¡’+`vŠ‹ï”' ÆÆ$áP‰†ïزø"„åÃä$üN³“" ’”à0œÛz^Ä¢ð($A¨\¦ ù÷ Â, Q\äI”L9ìÙ¶]ÞùHå‰ æfÙí—¬†3¢ápº¼9ìç§šy9‚–µpÐÏâ8Í>q<’¡,5)ÇAˆ@ÝÔ•ª¦¬?¿ ~1…† Ój ؾ óu¸ë YžçéÃkº-Yí0êÜgvˆ8_JÖÀÆxú~ð'\³=`¸ö’a¬8‚hI6Ñ2Q}ùäŠ F–ç9ÁgF+o½Í‰6•±÷MMœ¤#ÖgQkªºB: ò-æÌêšÍŒ- à ñÁ Oüh+ƒžÖºííÄØu°[WG[×·tt¥Ì¢†Ó€£htühΨ•XY\4wQq5)É’)Ãå!ÄÉyž¼,Ä«]Ùî™CèôáÀÎTžâ›“G^Ò¦1ö0ðŽVØz„¯LnEí!lÁdm[íiÕ<;”É,fü&Zo@ç FL;:2ëà{Ô¨zS9Œñ“¶Ò> xWŒÁg »Ý}A{q­ÐE Hç:°µµ+þç+(bƹèç[µÿ”þ^õ?¡êÿ/Ù½ò? ÇêÕÿ*zûÒχָˆ.´9y„©vqhæƒN>kwêÜÏ@’í1 z ˜<Ñ 6o´å`¦°ÂD[î¸õxwfu³˜.6NÇe3»ø~êz!GÞ+•ïa!ï%;ì·ô¦© að°&ãã|}¹éú»8™q]u}Ãûұ߾°)C«Ù5ÞŠoÈt“`@ÙVª~ÔèåR‚•õ­SÍ$䑇7$oåúëýNyœ;^*•ÿFºß…ÆT´=(Ý›Ò rM´îDuàÇÖÞ–Y¤Š í¿‘iuÉYå Ñ!¢ÇmÍf¹Ÿ/ÀkÝðsƒBж¥>²Œ0!»!„ÈÔSI86æ+-[8”u¼ª¬¸ iØô©u#z†¬½.945 v'µœÕ Ròôá¡‹%³~dVü ½H4°õæ–Oéï9ðt†ÚÁ»>ýH9ð;ð/[¹1p3îa`c366~ï»s÷ɸuî9…„Ñ:¶Ü'…Ýk'2ˆN€¨*U±{ŒµÙ: ­êv·ƒ, Öšq‡ÔÜ*äi’™E*çVù2*ÌÍ‚_¡ZbT%ÀùbŠ%K`“¼¶-(Yó=“ÌcM½™ûP[# ¡_Ì=¥T§´£<Ø2ÄÒÚcÀ~<‹ÖÔ v-Ò„…N´žÙšŒŒ¶†•ôRC‰ú¨cC·8d°no:ö„þ®cOfTô¾cG8Í2޽ÎL½Ìú1¤!©8öãÙSÂ=mè–ÖAµË=üѰ?öPw8/D—e= œj[GÎTõ¥»QGÌj!Å«¹Û±±ßk쩤T Ö’×=FSHöµåÒÔf‘ú{¿¿ï¬ŠT6t‘×»æKÆFÿErÕ´€ÜZ¥>;qy“Ð45HÝJȳÎ<ÏJÕ ±o¼y8;Gùx£Öÿ¾«a1Žœ{l¨]ëZ‚³Ø³GµˆÃI(]o…Ò”þ^(Mg\h]_…Üß[mLÂI½D¹ÛU t<ÆFÔ ­Sã•AôQeÀ.¬–due!ái¹õÄ bË*&”\/uq=¿›Ë!ÖSüC,N'!öí®I³±3¼0ªNÚHVíäÛ¥yü4Hð$Þn¹ð”þž Og¨rlÏå½å&¶& 3\LE‚#àÝYÝBÀj!}Šë‰I¶8ãXŠ­ñ(‹—Ê^׎LL{·ðG_[ ?û³K_æ?Ùá§37Y$­ß+׌.¦/_zÀÆ-±Ý+wÐta]sìXq÷ö£á¦ú=´™ã¦×Ú<ÜD³™ÛJ{YI¼~z ÏÜž-ŒÝÂ놩7¿X?òéºK ·-/mÇ÷-‰]èî tç7FßX¿ë=Û‘¹Å‰uíVý¡ûnsÑÝò](¸¶}n g´¾IêÞýÆL+X\¬±`oˆÆÚ›žL¯ìdZ±™ËÀĶ NÆ–WTr°>X½­Úº…8(…õ®gÄ‚c€¶oö ¶™"y9£ns»ðÅA‚I—b"¤žrµ²Áz!qdyå†UۇŸ8=V¢†œ^ßL¥Rœ8MŠÌê¾éˆÑ“*ºñNì{|÷‚‹žp:t#jx5½® — :ào=ºk ÔxÛ §l§–mO;ðsç·’m?äýhK›îõ=©*äó»rFBIëfdgµS°ÿþNyzTUžN[] Àchb¨~tqH§—ÍšVVÌãO=LJ!Ÿl““apã¦ÏѼڋjÃÏ ¬ÊªfT?ÞÌl )ÛbS­®SÚ Òo•êÂ*úJy©^Й!óý^_AAæE¶Gÿ“Ÿ}ïz{ž¹ ”°HºîW]×!¦.EhÃLåñØ¥aEfß„—8ËÝí«@ˆÝ<ÐðlÑ®q»Í…zI?ªÑ’ÿ—!(òYy¼ÿ{óiõ?»Þ endstream endobj 1379 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 1380 0 R >> endobj 1381 0 obj 2559 endobj 1383 0 obj << /Length 1384 0 R /Filter /FlateDecode >> stream xœí\Ks㸾ûWðh§Æ¾)ÖV“Í£6§lÅI«=À$$±–"µ|Ø¥Ý [‚Hj&3%¦FöÁøZ$º|>¢!ÿþàZŽø}–Vk¯V‰•î~G»kÅžåGh ;ðBÇñ-7°½ÐÚ[§¦Ð*ä=¤àé’øsr­À;ë?åƒcýíá—_Å5™åˆûÞœ‘ÊUUÿ|ø™Ä†ˆò’âs¬íß^>þ5´\ÇzÙ ]ìûvÆŽãľµ²}/‘?žõ²·~yü”íó2oÚšµyUZmUÍÓ¯ÖËßþòrÒhßqìÕÒÚüóIˆ‚3qÛÎ9—T5>Ø„j”rÁˉZGCvŒˆ°I£Å7Π(¶c×M’8IÄGöê„B®L1f1Í3ÉâɸúVÇ–ë´:XÉÆ:^$ûÂ^ n¹¾íÚVÍ7Ù+«Ó¾õCí¡òëù¶¯ÉøìI (@ö=Û‡> ûÀwí„öÁ³7Ý P5öƒQNdgö“+ÝÈŽÏ< ÓÅXFB¸ªz#ø@õ|(ð2Ñ\Ó;ZÆ{ ¯`ÂõéeªÛ§8é»__(ÇÎŒ@›¦¹£«àìBX×6áÒ±®‰ä”Y4„ËÊÓ1õfQm7ù̺x'×ÂÉu[ }|cõGÁ£ ámQœXJ¦³—%²ôºSn)”{ÙqëIÔà‹WSëqÓÖî¬60RN»¦­öÄЗ¸ö¼3×r¶´åMáÊN,IÞ ˆ–»†gªÊâH®Û eá5ãMkxö{%Þúwåƒg¨õÂT³|1Æ.Ž–k¾í V‹èÒúÁØ(DÍ®êŠÌp;g›OóÀU’²_Ûk DˆvìÍlàÊ;ó÷^ç­ª2TÎÒ”7Í€Ûj(¯µ€{v@Yµx5ý&ç|aEQ½ÝX>€è AZsq¡j”O‚Üû‰¬z+žÆäüiŒCœ\œÐtÙ/Ft®s‘]Ãb!wŽ.<üB›·Š =ÇöÅSU÷EÝË€TK±O(€AëÐØÜ œd–æŸdÝúÉžPßnŒ¼ë-C!9޹\9ÎW\®´s¹‚OúÙ^_(× 3mš^®t•ãœ]ò{p}ü¾&’Ó…Œ†ð9ò{˜üGä÷]Kg×m9äM¨í¥rg\nlº3l) C¹Åb´å„•—⬠³´'7\¥«órSÕ{U«’°n(çéG‡”ÿHÊBî–-Á(m4mÆëz^Q¯µ8xåki¯ßìY®E;~Z¶¼ÌPÕƒIÄ<¯£3þÚm·y¹íµkdÙ+@Þ€ªÑ[ÞtBÉç…´ ¯ÞðZv½ëJEüž«7!ƒ>\uí¡k×O?Ì+fWõ­ƒe¡ŒÂAGÔ1îİai^äíñbóhÅóJº÷çöï XÞåЀûZ61½ìèÝkEwÍ«è’óLªAùŠÅkK¼x òo-AwíbBzbú]ânZV+c^¦¯6­êêHà='éËD{Mïh™ì]ݨëÓË”œ^¡¯ âdš¥î?G üÓ9Ê;£ɨ['šÊB.”/£p`ÐT·$®–a°’ûM¸”k$§)‚»z?K÷]žîæÅßž7 ÛrP_N¨ösrØÔEøÊ Ñlyf˧y±WTï ˜^ÇËúÑY?¬¶ÏbÐ[¸…Ü™—~ûª‘ÒN4Xª¼ý¡ª[VÝî½…õ¥]¾5{Î}´‰'%éú1Æv&íè éæU`^¦E—¡3Á»€¶ëÚlb{vç•Ýž³²±ÊJèqQ¿{1â8ÎSyïpì”Å"–ÃÈÌE_1Me‰¢“DM4äˆLïÑ›ÈLEòCMwGŸ“í¾&ˆ“)-ú’¬ÑA0³žÎtßé´H:Ý’5M›‰W婌öBI3*±"3£}gÖ ˜¥³ØArž?‹ÌŸˆ‰lŒ”ɼ6%²t*ÓuC‡<´ ±è @°?D Tön^tÁ¡L0Æj[.§xHGj¹E/Nëª(´´ÁkJ3½kH.¡!¸L †*áWæ›öØ#%/”8|V[ìÙ~¼J’xeV»ö<¦Q Înt… qgùæ­½»†—™)´ M'Ç!c-³DË) ¸ñ"ßðîge–~öïÀšæ=›Dwr-\·¥Ð&tÑR¹s?ê÷ÿÄ0{t@鈫ª³Á¢6˜ ¼HŸ#^ÊÔ‰ubí-Û<í³›l¥N¤!B@.Ô¯¬1÷‚ -Ôðú×°k%bZY?µ`îÀ¡je2ñG¬ü-/æÊ*_ÁkÚªæw%/Óúxhñ`Xu¿^!N@Á‘ÚvËòæ7e: ¶~Ðð©% à¬¡xÏ~3{Í<­×Aüžç@fDlé‡iUnòmW÷£‡ö‹§¾Œ=(äNèÊÝ7m.}7è‰üŸ ~¨^H…wŒ~È vhxö˜¡žüý/7ãü× endstream endobj 1382 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 1383 0 R >> endobj 1384 0 obj 2616 endobj 1386 0 obj << /Length 1387 0 R /Filter /FlateDecode >> stream xœí[[Û6~÷¯à['@‡¡(Q—¾u·í¢ûRl’AAÛôXYr$9£»ÿ}EÒ¢D‰v²3/0-ÐÑ¡y.<üÎ…”úq ÿÞÊ?ià4ÍÐj·ø¨Ç”PÆzˆQFHˆ‚S†vh8ÄP!y¬jžàÏ`.Ð[ôû¢\ô·Å»{˜³FødFx'êíâe›žÏ×dA‹¿Ü-^ÿÂP@ÐݦwqâŒ%„$D)i&ÿ¡èn‡ÞÝü¸ÞåeÞ´5oóªDmUÍ«{t÷÷ÅÏwƒE‡„àôÚÖüf`"`&ILÆXêÄ„j F”DùÓÀ1©´ FÔ ÔßY“‰c1± vat5ÆÍ#(NpY–dü„Ó„‚ùs5ËsÁB‡8aÝäÛî¿Ý·T>j¡@0ehHqôv[¤¶; pfÛ}Ký†+ÑÚvGœN>£ñÁÌ ÆÉH3 MÚ2cÂEâKÔo$õ4X®«]Ì{à$À£z8­s[¯Toµi–ç{›¼g1ƒÀHÆAºp`D‹T8üƒ×9_b2&‚4Âqâ}F”ј}Ìþ @ÙûúÕ˜úIlø¡h§ÓláàB@ÙéöåæÜ9@ ‰è_Ϲ¼]†·¿V»(§ñ¦ª$ˆžÄÛU䩘: ‰éÓå)#Þ±Dý`¼o¦Áz]ízÄë#nVõpZW{¥ØÂÐ  .1b([ýTY{AÅ5¢â™7_ ëÜúÑ¢éÁð‚gÀÇüQ’ tt~lZ^b^¡Û”„ ýfU•¥Xuý`ÞXDË?ˆR•'K2M×Õc‰%[”8E7¿–«ZðFXCíV Öä'^ìŸó£üšÂÙ–i¨´«ƒäÂâàF”«êP¶¢¶Æ6µøx€‚j µùNT‡Ö‘E#颮«Zš Ðͺ3O=·Õéq›?lOD)ÚǪþÐÏ«ùf“¯],éªjT‹Íz¹FÕ'Q_cO¤rï-äõs£™=a4³¹hfƒ¸b}4»ÚÙÆÜhfÑÌì€}Ip‰ƒ0g†¹sOthD]òÿ`ü‚©kÄÔ·†NQ=ä%šê@®:³s;|}#|ÝmuÍ—•Ùä©~äq›¯¶=i=yÝS›ªv›:RÆíz|ÅM‡É×$7y»í©V›ÔkÞò%ô-n/2îÀv¨Ü]ϲPÚt§MîøÑ¢–Â"Öùf#êÓ¹ßnJÆÂ¦®vHšØG&ª6݈tŸ¯k`ºÂ“‚¡©‚0ôd!hÄ;–¨ Í4X¯«]x]`ÄͪNë:…^émÃ%F bÓVÿE± p^V¿kxÁÔUbê[Cgãé®2³íB¢\}k\½ò$O ŽO÷š¨úÇÓS¾9=ª›õ¼‡“vwI ÈAšóµÝ}Ú‰¦á¢ñVZ–]cG¬G"â 7"O‡^#Þ±Dý0œ˜²gž@šžpíŠÎ¿ÏŸÒC\X›iõçëïYÆ`ïD1ÒËêQ®êã~ú]Щþ¾ íËFŸjôk°öT¨"ÏQš¯M³¥¹ÛÉÿ!Þ‚s`³íz^°Eôÿl¿Ê |ËR™Xá„ÜZTW± ñ]ûÝ÷¹çMóXÕëÆãõ%º­yÙìò¶Uw1L èæPêT*ÖØ¾Û^p¬_«@ô`±–ƒNÚ]@÷‘?£Z»(DA‚i*å‹3‰.ÂT×öß:cM}„R@L"žJŒ`/fƒt…gUL&æ{«#ã˜c–f*x£ˆ&#Æ·ƒ*JRS“å“z¢Û-oOÄc®k¿$j±ù'aÍ쟫C+]oȼlZÁ{¡ºs™æÇÐ{þ _qt䩎KÂTqù¼ìEðQµ–ë³ÑúOï?Ôg8Ôª¾ïi^{ÂöI7prŠ¢øíÊŽT¨;‘êÍznÚu^ZZªÚ–)ì‰5tF==ZUQLăèt×÷Ú=P›Oј7aP¬Rz2ÁjÙSYæˆáê-Kå+›ÉÄ‹l[dÔLGŒÜŒt+“½p ßu‘|£¬è ûIđΥ¡›ÀÙŠA®ci<¬ºž˜J£ÏOy³/ø±éOU9¤¬­(öˆ/¥eÏt€;æRȵª‡KÓ Ñg[, ­j•‚Ð(šàG¦'¾Ð! ÌIâ8Ëà°s¶!€\æÎ?—Ë\Ža5œw<“Ÿ:Ç ¡i(Îßë¼Êë*éHàÎwzPO­š+ìlQ2êãG&ÓÉæ¾B Ñû=Lp˜@T“„žíK¤ßùgýîp\ì÷(qþ¸ßˬp±ãYç ]`]içÛ?8xømÇ?"dÈ[ÿ¸FÊMˆ3œ¥d—x¦Yò8) F¼ò¬\‹jdkÙ™´¢Þ×B^p•3äê»C¡ÔÔ@ÌÂQ1/å:¦š_/Ct±Žv$ÑÝ×ÏŸùnß')ðÅ è6¡e£Ë¹ÅÔÖ}GÈÏ•"a—fD‚óƒ º&÷¡âe^ÎÔ;üyW ý–×;¾‚¡Z|’#ÞÅÅÁØ_CçNi¥‘I¡¦õ`,ÁIßiŒ´(]5¥¬·èa¯Úÿ 7\Ø¢òrV®BIO_Vw¡ðã ž¦,œXæÈÉþ»!êe»çÔ£ž±Nºúð¡ ™žk™!ó€tßÄÙÁ|qc߬½Yü°ívs endstream endobj 1385 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 1386 0 R >> endobj 1387 0 obj 2531 endobj 1389 0 obj << /Length 1390 0 R /Filter /FlateDecode >> stream xœÍkÛ¸ñ»q@Øe(QòC?ÜáMÑk“ìE6(¸6m«'K>IÎÆhï¿wøHI”í~ËåÏŒ9Ùápôþ¾Š÷êƒ%fŒ£õaõ»¥G(Í,)%8‰SB(Š§è€Æ¤•ŠÇâ‚ÑZÀ÷è×Uµ"è§ÕÇO°fƒð½¬È‚p-êaõÞÓÍ.økÒ Ýê»ÇÕ›Sô¸u.¦ó4'„ä1Lc®þ‹Ñã}|õíæPTEÛ5¢+ê uu]¶¯?¡Ç¿®~xM Áìk³ùýHEˆ™<Ï1™Æ’C (F¢új¤È5»Œ(Æó¹¨2™iL|…çaôÕ(·AYŽó(â<ç¾ÂlBÍ.EÌWcÞutÂPÊ0áðdy`«Àáp2çA¯QNpŽ^ýgq+ºq8£˜ÆsþûÍâva‡{~àž €¢ ˜¢”ÏlD'žE+—÷–eö?>.Ze À±¤y0}¿¼5#?Ýàtˆ!C$ñ$£­ÿ²¸uLâ Œ7x=& †è圼¶¯Ûîþí»åÝ“l™ù—ÇiŠy郑4`÷‡å!õ,3~ºeë<à ‰€‹.×ý¯Ë[3vñ—ÃaG<1Yc&à(Úö¥n–/¥ì»m˶Ó4ÂI’qNx°}»¼wF/0Þ`;ÍRˆW(&æ¶E¹|Á)ãXÝÿu‡ƒB ¡8ÎçQÀ •_+qXÖ ò2l0fÂú£ç$N1ÉáÎd<5 ßËvÝGÕh]Ú(R]‹M¿¦jDÕµH¬×²mQSìö€u5¨‘ÛÍ3ês¦¢u{‰vÅgY!eT‹ÑÃQ®‹íY1,|)º½¦,W"å/Ð!Šã( Ò…‘Dé%NTk`Ïsãj›e(¢9pÑÈ:ûïu·|:Š#ƒHϘ©Jšãí¢"N¡”¿¤|2 E;€UÝ ðY:ø·ª~© Ü;€Êw¼Ú`“ϲ¹psJ=öR”倬):Ç)ÜfpÚõ©ê<68²àör+Neg¼3òIN'>±ôDЕ½²¡4àO¯þ\Õ•|zMûÑÂçúäMí`ã?‹´6â‚p`Ÿõe[71võBå‹CìÉYÌ:#ĵœ áBFÏ#±€o.T‚„¤—8ÝÞµw¹G'ÁÒ Ï‰Ræ8ÂgYÖ/O¯ï‚±ÈÀÖrƒØà1È^|vˆ³µê 0/V ÁĪ'_;6Àh¢lÀ½ƒ4„ot”ƒÖó|z7+t€–­AÈd{¸‰ð¿ "vu½Q¤jGÐ|B©›?3À"&ÚGÚ7âÔÕf×¢,ÏhwÙ:ÆæÆ¢êT®/§©S£¡!¥©ªÂ̦ñ‡ú Üe‚¬vE%Û/‹ßÜ—ïÿVts=€æ¸=uãðád º®«®©K<÷NdÃù,ú(z Ø‘Ñ4`Ôµ!ƒ²'Ðþ1F’»§Üá ªÍ€÷³ÎȥЕŒÙ•õÖj¹Šxµ÷¦©÷ß'›Fv§¦"’_Ž¥¨DW7gt'‰´gHp¦·lv sÔ˜c2Ζ]­i ¬GËÝFkãáÆŒ¡j³dÂiªx¡o‹VÙÈjíUt•F_öÅÚ”õq«ÐîëS¹Aâx,Ï·º‡BÎËàŒ¢$K¯¶‹àžùúkî™s¸¶pÙ5ÐL¸>H±QÖw²=е¼oåQ4BÅRY@¼Ô[Ôwx-Ú6õõNHô›B¶à†潈Àì‘™o|U] 3×þ›ŒQ(?ý“K?£^pSJ&<ß-Ü•³  º*á^¡½,H<×§nÔ Î’‡áæ’0}-y¨|A©j  °#›4nöGá<ÎL9¾68«Ðœ­¿š35!» Aù}ämF/®½%@×;gSMSƒL;Ü÷žb[> +éÁ/†NScêÂC!Ô/»ƒà¾Þ[†Så¶€®|€Mû¬Á¢[ZÔ¡‡ÄJ¹œÊÓ‰íB7¢0î †½ k®»6¸mJ5|g·Îµ¡ŸèÇ9†Y‚’&mžâ˜–5tÊ×€$SvHîD½ªg,Ä>ìêYÕÇ(¿xfMäÓD½dÃøùbA½?Ô¢Y‚cž*£èÿ©–ó~햕ИÎ/!ùôð†É‚'êÜM–í1¡›ÖÙlX+½ÕòËZ;‡ŽÇŽöŠæ¥hå£Ù81ˆo‡Ý©Ù²ò¯õ€e‘go©,”x5`tÄ.¹ÖH¿s›ÎÂoßytc´·ÒŽ=‰4Øžž+Ù9¼Û óÓB/§’a¡‡ºñ¾{> endobj 1390 0 obj 2642 endobj 569 0 obj << /Type /Action /S /GoTo /D [1391 0 R /XYZ 72.0 272.247 null] >> endobj 1392 0 obj << /Type /Annot /Subtype /Link /Rect [ 259.14 509.799 332.15 518.799 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1319 0 R /H /I >> endobj 1394 0 obj << /Type /Action /S /GoTo /D [1388 0 R /XYZ 72.0 769.889 null] >> endobj 1395 0 obj << /Type /Annot /Subtype /Link /Rect [ 373.0 451.337 404.1 460.337 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1394 0 R /H /I >> endobj 1396 0 obj << /URI (http://httpd.apache.org/docs/2.0/howto/cgi.html) /S /URI >> endobj 1397 0 obj << /Type /Annot /Subtype /Link /Rect [ 307.329 320.209 358.771 329.209 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1396 0 R /H /I >> endobj 1398 0 obj << /Type /Annot /Subtype /Link /Rect [ 365.773 320.209 523.273 329.209 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1396 0 R /H /I >> endobj 1399 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 308.209 153.06 317.209 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1396 0 R /H /I >> endobj 1400 0 obj << /Type /Annot /Subtype /Link /Rect [ 440.73 273.747 489.33 282.747 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1171 0 R /H /I >> endobj 1401 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 175.351 184.16 184.351 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 566 0 R /H /I >> endobj 1402 0 obj << /Type /Action /S /GoTo /D [1358 0 R /XYZ 72.0 769.889 null] >> endobj 1403 0 obj << /Type /Annot /Subtype /Link /Rect [ 239.43 175.351 340.2 184.351 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1402 0 R /H /I >> endobj 1404 0 obj << /Length 1405 0 R /Filter /FlateDecode >> stream xœÍZYä¶~Ÿ_AlvŒÌ¨uFÀNbg;‰í1c½4{ZYµ(‹ÒôŽòÛSdñ’šÝvò´»Sb±X¬ƒêŸn"Âÿ{ñ§L£ ,+Òo~Rí)b’äª) ƒ4ÎÂ0!QÄ9’uSFz1Ç!bMÁŸÕXÀò›á&$_Þ¼}cZ¼ÓMx¹dõÝÍ7ŽljГ|!yºùüáf÷EF¢<ì­Š³8(¢8 £’”AWâ_LŽäíí›Ïuß×sdžOÞ‘‡¿Üüéaµ×$ ƒòcÛê7+ÁTŠ¢­ I6 ¶A r]+A¶WYµàðïE‘Ã3‰CWàsëùh„»l8ŒŠ¢ª*ª º‚re:irÍ`>šÝÛJ,亼éôü–ü•È'ä>Ί %· _8¨ƒè‡ú8ön Ÿ_zÊ”ÎÜm=tãH[§åÔÍ~K÷üÜÁ?ÞvxWW“ºÁx ©²œLO°¿j»¿$­‚¸H«*©Î6º[ø´ëYS÷;~¨'ºC–®nâp3g¢ûöqǧE-Ož|ZÂø|êŸn˜™õLÚn¢Í̦—O‘‘GtX>Á Á$ËYüç7D¢íøª©¹j{I|‰‘èt蚃A _Vjyb” ­öÛIGæÚÉ Íìü¬¢(Ú DS¤s³ÃkwýÎ¥©‡E‚§E‘ÛØò¬IÃ}7´Ô†áZªÓ¥¶ßú9=ÙÒ+!‰Þi^-0×Ý´hý#B3D¬ß£œ8ÙìL;æ\œÅm-w£m»9°ðëú=µˆÃÎ,RþÁÅ[åUg°z—ü\p$ËÔ_¼öq˜]›m×®§®~ì‰FÆÇqÙUÑñ‚UEP&H’ÇI\_yýŽ>®ð±b)C1ƒç7Îüõ³Óûï…ÏžƒO² wÅçÐKn¤*~®ûÅ"¶7ä|è¸3ʨœ¾z°ä#gý2;ü&CNTdÒ϶ïûo¿²ìg];D胿ð™ýÚ‘'úhhN§g:Ùí¾Ù{ô—g­'"àRA XÌËhÜ,’µ%[Ê›©{Ä{ì™ÞhboxvAŠ*ˆÊ ¢H=¢¨(º;70ßu©/ˆ‘¡w[FšS‡î ›Þ ,Épt40èÍìS‚pzÇ#ZÚz4›m8ÞÂ(–A“Ψ+‰@›wϰ»áɶè<ÑeT”A‘‚~“Ä#ÏÏ”Nôÿ.kr±Ë³ñ}i=€¤û¥wwW‹¶áA¦&›~‹[:Óéú·M#(À"iûVwÝۀƖy\$‹Tø9Åi¥~Z…'9çŠ 9ñ,@?Œ}Ý •%IPAd¯ò*óL·|÷í÷ûR1 Ö`rçË82Nn<¤mVæÛô®‚û•£Ü^¤›iÚ 8vÏa”[Gß {61 _ç"W;>«kh ã†&–dyŸ®”’JÎ(‡R¤™*9Ñ$yXÀ„Ä>ã?|ù†?5ÎWC”(^ÄIE"Œ •ýN숗>!íÚ×Ü4È`kÔ’Ï=ݤ’ËšiÒi¥4°³+Y•K`Àr2¸é;‘Ìüଷa)æQ8W Ÿȵ¸§”K³6DÖ2ÀtÇ®¯'ƒ· >¶ª`Ž ïÞ[€*AZoFq’›áw¦íén6äu·ƒ %j°Çš[öuÓ°e°åÝ@RÅÀ¤ƒ¾`“+¬G;PTWâÕ,I_º:k›Dýßu£AnE%d°‰¨y!ï?gi¬8¸¡Ù C&¥—¦{껸„*»Œª²ÌÔ Ï„K‘O¡ÿ‘¤r¦‹ ²Ö‘ôDëVÓ \Q‹*$U[ªTmÒ´>y¦²E#RÜr5õœ]kJ÷ƒ‹j‚SˆN‡^ɳí*ÞlÛšE)kQ6iR«!ÓÛSjpj@ì”ÙÄvŠv¨%Èà¨Þì5…Õ iÓí_4œU€,Wá±ÄªÒ¤É•Ñï; Ó;eB)N✳©ÀP Uö¤¸ õ³ÃƒÒNðÁ†zx± gOøB…Ð mýAêJcíL?ÕÃì_üÙ7ó îµj™FNᨖŽN&æbQMÃ͸sš&:OuC;j¦3¹ƒe™èbÌm:ªç=Y½¿XÖÒ®ÇH"+&ê²Ó5–Ù­GAI¶Q£†4äQ§Mºa†¥À”§ OF‘¤éÊ [hÏ]Úè‰UÃØÓz5b¤Ó²jÐ[A¤ÍN']º¹b˜“@¨‘z'ð(ªèµBÔÒQ!¯‚ãm«{TÓ^Ù¢ÏƺYñ鏿U×6Ó#JⲪÒ"óˆ‡i´žûgvz`[eEeXXy8³ßngVPÆàÊÃØ·ôažÇOw;ñ§ j¹Ã€MO;ÐßÅA¸;°ÓÌ<ï·)TÖkVàÚ‚Ã|Ü–Re„àu«"Ë=“ÞmG‹¯RÊóѾÃþUÁ&Õ_$Ô£¿4N±_sëX·‰¸nÁŠæîgj›t‘)Á@OÎdth¶m×,3Y¤ŒU̓ØXøw§¬-ô×EöÝðÞ…YúÕïDê#ý½Œ#eÀa¯•áÆšW¤î\jYÿrv¤D¸ÃiiÄäNZdâÒ‚¿#5'êu<¤:¾ !/°-0®ªò,.òq©Ïêk0Vñ½¬Ì³Â3Ñɲ0v20ñR¼elÒ…,†t¡,Â8ÑW¦ q@¾£³|‚ZF¬ÓÅkÃ4«l¨&àp‡Vhex€gšyCºPª|Aœ(:_Ê52ÐK’UVjG&JŠo"ýæÌ"§`Ñý–´"Ú6í£MЋL¨èiœŽƒÃBÅiËBÇilù óe:jEºvõ/Ö:tç®K§£³7æyÏÍDe·RØ«ÎùùÆ+y dÁ ©®†,$t‰…ݶ$ÅÇ;ã`Çè÷*ß>lÕ¯ùjjíç³>žT; jEu”Û¼>]|ÌD½·R†µú®ñ•JQ¹w×R\Ïdq ëç+âó"HÅÄ8÷­,}Ç=¡\nêr-_±¸™qye€<™ß˜Ü]±”o+âsÅÕ¤:‡*³÷$Û|w¿‰Ÿ{ ‰HÿŽl6r-ïÎp3âñ(Ž*›?(ie%)®•òˆ"±zš ìj ”^]/?i¿ƒÀðð¬/=ÍÆº¡´"‰=‹þa¾ö•­ªÄ¯‚ !HRÏÜß^\TÕÆeŸOl.®˜„Uê…æ|b@Ä/IðQQB·’šÙõ³¯ôâHž•›‚éÓ2,ë‡UÆA¼z¦•oB÷Uᔬp*?õ(¤n4åô8}™/ø¢â›7°áÝÁÔÚVo Ûq˜3KwΨ–¹‹¨ç 5L¤âÚ&íQÕÃ˹KÉ«t£%°ÚAï“ÄDAÚïo>à‡DIë°%hñÉÄth÷˜˜cdµrŽ¢EéÖ®£‘]Äþ:ABµ{¹¼|ÏèÔ7cѲÇ'nìu~³õÍÍìí endstream endobj 1393 0 obj [ 1392 0 R 1395 0 R 1397 0 R 1398 0 R 1399 0 R 1400 0 R 1401 0 R 1403 0 R ] endobj 1391 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1393 0 R /Contents 1404 0 R >> endobj 1405 0 obj 3106 endobj 1407 0 obj << /Type /Annot /Subtype /Link /Rect [ 205.939 711.509 240.389 720.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1394 0 R /H /I >> endobj 1409 0 obj << /Length 1410 0 R /Filter /FlateDecode >> stream xœÍÙŽ#7B Hhkê>ò–sw{d^‹L°í²]™:œªr{ûï—u°ªdÏäm2š¤$Ф(Šdù‡ðo#ÿIÈ‹¢d»öáMY±8Ó¤4àI”AÌ„G)kÙœ”²F®!@d ø3› ø‰ýòÐ=ì/¿þsö,€uׇàsÅêç‡wD6=àÏI¾€¾}zxócÊ€=œ‰ãˆQX–%X´àqTÊÿ"öÔ²_¿ªÃ~»gbßÖ]=Nƒ˜ê¾{ý{úÛÃO3­ã àÅç¦ô»™ˆà4yžó`éLŠMŒ4  G94d‰â.3 j€oЬ$¨Àk?úl„»íB9Ì Á…ò²„!^Ì|(Éï9Ìg£ÝÚW")×m¥“Â]Øk¶‰SöÕe¬FO§Ê€b·«F;°ë»ièƒÄ®nê©v+ûƒ‡Ç^Lb+F‹Õð\ Ü O§ $é‡êÑ·¶šDÝxø‹ý¾îŽ#j x€Tó(X¨¾¯‡j‹Â$ã9ÈÔÔÇÓÔ¼Ò¶š®UÕÊ?^~~÷w‚‹nO°Ÿúq:Lá„ú¶›- ìÀ&·ç¡ñz$ȾëcWÑ §ž*P·ç¦>Pþ~[@Á›ƒ°ˆÑ­èıj«n’kÓ˜K{Ž>ˆÁ?pîDZÞ6w¤§SM&P¸u‡æÕŒv§ºzF}²%£»¾ÝB ÇF’v ͹‡iU|wÄ®’¾*Âgê×H’…ÄxwS½“Ù¢Ô.… 4$èöqR•>©ÊµT¥98„ƒ°†/é}[OÏÕ®>Ô;G¡7 )ýö÷j7T&ÊB¬Í‘f sŒ`öF± #¹Î\dÿè(ZiDã›óeÄ cØ2.Ê2…§zµ Ü_矞xf®Š2ò4_¯^Iç"V7JpG0þyc­hÆÞacÝ€[è˜€Š‹]/†Ê¿ñÌB&§µÝ¥~3¦“˜˜´ÉȺ .†v8>Ñ18ÆjèDÃ0H؃¯;&#¡r9˜)÷Õn`.„ÖnWÙù|-GQòHžd®(Ç÷Ä©d6köè:ªuµ# f‹q IýYJ'4$Ò„Ïb¯ý°'+ô™xØŸ Æz¹˜+ª× úMÒhï`xÂàF&‡¡o×V ƒpam!aHØ*d2¥Dœà?Â>5‚½Èš„Fÿr$¤s_c¬Ð¸ö8DžëêúHp ;B=þ™íwM]Í6“îé±S/ìÎ~1‡†!Fseó‘Œ5CÚ5†Š?J×O7g»GSï¥ä—3Äã’²£Èx½å„ôýÌBDÎÑc“(]Øä2“䡲7T'e/õx²4—n Þô;ÑXL›.Òhi↑¹z|5Ç£ˆãt<ª‡Qý" ‚ÆDx„{K6lψ9ï_[ á¡jû©òèç Ýç’ƒiJ"9¢` û¦?×ÂÂOßýôæíOï_»ÕoÜöÓÉ"öèM:¿ô—Á"Äù‘€ëø\: ÷DËé`9-’eh5FE× `Ø(o°¹ú†z­g“¶AŒŸX~Ú•3—1>7RW:Å¥N“åkJM‡¢ôõF‚J=«™Nt¾<q²e€ÅìZŠï2iÖé¯ u¤¶gßWqi&ξãÀ‰â« ¾½ïY=~m2‹ÒS …EÄÃê¿8ÏI-$¾f AËÌ3W§.l³g‡¾g¿‹Ý¶ù¶¿Ê·ìfF£ê˜iY‘ /“ää”sô Ð[#ú%›ÐXxq&ÒHEº0’]‰šEúµpȾワzÏ•ÃP„1 !ƒ'2“¸•¦ˆ#TÈÜáxZ Ì¡gëÖ(äb9„Ô0÷)Ößô–8¾·­n ÑB¬zœ)ì±x™/ø[S@:«j ³¼A»K#U1áÍÛDwÄ/m)CaßùJš8,xZ$A˜¥ ³ÝQzJ@É]Múï$öj{UÒIP>ÖÊðÍ òR ØÔB1é ¤Ó ’ QSÕX¯ÌkC•cH¨7º‹ZŒy™‘I&>¥ã`¡ô7P<Êçþ¿Êó¾°x;ÙµúÌÜôýg»ƒðÓµg²K5²±‚SS4/zkÙŸL`óá¨#ŸÇ¬€ÅiÊ“",Ë$ÓnÊcÂ?Äð9Þx,á½åY‘xù/•'Ò·Zl¥!ÒŸ+ÙëW)ãË8U­Ee¾=ÔÛ‹Ê-ÙôóS‘AxÆõñ2`֜ث  ;çÉíŽ}-DlÖnø˜Œ…[â5×טƒJ|®¯v‚Ç ðËøG³·(\Eû¯¨^ ÊM½Ö*)F„²¼™!…eÊó †“ËSX›Íø¡>o:(Xúáƒ}ë<§(/{€OAèad%ÁÁ£Ã‡;£ßkär8ŠÎBº‹©¢§¢X?WØm/‡<0Û®eØüõ¶cƒ¿ÝYivVç­ —ÒE.åE•°/‰rž úžßc¸F…Â.Ýýâ5ÉržÊ¯YE^|¬x]Ï]¯›¿²/þL›OH³T3Ô—>ÅÖ\=:¬úŸ°¤¸ž$â­x!ƒ©'°þj†ˆ´4wè03Fd'è*"ɵj‡‘Ì\O%c—m§ÒC¿rXXÂAèùª/f„õ¼æi, ÷žÙO8Êaó¶ïzÞ¾ÈÈSûþõ''X)x~Ђ¬ˆ“üîcYVš€‡“° 4“o±ÜJ#Ù¼ÑM–GB"¹£#šÞ…FmŠd:I2¨mZi|‘(òSOyšgCãîÝX3¡ò®Ë©vZ.Ô>ƒZ­e<7ÉU{C‚ÂÃdT*“R—úv0JxœÁ}KÃȳǦ¾Œ²{+õ‹ÆÙwªÒo𔋻¡>O£ü^®üx÷âyæÒÜ)Ì‚05Ùø“ŠNi.™Ù[…$úT!E½TÚ‡ÊÌ5ïâµÂG¯zu#¶Û×½gwcè`š¡yÌ…,"û™ÂËc¸¼s ¸"ÈRƒi‹ |óˆË˜—\:H’=,ï<7aÞ[iw¶ïžFœ<ò­?»¦l#êùtþèwWÐ/.‚ €HOJ÷¦#ŽÕ“Ðá {gé·\4±÷jFJg$ßsù"miî\HÝ$ Sú© ‘ ² :¦Ûã©ùNåÒyB7Y»F?­ >Ö†\ËøæÔ·Õ›óªº7Rcÿ{ÚŠO¨M ¬¾Ã—AŸfÚz@u)aÌÑ©O¥£†Ù‚ñµ¿4û¯=3!‹Š£4£H7òßCJ¶˜—úæ}£ºú±Šyðw2&¼(Ì~-r¿’ÙÛ™I7S±«¢Ê é‚RýfF7V°ê ß»ÜÏk–KŒsŽDœ‘ãÑRï¹ÞJ©O"á!)°JŸØŸÿ$È×ÒÌÏ4n¾~&T6ƒ«fš†ÍA…¨wMÃ[;]æÄꞸ£°ÒþûÝô蟅 ý3-?Ï;µâ$ Ó¼áN«yÆ6i>¯¥×?ƒ!áF#ôH5Iªá¤ðc†ð{³ád 22NæCy?‰nG¹ës1 0íEd„ `jË`&·ÇPŸÏ-aŠW._ ^q†g§ÍtrWG¡~öøîáÿTÛÎ endstream endobj 1408 0 obj [ 1407 0 R ] endobj 1406 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1408 0 R /Contents 1409 0 R >> endobj 1410 0 obj 3212 endobj 1412 0 obj << /Type /Annot /Subtype /Link /Rect [ 194.98 747.389 250.82 756.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1259 0 R /H /I >> endobj 1414 0 obj << /Type /Annot /Subtype /Link /Rect [ 278.87 747.389 309.97 756.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1291 0 R /H /I >> endobj 1415 0 obj << /Type /Annot /Subtype /Link /Rect [ 244.217 651.621 278.667 660.501 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1394 0 R /H /I >> endobj 1416 0 obj << /Type /Annot /Subtype /Link /Rect [ 260.063 413.081 294.513 421.961 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1394 0 R /H /I >> endobj 1417 0 obj << /Length 1418 0 R /Filter /FlateDecode >> stream xœÍZKÛ8¾ûW½—n ­ˆzknÉ&™ÉÎv6™v0X¤ƒ@-ѶвäHrzüï·È"EJ¢5Ù[ ¯ÄG±XoÏ·%.ü]ó’€:I’’ü°ú&é”Äñ#I ]'ðB×õ /$2&…¤âkŒ§FðÏh.à=ùsU¯\òëêó˜SÖ=¯Ü ›‹­îW ÞäÿLü¹d·zµY½xê’ÍV‹Ø÷×£iš‚DÇ÷RþÇ#›ù|ݲmñX¬8”uÙõmÖ—M}ó…lþµz³ÝÚw]'ùÙ.ýqÄ"(MÇŽ;U&±4 àŽüÓˆ‘)ÄSF¼þ{‘ewƱk2<×£Ÿ†¹Ë*Ã, *§)|r’‘…þ’Âü4·›ëŠÇùº|é0™™Kwîzv 7díQ' ×}öX±NãmÓjð¼Ïzö”–e]Sßj¹9iÐí›SUh\7½¬æG™[ Ã5ð¡éïc‹Öô‡ë‚m³Sel]vø~æÅ=wróf»}¸!Y]SÇH¿‡£Ä¢oã©Ü¨ç9iâ‚øÁáÌ6z*«J-‰œúÄX$HÞÀ„]' ‘°(ö=Ë"xÍî°Èsᤦ…Ô²HH7ï«é"?vÒN‚+ZNêò¶<ö¤¬AI²Â™,pÁ€%A€K 08颼µ}>ºxó°m¹;ˆ oËÊX#CŠK®ahš¹/" u!ÚF‰o‘Àáìäõv9:yéÒš¡Ã©ë-RO¢É T4ÈWbqÓ>+ë£Tp<øE„WÝSy\׬ç&Ñçêvø„N}¾C×g­>K& rv`òtê˜u7>ÖUYO™¼=¸Òd"€õzr•ËY]äZÖs}'½Éêóš#ã#â2R0éîŒ7“³kc¼†˜M(t`ý¾)ôâ¥p¨“aõ ¤]UBemi1/~F·ãi$[eÞ“,ÏY×qóþ“`BÁk‚Žå§¶ìÏ+€ÎbÿžÉ“i¬Oã%ûŸÏà AƒÌGE ‰äu ŠÊÉX$Ñ`¿z¯¶cÕööâþºd‘é~%—RHÅzDF¢(†»QÜš¹¬EA8‘qƒ‡Šè’™Ï“†Ü‹DqÍ(åˆ!HŒ›­õz‰q I‘ÞP""Û¦R°>(1¬(eŸh›Óno9Ï8¤ÂÚm–3‹yøa0¿&”Ôkœ©Îbö€z — À$qܪg8Õrò߀€„ÔçÝÔ²Üà(«UÎ/0ø‡ïà¬.܇?¦FeÍÓm’ â†D‰D¦¬!7—n,¬¥DÁ¢ ã ÅeìZæPŽrWÃm[Þ4I€òþRIkÂŽ‹ŒS¡YX"š(4F(ÕÚ¶ÜPe$˜ÚŒ”ÒüŒþ¦VÖ·ŸØÎp„Ξ-="—N„Àój”@âbð=Aè?”˵)…šÛçjHmǼØC÷â¸ë¾U/¸Ÿ‚á×ýcæp~ý §¸oœP˾ŽÁèj¤þJh懊&3DóöJˆdL¶ˆ‘ú>¦U‹ʪª“àT«„O¼¯ø®ôƒìËejl-ññ°«ÌÊa„é"Žñ.·amËGu#CM§Ov$úÔ1[71œ\‘—à¢ÓÆ—%<Õ¨J‘' |‰ñ¶áW7§B`mKÑó–³ãÜ=׋O]¶ÓHØUîŒsÚaü؈˜/9S¢Idò$“£X,×÷ãÉõå&¢›Ãï*+(Q Œ‡:.i=Ä‘>d|ÌSŠÜh³^­»úeÉ‘븩çBèÇ“ÿAˆèòúÕû—woy÷áëËׯÿxsOˆ|½{yÿ; O›ß¾nþû&}ã—üúéîÍûÍËco|J o°ð'oÏG›Q$Á…íº¥Ý.îºÉx?”dÏ»†ŽúϽ¸ÇÅJùQÉd?Áßÿ¿!ÿ…t´¡¸ÍŨŗððLý4I=©U/…Z¦"ëçîAPŽ-û^6§®:ß´¦Î´91–ê2"~õ‘»ÊΘV±ïY­w‘æµ|”1G™„ÂÒè-¢ãÑ{$‡›cc7Êc“%’‡ÉÁ,]/N|ùK/X:¨:гBlfÈ¢ÉO\¾¸/LÚ±“fiÖ*4‹>õ†âwæQ摈†Niœ¸òô÷ƒ±å*°¤@ù»²Öø0D"5zbì8 øbµN1€~ŸõøÁGN¤® éᜉ#HçAÔh—㯿´ÉÀу SA2‹9AÐe#f£™(¾Ø6ü]n&ÏÏÅÒ15c"&¬¡¨U¡EŽ™‹†&WHPU¢\¶7æ^ôÏ4¥å¿i§!s².~§ñê“õ"óÛp]M<‰uŸñ¤O+ µp4º“)"{²ÃåùcfGÝ.0-ÂË ü}¼IbÍ÷ÜÆÊšWú¢Å>–¥%P(óB<õ’¥Âs>ûW¾o´—Ý+$¨ž‹oô®LôÔŸµ¯,ÛëæbÕ|ñÖeþ¤q% ¦Aø?жŠÒd"‚¡mÅ‹pѶx¸)öà ¯†d+ ;P\g¢ØO¥ú&0ä·¸Ø9ÿ‹ÆÇÕÿ2 } endstream endobj 1413 0 obj [ 1412 0 R 1414 0 R 1415 0 R 1416 0 R ] endobj 1411 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1413 0 R /Contents 1417 0 R >> endobj 1418 0 obj 2733 endobj 1420 0 obj << /Length 1421 0 R /Filter /FlateDecode >> stream xœÍZYÜ6~Ÿ_AÌKl`F‘¨;X,àØ“x±ãcÁÂãu‹=-[-µ%µ'½Çß"‹—$Jã}s.×Wb‘UE²v¾\ć¿¯ùYxY–“íáâ‹ä$¥$L$+ö½ˆÆ¾’ òhLdÌŠIÍe,‚* þ¼'\4>ùõâÃGSä.ü…ÉÅTï/ÞZºÉ@OúùäþâçÛ‹‰Ià“Ûqqzyœú¾Ÿ†$óBšó¿(¹=Ož•‡ª©ú¡+†ªmÈжuÿô#¹ýûÅÍíÈèÐ÷½ì{³ùíHE83išzþô,‰iBägäŸFŠL!®2â øç¢ÊþLcßVx~Œ¾å–OP’ziäyšçðÉËFG(Óµóݘ7?,”륭ΧVG¿.175IÐVBÚj\“ÌulWnŠŸ¦#a:ê{aÑO‚É|?þ3¯'s¢,O=ë¦spfc¯Ëé(ê˜Ñ(@§ !/7Á²ÊàùŬA5®_OG%.­(›:\а‡cÑ÷Ë ÓÀ¡Ë§ê rŠ.©5»90:† …yž¥òÂÜ<%‰—“'U]+ú¾+šAb»e½6´šÚ3E–ÅPlŠ^cT޾¸( éî]úyæe)¨ŸúÝôîòká°üµ"­4ÙµC_Ø EâF¼í)Z\R£S£=Éi>c_4½mÇÓ`¦-úùýK’‰Â8×uÀfûSr@˯bF‰ïžT;ƒÎíÉ€š_-Éö40Zeñ`Qþ=†¨dá\Óë—‹gŒRº"hétä9þÊÒ¹Ýõ¾í-UÅÉ”4\œÓ•wO=û„ݺ4P_‰ö#ˆ3+éc×~­J6ß‘4›¨{)¯ì%)zRN>´]Iö¬!ýPtCÕÜ“¶a¤ÝîXqdȶ®X3ôÞÚµ ê¥YæûÔŸ†_;æÎ‡-ô€FKS.Dô¹ÄJHŸvÆt‡ëA}.ðhT_\cÖ ¿tÄõÿOáÔåˆCÛ´ÞáÌo½ÿY‰ð‰Kœðÿ©hØê ƒ¢' ³oôAœyyJ!/ãHÄ^`. "í%Ôñ^b¼=’ÆøÀŽRÈù¶¸O}h(eQ;T}4ðÓ`MÜhƒ±ß¥9?å–…"Ëjó›Òúû⨓‚˜$‰ÁµœJŽ[›úõªaÏ%ãŠU5 ‚sŒD—“swé™oÛYãTœD(ÍSßÀ>ûcg-PÔ+ʳa|nÚ‡ÆÒ­]ÐÓ>ÈÁìuå°?£ûa¦3çó3cGW«Ž°?¡1äÑVáÞ#`cÓWĈ ZÁîŠx\²]qª¹/Åþ]êÐ --^2¦^@¡Áˆ|Õ—Ö°s 4¥_YÑžôՄئŽA»ZmVm³LÔx‰Öî(¥¹—ñÒ-ôc\IìZâ{©JèH½&eÁ!hÌ6zéž±âܲÕ$øJÓ2;"øõݳ׷Yw¨ú¾Â"G°,Ô²&·Š>Á»ìÔVy"y‚—qÐ!p­>‘)iÕ‘üÕf$·á ÏyB’µÒ›ödÂSŒô®¨jÏÀg–TaÈžmO]5œ¯Áã%³¦ßõKoIdß 9çdÏ$ûPÝïaŸO¶ÔÐ:º¹8œ¸"ˆDú Ý]Yc„œv§¨}û`˜Ó3ài$kú“( § «AQeËúæ ·m3•žëPÔÕ¶jO½ù^Š+ÀKöƒÈL<`Z´Ø&9½Ã~ˆ³¡vKs´ÔáÇo_ð‚­8_~žះ}1øÚ0VöâüãÍ‹g·76猹½±&+õW¶uÔ Pz e)¨eŒèÛŠÖ—ra’ça8 Avµl óÕ ,…FÝ?²àÒ8Ü MÁx˹”ßLËý[®mðów7ãïï~£Áè!Kº•ŽB|=Öl™æ(£fDÓø©ö' yÇ®·¡>ˆŠ¡{}„¦}‘Œ¡õ,ôªøl–ÙÌŒµÀB Bú󦆶ìKõ|pW±‘š•=Ñè¾kæ©w]ªdAUFåË‹žvꤎ›-Ÿ"6íŸD(+:l[® ïU°Gâx1Ø0î§¢«ê3©Jn궨±®…z¤Óð5õç~ÀŸkäºÜ"ožJÃ<ò(… dáZ*ÃT ‘5ЩÁQ1ƒß€÷ï;&S*òª¦ …¹2¨šûÞ`ÙðH`Ⱥ†ÚúÔW‡c ¦Î{Ö,¨¶…Ø:¸çUE»„êRXs¯D~2ñ &xJy$nEþâ´ìê9¹a’@]J‰0-P^…5Ž£oÌhÈ€¹“JMOâgzY¨ØƒÔ¤“´Ìy¢øpØdûP‰T$|C¢>©®Ú‘„“oؘÉ-}$h•X§²öxáI³‚Ø©‘ܦ=ކ굵çÖfæíˆ#ÖÌÆ>é¶»§Ç„þÄ1²x ÀcSÿRnøýÿ«JíŠ/Ò»cœÅ’¯«t>H=3HØîGŽ¢¼ä“—CÈdf­pŽŒ#öD:¢®Û8×àrÜO%_Lä"‰‹Ÿh£I‡%™Ž…n!MtÉŸììíxˆrè±øSENåÜûsÓûª_{¸‹þ nw&£ÕuBî;„ȇÅE ¬ÈBŸÜç‚×ûÅ…?]“üHþ½¼h@h¸xÇ™Sת»åU¡‹M3ð~Hs—¡úùÔŸKB\–ÜAm²¼*$ÑÙä?ÆÃŽ•!?çÿ]5Ò«Ûä隬çyáßÿ®~Hv±Ùtìk%Ê[XÆ* úÙ£)j‹Ãc6’1јG[˜.ÿ¼àˆÓxbzdÛjÇÍ s”„Uˆ¦Ê#—Cøóâ²D (eÌ@QÛ!yùª­5xÎj~®ÚZ<Ò"•ÖŬÉ_7Íù"² ’‡æb3ŒÞŸdéÄ'Ü_ŠôV€ï5‚äyI‹p‹¼Ë»§.1´ iûœ]i®ÊƒˆÔÄ”n5É_5À ÖŒú̧Òöê–‡NÉó‰STú£¡Guˆ€¿÷á™—G¾—Ì»'Ì»÷ þ']Yr5^™äZpwÂßiäHy4–â{s)#EÖmkhYÏIÄšÒRÈê^G?RÁÄ9üMžÏqŒba‹T]‰kŠ@Üx$¡'áOU¥f($’¶Ëé„éH«ßáã5Òâh ¹1ã§x¦Iߘ¨þ5‡ÕXÑ*Mñ4ÊÑûêèúÕžN#ªü¹&Š”?ÚUWŸ5ä¿ÑÔLôÈþB€°‚ìO[3ðÕ•†øâ„teDä㬠KXckF±®kÅï\rÎê9ÅL/¯Œ _ëÃ4€â)ͳŒº¼ñXmù¹—¦™ÄAä·ýu˜?yð §q†B®‚«¿óÚO;Iœ{1•‹ ÙßE íÕP"ƺŸøÚ¡>Œ0‰-sß1~¥¸I¨;$LQ³ðª”$$áMóHê4½¤àíþÀúc±e×=;ˆSâäÁ‰S¹w¨x£‹×r×µê7zô9 ŠÇ0äeM94xTï0 Öä=ëÿã{{ñ?DB/ endstream endobj 1419 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 1420 0 R >> endobj 1421 0 obj 3037 endobj 1423 0 obj << /Type /Annot /Subtype /Link /Rect [ 216.94 367.526 328.87 376.526 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1259 0 R /H /I >> endobj 1425 0 obj << /Type /Annot /Subtype /Link /Rect [ 155.5 282.62 243.55 291.62 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1259 0 R /H /I >> endobj 1426 0 obj << /Length 1427 0 R /Filter /FlateDecode >> stream xœÍÉnÜ8ö^_AäÔ ØŒHQ[ßÜK™Ãt§m`At‰å"¢-”ÊîÂ`þ}‰ÔVÓÇ$‡â{â[ù6ÒßEðÿ^ÿäŒà|sx‚2ŠâÔ¡’3šDQŒÃ4A5š£Tiš`AÇüÌö|Fÿ>4‡ýãðù ì)Qto‡h‡¹aõxøèæ6Àú{Ò/B/‡ŸŸï?$ˆDèéä]ǸH²(вå8¦…þGÑS>ÿðPÖ²‘ý ø Û m[õ?~AOÿ<üö43:Ž"œo6š©1“eŽ–±dØÄËQš)²­”ÆZ`wUŽVG¡Âë0ún”Û 4Ã!E‘|Âù,„HœßŠ˜ïÆ¼u°P­W„SƒRÎøbi<ËWYs¶km¹+E4Zü*û®â× gÚ¦’@gQuˆ?·—Á`-Ï÷²%?1¨À,ÏלyY¾µª©WÚPcJšPº¦FǶ®ySbg‘÷ÆûÀhí Fql€9^ø¾;¶ z¨*ô#ºgÎÑ-X¯<ÈÕË¥ÍЇ(áÙ BuJ ¢ v»•è…z ¿j{ìá'¿n„\ÈŸÓy¨‚Bе!Mê×]‚}'Y…Ê»òz'MÁ;.1­wúNåIŠò³6Êg>|DÝYÄÐ[yé7N«·³Dßñ£¸ïEǡ⠿͙fö䉴ã&è¤Úzú¡” žÀ'¯À©UG±Ð|mu–/¬ŒêFŠá>¥DºŒ)>%Vœ€²Bº–¶›¤ˆq5­È³ &HüÕUò(‡êŠ´{À[ÆwèÒ‹Y®JF i–)·b|²Öíê§ù rÔvÚ0<’›’ç 2胱f‘[ªµƒØ¨)h†i^K-…978Řa MÆZàØ6¯B ̃oAò9JB2qj——®êÈ{1aLf7Àíz7ázO ½Ä²žgÓúµÎ å…Ÿåñ¼ˆ=m-„ÏÜZ£Çµ½ Nµ¯²4 «¼œy›Î|52…kãÈ9û·¿xÝUb7> Œ’ÊeE‘‰;W„ÖI²ÞfÓé§å^¦;C±Çj9ÙìRK ×LĨþ5eáÃï¿£Ÿþ¼e ¥d)z7ØôvhI9ƒôÍ\;x:KS¿Sh.S¬9T €ðKX祋5ÊÆ¯MÂŽÀX“-4¶>f&ŒÔ6¿•™”&8¡)tÎ FgÝl„4‹Lây”®YF†¾3_ô;- gö. k½ƒ³ ¾õqv>I2×MË2±­aòºmª£ÅÖ}ÆufHg‹,¡9„ˆÍ8"PENšUè³ôŠ£ p‰™«€×¦íú±“nG$L98ͳˆÑ†¹¸ã)Ò *ôŸ)ƒVÓ‰b¬klGɦ@3Yí·–Ü"ÿ/ú|C4œP¡*šnÙúÊ«Ë~¹'ùMâ/7j]œÄ8ÍäòÌ ¶¢?*iZÒ­”³-4&®âþç!_.Êò{ \LAí Þél¯¦kÂO(òUHfúÄ„ìÕ¥idóа©á ×V&Imò”<~ ¿¿Á丫üØ?GXOûB­“-Îó…gJ>ðgèGZø;syo—º à z´ZÀÌmviU±k‡žEÝ–òtÀW®$®qÙžÜ̶výì¹öbØRÏ ›`sÑ™ö“ýÚ n‹s/Àxmü«M‘ œ©.Ú= ±ì}ÍD”± FºC׌̡”¨ä¢ãÕ—ç$Å9Ô÷"°_³A0Ö¢ºUZXÖ6,§ë “#÷g3hºp3…B‰ŸÄÙߘÍ4PTä Y´è—4¢˜†N1c u \8¯¨ÄqL¾ÖøÆ#Å›^ÂyUW f¬gÞ¼ˆP>ãZµöÒ4*vM(â,ÖCKÉÂÞy!HIP4`œ¡PL®`TÇan%zQó¯Â-! Á[ØåÞ #‰Í!³ÁyË(p碔Ãj§Ôû ‹ óÏ-'’›ÌU~mµñðXUò ½î]Z9¬¾ÍÕpV½ÇÙÙgƒ…-×áG@ÆØ#þ¨„Ù Ãwñª_ÎÚ|h8só­ÐÅ\ÓÑÆV© "øì¥rY2‚“ĵÒ5 T_ ¡x‰FçgiRyÐ94f:Œ3_ñº0%züH¨Ú\ò `PUí›®*SuÕaÏ_¹¬´ˆŸVÏ)3žÐsi”D0ÖîÆ?´ŸƒæO'd±÷öÚw¤0-lBܼ&iŠ `E‹øï] “Š !¥ãXï Ojnö¾ìX˜ŸNâ8øï®êXÀåˆðt¾.-¨Ú£èÍsE<4žÍz}©L ùrOZs¿óÙË;^”2el}L¡ÍMÔŽ4[IóeJ)T€A6¡¥l\J/€¨ô)\ÍÉ—m#Öohá¡§”a’²àÎÙ˜íCOãt±÷—³p³ÄNbêèøje.Ç-°œ,ÒÏM–»~†¥¯äkÈÎõ+Ù ´Oi£!Ïp=ÓNßµï‚}CÀ|¦†]«†—×3–/ýjèh®'¯¿úµ™‘ìÒêd×&¬‚/&¦,帴Ñ…¯íEMÀ·‹P× ²~º)ÈÆ:öºùmPIï¶•k›Ë¦E9?¹½²ÞòK-ü¢'3R5ú¥­ïÚ¦ÿ1›C—&©~øÏ}vh hÿn4P«tùÝb\Möߋӂ-ÈÅ`kÞ8»‚‡>þ¡ßú”>oݹwµ¢$ÃÑ-b“ÿíe7‰qðO‡ÿ‡‰ÑO endstream endobj 1424 0 obj [ 1423 0 R 1425 0 R ] endobj 1422 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1424 0 R /Contents 1426 0 R >> endobj 1427 0 obj 2128 endobj 738 0 obj << /Type /Action /S /GoTo /D [1428 0 R /XYZ 72.0 707.015 null] >> endobj 600 0 obj << /Type /Action /S /GoTo /D [1428 0 R /XYZ 72.0 395.909 null] >> endobj 1429 0 obj << /Type /Action /S /GoTo /D [1422 0 R /XYZ 72.0 510.371 null] >> endobj 1430 0 obj << /Type /Annot /Subtype /Link /Rect [ 389.465 97.475 425.565 106.355 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1429 0 R /H /I >> endobj 1432 0 obj << /Length 1433 0 R /Filter /FlateDecode >> stream xœÍɲä¶íþ¾B·Œ«æÉÚ—Ü<•¥œÅñÔ¼ª”Ëã[b·˜Q‹m-¯Ý©Õ/ÎmìÃh@¬Ôûõ)"øÿYýSeqXUuМŸ~%z”IDÊ£0Kò(Jƒ8 “<8kRôj$‚Vkï‚? OQð×§Ÿ5mÁ¾ëSô€¹fõéé£'-øk’/ NO^ž¾ýKÄQðrt&N“0J⺮Á¢U˜&µú/ ^ÎÁÏïF~lmÀÚ³Ä4lrøæ—àåoO~YiFQX}mJ\‰NS–emI³I‘ä¨~Z ²Eñ”5ÀŠÝIùßûÑW#Üc*aU .TÖ5üV+Ê“·æ«ÑîÞW%—UZ»¢¯tQqÖeEQ’¡®?È™£¶;V‚ i&QZ×U^↗ŽßeXïøùÀÛ–·oÙÌlr¿'1XìÓLjÙb­ä“9ð2ÊWÑÚU‡Eôó³ Κ†Ov_#‡y”}hðïúÞ€7¹ØUŒâßW++7jµÖ§YXïÄdÁE+ƒ°±R¹µR%a–ÃíÄUzϸéäuxhá8… MaoTÄ÷{íÙlh‡Y¥.·®‹}9β},¤™ªP{“ä 9fg¥‘CvÍìd4ws·tîœ=AÂQô| - î5ò½«¿+»½%ÑýmçõF!’uîF¹œº@÷阌Ø;ž0ˆÀ\P¼2”ù2,Ó"©Š)m„e‡Álš®rl'Ãï´gð¬‚X„:VÍË,óŠè“%bÞ2:F“œ–ËE޳ûIÛ—~ãÍ2Šùf GÎæeôÉãîFO {—d¸Ž¯|t<˜lÜ#_ä4‰CÏCKyé„ûY M¿´|ÚÜ•²J’m¬‚R>Ã5è€væß^ÈÊÏJÎÖþnÑQœºÙ¡SÓñ³cö™2bç¥éÜÊe¼Œbrk•[~þ&´ø'ÐÀýªŒ}†Å£°#‹;z¦ÅFO£’–7†L­ôÑÁ`0éåpâ£G€fg˜ÎbžÑ†ƒÏîÒ3LíþÛì¡>_9_-èüó›^ða^É7´W£Óx„ÏÏýã0I[æwyZY rÚ6F~] ÐÕÆ¬pNLˆì[‡xÇ^…\FGZ&1œì5ɱ¾KŽuæ©ê7“zG¢çߦÕ$ÊßÚéÎnäùL¶DB•Ó¨uQmìä“q?D=ÿCBFä­ˆSðvæÌg6w̳§Ø&Pu E´}W؇pc_tzÑÈÄ5Ñ9KC_8¿Xjgø.OÛ›‘Ï¡AM5ÐsàÄAcÖ Âtætá8ÞÞ8Öîïøžï•Ûü<ÍlœÉ`QEÏ&yб:è‚ùQ’™°V+ô«˜;ŸµÒev­¤;«—þ‰¢ÓýÞÒUº!mÐ ½Å=ÌR¼Ý±QµÍÖúÆ É¨³€;(¥$ )îB+š©¤Nëfàå#g*fw.E¦E„Ô=‡ÀXäTŽ¡%Œ°¸ûz$QÆEÕÔîOñ20˜»õú*X05£¸ÌÓÿû¤”ÖUXˆQ^$îM) ƒ?™š©é™ƒ@ÿ×CS–¤a\gÞ«ï÷8†G®â#|à7I}ä ˆL¼x(fI³Îç^µèáÌü*<‚ÛCÜÎüÑ!ÞCÜd içѹÞVïÕÊ2ÓÏVï=Os¸Èû‰&Kó±· :èâô,ÀD,8òkÀô\6Azëù+ƒ€€eþcâŠqWYÀµç)½B~N’|³.ß[÷/lŽS|ó>_ cìi U+šâ±yŒG‚{ŽIWO醯v%‹ ÷“}aÃã†Ýã: ?PÃȵø°–º‡y{æÀïÞk•  }X›]†E×#⫉Ô3t“Sóá‹çMƒ‹¤FŒÍr~£ÎH=ÜoÓ¢ùmäüyhg’Oâ4xòüßBŒ<ƒƒ•gíX£Š·ÖÀ›$Ç̯åG„>T¥øeP-°~¡A"MMˆ 6{¶D‚3%âú9æ(G¾¸Ï‹üN¤QvWFH¥Ûg`¥tn”Æ×ã\w£&Ü k Âô¨­aëäˆzŒ`Þ—óN€$4‚hå¢ß^´c7m,xéYÃw¥jT‹‰OGH›Pý'QÝR]SîM’Gù½IÀ{åó…“• Ì—p7™ê¡ÃS:ðþféÙ¨ÛÚIY9¸ešÅê+iõVʺ_÷A¢)}þyÃo Á†Cƒ?¡§‘{?¶bRÏk‹˜ìf÷$­Ñ^6º²lyü,uMIèž•%ÔØÚwÆ4¦rºEæí4­TJëJM-Óyaâ`;ˆ)pê®”üÕÃÒU’hžLfø¹û@[A^äaT$uU%ÕïøB«v¨!©‚ަŠRS/°Æ•ºß,å[µ’ø~©)èÉ“Åm=-ýVq1L3x³/ÑÈóhAsψ™/ V7m.š˜K B¼1?(U¨ym¥”vt*“J=SÛ7ÏÀ•ºOÂüîÂòaù‰!ý„5Š0]þJ•ìtzŸß¾œ;ªk¥¡¯›¨ÐEàð–;áY¨I©È¢8-Þì(î×akŸÙÆžŒf‚ÉàøÕ×)=0!"n¦ËÊr”>P®Ót/É6#™ûÊ…ø‰W æ5cG/5ß­ô¢: ô˜ÞšžÄù‚ïUD˜Íû•YlÛ!³€O8úþýà¯üƒ&õXµø›W]‰]DíüxzïÑ©¤Z9:¾ÃxÇjØ[Ãü ›åˆÝ\¤ž^¹õPN°×FöûBdÇ.ƒÚ҇˔1tJ£Þ†×hPmý3Œh*u®î·ªJ¹£ŸšÜVú©/¿l?Ç«Yˆ™Ï‹1z#æ´¥Òg"ü_ŒŸ *Žø_±Ùá‡Og–¹Çìñó ˆY‘Õ5DîŽâ*ð”;=~DËÓ ‰aöö; L¸‡Žô“¯ÕÔɥߋ¼*ÙF>Çz´¸Ò·#DÍ­ †4¿ø»ì î¾ÝÓï>ω{,—‹Çþ ê\{ïˆtSˆœÙÍcÚOÒÇ(w#ª>2ÞäàˈEÍJ/¶OÊ6õ6Ûª¶¡=ã§ÂÒ¹ÂÓ,/Ãj…ð:Ú­÷WP'Mø:ÑšÜ<„„ï6ã˜F6ÐDööO|,…ùǹœAjy7÷ñé¿+x{¢ endstream endobj 1431 0 obj [ 1430 0 R ] endobj 1428 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1431 0 R /Contents 1432 0 R >> endobj 1433 0 obj 3193 endobj 1259 0 obj << /Type /Action /S /GoTo /D [1434 0 R /XYZ 72.0 769.889 null] >> endobj 1435 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 637.65 156.1 646.53 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1429 0 R /H /I >> endobj 1438 0 obj << /Type /Annot /Subtype /Link /Rect [ 474.725 576.73 505.275 585.73 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1437 0 R /H /I >> endobj 1439 0 obj << /Type /Annot /Subtype /Link /Rect [ 138.0 564.73 193.84 573.73 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1437 0 R /H /I >> endobj 1440 0 obj << /Type /Annot /Subtype /Link /Rect [ 196.307 352.73 241.307 361.73 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 492 0 R /H /I >> endobj 1441 0 obj << /Type /Annot /Subtype /Link /Rect [ 423.84 282.73 468.84 291.73 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 492 0 R /H /I >> endobj 1442 0 obj << /Length 1443 0 R /Filter /FlateDecode >> stream xœÍZÝÜ6ß¿ÂoM€ãﱯ¹æ®‡´[‡n4¶fF=õÇNæ¿/%Rý1‹>¦)°üÑ"EQEIóçCèðïþ“'¡Ÿç…Wžþ$~èí"/Έ•~¥A{aâG©wöæ¬Ô«µ #"KÁŸY[À'ïËCóxÿzøýhSyÈ]‚;ʪ_>3Û¨Ðß“}ÜÂ8üüû3ðó|‚w»,'Þ¨‰‘Ô¨?Í YBìeÆÁàß»&+‹ƒmÚ9ÿnŒ ¼ãÃOï?‚M÷tp+*Ûù»0,Š]QÀ'? ý_ä=½ßß„aúöïéß?=mEÌw3¼u°DÚ.-•AÜŽÆ{QùCræ†À‹B?ÊwAdþÃI\Ùyaä{O'é‰Ë¥V¥TÛx½ì^d‡¾Ñ¾Ýpl’Ãÿ~¹ª(ÂUvòPí+ï­÷n½yoTï躘À/òðÏä]OL´á‘ió¥ÏdyéÚc'μ/18Ô ³C5wlÚ‹òë±kdž @ppTËùÐEÜ)Y°rÊŸ£ì#ïüÐ{sèÚ³Cd‚É1ËZÉfè}Çy:)¦‰Ó3=Ì%ö+ºQ¥:Yõij DÉͼªátG}%±=ãðˆáîØEàŽ""ÚÚ¥U n<·ýàµO+iÕŽ½wm»¯þZI‘,”¸@‹ã'Ñ8°—ìCÛÔqì$kLŽ0t?ˆn/Ž1 :პéšâÙU³F´füÄ,ùL/Ì÷‹åâ1 &€Õ˜åɽÑuå«ë/†Õw_…3¨í˜gn޾ˆ¾WÍ‘ï|†Éy·vd õµjpåÐÁEûcTã§Óô©ƒÎ0¶!H§ªéëà–m×ÉþÒ6™¤™½€½Å´r—’‹IÑL=%Π/'š! зc óÅqmå)L¥N! ˜òè8&z'a<Ñd‚‹€U(Á L+‚=k\B†9b¤R·òÜ—)rlxÚï0áð3øLÞ±dÙ–¦=ñþãn#¿‡1å²4¦=C{[¯t+µŠÊ<ñ½ÁæÉnCüù­ñ lE;ù880´Ž>‹¯Ò!tJïÙáëÖŽ?ÔµÃ'ñ"·uËJñ^O¼£e$!Û.oD¸š6¤û²S¦Z¯(K¢…KL^6Y¨÷06}ë\SaÎj™Ì ¡žÉãœ&¨à‹èthÞ-T~¡{…à }2 McÇA¨a)¢s‰£Î—Zžg<óxW£•1DuVêçRúð¢ÄLÎF&1ÆçÛªaôA¨×1–>"§ë§,ܶjpã[‹"›·e){mF›Øº¶^È…0Õy ÑžÅɆŸ„?ˆpïÖäD×C);ã] !¢‰êOíXWšv J6bo3åžO·¼®™ÏoÔ°ìºR½Ö±L†ÚàÛùXpçSÚ•<ˆ±žßúŽ÷?c/JpF¬Ø€Áf˜ãn.Š ¨tr“-ãLA9ã4u²nEuwMDyîIZè2mCŸÓ£š~‚™ˆ¹Äs66W“¬›v²›©QC¿áõ([²LI‘>”ÚŒ„àzâˆö)bÀfìÑûHý(ê MÁŽÂÝ1&ï!­S(îÒk­3ƒ7F狚±è Ð=ô÷áõêØ€yàBáA)kŒÓ‡„ÛFqez™Ag;TJÁXºH§`Dþa`š0Ä¢g´#!97•¨[¬xèóüÀ‚LÜ^ÕU X©ïT,!8 ÅÔUêp€°´àx{9\¥d6 Ñ.Zxd>†ªÏ9#Ь[Ž]„†¿*¬8° ѳb¸ÛvÕÓLoÓ2ã9byi-îû¶Tb|ºdÚðQž,|d†›¦fT9Ö¢³¨ß §ŠÚ· { ÓôYŠfvhšF[5ÕŽÃeœøÃÄuü¶c|(•-º*¬m4-_¤kuj¯–Æ#ŒÑÒXJ,ÍßðB‘-½€!Í&*ãó”-ç?#7[+5ú*åÅ!JKŽÃhR‡;XÃïYdê&Yý]IÝ@gdê©\;&ò…cè¨ë¢ãض•Ch>Ò¸o¸ ¬£¨£™C16ú¨ÔT²ztÌ^E!20r¬¹gBæ îpÛmʆËRÆwŒÿ6¬S:£6@Lái:AÌœ-3²²w.!#ØKGke7d¹•ÜÇ£u™a]ÆîÒR¥ˆr Ìo8€s”̈ºešÜòDüü†w-*½áµ†È³•Åú`¿ ýTß7ưíýpéT3žá t·6IÂâ5 K«­¦™ÿãeþ7I!ÃÈfë*³Y?#ÿe¶dËìÔgvì¨ÝUÜz¤Ì¹7ãK-›ª‡GDÒ7åSÿ3EÆvàl:Ùf¯”±.Û¢]äA¶1ÈCW¿ûðŠc3?N2¨=ò-i2òÉùî'1ì¼»,‚bËÕïúû@ûd¹íØ*Ø\©ôà…òäÕr: zºdjBxM çÞzvM«—ˆü&Lœ›Ã­‰*)Ζ™žJ(5à¾}aðÔÖUïàÐì#-L¬íMáææÀoúö®V_™p ÇwAõ#±úÙgß10û ýÎlíµWýéoèØJä»e"§zµÀ ¤ín2)ž>´gy޶ü‰õQu½k`–’¢6Á€wƒ)Ò÷Eþþ??M¼ƒ€$ïl0W£àq,/—¶c™:ɵe¶Bÿ[P,s ˜óóÓû"D!ªSÝýDºéÓÔ!âg=´Ûœ8%tlvc„ ¢$öS}9”¤á†1ÏQë}HA":YJC½¦×œ>د…§>awröüìùµHãœÐ0ñ¶ ™DÒ$^0 ç k'Á24âl‚?a;Zž ÝóF°Ž›#­vDÀ–æ.×›a@*v’íDÒ9'™sw2I¦ƒ‰¡~~r]àLXõ[ÐÉw¡f% ÇgïI¸ª¿uG¹ñ°Ô·i{J†aŽE¹›¹|#¼B8ÆA¦÷ íŸÐ”­ƒi˜ I7ékIÛ_‰ïe¾ÅŸ˜Qj²½ÄWCc1hÈé'§cúDÚÙ1Èù@L’ü膟ܰá×h™çŸ§‡³4@g–õˆ·ðÈ PDpwÛÓ÷m°,ñjwÝË+Û^_‘t}ãîG—ÄÈÂhݰs -Dz'jM·ÈˆJÑ1„×õÔÃLˆwqGU2Çý£™ª_dÀVÛ«½ªÕpc†q‹Û Š—’9š鞾š }+4àÃíxÅ+¡b*‚ŸÜ{L¢÷\¬è«r§òÄVÇäyCN”;œã‡£Px!ŒoãÀ,PN#éz¹¾mx&]¦õ½¼µP™Âv}|.mP1bk“KVWtÅìì€O`=b>ÑŽt@,• ÄvºÙìÛ]w"CW|ÚUŠh úÈh<msÅ[>B7>âF®.xÍËý2Ë©áуíIËj'a÷Ú~±@„u~ö½ ¡¹øÎ÷¨KVplfàó^ã”]–¯û%?ÇEöš¤góz˜i°.z=%efNè7Ž#¿]jjÞˆ®YÙ×$”Ç£ã°8BÆ$n²eL G…ÏðÓ¬½½¢íŸ8sé¬iŽ[‹+ —iÎÇл¹s0«3bõZ¶‘6Ò´ùÓ‡p|Q3…ÌCÈpeV^04åðÈÝ MÃuS*\›q ÊÜv)KV¾ã|:lx(^¦ZH~×ëh‡±³Ë> _Ø/2¸$åC“çöÛ‚€½½Oؾ¯€»•!]tËŸqf-CÎüàO<6ûï´[·8i²ºEf~Ü,:@fî*©µcز®ç"LÞEâëI•'“3¯8ndP.G Æ¡=C&)çmöŒ† êXϘÕ\W[á‘.ͳ©_Lõˆc°D`°èíHö"€ w,7?d k'„äR¦ÉúÔq.?\[Ö««™†ÉËi;Ư¿ü¶áŒÕm½ AšÀŸ0Ù_õ>û…Ý燿!DCk endstream endobj 1436 0 obj [ 1435 0 R 1438 0 R 1439 0 R 1440 0 R 1441 0 R ] endobj 1434 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1436 0 R /Contents 1442 0 R >> endobj 1443 0 obj 3082 endobj 1446 0 obj << /Type /Annot /Subtype /Link /Rect [ 426.1 175.639 459.97 184.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1445 0 R /H /I >> endobj 1448 0 obj << /Length 1449 0 R /Filter /FlateDecode >> stream xœí\[“›8~÷¯à-ÝU1ájàqfo•­­šÉvïîÃôTJÙV#‡K{ú߯¤#@ À$Û½fjœ®JsBçHú>#úëÊ6,ö³æ¿BÏ6Ã02âãê«ÔÛFàîFª|Ëôß²\ÃöLÇ7ŽFWå)F¹pê+ö«S–Éã?«le[ýò++“{î¼²F*U=¬>)¾ÉìzIþYÆ~õããêÃ_}öŒÇ]ÛÅ.«Ár,Ë m#4]'âÿãñhür÷xÀ:R£’ÐÌ(pþŒóû_Ç¿¯þòØi¶kYf¸´Vê¸ÈPiõÑ$ªqAÇ4P#¿Õq¤/‚•ŽZ¿G]¶4-ÕaH‹qnC›À l;Š‚(b·Ì°"Û±§³˜æé`qº8ñEáµø_ÜX;üRVÊuÓZ¿QúíÚf¤ú½v¦‡ª¥ïZurúéé;%íô,3Õ /#.̪^ónˆ¾á@–ÅXsuëR3ÞM¦»ÅD·µFåð(ƒ¦ô|ëÓ¤–֘΋ô_ K¼¾ÇÞ߃×áß('h›âÁwÂ=sL‚ÌyC”97˜}Ìþ@©ãúݘú3Þ¡*-‡§Y;2홀R§Û7”>玪çˆçôðõF»ámÞþDGœ ã VIVõ Þ1Om 4çõ橺z͸Q÷~]ŒµW·.5“]PW7jº[L¬€­QSÁРæ8Ñ”j~hY»¡b‰¨xãÁ‡h™CßÛP´š 7|¼>Æ·’–öö/´2î Ÿ/nwÅViÒŠ'“ÝK#£æjGRÜå•ÀªƒuK1éô÷¬ôÌ_Û!oåÝ9'¥*£8ÆE¡(JªOÒåZ>¢Í"ëüm€-;tÁbF¹‹k70#ãn‹Ûk”¦ôŒ“V¶à:Î1*•Â`‡ínÅ^xcä{ÖÇQ¿£HÆòuG><£üƒæ¯çõŠ¥tÿ!Ç»d›˜'’H»Æ~hHCOœ»ì³‘6îhÞ^7ý bI5?Øv+*¤0Äh£Â@FŽ÷UŠr£*pþtoN0” äp\Ú„Tó?ÇÓy­ã½â^ª6 “[¸Ópĺ '˜ºµjšàÖUŽ;Ð+[÷Öô ²2Ë“.ýU]˜š‘´Ö‰æÃä·&:7p-\ׇP¸ÞÄ~}™¥K ¤n0[ÌxG0ŸÀ³V#Ь¹<H|h$XÔ1%E‰³ÂÔ9“3hjíT‘¢@Y¢JiªHqJpVІS64õYÊûؾ`ƒÕéD I•@%¹1Í2—c·‰nÐë³cUˆç(­Øç+²èÔZ(ê­U‘…Þ§œötìý´}&´*Ò—÷üYæŽkãi$z™¹FtQ¹?À¡«g%¯Dv1ÊÈFŽ J ÉŠeŒò*:ºSÀŒf(ìsKáèÆeó›ì¸–}–þÖ\“Z>o ‰€KÔ\í)Õ}ˆú˜aŒ¹€s-…N‹ëD¹.¨Ù Õdÿƒ£·ÒÐæÂ¶ú(jv1kG¼c(-h+UP!>¡\R|Ð0â­<™é-¶í>ŠA¹˜âÃŽå.q‡.5ž¥­%žõzKI]½æ ܨçáºk¯nÝ›Ñuu£¦»ÅñmÎ`Ásœè,-ªùoZYr|¤%FÉ‘d“Tø†«EâêÚðÙMß…Bf”ý¶ ºáêÚ¸zÀ@Ðx´±]«k‘*»òÝØ-A¢æºËX̆Œ0ç¨!ež>¤H‚.!SÑü¨W®“Ý3§»"–)šEx¼«Àq•“òÅÈIñery÷Ü%î(¥&ÐÓ¸Á+žÆ2¹A'§´™\Ýz0#»è™Ü` “«XUÎXÞç8Ñy‚¡ïœ÷öoä4½¶ß@µDP];)Qz ÅÔ”…BgtoÁtÃ×µñ%#Md°½ùÏŠ€’$—©9©ü’8(3tœ±”C|#pì6XQKGH¦jÎ28¡”¿¼ž'¨DÛ:zàFŸøÎª˜äM7\-W׆ÏT h¡¹Š~¸’É ÛöÔdP-REÉ ¡[|nSÄÎ MHŒÒËtJLˆ‚_øcè‡”Š—Œf/GµÄ\¤0t˜DãS<5%ϪL.áóÓ:¦¢ý¸S„Bv H²± ¼Û½{™iÉx˜gz†ÒF. ì¶-n&¼Ëéñ2תPœÂªá%ÐÈU ca­"yLKHM\¦_UA²=.13Ð0™§¸ÄÉ$_ ý%níêsжþé ×½Ú ÔÐObÚïHš‚ü¤îA­š>‰ië_°ôèdI1=ƒ:Íò¤{FÓžù}‹6K%ÛÏ|‘0èM“§È– ²ëCééŽ-)øé~ŠO-EãGËmýS¼Ö€µ‡æã»µÏ8z›&“’’x’šø€rÏ DÕ¢ &Žmsn²ƒT^-fø¬Š"—4‡/I2 âK¾H×ÕÌ“Tc’¼L›šÿÚðmK'Vkø)õ¼,æ°à«ÁfÃã;;ŒÊJ¦AótW9kL™¾(Zš¥ú÷†Óù™å>ÇŸþ!õE˜*¡¸xº¯hä9})±.¿^jzS=KäGkV($yÀ„&"gÕá´vœ:Æ]e)d+ƒæ8\%d'F¸l4Täjƒöà8\ÂÇ£œ ÖNlŸIyIÇ^Y×( ej`ܰñ X9'zȈéñÈöS,Ó‚%n…ÿèG{D›dóˆå W‹ÄÕµáóñá§uúÑzäï· :¹PìÜÎjÿöcž‰Äœ< Ò??>(g-ЏÅC,D?“$81Jj´rbýÞ¸á·^Rãk¨Ó5ßÿȺT$ •\Aýº•3Pÿ[ªØþÆÀ ùœä„ø„ ÿÕÓz½ìÈÈ^ygÄC:t£ X3t·áUϹ ™˜{iq\Ò\¹Ó¬D$šÛÎÂÀ^Û³EJlÙt (`bPð…­¢øAßãk ÿ3z„AÁZ‘Ø£-}ÆïUM“º’2Ñ«ÖÂ<g’-8ÂÿfÊUÙ)‚<Ø"%¶IW^þó_ãÝ)1 endstream endobj 1447 0 obj [ 1446 0 R ] endobj 1444 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1447 0 R /Contents 1448 0 R >> endobj 1449 0 obj 2698 endobj 1451 0 obj << /Length 1452 0 R /Filter /FlateDecode >> stream xœÍYQܸ ~Ÿ_!¤Ù»K¶e;( ìµ›â-Ð4S‡Û{ðÚÚ7{by²™—ûíGY²$Û'×§$KÒE~"%QóiCPÿïäŸ4"8M3T7Ÿ´œ „¢iQàˆÆA"a£#šŠbTË1AG þLt? ÿnšM€þ¾ùåWÐ)Qã^6Áラ›÷ŽoZèïÉ¿í7?ì6Ûw1"Ú=[ˆÃgqA¢‡4“ÿ(ÚÑ/7÷å±j*Ñwy_µ êÛ¶o~E»Ÿ6»IÐaàô{‹ùýÄEÈ™$Ip0Ï¥ÁL¨d Q姉#sVÍ2‘¨Ôß«. ×áe}7Î]Ï –à„,K² >át’B$ Ö2æ» o™,Túe¢†Ô¢“¨+eq&W±>|ɧš«x·ï²9PQŠ"†–ÊjÓcBJßÂÉ–Z.Ÿò·sU0§× nß²X*¶Pt<ïyùd‡Ñù0Bƒå¸ò‰\Ÿˆ„>×fî“(Z*Ý=̵bÓkÎ2ºÔÿÏîÝ]ºânæ³6Gæ ¯|¢kKŸ×ì/* ´³‡m–(íÝ¡襪k¤ õŽÊ¼ÏŸrÁ…¶™=ÔCÝÞça©Lù…q³–2ß=‘”yÇ¡¼)¿qjĘe0–ª{ «P®Œ\úÃHqÈ»¼èy‡xS´eÕìѰôxÄÚWÇ$Åq uÌÂHg‹?¼ÿEWzGß»|mõHDqÈ`OÌbâT0z߆tS´MŸWpDýKëp§>ßõüKï¥K–³’Ç0ÙçuÍKGZ5ó«•d8ÍàZ’ÄÍö,ºmÝy½€8ßámŧzu£0^³úøÆE£]nv$ŽfCô¢èa)º—Ç æÂüï,z‡­«õƒË«œ,·†3g]^w¬|ºš%4Œ0¡p ÊÝh1Üñ hÇ¡ÌlŒ-Øáw> x– %r¸¬ï$*nØíúŒÍƒÔ®A‚õƒ…,Œ·ž¡i†ƒ‘)Ñ%ûHi<Ó‹}z?·çÁ¯À)‘;LÓöwÈ?sWÓÍ%Êím¶íù‰wÇJ¸á W[CîµÞ»~äâ£Ã]Ús7ŸôÚH'{õ×î È gÛGw C7Ï* IÂüx¤Ö¾HÚ8"™cµ?ô#£Òa䔃’êÎF_ׄ$Ur«Æ«QäfÏEU_Œ—•ÂTÒíÙØx9䆮,%¾y{µ†àÀÏB 7Ø42mZö‚$<ºúm®'MÂé¼bÒÛõHë‹aÇ \ãÐG¯þúï‡ûÝúÛýîþ‡û¨|’°¼Z ,I}^,ÝäK ™4üK]/le+&¯!°¦PÑ¢?#~<õ<qy>žÖâ‡Ë Ï‡µ^!bpôh ãpõn´ÔJfNIæ,ôÙô¿ZÑï;®‹LJTQIÊ­(É H]hšÆÏâОëR3Þ5ùx“ï¡3íÙ‚“ܤڤ@—š'š$œE3áX{èÿ,¬8HqÇYšÄñ×Òj©ëM«˜Ê—*Ø‰Ó ùiµ& ){-T«ÔsÑoU†m÷¯M’öc’a8<ÿ²®†RŸŸž€XŠ ‹ óˆØW1Zèú1Jƒ5“W1Z ;Éʃ{ t¿='\VȨϋµâc$ÆQ7lÆ&÷ ¨áoo–£(‚kiÊ–ö<ëú•—  Ef°,¬9®Ù{¸¸/ ZÔO‚qÏËQ¡u¿›nD r‡vû©ñ³ºÍûL Þ/ïŒ&Óhòì§®Ò³Â1F‹‚ aØN6*–Õ}ŽÒ4TÃ_ ½ïÚóÉpí³!ÝÜjT=°°ðP™mgT/¢Há™vß¶¥Õ(¹ý¢°PpHåÂõ^ö 6AšT}ÕÜ<_™Mã•êþBsz­#[“¦T@J2lª†S¸(zlXµžÂR1#fØŠvî4WGÂ6¿,ÊÒ, žèxyµ&Ã(ÂI*_çA{1ÒNí¼ŠŒ!_Áâ¹êÔsbëªñ­@L¦3É7 '1FŠéÕ6ŠS¢¢ùÅÐy-ZÃð²²ãsC=Xë±*óÌÍ^Ü^ßOÇ–9­?;ç«à°'”†µiGŠþœ×õŃ §h¨­A[ÝèÂ@ÚþC ò‘P™4CQÞZú"c êÿsUó½c½µóTÂoCÅ13ß "ëÜKòîbì/£ OèI> endobj 1452 0 obj 2268 endobj 1454 0 obj << /Length 1455 0 R /Filter /FlateDecode >> stream xœÍXKoÜ6¾ï¯à±l†/Qdom“(І]ôäÀÝåîÖ+¢6¶Qô¿w(iõX=ê 89,9šóýuCÿ·áG Š•Òh—n¾¶tŠb†¸lIÁ‚E„pDfJј¡$` vYÁψö'ôç&ÛôóæóàÙ#¸§ Y8¼>ê~s7Эe€õ[Ò ãæÇ‡ÍûO¢=zsŽuBbŽæL‡ =¤èów?ìS—9_•¦ry†ªa5J!*èZƼó¦É‚^%€T¶Æ×&Fæ?Üj(!&£÷6±•Ýo˃çj$»Âq‰µEˆ¤ îþ%Ë ïÚ{ÿI_»Z()è‡ @BÏ ›‰–Sú¼(ƒè¸BŸoO‹r(å+À/è¯ p×P^BÚ9 ·™Ií²\ 1’Á1‚1Æ_ 31P 3Éü¬ß•® oQ"„© Ry|†8xôÝ ‚cô]u²ýfo*³5~@yrÕi9˜ÛïVܦ9ŽƒéŒÍ(ô/ncL¯€q/ÿÞ~³¥I¦¶ lMÍK¿Ù”÷…ݹƒ³ûžä²~mœ.;&äÎ$™ù¡1d*¯´®NΣ]ž¦&ÛãAÔÇ+%P(Ô>4-Õ†ý's^ yÀHÈoÁµ´­ó‡:hê:À ®Íó®:—=”êÖÕ´Û<¹ÚlÕ{²YóÌÞt»Ò‚w^>ú|î€)íᜠÕùwQÇùžsäÀ‘ âhâ—=¢êÉí,Ì rÞççmuƒL…k|…RóßÑÖìÏ:¸hUŽÌ·Üí‘}®læÝ7‹NÆ•Å9I ðJÑBÜ0£j ÆïuÁ¶“`Yó–Ç…ÊÅ”Á)‚°q[kzõ\ô JcÌç‹Ä¼ø`Wéì½9Z”Z_ÿ†h— óÁÔð¢ÌÓ¢Â3ZNk;¨Á„$)ô&)¦%½¢ª”W¸¨uSɵ"]²‚b"í²ær¦4Ö\ÎüølÒ"±kwgP1RihÈ-!4ͪ)dê~k¾¿æ GòhéHð"ñÆq¹1{›^Hd¸¥Ë¢(ŸÕnE†³2تKE¼$aîšâ*%V„Fƒ‚õ¨n2FùàÑ%7E=OÉ…¢RAû„ëZDtFFç§…¥J®ÁëÒy"ŒDX†¹AêhV¶ªƒÌ[_*µ&@®Ž XÄe4Ì1_½$£r©,A5æ1#D3õú1P„ , Q/œÐĸ6 ‚jÝD7®‚œ®×GAÁúin=gîù¶´Gû\,6D­œ°6 BoÃx;æWƒò9ŠÀ^ ŠÑ0Šk붉˥)N/¨à)÷MKöp7V»SÍùXwÆñœ˜nÅ¢„«$<¼—½ÅcHMxBP¸ÒfÔx»> endobj 1455 0 obj 1412 endobj 1457 0 obj << /Type /Annot /Subtype /Link /Rect [ 303.25 298.329 334.35 307.329 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1394 0 R /H /I >> endobj 1459 0 obj << /Length 1460 0 R /Filter /FlateDecode >> stream xœÍYYÛ¶~÷¯ \ -2,WIì[‹n º%3ÀÅE2²%ÛjmÉ•ä¤F›ÿ~I‘Ú(Í<&Ä$}vžó‘þkC¿;ý‘Š“D¡ÝyóW·NQ̺%I°`’ލÀL¢3/ItÒ<ƒs#øÑÂüˆþ»)7ý¸yû4"À÷aC„Q÷›×Û:JötØ|û°ùê‰(Aû>Äœc%cBHÌQ‚9SúCgôöóo²sQM[§mQ•¨­ªSóÅ#zxµùþaä4''ŸšÏ¯G&BÎÄqŒÉ4—Œn×`ÅJÔ_ ™N­–ÑŠõÀ~.šLf“¡Áó4údŒ[Π(Æ1¥JÅJÁW8¥l-c>÷æÉ´]Þk5õZ$ú¸HíjY_BÖ×>4ÑŒ¨Î÷Ù6ýzJ âÁ<‚ƒH":‘÷Õ”΢Ͳü”·yÓÞNyÏɦœ”t½z÷ã/SÈ[Φæ9êYFµ„íÝNDl©ŽEƒ>§²V¢†Ûb{*ªC^Ž7dìnP{L[§u äíq(Q,¹œkyÇ…á1e‹#è#`½HÆaK­sD}}¯L1#¿ é¬U„P C~mòÚ‰èxÙ„“’2È’.~÷·²º4E³tÊ”.Y>\„ÂOIˆý³¨ˆR‰¹ÞZNd€ó.[VÅâ5Î> ÉœSád™3KÛt›6ù²f(æ+üÑÛew“*€®QQ(PwÇE¥Œ5ÎÇ•3J1ÑYË(¤ô§e¥Œ¯q®Ä˜1‰å2ç±jÚ»—¿/+†Ê¾ÂþqÍÛXáHW ½}³¬TÑ5NPº¼±œÄ=y@ë~Q+§js%ÆœQ,—9÷Åi9‡¹k¼è_ôvM5”Â8”üº:”éyY± *̉0Æ_¨ŒIŽ™‚ý‘Ð: Ëwy³«‹‹Fˆk B&úè$qbßäï«?¡à§»]Þ4¨.ÇÊ…Rdš$r5íëê }!G‡â}^"í^ƒFŠyg¤X @µãVÙ¯U»ÍG…G`ž¤r¹¯ÎÐE  øräòòP”`¼›ŸŠ?û/ï_ÿ\´æÊ˪õãæz¹Tu?ïâ঻ªlëê„ýÂñé\‰ç)•`"xíqîTše«­ƒ' Å´J`w>§eæç®‹BÊã »ö¾ó:Ïlw‡]…¨ºhj‘#üqmZÈ‚öZ—°ˆò¿/§´LÛª¾¡3)=ä8 PBÑשˆäl‘ùúÜHv“ª<Ýü¤6©è§í±û]é(m–zÊ*ÈÔ\ò]±/ò̯¸Â~åe6lbK™C˜òzbOÀù˜N÷¦òp¦Ú¡5ÕŒ‹²ÕÅâä©nL_øiYÕ~ì ·’Ú‹ó!,Rð}Þ‹±>a?ÿ_uõãlÿXlÀ÷„O|÷»Æ˜NOã{74¾ÛñÀw»00Ô.lo~h÷ôV”¿ô™ Íg~nñj@ÑrÇ‚ UpHˆŠn¬ /’W8½êÊTfìç}(ü.Ùé,f@+9Ñ£½ôQ³Ûú]N¹žB¥1UÛ‹œqtm‹SÑpØ«=ºU×zÊŽWºnÓ‰€î“teý7ã]wŽ ©ïÁ+Œ`XÂ55‰düd€# _éÆÐ8Æ@Ö^B ˆëKɈóÞ&œ ¡îæ:`Ãpãçz­¯>rpq[ÁAÚé)ù“>O4æéáÇŠË€ÃGŒoò43.:ÓØÖ¿r‹ˆS*h<—71ä©@ €èú!£oXî*°ìƒp>æù®h YÝãtôÇütA鶺¶fu±{3"ú[ê\ô3î~ ú?5ï J$¸³øÜÜ€P¹•¤å‹ $Ïœþ©ì™sèkÉsÒGÈxÂéNÌH€c]6C'ÓÍM3£—¿»`£Ú@3Ý÷4ŽÅîè¥Vnt®²°6_IÍÌöaì¦æ!ÄIÐ0§o󀤯Çaäy¤&žßÌË ”T}|2¤íOÑŠ|Q]´Óï-ÚöÉ»§úl.q„WB†ywÄæ<˘<H(ýÈ 1y"žÉHÒÇpe,:|D‚çÜu6?~c±ô€Ó­lû/¹VÇ~j0ÙL\qÌ3à/ö~x3HÅŽ!\UÕìÂM˜…æ>÷ðIá ö›§Î‚”||©ª¡”Þ™8tà* s~"µÒXb»D•9¾M®ØÄÎo :¼‹ãÀ¦t±é¦i}¸žóÒT¿”÷ƒÍ {íÆ9еï¸_{¹ïÇ=pvÌsÞ¹9þjÈ[-»\Ûù¡”JMÜ×íGï½rÙ4¼¼èì{p7IÛ6?_ZGla«!J3GÒ}BMjóæ’îò»&¿¤uÚe¸ÒwQSUô°ÚwÛMíØöTkN›* •)}»@Ù‰ ?Ž=ìŒ;…F°é«~4ëØQŒ•ëØs‰À •§è~oZy£8aæW+b.ŒÅ®h!ÿµç™}3xá!é2 J¿ðÚçå¹à»½õo–«xup|ãÂÅ‹8"”Óî¡äû¿Ó3@êÕ‡â€ãVâ^<‚¿FÌÉ–ˆ¶$rá‰9GX¦ ¨Þ¸½Ãã=™!C¦T’„„ý4%‹B:×~*‰BaøÏrh¼bnPC²<ÛÒ*dÔÅy5?”e~—{½ù?Üò6‰ endstream endobj 1458 0 obj [ 1457 0 R ] endobj 1456 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1458 0 R /Contents 1459 0 R >> endobj 1460 0 obj 2032 endobj 706 0 obj << /Type /Action /S /GoTo /D [1461 0 R /XYZ 72.0 641.264 null] >> endobj 709 0 obj << /Type /Action /S /GoTo /D [1461 0 R /XYZ 72.0 469.403 null] >> endobj 712 0 obj << /Type /Action /S /GoTo /D [1461 0 R /XYZ 72.0 391.27 null] >> endobj 715 0 obj << /Type /Action /S /GoTo /D [1461 0 R /XYZ 72.0 317.284 null] >> endobj 1437 0 obj << /Type /Action /S /GoTo /D [1461 0 R /XYZ 72.0 174.673 null] >> endobj 1462 0 obj << /Type /Action /S /GoTo /D [1456 0 R /XYZ 72.0 711.619 null] >> endobj 1463 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.492 592.778 243.032 601.778 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1462 0 R /H /I >> endobj 1465 0 obj << /Type /Annot /Subtype /Link /Rect [ 177.76 470.903 218.03 479.903 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 703 0 R /H /I >> endobj 1466 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 330.784 192.251 339.784 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 417 0 R /H /I >> endobj 1467 0 obj << /Type /Annot /Subtype /Link /Rect [ 463.792 330.784 523.273 339.784 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1270 0 R /H /I >> endobj 1468 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 318.784 163.87 327.784 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1270 0 R /H /I >> endobj 1469 0 obj << /Type /Annot /Subtype /Link /Rect [ 415.299 256.798 484.899 265.798 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 417 0 R /H /I >> endobj 1470 0 obj << /Type /Annot /Subtype /Link /Rect [ 285.965 244.798 317.065 253.798 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1291 0 R /H /I >> endobj 1471 0 obj << /Type /Action /S /GoTo /D [1444 0 R /XYZ 122.25 566.639 null] >> endobj 1472 0 obj << /Type /Annot /Subtype /Link /Rect [ 306.777 196.798 346.757 205.798 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1471 0 R /H /I >> endobj 1473 0 obj << /Type /Annot /Subtype /Link /Rect [ 487.174 196.918 523.274 205.798 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1429 0 R /H /I >> endobj 1474 0 obj << /Type /Annot /Subtype /Link /Rect [ 377.711 138.868 413.811 147.748 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1429 0 R /H /I >> endobj 1475 0 obj << /Length 1476 0 R /Filter /FlateDecode >> stream xœÍk“Ó8òûü ÷a¡ŠÑÙòû¾Í,°{PÀ„ÚÚŠrl%ñâØÁvf.ÿþZj½ì(Ãñ¡¨éÖ£ÕÝê§<ß®BÀ¿kñ+Cšç©öWßÔxH2F¢T %Y cʲ'ó¡„´b0 Á¯ÙZÀwäÏ«î* /®>~†55 `ßýUp¸$u{õÎáM-øgâ/ Û«_WWÿü-!a@V«âˆÑ€…EQ€Fs±Bü0²Ú“¾©×5)ë}Ó5ã4”SÓwO>“ÕïWÏW3©£  ùÏ&ô»‹`4Y–Ñ`iL’L„c0‚ÅÔŒ‘%ЧÌFPü}‘åàŒãÀeøÜŽ~æ.›P«B0¡¬(`Šæ3Šó‡ æ§‘îÜV˜àË],…Žsá.‰4MQÔBvý8òì×77¯Ÿòêí—›gÏÞ?¿½%D_^ßÜþ؇ÕË/«¿Þ¢¾yÿâÃëçoVŸQ]î9, QÀOâAm_•-‘ÞIø©†Óa:'Üøµ‹ô’tAu Ø FÃ4§! Kªÿ—ÈÁÚ ä${?L/_jà!Ãêì²HÀ:Â<Âå«'OHQF×|SÛÉàH ìIZ_J†­ÏT àN ¢ÐCÿ°ý²[—´ê»"G¶>æÂDNbp¬ÔǦáiÓ´–á²mûûÑ xÓf²ªøh'§ÞÝfe.§r]ŽÜ.¼o¦]´Z8”ãxßµú‰W"YP3¶Ú5ãùå„![ȱ/O°ç:KÈ㮟4¸æºß•fôÔÍpÙMT#xeTÚ0¨x*›nÔxi¨»j§‘~£¡o›ck·ï÷¼›Æ§z@ha»3§þe¹q„(Û±÷ÈÍâ…ÜB؆4QWàǑۙ…ß‚cl~ûî?f¨î«£`Rfj3ºéïûÁRh:˜ÚÏ—k¼[Ä„ó]‹ë¯ím6ˆ ­}KµñB¸ *}rFY¶ÎŒ‚l…Gi ÎTøL( %ïù¾¿ã„ÆB¨15ÆAQÄ,ÕÞÚÖ Ñ žë¾ãlÔ(‹‹ #pí‚Qá9«æ-Ÿ¸`t¹/WDFL}<šã„E•]MÍÀÊáŨÑ¡Ùî¦ÑAº("k»kàwýWyYˆãÕŸK:xÕlg¥£+÷Üc¬yº˜†}QÉÛÄjFÞôìáÌÁ`F$DHˆ*‘‘"!¸ïkÉ©=Õ„ð¦!®é¶fDiÕOõcÐÉ¡„ÜyÄ/ò…øŠqˆBiäÑßeõõä´>È£Mß?¢:Ùø ¨»iR@ ±Sq—ÿ" .ŠÔ³Öš¹® F%74,\Iþàü `ÍE40 üµA& ¹ˆÈó4¢$×è8¡ª«JKÏܼ¦È Œu‚9¸t¸0ªÔÿ_¾ ¸fLÄÆ<2ËŒ,Qò +•£¤²;X[ý\ i1‚sÚ ˜ûr$ÛÒ8§ÒÛÔSÏæŒÑ<„Ò¦HT­ýJ¦®03™Q€˜=$øú„¹B"åè,4ì¨\âpÛwÜÌ¢ÀT½¡ÆŽ!'s .7T›Í†\f89°îÿ«A°.³a¿µõSþ4Êòx¡‚]y‡¼G&*#ÞÉ™Ü9+e‘i°~°pÇ'(n¾Ú•=|T.:;cã.rã9××//º-‹Š‡v:<Djþ>º"µÍW‡Ñûï,¦õ,‘²®y}A>åü kº Ë6Í0z*qV¤ îmYAâ¸å\†Îe š‰Ò…±góM]»U‚ݧ4=hžùÎ$#–¦D¤FqªJ…Õè”0©-` ûÊ¢tQ½D È&NS‘И’C ßlJSmSaq…nô½r&‚Ö´ˆ‹ HBÛ|Èr킨Ë]dä@R–ójà¾<CÛG¸2ŒÙéK×aÕ¡¯]qëñçè‚XÇy=R‹¯î¥X_&F>ÀÓ¯¦l¡•ѯ£LU')©¸æ Å—À¾A@ãTÓñðTã÷;Õ%,H \¤#¬-p‘{”²%ìð3𙲭N#)Û“G^Y0ºòjK­ø'*WÇAUˆ¾?Z~C4'É‚ RkÁ¡µa<t¦”õ=ÛEGA{š%éÂvYÊ 9Ô*¦µ©'Ý9耠ž9Û“3ZAÚØÎî\Ì«^ïÊE‰ßD°zê ¨h¨÷avR¯›i~æùýÅQºÐÄìl¹ Œ›ÓeðbâQ *‚"N<”œÍ`´Ø´*|×·õèàZˆÙ— =rW¶GŽ^ªFn…éböU#ZˆiU fÏ{àB®¨iV@Ku¬WCºf×ûÛ¦óé6Î;åMËtžàÀ<ɺðóm¤Áj}¬†æ0YâJK‰2µ@æ2"ùô˜Ó-% ˆ ­ÕîOO~Øû2HQÐ]BgYXï“ͯ¶uJáÙ2þ(žCo{”|Qt,,(r0#•+·XW_gÊlÑ3Ç/3Ç+3×'3둺Ö,Â! K¼l^Ö'»\‰`·kÏ”(FDjpýv£Oo.ª Ñ\Ø÷¢”„ÁBvõ˜"Žêj–ê÷Ë›7/>¼ÕóͶ“ùT f—~qq‚·@>™b/;+Ù ÜnÆ<ì|Åd!h\¿4gkb!;£þÏIXì!whê˵#t,‡BʳóÓ­ŒÍdÄok.ûÒãˆB‰„!‹<¤—/ô»8„¶åiîÓU;ña-Ää¹qõèœAÂÄꢡýŠœ^3rnQÞØFM<4”ݱlÛ“èíÜqä^Š vÀE &bcÒö«©]PN²Ø·Ë²ÁJ£M7NàjÔ ¨Ç/ÅüÆ€TAÿÿvl>:•–*Æ|„E7åQx/8îåò]iÇñµEbòòT/-Þ—Õ®é,nC„Âeˆ Wréúc[‰^[’–#ˆ™ë–ï Þl ˆ¢*²¥ÓX¶7CßÙ‰~ãÈSNK> endobj 1476 0 obj 2855 endobj 1478 0 obj << /Type /Action /S /GoTo /D [1419 0 R /XYZ 72.0 323.991 null] >> endobj 1479 0 obj << /Type /Annot /Subtype /Link /Rect [ 327.602 636.519 362.592 645.519 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1478 0 R /H /I >> endobj 1481 0 obj << /Length 1482 0 R /Filter /FlateDecode >> stream xœÍY[Ü4~Ÿ_aõ©•º&¾äbÞZµ Pµ] ¤²™Ä³˜IB’í²þ;Ç—ŒÄÉ.<µªãÏçâsþØÁß+õOÆ Î2Šóî»OPJKìVaNã(bˆpLctFÓ­Æ[ÐqÿLÎ}D?ïê]„¾Ý}º3%Šw¿‹V.×W}ܽ÷d³`ý%É¡ÛÝëëÝWßĈDèúàLÌqEQÊP†êE×gôéù«ò\ÕU?tùP55šæÔ¿¸A×ßïÞ^O”fQ„³/Mç÷ÁgÒ4ÅÑÜ—ô5ÌìÁ޹Q}š2' —ÉŽÑÀü»*r´8ò^ºÑ#ܺ%)N ">álâB„³-ùbÔ[: Ur­kͳE¸\«ÝW§êäçæw‰†£DyQȾ‡ØÑT™ù>ï%2FI´Ü ên‰˜3¡4Â)‡àŒ¹X°+÷ÄÞ‚nCR–­ƒÑ¡é´Dw½ìÐoÕYoä ûþn@§¦ÈO¨hêZ*ô{ÔMÛW6ጣ^€á$c"$Ì.`pèÓ*BÎÀ]#’±%ðê¸ÎˆÆÀô×O&pšÁkÁ£xÖyÆdˆF @Èœ«ÀCu’ë<ÓlzƒþFŸ¶ p"èDÄKôæKR’m@ÆøþûgÄœ|ƒøðDÜ€ÞȾèªVùü*[ð;Â&Ârv±ÿ>³=/šó9¯Ë ÝÊ¢ëì¨À×+d×;ºÓ¦Þ^v—¥ÊY ŽqQñ€HyY:ó9ˆ€|(hD‚|átí‰Ø·²¨•,=¡!m|ö6'§ŸN‚#±—3”9›qîä¹Qºæ¬Ó ¼õvPw¡òµ÷N¿[?¦ÖDŸ 'V%"% ÔN§qµ’O“шÎ0d^¢Ý«Aöm^È«^¶9< ¨¢4@ðxÆ6Z±'¦ý*¡”xºh\ËüÝÂã'ZˆB£ª‚PH™“l·a!–Î0oª¾=å½~Ô¦>UµDGyjQ¾o ÔèP°¯œ.‰ œ@xF<ËWO<ö³T Ì“±™y.éæ% 97JÊ}~!óaçVÛÈl@{åŽæ¥;xY#tühu3„N·d³š¡L[¢ʪÆòÚ ©¾3Éj‹x¦6è e×lôõ—ÀHB ‚ ŒÅU…بìÔ¶^¹Ã)´íÐt…nAòÏöTÕpzй ¦ òR5“À]d¦×Kä-n¾:W%cI¶…GNõ~y˜6¢(ŽXºYÐOͰÞÄ(¡_NEg|¬IðvÊ{35ª^ªš¡ ;†Â=¸ÜÿêG¡EÒÚcíú®…š_ä¦ 0[:Ìk¸òá¥Ûì=Låq.éÝ\7Þ§³ •οwæŠJñ8)ÁR‘–衹Cm×|®Jýä°cÒÉFefP~(‡÷âÌNoÿÌÏ­k!CņHϪœ'Ìv¡eØ,™ûz~V]IÅÚ•àI U/n @W¦’ë\ñÍ»wèõ«› q2ç¾ÕRòÒ …ž(é´¥L#,œóʈåèÜÿèûž¾gȪvkÛŠbÌÖ†zb³ÂTØØ×^j1šì‘†…mÝáéé[DúJû_&:ÍtO÷̃՞™žÁ“> øQÏš4©ªÅ»˜ÜŽÇ§åz3HuR¹¼[9ôÃô¿ „XLap‰aÜ!éÓ§å†C’¼q9åx‘P[ÃrDÜÌ»D^ëµÈ³—È›-¦é…@Ó,$îÖˆÎ8†g5?‘™np…–†«â§AU7Ê.´‘H=1¯³Marbjtb!‘¯Þ­³Íâ-äÍ úkcN‡‰FMø“xÛ‹(Û¢G†ôÂ/Q?)QAþÓ”‹ &D2»Ö†®‚q[§h*4{µôˆÎ­ÏMç}ÙWûSÕÜvy{|p»Zk4}k¡§w‡í-e““!ÜïãŽMHÙtPÀû Ø»*ï}Ü2q%$šà—@*ÇoUo(W\E¤œÐÿ3W'0¼ÂˆÍZFú$ œßð„B³DØAî±I,4?~ÔO¦ž4 ˜žÌÊý†cèá˜ÂcCt²Õgétk˜pÍ8dȪ†.:w—êQc‰*å!¿;9X›ßÊ_HÛâœ;é÷2 HY²ƒ‰rÙL%ªQ›ØCsÒ'W.õ`WÞZüb ½Ì7ÑÄýÉO…•]è6¼ÐÎŒ—Ðß»ª¾µÄLB1,(TÇ8$ꯔ2¸, +>‡ªa?†ÌNÀŽb4£ÒSnMÅæüàÓZ"NÔ'LdÀ9ÀÝHý¨³ >ÃÝè®~2¹ë•ÉrdÜÂûß+ïwÿIü§G endstream endobj 1480 0 obj [ 1479 0 R ] endobj 1477 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1480 0 R /Contents 1481 0 R >> endobj 1482 0 obj 1947 endobj 1484 0 obj << /Length 1485 0 R /Filter /FlateDecode >> stream xœÍÉnÛ8ôî¯ zJ„%EJ"ç2è’R´5д=Ðk K®$'õßÏ£D™Ôf§·4(¬÷ôö•ÔÏEþnÌà !Ñz·øiñÅb‘E…ó $„!Êq¢ê£B”ï!èžà§G ð}]ä ‚þZ|û4 "À÷¸ 3ÂQ_Ÿ=Û,fºc™°¦)¤Œ³£u±Û©<ÁÖ%ŽéX˜i-$¢6Å¥`„lÀòµLkÝFâPïûRh“f¥yUk• bcUÅSM‹CÌŒŸ’IkÚß—Lñ€åõ~¯óä¢màAšß£´vfv h†š¯GpDi€Ã†0…´1Pef³f˜XhÊ·!õnb¨gtµV¥Þ2‡xLë­ƒšZêÕús‚¿_uG uuâëîÂ8U[”Mó|ét{³\°C€ùÉÊ7?óœ±aŸvg_k]U&ô'œIKyXÕuki/Š<>YÕÉ¢˜¢«¤X×ǽ‡0Myí@eãÖEîΆJh/JɃ¨§øíÝòöËòß·ó‘ä|šÕ©Õ™Þé¼vˆMQzoÕzë 4OÒ‡49¨,;:l©4±çX3;ðDØBy2áncèÁ@®ŽÅÁë"_«Zçðß!m[ ÔÕ!«+‡(¨oÁ>ByÔ²š‹Œ¯q¢)˜ä˜ðPš³¢.ǼØWiu®v8´=á0_DȇªztpűŸ8lÏýy¦Ay]Jb+õ®ÖeÚSÏÕ&‡õ@œœ®u ­ÊToPu€ÛTylî/_õ ÒL­ Xì5ëìäasù{“#äpû 2dg&ǘl~r„0ÀfDÎLŽ1‡ËÓŒÙêxjý…pȆŠq@ã–Õládu¡#GpÀ¦}zF ¹¼ÊxBÙô½m̃¾Íê ´pô˜`ì¾4Lu1\×Îpþp:Ç•ÂLnZ1Ño¢jµR•¾)õ½þµŸ_ÿÄÀ !—S&œ)õ(‚­@2*~«#ÛÕ|‹"VËGÈG³ «Åé fSûPoKºqÏyáqÛ‚GéqÙU¢ìpwž¤ùèB` Báš7öç©Ágñ9)l¾v¸"ÏŽãIÞh¦™‹ÝNÕë­9ÔÕf9ƒ™¥¹ƒÀJm¶3\kL—èî£Róeðó⯄† endstream endobj 1483 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 1484 0 R >> endobj 1485 0 obj 1646 endobj 1445 0 obj << /Type /Action /S /GoTo /D [1486 0 R /XYZ 72.0 538.007 null] >> endobj 1487 0 obj << /URI (http://www.iana.org) /S /URI >> endobj 1488 0 obj << /Type /Annot /Subtype /Link /Rect [ 193.283 311.298 218.273 320.298 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1487 0 R /H /I >> endobj 1490 0 obj << /Type /Annot /Subtype /Link /Rect [ 223.921 311.298 304.471 320.298 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1487 0 R /H /I >> endobj 1491 0 obj << /Type /Action /S /GoTo /D [1483 0 R /XYZ 72.0 201.729 null] >> endobj 1492 0 obj << /Type /Annot /Subtype /Link /Rect [ 257.6 97.63 281.5 106.51 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1491 0 R /H /I >> endobj 1493 0 obj << /Length 1494 0 R /Filter /FlateDecode >> stream xœÍ]ܸí}…°@‘ °«ÈòwÞ’^®¸â®Mºs(ŠlPhÆš¡{ÎòÌfPô¿—mKc{œ<&²$-R$EñC›?nÂàïƒù‘EͲœlö7tô€¤œ„IGŠxÌXH‚ˆò˜ìÉ%)&¥áñÞCðãb-à;òϛꆑ¿Ü|þk €ïå†]nE=Þ|òtëü#éÇÈóÍûÕÍ›Ÿc0²Ú:‡!Íã”1–†$£!ÏÍNV{òùî]±W•Òm#ZUW¤­ëR¿þBV½ù°º0:dŒf?šÍŸ.T„˜IÓ”²q,Y1!Ò€‚ͧ EÆ(îrAA ðçU•ÙDcæ+< £F¹ë”¤4 ‚Ñì"„‚0_Š˜Ƽi°p££‰%5׌²É­iÕ^ÖÇ– Ýo~ŽSPC'î“(YËçüÎF\²Õ¤ÝIÒo®*¢å¦® × ªYJ“eA:ë)3£–xig„ó ï´ˆÓ85¼`]^ÖÏ…ÔK^Ksffƒ0Ÿ²—ÛâhÄeÝöš…»Îýôz9¤³ r_hnõÅnKÐ$€íXL¸¿+ “E}®!˜+±—BÖàƒ'³g¹møTø72\â]v]ÀCÊR8ç•ò$Ë¥,Êijö 8Ÿð}þ ã[Ÿ’ÜˈìÅWµ?î¡S°G19tk¥ÖâYú¢j¯=©`è3Dõ캅ƒÊb¤Qž¥i>cÅòIAÚXb¦Næ[$ª ψÖ3½*ÏÛ4ªUá¹’HÝèi*¢t´ù‹*-hÐ; atÔ½#¤”C´W1áKô)ªÚ”ÇBUÏ>¿·¯üÚ6r/Ñ@$d³®µ·¦ëãóÒ&Ƭóã|dþÚÞT°“š%…Ò2·¶4£á¦ÞJÙ‚2´?]èyùÅéB¬d!46æòu™ëÃWaøz–|¦‰á,¦yåytõ»‘Ûb-Þ’‘Úy2³­–͉ ×6½}f3žQ¨}ŒÅI'`µSšØ³×²Š‚‘RbW@}9ÔhÎd³Õ³D}à9¹ÝÊM«N’«V•ÄZPàk ˜‹¦·öz@LCÖƒ`—>äPR£ZÚŒuG³i$”¤bíç”ç›’sÓ³´K)çª>h¥—Ü2(™¦Š¡Ìl7ãG8ˆ)ù|u—€Á$mŠ„Ç çÇ«;A¸Ä¹Ô] ¯sÊjS››w}ç$Zâÿ²dnÒ(Ö8ÊçÌÝ]ßrëçò߃ó„šYÈ^)o±65y¡„ò%nJéÿ®}Èš cyÜݪŸ¤†\|0=ìÒu £œÆZŒuíãŸmðÙü U9Ô•|qH!Z±˜ ‘ò¢ÚúLÚqš~dÀ–º˜ò<‚¶(Œg”û–£`‰›: !½4X¦.­ñ ß‹³CÖžúú 7j«°t#IU³Óá¥Ç •q\ Ì!$ÁHSÛ¹Aò‚¤¿U±”ñCY¬#QÇüw{êzÒuͧŸˆe0³ÜŒWßL ›Y¿˜Õf8./ÿõ ¸Fœ²„<Àjt5BP±ie3PúM¶v18ƨF¸:PlñéÜ›FV­í ÒuBˆèãÊUkc)k÷ñ·óã§_U1í"È—¦Ã0×>78mG!ÍÉÝ/[Ÿë£CŽx1,TJ£¸#É  yï-šÜaõ¡„÷¿©çªnLÇ2P>–Rø[k)}ÁRÔ›ã.G]8 ŠF°M6ÏËÀÔf@¼D„4h@U@Yöó<1'¡Jsr/cGӴڹ϶ǰƒÐÚž3¢]D¤õ¸®7ÜÿÀŸùŒÝ ÷1‚Ùgsغ>\qrœŒXô®>–Ƙú´.í!ˆ¦ <’pÈ»æñ/ ™¿¼ûÛ»1G”Pžš 7³~Øæó˜+Lƒå™ÏñíÚöðöÍ›——ªD%hÝŒŸ L•L¶ Y4#àËdyL3(ªy”¥Kzz© ¦Jѳ—A¼£µ[_·Œ7·÷¹½mˆà!ÞÏä°™ÓMƉׯÙAJ32 ]ˆýOÝmE¤[q,[Gðlî(8ÏñNv5ƒMÕý¾Œ:ÚáÝýî0l曣˜¡C=›k¹#× ûþ¡Í€/Hoн¨‚Üë÷ÆÜHHÍyúb1_;cÓ§%©yøL/{Ë…‡H˜8’$cÞ@1¹k'Ëkóœk]Ù%€tîÕ&˺g«©èoNæ)‘7%a4Ã?j@.2­öÆ#aB¡ñ“…(Â5lK³ÙˆkÕáf€î{G‹tϰþ¨n`SÕ6ŽâWr¤\•¹?êÖ}© aÖ lí,.¼/eíèOw¯Þ¾zzí”lfX ¡w>ǃÏQ:m=è8a# ·ß¼º¨¶¯nH€ê¶­på>õe×}<ê!uö¹ýé=Е· ÑúEnÛ¾çr²°gFxí8·ÇômÜ åÖ™Î'NùÈTÛ9™®!ô[ˆÑ‚”¡ôw¸ë‰B›Ý¨ÃVË’úAl(‹.J];lí­„˜Ñª€`ôVo@ò´!>™GŠû«³hdµ¢¨mn~W ÇV½j IÊCjãw¸ðDx6"åv6„[GQ[w¾ëä” ¸ð6݉“'©®<ÄL9h~·ÍoÿzÿîñígÎ;ðßœòqú§Z¡'©1¤{äe§6»é~©a@ì³-1gªÎ ì¥nŠ_ ÐÐüC«kîg]ï+:Ü@[èiü^Á½k•0¯t÷¾À™ß„°qÊÃÇH‰eÀ<\¶u ù·:ÉJ™~Ýäíè4¸sQ`(ú–@ʹ]«u©ê[b^8,j¼|ãÊ"ùZ›œñîa¥W‹„YC›…"‹Âîañc#²²ã ï§^„Ì h…0`î:Îa-Õ䀌;.¨¨)ƒ/·L7}âR«ª«[½Ì ä¶ÃîHÒïx¬¤•y$ÐF>KÑ ¸üz€ì¡±Â"©â|f 9x,Kò, gÔÄþÓL‡Œ< ÎâÆa; âNS,¤¡szg–Íf7ã;H—²A$ºÎ¹Ìû¿Ÿnþ…;¦ endstream endobj 1489 0 obj [ 1488 0 R 1490 0 R 1492 0 R ] endobj 1486 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1489 0 R /Contents 1493 0 R >> endobj 1494 0 obj 2698 endobj 718 0 obj << /Type /Action /S /GoTo /D [1495 0 R /XYZ 72.0 620.807 null] >> endobj 721 0 obj << /Type /Action /S /GoTo /D [1495 0 R /XYZ 72.0 254.701 null] >> endobj 724 0 obj << /Type /Action /S /GoTo /D [1495 0 R /XYZ 72.0 188.124 null] >> endobj 1496 0 obj << /Type /Action /S /GoTo /D [1385 0 R /XYZ 72.0 507.431 null] >> endobj 1497 0 obj << /Type /Annot /Subtype /Link /Rect [ 220.734 523.003 256.294 531.883 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1496 0 R /H /I >> endobj 1500 0 obj << /Type /Annot /Subtype /Link /Rect [ 492.155 510.883 523.275 519.883 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1499 0 R /H /I >> endobj 1501 0 obj << /Type /Annot /Subtype /Link /Rect [ 244.403 428.389 275.523 437.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1499 0 R /H /I >> endobj 1502 0 obj << /Type /Action /S /GoTo /D [1477 0 R /XYZ 72.0 290.397 null] >> endobj 1503 0 obj << /Type /Annot /Subtype /Link /Rect [ 207.62 337.168 239.83 346.048 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1502 0 R /H /I >> endobj 1504 0 obj << /Type /Annot /Subtype /Link /Rect [ 340.889 313.168 376.449 322.048 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1496 0 R /H /I >> endobj 1505 0 obj << /Type /Action /S /GoTo /D [1453 0 R /XYZ 72.0 396.941 null] >> endobj 1506 0 obj << /Type /Annot /Subtype /Link /Rect [ 224.9 280.321 269.33 289.201 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1505 0 R /H /I >> endobj 1507 0 obj << /Length 1508 0 R /Filter /FlateDecode >> stream xœÍËŽÜ6ò>_ÁÛ&ÀŒL½Åܼ€³Ø]'€‘ ¼‹lì»›°mJ=ãùûY|µ¤žÁÞ™ªY¬wÙ_ïRBá߃þÓiÒ4Œìû»¯–ž’:#yeI%MЬ¤4'i‘d%éÉ5©$Þ™ƒàÏÕZÀOäóÝpGÉ?îþøÖ´„¾ç;zƒ¹aõÛݧH6»àïI>JŽw¼{÷sIRJÁÄy–Ð,eŒE›$Ϙþ/#=ùã%í®%¼íå §YñYŽÃ’ÇÝ}x¼Ò:§4i¾7¥?]‰AS×uB—ÁdØäH rÔŸ®Y¢xÊ5À¿7E¦+‰i,ð:޾án‡P «R¡š1ø”4W1T°×æ»Ñn+™–ë¶ÒE³J—Ç“œÈ@®Éϲë<‰ÙóIxPöb¼„/£ƒ*ê7Þ;H&"q0wÀ¾“b˜&¡ž„òÄqÄ^'ª£œø´>dçå˜fÞu¢uèaT‚`ÛNa3¬èר Ý. Gù$&r9'¸åÝÏlÚPè3ZSJë<ÚÌ"‹sXµ^ Ò´H7;ñ$:R»£¶Wéš—3ÖdUä9ã2í+í$`Dج~Uð&KMAÖ¼%øji,x+¦™¤¯ÉÒ<©Ó†‚ðÙ–àÓˤå;äp‰f,S¼_U$Í  3ÈŒ4ËÞÒd½6Vå ;AÞ=qõwý üÿU½Š2)Ò ô*W¹LÂik’¼"긥AJ³$­ øš´Þ`¹%ŽNï ‘Ò¦z“6°SR¼ë@bí~>«ñ¬$ŸE÷’¸s´ØÏužÔÐnã#¡êÔeRUµNžÏ)“2!ïÛöžˆVÎ÷2³˜ÙÉ]'Ç£âçÓ ™æ—NL¯*¤mÌXÂ`’b0Q]•«‡4M¡2ðé‹G"úþ¢™îÅSèªä~6%Ãnh Â޳è=£ 'ÈÁƒ£jM![q=+HÅaö8EÄa„ò÷¬$Äøq£&¥éBoÁ÷'Ø›æ ƒ½ °a…è•a œxü½‡z(ƒ‰¶ŽÝÅÖb$ؾ`O eîD:³"­NÊcÆö¤®Ÿ=fŒ±¡x–/¿œ»‘·`%]¤"ãó`ƒ'ÙØ^I“—°½,pûï:‰îžÎÍc‘ðè~ì{>´w‰_¯²¬€f’CÎË|ã8Þ¶F¸›…#m`Öc¥U^n첎ž‡ ‚éyZ—"²$©<¦«À´uVl¢–Ï|Ç'ÓÑòᛜnlY-4AÁVè[™¡ùä<á‰÷bÄF"»@w™3‹áŠ=Î%ˆóð…«D¾Ž|/ û»Ö£û“Øy[ú¥% H¦ef¨·lÒù¢ð¸2`Õ,»Ä¹…hY#á'Á[ßÍ]#¯ª"ËÍ@ÓT¥-É¿Žó퀄yZ.v<âÄGu¦ZŸ 2<È=´8$º€C gLŠa?¶8ºá§Áƒstì~ùèa®‰Çbáô—[ÆÜbÆ×Èê…œôU®½l¤· t±¸©ëH‚Zl¤C ·«H]$E Ã`¹qöQ‰³gñÛã?~øõý/n:0+Y’f[Œ<“àN"ˆ÷|’¦© ¶ð¢]î³Ø \…Ý­8ÈA´ÖÌÙBi•ùÄ´® ä¡õp”z,N=¥[¥^ZgIAõ ß4"ÜJ½ ¦Ó2ƒ¥åƦ ’oV¨“Ð-8–ëåo*R§S¦/·¶òxdX%_q_ËïÌßdÐAÊÔ^$>c‰{5Å›r±É4@=4•鯓ƒ¹†qxxâ©tûµÔ3WÎ;ÃqGCºK;xJ†æ#É`r;íô¥Á¸åÂ?g¿Ãï…J¨6¢ŽÕ+ §ó8Lr';9ã(˜çI˜Ñ±Šøû)Æ\¯t¸­Ç€]ÄaØ­#V}á0[[Z‚Œ%Êz âOËí ÊÚ_˜ï¥‚ Ó{`maæ;È:°Ì¥›·¨"‡™¿†›äQÜ `h«¢¡ шß.w9Üôs]™fGÅüÆÐTos¸¦M¾±?’†|ñ$&OÁyÉÂʃa^G+½åÄÆ„p;î/zþus¶ŽØ!:n6.²…¶G¸5ŒÑ;}Ê2ϪÐyï#\éÑwg¥@±_]5n‹Úú»µò¦¿ó‚&e­¯ü,ßP÷MçPËën•E¾e® Àû[æq7ì_ †Ö¥¥~&r.õt½±ÓÄÕË}øŠñp`18rSï³öD͉ðMkšÑ°a”ÖЗÖ¿yåÈ) ÃÚ°Þï°ÆL<á}Ð|š¹½ä¡J;Âï#5ä)ØuF¯ªÅ¹nŒæÝÇ7†Ÿi˜2zü¹âÕÔI©_”ʼŽoyeŒj_²,j–%Ü.Ze–hiYÎ6NÄ77Ê´¤Ü—­‹Hâ1¸Ÿ"°‚9DØÖ0‹-KRC/Aü Æþ†¡³Ç•½[ˆþ讉f&<º„AÂÁ]L3ˆ\]²ÝXm™xè÷A~óˆÇKÇ;ñ ÚØ4é°ð´÷æ–ˆ°×ÑçÓ8Aí=‘žÏföubŠå™k3”iº0CŸýv¾uµÿÇZY¤I]ç0v6™{B«òq<u>h¿¼õLVBrQV°š^ù'‡ºAü ‡ØYé é'OØ›ƒðtÆ+7bxŸFøëEÎ%÷P7†5æêåÈG÷ºdE8ÑD;‚_„¹êXºâfî_q{>ñpŠ ŒNü|vDû1è²1%jKÕ͵¥œ=b^'û+x¶ƒªoÒr?h³)R—³¾+buÓ¯©ÚY‘×Kš¿§u’5º,\_Q¸x³’¦¬ÌƒëÓ„|ÖƒÞzó5? 4pãŠðDª=Q•›ç½Nî¹}ÍCšÿéQûs‡ß1yðY˜hXÑyD¶9ýÐÉ!œŠ¿ñ„ cÅ ÎÛHÀXAØÅJâ)¿ eíÉJÏWz['è'í~ÔOÛýyT³¾©ëŠ4?ä|Qg¨ÓOì*8®Î(e™ý•ãYV.Ö•[ëþ1ü@ͼoc1ÃêË\z@u0¬ï†âÏQÜ 7ÅëÁ¾»´"¼·åá‹õÖŠÎ#²ûñM¶A‚y»èÀ ²¾Ôn ÎÐê2Ó\¦½’çÍ«EÅŠ$K¡£iñª…WëQ[ýò»»'ý“‚~>&B©Q¹£ÌOµŸîþž-Û endstream endobj 1498 0 obj [ 1497 0 R 1500 0 R 1501 0 R 1503 0 R 1504 0 R 1506 0 R ] endobj 1495 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1498 0 R /Contents 1507 0 R >> endobj 1508 0 obj 2467 endobj 928 0 obj << /Type /Action /S /GoTo /D [1509 0 R /XYZ 72.0 735.727 null] >> endobj 1511 0 obj << /Type /Annot /Subtype /Link /Rect [ 153.389 309.591 186.169 318.591 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1510 0 R /H /I >> endobj 1513 0 obj << /Type /Annot /Subtype /Link /Rect [ 205.678 309.591 240.668 318.591 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1478 0 R /H /I >> endobj 1514 0 obj << /Length 1515 0 R /Filter /FlateDecode >> stream xœÍZKsä6¾ûW°|™™*[‘ÔR«5U»UóLì$“µ·v«29¨[l73j±#Jv¼¿~A|èag“ŒA@=œ%,†ÿ/õŸM–D›MÉvdz?ˆŸ°"e«5±ò8ÊÒ<ŽW,É¢4gG6få¬Ñc"µüÉ>°Ÿµg1ûþì×ß@¦f1Œ{8‹ŸPnTÝœ}l# ¿%ûbvwöööì»9Kbv»÷.ÎA*Kã8Î7l­ÒRÿ—²Û#ûõåûª¯˜hOCÿê7v{}öáv´ÔUG›om¥ŸG&B¤EÅÓ2jVÈjÔŸF†L!Î2âà ðï“&Ç3‹ãÐàyð|3Æ=7H%IYe Ÿ¢Í(pŠõsóͬn+©¶ëéEgóù’¦9.Ö§Ô\êjÏZÉ:~êDÛ3ÕWý ˜PLøNì¯/Ø?ùþý[È6Å»^±óO¿Ü²«OìãÕOÎY¥Xà¬æûjhzv_5&³‚m+XdI¹üŒq31°î[­¢ {ù(‡ÎþgÏۚ׎ÑÊž+‡j~p4®éÑáʨz~á.Ø¢Ñ4 Š;Z/ÜÒ»¡ëxÛúyZo(º1ÐQõá·žW5ùÏDPœ‚sº;Ør(&E”nÀ9Éhçc–—Q¯Ër“eäÑ:J#vÕîew¬z![fæÁu«ö®áÊNr÷T8­¢<‡½Hʵ¾=êzPœ3öò+T¬: 5œNR™=²¬^àAv_ÃÁ¡¦«÷0A~¡ 7ßÿüS¨¦ 'üÏè[-wÃvIEó6´©º—¢i{œs™O<³;T]µë¹ŽÏÒû%ow²íŇJ)pù…Ųm-QdȽèToA’–tú•S°_þ¯›Ë77ï®®fÃ,Cq§·Ê'ÞEßóz!o“¸˜¬õöÀM \æITLL#žÝXD¸YH¥Yßt¬gYÇá!ïFƒ MWÍ_Xp»ƒ‡—° Ø/M#x½°ð¤œ,ãš¾\V™&d6ƒèªõ4}èûNlSˆeâ:è @út‚=ñ¬O²uûK¬ñÚÔìd{å“Y˜ƒ$ëÉŽWJ¶Õ¶á ÎX%g üAÀ" £.˜ìôAðÈôôu'µíLس¥©v\'ž>X &(Ó,E[¾ŠŠ$‹ã,§Óé¼;Üð$3ÛVG*ˆmÊúƒì¾ãµèe÷̨Žï¸¸çGQ Yè#8=8©?b™·<ªEdWópNªwŽÕ×P=xë¸à‚u>qÁ ô¦è3"×û´7‹BÚÔóÈÁ·²?8p =‡,ëDt(Yae û’ :È¡ñ²[oË©“÷‚NaÃ^Gå¥ YÄnhª.\œKK-ñxù?@~BëÒy¹ÆIöž†¦ÀƒŽCÒpÜR÷¹ó¨Ö—‡ööË[!ygf~)!à”{,ºßÑè*ÐK»yÎ-`42 ¡ž,]‘NƒŽ™R ½ žI²à‘DßÛÇï#  ZY¹)Š2| I"Ü/ÌéÿW"Y ÃR83â‚,² ô™?’M©D–?ºjÇ% ¤n¿t¿vè£~$¸>ò‘„×Ö˯¼£ÌmY7Úò nH¡ÝÂÕ/ƒê0^0Ú®‡eX8L.#­NpÑ3I—ùÚ”¹Ú˜Q}k:TjI¦«Dƒu Jօâ÷d @©áÈë`*Gšk‹µØ“£ÍAÞƒìêÅÕ *ªŠd–­'ÎRÃî`.h+äö5³tO¥w"tÒ­ôBÞÈðþ û9Ó(¼Bè~a×í«iIþ!ƒ‚mÏ©œ"R¾w@úE íØÈÕþ[r´[cç|y©è4õŒôdô&‰V›~´ÎÔhëôœ“A T‚d £6 8åæ²gë¼ ,h E£\Å‚ 8`—æ]CµYú…}i› 6ú­Z9õúHøÃc<å:÷TÅ]‘p@»äË«ÈaêÌ(GõµÓÏmÇÂ}4+âÉbL„^‚s(-BešÑ#–FhGQ°`¤3c<°ˆ‚ÃÝÓ‰\ê“”¥¶nd内͎åIg›~2'Ì‚ 6ÓúÏlòR÷Τ%¼c4B{€sŒF7¦pºo{zõ Ü7{ÄkzëfîøQÞs?»×·$"•-ùscÔ°ß‹€¦ÉY„[ef\:Êé±°ówÎõÚW$KcWèZ Ýe:†qý|”ïêÓñ†¢ÿÞ´k›æiýô€…h땸ãÚ53·Å>Í“Á-ÿ¿»<…ë`u()Âæ#5͇{vø«Æ#ÏVQ±‚«_¶^¹7½C™éGÝ[Bz‘Æ6Ö¼‡)Jà3iøµ Õ†þ!ž}Ȩ;ÇÞ„àðý£É@D†âÁ؆ïûe›GbÖõMÝœGdžçQxã;¿¯È@£¦4J‚ç0M…#²/$¤± ´AúU¢ æÚ^ÂÑo3ÜðnCÕ-ÿ3P-z|DôŦjhðöÑÓ\ØÃlñ¤éÀ.‚O žZOÍDb»säVö‡/¯ÄfÂÞ¥ˆ±—H\†÷ài³‘Ú‹‘caG„ª{GšZ¢z?—ôbXÐH®:‰ûƒÞ÷øTL&:ÊUáù2ê:Xìê‚Êrâ°ªÕ»‘™‡ S5¶’„Ù”á{Š)Ñ‘ÅØûG C:Y†P^1ol@5„³ÿ õsqÛ¬+¼êG xcj&Î+õaÁ2´ ž(“ièTÙ§Ô%UêÓÈ”å©{ÿ (û][dÒûÂ"á€Ë½šŽ{bÁÖ‰E]7™JYô¡2½‡¡éG½Úü8¤sçÞXÇÓšL/NpCHÆ¿!Ç^uwÕI&Y¬޽æñÂ1xXVI»ôäÁOÚ‰»ƒŸPî…œÇ:—#~9øõèõ—$Ó*Œ;búÊ­¿œVŽ:H8dÄÞüÖ‚S}ì5¸åÕf·(hÜ‘¦h§þNkã<}±yšRÏë9®ÈN-vµdf®—1.õü¥›õ:–aW!Þ°=`üÏêxjÀFúÎüÊbÚüS'w¼ v ¯º…7ðuVF›rUn’rõÜ‹ò\îügh0u½–‡–Ýœ³Ë¿3ËCVt¾0_¡_¨ !â´xv¾™Üù»ÃÐ^°.Ä© ü!ºüqqh;Ód'ÅóÿŽh.wþž7gp4¾¿Æ‰,pðOÂ>ŸýßWŠ endstream endobj 1512 0 obj [ 1511 0 R 1513 0 R ] endobj 1509 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1512 0 R /Contents 1514 0 R >> endobj 1515 0 obj 3139 endobj 1517 0 obj << /Type /Annot /Subtype /Link /Rect [ 413.99 668.795 452.33 677.675 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1478 0 R /H /I >> endobj 1519 0 obj << /Type /Annot /Subtype /Link /Rect [ 217.043 293.815 243.143 302.815 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1259 0 R /H /I >> endobj 1520 0 obj << /Type /Action /S /GoTo /D [1285 0 R /XYZ 72.0 769.889 null] >> endobj 1521 0 obj << /Type /Annot /Subtype /Link /Rect [ 434.547 293.815 523.273 302.815 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1520 0 R /H /I >> endobj 1522 0 obj << /Length 1523 0 R /Filter /FlateDecode >> stream xœÍÉ’ã¶õ®¯@ù4“ꦱpÍÍ.{RN\vººS9L:)ˆ„$¸)RCR­V¥òïyXH€›fæ63á=â­xП6aø¯~Òiš¡ü¸ùdñ%±Ø¢"„4˜!4BG4FE¨T4Þ‚ö+øíø€þ¹©6ýeóñöÝeƒW˜kV›O7»Öß’~í7?>m¾ÿ!‚ÑÓι˜± ‹ŒqÂP0š©=ÑÇw?GYɶkx'ë uu]¶ïŸÑÓ_7??Œfé·fóÃHEˆ™$I<%͆` Gõi¤È4RFcù]UÏ4ƾÂó0úf”[ 8 B²,É2ø¤£"ar+b¾óæÁB•^ƒÕ:}«Ód‰Jc«;a¬]p°8 q¢œ“‚Çú(Ð{Dã Dï Þñ-oBT{Y‰ön@”òÅ}}|øUvÂ},êaYÕݰnϧSÝ8ø•|»o»ké85b.yãä¾ѶòmàèZkšoP˜N zøõì<6HVm'xôÞYrgBD@ðÄ)û2wfY€C–eibƒíCÝ Ž¶;Tˆ6oäI®z‡ºƒ@§ssªÁ¿‚b¢yºÔMn…Ð[zqɬLBÊR°S6Ì‹B1ZU–¥X—Ö4Ž’95Êëã‘W#ïÐ=Ä$ LÀÕIbƒíç7~<•ƒƒ²©Ì0…PÏ‚"3YQMN1޶5bWlùŸ§{Ë„¬±üþ!³Ú/P”ÐR”»ÒŠÿýã/¿ºiqʦê­ l§8†í‰:˜Øl:È]dY"¥%â°båúÜT¼41áÂ;Ôvrë"»ÃÔW4ŽŠ!`H/Èù¥ ¬ŸpJ˜‘€)Â$Z"´A¢ÊYÍÞfSN"†BgRðEœCÚæ¼z¹ôôûå@£ Š Ç–êñZÕ§V¶·ÜNÁí," I4—µœ½sôßUÚ'öXç„÷ë™G0»EéBÏ)£ ]§ì«õºäˆÝ¢ÿú¸j-‰á8U¥ñ’oïëB“øåó ðÿ¢,M[Ìr%ôV1#:SiƼ$zâ,HÐ;[ܸ͢8—ÂíàÃjw†|ëq5Ub äÕH·ÔuÛ®½j‰N"—;)“¬ ´«ÇÁ %ÌÈ„fႵ7¢A »A9ˆ®µ“ƒ~òÔâ[5€çݼ³M‚¡¥²ôF±w¼íW¡Ý:Ár‡ìd§ç h&Ã.h–óýÐD#ª\ Ûvõ¹$ëÃ1Œ[ïh »fXª“­Dáx5 ôj˜P"üE?¥C(µ `cªõ>¿rYò­1ß Œúfm0@oBàP¿ø’ÜòÈ»üàqôž²D>0’æâ‹ñ,pÀÛ¶Î%ïD±à)˜ÕÇž²ÙpOXÄJÞyàpÎw£=ƒ<--ƨi˜Œ„ÿ±«¿@Zà!hWEwò(FäŸÎ²Y—v DÖqÄ®ok#'%Ù4œ€Ô\65FVy# Z‡ê]i míCVqTçãV46ÑšŽ}à1¶!ò•œúP¿[¡µßìϦuÊVÞ{˜ÐI¾fm}jœn?{[­@lyþ²oúè78î£Ý®mXD#:¿<ÙòrU —W‡¬×¤ç¥UçàV&Î ø( Kˆ§V±ÔÓ`ƒÊzT¥R((Mç²kƒp{‚©¦9fç)Ðp5ñ7žÁÖCèð‘ŸMåÔV‡óÞ¡]4hЃ^úµ×pÈ!Âlôj„ìÜÒa·¢uø¾q;Mzées®ŒgéÄx~îj¨2‡ª|EЋ8Ê8³?ê-‚ZÀ‘Îiм¬/L¾C² ŒªäþÐ 8¶_„xU±èð.j®WÄN1/…µœP˜‡téôÁ¾¦¨;›€r+:X­Ù±¥ý’h0}YÐó"¯ÁC_ÃðrùaÁ û¢§bºB ·Vµκ/žúóÕ­‡º«€‰FpŸ¥æ`&Qß$§EFÝìHcyÄHœ$/% ¢”•§H 7?L[àhLÊìå}&ïþo«ó…â°Nè$›eÁWyÝ@m8ÕU!«ýª è…1ä ^ðG^W;¹?»dx¼òFª¹åÖ½,„R?âe#é?*~Ö/pùžQªZIâ ë‡S³¶‘o¦¶Aj]UÌò;(åM­&óN¾ŠïîÜž@81º"™¥-…€‰b*ѱ¶…%ðÉ–&¢0KÆv–ÐPÌiR=‘Õn 諬ϭé7'ÞdÛõg«1®ƒùÔç¸žÐÆ)>™õ Â%¸‚ú^` ºò50þXU§wÑÜôgcÓµ­0KS¨‘â¢e¨â ä ¼pÝáÜ€jVFÃ]Ï}”Ç\fPGtÏC k¯a„4¸)ÌU¯tt‹Æ‰1· +_¾ÀŒ°àJf0Q7õaÚ¿qi†¬ ྠ¢Ìû]_嬻1$*î_i–î†S¯aš~ö6ã…ý7^0TUY ¿\˜‡ ¹¬E)P>êËôuäTñcï¢Ïšã(I óT’ß2ÖÕˆI2¡ùI¶§’_Õðpå áÄ8ÌAâ вR¡wó-—R¨mêÕ:JØ{õðWl×{B׃Þ-sêÉcîçßéb¸¶…a¤þgC¨Ýgéb8Ô„À\J²þáý ^éâ º’ˆL­x~ºÿÆ“tôT½³‘”Íén> endobj 1523 0 obj 2162 endobj 1525 0 obj << /Length 1526 0 R /Filter /FlateDecode >> stream xœÍXKÜ6¾÷¯ r²c.)‰’˜Ûy {H`d€ÅÂñÓÍnÖ£-ªg2ÿ~‹/‰zul`ž94‹R½?Võù@ÿwæ§Ì(.KŽŽÍá³ß§¨HPšû-Fp–0BRD3œ0Ô ùCµá‰IXÁÏì] +ôŸC{ è—ÇðÎ à{9áVÔ‡÷‘mþXKöt9üðxøçÏ Q‚ÏSˆÓsVBŠ•8M¸ùKÐcƒ>¼ùשQ­ÒC/ÕµhèºZ¿ýˆÿ}øéqætJ.¿5ŸßÏLÌEÉKVLêö`ÇI4f†,I§e¶ã+Nd]ìZ‰BÈ„ÚÆ8×qæ•ÁãP)®¢ÔñV‹~Dä†Ã”&˜¦%˜ñ‘i‰ó“ލtÔ~0\0.å|Cúýhd8£%ÄJËšuÒRï¨á¥›ˆ98Ýžƒg`k"9¦È"„lÚùóÍYõzX«úóm$£Û‘×Ê—X¸IT$YKÀüi#;I¶B¤ô )N¿–ZÃÁè±Cú*êüŠD‹ds^6ÐMKdâõùÖ îx5¢ÿ¤Q­>I ›ï¿û‡Ùéb^imo iÎyšy”þÖ r7¥†£HqžA÷ƒ¶ç8~ÃÁyŽ3(OϪ»é‘î¥Ð]ë²g7vqF̽©/Ùk%w–§8ãÀš¥|ƒuÔÀb‰V>ËÉYÚ'Û®CB}Z¿týiܵ©­—jÜðçÌq‹vZË~ª­_Ð0a-ÙÂìc%Ú‹ƒ‰LrDlƒÛ‘Yé‰ò½O;Ý´nħH²¾õÕFï™Ê5²Ö1“”zÇÒpRffoøÏ‹…ÿC%lÌÒÇ:²!û‡‰îoíDxíŽ]ÜØÅÀS32äe¶a/-Nˆu#ú]h&,Å,ò™ó-ñ$㿱ƒ©£G‘O‘{B’‘®\E1ŠÞ\X¿™„„ð…/•:V®EµÝ€@·‹H ]1N‹££GFMX‹g¡j_¶ý‹í¸|ñ)åäÃHÝôÄâð°­·VíôPÃ:VRGÊô …=6nã×6–ºát–ÎV& â8¨g£†%0˜–:ÊYçÖîÄëéY·ýÚbžr»ñ@åvD?ñÔªQƒ…Ê}Ñc©stèA®Â¤9sÕÎàÿ8f¸õ‹°âaµºåXÝü“jZûA‹î†ß0„B·äeI2çøYMwƒÍkS#T•…&ܳün¯LþË­æÝþì|ëúD&æ²Iÿ»Ê³¢ËN—N“bÁóc¸÷TÉúŠH­€ È¿`[µª½Ø½_H8ä úóZ¼¹œžöë`ÆqiŸ²Üà·3¼J¶bò2¸%Ò$ñs à¿üÛÀätÁh.£†ÓMÚrœ®ÑKÕi-DcPÿü¤`J`3Úðå&—pÃ#Ð`(g£ÉVúßÚÌÙ‚ÓÚ 5º"D†Ã1C'Û6Q™%Ä|â> endobj 1526 0 obj 1834 endobj 1528 0 obj << /Type /Annot /Subtype /Link /Rect [ 257.898 440.711 295.658 449.711 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1270 0 R /H /I >> endobj 1530 0 obj << /Type /Action /S /GoTo /D [1376 0 R /XYZ 72.0 769.889 null] >> endobj 1531 0 obj << /Type /Annot /Subtype /Link /Rect [ 262.109 405.501 299.309 414.501 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1530 0 R /H /I >> endobj 1532 0 obj << /Type /Annot /Subtype /Link /Rect [ 165.82 143.259 191.93 152.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1270 0 R /H /I >> endobj 1533 0 obj << /Type /Annot /Subtype /Link /Rect [ 215.07 96.719 402.55 105.719 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1273 0 R /H /I >> endobj 1534 0 obj << /Type /Annot /Subtype /Link /Rect [ 203.13 73.509 315.33 82.509 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1275 0 R /H /I >> endobj 1535 0 obj << /Length 1536 0 R /Filter /FlateDecode >> stream xœÍÛŽÛ6öÝ_ÁÇ`B“º³(´Ûf‘Åb±iè.:}ÐH´-DJž©ÿ~/6)‰v’}JÄÎŒŽ ÁÅ÷f󇙊3yžc²Ì%Í&68ÀŽêÓL‘%h¤Ì0Æó{Ue²Ò˜ø ¯Óè»Qîze9Î)e,g >áb–B4neÌwcÞ:Y"¥—fJ"@Jk>äXŽ£ †Î¼ ó(·ÆÛÿUvܯœð\R ˆa’¥Š¦0D’ïêç7Pv2´—ÝE£ 6fY²&{Š¢|±ŸÝÚ~ã»_~F#ŸŽ+Ù ÓYUÏâ[æ¦9N)¼ú¢X~<õb›Ñ7™L.bLh¤“¥Éߨ¥ÎrJ’V¿pc ´«/yžÆ¦Y®R5_»½Éb¡»ftë²÷ðýÄeYMÍ wÈñÀÛÖµ*ž¥íMÍGÿ«Ïé4N¼óD»N,¤O#Åq¸ÂDYÒ”¾B*Ú‹,Qž€Š˜{Bì4ºÓ‰òt—?Ýc‡œ»ÊàÊñÓèAÆèyÅDZ”'‡ú|ä£ “OÒ×¸Ü Ù}ÇêÀ+_ƒg ¸Ïþ°=‹¶W‡²ß›ÀÐ3 3L P‰®k¦‰×Øáþ+ŽÒßÑïÙ™‘yÁ6CÉ?Ék‡qªø4ãè’ÁÀ¯ñę֭'q/øºýäÉíÂÈ“`ô¡­g.¡4 (å%hgãd¬1¨ç“Oßx›½ŠÐ°õ„‡bšñîšq ¾qÀ¡|ñ¨'áq:ö_«ÅNŠ.à—"[ø¥Dƒl^š–ïÁÚ²ªÄ±Ÿðš0" Ç9ô«ôÜl?‘ŽC’Á¼[TEÖÂ&u6{ðÎÔ½…L+²ÿ :CÓï=TÓÔ‹KBƒ6‘µ€™>Ïz¶uÇ¥¯q®žË™r0CÖê<Ñ…gt±ìò¢hLqÆ‚¿ÆGÙõèÖ½ð>œ¸@kmö½ÉJƒ1ú›õqØË²æQz—¾³;†A ˆ9ñö„þýÎc;~A`À%pþž»Ä†6MÝ,´å«÷àám¥Zh50ÎÔ£H>PÌÍsë“Ú@àhÚ@[6a.̦KÓ˜ºœÊ™‚füY°+O¾œo’táñÂå«Tý·GõQ*Ç(³õ\ UbVà´(à´±žð—ù¢ìDÛŠWÍNO±'Ýe*…7çÛ?5pZGPIŠPoºÿ! ›Qœ3P>¡é刖.ö¥¡}“’Ìô+uEºô` teÓ;H¹ø¹½ïÚDÚ¶`4ò–W“íÛW˜ñ~ßô;„Év³.ݲÃÉAb÷Mº¯}“xᓲ§Ô'¤ë:PJ™ç¦ÜPQ fMÕñ/Ùù \q^CœÉGp;$ÐïÓŒÞ ØzŸ°„êƒ[®œAïì@° ’i‘âBÝ­Ò€dìúéŽ>Ý/È¢(ÆYª\˜gÂ'ÏFÈ—™` †¶©º\Bb‡0Ià6·òà Â3àâ˜-ô…xëSÏ'ÎT"oº!Ê Œ ~(¤p¸‹(dRN²›!]íóBJ£LŸ½õ*¨¶÷ ÚÎk e\Õ¡”ŒÅiP@G¶ G6Ç1‹Wš'ÂOäy$ÈÍ{k‘÷ºóâo¬Ú†÷“Ϩé¯r­ŽRÂnÓ h'Ã9s®êù…Þ›fªÝ¨ôÿ'ò,‡K>¤?ƒkþ­È¯ö}œJ9ÈTÖƒÖË8ίSk±IDp««jÂn‰]ïû§(k3‹ža7Ž Ãá„Ôˆ­šÉJNp,Bã¡èÛ¯Ít0ºIb\$PA”%7Yí;g~©\À!´GW:µ’'hm†ÆçŸ+rVûœœK—†ã“4V¹–>ªžþ*ä'óA9èš^_ýl° ç%¤°1§Ž›– F£Ì0 ½_¤‘ª¹˜,²‰üïß~}÷þ?[>U[7æßZV7ß ² ¥q²`õÎÛ‹® ÕJ Ó¯W3U©J#kæVÝ®¶Ø´–/ª–±ù—T+õRGHÝâlu뫃Ö_d,OϯJ\õ„Qøúfs³À‘æÄ–”W¡e(ƒ­kZ¤<Й|%‘AÝPõž–±¹ª€lJf1QÒiX8´}|U¶²6ÉqÃNDZg-‚+þ±lA+*øUÝòé]W$ƒ!d¬H<‘MìñPJ¾­…Mï7?ÚÆûÖÂFê¶ékþ>L]{Sõœ5~åÏ7U…RaêuõŽúq9V¡¡óß‘Ûv˜¦á‡­Ñâ(+u ÜsÜói{E{ïH wƒ+gŽåÛ›62UׄD”å¾±êˆ õ¦Þ0Ú 4‡,Àhm1Ü0©J¦¤ ¾iúòh΋+ qÍê­÷’ÿaó?Œò¬ì endstream endobj 1529 0 obj [ 1528 0 R 1531 0 R 1532 0 R 1533 0 R 1534 0 R ] endobj 1527 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1529 0 R /Contents 1535 0 R >> endobj 1536 0 obj 1958 endobj 492 0 obj << /Type /Action /S /GoTo /D [1537 0 R /XYZ 72.0 769.889 null] >> endobj 495 0 obj << /Type /Action /S /GoTo /D [1537 0 R /XYZ 72.0 670.03 null] >> endobj 498 0 obj << /Type /Action /S /GoTo /D [1537 0 R /XYZ 72.0 411.147 null] >> endobj 501 0 obj << /Type /Action /S /GoTo /D [1537 0 R /XYZ 72.0 257.464 null] >> endobj 504 0 obj << /Type /Action /S /GoTo /D [1537 0 R /XYZ 72.0 136.728 null] >> endobj 1538 0 obj << /Type /Annot /Subtype /Link /Rect [ 321.11 592.647 367.78 601.647 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 527 0 R /H /I >> endobj 1540 0 obj << /Type /Annot /Subtype /Link /Rect [ 381.11 592.647 419.44 601.647 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 535 0 R /H /I >> endobj 1541 0 obj << /Type /Annot /Subtype /Link /Rect [ 140.0 570.647 226.68 579.647 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 552 0 R /H /I >> endobj 1542 0 obj << /Type /Annot /Subtype /Link /Rect [ 313.8 548.647 351.02 557.647 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1270 0 R /H /I >> endobj 1543 0 obj << /Type /Annot /Subtype /Link /Rect [ 140.0 514.647 166.1 523.647 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 694 0 R /H /I >> endobj 1544 0 obj << /Type /Annot /Subtype /Link /Rect [ 140.0 492.647 157.22 501.647 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 700 0 R /H /I >> endobj 1545 0 obj << /Type /Annot /Subtype /Link /Rect [ 140.0 458.647 157.22 467.647 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 718 0 R /H /I >> endobj 1546 0 obj << /Type /Action /S /GoTo /D [1527 0 R /XYZ 72.0 769.889 null] >> endobj 1547 0 obj << /Type /Annot /Subtype /Link /Rect [ 347.028 436.647 384.798 445.647 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1546 0 R /H /I >> endobj 1548 0 obj << /Length 1549 0 R /Filter /FlateDecode >> stream xœÍɒܶîÞ_Á£]5£hmI¹ÙñRN9yÏöøåç –Ø#&j±-QÓî¿ ÁMËØÎÍqª @±²?ï"¿[ù§H£ (JRŸvŸõzDò˜${½”…Aga˜( ⌜È|)#Üã±àÏŒð–ü±ëw!y½ûó/ iHû.»ðæŠÕ‡Ý;O6Mð$Ÿ/a†Añã øn~Áyžáòâ›×`9ÊO3A–(ž2[A ðï£"‡+‰Ãm‹š;ÿa„ ÉýîùÝî§W SHîŽ.¢r Š¢²ÌË>E\Êÿbrw">‰öOÿ"w¿î^Þm9Ì£ÝÚWb)—ܵ/ÃV­~BâÒ‡Trf…ÄQy†û=êþK[H7ý(ª®«ã=DÚsØiÿä§²Œ äsײ‘<%q š<©5Sƒ‹Q÷Up Ò/ç®b½ûÔR Ÿ^ÓÑmãÇM2æIØÕ»–ަòà‘Ÿ¨Çˆõ÷îˆ+Ÿ]˧®q*ñ~d Ð0¾)öáÂzäêÀÛh䆫FªZL îÕ­hÜj§‘‘ÅäÜè6zæo>x_6ÖÓ8ÒÆ?ì±s(hØÌpcQw¬·—ÖmÏêª[Û#ÁeÆÒù¤=**Öjs¬ïQAF€x~‹–ÐBÕÀød9€Ï0ñÉ.Ô•%=X–G>i…b«÷üÐ#ï:~0 ZéMQ™; ½;X«^¤ ÕÍ8ŒõUgÙA€7Ô}»0ÑX¸ý#ÓÙ Z0 %#o7=Ü*sçòÜ÷‚ö͘•ç“pB £p[íY¢Ä–<•ÑǵÊýÂüŒ^H¬ïXÚ»‚›¦¾—ð{z|ñœÀ}ÑrpìKËIOahÕSÕCÀŒÉHì0Ó©49´DóÅyÉL_f9J×w«ÿAÍî'åo¥¸(K‚0!UƉ½MO&y/›h/˜~ô<Hk÷Tˆv)ùòO_SÒT¢’÷Aàò<­^Û.ʳÅyÑÒÅö[T¯”+‘fQ$‘aÒ~&ÍKá"eRžóŒÓ2ˆ¢P–„hƒûÇž}ùé-ë§/Ë}eäÒÈE¾%á«“’N aC–d;þ`}Ã/ãrSši ÒÅiº±i#£2_Å[v\Q½b=Û•[£, öRíx“ 9\I ~+Œ—z<²…´!cÕ8ņôqT.X&Ò¯©>Ø…ÒyiNaÕùÜA¶vÙU­Ž›ªJ›pÛæÐÜx+ÆgìÂÊ{`N‘Γ„Ù†T¼Ýu¹+BèÆ UD»¼ã¸v5úˆ7=ñþæ1RÝe蜈k¬ÔXÿùp»añ$ZH9žiÍŽ¬žGÉì[W»J(éÖÕ®¨~‘þD”e„²…-Ò|c á=•x’È:mJ§b .%,uÖ̶¤[Q=kšY‘1Fq¼A/ ¨«í©ƒ žtï¤ \t´˜h+a‘Ê#;ÓáÄ„À FRnÁ þqˆ.fšsÌm¢6 ŸžôÜ7ÐϼØÑ‚ºÁ3{ü—·&-Xä ‹|x÷– ¯RÐþœ•€ 3Aº Š©jÕ C‹&Þ}zºq2»Îùî7îoMõõû[Ó“;tŒßÕ¹½Bé»v›î”¨x™©‰w"Ç)l`ÄàC¸:@Ã`1¬«öÛà}a'HhG¦î—×MŽcKU{¬±z`gaÑUZg‹0Ê`¦_+ ²ã-T ±¬QQä%¤Á4Ê6öÙã.-«[‹¡×)õ°h[yV¨<½øÀ§ûvÃÚi²8´ã\y}–вV"p´1½Ã˜ðàÑÁØl"ŒÑ¤aÌ•šÈÄçšîÌÏäDúÈN?ÜpÅ„&b6i7ÞâÔÏØ±Á¡Ÿ'*§LºÞÊ›ÒXÙ2'y.­XÈÂ}d£ºP8ç ]è•4t„ ð/ѤØiB‡”e&áÇùx†“Ù@o~‚Ãï`²$pØø=£we––ÅÞ´·od0í3—Š®:Ù@_-ŽÖÓ߈‡L á¾:ÞØ¨;…/U/,¢œÁIiJ·>¡3 ,ÝdKn6•’a`&†÷ú¦Ó8Y˜ f·þ^Íÿ¡šÆ-t„ÅÀîU ´33‚ª¹7HÇk5w!fæ³Õ> }5onÁb±@Œ~a£ÀYl±vÒ*“?BµáÈî§a«i•¦H²…) 3¥j(Œ³  öG!º‹±x‡¹¯øZðêÓ¥šcÍOg8þÐQûíí¶â#Žõ#Ž‚Ï•ºDôU(Xû‚cði¶OžØQAg‚n(CÄ\ù‘É~H²jªë(§Ó«ì;äCÂ|:€;”ÒNz” ƒ”`à«°/—Ñ'±Ö‡¾ùìÅo/¿ß°ñklå—9Š”¿u¿'iž{h¬‹2× çwn2àÆarLì tö!OY3•U×È÷™ ,ƒ¤ÜÃ<ÇÌ?þ÷õûg/Þüþú«F“wRf%ð)7˜X‰d;}ýhf#¯YlùÅÂ} ¬8k,ÖñQ“BMœ§¦TyG8fž¥j,eˆ “+°çýj˜Ø“,,:‰=ȧ/Ú÷z^ÝÉÌc¯ò¨ur‹Å'KàC_ò"rÅ' `”ß*2Ù> Ò2 ã¼Ð#ŧ8Κd[t¿UC7ïéqà§ê9DUZùí$_mO ›mù¤bJˆä²ÑffEò}r®èž»WÚLæâ[h)ù Ìk`f@7²ë)ëGi@¬O ÔåIÁØ) ÷¡µ`­êÄhpýÈçÞ¬üì‚ö·k–ï%R×2[è §¿6^®Áw¾Çxk:k¼X惥õp±žFíE™0︀£ÃÅõ㻂ъk3"bÊg*ÕÿbáÊ­š:0íèI4°+:¹yç;´eç3]ÎBRû¸\h¯:Uì†Nä”hV½‚dR1©,(ƒ!HÕ(G‡vï\ýß3€ L!±–yâ‚9Æ`.¾Ìûhã½W¹çÚK–!È|²ÔJ{škÄeå¥Â>ê·h\ð£WL#X[93†z|Â…W="`äê ~5ÑÂ8ô«"´R"r:qü«Þ;÷a9HõËt¡¾}‹ÈõóCï0ó|‘Û.Ù’éŸgUÖÁCÜlƒÌß®é¹Sýü{/9vúøk›cèÙ»†ZkðCL^ßVÅûeôÝîÿ¼Õ§ endstream endobj 1539 0 obj [ 1538 0 R 1540 0 R 1541 0 R 1542 0 R 1543 0 R 1544 0 R 1545 0 R 1547 0 R ] endobj 1537 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1539 0 R /Contents 1548 0 R >> endobj 1549 0 obj 2462 endobj 1551 0 obj << /Type /Annot /Subtype /Link /Rect [ 158.0 723.389 195.77 732.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1546 0 R /H /I >> endobj 1553 0 obj << /Type /Annot /Subtype /Link /Rect [ 332.515 656.529 353.065 665.529 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 318 0 R /H /I >> endobj 1554 0 obj << /Type /Annot /Subtype /Link /Rect [ 359.404 656.529 523.274 665.529 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 318 0 R /H /I >> endobj 1555 0 obj << /Type /Annot /Subtype /Link /Rect [ 158.0 644.529 199.39 653.529 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 318 0 R /H /I >> endobj 1556 0 obj << /Type /Annot /Subtype /Link /Rect [ 436.695 92.339 523.274 101.339 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 552 0 R /H /I >> endobj 1557 0 obj << /Type /Annot /Subtype /Link /Rect [ 140.0 80.339 184.45 89.339 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 552 0 R /H /I >> endobj 1558 0 obj << /Length 1559 0 R /Filter /FlateDecode >> stream xœÍkÛ8îûü c¿l Ìh$ù©‡övÛí¢[ 7³÷@·<‰’øêØ©í4ûõG‰zù‘t°ŸÚ)R)’")Šöç+Qø»Q?EÂHQˆhµ¿úlÆY”ó(ÎÌPJIÂSJãˆ%„§Ñ>¥Q­h€[~FsßEÿºj®hôúêÃG˜³Ž(ЮèæšÕÝÕû@63àïI>m¯^Þ_ݾJ#F£û7qÊIÎ8¥¬ˆ s¡þñè~}xö¦é‡²®Ë¡j›ç£û_¯~¾éSJŠïMÕ÷#ÁUò<'têBšMŒc0‚Õ£‘ SW ø{Vd:“˜†Ͻç»î¼ãä0‹1!r!à)F®ÃÓKóÝh7÷®ä:¯t‘Í¢¤)÷2zѳjãáÇöè‘SÙ ZwÇ&xp ž¬«ÍFv2$ü"»±÷#m°â?äæ§—0ãCÙA,Ëú: ìÎÊýcèÔ´›NÊPÜçÐ@œN,´Úµm¯‰Ò˜äšç±u9”eø\Y”xôE=ìÚãvçG†]0{_¢š—¸y¬ê=¼j›Mµ=våCÌ(ÃÖ Õ^^Ï•Œ9‰Á›!mƨ¤Ùì˜=ëAàzíñ# „ȰC!k*½O[WM5Te]ý/ ¶ÆC ×ÖEݼVL½–gsãXˆ,-æ’wr³~Xw+Ã+Ú.9~Ìø^ gÓ±V›ª–×-TC0^×í©M%ç¦O’%n”±&“‡]ÌÀ³,™“Eýª«CWû£œêеÙEΉ´'Zgš-XØñÏŠ(KaàÊáÌÒ\onNÕ°»ÖUçM*çјæNÖr5ôZ ¸í£Ó®Zí¢][¯ûèîýÛj·ø;ûË A˜P %cᆮl¶7ÿ-ÏÈÇ ¶Çtw¹ª6•Äà¡:òM jds¬kÊaLlÏÁú‡ªaN[ ™l0Ï ÍCjgI–.ˆ­õœ’ŒÐ,ÅYs¿Ô‡aN ÀòºÝ0þr{{:Ȱ++p£¦‡H]I²j÷·¬Ë¯ÍövîÌÊE„&»a_ϼ9'q¡òj,è>N§Cå\9<ç Ó•¢I~ÔÖÄ£ÿÁD†H#å:˜i2—§ó ?†,ŽUðpG¢›®Ý{ìîŸï<‚öë¯CVC Z;œ]}ÁÎq:1Ê¥×/£¡ì ù\'–f$ƒŠG¤ŒÛxZW½:>nÖíª?MY1¡r&ˆár“¨Ó¢:ô®b4@T²ÁZø/íIBep ¡E b'ÄÜŽ¼ `³3ÕFÈ‹†¥E“5+èD{ý¸‡šÆž‰€bÏe[`Ô*}dâ$jyÒŽˆøñpí`T á}ùèà]ùÅ3Ð9A«¼y°“{â°—êYÕlÃÇV6wˆr›eŸ(k’Wœ:w¶h'?!Õ;¼´Àª=jG…™PAò+d‹¨Ø3ºÕÔecA[t¤AÉ‘úÚ þ¶ÚyÎòn’žÙ\N“‰¾ ÐÌèâÊ‘[ˆYØ eU`]á•RtêÈÕZ\Œ9Î3B![Ó˜¦Ó˜[ÕøÑ™°ãq1!ü]Ûƒc©í¡a§¾Æ´GsS¥ZÐÔîHÚZÈÚG#eã@«£AÛ¦~ôë:Êá®V6PÙAÀYìi¥]\Äp(€šIQ,茵ÝÅÊ.aâbå¹lVõ ÎÇæ˜TUæ ;äÖ­ |¡²>”«OåVFÚv\¾±ù9$Q¸cN6ufïÁ(c:Üû8'>q»¨Þ~qÿ6`è[Z@ }À0rN€¸ñ+—Æ8qÀÒ¯„GÜœfì;Fm²°/"Cï$üúþ„›³Œ¦ö9ËLuØâ ‹Cn,lÊ2zðP_wú`¤ìÂç´Ö!y «c?´{sòü¬ßI,D-®+|,!ÌпïÞ††ÇZ•O’_Ë=$áåy1Q~zá‰áXÎjŽˆÏÐð/÷¿½ÏsVüŽHa¸½ÑFPçYâÐ7þ‰q_ ¯[—Òp¯«úG‡Û½2«àN-Ø ¡4í «4V1ç"ýPáö ê+C¢‘ âãÇ ˜FĸéuÈk8#Ái´¦) ,Ó64ô®…5/ä]0NÊ'Æ \LÑŠ\w_6GPïÑ`á¶[ësÀ (¥%ü$ƒ'P¾xìÔvŸˆGj±”± † r¡B·¯²Ù9“À9çB$ñ’’ûãjgi罃,'™êp2Ìiýê²ì+Èa~ ›¿ú>HÙ,ØÑûºú$Ÿ&±Ú¯ÂÜQåWH)dwQJÆ O J"¡ÛÓX‘iŠ…N—ªˆj‡Dði©ÆØ€Ò,~©ÛcßÝÖíª¬o«fU×ßHLE±ÀäÚ‰bŠ@1z'(n{(ñÂ!§ Él–tÚ¿þpóF‹»Â䜑&?DO9Ô˜ˆIµ‚(òÂ3ÒØþë(8Ê‚CËžUpD¹XžÿI¥ ²›z7Å3“´RrVùli¾ª¿.åÏjÃ”æ” š<-¦YL¨Ê Y‘Ùû™r3–ë6Áqhu›äf+©rýÚ=û d±yÑÌ>ÀyÉ@–8tèäF'RDÿÀ"¦õ·?ž»¡×ï~w°Ò•8L§wÏš,¡‚ˆ$¥4ù‚b¡ñM‘§ŠNöÇ gÎ]œ¸?»ª=Oe×aѽr„­ &œ­o9O”QI9[£|hñ‚lì­S#vÁ›¡üz¾†K$/L-=_ë:XÇœHÜ¿DØ$í±RóðÍcR±ÄÅÂBÛ‹ûu)áPÉâ΄[¢CsžÒ"Ÿš±teÐÉí±V¯ž–*“‚$*%¤y¼ÀÔkq.™çü½j…£nÈjU$˜þ÷B&ÉhARõÙ ÍÈ&»˜IæóõMÎ\sÏn‚¢äS©~ÂþêÄ¥îvËÇ='î;F|¨( ¤£²ÝÊ4¼Özb)Šjê®ß\Ôà<.œÌû¹Xà´ z  z!úgUˆ‹”ð<ѯÕ.j0¯²³„M¦÷;ð£[Ýv½ì“P–Ï©õýJ¨—)Çòzïqû-‰FV;ó=¢ãÏDÌûæ•-šÏA„yYð _ à„ôxôŶ¬ð5âö›œ? A¸ã`®mƯÔãÉÄoE‰Hˆú„ò<] ¶µCµäŸÉ>0rÕ]P'Üû7³gì½Ê>OL9ƒ]£^Óæ Žù¬{ü¢(ÃÏwª¦êwÁ€u„Ì|1ä?ù»Æµ4ÕX>­úTã"Ÿî¸ò „,ü i‰¢—+×eÁ‘‰nªË“ ëL3-_iÅl‡ciÝ+]0X‘OXU³ï½308Ju­éeô Á*$øöíýÕÿVø endstream endobj 1552 0 obj [ 1551 0 R 1553 0 R 1554 0 R 1555 0 R 1556 0 R 1557 0 R ] endobj 1550 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1552 0 R /Contents 1558 0 R >> endobj 1559 0 obj 3015 endobj 1561 0 obj << /Type /Annot /Subtype /Link /Rect [ 158.0 747.389 195.77 756.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1546 0 R /H /I >> endobj 1563 0 obj << /Type /Annot /Subtype /Link /Rect [ 332.515 677.707 353.065 686.707 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 318 0 R /H /I >> endobj 1564 0 obj << /Type /Annot /Subtype /Link /Rect [ 359.404 677.707 523.274 686.707 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 318 0 R /H /I >> endobj 1565 0 obj << /Type /Annot /Subtype /Link /Rect [ 158.0 665.707 199.39 674.707 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 318 0 R /H /I >> endobj 1566 0 obj << /Type /Annot /Subtype /Link /Rect [ 436.695 254.979 523.274 263.979 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 552 0 R /H /I >> endobj 1567 0 obj << /Type /Annot /Subtype /Link /Rect [ 140.0 242.979 184.45 251.979 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 552 0 R /H /I >> endobj 1568 0 obj << /Length 1569 0 R /Filter /FlateDecode >> stream xœÍZ[Ûº~ß_¡‡I€5-ê®yhФMqpМÝ6(’<È2m«‘%E’×qúÛ;äðf‰òæ1»v>^†sãpHåûõ|ø]ñ?YDI–å^y¼û.Û©—^˜È¦Ø'Qû~èш±wô®›b¯æs,"Pü¹ øà}ºkî|ï¯wŸ¿Â˜­çüó¿À\°z¸ûhÉ&ý+Éç{û»·wë÷±G}ïqgL$¥ïÓÌËHäü'ðÞç—ša,꺫¶yõÕ{üûÝ»Ç+]Cß'Ù¯¦êÇ+!TÒ4%þ4„›Û 9ò®+A¦W¹jA ðï¢ÈþLbßx=¿ŒpË“Â(Jó<Ísè"ÙUè„á­€ùe´›ÇJÀåZV:Kf»äÒž¼WÞ*ô õ^‡öTo > Ì€ñP µßWVok誩ƪ¨«ÿZ³aÞ 4/è$,xýÄͧâ l¶0Ìó$žoïží¶›m_JVÞÞ¥pHƒeFœ²mvÕþÔ×:íªšÝXXêW£Õ^×íy° ÅP(Ûîï’ÅM5Lƒ¤ L’h>ÍʾêFìͽky]ßv¬÷¶ÅXl hkŠ##ʉ` öÕü“Ì‹BBS Y3 ‘ëju®ÆÃ ÚV½±¨­@Oæ<°š•ã D€Y@·ýÅ;ªòàÚz;x«F¶Æ?¡p¸)[š_dt?º’mì‹f¿úO± ^îO¦=t¬¬vŽí“ ǰ;ÕµA]1¬íÂ$XÞâáaP»[˜3qoÀÞ†ýL£$žK-´œÎÈ(ñØüAÍg˜…>Ïæ¥$ò!øi:ŸvÇîõz}>ŸÉx(*ˆ f€-Z2R¶ÇuÏêâG³_Ïã˜úKdrõ,Sf’Lïóm5›š­¶m9¸w©®gi„PÎFü˜¨ºÁÂ|Z°ë—u´šøjÄÂkÏì‰õ÷VZDu*!Ò‘¸°h鉀ç)ÜæÛöK‹8ó4Mü‰ö ûéÈšQQÇÿKXH¶À¨?Wâ¬ÄÈÑì,ñ©»×4ª†ô±¸húP<"!©”—v$½å}U³·»5Ím®‡²i0QVf®0Öá¬`ϾŸ Ëk\(¢lO]­gaäû™A¾÷dÄzËŠÙE£HUmÄV­›ÃÙñV gE™0‰—œ›E}A¡Ñ™1Äy ·°gÁܪÀºÂK?äøi+´¸¹ç?%Iù<[O÷\YWG Û. ùdâ?…=à‚£í!h­¾@"¢…%ÈsÑŒzj«(eŠF“JG Û¦¾˜uµE×ÕU©6JÂzØp ý\Mf!  e”e±ª»YÓE0é¢äy´lV ŽŠ,¤“©Ç¢âºCnݳ¶o1z]Q~+ö̶ƒäòŒóc^°ò2=I¦ÎGc-ø>I&óÐ÷aJÌf@ ½P¸Iô?Ò2äüV“*a HF:Ë(Pid[,ÍJxÄÍç\ÇŽTD؃8üàµ1„'áßÏûÇvJèS¦‰ï§~†üÞW ¨z§œÛN¦‘Áú}:;J¡œñc(gÒÄÁ”¬u¢R,f¡K(¼C˜EãÜÁBË TŠæ¢i¼u Cé6j MAó:ˆhôa礦@•±A¡©u\‹˜nЕ¾±äm‡Õi8ÑN-¹°8ã3OV‹ªÀɬž<—X ž&™¹=LSÇêç,ä–€ßð—™™ÐXRV[1<5 Öö"¦íφ„bÏÑfÀFäišO| Çj°ÆÖmûÍᇠž(QWßø½‘o©Çß»ÿh‡qß3¸ª½VÑ;³0çÕQ¥¾ŸÊ$üg²lîø§ÿM‡q~P€,ò[¿§t*Cîšcm=OÞñv}êë7ò¢Ãß6íy»NÏÜy1½éöÃ÷Z5?=¿ ¿Y±æùáˇøPO8Ä—,êvoXÐíÕf»©°ë$ºÊ¢^C«©-7àÌÕ¡†ƒ1Šž­‡ýÈñR³áÀØ8¬åh·€yrCÀ‘Uî5 q ·"!ò³9çÅÄñ7¸ÅÆ™OCõ”;’õ|Ô˜›)\‚ãÙ9ËHžÁ¡á'ÔÁäX|»‘•i@B*ï×ó¹ÄZ^Ö ž+|Cª~™*eƒÌ ±¬<¼°yà!¬Ñ¶èF ãkÏòxq÷°0“°Gc•@½ÁI(<îpAN,PY/éSŸqÏ&1ÉrøM29!!‹~J\ã¹{xaˆ«1®vÃ]9‰³?…^št‚²í.ÈÒDГÒD´éºVÁ2i6Õª„°¯ÕäOÖÂPQÄ1ì¡$‹šXÛrS5·kb¨%npzVþ4爄40ÒáÆâÝúçTÎ3‘ôÝŒý,‰L}ûÄæ¯FË|§D·dWO ”‡V]>ÅsEµÛ±ž5£Ý„çxeë/«€X¾&Xü®«+£fùDÆadc[Å–Ræ~ /«©#aÎG=â–O(¾Q6Õp°TJBdïì{«j’b°îZþÈ}“O*u¢›g ¬Tí²e¢[˜Dp=ƒ¬œ†CË÷B1|ûp¯ ®ôƒÑ„U5ûPxu4D® 1ú0Ï£˜:„)/{¨«‡þIsZ}Ð$¾™žN“×§âz:°Ðä‹Õðb¹ …½¤ [–º ¥™|ÁŠlnÜÄO&sħ8¸ÄüÝP”ZBJÏN/üÊ¥ûå•#s$AN‚$äÏ[9ò ®z‹žW41ïvHÇ"–Ž4ŽE|ñpKæ¤bX}.ŠíXä´zФýÀç:ÎáÂ’D>~›³&šHRÁ±íni~¯05.j~«hM"zCÍß;M>£&¡L °7âÈÅšh>ør“›÷=¤;à/?ŸÌú䋺 ‹zh5dˆÈ.̵²GXpeíõÕ$)¬ì¤€àSÕlÛóðB7´çéùÉ ‡íÄ+úk>+õ»J]bË,¶ÏtÃ’éÑ`(³Æ?êaCW4Ì‚íOq•ÞLËb „A~‹á¦I©C³ßn¤°ÊÜŸ‰~SOøžÊâÈÁÙð‘~{FЮ4‚kAÅÏ Úv¿Á-âzÒ3€™úÚ;ŸìJupg§>lö0§8è“ /¨º2óÑÀFüŒ¦{™Ý©ãôÍ\ ÕSœÆöɸäOÀî-üv,ÇV§Ž;kð©#¦åYK,‡O’?€«uL#‡úWY­VVwËÇ\ß ó<ˆBCÃg×ösÀ}q2Á*`äs#±þ'ÔÇ»ÿ  † endstream endobj 1562 0 obj [ 1561 0 R 1563 0 R 1564 0 R 1565 0 R 1566 0 R 1567 0 R ] endobj 1560 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1562 0 R /Contents 1568 0 R >> endobj 1569 0 obj 2826 endobj 365 0 obj << /Type /Action /S /GoTo /D [1570 0 R /XYZ 72.0 769.889 null] >> endobj 546 0 obj << /Type /Action /S /GoTo /D [1570 0 R /XYZ 72.0 492.971 null] >> endobj 549 0 obj << /Type /Action /S /GoTo /D [1570 0 R /XYZ 72.0 374.694 null] >> endobj 552 0 obj << /Type /Action /S /GoTo /D [1570 0 R /XYZ 72.0 268.417 null] >> endobj 555 0 obj << /Type /Action /S /GoTo /D [1570 0 R /XYZ 72.0 162.14 null] >> endobj 1571 0 obj << /Type /Annot /Subtype /Link /Rect [ 472.245 610.562 489.455 619.562 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 390 0 R /H /I >> endobj 1573 0 obj << /Type /Annot /Subtype /Link /Rect [ 499.374 610.562 523.274 619.562 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 390 0 R /H /I >> endobj 1574 0 obj << /Type /Annot /Subtype /Link /Rect [ 140.0 598.562 276.65 607.562 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 390 0 R /H /I >> endobj 1575 0 obj << /Type /Action /S /GoTo /D [1560 0 R /XYZ 72.0 194.638 null] >> endobj 1576 0 obj << /Type /Annot /Subtype /Link /Rect [ 352.75 494.471 376.63 503.471 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1575 0 R /H /I >> endobj 1577 0 obj << /Type /Annot /Subtype /Link /Rect [ 207.106 109.63 248.216 118.51 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1546 0 R /H /I >> endobj 1578 0 obj << /Length 1579 0 R /Filter /FlateDecode >> stream xœÍZY“Û6~Ÿ_Á§$®šHðÞ7ÇŽ³Þ²syRÉ–íJQ$$a‡"d’YþõÛ@xH¶ßWeúk‚F£Ñ¨7çÿ;ù'‹’e¹Wîo>h~à¥Ô ÍŠ}ÑØ÷C/ˆ½½7fÅ^-ßqj(ø3 xçýuÓÜøÞÏ7oߨÊóá½ÓA¸õææwG7=èoI?ßÛÞüx³z{ïÝo¬‰cJÒ€ú~y i.ÿ£ÞýÞ{ûÃ˦닺.z.š'ï½ûÿÜüt?Zkèû$ûÖ–úûHEp•4M‰?u!%&DpP¢|4Rd q–W€/ªìÏ4ö]…çÞóÍ(wÙqRyžæ9<"ÙÈuÂèšÃ|3«›û •z)¡>f«W.–šùpNFFPn”êµãÒÁ½IH<÷ðxbãZ¶>òº÷Ö¼)ZÎ:4´ï‚q£Ì s’&`0?Ò‚_n¼'Þ]”€í~8‹£+yÅ,î…¥·m±vžìœaƒFǨv{á î®iàžx];2œñ…%kÞ÷5s§ræÝ]ÏZb÷;6×Ê‘Û2´žk¯8˜Ø«(K±? g•|•&$agK–,ÅÁy 6–®ùš}<=±¬ßjVtÌâ}ñà îØ:÷é–Ž&Ú²Z•C_; 4ÅÞUZ» ‰”»'Ò+W/ò©Ï„ID‚<És?OçÖø&ß³ëN§ó²«Î†×¸Z÷n´¨ó|k’p"k_œ½]ñȼ†Xë‰Ö+ªŠK·*j7Ñî•“‘¹¬,!Q,O›Ÿ¡¬`:(Yôgs(Ê©gÆŒõ5*ÚrÇ]o.n…èXñ–•½hÏïÝnBB!€æYº ôêênÑ(¿òî»'Ž:'Þï..ɾh*‡ƒÓ®^¤3 S¥ì‚<šOÙ­#äîã§k4¶©Öwåy{âÍœè»ù¦åÙDàGr&Ÿˆ%ÛOF§™ÀI,sÎE( H:rO̺³EÙ;ØõäÈSèÀŠXSu£ cé¬íøè¹Ù;öî q÷;îŠ6AuP¶oÇêÂtsˆÇÎj*Ý"­2‚/óØ€$ !†q´0ÝêØµ«Z”E}Õwƒìª«Ô޳VnÌ™XÞ½«µ›£}AW¶üÐ;O·îòÅ×®>„3—F>=apuõ+Ðëz¬ Ãk’nG›´°Ñ”NÞx.Êãž5ÊEòPÙé|`=gÞ¨‹é¹]ÿØ1ÖϹk“"€s³?ÔŽäR4¾=¶CY€ìÁó¢á‘îúË ÛÑ4Êó0_X»²û‚‘ˆD „†$ p îM·ƒb¥"Òu/Mýž´ŸêŽkûÁRU§$ˆ!Ÿ¦‰V”.äªù(›¬"?sJFu²F%² ‡ºf ¡¨©ÖÜaè=¾«Z.ÃØ­;î±àu±®]}¦ ‡*‚F°Uq@·cóâ jë(Žò,‰Ó…7œ©ÞNߤ) ÓÚŽ|q®¾?ükµäI>ŠK&8¶%ÛmiX¿ªÄ©©EQuS!Ô‡´‹T9“ö~6:%²QÊã4\~ 5'7Ì}ö:™vNÅyÉ£òú'°p˜ko —:§]ÏA²ðªÒ’S j4Ö˜¢Oó ì5*ÕÖV‡»ƒÍF#êtõ©á¨Í0¼cË›íE n»Nþo­xäÕBUAc²¼ÄÙ”ñO 64É2ÇÈÌ"'‚¶ý¾óvôt¡ý`ÃXŪ¥C‘ÂÑŒÒ<‹³gˆ—ÅlÔ½ðôj<b*9Ká¼d· S]‹“RKŽk¥ªt¼iÎ|’Æ ò‹µxœ$”!^u­Ù’JÄx‹t6Ý-„pAÒ0™Ü…~LÂQ ÉÓ+¢Æû‹7o:ˆ¼«<[½þé³7DP Æ‹"%õµèdU¥e¤/1D·04¸L7À®àÕ°f@Ú(cð/÷+ ¶XýýÛÀBçÖôáPóRWše_>1ÕÍ|~³t2pîgå¯\9DøÑÊ÷ž¤$–ïT|³2£)™åaw…t¿+z9Ã`7zÖZ,àÀá)CVwîz¶wÄUÂÒp$wÇÃA´—¦‚#X8m,í°«‚í…³4á覽ᘅq<¶î™y{VÖ¢c]?`å2mªY4‹ ìý¢"ÛcÓ¸o¥•°în'ïŽýÒ»;°Zé¶Ž=±w‰Ì»æÄ òmNƒ¤»#ïMç ¸qŠÜAÿá<1‹GÔ²GðW;å¦û@c£Ï«¾ÌR‹¶ƒ×¬,Žs¤É¥/,4ŸSu# ·v¯kQ=pˆZl·yó) ¢!$“À‚<1) %Þ¯J{dtlù\ä‡öŠd¾üj—ÇæzW› j¸@´³ 1÷•¬k,’á‰UëäèÁ²º‘YN$DÆ™á=9¢§#,Í:[ÄKËÙ@]tl™3^l¥Ì}¥Ï,YÍöXlòC”ûh¯L#Ù9€?T·ê‡@^MàGŒ“ˆúÖyd:Iã!ÖàâíiÅ$rº¤ Y™Â×Qô­8¨:æ½e}÷«ë»Ø»„A‹¾ašÏg¥èÞAÇœéO:O"ÚAއ—XÎ38·¥ù’5²?TK‹ö§ú£ÊEÄšqãtˆO¢}è,Î#œ¨óÕI?Р^•3¡‹tî"™ý¦öó’v²`/ À€bGm ±ü—KkŸÒ/ ¸©«Î‚ÉÀ;Æ&Ó^•£ˆP8 K |‘O,GŸ}“÷¡k´ ²äuÌí¢,•„G‚t:Gl ‡HQ­¼¨ã2Æ%ù AkG“õÒ9†>rl”­l¡ê³¾—íÔWDá˜æp•Dj¢pF¼¼áª‚ä:ÐÔ|öã‡Ëá8Žâ§YžæÑ¸†¸‹)Ö"ì`‘û¤ap~º ²ôÅ‚¿ 0»‹>‡¼ÿ¢Ÿ!PŸÔ„Nt9\*hÄÞAU™¹èXwA‹Áùæ‚U™e¡ôŠ…O³I6±Æœ ¶F§C§@¨¿¬"@CÚh„HÞè¬þ~ýÊŠ oÄæîÑC#N+\MZ+C%72à—ö•=öYJm¸AÄÂú¡í¯ß|Þê ot7õëÜ¢h]» (,‰_6\ª©¯,ÇœPDÃê‡;^:O!·+Ïr¦ršFeI¿3™ö—™šÞvý]Ï÷K_ìs:1ËôÆ‚ÆòŠ«H¢¯ -/°*Á P¡¡³2BߊúÖó½Z¢îÄ6¼±b'‘ ™k&ï Ú9toÅt¬hÕ† ©¶aá ¹ML9ã¦8;ÑmøIʵߣ$Ð6Sšî2ïÏÎ8虘üš(¿v‚š :ÓçÂ\g„úYžEaæ¶•U Ž#Õð'Ex¹4 cÈËfš ÓàÇcùùêògà4!4 aD$ *ì1Ã#X[M1Ù"­Ž~€_ûÀ1ÙóNßñ!KÚÚv`¯¿Æh$rÃ+ìt¦*ªǃ3Jlª¢©!܆C{;dÍ[Þkr´rÌ©§›~'“fþ¡Ü"àzU½V׬4ú.¬4£Ó•ªjŒÊûÕ¦;a·'‘n %©…²ê&As[MJwm0^J¨ÎÑ९•TbtŒ†`iè¿ÃžQÓ¾(¹xíÙ Ù±ò¡3³(Ã-,7&Ëíu1‘øª.ëu-‰Ð}$»ßšõº¹Až.D˜´ƒhíˆ)º çuoîc9×qyªñJf&èU°ÎÔ’wlhÄC8´¹0 90Ë:Xy¤óãÁßoþOjc¿ endstream endobj 1572 0 obj [ 1571 0 R 1573 0 R 1574 0 R 1576 0 R 1577 0 R ] endobj 1570 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1572 0 R /Contents 1578 0 R >> endobj 1579 0 obj 3240 endobj 1114 0 obj << /Type /Action /S /GoTo /D [1580 0 R /XYZ 72.0 769.889 null] >> endobj 1117 0 obj << /Type /Action /S /GoTo /D [1580 0 R /XYZ 72.0 526.955 null] >> endobj 1120 0 obj << /Type /Action /S /GoTo /D [1580 0 R /XYZ 72.0 291.982 null] >> endobj 1581 0 obj << /Type /Annot /Subtype /Link /Rect [ 447.45 440.527 480.78 449.527 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1496 0 R /H /I >> endobj 1583 0 obj << /Type /Annot /Subtype /Link /Rect [ 416.66 428.527 454.43 437.527 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1546 0 R /H /I >> endobj 1584 0 obj << /Type /Action /S /GoTo /D [1128 0 R /XYZ 72.0 185.633 null] >> endobj 1585 0 obj << /Type /Annot /Subtype /Link /Rect [ 218.531 395.512 247.971 404.512 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1584 0 R /H /I >> endobj 1587 0 obj << /Type /Annot /Subtype /Link /Rect [ 390.985 362.497 448.788 371.497 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1586 0 R /H /I >> endobj 1588 0 obj << /Type /Annot /Subtype /Link /Rect [ 484.945 350.497 523.275 359.497 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1224 0 R /H /I >> endobj 1589 0 obj << /Type /Annot /Subtype /Link /Rect [ 140.0 338.497 199.16 347.497 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1224 0 R /H /I >> endobj 1590 0 obj << /Type /Annot /Subtype /Link /Rect [ 140.0 305.482 282.884 314.482 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1206 0 R /H /I >> endobj 1591 0 obj << /Type /Annot /Subtype /Link /Rect [ 210.54 293.482 289.41 302.482 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1218 0 R /H /I >> endobj 1592 0 obj << /Length 1593 0 R /Filter /FlateDecode >> stream xœÍËŽÜ6ò>_Á[l`,SoÉ·õÆ“õÂ^ÀÎk Î-±§•QK²3îýú-²ø’Ä#7'¦ªT,‹õdçÛUH(üûJü)’0(Š’Tç«oŠ’<"q¦H) ’(¥4&aD)9“5)%­X㑆àÏŠðùïUwEÉoWü <5¡°îñŠ>!\Šúýê“£›bøgÒÏÕ0¦4(~>?­/8Ïó€n/^Љ‘”(>­Ù¢¸ËŠ‚'À¿OªLwS¿Eõÿ4ÊQrwõööêõ èDÉíÑFT\aX–yY§ ˆJñODnÏäEùòOrûï«w·>‡ùiN·÷•Hè%Ve%€:ªãÇ$J }ˆC®¬@IQ‘SJ³ ÏþÏf> £·Í¡mú»‘ §†OhaR=“‚$yѸ,‹4GQ·'N^’Wy„äÅÁʺXj3YxvÙq³×7Ùv£0É‚,OË2)òý–#gm{Ñ‹wZ†pí”Ââ̳Ön~bcm±³Åú£…Çfnº;K`œª†wssl*K;³n™ª±\y£w9cj¦kgíRÖòÏéÞAZn5ŸXË Ãw¼ã#SK š\‚5›™†›ÎÃplÆiÖÈвŠ»=É{ĵz”-ÁÏüøë[#sg2H¯¡o _úÅHiæ“ÕÆJŸÙt¯af¨ÂJ{«äàä4¡4Š ´ ,úi—äÁž½Œ 7””†¹2¢Tÿ—‰üÕh:cÿÐÔœÌ=¹oºz"àMwìÇ3¸ïÞ쥆aD1h†*Ô¾FQºáK}|âœð—åÙ!$¤1ÈžØaÇ7Í—V¸…sªªkA…ó2²Š_ÖÕ¤jfd‹¹G›4 ¢ Αk_|/B'l¬#\ó#[ÚÙà#ïÀ·ÑK‘ÒÛ…z×ÉP„.>¬–!KÞoük_½íû{»ÍhÀÛwï ,Ï78Ÿ‰Îþ8Ã06lö!Ë7F8Ê]’¼ps‹ Ë>Ée̛Ϯ0Œ%|Çg³Gv1ˆŽ‰,“ t‰™ÄU“ 467¨«èÈ ¼¶q`èÿêù­úÍÑc¼ÜØCÙ ŒÁþË<,³B¤…0-ƒ°K­P™0n*3¢$Ê[ÐÈ¿-ÍÈÏ{µé=`ê¯HèMµ´LoüèбVókò°ÀIáâå™tý¥Õl·:|W_†›£ê(ƒ,ž [ÚhÓ4y3>ò¶ Åtä–ÍÛêµ({†2Ÿúeb"+i V- êÄgU>4‰*$âíkqÜ¥ƒÆ¢†ìO •gsbÜ6 ƒT^@­KRæfn¹K°÷ ;¯vlj2ò)Ñùä˜Ö]¿ZÁÚs/+šÂ9à ‹˜«º(ÆŽpeÁ oÚ¢•Âmæ;áµfT,?pÞYŒÕ=ô[µóùâ|œ-Ür69hßq‹8†S_G 7vä:ê¨ÛõHUÖÒ_ZG1“üýÌn±ðØ'Ú&E™b¥¯Gª¡àÁ›´8ÞLäô' Ñ9N¡ÛŽ©˜Í-Þ8pÍEwvÀÛˆl+äÛL·CZ,¯„=ž:CÇ¿ï™=–‰·éñ±„w„‡¦ Ô9õDTÕÍ­[8™¸e2™[ë¾Zd: tãÎr0 AgÛ© +ƒ¬ÈKTÇã@OKSÝO³hˆïè~4D%$Æ‹°LÍL€¡ÓÐId SVŸ&ÑB£_+Ú4óarWô¢<Ý¡˜Ã;4U%5ª2^º¢¹]†Ñ´s9˜OÂþBcšm àz¥§KŒ!6 r”EFµå·jæãúÐ3Lm©Æ -|îGçË6Bj#ñ¦C##¦êµÂLÈ!*úÒ›øµ%é6D¡ê†Ù,Î CnE¡çˆ¬®½­&-‚Æø²È}†±»Aƒl{IšuëE_qÔ€ÿ–i‘¥µ&…Ö‹¢R!i‘M*TƒùUÓAT´­jˆù¼ ×ðŽº9a’YÓv ãö~Û‘ëÈjæíº"‚ù_ˆ_0ˆñ¥Í‘x«/ÄS^Vzv³t¶DìÌ.ÁÚ¤4p˜À!/þ/ãÒuzpOlо¾É·=oœ„-bpÛ"ôèwf÷ÎæC}|ò¥:. /Õežy9FÔ±d2=w“'!yãDdyg…sn"#.  ÁŠ8*=ëEK82âo­"Û$Ôµ[N`˜ž®‘‘ “í–·.‹ÿÉ%¥¢Ã iHóÄL.Q@>²N¼¬âÝÍ0)d„Q”$Jñ·ëà*BûJhPœk®ù±éä|¡¾Y¶/²_)Ö³J`HïðIbýݪ¾›! ZiØö+x4 júy~4OÁׇµÓ\`f "Ì‚«G5Esž%à®5Ï¥é_Œ_ï‰Ô­>êNa˜ÔÔzGøÙSl³»§œg…©½Ï½Lhˆõ¢{œ®=‡æy}ðê-z]d3Á}O¤mî¹gŽ…ŠjRæŸû-bÏ÷8ë(F,òÆWÃ×~%pSÊïÁ¾?ú "£PÙs56=£Äžoâ¯Â8ä£þ¹Oâ½ø Î`_UÉH3n”w>uT®‡°z!’ȃ¼jµ¾NìÀåÔél½Ò }[¢«/›*ÞÕk=‡ËÍáÅ3˜Z(ƒ´B#‹ÖéëK™ ©êÕž3óŽïƼ&£+æêuA¼{ƒÊÇà7½QpŠ·« |nêZ;¿4x£‘Wï?j»qEï+r7ìk3cá4°Šï¢IºìµTÖaì(~u1‰¤yö¹sÐQhOógí¼ãû‡ôAÖU\üN)¤_“‡¾]Ä_a¹fšNºå|€C%î‰|}qèÛúš,â'¹VT±kA>á÷„Š|Ñœ¦å³îøO€ý÷¿x¶"Ýtwo i¨!J¼†~ÊáÔüëÇMùl|ºú?Ã÷ endstream endobj 1582 0 obj [ 1581 0 R 1583 0 R 1585 0 R 1587 0 R 1588 0 R 1589 0 R 1590 0 R 1591 0 R ] endobj 1580 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1582 0 R /Contents 1592 0 R >> endobj 1593 0 obj 2815 endobj 1595 0 obj << /Length 1596 0 R /Filter /FlateDecode >> stream xœÍS=oƒ0Ýý+nl‡¸gc[ªª¶R?T©CT¤ QHƒ@¢¨ÿ¾\'Mg`8ûù|~ïônO ý'mУZXådïpŠƒ$‘\" `årð! »öÎ`ÁV6x¹v¿) ™/lNhï ^(Þ•ú Ó7—`×câ‡ðI#ró,!Dëß ATˆ¨h*¸i?Qó«‡$ÏŠ¬nª¸ÉÊš²ÜÕ× ˆÞÈS䉈TMóÔ£h=£”¢xꥮŒè1‹ôÛ#Èé¶ÅCz}¼HÏãð¹FCBEcÆ(cìÕž…˜ÿ9f4òÎÍÂ[^]Q䬜|ë1E¹¶ü.t>RN¼ŸC³)«^~Û¾?zh†bÚrÚ]«Òu²œØÁkà×p¬²¦I X~Á{\m5¼–i‘­¶1ÜæpŸoB“ôŽú=%ß!¸) endstream endobj 1594 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 1595 0 R >> endobj 1596 0 obj 357 endobj 1598 0 obj << /Type /Annot /Subtype /Link /Rect [ 215.07 500.445 402.55 509.445 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1273 0 R /H /I >> endobj 1600 0 obj << /Length 1601 0 R /Filter /FlateDecode >> stream xœÍVMoÛ8½ûWð¶ °¥)êƒbm‘¤»‹&Ø$6@Ý%Ѷ¶ú*%Åñ¿ß¡)[´,g‘[’ƒ9CÎðÍðñQ¿&"ðÿAÿ„žƒÃ£8Ÿüêüb¹Açò ö¨Oˆ‹SåèÐå£LÇXºÁÏÁZ°WèŸI1!èëäûX“ që 9‘|›êqroaëÀø=á#h9ù2›Lo|ä4[ô-v]Ì}Fa. ±K¹þ£h–£ïgŸ“<-ÒºQ¢IË5e™Õç?Ðì¯Éõì h—¾·šï gc˜ ¹´MãxLF=udhš]<¦ó{29BLlÀÇ4z7àN3(`˜9çŒs˜Âá…ß{1寮c²Pk›”Ppª®|àÃ4„ ãtaË#Öoj¿¹4ÅëætÎ å˜¾Ž M’‹$úµKdB÷‹CŽ9t p;ÇQsJÙ`=m=z‹«/Ûý­UÚÈ5ò¥A‹4“(.‹FÀÍ/–¨nó\¨ *&ä·ZÏ.ÒekDaWŸÕ¦×zä3ì;üzFyÜeU§µÝ'>Ò§žB!ûƒ>½ãèS÷€®´Ët%ëX¥•]Í©Ór\Ð,ˆî¹]#MÏÑך¥u?ýp¡¤´&Ф7ªR5"ʬi¨L*Yħ"ŠRŸÖÞLÄ‹Ú^mÍ®e–ÏXð¢4ÊÒr©DµÚX ª*Kc#ý{g³Í€hº/^0èK-Õó¥ã`f63£:ÍÓL¨½]µª*·è½(û¹Ç¯·ß~ß[O¶a:bÆßÄL>í­¤ŒÛ\µy?4Ч7ÁÑ3H=ìøŒ‡Ü©æÁ:“èVb)Õ.ß1Yˆ‹ÀcÁHÂ}«Ú“Ø<'À”@f>Öêë"¹Jœ†A~8JJ¤;½.U‚*UƲ®ÁÜ÷œqH9f«ŽîH œìöYŽXI±£ªñk¼•›ÞÜ OoÎÏðtÅqóÒÌÏí̽@õζ–‹6³i%æ=; QÙÚw²6R0§ƒ‚”£mýF0E"‰DÓˆx%ÐU¤\I}»kmŠ4Ai þ%àÆo”-J æøÄÜr‚¤ˆ¬.mÍ:¦¼0žìñ¨çfå¢hE†ægYÃo\VÝãS,r‚ý‚pCŽs¢¿®oþ|šÖ+¡äxÔÞųT5t벳ͮӴHä ^5yvšõ>-(sy„túZF¯b¹æúE¦ÁX2t18tÇs11ßÂtdýªiªSS®ËVŶ”¸ÍôDaÖw6œ4<;!c|$÷å[ùÀ}ÌhzźgìsÛ¬Jõ/˜ <‚פ„1»¥kIýÐH`òÝ õ³­Ñ¥,Òø§@ùª~‚k¦êaù—#‚ázt°ÕN0 Íð”t§¸·+ÔÞZ kéÙÞmúñ•xN“Þ¼“‘h¥ê‰^ð©0~ /ûIóÜtF³²\É(Ö– ’ÿʸéó³¨y ]ß”‹Vh\¢{[Â6ªžŸcëÃø~òâT€U endstream endobj 1599 0 obj [ 1598 0 R ] endobj 1597 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1599 0 R /Contents 1600 0 R >> endobj 1601 0 obj 1166 endobj 1603 0 obj << /URI (http://www.scripps.edu/~cdputnam/software/bibutils/) /S /URI >> endobj 1604 0 obj << /Type /Annot /Subtype /Link /Rect [ 250.296 357.988 281.976 366.988 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1603 0 R /H /I >> endobj 1606 0 obj << /Type /Annot /Subtype /Link /Rect [ 288.205 357.988 501.945 366.988 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1603 0 R /H /I >> endobj 1607 0 obj << /Length 1608 0 R /Filter /FlateDecode >> stream xœÍXI“Û6¾ëWàf»JBs_|‹ÝãTOÅ“ØRÊ“²}€HH˜"ilY—ùíó°)v¦Ž«Òø¼}¾¯|äÁ¿ü“E>βçÕwC÷Q 01¤ØÃQ{^ˆü1:£))F•<ã,‚a&{ŸÐ§U½òЯ«Ï_aO‰<8wYyO\®®Ú®>8²™ °þ™äs% =g?Ÿ€¦NÓ{sÇ«kBMоQ~š2‡šË„¢5Пٻ‘Ø[¶èàóŸF8Wov«»w “‡v›QIŠSßÏó4Ïá΂\þ Ý}~éÇñ«¯h÷ÏÕ?vKóÓ¨w,”KžJr/jgôQAýZNÌà¡ÀÇA–zž—$Zù·'Ò ÚI-Ñ®i*ŽM‡:z ­ ŠH]jã8—Ä>ö£XZÐ×—Ô IMŽôLk¡OHw,ø"ÊPša/_$±qÁîDoU5V‘ üG©Ñž¢–v Ñ™–èÂÄ Ø)”œ%åEÇöðÕ@fpBëòz&00ôÁ•SŽ_‚ ží‹—ö½'uOªêŠHY®Qß–Dе´ ð¯¨ Ž©@ñŽQ¾À=žÇýfß–’®8)—(–Œ·¹>‹gÁ]™çE~ü·¬‹æ IUn*V;ÄŠ×G¨%¸{—Îó,2ìPÄ|A(P±ÜÃá›$ âg9ŽÃtáôzdÿ‘îß¼à#n.õ¸>÷•`›¶ïÚ†[ù­qŠ ©a­JÉ‚UUj¸"Øjg7~XÛ¬ ©ˆ%‹U±P[{@®hME€ÃA‡ÄâäâJqmz÷©Ôsú|é˜À‚"¹`˜pž¿¶ŽÂÑ8Ã9zÉi!XSsK¡? ©Ym ưºí……Ú?4½˜|ì£Ñö¬³¾P• _&Ü¿÷´»ZX‘ú؃«-lè´¿.X%š—§xhLÐ1u»T½ÒÃ) Ö³F ƒXËN™†fLˆ°ozäÿëo¡`Hhiâ48•ù¼ßw 㮚ZÏ¥ŽÍAI⛄׋o• ¡ÙO¹}:ÑšB˜J#%6 åòDé°Ö)WÐÊ (D5+ oú®wÊf`–“IL‚¬8ñSÓWå€LÜ':ç,õ%ã6ÐØum!†´…:1ÕV À© ºœÒÊz=ˆ(Nx$|tЀéí•!ziwÈN@ÅuÄJfÃY‡¿e~ƒ5uÙß¿±ÒXk7é?gx —;DÙ̺4qYÒ†±<Ú V1‚%]N¬8YH:j4û¢ç&½4‰9·©)kDfÜ–²=ûó¢£0@97’ãÑå-Õ‘Æ”¤WÌx33ÈüÑLžÇC‹S/µÉ› Aa–à8…2ä&Éÿíçɦ'"/‡báåY›ÂòGE‰V:Ìe9zdœ ßž:m3 ÿèEMÎ/ÊL%fã O ñÂÜËí ÛK«Î;dó4–œ`á”åöy~ÐOpàÁKÃÏÂ…ƒ'!Ú×ww—ËËa»m9¦e÷ߢl•"w¼9ˆ „ÐÝÞv7wQ|£X–Ñ%ɾζKÃeº©íšÿ@}’Z@]OÆr¤‘áDÔ tAÑk±bͱ#íI:MÂL#Ûà±%Ž­¡~€X dÃu¿ÞÜæìu´¸Ik©}䇇“í&ß¡»VìEÛ5Œ¿ÿý~k¦Q¤s[N`õ|bç¶mJ´¿"·º9Á°7å¹eC÷TL;eEà8\[<5yßJ®ÜR ~XDœ/ĹÖQu¤ÕD°GG–q6ÑP›[Â_¦)P¸·Ós[5W‹ÅÒ<ÉŸ &¶à¬L:Y¤¢gpާšÁ”ÂG’Š2½Üþúþ·èÉI¯ÿíÐEGj®E—sÙzüÀ0Å#Ø_Çe××µé4¾ßn·ö:•†Ëö·ÝTÎ +¦ì/ *§ó¬$0¥0Aö•|`aYË}!5É!•:ÐK›" ¼ª”i¤®eSôr<7Ï7 ±{ólÿCýy¯: °oÇkÆXÓÕ:BSWW‹0ÇX-«#…p/WÒƒi¹{Æù®ÝfÀ|Jõ_[øçîÝ&[O±Ÿ¬”öe’ûPt½Ô¼~·¿o²,Î7¾~¼@Õ ÆÁÛ ?·›_¶o°C{88àjt5pÖàñ%£áð1¬Üì F$÷ðÄr†6˜Î¹Ûá"›ÅœƒV73Çìá»ñÃLƯ(®åÉׯÂè¤~¤‚À-& ó“Þ‡¦ÞvøýôïC–Ö]ð ÔȀὩQÅöJÉáâ<¾¼r5p:Š¡Œn×ptóÂáfbÎæ°à‹0ikD†÷P"ßæ×™‘2 ³iH)li÷]Cö’íH,œ¼¥;\®,ÃÙRôøºp†Š‚r¾øÆˆ£|/ðLézóŠ64_VAyT#È…A¬ëòtaðÔ%œCT{•Sä¨íKU.°óÓó‡Õÿ®qXÚ endstream endobj 1605 0 obj [ 1604 0 R 1606 0 R ] endobj 1602 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1605 0 R /Contents 1607 0 R >> endobj 1608 0 obj 2038 endobj 1610 0 obj << /Length 1611 0 R /Filter /FlateDecode >> stream xœÍ]“ã¶í}…¦O—™³N$ů¾tš¤I¯Í´MnÓN'w:[ÞÕĶ|’¼›í¯/ ’ú°HZ¹§k¦³%€Dß§;’dðßÿ¨œ¤Jéd{¼ûdçI"i„âYšSže,¡yJyrLæS<9Ît@ÝþÌÞø1ùÏÝé.K¾¿ûå¼³K2À{¾ËÄ{Rïî~œ¬Í¾ã/i}Yòp÷õýÝ›ïxB²ä~?ª˜‰Ti¡µª”Qÿ£Éý1ùåÕ}]Úd_7ISî˦$÷±©N™Blü²+ôâ´KNuW¶É±8å±AŽï^Nõ¹­Ú[ÚP$Í(…­!Ò ¾=ueSl»ê –WïÊ? o¾Ól’Ñ”æ`‰BÊ©2΂£Ê=8ÉWÉFËT%¯~ 2Ó`¼Ø»ÂCaæˆ/G0GÞŽà/Hк@%‰3la³ÙÖGØÍ]x ¥£à^½}X£¢sp$4´ôi!Ì‚Ì5Z ™NuXÔ·þ]Ñ‹¶ ¯LTg`i*óíÃ*ù©PÆÉ÷ÙÑ&Â]e1ÌUò+>ÎÇ™O…‡úa³+Û®:]UŸ‚+a2Jf•,Ep0H®¼Þ°s×<†¹F`D)a K*´‡DÛíª°ô9"¯’>g:¥ÒÆ,ô߅׎®‡Æa_•‡] Y \(¥p’ÆBM!C¤\x(l"!+a¬c Î ;% ùZRØ•û}u{ ÉAÃv)çô3…'\¥„<}:ß|f.³æé%…`!ŸÒ’Â7ïÞm¢âÃyÃ_#>Å,_@ÊÃsßlÃÌ¡z‹`¼W­‚Ó”Kˆ5T3ß*ªð*DÃ\± T@•Ä9d$Ú'ÇÛmŠÝ®)Û°ã1¥°FŒñTj<³ˆwa湌a®Pƒ¬7“eÔAð¼8”Oex 9„5òç„¥Y&2(¼1è‡H æ1ÌòƒAÂCµÒ< þUÁ¶ü:8G*†%F†äPhÄi/ÄF؉Í9ÈR³âÈ:¬ ™˜p¡yAá\7]84b` ã®’œ00K*lx]Šþ)r*ÐæÈ|Ý:8ä²hÜ}œ[®ã§ð: ²D0×ìžÑ»Á>}›°Û7uÞJH }•üxÈh{™Kî“ÿ>ÌÑæù)ÄE…i UÄC¢«Ž±D^cXÖJrûuƒþs"±i!}Â_"‰<‰a®*1éc&™/~œŠˆð,S1ÜUÂCÚš*E´Rœù„Šœˆ:†ù;=?³Œ@y—ñïð2ÀuÈ¿w˜'À ¯%÷†âçH%¥b˜kL5Iˆª¾í<mû\7á²Ë™þ*˜r†i%”Ææ·0wÃLÁû° âx†YA NL[Š{07/ANà®?ÃÊ1 +X’T„·õi¿«šp¤‡ô%‚þÁ“@@pÊ…Ýþ¥¯‹nû¸¢“¥²6R¨÷Öv²8¸ß°L>ÚÜ2ósWÞC}å!°ù&œy¨â’³¯*kÇ/BøHÜì`å,•v#ÇÐYAäЇÂR£™ >é#mç]Ñ=cYŒÀù1<ájÍ¥üaÞ6ˆ?Dã:Ír°Qc׃eŠ”Dã[‡y–a;ËC!Ò#ø!:ˆ8pŽD7ǧ+t–âm0LD]%ð™‚C ¦á׌øtë‚A Áx¯Z¹À˹_ÿ‘˜R1Ì5 IJ)¤óܧþ[ 0ÆÂÈk$Ç4zøÄâ‘<Òý¾as…䔋;¨rp…xó ΄î*Ñ5+ :Âræ=Üûba®’ÄŒë‡%…x닪îÑ“©ÏWÒ+y¤ñ…ucñwùƒBRð _¬µ½$‹aþ¾U(ž2­ z >Šu½´Œa®1 ÊdÊdß¿ÙôÊe ßÓ•¡D\½éQ‘”1¼á¤˜/Ò ,†˜Äúb­h…D%|<Ã}1("ˆ‘¾˜ÒiF¼Ùcdü²D·;/§y2^ƒ¸9£’õßš•&¦BêQ¿-ÛmSÇÊ7r{îBϤc†H3†6Xµ ˜Œm—es¨NåtÚÜ'ÎMýTAQû0™Ã«t JSF]=Ì »ÉÄp o¶¶Ón™ ¸#ü\u£†Ã{.qïý+ùþ«¿òT'£N ¸-NÃøc9 Û®hºr7ÀÕøÖ¡š\ÍssØØ|=@S}Yô‘µÑÔôÝã¹WzÿrÉ:ÓË/ÊØ †¤²Ü£‚?Eú%$†8p®›‹`PÛpìdKá¡õX™+î$OsŒÞdÀ©lEYãbª¶€z?¾ñTT‡âãaÄq™3>À¶a7 Ê•—aö¥¾Œ8ý&[þh 4˜«ñ½S}ÚÌ ÂÌ£A¤WøKãÅËÀsdÇݯ_ÃôYÑ1û¤Ç'.m¹KGðí ̵Øù9A¾Æ=,½zð·õ¥i'¼Ûs¹­ö/W‡ÊRù•²ŠÆ vÆw¨võÖƒVþ~lÜ u ¶êݸwƒ~Ô»Aê ŸûÕõÃ?À“úÒýa \»‘uj/ÝKgœí ÅÐØÜ?º›æ3¡µ¸Úì¤[tØuìÊ}q9t¯Ç™ÆÇ `wÃÇâež‹Óä=cfl÷bœ¨&/š°áYÈÄlÍ„3[KcXÔ©,wþutåñ\7_»È3u¥¢ú©lš ¢b‘X¥$Æ4Û²ë0AÎM‚IbõpiúÏ ö‡Ò•¡?]°œB Áo~u„ȲxýV`Y ¬Œ(9^}œâ™€¢æÙKö VCÕšËÉ «a´<&•K›Rü·ßH5ægý°½œÏýyÝCEõÃÚÄñáɸªsÑ@ ̆‡è¾ž]çl.(š “Ðy9lªýÕÈîc1„›p«òÁOqè<Öiê&ÌŽöC»ûácqz(}ä,¾ƒ!6chx|il bºÑÄ®<{Œ_¿f¶eÛ‚á¬Ý=ŽR¼ìCs·{áæ ìÞòý[»·Äð~ü o"‡$3J59~µû`¡Ç¢÷EÚ½°œ‡S€Ù‰ìõ SÀ¤y Á'súpÜUÀÖšv²íp“§\ƒå~Ñö€Gp6B7pðˆ”RʃýzÕ ð·ÐÀ|+xia#Â%‘1ì #õÔkš­çÒC0úí"ÇÌI2ÓÏò,féYÛÿ³—š{S`a È3¬}îMa€Þ¦ÈäU9>~,›ñ¹±3Mãê…ÅÑ™¶™{¨'dºzämƒæRâ5^æ‘&‹´AY qàüþÕÿʦ~ÿÕ0q,‹Së•îA Ò OöÆ9¿¢_4Æ‹˜îS@ç?4){Ö»@:™èþ2礪ã±ÜUEgêãáImíælH±,gëÙ6e9}l3Èñå)q›Dº`$ß—³Eyº>¨üííL+“Œ¯«¹œ9'ÂßÚ>…8â¡K"ß¿ò0ÚÈÖUЂ횬qPݸàÉÃ:ð¢‰+#¼/¶Õ¡ê^&²þ½,Ï#TÆñ±š/ è„—vòô£çxåòúìrù°ÉÃ…[f<6 lÀ¹Á8³oêãAQٌй© Ók_S¦mäØ>N#ÛûWª÷GÇÏœ†–œíPZÆõ„ÓþÒ±Æ#¿¾Ž”“ØdöC¢cëbs¨~-Ç)XÔ$í8qi/Þ¾LÞp§³´á¢€SU™»Ër z¦9‚)Ž?½ay(¡ì±åÍSѼ¥½Aµ§ÃQêES#–^/ΗnQ‰?ÕŠâ!A#· X qdθÜE‘]ÇðÞMÑ~5ƒ Cúöˆ6‹§iòüXmÌ© þq§Ù.Á˜Õc‡Ïa¯3íáùA&=aÄÄEks[Ñÿºˆšèê²›/·]¾+·]bLnÇ…3ZGóí'Û<ÂdhŽ8ÐE Í71ö4íÄÔ×Ì̯§ú¹À‰œ& éZ8úõ尛џ­îÖrþZ?—Oeóz25“¦|öØh®¯T2ý梳>8º¡SŽûº2áa&pdã#'§'‚®Û‚c{~ã°8´õ8>ÔÏ¥aÚiÇN ýëÃ$vHðó¸äÎÛ»‚\Im,ÝâìÖæ[„{Ö=OÛƒåÉý¯Bñ߈`Pø/9j±ÛUÑk§TBæOí€% \Ž-ŸõÛFÂçt„¢)¥¶R¸uÝýtñþM?]`LouFUçWxïl¿euýC+é“ L9A;/wU{>/ Ôxd»IñßLÐe†e6¹­?¡µ?Zb'Ÿ.eób7¢ÿ§Z~¼û?›¨-o endstream endobj 1609 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 1610 0 R >> endobj 1611 0 obj 4047 endobj 880 0 obj << /Type /Action /S /GoTo /D [1612 0 R /XYZ 72.0 720.587 null] >> endobj 1613 0 obj << /URI (http://refdb.sourceforge.net/doc.html) /S /URI >> endobj 1614 0 obj << /Type /Annot /Subtype /Link /Rect [ 360.986 734.087 474.575 743.087 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1613 0 R /H /I >> endobj 1616 0 obj << /Type /Annot /Subtype /Link /Rect [ 481.374 734.087 505.274 743.087 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1613 0 R /H /I >> endobj 1617 0 obj << /Type /Annot /Subtype /Link /Rect [ 138.0 722.087 261.58 731.087 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1613 0 R /H /I >> endobj 1618 0 obj << /Type /Action /S /GoTo /D [1376 0 R /XYZ 72.0 737.153 null] >> endobj 1619 0 obj << /Type /Annot /Subtype /Link /Rect [ 497.735 643.317 523.275 652.317 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1618 0 R /H /I >> endobj 1620 0 obj << /Type /Action /S /GoTo /D [1609 0 R /XYZ 72.0 737.153 null] >> endobj 1621 0 obj << /Type /Annot /Subtype /Link /Rect [ 136.94 631.317 162.48 640.317 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1620 0 R /H /I >> endobj 1622 0 obj << /Length 1623 0 R /Filter /FlateDecode >> stream xœÍZK“ä¶ ¾Ï¯På’ݪ­Þ_RåøQÎÁŽíI¹R;{`«ÙÝò¨%­¤žqç×$@RSç¶Þr > A@ª?ß…^ÿÔŸ" ý¢(½ê|÷™ø¡—G^œ+ ü$Jƒ ö¢ÄRïì-Y©×€ '"CÁŸE_À'ï·»ö.ð¾¿ûø úì½ä^ï‚ÁõP¿ÞýÌt£@IúÞñîëÇ»ߥ^xkâ(÷ã +Ë2 ½Â£Rýygï㻟^äðRËW¯;xÓIz¿ÈÃ7_¿ÿä=þÃÊÇ‘D!ÈÀŽDÁj€ª;ŸE»hêVzUSËvQþÛÇ…Õâ ð‹/Íh?/T§ËóÜÖÎÿ'~Œ<ààˆªi¡Èâ, ®ÿnªÜhp…oýð‹QnÛsè‚ åe M~±p¡,xËa¾˜ÕÝúJ¤ôšƒª‹Eg™†~™çA€—êµþØMWë°ıŸÅꬕ9 <žä ½÷ÞC™ù¥÷®--,9]¦n¨Ec9‡n` ÆéaªÏl¤Ë(>Ø‹¨±kX1± N¬a¢¢ðË"…ýLâÛèˆbe÷]u9CSݵ–Ý‹£\ ›‘ŸæiF·n†µ¢oäJ?ÎcPìFî4MýW>¬dÀòIºê9ÈÃ~çÝe¨$Xó(ýVN@ÿ4›ÕaQúiñíPŸÖ½ËÈ/Cè»&ö±·rÇ úGí\ysÀÜ_/Oý4Q‡)"ÙÌ||Æ«ÛI¢šê黽T^¯Hx®Wú€CÊå3pÔ”­¾2š]îš^Áö V[¯å¾Ó~—æ~ÎÚ‚ÝÎz§Ç™yê^gzêfrœÄ0Ù†“åŒ(­Ìø0tgÞÕvÄd4c•”îgÔ7R°QG)ƒŒ²Zj,vÝŪ¶ö¶(…}IÀÿãÔa4ùZ gÐv=*°£V{唉_&:v$·ýùþÌ%l¢rÂåFÂwh‘ `Ž¬Ì°Óu°2¨¼w×îbÁ¾Þ[Ðv“c/«úpµ aÉ^Œãk70Ѻµ4U7 rì»v_·GÎnõñ2ÌñÙ‡ºa²ë~­§ÓÆ&ð–kOŽ!’dY„Až8Œò𺲓 xK’¯C»¦c²b%¤K)L ?󂪓ÅOä¸çÜB4/ÒÓ ³¢ê$zèúôþž÷`#ÙSFŒ×ºi,Âl€´Î'öp{†Éq¨oÇÔLˆ\÷¬Ç…œE–+‚•帻% DOŒ0D‹ª’ãÈÚhõìÅ$vˆózªÉîžÅÕ‚—¬ÈÑídY 9‹šîH›¤áÒ šõÈtÓN–ƒ9L¡ʦ) }bH' úáJ§LCy•ãýŒêi& ìÔk €ÂÕ©“v<¥;|š«AJÛÆml#9 ]{ÉT±jÓ„Mg{WÂN _d{k§(HVv¢Ã‡Ðz‚F¶G %wK›-E´ØCdý°Ù™;rÀ/» º2^ÅhÁ(YË¥g½ ÐabZ©Á8è=9ï¶×Ñê÷ œê~P‡DªòÁk»Wß„>WyÁÕ=H¡þˆóüÏÕ·Qùy9*/Bžq È¢Ö4.­Â’§,®Y· X‰P>vŒvoÁ(9R›b ê7A>ºgm'ɧ¶EÖÌ\œ<äèøx[rFy²2†9oqè'óCC>ûþÓ3„/’n2(²ME„AÚ!½™3£.f%TýYP:VòFÎŒ Û¾!É”ê—*㾠ͪ‡Ö|S¯£²‘­æÖ)³Ã:Š¥8€ú/€Z;L²ùn¦µ Õ+…q^f#a´Dú *Œ–¦#ÆDÂ’¶–%†Í²ˆÇú 7¶Á2Ð6§Ë7‡ñ}ÿ“÷ÑŒ¢Ã€P æjgâ„ øwëïq©Ši¬d‘žNÛp:!@m#Æ"¢I}D‘…ÁÂ-ºwb;0z²4lß$êvtØ$*V6{È阮ò’eNP†`r#x°ô´è7ï!1(û0GŽ ´#±ÒæEQÍçvõ4ˆáÊ´ÿi­Ý4¦H‚C¤ª¨Öƒ]v0ûþÞ“þÑ÷TZV.ô:Ô“ô¶‹ËÒR¬ÞÑ ×,\·«Ë,xKÔƒ=¤Ø«$²`àG%ŒQ¤‰szïa[8~SØ‘ô’ òg˜CÒle©oq™¾ðØíD†ÙNDt/ÍØíÁüòŽpuY¡±í£2 Ú7ÆûþÇY0€ —z4õnv$ä˜ãlô<ÐÄà SäñÊXG©_@Œ¹´ú6+šzº2>/…‘Cµ0*dí0æÈëlä˜eì†Í¡¾=‹jdø\·õî¢Öé3î×\Õ½<ˆK3½=¤Ã.p“\ÚåY^á`©ÇR­ÔMé\ÊÐ{}Ï*BÓ»r¨JF€6CÂß‹l•o4WË•{ ‘³ðÀ%´}Ëù7œÞfŒÕÐáýˆf> Ýåxbš:,Pæ+ €wMÝ ÕËC½SK÷ƒ|©»Ëh9‹k²HCjG PÑÀW 6+é(·†²Ji—¶b÷FÌJ|¸…–eš…Q;ù³dËÅý"šÛA,Ý7ÒdÀ[3±®½¦\„ ¤ïeÒqËHÕ5e¡ãÔ=˽¾°W¶åU¢GKÏÇúÁ¼)S›Ï®ÝãÇW3Ì7ggí¨Í²cVÙÉŠ›9ÿÏÕŠöê0d¤B„yJŸi:ÐîNjù÷ú e”Vº‚гfÂSO8­8»+ÒDÝ£Ê2èaî7z«€Ò93ÏišdD•`>>ÒK[fÓ‰¦w0®ï›º²…É/r¸ßa¯x¾yÒ{BújàäHñ1z³kÚ%‡qÒxi“¨Òù™_%ñ,‰»³!ÕGô{¢÷²—ó窹 ³Õ˜ª¼:±7­‡›Ö•ÝRc4Óܾ!Ëß‘gA×b³t¹Øå¤Þ•\ÐÃÒ®‘çÑrÐøH KZåW¥R„d:v›cU~3¤2'”–¾åPéC3Ì^‚Ø<«ÝŽi>v‘Æè2]Þ·ãrŽ/Kiž/mf ½Á‰ƒz¯Roô´ª~7¡–â²YøQ–ERðo¬aª*Øó ªkBÖpÑ¥7‚ñÜA<¸Ÿ1æk¤ÉÔQÆ@}„FÓÛ`ì|¬a,¤!ã×S§¿ÇÿÏaºVg b¦òu¦UHvÔ4Y¬,3?çTÕõ˜ãµÚÈ-ÑS"¶L{ãPÈøeÖÝô> &K^‹ æµ/g‰Ÿ€ ¾ÍÆ´sIƒXeS6'`Ǩöœ˜ŽËž³EÑÊlöÛZó¯vˆÐlH÷uWe„¬îB†`]ÅÏ:B\Ò¦ðCTººÒï Äø†‡E’nù¤r5Ëýbh6²`b¿_Î=[”¨ž¦QW¯…i(„Âu…íé3lÄ~ß„Àz;1£ôr8‰žµŽø¼µ=’Åô-ÇÁ¼˜–ß‚k-ØÚèsŽcžºg-5Š>ŽÓuáá°)”µK›B<â¬v<Âçùi&ñ4!­ÉVªOïb°zn$ñ‹£A”kiˆË4ißAø¡äÙ¶n—âyõt„a™9ðy»‡ÀŸªØ2‚ó̵թåŸÞ»Öu”Ö.Ê_]}p«#þ¦Ïìâøl¨v$]g”W*îRs†þJ÷@÷]‹Çáô23¨¸° ]€”ŸÌ”ŸLìS Ò2€õ¬Ç2L4&Ѫ’==Rž¾Ì¦,ŽÐ´úˬÃ<ù:­à/’@ý|Ëü6EZý>5#pJPuþÁH`%F’L_ß›yˆ¶] þ,@4ɇ¬|§~¯(7Ö¼¯Ç¾¡ß²hF½¹ÁÌaœáÓ»¿ôÍE½ìÿrφò]PV¬„$L9†;“…4UQ¤Ó¬†¬FÖ¿QÉçŸÁæsÜÔTYI'oúnk(ËžÞû†õ+Fê<ј>Qä&ª¢&æ§Wù-s Éûz•ëh–ë¤|†\¥na¼µyæÇ´Ê°àÞª?æsŸý*úç»ÿ&eš endstream endobj 1615 0 obj [ 1614 0 R 1616 0 R 1617 0 R 1619 0 R 1621 0 R ] endobj 1612 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1615 0 R /Contents 1622 0 R >> endobj 1623 0 obj 3534 endobj 1625 0 obj << /Type /Annot /Subtype /Link /Rect [ 499.915 561.139 521.025 570.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1102 0 R /H /I >> endobj 1627 0 obj << /Type /Annot /Subtype /Link /Rect [ 391.1 549.139 420.54 558.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1102 0 R /H /I >> endobj 1628 0 obj << /Type /Action /S /GoTo /D [1288 0 R /XYZ 72.0 769.889 null] >> endobj 1629 0 obj << /Type /Annot /Subtype /Link /Rect [ 165.82 302.537 186.93 311.417 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1628 0 R /H /I >> endobj 1630 0 obj << /Type /Annot /Subtype /Link /Rect [ 206.09 302.537 237.2 311.417 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1291 0 R /H /I >> endobj 1631 0 obj << /Type /Annot /Subtype /Link /Rect [ 256.36 302.537 282.47 311.417 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1530 0 R /H /I >> endobj 1632 0 obj << /Type /Action /S /GoTo /D [1609 0 R /XYZ 72.0 769.889 null] >> endobj 1633 0 obj << /Type /Annot /Subtype /Link /Rect [ 301.63 302.537 327.18 311.417 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1632 0 R /H /I >> endobj 1634 0 obj << /Type /Annot /Subtype /Link /Rect [ 215.07 258.417 402.55 267.417 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1273 0 R /H /I >> endobj 1635 0 obj << /Type /Annot /Subtype /Link /Rect [ 203.13 236.417 315.33 245.417 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1275 0 R /H /I >> endobj 1636 0 obj << /Length 1637 0 R /Filter /FlateDecode >> stream xœí\moÜ6þ¾¿‚è—Ä@M“Ôû!z¹6}A \ãZ .­DyïJ[½dãC‘Ú¥DI»qmXA7b͈šrRrþZPDàï¥øáÛû~€¢Íâ/¥§ÈcÈr•Ê!Øf!¢6fÚ ®ÊAkñŒvÁÚ+øÑi ò ý¶È}¿øãOh#ÏídÄxcêýâ›j×sŠ ÛÅ›ëÅÕ[Q‚®“CŠ-°@!ħÈÇ Ä†®7è—×+ŽÂívFa•æ*yñ‘¢ëŸß]wºm‚ý¹õú]'D@çy˜ôÑÔ˜±¤4Ò¢¸Õ ¤/J/ìü921"&zÀ&fÜ8†\{”p ûQƦ3›î™`a]œ8MãËæßæÆ%—Ê(Ž Ôb˜z‡¸5QÅmQèq_²éÀ¥i»aN-?=}§%u±×ó ªÁXFB8ɼ‰¼ÑäFY5ƒîšÞ•f<{®»Íš´œªáÑMËü!¦ÉˆÑ™ÎÄðúƒ4ÓÁ±a68¶œÿ ‹4\®ùàœ ¾]odì QÆÎ0{Ìþ ôq}0¦¾åIX¯«áe–˜ž(}¹}@™kî zج‡¯'‚Üo§áí?ùfóa¼É* ¦ñ6‹uŠ™ a¸N±1ܰβnLï성d&nØn˜^Y§¶Ô)At¥»*kgTÌO<ø²Ísè{Šƒ†™¥æŒÇÃÇøV’ ¿·Ü<Ê7ÛtÍct.-F±^®Óe¼L5Å2Í€YóRS¥™¬PšqÖß&u–Ý£u.O8J18̵´ï¾Î8š_s$0¦¨PÃa!êaæ ½Q±\n°ÀiûmºnÏj¶ECì ;Woƒþ˜Ú>²p庄ŽÊòýîí¿_ñ*ºj˜›ü7.ÔI¯@È<À”MYÏ”Häí:_kb•¤·u!ßñ%#ʤ8fkYëõT—m›bB!åÌvGaáºÌõÝ¡][âw¡i›­_yòíùØ@¯<¨ÃÐ!Ixݼôn.ÝêqÃc`aŸ »ÁÀãMçG]Sjã@€†XtØ·?雬‰/|[ö˜ó¨Zû‡GTìΰ:í8Œ%rGÜ¡øÿá¨w‹í‰±gì!ÞWdÏö‡F]ö~Ü»}÷ÄÂã=-½ãQçh¾74´ ³fÃÚËDùö^œAÑÁ°‰Ô\m«¯â\ÍØËWyQÂ<{­déõ*Íbþ ¯ªÍz*t‡Ó¡ïør2f^ÀTòLcèUÿäÙ¶0CíYl ýªª¶ÿº’Áe^Oòâ–ãŒWW#ÛÛ¶Äÿ}`ïyÁ€íדy€ò=”X¾ÄY;da"P»1ù<ß0dæšÐ®fûÉôOÛ!V[lLS¯?s­ušwxŽŒ¬±ðïºZåűbàÀô'–O˜hS.F»°D;Ø‹W> endobj 1637 0 obj 2147 endobj 1639 0 obj << /Type /Annot /Subtype /Link /Rect [ 178.89 533.029 214.99 541.909 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1429 0 R /H /I >> endobj 1641 0 obj << /Type /Annot /Subtype /Link /Rect [ 165.82 218.757 191.93 227.637 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1270 0 R /H /I >> endobj 1643 0 obj << /Type /Annot /Subtype /Link /Rect [ 211.09 218.757 264.41 227.637 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1642 0 R /H /I >> endobj 1645 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.57 218.757 336.34 227.637 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1644 0 R /H /I >> endobj 1646 0 obj << /Type /Annot /Subtype /Link /Rect [ 355.5 218.757 381.05 227.637 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1632 0 R /H /I >> endobj 1647 0 obj << /Type /Annot /Subtype /Link /Rect [ 215.07 174.637 402.55 183.637 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1273 0 R /H /I >> endobj 1648 0 obj << /Type /Annot /Subtype /Link /Rect [ 203.13 152.637 315.33 161.637 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1275 0 R /H /I >> endobj 1649 0 obj << /Length 1650 0 R /Filter /FlateDecode >> stream xœÍXÝo›H÷_±÷HÍz¿Øe«(ºVM®=©êµ±t'5yÀ°¶Qùp×ͳ€m ,ÍÝS)†a¾gö7ƒ¿Ï("ðwe¿|A±ïk¦³ï-"Å—-É#X0ލÀÌC):'y(±2 v¸‚¯3^¸ß ¿gÙŒ ?f_'Bäö3âP^«ºŸ}îøÖ2ÀõKò õìíb6¿ó%h±:¥˜s¬=EQù˜3m? -RôõâM”ÆY\VEPÅy†ªV ‚ÁylŒ¸ÍÜš`å%0ºæ~g¶&‹âl,ˆl ÚæGœïJTšªú+ Æ%ÚÇI ³^'¦fk=Ci+š(_­pcÛÖS€ÍbÝTGÀ]¯>B¥šªTjlöeT kGaaæha“D½Fðþ)Ë·e\N%‰JpÚ¸¥37’,-G¤ÐW§J`ÚÔRŸH^mœ–(åS’Á±lø0l68‡z–aoíL˜êfÁ€Øóáµfî7ù¾D—èÊçpì/l7PìÒ™#!Û¥K ùÊ!šÄËhŸî£"m§û]i¢Žh~ºó,3a5þð)ßu”DA,ƒ²c¶4Å™™ ãëÞ@+wž .c¬—6&å^uÓÑâl•i3ˆÄ&%Íuµ ªÓ]ã>>tI™wXU9èé¸îŠÂdÑA²3¥ËƒnAËÄ”.àÈÒŒdˆ‹^†âU ÅÜÇÕæˆAjxL¤ÝáÃõˆ(úʦÇ}XÃpƒxbLOæT ÀJÖ¢ë§ú˜´õ'XÖ¬5faó)fÖ½3Ý€ÕpöJÄ4ïɼ‹Ëm<•(@“lQjÊ2Xd~:âºT®ü1æa;Ía/ä#êØ£¥3{LhÈ>dOøþˆ4 ó4 ²h*‹œ*L-äHòüÑÊ=Š¥„Ò›˜­C6÷på’»T:¦ëP¢?F]W^ßΰr­0dFûoÙÇñ¹-b8®ežÔ‚› ëT-¡'²u°¤<Ìd€tc²ÎpõëŒW…™­)íUJ0‰‰dÚ÷™ß¸rÙ?´»¨·2énxË·çÆR-þ×—Û»ÿÌMÎëº4ÿƒ"üÕ1’kZ@Pë$_‰ÍÄ*^ïÚטx‹j4ãçûê‹s ¿½ÿôñvŽŸí¡–Ca6Ïòï¹ñ,€^”²Ö̽1È"~×?9 ¼Q­`Ïk$¿˜Õ»·ÎNTKÙnCYôp¡._y`à#õˆx|4±Ïh¬í>C87N'SnE¬q.\Ö¯–Aøm·uû Ùiú>0JqûæÍœ>¦¬ò¸Ñv9ÎüÚ ØP<—õÐi–AJU¯1‹Vm·):ÖmfÃŽìÃE’‡õÑÝ>=\ºáJ‚Û.òFt¢OÊMP˜y”·¨ruÝîW7í}cug‘ù‰7UšLº­;éúÞ,'}†•BÛ·d&Ç”¡ëÞ$¢XŽ2àßTÕöõ¼ —°´†à}mpfª¹#°ÎÏ?€+ÇBtßLåARo4íD,LäÖ_m ò刢a8Å”·[Å2=U ÒÉïBCU7ÿp%¨ó¸ÐŠÞŽßìªM^LŽ›=©ª9•ÝEíáEb_ÄUe2´|Bƒâ¼*¿ÏM‡ßtÖ„ßÓMKÁ‘¹ÁY>Ïþ«{à endstream endobj 1640 0 obj [ 1639 0 R 1641 0 R 1643 0 R 1645 0 R 1646 0 R 1647 0 R 1648 0 R ] endobj 1638 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1640 0 R /Contents 1649 0 R >> endobj 1650 0 obj 1476 endobj 1642 0 obj << /Type /Action /S /GoTo /D [1651 0 R /XYZ 72.0 769.889 null] >> endobj 1652 0 obj << /Type /Annot /Subtype /Link /Rect [ 165.82 275.829 218.59 284.709 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1644 0 R /H /I >> endobj 1654 0 obj << /Type /Annot /Subtype /Link /Rect [ 237.75 275.829 263.86 284.709 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1530 0 R /H /I >> endobj 1655 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.02 275.829 308.57 284.709 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1632 0 R /H /I >> endobj 1656 0 obj << /Type /Annot /Subtype /Link /Rect [ 215.07 231.709 402.55 240.709 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1273 0 R /H /I >> endobj 1657 0 obj << /Type /Annot /Subtype /Link /Rect [ 203.13 209.709 315.33 218.709 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1275 0 R /H /I >> endobj 1658 0 obj << /Length 1659 0 R /Filter /FlateDecode >> stream xœÍYYoÛ8~÷¯à[ a(RUÁ¶H»î¶ Ð]ÔA!K´­][R%¹Ž‹ýñ;uYétŸ’>˜r®CÎŒúuf!ÿ®ä·-̹ÂíìkM·Gsk’C°MB²lL´EÇ$m$Oo@›üí…ù}š%3‚~ž}~€="À·ŸðJÔÇÙûžmõ?'ûZÍ^ßÏ®ß:È"è~ÙAÌöâ1Ä1£¾ü£è~‹>Ÿ¿Š¶qe”qš 2M7ÅźÿmöæþÈiFæÏÍç÷G&BÌxž‡É0–*1LÑ€¢$Ê¥#C†S¥åˆ¢¶âØþ„Î^§kQÃ\#Fx浌»BäzÜ3°Ýô= ®ú>›òr¯ÕH‰¯ç38I- »:¾léÂÕÐ2š<¤Œw÷kìâR¯!=£ÉG‡a¦e\¦ù6(õZ¹o`6:êslË*Á¢tÂQ=´ 2‚žÑà(³(öµŒQ¬XƈÓä%³ ¶ä•¶ùÄósUèU:ÔÀˆ~ðÉ´,™™ =Z‹¸E˜Ç™,ÃNe‹A]Å Ûl2¥À6[è<.ºqÐ e6èfPÝDJˆ“UGè‹«òÆüÜ›_t´~i‰*tª!¯´•`pGxÕ Wßã,½Íe/ãèé²·¸ƒ\(¡±Ý4ò ³  /  /ÁßÝÝíí—_~¹»Ã ¯¾Ÿ!@+ÌEPŠOÈuù@î§um™CQõ¼Í$ ’f˜‹¢Lóv[”A3^æé¶ƒ+Ͱ;C9 òpk·A² 6›ÃeCˆËvÔª¨-6‡V«(âU¢p­´¥ó¢ 9ø»8 if˜n³ iz…öv»ãNë+:–¦¶Ö¯OL>íÓXþÁKG —âàÒ±ºPù½ºoM‚Ýjo®+W(tRÔ³ \}~òYtÉÄ~ÃkèR(bÇí3¨y\¨úlgÌ$B@ö€âí×q¸†ÓBÙ&ª¬ºWsˆe°Û”/P¸Ëá—¨e_<è¨Ç|îrz2+JTFûO¢2âègA0ž?àëž+$#/X ¤Dgy\œuÌ/þ•”dz'Áˆ5b}ÊDf±O–Çp k±Éª‚\<ÆåSõ3g¨¿8©ßB[@`$¥ì $$!´"’QóT3Ü!ê†râa¼ÿT<Œ9ºòÖà*äJ ƒ“Ï!•mj“ ÕDõIí4ÜÄLÑæê .;REU‚TÈ…ýå¯;¸_QG‰—AÞ3-L“e¼Úq™ìÊ"9¯¹tÝFYÂxê»g[£ÀÒ—öp¢ãý§NtÌÑóúµé0v³ (öi®‚„Ý!TMº­¦}¼+ÂñV¤£­(ÍÖ˽­(õN+hT­èØ\ÃÚlxŽô© Ñ–v¨ëshêÎ]lŠ´ý(·Ë€Ì ý>!¾ç)Î \mTx6v]ØÎ¤ñ#^TU•—újâ—[ò»†ëO°?±˜¥!—2˜=mƒe´Ár 0iÔ†"ºé;q­ÿ£Wö¼²Ù ï:í¡¾!dàµúøKµÚ±V9µåöÄQ#UŒ‚€MÂo˜fyOô6 óRGèLÈD|xóö×?¯‹5\’ë( ¯Õ©¾ü•5Ôh7õ\i½Ž“H<âu¹ÝMç¦ïÅÂh34Z¾üÞGÝ)aèåðcœÍ0iÀï_—eöâZ9‚‹t—‡.üJàD”×ÇŽz^Ù0rÏó'dßqpø$²Š‡šP0`@¡—ׯãî„ 1Ìêåñ~#QàdÍ÷·±¨›ýLÉ]l»P¥ÑZÀ«]¹NÍu€çB«îÙŽïA8Ñmïƒíó¸,¡R‚é6øGèX;‘£—‘œþ”¨)Goƽ–Ëè@ÁýZµsà¿Ót}Ý<“ek;“ú»ImHKXº±2­66¶„ c»Å:3©IݯÖbÅ"z*³<ýZˆŽ0?_ìÊ ·m{àö68 …@P–EÊÔäEû:Uÿ½ð~ö­Th– endstream endobj 1653 0 obj [ 1652 0 R 1654 0 R 1655 0 R 1656 0 R 1657 0 R ] endobj 1651 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1653 0 R /Contents 1658 0 R >> endobj 1659 0 obj 1767 endobj 1644 0 obj << /Type /Action /S /GoTo /D [1660 0 R /XYZ 72.0 769.889 null] >> endobj 1661 0 obj << /Type /Annot /Subtype /Link /Rect [ 286.35 621.301 339.67 630.181 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1642 0 R /H /I >> endobj 1663 0 obj << /Type /Annot /Subtype /Link /Rect [ 165.82 377.829 219.14 386.709 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1642 0 R /H /I >> endobj 1664 0 obj << /Type /Annot /Subtype /Link /Rect [ 238.3 377.829 264.41 386.709 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1530 0 R /H /I >> endobj 1665 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.57 377.829 309.12 386.709 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1632 0 R /H /I >> endobj 1666 0 obj << /Type /Annot /Subtype /Link /Rect [ 215.07 333.709 402.55 342.709 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1273 0 R /H /I >> endobj 1667 0 obj << /Type /Annot /Subtype /Link /Rect [ 203.13 311.709 315.33 320.709 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1275 0 R /H /I >> endobj 1668 0 obj << /Length 1669 0 R /Filter /FlateDecode >> stream xœÍkoÛ6ð»¿5jš‰”Š"X‹¶Ã¬[[Pç-Ó±6Kr$9®ÿýŽ¢Þ¯¦ß’ 1ïÈ{ïŽ~XPDàwi><‡bÏóQ-J#@_ôþý»â^¿F•H‹5tªã@g¯Pœä:C*Þ¡,¿uVÙÔrÍœ_\‰]êÞì±_¯qrʬíÄ7”~€ÐwG|c©G¼J™’¢o˺ƒÿgTYŸR0,묇s¦Ói™ž˜¦4b/3bñ°'ÀsDÐ!õé²›˘˜¡¼›“ÉÁT aŽ3¤Üªà¿ói©Òà>Ꟍ7¥æ^3$+Ù½×Y†'ÓD~t(‡®À¡”8|üB %´þ›0«VªZ˜,®Öû$­––0Œï+D‘ß›¹yÙir½DÙ”¯D@æ—K{p®µFÖe5‰õ\Fç,ïÝLc«#z¶ÐlµŽQj•ëÚ^QB‚$:©¸jÂu\Å ¬¦ º6†ì­+­¦Ó9õ\À@‘à#<ðˆÂëz§÷6X2 Ýœt pdƒ`Qù¡Ùnbkau<¶öÊØÔ˜ÊÕVeEx,Æx·¶m¾Qò¨w5¼©Â²+bo‘û4‰j`õ¨ÒÕ1Ü® O­FLõHÏT8fÒj+«òÁ®³k–ë¨+µkD×Ëü òæ`˜êüq­1››…>/ µ-®´ÙÛ†+Ж™SaJ+I-ŽÐstjÉËtsl2דkî9$ɈcþPñY'ÓÌq\ fîd#Ô›—ø'ËŽ©¢¾O ìð²ÏüYTœªÍ`QœM§º ƒI˜I*")uXf«•ˆ]š”šôñT4Lý=ÌŸ*î“Ü÷„WÎNËó¤÷9?S¹#MO›±Qú#T1Ì6¦º13ÀUõÖv€¨Áàê8ÏÄÆÖ!õªAˆÀVd‹ÜÞ~8íØ5˜p?#@¥-Õ‚$Þ‡÷çuG]uΓ8Aï¶Ó}Ú3]Ð%žšQœò~D/sžÿQD‡õ´0PÎÜ>‘ʲK’ZA-o` C•€™Ä#Œ†>€1”šÛâxc‚g}ÐcÅÀܰ¢auû“%ÏñìN(+¼=ç‡d~xç¹0”I*cc¯¹‹ÊÐ% ó^<ðÒy¯Ãú¤·ê¬SôfgÀ_b b0ôv8»Y鸾„Gˆ•°>ØÇ!ØÍ ÌÖ>©{Ý@F~”ŠÔˆíµY[Õj°Ò±FŒ(Ûl–íÉv¯Øêm¨Z"Oiò/Lÿ bs³=<]‡õÌŽÔ^Žf³âј€˜4««SñíÛçÅÿ+1\ endstream endobj 1662 0 obj [ 1661 0 R 1663 0 R 1664 0 R 1665 0 R 1666 0 R 1667 0 R ] endobj 1660 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1662 0 R /Contents 1668 0 R >> endobj 1669 0 obj 1591 endobj 1671 0 obj << /URI (http://www.mycomp.com/refdb.css) /S /URI >> endobj 1672 0 obj << /Type /Annot /Subtype /Link /Rect [ 498.825 654.802 523.275 663.682 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1671 0 R /H /I >> endobj 1674 0 obj << /Type /Annot /Subtype /Link /Rect [ 138.0 642.802 251.6 651.682 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1671 0 R /H /I >> endobj 1675 0 obj << /Length 1676 0 R /Filter /FlateDecode >> stream xœÍɖܶñ>_ÁCÒ{3Ü}SÇVžìHšqrðøÀ&ÑÝ|" ŠË´&_ŸÂF€[wg^²- U¨ …ÚPì¯7ØAðïÿ+ö±lj“U7_;q¼P¡äú$@Èsˆï’À©œ)*pJà±D௠-ÀGçß7õ r~¾ùãO É|§´±¸Xêáæ“%›"€ñ÷$r7}¼¹ÿ{à`ä<Г0IÐhìz$áÿç±rþxóÈXÙ9{Ö:-ÝÓ–Ö}û§óøÃM׋97†ýÐŒ=­s§f=íœ*­Ó­hÝKþŸ':órãïMeŸ&"‚ÉEQ䢹)Âßõ$0rE>5dÊ]&yù÷¦Èh!1²^Záw#ܶ†‘aœ$Q’À”OLÑ9‹ùnŽ·4ÂåBn(P­:|2?¼/œîî O¼¦*´ v41Ω H>§Ïé~_”Êù¥¬m.}ùñXtÎ[Çó`Í7¬é V`–šñŽŽÃ¡£ùôl¦¹Aw¬2 [:”ýï ZæÝêe9Ž?¿Çc˜²¸Ž©Y1m©-†%ĸQî&O{š»³PZñˆëå!{Z+|½;Š`ñÃÀCœÁ(e„С÷6/'«Óʰ½µ²ÊÓZ\ÊXݧE]Ô‡É&-bžüêÒÒ^„kÙ5Pb¾Ël‚¶ë—Êðý™2ú¶z¿ó#×Ï'û|“Z¤Ewk€ŽY½…?²¡Ì ¼³3Ãç´,,ª––i_<[´â¦5ß®cåÐ[³MÚ]¾ßŸ9}3†Œg‘±¡Îo—Ê Â™ò„Ò’±/2áòÍÄE=ºx8wTÆn€“ú^.ù—_þùëO›±„ â†÷p/Yòº7íŒUOâ鎵}ç{#ø44+ö/ 0d™Ñ_ðûçP®*Æ©þ˜vYškw¨‡þ¥´Vy8RÚw~ââ>½5.¹k@„­Iв4ÐΚQqXƒ™q6t=«ŠÿÐÉ)—ÖŠžiç—Ç_…"Ï@Cß ½ïÍX©MÛ–xPHÆ`‚~²²Ýöà ›–‚£jà&Yá6û+ƒv æÑOݪ¢YM;‹Šp¦ÖÀ©–,“¡U‚<˜èé uî\PMˆÚ#Üp/ñÝ(ò…›.&†›uÝYûöýøÌ·× Âí{3Þû#$ðûê…Çö{iN¥!È_YIš=†Hë­eA :ÑABki×Ù¬{{ÚkwÑtõÝtƒŽ¶ÏÔ–ÆÜ¢BlÚ´O`*EL^9ð±ï›îïW¼3ÒÓéäV/`¼ ÿ»Ÿ]úªC$n΄B¼²ÜÓÛkÃ5ö7ò}(vU^¸;^ ¤P±OYþVtM™¾tΑ–ÃÓÉÐÁcÐé²–Òú–§”ڡߊ¾»Zª(v!ãA¬@Z¬â\YÒ_J#KŽ÷ï”­]T@‚f¼TÄÆØªúÄøýÇqhÙqlª¿ÇŽ}ǧc‘G¨0¼íPë"p±@Ú4e‘¥ª|—8câñXþåOo0˜‰µîzšæ—ä{ÿqiμИêÃ6âqð… z(c®¦¥(ŸsqdRŠY׫ºRr«–L¨`†å|«ÝÈÞ´¬¡m9îb²òY¤OIùb ÝŽâ½€rªk­—ÏÅ$+?Ò5PyÎz—ô—¬wÉQ²Ã]IŸiyñÝç3V«ò1œm,ƒдk‹Þš‹”™ñh®ajYúHX¾Ìâ¨ÌÒ¡  Ùc“ŒÕ:fXÕΞÚÑþÇ ´—·„à^(Ž£xE#hó¶|òÛ|–u~žï";Fkm‹á£sŒfkÖ®¸+<\¦ô¬–yÓªu±]K ƒç_}è b»ÖóbÒa’Ä>^ÙŽV´Ýnàlñô’¬1ß^³?¼š“$ þÊiIÛ~{ÿè0û¡÷ÚýâÂ_[„¬,‘?yµ… ;•Ù_·=yˆEk»Ó¶ÝÞâŠï(#ñš\µ9<ð'k´¶Ä)myêÚ– Änœ{ˆ’×JÂ%P…kKÀ£¶Ð]î5 *î¿öúIºAHÆ«PÔ{¶¹½‡‰‹¹í$$~åöŽ\âùIxÁÊ9Ý Ûú÷xÜ€‡DEô™(lª°OPlX1Cåx}`‡•p$°I”À­«TÆÓ˜(8‹E‹­¨EO«ÓõŠÀoFU Á1 p"48_üo;~@¶ù,yŠ.Ý•²&1<™érL x_ÒcÉûÎf8M¸-`zö²øB¯8±N¤œf.úv6óÀS¶ùÌÆMk뼪᪠VËû×s+ÝáéÒuœ‡wÚ õ¬–˜ ŠGxAt£ª XÕƒD¼3ÃcqPåÂHkZ½zu. êsiÚ®;'£©o6%\ÑDìM5!›¤ò—–¥kÀÍëN×OˆoQ°\p»hÀ(8Ãg‰¡ûL*ê¬rj"~P_•%¸î™  Lû^Þ‡„UÓE;‹^(;ÖYUC)`7ÔyZ÷·%#‹Ë†>@ªZôêÙÊ5$ÁìžY‘ÃC On0ÒN†ZØ_»¦ðD€b·oÓì‹“³SíÀKÂ@uõ›ÖÇ~’ ¢ß´ν –ô—^Kþ*¸¦7ê‘hÆi= xëx,%°¤‰HH7Á!3ãÔ µ†vcS/­ü.´ÛœjiFUsEŽÉ¢K”¨Ç—†;m99‡|\¨Íô ¯ë™ù~àÕx[jq¥÷ãyÉŒè9mïá ²é“ž½* •®¶À¹A %‘²Àæ¬.è/Zà‚£aºÔ>c}™qñ~ ¿hÎí0ùQ‚wFä.Pw@ø„ÝñŽ«’xpyq’`­¯—dõQ0eyèÓV|~O`x«²a[ª¿xæ]-†«÷ÅahuŸF ¹Wëõ䋨P—…üê¨6‘ßFÅ[¼£««W ¬u×ÕˆSŸ^»q3ù=T§å 22 ,§•€ ¿rœ³q(?”ÉqG͘«iTÇþ®,Ä+TQIv”Ú˜ß; Qg¥øjGž‘T¦×œªWñý^i¾¹PBC5èëpýùœ³,é/9Ë’£É÷-cýž'3F­¹ ð’ÁqD+ceÉ+uP (·¬.2€ö ¼é¯ïËú$ê}(•òxV) ú‹JYpp#¾¨‘˜Ì¸dGǪ&5cXMz¨„¥ɱt³ûiUNT æE {0Ë6)XŸüÜ.ï̬®ÕEh”r u7d¤1°ôLüÙ![Õ°…ŒêO*r|‚r•×`U#«UE ²¬„v-Ù9m©µtjqæ“MU‘&>ý"»oŠ’—I†r¯ê@E«ò°š¬Ø ‹6u–½E)£˜‚Ži·ò±…3ÕÐ2m:zõWëR· 4ö}¬ {8gØKúK†½äà]íK†À¡§\êSƒý{1†LÐêß_¨&´«„yÚ§»´3ˆT˜œ;¿±žþ0Bº1»¾‰¨‹G€Ñv†Œ©ßNR¶*¸TQ¯\n€W4§Ë.ÿ-H ÿiŒ héסheá.)æGüoÅBUÊØ”&ò|ñúbÆóQÄ[öíxà楅WkïðÎP[‰Èóš¯f!òÝûˆq¬$ü×% CÎxTêåZÓo²Šåôj)<«© ¥8s¥%ý%WZr4i×X›_<-dÎ)§r'ì‹§¢jw @¯i0Ê£VhmŸ’Ë©$bô* j·ÚÚK;–‚˜%åÎÚfâ[J0¶!ä†{…vóh¢Ím)þ¿.Ƽo#y¾2o¯²â”ç‚Si ;xÅÓ:k_óƒ?ñKÓO7ÿ¢8¯á endstream endobj 1673 0 obj [ 1672 0 R 1674 0 R ] endobj 1670 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1673 0 R /Contents 1675 0 R >> endobj 1676 0 obj 3023 endobj 1678 0 obj << /Type /Annot /Subtype /Link /Rect [ 491.585 391.139 521.025 400.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 969 0 R /H /I >> endobj 1680 0 obj << /Length 1681 0 R /Filter /FlateDecode >> stream xœí[M“Û6½Ï¯àq¼5Ãá÷GnÙd³å­=8ñ${ˆsÀÄ2E* 5Ú¹ìoߺI‚„DÉŽ]ÃTä){ðš º > ú÷×ràç^þJ×N’Ôʶ7¿“ݵbÏò#2…Žx¡ãø–Ø^hm­±)´J¸G/x] ~êÞXÿ¹©nëŸ7¿þurËû7ΉÆUSïo~Ôb£ P^R|޵¾ùûãÍáå:Öãjèb?²“4JÓz4±}/•<ëqkýzûX×ec­ja ¾â‚Wó›õø¯án/µýDÞí‚?gr;«r«ª[ÞX[V±5ßòªÅûÿñ8ê3ßqìdi]öã(D \Ƕ3¥"ü lm`Áå¥Q Sˆ^F|ü}2dLjØÑ6Y¸˜àN0ŠíØuÓ4NS¸d'# ¹a:ǘÅ<žIoÌ“PU¾Wÿª ÷ž,R£B Ô÷l7âÖ Åí»vªÇ}ïÍŽMSìFs4wM죚ndÇÏ`:ˉ.jÞˆ/¨¾‘D¦jð¸¦w²œî¾×ãjªÛ§ôz´—¦õüÓlŽñ0£O†£†CÀh¿0Q°§’nØQÐè¶Ýð¨¹j€õJ»T¯ ¹)¶¬-êj’tq,Ï›¸k7Lù a?|ûRïûò¡Þ—yÏxñÌíÞð®nš¢ßPhüÀN`“í¸‰žY¹çͼÓ÷S PµÈ¹ÐñjT3œ5Eµ6üÑÔOuS´/ÊUàØ‘uËÿf@|ËÅZ¿ZrÑj8E{g8 “‰#.Äu`¢‚°îdžªÈø%{ýÎÊùÓ~=£PGÒbiÃ_}Ì/V¡ìØš‹Yyr%Ô õÚ¼iÚ¼ÞÏíÌ—I›«@ùpë5‰¨:ƒM¹<®,eQép='À´²6·]"P\7´ch!Ëø®m4 i$B@ûÝ^¿ý|•?—,µ(nìÈ{`,:nk °²¬zåLÔ%ôÀZ¯SåçÕK !eÈPWU±j_zÔn ÁÆîñ¤µØ³ý8IÓ81›ýày>NP &7ºtŠw¦‘oÞÚ»kx•7çe‘|9k™„.í¹TM.q‹ÔeÂÏœd&L*â!†÷)¢è¢HƉ@ïóeQÓòù´Í•_Ëæ×ë³èos œeÒç¤@Òu%Ù’HFj)rPòÀ¼U‹|°6E¶`Ñ å}ÃµŠ«ú­Äö°Wm‘©äJlÈ'½=íf@$˜Èû‰5äq.ž¹À Ä”X·o[ `èvu+ãuô¢YùsQžWB¤¯üX>vÓÖ‚kx_ñ*/»û†¬]¿^ RPÊ‘JbåEóQƒ«¢äJfu†o[ ”œ5:Þ²f¯â›ôÚã÷<Õší¡~1««U±Þ‹þí‘]ÆexJ¼é“!wBW¦²ªºÕà,—§ÿšI~›5 V½Ô•é#r€— æ]`ÜGì&”ã°fixÛvb-^›ïÉu¦4PR=£àw²Ë _‚îIÊ`j¨ã…éÎ5yÑrÁ²¶xæåËœpõ¢t‰[g²øŽ9çKÛ›ó{F0t¥›2ûŠðÐG"èL³=Ñ7y:€IE%U5×׋"­£>M¸æ+Q×Ç3r½lá{}}€ù½âÞÌØ…²è¤€ÕxuåÚ’¸ö¸!eçÉ}ð4OÇ¢,5ø¤_ë,Af.ûG²}ªßõår®Ô  "×ܱvÓèWk ¼ûþ‡ r~¢S\‘:Ýl›L»V3Ö«ÕN€Nh4›®ç”º1\ ‹}‰RH;ž«;Šl\'HOJèÛ_΋\hÎnÔN»WL+ÿôö½†ä^›­™@à׸²óUwÃ{öà‘6ÝÑ1HŒ7Qéö·òÒÜ"R—ÿwǪDòÒKí¸½¶5äÓ¶éØlºQ¬þé”þ©O#Ú M§›zËÎkd¨TRL¶ ý©¾qG†[˜·+6o=ùÚš”»f©W—=È1Aý¿‹ÃŠ“#·Ë¾õŠ~,eˆ,t"÷H#ù3+ÇU^] ´Ø´Oáð&|°ÝÔ/a­ë£mÓ‘/Æ2AòHˆËý†i×Ñ]eÙÆôL)DLm‡BÜwå ¯*oL4ŒÎ°êP̸×L‡á”L;èöTÀ‹éNA {Š•è1 mØ3× …„`[?éÖÈØ¿SÆwÉ£I“l´•CÀ´r^¬Ôÿ:Âxʼz[·r8˜†ü€M»-„GQæšçLi! &šE˜ÐèVU‚Y]e (5ë1–{î”0Ý2¹«…ýTGÑl@-©X”îÁÀTÄrI:²zŸx÷°BÀ  Ñ>hÔª2eEåNNn3Lýo¤jºLLèËs8Vu_i‘a'êµ`ÛÁ°oè´ ¡Œã|¶F¾¨9]ê]`*·Ka&F6Ô°ü -¶5JJSwÒ“Ø—Ÿó$Ÿš3|ÚÇ·Š™ÅnV\_ꉗúÊ/ÏõbÛwf…^è»;}¶Ò½»ëûíò5AŒ_°¼ÓËsXÍBÛL›ºiå~ÿüÒHç ã†ÿÂEh˲ ¥zÈr€EǸ Ÿ_ ž¢oUÔÞû熠ûÂGí« 4|Àl‡|žÑ¢üù?éÝ}ë endstream endobj 1679 0 obj [ 1678 0 R ] endobj 1677 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1679 0 R /Contents 1680 0 R >> endobj 1681 0 obj 2560 endobj 1683 0 obj << /Length 1684 0 R /Filter /FlateDecode >> stream xœí\moÜ6þî_Áou[¡¨wË5—CR i߇88pW\¯­´•´qŒ^ÿû _$Q¢¤•söYÅm‹Öœ‡3>ä Ii;³†/ùŸÐµ­0ŒÐzwö›âÛ( ÈñËÖK<ŒD\‹xh‡º,¥ £H]‚?º@oѯgÙF;ûôêăÜÝi\4õñìƒf›ªå%Ù‡ÑíÙ_®Ï^¾ñÑõ¦u±ã[aäGQ -‡Dü‚®wèÓùuž§%Úä*؆,[³ŸÑõ»VšD–riôáž8Íb”å+ÑŽfô–íXVIù¿^w|æ`l…KsÙ‡Ž‰¹ ,܇"üçZŽäG¶Èu é“RK‡#{ ÿŽšŒ ‹±n°‰ÂÅ7@?°ÛŽ¢ Šà‘v dûx 1‹éž Òʼn'*_Šÿ‹—„U£@xÒP‡XvÐÚ­‘ÊnǶ"ÝîK2m¸lZÙn4§Ö®¿SÓö­ §Xƒ¶Œ˜0«yÃù@ø†YUƒîšÚgÜMª»Õ„ÛZ¥jx´AÓ<ßÚ4i6:Ó™Ab`1<fƒçÊéðZ$t•²Á9a‡®å“ #Oˆ2r‚ÙwÁì¿”>®ß©×lCéH`¶#Ëž (}¹}@™kî z†¸¤‡¯'‚Ü oóðöc¾Me”„¦ñ¶ˆuŠ˜ !¸N‘1ÜÎ’7¦v2c,‰‰2€¢‡CÒ ‡5†F5Lj tõCa턊%¢â‰_ e}oCÑrˆjNøx<|Œo%1 {ûGÇ+Kô]6ìÏ“M[®¶¬%ÖiQI«ÉO/¢`›xUö?0?òèê+Ê3Ä[.鎡]o“ŒYÑÎ%¼kK·â„¡[`=nëæ KäƒzôëjÐ_S»âLº nnTu·šp­ÒÑnŽ@ëê§mœˆTÉŽå‡áô©•'H-RÏ;9K1v™˜±-ŠNÀzn`]Ë8JüHDU¹@iœ$Óˆ’­ó,.-õjS±ÂŒ­¤¿òmž#dzB©G#·TÈRº/Y|¡±¨¡Áq­ÐÁÛ¡#5”MS&Â~ˆðÓ9Øš±u•䙯”f(¢¢_Xf4íú½¦ãü.}v#›[ó6[Œ–LcÕýSäWšôÇÉÆÐâ…=-÷ùKØN3úœeëüo5Þ¦`¿ ÑÑXˆ¢µà^ë¬(ò‚›è Ñy,Ì“å*oŠÛävÛ«îòâK[¯ ›M²6t…¤§KÞ9Å«å_Y‘æ4žÊ¡ø[àáÿ}aZn•ó¹'Ùídu‚Õ"aõÜè¹9ÏòŒÝ¼˜È¦ŠœS:õ'€—J§lOœ<ÄòzFãÔK—ÆÊ7:q¨öáÜȧbZQ‘’ØØ ¸à?Uö È5Ítò “•š¤Ùýñ„J3Õ“¹Æ–V ÙJÑi¾¦iK%«r¯¯Ç«d·OÅ›%´ÎÒ›çeåa¿Ï‹J&š’õvÓ–y²u<ŸÒr0ž½Ôù™Èlòª%JV]´”:W’„>Z’“›‰œ‘jÉ&|"ã´’©¢dÜ%iÚ«–#k•ªíPVgdZÜͬ(ÁySemûCÅñˆ±VyäñÖªºyÃù žñu5诩]q&]P77ªº[M$U­ÒÖ#:‹˜®þA‹`±ÈènúM…¨ ªçÆNšß&ḚŠÑ «EÓ `Ï °ë&@Û¨Y©ZÎÝ6Yo[²‰úvbµÉg[Ñó¬JÖM‚âò7WE€n©:gDñgœX±‚·ÈqÏá6]«S$Eîè½F‰d¡&âd#^ê5s#ÉÚùN\jµSAÎÉ9Ü}“‰C@–¸ªo/ÍMyÄMÛäÎvƒ´›S;™±ñ æ&‡ lrˆ~4Cr43Ljî…í÷î~Ϋ¼<’7œ0µDL=7t6SéÂ2!3þ‰y sÂÕ3áê#ã[}‚-¿¹¤QDÞ›’xÃDåuŒ,ïÅ'4 ÙYæ¦Òqé‚v¬,é-+§"-ÿ&b±â¸Ø@¯‹½uó†%òA·®]‡½º­Õ €'L»ÜcÎñõ`ÖuµŽúãñ÷¨}°‹¦Œô,ÿËÖÅý~úý’Òˆ4òˆP#߃µÇB~‚мP4†f1’ÿC¼ÙÇÀ¦Ûõ´`sÉŸlòœß ‰¸Á»¦DÄ®‰ª.4rOËò./âRãÑbFˆ® 𕻤ªäÙ€:?dj)e±¥±¯·3¶õõ¥ä`±j5êYÿ0Ñ…6 å ‡éö\äø®D6XlGíW4‹Õwï€oÝ9adaσξ”|%..mWä1kÕN‡••IYiu=% ª•Ë$»M™ÆàÝÓÉú$¦®¿gëd“0]:9éÚci¬úDD‘êDDQ+]x“§i~Çt Vý[.ð‰‹ížOhq{؉ׇA÷KÈ×Ê»¤Zo!_Cü¬é–e¬ )*ﳊ~CÅ!…¨ó“[Vå{L“UA‹{D÷ûô^ °MÒK˜ƒVä»Qä;nó’sšd_4™þqÝÈòI€m×V¼Ïò}Yß½| Œ½ {&¦à+îÖïw9:ÿ4ª" -ÛØ;¾ß•½ŒGÕØ0Û‡……µ¬Ma׊B>naO¸{â6¤×'V^Ϻ¢ŸgôÔ`Nü#¨Àéuu;®2ôG„4•ã:  ”/*ØÁ^OçzT'±¡î%6 (—vÃxÔ¬Wëãɶ«ÿžág„– !Ê&Äîõ9Wá¡9}Ž<‹ðA ƒžåù¡Ú$é8¢'‘|XŸϳø„À~¿ËïÇuûÁ°ÌŒ;ÏxôóØc—G¦AÉÏm—ç¿q9°èÂÞ£©_Çâô;_•.+XYeYÖ« ‡Ë À€{õ·¯åºHöü`~Üêyÿi … µ%a|ôèûÔ2E.¤¡òï%C7Fj*!Þ7ˆ}«X3ùS<]È3†ø‘A^0Q IçÔYC§cžc‘È8Ê#êO¼C°¥_YK©ÜI”åÜ· ö®«Tcp+B˜¦=ÒÝjê¾5 0Ÿ]hJ¨^´ôJÓw(ÕKí^ýüöõUKpRMIÉR¶®Œ«îßë¹Gù@$–š ´Qnúˉ·¯/šr^4ÅU+ÚÚÞoèêçºj¨Öp™ÙJ»[Áï0î »·P5„z—XŠ0Öê¥ý #î© èy*eT䀶xKZ¢A–&kBM܆VÉš$äH²¼bƒ‰ÔR¯ä Kâæ¼ùÉš¶‰û¦øöõÍ‹‹VR:y–ä:iÞ4’ ð`§­W¿ð¤Ñ]ÿ܈‹A9zÿ“²ÌoØd«ŠqõÓ¯W-uõֹò i]š˜ŠØh*Þ½¹Ò5¾{ß%í.I:öìY‘äq"ßá0isHÓ®¦—|HYº^¢«UÁ¾&”o­„_Ùø•#jžÀX”Èæ‰7"7/¬‰õß'"Y†£VÓ÷bé¯7Aïc¹“·}@îÀÒŒ‰s4“òñ@}4V}¾ß4%:™ÓÈ6 2aß‹z‚¿${&6òu@(ù¿™?žƒ >ÿ-§Ð<šÃawJÜšëdØxC ÙXpt3À}ܯ~ÔÅ}nê?áâÈí ~Tk,wr݈¾3ÿpö}wD endstream endobj 1682 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 1683 0 R >> endobj 1684 0 obj 2809 endobj 1686 0 obj << /Length 1687 0 R /Filter /FlateDecode >> stream xœÍYmoÛ6þî_AäS ,_DŠ ÐÝÚmÑeERCŠEÇBeÉ•ä6öãwÔ‹-‰’¬vELšÏñøÜñîxù² ˆÀÏ…ý¥<Š•Òh¹Y|©ç)òⲞ{LÂó0hƒºSÅ€i`Í'øÕY ã5ú´Hý±¸½ƒ5!"€û¶ #ÂKQ׋-Ýêðù)éGÐÃⷛů¯¢ݬŽs‰•–Zk`TaδýÇÐÍݞߤiœ£Uš¡Ì¬Lf’¥yv‡nÞÑLc®,šÂ~¤’%iar´ ’àÁlLRTøW7Î8!X=5Ê>tT—ó}“¾+Âójf*‰ö«Ž"ýaµKg¦:Aõ{TeâhLÚ »^ød”w@écŸR­}­á+¬:.D%ò˜'s<×Y˜Õ‹`YNeõáuÿðžr.Ýź:±elˆ.é^´—Q¾ƒ= ÐÚÄ[´1y× ™G˜’(y@ÅÚ eº{âZüQµa½ ðzž&„rZ+–VÈ!¥ˆ»5«am9NÀ*ŠMlÌ©ã Þ~ʢ”GLwÅvW "EÍ!½Ò°rä˜Ô_"TqWî,…¨f"P”ä… B”®¬Vy‚Šs-àC„“ Dûº¶ÀÕ”œå§,àæZ@ÉðÅvk Øÿ €3Æ,Œ¹‚giÄÑ6AZÚëÓÖp sPâci“ôd%Ú&·‹|k–Ñ*2Ù)Ö Èõð×%tÒÄ”‰Ý€Å 4ÌÑåŸo^^¢´üþî} ♯±Q’~½c%Ÿ/Š {0ÅIuëuŸ! >έڇÏÙáã&ÍŽóvÃàÚ8?Œï²6&HŽ_€©˜µ‰Ž²/‘_Ž# ¤5zñ±=z÷©=zûº3ºêŒhkÔ:Èå[vÙ«w,/ÒëñR%ÇÍmã}2Á4à•Ô³EV픯ƒÍ66 dèö3pâ{„¨­*OFÈUÇ]µZx¿¼ì¯µ"9 D‡Rƒ°´iéœÏ)CÖÏßGql2ÈâYâŸßGérm6Q^dûÉCz¼¯Ñhˆ³Ë{*!÷y\Õ%ê:²nsA Ã×9®5ó 4k kl†6bGål ²loÃÅØú7/[ ¢½k±n ƒÖçC)ÝškbH[ñòr4ƒ¨èœ2*‚"J“ÖÔg³°·/{t u†,Q¥¢öT à[š…è¬mº³¶S³žSƒ\̨¯•OäÁ7,…3ð'&!<ëZ£ë}’nó(Ÿòµ‚f6­z|p'ÇW4Yº˜†ߎn§ö}€qꈸG·¤P¼N [›§eJ%PÊ!EÀ;ÕEpäãǶ±‰AÔ'ž`ø»Y PðN!ÀyLQðj|{¥¦ó(ÐûBÒpqR›ÂGu`™ÀÏ£€AQ¢¬—’A!M‰>´½ð0ÑZ .Nm?±¿‚ŠFÃ-…è>´ÿr| o9ËÌÞ^¤ü!uŒUSð6ÿ̲—ðÒò•ÖÃWrüYÂ}6œÅ‡G¿Ï(†ˆ€òÑV¨ã) ’ó8úû™ð8„\ îEÙ _^ĆQðêïÓ߆Qtw‡n'ž”xX+[)9€žÜ2…5¼ŸˆðôaŒï¦²‹/€ð<õËØäË,ÚÚd9UWp ‰‚†Ò¢~Єa™p…„"»ÉúÕÀ<ðЍRu5Sõ¸Ã(9~ž IR,…}Æ«ý§YRbÚR;9Âr—AR'šÄ‚S§» h)?<š óÕdA|œ°ÚR½êA¶K°[µxDõŒ‘ì”ZPÅ`fS‘ÀS#zHàÅNÕßÓXx'z´.U®JŸÈçöBÁ\ý“DŸ Á¶â¬?Ù q0;þLóÞþm»Ýu–îÖSWdHÛÅU(]§>ƒ?ŸÝpR *ÀHRœ¬¶,ÉÎú“$;ˆnE5Á²=dó¶D®ÏÌ“ (ó$çRƒ²¨‚“ºëOÔEt §‰î„à.òÚÄfYT-ÄuËÂd¨WþuÀ~%Ö×,(ZÙ ¼ËÂhU¾u ´ÊÒME•Y»¸@o^_¨Ù|yFmÀ#þì&)”=ÌÿÒ%Šae«~ÍÔœ6©»þ¤)ÄìF)”]äÏê”:‚ UêÈøO½RITðö•S ÙÁ]Ê.b®$ó{ÈŸÕ/u%ÃÔ•1³c:˜i%\UÎ!×RíÏnuIpq&T;¾ µºÜeã­.iKéa‘#­.Q7 Ä¥øq·þõañ/@xØš endstream endobj 1685 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 1686 0 R >> endobj 1687 0 obj 1763 endobj 1689 0 obj << /Length 1690 0 R /Filter /FlateDecode >> stream xœÍZÛŽÛ¸¾÷SA/`Ì’Ô‰*ö&Ûd‹ô&Ig‚m‘ ²EÛBeÉ+ɳ3@¾u¢dQ²7WÉ ’âä$ç÷' ?kýKºœJ’íqõ{»ÎI ˆã·K£®ðsˆp©ðÈ‘Œ—<’f8Ý¿F{1?_WÙŠ‘¬¾>bOLàþX±ä5ªûÕçoíŒ$þÙ¯~~XýõpFvFÅŽOeè‡aJêˆPÿäáH¾¾~Èó´$»¼ …Ú©Be[õæ‘<üÓ@‹:RCsÐcàQ“,¯TIŽQíÕQeUÿþa¤3‡1*4•}±“ ‚€²KSÄ—:ÍVŒúÓˆ‘ËiCe´ÒHÐüže™M8fC†§VøÃ07o€~@ÎÃ0C|¢rdBÜKóÈ75¡ùê¥/¥v¥ö6O‹êû¬¤‘Ô¢"l†£Áþc®Óúæ!)Éâ ê’×ÛüxÔÞÖÍÿHÒ´ŸD±ùPT?VÏ•Êbe>6¾ÚÍ’¬6ŒAîZK>)ö6‘„T8’1ß §üîòœIÙ¢"{›œ"` Œ¹Uží¹@ˆªÒ—~¥T©ÚV 㨊6Q©h¿òagÅU«â"ÖáŒÆ<ŹŽp¤<©m²{!u§Ãe¼‰I} IVª¢Â§*9ª²ŠŽ'«üUÉ6JÓÚ»C¸©ƒߣÜ9§³œ%p Ø„ ¨aVßzÐýK–ŸÊNñvKäLRÃÀµÑ™”t-0P^àÑ€¼þ:KK†”ppÉ< ‚u§nÈÚ0h“v‰xàPîê>Ï»hp< @ ¥ôq¡"á® \s-Üâ*·Erª’<[*y9 Ê=&¼¶úyǺ>EÕÝkzÔ·¦Ý§ºpÕƒe8!åGá¡ëÒYÖ¶/ÀvüåFÛú´ KQ=ÿO~îöE]YÙÎÔ“*¢´i'çY¯•sÖa~›u>¼³„D«KéU =©æ} Þ¨P$ÙgyŠúœ|I^ÀuÇe-élú•Ì”²SšëÿÎçßP,A’¼6$ºd¡nÜÝjµeûǦkFÐÑè½ö®F÷^­Ó½Zà_-|fÙ¿üúË)Ĩ(˜i— á° ÀOÉIÕG4r:WùyXŠ `Á×y]òÀ‚ðZy"˜»NoU2òNà!–{¡¼Úh%Oö_Uòb\ô/h^xè>tñØtU›ï=ùVI¥G…ÎYBð«•¿–t²ÿª¤ˆq}¿ )\e y_÷Ð k”]8kÆÛCTD诋~¥#Ó/è»Ch’iÛìfZƒæÓÎ Í–ú²£Ýìêd>îŠüh%«]tNÍÆRUØ£ý¿>Ü_„D(Áaá…4ƒ€­y@õtAº s›IT‡Ûv2TH³R¢ÊÌ? 3Kómß»i²I¶yödVÊóé”C>¾A¦ñÎ0‚I½ë:4„ =‹€Ç^ºÖDËOj!=s—¢£FDEá5Egj  UÍP¶²²h^ð Lym ’×àOQ’F›T™¥N¿å·7wƒÕç­:Ufþåá—5÷ˆê«²ÁG´6f6ño3}³²ŠâÅL[{ócVêÜl¶Zdvœ ™OEŽt[j4IVVÅy[g«;mŽ‘1‚C4™`¤ï 2¥ôež–­MÒ·$Çñ»° |Ô‹Ï $ã ˜wIyJ#}vPé‰!A´WD=c5É´0ZSm6¹™5´i ug}ñq­CE¬œî¿+§º²2uø¼ t#8†üµHªqòÍÉmw§^Ñ7OSÄ7±ÄQ(-à¨mIE1K¯²ŠÁä­çàÂ1=—…Òã]ΚïqÓý×Îa qó9ÀÆoOˆ]ñ÷„olÝÑ‚ù&žãK8†Q‚ÏÚÏ«ï8¸­¾¨o˯6ç̲ÿê™L L3¾p c(SC¸Tô³÷…@=ë fhÑ~ö)GDlc½ð¥gUöSÝœtãWER¾êgߺ2àÛ³»ÉýîçW†ÒGfçY2$Ñ“¡YåÓÐîòB3ôqúU'®6í…¢Á¾i"|ÇmÌ<êßShzˆ®ƒÆ=èÛ¬ùk Ètÿ5™BŒ/1æÄãâòS‘?%±Vh€æ¼)šÑ°àkV:*ýªªl81[ë¢[7¦7ïúY™÷CEër±[ÒTÛC–l“åºØiÙÈzÈÞQ•&ÛþbCºsÈæ41hôLÖ'·è$&ñ†“ŸÆê¨ÿÎáóêÿz"g_ endstream endobj 1688 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 1689 0 R >> endobj 1690 0 obj 2319 endobj 1692 0 obj << /Type /Action /S /GoTo /D [1688 0 R /XYZ 72.0 724.442 null] >> endobj 1693 0 obj << /Type /Annot /Subtype /Link /Rect [ 147.634 543.593 173.174 552.593 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1692 0 R /H /I >> endobj 1695 0 obj << /Length 1696 0 R /Filter /FlateDecode >> stream xœÍÙŽä¶ñ}¾Bا]`Z!©ûÑñ… 8öŒá;ƒ@-±§•UKmQšÙüñ)²(‘:»ã§õÂV5«X7‹¤~¿£;ù'ö©lj“î~×xêDÌñB ˆë³€Ïa¾ËçäŒQS=`ýþŒæ|t~»«îˆóãݧg˜“;èÞîÈ sÅêáîgK6=Æ_“|Äy¹ûëãÝ_~JœÇƒ1±ºq&I]%ò?æ<žœOïëºΡnœ†xëŒxvÿf¨Yâz±¤¦°™§UîTuË…sJ«ô…ŸxÕ"ý÷#›y„¸ñ×f²ŸG"BÈEQä’i(Âÿ¾ë!0ÈQþ4d â*# j€WE&3‰‰-ð< ¿áÖ0ŒÜˆÒ$‰’~rãQÑÐÛŠ˜¯F½y°0)× u2ÕÚe¶RÕ0D]ÔtÁD0-NÔtªsóÈw>8>sCç}VŸ Çr1 ÞŠ²€4χq{4TCVº¢†(h«l:ÍË’" Ò>&Œšs)uí6…Ьœ—%íXÈ68¸ƒ<Û’4Þ›©©uV¤-Ï­©íqÑ àͤÂíå4’é‰1/¯9üñ'³#êzT95™“IUvaâ2çý÷¯¼¹pPÇ ´:ê„õJ¬qæYq(”võš–2Œ†•OõøF§F¾Kƒ(ùÔió}ÎiW¶W½ëEá:«eGú¥çsSŸéÀ¹goo/s¡ MéÑ•k¾ŠF´| ZÞ¤Y[¼ò§æY÷+lÀÀyÚ¦ûTX˜Þ‘í­_À©6_¹]./‘QçEõb0…0cÁ-=Úzn¥0[›åÿ0ç0Jbmí)·ÝOë’…„·Âq‘ÜZ—Œ~Å °ìõóóMÊÇp•-hH’å›õÅ“pƒð&åÁ‹5.–fÊAu»²íf…ü€PÏ÷6Ã`£@C“î’*Yò½Ø(ÐtƒðõX> нh«þŒú²º®3¸I}ÐÎ{ŒPºÄb·±vnÞ¢¾–÷!v’x©‚ÕÕöÄg[ nRß÷ ýd—•%ïÿº.½¬‘a<ž/ßUzÚ¨ZáœèÙùäl¤tA!tÞì=§Ý.Ý u\×}Þj­Ø;ã©Åw\dM¡úþÍ{Ê\¨‹„DD÷äßäêZg'Ã}8.!0ºÑ8³ †Ë|Ɇ 8˜ãÝ b¤:‚·fí´á›´¼ü—çËB4'±`?žØ >HëAHÑ!Z‹¶@/ Ícþ69}9„˜ÁEÖ¤ªm€ƒk0­ER3ÝD"ª3q–%I«-©êÊæiMUv±æMEÚ($ÓÔÔùÊ+ë,•…Õ`ž¤ 8¡eiyoЯuÙ¸…(„èlX´iÓžÓþôÁ¢Cp!Ž,!ÃäÝ—c{*ß©o«RG¶¥ç¶«;á(¼ƒêÝ;{^–BÅÕÛ‚L—‹*+»|x ¼$¾|C`pÌ èõ›{’ùükA2§ÝÏo‰|¥þ£×K?ëhMݽ·nx¤ùåhòtÎðÚK#þùÍFŽb×K¡~\}š“FžÍ¿jäÅønÃÊ ™P>¨çò ¾<çW5 ±“ Ÿ öš®¿Â¦óù×4SŒßÚÖ5 ÕÆ”CÑÙQ¨ÞÃõ†Cw!¿OÀ]GaF_YH„Þ´g¤êru€¤ÍO34Sô×jvqPºùñÐÔ§ÅeúzXðVn}î€øåãüÞ^01‚ua±ƒT•PÝK+@ﯤÕŶA3œ|ûž!y/-°Ø°7¾Œ®È–O “µxÑü¦Ë"üBl®àiPGîþrÑ×g¾qͪ¬X’„±·ÀΤ@›ÆÖmvv–÷£ '}€m¯)4}ºATo_Ñ_6Lîö–‚ÐÐb¤/6‡¡w5ˆ‰Èv=b²´Ñw°ö…ßXƒÑW²ýÔƒd¢ó¹©3.Ô ¬¨DÛt™jiîÕ¯dËÔÂ^¦?‘Ÿ·È É N°UKÝŠ— &ݼ¿ ] TÄú›öÝ›i6ÿjAšQdB˜òz”xB]¤Õ¿}xpD{-ýȹDAf1 q„ƒ¢ü2Lõr&¶¸#Þj•.‰cBY4þX`]ÚEc’ï q.Ó ô'G^ž8îŠÎcòª´¨¤ƒ¥tz‡½Y0?vÃúJÚ ¶þ4ÞšM¿æ¬t”¹=ÚP?$cÂßš¢7#µsÛדò ùõ¡P_f|oˆ&lƒ…Ê,žæyÒhóúÿ˜¹L~oMz¬¿ÐKL§_õÀ”àf$þ˜ð›3TñüϹ €®›Iû16g|“DŒÐ ¶ H©ê];ó†úlýç»ÿ÷¡¬¸ endstream endobj 1694 0 obj [ 1693 0 R ] endobj 1691 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1694 0 R /Contents 1695 0 R >> endobj 1696 0 obj 3239 endobj 1698 0 obj << /Length 1699 0 R /Filter /FlateDecode >> stream xœÍÙr7ò]_ò“UEBÌ­79vR²7–¼–ËqY~’ 8ëá 3‡dV6ÿ¾cÌImžœTJèf_ht7º1ùóÌAþ]ò?‘çà(ŠÑzö§Â;(¤È Ê'Ø£>!.¢¦>Ú£.ÊGðØ Ú®àO‡àú|–ŸôÛÙ×o@³AøžÎÈ„p!êãÙË6EëŸÉ>‚Î^Ý]üê#‡ »­q±à(â8FØ¥1ÿ‡¢»=úúò®(² m‹•lËJ–¯Ùù7t÷ÖpÓ»çv@é±'ùåEÍ*´OòäíY^Kþ7wŸ¹„àègsÙ‡Ž‰rabÒEøÏîÄFJä?u éƒRK#w ÿNšLÛàaþ4ÆM`âÐqâ8Œcø Gro.b~ší ƒ…r»ªT›û›÷¢AÒ-K¹ã1W‘5j‰´OMÁò>ý6eÙ&K+•ˆüXÆÃlþÈ2¶®Ñ9ZF.‘”T¸.Ìz½cëïØÀ×[‹n—Z\Å¡N‹ÜÀöoP; ÐTl³0`’eð˜¤Y²ÊXÏKVRZ?X EmÏ6–‰w³öɱWéÀ%.Å.q"Wº¤dU“q©ý2Íõ2Ñ«}!4K`]ì%Û±¼J ¶d‡¢4bê]b‹F¯Ÿ’¼Æúbý²¶8Ò¼ªY²1¿qOhˆóv}HÊ:]7YbPòPý{^oïBÎÒ åvÛuÕ¬*V[ˆbkõŽÙ|öÁ)œ4[˜é§P0‚MìÅúHœÓÀ›á·L±1²Ûu‘¯“šåIƧ7]?ËŒÕ5³=xÿòP±fSÜŸ}ïcÌ>v¸ V]øî³¾o3E‚uZg¬º?_Ôí›úЬ6°ë÷Ç"kö6"­ªÆ†pµwE^M4õ®(»äoo&ÉÿS4eždCŸQÏ'y²—Vüònxçñî3V5Îáñ òë'ðÛ\Í•àù©<`xvví±ê*LqÞÜlRxIÖbtU¨ÉbµI«C–[ð)­wšHD§¤bÛDU4þØÕ{-¹hêC#ë§÷ìRS‡âtd§³Ò…FkF@kAª·™´‹N6ƒFäZG–LSßDZÎRt’TâtÚIP¤»¢ŠŠõ-Ò§]ºÞPÝMP—žeš×ÌÒ¹:šµ:¬Kƒyï,,€ÚÀpõj¤À;4èùæêõݾ‚„ú²@ÿ¾] ïè_ 瓳üäËûÝYþî>7Í/Æ4 ¼PåÙt d„þT¢ 9ÒbvYìdªN×4<0èðk!VCP0Cº°†n‹ªJÕý&IÖȨ :z±~Q¦Õ Ý·ç{n¨óM‡úÇ £éì+§M2*wÉ£ÑY#‘º=O¬‚Ìzd%E¨)E΄;h„(—ÒWlË^òþËžrŸqSVIÅž&±C×…ÔW¥}ùi6Lô'ÃdÀÍeÉ/ÓMqØã¼-‹ÇtÃÆâ~Ó«Mº3s­1­Pž ©(&-Þ0¬›r q¡¡ªÐK†°…·u²õ.Oש¥Y´rÊüÍ>Í¡6—PAûÃ>w€÷PÕÉv‹x goÞ *ÝðŠí’lËC%_*–”ÐŒ–c0<)ˆêQL tg>ŒzêîÈNŸ‘ïõ¸®DGáȽª4‘ôã{Hªe–æL#“ò¡áO•Æ<¥–„•¡äŹ„†^–hÅmظµ¢-ÑqËe){ôÐnÓÌe±Ç”\æ#) é:â)©›—˜êÀÖ)ÜB0Aµ)‰Ä¦`3® U5$/n“Çíû– E8н8Љ#Õ¼ù‘ì홌ç3oœ äƒd[Æ®údà”Íj}Ù§å"]J$„’3C1 ´¼B²ÏYþ†.šª¼ÈŠu’]T;pÜ…°áb]UrµÜ–ìÏꈇ–oÐõÇ›eù1¨YVÐs¢mQ`(ͳñ¾ù“Ž“1ˆG¡¯·UWÍ "Š- ¤¢MÐÎj惡´©é‰÷`¢JCÓi 7„Oýó:.˜HTJý9¶ñ… °=ÌÊIy´q|€¬¦vÔÝ») ¶7øõ´°pMÅ/±ŽŒé+…ŸPäôì7a1y²cZ=ÂÛ4³‚ߦØÂÝ©ÝHH¿?´5uJ îÐnšC–òæØÂ™G…H«ŽtõJµŸ-An3#@éÆv°?‘jÓ<Åg©åO7‰½kq\#U"v{BdØCàÂ¥X!jvL=UH¤ºƒ[P M•…ÒÀÂ¥¹4©}؇29@Ÿãì[èk›¦ßlŠŽ=Ì6GOgÚ=X†¡#<â÷ñŸŠ8ÛK€ÏcpÐpy=±,³ïÚ»<—`âÀ䇪xm O®\¡ßg®Ïçå=€’çν>æÅ¡š¯”^èc+s¡†O(M¬!#o{èå×I}|:äm¯à Xn¦5Âì4ÃÙªžÎ‡Æ8ŽÇ÷â±M«5mLÌ3üßž±ù$ð+ÉݱÍï¦uÇñ§Ñ=­œ:.æ9Ä%þ˜òõô\#3œ§=Oi„.Á‹Æ¢F]­ÓúC2Ç®7ÿßÓ'@#Î}BJ1'ÓFÄáçi'¸f_~„Q8¶‹¢©Mã=Vµ=wŽýÿq‚ëÃqðó F}p3ófDfŸázcþ½ƒÿÄžãϱÓ>ø‹]ŽÔhÈ¿.OÛ³—£¿x½[Ö0˜°cü÷Lõ‚–íÃèkV­Ëô`^ÄÆ»LŸÝðÀ…-Ÿh5C8l©1ñUÚ 8ŸU£a¦DÄìPj;Ú’í‹Gèí¸¬J)0h²5Ë7L~\Öï%ŸZ8)’®ªðÐÏ>L‡ô Ô‡„Êäw”¥/îÏöqÄ·îb¹–Çq4ö#Y×™…(r‹U˜fýd ÝY?X­»DðIta)IÛg ¯,}ºK‘{ùþúõ¥Í˥܋xÙ*Ê÷ÀÁvÝ£|€ý® 8Üjäk½_\¿^èµüN$–+Ãjlï º|ÿË»K Ã…ÊnÃøŒƒÞk‚<×ÀQE‚`aÌèMêO…QÏSK*ÞœÁeæ·Ñ ×"&[@¥±†Õ0'ù!O®WlT˜èñåòR²îÍ+‚qÔËë×ò›‹â”N~ç:­ÛÞV"ÀƒYWŸ.Gü“žîÕÇîVW¼>Ê€kþX¡¾ IÄå»Ï—ºo{ÖgrÛjTb*`k©xû륭ñíMtº íØs`e óÙZ|{1iÛdY×Àþ«;x) ´ç¥dµ*Ùcšðv\0ñÊÆßùþ΢BŽx€§÷çs6´G> ‰OŠ¿A;›Ÿz‹ <(ÓþÉ., ÊSï¯6m§Áš~Ô üX³Ü¦&ž±ä)X–Eó°›Ñʇ#>{Ä‘vDlïˆ7ÎøÜÇì ¢˜:qB?:9Fp7èO:sÀÑf|{=Ϊ†Ž<Û‹ÿÿæÃÙÿ”ç endstream endobj 1697 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 1698 0 R >> endobj 1699 0 obj 2677 endobj 1701 0 obj << /Length 1702 0 R /Filter /FlateDecode >> stream xœÍY[oÔ8~Ÿ_añT¤­×·8v%X +X-,´+錧1“ I†Rÿ}s™\gÂ.+ѪÛs>û\}ŽO?.("ð{n?” X)–»ÅÇz¢!.륀`ÁB8b³íP)@[Àt¬ÁGæôv‘,ú}ñî=ЬÜÝ‚x6/·ºZ¼îðVÀøgâ ÛÅo׋_Ÿˆt½nUÌ%VZj­A£ s¦íC×;ôîì:M·9Z§ÊÌÚd&Yš‡ïÑõ‹Í4æÊ¢)œGð(Y¡$-LŽvQÝšIŠ ÿôº§3NV?›Ê^÷X— Ó¡+ŸÀ¼Zƒ•jGûU‘á´:¥·RIP}zY&Ǥ˰ë…? s~”!)Õ:ԾªçBTSóÓˆç: ³|,Ë¥¬^…Ê ºóM%±Õؘº¤h—q¾ßF÷(B³Ý£És7d>ÃjœÄÉ-*6-ÓÄá ×Û·¬óo¨Á.Z5Œ¥rŒ)â’£†h‡ä têÖñÖ$ÑΜ?ààÛ,.L)bz(ö‡)j„¥a¥GL*ÀÀ—UÜÝwCT³‰-Pœä…‰V(][®òb,ε@€ƒqˆ UàÕ”†Ô§ô?¤Ÿ«~öq÷{ý¿R?è‹1«;Æœ}gñÃõïÐU~<Ú@ˆ‹i;¸ÊCP¢àŽ’ó¢¶«MkçùÞ,ãul²S*£±}üU ½GibʉnA‡p˜£‹—Ï//PÚLžüq>EÛƒ™Ï±`˜†p¥ò0¬Nܯɇó"ÊnMq’Ý@ À »A¸qÏ,ÛÇqvîÒ¬]·'ÕÁùq~Óîµ3QÒ~¦:b6&n÷¾üÒÎ@%Ùã¿»³?Þvg/žõf¯z3Ú™u¹xÁ.•ŽÕ‹”½”FÉqi|¨L0 8¥’.¡+ÌÓÏÑn¿5 f,ð£˜rpk~te„\~\2(ÓV7Ë‹!­Ý’sß–àBt,Ë8ˆ•ٚ”v-ôeÈâÑŸñvk2{ï!«üG7qºÜ˜]œÙý¤œ"2å½á,9è?àÔªUº‰­ëœDÄYàÚ…;à«Uì·s{c'VªÎVë,Ýy(ËpmÏŒ²ìÞ^,ãÄÏ/Û1h«%JÛqÔev»Ô\2±Êà©ÇpAŒ;TE-ã"*â4AÌ=zÐÚë² n,×ðÝ]š­Ðƒ®ýt½› ¼›Ãõ«%0¬ë#VGAÁ¡Î¦’¦ ê ¸ºOÒ}çSÞÂÁ[8D‘Ôw–›ÉÎjBõÎÞyÏö°ð²QÒÝà|å?~\{°?7SÖ±+rTD7Q>!p('àïg‰® Ïî*[¹²oügëpØ=Û8ƒ'€pÇ*Œ¾ôΛÎÑ<Ó{U3!ÜêËÅ>¼cüèŽð_çØ€)‚u`ßÕbÌÿü•8ƒrÔœ¥à Ôˆ"¡l²…™÷|Îà ô÷ª‹j%FÃÐ_sÉ'€sÔÀ!Ù¥´Òld‡SjP1úÑï;zøòÅσ`®Wé ¨ç—þ㹚bŒ¿¹IƒaŸì+úâ5 ÐÖ/PáÏ×þwŠÆö­D¸ Ò!nâÅR¬¼¸8™´%áøÛ·©DjL¸Ô*äõKÛäË,ÞÛT:U©B0 9$æ!xY檲ÂYرL¨&æ3ä±U•ã«•¦Ê¨fwð4ð@ã•IŠòÒ®M7gX†!¼—t0Âå„KÁµ6…loJ§^—‡ ª›¢]hÒn—®Ì'“EÛSº©zÔî}¦v‘­”˜-™L=è–Sv'õ j ˜Û6Ô˨, í°|˜°²¾+kNÖœ¸ž¾L+ 3y´XE•äfy(âOͶeUhÕû¡žLq;"­íUö¤r”EÉmÿ="†e½¶e Á4ð$:Lú³âm‡NJÔžR PXíÓäiŽKpË:6þ0ÙwéO9„‹˜Û …ºo€üA rwãïï»{ü§9$?Ì8\]B6v˜l’»ô'íà fÛA‹òGµÊÝ¿¿Yîî1³]^þ'îõâ°ço endstream endobj 1700 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 1701 0 R >> endobj 1702 0 obj 1833 endobj 1704 0 obj << /Length 1705 0 R /Filter /FlateDecode >> stream xœÍ[ËŽã6Ý×W½êU %e—A&ƒ Étº€,µPÙ²Kˆ-¹%9Õ…™ù÷¹õ MЦŒ^tEŠçò>È{HŠõùŽ"ÿ=ÈŸ4¢8M3´9Þ}ê)Jâb¨Š ŽXLG,Â,FGdVÅèýOðc´…ò ú㮺#èwŸž ÍÀ½Þ‘Ὠw4݆ðü-éGÐþîowßÿ#JÐãnv18ÍD–eàÑs–É =ѧ÷u}hÑ®nPS슦¨6ÅwOèñŸ3še˜§M¡?rÏ«-ªê®hÑ1¯ò}q,ªNáÿþhøŒ‚ÓoÍe aÈ%I‚ÉåP„ÿ#ÌUÔ(‰ò•¡ÈeQõbÔ( Ôï¢ÊÄÒ˜è Û£ð›QnyŠ'”fY’eð §Æ¢"õ˜oÆ<{°0©×duviu”ÊÙKS…P¶"„.f—V#˜ˆÛçÍ—-Aœœ~‚À?A/ä}ÿ3¥–×… Øž'v0çkÜ”-â(~$£$—!œ]ö<¶¶‚ ­cˆx§4²Ì tôzˆRÌÐûM}<ÊÄ1U¼–‡Ã\jŠcýW1—»—B9d)M¿ŸŸc×ÔçýË\A‰ÖÐP€ í…&ùµÐÓßt/u«©u(ۮЖՂþ»ò0$Xcýˆ¨Ù/x]ð##àÊXùqˆÙ í]þψC»¦>¢·úÜ SÑ´u•æ|¤òxŒ'G”òHÄŒÈJR%n_tùùÁO±íòVý|Ѥ )”2œ&”6LüoU}jGkÜ <‚BÞ#ªï{qð%.Hï}*`’¿ÿ´ØYšà,ƒ9Ï’Ø!âa»Øe–ù€ZßÓL%—"(XÈéÅaÎÚ2¶y—?çm±¨… çÁ?9€B–ÎÒXÍq‡^–»O2ÒèÞÓNàr˜ñÌÕÿf±FR2(ŒÆ0g"`%áBCÊZV!N|pÝÿ ŠŸ2V ‹»¼Q/«’Q2ÌŒIJ4r ¨úÜÍy̵à䙾Þ\P,çeÌ96[V%á>d7x YšBp syôš7"Æ|ð§°éO,ÃÓŒ8]ðë²þ2Fâp(e÷é‡z·k‹îiynsæ?!Ï<†í’‘}h=iŒûÈ“@ãXK€¶7Ǽ[îfŒý„þãéš‘'©Ì=,s€ÏUùå¡)öÅ—ÓòŒMN2è?#—Ýÿó2¤Hq,û<š²XÎT‰ ²ž!-¡ éë;”!-+ÒÂß¶BÒß}(CÚý‡2äm!0Ò’±Ž!½.¸…!mo„2äÞ0Ò’±Ž!¿‚7L†´½Ê·yÃdÈÕÞ0ÒöÆ- i»à C‚ &` CZàp†´ Á i!ƒÒB®bH‡±á i×3¤m·—!a8ÚGbÞC.;9qAV3¤-"!½}2¤-cCÚøÒá@†¼Ò} C:údÈC`0¤-cCú]pC:¼È·zCgH[Æ*†üÞ0Òá@†¼ÑC®÷†ÁoÜÀø’Ñè°‚!mp0CÚÐP†´‘¡ i#×0¤ËØ`†´Á×È1">ôrä0f`®e"NCÉÑ‚¬'GKD(9úú%GKÆJr´ð·£íPrôwJŽvÿ¡äx[Lr´d¬#G¯ n!GÛ¡äx£7 r´d¬#Ç¯à “mo„’ãmÞ0Éqµ7Lr´½q 9Ú.¸BŽQzXCŽ8œ-h09ZÈ`r´«ÈÑal89ZàUäh›<‘£ã‹e¿ëä$K“xøŽúSÑnšòÔ•uåûþÍ2†£Džá¦\/º¦,ÔWm ˆ¹ú²<ÎÝKÝÌå*?ªܪؽäÝ\Oo^ô—šTðÆùk’À7MѶ ð\çKK攉ÈaÅ_sN|èY²ZPsnš¢Òl™ÏU¿ì4?Õö% ` §ÚŲþ;~³?‡nTº ž÷å_Eu?—Gs…kNÄ|Zv¯àå !¦Ãu ©i: UžÆ…*Ž÷&T鹘ŸÕ}͊חR U<æosAïÁxQÕ[üë0 Ué­>k¯òj¾L8&‡DlÚ{å“>Å0°€` ¹…Žã§rä«ÖN5jd©çå 2ŽÉò0ÉjÊcÞ¼y2jŒ3ð$>íT gÝÆp¨RéVúX·ÝT ¤~ż–»éQÅbè$¯f|WO‡z“w3:ŸžNççC ï [øCÈR;„¾oNGEÃ)r`ûéÜ“óp'GËK “8’³‡'nM<ÛJ9f„Èí‘W“FÏ×}Ís]ÿ9—†dÝ?ŸŠ¦¬·à·Ã\WlËNÅÛeZ ˆB©FǽÞ{*6¤¢Ãð ÏÎH‹—xÁ'_– |"’¼BxSZGÒš½HÈïoåÕ:ò€=tË,ã’è6É”Œßz¦¯;aÑ·]¼-ÅSH¤L^3$ÉÕ- ŽöžUè;ƶeáB¬y8l½Là¿ËSäd‡ÅíéÜ¡é²ÚòLºG΢”&W7P$òÁq “#šbžE°Üâ«;wp²Ýþš“m„¹=_ör$×ò#L¢r÷Ö;zZJ„ZË;°ÉJ85wè Dtù©lOàÔ½‡únó}`=rÈ˪¬ö½nCð‚UKpb †ŽýWo .›_ Á%Àµ—ñx!KMø¿$òˆ€ú‘âÔsu>>ÍT¬wÓ#$›sSõw*U…ŒôÞâ©æ—¹µgIË`©•F„ÄIdkÖæ9tXXâéôKìÔyOßêñÜj«%¾z~~››wmqØÝ;ý±+›¶ °ŠËŒU‚Çk­’“;k?®=‡HÉ¥çEâ‡XÇ”˜ø¼éI“‹²>ˆx®RËw®-v†BÝ'{E¢ÜX´9raJ0Î!°a·UPÃt9ª°L[ÏÝëÛ>¯Ó†ç!Òc[í¼4|¿`äß«ò¸Ï‚ê4b­…\nãÁšÖÓöB•—b̘)¡ßwÀ~ ý³<ä6C®n¤Uñ¥óQXÊq$?ãÆQfK½2©‹SÔiÔo~yfæò¦³\Í_;„Äj·¿–Ym„<Ù’Z_Kªq,.4eg®!j4ê¿ZN¥ãžÊ¤͘O*+Øæ[)ôj»-(‡$Å,¥YÊ¢ë7> endobj 1705 0 obj 2800 endobj 1707 0 obj << /Length 1708 0 R /Filter /FlateDecode >> stream xœÍZ]ã¶}Ÿ_Á·l€†_¢È},’-‚M§3E¶S@ã‘m¥¶äHòîÚþ÷^J¶¾Hq(u6ƒÀÍs/ïá½<Ôš¿ßPDàïÎ|(A±RmŽ7¿_ú)ŠâòÒ,XDGL`¡#wEè˜aƒ][ð1 Ï{ô÷›ü† ?Þ||‚1/ˆîó ™1Þ˜z¸¹Ìí2ÚßÒüÚÝüáñ懟#D zÜös‰•–Zk`Taδù¡Ç#úøî±(Ú%*ÓmZ¦ù&ýþ =þ¹G3¹2h þÈžä/(/ê´BÇ$Ové1ÍëÿÓãˆ3NVße÷£)BÊÅqŒÉ4áyÛ=­EóÕh"ÓÇÖ˨§ ýœ2±fL†¶³ð›™Ü|ÊÇ”jk _a5J!*µ/c¾™ðìdaf^]Ô¦:ŠZ D)ÖqL4m‚ýµÒFë  PªŒMx3þ¡8¦è{Ä$èÝKR'ÏIÕw¤ù.ËÓê¶ë8dÿê¿}¸ÿ%«ÓþË—¢kBÉvíê|:eÿü·<ûrWÕ¯‡ÞR™î·¤ìý~9•iUeE^áWMwˆG¨I<÷¿ «µ”åU&/øÊ ŸrCPLqÄ ˜b¼µõÓ—äx:ttê)D(è©1+)[ Bh2I)íQ°¾›KfxıPPvB^{ÜgÚÇ£Ù¶?g‡ú\BŠ ²ªFÅ%Ðw™ªê¤¬³|#ëý” ¦(&V#޵ÃÓ?ã— )&`›°MYÕª÷)Úf&(Þ”¯DåÎÅ—h RJê°8àúb휬qá3ƒ½«£–‘Ô—kÓQó¹Æ`tœÉ5 pɵ(zO‰o‰+_b1a)BD,‰u*³¼®šlyGyr„̹ޗÅy·j‡•Î&•Î$Ä¡ ©DÈoÅ-2Ûöƒ¶̳a0%°ˆ`%(z»û¼æÅ©Ê*œÄpÆU'×"kœÏò» °)Þ1FqŒÞ}œu¦$T$[Lb‡‰»dÖ¥V>àSsJt·/9œ¿Ì:§`y8ðÝ¥*±MHL…ÙÊâY6®27?…XžB~ˆÿƒáˆBGÜIÿ~Þ½Ž}È‘ûyÿ¦ä˜9dHêr¿™uÏÌ v´Œ)Ø¡À(w-À¥çg€S­$q%ÿ€ÿ­SC>Jb×|îæ«êC±ÁI„ãΤļtZ6Šsm„h~ "öÁ—³Áe„Ô·ÊY›¿ÎO^_<È06Ñ4‡ g¿Å†0ïlóð§°â\cÈ2­%Ñ. >ÌÏßláTO‡ì˜ÕßÛm•ÖOó•Í™ü„<»ˆ ˜åä ¿6ô®š÷§ y¶Ïäw ïòǤöì^Ô‡~Bÿö¸fDàX™I`Ú†“=êç÷ A|hô_¯. †ÍžßÌ»Óå­W—-Èr]¶L„ê²\¡Ë¶ó@]öªË–…º¼–€‘.Û „ê²ß} .ÛîuyÝŒuÙ²±L—½¬Ñe›ŒP]^ÇÆX—-Ëtù+°1Öe›P]^ÉÆH—³1Öe›5ºlSð†.GbX¢Ë8\—-h°.[È`]¶‹tÙl¸.[àEºl‡ì×eÈm¡c­¢áË:õê²Y®Ë–‰P]¶€+tÙv¨Ë¾ÀCuÙ²±P—×0Òe›P]ö»ÔeÛ} .¯[€±.[6–é²—€5ºl“ªËëØë²ec™.6ƺl³ªË+Ùéòb6ƺl³±F—m ÞÐeH§1`‰.[àp]¶ Áºl!ƒuÙB.ÒeG°áºlé²²W—ì—‘ŠÌOo]f>]¶!‹uÙ6¨Ë6p¹.;œ‡é²7ð@]¶m,ÓåÕ uÙÁ@ .¿á>L—îÃtyåŒtÙ¶±H—ý¬Ðeº¼’‘.Û6éò×`c¤Ë6uy-C]^ÎÆH—l¬Ðe~]næ0,Ðe¬Ë64T—md¨.ÛÈ%ºì 6X—mð]v„Üé²ãGiU¦4üIu¹ÿôcZmÊìTgEîûÑ]ÀfK NÅå7ú¿¦u™¥ŸÌ5»XaŽÞ™ÛÝÃoŹ̓AGû+|÷Xª7ûá—³ýõŸKGs§ïómt>R°Ikæã ²9>t?,Ÿ™þæ\–i>ˆõ*̸ïzܧþR„ÝdÑ´›»OSŒñ'"LÑ»æòM÷ôœöíf!Ò—¾£.íý`ä`ÛŽäù¹L?e‰I¥ÛÐö¹ æ™hËócVÉ+JÐ>=œìU²KÍEìC’åæªoS_íâ]¦ÖÜÊ¿¿ùe7R endstream endobj 1706 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 1707 0 R >> endobj 1708 0 obj 2326 endobj 1710 0 obj << /Length 1711 0 R /Filter /FlateDecode >> stream xœÍÙŽÜ6ò½¿‚ðKÀÃ奃yË"ÙE ÃÙ‰'ȃ1 ¨»ÙÝŠÕR[R{<ØÝOQÔAê zöÉ30†,±Šu±ÒŸ7ø½ÓbAqK´;o>·pŠ"†xØ‚‚ ሠÌtF.(@àØÖà³æ'ôÇ&ßôÏÍÇGX³Gðž6dxCêÃæÞâ­]ão‰?‚Ž›¿?lþöQ‚ƒŠyˆcJ)A£1æLê†Îèã뇢È*t(JTªƒ*U¾Sß?¢‡·6“˜Ç›Â~d„žä{”µªÐ9É“£:«¼6ø??8:ã„àø[SÙ½Ã"¸\E˜Œ]þ Ì †¢þä02žš]ˆ‘Àü]d™L8&6ÃS/üf˜[vÀ0Â¥RFRÂ';.D#âó˜oF¼©³0ÍÁa*[áåXxOÝÝ{#ñœªÈd5êÃÒñjœ×gé9­?þP•ª ²¶ÍÜnáôH¿Óèè{t˜¡×õI “üzÞªr˜‡a\ªúZæj?@öI @¿XËb1ˆX’ÇR|†ÁF¾E²Ð‡;ìžVÃøZÙl'Y6L¶ÏJ]©ìðfA7‡´¬ê[¤æp )¸—`/•NPî°ûŸØ"ÉF¡ÌÍæp²¹ÁÉ“³jT¡©ð¥&Iñ24ãV|3).uZÀ–Äc_a2B‚M92Ž»l`Á=ȶ$Ç«NG$µäìLÞ®µ¾<©,{³ doã5 y iFyœ¾XBÔ—‘‡í,Ĭ‘ŸRðì­BÕ§ôrQû7Hgo-_®¾Öž(Ã(Å×õ“SÚ+ÇQøpQ+rìý® ^Cˆ¯a€¯iÐÒ½+|v²|-ÂNi¦4ËkÁÊ ñ2­U£óâZ_®5ª Ô )š.ˆImåMèÞÄ•ÌC¥yU«d ¨WU½oµ€ŒqÄ4eÖ¥¸_}˜,_³ÀáV P¨7\ÌÁ÷[¿± ŽYGlJù&ž¡>¶*à3Í(­_nÊ)–T˜sg,Rù,2]¿f’)tç¤^µÄoï7õùªš¸Êu%ö:ÙïÓ>™СÔkòÝsIs³¬Ã=ð•^÷ªŸ^ÊâKºoÒ›˜`Þî²­ŠìZ€¾¸1Ó¦¶1þ5²)u’:²ÁH¶]‘×Išë MÁ²O(íì˜~Qö×. íQØš¿*¡iÅì`¥ºe]YÄùšž¾ØÛÚúì`)xÛ.©‹Ò&ãÐÌÕµ:ªrFPí»:تúI”¤I8àò3>ÒÝÉš7™ÕÞ¢sŽjuÍÜïÅÔŒò‘.àÐìN:®8ÉwÇà u (ÈÁ¦tptd ‘÷Ðô/ÆB i?Ž¢Ö >gÍ= !È6­Ášƒ òcš«êMÈÒOÃ×÷ï o÷E?Ì‹ºW׋>ýüw0Ã]U?g¥Áí¾½!š6¥Å«Æ— Z¢ˆ%º‡:z.„ÛuõC“|øþšœ/Y¯Ó¹˜Î»Q¶@h®Ä/ƒøµßî~¯Õ$ù$£!ðÓ™³5Å8ªúÏÝ%è®è\ªÂ5T”ßýûíw^y‚Iö[®‰ay¤ï ¡d‘QÔ^^LI/B%jÏg`z@SNö³,5¥»™%ö§ê9/òç³EË4¶fÜž:3é´v9•µ ÙnKõ%m“µªª“²¶Y«OŽ%DrIëÄâí-Ƨ±_jµÄ|¤–¶¬ªé}Zª]ÆŠ¦òѥʭEŒ°ç’Ë™½lƒûëžPzÈØg…Ί€nÊT))£½Ç}zòœ.ÁbK³—9©`àK•V>oBâæž3 lf›‰@ÑJc+ê áãâf1S Ò³(˜!q·_ÜRJ¢µ÷réF xRgŽ7}â˜F—Y ðá?Þ¤€¦DÐö×9iF§åí#éÃt¶÷ì/A ¼u™ýwËí,‰}˜7™€ÑsG…s.Ô†±e‚ȇn«à¿7YƒN¸å‚Ïic¹—f’ú0oÓ†Ô¥…~^s±LǪE8—>ô—kƒ‡ÐÖMNšõÍå¾–G܇y“6x X‡IÂæ4º¦ Á˜ýñ¶ã)@§®e,ɬ Þ/ó¯ã((ÐE˜»ž;ÛœÍ ?"Ï9Pç÷Áh‚êéxu'ïÁôô¾ºÅ —1íxö †ú°Ñ|÷pDà(îîÒ&Èvo4{G|Øè¾„ ›I`;„Yþ“ªveÚÜùúj¶XfZÞ>Óÿ¦ê2UM3ª¯6»JÌŒ?©ç§¢ÜW=@·Ùý¤i\¬O¡ª7s§½2 Z#hh‘Z73 ¯¨•CBõ`÷û§ù,ç»kYšKj3ï0î!Í»æ…-qÏ•£p8Ü.ý=8ÔÊÕEíÒCÚÜý‚Ú{usš©¾+ëJG]3+o#@gFÒd£f¿_§¨n¼§ H¨º¤‚®fß̬_»§šb8vù!¿pÿ•^ÜËÛSY\'_´B}ÎbÍ\ÍõDøÐo½ êÄÈ#­Ö˜ZÇãå«*#¸e䲊CÂ]ă>;Þxó+ 0Ú,ŠI÷ pZeÜ×Åù)­.YòŒtRÙ!Œ$G¥ûû,Is}m¢yk wûEŒP¹òà–'àéúõ'Š1ÆËžCp.¿¦Òz3“áØÌM»lÆö;°8ïÀô‹…à{†Xy‹”Ïp¸öìEö7wfÜ= šY{I`&æ%¸E^‚g´Ó¿®ÉÇ¡òŽ TÇ1ë—Ê'ˆyØ¿‹òÓ›¢0f#¬îÖ³¹npž ¨µ›}/b&öó¯x‚"ˆM eÊÈÖÞ¡}ò` ØÀÒZº÷–6k­/ýðŒ˜ƒiWdäP&BcDHDâ—ËÈ! z°¬‚©ãR÷Œ¥¥Ñø?Þi`ÁÚ\?¥èwW*½ÈC-²ðÜüï ûÍ_ð endstream endobj 1709 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 1710 0 R >> endobj 1711 0 obj 2343 endobj 901 0 obj << /Type /Action /S /GoTo /D [1712 0 R /XYZ 72.0 745.889 null] >> endobj 904 0 obj << /Type /Action /S /GoTo /D [1712 0 R /XYZ 72.0 624.259 null] >> endobj 1714 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 625.759 143.32 634.759 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1713 0 R /H /I >> endobj 1716 0 obj << /Length 1717 0 R /Filter /FlateDecode >> stream xœÍËrÛ8ò®¯ÀÑ©Š|bn²c'Î&vb+;µ5žDA7¡!©hô÷ÓH")ní-ÉÁÝ`£ß/诙‡ü¿V’ÀÃIÂPº›ýÕœ{(¦Èš£à€†„øÈ 0 Ñ…(Ww€¶ü9£|‹~Ÿ3‚>ÌþøhVˆÀ½ãŒ\`®Y½Ì¾9º5ÿJú´™Ý,fïîCä´X[‡@PBH˜ û”©-vè«÷¼æ(+ö‡úÍŸhñiv·83Õ''¿š¥ßÎT„L‰ã“~i6¾9ƒÃQ}:S¤)g'Æó÷¢Êd 1q&Ï/£Ü弉Êó‹ƒO89Kœ(œJ˜_ƺa®P¥Wg4$bÏê A GÚÔÄ3¶¾ÒØ3ÖŽziPT‹mV¡7è:ŠÐ•…ê­hÁ/V¼–å©=ÈyUwt|Ó‚Çm–n[$Íe%Ƹ¥YÍëL¸=˜çõV6Ýͬø™UÙ2ïnlE)ÞZNŽŽV6Ï+iŒvM¥¤gë–Wˆ£ºäYžTíy*Pžýˆç9’ fYaÃGG’PàUnÀ“PÔ1¦ ô%ïÌ¡p®…„cSŒn·¼äi-J$ŠT®@^ÕrÞŒ…B1ÌBÅŠ$ml”‚ÁÄ燗®ö"ÍÖYª=Ù*ëZ¸¸upÊ Æ‹Ì Hȉbc?gUup°u6ªkÜd¹èpЕyé`M…µr­6Vˮػ£Ò©‘Ö,U$;QŒy„BKŒ ëFq3Þö¥Ü”|§³Û£˜¡«‡ÂÂMIyeGó­²pS`Qv@É8ŸWÒÂM}ÄvHË(+-Ú¦©#¶©ƒ´õÕ\vÄ4Eav~³þð“Ó8&$!шs®ï.N~ŸÅS7­l¹o†J‹¯Ï¬‰<‰Î™mD aîÏc(wOåvÄF® •*ªð ;uõê5éS®ÜìZÀ*[ëªÑº”;¤b¹k~Èkôª 6zý?§¸%8Q‘ȳcÜÇH]X4þçìö˜‡ÃD™çvx¯ežË£R:Ï`i‚ö\í¶})æHYnR ŒÅmõÓÕ«õB%¼âFΣ¬ÅŰ«¾²Ùͦ«|Í7éæ{ª±·˜„Þeº6˜êZã\òÜ!3{™ARÝ`zeOLBµ5rQCïr(UO€\Ž KþtkÿžœîÇþR¨Ü°ž;ôXé’…ŽDË ¸âÕÖýbÜÑ"zc´š¶ø]³¬±Õ ë¬4KtóÍ¸Ì =6#¥ûê|*3pYá¨TY¸gºÏ %0[G|ðJ©¹ë°®RŒÜ]üGwà“íÚ/fe@¡Úü€x<„G• Fy=:ÈT® tåmÕ¨%“˜zwË“Ânû„%q¶ZÛ’>»YÒ átn#eàf ÎW³÷ø´·ˆÙ4î44'&à ¼;è1ÈRŒrhi¨#Rpý23HóÐp3úÞvûR¤B¬Äjè–²sÇ@­qTˆ#<¦lÓŠFZO#ìÅÐw£²B_O/&“¡Ò=<~}Ö¢ IEUM—]Ã&G,ŽÃÉ Ò}ºÿ®áá%SðüÝ"o—šú5RËò¨8`ØÂÔë::ºOOߟǥ ìÓ¿€›ý4F endstream endobj 1715 0 obj [ 1714 0 R ] endobj 1712 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1715 0 R /Contents 1716 0 R >> endobj 1717 0 obj 2035 endobj 1075 0 obj << /Type /Action /S /GoTo /D [1718 0 R /XYZ 72.0 699.889 null] >> endobj 1078 0 obj << /Type /Action /S /GoTo /D [1718 0 R /XYZ 72.0 619.006 null] >> endobj 1081 0 obj << /Type /Action /S /GoTo /D [1718 0 R /XYZ 72.0 351.47 null] >> endobj 1719 0 obj << /Type /Annot /Subtype /Link /Rect [ 255.688 555.77 282.348 564.77 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 781 0 R /H /I >> endobj 1721 0 obj << /Type /Annot /Subtype /Link /Rect [ 290.429 555.77 448.459 564.77 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 781 0 R /H /I >> endobj 1722 0 obj << /URI (http://refdb.sourceforge.net/vim.html) /S /URI >> endobj 1723 0 obj << /Type /Annot /Subtype /Link /Rect [ 475.732 555.77 491.292 564.77 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1722 0 R /H /I >> endobj 1724 0 obj << /Type /Annot /Subtype /Link /Rect [ 499.373 555.77 523.273 564.77 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1722 0 R /H /I >> endobj 1725 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 543.77 244.7 552.77 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1722 0 R /H /I >> endobj 1726 0 obj << /Type /Annot /Subtype /Link /Rect [ 456.684 461.89 481.664 470.77 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1713 0 R /H /I >> endobj 1727 0 obj << /Type /Annot /Subtype /Link /Rect [ 226.012 364.97 252.672 373.97 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 781 0 R /H /I >> endobj 1728 0 obj << /Type /Annot /Subtype /Link /Rect [ 263.672 364.97 421.702 373.97 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 781 0 R /H /I >> endobj 1729 0 obj << /Type /Annot /Subtype /Link /Rect [ 454.813 364.97 470.373 373.97 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1722 0 R /H /I >> endobj 1730 0 obj << /Type /Annot /Subtype /Link /Rect [ 481.373 364.97 505.273 373.97 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1722 0 R /H /I >> endobj 1731 0 obj << /Type /Annot /Subtype /Link /Rect [ 138.0 352.97 262.7 361.97 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1722 0 R /H /I >> endobj 1732 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.765 288.354 217.745 297.234 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1713 0 R /H /I >> endobj 1733 0 obj << /Length 1734 0 R /Filter /FlateDecode >> stream xœÍÙ’9î½¾ÂMD·;ïƒ7š6˜¨YbxÈÊtUy;/òèêþû•oW¦«gÙ' ‚’dK–eI–œ|ßøÈƒ¿7ì'‹|œe9*›ÍwI÷Q 0‘¤ØÃQ{^ˆü1jÐ9)F5ã±€@Aðs6ð#ú¼i7úÇæË7˜S!øNï‚p.êÓæƒ¥›œðϤŸ‡›_¶›Û·1ò=´Ýö£$Ïs°h†Ã g´mЗ«dOÒ–5E[HCÚéÅ7´ýçæn{¶éÐópö³íùÙŠà3išboéK\L(h@ÙЙ"KT¬rF;¿UöV{¶Âk7úi”»ìA)ÌòýÌ.3›Å§n©XÛ:AÃÁ¥U8Jœ+Á·M;Ý6Åp?·5ãÓ<[)\š†¹wY [Ó¢,É8žYzkØçx aÝ~ß´F¼˜e( pNëùY(& ‚x-s5íßâ#sÄ §n ™ŽÔ(Õ,…˜›M´k {1ééšQ˜€îj-ûD§£mÍp -Ñú¡›º²«õjô^Køu»ýSkê0h-6ÿvû'÷þ<†0¿z×X)-°²‰Á¨5"6$ভ‘~(ʉʈ“B;ÿg¶'k{«Õ-d?×–Œ¿>¾·Vo/ð¼÷-~JêêÚàÅèð¿…Oäå8H#¸Žóµ=ÓÔ¿¼½][>I3Ç®!¸)Ê#m‰i¿Ñº&$ëC†x6î‚,YËÅŠ…íÀ{Y$¥P>ØÜÊS fyœ¼ °ïcôŽ9;:ð`î’ä‘y œcÑ÷5¾=>«„£„pé@ô¦àŒªVyó ·6NÑÕQžƒwDd]ŽTd¤‡–Tš FLÔ ÅÞtÕ\ƒj+×´šŽÓ‰°]Ã}'¢kÊöH­EHÑLGCä5Áá–j›ü0^ƒ?0A1„®´}%n›YÑöÝ À‡b Ý¬GúyÕɈAªÍáòXô \¡»’}ý¤ÐŠŽå<¯"»“Ŧ„žŒ88ÒtÛ?9¶¥‹-²œŽNÝp/¼ÂrˆÓ—,Ÿ½Àx­"3æÜ ÇõÓ'I#ajy.øî]E'•øžñM®<ÊÅÕÊùßíyÚL#ëÚ—Ø©h' Þ(ð<0†ET=>ZDyEhჅVÅTìdr•¤Î? ,¼%' ƒjNÔ^ jŠÆBÇÒJy¼^Ÿ„ Èmí‰}áÈ*ýU£3½k›D¸é±EY, ) 'œgGŽåï Ž –ªÕ0(öÖÖR_VŒÔ0ÙƒvÍ)Ó4œVµÃ#œHI ÀÃ={K˜"ø85õBh˜&8ŠsÏ EY ý¶š!ƒн=¯½LXn³E^i\6JB‡˜Ú,|¸ r`|—šÏX- R¦AžÅ™ë„Ü—ó%ÈõçSÝ–]]võÓ³þ6OòØ!kiWŽÁcea–º–†ýÁ}+“ƒ*:râY¡T^o•EÕÅày¤íAÂcOJÊÓ3à æyÄ1˜‡*Ÿ2÷}7(™{ZW‰À5p®ì«–©±šƒ0ȃÆD8iôDy $ªÓ ¿ÀäbM±èuÇw²¢ó*N€å@Љ˜!QJɱn`ö3â `1Z¶Øi|© ʆR¥BTÊrm õuÁ“¢ÀþjéãÃZp£œ[kœžxʉ 5…ï­¿^yÞ«¯/®5¥í& zóǧ›s!¯?^”÷F£B8Öøöh@7ЬìÀ»ÚŠ £Y}0ÃÔyÌ ˜§>Ž´<:Ì//-!ù& ¸q Z«”,H¢‘õ*Î%ÎO"ü”]sÏ*R’4>i,£¥ó9Fl->Ó¶êN¼T‘”·â¶ˆ¬àÏæ: ‘.¸ÓY¦a5؄٥¨Ç¨›U·GûĬ>a‰M16"nqTCÅîÀ‘ÔÌß™2Ü×¥»â9_&Ÿ×,¤ÑB¶ y_sø¼8à$jÀq V›ÂF@¹ê¥Ø>õD# Uc¸ÛkÃ^<œÏ2Còzáð<[ŸjW¦ÎÌê뮨ÎÄ9¶zËtÆË¨0`^,ª ËJ |2û䑎Òt‚pf.AâICË4¢ª¨kçòàF­ÜTAQ*'.=¢aõ2“®Þ;² ™0Ï=§dÕ/¾ë°þ1I"Q¬¹õòe×4pr³û˼(NÎOä ´¿W0»Ž°BþèE¯ÅàI68j’‚ÕCƒU½Ê`/×6jDin‘§QÏ“þÇ@å¥ {ñâ î1ÐéÅ…O‚ƒ¸<1pôajõgQå¼À¤ÏsXmG`#y€XÂ"z9M(*àšڮ/,/Ÿ˜ä¬›z²—Pá)”;Z3Q[46EØF ÊÇÁ>Žb?Œ–)s’¾ÜÚ@Æ£ÆÕÉð–{ÞïÉ Qj¸´g(ãuýzEðkôb(~‚ó,„`H}‡–¯oµŒ×7{ ¼Û^~7…j†<—H×Nøý+.xAxµŸ¬=ƒÓÊ”¾²ô×íHW7Gê8x]"—Ü™üš)àj–9W†=õd~VÝ3ºlÅ(ìOö 8VšûËÆbEEæ£ÐÁ‰îÉ¿3û?×^̈Ðr„1(ÀL¾’rÇ*î‹*ÀÊ8Zä`ÆŠ‘k²“„·Xqž¯œý{7‘‹+Cä8…ö-Ô“ò'ÙØÆ¾öâQãêm•#Ë6$Ž°Ç¾ª€9äºÚY?óp’²1^ê`Ñ+-û2?÷Ÿãû?»ÙÚS„ÆÐ"¯…®ºY8/ w˼ÃS¬Í=ÓÇ®e­úØ<2}ìz:R=¥h©vOHŠ < ùs††zPoИìaÂ{XŠªŽƒèKÂ>:Œ› ÃåUµ¤ÍÊßg2~ÈYs-ê¥b'²Óð®ëÑR“ކ––Ökþˆ9Ñ^W "4…ŽR ÎM¥d¿¬Êd/Ñ‹ùÕgï÷I”ók™SqúQ ¾ܱ8¸µ2¼4áà´¬û# ÿuûÛ{wóÔϓ Ér€Ã“õ¬'9,Žël»«O,aœà4ƒ+< ]&¼‚¡&4Aèü,™•±.n»ëÙ4Vè'¨Pçøœ]W±eÊrœ…†t‰Ëɲ"f°tfɪ*ò‹®ÉbJ/6­xT>‹¹Ü»,½kÂg]ùź6åð0·–FZKÍÞx„9*ÌØ Å,¤KW¶í#­õ@x¹³›§ R$5¾'‹`Bè` ¯â“Y-£ùÙz †>Àg—´fB‹-½\ü0†8€åièK†WˆYOé§!_ «y -…ƘVâß‘i °õÿ(>lþ Jý·{ endstream endobj 1720 0 obj [ 1719 0 R 1721 0 R 1723 0 R 1724 0 R 1725 0 R 1726 0 R 1727 0 R 1728 0 R 1729 0 R 1730 0 R 1731 0 R 1732 0 R ] endobj 1718 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1720 0 R /Contents 1733 0 R >> endobj 1734 0 obj 2751 endobj 1737 0 obj << /Type /Annot /Subtype /Link /Rect [ 371.418 364.88 408.638 373.76 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1736 0 R /H /I >> endobj 1739 0 obj << /Type /Annot /Subtype /Link /Rect [ 138.0 316.88 175.22 325.76 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1736 0 R /H /I >> endobj 1740 0 obj << /Type /Annot /Subtype /Link /Rect [ 138.0 172.604 161.32 181.604 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1713 0 R /H /I >> endobj 1741 0 obj << /Length 1742 0 R /Filter /FlateDecode >> stream xœÍÑŽä¶í}¿BoÝvUI–e«oi/-¶@“ÜíAq¹ÏŒfֈǞ؞Ý,.÷ï¥,Ù–-Ù3éÓ%VäˆI‘Iç·Šü{¯ÿ¤œâ4•h{¼ùÍâ)JŠ„EÅs!Æ1‹ÑMQ1*€Æ]°~&{~F?ß”7ýëæÓgسCè^oÈóŽÕãÍG6»Öß’|nþþtó×ƈô´M œJ!¥‹¦8bRÿÃÐÓ}º}ªª¢AûªFµÚ«Z•[õî3zú÷HÍ$ŽRMMá<2#ÏÊ*«V5蘕ÙAUÙúïŸ&6‹Áé·f²Áå’$ÁdîŠðÇ‘ÁÆpÔ?M™ƒæ” Æh`þ.ŠL<‰‰+°ï…ߌpË(œP*e"%ü„Ó‰ Q!Ö<æ›QÏw¦å"Xt¨Ú*ªÏ´ç©u?<¼7:k›… &üPû®(Ð;t/ NÐmÕ>«z³úp֡׸(5yÙªúT«VíœîîqYäMë´×:ÐÞðKVœUƒGÄǬ<(‡ë1{#Ϲqi«qÝœÔ6ß¿ÍrØ#b8— 4Œ=¶UÙ¨í¹Í_4c.45ص“Ç@ûaYªÜZlÜ8þX?då°42„n”Eà qÒ$‘/X^îóBõÔÞÝ2!VˆGAêQ­S]½ä;µ»0¬w›í¸¹mÕñÔŽ*u&í·f»ÿ<5–ogÎgíëê41–p;í./qý·:÷Ëmg·n™5¿öËAÊêd²øN¤nýCçQÝÒøSyçö@oYá½s4‚Œ² ê«1Òg»]ÞæU¹xCQœ`N)¡$á>#_>{}6oýêÜäåÁ7v,fÌ»û±rɹ\)DÓ»ó)ï÷¨³Ò¢V”¥+ä¨:i›àž<š“xq,9Ð$‰¡ùþ÷ìx=Ý“Xó(…Ts{B¾ümÆuþ6ß«Y2¶Äb•R©O±SäBÏP„â{ abUˆÏÏ\´³ÞǘsqÁ¬yŸžóm«ãQL¯9¤r#Ò®~Y ¼m%õ ©ªÃCd؈îP ¨º:žá¼;¤Ù0áÞ›ÝMRxÄô£KWi0ìʃ`Êu©( Ñã[Yš¼Y³ƒ·J ð ³…£|o$,@§ßš`†n?-HIŠÁ ¥„:Íçp¿[ ²B8½œ÷µ#‰¨ (µÙ&k–3?M XH")c™è?_¥}ª•ˆ¥!÷ÏˇK¶Bèž½|8# ‘èš$xúvùÑ£bòãƒ/CÎ"â6¸Vž]ºFîàkî%1Žxl²iÀÕ² i²Fy•) V"z2¨¤,ªs»ZDPu¬ÿYSDPN`C"ôŠWÚtòSDbJ¿J„…®õ’)8akäŸ[|ùr<\÷—RJ!õû ûº?$ ´é+”ãáã¯þ³ÈàR§ /‹wŽm.x€ò~9o B°‰H DˆI(N— /ÔÌP‰­Qýºö¤Åp# Rèk÷ªÙÖùiµÔ…'Þ È<=¡~Öº‡RªïÂÔÓ=4ŒP\÷š/@Q_¶ù>7½œE®¥À'‘­p}ñVœ °FéœnËî°¼Ûs úµ¦ô°ƒ{T/ªÎŠa\ÛÙîÐB›ùÜIߤʩ ¦=ÌM÷ȉ.­»ÂÞ®³q© îBð63ý³L[kÖ­®ÍÆ}æÁ#æãDxƒëoµ§q[Q‹4²Y…­êØ8Dƒ~cH934ðu×q»u ŸW¿‹ îwýÿÙyÕ÷5‡¶3¾–èAßzŠc0xÓ¯ ^í—§ªiòMgðne ] eýÂÃv?¬®UTå¡ñ™·4'«º©ÊÎÝÂŒí@£[WÃ!Ǫ…}ÎÊÀÄ’äÔU©Ð¹Q5l†rê:ByÚGãÞxwŒStûVÿR+1ÄUUeñæ€ú ÷×ý„0op–r:œnFèP¹?=›Ö;¼u¸ª‘·wîæ¢p7Cä;`“½(—— ËQÛ€É Š™šÌîDÏý¦‰Ã ºî©ºØ1ËÜÎÝ5UhÏ6†çÂáÕ…±¬eíÎ1 IJ_G>͹·n bÖgèãê¦ ÑÉdj©¾½ð¤3h¾wïÒ 7ª}Uªt0S¢>ˆ“P£À¼<‰G_îÐTœÀ3+dHvG†¾¯1SèJ‰u‚ãÔö‰ÏÇÓš¼ÔOB÷è„Ë«äÅêi"⾪ªÜ åA3š€‘ñ"å@:Hî-ôÜ®v·{ì†Ì`@ð5w¿“ûÜ0kšj›gvðk‘CMjé Òú31Óú°ëé@·¿ô-Ü5îDö’åE¶É‹¼}›àÛX¨V§:7ņÅhÝ~y·Bp¬^&’ôæê·[cÀãç`µ5ºFó„>Ô ±9ÌjŽGÜC9®‡ ½_«zgl`àå¸ÕspN¤L"⊸…ROjp[®ƒ¹ ÂÞÚL¿Õ—†Ý}èhø ú«¬YTTÛ8ž¿—‚œ’³~ˆé“Ãé<1g¯›íÜ;™Wéc3€õ8¶D¬Ë‹»RÙ Tž ³¼tÕf ¸ž˜'/ý}Vs2N¥ËƒAU QC¾ÒñT·@_©´ãË»îÇ^Žó +<à‹ 4 ‘iÒ›—'=‚øÛWÚBP5ö &Üåod1_òÁÒ)Éû¼9` =«â„Žªi²ƒþÒXóh#ýYÁ¸ÄTB¨¸8f†èñ÷_ŠŸB»P™/ÆtFùs·Ód\¡^Q®)AݰªÔýæê3¾J$ý¹c…Ê˦Õ®_ÑJ9!¯¾‡”a¦Ž‹>‹-ϸõ=xû/ÞƒGqõ=H>£üîtRP&ÿ_;Õ–Ïù*™¡k<Ü‹h@NyëÝI÷ÿ}¸ù<.ý endstream endobj 1738 0 obj [ 1737 0 R 1739 0 R 1740 0 R ] endobj 1735 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1738 0 R /Contents 1741 0 R >> endobj 1742 0 obj 2490 endobj 1736 0 obj << /Type /Action /S /GoTo /D [1743 0 R /XYZ 72.0 607.655 null] >> endobj 1744 0 obj << /Type /Annot /Subtype /Link /Rect [ 138.0 289.975 161.32 298.975 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1713 0 R /H /I >> endobj 1746 0 obj << /Length 1747 0 R /Filter /FlateDecode >> stream xœíZKä´ÞׯðrFš6~Ä/v á^ ˜™F ½HWRÝUI‘¤Z—ûß9Žó¶“ʰ¡‘¡¶]þŽÏË>Ÿ~ÝQDàßûGGkmÐþ´ûµ§H1Äe;$Ž˜ „#a&Ð M‡:fÜ`] þLæBÿý¸Ëwýw÷éæ$ˆî·YÞˆú¸{?Ò­í—¤A»¯ow_üG JÐíap1—XiŒjÌ™±ÿ0t{BŸ^ÝűB‡¢DezHË4ß§¯ïÐí·š̵ESXÌàqž ¼¨Ó â<~HOi^;ü7·ŸqB°~i.{?QRN)…É<á¿s7#N¢ýi¢È¼ëV™Œ8 ÜßE•‰§1+ìgá‹Qn9¥ÂŠRc”1ðÖ“¢R­eÌ‹1ÏOfõ"X6Cek<˜>³>ÒÞ®{÷Ö™l]ò—ôwÚWÇ#z ?…^õcZŽúqùp±{¯šŒ¥£^–×iy.Ó:MÆs&€Qû˜Uõx½Ã¨óîí¨ó/i…G#âü!Ë=ÅÏ£ÞýX«K5Q§.Fêœî³Ãóì8ßp†9d¡š;ß싼J÷—:{²²#á%¥ÚΡoæiÖú®Ÿ7üV ãqÞ7¡Ð2*11¢D˜¯V–²cÚ¡½(3ÁVÀƒ"å`Ô¹,ž²$MÞô#pj'÷ûar]§§s=˜Ôx´›'ÃøctÁ¡,N¾Ç£h¦]U'YÞ]rد~*.Cgßø®íÄÕ/C§×¶í»xw¿5êµ=—c®íRlè[‡^£ÊÐíÜ-=w†#ÂÑ$`ÐXDœ$Yùbä8TT)ÄNø’ÂÖõ¶3odÏýóоTYþ0Ñ„ifšñNˆSÜh©™¯ÐO!gs¨qã¢Å”h„гuîP|Ž"Hi,-ˆ³óÍïñé¸o¹)ÌîY¤UHF{À,—ºˆ¬ÁÇ.øcS4¸N­€õ„·d±¬‰b+ÀM¾àp½SŒ‚1< ¢¸Ô«|-¢fýùžˆ¸Áa` æåwˆØcП§¿=F=ÐÝúß'´²ƒ mìæ‹ˆï.2¡óƒÑ5$Âß¡?ÐÊѬ&Š€K Y¾€›å‚A…ZC®™+ 6ËÈUÿ/ZÃÞÁÿ_«¦’bA ½p­ñ6­öev^¥¢6`].`‹rCðCz*žcfÌ^¥Ft¡ëX´ëµDÓuÜÍ+sW37tN˪Èãc@æ0Ô]]ÏQê€øý¥àhfWð0ÔÜØÚv^øzø1sÃDC ÐlÐÐõ²jh÷6¿Æö $=Ä—c½$ëg¸ö”åóÀÞçø jýÐË'½x¤Èsq)G«¶®FàÊ\Zôϯ‡1K}p¢f»wsãÎòª†ëÖsçÌØ;p;ÓàïšLl¹ÝèÙ#Ló¸€t¦v÷+u•nI˜¿²M%ÕbJ©–W8xmŠü¡r¼ºOó!wš0[©ÉŠBŒB•µï5Bñ€ø«\I e˜41&€Ç[®á¯5M]%ÖçóéW]>LèÊÚâ¾ÏÎÎáP´Î—º¿¬¬œÌ €´ÏÐê¿'ïa$ZAou¯e*¶”^åÏà_þ5ûˆ)G^vqÄé ùѽŸ5nîOØ­–gV@PÀKÑÕrk-õæ_µÔCŒŸËVìN>Å}pG¬¡[qßjg×iÞ/]³yYrÍþaÉu›‚åšîävíï>öíCQžâAl[CÙ5."l/‚Æp0àÚ;¡!Ø^) hÜ+мÍw/°®}Ÿ­,ÓÊU7ÏaƒKá–þ”—*ð@h™õD­‡´îïôýLmàJiŠ€t¯›“Ô¬ájdà œÞå–ÓvÇ ó6«ÎGðOŒÓãÒªŠR”þ£Ynë¹uÓgª&8pA8ÁYu'ÅòÍö?ÿÚþñ6‰¶T?¼zŠü±Ìêéq\ ÎÐÈ"Áܰ©tüÚè Þ¤5lMFGV¤$èUÕ (¹9Ra£4ap‡_«‚qðæ_ƒ‡ØefȯÎç4OþZ à8eŒ¸·8_ò&¡k2ƨ@O»5²z=&Á««$ ! ']¾þ=LÒh†ù÷ƒØà&gÎy_Ä|½>瓘~QßÄ$×3õþéÅ|‹þòW1_ÔßýYÌ×(ð]L 2›´åØÚðeL*¨z¸‡UÿÓXó?C¼ßý °ÊA endstream endobj 1745 0 obj [ 1744 0 R ] endobj 1743 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1745 0 R /Contents 1746 0 R >> endobj 1747 0 obj 2002 endobj 691 0 obj << /Type /Action /S /GoTo /D [1748 0 R /XYZ 72.0 769.889 null] >> endobj 694 0 obj << /Type /Action /S /GoTo /D [1748 0 R /XYZ 72.0 694.227 null] >> endobj 697 0 obj << /Type /Action /S /GoTo /D [1748 0 R /XYZ 72.0 439.923 null] >> endobj 700 0 obj << /Type /Action /S /GoTo /D [1748 0 R /XYZ 72.0 265.225 null] >> endobj 703 0 obj << /Type /Action /S /GoTo /D [1748 0 R /XYZ 72.0 230.539 null] >> endobj 1749 0 obj << /Type /Annot /Subtype /Link /Rect [ 218.436 707.727 243.976 716.727 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1618 0 R /H /I >> endobj 1751 0 obj << /Type /Annot /Subtype /Link /Rect [ 324.827 639.358 379.476 648.238 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1445 0 R /H /I >> endobj 1752 0 obj << /Type /Annot /Subtype /Link /Rect [ 362.98 605.435 413.8 614.435 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 703 0 R /H /I >> endobj 1754 0 obj << /Type /Annot /Subtype /Link /Rect [ 360.27 453.543 384.17 462.423 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1753 0 R /H /I >> endobj 1755 0 obj << /Type /Action /S /GoTo /D [1453 0 R /XYZ 72.0 769.889 null] >> endobj 1756 0 obj << /Type /Annot /Subtype /Link /Rect [ 328.57 385.054 380.51 393.934 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1755 0 R /H /I >> endobj 1757 0 obj << /Type /Annot /Subtype /Link /Rect [ 425.75 266.725 496.58 275.725 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 700 0 R /H /I >> endobj 1758 0 obj << /Length 1759 0 R /Filter /FlateDecode >> stream xœÍË’Û6ò®¯À-vÕ €ïÜâ8IyË›Z—g+ÙJr€HHb……¤f¬¿ß @Š3Nn„n¢Ý~Âí8aðï^ÿä1§y^²Ýýeñœd‚D©E%ŒÆ"a,"<¦"!-Y¢Òhš`!Ü ~{>‘_vÝŽ‘Ÿv¿ý{*€îiÇžanX}Ú} d³`ý5ÉJ1Fó¯OÀË Î²Œ²õÅ6âƒõ§… kOY`Pü}Vdv#1Û¶¨»ó¯F8FŽ»·»7?‚LŒ<|De°‹ó¢ÈŠ>Ñ\úO‡–üö*N_ÿAþµûáaËa¾ín}Eh¹4UZ0ØÁªCúÐJ.¬ÀˆàTäc,MQ÷ïOò<©$” êPí+"«¶îêqäT÷ZFvêqN⌂a’#ÇS=’×ð•´ ¯JËßcžê¦ @õùÜȺ 0ÓIÐe”Çî`D–âÐÏrZ*ö"ËŠ˜ÿ4JŽj¹e¡ÑÔ/ÏD›…VJŠ•• Õ•†mZÐ|a)DÈ}™<¸âÊã”ÆQÊXœÆ›üÁ0k’ŒÓ"Ktˆ[êƒkÐ}èž•©ìÛVvÕ}Sw&ãS=•'5d]åº5e9Õê†S@Óní¨( ŒÓ,C¡'ímò|nêÒÜ*uþ 1a¢Ñ *ç28‹¨`1c"²H(§äûAÉII*9É=\ü—"€‹œÆ9>9·1…,´O¤LûD§žÈ1Xì€Îq ¼ÖX…|óc¶P$²]Z‰Ne7¢–FÔj°:ô½ãv£nÄ2g)ãßRœlN_¶ÀÂ6+ ¸¿©ö<]oÇlu>„÷T˦¹Ròþ@®ý…Œ“&HiUÝÍŽjï¡ÆÉáˆ9ÿ$Á%õ·÷ï§'¦Ògþç‚æ}Gú¡‚¨…˜‘e©ÆÑÐku’wä2ªaœªô6wH ¡¾b}×vXF†GY7r߬%©³”ŽBKA×)ÒŒF›Š4ŠmÇXŸŸ5­&€¬(ФÈM7« þ‡’ê>!E?~ð@XYƒÙÇíI13ÐÙîÒÂý n™5dç¡ëB—vÖÔÔãÞw!«zÅAÛˆ‰•¶ÖÛï ®¦žüÚª‚À>Øt.F›E`G‡ëKÈNú¥n*°-vLÔ¡þìaÛZ[:¬ÖÌŠÏ ïmµ°¤é$Á’¶Ð“òÒ&Wƒf”“Wo¯óâá±6eÞaä¼ëölÜÁA/fF(l£ †Ë“§|¾ÍÊsª»¬¼`|CîÆŽjÿ|[Åå­yGÔóñ¶ï»Û”M}VåeZ(Q·ëYD[U¤+þÚ*H'º@Œ5t3Ô×ÐIGIFíG’r×I JÞAæúGt” šåzìuÓ©e¡>ƒý\‡~df­¾mŽç–øùF8¥‰ž|³HlœT™“À_nsš@ÃÉ ˜?ny¼˜÷b Q\äI”àö_`²¥^Ê}qÄ)/àÄ"n¼67žcÄÂ$ ÊŒÀA6÷%×aR4éIžFòÿ"=4—rº ãÚ÷ܧ"³<ö](¯ÃIéþÜá6³`G+½ñQ!c4Z¶uú6Ø /Ó¥ƒ±ùÊ~¶sõ(kV9ÙAa§œýªäc°y )CK!fa*DÁü+Ë@öqÝh$ÉÊØçðÌ̦áf›y=gÞÑ>BÇGgõÄ5$ôÖ¨‰ ÕrþVúáÙ&3Z1ÜœkšW8íá:0 "öê€Uv潡>4 KõµÊZÕ@ETí¶‡Š!ëþ)Ï™í0þ;^ôT¨M%˜7ÑŸ ÆiDÈfì=4¨¶TÁ~Ù¬ÎjhkS<‚Sž¥¾ó`è/n7–E„Ðð8Y¿³œÙáØ0Ÿ¹ñîÄØÊfÇãAÝ—ë÷ŸZGrˆžtD„î I0(÷ë6J"š%§aI`ªµ¨"†ä å3M² òÅUÿŠ”DÐE±¸¤‰«H%ßAƒ *kcx¦‰{C5 <ƒ2=_sN¡×’"‹¹ðœ9ò6ÆýR•KÀ=™àE&\Ýø®²}KÌ0Šô¯æe—­’8n37Š3“Ñú§ š;»®uXj±¿®v‡#öò@sçvsçèqz±q´Éð,Çñ©ª»[GLáN—Jƒ"àyÑÀº…Ñáp…;9ËaªKÓŸa_éÄ|±º¦"¡qÆ‹<Î-ÿŸûI½TZÓ&h‘PÂíE¾íÍœîæ‘1] ˆ°¦BÀ 4×ß`ál5#°™Çõ> Ggƒ±¥îöŒ¦?š'/ÖmbMS¶ÒZKŒ”³H ž¹“#>™G­Þd„BXšÊ:^ÇIµëì«O€¶HDœñœe‹·ƒ{˜zWbüëE4õŸÁg˜ïê)dÐûµ~Õ˜ÿê`VöÖýÒÐ7Ôc ëz Yk…‰¡)ø%iÃE¼2O:øèR,˜a¶‡5 þ/êãîÿsóAÇ endstream endobj 1750 0 obj [ 1749 0 R 1751 0 R 1752 0 R 1754 0 R 1756 0 R 1757 0 R ] endobj 1748 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1750 0 R /Contents 1758 0 R >> endobj 1759 0 obj 2304 endobj 193 0 obj << /Type /Action /S /GoTo /D [1760 0 R /XYZ 72.0 524.003 null] >> endobj 196 0 obj << /Type /Action /S /GoTo /D [1760 0 R /XYZ 72.0 455.196 null] >> endobj 199 0 obj << /Type /Action /S /GoTo /D [1760 0 R /XYZ 72.0 136.726 null] >> endobj 1761 0 obj << /Type /Annot /Subtype /Link /Rect [ 248.333 619.465 271.653 628.465 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1713 0 R /H /I >> endobj 1764 0 obj << /Type /Annot /Subtype /Link /Rect [ 295.128 595.465 323.448 604.465 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1763 0 R /H /I >> endobj 1765 0 obj << /Length 1766 0 R /Filter /FlateDecode >> stream xœÍÙ’Ü6î}¾B•—WÍȺÇu9NyË{8žªx+“¶ÄîfZìè˜öüý‚)BG³oN  Iqš?oB/€ÿïÕ?EúEQzÕéæOC½<òâÌÒÀO¢4b/Lü(õNÞœ”zÚC€ÈBðÏl-àGï·›ö&ð~¹ùýXS{ì»ÜW˜kV_n>ÙÌ€$ùïpóîáæí‡Ô ïaïL¬Ö—Qiá~•ê¿È{8y¿ß~l‡NÖc5Ù¾ùÃ{øÇÍÏ3eã ð‹M×Ï3ÁWò<÷ƒ¥i61Ò€‚ÕO3A–(ž2£ øïU‘ƒ•Äxí>?Œp×='ü< Ë2/KøÉ/f®“½æ/?ŒrkW‰”\×uNÖAòE)*ëbj½êW¾ÿÎ{ãe~îÝöãù,»¡·8k VGÖ±jà%ð¶’µhnñ3 Û5Üdk¡9NûÎ ö²;ù–ðÛQ¸=Ñ_å7¸Ö* j uö}œ± OƒÔl`;Öʉ½8dG~hÄI ¼&?¾üe¦¼=ˆ–ß9‚µ³A+F¬dûÌ»ÁhzMç'8Œõ¾ð¦Y$Žüœ:‹ [ø7u¹ fvÃÑ“móâíùÅÓº2•O{Á \+…,VBD•Å«¾µZ6)~âÝY[7¼wcDD>…Þ ÞÔ•û+{~ýøÅ!¢=å1;ëñ¶æ­ŒU‘ÆØÈŠ5ýÏûäøŽü û¡¯:q&'Uòüòø† BŽX›)Ëf‚ËWžÊË÷ ÿ&Ðë‘pa/þ„üWŽŒ>„pæ•Ø;.l‚Î îÙ"ƒtàѱä<鸚¸E@]w♬ì¶6Qƾs²?¬¹Œk;åÅÂN¨pû‘ Tûs#† ­V6AϬ&™˜ŸÚzcY¯‚ šÐ3ëÂP+üÔÒ ¹*©º%ÁÝÉÒ­wÿ°d²6P, Äýƒï‰½÷汪â}ïé+Ôßñ“8Äû³`óþõáËýIŽ­J=Ü-߈û0Œ &ÅPJ‹×â~µlŠû°„‚zûÔÊKïPÁˆ@î«80Ö>ó®—-Æ%R:¾ç¡‘¾ÃŽ‚¶çl;²œþ8ö|?ÍHÓûš‰6^½a•(™[…¤N>Yà‡°CØkÕYº~Ât AMÐEvO‡NŽg"}tëÔ‘ Ľs,škçìxË÷:zßwòD8ò nXwÀâÒ²zš0}gN´Q¥C¨Xs‹Ÿë"¹3'Í€Aì%øŽ4¹¢OœŸ{²ú•'‡¢_m0VqØå(Âêë¿A8óCÃT~Oò ‹$ÅÜ"˜ßï‹ØÏ¦&‘ýæÀ yut¸ {Œˆ,NA¸X5MQš®å8ðT\n)K?KUŸUlˆNäž²—•C:¸ãýЉjpSe¬>œuT9ÓGR+8_£Ka ‘¹aô,X¸aßËJ0ìõr 5¡«&"FÀ|ŠŸ–´"åßí¢Á–€¸mª÷¹›0h&æ¼­AêfÆòeÄÑnËVɦáì0jƒØsŸ‰H[U$ÌÙ[—õ$Öç^äCaåêò°ƒBÚ™©}7ᨠÂè½£óžG/¤‰ Ú…QoþrC®³¨žÖN¥¡Ÿ$ðÖ+‚t½ÇI3ù¤‘Â)QN…#¢ÎlµÏ˜ÞX”ª û‹:@sGœÛæO˜é“òE4l3Ñ9 ÁlZ ZõäÒýýD{\ì9wpî¡Qßìš¿IÛÚ®·¬»¡|¹Hù¶øÊhÐó;g$°ŽüÚƒëÖÝcŽg˜#³)1"ñ,êªÞ‹ïȺTÚsêZc ¦(ÛBc5ß³±AÝÖÝ_ÅdpƒtЋl`,2)l[ûúlÇÓXÂU[¡Á°çÙ`CjƒüÄÉ4*S$ÙÔÒ Øw(鎰gýxß9й)Dj]6>”‘€åaþmà­©”HÑëPcDv„-yb›Cåéñ³uÕØëŽ .änÃRI´°¸—ê“\O2©…g+ßfµ1»šàdÀ®;ܼý« Dg³™LàEyì§Eù,3‡„~æ{ïà}'ä¡cçã‹7HÙx¦Kí-ëÕÔ^?€Kƒ(E†3^Jé˜ rac¢†¬§sÃO¼µw¡‰&ày/«wR>9—_þùÉa¦Ü#ò•þRËjTœû;G{øùãlëúå‡áBQØó |ÅSÌ Ou°ô{à_Ýä’Ò r×澪/A¸¸©8.ý$Ρ±‰ wS¡ïi5Õ!pî÷n'Πé(@èøõÜzëdÕx𶇀éj$Ħ1¢VeG1÷†HeÇ:Ždî ‘<:fbËüîÀÝ»z9 LyæÙLÐ "7´ÎÓ…Ö•‰}ÅY7çO4l‡6ýD„MnÕŒ5Ÿp“±Ymw`åŽHlj1 L› ás'õ3zbã–™}ÛxóÄE¾ÐZ|aïÉ2›‡•YYÂÝ•¨!øÖT.  O’²(•;_w·õ:÷>O\aêa~´£Û¬’ð¨sÂYñðþ^=|jGú:[`<‘¾:òÛØðøf#'Q¸PJ%•GræW¸3¾ÈÎÚwàß¶ì y) ²²L²øU»®Ö=ØÉFLR*›’Œ7è$ÆlúÖäMM˜Å­¦Xc)xã‚J2–ð§V¶÷µzk©ÏdÏü§;·ÊßzŠ&iºÐ_–f`&ú-kæ…Á¨T]5&eY.Úå Át_‰{f¸{†«‡!ýÄçŽßk_Ÿë´™­’,_˜c–VÔe di¥Šb‡s6›JØ"{ËÈEé§Y (Jëß›A½'ÕaA.2“òb¾P bçÙ”ªì¦à# =ËäxH1Á;ñ'ØÌÙ ó}ƒ T‚'N~¬¥ƒM\ f§ñärùtSŸ ‚paëžpÂuF‘›ÒÓàTQKâ¼î Î褋vÄÇÛÝH™îÇoÃàÖõj,o^+H>«W“.Ö£ŒŒ?tÇÁö>–†ÐfE™•ùÚÇT\›æÆ”FªBI»ÞúZ§~‡êËyöêçšÕº©.Did3=A—ã %¾úDùö¡q‚×%˽ðjSØ›nì$G.CvÅ0Ì wï?N(ê> ª:–NRŠ|Æg›ewœíÆ+€;ö UÍ™·¾å mzyâ7•RJ5c×;ÔMéBýЂƒª)tq.œ¦u3×F’¸Í$&LF"‚ ð5YN²'Ëø~/*aR1’.ìeÃi¹°€½Õ(á7@‡O–Ö럆¥á¹BH[A¤K 2¥6ßÑè™æ-²bùB!Þ¦›@r˜ÆmØ 6¸Ènú€Ú/¸‹ÁÁGΞ…I=¸pgƒq÷ñçú÷ç±;KÊ¥yû¡\¾P¢(÷Ë^£y’nHØóƒÝºzÜDIúÚVw8Çžg[QæÀ ˜øl&%H8òŽ_QÓ0¥&kñi¾ayð̹pªî1OÍÍD5ª™‡µT1(êÑ//°b9WTÙMýýQå\_Ínj&åjNžoI¤Æy; Rõ'Oe”¯æíõºu‘ªÑ‡m"R2ƒA¤ãŽÜ·&,ÓsúeÚ‡q²-Wܱ˖氶P|“%ÙÆFwà2ÒŠ‘æ;ÂG"´ËY}L#ôU¹0søIuj"9ã¿Q£³0_è@ç~±ÖDçùJ“LUªÝF·Üº»‚í§5Äè+Káæ¦@“¹Ì¦—†÷GÎÍdr±Ô˜GÃïm¥–JGåBiü˜1S•¨¨Ÿ´ÿïÈ%K!E 7r‰|å|oÖ’P„SxW§aòj°¬ÖÙv2ToöNìÔàÈÈc *צ‰!öœÀà½IÕH´­°A‡ÙAZ«·«ã´éî(g9gÑQ&‚Ê ÿx‡¢[î[& õIÿk¿‰@}îÆÖƒXÐϨêž~ç)p®Ö½âj¡¢í¡³_«§÷ŽOþ¨îóÍÿ†på endstream endobj 1762 0 obj [ 1761 0 R 1764 0 R ] endobj 1760 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1762 0 R /Contents 1765 0 R >> endobj 1766 0 obj 3111 endobj 1768 0 obj << /Type /Annot /Subtype /Link /Rect [ 496.045 474.871 521.025 483.751 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1713 0 R /H /I >> endobj 1771 0 obj << /Type /Annot /Subtype /Link /Rect [ 405.82 410.251 438.59 419.251 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1770 0 R /H /I >> endobj 1772 0 obj << /Length 1773 0 R /Filter /FlateDecode >> stream xœí\[sÛ6~÷¯Àô¥ÎŒÍðrßrÙìf'ɦ¶²ÝNÓˆ‚$N(RáÅ®ö×÷àF‚„D)®³æLOÆøAàø|8ýõÂA6ü\³_‘ïXQ£dsñUÚ„]ä…ÒØ–ï¶í!×·ÜmPß  îÑ®JÁ¯^^ÀkôóE~a£\üúäY °΋º½øIóMf€ô”ü³Ñêâåìâù›96š-»&öB+ŠÃ8Ž¡E#ËscöÏE³ úõrVY…–E‰Jº¤%Íúì74ûWw·[^Äîv >{p;É(/jZ¡ ÉÉŠnh^‹ûÿ>ëµ™gÛV4µ&û©ç"PclÙC*Âßò„ ,¢Dv©çÈŠZzñâ÷A—mÃc[wØdádœ;LÀ[ØqâÇ1\²¢…œ cÌdÏ$‹Ëü²­›JùðñðáýÈxé®wâ‰÷5•mäF*3dævÁóaþ¤È—‹´w±NÙWMh¾Ë·[š¤Ëz†®]Ûƒ‚/ë5Õ”I“º(õ÷k3ޱʊ9É4s-]5%©Ó"×ìË4ƒ!¤Ã¤Wè`þ¦á—º º$MV_éwgz7tùúå`LƒÇ÷\ËŠÙNäÉ¡l»ÍÒ„{&\Þ]fEñ¥l”TixдCæsñüíS1”vH›ê·©(˜ÔÝ=Ýíï”.º{›2ÍWºG†?ñžÛ÷Ï]Õt 7ú!ïÍ\&çMš-Dñ ŠÂYjK’/0Ð[΄»,™VW2µ+™ZùêzN¹óýâ·×†½þ.óÓuÓé‘7ÈsÜ‘eµÅVöMýT¾7UûÌÐIÅf ݹ04UÌÓœ”)ô<ôx“7U¯@VHf]!j­,4ßÁ|+ŒÐÆ•Û R-«^\„ĸòüdžA¿÷˜0NÀ˺)aÂâ¿NÉ*/ª:MªÑ—F$Ç-æÀë@z=ôñtIOk•NŠEkld)»5-UJ¾t,y"@¥—iιÂÁÛÖ|ŸvÙçmŽYlݹ]°azCÂÏŠ®•M›LÛÔœÔÉZ <Éçg ‰WyPCFªzÐÁ¬­œhÐVš'ný¢ù"°ôF€´—®iI’:½£±óLÞMë¦Ì©V>ÑŠ eY”W–ƒ’(~Ù¥ëvhæðžTZy]rEsð(”ßAJ)£îž†ñlËñ™®””#RU“²n¶(K¿Pàv¼FÅ‘;’fdžQ´¡òN&º¯˜o3¦‘¨è•>Þå:Ž­‹AÜRw1O½#YC˜xåÅp_ؤÎý1†%ö̾*ìPÉe2꓃£±2P6a³‚AVµj]ÀÀ=B²ô¥uE³¥¥FCŒwøü®Xq 5¾ì§ïhiÇB}Aƒu'àêÇu°z‘Ð`0½°…ÐI×L}pí“©ƒ;)¦A)Å<ÇŠu)víŽk1Q´”cFqr96°÷r:¡…5ƒi¯/\8©xÃq· Óæ2<®Y»´n¶€‘ªûÙx³u•ÊîÑ:MkùΧQlãaXÅ\êâ!±m®î6$¾ Ú`*dlÛ+ñÈ·B|„bîwä˜{&ÙƒHö'è¤÷ëƒõZþýkF'¶œ“餯¿Ì%ä!: ñÝ»¾áÎl;ζW õÅ´äüèÁ<º—m“£°Iüˆc>ÄÜë?ܱƬŸÐ“Ød ÞìO„¸7* Ó)Nô脇t2tžm»’ªjÊl|2<ói’|zJÚ|¾Ì‹Öˆc“ÞDi3ˆÉvlNogn=·dàÇñ@4¡ËO7ï4T,5@´ô+R%DÆ•í¶ÞeÀ£\wPßíšRòl9yu{+‚³Õ®Õ¢ÙZÄœÚKW-J—FUðDýÐ¦Š™òÛœ8¶"Å’ ©D˜EBX[w iªºØÀ"ۨȩR€Yôõ.å1¿Î@¶[JJ’'z.Ѷ@F-A4¨åŸ³÷¼sÇåÓÔÛ¦Ö K H—$ÒâƒX„í[±ÏO›5®h]ÒåÁP«°=¸C†Æ¬Áä÷ËóILpk Bûxƒ*ÞðD\P¯²ÊÏkÖ.-£M Š;Xu?×H]¥'¦SœèNzõ'Nr{g1ÕLgJM“ROÉœ4ÓTisP3uD:së)¹%4“°©UŽP&5™“Š«a‘Û ²½¯ã2©–{ÂnÈ÷Õ ˆÉö’ÔHªêõü|ó¸\[Ÿ×vø†3ÍhRk¢¥é’ŸÒ¯ÃÛ¦¡û´^Ÿ(œú¹ßÂlÿÖv±™_8¥fƒn—[>ÛápÂȼ¢IBo’«§¿úÂh’AùÆ—i5.JΜš$§&È™*mΜ‰sKr<±IKêµEl@¢¥oÞÞjˆ6èàÞIÜ* øy'6ù"Ž"±IX­‹&[hqäG²XPýb]—*ꈟϻåô^CòôŠÍ‘j¹R*š\À¢4*6b7àu%Ï€BŸðC?$C_èî¾(Õ˜|ò½x’ )µ¿èú澩<\þ8;õªsóT\i÷ UF¶iz L㨪Èà 2Šc!]Õ'(©“<éo¯ê.œFDݯïKÄÁïÿçïÀOš„bs¨á» ÈsVð8‰H’6%¾#k¡PN²$&54³Ÿ?о–G endstream endobj 1769 0 obj [ 1768 0 R 1771 0 R ] endobj 1767 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1769 0 R /Contents 1772 0 R >> endobj 1773 0 obj 2896 endobj 1775 0 obj << /Length 1776 0 R /Filter /FlateDecode >> stream xœÍÉ’Û6ö®¯@ådOµ1 .Èm¦œLe3岦¦RŽ I,S¤LPÝé¿ÏA,\ßì.·ðžðö诇øy§?rá<稸¾ŽøeÅéˆJf4!$F”aš š¢TM¸ v“½_ÑÿÍ >}†=%"@÷r ÌVÝÆ °þžô#èrøçñð÷Ÿt<{Ç)ÎyÊ9æ8¦\ÿ£èxCŸÞÛ¶VèÜv¨“gÙɦo?£ã¿=5å8Î5uòÈŒ\4%jÚ^*t¸È›lzCÿÓqⳘœo.û0QR.Ë2Læ©ÿŽ 0†£þj¢È4R&cùÜT™,4&¡ÂË,ün”ÛNÀ4ÃYqžq_á|’BQ–ïeÌwcÞ2Y¨ÖËYÏ­†Î†“Ø82¦¾—ªèª{_µ1yÅW,Ë15]:Ò}”µ,zôżè¥Êq£½Ì“lÉ¥½8 %7EG”î;ñB¹e•n]<:h^K+;ÌñZ©?Ýî/U];àäñ%KTW+Øþõ!»Jza¦–ʃ¯ícÖäÀëŒÎ VwYTçW$PY‡ÞØ#§åKÕ_Ñ`þèM¾ð&Op¤IÓæïÊÍ0P’í¢vÈÔžñÚÒWT´7迥–)$#›–`:TažB“Ô°ú4îM-€€C2 y1:€£,KèüH<‹ª§Z"ˆ…Öè$úâŠnm ‘ÿxj×IºÈ1‹—òvœGt‡Ð)YW´«ÕKQ†>šl\yÆ8ÏYf8ýw U††àtØÛ]Ölmpšhú,M¸Ž¤è²á別3š÷•º×B'ÞUÖwtƒÔ…£Éß[5Us|:šˆWT[6­[ªÛ¤Ufã?m;ædFyù¸I›…®,úA©ª¡_É]WSBqÊ!±)c†éO¿‹Û½–›¹6Peb}vÄ| 4B³J}»`´)OÅó­š!Ë7‚£_,Œ­å •§hWõ”Ì$í4‡º×‰hw½ó]ÆqÍsLo‡›åÝÄé!Ó¤G h³#ÆæÎÇt#¹)ÉaH‡ƒ;F´ÐÎÙ¾‘D”¦;ÔªŠ¢¯žWTÇõÐêó£úÎ#ü)`9†.kï²AqOÜÏÙTÅÁ¿N8†{ §Lât–âq”ã(‚ÂÉì d¿S1#8#zÒfc}|mÚ»ªÔ^bÅ)…Ä‚æÇÒd!e­œ—èÓ¦€ îfФI”Ç+„¶»­Êã=ÂÏ^ä²Yqh¹n7ùš²Ï¢Ó­g{ŠÌucžú­’#ÆpÄL‘®J~õcG4h¾Mþy/ô9Ln0!çœ|Û¬ÈHŠ)޾È÷fK‘-ÃÉ0‘’d…t/qàf4ä&'kBÝ[š³K!¸Q Puê²<§ôQ´Í¹ºëö'îülìòÑÌ/ÐÎï¢ë«âQ‹Î%äš­ÐÔ8ÜIž°0ãÎM›‘°9i m7Pœ%Ð%hÊW¸ï»aåzl¤+¤^¶ »ú—ÖÓÄ48“š–44´ ø˜“ÚÖeóÛ›sÕ©~)ê··vƒ_#_Bæ:Pg%!ßË•èÀ…kê/£c‹Ü…®Aòvï_M<¡‡\Á/_moJè&º/ ._ä?þðÃîÍ*¡fiª¯Îù_»Z%pÐ$4ÑÃïØAn‡É…Ãö¦==WíC9¸“BÁœòä›ù%ú¼Ö½9‹W„ì&TcÆ”Áéµ$u²mR @#Ÿ¥×;h`<uXûû¾ïB©—¶+BÔº^®1Ö“¡_Ë®‡{Pýºœü“$©]\Es1éC• ê`0®XÆÍfè6½py̱õk;sH=ºj‚}º39@Ö*$’Rmhj+b¢öŠýúŽ7±¿¿ŠÁçplÅÎ¥€hÈîÉÃÝ£ñÀ(ÝÁuà 6óÒG9üNs¶¢ÍØB “ÁŒ€éß¶_D’A›LùšØóø54Ðfª³(°ï˜'ÔèaÚRà£`çLûõ èëòDÁ—kU\ͤŸL@¶,®-ÈlÍ“ LzR6óG?ÙýÊ1>…÷Àˆã,Œ‹ƒ¯´»öO4ncã–æ¹ÆBúÙæÉAåILB¬Ë^Y,  †Š«T0óîâ¿4!׫#6³ºÒap÷Á„âÄ«j £žY›šWþ»v}Ûlj2Øpl2ÑyšººUý,û¬]³3°’JµÃÍxjë0R°ØOfý"~Äš¥kpã7W¿Gn Â}¢jÕ¯O«"ôߺt 8Æ\§ (ËÊ+`ºØ¸>¯JŸ¸wÅp8Χ†Ÿ+ X½$¥éüêÛ^çRýð ß`ÿêë\ª_&4ïí gÿyn»ERSÌ#{¼Â~q†Sûˆ´$= OùpøÁáP endstream endobj 1774 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 1775 0 R >> endobj 1776 0 obj 2027 endobj 1778 0 obj << /Length 1779 0 R /Filter /FlateDecode >> stream xœÍYKÛ6¾ûW9%@–åC¢Äzè#)º@‘Ù¢ Ò=Ƚf!Kª(ïÆhûß;Ô“zÚí)»X˜3æ ?‡œÜ?7ø½±¡GqJ´;nþlô qѨ|‚=æÂó0óÑ U>JÀÆm°¶ƒ¾ Я›tCЛOÐ'Fìž7dÁyåêÃæ½ƒ­éí/ A›oï7_½õ%è~߇˜ J!¥„ˆ†˜3iº?¢O/ï³,1hŸ¨P{U¨t§^= û»ÞšIÌCkMa<22Ò¥Y© :Fiô¨Ž*-kû7÷ƒ˜qBpø¥…ìý"¤\˜ŒSþ<Ìkhjö«±X2ÐÔ3¨?!“ bâžfán9E€J¥ ¤„¯p8H!ȵŒùb¦7Mfq,*UÑL¦>š½NvÝST¤Ñ±Ùi6nsAÓívPÈ¢lJhƒm…ž™±brRȲS£­B±6yUŒ`UâfÀò^cÂ%!ÔàÊù%ľ?2¬«çÚv™Y˜=²¯Þò±S›ËÀ†ÁjŸo>GÇœÓ,7Ú¬…ƒA’€S1?Ô$*RÌX¡WèÆóÑËO‹ãQ"0÷CÈâ€Îø¸‰Ǥ4\³tFïg²ý(ómÁ¾œñ³Ž¶‘Q˾fÿp]B(„Gˆo«þ4‡åá¥\³ ¿<>£ ¾|(ð3ãïÇg,\³¼j ÷±­W°÷ØŒfW-C€kÅÜ ÁßW­XãS1çðfypJ×,¯Š‡¤…'%as+ GÉ^'ËùÈY3ÿïÑàpìø!ƒ³.˜ÍÍwËP¤¿fyU4<° R†>÷ÿG4<Ï[3x˜÷£a¯¿nûxûõ2Æ Äì@‡‹fXûzWí}3sí™#™\RÌ8°7ÌéÏd¦?Z>ƒKæÔbÀ%–ïUá#ßu®ªó *NnÙü¡ÈN‡ {£i0ãð"«!ÞšùÜÝr.Èp±ÆÒ?Dù4yÚÿR§CμeŒ,?äj§÷ç*Э—«g ÄGø@ÄýpD›Wldó}}‡‡’sPIŽà7Ñ£Bê3hujwFuk«ïjh@„xËÉ.qH»“þabaiÑ5>\‡–¿ºæz†Ú‰zÖ¦;?U l‹s8]àª:ãø*HT²5H§¦TQ\½mdÈ”1€¼v|Nà²Äeà z‘½Â:Lû_Z‡©ÅÕë౑å7y®€ ü¯…ðá¼°ÇÜ…0€Ón ]®¯Éìã—<29¡š’äP^‡cÏt¼*®YýöФ¨ˆ[YÕ½FªÉKÕÌRÕ5÷mëîíë®ù®oÒ®ÙÛß±¶Õ–ìJˆ•}¼o¥š\ ‡Š–¾žéÓ‘‚Š*L»Öıµš>¾ùa8 „e`ÌQŽJI»o+ßU“½n[…2p\—úI%gÜ*?f§¶ÙPé ã@AÇÛÎã²m%*2P³¤ªYÅ?hȨéÂu4ݨ5»®š{]˜r:{8ãG³¯×¸#f–;%0Ó+:æk…á­¡ÖmÏ}{àªÜ´µëR}†«MG¶­¦º$8½Ó…ñ»RØ«¾I,ô.ÜQ!6½X?Ý9½‹™ðP6 ðÀêè©1FåEö¤c¯1BÁ}Paÿó^ýx,€®2NáÀ'-å˜{<žv[~<![r¹ðx<µh_<Ñíݻۯ_Üáou–àïêˆ_€î-èlÚÝÁU0…Ä€e·²Ç*Ml7XíâübuæÒÃtþ7ó~ó/áw¡ endstream endobj 1777 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 1778 0 R >> endobj 1779 0 obj 1923 endobj 1781 0 obj << /Type /Action /S /GoTo /D [1685 0 R /XYZ 72.0 490.056 null] >> endobj 1782 0 obj << /Type /Annot /Subtype /Link /Rect [ 287.392 599.603 319.052 608.603 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1781 0 R /H /I >> endobj 1784 0 obj << /Type /Annot /Subtype /Link /Rect [ 287.773 85.507 313.313 94.507 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1692 0 R /H /I >> endobj 1785 0 obj << /Length 1786 0 R /Filter /FlateDecode >> stream xœÍZIsܶ¾Ï¯@ù$WYVx·$²_É—ÄOrå`ë@ 9Vf†’óì©ÊOƒËpÁ2TN¶Ê%.øÝF÷‡¦þZQDàçÖüR‚b¥4ZïWuÏ)ŠâQ÷H,˜$„#&0“h¦$Úf|Áú+ø5 ÷[ôÇê°"è¿«/O0&EpßVÄ#¼õ°ú4Ò­×?’~½¬~y\ýôA"JÐãfp1°Ò‘Ö<ª0gÚücèq¾Ü<Å®B›¢De¶ÉÊì°ÎÞ>¡ÇšiÌ•AS˜ÌàÉ!E‡¢Î*´OÉK¶Ïu‹ÿ8ñ'«ÍeŸ&*BÈÅqŒÉ<á¿À¼}OZ‰æÕD‘ùm;ËäIkAûÛ«2±4&c…í(üa”ó`ã˜R­c­áV“¢Š„"æ‡1Ïfôò[-”µÛ~NÓ ½E\bn¾ÞÀ®ëoÖÛäð’U_ß^žÔÛìr½9ív—›C²Þ'à˜•y‘æëd€ýy(¾.wÏçËe^W#q›|PÉós™ý?Oê¼ÀÉxóÿ’;üë6Ûã7³Ô°2F]@¦IRôæÔýXœÊÌV)ÅK£±‘•Wuy~ƒ[?}àˆ²‰s  B#ÙJ>Ó¤ÎL6¡È ¡(¨ÉfªÓçá|(ŽU^õíZF ñVD’ù¦²VŸÜvKAq†n¾x'¤Tb3?Û"nSÿ”,Gs÷?Á)fT"f‰£“ç¤ ëüi™ù€STj-Xä0ÿ½wrFh¸È|F$Ž%¤)Q[GØS‡¿’àËÌg$<0BI.æoý“ÇQ8™<0»†Œ§!U3ª³¯½³sÂÀEÎç$ÂŒCð¨Ø!b]ìbøƒŸ @Íÿ{Ñ:pX‡8V@{\›°ðëËàÅ-óƒ"8f,á¶„âToòÂh?øõ^6tQE™#¢oó[i“†|öš8@OOèK cAà p·ŽUä§£, a1ÆORBÇʬt¬ÚñwYµ.ó£)•þõ· çyJÒø¹)'2<û…%ÍzZCÕõÛQt£eÌbökš‰:ëS ‡‚õ©Û%žF S“wcÞ·¹a·øêwîð`ü2«*Œcw¶L¦»©ZºÓÝ%#ìü u“›üÒ¡T’¦CÁ@¿„šIµt€Þ ³=Ÿê‘ £ëS•UÝýÙ…Rƒû•TÂ1í:¯³?³³?ɘB㇠4 óª2@Šìt-¨KZHºPïÈѲÕu™ƒÇžúzc‚{ð[ÏÁ&±¹p*³(Ó¬lhò-Ð… ¡¼\·¼l¸OÃuö8%Tïበ‡á.í±½¹„þðè~ã[³u¾É³Ô7KZ´.¸¼›)ø }Þ9Ü¥Ù<êÑ!û†ŠC†¾åp†x† ô»ÎRÈl@á°4D2b¼ó[“Õº"8jÆ–/¾ÌxxEÓü*sˆˆc| éE Nk6bÂÌ¡Ì5Uû]Í€¿çǬIuPœŽ°ÇëmYœ^¶¡´ *DÍj¼-ðSaD„àx©“!ù+å‡uõh`œl¿êd 1=¼¬Ø ùÐlŒsãèY-¹j)VN€Ù%ÅÕSXj¿f©˜r}¿¥pÔš!²]¶®Ûâ¹MÊd]g%êÅ56ó*?˜X3ž@ùA9¢˜æ›¦W£MYì[We›ä´«ÑçÇ·j±¿ i‹ 0¢§Ç†€’Î0wyuÜ%g” m¶;¢=TêäÅðxšŒ-‰m°/V-æX8©Á!ü*•6Ki¿º”ÂÐ Ó3¹ê%gÈ?J¨Ã“ÜP ÞPa`®ÛTC¬9‡° ÀÃmÁ‹T2É< B¨ªM'¥Ø½ª:%—®ƒ 1ŽpÓ9—w­ƒ=þÚ:؈¥ë ¨ž!>ÿ»…¦Ä˜q"cÉ‹t2…€ŒñB™m¶y^[k⬴B@ÁV(%ï–õý÷dx»sñàˆÉL2ê5@hÆŒç£Êl“>¯ÿ3j*åËK]K4 1Èpþ¾ß… àl¾ÐyI‘V°ˆ0Éõô|ÁÈätan–Ó]Ø 81L«;cu÷íQ«»éxé óµcü,ͱC;T5Þ({fë‹/ãMÙím[„­ØÈ”î|ÖžžÌƒª)?ƒmSöJ.ܵcÇ‚äb6ë´0'RTuu<1µ+{‡š J[r û +kxUçP-jˆc”œêbŸÔ¦­»;‡º¹RÒv•Tãùí#Å’š)ôòvnD DPü«ç\Ö\Žv.sàšоÖÐ$1ú¶¬-#ØÐ¥!ähöYežŽhħ-cAKW -]ÿ´ÌP½xßšu¸ÀO税CÈE.0ùûÒ–µe\oë Â/sl)¬úö¬Ã¡Æ. !'ÓæWñРuÌï? 1­CÈEKÀ÷ÝY[Æõæ® ÁÇ.ø{ÑjðhA×¥u8#ÔÞ•à2_ÄúÒ¢µE\oðÒúõž˜tx®·x#*_©¿&иÅëÈŸ£¯½­ýɃŠ2tħÖ~d}>2¦ N¾„H(J[C¦J‚©0©áBÞþîŸ8·œ2¦˜c©tz÷³NÅCÈw¡(?ò4b 完Äyü^À€q›ÏÆ ™·±ÁØeQ†>D<¨e¾^öµ¶&D"…C ‰í¯—?Úi¾üïþÁ4€p…¿0`$è·áß¶ü° Àõ~è+¾DН€ò.g TŠ ­oŒ_Î>´;RÜÞô Ú»d„u|4еÝÖ(IÓ %ÅìC9¹6äÝ0Q÷½ Ó~tÝ/p¨Ý»=r~WiòÑ|Öû;½‚D¦Ì.å‘ÃÂaæMžíÒ‘ZíaábÛ¸ºÜ6¬ad12³ SÇ›Š4VbÔ˜î3 éöÁ·¼Þv—­&æª[`sy‡û«5îþ®»(úwÉ|žî>ïçk›ò²ïÈ›8îF,ñ—^üL¸iºw2uyýÓ§Õ?ãÐ endstream endobj 1783 0 obj [ 1782 0 R 1784 0 R ] endobj 1780 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1783 0 R /Contents 1785 0 R >> endobj 1786 0 obj 2338 endobj 939 0 obj << /Type /Action /S /GoTo /D [1787 0 R /XYZ 72.0 555.029 null] >> endobj 1788 0 obj << /Type /Annot /Subtype /Link /Rect [ 442.472 674.389 523.274 683.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1304 0 R /H /I >> endobj 1790 0 obj << /Type /Annot /Subtype /Link /Rect [ 123.33 662.389 201.11 671.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1304 0 R /H /I >> endobj 1791 0 obj << /URI (http://www.scripps.edu/~cdputnam/software/bibutils/bibutils.html) /S /URI >> endobj 1792 0 obj << /Type /Annot /Subtype /Link /Rect [ 343.559 650.389 373.569 659.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1791 0 R /H /I >> endobj 1793 0 obj << /Type /Annot /Subtype /Link /Rect [ 379.534 650.389 523.274 659.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1791 0 R /H /I >> endobj 1794 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 638.389 240.85 647.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1791 0 R /H /I >> endobj 1795 0 obj << /Type /Annot /Subtype /Link /Rect [ 323.428 504.193 351.758 513.073 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1692 0 R /H /I >> endobj 1796 0 obj << /Type /Action /S /GoTo /D [1780 0 R /XYZ 72.0 231.793 null] >> endobj 1797 0 obj << /Type /Annot /Subtype /Link /Rect [ 161.603 422.333 203.263 431.213 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1796 0 R /H /I >> endobj 1798 0 obj << /Length 1799 0 R /Filter /FlateDecode >> stream xœÍZKÜ8¾÷¯fÉÝ*¿må–¤gYÌ+é^ì²9¨lUو˪±]]ÝÀb~ûR¢l©üè{Jrh~,‰")ФTõוO<ø£þd‘O³Œ‘üpõ—áû$ H˜VìÑ(ˆ=/$~Dƒ˜È%+&µšãÁ@ÁŸ‹±€Kò¯«æÊ#?_}üc âÁ¼ó•·"\‹º»zïèfý-éç‘ýÕ›û«ÍO1ñ=r¿³.2êG c <šÑ0`ê_@îäãËb'ZÑä‚xÃ÷â šþ‡OäþW?Þ_z;5›ß_¨1“¦)õ¦±¤Å„ÈJT](2…¸Ê-À¿«*{3=Wáy}3Ê­GP £|Ÿ±”1øˆf!”²çæ›±n+Òk4šMŽ3x4L<ø—øh+Áhð8Ò÷¼ùÐVìŠmþj:¤†ÁsR7?ùþTµÀl/ XƒÜdË[²“’¶U7ÈX²&Š–ÖÅÊyŒl÷0Y²èbº§bÀŎMÕ³|ä‡c-H0HØ/…N”Ò¢Áó³gþ)Oäø0¤>y¹¢¶¨/…§vï ^Zº:eÛ[üëï·w¼ç×òÆÒÿþõ—ËqŽ"²=pGf!D-¢°¬íÓŠ¦“MÁYQê³,Ê’¹ù¿TÛ–·Ž(¹³ô[Ùì[Ñu‰àFß‹'‚>NcË·æ£Ë¾?¾ÚlÎç3­eN÷òaÆ£¾od>ÿÓt8DdÁˆ ІSeSÈ ŽT‘¹}ca!EgQ#{ ºÓqØXdôe匵[dæò¾‚Mz²ÙZú¡âä²ym/ZG_]¨¯âÚQK.l‡ŸN,~’§õË1yYòaѾ@ÃÛð|6F+Ðânx펔5µðmÙ¢Úÿ8õ ?¼p8½ƒÔ§qœ1æ-Z°­¶§¾ª§Áz0+az«fÙÕ¦z)ñ$^ZΉÈ.o«ã±£¢8mþ΋£6d³àuˆÑK!ÜõgÞŠÍ üHв?ÔÓ M2¨J&Äg²f!ž*éA©K––Ö†{ ¸—Gžæ&[!'— sƒÍPºC!òÆ›ápwfÕ» µò¡*.$s‡î„;Ø$–Q!èñŠ›ºjÄ‚c#b 5<¾Õ骸4'Êr¹%›Óa+Z‹Q¤a{êJî[~,Ÿ,wÈňð wÔrÞȾ´èû;gݦ°`¨æ£VX`’‹(®ÞÒÉŽ§û¬¥$î¡Ö€ãq×4î’&{þY îÞ—vÆNÖµ=µ2)A!ó“z•èÅÜÁZ­k‹ì¨h¥`7F4pLGØAñ¶¨©v½3v'xoôE†©nšr/"㢨zé|èÒ®.í©i.´1þ@0øÃý¸Õ)xdpÇSé¾v櫲¾àH}—Þ©+µAk§ªB¼0 Ò#´ýjÔ³„Bc,“…Ùt®W@ëé%žï³Ä\;y®M…Nb7)„XËæ–ÔirD®‘“sg^wyµ{Z}h«;rd½»µ4ÄâI8±¬À¡ëcÉ,G ت¾’θÏâiÉ'a8ñ‰é0€?*„´¹Ó ½o Ò–ab.´Éd9Þ®CxÁ±7-YdgisÎèÊoÅJKŸŽ=œULøã âXóÜù½…ô¸ÇsµßÝ^¯è¡ú´×EñÄu¨aÓt¨Q X=İ‘œ@w4Ž&?W§|hC!ýCÍØ‚«Ó&"ÃTXj9÷®Æn0!‚É›Ž˦~ZqD-úáÚŒŒ 5°Ów>Uµj\¯Òó¥ëQß(RÅ2½ÙbðõÝÛwï,ly³Ôââ †rú’÷.rD»®@Žq‚/[f¢´ôÖ‘a:}p€ëé¡‘Uí,mâÁpæâóêÈRŒ&lâ(çÆT™›„î¹,¸ûÙwF^JÃ8ö|±‹÷Î/uÙQèMtÿSž^˜KcªOH[Á‰j,ƒ[r¨TˆLgo»V,êò–÷X sÄeLä!2×CMÛün°K7îÈñ&©Ñ¸¥V;µÔ²îÍ+š‘µðŠEÁÄ=gurU<66V/ä«…y‰z½†n! Íëõ‚ ž?®ÏÇý¤ãBfkz9C›:Ål_ªè¡+Õ#Jî iú¢ccÅe¦1ßs•°­´Qð°ãо½¿¥ýϦ]·´$4• v§ÉÄî±ÝŒ“±O†„Ó#c2xótæú@£ñu3vßAh÷!‰¥c1’ÎKæ…:Ž‚Øp°ZpChãYì±,ƒkáÜhÙtûCÝ­ÖÛ(€+’§¹Ù’Ϭ¹ç²ÊË7gÙd l8'põß6~?Šæî¢:o¡x:1ëÇ´k¢Ì]¿ðz4MU'WÂù:_j­È™ê»Ý,‰—¦_mu»²:ª¯5ôÝ·®¶ê‘ƒ>÷ÅQ N b¸òúQü¥ïÁæcÿþ~á;°X]FÖE®} 6Ÿf6œÜtdsêÚM-¡¦lºR½뇚M!òš·ºt°•y­¿.{^‡W¬Ž’¯·z6vÙj¸ôÿ?VϦ™` 77„æþ} ç;󪮧œñ\=±AûÔˆ~£²Í¦j ñ¨_Ç¿û*G¨¯çZ¯F¢šÂêeYá”ßTŠHSý8,ÎÝ*Kî¥,V5#¹Åw`ªë^P78HšÜ†ÀÉm³EÇ焘˜LŠBŽibŒ†Ò 4¯›„Ü©šàýôòžI¼hâÐZU%hÂöPêõ˃h[XõùŸï¤½„VG=¤J¢ 3©]•û]õˆN+ášèî‹ 4æ .ÚY˜±çJç|ÜoòlªùøeñØ'èû›~±mD"ýžáÌ*…—¯á)~OgŸÃgËð¢X‘Ô¿cé,¯r–5]›nú<è@uã7ÛËÊØœ(KÜqqVÖ:À zNIJ]`ÊÂv„édòh$±ø_e—i3ñc±,ÈÝòöY›ü8xnúúƒ½²"õiºñ¾žEçc×Dîç䮥Òù´ág¯ñ1Ýù9ŸÕú—-ï¯þÓv endstream endobj 1789 0 obj [ 1788 0 R 1790 0 R 1792 0 R 1793 0 R 1794 0 R 1795 0 R 1797 0 R ] endobj 1787 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1789 0 R /Contents 1798 0 R >> endobj 1799 0 obj 2826 endobj 948 0 obj << /Type /Action /S /GoTo /D [1800 0 R /XYZ 72.0 700.101 null] >> endobj 951 0 obj << /Type /Action /S /GoTo /D [1800 0 R /XYZ 72.0 494.278 null] >> endobj 954 0 obj << /Type /Action /S /GoTo /D [1800 0 R /XYZ 72.0 220.879 null] >> endobj 1801 0 obj << /Type /Action /S /GoTo /D [1735 0 R /XYZ 72.0 610.772 null] >> endobj 1802 0 obj << /Type /Annot /Subtype /Link /Rect [ 196.382 759.389 231.362 768.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1801 0 R /H /I >> endobj 1804 0 obj << /Type /Annot /Subtype /Link /Rect [ 329.005 645.142 355.665 654.142 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 781 0 R /H /I >> endobj 1805 0 obj << /Type /Annot /Subtype /Link /Rect [ 361.914 645.142 519.944 654.142 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 781 0 R /H /I >> endobj 1806 0 obj << /Type /Annot /Subtype /Link /Rect [ 138.605 633.142 154.165 642.142 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1722 0 R /H /I >> endobj 1807 0 obj << /Type /Annot /Subtype /Link /Rect [ 161.66 633.142 310.26 642.142 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1722 0 R /H /I >> endobj 1808 0 obj << /Type /Annot /Subtype /Link /Rect [ 433.026 599.474 458.006 608.284 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1713 0 R /H /I >> endobj 1809 0 obj << /Type /Annot /Subtype /Link /Rect [ 204.71 495.898 246.37 504.708 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1796 0 R /H /I >> endobj 1810 0 obj << /Length 1811 0 R /Filter /FlateDecode >> stream xœÍkoÜ6òûþ ¢_ì^Z/êa \Ïé‹3Ú4.‡8pµ”WˆVRõðÆÀýø")‰»E¿%Aâ™áp83œåß7>òàï–ÿH#§i†òãæwE÷Q 0V$âá( ž"?ÂAG4'Tñ=Lü˜ñ~@ÿÙÔýsóé3ðì‘ûNïŒp!êãæƒ¥›bø[ÒÏC/›ž6·?ä{è©0.RìGq–eàчAÆÿèéˆ>]ÿÊ Ö±:gèHkúÂŽ¬Þ}FO?mÞ?ÍŒ=§ßšÍf*BÌ$I‚½e, 1¡¤EJäK3E–¨1 ޽‡ƒý\– ~²–½g c‹å&’á0†+ʈ¿Ú¤OÊ›#¤ùÞhÑhæÃH«êMäIN…»©hôf{ß7yIf„ŸÊá ‘fì4\•ý` >Ü÷w:”fé+nJÜR¶¼% Ê[êy^2™Ëÿ,ü:øÀŒý.¿[²z( €b=Mý•ÄÛ}©CèØ¢/ m 44;ö¥¬*¶Ç]Ù£ííh7És˜D¢µV’ñH­S¡¢Àà T÷¹”,Á!ä‚D‘ÊTaô~_ÈÜ ˳À~`’$€L-ãþ¸´-ôí ]hoº1ðn,«a[Ö†¢O5$Ú4ÁŸaÛ`ОY¼2²¸´€@á÷ÀØ(uéüþHó~¹% qÖ”DŽ-æ¨O«ÎüÈó «:6†¡½»½Ñ…{üœM÷Âp͆[ÆÁ‡áX-„FQ‚³„Âu9„~^²ƒ•5$¾N Ì &™Ú[?Ž¡ .=Ę;(„8Yo}- þ"š{ǃ*²æ·ÎYº¼ǰ/Œ]]ôháòM¦PÇ¡žEPÜÖ"—¾ àÚH ìq]V½Û¶é‹R”•¨j~:”ùÁ¡D6' kF õT³îíÛ˜ßÍØî¡V:î4ŠÚZµ¶èš#âUrêT™<Ïï0‚–ƒ^XÍ:Z¡~è@öËTÁhØW¨¹eýbA‚Ì-nÐTwgªÄÐFx(»ÔýÖ|é«HTBp¢³V"úøçëþùÍDƒ)§JäTö‹±1°0ιB È/Ô`cÏàâ3­Qªò‹µq*ÖɪöÇ>öï™Ë/lX7ë0¡XÅŒT±c9ukÙT4hfÑ27“z É[a_êC÷¸†dïîîï¾÷?1´Ÿ5ðÝß»ûþ¼…ußM¾X?4‚CÖAžzãtlä=¤%;5ceiÖÏJ&cHRT MËVQä¨áâ~¸7ðÜ>êrY,”>±ª~–[ h‘gó$MI^ =vXòí)roèÒˆ­Öà”JBæ8, |¦2" N¹ÄáV(z£q9®eC4}5çC;kW^´pÔñ#¤qY÷£{¼.)AcŸðÑ4M/•”5ßoBÓˆ`_XÔi¤ ¯€–ƒYØ×A#z¼PkÍlÅÐfÿì2%IÌ0kNUZ$¢æ(˜cåtÖ½¸F;þ( =ø?ƒÇÉÚL•ãg²FÍ "°Öè‘~1êõc7ó †÷M}e9¢óƒãB ÏQ᳄.ñêÕÂ[ £Ÿ† ÷gëÌ8k·õÆéÜ¢d²j„:3CÈ¥† ”w#© ñ°ò žŠ^Š F¿teýWUa=Ÿkfú“ä'…éA'úÖs Ú…XÇ”ò¨Hˆ‰àbI]ó}dp»Ü ²À#xˆ‹@={ßQŠÓP¥óZœ=è8Œö¡¤Ïi;vëp«©´›uwg_ÈÜ 423Ôül Pì`;óêç"³øœH׫ŸK_ín@ÛUm‡øTõ7ï’‘—.Ï<ëCÎd8‰á•˜D²ÿWÔr"_Ë5HI´íš݉O:’°c¤†(ú „MgXzV±|(_­M»f4̲¬‘ù˾·–imkvªm9–Ô±†'—Ù÷ft¢µcòˆà}7w‚ìë ÂÛáMcª] ¸¥­«ÔJG ›ø%Áiº[d bMx¨5Hk³?‡*rc*ºˆZÒï ‰ŸJ18ZòD ©/d—•[–›™‹H¸p‘ì.±þ’'À>ïÓ ª(LNsxBeœ 0§z‹š …¬æ¨axú–CÙÔ²árJ[Çj|‚£j 9UYË9:ž>PJåv56P‡É1Y˜,¢yÇ`R.‹±šªŠªw‹K”e˜ðO°^^(.k¶óÅ…øþ9‘gŠËz‡*.²ªðs5f[ ÿ£â8 í %ÀPx®.Gà•FR?K¼Àÿ³’†Àd‚[ƒ8/u˜5ÿ(ѳ¼èoZü›ÜèIÌë< ÿõôøï©ÿˆÊ/Fjž.<°D´ïºæÔ³îªWÝ0§-Ý•„ëÿBã&IŒ ÌéäËÇ=òßyñ¨„ÊЋp5SÏÁ?mäP¸q’eP¾%÷—3’ÐÂj1Øò*»|;vmÓ;»z,®(†fé_rùŠM¾ûø×2ýð“H ›­u›Oº‚4F†¢Z5p{–¸­®¿9'Ï :Vƒ!ho_RAÕ@Í7ÝÞQéâÌ}`¾Ø§Ò”ž ½Eõ®äçE€zÅöØ"ü£)ë¼Ü³z࿹±VTõTXM6*Jµá,íC'{:['•¹ôÈ´½™kÜ-lâ×ãpG”ÌÝÁ¯†kéx$Äq†Ã„\Œ0›E4¿m©›¢ÂŠÔW“º³î_¸+nfÜQÍE"> endobj 1811 0 obj 2480 endobj 957 0 obj << /Type /Action /S /GoTo /D [1812 0 R /XYZ 72.0 745.889 null] >> endobj 960 0 obj << /Type /Action /S /GoTo /D [1812 0 R /XYZ 72.0 417.428 null] >> endobj 963 0 obj << /Type /Action /S /GoTo /D [1812 0 R /XYZ 72.0 341.342 null] >> endobj 1055 0 obj << /Type /Action /S /GoTo /D [1812 0 R /XYZ 72.0 140.231 null] >> endobj 1813 0 obj << /Type /Annot /Subtype /Link /Rect [ 357.415 649.628 429.42 658.628 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1692 0 R /H /I >> endobj 1815 0 obj << /Type /Annot /Subtype /Link /Rect [ 387.858 615.953 459.751 624.953 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1763 0 R /H /I >> endobj 1816 0 obj << /Type /Annot /Subtype /Link /Rect [ 186.313 570.278 269.189 579.278 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1796 0 R /H /I >> endobj 1817 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 500.723 148.33 509.603 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1692 0 R /H /I >> endobj 1818 0 obj << /Type /Annot /Subtype /Link /Rect [ 369.561 466.928 448.332 475.928 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1736 0 R /H /I >> endobj 1819 0 obj << /Type /Annot /Subtype /Link /Rect [ 311.613 430.928 390.627 439.928 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1801 0 R /H /I >> endobj 1820 0 obj << /Type /Annot /Subtype /Link /Rect [ 423.578 366.842 446.898 375.842 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1713 0 R /H /I >> endobj 1821 0 obj << /Type /Annot /Subtype /Link /Rect [ 138.671 290.756 166.991 299.756 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1763 0 R /H /I >> endobj 1822 0 obj << /Type /Annot /Subtype /Link /Rect [ 187.673 290.756 221.553 299.756 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1736 0 R /H /I >> endobj 1823 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 278.756 181.081 287.756 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1084 0 R /H /I >> endobj 1825 0 obj << /Type /Annot /Subtype /Link /Rect [ 155.49 177.731 184.93 186.731 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1824 0 R /H /I >> endobj 1826 0 obj << /Type /Action /S /GoTo /D [1780 0 R /XYZ 72.0 745.889 null] >> endobj 1827 0 obj << /Type /Annot /Subtype /Link /Rect [ 241.608 165.731 285.488 174.731 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1826 0 R /H /I >> endobj 1828 0 obj << /Length 1829 0 R /Filter /FlateDecode >> stream xœÍË’ä¶í>_¡ãºj†©wÊåÔ:±õÁŽãq¥R¶l5{ZYµÔÖcfçï|I¢zŸv÷0D€ € Ø¿ßÑ(†ÿòO™RR–UT_î~×t,JrMÊb’²,Ž“ˆ¦„eÑ%Z’²¨•<À c?Gÿ¾ëîâèÛ»_~ƒ1Ç(¾—»xG¸õÓÝžnzÀŸ’~qôt÷ÕãÝçßd£Ç“31+ MóªªÀ¢%IX%ÿ±èñýòæ_â$ÑÕ"ºðŽ?‰‹è¦Ï~‹¿»ûúq±è$ŽIù©­ùÇ…Šà3EQxíKJL‚4  Dùi¡ÈÅY\þÝU9Þhû oÝè“Qn߃ EiUUŸH¹p¡’Ýr˜Ofu[_aR¯ýE§å&Z~ê£Ï¢‡´$Eôæ*†±ïxë(ƒ%Kj›qr¼Ob!ÖÞ¶¯ÞN}ßú˜ƒÏüÙ“óÚσÃú—î–ŠMwê‡ ŸšÞ¤ G>ñQètà›…Å+»ðî†õ ø$"3í}4ŠVÔSê>7âeŒúS4E$@4AÑj_câ‡'Øñ‚°2ŽcºØ¦&i¦>”ÚõHN(‰þ&çmº§Hêq„9bWïöEnÇh&}ÚÙô‚‘”æ0KRà,oëi6ÛTÈŒö[‰(÷‘®wpÝ_ ­GÓÿŠæ²8nÂjÞ7+‘²ð6$©å‡?žÅ¸þ¼£5êrÜîu™®¬Áç©—T“$(mtðØ£{m¿€³zŽG‡Øåx£ÑX‰1ù…8ôûþeñÍ!¿Ïb4þ”f¼wÈÙg<öþt< #=…"¡ÊWÖi:PZ…äŽûý5zTÎ#­?!¢þ:Êèá5¸ËÆœáC3þe;¥%‰+ ³¥:ð(YÊãÀ¨w'¹ Z$ÞhLïÁ<¸/¶0ˆ¦áöäì2î‘^šé¼;Wñù7ŶvÉÀÂËË, ¬ ÔÍ ÷&šš"M«*£,Àí) #ueÍ$+à$|“¤I€ÿ~w=!s½4më¡غ$^/pm°\¡2­ò°£8ñ¹öÀ42Õ‚¿l¤(APTˆxùlUŸˆhïÑBÏnÔ®ç$4ƒúN ZÐÀ’®Mýþ¦ë¤ÚqQ•Uà¶ÓïøMY"ƒ},âщe„@ÿˆ,¹!y²’`|‰‘Rž8“…u<+Ø?3AF¥E0zDßU°ÝbI}P<ßò„„»a¦RH/ÏPOåVˆ˜ŠuÖNî ¹˜¨ÈV&šG¡Š ³ÃÕz‡+¨:2™ºã,Àþp°œÀ·b¥qy‹WêØñ‹Øu.šå·ø£ܽ>‡¸‚„”ÆU•²Ç&¡ÞŒR'€,lLþGxVat„wƒŠÊr²TœÈt¼™f¾‚‹‰[aE³ŒT€ê{Ëo‡‚d e én²7¸•÷!xéÍé5¸Èe-lhäôò¬Ãß{’U$¯¾o÷†ÅÕJmË%ÌÚŽ½C®WÁ‹*å4¹T!.D÷s«",r«¢¨óÁbÊ;¬` £w ¬S®‚w#*I(‰Ó r&Ü· }øçl›Üâ´Sc`XÔœ ZEÌ¥ ÑȌѕt½¶Ô&H ö' ±éÊŽÚK•ódÆé$Àq;1¼ÃkvY‰¹ðưÍP0ÎõYï5á0O2›œ.·téº&Éj¿Â”×JÓhœø4C9ÌŸyÓòCÓ6Óë}ˆý,R:–ìà x)Í*`jÚGq9¨Dªòødྔ†0p­K¼öè μ=Yº…¸  Õ6L!éÚ#´2V}—eb«*‹8¬ïáç}—Mª[œffôØû¼Û¡ÂÛæ½ØÍ¼Òüy±šä#åo‘“$Q×å$ÀóõÚ¡:‘•%)ª¸*3ªÿ ®)ææyÀÊ>Õ)up÷aÌeˆ¨[Žåqt¸VYxhŽîOþ nÈ⚨?s'BßnP„iÅHäÔÏ“.sš[bñw§ „ñì¯ôØšJ¶¹–¦òî>II*듈˜º1•!î-Š+EøÔ ª\B¬>÷Mí>Žç~nå­6/¢”¸É‚£4Ë¡\Mó4´ ùr½Y*ù(=+ó»[C¸VV^ —¬¸HÜIJëZ‘ÿΞq ¡öÏb le+q¦¶„2B†œ_"kÒªE¦©Gc+)|ûºY³Ø /¢æ‚ˆØ¢‚°ç¦õ5“‡´‚?£×âY0KW&X.&Þ¤qlJÈx«¥O3E?i•mêiü‡Nµ‡$ؘÑ[zß©> ŠPñ+AÕ;Sò;#V´£3;œd`¼1دJ’|³^ÉÆHŽgB û#I+§`_ˆB нwR½:£›G¬ ÍHaáýxƒ£#—UtžU…±÷w+âÄLIáì)YhÅVƒˆ£%ÉYÓ”ænbÙß9ËzåÌZ,lóh1/†V¶ ìNº>X°)i+E»ãú5ªmüªzfâr^ÿ߯±Ì1­ÀàIæ:ÇŒDok8IÔz 8ÌŸí§òѣЦUýG·ÛJWûh¤m.&À—9E9~MQF¸ Ôg‡»ô²H7«Æd_.žiÒUÞyá¬K|çÝ^~Yš°%Ö—[!½ü²*~8.ªŒø½›b_ãXì®×ëÚQ’à¬J@ÅacË;…RRVeLc–ÝTJ‡”§IïkÕ¯O!.–òe ¥˜90 R/)›~vXæ¸òÂfnÕ}Q“¼À¤‹À´sDLUA[^x7…æç*x¶Ò© H)HKc,š™ª¿#û›‘zæ‚é®p¼bÃSž@Òµ">FI|xšå{µt³Ó# y³¬’*0ýÃáfpŸqÙ¦ùã¯XÜuc„6%ŒŽÏÌw”ë”Oe: Él—'1eºŸôˆÁ’³@°ä9É æ"g[ÆE“Ô5ÎRRÉø—7‰ ‹›HGIpV¸‰À´¬ªò,0í¢àtÓœ_ž*IN\ßK†™Aá»8ÀrâÃ$:Œöš’QÝÍ×–ˆ+Ë‚›²€ù$àº?`+W“¾æ:¥"º(€‘´|»@šiÝj´î¨¿®½¶²¦êLˆVpÛY˜‡ÚãLË’O—[‹AÔ¬<Ô¥=½ØÐÃYÆ 0Id0¦•n‰0–­Æe¡q2t”¦¬ ý^ÏÛKÁZ$R•®L@S3µPPJÐ¥*ù4„÷º~EèÂ¥²¯ª º[ nÆ=šw',?¥nNªÂ+N &5òFþ7·Tv”aTk_ É7?LN‡—ð…±Ñ—_˜¢áKâ xÜÄŒ´@–¯,`M-sFóAîü$p°:8ŠåÀñ qÉKŽÁ ùC[R¤* HŒ±öµô/âY êÆ–gÞ[*"º¸Cd’3{¨y‰GTµCõeVc² ä0Þ½:Ä>š81Ä¡ï¼ù]\ü!u¨‰ñ,/' X¨¬V2AÌügyDVìeBRy²e%Z`J eT%ûYqBLn.ÓüuqÄR1>¼z£dÇÛœ¦pÅXÍÕ\ò™÷Û†Àrëdu“÷ݱ[÷óµõ±ÈE"ô¥Žãº‹ ¶ÏcºZ¾9nluöS|™q8ša³kˆ™O\ËÈí@×X¿©nUÀI;ǨÜî/¼[>7ŸÞ9â(ß™ØPØ{!®Þ":_ý¦'h°fô¹ c|PEló6/-kXªÝöúÇ]•J'›b…uñE׈ãû€ý¸èg*Úiè/3Ê#†å±“5î 4 B¬æó(ü¡bb£¤QõË4ŒƒƒýQ[e/Úe+»]çá òóâ®ïѹ+¡YLŠ$_ÕÏyV¸`1£©­Ÿ }Ûö8›T¤;«~¬VÎKFƒRªLìbÿþ• Á\ý\HGxî~Ú…ðxu£ßÖs/é8‚þY"ÜO¨¨ÅmnʽøG¦Ö¶ô=xg†’JX¤“BQ÷(ô:xàÒ–CÍ¿0“lÛƒ£LÓkt‚Ú .¾óÓ9R™„Û»ÜI¶3_΢‹TfXµY¤±ÃÏœÚ×v¾`ñ~LúãÝÿí6 [ endstream endobj 1814 0 obj [ 1813 0 R 1815 0 R 1816 0 R 1817 0 R 1818 0 R 1819 0 R 1820 0 R 1821 0 R 1822 0 R 1823 0 R 1825 0 R 1827 0 R ] endobj 1812 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1814 0 R /Contents 1828 0 R >> endobj 1829 0 obj 3194 endobj 1058 0 obj << /Type /Action /S /GoTo /D [1830 0 R /XYZ 72.0 609.167 null] >> endobj 1061 0 obj << /Type /Action /S /GoTo /D [1830 0 R /XYZ 72.0 514.71 null] >> endobj 1064 0 obj << /Type /Action /S /GoTo /D [1830 0 R /XYZ 72.0 408.253 null] >> endobj 1831 0 obj << /Type /Annot /Subtype /Link /Rect [ 147.5 724.722 172.48 733.532 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1713 0 R /H /I >> endobj 1833 0 obj << /Type /Annot /Subtype /Link /Rect [ 204.71 701.935 246.37 710.745 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1796 0 R /H /I >> endobj 1834 0 obj << /Type /Annot /Subtype /Link /Rect [ 365.625 656.361 390.605 665.171 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1713 0 R /H /I >> endobj 1835 0 obj << /Type /Annot /Subtype /Link /Rect [ 204.71 610.787 246.37 619.597 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1796 0 R /H /I >> endobj 1836 0 obj << /Type /Action /S /GoTo /D [1777 0 R /XYZ 72.0 607.053 null] >> endobj 1837 0 obj << /Type /Annot /Subtype /Link /Rect [ 488.835 528.21 523.275 537.21 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1836 0 R /H /I >> endobj 1838 0 obj << /URI (http://www.mysql.org) /S /URI >> endobj 1839 0 obj << /Type /Annot /Subtype /Link /Rect [ 238.821 144.295 333.821 153.295 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1838 0 R /H /I >> endobj 1840 0 obj << /Type /Annot /Subtype /Link /Rect [ 339.931 144.295 428.271 153.295 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1838 0 R /H /I >> endobj 1841 0 obj << /Type /Annot /Subtype /Link /Rect [ 410.658 85.508 523.274 94.508 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 36 0 R /H /I >> endobj 1842 0 obj << /Type /Annot /Subtype /Link /Rect [ 141.33 73.508 246.33 82.508 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 36 0 R /H /I >> endobj 1843 0 obj << /Length 1844 0 R /Filter /FlateDecode >> stream xœÍZK“Û6¾Ï¯@å»j„!øf[•x“]§vkíxR9Ä9@"$!¦H™ GÖþúm¼Á‡ÆÞœ¦»Ùhî¯P>ÞÁ¿üS¦—e…v§»FNP£$7¢,ÂiœEQ‚HŠã ÐT”¡FŽ ˆØRðg¢ üýv×ÞEèw¿ÿ:5Š`Üå.ºa\™zw÷6X›QúkZ_„w?<Þ=ü”!¡Ç½wq\b’æUUGKœÄ•ü/F'ôû‹_Øžõ¬Ý1t¢-=°k‡— ÇŸï~|œl:‰"\~m{~;Y"ÄLQ8šÇ’2“hH´Eùi²9«g™Hôôß›KŽ+ŽÂ/Ãè«YÜí*@‹ª*ª >árBeò\À|5»[ÆJ,×u{Ói¹È–Ç펴=0Ä>q1ðö€öiøN; ™LHEQVê¡ïã8›©e+j¿Œ-z‰6®Ð ê(Áh¿;:¶ó:Ñ9º·¹,‚Ïtp̵}áÂÛ:Gší¹%´µ£ÏüÌVçíÆá<Á§¾Ç`ñÞoƒ¹üþö¼a÷Kï¤ÉÌ; ÿÓ*½‡ŸŠE”f‹16€cfÆ gZ‚V˜¸‚6ê¹@›mi6;ôÜÄ·âaßu{Jߢ¿!0+0è}#?ËÚˆ¡‡˜øÆ®pRIFp•A</§ÅË0ÊÁ=Q"¡;y.Œj¿ †äíºÓIá-Ÿ‘$Æx#Ê ²43žk:°÷Õ²¢d$^Žr޹é‡8Êq&ÝOÊde<ĈžYíÁ…õûâýKÄ[%…ÏtK[qZYâ¼"ÒxåÒ–Ö5êz›½{ΚZ¬¤-!§À\^>ëð¥žNÜ,Ç…lM¹ÄÕlçutiz’¸ö³J\ÍèÄÕ´I\£Õ9RïìÞñ:U sóøã*Á¹¬A‹ý¬¦MBÀµQ‘H‚Å7߯¯]æ‘wá–Uˆ8Á—¦<¤Z€<•S={H ½W=“QEM>¨¢’£þsUó¹À9Y Qþ/ÕlOÇfØeÌ¡ÃÚŠIVáLÅw\­˜mÊ[ULŽ&6u¨« ‡¡í ³Â„/2ÄóJä“ ÚŸ,†Ð¯²g=³Ðûk€±´óEˆ±†6øó $Op,ÅÉš½¿!:" `. 8„“BãPV8–…ƒÓüà#VgÖó®æ;Ú qm»özÏXL fEUŹ ‡w;-8ßó¬ŽPÒrôâÏnì[Ú/¡=óÌ믞ëök=»ãƒ®¿šÝšb€“¦}ÍÿjÐí¶gOœ¼kƒ/G®;ÍYsöœ.êšþÀXøå,TœéŽ-£6Ž‹™zöqä½Z‰q „¼¥·|ÛðîÐÓóñê„nÇ„(ø4¤£Nf§ñ„àŸÝ…ûî׆ üļ=ÁšnY°4½C³Ì±i¼=ù/¼£µŸùõM>A‡Êت}K¡UÁvªK{ÿòþ3{‚æ¨i–’ÆéÌAXËñ¢´)ÜS“âÌô{Pao¹šÚ³‹W?ÊÇŸAxµ­AøÂ_{5=A'%qÁe£yQÞ(Ÿy÷Ÿ†ŸÔÝÂBùÂ:¨A«Ã¾³wü\Í4™ îöe&¯±æ"÷îí¿ÀšG§œç(‹²5epª¼`½Ä>ÕXå¾Vi®k­üõ»ÿlÊ2«À¢âß›TÒ\|ábªX @üúøÓ¦42cš9»Órt#¯(f¢³DlæšÇºÜA Ít‘eÁÝB^KdÙ¡h Ý!*ÜÐ>PùŽ8rê@:ÿÀ`ù=àg›¥ð!)àj^%¡Ã’îÍâuu}3ÈU ÇX·hN‚&ñD“äŽåÞ†9%V¯Ùqw’Ü#‰èàº÷ãÆÁÑîVvÛ^÷õ–¯t¼S€f/OD7®l u‰ÙÉ$Tz=Ÿ9(°õ!±1þï+¸øÆiTÕLùñ¨6¸ëó÷íL6`!ª ,Ô+œG°Ì„”ϬÓ\Eg®;ô¶™S¬|À²t·‚ßy’ÍÌ{ sÉó, ä”xùr_f©¶ðþг›P«ß}à 6¤‚ƒžà9P°‚¬ˆôí9®Ä¼Xs¶äÃoÙ‚Dݬ,É×F+qé©Y›žÆâ¢S–®(ã™+&]')ʰZˆ@fïÇš³Ùkô'·a-s;ÆÐ碘t4œEÍÍ£4iVTe•­lÃÇ@¸®grS:£JgV橘W8Iìï{ í ÏzúõtT?Ü63OGRXÞv£duHæ!E¦_C*á ÖVÒÿCÃÛ»ÿ'¢áN endstream endobj 1832 0 obj [ 1831 0 R 1833 0 R 1834 0 R 1835 0 R 1837 0 R 1839 0 R 1840 0 R 1841 0 R 1842 0 R ] endobj 1830 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1832 0 R /Contents 1843 0 R >> endobj 1844 0 obj 2744 endobj 1096 0 obj << /Type /Action /S /GoTo /D [1845 0 R /XYZ 72.0 757.889 null] >> endobj 1099 0 obj << /Type /Action /S /GoTo /D [1845 0 R /XYZ 72.0 506.565 null] >> endobj 1102 0 obj << /Type /Action /S /GoTo /D [1845 0 R /XYZ 72.0 241.748 null] >> endobj 1105 0 obj << /Type /Action /S /GoTo /D [1845 0 R /XYZ 72.0 136.739 null] >> endobj 1846 0 obj << /Type /Annot /Subtype /Link /Rect [ 324.43 680.437 355.53 689.317 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1824 0 R /H /I >> endobj 1848 0 obj << /Type /Annot /Subtype /Link /Rect [ 191.39 566.248 239.17 575.128 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1826 0 R /H /I >> endobj 1849 0 obj << /Type /Action /S /GoTo /D [1682 0 R /XYZ 72.0 365.163 null] >> endobj 1850 0 obj << /Type /Annot /Subtype /Link /Rect [ 234.905 414.293 267.705 423.173 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1849 0 R /H /I >> endobj 1851 0 obj << /Length 1852 0 R /Filter /FlateDecode >> stream xœÍ]“Û¶ñ]¿o±gî`€ß¸™<4µ¯u“¸cç2íLšéP"$!¡D™¤N§ß Š”ë7ŸÇ¾Ýåb±»Ø/ÀŸœ0øs¯ §E!Èj·øléœä‰3KJM¢”±˜ð„F)Ù‘KRJj½&"Á¯ ^À·ä_‹ý‚‘¿-~ûx*Â`ÝiÁf„Q¿,>ºY€¿%ýÙ,~xZ¼yL gäií]g4OrÆx–’‚Æ‘Ð?yÚ‘ß^}hzÙ‘]¹/7r'÷ýëßÉÓ?ïž. ޣŷfïÇ !^ò<§lGFLŒ4  DýéB‘1Š»\PÐü=«2»Ò˜… _‡Ð7£Ü|ôäÀʹð‰áSä·æ›±î:V"­×`´:SRmi–¡©Äü ¹z» 8Û ,ŽIÄhÕ*ÀH,hÁÀoD¹ hBÉ»JõD¾ôr_ÉŠìuö9‘›)ïƒ"YJã¸E ¶ _;Iú­$]¹ƒú¶ìåæLÊŽœ›#95Ǻ"ë¦%­\ËVîW²{À-.¬ËiÂ"ÆX£ÐÿDQ:bK'ØUÛõ ºo•|F5Œ¸w¹ïIß©<©~k¾£Ô7ùض(à¬t0e;md¯%»ÕWž‰Š˜¦zu‘O¬&«fU­"úï©U=êÚûÃÑèX’µªåƒ`<8MÄR”§C Œ|”glàùj¹zój‘q ¼‰)F"ߢ9yu„˜v0„R; ëòP}~ŽòïŸ`ig†s ¿xúÖ/7áJôG)“|³.ŠyLu°‰ «V ëŸò<ë²8Mo-ö×ûe]rè² Ö§Ÿ¦ªy5ŠìÖJïÇÚÌ׫nöònâ|s1’©ìI-K¨°†4kƒ;¢:( Ÿª… '¶+ûVŠªìËN¥C¾@Īý²ùp&j?p-^Wµˆqš Õ?‰nÅâ5ߣڗu}&G[[g‹´Bª«±±˜s<€zòfáÒÎæ™öÏ'$ • \ƒÒŒBC5»áf ‹â”fEÂXš'7JØ5Û| ‹’|NäL »^á½äª˜-a7mIˆ‰…`IqQ—þŸn Ny”1–³Âµã”’ŸÔþOeØÉÀï 8¸%Íò¹‚ÈG‡< žg”1u?³ÙÉ—:z 7ž4I…#\ù~­ó+42åÏ#¦¥Ö7„k­ú€•{ö;p 4uR0ïQë… öº¬Îþ@}Èd蹞°k*µ>ƒr×ɧñÈ+¶Çœ¼Z5ûÞ•!7kLÚ¨» ú|2g…pÂâzÿ²ª´—ç3Y¤4gÐùyO,÷ºcB{Tv 35´–3uØShúÅr[: eï ¬´ÎüS3áb˜%G&¶›£©ïzgðFâ¶FxmÆ=‡9æÐäJ­•QƲì0C$˜|wÈò<€ª÷ëß¿@ÓׄžZöªñ²¡ÁN+ÜIˆ”êJã WÀmñÒ¡1÷œCd¸´²fB@PáWos©pФr™å¤°¯ïžf|äã™A•PLàGÿÜͱ_ØT!Aï{¸T„KË ×bä:ØîÔ´•YãMêvD¸ôàA¶ *Àª¬= ­D¤‚•ZœÕÿ$wͳ­lHÑùÙy´Ñ?Ž˜ƒp˜ËӀɗ•<\°–f+²ÕIÊêÚ' —t(©‡´­.Š«ÎÆ´¨!,f鄘ûv¾üðâÖJÒAõ]m©o’)‹|›ä9 XÌG2‰eÌ%<·É»—rw¨¿ØÕ’4KXØk­aÐìôßÔus²g‡¤ °!a8LDûp}ØÔbˉÅÌÌ8½3á4àiø þâˆßªU ¿lù®pL…E–]ú‚c|HZÈn~†pÂpr<]®¦²d‚if‚Ó!³_äYš]œšß´ì+~ÛÝð†×Í”<è«æÏª®e«/™ˆ¿m¤¾˜ß´0JÆ }åcK ¹)ô[ en¼Ë(yjH·ÕgåÂEvˆÝ LZÀ n6Kr”þI®ßþ`"@˜è(»Û*H.4^hWª6‡oƒY„+01(”CMG"N<Ã-¥ vTÛNí+êQÈA„¦ ¤‡Ã R†aQpÐDЈxäƒgÕ©e‚c?D" —)xu j-Á5Û@@wîz¸8v„+¹.uO=åïÍI>Ëö.X¯ú£ñZ°Ù® „”­ê‚ýNÚ9µeÞî×ì¿ëV;‡;K¯”±tä µ×p»¢±n»çvGÌôJFˆ¡Bö *€ˆñ4‚ÐczœJ¬°}í÷XPÐŽ¦ÝNm½n›]¸×dõZ–›£ü® ö:cÐ"*ÏМ'e:[b¸øÂ)‡¦530V†x0'„Ø3Xi‡S¤üeeâN§Ðy šˆBÐÙ‡˜ò ¾A´Ú¨j -½l¯UÝCÀ>„J °Col!'¼‰q8ÈÞä¼¹Ûëç[ÄÝý’‡…oT_Ù¸³4§B¤"çYák ‡*ˆÏÕ²"Vû/>9…Kª~ó/Â^ž$z¨¶²ŠЕ™/^úEàþµÚ[éš(Fpí—Všù 1ŒËè‹Üy[VŽËZ­´i'™Zõ\ö^Kº‚3q´"yçW³\øŠ†ðlÓ+ ýdÌ“ q÷¿ÌÎ|"ºµpØØVÜ=x­šƒí,m¿N÷Ö<Œe"›ÐÁT½ÿ^Úäë}B`Xåùm;tÔ ¨~²Ÿ3ÃD‚ú qÊ$Ÿ»Ü=F¸WDóXÿŒÔ4 endstream endobj 1847 0 obj [ 1846 0 R 1848 0 R 1850 0 R ] endobj 1845 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1847 0 R /Contents 1851 0 R >> endobj 1852 0 obj 2231 endobj 1854 0 obj << /Length 1855 0 R /Filter /FlateDecode >> stream xœÍkÛFî»Å Ÿ`=Ñ[ýÖk6‡ÙMÖ¹ÈYÛBm"Éûø÷ÇyëåGïSZKR$‡äp8ä¸?øw)þ$ÅI’¢ü°ø¡éÅò#M ¼yöBt@CRˆö Ó<ÁŸ/à;ôÇ¢ZôÏÅ·ïÀS rÏ rB¹Tõ°øÜ³M3ü3ÙGÐvñÕâ—!¢­6.Ä~„“4JÓ"š`ßKÅ?Zз·+Î÷-Úð5lÃVåìÝw´ú—“öRì'BšÂzd$žUªxÇZtȪlˬê”üíj3Ÿœül!û<0R.ŽcLÆ©ÿØW4 (âÓÀ1ªVP”êïI“ÉÄbÒ7xš…?q§0ŠqLišÆi Ÿp2H!šÐsóÓ¸7MOØuÚë ™œ¶²EïÐ2 ÐÛ¼aYÇŠƒ—ÛŠ7eµ5x·cüøÞ@mÍòrS²ÂJU3ü_>>޵†š²}1ð¦Ü3lß œúnÿj9Ù¦X¤àÌš çÜZ¿cù_yÞ1X½• ð~R-´‘PQ(¨cÏ)².kY绬uHV½:¤-å>kÊ®G{.»ÃËð}ÑC*Ö_âI|F¬Í=ìã{ÜC6~åÇž¶ß;ÌÆQä>ÖàoO}6ïaN¡‰¯bgËó *;tla_žw å‰5HXÑ2(ŰH·ƒ$+¿|ðÇyIPbJagàVPÊïê®äU«DŽ$k³ét&«¡HA(n„P‰/s³Øôè“);2ÜÀ;f÷à(Nr~€ë¥Ðæ¡íìBp·¥#¹û²fHl+?võ±°áÇíîÌú ˆÄe—Ðxªo`ÇŒ  ÎHã+à [ƒ¡ö@¹LtxO¯á°_ ïD@¾5¿Kñ¥pwd=z•!6J®ö2ˆpÁ¥: —·gÝœð_ôs"LJpæ/:&#ɶg¹,O”$¶TH8ßeM–w¬±³Œ%lx3+ZV"+ &"è>mèXÔý¡¸Ë,îã¦á‡Ùe ¶ÉŽ{Ç…¶ó°%À1ª@"1AiiCà|Ï*‡@Mrˆ.Ù éDQ:(]ƒúÕ8lÏólßCËu™óêÉQÚc]ó¦oÇ#øÔ[Ü$F<é„§^ e5 gñFš¸Ì†„Jñ§ î¿õž9’‰oûøî¦G}ÉYÝ9üëêÃ’F=EU1üwŽ#@Nüé°þÖ+Jž5Í«Cu¾ íqÕ¨XÖŸÓ`äsÝ𜵭PSVm×syG݈j—!o˜ºë¸¼»@¢A©+ ?¾É–Š×$ÆX4©iHu»²Ü]*ž¸¿2ï˶Þg¯(C;¶¯Ñ<€±± –•pFDJ_$W›RÅÐ=ûq¬Mãçjå”ÿR­œJˆ&±‚&èb"$BR¢;•? 7^»GÙ„G'\¥p*l×3U|•I4õÎé¹Ä²Á‘»Ú®#¯Þ‡$žwºhuË»³û0Ὸ‰«÷!MF’¿Õµì ÿŸ}ìy"ˆž7£ù*›K@5kZ^ÉÎ%’½8pÈäݤ(ª PB²‘`o¬ÓrXn÷P÷'ªÇ·òµMÝó‚ðåÞ~iXÝ”²xÛeݱÇhç–Ÿ)ùùÛ€*4êV£Üð-ÓF}Ø”l_´Øâ+åŽBžK9+$;v\Ä:1M- +lcá¾r êQ!½XŸ­žzì±´ºŽ·\§¼€•Ñ> pÍ4`º þÎë²2õK¥µN¥H¾S(ÃlÊÏ$y}’àÚJJ»—Û“eNV¬“‚s†1¼5žÈ˜ àDZÌÿ’Û&0sª­óo¦… h8Z©—‘1NMNZTvµ d/°]ªcT»¡Ž]¦Àñ5¬ìy¡x`ôfÌxô<ÿã'+üáã¿oŒ•„1˜ ÂhN‰×cÖ¼! ªÔÍòéne¥/å!`¡ƒIÎ¥JËEûü8Á‘¥Ø‹ÒöÝ9›¾Ü~þzû°š1+ 3ãÚÅ95×VæÀ‡e„o~dž¾ž»º§ü—®î© ©Í5íT¤#Éû†?•…8±z´³PW³Š%À¼[õÇ*AÜ{€Tp®žeo,Ör ê“kèý5Y¾«Ê¼ì­,ÓD›_`¹ ÊóÓÜiŽè(pz7$F~QÀ{†»5Ûeû¸Ä3øÒ²¬É¡–Î%Ât§D&$¢8…ã¹óâ¥ÑHJÕrª|ÕÕ\azâZîU‘VĬÙÅ/V­¥˜ÛK"kÇ UŒ5uÃ:ùö®¥˜iˆEÝ\ú!8+zH¯®ia8°ØbòuYÕL3Â0”Z[4ö'‚Û,!é8# ‘åZì²:ûBìCó’4ŽB½ÌíKv¨ÍžÌŸç0 qD¡\AË¥Ï'B3.LØäSyþë˜W¨ŒãS*!•èLRL%Ôk;¬–÷hÃ9†N÷¬I:^óô P‚"Ñoñ’„êßTwæŽôR¯GÑYfP÷s€&ØÇ;2ICT*¹n¨ó|/ÏÓsV"sj¦‹CP‘Ò`FÅ)û†þÀ1z*ù±U?9ib+‡#ÖR–‹ÊÔ#Œ:ÿÁ&xÁÈ–;Ñ£‹…m¯ØïȡѽAŸè úr­9!PØÀ¨’^¨ÚDÓ._lt=u¸p¼ÑÁ‰qÆiùzÐ…1gÍ[væ°E±ø ¼4 #müÃkÅëö|šF)L\4‚x³+Mv/%3BèÛÉEÒ'æ%e*h^ÇæÞ`H|Nò{ï÷ÞÏ‹ÿqLí± endstream endobj 1853 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 1854 0 R >> endobj 1855 0 obj 2366 endobj 1857 0 obj << /Type /Annot /Subtype /Link /Rect [ 427.934 300.293 462.374 309.173 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1770 0 R /H /I >> endobj 1859 0 obj << /Length 1860 0 R /Filter /FlateDecode >> stream xœÍWYsÛ6~ׯØÇd&‚q¡ÇÆvëN§9¬L;“ÉEA'<’òñï»à¡ƒWÜNìŒCÆ·Øýö~ÌPü7wßcÄ÷ „ÉìG³Î@sªY’”x\R*€{„KHàrIBŒ˜óoGø¹Ø‹óü5Kg~}ý†{Ö@÷8£#Â+Q÷³Ogº5püšô£°ý²œ]ÝJ`–›ÅBß(c 2êÁûá°Làë›e–Ål²r»±¹MCûö,?¡¹!Âwh†çÑ·;›Ñ*¶¤åi€]å&±0iå×r>TÌ5„UmÍ·ˆ6,û’hAÆtãù®AÂv0ˆÝ\GÅ>ž `gã=4¤€}ÂåÈwº+“sI\V©E_zãžÑPáÒ'ZöqŽC,Çë)ò0k(åÊÔ¨›§ ÙÇÇÓ†(cR¡0¢¥×€ ã`¤©¿ {Ëz.º{H%ÇD^Ý26à„>¢ÃÓ æXØ;ÇLe Ö*ŒQ…œJÓ¦îÞ¦kçPÌ/çS Ò‡(;ðÄû×0mâá1Šc°îË¡<ä5¢Í¶*ÑP f’ËÍ3'ñŽ“8çÄ×εgwQ¸[¯&üÊ=ÇBT«ùýsší‹¨˜¢‡+EŒð1ñŠ0tR$C@ðuô#‰ZQæ‹`›z1ª§ß¦¸ð}b”gŒÞ¿+Àؤ¤G/Y?Ñ1GÊ]–è<ˆR¼9%“Á*;”•£ÃCŽ©2~†ÂÆ6,íÖA¬‚b²ž Á‰TÊøŠþ§‚&$D©’B¿´¢ $ôó¿–´¾øŸÅWœ(åzæ v/)mÝΖ6%ä‹K›ÇÑcELU¶Þ®ñÂæ 1"p¤®õªµÆl¿Òò8«/õø<æÛµ:ö‡va=œ¦Ç<8®|vÏŽ4”2mBb´ a ´¯Î¿‰p_4ñ¯£}üQ¶°·s¤`ÀåÚtðç\í²G@óÂ]b:9ënNœ,'Kjâ.ÑFbŸèõÓÄ2^¸Û×Ú À¸GÆYö½€8ún«Ž¶˜Š>I’§)óXSßוïhÒ‚8.Ÿ÷¶è³%™è ÿ<$+ëšâé-Z,À“X,2—Øß¢íÎå w×#X¡GÏ­ž² à(ÏŒœè0ÕaC(Õeè& 3wXÀÝý‡¹ïK3g8Ýåæºa› È£âiæwi¹·ùƒ»ƒT ý¶ø L—÷¹ °k¡IX‡çŒcÌc]_p½ð|Y¾ïËP´KÏ—ÂµŠª>º›O)°Àç”!Þ¯N\)ÞåêéÅÛR´‰”1 *G”]ö íƒø°k[¨pOK¯û¦îâ§)FÔÐÛ(¶ÇìUoH5Þƒ•Ï çØ{„in?ßÜÞý}eËðª"£þ?Ìßµfe¼Ž(W¶q¶ blƒé&Úòº´lPÇ&mP49{Nšý†Å„æ endstream endobj 1858 0 obj [ 1857 0 R ] endobj 1856 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1858 0 R /Contents 1859 0 R >> endobj 1860 0 obj 1367 endobj 1862 0 obj << /Type /Annot /Subtype /Link /Rect [ 165.82 698.229 191.93 707.109 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1270 0 R /H /I >> endobj 1864 0 obj << /Type /Annot /Subtype /Link /Rect [ 211.09 698.229 237.2 707.109 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1530 0 R /H /I >> endobj 1865 0 obj << /Type /Annot /Subtype /Link /Rect [ 215.07 654.109 402.55 663.109 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1273 0 R /H /I >> endobj 1866 0 obj << /Type /Annot /Subtype /Link /Rect [ 203.13 632.109 315.33 641.109 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1275 0 R /H /I >> endobj 1867 0 obj << /Length 1868 0 R /Filter /FlateDecode >> stream xœÍVMo›@½ó+æÐC"5Ã. ËnYmÔ¤i¥¨Mb©•’^(Àqóï;kˆl̇z´‘µ0̼yó4;Ë‹ÃÑubåsTJCœ8/µCèµ)`è{c<½hšXRÌî÷~GKמçðÛIßœ»ò™£¸µÃzÀ7P·Îõ·Ú™s6vÜ‹8ƒñt+±¨´ÔZ“¢ …§íσqwGã,[0ÍrÈÍÔä&ÍñŒl£=BÙhNùØ^x”N ÍJS@¥ÑÌ$&-«øóqC3ÁªC“ìºA‘Z. Cdû­HEe#K…h_5ˆì?VY–ª‚jí¥ÌZŒÙ.áv ¹þ”!†œkjM¯P5Zˆ+1Ô1S^»Y<Ë‹\7Àòº|½_¾¯ZÛîÃåÏ«siÏMã<®°v©'Ûûn<7°*Lq–N³U•‹,…ébi ›B…‹ï°ÇÜ¢ +¨ßÀgàK\3Æh7màohYd»¼dGYR£äÇ$¯oÌôëYÕQI裔ä-¨¤V(Ü…÷Çá=º•O TÜj u;zSñ¤73ujaïLÍSs¡í\ ÔÂïÉõç–Ö¼ƒ¾ÜØ›šTÖ¼Ke;qWÑ’â—YLkœ=¿Ýà ¶¥Ñ‚„_7çßÿ¸Å<Ê;ÉbwSÕÉé«É j­Qý\%uéÄüÅy™,‡ˆs.†™¯Íã e᣶}ïÉ.08Ý;ª¸/…ä ¯Ã^–ϟܪ,²U:øfSSº=…mQASÂ×Z…¡îÀ ê ‚NhÇ–´‘I… <µm½PÉ ¶‚#·î«®ÄƒìŸü$§°P4¢; Fÿ;^¸älj`õøú²*çY>8õ¬lÊ·†öÃEïì´ÖQë|Q–&…Ç7¸Šò§U—™IñS§ÉÆð9™×œ˜î2×Î?9V– endstream endobj 1863 0 obj [ 1862 0 R 1864 0 R 1865 0 R 1866 0 R ] endobj 1861 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1863 0 R /Contents 1867 0 R >> endobj 1868 0 obj 737 endobj 1870 0 obj << /Length 1871 0 R /Filter /FlateDecode >> stream xœÍÙŽÜ6ò}¾‚ok32Y`Y/É:žÅ.çAÝb÷0#‰mÓ™¿ßâ!‘ºº~rŒ`X%«X¬“ì/waø÷ þ¤! Ò4Cûêî‹Å”PÄb‹ŠpÒc†hÐUhŠŠP 4þ€#ø3™ ðúï]}‡Ñ¿î~ÿæÝùo,®—út÷Ñ“ÍN€ñ·$FÇ»÷wï>Dˆ`ôxp*fqfq–e Ñ4`4SÿQôX¡ßß›o>LN÷ð§Ù±ÒØšºâ¥£}Íž£·è!M‚½Ù‰mDëtã¾õfNï>Äs.$"IÔ©àdÉï§_Â…x$¦AÊ(Æ8Y‰Žóo?~rÀAð²ðäµçeé€}Þò6pðo“Oþ–å©Ò[Æÿ1i¢âþ’îÁ7T)jг€ÇÃhÀÀ>1I™Ùõù‰wO¼B¶4Žþ”}Sçå×yÅG@Ka)j7Üíþ"r»=ƒ”nqØ\0Z?fŒã6UGp/ë.µÇ®‡%Ï[ÉÚ-râZuÞ´¥’ à &4 —ʹ`K!cAÇYãtI82>‹²\žBÎæï82g-Õaœ…òƒMói‡*)fË…~ú°mý ˆ²÷8‹–„HIЬõr!ÖÃC'JYdãC¹É>ÆËéã&aî|:…ж (åñ¡ä/¼¼†’tFùéÄ÷â𪪶x°9 œÀ\ÑyŸû“7UºñùI쟲Ô]ëà¼ñVi L‡x´aÀ@þ˜ ë…Ã:nX÷ÕÎÿ´ãÝ™óÚ!%.OCúŠÊt©¼mÚ„m“y"Buƒ , 0M0NñÊ©$ÛB„øc,W‚\†gÓMhx 2òypck0‘§uˆmdi@h:€%7¨%›ã…$nˆCÈÑÙ íý-Üã4  ÛjÈÅ yÉ›n›;d‚6ŒÙWrÏh@U%”.W؃m2§8µ)Ž¿rë¾S +YáÍ›f›5eAÂlFVìã&ÖŒ0Š ~&++œó¦ãÙæC«˜uŒ³¯äµ(ÆÆ4^Y2« 5öíqD¾òØi±8¦˜5ÕCµ!7™3B¢L&£é×1g$ ( ³4ªÅ ßõÛšg*N$@›$—5ßðrD' »¼:ìç7-÷bD^¶ÒA?Ëã2úLçYKe,]šaUü j¡j¤öóÛÀá7c(XG»AËÕÈ…”O/z‰6ß•¶”Ô•ºLf{YJÞn<‰¿÷ Îj˜î¾Ïü†=3p˜ˆbã0KÙ·³?¹@èXW<¯½wOyç Y#¾ÍïÔ9Cƒ7]»’º}P]Ò¡Pìum1oÛühÔl0¶\0€W.Ä÷nø$޶>çzÀ áݘ‡ sÛö’Œ® Ù”pEt^¨åz ©J&^–7<Ë‚0ƒæ•&ÑÊŠÛ¥ÁÑ%BOaú5‰z_öwG8œ–'úã“7½Ì»Î‰÷º²ÀΛøÂ›l=„­œ,°ëë"¯»{‡2!ÆŒ_eïmæ9¨“+'ÁT© 2ÊR{/RH7 ÊhŒ­ôµ¶µxÍ9|–¨kòý3*ä¹F§FB4¨Ú[ÛÔ’[˜&6&ý|©XοÖ,)T'p%¿Ö@ºšQz@{E ½±òîÉ›(Ý8wÃÁ =Èä/m}OCƒý¨á{ÉfCŽÉ¢S4¨ÇדrÜr²ÓQXf²/ î¼µ‡c õÅR¼u°aPHœªÏ\jñÝŠí¥álÒKÞ¼ƒ¼kø¡ØåŠDxe[-PU–i˜Bq†‡›ª/WoªH:£ùÔå¾OÐtd²Á†ç…½—pÝ£îe}Ǿo=R™>.fú>7»¼ö˜h‹Ðcsùµ\½:ÁZ¨Fy_ê(m˜™+Ý”­]7@Á<ÛéK^ö‡´yª PHuŽZÞ!µo\+ˆR¥€Î©Ôþ‰ßhÄ uƒzÊ6{í¥p°œ-,)Z~Êá†nð©Çьԋê:upC=.x)*aüƌý¿†,[“Ò5FÔ…xEorªF=ó׳l Î8ÌÇQ-뇶¥çM1'a}ŒàÚ•º„ª§€ÉÕŽ†kµÍ¶¯Q¶§ývÚ%™»CZ’ê§Ð(ç”ïùક¢Û…ÂZá[¤²a—ïT-|«A¥@TÂOØàí/×ÎAÅ>¥ù7(ä€ìÜ*ÇUbìåéµJ«Cª¡i*íÒ÷à&¼Fü/ÑÝ쌱€Å)tKáௗ\`9ÿš ,)T*ÄU`Ö§„žPÌ<°, }‘lüg¨Fù&ű”;ã1‘^‡IÎ'‹þ";þ¿÷%°AðÞ§.}ž¿ñÃïWnÀ£d¶ÿüt*!—ê†LÓ›ü+ŸGÀX3† -76n)á>äãhªT¿V04޼ÕÇ#xáh{{E>J´g%.°8›m¼í¸ºå õµ¦¾QTÃ]/J›êÂ1©¸ë3T!¼¡¾É¼·#S®ªQ!ë¿ ßu9_n»õÃ8°LdEê ž¤n.PZÆãó‹l%<—Þ$c½k8'“ƒW–’¨sý*§Þ×}«A)­uÝ#´{E 7HPsŽšS…官å£EŠBeã!ÎÒˆÃø–b8$ÑŒJ?ÂDÔ=5©±-$ÕPÅ슛éÉ<š¹©Ç¡+‡5͵« ô•lÜNì:þ—ÆzI£Pµô>Ûá(Úè÷nAõ<¶òÜB“Ù¶ÍÃÔóª¬Sñy—£C#+È”`ýúµïNPþ»¼<ç¯-GP· |‡ºp8(dÊh}PL½ù†¥cB­’¨ŽŒfö©å‘kÙBãÝ^<0uÌVIg%™ýÙƒqö8 2hÖ!'9h/ æ6ãÁa’eOƒPUÜIFW˜M4ºV„@ž9 Ù ¹@UEû¡N2¨³ w2Eñ5ÒÄ·Ú¼æÉ-ñyˆ,x—‹ÒãcÛrì¼™Ù›>|Éd²b¹¸äS“f³ÍJm/êBO‘> ÑjÓjû Ái¨áA–¥<+¯çMNaêðïntúHÝ:2õ‚ÇBû„kQ(BuiœÆ†dP àïÈÞ‚´Hõ: eÅ+•”ZÑõ6#ªÂHÔ ©(¦}‰£í­ÂCÝU/†Vcôªðª§$ ­½‡D`0 çgõlÞU´PxÛÓ•² Âpüfê9oQ%Ú´ÿùí­B'Yƒ'!±UcxUèŒÌHúú¹V×*F$)oäÀJ§‰Ýz{L£ÉÀýÔï†*u¯§›e‡¢>Ki8üì%¾*DŒg4ƒý¼»Gþ¿‡¨_X(!PÅ×ønr]˜Tå÷“Ûݱ«FgáŒrd÷¹ýë“ï÷ªÐßZïÇ=ïþÏ`?¼ endstream endobj 1869 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 1870 0 R >> endobj 1871 0 obj 2803 endobj 1873 0 obj << /Length 1874 0 R /Filter /FlateDecode >> stream xœí][sÛ6~÷¯ÀøI™‰h¼€œL’ìf7ÙÙI/îngê>Pd¡¥H•¤ìñþúÅ• ‘’]»BÇl¦ãs œðã98ùýÂ.ý3g?âÀsâ8ËíÅïÒîISè: ]×0p`¶ k AFÛèTýѹ—êðß‹üÂÿ¸øùzÏ ¸´Ýý…;Ð9ïê‡‹ï´Øä T¶)>Ü^|¸¾¸úÏ×ëvŠýȉ“(I:£±ãÄýÁõü<».Ьë¢%^ãçKüæpý¥m ÇYkús{ÍÓ|ò¢Æئyz‹·8¯Eû¿_wæÌw]'¶mʾë„H!‡rÜ>éÿã µˆÙ¥N }UxéXÄÄÏÁ]#bWØD¡5Á 0Bò¼$AIB/9qB^!Æšá™`,.Ö* ¦RÞgáÓû¡ã{‰ëº®|Ћ|Mn÷eZ“"ÃgÓwõ õç.ˆÙû눶öä”-È–¤íÌ7Š×cÞ¼Àl ð]šíSöÎÖ Ö$Ã@FÀâ:ÌÕ§¤ß-›ĺ  ª\êÃ1Bƒn0Ò¨ @rR“4#ÿÀÔÎÖŽ'ØŸ›: Œirb¯Ó}нˆ(¾Úçò'‹BÇó‘€×2‹„UB+:jQ¦©e¾G#ÐP6‡ã0]K¤ÝÉJÓ³wîô"õ;[K‹© fç„Ù5ýÎ}"¶’0[ﳬQvi½i”b݈i#-÷U]l•â³í‰&<§·Xæ 礢m<Ú¢ö^I±È³uy-êe…«ºßªÂµáΜØg_б/Wäv»²ØÑ/“gÎHyçηIZè÷_”(x¾EuoD".(¸©ÛèxMïÒ2:ª»A×ÝÛxIožPßO ¢óéîSß"Gëû(;uNÜx#ÕÜV¼ –óA¨Î *QÎçŠÌX^"9_H׬¼˜+¥î4h8æXÕ&ùº(·¼W‡¶ ‚™ÛHß4-µyÝhuшU½Âeù®Ñ½ãµ›õ:é\1‚ÐÈ2z.W•  B]§K’‘úá]cÔéÌðD}ÞÀx rNy¸*?íœÆ Ù”¸˜Ö5.5ÇxU¾ÂØðÅ8 mG }v·€>-åfŒ±$‘•ü_ZâØÈqü|¹@uoD".¨7JÝFÇkz—–Ñ)PÝ ºîÞÆIJëôÆrJ$¡» cÉðÎÆ)Ë„(+uNà ìF Êb)^)K‹  T畤,aË’ªk,Miú~§)œP(å~C–›ãÜe‹«*½ÅlÙ`ÛM˜Ý¾ê¡ÔÖ” çµ£éï59+îÓUÅÅò}Mf73÷榧í¨Ò rÕC©”âg(Û‚/‰ÐáF`F¶»¢¬Ó¼µ¨Q¿m,i#mÈ­9o-ÑÆá%QÅ›ãz;ŽÖ i*Ãr{®H¾Ìö+éÌ#Ad{]W½9šmn²Èöç §yÅNemXÿüÉÓçM1w‹Wcô ÆC»‹VCdn¢gÜ’FC»„¨³_‡Ú]BÓ;:aç™»„èÀ.!Ò= èôê” : õ·OIhébQâ»5), M ²TçÄÎØ [ñ2Ȱy˜aÕ@õ™-øÐB–06Á·L„RìäÊPµ+´Ü·MŠF¼¬/ßj]áFÖ’ÝûÊÓ­ ^”³%j!JÈ’-He_oŠR»“¥n¼"5½zœ|If‡ØË#xE‚fÛ@«ÆÆG)ÅM{«RƒêŠ ¾Básتí\q•å8MäU<¹‘&µ´jeêöA»RjÖÅ>×Z‘¼Óê8yû@×ø'v¼4#Åm™î6àØÚ•Ù¹wýÚS–•ä*#U]áÝ(±še' Î‰›w#ÄÊV¼LÄÊrPÉó+ó0B|áEWdm—Ú gdKÄ~²¸dE³]ZòßIad ðØjÉW䎬öi¦Ã÷Ey`“É F¢¬£ˆ¯›¤šœù¼ª)ÛJË•f–=ç@k‚³•#6#vèÇ kZ³Ùȵª.ÕÒ˜0\V»ååq’Ã~#Íbìqb´¡ÓZíÒ%ž«™Zi—y½8Î[nf¼‹ 0¦Y§‹êæÍe üØÊO±×¾ŽmåvÅëÿ*>:FyË„*;QuVðŒð[ñ2m¹Y*¾TA‰†ß, EÅ †¼§hD¹$”_‹}™s "t¾dqœÐ¨ 7ßå4H¬YHå¾Lw;QÀ¥Ep©|ÿùM»üòÕ¤ ÙÁ9år«(¤QŠu&‘º‘*%É•›ÐoöývÕ†É_0ãBj˜ß-”§–„Âo5`khv¹FÖ­|h ÆàGícá[•òÁhê²Èë”ä•fJkMÉpz`5ÏàLE.ž;é…KR¬Þ*µ q–÷¤j®‹™öa»ÛÊäC‡¯Œ-»Ë/Ÿ.ǨXí|ýú¯±rj)d¦rj9®T9õCý×›”ª•Sii“×ËÔÒØ·’¾vˆÚ\K3<~nt”˜:'t¾}ÿïoÇÊ©¥™Ê©å¸RåÔ…¡þu*U­œJK'½HE±Ð6<•MžTb—E–áeû¯  Ú kÄ|F°ýårå±l)š†kpòçàäØô¸^l=b!ØdaBO«ËRk˲4˜ïYj3ûóî: endstream endobj 1872 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 1873 0 R >> endobj 1874 0 obj 2578 endobj 1876 0 obj << /Type /Action /S /GoTo /D [1872 0 R /XYZ 72.0 769.889 null] >> endobj 1877 0 obj << /Type /Annot /Subtype /Link /Rect [ 438.241 133.499 523.274 142.499 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1876 0 R /H /I >> endobj 1879 0 obj << /Length 1880 0 R /Filter /FlateDecode >> stream xœí]msÛ6þî_Áñ'gÆæñU$©¯;±ëÝÕ DAÇ©”]õ×ß à‹_.Žé±Úi³»‹ÅƒÝ$1_ölÂØ¡g›añrï‹ÛFàîDˆ|Ëôß²\ÃñLÇ7–FSä)ôÑ GRðG£-ð ã·½lÏ2Þíýþ´™ô{س¶(窮ö>j¶‰@É>˸Ý;¹ÞûÛϾa[Æõ\¹Ø˜a4‰¢<š®±ãziü~pçiiÌóÂ(èœ4‹é›?Œë¨ÞNdº!ëmÃxV«;ÉfF–W´4–$#·tI³ ûŸ^7|æZ–ŽÍe&ä‚ 0­6á?ÏtQÔÈ5 i³8JC‚3À?·šlu,¶tƒ»(qÛ8 ÌÀ¶£(ˆ"xd† Ùa0„˜ÑL¯ §‰Ÿ7>âÿçŽF ¥Àøh¨ë˜v ìÖXa·k›‘n÷‘3l8ª¶wÔ‰ØÕ’7ZÚ3h ¢^[¶˜ð(õKð÷ ²hÓíŽ.$Û=P+ºÙŒ»M *–G[4ÍóʦA ¬Îd#ho ‹o߃Ýà{¸þIŠ„LSÚ»'ìÐ3'Á Èœ'D™³ƒÙ7Áìÿ”¾®ßŒ©Ÿèœ¬Ó-‰ÙŽLû‘€ÒÃíªs·ªeˆç´ðõDÛáíqx{›/·‚˜%Au/ÞF§œ°}·8%Õw,ÁÒû²Ì·;º º@ªÛ:t³Ï€jPSÃÐ@=ƈ ôá·W‹V·F\’U’­Š<¦t–d·å`rÜakŒØzn½ýåøÃ@'hZ%Q0Ú!빑ÁÉxÏ|TT ªq'ÉôšþKô„1M·ã´t¯ÖÓ4‰I•ä™QmVÔ¨rƒ—gWœH°žÇf36<¿v¨Ž9Á.I¶&é`fÝjŒ znìœ\\ü:YÇ š]f}È’™Õ Ù*µ VË­B¢‡°'ɪ;Æ*ñµÃtÜYµ¬hQtËdøØºÃÖ±õܺþåôj ¹Ž4»äú%’«ãfXçVÁ©Ô*=aìI¬mÙc¬_;VGa“2¾ÞajŒ˜znè¼;=º'hv™õ K[ÝÈ×R«dµc«¨ö49ÕÝòáþ.þírj?|W‹Ù#N¬;`XÏŸ¯YGŠš]f}Й5˜L´û`Á©¼*­ ö4¹ÕÇX&¾vœŽ:·>ökL;hZÏ ·ç?e×q¢f—]_´DvõlO;¶ NeW!ø1_c²Ã`ŒÅâkGê˜ókEãEAWyÑÿýó:½î5Fd=7€.?\^¥×q¢f—^_´Dzú—™§Ò«|ÜŠbO’]Ûc±øÚ:æìºÎ8ÚÊ ¦×´F ­çFЧó'éu¤¨Ù¥×-‘^›ºv>s‚N{šüêyc¬…ÄžX¨2ÙwÃj=@Ï/¤­¼ì‰-3^M²©„ÿ‚¹c ½£4«‹æºaÓŠ¯§à¯[ц9*ÿŸAž•óÏnþN½;Ô}êœï ;çq÷ýf}c ½9ÈòŒÞ¼ÊÓã„ØÖ<+ûcQh‚ ã~=ç¥@ðßùš'k‹Ÿ…c’i\¹¢q2ßh’Æãu–&ˤzL^ÏÖË)-ø7±œ‰ù\cØgÇTãiV -õ¹Æ@ùÑÑõÌе,Ë]1bž•Éf¤˜ñoWOØ;9ô¯[£`žÐtVj‚*ï(÷&-å¬ a÷ó‘mºÐƒÜ–¦Æ_‹ë|ä´ë|ð;cøa{dÉÔ@‘6a¿e®Éj‘”5s/^aT D=äNCrª«êŒX­±Óü1)é!ëÆ­.è-x2¥eY‹ø"‰5 Ò¬_gˆÐi Ág>g.ßäëBq Œ•bg¤"Š»9˜&S§HJ%ª Jªî'#QÜï¾üçáÌ¿¥b‰F³%YI³2©’{ÐfG½mµA!–ÝežÈRZUy&ˆáÉ­$bT¹Xœšv½gÛmt ûlŸ½¶ï`½Zár™šðÔ¼ÕY±ƒ©GïI÷w‡t۠оMºl¡÷§eU¸Úׄµ—/ÆÌ¢gn^ÂWv™Œrîìk,xïPgÅ7>‘cc£ñùºg«±i7GÍþnì³’ˆ90¬©åeöÊ::"¶ºìuy^+ºz»³v£(Åë x?°ÏïÊ2ÉnQ‹Ï=ÁÙ ½/ì(’ âP÷#ÓxLc~2’üªÈï“U HMÍéCM/’¬ÒÚLs¾½Cÿ!-v2qžÝÓ¢Ô‡Kª’¦s¥(›õª©q",É‹%QôË:)øÛ+Ëö®b yÚÐ45kN ]´‚‘° @ษ,M’˜¤©òX#ÈE/ qÅùŒÎToˆÍìãôZÀÃ)’[J×·M‹-CôÎøKéFî å¢E/•íÉV ÇíѤ¥ÀÍC¥ç²j/ºbåw8S&inlÁÄ9 GÿLª’݈ô#4ÑbY*+;¤—$.òòæMÿS¢)©“>²ó$¥º­D{&|«™¨+Z€õ)&BœÍ»¾ò­°å« /ƒ-Ö¡Xg’„À™KZÔ]œ¾K¸‹¬zFœ‚p ¥ØR²7g’\º¹R¸Zó-Éi" GïO$UÇSÎÁ^J“ü¶ «ÅFÊæE¾TfRIf´R©Í-f´í™G@¼íAâ²DNÄÄ=ñøÆ§Æ ?pšc ——±èDN– –z%—d1¤X\3ÔQ“÷$]ÓZ!ƒQhb_ BÓ \È‘pîéš}þéýç÷Ço//®¤†îÆs5H Ä64Æ…²=Š@•í=ª®®/ÏÎß}¾:ûÏéVk<ÇR¡\¨9¯gýØ¡³Ñ±„ª.¦î¤GÅ4ð‡é±ºÈrí…¸™Íx0¨á }Yzšôe0§”fÇÁ#S'{]´¨Ùºz•:'‘in'~ÐgšL™Ý¢Ä‡‚Ñõ ªóýh¨(é¶Ã¬ëñÊG§ÈÉ㇧ÕRHË º¯æ)­äòš%—l…ÁTêKUKR(šœ¨ЍqÚ' C¥ÛäÁ™ý“üân¿Çp”n:b3¸d‡Zgšçwû ûÇŸ®¹¸Ü7ÚMȧj‘_î÷­G8„ÅsíÁ"±ÛNžÑ\€›~Í€tŽ`âïèL Ø›ÛÕSž+šAao*ñq¦©/ ½G¢ t ý á{ùx®Ù‘5Ü(6%ñ¦HÝ^ Ïk…Æ„º^™XVË+Pë—pŽ(À˜Œ˜”¿¨ž­l¬*‰×))Œö§3=K3qÓaï·‚¡•é4;o]×x6»éQÓC^fzÎL©¢¡&Ê áO!ÑZ’Ù,'!Áä&è…¦hN ó$ÓUé_ÈTV™Jð–o$mš‰«Á,ôÖòJ9µ-…àø§C;·uq-9ú£:Z \_Ÿè¤lAîuCpk ¦¾€Ödì(£êz\§è†«ò8^ü¯äÀ`Ê.JqI]¼sԜӂ.cžä‘™ªf€jˆ•4«ã<Þ¾Š‹>Æšb·©ê*üÉiáM4©PbGY'.BèRí ÊÎÉ,§º†¹!lEaĘv»q¤ßŒ #`Äiöœœ¸ èí.ÀÃé_«IîÆÃÞ%$f~}ƒ¬ô0ÞÀPm¼;šÁz+ êÍ‹wY¯ö4)+5…Gª¼çL4‰ZK\:ð ­ï呚f#€âšo¸Z*/ïÍZrŠq_(d³«9ád¦j¨‡"©*­Þÿ^H‰Iª^|Ä0=ÒîŒê—ž÷þ b. endstream endobj 1878 0 obj [ 1877 0 R ] endobj 1875 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1878 0 R /Contents 1879 0 R >> endobj 1880 0 obj 3209 endobj 1882 0 obj << /Length 1883 0 R /Filter /FlateDecode >> stream xœÍË’Û8îÞ_Ác§ª­P¢ž×Lf·f6µ©ÙöÔ’h‹¶Y‘EE’Ûñ|ý€"ERÏvv/™G5 xþöà# ÿnäŸ4ô½4ÍÐþüðMã}”ˆÄa/ "Œ B/ˆÐ Q*€Æýþ Ö|Bÿ}(0úçç/°&Gè®xyÇêùáG6½Æ?“|ÞmÞþ#B>FÛƒ51‰½4‹³,‹¦ 2ùO€¶gôéq+DÑ ƒ¨Qͬfåž½ù‚¶¿[ê óH*©}ØÈi™£R´¬AgZÒ#;³²Uô¿n6#{éÏf²?"‚Ë%Iâá±+Âÿ¡G0Š£œ2Õ.ŒÒ@ý]O$Æ®ÀS/üi„[vÀ8ñßϲ$Ë`ÊK.ä§ÙšÇü4êM%ruLqÈZ«OŸxAŠ1öVèü(ÑÊ+ÝÿMÏú¸IãÍX.LåùÃq$iRE”7htL“”˜¬ýÉha:»íEùÂê¶AïÅþ_ÑŽï .Ž5­N|rÚRÔ ÔžúÏoÏ2bœiÛËî˜`Mÿ(ñ"?¼œ‘»>ßJQ5¼qmÍØ %^è‡@Æ® ÙŒÙÒpJ‚Þ@ð‹Ðã§ í‡_,ŽõÞ'p1öÀY1†/8e_ˆã&gMËKÚrQ.Š`É%ͲHFã1G¢ÓŒ”^—23/#`}ÍAJyà[/K€<ÉÒ4˜1»#Šx]~Dpè£ØŸòZƒ@M°Lêˆññ1bâB‡~ô£b¤É ©#Fýº!޼,•R<à ²o{«–% Ãd…úËʶ)Ê¢EåÑ ƒ4ŠYñ€RV:h½g;æ•õòåØåK©ýDûd¼Ð&ˆ¼=š°c0}ü1ˆa 2è."ˆ—­°ŒPÚ6ž…·'æpa ?––ªK]‰ÆY-vܺl´Ð£P+-e# 8êÜ€˜7•â«€ 6µ¸Æ [!Ì8燮Pk æP‹³]Ú‰¥ÆÊ zQÇßáh†WZ×ÔaGͨá窰ì”môT[S~<µÀèóŤ¸úÔ ¨ø$ ó=¬µ-DÉÐw|“óší¥hañ°Þ³þ² pü¨ç10¼ÆæìÀK® oä(ĵ±°,ç¤*„#¼8ÌNêЇš±¼û\~ íxW3B.rfÀ›¸Ôp|Å3È­¥¥û½8ŸœË€6fxåcjFàG‹ï] / ³ÄÊôx7˜rHÀglahñ$t;Œ:Õ‹®‹h ‚Ú!œÆˆØ“Á´'n§Á]EÝ~Ëj;;X¨vaùÜ6ÔŒÞ???0PÓÞ ”œ³{Ô”­qh9U=Àã0ØoFÌf0úÅ⪪à{ó‰rkTu]Tà fܹ‘~»ðý×âfàýIeŠÚ Ù÷–•¹åq²«ÆZ· 9­ìŸ]£ÝW%€Æ›1’?Ž”:WÀ]ÁK*0´J=è sB¼|_Á?V¬ü‚[Þ¹ªQé¾½@ €(U6ö¸Ü›ô‚PVªP¤%¾Nz»|תòqÏ`®^ ’:Ùñ`­Ë†®æÊ8FAŽhþìRO¬À—/Ea^7íÆ€:.wc!ݱ„¶¢1(~0C˜¼Y²Ú²¯jÖ蔢hJ—ÆŒmLUpvßE`¿³Ü!®ÒKÑ>ÙíVùƒ´GìáèvåÀmŸy·«Ù ‡P—{w~`’eq¤{ŸÍrÙã™õh¹ÚŠ(§³ÍÁ²+¬3YLJF Î=u¡}a¨k ½ÐâÒùEÀOເJxg†ü„ØCùQ„B—Gw×Þzñ´P¼¬»jŠü4mÎêz¥V½4I Võç,øt—Hg> Ó9Í­±\£C¿³B½hÅEqB)3#؇:z†áj놩—$@‹ƒhN˜é#a8ZA¡’5× +n]Ânê€Î§ $—ógvþ GÖÎë´‚Uñt4ãaù«pGá°i…Ý¿Wyr¸ I¼0 §dF¼Òm’5B³óçÇ¿X->¿1ˆ3ƒô2«©†Y3cæ(ñWx㓬‹©ýùQ jkú¹îxf«"zYñó™å28ƒ5/”tW¸+uHÑ[žòì¡du§w—v¸Øe~¦.]«l Ô•·§«ÄéÈ*²ˆÕݘOºæëÒV—Ö³ˆEGð‰ôýâÈ _Ñ |øò‹dvÛ.÷¨a®ŒÆtV`gR,,TqźçooŽ®ÿb¬²/íøÌ‡Ðv™ñùÒ8³»q•.¿C:Î]жøñRw¥òìâ÷š¨1´¬«5¬7T@ ,F7«‚¢¶PUËnàÜ+³©î+dMÅeŸÍr$cVG½œ{"û™º%›î¾ù°œ{ èY&D¢r—×j[iï8Œ€Ö}ËæôZ±BXÒ¼çMUÐ[ƒN¬¨ŒÁi2¤2Á“4D‰ØwÞ6wË/è¯s_³ÔÜÓõ¯ÕÜSŠáU÷ŠþI4¢|î¾{wn!W›Ä®݉i¨‚þßY(ì˜Ú¡‰šžÌe­âµ‚úÔ¢ šía r ˜ö^íYÔöVñ}zzuõª7—"·àÎá}_´ ¡¡’P¹îÄŠogŽešŒõ©f‡|·Þ"ûžap¯FòÝQµúÝq#ÖS¶Ýí` ^X}­y Ø»}!Œ½0õ!hh_ø¸ê “õ¯ú„â._ˆÒÕÿæ 6?à ÚÿÛ~Lš¡/L¥é}A†BmsTU`®û/‚¢Ê ˆ]Yè‡Ú –o¤LÖ¿êŠÁ3ߊ'dáˆð™éšÌyâÉÌ5›Í“O&ó‡þE¥„½=éFÞN@ç!ì,êÆÜê^QIÑ¿ê)ê§RX™ ‚îªü©ôóNGŒã‘=º6­ȦgK/Ä“YïºÇ‡_˶¾­4„™Gˆü!CJfX ýT1çpÓ»œ|"óÉßaE÷G…X>…¨ä3—º…3)_Ì ³9 h²ûëYõâyïe7Uàã8ÕŠý¢[¾Éee2§øjàcøÙàÞ~Ѫ²RF%$ž!FL^)Qù“2ùyUµtW9Ò=6gÀ8 ³E©êýz‘!©–yÈؽÒ‚ÿÅdBbÅÁs~¾ôÇÃß,]o endstream endobj 1881 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 1882 0 R >> endobj 1883 0 obj 2690 endobj 1885 0 obj << /Length 1886 0 R /Filter /FlateDecode >> stream xœíkܶñûý ýb>™¢žlÑqìšÖéq>p%î­ê]i£‡Ï×_ßá›+Qº³c×[ô;C‘œáp8/ò~»ˆÿ]òŸ"‰Â¢ Ay¸øMµGAŽƒ8SM) œ"8 q‚Ó¦4ØÃÀ‚Ÿ“¾€ï‚Ÿ/š |ñ˯Ч Œ»½@ “‹©®.~rxS>'þPpsñâúâùwi¡àzkEgaA2BH´cLø?\‚_ž\·í¾¶mtlË:Ö”ìé¯Áõv4&a\ðÑÐC“á´©‚¦XhCoØ5ƒÿêúDf1Baqn"ûé„EP¹<ÏC4UEø? cÙ-rFþé„‘)*©œ´ÈÈßE–ÑŒcä2<׳anY³<Ì£ˆœø'*´¦1g³¼¹²`ΗYuDødÕIÁ‹p†àŸ>nt³gbMaPmpW÷]iVogO]ŒCRDrñ—˜·(Iå¢cF¹•ƒ*ÄQH\\âu!È©•fÓ);8i?éea>¡ M^^XxÐô3Nä!~(T7XjY–€™`…ôi7!6KTm³iŽä-O« Ùb8a­j§ ‰c•&pªÒDjÚ?hWseóž­¨HÂ,_×0üU ?êØ'éØïÐ&w_?I¡^²-÷ Þ="aôPmröЦ¹å^Ò¦ # ž(×Ò·Ge»_Ù¾m‹¡¤tŽ1 ¯²……JÐLcôù,”ž~Ɖü E¯»ÁzçÔ“ˆ@O·Hú´›p|–hè(Ђ6=„‰mrÉûƒM41÷íͶ¾Ç>êÓYêÓ×T›çïi÷t繌ÔCW¼ß™*Ð$'²-V¥µìkjÙõŽOƒŒ§¹O¶ã~o#vi·¤*Ç~hý´3½ '•Ä#´)ñº‡1Œ0ÀسJm³¿ÓŸ· *ë‡é¨ž 3rqÆ£¨ˆU¹èxìÚ#$&Ûß…+Þ=' ¡äYXãÏÎIŠ?ß9ÑÓÏ8‘´¶én°Þ9uÕ²*=Ý"éÓn¡[¢ðîaâä¹ä?Æ»s…\õîút–úô5Õf¡ê(|ù™ªË¢/· ô¨S_S§¤/¿Ìò",‚'Ü*Õ ê¶qZ…'×Èp2À˜k.»n¶mw³†06IBËú‡]ÛíÛÆŸßé âQ§ÎS§¾¦êlW¢ˆsÕ—Ç’À™+Õã~û^k‡A$Ùm]ÄE†®UI0hÝõÃ¥Ó@›êþP£…ð¤kè ú1ˆ‚”~׎ûÊiØ0QÅÖÛûc‹cÛ÷õæwž/Ý-…éýÚÁ¶Ûkߪ¡ß†b¥À0òùËñÇž¨J^^vl;Ü×/UícU F]ûŸKù¾õ×µàL•i¹’ÿwËñ}ºæòõeumRK9C]Så…(KeyAØ4§åﯯÌ<ètÚ¬õ[óû·µ®ÁÒ½KP9w‰ˆpC‚Ô@rîçß‘ÙÀ¶…ßðãdNï¸ÿº}Õ ÝžÀ#ŽYàÀöâ½)_^‚"~ëQµ2TQhÓºû#+ëíÓáÍýe.274áÏèØ©w1ΗLx…¥† *ÉÒB=Ÿ¡ ÞtmÉ Úщ&<èYkR8OB”Â(QüÌ‚}ψÿô h°›rÇë!´ïÇÑW„zþ™v] é}ú±Ä›ÃvŽãðÇÉz9%’‡I”óÝÈ%¥·§“~©¯Ÿ¼åòL…8•Ú(l!æžY\Ý%)l2”¦°\PŠ8ÏýŽ…Ÿd:0/@±`Ã’(õ ´ß>¡«í¢N©ÊU{yÃIæI†Æ ¬•mûŽUîp…)ÊP‘Ì7ö©%ºgণÇ]]Úæ Ô&´¨º¯Óch_—tïÊõÀhÓÏ7/FdB{ØQq8R‡ݵ£Ecï| ÒVÌâTm2ñsM4׫ /œ!.ø#uL<ì>ÄDÄp1³[¤‰g gIÒpôÏl“2Áp\¤!œR`x™ßë¬Zä—ï Ž&5oÓË[8©q’„yžÃúP¶vRçýÌIÅbw꾤]ep¹£<ŽÀv©KÖXí%Ó°S{ÖMÛNÔ}±²§\Þç" #p€s&ߌ0’ly{q±0ReJv<܈ôW#‰Êíh9°ÎH¢¦«\ši6!÷‡7ß¾üæú› o Ñ³@¥ÄÆ Ûðv7¹¬ê›zîí|[Y 0ŠSRdq¼º•³~/øaOyÙ^ùÿg—ëàé6ʯàÆ4,TA@ «yޝQöáãêaoˆÈÓ_™‘f>ªå0Ê0) ì]ÈCN4œ±•) “&‹jÍ‚JÚx„Jðd¢šó0S᎘W! ‰‚ò³®cUhZ ƒ «íìsÐ$*3³¸2º±ã– Äi·¤ØÃøƒ„È‹VËSÀ&tvµô~Þâbmm¼æwí~å0“tm¬ecºz3VT· ±ó=MP2™BŠbh¢c Ÿž Ù¦‡DDœ Ú9ÞÓý(n´$úzëíåò+[j;Ý¡±ß3ÛÛ@6˜÷päL¡çÈö¦­,S<<ðÈ&Ê&²Q7zH^B ­”ˆŒ$lJ}¥UåŒaâ"P}Ñ«¶“nôÁ0ý \¶Í{0ºÊ‰ˆ¦Ú‚mW ƒ¤Æµ¼a–KÃvÜTyìѳÁ'î@N.P ¶õnǃë`Dºìð>-¿h è û-÷™oŸz¬y±WB H#¼fÍçý^¶å ù<öC&0‘1‰„Eè¯j ‘ÓнÁ­%”¸Ÿú¤ã8õega^â5ˆ¸ŸžÒùW;vCGXX è ýwݸ3SË€8mýŽM«Í\žJƒr-È$én¨Kyƒ,^K]7¸ä_½ä_"‹æŠ§Ày!&†¼sNüÜÞ²½ŠÈê`CÝn€ÄÅÑ• :ºj}¶}+„9_•ýÆ|f?h#5ÈÛË™Ûè™Ðò“!Sµæ”§SquŠbqÌjþ¸áf„Í5mÝ2ÖœÈêÄ[tôG6(mTS4•gÉUF(#¶ÃëÈÝ{Ò²e!É3R<õŒ4…`D– ð›0ãóŠ<‘‰!#òÈ'ÂU5‹óÕÁ†ºU3…óÃmÊ '›Xä“IÔ›“4æ’ÝÕ ¤¯0•m X3•mP9³€7Π†ÁQuú©t*Öa£WRAPKˆö ©'þeÌs¥ß›ú¤ˆÐÚ–…Û]Û³pǼh‡ A9öLر½ˆ'VâX´6Þ>x¶ —ƒZüžÝ&Äs Ô&{NX5Œx%ùÆŠü˜W?æõ.á’¢8ʈ‚å÷ÕkøßtãœoMüq1 I–À8ˆbýéfÓ±÷>¢`çPšˆÊÀ:Qa—(xÉ"Ö4‹à—®¾*JùšAÊ…OÊ–â[s×+ñƒŒ <¼YrúÑnSí¬áH¬žUϳu>€fô³kdîg8˜k\McH«›Vq©‚¢s¥eܰ}{ !”ÆeA[€"¼î56•=A!*@kÒ {(®n>Æýòü\¸g¬¦(8NÀ g`Mp¼D|iã3nÍad–’ÒÛ±ãI¸ÚmÑTAXWìvÇT–.ÐÁJM¾²•Þ,, ‰£ŠPž,,à‡¿yØç»‹§‘×ÂÓn°HS1Ÿ÷³ç™¬`Äÿ4>Î2ϰ@“AyÔêj¹©¼/”ÝÓR€$ï©Ëî?‚[ÜÞñwƒ25¿¯îž Ÿ‹Iˆªö|#ÉøõÆT¬nÇ^V\e[?ÐAj»j°eq‰ŸÀ‡£ôÜòXÉFêt |yuuõ—Μú“.@¶é"®ÄÔ)—ˆ<É6… M¤q¨ÿ6Öå»ýÝ<«I…ŸrEA+zTœ'Ädg †Ä±³˜x¼Züõ`á½³ˆ²8>vc¥/tfó—Ì Nç²=Ö궇ØwµjÜÎ騗]}t&U«W¼ý8Ù;ce袨ÄÔðæ™0î3‘)Ÿ-Þò°ƒÅd䯣ˆ÷Ç=uÚf·$Q˜ ?’ûhI3¦÷ù@ØÍÃy˹›µ4¥ »±¹ªj˜ÿE³®`Û¦ÜÎwüÙ†ª-ÇIÿ™ŸÑfÂn¹,‹K†´®d iâf¤g¥¨ël ¿Ù‚Æs/Ø‹T~;6¥¼ »fw/sÜŠêÆ¡O¹¯ß1èKAû@é¤ Ófr$$ÍÎ Cü>2d¡Â@ñºärÇÆŽgG¥56ÖXfAƯO Þ5‡}8â*OÔÅʶë`u¢&á–°œëÉ%Fs>#ˆò ý×Õ"¯y«óœ5P¢gx6-7õ{æt ÜÉ×è ³.mÞs91ˆ²0˜^过·ÕÔŠg+ƒ-yçZY6¸+ÖïÛÓþ¥ªxû¹“Úª/&»ÊMrn¦šºU?I&\‚…×e±‰L!Ò7‡×Ô?]ü³"vü endstream endobj 1884 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 1885 0 R >> endobj 1886 0 obj 3522 endobj 1888 0 obj << /Length 1889 0 R /Filter /FlateDecode >> stream xœÍ]oã6ò=¿‚èSˆµ"E‰Ò½µh{èÝâmRÜÃfqm:&V½’œ4÷ëo(R"%Q²7ÀÛ¢ gÄÉù¦¿Þ`¿õ'¥8HÓ íÊ›¯#(J *Jâ0Œ¡‰Q‰Æ¨@ãH?‚?£¹Ñ¿oª›ýýæÓg˜³G!н܄ Ì;V÷7¿;²™ 0þžä ÑÓÍO7ïÑÃÁq”i–dY'šÉÔ?=”èÓ탔Eƒ²F5?ðšW;þî3zø‡¥&Y¥ŠÃzá„<¯ö¨’-oP™Wù/yÕjú_Fg…a~oGöûHDP9ÆXNUþ£A¤q€ÑÕ§‘ SP¯2Âèè¿‹"‡3‰CWà¹~7Â-+`†q–±,ƒOA:R!œ‘5ùn¶7W¢äꘆµÙ~„0 H†!B§GÌl^ïý_yiÌMžçähªì/LbE“j"^‘Z4hb¦Œ…5 ¥s’GBØd~º6ídõÌë¶A¿Tû}£­ØB>Õùé(vhŸ·9j%jýñÛ½òeÞö;qdí4bÄ8¼ú¢V½­ä©{"™çDR‚cÂÜÑdžCL霽CtûiÇqÏè',€4À”fY’x˜òiÏ›vQL PƒBQÂæÔŸY×È’¨†Ë¢1žs;Բ܀—{Q=-JD¢t…‡+Ñq»Øâ 9 K‚´*£Ø{fæÅ¢ˆxêerW˜WÑ6¬® õ(s_–%e+Ô®,ò YhÜ”í¥±G™V¡^!uù¸²~вè[VO7#øŒ>m¾"õÿ­ÙM°D¹LçÁ$ …¬“†æ>v§×dž éæÖK!§Y@c—Ç"M¿YVï$ôÌ_Qª„@¾0§'²Qa@TùÅ‹NÈ¥ñ:eÌÊ~bt»Ë]è˜?sÔJÐCÏyqîn¦G„w€]’~ Å/cþüëYÀç;Ȧ­Á†ÝUûÓKæÅ ²®ž{žŸè èîŠ#†Z†±¬Äw‚wWI g)M}<š×.bÙC:³B½xŠ‹âÐ( 4 1¦ÌÃp=Ð4` hCHS=ÂLr>¥u8šLªysâ»V@,~ @` 5º}8v.GN š.‚Ûï/Gp-¤õEá$‡±¨tš¨U[㞤æ•vý~Ë3ãŽ"P•D’FžÝ„˪C£5ÂaåÇÛÿòZ>¾%ϫƻ»’7 ½ç˜I<áŸ×ÚŠ"pp†½ýh°ó“÷Îópä¯8f%Ê’ïEÞÂõ¹sžsQäÛÂi\ŠYò8’gWsî~ÞžÛñd—y™»P‘åÀGB½ˆ>¾ŽNEÝÝèTv²,uXJpê&~±¨8RºÕTìá‹WrqºLf—}Ea!¸.GÆáè¬ÀÎG¹0Qû ò(DûêìõŸœŸ,$*;.ÅX€¼]f\žçëvÚÏQ÷@§± 꽃x:ëa“¤îw¢ÇùnÇO­…Í‚èÍÀbTb¡sÃk jUF–ÍE5œ;Ë@ïíñ6íì±_OGCÃVv–ÎJ‡s ÌjÏþ“©§t|“¾¦ìûÏJüµ)ÄnQ PËËÆ"ÎÍ9/Œéé}tfÆ]4è•Ƙ[fÖééÜH¥8þô&‚ô4MR0f[yÿœ×ïáÐÞ«c†P¶”q¼Æ,˜ çK· BB¡†±‡Y)f¢5B»´2FÏ-²©ïÌTéÏpÌ Ã9ÚA€>*UѽÅîˆTNµå¨f{¤|VG½{bpûªMežÕ7–c$=Ë„Hv¹mpenK2 9U,4åÅæ°–ÛÎç_Êmçž®Ârf…É„üžb¨¸ÉTujbh7•vŸÚó:ßµ¿Ð˜~Ñ`ÀÜŸO'Y·«ÏiŒ‘z|*òVY7äÖ'PyÍ´Ê2Ñ9¶£žë\•Ýxk B(®ö Y¨¶Ù$¬òx=¾ ÐoTIdÅSb w‡sB’± U­1šÄž5»ÿ¸IÓ8Û,‡9ÕïPµk˜`”ÉÑpwL…D/oš3d×j`éÉâCNe4ðxQ)b2¡ùY4p5¯ :òâ„ÔUœ•Ñ"‹Ü)S¬ÿK´ÍÕri1È@ÒŒ$F®åþXÆ|þ%˘S¨¢Íid­@OHï;MèBý6_ÐÀ©ªlçsWÞ÷S¥k6€ LÕ66é¢@Ü'¸h‹0‰¾Ü1*z:|ì°:—[÷Ó–·/&Ôˆå`²€ÅQ×™ŸÈröN!›Y¦s„ÔyÒ%)"„|pú.†­\á¡]ZzÒŽ(c“ù²Ò¹VQNì¸Ï;À­®±Šg~CåÄV€ê{–ã%¯W:mI.ƒ†a”ùˆï®Y/‚¡¸ õ°È ^¯tÉS뫞O½u}(í Qo „xXìÀž–»~µðà2ß´<Áª#£õ­¾Öת€R¨J"ìÓ“«'iǪSÊ|,^òºZ}€ü+Í€< ³·J@"BØ"‰E%[±[îe @ Ô1~ëõ“, â„@2뽕ä/LL¬t'#é—ÔKWDõ‹ÅœÅžoÏËç)¿Á€˜± çï6l,ö±¯¢4˜´Ð‡¾ pÝU½ùq,SqLQ¥¡ªŸöü *ѵ]U23à—KrðŽIŒ3u„sî+Ù †ä`™Ð‘H4ª§ÑXŒŠg Ö±“å©à­ifä.ÁˈÚÆ»ïë¾ {ŽÀnbj»™Ë¾ÒkY!´K÷ý'öÅ¿†d¥• ÿæ©öU‰7æ]JÝ!PïܨóŠb—ãV©cr 89„Füh‡Gñd’†a®ô'Ü/c6¦Á~cýܦY“Ñf9‹zŽ"š¦oyÇ‚tf/¼( .^y–2YÈbÇåä‡ñ¡#ˆi>iHT»â¼çÑ9 ö·åˆþpt¦Cù£ *›Ç l‰Ï¼ÞÊÆA˜dÊ[¨ròª½³(íbôøUž 亽©¡Vzn‚Ns§üY U½C ª”Fëʹêô@1¯8T|ê7P ~A{ùR¡S-Á”W×L«0Å ¾X³C}0Ÿ©>˜S¨úÀöð—Ëʲ ¥Sĉ“jàpÖ:¢!õžéL”vœÛao‹š^Üeml/éû-ªùŽ‹g¾ LjéH5êáõ¤ ·íC—f1y.öÜ:¼¯ë‡)U"9Use~Šï=º™ÆxRß2«ùa¿ÍW¯ Ç¡‡ÁµC–ƒ×q \NI@çó/iàœâí‹ÕOíFT÷ª—fšÛJŸSn’©êm%õ°Y}¾R ‡¶ëŸ,/ƒeê7KP~ë $Š]ªûö®ºMÛÜ!f'«¶ 5U€zJð“êý°W_;¨hÆ ¸Hû~ÉÇÕ[ŸN¿xéS‚«îŒÆ‡êfܚƒÛ÷Èö\›q²ï‘<&òu¿ ÿýæBn¬å endstream endobj 1887 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 1888 0 R >> endobj 1889 0 obj 3247 endobj 1891 0 obj << /Type /Annot /Subtype /Link /Rect [ 215.07 759.389 402.55 768.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1273 0 R /H /I >> endobj 1893 0 obj << /Type /Annot /Subtype /Link /Rect [ 203.13 737.389 315.33 746.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1275 0 R /H /I >> endobj 1894 0 obj << /Length 1895 0 R /Filter /FlateDecode >> stream xœÍTMoÚ@½ûWÌ19t˜ý°w·Š¢6ê—*õÔRIŒ‚×1¢ý÷ch° œY»Ï{ûÞhf_#ÄÿwÍbµ@kLŠèu`$¨dŠ µŒ‰H2†º¡–Œ9ÜÈýŽ—N.¿çð+ Á×èñ™s¦@ŒÛDt‚|Kõ3º?жKàý%é#˜Gwi4úƒ Hgo%V Z—8縢•tÍOBZÀãUZ–ËÌÊ *?ó•ý é÷7´t¨lƒ|õàY˜B(k¿‚" ÙÜ>Ô-þsÚ©™"B{i%»ïHä–3Æ õ[‘ªq¤el>u„ô_ÛS:‘ÖA»ž”LÅt(xØ…#ît&ÎçøÚN §ÏuÌÅØ6‹ltýwô]k;˜¶?ût׌Ê:[ÂÓÕÆŸ®¡u¤lBit ^&C*¸éͩРÉ‘Qr×õï÷£ÏøtŒ«r]M<ÏüÜcðõ¨Õ3Z„©ÿƒy],{ÌJq´sÖ7`¾ÝË?æ_õï‹¶e€:÷ÀöϘ—e¤±Égè^ Ü2¤í‘cÏÚïßw\GÕ0 «†L;»M¯hίæ¬]5Mª;ê â•pLÃ7Ôùq]çeµ‡Ïy抇‰`%¢…ù «Å 6?Õ¢®}€ñ_ø‘U/ë|+}XL^2¸)¶E¾‹àÔßâÁ\ÝGÿ–: È endstream endobj 1892 0 obj [ 1891 0 R 1893 0 R ] endobj 1890 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1892 0 R /Contents 1894 0 R >> endobj 1895 0 obj 535 endobj 1897 0 obj << /URI (http://www.loc.gov/marc/) /S /URI >> endobj 1898 0 obj << /Type /Annot /Subtype /Link /Rect [ 206.04 522.681 343.8 531.681 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1897 0 R /H /I >> endobj 1900 0 obj << /Type /Annot /Subtype /Link /Rect [ 349.63 522.681 452.96 531.681 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1897 0 R /H /I >> endobj 1901 0 obj << /URI (http://www.ifla.org/VI/3/p1996-1/sec-uni.htm) /S /URI >> endobj 1902 0 obj << /Type /Annot /Subtype /Link /Rect [ 506.065 489.692 523.275 498.692 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1901 0 R /H /I >> endobj 1903 0 obj << /Type /Annot /Subtype /Link /Rect [ 141.33 477.692 325.49 486.692 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1901 0 R /H /I >> endobj 1904 0 obj << /Type /Filespec /F (www.bl.uk/services/bibliographic/marcchange.pdf) >> endobj 1905 0 obj << /S /GoToR /F 1904 0 R /D [ 0 /XYZ null null null ] >> endobj 1906 0 obj << /Type /Annot /Subtype /Link /Rect [ 409.471 420.703 469.987 429.703 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1905 0 R /H /I >> endobj 1907 0 obj << /Type /Annot /Subtype /Link /Rect [ 476.053 420.703 523.273 429.703 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1905 0 R /H /I >> endobj 1908 0 obj << /Type /Annot /Subtype /Link /Rect [ 138.0 408.703 293.24 417.703 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1905 0 R /H /I >> endobj 1909 0 obj << /Length 1910 0 R /Filter /FlateDecode >> stream xœÍkoÜ6ò»…Ð/ç1MRÔ«ßÒ¤=䚶׼.Z-×+T+nô°ãâ~ü ER¤$J6ò)- sFœ‡ÃyÛÏ$Àðï•ü“2‚Ò4 ŠÓÅg'ABƒ0Ö¨#F#ŒÃ€2D£àLQQP; f&s>ÿ¾¨/pð÷‹Ÿ`Î>À@÷pW˜¬>\üîè¦'Àø[Òw?Ü\\ÿ7kâ0FigYMQH3ù nNÁÇË!ª68ˆ&hø7¼.ø‹OÁÍ?,5ÍP˜JjòðŒ<¯÷A-:Þ§¼Îïø‰×¢ÿñfb³c”~k&û}¢"¸\’$Ï]þc(T8À(ŽòÓD‘9¨¤L0jêïªÊx¡1v^zá7£ÜºÆ Jɲ$ËàJ'.D²hËc¾™å-…J½¦˜²ÑË’ šbŒÉÄ ƒ%zñjí¿æ'}ܤñ<–c©<8Ž$MªˆNySЦlƒÙAM#ÄR˜–¤ñ’è–Òd6?Ûš¢¾çM׿¼zÿ:Ø•»ªwM~>–E°Ï»<èDÐyðþí>NygâØcËQ‚"’^~‘"?<ÖâÜ–­kÌc£$#À1L¦Q„+fñ’(x_P\~¼âãØpú B("a"ÕeKf•¸»Úó¶+ë¼+E½ªÅ’ Ó‘%—OŽNÇqìb«ghJà e •§~M+~Ï«u³èI–²Ôc6W›wÏÐ&$"¶9M2¿6‡²â«Ê„q¸Aî*sòL^u¢ äJˆ…àHQ¸¤.ësßý·{¸³õñ”Ãׯ~•_n_ÌŒ,W0]9Ö8DTzQU9 q# JÓ']!vÜLðPõWwÌ¥w™åÑî 6¸álùÅÕ ¾|–µ7³ [؈õ‹J’lQ¯ZqU‡ ÂÃ'nMS”$@‹iäSfXÎ&AGÅfWÞCÆ’Y—a¦ŒQÀàS#¤kSn¿?èô¦ å/j –ÇÓÛ3…»›NXùfɋí24 1¤ªåjðºë°p‹p”|{ùoÄp[¦'¨ú[ïêNÐŒyº0iæ$šñÏ]2en!O™‚mM­§¾ G9è pʪ<ø¾ 3ç>/«ñfPátHÑ"}ŠFçÐ¥ƒì27e•V îxsà¥äÍ’Ç*i2³J!N'[®Êê¦ïÎ}‡,bÕH(}ŸBñð%ë—錭“Y±ã¥ÆÉtd![ýŽ ;ÅÊDW,|È‹²*»Gg­?s~¶ÐXpËZ¡œ*wëŒO}ë|ÝyÚ;–ÍsW!êCyUî %N1+QcyÇ©®§¬*À‹17Ä ‚6£±Ð¹‘eÙ©}iQ-çŽØ£¨µÝ^¦êöZËSÙP³ÉŽ`áH:ô,¼—ëÈSé?£™Á‡ó €þ(}VfÓàZ‚c kªT¤:›íƒá6Ü^Ðù,AØ×bKéWï6Þ_éa †êú¹µmÄäoo¨ª”äãSÅfÅ3š7e{®òÇ68òê<Ôܽ4Y 2ÁKiˆ:à_Ê®}¶^ „S¥H Véµþ<cÏü§jî%Åì~Ãi6#ý0lüpp™ó>£sSŠ¢³Åôggª°cåM#Êèûwëd­P÷Ž«» …0·E rǼ40šÖýiç~rºD…X?ª8AIÊ«x,²^;1È%ëtŽ’*K=¥…¼’4×tKvÉF¹‹·­há ú1&³ùúå Oh®UÔØäíp{âÂE%/+"_ÌSF<âø‰7ë}~¢Á03ñËçȇ´G ´Veд5ÝÆ ÄP­|h¬(ÕÏþKÐú¯‹§8Û-Ž¿vùTf 5ñIßê* 15aH|~ò,á4EQ$A‹‡¼©Á‹Ö5ˆ! Ë7”g_«A iXþƇÆ>µèÊb½“¤uD¾vûi£(†C¼ K¬õ)&}'£éWŠå/äBÕDyXìù®_·(ãFÂÔÃÙ¦|·]¶Ø[SÃ*0¯Za¡w¦›„#yy>Íe2IªËêuÏe]×núm\á×"ˆŽqD²Á„ îW-QD7ÊVv”­ÅÈ|¦/âú¹sÅ;}• ‘¯\‚‡ µLWoªî'Ö¹²FŸ›…î·pZ6­hÓýkд^ ú9Å|óôZ1f¼Í¹üyl0DŲÈ+‹q{…Ñ5„œB!^Ùá±¼ÓEÃ8׌…½0š…™¹m»¥£­rV5ô˜"œ—o¹z‘ ÃÏxU! ®n9ô®,“ï™Iäá¸^<m:ŠèÖ_Ae]Týž[ÄH,hvËQ]ÿl@•|çm,¬¯r°s&Þóf§BSØõõ>¯õë΀R!FEï,@¿*¨ž`óÚ)¿¥ì •N£|¥¯?Ìk’ü­r“{ñPÐÈC48=»?ˆ ùª#Ì’';&è–óŸê–Ó_Æ®·qJg”N{½“- pè•(蜫ßQé‰ÂŽs;4gQÑ—wYë³›n×B /xyÏWô˜0¸¢BÝ<žåÁ­&ëPm†&újoÁÃûy·ŒA|ƒÌ)[Û¥=vqÆf“Ì…EÃû]¾¹U$ÂÈù?~¿ø?óF endstream endobj 1899 0 obj [ 1898 0 R 1900 0 R 1902 0 R 1903 0 R 1906 0 R 1907 0 R 1908 0 R ] endobj 1896 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1899 0 R /Contents 1909 0 R >> endobj 1910 0 obj 3599 endobj 1912 0 obj << /Length 1913 0 R /Filter /FlateDecode >> stream xœí\[Û¸~Ÿ_!äid’º#ÝÛl[l‹v±Élû°³(›¶…•%G’g2E|o"%J²'MvÔ¹`xŽyxÉäÇ‹çãñ0ü½á?’€ $I½Õþê£Ò/¦ž)UˆQ@CŒ}ˆ†ÞÞë«B¯;Au ~ôò‚¼óþyU^aïÏW?ÿyÖ»‡+7#¿ëñìp€–aës»›Ð%ÄQ=9·sýíæ?Õá®E^BÄÿj§ûz oûþÀVùæ&QJP gc™VÓ¾„“ œ¡NºµŒÖl“ “&Oœì[Dз°>…#ò((™lCšø˜(&$ˆG¬M?@ÕêNÊî³¼È>¬W%kV³Óqû)F$C,òŸþþ=~2ôÀ>pDÇ鈹‰¥\O†À;5$CÇõKpŒEGdÄúl¨Ç!аã ÔP?Î7±hÿ³9‰Ù$½c¬á‹ <ïú§2_UkÖÉsb¾é’ 3j>Ë©ä‹öE—¾ƒ! 0«ŒMR ™V(¿{‰:Õ>«W´¶òg°Lìm3æQ2ˆv´l=Ò”'à(.­YtÐ(Àxñ7Àô¨Ý$Jqw}, Ö4F#]*{‘£ìÓ¡ÈWy[<]Óf-ë•Y¹•ΊšekËøSãD'[OéøÜ?š![n3PBͰ®ä öùÀd—nÛw‚h*™|¨ê__Y¹Œ…Âcñbó¢Kg&GSíY'è©S÷Ygek²®«ñyûZîMzµËêlÕÊùKh`c]­ór;Ò&¡ß&¦/õІ}H ‡¶Ï·DAoÔÁFf…0H`FNÕ"ù¶*7ùö ¹ë 9fã‘©ÆŠ UAHs=:&'¥$B>ç)0V×Üc÷YqðãíÂW{OOS؈E SØ‚«Àt\õjv¢d¶N™ò¶MY‘ÿ›qîÈŠ Òu…¢Ãò…„P×$H"ur"V#è‹yè`+k¶Š¡ØDú˜«>Òº¡\¥¶›7œ%ˆ-,l~`Êív´–¨v´>A©½£½¡ó[ZY´ÚÕ:Å©S­¾—“ÀB?ð ªÑX&B8«x'ùh~Ä¡²Au]ïJ3Ý]3®ûÙD³§ª{¬N³ZÞÄ4v*Ëg@bqH™F*ÀþƒOI4eœ”$@Q|bô+bŒ^@öY ûàd÷ëg!ê;ɈÆÞ`ö$gÃÉ>„û prOâ¦à4$ t}%À]Ðvmo«ýäÕ€Zas¢í2G-i!Ôújpr¸vï `Çh¦Và   ¨çÄÍìßJØÇέz …Íànë7\ß.Ø: [üPU¦ª-±í-³=Cs lÝÇiÖ"æ©;X ð—Ã’.Þ‰D~ {DgƒúºÞƒ3š@7麟M¬uÆé ß9Aô@f»ÊÂ'o8æ—¾ ¤ ©çDÎìNo¡x™\ó ‚. zNP}ÇZVïóR^øi`º~Ø1uu§5ÝVèseû›ÊÖ7¹Ü,áÁ€½MßVJS~7—únQÓ7º°O›Ý½4¾åeLg¥I‹«è¼ÜÙ˜XµR™ôžµT¼}Bþ¶éZ?R(Us5 c'”¸¥n¦¯®ýi+QOéXTM&­šI¯Ø,‘IÉ"™³¦Ž„º¬˜Ð/H‹µ—ËO:z©3rnêF UóÜX9À £ÜË×çlæÏ‰¤ÏœíΞFŽåžö¤æ¯…ÃëyA4KpŠéM½AÓaKA˜|òaÌ_¯ª×J’ô@ 3k7A8æoéÅ›¾óYJb<¬Õ®®ŽÛxa“ú¼•­‡ Î7=€¿óc·œ†­çxpàcþâ2r -ÏêÍ’š¶Î–\m6vÖkÜLè ðÞóõ›ÀOù#ª‚o)¥CO jè)I†¤„é¡GøÛ<1?áÐbš8óç›Óv¯œ ¦C¸[c’FœGó!i$=€¤$á!ÓÛ:[ñWìÅ£ã„à!ôómYÕݳ×Q~ò!ºÀEðÿ}¿ÈƒÆ¢Úž¼a»j™€zNܼ¾Ïêמ×{¶æ/â¤gˆùR!t9y\8ÎäW"y0uK¨™øŠ™ªM—̺ÔêØ´Õ¾ ¦$sÄ5G—oåKcâ«÷æXæÝµÒ@J|¹¢‹w"‘h¸élP_×»ÒÌ6.nÒu?›XÔÓ3Vøs‚è ÛýSVxŽÈùþ¨Eê9qCæ–ó…âer97º€ê9A%—ó›(Nø™Ÿ—òR|sÅÒVKh{Éœ?äÚTõ^”ʪԻÆ]ê›.KmÙv’8_ɦ]³º~ÓÉäôÚý¸äÇI@º´Š^¤›ÇFR)n²U^äíã›NC»T¯°ÓÇa‚òÄâëkå¢ÚÜ¡N¡Ø”ü®îÄ’±µ{‚è„eç(`ŒF²Aoi73Œ%Âé"ù¿Ò$‰3$É—› tñN$òƒ~ÞTÓ‚ÒtÐn\J3÷Õ 1?‰;Ièl=÷§yÌɆS‡(ú©$¦`÷¬˜e1=dô ¢Œ~̾ ’ÏX‹&~ 8K…Ò$ÁÝø‚-=…4;®¯‹´€.iŠõ„A¢Ve[âÓš%– ï<”ð°ËW»ÓôgÏš&Ûª¯uÇüI´¹{¢º|¿›B–ü­•.ª‡ÓÌGÎÒü˜ßÝ]cù¤JÉ¿÷k,…:8Ñ¢û ‚FHξ§*PÝÈ»Î÷‡ªn³Òht­_uš¬Kíò­Ûn³±êARÊÙæÝu,ë¡dS£°$Â雾¼\ǵ¾¢L"É…?mY—†,ÝKD›ª=Ëʆÿ®¶/_ÿºÀܶkÄÿþ¥ Þ4 endstream endobj 1911 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 1912 0 R >> endobj 1913 0 obj 2906 endobj 1915 0 obj << /URI (http://www.ncbi.nlm.nih.gov/entrez/query/DTD/pubmed_020114.dtd) /S /URI >> endobj 1916 0 obj << /Type /Annot /Subtype /Link /Rect [ 135.686 600.211 221.362 609.211 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1915 0 R /H /I >> endobj 1918 0 obj << /Type /Annot /Subtype /Link /Rect [ 228.158 600.211 505.648 609.211 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1915 0 R /H /I >> endobj 1919 0 obj << /Length 1920 0 R /Filter /FlateDecode >> stream xœÍ[Y“Û¸~Ÿ_ÇqÕˆƒƒ·M9I9ñÆṲ̀’*k‹’ µ)óíì¯OƒE)ÙOö5ì&úÀÕý5@½#Ãï•þÁCp.Ðæx÷Õò J(b±eE8i„1C4 h„ŽhÈŠP2îížàÇ -Ðôß»ü£¿Ý}þm¶ƒÜùÏ(oU=ÝýâøfÀóäFû»??ß=þ5B£ç]?Ä,¸ˆ…0¢<`Tè_=Ñçûç¢È*´+JTÊ,e¾‘ï¾ ç¿÷ÒTŒkiöðH<Í·(/jY¡cš§{y”ymäÿò<3†qÀ´!ûeà",¹$I<^Šð7 ˜áÇhÔ¯ŽŒIceÀ1=0?g]Ʊëðtþ0ÎÍ/À8 B„H„€W,!"øÒŠùaº7],TûÕ*Ř¥í>C$ (Ç“Á(´ë(±7}ÿgz´ÛMžgäB®÷Ž#-ÃÐQni©*4Ú§œ ÕF)ʼPšŒÚ‹¥öhS䯲¬+ô³Üf*—ÿjÖ`­Õ:SžLOµAÛ´NQ] ú Ñ¿?<é8rLë®GÎÀ,J”À×o´ñ§·¼8UªrGFxF†“@„!h„ àŽŒ‘óŒ¦ÀSôÁtÇèþóJ^ž; ?RAp"6ky¢,+ö[YÕ³PÇ—ã(¦Sé/Ž/»[|‰ao¾/»²8® ž[•ïg=¢!]Ðázt¸<»\ååf7xOEi¬ÑØ?’™|•٬㠟wùxƒ3,¦ Æœy}Ù©Lκâp^Øõ¤¸Á“2Ы‹ãÈ3©‹~Àêšý2Úÿ°µù¼ú„æ]ÓË ´‹bâDtÑ3Î$¿ Ï«¯Hÿ[/'4Ó!Љ©Žº¸¾Ô D¼y Úþó‚}JX@µ@úì¿æ{OY² ª ¿-†øH™Â#}JëüaXó¢_ú8:Q:j”¶öá$€!##ú^V›RjUä×Ò ¤˜ü(&£ü…V &5B÷—dÓ³lºéxêðÚôÓ“*¯ ‡Ô iØ6pè烜z K‡×ä[YV5@\×±uQ2ßt_‘(õ¹N÷{ÓÊȰ–aR§Ãx¹?CŠ=8œª9Ér§6*Ͳ7‡_ÊJ×™¬tþåCk ÞSµé¼¥þ÷óÇ%GÒͦ(õÎrž^ÌõÚ˜qòú`‚˜Ç°9õHÂððø©¬Õ&st¼~?RCB(ObÀ–""=½èç±`ñ$<&±GðP×§?=>žÏç ߬UgÇ W‡`_¼>BSÊ?¿6²|{—OídþŠ)&°}¶õv<8 :r؇¯OlM"3l"1$”ió ïÔ‡Ü3 ‰o¸¢ªÑ&­t•f÷üIaÅhì–6u®6íªÚÊZnêЩüÔÔâAx n  RÌÐ%QbøÔFŠÏã¸SàƒuT£Q McÊŒüj>¶ÆØÓ~)‡QX¾S Hñ+ÜTž^ jq ¨‰,+ÐSQ· -©KÒWév‡Xê5ͳ‹-?8q‰¢t:ûf¨_~mØ€õë0«º„½íZíF/ö¢¤ö, "ž1¨j˜å¸Ea…Xðˆ :Ÿ½Ò.ö¦õfôÌ"a#‰v›êõsfMÑ6¬G½fu6E¦&Ò˜j-Q—ͶHǬVz>÷Dömñ?µ¾ú8Ÿ{bº ˆŠÛ7b[€Bœå‚ÆÖòn ÛNÛ_öS ÏAà<²ea2’™® o›KmŸM…ÐQ›CZ¦SCNg4¸pžšÓ©€:{;iS]8&EšçS–Özw¶>Á1™×6Ë{%c›g»©=k.£®ÁÚPæC©ƒ”>øµ+/÷ìå]€>ìP^ Þ=íÖeÁ= YLHEp}œÆ‘Çæ‡§O+Î#±šOs,Œ•1މGJKÑGw94Õu\U5€"n^œ,ŠO"{˜³:\]‚dÞ« ¦æ­B™žŠFoZd°ÈƒÞŠ9’¿«ººÕ¯DA((ÜžO­Ô5¿tôÊ|ºdt}P)4Ýn•Þ iæ0‡höÒt] D›ü·¼8»-L‚º¼† ½uuº¯‡þ9UyN·¹t׸~˜,m‰­\7{÷åädI÷XC´AÍÉU¥»¢vNÝnqi…`cæûÛWHƒýÐ.`3óÇð£¦í¯Å¨©„.Ÿóþ…)OØHô©Ý“í8‡ÄAn†8•ª(©õœæä4-úçËi›!Á™ÜœHÚwC€»z@{†-¹,å>K¥qŒ£§Ì›ãÚ}µ–õÙ"yØOÛ8 ’HßÚpψÌ×Q!ä¯y9ÇIƒX¯yÁÂÓcŽ}“,”¾xI°7]x`È£Qû"7(h¼Qìúç÷„{ÎA\P4‰àº:!ú¦€‡ÄcNe¹pË3Þ À„Oøáû)‰¡Ì¡¡GEšÉrኑ'`„Ø}¯}AÚ] OUl`?Í_9àÆÎ&¯ï3Oá=Õ׉ÏúÒ Haõ!#¾ur“qʃ(ÒWá‰OÅ9-óÅëTˆl\€xŒÅ÷z$ÇÂ\lNUäE­6 wM‚À€tD¾wú©ˆƒ(ÖgÙÞ ÐÉsº½våßižéïX)ŽEmš\€N7N’+ãïõÜ—®ž5dšUEO}ìê±A8¸7Êe:i)Žu%»•;•·¤Ò°òŸ?èGPdè!œh_À$¢ ‚ŽGªJ»ë"ÃÑùÌ^ðƦ8ž2YÛcEËüÉ8¤bØû®¿Ògû&¢Øî›‰ï 'ƒúzd^°7ÝZ²;†1TaZ÷΃¼",FºÛkÒ_ ¡6*ê;”žãžŽÅ†p0„aüÔ?ÔÞ‚†K[‡èF¸3c;fÈ®c]ÛªZò±G9³z†‚Žá[j®©®¿Î2Ë‚žœr¡‘la.‰<çÁƒþgAÐqÄJ囬ÙÊžÑãí–ìfËqÝ^ Q{=lh{­cˆµÓÐøº¨Fwõjˆ5Ô›i^?ô,bÌó[Ñ8HÍA³¡&W®z&Ø;¥¯…Òç(Aõ¢1k¥ÉÛu •çjýŔ꿡­®oNeÑàxs¥é1H8œ†ôêé ÔÓö×ꃩ„®úÛ”ùò ÒŸ$ò ŠPh¨Ç²žÒS8 ‹þ9í»½häU&]ÕvïÅÝÉWO•r#Õ«œñc t° ëùíd/hySfXcE“m{ríè¾íd2 £€ê<˜ðŒâ£gí%bÔ¨;¼,ån»N§ŠDØ£àÖcB¹ÜÏCXÓö×VàTâ–ÕCy5”zÒ§šöšA¯§YÈMã€ëSƘ…5‹‰úÚÆ~A=²íIÖ¼á*Býi‡’ð[ Ç[¨ùú®Ïªºz@ 2̦Èë6Õ´»–gqò ù¸7O;‹ÛÏTûõìêÓâ¤Z_òQû›&<ä™ï›î‘’o˜ì‘ä·Lõ7LôHò2Í: Ù¾w“œžÚSÛ›žâs(ý¸ýveõõêp:’yªÓRÇa{X̹^K–2µŸ29·|ícwÖ š‹>–63sÊӷΔ9Œvo™=åój?ž@תVÇ *ƒ´ÉZøeŒµç‹ícê»4‰E8ê©ý`¤Í;:»o ý¿1P%ks#b¯hWú nTks]žo?·ÿåîÿæÂ¸£ endstream endobj 1917 0 obj [ 1916 0 R 1918 0 R ] endobj 1914 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1917 0 R /Contents 1919 0 R >> endobj 1920 0 obj 3379 endobj 931 0 obj << /Type /Action /S /GoTo /D [1921 0 R /XYZ 72.0 769.889 null] >> endobj 808 0 obj << /Type /Action /S /GoTo /D [1921 0 R /XYZ 72.0 670.669 null] >> endobj 936 0 obj << /Type /Action /S /GoTo /D [1921 0 R /XYZ 72.0 636.425 null] >> endobj 1922 0 obj << /Type /Annot /Subtype /Link /Rect [ 290.283 586.587 318.613 595.467 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1692 0 R /H /I >> endobj 1924 0 obj << /Type /Annot /Subtype /Link /Rect [ 142.5 574.467 158.06 583.467 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 895 0 R /H /I >> endobj 1925 0 obj << /Type /Annot /Subtype /Link /Rect [ 176.305 445.704 204.635 454.584 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1692 0 R /H /I >> endobj 1926 0 obj << /Type /Annot /Subtype /Link /Rect [ 187.99 340.343 229.65 349.223 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1796 0 R /H /I >> endobj 1927 0 obj << /URI (http://www.ncbi.nlm.nih.gov) /S /URI >> endobj 1928 0 obj << /Type /Annot /Subtype /Link /Rect [ 364.294 292.221 398.184 301.221 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1927 0 R /H /I >> endobj 1929 0 obj << /Type /Annot /Subtype /Link /Rect [ 403.826 292.221 519.946 301.221 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1927 0 R /H /I >> endobj 1930 0 obj << /Type /Action /S /GoTo /D [1914 0 R /XYZ 72.0 769.889 null] >> endobj 1931 0 obj << /Type /Annot /Subtype /Link /Rect [ 480.774 234.86 523.274 243.86 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1930 0 R /H /I >> endobj 1932 0 obj << /Length 1933 0 R /Filter /FlateDecode >> stream xœÍZKÜ8¾÷¯0²‡$‹nÅïG.‹ye&‹Éî$i ¤sP•UeïØ–ãGW겿})Q–äGU²·d€i~´DS”H‘t}¾ñþ»ÒÐ#iš9ûúæ³â{Nâ;A¬X‘KB?rÝÀñBâGNíÌY‘S‰9áOü™\8nš×ùõæã'“;.Ì;ݸ„KQïoÞZº©@OúÙ®KÒïOÁ·ó N’„¸Ë—bä%ŠG3E–ß2ãà ðïE•Ý•Æî¶E§=ÿn”sãÍ÷7/^N®s0•À(Ï˲$ËàIýLüóûÚùø,IŸrîÿyóËýÖùnV·>+¾ÐKÌŠ3×n§–8~áC,rf×ñ=⧉ëºqŒkÿ© íÀ:'%Î;v`köÌ©iC¬fÍ€†vÝ0j˜:aB¢Pš2DyòÑy£Ày¶§¦Q¤†g>vtÓ‹{Í:•C¡ÁP0{l¾Û›Wð$çWecÆî«–@4þÀ,ùU¥AÎjÞôCGf¿×n¯6Ê«-°Ý壘‰“òlì ÍšDÅo5Þƒ¦ŒUtÌø¦\´Ò oî¶ôØÑa_hTóÜ<*aµŒæ5ÏrÿnåÆ?°§Uµ¶Jâ‘Ϊ¸Z…V½Pû. '­%I'bÖfÝ#êÞNÌŠÑ~˜ë:ÞݵoÌì •+’øT°†=²nÂ`’Î 6d/ÑJO£ç^OÑZ‚Ü’=2KÖz™i°XfOk9|Àsž9­ˆ¿£…NÂr*£ {W³¼Tǹ‡²Bw˜M;¦òd)º-Û²9ŒÖŸÞlhåÀ*åál ,è°=íÈ­ö aÙóÚPY´4Ô®Oœ‹Ðçë)lN?Âÿ莃È+vÎa!·9BÙ~nÚ·ŒåÎØ:CO{2Å${ódÀsIÉÑ<Úy~LO8lœ¡*)ñˆóCž;&æqÑD…@/H «ð–2£„Ä.<ñÏÈ©ï^¿wr:О ýצ—BŽ@³Té*©-Œa!ˈ¼/+ æüÔ„gYM›f& Õyñ*Yªâ{)¬.º0‰×JÑ<=¦É«uøaLb&ÇQ¶žlÞ>ÅrDàÅ-z-â²ie$TPž{bð=ÆþËc ,è#Û6Èný,˜+üH«l>07ój(lõb\7‚s–Dñz¸£k9ÃÝzv ´lÞxçÔ޾}|ÈZ]Òmlû¦…;)Õ®DX€c”Bt(Y•÷£•ÎÙŽ•5,22kð´‘jjaÉI¶:$QDbHaÖúßÉê…¸±ž³—’ˆ¸±G47¤(¥……/ÔŠ©+"Ì*x;”Ü2$Ù+Ë]9TAŠCôóíW}Å£B?!iÂÁq½ÙÄ(p_”ýÆ!ñãÅ”)ωS8Çâõ¨)@½AG¸˜ËæÂ¬Ë»æ%"wy¦·¡Õ·lšÄW$X ñ ʱÆZ,î¤z ®-•ÓÆŽxÇfR­áÔ~e¶IùÆžéBwÔ2 !¾{o'CìëD׌6 x=+šõZ„vR‰8¬­+sý”6çíÓKP6–h[7Œ¶tÓž‚šÒ4ê—ÅÂw˜`%s@P@äç†ÇT΄Heg’Vû£–œŽµ]i dc{ƒq瑦è ¦õÙ‚©%3ái&zô%¾±”90ûý‰óÖž¥S¸I³ £ÅþÂhâ2‡U×NÙäåc™°3™\G¶ l×ÚŠ<»ò|Uãþ‹—} &P{ø[–$8ã‘‘ËÓàŠdogHzB'@4L|„çMÒÍXC޹—¹7rÌtu; 1_ÿlØôhD[ï, ¸h®±(4ÀS“r3h™òÍ–ïû‹åë 4ŽˆojPDã¿çB¥äÊì×Ûú•øï°ûT˜a´5ÛR@Õ½ÄbAùþó¦}fêmNcƒqà5”`{q–,þÊ*Q çO·€Ž¥ 7ì´aÜ \¬Do…,ÿ²P$iXµ ­|ä6OYáyÏ ƒv»ŠwÔY¯ÆÑŸ iü4ÕÈP•µç“Hë<–°ô†äÜs™m @®¼8 ¨F& kZµUîb¸ûB™ÊGó;ßÔX +½¡Ÿ¼kŸu¢òyB [åÒW¤[ >V¹5jö tdð¦Z}±Î(]¬SÅ_Od- Öí Cµn€v³§ÂU¬õ¬ Ar»nàïzýÚÀŽ6Gvá=µÞ¡nIï¬cS~-|Q}…o#YÆÔw¬fb‘bº¯’ ¼s|;A`ïrÔ!PËð­,ÈWù‹¡Õ‡`l¡òÚcPW,ÙùQ´r:'Ú Ûâ÷S õºrW•üØÑ¶(7CkºŒcà¿2gÊDÄxÿë›ß Êù~}GUJÞ냡•ŽÓ`C7ؤ@зl¯šÈ †´­ŠœÉ«é0ŠP'Й7%ã‘Ù0@¶ Z±¡âðäP ŠÞ©D¬%ðÁ8”p X`4qŒ³Áä{qf´Û8{¡‘0‹M€Vô<ËŠ¦F¤¢»¤E2yêJÕõ¬+DÒì Õg@Žë–ôéõ´µÔ5B;YP,uë *Ý·™ìºa¨¬fæ›.¢½t¹‹×9Xª1¨ëÓ c ÎÏ®^è¢Y$:ÆA¶žîLÍk•Z­ÐêC…$\´ ÂÈ'i’Ò%ýò…ÖmÅïëízq*’,RÕÁþ OEñR'û~”í„'Cþg”Áh=Uœbí£fjj76ò^B$Ã?’³ž²¯5X욟ùÄÏBH…ƒhCñ?ÆÝ–/æP(z)áîæbõ«>.çËý(KSpÑõ¼bÚ—/^œN'Òìw%iªš4eAŽüq™Â‡ É`k<(ÿ×r>­þ0MƒÔ-KmqÚ™4=âéºÑ ¦HïJ.ÉèEȲBEÿðœhþ#¡§r#É:còÖÓ|M?Ë‹/-Ol- ™¼ÕŠoŒ ÇvcåGÌW®bÔÒÝ·W¸Æ» ÑÔúC¤úiøFda]¦èN“5VöfYŒî ¢Ñoü¤iyÙ y2"޲0EZYÔ¤Ü~bä¨ üÇÆç%_4M2ðëD¾-ÆE[ã^É[BÄÁH˜ûÄ - íÎzH§/_X>Ï?½™òiýéMnòÔoEø0{OÛ9\ܪ–,qå3YµA*TÉP':ù2Ü­Ú‡Aù¤Èc#ÏßXw[»®G†/׿SI®¹ý¿•Êâ'A–Æé%¥ü¯*%öʽùT•§¦™)ˆæÍÃsƒë‰Ú!¢‰¬ú¤Á3áú^ßÒ±^õ«³¬Å̞̾]©Ã9¹5pìU’°ñª¥¸)I´eWæ7ù]Ù“vùR3 £ñk(:¾¼Ø S“T|eÇ+ÿ-ä{®;õß¿-G1™»-æÅ+Ï[7 ÜÙ³4çŽ;Î §­ÿ~MñÎÙì1ØH”º‹Äjм‚£V{ˆ÷æ-¶VÂo÷/€ Qüú Š½×ªÅ]õñ9銭PitÃ_ } ñ„#g`_ DO›ÑèH×ô/3‰ÌXd_ˆâû¢¡¾K·ìÈ„{¬ $4‹õÐ\tùx#ï;/_D A=ñ.ïo5G5 †by6j Ì­$z˜ú©OÅÙÐFÈ~ìº)l#çPJs @gEšvC¹¯ õä}½ÙÒvsÝâ×"³uË >¤W„ìæbgO†½[E‰ÏXòû¯ÂS×1‘ÝgEa$S·2‘? v™%TÕ~ŠÙ;ÓÛ+‘Ï?<Ÿ^Šg$± Ê@G° ±»Ïr”l=o¬[ünd¾ß`búHËŠîʪÎüâÔ…LÒw½é—:Û¹ÀjØ=¶B}¬¾˜&{È®d^î›:É\§6À6Ë»F+ŒýÛ„æ·7ˆÕooÔÃJõö}U7šqùe›ò¼ªøI囯 ƒ=qÃpÓϬ>S·ƒ«`ñ2+ã®à˜”ú›¢›ü0ˆßáú…;Ú] l~^™í<<›jÒÃyZKÁÃÄV}c²$~šAF ÓJö·„Ý É®HpʃÓ0°\O»óÃó—Ö¯æÞÞüW9 ä endstream endobj 1923 0 obj [ 1922 0 R 1924 0 R 1925 0 R 1926 0 R 1928 0 R 1929 0 R 1931 0 R ] endobj 1921 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1923 0 R /Contents 1932 0 R >> endobj 1933 0 obj 3202 endobj 1936 0 obj << /Type /Annot /Subtype /Link /Rect [ 165.82 602.949 194.16 611.829 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1935 0 R /H /I >> endobj 1938 0 obj << /Type /Action /S /GoTo /D [1887 0 R /XYZ 72.0 769.889 null] >> endobj 1939 0 obj << /Type /Annot /Subtype /Link /Rect [ 213.32 602.949 238.32 611.829 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1938 0 R /H /I >> endobj 1940 0 obj << /Type /Action /S /GoTo /D [1896 0 R /XYZ 72.0 769.889 null] >> endobj 1941 0 obj << /Type /Annot /Subtype /Link /Rect [ 257.48 602.949 293.59 611.829 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1940 0 R /H /I >> endobj 1942 0 obj << /Type /Annot /Subtype /Link /Rect [ 312.75 602.949 344.97 611.829 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1930 0 R /H /I >> endobj 1943 0 obj << /Type /Annot /Subtype /Link /Rect [ 215.07 558.829 402.55 567.829 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1273 0 R /H /I >> endobj 1944 0 obj << /Type /Annot /Subtype /Link /Rect [ 203.13 536.829 315.33 545.829 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1275 0 R /H /I >> endobj 1945 0 obj << /Length 1946 0 R /Filter /FlateDecode >> stream xœÍVÛnÛF}çWÌCl ^î…ÜKam»I ±- -âœ-êºh`U;pve­R{þìÐÜ¡=š!=‚'UUÝÚʤJÖ¶´UÛ㯚 J‰~i’Ý„ˆ%§”"ô¸ñÑÛÐÒ{ôrüسXú úëÉé(bºð¸ _Lp§ P*¢3Fƒ}PB̰¹Šy1é‹…û¸(‘ÉJ>Ò£¦{tuj›æ"KÚ¡Û¼v;¹ä¸Ñ›Ût[¥m^W:›ø¦KàKRä4­Ë«uׯíÆÂÝÛ{xÿ´ š\]v¶ž'¼1£é€\ÒPJyyßo—¯¿G99[ø lÑò-K¶×*¼~i£g"IëÝõnòÂ6ºÃz½;ü(Z"¢©dCøw×7oÿm›†8ß²e˜-¹Ë—îdŸªWœ“ìÈÓ5\õ2) ­«U¾Þº¤[‹Fõ zÏäÙ±2*Ž(~zóç»ë<7DÆâ‰·uÏŠð‡kÁp_ŽÆÕ¤ÃrÞ[ IÑÔû‘É©Ôdäwt¿ã˜ygW¯_,")1á³aááL=œÿü½‚GŒFÍIÎ8'l–Ͳ{™°‡(U‚Oàm5Ï.åúÇì:&ÎU+1/—ÎòsŽ‹ì!RDÿ‡ŸG”¨xŠÙfóÄŠ£0qÔÿ$19Éë«LË©*ó'‘-véÃYQ§]·>~}8‡™ d¨žxÂ' #¤Ù$ΆY= ’‹Ë/Ö5Ø]WÃsÏæUfÿ%›¶,æBçTχþd—³1‹ˆ?i¹œr—Gg8 BÕPeã÷7mûøKØ'BšzëR‹[Éڒʶá‰Äv;€Àí32F+e&|_Íê€Ø)phù= U˜Ñû¶›NJË Gc # 4ÒSij‰QNá]1-&\]=wÂò«MiŸBümÛnj7;ø½j+W«@ô¸~²ÃS‚?—·­­`ùÞ%îÓ¶7µ­òôS—egøµÜ ’Ù+²wøº þãäA endstream endobj 1937 0 obj [ 1936 0 R 1939 0 R 1941 0 R 1942 0 R 1943 0 R 1944 0 R ] endobj 1934 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1937 0 R /Contents 1945 0 R >> endobj 1946 0 obj 935 endobj 1948 0 obj << /Type /Annot /Subtype /Link /Rect [ 165.82 95.101 194.16 103.981 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1935 0 R /H /I >> endobj 1950 0 obj << /Type /Action /S /GoTo /D [1881 0 R /XYZ 72.0 769.889 null] >> endobj 1951 0 obj << /Type /Annot /Subtype /Link /Rect [ 213.32 95.101 238.88 103.981 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1950 0 R /H /I >> endobj 1952 0 obj << /Type /Annot /Subtype /Link /Rect [ 258.04 95.101 294.15 103.981 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1940 0 R /H /I >> endobj 1953 0 obj << /Type /Annot /Subtype /Link /Rect [ 313.31 95.101 345.53 103.981 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1930 0 R /H /I >> endobj 1954 0 obj << /Length 1955 0 R /Filter /FlateDecode >> stream xœí\yÛ¸ÿ>èˆi‰º(l·@w“lӢ݃nEA[´-¬¯Ž™L?}EJ¢EKvÒIFÀz %¾‹?½÷HÉüíÊFü»¨kcJC´N¯~Sý6 r|ÕåYØ%že9ˆ¸˜x(E‡]J`ŒÞ m þÜ ôýt•]Y臫Ÿ{"dÁ¸û+k„yÃêÃÕ;M7u´ç¤Ÿ…¶WßÝ\-_{ȶÐͦw±ãcúa‚G)vH(þ!è&E?_ßäyR¢M^ ‚oxÁ³5þ ºù[?š„Ø¡b´ ò¬Áp–E(Ë+^¢”elËSžUrü«›Ÿ9–…éÜ\öî@E€\ØBþw±#û Gr—’RÊA´@þUÙ24¶t…MÎF¹qúl; ƒ0„K˜@È)ÄÌÆ<,Dè5aµù´•ߣçÈõÑõýŽgª¹ªã$г­"«W­=[ÿ VäÍŽUª—/Të!¯U+ʳ?¶×3Î#ƒtóòuhp5±,Ë&Ä6t^<´ãÌÀb“ñqJh¾¯â¼µ´Î^–†æuÙY\ðužîã„Gƒ0Þ4¢Ï*ÎXCð‰3TguY³%ùš ‰à Ž·­ ²ÉNð0CÅ>E­_¥1ï.)¶`£#çXi!×ÃÔv:ü}žmâm]4’Z.bx0t‘K‘O±‚›U£yFЏõjàb[H³|Û‹øKj&"®˜Ø x )#,ìKCŒI¶]H"Ž{6Ó©XëÆšÙ¡;ÁU9LD\Å,‰ÿËQ\•<ÙàÖLð z&t°à×ÐSÙˆ­À1jÁ¡ø¼æ±´- *V/ˆèQÏ/žŒ ÁvЇT!±q¨‡ˆ™Ž’µ ;U& úî´} $C×Q]FT8‹½¡‰¼ÐøF¸NÝæšÒUϸ:¢okÜÖ UÓ£Mšæù^§I ,Ã!¸‰ÄÆCh5YÇsr]‰´Aà`;šzlê0§F¾ ÄÈcŸ…±ÿMú¼~ ^ò «“‘â×±}.šôšæ  É,lÆÐ4PÄ%p}!¼]ÀvlßçéèJK%G(–è1°]"Ôœ²`  /†&£†³ÌX^W¢ŽœN…<ÍOO ›Ûë,Ïøíó©”7OÔ ö ¾br»@ë,hÝÀÒ6’‚è´¯+¹ÒÍXÚ®Úg='8^bÍ"J¹–%×z<(µì Mä…vBÚÛÀ^Sº{† Zv£¢ok]/ôŒ¬wŽÓÅJÖcû=Ï¢é¼wAÔõ”À™\ãÍ.£ ¯ÐSO‰©—¼âEg\lŽ/œÐ,‰WÕŽZÊ…}G»¬ñ&dÀ[F¹æ}À‚Š7jP¹µ»²¶elX»8 a­ICÇdUnZCþvû¼—]å}›e}›ŒËJ¾Q=ýšD³Îq1uÄV9XÈ•P£¬w¬`ëJ2ª"V®>yh»òF@Ýsº°‰3Q E¬bÉ”Xþ+òß;/¢1ø%1<îŽ )­žýý§gHè!Ъ0PçÙ0‰câúŸ|†‡9X,†°`·Î³;^”bu_ð²N*˜Û‚‹ð‹HÅëJœêpöÉ.žçcbA¼#¡BÍkáŒóNTê‡Ô ©ç¨#LÞ¾õúÍ¿—¼Z/ ¾‰V˳NVñ}ä…Ö€•ˆ Û$_±D˜Ý8# ~–¬ñÙÚú67oAmD¥ˆ?üõǼZâsuô‰;` t¬KX»Ÿ£áÉéð݇ž'N*S>øÀ9bI™ëšùÇL œ åÔq4ïùæåwS¨ïÃó髌±¨ÉÔ/P;Ü:˜Ú¢FòÃ#ÃWñj2:@öÃö¤t{RºíÚØ/92>:!݇ÜOÅ/è1¿–µƒåˆãäÈ1ãSV¬'åa½8ÍÀ96ü¤x"Œ·`xàsžzo<. OÔ·4·JP ]LH³ÚÔÄ xâªÛkqÚ”xd÷¢ÚŸ +yGx"HÊÄ·e”«p²ø“ V´”ºŒ³ˆÄ»*Õ÷3Þ]ý(7 endstream endobj 1949 0 obj [ 1948 0 R 1951 0 R 1952 0 R 1953 0 R ] endobj 1947 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1949 0 R /Contents 1954 0 R >> endobj 1955 0 obj 2748 endobj 1957 0 obj << /Type /Annot /Subtype /Link /Rect [ 165.82 183.553 194.16 192.433 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1935 0 R /H /I >> endobj 1959 0 obj << /Type /Annot /Subtype /Link /Rect [ 213.32 183.553 238.88 192.433 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1950 0 R /H /I >> endobj 1960 0 obj << /Type /Annot /Subtype /Link /Rect [ 258.04 183.553 283.04 192.433 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1938 0 R /H /I >> endobj 1961 0 obj << /Type /Annot /Subtype /Link /Rect [ 302.2 183.553 334.42 192.433 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1930 0 R /H /I >> endobj 1962 0 obj << /Type /Annot /Subtype /Link /Rect [ 215.07 141.569 402.55 150.569 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1273 0 R /H /I >> endobj 1963 0 obj << /Type /Annot /Subtype /Link /Rect [ 203.13 120.637 315.33 129.637 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1275 0 R /H /I >> endobj 1964 0 obj << /Length 1965 0 R /Filter /FlateDecode >> stream xœÍYKoÜ8¾ûWƒkmšzKA`lfo²»ÁäáÁ.0ž[b·ˆHb‡’Òñö·oQ¤DI­–3·$°Í*±ŠUYJ_.DàÿµúûŽã¥åÅÃwPä"/4¬€`ß ñëc7@%š²T€Ìxàö#ø3™ tŽþsQ]ô‹ßÿ€9" w¼ g”wª>]|Ùf&ÀøG² ýÅÏ÷7wrºßYˆ½ÇI˜$ cÏMÔ?Ý—è÷Ë{!Ší„D’í˜dUÊ®þ@÷ÿ´Òn‚½XI;°™‰Ó*C•hXJZÑ=+YÕhù×÷ÌÌw±ç$„8®Ó¯hCÑ{)RV×¼Úk€ èù1ò |0‰û°ÍºB×Q€tyhåAÔ#†ØÙq3žùîåÇ_,Q_ÒÆÒ¼¶cˆc.Yñh9ßu b$°“¢<³Ò÷Ûôñí§¹I˨…?Šv–›?œASç¢-²êoPZt¹evÜa‰¬”¼fÙèyN›15ååAÈÑCí’÷Èj*SÛkåêÑŠ¢dÇÉR´ûÜ’gWgÙžÕØÒ÷ã‡;^4Lž¢Ä3tèá@Õ&v; …Ác-êÚñŠ Ä‘7ù@|iycÑaTˆfwµ€AÍšz3p¶­¨]3KŠ¢Gƒ{(›T”À³–ÝÃøs%ŽÕ@=tu¨§J!ç5 ˆÈ PWðÏêŒ7ÁÉxНpÄ3´È+•Õ p$£“WÏO5'ö#4£ùÁuƒÙ´`aÚ'8 hÇY‘FÊè„ Rv¥­4›Ä÷•P‡‚5`-F÷9 €:­¬ÙÁÛŠ GÒœV{†OÍt ù$PxkvžÎ{Ù6°€/„a‚.+Z²z êK9x‘ ^ C½Ë½XÓJZ ´èÆJa†­R€¦Éõ‰ÐœŸž¸ã²nêϲÂ>ü7­«VchFcH4ÿ“e @0E k»Xƒ®SȘÈÇRl VÖ#–‰¡ž,Û¢á‡b,TöôŒìž(hçkOvèãcØÉŒÝíDz¹¼‚ó^O—V»²€‰Š-Ä¡ÆÄlØuœè¹-AèbºI»±yŸ§’µÛ.¹†qH {4÷l÷êç³É#òqgŒxʯY袇«ÍÐ-¬˜x8Vh Sñ-ß®÷J.¤­ÕÕÕÕ.w.ÈGž» Ÿ=±zâ8VÍY¼„ÛÓ«Ç!&ê›ç.9ϪÕÕ]ÇY“~ru׃¡‘äK–­/' Ž0üç]Ÿ]NZM¸ëÄĉ‚xtÒÔ·ºâõá²i·‡Ç‡+´² #?Nu"“Oêîí7™0Yåú…z·1vkh½ê ¯2ö çMY¬š=¾¨&¾³hú‘mWmöF=þ©2ôb–ÍèóHdÎééü¼iÏo´#¸†¦%e;!÷ W¬¹9ã˜ýþê©wÏIGQ² ûv_}‘t’ˆ¸ u©2(¬`±›Ä€A‡ ŠN1€ÆÙñL´Î_Å`þÑàô”*J㩪ÛïͲaY–À>’È¿Œ~êƒY˜@¸¸.žOo…èHáGò.øê=ÿ;*?·5z#XÅÓÏ©Ê Œ¿—¹áàŒÝâÑÊÿ$Ñ/ endstream endobj 1958 0 obj [ 1957 0 R 1959 0 R 1960 0 R 1961 0 R 1962 0 R 1963 0 R ] endobj 1956 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1958 0 R /Contents 1964 0 R >> endobj 1965 0 obj 2459 endobj 1967 0 obj << /Length 1968 0 R /Filter /FlateDecode >> stream xœí\mܶþ~¿Bð—ž[™¢Þë¦@·EŠ´iêE[ ¼]î®`­¤èå.×_ßá›D‰’víÞùdcÇ‘œò!g(Îê—+ÇBðoÅþDžcGQlmŽW¿H¾c…ØrÉò‘ía!מ}ëhõY¾•B½€U þôê}°þ}•]!ë/W?þu¶‚vWh¢sÞÕ‡«4Ýd(/I?dí¯Þ­¯ÞüÙ·d­wÝ»ÅAÇ0¢‘íâ˜ý‡­õÑúñzçieíòÒ*鎖4ÛÐ×?Yë¿v­ql»kí€<4hN²­•å5­¬#ÉÈžiV‹öZ÷ÆÌEÈŽ–6d?ôTÈ…ah£!áÏv8¢Gö¨§ÈRzaø;©224FºÂ& £Ü4ƒÐ'ŽÃ8†GvÔƒðç³óL°`¦²Î*¥ññÐx/2ÝJ®‘±¡BFmKU†ªÃÚ4Ö¯ó,ã|›d{Ñ’M̘¨À\ÏhJ7µõÚZaDZcëº>PÊ›ºhôÇ›)ɦ¦¥ÆSÂm÷¡)м¬év¤^¥ñH©‹+RRÃÖt\miA³-ì-zÕLïlC²Á¾æ¹ØvFȉ\a^S5$MY;Çu­ë;Úwy#:äT’uÅMžÝÿœƒ·×îík»}ðí®-fy[ìYÅ9Ò&^® ºIv ÝÞ´,5»±m{0»èFŽiÊ·¾_E‘¯œI,¹Ql‡1›_štú}$mù;R'4m¯ÌQõ¼AO¤ªš#ÝÚmÝ‚_ A4h¿ZÏ-£ú©õ`4¨ zj%DhÐèû{Z–É–òy„ôÚµ ÒÔùFk£=9µ¥5,¥$ÏìŽ÷ušæbÆ=I]sÄ-1m§ë`‡!BQ½³w  L7Õì+5[^ÕdÿJ{–i&¼úõ˜¾š°FÌÄOBÐmKr-ôeŤº‘¥Ç¼‘¥mžýN=Ï(׾߸±~X(†™ž;#ZϬ$¾QM·”‚óBN#š ¦ª2´oªÖj˜§üXÀŒnGÆ4z§»$#e³³Þd<°Ò\¢ëÆ¢6*w°©& 3±Êâh©ÁUËbBµÁ¸,*õz†ÂžÀö5'Ñp&á’¿Ñ¡¨ïáÈ…ÐhG4‡-—ÊŒm„mÏã⼑Öe¾…°£›a¶,µWz<&vKÇ÷m‡Å„AìO«Unf÷5Œâ¹N¬:‡ùHꄤÉ©•ÔMw¶2Æããùvˆ|vˆõåÑ•ÜM0m ”‚£Dªû<ˆÇ>x$y’€•ÉŽï"Ú_±Í›Ÿ DrÂî@¡‘ò@áB¨©(VxþD!º–‡ £;ùRaÀïÕ—$kT— ÎêÞÐD<àcÃN˜²˜kJ—œéh;˜ݯƇ­*§G›4mä;f5@†1L0?°‹ñ3ªïx}¹’ÿ;CÛèAÕ‰‚á<Âð3B _0öYû?ФÏëg꽈•Æ_|8°už‹&ý È3 É| 2…¦"€ë™ðvÛi°}“'ßËJçúv<¶Ëµ$/¨ôlh2Â8d¾¯Í›š“ó®ð‚§%âé%as{å½}=çò–‰šÁ­Âtnh­5œoåË'KÞPðãnFŽêø>îõàÄ>b-b—ò%=”T÷†&âšU ì5¥{g ênRt¿wtÐ3¼Þ9Jô0¦‹ÿ¯G v 5ï÷.ˆZ"¢^8³g¼eÂeÒáuº`ê%1õžÖ´<&™¸Òpã°Ä. ꃸˆ—œî¶^2ŒÛ\da<è[ìròŽ’åß@ä6}óåyvÃY3‚¸Íèj:Ëüït³Û×ì:ïÊ$ëÊôפªå•‹àtgÍ:׳£Þe¿6òYJÉu~Oˇ2©ù Öœ¥~h‡{Ýî¦oÝéVÜN!˜›&Šše‚Á ›‹b\€ì£f6:ØŒˆü„!±`ÆÄâIZªŠ,.55P¬ù¸Xu9­À ¢8Åw¢Ï9ÆŸ£I?jÖU8{i²#[ìóÍ] G×Ëbh.ºY(t¦ó˜.[ ÀD’]€Kò«h­Q"6ÄŒãvl²üe–0ß±%œiv£In²Yþ銑ý–HB ‘Ç"3™1"©$“q›¤·¤&ùˆ´IÞ÷´¡ ,͈åϰL4@ éŠP®áFÏ^0èŒ}ËCL$6aˆ¤JZ5©ŠÓ$O#Éë$5b‹ $&Oÿ!j€];h3Ò$U‹ÜEŠ,OITíMˆ&#DC«eÞì<‹'vÙ(k¹ Fv½ï±ä74û©”{‚= ÂÀl¨I8—DU—I¡Ñùn§W=ÐÊÁ:'ÛmÂrRDF˜çÆvh]§ìƒ¾?í¢ç Ò?®=>êÞ¥šŒ¥š»óÖP¬giíŠvóüxŽ&¶¡ÈÀ&j{‰M ÅÍã¢í(—m¼jÇ×¹Écý/Nª,¤.Á§$„rRßêå$gîaåîkLŒC—½ÞN=މ|IÔÁú¤ª6¿Î›@pÓóá¸^kœëj~$°ýïHߍT#¶¯&uPlTè\îœ&4€âÝ2#††pŠá¤hËm°~Rƒþ/“;S4à#¦®^Ûe9…ló!á·mö÷ºJŠòäÅúŽ7aàðN„¶!|JSU:GËgt–OµE·…Îáþ¢Ël7ñ[–´38ÖW¸sÑ¿ŸýFà³c endstream endobj 1971 0 obj [ 1970 0 R 1972 0 R 1973 0 R 1974 0 R 1975 0 R 1976 0 R ] endobj 1969 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1971 0 R /Contents 1977 0 R >> endobj 1978 0 obj 1124 endobj 1980 0 obj << /URI (http://eutils.ncbi.nlm.nih.gov/corehtml/query/static/efetchlit_help.html) /S /URI >> endobj 1981 0 obj << /Type /Annot /Subtype /Link /Rect [ 434.585 624.637 489.479 633.637 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1980 0 R /H /I >> endobj 1983 0 obj << /Type /Annot /Subtype /Link /Rect [ 499.373 624.637 523.273 633.637 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1980 0 R /H /I >> endobj 1984 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 612.637 378.61 621.637 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1980 0 R /H /I >> endobj 1985 0 obj << /Type /Annot /Subtype /Link /Rect [ 165.82 352.197 198.04 361.077 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1930 0 R /H /I >> endobj 1986 0 obj << /Type /Annot /Subtype /Link /Rect [ 215.07 308.077 402.55 317.077 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1273 0 R /H /I >> endobj 1987 0 obj << /Type /Annot /Subtype /Link /Rect [ 203.13 286.077 315.33 295.077 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1275 0 R /H /I >> endobj 1988 0 obj << /Length 1989 0 R /Filter /FlateDecode >> stream xœÍÛnÛ6ôÝ_ÁÇHh’¢Dr(еH»uX·´ °M0(2kÓÅ•ä¤ùû£K,K”œõ© ‹ÏýN]pÂà÷?´äTkC¢tñµÝçD âí–Ϩ>c’ Ÿ¤äpË' ÀôD÷ga½!-²#¿,¾ÜÀ™a÷°`ÈkTŸz¼µàùGâ‘»Åë«Åò­O8#W뽊½€jc@£šzÂà W)ùrr•çIIÖyA »¶…Í"{zC®~ÛC C=Ðè±x˜­H–W¶$i˜…w6µYÕÀ¿¹:ЙÇÕ?šÊ>°.§”¢lèŠð'©×ìÁNƒ_02\6Tv šÏI–ÙˆcÖgxì…? sÓ(ª87F¯¨>p!ÁøœÇü0âE _5R&`³hÅ÷WThÆ?ÐBíGª¾‘ý0mà •çМÔ,ðF7@¨«Ûóíî6µ+r §X@99„-gš ÎÊ—c×B¨!Ÿè*lUÄöb~¿f½Åç÷¿ß¶„¼VqÞ?–¯{‹Ë¡8×'›ªÚþ´\6‚Ò¼¸»>í½„ÀEŸ‡ÛÇÞ¢ÚØ¸HÊ„RÂ,£[ ´tß]”z朳e`¨XŒâ-¦OY¾-ã²oOã°§ñ¨flÏØá\°1$ùr*kA`‰…e^ŒWaÞ†¥&©å ø ßüŸÎ°nF%G7âjŒ#ÍWÓä…Ïg@‘p5Gìà 0/¤CWÛÂp|_¾wA)½Ù{Œìù‹„Õ ì¹¡ÊpÔ¤j\Ø2*â-ıðçÒƒ’0å¹ã_‚Çûƒ°l÷ÐÆ¥­ú[ë"O{Kˆ“Þêrˆ´s’ÞÖ®Œ³»I ƒóA}-¡yCh9ªhÓK@^ÅI\=‚P*0‰g¸KþËüÏSrš–È6ÅŒó÷ý!«ÈZI³è6¦Y’Ò,Þлü~å…ÝTi²üº³Åã²Ä4-Á@”¿76ÙR<0Ô 0ÔÙÖóänFÇ 5²uÊñqŠ:0€‘ŒÜ£Û Wå~y9xý”ÿ”¨™ëôý²IÄÐzØÌ_t«°ìž¶a¥­²ÅÓNçwøÜº >FyšbÙ.“8³gÝ"BÜÔ |*«UœÑnõ.Ûîªn¾útl“ï’ÕžTŸø G-ƒC\eâ–å¨@QP[²<;_Åw1DÓõI¹ #[žˆøŸÙdžjqÊ3È×§”¼Jh«Ë]0aaÉCW•ÍH•#ßUô¹)D0°¸bØ…·yèÏ:{tÕlÈ:®¢#4þfSŸ7ðçÓµ&`Žó3¹cÜqX`&2”!ÙòÓÖFñº)çúæÉcÚU¯Yh6úiªƒÈ{‹:6io,“? ¸“]ÛN4h°ýª“> WØ J(“ÚsHr¤ª e,`P!\z8{¾ S¬ò]8¶i4M>ÐTKht¹ßM^g Ïè@»pü“ïŠ,LÊI$C¿‘ šu„‡&cH (D>L†¹,’§q:ÍŒÔT)qmÿ–’:/hÿðÐ…]‡ñ$.IÛº>7F•Æèæhìè`H>.·IøX,<S뮄Áœ@Ãamk È~ƒ4ö\¾<6ÊÓ„Ü1>,wŒ!öá´ìž˜Ê˜-Úv(Lâªsqñmœ×Ñ=åBÂÂ~Í(å ó­+æ®æQ1jšˆâг¢H3ûb¢e·e8¾ýOªFÏAVö[5>84Ê `=é9©Ö…}2qx>å]4†ËŒòiÒh!%½ð;=ÛÇå0ŒÏ§åF?êã#ˆý2ããþ0'|²‰êžæu¾¯Œº7šƒÓïߺ_ö _½Ñ«{õº+{z§àr‰£%Ø^IßÁäºørZ"h¥š©j }ö§ÐÔ Å( -«Š0šñ]퇃½4ßɶäº(¢¸¹ñ˜)þའ¯ô÷r }(u¦)ýcP{°-f@)*°ßÅò?ËA[ypIHB'£¡}c[ï’éü…Ó›òã’»éùoÞOñ°“Ǩ †U©?»Ùö „*äîqÝ%ÐÄäýp7x½äÓ/-´ho…>ÚõÅëI¹Uï†e s†º>IÞx9RšÀ8ÀÁü¢ˆ§;/Ñ’á¦Îaˆ™î³@\O¹ÄÅïvƒ®O’<‚Ï(ß>âÈ8ÉHÀh+†ïÀI.?¾yûîó²Ü@nZ®òhÙŒ¸/îa¼„{Ù®ªË8[Ùo´_.¬ûfžõ{;˳'©Á«\¸‘ÃÛU¼{Põl)çÛ‹ˆZZBÏÙu^ÜYšÙj9!X¯’2êà•2Ü/gõ ¹S0qce-Ìè@j4¦8uàqÊ=L¹ÚExVÃ/¥@¢â0vQ½|n¨û ¼ÍãÍVƒ¾ÚU›¼8v+ó˜¿Ò`Êq+÷–OÃþí#yÿîJòkn³8ú7$/ÒzãçtÓîЕ}I{ß‚|XümÇ“¾ endstream endobj 1982 0 obj [ 1981 0 R 1983 0 R 1984 0 R 1985 0 R 1986 0 R 1987 0 R ] endobj 1979 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1982 0 R /Contents 1988 0 R >> endobj 1989 0 obj 1950 endobj 1991 0 obj << /Type /Annot /Subtype /Link /Rect [ 215.07 459.357 402.55 468.357 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1273 0 R /H /I >> endobj 1993 0 obj << /Length 1994 0 R /Filter /FlateDecode >> stream xœÍÙnÛ8ðÝ_ÁÇhh‰º‹4èi÷@ÛÝ6.¶@,h‰Ž´ÑUŠŽë¿ß¡HI”,{û˜f†œ“3œa¾/ldÁï¥ü„®Ã0Bq±ø®é6 r|Mò,ìϲD\L =,Þ®Ë÷²-´Ú!v|F~EÑ;$’?­ tw±ªª¼AÛŠ#ζŒ³2f/îÑê›DØ %· ú¬ ;-TV‚5¨ %}`+…â·Å̱,>·}™)¶¦©.v (J¢\2E•–Ey ¾'M¶Ž,¶Lƒ³ðÙw:ý¶EAÁG)D,r.cž{ÇÉB¤]­P‹‘k÷d˜„–eÙ£(´yhç•ïŸh¡ËMo&rn(ëÏò=É*&(ÔdóOR5dWf?Ф\mÛÁD–«ï»Ç¼kB‚)9Ç€¾°íÍ[$àšx…âª|b\ m–3ygTÀÝÁ«Ýüy {ÐW0¨óÇ˹˜xöìèrEj¼=”UÝd—h&.!t ‹cäÍÅE±Ï„ÔvÈ1/º»LÑ=ꘀeÊ幨3-ÏŽÙe@ìÓÃs¼èîŒÖH^¸ÀÌ-µ’“Z 9Ç‹1¾NÊ5Î l¦­õÙ Ê ÷ kbžÕ"«ÊÿK_Û±áJUv(f•Q/`êÌAYc Ô€·œ1s zÍ€Õt“›úv’IµªO(Ƞ͈Á\ß³­½—Ð0B4”´B¡OÀ®’EQªíÓÒ€‡ ˆmâóß§YœhV ÆilŠßgÂØ@³¼Nóf½¶ÎP.Òé,£D“(ô6B.ÊÀg ëUJî¡'Ê3&=Þ†DqžéÚRø|Œó]¢RÑÚîFgu´KñúÅ ºìA‘vA">6¢ ö`8î1H¼†MÍš G4½ÓkÆå<ЖžKpÔ)î°¸* ån™6«Ñ5àñ¥®hÝ ¾4h:Ñ{‰Ž^OÐ÷›ÂFyœŽw€¯pB)”š&öÍ [; ±¦—Ñ+!Y…ÔdT2¨Á3ÜdzµLG=Y¬ÎPñº )(eyÍxîD–gâÐ㺹(DrsbÚÙ®Gäl×!rÆëÚá¯G×%ÛçY9p¾ÖÖ|½.ÛìÔ–T=øÕôJÉœ ‹3½‚u¯Q+ÿì(C|8 fM×ÕÓ&Œ4o*sŒ™ë$ô±ãÃ&òlsŒgï.—õE^Åð«ú ]=9 ú–Bà9îÍÈD}y÷þ÷oË&¥œ-¡3,Û ¸¼‚Ój l¯5®´.³2a?p*Šü\›s¬ð¼é{¶9k³ãâH¾Zˆ?' ]M²#zð<ÞŸ Q¿Z*GpSíxÌàä.™Xžpl˜&xV¸ð: ‚hFöõÏæ>9äcë‡Î/;‘vãÂéiÖçŠï‚JxÆ™±ÜÃM±ç™¬D›ú(»iƒ~«X™Å]©ßì s4S¿¯gnzÎXÕ*U£2Äד»=¾¯¡'Øž[;ËzÂæ0À7ô)KôÛÐ꾊p•È oJEÇ`òõ°¨GL…è+_‹e›Œ*aðù—Åb ¬/6»™jw ·ŒÝ.èm‚À%2¶¨áM_óí >/þÐʽZ endstream endobj 1992 0 obj [ 1991 0 R ] endobj 1990 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1992 0 R /Contents 1993 0 R >> endobj 1994 0 obj 1516 endobj 1996 0 obj << /Type /Annot /Subtype /Link /Rect [ 460.88 759.389 489.77 768.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 39 0 R /H /I >> endobj 1998 0 obj << /Type /Annot /Subtype /Link /Rect [ 499.374 759.389 523.274 768.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 39 0 R /H /I >> endobj 1999 0 obj << /Type /Annot /Subtype /Link /Rect [ 138.0 747.389 199.66 756.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 39 0 R /H /I >> endobj 2000 0 obj << /Type /Annot /Subtype /Link /Rect [ 407.11 747.389 470.71 756.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 210 0 R /H /I >> endobj 2001 0 obj << /URI (http://www.jclark.com) /S /URI >> endobj 2002 0 obj << /Type /Annot /Subtype /Link /Rect [ 236.668 641.519 334.887 650.519 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2001 0 R /H /I >> endobj 2003 0 obj << /Type /Annot /Subtype /Link /Rect [ 341.501 641.519 432.051 650.519 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2001 0 R /H /I >> endobj 2004 0 obj << /URI (http://www.sourceforge.net/projects/openjade/) /S /URI >> endobj 2005 0 obj << /Type /Annot /Subtype /Link /Rect [ 411.101 605.519 493.839 614.519 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2004 0 R /H /I >> endobj 2006 0 obj << /Type /Annot /Subtype /Link /Rect [ 499.377 605.519 523.277 614.519 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2004 0 R /H /I >> endobj 2007 0 obj << /Type /Annot /Subtype /Link /Rect [ 138.0 593.519 300.18 602.519 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2004 0 R /H /I >> endobj 2008 0 obj << /URI (http://xml.apache.org) /S /URI >> endobj 2009 0 obj << /Type /Annot /Subtype /Link /Rect [ 466.431 451.109 490.311 460.109 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2008 0 R /H /I >> endobj 2010 0 obj << /Type /Annot /Subtype /Link /Rect [ 499.374 451.109 523.274 460.109 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2008 0 R /H /I >> endobj 2011 0 obj << /Type /Annot /Subtype /Link /Rect [ 138.0 439.109 199.65 448.109 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2008 0 R /H /I >> endobj 2012 0 obj << /URI (http://saxon.sourceforge.net) /S /URI >> endobj 2013 0 obj << /Type /Annot /Subtype /Link /Rect [ 209.099 439.109 234.099 448.109 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2012 0 R /H /I >> endobj 2014 0 obj << /Type /Annot /Subtype /Link /Rect [ 241.048 439.109 352.698 448.109 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2012 0 R /H /I >> endobj 2015 0 obj << /URI (http://xmlsoft.org/XSLT) /S /URI >> endobj 2016 0 obj << /Type /Annot /Subtype /Link /Rect [ 380.206 439.109 412.426 448.109 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2015 0 R /H /I >> endobj 2017 0 obj << /Type /Annot /Subtype /Link /Rect [ 419.375 439.109 517.445 448.109 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2015 0 R /H /I >> endobj 2018 0 obj << /URI (http://java.sun.com) /S /URI >> endobj 2019 0 obj << /Type /Annot /Subtype /Link /Rect [ 352.17 415.109 437.718 424.109 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2018 0 R /H /I >> endobj 2020 0 obj << /Type /Annot /Subtype /Link /Rect [ 443.277 415.109 519.947 424.109 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2018 0 R /H /I >> endobj 2021 0 obj << /URI (http://xml.apache.org/fop/index.html) /S /URI >> endobj 2022 0 obj << /Type /Annot /Subtype /Link /Rect [ 474.707 403.109 493.047 412.109 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2021 0 R /H /I >> endobj 2023 0 obj << /Type /Annot /Subtype /Link /Rect [ 499.374 403.109 523.274 412.109 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2021 0 R /H /I >> endobj 2024 0 obj << /Type /Annot /Subtype /Link /Rect [ 138.0 391.109 261.6 400.109 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2021 0 R /H /I >> endobj 2025 0 obj << /URI (http://sourceforge.net/projects/docbook) /S /URI >> endobj 2026 0 obj << /Type /Annot /Subtype /Link /Rect [ 378.243 333.239 429.235 342.239 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2025 0 R /H /I >> endobj 2027 0 obj << /Type /Annot /Subtype /Link /Rect [ 434.677 333.239 523.277 342.239 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2025 0 R /H /I >> endobj 2028 0 obj << /Type /Annot /Subtype /Link /Rect [ 138.0 321.239 206.88 330.239 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2025 0 R /H /I >> endobj 2029 0 obj << /URI (http://www.tei-c.org/Stylesheets/) /S /URI >> endobj 2030 0 obj << /Type /Annot /Subtype /Link /Rect [ 236.882 321.239 304.658 330.239 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2029 0 R /H /I >> endobj 2031 0 obj << /Type /Annot /Subtype /Link /Rect [ 314.104 321.239 446.324 330.239 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2029 0 R /H /I >> endobj 2032 0 obj << /URI (http://www.tug.org) /S /URI >> endobj 2033 0 obj << /Type /Annot /Subtype /Link /Rect [ 505.505 263.369 523.275 272.369 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2032 0 R /H /I >> endobj 2034 0 obj << /Type /Annot /Subtype /Link /Rect [ 138.0 251.369 165.78 260.369 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2032 0 R /H /I >> endobj 2035 0 obj << /Type /Annot /Subtype /Link /Rect [ 171.842 251.369 248.512 260.369 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2032 0 R /H /I >> endobj 2036 0 obj << /Type /Action /S /GoTo /D [1990 0 R /XYZ 72.0 769.889 null] >> endobj 2037 0 obj << /Type /Annot /Subtype /Link /Rect [ 177.79 145.499 240.56 154.499 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2036 0 R /H /I >> endobj 2038 0 obj << /Type /Annot /Subtype /Link /Rect [ 343.104 109.499 358.664 118.499 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 156 0 R /H /I >> endobj 2039 0 obj << /Type /Annot /Subtype /Link /Rect [ 364.816 109.499 444.266 118.499 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 156 0 R /H /I >> endobj 2040 0 obj << /URI (http://www.gnu.org/software/emacs/emacs.html) /S /URI >> endobj 2041 0 obj << /Type /Annot /Subtype /Link /Rect [ 470.747 97.499 523.274 106.499 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2040 0 R /H /I >> endobj 2042 0 obj << /Type /Annot /Subtype /Link /Rect [ 141.33 85.499 333.81 94.499 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2040 0 R /H /I >> endobj 2043 0 obj << /URI (ftp://ftp.gnu.org/gnu/windows/emacs/latest) /S /URI >> endobj 2044 0 obj << /Type /Annot /Subtype /Link /Rect [ 409.383 85.499 523.274 94.499 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2043 0 R /H /I >> endobj 2045 0 obj << /Type /Annot /Subtype /Link /Rect [ 141.33 73.499 313.55 82.499 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2043 0 R /H /I >> endobj 2046 0 obj << /Length 2047 0 R /Filter /FlateDecode >> stream xœÍ[Y“ܶ~ß_Á·ÈUZ,ï#o¶e9vÖ–”ÝÄJY®g3C‹CŽyìá_ŸºqÄlâ7K%mM4ŽÐ€ýí* Bø{-~”iÄʲ ¶§«ßˆE$9±²¥q†I¥,΂S°deA+d,"VüX”| ~ºê®ÂàÛ«Ÿ2» ¹Ç«ðB岪»«VߨЦþ…Ááê«û«›·Y…ÁýÞ¨8IX”Dü)‚’%± ª8¸??¿º{'~ þÛÜ üÄ»iüâ—àþû«oîcN•¶!Xt–LQ,t—’¬&Ap°FñiÑb+ Ž^ìr¸êqhwx½Šþ4»¼€ (Á*ª >±r±‚¢è¥ó§Ýz­Ä¢_—ç«ÍòÝ>ø"¸N`‘¥Á«ç~¶Ðyà{>XŒ®Ÿ,4õæÎBµ øÓć®n-Ö݇[ íê©ÞÔ#·X#øðÚâl}¿(2m„óeÌCY‚ý Ã0-˵}øpÛLÜ‘H£‚yU•U­$¬†~våâ‚%EE¡°+wœ¦ó_on˜…8tJ>>>²ñ·úÅúáàDÐFžÃhŸè/né$dU¥³´Z—„¦wAÓѤhåóîÐt<¨Ç€?ÛhQ*jv”›d, AUY’­h›ÍP ƒ‘o§¦ï\éªdHWQêLPoúÎP&d¹”–¾KP9‹Cñ§ÈQèûzÇoÞy'1WQ^±X,Ã…îÞß¼»{ã7ì©ïÛÑŸ^‘ã° íûÁBoúíW}ÿÙ®ûÛn-¸i6mÓ†ú|E¼¶¾4§s?L£ß» ª ²Ô jЪ÷YÎܧ/HSÁa±¾òœIç˜W™Q‘h–Ä«fTT­ˆýÀyû¬ÙuÓÖ›VK"ùÈÛöú<À$uŠõæîîîVZFªô±Ù×íê9 ×Ñ–äÝ{Eë¬Sðþèî\nQ^n^°RT±ý\,ƶï&Xá£áÔ†ÜóGNý`ÉÙË9rõ¼6˜³³¾-án<œZ«É‡ºm`qeQ/ºÝa!ÛõÃi=ö*tÆ.ŠAÕ¿“Ò`)d`Ÿù~·1pùhÖ–D›~:„Vi°äC½¬GKî»7V•ýþB)éSx·µÛ׫a=Xå·`w6¡Å¦[ë# cG!»~;Ë(Í83 rd’ên„Ý~2,µ·y*›Ç¦;¨·Âqznùxä|™Å¥ù4œÆªQY Ïè øXŽ{•!+¤Ë†½ Ê-æin§¶Ñdñà žaš7Bã±_ÔÁ@-Ì»ÅRV‘^r„a&¥ª˜÷‹6¤!¿{ïvì4kOÃîO•þ^0daG‘vfž‚{-„*<-}_Ÿ¸U÷×m=|¶ð±?ñ3ôÄ©4Îcˆ@  HÒÈS©‘wŠüBF`üÃÒ#H!…ˆ~ÝŠ®°mïZ…$Y˜MK߀܀!É–”Qá°OÓÌôõýÀ7sÓN†³i:töF÷ƒÇ@G‰k¡c9Y#¨Õ H&±+ÑÔ¦¶wGÐL†]Ü÷³õ ÒÚßH©þÉ*Õ¶âd•« Ùͧ üuë3ÃËÛ£›ÌµàÇš-E,Œ®VAR Áý<À0‹³ã¼íÏbw[Üͳj»Â¦ÛqˆvËò‡¡ŸÏƱAÈéÄÚÌȆÍ<Ú}ëø#<Î] ±þ(,ÈÆRS Ç5xËÉë"£6UÔ'Ã?4ÄÖâ ÚªË^vÄ™4‰ëéUÌ[AÌ “¨ô À >Qü‚UH㈕I YFìÓƒ÷gE¥‘Oîbž®»‰F?[«óÀYǧ˜Î_!VozƯB›®MŠaûJ™—ž:]ƒ'æ§J³ÈSœ¢û›·ò¨ÄÎOË4€¢¬€Ø¸Êâ‹ÿØ«d͓тDǬH)ßqgãZøË@ï( ô’¨Þ=Ô ¸U¢ÛÁ eUÊÉaÁÙçy8CŽJ[B²0»FMÑVc 36d‘C.[؈HÕÂî†HRGàÎ ¹?!ekD2È ò™!2[¯íÏš†`nwzM’V (ÓôWL¶"% óíïÞ¶vÓF1Ì4w†¹Á@1‘­vãT·-‹‰$Ò*•`¬O:ÕÛ#å,Èxl¦#9 d@¾°o›-EpÈ»·+šÃ<Øml‡æ<Ù•¶­A-åˆöÞYÍ QN`ã„qBÃEeBþ›.t† T(Ò?P/Ì£)„úAZ,¹H~ô–Úñ}=ËX±Š{é<¡\Âë: .n[ÏЋÐ:is;Sj~Ç@2höì*ØLÚ¬¿|rW1ËÕÉ…¬÷ãÝí} ôö]@‘s?Œu V¶Ê¿EÁûo¾ >BF #èK9x¦Nch â„¶Õ_p¹ ~ì‡Ï~Çzôs‹àY´›H´FWŽ­ Ñvz«a!Äö®¡>ÜY}°Òš×k¿“D¹3v1^Ü T ƒܪ•QÖ“ ‚} ~¢YS)2iKÏÌb¾ïÏ3DÌg{ìÊD‰C¹'¡ÕÑUÊÒD8¶Â7Äu»2[iT²$‚h>ÍSˆÕÖ‹‹kÉ‹.?_½,útjY ùÒñâÙbF5ʬ÷pQDYá+ŽG]Q$’Ø•dÁB|ĦöHÞÕO«£Bè¼ bµå*O®…i j2$)omºÑË@fš‹—¡¯¦UèS¦,™(ƒÐæeý¨ÓI¯¶’°dq˜Aú˜ûš}ÛI,|W*•טøý!…%©Xm/è ÑØï'±‚n„ÑtWkš1øYkâ›*WMi ¾­Hax•§4ó¬jÙ²:9HS0CØ2©˜M2T„%,ýíg:ÐEŽŽâ°pgiQñ³ϸvb¨©D¤<=Á-:‹nÔãņ{UíŸìž»ÇÇBW™ëåŒ{Fa—˜â²‡Zl"KŠ#ªO½4¯ôÒ6çÑ@Ž.ϸcçŒÛðvCCY4â=ä£V}d€©:s¡/ÎÜãå™ûkÃûèo=ái;µz–ÈÐËtpoµ;‡ŒKäô™:·#VB޶¨–?Ö)‘…,:äx’ºW=f%)ŽҗÒU!-Í’ÊÄ#ðnJuv)«Ìx÷½†e¥š·1­"žœÅ]GQZxúþ#&-(úSÝŽGW>+Xœ¤¸¿ÖòZvå ÈÌ…7ˆ*Ÿœ #3ºÓÜÕÇj ÷ ¬ U@œš7 kéuä a$LOyŠËL"À–èË-DžË޲ŒÃ0)|­Þqˆ¦†p` ÿ¨Óï«#>ÐZ&ìÂ7tKzu¿™¦ÐÊ7ë~câÍõVÚdËò¹šOŠ”%1T—EÉÿ¡EñŠ#ÏÀmD…§4³ú­³ Ÿfô‚7ž“ü4sM¶9”‚m#ÚF|œÖì d¦ž×äåÊÚÀn{ÜlÙ—ŸD@p•dè—0:桳Чå{Á@C"¨ÛÚ[z bâJÔÀ! :‰[‚u5v"°Ad1Œ?IF}YñÚt‰á€ã\ ç¶daº”xÓwµ<ª{õ÷nžŽÜC@;k4=Ÿaª' ­$‹f‰P£‹Ú×’!­!~jO½\!ˆºgEª#U¦ÿ–'ª’¤àEáêl|fh'Vã„\/Ä,ʘªÈ2Zˆ8 §d•@áI ¦`-‚þÅwQU¬LÁ„Äe®åì<|G eâí¸]˯ _!š‹ðFà¥nêƒ. -sÃQ‹àr½3óá»ÉÐÍhhp9Vý>ð®áÝôrûž¹tw9‚®Ùòkq , ÙL´ä’[GlšÅÉãË6!ËÄGŒ¬e;ÿìš§k锃‰?Mß5âõ‰J‚¹ ÔMÆÅÝ>sQõý‘òíDÞã/@×OGõ°9t¿ráÙÂõ†ŽÞU]{ Ðe¡™nék„û¶~P×3Èéíš„2ìovÁÛ¦›Ÿþj÷©{^áXÛ½l¹zd¼Ð8§…žÔeJ"d„þ S2¨ízfÀßúG®^G"u„ô¢‰cýÀ­&zC“îü Oÿ8¾¾P‹uí“`Bhèú‘ŽL© R ¢(Σ•2_je˜»ë~ áäõI$vÇ,Ž\¹â¶ PwÑ“UBãÜèt™Xê (±µBHå<̓jiѯ#þ?{!zàÑJU.µ‚³U&â©Óö>v1!°öµæµt¡…ü6¬ÞÑ0>½º}kˆRx½3 Ü)Hý›Û·Ÿ¾0 kÏ|hñhY÷vw âévõ`UG³¸s9&ÊLg&%ÅÝï¹–g$Èø©vïmFHÿp·(§í%ê*9w¯’c°—eRŸÍâuÏ` /^BÇyÂò¨¬ šO×’¦xª‚`îZ|¥…÷}’‹†§©7ïÌèäÒÈôäk ½’|JáÑuìØlH0Õ‘iKæ37ÈuÂaÆ ñ¨8¬âuUrgüg×ñ ÝYe%_'<ž§Ì4ižöFd-ad¨&>«¥k/buVY›iܰ­GõF[‰lEž ïñÈ}*Mó^ïvè%âÝÆNÓbeÛßÌ;H¦ywèÁˆ'¹d[‘! ’ã>,> ³xmvUa‰XOv4¼ƒê¬g€©c©û³zò—Y/È„ ¢$Áã@O¨. òÔl#¢Ùf†ó¥!énF¯'ô¥ž©Üê ¹ ªÖx êå`5ªƒ{"2Ç8×ti(b=ËI!C¬Ezì)ñ—t|NPݸ"Ò7Ž<4†Þ¶}Ç­ZÕþDäfÕEd²êUo7ôÁç9”¯ðWåM3«ì2³2ÊÁ #éÊY¡?4é ý“jÍÁD±§›ëd=cY•ÉK}Ôχ6–Î^šÒ"ôMiT`ÄgÑ]MÇZŠaG%Tü|n›­yK\º"t©þ¯Ÿ-G6üõ%añÿÒ·oNõ–^ !Ã÷ëi!ìx¹ÖÁ·?þÓ­Ë£¹Ò±áî"É+–$âJYÌ›[ØZ#‡n–Ç;âbQX³.Äÿ}§ïq±2TžÄ­xu›g,ž­KËèD?.ÝGÃ¥z÷‚”"V¯ –ˆ_Ë _5aÖµ¬Ò¬†«ôhØ-¼— †ÿµ‚áçÍ#¶O:n!7WwÝižZüžQ˜­«]é7µÎ/W¥aœP›vDcM`4¤¦ô^@h^y#þôŠã/ž D‡4=+²j±~‡ïÃÕË  endstream endobj 1997 0 obj [ 1996 0 R 1998 0 R 1999 0 R 2000 0 R 2002 0 R 2003 0 R 2005 0 R 2006 0 R 2007 0 R 2009 0 R 2010 0 R 2011 0 R 2013 0 R 2014 0 R 2016 0 R 2017 0 R 2019 0 R 2020 0 R 2022 0 R 2023 0 R 2024 0 R 2026 0 R 2027 0 R 2028 0 R 2030 0 R 2031 0 R 2033 0 R 2034 0 R 2035 0 R 2037 0 R 2038 0 R 2039 0 R 2041 0 R 2042 0 R 2044 0 R 2045 0 R ] endobj 1995 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 1997 0 R /Contents 2046 0 R >> endobj 2047 0 obj 4299 endobj 913 0 obj << /Type /Action /S /GoTo /D [2048 0 R /XYZ 72.0 269.87 null] >> endobj 2049 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 120.523 182.77 129.523 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2036 0 R /H /I >> endobj 2051 0 obj << /Length 2052 0 R /Filter /FlateDecode >> stream xœÍkܶñûý !_zFï½ù–4Nëiç‚4È…vÅݬגööößwÈ>$QkèÛ0v†â ‡äp^¤?Þ…^ÅO‘„~Q”Þöx÷‘ÚC/¼8£¦4ð“( ‚Ø ?J½£7mJ½VÐX@¤ ø™ôüàýv×ÝÞßïþøúÔ^t—»`…¹dõËÝÏ–lÔà/I¾ÀÛß}÷t÷õ©ÞÓÎ,q ½’(‚´ð ?ŽJñ'òžŽÞ÷ßWcå5Ýé<¾ùÓ{úçÝÛ§ÉTã ð‹/m¦?ODMÉóÜæ$ÙÄØ-ÈQ|š2Gq”I ÎWE¶ÀKåùb„[×›z…aYæe Ÿüb¢8ytKa¾˜Ù-u%rÝ8,Ë32œØ¶©Zï—eÞýx=1ŸïŸ~'ðQ5½! êj‚˜†žïß¾_ë?VûÀ¦# gµOà“ù|iZ%ËFIR7é­®¬ž³º ÛUçv$lÇ{¶ïùY˶å-ïqKíµˆ‚Ùb4; xŒRX|˜ãu<4ÝÞ´4ƒ/=·?]šñ`0ëø`жùÀ,.ÝKÕ6µi;°kX?Ø4üÂúm5°Oô;6Ã0’÷ÖêºÞUírîqäÇ ÏAXÄJª-üYϤ¶ˆX¤0ÅžÏQ”..ºõÍðx䵘A’ø° §ž¿45tÃxè™ù¼åÇ#(–õ™k°éÖ­Á°l4]Ÿï¿êÙŽõ¬ƒ9|%õ? ¦*&uœ¥¶Ó¨yÔ×€ å¶o6¬^Î3Ëfó¼Û«PæÇÒ/¼ûo¥ #Ìw­À픘5[l8T/æ«TqÓ‘w—j´Y^5Rµ—êjø cÕ›ž•†:vÑpÛtfÌj7²ÞfmD8÷°²ãr-òb¶ŠaÊYì Lü†**u ÜñÑ Õ¸ÂAÏQnTPˆãôép¶ºò³%QÕ¤?w“a[tkß°e×ó£5zw5ȉò.W® f+3¤¥öäB åFa÷lô~dh‘¤«p”'ÃÍ­¼÷ï~ñè`8NqÆ~,^–d·Žñ²ß{\0KõH˜VBãÈëëò¹× ãÂÏ‹P„h™ƒ?žíG[qXø­- a¹Š4qpÐ"<ߢHý¬Iäâoëc—‘_бSç*þu}IJðÓTŒXäÂíêˆQ# Qó8¼5ÛÕ‘£ ÷ÃbûE¹*ª´ä¤z\ƒÚ Ziˆl›„‡¬e#7ºKgÃRCh¼8_7?˜ã„€sJ¹;w[qÌ%]›§ã…‚ë;žF«Œa47Dàø£Vȩ́ó¦m¶Õl8·ùþû„=7Â΃ÍAärc¸ê<òG8é'XK§! ã|¾¬Ͻd’ˆH™Œ3ÂÄ‘cÓ5›ón‡ãSn`½ˆVÔ!aتÆëWÆ;4ÃÈû«iXˆj>€þlGçð§ž½4ü<´×™°®€!LÊÙ ánryZs¤¾l{¬¹z,À€rj¦x2ÄÓ‘-BP@V?HG{,‚qèê²þ9ø£bÝ8ÏoZÿE?Ô$8˜¡Ò#„õD´ÒžA„…ܺ‡éŒ›‚ð†í›®Ã[¤ºÌ¹R`EÛKfÆ%!¾j¯â¢¸0*‹"rMš\ˆ¿j¸ /¸ Jb#ë¡Ùae C§ü„fÁWeÛRÄ3þë6­ ‘K ÆŒ×bßX©åŽÎ>ÛFPõØYˆÊþƒóëªÏ3ŽçvlàÜ{ÚX‰³/m˜;V½‚h —ôu°g{î‘Ø©êEf!Ž‚ÐiW™7N?Ͳ‚À⦅Xô# ‘¢@È‘cM± /ŒYŸEÅJ#VM—ZÔqKm§D£XU8lY×2‚€B•°LÂoªí‡KÕ×7ëO1¤p ' -Iîàa¤¸Q€ŠÓÌ#ÚÐ%õH7Îb?M€°,KáúÙˆÁ‡†"¦O2×Ì_ÿ¸™Ü¤a k….ÅxcfLçà›€aƒ7-®ÉƒûäÕË¢¹$ëCf¡¹àXÞÈŸdÕó™%Ýü)ñÃè¢$qнþ¹žÉ@_°Be–¹±I]®ª:ã9C¸« 6ºh”®Å$¬“úĽŒçC&ÂX2C˜N¤ƒ¶ˆˆß8‰Ÿ¥ŸAæ˜-Îär£[ªˆÚTLÒ,r0ÑRÜÐŽ$,ü1(Åiü õHDõDT„?K?yÁ1‚§ ]B¿vëEÒRøyì"q˜iÐÇi·'î] !é„_eí©m=QB:Ññ­öDÖ2­Y5¨I$*é¤é‹anT—… ÅÑÊ2á-'ŸZgrAøÚ]n8ùXÞñYš;H+[Ÿ«v='Q“ ðó AŸÎIE”øq" v-.C¥Ó¯9f_‰uç…ÑÀ82ª[‘×$îÊ–—1Xzq”»—yuCä(åû ,ôF–ƒ™€U¸¥ Gj¯[(,H¬´a¬r*ÔºO(\ÇìMb-ƒHf¦Ýbãl&#?Ë%‹2KNDØ0€`øÆA}§z1bteŽÑQ7% ¢à¥öÌ¥Ú¬J\ÓpêÙ–±ZÝÕã`昈Y÷Äß–E(c nž®ƒR2H¬kÄHÍ‘I$vß4ýƒ_Ø ëL ªDA¡D†“ÍìÈ 3©:â˜#Ürþ*‹PÅxÙñn"n <¿q,AÌ–à µ3«ÖBÈ®éQÌŒª>õJǶ²û©DŒ[Ü+Z»Gßz‹ˆVžºZïY¨ «Õ„êƒÑdv k9ú©ç›–Mó t,VÍõ¥Ùde>/Fä›Ïô®±JCGÞñí¡çGÓ•&d¸œ GqWý—A£¸_ð)"ï̬ê0ê¡/;#Eg¡» ?ß³×-;nòé’¢™gWbй{ûž¢ÚÈ<õAx²]ô¹3°ÒYì«ß!QÃä)µIU6èó½tAx—„M›²ƒrk¸ÿ,žß<˜Fub%¢ô±Ê±åÜŽ*MÏxa­rŒâ!ZTý^úÈbœM\Hॱ‚‹¢â|FçǾ÷N¼¿ôvM;²~PÜöÎ0§ðRñœ3Œ!×Qåß÷l÷ýw0‡¸j½Ç‘JÚ6„u}M·ˆ©*‡"2²×Ñ|iZfX>S%|IÄ>žpT%;FEA7å0‚ÕG…Ɔ'zQ²&ã V–Í–E½W‰õ©%X~%öRõ¢o~î·løÆ´¨g0™°5%æX½j3„ûRiV8ÕüÒµ¼ª-Éh¥‚¬êѪ±÷¢NáX ùÄ^ y!#Ð.á Û¡íD„½žx7Ø@â"búÕÍN*Þ8a³Á‡{ÔùtR7ö¾n|g„®Zòž„¢‹0l˜™„xäX2˜-ø×Z”‚ðÌ +~€Ó q$è‰FÜÈ€ƒ”¸+°†¼¯a·±Fd ž\X;y5£ ËH†ò Ô…k±‰âÑL"ìä #$ÂÉ X-”y¢ñ£¶áМNhn©E^U6Aáäj k›aœPËZ³o5ü¢ÊÁ&ÙñV•£±a> endobj 2052 0 obj 3689 endobj 2054 0 obj << /Type /Annot /Subtype /Link /Rect [ 193.61 517.437 221.39 526.437 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1935 0 R /H /I >> endobj 2056 0 obj << /Type /Annot /Subtype /Link /Rect [ 165.82 414.197 194.16 423.077 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1935 0 R /H /I >> endobj 2057 0 obj << /Type /Annot /Subtype /Link /Rect [ 215.07 371.037 402.55 380.037 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1273 0 R /H /I >> endobj 2058 0 obj << /Type /Annot /Subtype /Link /Rect [ 203.13 349.517 315.33 358.517 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1275 0 R /H /I >> endobj 2059 0 obj << /Type /Annot /Subtype /Link /Rect [ 145.324 221.394 170.304 230.274 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1713 0 R /H /I >> endobj 2060 0 obj << /Length 2061 0 R /Filter /FlateDecode >> stream xœÍYmsÛ6þî_ÎŒE“_o2™Úusç›ÄçØÎ4™ºs‘… E²$Gýõ·x!@Q ìi§Õ.ˆ],ìà¿Näÿ ñ“†—¦Ê7'éñ%‘XE¾âÈ÷ ¡‡#´AûC*AfLà‚Ÿ½¹À¯Ñï'Õ‰þyòÇŸ0§@>È=Ÿø3Ê¥ªû“O#Ûô &û|ôtrùprþ>BVb{igYˆ¦Á™ø£‡ úãô¡®Ë­êµlÅZVåìÍŸèáßVgI…tëùqZ¨ª{Ö¡ ­èÛ°ªWò¿=ìaF|ßK6È>í™.—$‰çO]þ =¢Æ`DiŸö ™²j•½µõ;k²`±?6øÐ ãæ0N¼$²,É2øä¥{.„}rÌc~ší: vI¥>†ÁVoŸ  ñpêû~°‡‚ô£Do^íý†nt¸ ðÈ…©ˆ??Ž„Lª„ P‹åKÚ³xÛ¯ÒþG&1`@Ü2¾CÁ#ÆÉT€ˆ#“ã$8@y]}gmß¡%_²â§äõSK›5ÏQA{Šú}~x¿HQSR^!˜Õ;t (ñ¢ ƒqñE,{¿«ê¦ãÝ¡ÌP@V÷JãY€¬)áÈ¸É ù+ `½÷+Öå-oz^W/TÀÅ¡0gGŽJà¢SÞ’jÍʆµ†í!;æ°^»Ä·+ ³ÜY’/qË»…Xy¤ÒyÉheµ4vΚºÞöÍÖZ]¯¦ê=3p=ÞÜÄÁ—f^cßâ¡¢Ãá±¼‡ -ç%Uœ¿O¦âAyI ëâ t(š #‡%A–zû!Nªx+-Ÿé®ƒé§³¶~|ój€0ØŠtFüP$2Îm[ç¬ëxõôb %)¤Q€b›£‰‡F®y2€“8l‘;8[3Ô¯i?bdLjFE®b ¤¡ÃÚØ¯ÏÔÒëøS%#`5äŠæ¼ä=ÁhKCüÔ­5@Ʀ"M3g—½$ŽíCÝÛß¾J÷g¨_·õöi}Xf ¢…ãúqà– b*ІRT’9„À=‚Ç7g¢žÜ±ÕÕ¥w˜Hpü+È¢£Çy0ï}Ý2[„jèe&#HºkXÎiiø|M[šCÚéÌÉ;J¸e†¨!Ú¬2j…>ÐöÅjU£sjÑev¤Gå%E®o 'k­cË)™l9¯·_Û†Bùv`IüHO?KŽay8ï¢,Q FµHíPï ‰ u=”ÌöQ¯V¯sB á#"Ìcmû=c6ºzß±#¾ID&•EºÎl¶c‘÷H;dÁáƒøÁŠ`Ž3‡øž×»R%Æ^ptõÀ䯙í&h€”›ÑnÅ l þûxZÖ9üæu³{|ƒæíˆ}Oï":T‰nï~{ý弃(`çEŸËr°x«Sà;Í«EÏyU°޺ߔG Ïb/NÁ;ã4tZþÌ–GM&àû¢ƱKz{jˆç'uB°cþºï›œ«x]½msiú‰yëÏg6f/Õà­Q—$™C÷»c8„ÔÑ,J£1PYDzŽ`ô™@»{¨èx•9u-|ƒéKÀI„ª %Uï^è!èË`i´.¶Ðcµ/•ñ0ޡɔIë¯ɸÈjú½žUv@öÉšþHÛoÛÑäÕ¬âù7jGÞnä”_6kýÉ+Ø»‘2ªZpÍÖ£uFJ:¾á%m“p˜¤“©;#o™è|íøßZp:ʦ±û^Bâé}ʇVþ—‚‹*­pØeU÷²'Ð ¾hPhÿb¿A† U†”=yÿHE÷kzúÎ u ’†¬¬šï¡NÐÖÊ,iþ©¢¨Ä{Ô@ëÆE1ÊXÏð_ë­¡su™ÑK–,ï Qµ1ŒhèÇ_ =ÄÜá3¼0ƒœ±€Å|[brDÐîjt½Ü;Œ'"²ÅkÈ`¹¢g[ü"H‘CÙëáðf‡–n÷Ô%lÖêþÀË —"¥käžáïÀ16Ky‘ö ûgÅв4ôÈ#ÔÀÿ¶Ù±ÑzÂ?ì×v·Ò;HlVú<ÝÅ«g°Â~”N¶¼“ÎÁ%_$—ª7ŒìÒYXRû™ž"OKѼRÁ6xfðëH¹òdE3.{¬ýÎÙ³S©ÅÔ•sdÆì§ÚªmxÃÆ"×Þh%û=T‰?Š6MÉs¹EËÈÛ6’zAEï¾!¸Ô³Q:{Ý8%TgI6Êi‡`o/>ÐÄP;1† KJÆ×;’ÈþG±Ú ß´õw^È'5@GS;žN„bÌë‰bU^S´8I¸»žWÕû7¼¢åÙÈ‘¾é²ÜÙIÃíì@¼¡O¬utý1ä¢= .õ«á±¢ÛR>€¨ó„÷ï•jäúÊ=³Ù. c;F[÷l*€Îý±ç}Éì'•l§©îŰ£(³¢íô¯ Èm{`€w6%ݱBÖSdL…‘/nŠÐë©A”xi’Š~íp¥Å‘kBœÍË©5UÙІÔê—£LwjDïfb/]ª‰NO/.µÎVýÞ`yÚ“QèÑ7â–î²æž©ú½‚Àn„û4-—‰SˆC²ÜãéÝ­ZVì ÃÖZÖuãéWóÓ¥v*wÛËyœ÷»ñÜ_¿ÎϽ¾¿¿9¿¾¿¼ ÜßLø@ªÜÃçóÝ!­PñùN«¼òtEëå% î׎…‚Ѭ!(þs$îSuÞå#çU|$#+ÎÊB>ù*þº²Úµç9Mn:¶-ê…t’“åB.Àò‘ºVIW³7_,ý¨[ÍJ÷T¶ª½_Å|˜,yõM¦Íó*/·…ÊÍzèó݌ګÿ\—TB3KfiñFïYö¡¶´|xZíFª_v`•…¬¤éQ,S è¾w†Íë 20«Ôû¡Óý€¤¨‡Ù€´Õ%oOŠ”¥I‘³yCI‰Rýzs`èBöbáâêöòîv6íá*?KK9Ôx¯°# ¼8Îà*NŽÛñáìÇŠòqx¨ÃØðÌ¥)ƦY ßèýNáâ·,'ÈïqòŸŸNþ-½r endstream endobj 2055 0 obj [ 2054 0 R 2056 0 R 2057 0 R 2058 0 R 2059 0 R ] endobj 2053 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 2055 0 R /Contents 2060 0 R >> endobj 2061 0 obj 2485 endobj 2063 0 obj << /Type /Action /S /GoTo /D [2053 0 R /XYZ 72.0 769.889 null] >> endobj 2064 0 obj << /Type /Annot /Subtype /Link /Rect [ 165.82 404.949 241.93 413.829 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2063 0 R /H /I >> endobj 2066 0 obj << /Type /Annot /Subtype /Link /Rect [ 261.09 404.949 286.65 413.829 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1950 0 R /H /I >> endobj 2067 0 obj << /Type /Annot /Subtype /Link /Rect [ 305.81 404.949 330.81 413.829 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1938 0 R /H /I >> endobj 2068 0 obj << /Type /Annot /Subtype /Link /Rect [ 349.97 404.949 386.08 413.829 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1940 0 R /H /I >> endobj 2069 0 obj << /Type /Annot /Subtype /Link /Rect [ 405.24 404.949 437.46 413.829 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1930 0 R /H /I >> endobj 2070 0 obj << /Type /Annot /Subtype /Link /Rect [ 215.07 360.829 402.55 369.829 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1273 0 R /H /I >> endobj 2071 0 obj << /Type /Annot /Subtype /Link /Rect [ 203.13 338.829 315.33 347.829 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1275 0 R /H /I >> endobj 2072 0 obj << /Length 2073 0 R /Filter /FlateDecode >> stream xœÍYëoÛ8ÿî¿‚öC$´ÞCQ\rÛܦ‹b·­»‡õâ@K´­FUI®ëûëoøHK´›»OmPd†ä<8üqf¨|ž¹ÈŸ;þ+ \œ$)Êv³ÏjÜE±‡üH …¼Ðq|äØ Ñ…¨“ðz ~¬~‹~ŸU3ýsöç_°&GÈfÎåBÕÇÙ{Ã7µèïÉ?mf‹Ùü1D®ƒkb?ÂI¥i M°ï¥üŸ‡;ôçõ‚±²EkÖ †®iC«ŒÞü…oµ´—b?áÒ.ØsFâ¤ÊQÅ:Ú¢©È†îhÕIù7‹“˜ùŽƒ“ï-dïO\ÈÅqŒ1á€}9#R#Ÿ:qdÌJ+'#rò÷Y—‰ÇŽéð…ßsçÅ8vÝ4Ó¦pr!7I.!æ»ÙÞ,÷ëü®ÃdrÛîÑ r#œ¢ë¶¦YAÊÏHK¦h²ÛêáOºné>gwë‚–ù0xõë¿pNŽWxù‘tD«ÝÕ¬é¨^ß1ÃŽi”lš4†_UG7 1U»«àÅ(@4&Ù£&M"¾ÔÝSR ëýª,2Òl˜ÍÁü°Rø)Ȳ¨†aÃUO/¯”4=ÇÓ•"w¬ê¶·=·ÚŽ@:Ó¶ŽÃ A¶è!Í ê¡X-è='ޤîÞ÷°˜vÜÄ×¹óÝE}J½bš±MUü‡ VGMçtMöe·¼Ázì¾,5à †f¥Kš?æâ•a¹nøçæÒn«9P[4¦ŸŸ÷´=Y/1Ú/'ÃçNÓ…%@A0H\ô PL^´YC*Ô[kšTGÍ($#¯@QmŒÅum`¬7Ç kpSsÃúa{☹ҠûÀ©™½4b¨‘àU ‡o‹§1 £QLÞÁ¹uIÅiÂ]ÓÐQLY²ƒ<9ÀK»žÝw[“ EËëûßn5{¿¼1ôT†u4’y¦Çkò¦…ŸW¨•Ðtä+ÍöÀ”ܾ¥'Vdxæ‘%ÓFÉ(P%i»^`’šcä¡( §’ˆeÙ¾­TÄ· òKÇO>g|ž$D¨ÑNˆ!59È A©3²²ô¼pzÞ“e÷«UC¿*çÞ¹<‡¢ëOlßT¤4F*²S˜| Éå´£Ù© V•Gƒ-Ö±6çús\M›‚å-6†ÞàÉŽ¶åC9ubØTì{Ö8øoM釂•&ÿ-ÝaXŒƒê&8‰@oà§Sµ†‚T’]\»ëŒ“óÒB/Gý=W 1è«·¿\¬J7Š£¥h‰‘dfJZcdÜo{1öÞ}D‘Å1/Cš‡Ë`y´,Áò’GA‾ТÔôoˆ–`WÔ`–P¥3 Ϻò¨òœù_Âõxe9wœüuäìrÓ#¡4„+œ@OZ„E†;"ˆú (1¶l<Ìñ m×m‘ƒº¸aš^d±Ô«8°½hÄ3Ĩ Õ0·¯{Š¡§;Æd^ÜÇšdâ6 ެ;QÌ£nŸ%‚Þ¸Tô) 屿ލ›%†LÓ©»½¹~dÀ…B9 h]‹) J!<`Rpç é†8NàþzadQ©åEg¨h¢ÉáÞ NÁåVôY+0ÚsoóÇtòPöB(5S_î>­$¾[EŒÐ²Ý®¯—A_ëÇcð͉זƒöÇë j|F?Q*®Pƪu±Ù7²¥YP›¾¦ «’Z “½¬2M×-¶|ùõ—MÕ䮩ÖX‚÷¤—À?ÖéËëcÏ·=[TuÃ2JsPÝbŒEÆQ×¥§dºª"%^ZÐçZí ao<ÎŽ§…ÓI}.-";pâù¤èlK³g™ÕRyª’ùBʘSC2bXóOkMÃvQ}K‹Ý³!·v½´iLWmmº›Œsà†VT¾ 9ÎùUÌ×»®ØQ¤^+ü€;™£¢‚'É-XôKb±`qºî§ZÏÃñð8xyõ%½.šVÏô=“äh%)Ûd=%¯¯¤ÝÉ\£Õ˧£×Ÿ´#Ûô¡h·Ö‰Lœ¢ ‡68¶´Áž;N«bå5ý9Z4Ð@v‹4‚›¦w‚düx8vEžüEÕIòï'(m6`ÇG"…™–øç8€Ž›rkÔÿ(Q¾Iaz¡`’œ9>¢ªPš&¡Jù_?¼y|úcN»l.žsµÝ&ë}ÚX?HEȋӑ.žÏ6%[A_`I¡¥¿Ø_ßqG6~øé—woæøÅ^ú®oñ®Qó2¿y$¾Ÿâ0…>*uÔG™”ÂÓ¦e¦k“ß\œ¥DʵtýãÃù7W€£È‘míT-¯ãå d¥soÄ}¯-Œ´ºl> endobj 2073 0 obj 2165 endobj 2075 0 obj << /URI (http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd) /S /URI >> endobj 2076 0 obj << /Type /Annot /Subtype /Link /Rect [ 465.211 197.457 523.274 206.457 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2075 0 R /H /I >> endobj 2078 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 185.457 191.38 194.457 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2075 0 R /H /I >> endobj 2079 0 obj << /Type /Annot /Subtype /Link /Rect [ 197.21 185.457 438.06 194.457 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2075 0 R /H /I >> endobj 2080 0 obj << /Type /Annot /Subtype /Link /Rect [ 330.122 85.493 369.022 94.493 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 916 0 R /H /I >> endobj 2081 0 obj << /Length 2082 0 R /Filter /FlateDecode >> stream xœÍÛ²Û¶ñý|“’È[Û\œN2sl+m:® :bM‘ /–O¿¾ ,HB$E7oŽ'öîr±7,vÐa@áÏ£ù'B’¦2ÈÎ8z$,à±# J"&(å‹Á9¸%‰ „5>Àþ¹áüüó¡z ÁOï?OPXw} w„[QïÞx¶9€¿&ûhðüð×ýÃîG„4اó˜¤2–RBDS™4ÿ±`Þ³¯ë² Žu4ú¨]eúÛÁþïÓj& OÍêôÑÙrUåAUwº ΪRÏú¬«×ÿ°¿‰§”¤_[ÈÞܘ)—$ ¡óT„ÿ#‘”h>Ý2GQË =ÀïšLSßàe~5ÆÝOÀ8!IJ™H ŸHz“BŒF[óÕ¸·Lfì²B)bãÜçA˜–RJÛ(ØÜ„Í6,Ã’p‹¤” §s숰’›u¹êÙ̱`[œ/ÖD‹õí¸C`AÔ·ûQÎv˜JÆ 4â+6<ÖÃÂEM`4ÜX8Úv-ºì4Tе)º5;§üåcØø´ž2w&U À±(õ«Ifßân Ú–ÑOÅÌVQaLWÝêf„µ²"bL{!#ú—c§·8G ®D"rRŸ&µÖSG/&ŒÂ.k•(”ÊÎ?DmmÇßÔå¢U£ð DN°ž¹ªª›05yq´s”ÿuì)¯&bá1œ‹ç“‡bEøÒôù0έ:Y­D)™7À¬¾˜ÍÀkW÷n2ÁmFØm4" oZ»ÕH±N9ÆIáVkO0Þ{,âîwø¡.ËúŠY‰]ÚÇ–Iu©ÚVO*°§"|ÐK óµÙ@Ϋÿϙٯìavƒ”*u󇡛áøl48¸EÁ®€Z¼ýÁ0ðÝR á`óHÊD8mÿfLÌøÄßëœÂ<$B$Šá¶ÀßkFŠ|E ™R 7¥d[à‚ï‰tEW®Œ,a$¥P¯¿àóœí‰¨¾;ÕÍÊM˜IN" <”bSæ‚„Ú®QY·”ÊÈPzš$rKê’Á‰<"qãFnÚ¹ä;ófÝç¹€þ'…LÇ7•;B|O$+º—‰P9$œóm3|OäÒÊ¢=­Íñ\ÆDDp¶X¸mè‚ÃWüÍìß|å-$„km,L‹¶d/ùžHoe÷VvÏíß‘ý{¾Þèá IÒoœ[z| ohÒ7aԉ†4Ù6|Á÷ïäwÐ:/ Ã­N$¡œC%Û–.ø@ð§ºìÏ+ YNb‘ÐÉmk| ´€9eE¦`Ô¾Âáܹ`3þ«g=ôrï rëRD á"¦P¬ï’“àóÿó >3Êø`Æðd~$Þ‚Vh‡tìØHp·G‰MVOˆ{ÆØÆ'į§Â^ßн¾õõ”E>¡¿»;çª,•eu“×H´¤¾cÕl;Ày= Jœ¢eH~/»vñ?BBW¶=eóHÂ8ÔæJ—…ï÷ßÏÖ@W&<1†‰•ÕÁû9¿¹˜Ž$éš¶S×]¾Ûí®×+¹rR7Ï»ýÛÍpÊøØyF‘¼›·Hƒ";óRɇ;ø3Œâ5ÈŸL昂8žÂ1ós9"ASlÏ¸æ ”ƒö(‚ƒ ÄM&CßM\";Ð ›¦ÈŒ›'´iâ+L0Äpð!#þ[ëqvk²ôçKÝL_ÆÇÇv¹vo¾3Þ‘2ý7’Ú—¶ÓçöOGY@”|H8óÂ,l˜?1Îf—>¼5¿Õ]SèOxnáN65šr€ÕÈ€Cr'Ú²ÖYïܳøø$49ÿ1IÈÀÉÖŒ3. +—gÉ„P³˜‡ÉÊb2¬Ä½¶`1ˆÕÅ@:Ÿ¨7»l)øxr»+ÝÊC¾Œf6˜_jú‹½z‹ñÇÝs#"ðnßÉ„× ÷yºá¢˜¡z"ZTYÙão>HPÓÊ:sÏC °'¡Ó þÌ€„¶?´ºó €kFãnáÈP-ÙþNøæá==fè endstream endobj 2077 0 obj [ 2076 0 R 2078 0 R 2079 0 R 2080 0 R ] endobj 2074 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 2077 0 R /Contents 2081 0 R >> endobj 2082 0 obj 2314 endobj 2084 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 759.389 276.382 768.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1055 0 R /H /I >> endobj 2086 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.993 759.389 524.993 768.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1055 0 R /H /I >> endobj 2087 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 747.389 299.461 756.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1058 0 R /H /I >> endobj 2088 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.813 747.389 524.813 756.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1058 0 R /H /I >> endobj 2089 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 735.389 292.315 744.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1061 0 R /H /I >> endobj 2090 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.869 735.389 524.869 744.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1061 0 R /H /I >> endobj 2091 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 723.389 352.995 732.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1064 0 R /H /I >> endobj 2092 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.485 723.389 524.485 732.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1064 0 R /H /I >> endobj 2093 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 711.389 370.188 720.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1067 0 R /H /I >> endobj 2094 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.339 711.389 524.339 720.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1067 0 R /H /I >> endobj 2095 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 699.389 369.091 708.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1070 0 R /H /I >> endobj 2096 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.349 699.389 524.349 708.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1070 0 R /H /I >> endobj 2097 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 687.389 239.996 696.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 969 0 R /H /I >> endobj 2098 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.277 687.389 525.277 696.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 969 0 R /H /I >> endobj 2099 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 675.389 342.055 684.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1075 0 R /H /I >> endobj 2100 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.479 675.389 524.479 684.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1075 0 R /H /I >> endobj 2101 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 663.389 248.05 672.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1078 0 R /H /I >> endobj 2102 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.373 663.389 525.373 672.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1078 0 R /H /I >> endobj 2103 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 651.389 252.461 660.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1081 0 R /H /I >> endobj 2104 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.335 651.389 525.335 660.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1081 0 R /H /I >> endobj 2105 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 639.389 232.847 648.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1084 0 R /H /I >> endobj 2106 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.189 639.389 525.189 648.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1084 0 R /H /I >> endobj 2107 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 627.389 267.615 636.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1087 0 R /H /I >> endobj 2108 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.061 627.389 525.061 636.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1087 0 R /H /I >> endobj 2109 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 615.389 308.602 624.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1090 0 R /H /I >> endobj 2110 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.738 615.389 524.738 624.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1090 0 R /H /I >> endobj 2111 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 603.389 276.392 612.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1093 0 R /H /I >> endobj 2112 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.993 603.389 524.993 612.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1093 0 R /H /I >> endobj 2113 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 591.389 267.071 600.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1096 0 R /H /I >> endobj 2114 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.065 591.389 525.065 600.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1096 0 R /H /I >> endobj 2115 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 579.389 391.936 588.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1099 0 R /H /I >> endobj 2116 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.087 579.389 524.087 588.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1099 0 R /H /I >> endobj 2117 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 567.389 347.082 576.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1102 0 R /H /I >> endobj 2118 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.439 567.389 524.439 576.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1102 0 R /H /I >> endobj 2119 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 555.389 293.987 564.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1105 0 R /H /I >> endobj 2120 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.982 555.389 524.982 564.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1105 0 R /H /I >> endobj 2121 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 543.389 391.737 552.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1108 0 R /H /I >> endobj 2122 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.157 543.389 524.157 552.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1108 0 R /H /I >> endobj 2123 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 531.389 270.282 540.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1111 0 R /H /I >> endobj 2124 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.182 531.389 525.182 540.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1111 0 R /H /I >> endobj 2125 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 519.389 218.899 528.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1114 0 R /H /I >> endobj 2126 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.291 519.389 525.291 528.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1114 0 R /H /I >> endobj 2127 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 507.389 258.739 516.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1117 0 R /H /I >> endobj 2128 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.131 507.389 525.131 516.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1117 0 R /H /I >> endobj 2129 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 495.389 303.859 504.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1120 0 R /H /I >> endobj 2130 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.777 495.389 524.777 504.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1120 0 R /H /I >> endobj 2131 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 483.389 387.968 492.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1123 0 R /H /I >> endobj 2132 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.187 483.389 524.187 492.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1123 0 R /H /I >> endobj 2133 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 471.389 351.1 480.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1202 0 R /H /I >> endobj 2134 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.406 471.389 524.406 480.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1202 0 R /H /I >> endobj 2135 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 459.389 350.083 468.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1206 0 R /H /I >> endobj 2136 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.509 459.389 524.509 468.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1206 0 R /H /I >> endobj 2137 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 447.389 340.182 456.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1209 0 R /H /I >> endobj 2138 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.593 447.389 524.593 456.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1209 0 R /H /I >> endobj 2139 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 435.389 347.805 444.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1212 0 R /H /I >> endobj 2140 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.485 435.389 524.485 444.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1212 0 R /H /I >> endobj 2141 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 423.389 343.87 432.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1215 0 R /H /I >> endobj 2142 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.425 423.389 524.425 432.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1215 0 R /H /I >> endobj 2143 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 411.389 299.413 420.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1218 0 R /H /I >> endobj 2144 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.775 411.389 524.775 420.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1218 0 R /H /I >> endobj 2145 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 399.389 401.945 408.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1221 0 R /H /I >> endobj 2146 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.027 399.389 524.027 408.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1221 0 R /H /I >> endobj 2147 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 387.389 406.62 396.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1224 0 R /H /I >> endobj 2148 0 obj << /Type /Annot /Subtype /Link /Rect [ 508.989 387.389 523.989 396.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1224 0 R /H /I >> endobj 2149 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 375.389 321.377 384.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1227 0 R /H /I >> endobj 2150 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.709 375.389 524.709 384.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1227 0 R /H /I >> endobj 2151 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 363.389 461.153 372.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1230 0 R /H /I >> endobj 2152 0 obj << /Type /Annot /Subtype /Link /Rect [ 508.504 363.389 523.504 372.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1230 0 R /H /I >> endobj 2153 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 351.389 249.402 360.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1171 0 R /H /I >> endobj 2154 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.031 351.389 525.031 360.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1171 0 R /H /I >> endobj 2155 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 339.389 284.546 348.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1235 0 R /H /I >> endobj 2156 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.889 339.389 524.889 348.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1235 0 R /H /I >> endobj 2157 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 327.389 258.154 336.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1238 0 R /H /I >> endobj 2158 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.097 327.389 525.097 336.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1238 0 R /H /I >> endobj 2159 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 315.389 312.035 324.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1241 0 R /H /I >> endobj 2160 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.787 315.389 524.787 324.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1241 0 R /H /I >> endobj 2161 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 303.389 341.64 312.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1244 0 R /H /I >> endobj 2162 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.537 303.389 524.537 312.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1244 0 R /H /I >> endobj 2163 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 291.389 300.512 300.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1247 0 R /H /I >> endobj 2164 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.885 291.389 524.885 300.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1247 0 R /H /I >> endobj 2165 0 obj << /Type /Action /S /GoTo /D [1255 0 R /XYZ 72.0 769.889 null] >> endobj 2166 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 279.389 209.934 288.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2165 0 R /H /I >> endobj 2167 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.187 279.389 525.187 288.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2165 0 R /H /I >> endobj 2168 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 267.389 251.044 276.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1259 0 R /H /I >> endobj 2169 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.019 267.389 525.019 276.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1259 0 R /H /I >> endobj 2170 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 255.389 199.1 264.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1291 0 R /H /I >> endobj 2171 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.561 255.389 525.561 264.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1291 0 R /H /I >> endobj 2172 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 243.389 194.1 252.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1270 0 R /H /I >> endobj 2173 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.599 243.389 525.599 252.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1270 0 R /H /I >> endobj 2174 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 231.389 189.1 240.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1628 0 R /H /I >> endobj 2175 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.638 231.389 525.638 240.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1628 0 R /H /I >> endobj 2176 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 219.389 201.32 228.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1319 0 R /H /I >> endobj 2177 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.543 219.389 525.543 228.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1319 0 R /H /I >> endobj 2178 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 207.389 229.08 216.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1402 0 R /H /I >> endobj 2179 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.325 207.389 525.325 216.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1402 0 R /H /I >> endobj 2180 0 obj << /Type /Action /S /GoTo /D [1373 0 R /XYZ 72.0 769.889 null] >> endobj 2181 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 195.389 243.315 204.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2180 0 R /H /I >> endobj 2182 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.077 195.389 525.077 204.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2180 0 R /H /I >> endobj 2183 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 183.389 193.54 192.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1530 0 R /H /I >> endobj 2184 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.603 183.389 525.603 192.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1530 0 R /H /I >> endobj 2185 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 171.389 221.31 180.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1642 0 R /H /I >> endobj 2186 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.387 171.389 525.387 180.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1642 0 R /H /I >> endobj 2187 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 159.389 219.64 168.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1644 0 R /H /I >> endobj 2188 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.398 159.389 525.398 168.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1644 0 R /H /I >> endobj 2189 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 147.389 205.77 156.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1546 0 R /H /I >> endobj 2190 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.509 147.389 525.509 156.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1546 0 R /H /I >> endobj 2191 0 obj << /Type /Action /S /GoTo /D [1597 0 R /XYZ 72.0 769.889 null] >> endobj 2192 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 135.389 207.43 144.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2191 0 R /H /I >> endobj 2193 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.495 135.389 525.495 144.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2191 0 R /H /I >> endobj 2194 0 obj << /Type /Action /S /GoTo /D [1602 0 R /XYZ 72.0 769.889 null] >> endobj 2195 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 123.389 333.232 132.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2194 0 R /H /I >> endobj 2196 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.421 123.389 524.421 132.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2194 0 R /H /I >> endobj 2197 0 obj << /Type /Action /S /GoTo /D [1602 0 R /XYZ 72.0 520.171 null] >> endobj 2198 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 111.389 214.363 120.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2197 0 R /H /I >> endobj 2199 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.439 111.389 525.439 120.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2197 0 R /H /I >> endobj 2200 0 obj << /Type /Action /S /GoTo /D [2053 0 R /XYZ 72.0 287.697 null] >> endobj 2201 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 99.389 314.074 108.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2200 0 R /H /I >> endobj 2202 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.657 99.389 524.657 108.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2200 0 R /H /I >> endobj 2203 0 obj << /Type /Action /S /GoTo /D [2053 0 R /XYZ 72.0 195.774 null] >> endobj 2204 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 87.389 239.724 96.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2203 0 R /H /I >> endobj 2205 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.401 87.389 525.401 96.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2203 0 R /H /I >> endobj 2206 0 obj << /Type /Action /S /GoTo /D [2074 0 R /XYZ 72.0 769.889 null] >> endobj 2207 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 75.389 241.397 84.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2206 0 R /H /I >> endobj 2208 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.387 75.389 525.387 84.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2206 0 R /H /I >> endobj 2209 0 obj << /Length 2210 0 R /Filter /FlateDecode >> stream xœÍÝ]wÉq áûù¸¤ÏYµ33"2".-Ëòz×ö®äñÇ9>¾Éæ+ P#ýû­¨¦1]E ïì ±1o ]••™õßßõ«¶üÿ/êBû!"¯Þ}þ>Þ¯|\É|úµƒkM®º†]}¾úù‡ìêSóâãùWËÿü¬]^¼ú÷ïn¿kWÿÝþ×Ò¼¿jËq?~×¾ñÉ×Oõ/ßýæÅ÷ö,¿þKúþÚÕßýòûïþú×vÕÛÕ÷ÎÄÚÍgfÎyYÿ7®¾ÿ|õŸo~{üð«_^}¼¾}ÿöîîwõ_Wßÿ¯ïþîûŸýv¥µCü¥ýnó³oqùÛâî‡vù·hý4rúØò‘Óg¬ÿô³oäòåé«üì#§ßÁé¿ù-·ÍwÜ^~ÃÛ¿@1ßÜ·ÿîø8x¹ü§Cüì/ÏïÿÔß—¿˜ßÜö¯Ê¨ïëÛ¿çÜþ3‰ƒ®þêê1¯Þüý§»·×Ÿž_ßß<>ÿúþøáx¼}w|8ýÁüôG[þ0b,ß˜Çæs?½9Æ®Ë1*¹9æp/6 O'ˆÇ ±‘8@,ÄJb"¨DP‰ A%‚FœDpÁI:t"èD0ˆ`Á ‚I“&¬w.Ai@P”¥Aé@P”eA!‚B… T"¨DP‰ A#‚F'œDpÁI:t"D0ˆ`Á$‚I“&ÔµAm@P;ÔµÁ¥#1ÔuA!‚B—æ³›ýµoºüLϔֻúöbr\ÔËçò'~yÅë§ûÕ›¿½?^?Ÿ_}9Þßܽ¿ywº­<üñöîöŸ7WË;§Î–¦Û/ð|ðæ¢e±—ÞÚˆ¾=h{‰#¨ž¨NR×»(¨ ÕAêz#µ¢zùg¼œ†›½¢®÷RP ª'ª“Ôõ~ jCuºÞRA­¨F–‰,Y&²Lb)XJ#–Òˆ¥tb)XJ'–2ˆ¥ b)ƒXÊ@–‚,Y ²Td©ÈR‘¥!KC–†, YNd9‘åD–Ž,Y:² dÈ2e ËD–‰,“Xj#–Úˆ¥6b©Xj'–Ú‰¥vb©ƒXê –:¥ KA–˹½i%Ã_}iRUÑGFŒØ¹`’íUÕò~%ÒZë!ÏWUyºªÊC,×U¯ï¯ß=ïÏ:Þ¾[®­n8äæááëö†^}ùnËY»êö«œÞ&‡Ù—vZnÛœh-oå¤NR/© ÕAê孜Ԋj'õòVNjdiÈÒåD–YNdéÈÒ‘¥#Ë@–,Y²Ld™È2‰¥4b)XJ#–Ò‰¥tb)XJ'–2ˆ¥ b)Y ²d)ÈR‘¥"KE–Š, Y²4d9‘åD–Y:²tdéÈÒ‘e Ë@–,Y&²Lb©Xj#–Úˆ¥6b©Xj'–Ú‰¥b©ƒXê@–‚,YÖ…›÷ÖÑuÏzå6c¹rk;‡m®ÜúhË!;—n}½x›Ëoïââíô¡ç‹·‡ó‡î>œýþúñúíõÃöbn9WÌÔLëcûuÏÇoÓÃòѺôض7Úêl¨TOT'¨k´ŸÔ†ê uï¨&–5ÚêA,k´ŸÔIJFûA-ÈR¥ KE–Š,Y²4diÈÒåD–YNdéÈÒ‘¥#Ë@–,Y²Ld™È2‰eö“šXÖh?¨;±¬Ñ~RËíõ –5ÚOjd)ÈRårÒ(™¾óüªN54ÃÄvN÷N—Ÿ Û“Ʊž4.?Šåâ¤ñô¡Ÿ4ž>t:i<ýúæó—»ûÇãûóGê4rgd­‡ŸîLl¾‰ó¡;ClcôÖ–rsÔÞˆÄË? ‰'‰ÄË?‰ÄB… T"¨DP‰ A#‚FN"8‰à$‚N:t"D0ˆ`Á$‚IÖˆ`ŸÖèˆ`½>@°FÎ@L… "XgKÍr9]šàd¢N—–ËêŒ;‡…îœ.-nÛÓ%y>]ºœ qúÐåéR¼8]ªÿü‡Ÿ.Å7N—üÐrùãÛoâ|èæ¤f9ɧÓÈÍQÛ3 !ñ$q‚xùb#q€xùb%±ƒXˆ A!‚B•*T"hDЈ ÁI'œDpA'‚N "D0‰`Á$‚ kyˆ`-Ï{}Ü`-Ï1¬åy ‚µ<ÄDPˆ Á:]êËÉ„N'ëé’._#ÛÎ9Èæt©ö„i›³¥ÞÖ“¥^§þWoþõáøâÕ—÷îïî/O»–‹ÂÌÙÚÛOøâèËü4ciûö°Ë?‘îJbñR€XH Ö~A ‚µQˆ`mb XÖFA¯… "¨DP‰ A%‚FZ z†…¾¢žÕŠj'µ7T ª'ª“Ô1Pm¨F–‰,Y&±¬q RË™ 5±¬± RËõ –5>Ajd)ÈR¥ KA–Š,Y*²4diÈÒåD–YNd9‘¥#KG–Ž,Y² d™È2‘e"Ë$–5rAjbYc îIJF/HM,kü‚ÔIJF0H,Y ²¬Ín\3kC¢× hÝËwo-ÚÞÅÎ(Fn—ÄöŸ¦UËÕ›¸}<Ö=Ÿ›»Ûó¼yüx~uüÃ’Üž¶:}äúË—O7ï®ë ÍäêåD·Ùò3¶_üü)vÎx»-ziÛ£öNxAœ ^NwAl$/çº Vûëã:Ñ1\oÀ½>‚ë ¸×Ç@p½÷êxÁõÜëc"(DPˆ A!‚J•*4"hDЈà$‚“N"8‰ A'‚Nƒ "˜D0‰`Á‚ë ¸×Ç@p½÷ê¸ÁõÜëc ¸Þ€{} ×p¯‰ A!‚ëìîÙš7r†·NïölM²ïœ•ÚE^ó•zÛ. ¬¿O7áìêÍß½¿y¼»¿ÇOoËÃò»jmö£.ÿz-*µ¡:H]‹ŠA­¨vPZT jAõD5±XŽN,G'–cË1ˆem jA–‚,Y ²Td©ÈR‘¥!KC–†,'²œÈr"ˉ,Y:²tdÈ2e ËD–‰,Y&±¬•â¤&–µRÔXÖJqRËZ)NjbY+ÅI,Y ²d©ÈR‘¥"KC–†, Y²œÈr"ˉ,Y:²tdÈ2e Ë@–‰,Y&±¬•â¤&–µRÔXÖJqRËZ)êA,k¥8©‘¥ KA–˹}ŒåL"Ð¥zݧ{m;£»ƒ }»X|9Oƒ rèWoþíæøãq3œP“`Ÿ«±ý,/ß(‡Ì§§ŽlÜ^õO–'Ês°ÜX$¯É±(W–;Ê{c9R­i²(Gª5UåHµ¦Ë’\˜ª0UaªÊT•©*SU¦jLÕ˜ª1ÕÉT'SLÕ™ª3UgªÎTƒ©S ¦šL5™j"Õå?²©Ö\”#Õšo€r¤ZsH>jÍ;@9S¦*LU˜ª0UeªÊT•©S5¦jLu2ÕÉT'SLÕ™ª3UgªÁTƒ©SM¦šL5™j"Õš«€r¤ZóHÞ‘jÍY@9R­y (Gª5wåLU˜ª0Õwh²\ÒOtI¿<ˆfvÝ;p3ðàãªËÅÆ§GÒ,ØqõæŸïç—Ÿ¯o¯8~>Þn×·C¨×§Ùû”çϰ9NÒž¦ãnÛ\Ç/§ã$_NÇQ.,Ÿ,O”/§ã(7–Ê—Óq”3ÕDª5åHµ&r ©ÖT”#ÕšÌAòTk:Ê™ª0UaªÂT…©*SU¦ªLÕ˜ª1Ucª“©N¦:™êdªÎT©:S ¦L5˜j2ÕdªÉT©ÖD”#ÕšêAòŽTk²Ê‘jM÷@9R­ (gªÂT…© SU¦ªLU™ª1UcªÆT©N¦:™êdªÎT©:S ¦L5˜j0ÕdªÉT©ÖL”#Õš BòŽTk6Ê‘jÍ!ù@ª5#åLU˜ª0Uyñe0ØQ£3Ë…w¦ÉÜ9.æEŸK¥—‹¨ŸŸ:U{Ž]½ù›÷ïÏ/j!ôíûã‹ÜÖðÍæj»:f­VAï|þóÁ›ãòÐZ¶¶œFï·½0,7–Ê—ó,”+ËåËyÊ…å“åLU˜ª0UaªÊT•©*S5¦jLÕ˜ª1ÕÉT'SLÕ™ª3UgªÁTƒ©S ¦šL5™j"Õz¶ Ê‘j=_†ä©Ö3fPŽTë93$Hµž5ƒr¦*LU˜ª0UeªÊT•©*S5¦jLÕ˜êdª“©N¦êLÕ™ª3UgªÁTƒ©SM¦šL5‘j=åHµžPƒr¤ZO©A9R­'Õ| ÕzZ Ê™ª0UaªÂTk]öœËE}G×¹u•ÞæÓîÛãv¯Òír¿ˆçÇüùúhœ_ßܾ?¿º~ùâ÷7Çϯ^^ÁŸ>²wZŸ>Z­IÙ|å󡛣ò²\÷Oï;Çm/Ëårë,W–û’?ÏšùóyÍu!¹°|²Ÿ_ýì–æüÆåPݓϞ#w>ù󡛣üàVGí´9![þ“ZP=Q¤^þ“ÚP¤^þú’ZQ,Y*²Td©ÈÒ¥!K+ËÑúòõ5ùì,W–;ʽ±\X>Yž(Árc9SM¦šL5‘êòYŽTkÑ5Ê‘j-ºF9R­E×$Hµ]£œ© S¦*LU˜ª2UeªÊT©S5¦:™êdª“©N¦êLÕ™ª3Õ`ªÁTƒ©&SM¦šL5‘j-ºF9R­E×$ïHµ]£©Ö¢k”#ÕZtr¦*LU˜jÝ0”‘i³¿þ:R×­8¤õ®¾sÔî°_.Ì΃>Oê§]ãϯ.fõ~ã"¸fõ6o¹\ïÛÎ8¼9.ZwImèÎq›“¸zl0É•åŽòzx0É…å“å‰òzˆ0ÉåLU˜ª0UaªÊT•©*SU¦jLÕ˜j=\xz«-'_Q×Ã…A­¨vR×Ã…A-¨ž¨NR×Ã…Am¨F–‰,Y&±¬ËrRËõá &–ëÃ…AM,ׇ ¿¾Är}¸0¨‘¥ KA–‚,Y*²Td©ÈÒ¥!KC–YNd9‘åD–Ž,Y:² dÈ2e"ËD–‰,“X®5±\.üúºËõá &–ëÃ…AM,ׇ ƒY ²d¹ÎÌÍÖ¦ kÕÓÌ\kmèÞérøÎ¥vlw7³õR»n^½ùÇ›Ûß_ÿpóðxsûÃù#·ÏûŸ^>Þ}÷øñxÿâåÛÿw|÷ø¢½¹}qÜÇãùÅûëÇë·×ÇÍYDrù1~šw¼ù¾ÏÇoÞóÇ!Üð¶÷ûÝž"Ëå5IäÊrG¹6– Ë'ËåÆT©SLu2ÕÉT©:Su¦êL5˜j0Õ`ªÉT“©&R­A(Gªµ åHµ¡©Ö‚ ’¤Z ‚PÎT…© S­Çv{>mÛñúw̲oË×h6ÇÎq{çëž“çs=X~’ÊÕ›ïïο~øx}<¿¼»?ÿz98¿xüö1/Çü:r;ñm¹j±|kÍeç;<¼9.½Î£ê‰1Ûã¶CUåÊrGy=­šäÂòÉò$y-Ó@¹±©Ö2 ”#ÕZ¦AòTk™Ê‘j-Ó ¹0UaªÂT•©*SU¦jLÕ˜ª1Ucª“©N¦:™ª3UgªÎTƒ©S ¦L5™j2ÕDªµLåHµ–i¼#ÕZ¦r¤ZË4H>j-Ó@9S¦*Lµ6¦6;m=Nùê”Wåië¹íq›SÞz"áºWùæœ÷i÷9;ØrÖ{Ö:½¸?~xÿöýùõûã‡ë¯Ÿ.P{ŽgÌå¤ÝúÎW8¾9ÎË›ÛéVùö¸Í™Yí®òÚ/äÊrGyí9@raùdy¢¼V‘œ©Ößmë0ó+êÙQ­¨vR×s(@-¨ž¨NR×3(@m¨F–‰,Y&±”F,k©‰eM€u'–5‚ÔIJ&@šXÖP ²d)ÈR¥"KE–Š, Y²4d9‘åD–YNdéÈÒ‘¥#Ë@–,Y&²Ld™È2‰eM€ 5±¬  îIJ&@šXÖRËšAjd)ÈReM€XN ×… à"h]kËé²NÙ9nÿ*nlWÛϧÝÉTã§«¸Ó‹Ógøë_çUoWßxñ¹êI™µŸ€ÛÜù¤ë ŒçƒmspþɃÏ_þúññþæí×ÇßÑ݇ó¯_~«/o’œ>²w“¤¦U¸<_pþ‰/½9“‡é±>‚o{Øö¼ÃP¤^.NI­¨vR/W¦¤TOT'© Y²4d9‘åD–Y:²tdéÈÒ‘e Ë@–,Y&²LbY“'HM,kꩉeMœ 5±¬i IJ&MY ²d¹œwŒ¾¼ OQò^XçÝ–ó•‘{ÇEìwÈv‘ã|Úç'ד›_]?^Ÿ_}¹¿ùýõ»?^~¦ŒÃ¨3Ÿ±ó)χ_Žé´þâ]sÜf¨)ËåµyÉ…å“å‰òÚ@ˆäÆò@¹0UaªÂT•©*SU¦ªLÕ˜ª1Ucª“©N¦:™ª3UgªÎT©S ¦L5™j2ÕDª5hr¤ºn&Dr¤ºn&Dr¤ºn&òT×Í„HÎT…© S¦*LU™ª2UeªÆT©SLu2ÕÉT'Su¦êLÕ™j0Õ`ªÁT“©&SM¦šHuÝLˆäHuÝLä©®› ‘©®› ‘©®› ‘œ© S¦Zocf¤¹p==#t´6CwŽÛ\jûXŸ¥ñój¹Þ¬/З³ž¼zóË›·Ÿnî~¸¿þòñf»oP­bËz¨J‹ÏôâÓ\hí°üÕmM}îxùçÑMX>Yž(ŸƒåÆò@¹w–+ËåÁTƒ©S ¦šL5™j"Õu£,’#Õu£,w¤ºn”Er¤ºn”òTײHÎT…© S¦ªLU™ª2UeªÆT©ÖFYÍ—7_{M]eZQí¤®²@-¨ž¨NR×FY 6T#ËD–‰,“XÖ©‰åºQ¨‰åºQ¨‰åºQÖëëA,ײ@,Y ²d)ÈR‘¥"KE–†, Y²œÈr"ˉ,'²tdéÈÒ‘e Ë@–,Y&²Ld™ÄrÝ( ÔÄrÝ(ëõu'–ëFY &–ëFY &–ëFY F–‚,YÖ RŒ§y`p¦F‘F¶ ë}çÀÈ‹¾v¸¨ùó#3¦ùO£H§Å~Ëuõò%~óõæÝï¯ïÏûáëÍûË}¬ê"ßk©ahßù¬çƒ7صuÝÎÃwŽÛ^ Ë'Ë“äcÝÙäÆò@ùº³È•åŽòTÇ@ªc Õ1˜ª0UaªÂT•©*SU¦jLÕ˜ª1Ucª“©N¦:™ª3UgªÎTƒ©S ¦L5™j2ÕDªÒª4¤* ©JGªÒ‘ªt¤*©Ê@ª2ª ¦*LU˜ª0UeªÊT•©*S5¦jLÕ˜êdª“©N¦êLÕ™ª3UgªÁTƒ©SM¦šL5‘j-Ï@9R­(GªµDåHµi| ÕZ¦r¦*LU˜ª0Õ)hµ‘J¹è^§›,g½ïìÔ‚õË‚ÓzR·Z<òO×·×?ϯߞçŸüñüчÇ?~ÚîhYÛG[dŠÉÎ:½wéÕÛò‡¥{Çí^z¼.½H®,w”ץɅå“å‰òºô"9SLÕ™ª3UgªÁTƒ©S ¦šL5™j"ÕõÒ‹äHu½ôyGªë¥É‘êzéòT×K/’3UaªÂT…©*SU¦ªLU™ª1UcªÆT'SLu2UgªÎT©:S ¦L5˜j2Õdª‰T×K/’#ÕõÒ‹äHu½ô"9R]/½@>êzéEr¦*LU˜ª0ÕåÒˆ.×,I.YjM½»·mïšjsåµ®©¯=·¶—^§»´µBìêÍ¿ßßüñüúúüËËK´ÓG×K´óË7Ÿ¶Ï,²C.W©ë¶ßÝùØÍqqXþx—ã” Ë'ËåµÉåLÕ˜ª1Ucª“©N¦:™êdªÎT©:S ¦L5˜j2ÕdªÉT©Ö$1”#Õš&FòŽTk¢Ê‘jMC9R­Éb(gªÂT…©Ö?ÒZ½÷ãuƒŸåM¼÷ZO¸9.ÛÎ0pí£yy.rÚÞÇf}‰¿½?^ŸNEN¯ÿåïÿéϯ®oߟ_üÇËÿòöO-W¬u ½-ÿ7ûÎwpþ$›­º‹1—Sºž;ÇmÀŒåòõÞÈ•åNrYïM\X>Yž(ïHU:R•ŽTe UHUS¦*LU˜ª0UeªÊT•©S5¦jLu2ÕÉT'SLÕ™ª3UgªÁTƒ©SM¦šL5™j"UmHURÕ†Tµ#UíHU;RÕTu UHUS¦*Lµu ‘‘cï,ò›çpë#ŒÚlÍbï¸ì;fõLÄ“ÔÓ€Y=ÔøêÍÿ>¿<=òûô›Çó¯n>9 ^ÿxóøñüj}âÑíûÍ)jZ,çU}ç8¾9‹ì‡ÑZÆr®¿sÜö¤SYî(_~(¡\X>Yž$¯Çl¢ÜX(ïHµ³‰r¤ZÙD9R­Çl¢œ© S¦*LU™ª2UeªÆT©S5¦:™êdª“©:Su¦êL5˜j0Õ`ªÁT“©&SM¤ZÙD9R­Çl’¼#ÕzÌ&Ê‘j=f“ä©Öc6QÎT…© S­sÔl™} s¸:GµV»©ÍÜ9nÿuì,¼•§µs^îßö?ž?üô,”úåÇëû÷Ï¿þñúrõu^äó–rÛ¯ö|àæ4öü¡íA›S4WT;©£¡ZP=Q¤ÎjCu€º&E’šXÖ”HPwbY"IM,k:$¨±”A,e KA–‚,Y*²Td©ÈR‘¥!KC–†,'²œÈr"KG–Ž,Y:² dÈ2e"ËD–I,µKmÄR±ÔF,µKíÄR;±ÔA,uKÈR¥ KA–µó˜,gËÅÝëÏ"×â§ ‚Û£RöNˆeg™<Í-˜í°|•ÿy÷ãùÅãÝù×_Žçï¾><Þ}>¿>-9ûx<>n§Ø!šf.çÊ;_ÿü)vÆz³÷åÐuç¸íùcg¹²ÜQ^s£H.,Ÿ,O’×/ÊåHµ†xQŽTkˆ—ä©Ö/Ê‘j ñ’\˜ª0UaªÊT•©*S5¦jLÕ˜ª1ÕÉT'SLÕ™ª3UgªÁTƒ©S ¦šL5™j"ÕâE9R­!^’w¤ZC¼(Gª5ÄKòTkˆåLµÆ.<2“ií¢šab»ç’ã“ëOïÍ)§ž&³z}“Y××ÿxýýñ?þú—7o—ÿ9ôÏL]í‡8=?dì|ÁógÙZM­«î¶7´ êú jAõDu’º~ú€ÚP ®¡URËZu'–5´JjbYC« IJ†VI,Y ²d©ÈR‘¥"KE–†, Y²œÈr"ˉ,Y:²tdéÈ2e Ë@–‰,Y&±¬¡URËZ%5±¬¡URËZõ –5´Jjd)Èr½‘¶œŒfCgoëÙèó®½ÓÌËÐ:µ¥Uö¼ÃVy6zzýÛï}~ñ§OBë¹}ùÜ*±óuΟåò¸z*ý\þúwÝûþ6çPõXz’O–'Êu°ÜX(·Îre¹£|2ÕÉT'SLÕ™ª3UgªÁTƒ©SM¦šL5™j"ÕØG9R­}’w¤Zû(Gª5°r¤Zû(gªÂT…© SU¦ªLU™ª1UcªÆT©N¦:™êdªÎT©:S ¦L5˜j0ÕdªÉT©ÖÀ>Ê‘j 쓼#ÕØG9R­}’¤Zû(gªËµ”-'ñ1c‹º–r?í´µwdý:™d§€õù^^M^_ŸùtauzñþîÝ×ÏÇÛÇóG>œ¶×:½xšzrzñ¼PðéÓ?üê—;o¡©ÖšËØù.Ïï¼—ÆèËuhúÎq{ï¥(”/ï¥(W–;Ê—÷R” Ë'Ëå“©N¦:™ª3UgªÎTƒ©S ¦L5™j2ÕDªõ^Šr¤Zï¥$ïHµÞKQŽTë½”ä©Ö{)Ê™jmu¼¼%®ï‰¯©·Ò6žvŸÜ{œ{辰³RÉžV*ÕûÌÏÞK××ïn¯oînκ¹=ÿúÇ»ÓÂ¥Ó«/÷wïŽOoªë‡žßs/Ç1ëæÛìÏ7Ó7ß×ùlŽóƒºgÎã¶ï@åÂòÉòDy=bäÆò@y=cäÊr¦êLÕ™ª3UgªÁTƒ©SM¦šL5‘jÝ›C9R­»s(GªuåHµîБ| ÕºG‡r¦*LµÞŸŸgÞj-DF¶¾ü(Ù}ŸÛ}?Ì… ö´PÁ×õÁÿ÷ô–vþÀó­ºþ§ÞÝF­gó¹|æÜù"çã/³Zl±\Rö1vŽÛÞ,2–Ê—Ÿø(W–;Ê—Ÿø(–O–'ʃ©S ¦šL5™j"ÕÚ»åHµö®D9R­½+QŽTkïJ’¤Z{W¢œ© S¦*LU˜ª2UeªÊT©S5¦:™êdª“©N¦êLÕ™ª3Õ`ªÁTƒ©&SM¦šL5‘jí]‰r¤Z{W’¼#ÕÚ»åHµö®D9R­½+QÎT— ­{\:9w^ï-µå@wϹ·ËõE ‘nÎÿçzö_3G®ÞüëÃÓÎ’§—çõȧ×/Ö#Ÿ?xZÍ|úõ—óÕÃé?]0œ?ô|§éôêONþ«ÑënÒºuÝùæÏŸeç2¹YÔvŽÛ»ÌG¹“¼.óQ.,Ÿ,O”/'}(7–ÊR­Ë|”3UaªËI_D´Ö4ÉßäºÌ·&ë’²½½—ÿÈ}¬÷.²ÓÍãZmÿtk÷üò_~û¯ç7·Çû×ï.ŸšÔÝZë±óéÏÇ_ËŸQôÓ¸Ûã.ÿŒzË'ËåËOT”˃ä£u–+Ë婎ŽTGGª£#Õ1êHu ¦*LU˜ª0UeªÊT•©*S5¦jLÕ˜êdª“©N¦êLÕ™ª3UgªÁTƒ©SM¦šL5‘j #¢©Ö0"Ê‘j #¢©Ö0"ÉR­aD”3UaªÂT…© SU¦ªLU™ª1UcªÆT'SLu2ÕÉT©:Su¦L5˜j0ÕdªÉT“©&R­aD”#ÕF$yGª5Œˆr¤ZÈ(Gª5Œˆr¦ZóËlœæÇkt•84ùæ—é-v†Çfú]š ^s_¯ÞüûÇëÇó«ç!†õÅÍÃù×ן>½xñöîëãæênLë :Ãv¾êùàÍqvÓÖ$ûÎqÛ‹È@ùrÖ€re¹£|9k@¹°|²êº6‹äLµÖ9GË\~$ë­š‹‘­ù’î\î^DêfÎzZ™•Ë/~ºl<½ø?_Ž÷§uYŸ©î÷úÎÝÏyþ ›ãò`Ó2—Ëòã.ÿdêv0ÊåAòºŒre¹£¼–\X>YŽTëv0Ê‘jÝ&¹0UaªÂT•©*SU¦ªLÕ˜ª1ÕZU2gkiã5y­*!¹²ÜQ^«JH.,Ÿ,O”ת’Ë™j2Õdª‰T×U%$Gªëª’#ÕuU ɑ꺪ä©®«JHÎT…© S¦*LU™ª2UeªÆT©SLu2ÕÉT'Su¦êLÕ™j0Õ`ªÁT“©&SM¦šHu]UBr¤º®*yGªëª’#ÕuU ɑ꺪„äLµn‡fº¡ËâõvpÎ ÝKôÍ•|-+WÛ¬>©Kùþ¼´_½ùþãñüâø‡/Ÿ®O»ªœ>p÷|u¿sÒÄZ[~°í|•ó'ع9Z󚜿9nïrå‰ò¥@¹±<–¼¦æ÷|M¾\Ž \Yî(_.GP.,Ÿ,O”Ç`¹±œ©&SM¦šHµ.GPŽTëråHµ.GPŽTër„ä©ÖåÊ™ª0UaªÂT…©*SU¦ªLÕ˜ª1Ucª“©N¦:™êdªÎT©:S ¦L5˜j2ÕdªÉT©ÖåÊ‘j]޼#ÕºA9R­Ë”#ÕºA9S]7PÎ%©u¬¯?‘_¹Çr9â²w•±527Ëdëjätk±~€ýt5rzñp¼¾÷ñ·ÇÇû›ãï_|ü›%õØÓÖѶóÅΟ`s‚9îˉ½tß9n{>j,”×lz’+Ëå5›žäÂòÉò$yÍ‹C9R­yq$ïHµæÅ¡©Ö¼8”#Õš‡r¦*LU˜ª0UeªÊT•©S5¦jLÕ˜êdª“©N¦êLÕ™ª3Õ`ªÁTƒ©SM¦šL5‘jÍ‹C9R­yq$ïHµæÅ¡©Ö¼8’¤ZóâPÎTk¦¦O§¯¯?å«ÓW“§Ó×íii˽ÓWßÙ¾e<íÑëóßN_O/Þ]ßž_}󤵿"õå|}y3ÙùçOpyœôCt_Žësç¸ÍÉÓò…rG¹6– Ë'ËåËÕ ÊåòÉT'SLÕ™ª3UgªÎTƒ©S ¦šL5™j"Õº €r¤ZwPŽTë.Ê‘jÝ ù@ªuåLU˜ª0UaªÂT•©*SU¦jLÕ˜ª1ÕÉT'SLu2UgªÎT©S ¦L5™j2Õdª‰Të.Ê‘jÝ yGªuåHµî ©Ö]”3Õº àÙzkè"ä´¼ÈZK÷Ýë£~yÀr•—«þáßN‹‹ìé‡Çûãí»ãùCŸ¯o¿^º¼"[¾ôrÍÔš¹î|ÎóÑ—Çi?H.¿Ñ©¾sÜåŸLWe¹£ÜË…å“å‰ò9Xn,”;Su¦êL5˜j0Õ`ªÁT“©&SM¤ZËéPŽTk9É;R­åt(GªµœŽä©Ör:”3UaªÂT…©*SU¦ªLU™ª1UcªVª-³þš|v–+ËåÞX.,Ÿ,O”Ç`¹±œ©&SM¦šHµF®PŽTkä åHµF®PŽTkäŠä©ÖÈÊ™ª0UaªÂT…©*SU¦ªLÕ˜ª1Ucª“©N¦:™êdªÎT©:S ¦L5˜j2ÕdªÉT©ÖÈÊ‘j\‘¼#Õ¹B9R­‘+”#Õ¹B9S­g/,'}9‚ ÕrºÞz¯³lŽë].X2k›Uwãùù-r¾ù¿¾¸þòåÓÍ»õ†ÿùƒÇûßï7ƒ yhZûäˆí|‰óÑ› ûqX OËѶÇmÇŒåòz|3É•åNòQo&¹°|²Yž(¯ç™‘ÜX(¯ç™‘\Yî(ŸLu2ÕÉT'Su¦êLÕ™j0Õ`ªÁT“©&SM¦šHu4¤:R ©ŽŽTGGª£#Õ1êHu ¤:S¦*LU˜ª2UeªÊT©S­Ø*myOß{»ßæ‰òZMrcy ¼V`“\Yî(¯Ø$–3Õ`ªÉT“©&R•†T¥!UiHU:R•ŽT¥#UéHUR•Te0UaªÂT…©*SU¦ªLU™ª1UcªÆT'SLu2UgªÎT©:S ¦L5˜j2Õdª‰Tµ!UmHURÕ†Tµ#UíHU;RÕTu ULU˜êòvµN-ê‘5›½5ºs`ïsgd­æ±nGÖÞoÆÕÆ‹qµÍ1§ïiî=¹ªÞhç¨ÉHºsàæjºÞhçÓίÈë–äÊrGy½Ñ’\X>Yž(¯7Z’Ë™êdª“©N¦êLÕ™ª3UgªÁTƒ©SM¦šL5‘jM‡C9R­ép(Gª5åHµ¦Ã‘| Õš‡r¦*LU˜ª0UaªÊT•©*S5¦jLÕ˜êdª“©N¦:™ª3UgªÎTƒ©S ¦šL5™j2ÕDªë6º$Gªë6º ïHuÝF—äHuÝF—äHuÝF—äLU˜ª0UaªÊT•©*S5¦jLÕ˜ª1ÕÉT'SLÕ™ª3UgªÁTƒ©S ¦šL5™j"Õu]’#Õu]w¤ºn£Kr¤ºn£ òT×mtIÎTÙØÒ:j'O‹çÈÙ:j—‘™mïÀåóíŒÚÕ îí¨Ýå5q9nsÈé[ŠÝA»åïP,¿uŸ±sàvÐNX>Yž(¯wq’Ëåõ.Nre¹£Ü˜ª1UcªÆT'SLu2UgªÎT©S ¦L5˜j2Õdª‰Tkc-”#ÕÚX‹ä©ÖÆZ(Gªµ±ÉR­µPÎT…© S¦ªLU™ª2UeªÆT©Ö¢Xþ ŽÔ×äu‡ˆäÊrGyÝ!"¹°|²ïùàÍqËï·žc`cï¸íÈ…£¼Ö[‘\X>Yž(¯õV$7–É×õV$Gªëz+w¤º®·"9R]×[| Õu½É™ª0UaªÂT•©*SU¦ªLÕ˜ª1ÕZoµüçÞì5u-·µ¢ÚI]k­@-¨ž¨NR×:+Pª‘e"ËD–I,¥Ëu¨‰åº¼êõu'–ëâ*PËui¨‰åº°êõµ KA–‚,Y*²Td©ÈÒ¥!KC–YNd9‘åD–Ž,Y:² dÈ2e"ËD–‰,“X®ë§@M,×ÕS¯¯;±\×NšX®+§@M,×uS F–5íú4þðúëøõA^§´±÷eºô‹j&Hìng~}y©º¼qš¶åÿrìó¼YÓÎ’©åâi¹mmH츹$^.žF{žÚýçóåâ åÊrGùrñ„raùdy¢|¹xB¹±œ©N¦:™êdªÎT©:Su¦L5˜j0ÕdªÉT©Övæ(Gªµ9Ê‘jmgŽr¤ZÛ™“| ÕÚÎåLU˜ª0UaªÂT•©*SU¦jLÕ˜ªùzNpšûçóÙX.,Ÿ,O”û`¹±jMrB9S¦*LU˜ª0UeªÊT•©S5¦jLu2ÕÉT'SLÕ™ª3UgªÁTƒ©SM¦šL5™j"Õšä„r¤Z“œHÞ‘jMrB9R­IN(Gª5É åLU˜ª0UaªÊT•©*S5¦jLÕ˜ª1ÕÉT'SLÕ™ª3UgªÁTƒ©S ¦šL5™j"Õšä„r¤Z“œHÞ‘jMrB9R­IN$Hµ&9¡œ© S­Ñ¯ì™12­O.kÙÚrj¹s`·•oS.·µzZùöõ‡Í–NE›±sØÓ·µ3ô•‡ÚÊ"¥~7›Ã¶£MƒåÆò@ùrñ‚re¹£|¹xA¹°|²œ©:Su¦êL5˜j0Õ`ªÉT“©&SM¤Z3¹PŽTk&É;R­™\(Gª5“ åHµfr¡œ© S¦*LU™ª2UeªÆT©./µ±c[oz½"O”//(7–Ê—‹”+ËåËÅ Ê…åL5˜j2Õdª‰Tk&Ê‘jÍä"yGª5“ åHµfr‘| ՚Ʌr¦*LU˜ª0UeªÊT•©*S5¦jLÕ˜êdª“©N¦êLÕ™ª3UgªÁTƒ©SM¦šL5‘jÍäB9R­™\(Gª5“ åHµfr‘| ՚Ʌr¦*LµÆ²ÂZKw0hT#YšõÔä>vë¦ø’éf«']üf^»D}_x;¿üpw~qüp¼?Þ¾;ž?t}ûþüâöîñøâØÏ×·×??o/ç‡ÕcŠÆòfŸ:eçû9†ÍqKÚ¬¶”š;Çm϶å5ïˆäÂòÉòDyÍ;"¹±:ZÆò…öΣÍ.¨ǶÙsCýpZ›±ð?q_X·w—o­MËOñâèÍvH­?‰n;^þIÔ^’/ï(W–;Ê—w ” Ë'Ëå˻ʙª3Õ`ªÁTƒ©&SM¦šL5‘jÝèE9R­½$ïHµnô¢©Ö^”#պыr¦*LU˜ª0UeªÊT•©S5¦j¥:[W}U¤žÕ†ê µwT+ªÔÑP-¨F–,Y&²LbYwvIM,ë¾.¨;±¬»º¤&–uOÔƒXÖ]R#KA–‚,Y*²Td©ÈR‘¥!KC–†,'²œÈr"KG–Ž,Y:² dÈ2e"ËD–I,ëÆ-©‰eݶ%5±¬›¶¤&–uËÔƒXÖ [R#KA–u·Ö,ÃmïDöÛ£3ëýÚç‡õìŒ í ÍÍözëRmzõæ·/ïÊž>ôþúñúüêîëã—¯ç×îî?_?^9ÕrèæË_jë²óEχoŽ³Ã˜³µ©¾sÜö#P^›Ä’\YîK¾\‘ôÑ_“×&±$–O–'Êk“X’ËåµI,É•åL5™j2Õdª‰T×'‚’©®OyGªëAIŽT×'‚’©®O%9S¦*LU˜ª2UeªÊT©S5¦jLu2ÕÉT'Su¦êLÕ™j0Õ`ªÁTƒ©&SM¦šHu}"(É‘êúDPw¤º>”äHu}"(ÈR]ŸJr¦*Lu¹:Ñ©™S”œÈ×ÝíiÞúȽãF“‹úhW36˧ëêäù÷úàчw÷·—‡N?ø¨E_mì|Ž_X?·Â3—˨/ÿ,zýÜ"¹£¼~n‘\X>Yž(¯Ÿ[$7–ÉGCª£!ÕÑêèHut¤::R©ŽTÇ@ªc0UaªÂT…©*SU¦ªLU™ª1UcªÆT'SLu2UgªÎT©:S ¦L5˜j2Õdª‰T¥!Õš³r¤ZsöIÞ‘jÍÙG9R­9û(Gª5gŸäÂT…© S¦ªLU™ª2UcªÆT©N¦:™êdª“©:Su¦êL5˜j0Õ`ªÉT“©&SM¤ZsöQŽTkÎ>É;R­9û(Gª5gåHµæì£œ©®Ï:ðÖl²ƒõžkë­µÜû:ßÖÈÍZÚÖ‡ç'múÕ›Ÿ?m†5ò ¹|“Ò}çs¼8x3ð0iË_tuÛ9p;Na,”×|p’+Ëå5œäÂòÉò$ù:œäHuòŽT×ùà$Gªë|p’#Õu>8É™ª0UaªÂT•©*SU¦jLÕ˜jÍ·õGyUž(¯á$7–ÊkR8É•åŽòšNra9S ¦šL5™j"Õuz8É‘ê:Aä©®SÄIŽT×Iâ Hu&Nr¦*LU˜ª0UeªÊT•©*S5¦jLÕ˜êdª“©N¦êLÕ™ª3UgªÁTƒ©SM¦šL5‘ê:œäHuANr¤ºÎ!'9R]g‘ƒ| Õu9É™ª0ÕÖ™1èÏžn²9p´§­¿þîûï~³üÿÿÙÜበendstream endobj 2085 0 obj [ 2084 0 R 2086 0 R 2087 0 R 2088 0 R 2089 0 R 2090 0 R 2091 0 R 2092 0 R 2093 0 R 2094 0 R 2095 0 R 2096 0 R 2097 0 R 2098 0 R 2099 0 R 2100 0 R 2101 0 R 2102 0 R 2103 0 R 2104 0 R 2105 0 R 2106 0 R 2107 0 R 2108 0 R 2109 0 R 2110 0 R 2111 0 R 2112 0 R 2113 0 R 2114 0 R 2115 0 R 2116 0 R 2117 0 R 2118 0 R 2119 0 R 2120 0 R 2121 0 R 2122 0 R 2123 0 R 2124 0 R 2125 0 R 2126 0 R 2127 0 R 2128 0 R 2129 0 R 2130 0 R 2131 0 R 2132 0 R 2133 0 R 2134 0 R 2135 0 R 2136 0 R 2137 0 R 2138 0 R 2139 0 R 2140 0 R 2141 0 R 2142 0 R 2143 0 R 2144 0 R 2145 0 R 2146 0 R 2147 0 R 2148 0 R 2149 0 R 2150 0 R 2151 0 R 2152 0 R 2153 0 R 2154 0 R 2155 0 R 2156 0 R 2157 0 R 2158 0 R 2159 0 R 2160 0 R 2161 0 R 2162 0 R 2163 0 R 2164 0 R 2166 0 R 2167 0 R 2168 0 R 2169 0 R 2170 0 R 2171 0 R 2172 0 R 2173 0 R 2174 0 R 2175 0 R 2176 0 R 2177 0 R 2178 0 R 2179 0 R 2181 0 R 2182 0 R 2183 0 R 2184 0 R 2185 0 R 2186 0 R 2187 0 R 2188 0 R 2189 0 R 2190 0 R 2192 0 R 2193 0 R 2195 0 R 2196 0 R 2198 0 R 2199 0 R 2201 0 R 2202 0 R 2204 0 R 2205 0 R 2207 0 R 2208 0 R ] endobj 2083 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 2085 0 R /Contents 2209 0 R >> endobj 2210 0 obj 15325 endobj 2212 0 obj << /URI (http://www.loc.gov/standards/mods) /S /URI >> endobj 2213 0 obj << /Type /Annot /Subtype /Link /Rect [ 368.094 696.671 396.984 705.671 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2212 0 R /H /I >> endobj 2215 0 obj << /Type /Annot /Subtype /Link /Rect [ 402.166 696.671 523.276 705.671 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2212 0 R /H /I >> endobj 2216 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 684.671 141.67 693.671 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2212 0 R /H /I >> endobj 2217 0 obj << /Type /Annot /Subtype /Link /Rect [ 151.4 597.953 169.17 606.953 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2032 0 R /H /I >> endobj 2218 0 obj << /Type /Annot /Subtype /Link /Rect [ 174.46 597.953 251.13 606.953 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2032 0 R /H /I >> endobj 2219 0 obj << /Type /Annot /Subtype /Link /Rect [ 145.55 73.618 176.65 82.498 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1824 0 R /H /I >> endobj 2220 0 obj << /Length 2221 0 R /Filter /FlateDecode >> stream xœÍ]“Û¶ñý~ßâÌø`€ßì£ÇI&m3k5u&ÍN‚$Ö)“”Ï÷ï»À.>ø!]ÝæÁÉdnw‰vû åãˆ8ü{¯ÿ”©`eYEÛÓÝG¢‹¨ˆ£$'RÆYgœ'Qœ²8‹NÑ””E ð„@l!ø3Y ø1úç]{Ç£î~ûÖì"|wüÊæf«wwoÙhÀ_“|<:ܽÞܽú>‹6{oâ$ge•WU-YWúŸ8Úœ¢ß^lº®¢}×G½Ú«^µ[õíïÑæÏž;®XRjnçñ»lwQÛjˆN²•uRíˆüßm&6K8gå×f²·Á劢`|îŠð_ʤwÔŸ&‚ÌQ„ëüfóæþAjç(ç¾Ûªa¨Ûƒ# OèNÁ±?îøÔ]Ü«—ºWoåI g¹U»YŽU©¡»Œç‹–bª²B|éÇ£òøDD$=ÖãÑ!Ãö¨NÒé…ÄQg®—½ Ê:z%}õ}5¿ž¸ŠÏÀË*¾’Øî[˸L§<½ÁèîÎcmîÚŠëÀÚ6²÷"J9¦Qûú3CaŒóÄè Y‰‚Å%ç\LäQ W$UUÆ9JQ³œE§n7ؽWœ¶Œ§ªyfk9eÊÊèŃÜ~PíÎá½ûZ}R~Zá¥C¤_#[¾ÿé¯~y·½èâë·‹U*g¼•S‘.5øéooÞÍ(U™r^Õ’ÁóÛœ-áLäYUfB,ÙŽãxþÓ«W¬é¶ìÐ}z5ŒP#e¿^-c¦Lfüþz|î¬X®«o)Šåúßg‹‹d¹T¹Ïd8 #æ t±„…°„¢ŽJ¯ý¥ñ¸ú¼=Êö <Åe+{ä¡~hêîÐËó±Þz²v@ž Á~xÙ„\b¸qVñìS¬ØóF§BÜ`ô'»0¶buË{¬²» ŠÈg̈ò¡IlZ·CýIµ~Aô¿Eºˆc–VP[ó¢B½`˜|TŸŸ v‘f¬ÈsÎó´˜D{ª³ö”òô§z§Üg—âSÊðà£Ú bv6 tìÒcDµ˜kD-A{‰ÎýÌB·&•à6*8ÎI¡ ¾¼2‘3½ÉßòLW:‡i,@ˆ“Õ~<Ÿ›z+µ“ çám¯ä¨&;¸XP "6ßû¬Û¬‘„½éZÙ‚þ¥½ŒÇoæéD«)eªú^žº‹>)K‰µ¨$Ip¼,Yáܨ÷³õUù‘òÕr=1Ϫ‚ƒgºŠò5ù‚´:^¬ës~R@Eæi¹Æ?O“¢„ã`Ï q]Èñé¬5ŽX4û&FØÆ8Œ7ÙZQrÆEÅEœf+ÝWÓ“éN®sÒÁ.9i"²6!V6  ’¿Ý0‚ÌJŒñ?)ÅìTuÓD°{}h»^í¾4_żb± Óû|U²h÷ˆç²UœÀÅ•óðFÊVY:¶¯;Óôݦ±0°ÏcÅL5Xtô{|¼¨þÉ"½.Íh1éÖK Üè-¡" CV+Bàéz› SÓ=¬ ªQÔ1´nRjC¬ôëi:Û1h¾@×zi-¤!odƒmÞ0ÿ®öo^Œua Ì$hœ¡€œû³¡¦À‘:Ê hº#å¸8ûAê¶õKºýŠZYjQ[æu‘í†F6žî6öAÒãÄ!t¦Ú!Og¡à€m«)iÜènÀ/ŒTÛ±yr絃êƒCêvt{K ÀÀpÀ~ÌlAWµ¢^ÎôÐA³£óWwR™ ]H jsD3"ˆ³!­2#Bwd`jùiÇÁƒ^ Ó7]0‘B/ý¢útn¼èØ@,vÚöõyôb¬ôf:O rié^µ5ãŒåî Ù×ý|kêÖt„nÂ¥W€(`.ÔïY.VD¸‘øumºÁéÏö)â.ýþÈIE€0Û7XÝÑá‰ËgJ$ÈvÂÙ4ë'Ørª^i>t]›jäôH‹)úÜʦ1r#:/₳¼€’|e×Åq¢+ üMçŒIŲL75e¶ÂéÎ3Qˆà®tp©‡£ttà¾ïN‘퓃Hu½ÿ²ÛÕ¶O¤#ŽÒïr’žÑ˜ÁVé0•½ÿ¸»¨5!ÏDóC3¿£ë‹©’µŽ3DúCݘ'(}oE¡ûF¬ ·êÑ#A}EÂ'ÕZæI?Žþ÷e°“’mp iî0å[¸×ÖÁ&³"[í·Kļ, Çîí²~TÙ̪÷ K`+èÅñò.mæd¤ma´MÜè—·@Iš°JÑïG¾ª°zvbÓ}A ­a•û†=PQNf2ÂÉ^Eô“#„Õ“'Ž!÷ O&^›4V˜`rÝB5 Š´ðj …äÌ$ˆTðQz0t9Cx¿ÖÊ$ÐýO-´2ŒRScG%MzBÚ áÚKlôw&DÔ¾»"†SÂác+R&E•ØÑpÄáB¿¶á´¢`%f ¦ì362)LT£-‚UÚbT§ê$<Ñû h%löüjÉ^×— µÅlo„ØõWœbG@xY±¢í­ÇØ"¾Å*é꥕­ ðº e•ËkHy2Ûþÿ}½I¨azðÍy¤¨l 2þl.H3J`_È)“×›û¸œÖò2ìÊ :¿UM âM£¿dÌ‚¶í)Ãp ¶õÍÛ¶;E^ár–c+vγ™V¿‚Kë^Z;—q©«}Ø/Ïè¹b¹Ï Gq~‹3"÷§!W‘‹·»èñXo®8˜¦ ª)¤Ûˆ¦´á‹¤JX’§ H>ïA»ª~Ö?2({yRâ Ö ýú—úÝÁTDHà:HFf$ŒáFnlFç`± á+çÿœzøz¢à::DUVE¶¢]}Úkè®§‹Œßâ÷Ð…1O±.¡MKïÍâr¶+¥±‚˜ˆ“ªA4]±úËÖæ,âÆ+)íÌDÃ3üK«GÓu!ÒDêöWÖº™ÑÍñÆk ?4Ú3sL¦jü•…æjDp²ñ!$œ®‰‚¦¥_¦‚¥áŒ”pʶ”18IzÐÏÚ‹_¥ìQO¡¸§à`•+¦Èâ¹gLîØôñ¦˜#ˆ¥<¦9û ”ƒiàFÄDš ÜÄ Ü´È܈b_ìdîØO´>˜ª—2š™zÅ"`´yëi{s+Ç—9ã:Q'<[ÙàÆh]•·m†§9Ú&pú½ªªÍ‰À+h¦_wKQ<_AElÒzöl^ÏEÆ’,ç¢äÓ_mîóx6!!¨ýH˜W¤RBFäg¬þô…Ñ A-·ø.)ò·ï< *þÒ]ò¸˜©ý_5UÊ*ýŽÊ±²Å­ž€ç·8ÿøž ÷®sV$ùÌor]{²¬*Eš9¿IXôÝgHŒ0ŠÒÿ‹E×A5ûYg*cë7ù’z÷”k N Êþ%\ GhoDØ3øe&;ˆb2a ª¬¼–`äfý Œ9ál¶õÛÀ­ŸBs–ºq»™Ð?'ú~³¤XZá~¼þÛqœÜ`ôJ÷XqcpÈ ßЋùyEÂ2›¸Ì0;këÝpâ %^pG:kCFcÁÿƒõöî?ª&ÑÔ endstream endobj 2214 0 obj [ 2213 0 R 2215 0 R 2216 0 R 2217 0 R 2218 0 R 2219 0 R ] endobj 2211 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 2214 0 R /Contents 2220 0 R >> endobj 2221 0 obj 2842 endobj 2223 0 obj << /Type /Annot /Subtype /Link /Rect [ 136.94 629.945 160.82 638.945 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2206 0 R /H /I >> endobj 2225 0 obj << /Type /Annot /Subtype /Link /Rect [ 194.77 566.561 334.26 575.561 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2075 0 R /H /I >> endobj 2226 0 obj << /Type /Annot /Subtype /Link /Rect [ 342.703 566.561 523.273 575.561 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2075 0 R /H /I >> endobj 2227 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 554.561 180.28 563.561 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2075 0 R /H /I >> endobj 2228 0 obj << /Type /Annot /Subtype /Link /Rect [ 263.447 503.177 285.667 512.177 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 56 0 R /H /I >> endobj 2229 0 obj << /Type /Annot /Subtype /Link /Rect [ 291.427 503.177 471.687 512.177 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 56 0 R /H /I >> endobj 2230 0 obj << /Type /Annot /Subtype /Link /Rect [ 137.549 435.766 162.529 444.646 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1713 0 R /H /I >> endobj 2231 0 obj << /Type /Annot /Subtype /Link /Rect [ 138.383 378.442 169.483 387.322 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1824 0 R /H /I >> endobj 2232 0 obj << /Length 2233 0 R /Filter /FlateDecode >> stream xœÍ]oܸñÝ¿‚秤°i’ú6.îš»6EÚ^âmï‚$Ü]Ú«Z+mD­7Œüö¿)­œ\Þ’Àð ÅÎ ç“þxBÿçêW™R\–ZmO>ÚuŠ †’Ü.e§,#$A,Å,C[4^ÊP41À¿F{ß ßOÚ‚þvòîìY#t‡òsÍêêäu$›Ýð÷$A7'?/N.~Í%hqLœä¸¬òªªÀ¢%NX¥þ1´Ø¢wO]×HtÝõ¨×¢íJ<ý€ÿÔ¬ÂI©¨)œG&ä¼]£¶„D[Þò±í`èYŒl–‚ËïÍd¯G"‚ËEÉÔá'ʼnYƒÃQ} 2EÍ)££ùý¨ÈäHb |ì…ßp;`^à‚Òª*ª >áräBŒä_ò˜ïF½cgaJ.Í”0Xì­ú ¢f%!„ެ ý¨°ÊÝ•r˜b$W}kŒ Œ8cÁ´D „n©HK¼ØôT…g†ž!Z.ùêV@h:|×wwõ¢Ô- m·vûÁ£ÛNDîë/›°Ye ßÕâP·77‰Àau‡‡sE¿­[Þ`¿rËy,Ö$àrÆv6}·¿ÙáyZâÒgÁä¤> Fz‹,…VÔb½ûf8¬üGŠ€É,b„ºøµš^£ .iVU)Ë=WÆ9§à=ù×+Çåè²YšâJ§ÜŒs bÄÊ<.RVaV)§cÅWDúéÕdªrœæIUVsšE2톺ked¸.ÀëZî~ÝTÓD¤Ëÿ‰Õ ±¹r®cgÈÙD’Z¢¦noÅ v!Eè—³"˜æÊì%‹Â“a´¶ÍדÂÕEJ#eŸç´R±ž·åÊ4n©þoÅÚáË{ ›ZúUȆÿ…º[jî?pü}ñÏW^w«½*ÍØ-Xßžg¤ô_:íúº Eʲ‰Îm½Ò¤L·AK©p—ô·¾ÛZð¾Û÷<ˆ¥…–}w¢Çý7øB¨µÔ 7®¡ É·ä»]Sû¸ô;êuè˜ä^w¨±6žÑ4)&š^ `0Þ—CØÂñ;CÀ—ÝÝÔƒKpmªÜ7¯f(t[&;Ðoæ—8@ž¶VU‰W)a³÷¡6ˆ£¿^]¡ëºßêú4Ïp–H\eù~‚ѧ?åüe…iŒÓ"9?+pU‹‡3ðo´—i1m³™{†Fɰ(`ìB|ððg¥Š]wFÞøhu¡vìCŒÐ‰‘øjÕõkSBÏYNqâ‚Î!V^ƒMXRÆp¡ÒUž§3̃\†ú¿“]ô¼•µÊH¼‰–_,^Lûȱ,Ÿ©Šb昈öÝ”² ¸ ÐDZ*™¡Ü Ãîòââp8àC‚»þæbñæB»½1,x>cHHµcVC¤ ^ë©¥H‰Y¡{1GýaºRœSИätfû·ÆK ®’Úß,b+…Ø EíñØbV²²£¾ñÓ®ZÄÞ^¸’`¿Ï)"//lKV;REqš .KfŽû4Sz•UòHŠ4›!1Çù­ ¯"ZÍY€9t½ÄŠÂJ@ÞÜŠáB qQ·kñ ‡ŒFܪÂyYèdØ ëé §$Á„æªÒWŠï"YžÍ¸`‘Oh”Áuú‚<¡àºÝùd­¹ø4ÀU ;/GN”‚ùº€!}ì? Ç*ÒÐã€û€ó¨ ûq/ú{ÔðöfîW'ˆ„aR@+X’,ÎÒÐÎÑÐAGÓ”†´‚i(Ÿáp#¸°GÛFh©2¦´$™!ög¯ºí–k?6¸öoÂ貄 äÞ/ ‘ÌvV1ÈFð»:Ú¸—b==û…·Ý>ÞŽ u*6 tk}-îĬþåD;J½üXéa£;¬$QÕâ^KaàU×4Ðk¡ÍŠ1‰%¿‹¾èH6 ‘ÄÀkÓ—û•EçÁë:bÇñ¢xÄ÷C½jO]x­ `^— ƒ÷¢á#y ©< +Më:cŸ,ŸØgõ™¡ñ¶7 ¡µ‡´oL¾ŠO;˜ßüÛQjØ„ˆ£mÄà‚Ç3µ×£à7âúÅÏÙCðör€;ÑC¢^3ñ£Á뺗žPÂ=š^ß/ É¬—³þ‘—Sý»Ì.:sì•y‘¼_mloÌ[VPiVûL2~*¨pRA¢Mh1jÇà"’/EzÓÔëêÀ1õP æb½À©¢¦¡LJ`· 6P-f 7ÝJYÀã>‡ú7SX´Žà;sñ“õ¶n¸(ìÊÈ&r'Võu½Šè»ëH¨MÌÙjpløšœ±Ú‡"`)s5]ä~)\a; ë-ßÚW¤ šn(…ë …šÒà“Ò7‰4ƒ®²„î'+£V^Þ·ÿ¤}O »$¬6 Lkê $Ò~àrÆ6ÈF2B‰{ýzÏX6Ù—Íí3©:­0å•n½ l¥p¨ ÌÛû°^‹f-=Z&uØÅºÁâDjV~ ¸‡ôŒNÕcå«áÌc÷‘6¿Y º öÀ ¶NCl—ÓBYªÌ'–êZíÒÐoZµfæ' ÛôhíØ£W0n‚³›‘D¯4õm`úhê`ŒB“«òXžÏfÚÏæ/¿3eàÃL½“b†ç ãÊ!‡®¿=ó˜þœÚÞšW( ›êÿý’2ÅÐôš÷¯¯êwzùòÅåsrú¨šêöªr¤nå ¸z¹BM ÅDOÈ*É»¬áü½²Þ‹3¤S“Ò² GîÄüH ½ŠšX>wvÓ ›è¶H $šcÒ÷OgJP¦{ý šlJ¿íÇû~ÑyÛÆv=ˆ-ÚØ–Úäå›7¢Õˆ*’ÓT£˜ÂÄUdàŒPY ÓË?Þ^¾{öðùá‡g?|~øñùÃðóìáù³NoÐz¢8dWœ)ÅÁ±g˜šôçÈ!Q§#j˜3è fLgh~ç}ÙZ•0­Â¸]–ŤzWºøìû^U ¿PowþÛ_4ë¶~iØe7G"ìˤÆvõê6BÍ““GåŽC—‹ÃÂo*5EÂmùm„É}aª³šÜh›2ÑÖÆ)c8µ}Ÿ…m˜‚×€Ñnß‹ ¬^zØ€[éýÑ–6À¢ï—õ:Þy`÷>c>ìÀ'‡®„xÿäôÙéYÀO?Ÿ七Pæ lbiÐ+ÕHv-[@_^Ø%uƒÝñf/ºá»°¯ò•o- =­1¤AõK¢Çx´OYì,àu»jöëè÷^?'®ºþ¸ï‚¯š¥-ïo§Ý±²†úkíÈp­0Ð1™FDߢ}üT¯!²ár3ÍGò¦X–©·Y,«ÖØ*,œª„qêѵp}¦Á‡ˆ64Z~7$i¸2l »èL×½dÆŸ±‡cÑZ¾æ}ø¢†_=îZÖzm8¶ï¶3VÈŠ‰”&o^^!×ÿê{Áè·NÊZýÝψo„€Ãm²5ºC±/J\¦e”î.o/CÇ9ºÚŠLö.îwAt q÷Š£¿ ¿>ù?~LÛ endstream endobj 2224 0 obj [ 2223 0 R 2225 0 R 2226 0 R 2227 0 R 2228 0 R 2229 0 R 2230 0 R 2231 0 R ] endobj 2222 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 2224 0 R /Contents 2232 0 R >> endobj 2233 0 obj 2676 endobj 1824 0 obj << /Type /Action /S /GoTo /D [2234 0 R /XYZ 72.0 308.039 null] >> endobj 2235 0 obj << /Type /Action /S /GoTo /D [2222 0 R /XYZ 72.0 489.677 null] >> endobj 2236 0 obj << /Type /Annot /Subtype /Link /Rect [ 150.83 162.614 230.25 171.614 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2235 0 R /H /I >> endobj 2238 0 obj << /Length 2239 0 R /Filter /FlateDecode >> stream xœÍÛŽÛ¸õ}¾‚H $[Ä,o¢¨¼¥Ý´‹b±ÙÙ™bÒ) ±i[ˆ,9’œ£i¿½‡ºRE;yÊ.v‡‡æ¹_xŽéO7øweþ(A±RZn>µû… qÙn Â˜è€Æ[JÇ^°nFgÞ£ßo²‚þ~óáÎl¼§²@¼&uwskÉÖ€õ÷$A»›¿Üßüùo¢Ýos‰U$£(‹*ÌYdþaèþ€>¼ºÏó´DÛ¼@…ÞêBgkýúÿÇ€Í"Ì•Á¦ÀLÐãlƒ²¼Ò%:ÄY¼ÓU þ»û‘Í8!X}o&»‰!†!&ÓP„ÿæÍì4ÍG#A¦`Ãe´ÓhÐü]™Ì$&¶Àó(ün„[@âÒ( £>ÂjB4¤¾ˆùnÔ› 3r,ë­¢U>š*/Ô,éVy£±ËTdvu‡áèô4ɧç·Iª³øÐæ±ñŠ‹œ'óïERiTí5ÊOÕñT¡*oyƒ=jëI£¦CG*ÀKà0B•£H\%˜‡J²²Òñå[#UYm@DÜ ×{Àm~Á0áˆA85öï³ÿìø%Ì®õ@ &ˆoG õ›\p̘±csÂWIÄõ°]P‚”I¶CIõõÞr *Ùz£ôycvü’7fp¹âê’/T8AûM:é²B?@%²¯âÍ&©’<‹Ó~k[˜3ÙúÜï$Yà Îá~ó…9÷¢Eþ9ÙÀ•Ùmw÷\Ë<=UÃFv:<ê¢ÁøÝ²¿°mJ¢¶jQ4QmgUœduœí’Ï:Cõù)/6½(tÚˆ[èc^T%Ša•‚FŸ5ôMÀÿ븂¶!†À•Þ˜ºzÒ:›Ë@)Aià:pÄÍܵ8”s,”å·U¡žÏÇKž¥"˜à½MW4”8“‚ Ž‹ÝÉô1åhO[Ѷ8ºÒûÌÁZŸ²äÙAêSÛA‰B—%µù´OÖ{ N“C2’© ›jyJÇŸç7áĬë½Éå6JÜåËl©¢ŠáÐô’! ü_ û[Ì_À`$À2€B¢BÕ`Üå#8“PÑ^mâ*~ŒËaCg»$Óåë~#M>ŸÞÝþ wÔðá&ï—Іöëòt4ÁÛÃÿ¬Ê꜔/´|{”xÀ+§Ý°Ñˆ†SnF=‹NW1m‹Ží*p À!2¤ ±wÏñá˜ê¾(ºj( 9&QÐTê¦*"4÷öüÔŒÍãúÍô¬!©‚%’ÔÕ?Ì0vºúø„VùKÕs…^þûm†ÿ”þñ¥W£(œ²_Œ*8ΩÂ!„¡ŠHk¶û}R?à A;Luéà§¤Éø(úÂÞÀq¿Jk»®´í »S­ß05·Ê*.*‹mµï‰É9á0õ B˜Œêü‹1þ6ƒÿ‹) 0‘ÁS¡ oÙR_LaÉÔ–Fy]UMt‰+h§¦ â¦i‡–BHÐ’9°^[–ÿ8Í4ãe¸Õ\fI±‹™‚974W ôìsÔ×õ}óÔ÷¸MÁ4ý‹Lƒte§Å(ÃÔ\e|ìØ÷·[J` ޤBºäžtáFcé"”ò€ù±ÿýÁ‘û.Œj ¹?Çh* ZýµU ¬Û´Z£¥©Å«âËÚÕ½|󭶈½øeÎ[ç¸RSÁ|UA@7AM0ÙÿI×wÀùêiX§¬_7IЬ;êᬽ§ ¦Œ·lj•%£<ÄQF›9rÏ|¨Z ¼-òƒSÊr¯Ó÷à½õQÕØV´Ž~Ýö•Nšv/ÛìÔ°Yê¸nE:Õ©ÈôfG‚±‰n}_iÚ¸êzi;ÈÜÿØõY dâ¦m±š$³Qu¹nça˜µÍ\Kp½†­ñ3S ÀHœÞ ¯mÙæ2‚Ã\L¬aM†D£RUBÇ=€e¿,«"ypÓoäÛ-î÷Î:?uµê,´‹à!/ìSñ Dž <ÅçáPÞ/ã¢0#@ƒ0ïðnÎùÉ-uŠÓœh`w¶5°XB…•4YwËœàj½˜ñ!œócç©V¬|X—íê¸éÒòäJ¡ýQæ+2)¤C¦fÂ^TˆÁdäÁˆm¡Éqlóƒ ùi·_а›,Sm¿Ö{Bpè'\"{¼'÷ N½çˆ½@ÍÒ²ntÓx£rŸ?e(~Ì?k»sg“Î](Š£p!ˆþȬaÈÑìD`Far¼Å¹;gù±L¼—`À`‚Šì™mÂÉà$c.@ôêÃ"»(Â,d„p:H¬6Ëw¸Óƒi1÷$ VÌtVREݨ¸,ƒ Œy¡[˜ÿá* ÐÐd"4º‚I— Þ-³W‘ó:DˆÎ@R ¸hrs™-WÁ}ø×™€óºÕçËûeöRù0Gì=ü¡1f”3F]qà© ,’>Ì«\À ÃŒ·ÖœFÛ¤-ŠPÓ_F·Mðå*o˜> U¹Srù)Áôèˈ×ÙÂ|Ý5Ž@ã:'W’›<•Zx°¿ÞB@~K/Ê\Á½š×ú:ïñ¡åoþa®¯å2“ºÏJŒÆrN1…KF‚ °a°`0øÍÑ,zꄯ‡„m…ÿ|X–ÄÔM½ ãb½¿äjro†‹ÐäÉyX )O¸ta¯¶ËìáÃô¼°Qh ä2¦¿Ò)âÃ}ø¯¯s)–¬}‰ü‡öÞýmPqL‰ˆí[ÅIyLãsý^V?¶ÕßëÖKý\ÁDWÛ5Üü¨¥º§˜¨L: }º3KO¢2È2ÉAqsÇ̤º.D8‘@„EJ1—jõ7$SÑÖ§¢hƵìiÜmüf^{¼Ü¢0¿R% fò¯›9y|ÖŒçÝ{þÉ| ô餋3JãlwŠwSVÆ4pø³þ±RŒ6CÔ? zå9«âgŨ1*jŒê{€‘,¬ºCNÛ™ì}M´¼ò9[ p. šoq/õ§’8Î_zОcŒzÐå‡OH¶ â¯fä·]ÐùË "Hóë/]äœà¥n˜ÁÄëA¿ö7P˜a²³^=“¨±ñôøEOƳ¦ÇÄ‘#Þõ:Ùžk#÷yfý¾éöæÿÄ3A endstream endobj 2237 0 obj [ 2236 0 R ] endobj 2234 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 2237 0 R /Contents 2238 0 R >> endobj 2239 0 obj 2526 endobj 1713 0 obj << /Type /Action /S /GoTo /D [2240 0 R /XYZ 72.0 243.653 null] >> endobj 2241 0 obj << /Type /Annot /Subtype /Link /Rect [ 234.65 358.712 296.02 367.712 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2235 0 R /H /I >> endobj 2243 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 97.488 198.591 106.488 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2235 0 R /H /I >> endobj 2245 0 obj << /Type /Annot /Subtype /Link /Rect [ 423.15 97.488 456.47 106.488 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2244 0 R /H /I >> endobj 2246 0 obj << /Length 2247 0 R /Filter /FlateDecode >> stream xœÍ]ã¶ñ}qO9`Wå§(Ї4IÛ4I›äH‚»E!ÛôZˆ,9’|{FÓÿÞ¡(‰²DÑJŸ.X’æ ç›3CývG†ÌŸ„“(IÚï~ëÖ ’±¸[8âT`Ìå舮—Êf< ýþ\í…ùýtWÜaô·»wO°g‡0À½Üáä-ª·w?Œhë6ÀøS¢£ç»¿<Þý鯌÷NÄ,Ž+¥@¢IĨ2ÿPôxDï>{,˼Fû²B•ÞëJ[ýú =þÃAS±Ä@8OÀÓb‡Š²Ñ5:¦Eú¬ºh,üWW2cGɧ&²®H““RFxjŠð?˜]ƒ‹ÑütEÈtjO¹Z±Ø¿‹$ãÅxLðÜ ?â– 0–‘$D)©ü%W&D$ YÌ'ÃÞÜX¨¡ Gq»TuÌ«)ó<™9ÝÃW–cŸ¨ðl7ê7ÃÖén ”O÷ƒ—»¬x¶`F+¾sâ¹3¿Õ¹Þ6è5zP„þYsÐn²=¤Uºmtå–úƒÜЉ#~ðòÜœÎ#Ü»´IÝ,ÛÆ£]Y=‚Èöm€ý¼¯ÊãÂyÿ&­õœÚhß@ŒF Ì “„YIüRž “-çiá&•þí¬ëÆ-¤ÅÅMƱ+Í!m¾”çÊÍòr›æ£i¶É¶eñÁ­ÔçÓ©¬šÚ­¼ÿ¬ÖÚM{˳Ï!ÌQÐ.Q|ÎÞqÌQ{æ¿Ë“.’'¤B%‰”slU§þN0cÎêf.u ñQ¹Gé‡4ËÓM®Q/ÊúýëNc#Oó»YGÄÄ–[?Û‡ül¶ý–£Í²bŸåú–ŸÉdö£NwÈXk­Ój{@uS›±Ö¼H‘*ÂÆ_™ÌqŽIñA‰Gèñ®ÿ¥¨ÎŽ'ÿKzAM IÁCu.P~Ð;–_eº^«³Â(!>·dEÀ|™Õ§ˆIÑAç'tÔu yÒa5+ŒÜŒ$·åŒz·š4ÆLʉ±²#íŸ!S™ï¿e+sˆ<;fÍ»7å~_ëæé¦ ¸˜Àkà[ŸŠ#9D;;)ÎÇÌv^îݸÒ͹*@}ʉ@C¹¥¯GËœQ`J0“HRå¡°åpÙcæàï‰à`w¾ úv|®Ç„§yî&›Ë¤©u¾¿_Î>«êf ,؆%Æqâ#1Ì'A`w¾þØèb§wóˆH„œ@ÙÜúµ¹«ð_éaÜ«5VZÚ¡eߎËS“•E{ÑØ…€~Ácï&¯œcMwYÁÀ^zÄÅóùhïq»9;}wÝú‹Îó{/{½roñÆ$‡È è%ôóÆ!m @ç_ëë%Ës–c5ßÀUðkv:éÝ=2•á¯3 ݱ€ÕänqâÁ6U¢‚À]Eg¨G@Ú`ikƒ+ä[’ƒ-q¦ºàZƒëlÿÍà:ƒ0—_‘oÞų äOUÖèVâ]Š ·^Ï(oK†xU2N`æˆW‘D á@YQ7&[€€tÕ͈\«JE$”1„öuÇ¿Bz˜ï¿¥‡9Äj=@bx ù9˜gúX‚A²‹-²9æU4QLB8ÆŠ¨N“wdÍÿ¡¡"ΡN°ètòýMYI2RN‡«Î »|²ÿ¡ôléT;y9dnû‹®†]éngï]3±íÏö\õµ˜™BÜ®¢~b“ ‡Õ/YãNsëéÚÜΘ‡Lš°‰^%d©C•×Ç*+õ±Ša—6VŠ'}"ø6ä#óý·|dQCI÷`sþ[ªgDN€ßðÈI"ô…UD~AP\"S«ü¨,`Åh®£.ž¼€;À¤c”sÏ9_HäD¤¸=àBô@¢÷­ìô>=çÍû׊Â!Œƒneçystßÿ²H°@x,ü„œÎ›<Û¦&B0õµ$c*"&×%½],_§Æ.¦ÛošÅÀê󡹜nO&È5ìиaÂ%¿Ýð “¶,è†ùôóχ»_±É¦¿ª·UñêÞÍÍ1Ï?NLã~4AçÕ0·]‚nß0‚ ˜€]ÇÔÓ5`PF\1_Ÿ³¦%ÜàmtuÌL²»©Ê—<ìýýñ»oïÑÏöÙb’+0‰ýüÝ·ÈžsYN}!Âr~ñÉ\ÆJ(«q¬’Dt= €Öº·’ðÇ®‡%måv„w׵ܤ+ìì¸ïí“êÚ-eãq’9A&gÃz3Úº¡»EºyËK䮈¬/E“~\Aa×=Óçé a5‘ÈNƒíe ;+º¦É¶õç 0·Š¹©M•‹9ü‚ò´x>§Ï³jJˆ@œJlÔ»2›ª#ÎH„8bÝýÕÇÔ4P†–öø3õ³éû[Åæ~‰(1™9ã]A3F“ù®Jïw›í›éV8‘ÂNfb«˜à‹&³D*™<ëÆ¸/zhPëÇèÍß¼ùówpßêŠ =63‚O5úý/àSJ-C©DÿFÕe¢íÆÚNÏ0›³ú ÝŽ!ÅigCŽÓÎlPëÆM“š\aX° “õ’»º‡1‡3kÞ­[EÖ8»…_õe¿rB{5Q”a›Âµ %•{YÛÙÞWmìþØÛ¿Õ‚ [cÓ¤3éÇR&.U/kqÒ¾JÚwß^ŠòT÷žê¿*……Qa â;h¦ä„{`@LqÛy·xVWf ö¹ºÁÃf¹Þ…ä>9(·1”£„eŽÀô·]…á#@àøÓ Þ‰) LW ÷2¿[>Û”Ëk˜—,b¦8Š!á›cè“ðå„‘’üö)UQRl³UûËjÔ|]° ¹‚} jlŠá¿~ló¯@',È¿†yó y.\2Ô«ûÃr†LhrtxàtÊ"3Èøiì;}»|:drÈ¢gPˆKóé‚ÄÒƒ¡» – *îØÿ}ÈÒX±¢¾˜èqqÌC+äÀ¡ˆT&–ÇÂÇ$óÁ×(CàOóÛ(†xw½ÉˆèÁÄ’‘à¦6„klŽ#ÔR¨0f±ntô²Œ HɼTJîAqKD„ˆøÓÓ*ö!)‹ÆÂÇýò µ·Š{È?#¢„ùLLJÃ÷øämáã–uB0KȉcåC½|¼`!ÈU‚ `‚Tq¸l˜‡Í›®ê³…È@²N̨DBðæ^aML$!ÈUr`P1ÉfB}®8kBùÂMB(ÖI3Q‰Möã M êA"|îȦO2nø nœ9ìúϻЛ ?æý Ç’x =¥½7ÙÁ!$è ý޾Ãâ(6‚€|~ø ò$`›švÒ2dø»)B°Oÿ T±á3Le_Æ~ÙÖúí{å²Q‚Q€{PI}‚åÕGíËkk»ö¥ØŽûçîa¡/ í Ìh4ëžÙøë¥(µ$Ý9ê*ýl¡±^ EàVçÔƒo·A;N‡ÑÎYðÖv—ì°Q34¡f»º¡­ÕM‡®–¿ÕÚ‹zÂRÛ{íÚLs޶å¹p¥ïè»îZÜ9¸Þ†gŽKyö¨(¡T/©}“ ›ô ;þµ(_Üì0žûoØÚÙÐî¨Ç;º§;>ckg£§ »ÐÛF75Ý’ò<ú=Ý6gpЫ3Û&NÿåœÝ冧²®³M~ñH@ñ‰ò´zÖ(=M˜×:×½1:P?Üýƒô}! endstream endobj 2242 0 obj [ 2241 0 R 2243 0 R 2245 0 R ] endobj 2240 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 2242 0 R /Contents 2246 0 R >> endobj 2247 0 obj 2861 endobj 2249 0 obj << /Type /Annot /Subtype /Link /Rect [ 483.575 314.249 520.775 323.129 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1801 0 R /H /I >> endobj 2251 0 obj << /Type /Annot /Subtype /Link /Rect [ 234.65 152.951 296.02 161.951 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2235 0 R /H /I >> endobj 2252 0 obj << /Length 2253 0 R /Filter /FlateDecode >> stream xœÍ]sÜ6îÝ¿‚㇫3ãUEIÔGfúàÔ¹ž[ç£ñv’LÜÞh%®W}lD­íý÷Š”H‰ZíæžÇc@$Ò·3ŒløYð?¡‡­0ŒPRœ}“tŒ¹¾$ÛòbÛ.r<Ë!¨@CA9Èè€ÓAðgÀ ø}<+ÏlôÛÙ—¿'E6È=Ù”·ªîÎþÔl“ ÿHöÙèáìÕòìç„m´\«»¾F~EÑÐrˆÿsв@_.–U•3´®jTÓ5­i™Ð£åïJÚ‰,7äÒƳGâq™¢²j(CE\Æ´ e#ä_/1smÛ ´ý90–\–=^ŠðëY® Eh䆌Q1Ê€"<šlÛºÁæ*üaŒ;¼ýÀ 0Ž¢ Šà‘–ܹóøg.‡ÛÕ{펽†Ìfjl Wßm›¬*™p×¶ü–³~áh,ì…Ë&øB|±’S¶MvÔqï˜Ý H:cž„–ÃŽƒÍцfNå;ÇŸ·N ¿ïZAè€"£ŸÌEÌ},øcþ¤* ƒ¦ÇBã;É…ÜûlKÛXW»f»ã“PW»‡ÍÌðÆ÷y>q`êØ1aƒc{3Ò§Æ6 ,b‡°1W÷ðˆ\ƒýXt 4nâUÌŽ.mlG#É»-M²õ¾q§åT7±‹-Çu¡ð’ÎÏ×s~šüÇ5%`—UiV>õÔsG’w4§Iƒ^ E„!ç^p{$ÙÄuœ4´V¤n$EámÄ´¸\=Î#©°l­ÁWÆ4‰lÝæíñº®Šãu3eZkÚ BF¡ø\í¸¤´®Ç¥BjúmGY£q¹WˆAi6±Æ¼¯vµÂò*ܨÐl•%Uù¨(l·ÝVuÃåþ‚QªÐnuF ô Íq ÎâÈ›ð¯Ð]jýoµ¥åÁµéñ*ì( ƒ`BÒ%W€ îk&ÁPSµFñcœåñ*§¨‹&»qòŽ C+ò¡äú¬¹‹õìŽ3øî8C"+×Y~4³@®É} qªMÖÔ|éˆU}8}‘eó*  ¥º1Sé“9i -7°éàŒXVlažâ=/ç5]Ô»±ø*7l:£ìÔI…hù! äùžœ”ÍÑp¹ÞHæ:cÛŒ‰Ñ†æ[TPÆàÀè3P³’GŽÇRÖ¯“M#Ð*@k]‚~;·\ öc«ÅÈy«ôåeµ^3Úü}4 ~8l+8•}ÎH¹+V"? ¼Z+¸¦Í®.yÓÕQx†˜¥H7šÀLsæºÐQñ®Ö&¦­‡—´=¶ÇW_™²jt‘ø¼cºÙqž+dµ×DFóõ娬³š5§xç†PP‰™RÒwz¬3²jô"n’M_¢óÚC¡¾qn«=†ÔTú©µ4š˜I‰È@H¬jÏ ¢îHÒÌ\ƒÁ¾ëó652‹xf² CÑð]×øó°+de—¤L÷·[»þì‰æùåAgûi?ê©‰Ñ \06t¾ÛS>s‘3é&iSø”Áê]AÂÿšm·4½Düú„[\Òçfî<äûVÁ– ‰gŽtdËEs²hÎÌ~ez`….»Ð<×ٴš=±üG¬†¯v§œYù™p(ù±ÎšáÑ©B£^{WàpCs庠 ‡î„â“LÂ03:PV²†÷ÄÁ.Ö¤`äÉóàVè{6vý@ÎûÙy0øÎƒ!qòÝ+˜ÁVÍ5îo»ª‰ùžS¤"®¿ ¿.—6m·y¦ëÖ­kA"bÎ/a/î<’ÄåD<¼q†a}Šà'yÕ_ùãÛ~­ånBÍÍõÁTˆmPLä…œ)ÙÜF~hÄÄÙö½³ùëMeùr²rsJz3ÚÈ ð6=\•¹ŠWÜCí½xϳîÁ›ë|ŒóUnfeЉ°pBGÕhí~ðà`! †$51éd\Ú–¤pØîßvKX\dX=Þ^&tˆÆ=įžh™‰]$HOmÊ«| %ìéF ÖFF€‰Å•¥Àª-WÁ_Áh¢_•ʃ×iüdG"ß(IiNazøªÉóB+àäëFò§6^@,Ãq,"òåÙân®‰0ù5¦«êS[/ FÂw ¬uvúuWó;\Ø<Ýð›U®µ›‚§ÁCùÃ!Äò<ÈŽçMŒ3“@ø)4âѶy1$Ñ}»‚ey…’ ‹gÎ×s-/í¢©îýçÃo¥À .`Ï'Ó†lw«´Cï/>½¹mçŽ";ÎKôŸå›[ÿ4&\WÉ«ªúªQî~;ÆãN¸ Áºzq½¼^ðWKéý‹V#ÿx@××â ­‡ï/X²¡ElJ-_ßôð{O>ÀC¦yÞ¼»¾S˜xÓ‚¯²Õ’~šðËïfæKTSÞÓñ Ì÷SÙgâæ ÒOd[Mqå±Yt'Ö ßvFâKÙgâ³2•¯uµ-àFçízr¦H™—°Ð·5ëT“ÑbÊ·2 o}±a`$Û—Mü|‚…ò݉nŸ9?>öFI)äµlvCß'^%âX0nßî{QÛh˜Zøà{”ÇåÃ.~0>ôr<Ëæ7!žLÈZ]…˜øÐÅw¡¿ÇPe=,[š×Ï1}ÔÙ£Nå{¶…}=Ó~9cT4ñ1 ûc{][ OC“ Z°t•¼³ÚíW !‰"~ :ÔK-~h @ÚÑ¢A²Ð¢B -¶{(r´xnîÞ-Bà_`‚Î_^ýõò—Ÿþ…þ¹®(úç÷ª¤ì'tõö½üããË_’¬Nv9T÷{”fɦ®2Vœw¶L„‚xcӵϥøÏÿÓïq endstream endobj 2250 0 obj [ 2249 0 R 2251 0 R ] endobj 2248 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 2250 0 R /Contents 2252 0 R >> endobj 2253 0 obj 2752 endobj 2255 0 obj << /Type /Annot /Subtype /Link /Rect [ 166.858 431.966 247.586 440.966 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2235 0 R /H /I >> endobj 2257 0 obj << /Type /Annot /Subtype /Link /Rect [ 191.29 419.966 220.73 428.966 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1824 0 R /H /I >> endobj 2258 0 obj << /Type /Annot /Subtype /Link /Rect [ 234.65 116.39 296.02 125.39 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2235 0 R /H /I >> endobj 2259 0 obj << /Length 2260 0 R /Filter /FlateDecode >> stream xœÍÛnã¸õ=_ÁÇY`¬ò"’â¾m;ÓbŠ¢Û PA›ŽÕ±%$O´ý÷Š’HIí}›½ < Ïá¹_¨|»#ÿó#KI’e mOwßú}‚$ELô[')å3DÓ„rtBÓ-ŽŽ€ã/è°‚“³Ð?ïÊ;Œþr÷ðgvÞË^!Þ‘úr÷›Ç[Ö?=ßýñþîæˆ`t¿w*f"É”PJF³„Qeþ¡èþ„ÞÝWÕ±AûªFµÞëZ—[ýÓ#ºÿ«Ã¦*a™Á&pž¡çå•U«tÊËüYŸtÙZü÷1Œ“ìGSÙoÁ夔 ž»"üŸ&ÌîÁŽ¥h~5adÚ[&;Vûs•e¼àû /½ð‡anÝ…L$!JI¥àWI6q!"EÌc~ñ–ÎB _8ÝVÝ ¯æÂ§Ù"è6¿Z‰CªÂ‹Óh8 Gç§)p>?¿/ŽºÌO}«„îË`þå|ÖÏíA£êÒž/-j«þrPH§>aä I8K(ÅJ—„oâˆb!вiu¾CÕ5ÀeQ>£¢c°iwÀm2ð9Z#¤/°ˆr¸&e–ò§×²MQ~9ÑOðKªGï*PXíÁyý|1y°™ìi*ÊV×çZ·z矙 xëcÑ´þ}{øôÁ¾çÇ‹noçs^>kŸî)ó 'Ÿ«K3aÇØ~š³Þû·YiÝ>ÓͶ*½½´ÅwC;åà ÀdÇTìÇe©‹^wã9÷»Êíçå¸\JD‚U.ƒé’­¢4N¸v”Ó²c¤vBëê{±Ó»÷ãTÐÝÓÖn[}:·N¤N£ÃÑ|çö:¨‚}]–‡5å (;£ îÿî_ÕÅÛNw=7_0rÛÃÖÞÃï:özÈú˜][s°áÑA+Ô-êV4I1{†ù$òÝ®h‹ª\µƒîFp ¶ãKJa鯀ÄóäyzsëKc²Œ#Ñ™i&Ú2݃í¨d*]2´YÚ3S³3{Ô©qUb‚³%ªÎFMɀſX/„$i >.¹ÅùøšŸÎ.(B•‹¤i"1{ðpBK–ǬwýŒ0Áî”)nÛ‘|Ñ>+Gµj/¦°hGÊÆÝ‚c—8¯u 2ŠéLe½¢EVá¢)îoÕ¥Fg]7U™݈‚ 羯ә¯S ÔZB°ôuéR¶fT‰DMe"Ì:,%ëË[Y›û‘Á©2® ™IµrW †iϨ<¿{X½`™(’B—”Š…ÍÓú•DÅ0Ç»×+,4fIª2 @ŒI\“b@âúã-ÂKH{)5YO…„߮߭H óá "TØÔ2y— Ö (Sô[¤§¦+09_²ól"—süAzà<_)"vy›?åͺéÎ"è·ψL ¨BHÃ@þ°~·yÀXǼér–%"…&×Ðå_¿FÉæ šgÝd%0a$”jŽÅ©h~®öûF·ëŌɧ„ÿ<¬³br]†g¨ÎëíaÓ´54Këñej‰‹ÑQ$ÜS( 2˜‰öf¿~Oc˜‘‰Úôb3:D8Á}ü_¤ô0(œAÁâ™°Ç?èf[çhó a¦S³2–}Ýü“©>¶ä ÜõÐ}/`!ýÚÂüÜ—}»e_ðür(¶>åíº E²cz’•Fosm+SP8&"#}ÿâq{©¡qh½!g%ÞÞgÓ_ø4ªeûÊŸq0ÌÜÄ̾ÆbncFªHÆM ”$@êÞ'õí¢ë7a”¿äÏóçY"¡*€£©Œ§Š_ÕÈÝrçüÌmÚ7»žÊ÷V¶ùkø`î«Á˜Öƒ;'nch¤-äuÒvcè¸&š‡îl*œþv)` í íǼne¹6˹Ơ¢˜+ ú¬½ÖÍËE09˜).Yi¸ÊÄ€úu«Ï޹C>®‹qµ«lì™5\<,kÝ^ê2 MŒý`Úãôo>ú4ø÷¥i[&%TÊÕÒ™O±!’e0DRˆF9¤µ_;×ú{ÿý-Ô,ÃÔz(èW[Vç¯=‡.1¦éú;_JÒæßLuíD{‡ÿ2ÐÊD‚Ì-»ƒTB‘åÝ' \wµ…†2†z ™§2hÇ€ÄÕÖÙaqþª“9bˆ³)â?гž¼Iƒñz „ùb•b–¯¶ê8¡ß¬d¡žbÈË„\íÐ’ç¯*y1mÄ#Z†(žb~±¼¢ÇÒx£¤"NePÔ¿Þš¤Ëó×$]bøï¹‘—{HUJ ܇Ègó²é´-LÈ>c®{ žØdÿLf¢×— a'¨+†ð_ŽšÂ¼È¡—üͤšZoêK‰šü;dÓéo5 D`ÊRóÚ'¦3RD]àìSœEs>39:èãtÓ@ ‚ô+ì¥ÑœÑeQ7³~›e…‡ô³>AYœ¿ê/ ŒÐœQDFfø¶@9…iRŽõØååôdûF ۞Ȯm·Ý¶Ý1Ñ<Ø’m·>yñns3^`à°“pÝ §ÊÖí%²»ß¶ev=|²P?FXÀ¾“÷(m£û÷+ÚÙuÓÞ"Ÿi-(X.Ë8ûÝò¥$ŠìîÚ§å#6Wl†5«% qŸò,4Ø7ñö¬9{`|Ií ûJŸ½­ˆÁcÁ` $õ–ÜY_ŽXœ6W™`,€=‘È~°ô¶ _âñÃ`Üÿyh~¿*îhû«²¦Äûlò»e5"1ŸáŒ²gÆî‰þ ²ÿ×â|6ßîòþƒw cq¬q"‘ff0SÖòª+±§¢È(Æèè_·~ßT&ŒfJÂȼ:f¯g>ÁÔ ½ŸI•´éìyg³Ý²Ùή[ÿìä;¸Ý*üõô#xãÈÝÒ“=ìÆI»1aÒͨW8ìKªÏ_è 7™iÄNÌOÀwQö½D?ôÏfFÓ‡¦æï®T€ŠïW¦zJÓÄ|í^N–¸± MHÈô0ÛJ1ñÉw¾÷“?mÚ„´ûK;û'.ÿ|Çä— endstream endobj 2256 0 obj [ 2255 0 R 2257 0 R 2258 0 R ] endobj 2254 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 2256 0 R /Contents 2259 0 R >> endobj 2260 0 obj 2426 endobj 2244 0 obj << /Type /Action /S /GoTo /D [2261 0 R /XYZ 72.0 700.434 null] >> endobj 1770 0 obj << /Type /Action /S /GoTo /D [2261 0 R /XYZ 72.0 138.754 null] >> endobj 2262 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 568.259 199.682 577.259 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2235 0 R /H /I >> endobj 2264 0 obj << /Type /Annot /Subtype /Link /Rect [ 134.72 556.259 158.04 565.259 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1713 0 R /H /I >> endobj 2265 0 obj << /Type /Annot /Subtype /Link /Rect [ 234.65 264.619 296.02 273.619 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2235 0 R /H /I >> endobj 2266 0 obj << /Length 2267 0 R /Filter /FlateDecode >> stream xœÍZKoä6¾÷¯ |Ø$À4ÇDJrH2I0ÙEvgÆ‹< w³ÝŠÕR¤ÛÈfûE=(‰bw°—™Ì¢ø‘UÅbñ#é+Šü]ëQ@qÅhsX}lë)’ qÑV…,$„#`¢W…(Œ]`] ~ŒÚ‚¼G¿®òA?­nï ÍÀ=­ÈBçMWïWo-ÝÚPþœô#èaõÝÍêëCD ºÙ .æG±ˆã<aÎbý‡¡›ºýò¦(² 튕j§J•oÔWwèæçÍbÌ#¦0™À“|‹ò¢V:$yò *¯ þ‡›‘Ï8!8úÜ\öv¤"„œ”“i(ÂÿsS5¦Gýi¤ÈT4£ŒjŒæç¢Êd¦1±žGág£Ür ‰%¥q,ã>áhBTJ_Ä|6æÍƒ…uzµvÇS»‰^n¡¶Uc,Bh²¼h4k+q{¿¹ž¶$Íòþ:éîë)Ž=Ï›â”×zÁ¢ë¿ÿzýßÛòÝú”ª§®‡ œMµ¦ky΃…Ë(Ã`M²Ù§ú ­#Žº:ôYQQ6]1¦⇅V‚×-È4â(¥˜ÓfEÄôþ%/ŽUZ-†)x›‚J!x›p²0Ô,Fcá@éY‘žÕÛÅá(åZÅÀÑÅú~qH ù̃ï×5™w!±Ð¹4Ô¼‹,­ê<9¨e .=ø»‹ CŒ¸úXo–G¤y‘b‚% õ~œÓÞ¬•E  <ð‹ìgÀ$À$wõ±öŒ>ä%ö³öÓbHº¢~›ÔÉ}R-Ï?´ôÀ/2ŸS˜~BÔÿûåÁ™ô!/K4ŽqY°þeyô ö!/q> štv‘¥‡´¾½.v»JÕw‹ŠÀÉ=½XnøãvYõ‚`‚­TRnöëª.!»//C&Xt‡þƒ<«¢žj. w´9z½œi)D½‰<‹=O-#wiæÉtñaïþômBB`¦‰j(¹iþZU›2=Öi‘/ÏkÔ$¸@*dK˜¾×ûPÃàðAœ4{w+èå ¡b}î釛zÍnÜ ¾ÖÎUº,H˜ä«a£2vt2èaØ‘CÁÍ©vUÍÕÙ Uï4³ðÅB_•Ú ¾y<Ž'šê´¦\ã>žTù2ˆY’?œà¨:åá˜D¤Y£Ž|KK ÅíCeC¸Úrm+U½©|v7´:5ódÉ̈́ᡢ£ÔF²(µ©°?ª§ôS’µÓÑêTÌÝÉ€~o4·z…6”1àA ¼«‡D“@$buº«ç:Ö¨áói¶°Rনe¹Z—ž»ì£75úýTÕhcV´;`ÏúfÐð0Þ’Ì6s×rLHMÛòanê}œëk‘²³¬OG{OÒï†ĘÚé³—k,ä®1òz[j|×F¬2-UYy’ žDz¤GÙzd6§°™~êî,åLøðøÒI€œÁI½éæóÔ“0kvfˆ½ô̤1ð_éQ5N/Nõñ¤g£,N{ßÞ*혈JG‡g‰. |ðKÌÅLên€0ž£·‚8ÚŸsò1&±Ë^æ°ŠÇÈ÷GµIw/£ûÍæRKaÅIàˆQÈÏSmé¬ýYKgˆ4(ŒÇNX"cÜ;•límv´+‹ƒ/¢dŒ ký5ïÔVÆP@û=hŒšÝþ%¨JÇL¡§äE§šR­ËSŽªäd½§±/”(Âpâ#„Áøx±ì.Øf&˜×iuÌ@™íUvDUUÀ`³Ú4מӾlWÔ¥ª·"ĤK?Ëgˆ—yûsñ2G¸GÀúãÍN IUŒåÀ°¡¿-jeCJLÙl¿æÍÔtÌUo,€gó¥HÇMç6.Ç pÇIçàa|C}LùTÙŠwü»î_,H]©l÷jÁ;»´¬êKì㤳PÄ,¿l_@½àaüŽM‰LzNPã[NÊiC3KeIÝüb«îÍÎzúÚHEC–’̪òL8h,ô%2 c‡v&–=3¡szdÑÃéÐó[jàFè kn{RYöjÑÜ~îÏÚ@Ž„sh±¿n«ž½PN0º‹š à{Èþéñ¨¶¯¦ÎZç\=×>⦳¶ÎŒQ8†:³öb/ØÅË{EûøräVçÍF[µßgVOâ‹éÝ ci’Ù²þÖä:Ser)×vÛ.¨ª¡*µËy­Ê#XgB«ÅX ’¡8œæZy8Í™Š‘’ÃñŒ†í†jë7O !ác‡˜óê=¨æ-‘ؘÃëä`¬Ih`ÎI³NÌÙzáHÍàÜNô!1`rõÎB@ʶ︽{ùá9Ñ|¢y²_gCaÆBý·ô ù'¢zÇ ¹çnÖjñ!NÿÆÕ›˜ö·ð7toèêúÛ_óÅßÐo¯ …~û¹ÈUõúö—×Í Ý7›´Üœ²¤üðmÓ œÒêpåy­ ùT3ëµnñ¥NÀä"$LDbüTG%fã{…¦¢ª3bw'ÒIY§›LYŸŸÒz?H÷…-%¹U>Õ{»§ªÖ}5oTΞ&ó¢o¥ûKƹIãàcøLÁ’´§Ñ9ÐVvûÿhîx"•çZ6AàÐS“w}cÒ„±ż 5Â8·õe(·¯˜½<[ö°g3Ç,f jv±ÙwÑG¨Cw8zâ˜kõ¥pô‡ûNn,‡¸3rûìi„þÙsn[OdØdNS\`Mz*˜œèdíbmŠlŸ?/xö„Žp B#"»í+ƒ»½÷¤=Ñ]5_òÞ)â ¹ ŽH°0‚ë½sŽòÝ÷H[\/Œˆ;žgJ¹y‡þðR™ÀqóÄeæÙ.*w—‹ƒÿ´RâÛÕÿÒ𹯠endstream endobj 2263 0 obj [ 2262 0 R 2264 0 R 2265 0 R ] endobj 2261 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 2263 0 R /Contents 2266 0 R >> endobj 2267 0 obj 2375 endobj 2269 0 obj << /Type /Annot /Subtype /Link /Rect [ 246.56 63.509 274.89 72.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1692 0 R /H /I >> endobj 2271 0 obj << /Length 2272 0 R /Filter /FlateDecode >> stream xœÍÉrÚHôÎWôª°ÜÚ—vì);©Ä NÆrhDƒ4’¢Å.þ~^w --ÌœWàõÓÛ×F*ÂðwÁ¾CUÇEþvô§Â«ÈÖnU(+†fb¬#ÍP4mQe¢xÚ€¶‡à«C çýÅ#Œþýü4+„ï}„„sQϣǖmÀÉ>Œ6£«ùèòÖD*FóubÝR×r]"ê(ºæ²šoÑÏñ<Ñõ§«F}ž‡›¸%9©AJü@š1๮):¤«Ž.<é{3“”*\M°Ûñ5-‰×»þ<`Ë‘HE€UWq[G?,H&qøMw5ÌC-@RCP TjqhEK/‰Ò€4ñȼÈÂxӢ籇wÒ¢!ˆÊ¶2M£®úv°äúr‡˜eì°HY$[pØ'Q´CÓŒt…€ŒçöxTlÈI˜ßySäÍ5þ©óϿҢªr «ÂW ƒ{Qû, }ÿ°CZç`z}Ný$^‘l'«kó³=w¦´,¤ù1QÍSêávJ ß§M.Ø”f°®·9"(§$óÆR†DŒ" ‚ó¹2åfóf/,?3ž«ÏÕl0W–œéª‡ØÇdÛD“pÄ XA’MRÕP;-m¶Kº ‹6·HÍQIUJk—ó!°û×m¹L³!Ôœ• Ëé=¼²¼jCkB•ÈR–˺—¬´.b¡aåÙÄ’¡§¨ãòqÓôÞhýªeš­âvȧ4>Y] 7íÌ ¯Ù_ŒŽeÚ•Ÿ Ùáí Áä~O²Õq%:vd%OJôjS7´sîM C»@9,Ž2GPŽÿÁGÝíöf߇Գ•×S%UöA1aŸkaÎbœ»œ ö)zyú2eÓ>%E°˜7È‘}ôžãáÊ bA²TmN¸n¨²;ÞÍ&C“³Ä4Q(õ3ô˜½2ºÿÆ:íþ–ªüs¨ë KNPµ¤Lx§€Á²\fô-ä;³F²q8mŽE›a]œ8‹’wN_‘¸›TXµÅ\­«ÿ)IkÀdÝ‚†-'‹ ’2‹I„„çÏ÷Jìû—ð›ÕÐSmì6áK"¸8!¸=-ivBY5ÌÞÍÐEܬ†YW_n¢¹Ä:¡Ð–-ö:Æ…ažÃ…t1†6 ýˆ.&¬uý€¤¤q1^&Éo(û¬€çDÀ²WÞõëÐMYÃíuXì˜÷í=˜'²wÞÃÕbSNÓ×*ìÅ~Éå»ûÉ6%ñ‰ ³Ù ïEõ@T–”›y/æî¡r›Àèå¯ ÐG+ºcÞí /GÑ*¯j íµíϦRƒwq ú4+HØ:“œæÓúøb6O’˜Qæ-i¢ê#¿õ©R’¶ˆü$Ýõ;ÝÆrÖä5˜SÊq‚ýòÖ–_€UÛPL^imóH¸ €¸=wïõYÃûuýzåàfE°…q·˜(­_GÿyžÃR endstream endobj 2270 0 obj [ 2269 0 R ] endobj 2268 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 2270 0 R /Contents 2271 0 R >> endobj 2272 0 obj 1350 endobj 2274 0 obj << /Type /Annot /Subtype /Link /Rect [ 412.362 555.389 523.274 564.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 811 0 R /H /I >> endobj 2276 0 obj << /Type /Annot /Subtype /Link /Rect [ 133.33 543.389 431.3 552.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 811 0 R /H /I >> endobj 2277 0 obj << /URI (http://www.doi.org/index.html) /S /URI >> endobj 2278 0 obj << /Type /Annot /Subtype /Link /Rect [ 166.05 495.389 264.1 504.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2277 0 R /H /I >> endobj 2279 0 obj << /Type /Annot /Subtype /Link /Rect [ 269.93 495.389 392.44 504.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2277 0 R /H /I >> endobj 2280 0 obj << /Length 2281 0 R /Filter /FlateDecode >> stream xœÍWKs£8¾ûWè8SµÁo¸M6Ù)oM2ÛÙ=¤rlk"Þüûm,ÀÞÚSìr!‰VýøÔ-ÿœ„á{£¾M ßÐ6™ýlÖ òLd¹Í’ƒ Ût0¶i¦ƒt¾ä öôæi3Y˜Ð_³t†Ñ×ÙË+ÈDþã O(¯T­fO=Û$û0ÚÏn׳ùo"­w]ˆ-×ð7ˆ¨oXf >&Z'èåÓZˆ¸@;‘£œíXÎÒ-ûüŠÖ¿w»ÍÀ°|µ›Ö¶Ó4B©¬@ Méž%,•õþûõYÌ,Œ ÿ£…ìéÌD œçyÖ©?Û°ê5X©5ªWg†èÓål¥ö ~NšŒã¾ÁC~㦠èz†GHxA¯ ÿŒB&ö/1æÃ¸7$‹©ì†[-åSÎ;þàÐ…fXû¬bÖJzîð€­ ÑM!sº•Hì„y{RFIgBÕ†ÈA1ñ­võ8븚¨‚]¬V ÃbuûˆÒ2Ù°ü2 uÀo$‹sQî(üfO æzÌÓhÇYî“û²„莄_î&P‰éÀÒ(ÊYQœB½©T‘ÏX^ˆô ¸£û>/§À]=9 üyùMStd”A9…TÇT²I1šù3x_÷g%†>«î¡OYÁÊHÜ4=­Xœµ9 s&sÎÞºí ý4VA:ßi›Çä–‹U;ÖpHoGÚö•etØîî¶s!o.‡f=T‘žép3)i<1S?ƒ/šK:¡ôAÊ,œÏÇ£ÑF§¾åÆV$ó¢Ì2‘Ëy$¶Å¼5´1#‹vº³N`¨êï{^0øª‹»¦á* ÛóFE€`G…àxàÛCo^•5ž½%ÚǼ#ñ²ôâ Ä?ˆcU™È̓uª×ŠËeekóŽäŽ=Š4—˨éÖ=Ðw¯)£wß§Ú¥gj²ªŒj¦¶¡™c ;#"¾ç’ÆHlþf[8ÔÍÑçm³kõèSô`—ŒèA:yHàʦéú#ò=öD‚"ßÏy±ŒƒLt²Z@dÛdÓ¶GT½^Žgàêñ\OÅÓÂþH5Y•jè<Öo˜ƒSåbíøºár:pÿ+tζ<ãWwMÝ™ðaŠi®¥g¦Ïñ„Eü µ\G7?|üs ÌÕ3R UÎëÿ+ ôMÄe °§è‚Áµ¶¸lA0 ×ý¹=¬'¦ vĹkjm„8ÍêîÓì_æðn‰ endstream endobj 2275 0 obj [ 2274 0 R 2276 0 R 2278 0 R 2279 0 R ] endobj 2273 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 2275 0 R /Contents 2280 0 R >> endobj 2281 0 obj 1292 endobj 1084 0 obj << /Type /Action /S /GoTo /D [2282 0 R /XYZ 72.0 769.889 null] >> endobj 1087 0 obj << /Type /Action /S /GoTo /D [2282 0 R /XYZ 72.0 694.434 null] >> endobj 1090 0 obj << /Type /Action /S /GoTo /D [2282 0 R /XYZ 72.0 387.247 null] >> endobj 1093 0 obj << /Type /Action /S /GoTo /D [2282 0 R /XYZ 72.0 237.584 null] >> endobj 2283 0 obj << /Type /Annot /Subtype /Link /Rect [ 260.257 719.934 343.876 728.934 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 931 0 R /H /I >> endobj 2285 0 obj << /Type /Annot /Subtype /Link /Rect [ 360.993 639.859 405.755 648.859 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 56 0 R /H /I >> endobj 2286 0 obj << /Type /Annot /Subtype /Link /Rect [ 411.077 639.859 523.277 648.859 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 56 0 R /H /I >> endobj 2287 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 627.859 188.06 636.859 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 56 0 R /H /I >> endobj 2288 0 obj << /Type /Annot /Subtype /Link /Rect [ 341.152 627.979 375.602 636.859 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1781 0 R /H /I >> endobj 2289 0 obj << /Type /Annot /Subtype /Link /Rect [ 376.57 510.391 424.35 519.271 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1826 0 R /H /I >> endobj 2290 0 obj << /Type /Annot /Subtype /Link /Rect [ 203.06 332.792 228.04 341.672 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1713 0 R /H /I >> endobj 2291 0 obj << /Type /Annot /Subtype /Link /Rect [ 418.425 332.792 449.525 341.672 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1824 0 R /H /I >> endobj 2293 0 obj << /Type /Annot /Subtype /Link /Rect [ 295.8 320.672 359.39 329.672 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2292 0 R /H /I >> endobj 2294 0 obj << /Type /Annot /Subtype /Link /Rect [ 432.048 251.084 458.148 260.084 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1259 0 R /H /I >> endobj 2295 0 obj << /Type /Annot /Subtype /Link /Rect [ 292.15 239.084 316.59 248.084 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1102 0 R /H /I >> endobj 2296 0 obj << /Type /Action /S /GoTo /D [1700 0 R /XYZ 72.0 487.655 null] >> endobj 2297 0 obj << /Type /Annot /Subtype /Link /Rect [ 155.43 183.129 198.75 192.009 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2296 0 R /H /I >> endobj 2298 0 obj << /Length 2299 0 R /Filter /FlateDecode >> stream xœÍYK“ܸ ¾÷¯`í%ã*›CêEÉ7'ãI¼•Ý*×v*©òúÀn±§UQKm=æ‘_Ÿ¤$êÕ½ž=Ù{M€´ß6œ0ü÷Nÿ‰Nã8!ûÓæ[ÇçDxÄ:VÈhà…Œù„Ô É‰LY!ɵÌháõ+ü™ì}$ÿÞFþ¾ùò{R ÷´a”U¿m>lë6`ý#Ù7¶ÐgŒÆ?žŸ§,„ l~ñFoyàXú§‰!sÒž2áXìß‹&³…Ål=¢ýÿ0Æ1ò°ùëvs{›ÙÜ‹ØÅy’ˆ$ÁO4öýÏ#ÛùrGo¾’íϛ۵„ùa¼[抧íÒRQÂH„1“Uö?•NvUµÊGrOYstÔ8d–ãBöÖ1›ãè¤áf-y–Uã¨úX¶y:ÙìˆZ:‹±Î÷>-›²$GY¥DÁRUÑ>‘ê6ÏM’3*ЧΙGE‚ gýóN(§äC ]Ï*RDÆÿGéÍ=AãH+ЏUô±—Cð@cKÚºˆ–u{>çÙHL:™T6²VcÈý¾¬R{–c^B·<:­ó\Æ£HŸqˆÓŸµ©ƒìÝön&îû>!n ˆ×<$¿,äÊD”$¡®” ¹cÓœßßÞ"Ò­‘†{u(«E ÕÜ.Ó€CÛŠÝ·¢þLÍ)Ÿ—Qâш0Z‘þºØžP?Ö•ßOV¶›G† ’.°ŸFT9ùÅú.w¸MÇiëîU­ì¶¦ÝÞ‹yêy6ô‹ÙšO2MuLzñEæú̧ãIŒ˜¬ˆ;º:6rú£ÜuÈò‘¹£$^C6/®ú:C>;½;‚‘.„'ùÒ/í;ï©}Y42+zRö OcUäúÂí}2=ê‰n÷ÑšÏWèyW…ƒsÓ${²l¯Z›Ì‡ý ÖƒíO•<ŸÕ‰¬0áœz{Ñ¿wì‰À¦ñº{(*=ÔWù3©ÎÚK`;–Biæ1R“VD±o¥~½IHtC!™»¦ÖuRê²{q€š‚SbHÍdéÅã’è²Øp¨lš*Ûµz;°²ƒûµxqü§,ÏbçìÎвê^‚ÙwTÅ@ ×:m©Û¤\ï° sIt Ç™#\ =ÏÛ¦Ž®çO¼ì,‘ºËÔ°t •}Ü–è»ÝèØêéí@´Eö­u»²Ù‘24ãg¶ë‹·éE!õý˜¡;, Þgú¯z¹RÌÄEYg¥g‡ãËþæzsUÏ —Ž+Êø(]šz•dŸËúH ~’EV7ºÆë€Rò© º’½¾<ÓôRblÁº o\ç„îF`åäPÐ 6‰ÍÙ€{:§ž$j äK—§ a#¨8í©¢†¼%æ0}9—šŒÏ0Øê9@øÞÊ¡Vñõ>"5C[@– H_é³¢n”LG.ìGScæ(áó9%VL„qq¾ä霫?Bm>C‹ï1½üP×íɼ¥8r ª#ú&g©N9PªEšÆÈewáÈÀê0\9ïP–ô¹G* åX,|L ©K΢®ÖŽ#Ç?¶ç±ù¦Õtëq½±Wp,½Ä¡Ìóò©C+½ö¾WwŒ¾vv¤+CŒ80uÅ`'ä­ŽúP×~ÚÉê'òûMŸ¦‡šÏoJwÁïºÏ(Ç„nëòØï¹OÄ×Tô…Baªeõòû›÷—»1¤Ã2æ1ð¨¿ÂipÂ`e“)û÷ó½Za$ÖÞÞs>7@ë^ìïp"y—D›LrÁ ‘ÌÏ4ÿ¾ö É€M{v³—GÉ=ð;Ñ©ô˜©§WNaJ1 0`&¬ÊŸí˜Ås»QÊ.õ,œTkÚ§]Ûo×+"÷¹%–§>¨·u±òàÃ׃…—¬HÇ»GÕ™V˼ÜËÆ:Á&Yüygý ¢$±kæÂÙëµ_zþ9gu&,³=d¦«+ZºVŒT/$—ÅC+L7VÏçÅQé.ƒÖ<Ÿˆ5^Ð×GSZj®ÕYV:àµ2ŸYó4G‚ÆDkÒóÖ­b¨'¡/Æ`Wãï%–²—g×;·©B’eÒs0s…]×ûJ)'—f5Ü7xÕ2¤Óÿí/ÿˆ‘ŠÿL~HË}«1ývmïH]ÿõ`&vuV„?“8ò¿sV1ÌGR$¢ à‡½.¿Ù.ÓŸÀtëIâa¤êÖÃw(Kf£µ<pµ¶ZÎn¤¤ƒ–HÕA¶y3Uë¨ú(«®7v Õ4ÆØ¤ù'’ˆ!y‰W|´0q.ƒË!ƒakMfäcqÙ½%º ½x¦é\•gU5btLP«³Ç,m1Ávï7¥–o‹Á>ûe©t§€%æ§þôùÁŠщ~h+ó UÀ%wjq¯ë8!ÆOÁÑyÒ÷/;Šq$rŸ6f}±¼Æ>Õ…¥‡¯¨KUW ,÷"Šº”Ρ3kW9,+u*•c$hÓ1Ô¡*O«ÞõhœíèWY=´Ý÷…ë_ƒBÌçSg†AVõYîÕ»¾*§$Ç@£sòÓy”y«ê׎‘‡à!å„ÇÅ«Fˆ(ÐÙ©U‰+ä!÷fÛ8×Ã8WÛ±P“ŸîjÈÃ1_™/ðUDÅõ"ÄÍ» D¹ÜtQFI°®ð¢\îwyÛƒÊ@»7úgŸ7ÿrF+h endstream endobj 2284 0 obj [ 2283 0 R 2285 0 R 2286 0 R 2287 0 R 2288 0 R 2289 0 R 2290 0 R 2291 0 R 2293 0 R 2294 0 R 2295 0 R 2297 0 R ] endobj 2282 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 2284 0 R /Contents 2298 0 R >> endobj 2299 0 obj 2258 endobj 942 0 obj << /Type /Action /S /GoTo /D [2300 0 R /XYZ 72.0 757.889 null] >> endobj 945 0 obj << /Type /Action /S /GoTo /D [2300 0 R /XYZ 72.0 390.614 null] >> endobj 2301 0 obj << /Type /Annot /Subtype /Link /Rect [ 208.404 703.028 233.384 711.908 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1713 0 R /H /I >> endobj 2303 0 obj << /Type /Annot /Subtype /Link /Rect [ 434.86 702.908 496.354 711.908 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2235 0 R /H /I >> endobj 2305 0 obj << /Type /Annot /Subtype /Link /Rect [ 428.368 690.908 468.348 699.908 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2304 0 R /H /I >> endobj 2306 0 obj << /Type /Annot /Subtype /Link /Rect [ 214.772 657.229 239.752 666.109 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1713 0 R /H /I >> endobj 2307 0 obj << /Type /Annot /Subtype /Link /Rect [ 225.909 645.109 252.569 654.109 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2200 0 R /H /I >> endobj 2308 0 obj << /Type /Annot /Subtype /Link /Rect [ 138.444 335.633 173.424 344.633 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1801 0 R /H /I >> endobj 2309 0 obj << /Type /Annot /Subtype /Link /Rect [ 456.499 299.753 481.479 308.633 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1713 0 R /H /I >> endobj 2310 0 obj << /Type /Annot /Subtype /Link /Rect [ 383.121 287.633 418.101 296.633 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1801 0 R /H /I >> endobj 2311 0 obj << /Length 2312 0 R /Filter /FlateDecode >> stream xœÍÙn7ò]_AäÉÆJ ûî6°XØ«x×ÁØ8 ‚EœÎ Gè§[îCcýýY¼¦›£$ov¨ŠÃ*‹ÅºØŸ¯Âà¿õ§ÎZ× Ù¯>›ñ„T)ÉJ3T0š§cIršäH· Ò*šH-Îæ~ ¿\uWŒüëê×ß`ÎŽ0 ;]± Ì5«Ÿ®~ d3þšäcäþêÝÝÕ·ï ’0r·÷*NkšäeÓ4 Ñšfi£þ¥äîH~}õQìÅ º­ GÞñ{qÝôú7r÷ýÕwwg›Î£õ×¶çÏD›©ªŠ²¥-i6ŽÁrT? ²Dq•³Üþ½(2[IÌB×fôÕwÙ‚*˜•$MS5 üDë3ªÙKóÕìnm+©’ËmºYnº¨Õm)ÔNË·JÔ?Ü­Z­„‰Ã=Ðf$e´‚ëÒ3’5´È@gµÕM)y/»áðÿ“'2Øû7Z¶÷±ÈkRæ´NœKÛÝA×ðcJsò øì6[oûãQ-âý·ï«%ë$+iÎrÆÊ¦\/r/&`m‰Wr%eB³ˆÓ²YûÕåèáç~<¶¤åœúà7þr¶[þ|¦£HêÏT„›p¢ge ö ‡SdÅZôϳî-ïîgp y Ö]Àö³&yiûÓO¡2–ljR• âyz»eAk«„8)ž„ÅVîå6œcµáÇöC 8;>ñ ƒŠ/ jÙ…òÈ. —­Ç—z.Jš•5K’¼ZoS´£8@Ö%UT9ܤÉ×TÔ¯vwEÅv’}·Öo]/Xô{ÐÐH8ÙÃ-ä»Ttœ‹ì¦‘®$à÷Ê„Á¿rqÿÀ À5éÄÀ[‡Ëàé÷œšË72OiU¥`UIY÷¯dE«œ5„Á5±[=tZâ1ÒX«Bà¶:íìÙá§KO¼ó?„«„“`Þðíƒ'ðBæî!riºØ–VqRjÃ_&ê°ÿéÞòÎÁ£hÁT<‘>„ë%EFÈ)š²ˆ­¼ï‡#Ÿ–45„¤²ii¡qK…b£IÕ¾öé• ÷~Kãv¢»vø¿ï~øÇúÁ·ýö]ß{>ý<=ÎÓ§×nOáçsEE”žå‹mXsÐf èõ±ƒ«Úõä$§Ñ{Ò{¡ä-g ^¦dœ>‰ûgº#Ç~œÈ(ø°=€³:õÃ\Ê~jÛþ4¾‰ÈQ¨xeÎCËñ)M‹Å¼"6ïãŒ^+¡•BˆÉî?Þ_ÐþÿÚ㣠RˆYç‰?éóð8ª9˜Ü{˜{ðÂɬÀÃF,þ.,?ˆqnƒåŒ;4”|:ÛrDMe½PS'ÄNYÂ/ÿΣpå:ØtlàØr7[šAôŽ“F!“VðÑLyæ·t!CT‹¦š ½\òÙ1N1¯Ý@È Œ¤Eñ¢±¬æ}PW³ÎhJ@!GGŽö€Cà€! :Ô"hÌå£!iÙÎ#v3÷ÐSûìð¹›t(ul=›aO~E}®5à b”CÀ¿•£ŸØû-=ΛVn¹Šy±`—B¢ÂX¨zñŽ­ç}7^³$õáN­8ˆ'ÙÏ£ÅýSØfž,ˆÖ³$÷—Jaèt-æÃå4ÐÆ$;½KÏÒÓÙ`¤X86…ëÞ(²iHúÎ7­ÝkR¸«© •SQ¿×^YAâ ?>¶âÚ ro”EA&vÖshªœV `ÓrU˜ò]¯yöskç¡~ÏY}üð“¢áLmª„óM+­Ÿ9 ¢ø/CF%ÁÉ› ˆMTVõUÊ ª2¼¦¨²ÿ›þbŠ“&ÕK”¤TG³ë¢¢5S%]e*:W7% mÈ«ƒ¾­sÍsÕ×F©Ñ¡'îÒg†à ð*vl5|ìw˜G!ªî‚ÄÂ~àÝsÀƶhìH®Þ*X:Ì„r#ND e³Ð‚“çCSxWm4”Âã}×úÙª<º»wh'N²Egçž¹jALÓ°-õRCÀâØ?…ü£:Imôf2ð“ÑFÌ"vߦ¶I?²txÿ«LÞ„´4£É VCùBý¦>/ÚWÂRš5¬G’Gh/ÛWÂj°E˜fÂË–¨Fg¥še!ô»=»ÉfŒï',v NÞŒŒýQ˜= ‹Oç³Í‰,èã@oKkD!ùÕ7à]ˆP>$r´ù2§÷¢Lƺ“I™Ñ’Lµ%MÍ©ó*Äø0 ›ST i[oÕbŽ÷Øv£Åµãí¦òqœ³€÷Ãr¼öóÝ`çÄv8b_6tŒd¸…zS;ÓÁ÷ý¡#·½ Ÿ^ñǾíïU7U5Ëá>|ûÛw¼”¡¦k—GÉ÷éu¤l(ÔSUž¼hŠiݼD~íÅ1Ó¸îöz3nBûî”q;F„o#ë*¡.?— l\´nþÅNB¦¡SÞ¸ìÂKÕ¸Áoã°1’1šê3ë£ü÷kAçj5 {Ëo–3¡ J/òûö}’¬›b+ L4ÈÍD°*p½àŸnz¸ ñÁAì¨ß8_òÍ›·?¿ù;\›ëïé7Ý;øª|%VðIbü“F¥õT,±Ÿ÷Ù/z l°ÛwuÄ“@¤7ubüœsð+÷  ŠˆYŸ‡˜þªÊ£êÕ³•H01QÜ a¾œ)ü#“AÌ«¡eØâ›/ð4¢Þ>ÍGsÿ³w»í½‡£”ª¿jÑ~¢ž$ˆªw £RÕÍ™ç0ÑIåh×ä÷®ŸÉ`T\»~p2ÓV7‚çûãÕÿ*¢ço endstream endobj 2302 0 obj [ 2301 0 R 2303 0 R 2305 0 R 2306 0 R 2307 0 R 2308 0 R 2309 0 R 2310 0 R ] endobj 2300 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 2302 0 R /Contents 2311 0 R >> endobj 2312 0 obj 3409 endobj 2292 0 obj << /Type /Action /S /GoTo /D [2313 0 R /XYZ 72.0 542.713 null] >> endobj 2314 0 obj << /Type /Annot /Subtype /Link /Rect [ 217.98 721.392 255.75 730.392 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2304 0 R /H /I >> endobj 2316 0 obj << /Type /Annot /Subtype /Link /Rect [ 138.288 493.083 167.728 502.083 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1824 0 R /H /I >> endobj 2317 0 obj << /Length 2318 0 R /Filter /FlateDecode >> stream xœÍXÝoÛ6÷_Aø¡M”£>(Qö­ûh ¤ëꢚ>Ð2‘%W’“zØ¿£H‰¤d§]±‡´hÂ;ÝïŽ?ûy Ÿ«_,0cÊ·³Ï† 4DQbX”à8¤„D(ŒqHÑù,Š Ðqa¿‚_ž,ÐôaVÎúmöñȬ½û9a¼3õnöÖ‰ÍÀú1ÅGÐÍì§Åì‡_) Z¬mŠ£³,ɲ 2ÊpfêOˆ[ôñlQUEƒÖUj±µ(sñìZ¼²Úa†#¦´ðGFê¼\¡²jEƒ¶¼ä7b+ÊVëÿ²ðr‚ÙcKÙ[/Dh¹4M1·"ü‹q¤yÀÑÕ'/1©½x½ýûdÈd1qžvᣠît&)Nƒ ËÒ,ƒO˜y-䡎y4Û›6K¨âvA¨Þ®ÓÎÒ”mÚmö ΊÞí‘4B» ÕaK­ðrž¡çYžª½%ö°D»qˆj'jÞ‰8óË«–ºz³˜ŸŸÐm¯ó¥e+¶.e×\4Ž™Ê®7üć¥ã  ¦¨±rÌ—#è„ÄÉ(!Ëšç·¢m0z'ê‚÷•‚˜bÕiM£©ºøÂ·»B4c%á”NÅÑRÕ=IÇLµ4 c(,aZò: éHŒ[èlÐ1:ãûv£ e×g—ï/®Ÿ¹2åÊ¡nÅᾪW¾Ê뾊®¢h\+ìóêËe-î$o…k¸9”-ÿâ0äÚ!L3zÜ(Ól¤Ù(¸ƒ^-ÎCƒ fƒ â-⨕[‘JZ^•M[ïóöbj7¨HGIRmXeñÇ’oE€Tïdè“Âx\\e/„s¨ ½òÍ{_˶%âͱ( ƙÅÓ'H¢ýnŸ±ÀñW@™ÄI=£f'r¹> ˆ`þæÏ9Ò©>G æÿÌ‘„¼¾BÕÍŸÌq.Gáˆe8  DÈ’oãªI …ˆRÔÅlzH¯ Ð”ó¥Ç—x„/ Um9ìÀ‘Øñ\4çžþÁR~ç˜3Ø;ØÒ­E“óýÑ1±i Þl<7¼qßQF~&æ—[YV××è2—+øõN|Þ«ñ©/AwÛ Ô7º)ôhà%†ŒªwL)ºïõt¦ë*xy³‡)«wps¬jNaã$¢K¢ÈƒØCg£Í% ÄÅÔ© ŽhÞˆ¶šdÐÉ(88 ‹ŽèXWyµÝÓ èÚÆR¢i``”NËlÝX8.–ÒiÈ>–Ãã+è‚Z.…ã/«;À“þ½ºWtî9¯Ç›UeÉh ­äºš[8•­:k)Š•9²RÝípLa¥Bud¡e‹*¨Eâ @ÉJ˜Ú ÁIçzÆõ‘³F¢”[®^¾¸°àTEA6Våß—Ò‡d‡Œç?ì^hD m,e½÷Ÿ_ŸòN£‘°ã=—-oeU*˜ÿŽ8 ÓB¸ŸYwµ‰ã¿NÅ%ó…U+•ùÿì8†ôÇpsAõŽ/O8Ž!ý¾°rÜʶøÏ1|PW[öŽá¶?ᘆ¾ì¥êkO¾anÀ–³ØÈÆRîšOÔœomËa´p8ƒ'šjkŽùÒ®Áž¨ë«sqSÕòoGÕÀ& ðoΫf4r+ ~Ÿ Lx±Ÿ£~‡!·o௅QÌÔ|±/N%KG²ª*p­úEÑ SM8K>Vè_,!†µÉÿÄT!Ë[áèWçV ü¿¹¼çNø¦i¦å $eê¥Ð=ëf¿ÛÁåÀW+©pfEYÂl¹íPäá*ÑP æ± N¨ÇŽW‰ÂìæËê&Ö 6¦/!MTëaÙ @fÙOòFÈ.D^Õx ß7ÖV«ë­ }wôÔp‡XájXšdˆ¯›¬Ñ®>&®ÚŠ ¥ŸØãÃjÇëVæ{8RGŠEé(Iz×_)C 8 CmJû›ëÕ¯çèâÕ›îgÐý OÕ²§Ü2êÉ~¶ÞŹ%gŒÃÕï+½† ¸~>zíè/e?ghµcÕ.áa-«•Ìy-S×Ó¦ }|¦¢†tKÚËWv­‹:M;L†~t¹»2«òš²‚)Žœ, @ Ž ƒŽö7úÉqFž‘¬*‚™#ÈD*]FS3óèнˆ‡†ûVôM(@8IHÀHÿÚ;9Œ$0Üú²ý<¢ªÝ‡yIJnõsÃPº Áµ³oË4½`¨¾ 9tƒ¡½vèU*‡NyÏèÏù Ðè£ên´ë$e£ ÑýÏÜÛÙ¿x{—8 endstream endobj 2315 0 obj [ 2314 0 R 2316 0 R ] endobj 2313 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 2315 0 R /Contents 2317 0 R >> endobj 2318 0 obj 1752 endobj 2320 0 obj << /URI (http://ncbi.nlm.nih.gov) /S /URI >> endobj 2321 0 obj << /Type /Annot /Subtype /Link /Rect [ 319.398 340.29 352.178 349.29 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2320 0 R /H /I >> endobj 2323 0 obj << /Type /Annot /Subtype /Link /Rect [ 357.914 340.29 449.874 349.29 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2320 0 R /H /I >> endobj 2324 0 obj << /Length 2325 0 R /Filter /FlateDecode >> stream xœÍkoÛHî»… H$S½ÁíÝööy×mw],uî0–ǶPy”J£ºþÒß¾œ÷X²´ýØEHŠä’Ù|\žÿîù¯<Pž^yX|TôÀËB/J)ñQ&¾yaŒÂÄ;xç¤Ä«AÆB Á¯3^À÷ÞŸ ºð½ïgãù w\øÊ…ª?oÛÀß’}¾·[|¿\<ÿ!ñß[nmˆ£åEZD4GQXðŸÐ[¼÷7˦©;oÛ´^K¶¤%´$·Þò+(ʹtëùqL7m鼦xG„2)ÿ¯åYÌ"ßGù·²·g&BÊeY†üa*ÂÿE’©‘:3dˆÊUÎ(Òù{Òdd±ï<ÎÂoƸéL3”AQdEŸP~–BaÎeÌ7ãÞ8YBn—ñºzç¼ÚîjšJ_=ÏTWšŽ˜ 7ëòaÈ êxù¥>ü¤Á@ßó‚`õt,°# Ô{/Þ=|ùߪº&­÷âõ+ExÕ½þmé­n$í—†’nu+¹Þü÷៰±Áþ‚rmÂ¥DáÐdÍ=ÊàNb‹^“(îwZë)f¤>Ýy·^Â^ݰ}ÕÄ;. 衤ÅëšJ]uÌ ÍÖ€Oýº®J̪†vÈP_7G­Öž,ÜXƒhY÷rÁŽ-±z>Ó±i7Î*Kðj¼éi:ˆ‰ð÷>ÍQæÝPa˜B°ŸZÂØÉâesxªÉgKøØ“ö„,þ3³ðQQa ©o©³ÊùGuh86­uÙž8’=Û7­Ã©Ð2ÀibžŒV'aGBè8:Y>ˆ¤gÂåâÔèã +¶×0XšÀ1e.Õöhôj]7ÍæJ£Í׈`ZpýU2Úõ˜žê«±§…?ðTz ¤ÊSYãŽ\ÝiŠ\B€5fL¸(°†Ö' W[ ­ãÖˆBup¢#/­VÖöꄺ'R×Ý™…Œrí“Æ íúVdŒ23׎±ë|W*¥Òû(BÙm‰(0ÐáXÝ÷U¹wD„« ©(„©Ücº#¼U@Ï3ŸtEHì€Y¹G—QQȶ§ôdQò™Ç°ãíÄUÇ#`«.¸ [!Ø%ú×}#H”u‹Ë„u–"ÃjqWƒ9ŸÜ¬“í¡Ä„‡mÉ·›ü°4±½ZxOt™ÅNën™»stc –ø©b¸¾ŒpØk"rJ ¦O4w©Ò,Ñ"›9„ÇlÓÇp…S*'Îá±Ä×Ä.Ç.˜•Çc³àÿõχ/ï×ß?òæýö»' øÅ£hOœ¢™v?>Šª‘« RùòQ¶–Õíêv6ÎE:\}微åŠý…(ß,å™ 5 oEß”p× Ód“‘y°ñéÀ6ÕVJ¢mIÒÏ[žšþú1(Þlˆ];zû§Ú²‘ÏŒP—S^z4&£ßÚ»Á ¯!xwf¹È$y-A€b^ ÔÁàn+"ì¶$÷èUD]ó UýMcŒár/œ0üûÝ¡›—Õ¶*’MâQ¸sYÐMiW È‘tPÝ,ï…ˆÁ”t±ÚŸÔ<ègÞÕºjÀ» ví‰÷WsùÂ9èK“b¦/ŒÙfÆó<ŸR95Ÿ$t_xýòׇï†ÍÚp],>WQgO…F’]ÔÈ}x&ù°‹)Ó°ÚM>f¢A5 rP—„Ô­`j-¿›ƒgJ±Lb]:9›EšÝWøyæpðJvT‘wšØw’*Š’Aø Û¦®›#ï3Ð_0X̦R”(ò¡10zN§Ò˜m:•¢<˜R9‘Jc H%Qe<•l@f=)¢á²sI \”ó"OÔÕõw²ëk,â9œ~í€OÞcÙÒÒSžm25¡«6ö+¦^2«Fö9²ê@Ä5J¢/a5´V¨œ°3£ ü* ïÓì>oAfçέnÞZ•H|¨(ˆ|²,x»Z‰ä ¨××§ø@4Œ; A*n4,®K…í¾ÁÅŠøóI26ëM¿>ÍP ÷QñnéGc½Êû‘T‚Š †í‡«ÈHjÏØÓÃóç´\WˆÖD«=Ú5Ÿ:¢,C9ŸÂ"ëxrCÖ†~ì°æ´ú]Ý"MzÕ@u^Ø´¨8W½º‚I6Dδpy†nŠ«ÝžÁ`q„±v¶´ã,BiE Ÿ\Üâ³M—v AžP9QÚc }JÀˆöݵÊ`o”Ÿ×³žÙЌٗ™ @Y¹_¨ÈþÔa iÕñ­ƒ‰ƒ@Â;˜ÖÉÑ(nw=FvHr4  7è1AìòÝ”dž^»Š!Ž“fmHWµzÚQ‹u}Í:ä–—•$ ±zÂ|ÝÃeZ^ô~ïÓÍObØ‚bö-DS9ô*BE-ÜÚž+ NÓE– –BÊ4­³ä‘L#Oe¥®ƒ{™û :œcÉÖÕw!q4ˆ…)e9[ƒ t”‚?‡i>Sƒc¶éLòbJåD Ž%œür½Z «oõ7õ—úÁЄ¹úKÃùIã]«¿Üð{<}û”!aA”Ym?˜«‘eÝa™L“»)@5 ¸íéݺ+¡;ðÜ ú."™bm…±ÄÀ½£à­>ÛEe^_xÒA(œŒ¥¦<×=³Èoÿm§d$a8§¤²È:FðYÊ’W°E?¨×W‰©‡5…]?»¶ˆz™R_þï~qÖsÊ^Ê=nq eÒ]¸?¦q>ˆ_…ïš(e¨`U¸¢^aÈØ4üi›îfk-ÍCÆpçÉÜ(;f›®µ´ˆ§TNÔÚXâ¬Ö`VxöìÚù›ÑÛÅ_/ä¿ endstream endobj 2322 0 obj [ 2321 0 R 2323 0 R ] endobj 2319 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 2322 0 R /Contents 2324 0 R >> endobj 2325 0 obj 2179 endobj 2327 0 obj << /Length 2328 0 R /Filter /FlateDecode >> stream xœÍZ[Û¸~Ÿ_!ìK“Í„¡HQóRtÛ¦è¢(dŠE±ÙM…È¢#Éã8¿¾‡wZ¢œ>¦‹bxŽHž Ïå#/wy†á¿×êO]䨮y¶9Ü}±ü<«HFKËb„aL3R ²CvÍbYkâq#øs5è}öÛ]‡³ÜýþÌÙfÖïðÊæz«wï#ÝìÿHúáìéî—‡»7ïX–ãìa\LKTó’s­%\ýd‡ì÷Rvc¶“C6ˆD¿/ÿÈ~ « G´V«s‡gË›~›õrcvhúæID?™õ¸òÅÕ?šËÞ_©!WUÂóP„ÿˆpÌŽêÓ•"sÒH¹â ÌßU•ñBc+¼ŒÂF¹õ,+Tå9ççð ÕW!Drz+b~ó–ÁB”^Þj>·º¨U¶1ejY[3cé›wìºvQ™QŠ .âµ¹ÙÝü¥KËŒ•3ðj­¶Ró?@úŽ„ϨÎ^LûfòD»óË<ù±ø: HbGʰú ·íîâÉÆŽƒxnåiôŒ/'1\î“Ûoeÿ§ Ã¾yA;釃˜.ÇðE<Ã~Ó¾íŸÞΊ˜]Ö`6Á8ç̘ýëiTr§øâ4 ?žöaìYÍ™C€åE¡Î¨Xî}:úšagO}—ճɫ¶-IY/· êI?7ƒìºHñAžžöIC"çÆF önÇ{ÏÑg¸tǪ (äg‘«È#ÕRß¿NC·j*­ÊëŠ×5I˜új]$We Æ˜pº\7¬Ëã W1f4¡jÒµ¢6ûeÕx¶XõÀ&bÓîÚM¦c:kûL9ߎ“.Èl£ E  O:“¡)VÐYc5¡B@ãDÕ<\™ý!ÎÊ>ˆ§S× ™ø 9Ž­ìG·éSÊ`("9eP¡¥+  HQöm&ØÅ‘ÇA>·[á?7nð8´bç öÜŠsL»ñ`5´d¤(r¼zq&2õp#û ЉßÒ û vûåÞQg¿À³œ²»¨fvoE£’äužëÚi¨é,±ëšg9Œ¡µ±ã` eD&¾ Üÿôí××ãtéDà5ºRZâãû¡@=ì£yKIh†èãAÆT{8Êajú)š=&œÁøÌàH•Ýp‡ âý<´“ÐQÛ 8)¥N×Lh¡„ÃÌ-Äv3@Mí T ô„Ô*“:Æwm'úæ¡ÎÚ6SóØŒ°Ó­Ž•×⥪Զ ¼Õ³®«j0£²i÷Q”7–•Ð-¬XÏýSÛëh6t×~á”Í~±ôC€¤~<žŽÊÞ¾:Wà a¥^ǼaþWw53V¡»,)î3ãÀÃêŒ@ÑlX&¾©.Ê0-ÏœÀÅS…Û w‰¯#‡‚ÛÁÞvg{à=Šé,DMvà¬Á$aši³¦šà^¬‹òÅ0‚ «{éúdÇ…x*R×FhÚuò-!8~atæ—O„ÐÝéÛ7+#Ål/¬7qº\­zE*к÷CÛrõØ&‰''•EÈÓÑTŸø†Ä—S;èøuÛj_üŸ2C Cȳçú“G 9Ê¢Š•¨"߃”Ô¨TW¯3wOð'Ø%_„anó€3Oí¸̨¾Æ0ߡJ´•­,†Ðî2eh}ŧ15©9Ÿ^&*%-ðÌF“”%V× ›ú’`AiC_Ûox í¡xñ “ÑT'åç@˜®ôÝÍïÃîAÐiº“*øMæ»ÕR>a2#3“Ç=Ôη®û¦®£´‚»N …ÑÒ^¹Ú®Õ€Û%€XÎrr=_WÜ@0}k±THNCÛÜ4„­ûv¦+o–þ ôø)¦_Øq ÄQŽ­E»–Óö+"¦fxÑ>¢ÓSº¡[ÖÌyê¶‘òm¿+œÀe”•kÙ`x 5˜¸KW@ àÏZM'yb©ncR>6C¢‡A]@e 7ÂÊÄÚûU™9†ûCå-¯ª¡] bS2)…ÙÐ,ë"¥o$Ó–á¤ü +V‘Z¦÷òW̆›"- `V$±©fªµPÞ»0† ¢óib¢—aìê¡Bý‰l޾Gí¯¾p»›ƒGN»D$z¼6N£Ãq[-³"úÒ$ÏÂ\Ö,Ãæ ‰s…,r…D¹Bâ\!Qn Àñ©aFc‡:#±»AUb]ÑLâ©cZ“4Æ+h>ó†T'.&ÐkÕA6Ùî5ÈøWßà;±›^ôö>ÌÐlÅ®€”h ……5VOä¶šþf`ªê=MA&T7¾c×lü$Ùûá<€™ ` yKIBŽ ÿdê•‚O&¬Ö«æpµj·òÙcã"SQîά§¹ ušÏ‘žâG˜Ç¤¹´™Þêe‡rõ, ð:m.J˜ ¸UT7šW7ìýmxúôÒ›£ðVâ4½Z¯ã‚FeȨîÀ"ó–ÞÃ=lÓ¶*a›¬ç®õ¦L£u—G7;kQ—põ«1·Ï=;t³³2\#õúÅÕù†Îªªn=Êšv2©(9–;é6Ò$ƒª¢ˆT> R%Þ/Uõ­ùZÐ6%êE‘U4)èñ4e‚Îì˜åÍ•;ýá_9-þI¤,#%å5'Ìü¥75âeñX_½"{B=“êbhHóö[tÿ1]ñÌЄºÏ­$PÁJªüÃú(÷üœr-Q®*‚zÄ\.»÷âÜåŪlcØÑßÄ =!ƒîö}ÉÒSÓo¢eú)lÍ´7ïÊE°æ%ªÕÏêr´ÔÖÔÍ`/òÙª¨Ì<ìOãý­Üb%‹ø‚¹C­?ßWˆÖ ðuoe§bõª`«¸!<ÎÃæuÂÝ íÀœ¡iH@NÁyÁò„Pƒæ’¥#Æ2Bëî×V Q{Q](“HN?¼å°´bÕm™*3=Ñt£\U‡5bp)«Ë5uÒ Ž@b96“—+#ùñá,~˜†ueÍë+â5®\–”rÄÕ«PÉR!ƒ‚\ûêf×, uõr’Ô² >ÕÚq½JµBÈÊ Èœ « )…"/góíS†)¹þA ['¸+à⊄«¾«µ€€Ï°~¼¨iBÔwk9wnM[¬=ùf³-ó \ZáJ“+¯n(=7¯Ý3µéµúÂ7è<©S]¨S²þnÄqšwHõtT@ `ª~šœË¹‘CñààI+Ë…ª7š§aÙO œOt.ÑoÐÍ 6u$);U (¯R—yB®n*S{ˆ^þ“GPbíç9¡îþ|ójh•D½VÕÕ[6\ˆ¨þyT ëÐ Ÿ7ºƒÑY®–«ë†òGé9¢µ€ÀÒ¶eZJF_,~7DÜ4Ý÷]O±æ«¹B¡XcWã–æ¿obhµ ÖC¨'Ö'ü’I%/n÷¡o/¥³˜¦òAµX®#:ùRP ®þ]‡þÍ{±L?œ.Ú§ªßÅ®HJƒØ1W„–ëL¡Ó¿-[ zË€k_•—ìêŸ@1›1‹u(ú×+ïïþúB+q endstream endobj 2326 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 2327 0 R >> endobj 2328 0 obj 2838 endobj 1510 0 obj << /Type /Action /S /GoTo /D [2329 0 R /XYZ 72.0 356.807 null] >> endobj 2330 0 obj << /Type /Action /S /GoTo /D [2326 0 R /XYZ 72.0 489.179 null] >> endobj 2331 0 obj << /Type /Annot /Subtype /Link /Rect [ 170.22 523.277 266.31 532.277 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2330 0 R /H /I >> endobj 2333 0 obj << /Type /Annot /Subtype /Link /Rect [ 170.22 73.487 266.31 82.487 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2330 0 R /H /I >> endobj 2334 0 obj << /Length 2335 0 R /Filter /FlateDecode >> stream xœÍXÛnÜ6}߯ ò”1Ã;©¾¥HR´ RvQ© È+zW­.Iëäß;”VÒJ¢d;íƒ KR3œ ‡‡gòiE¿gîÇŠ Ð:]}:®S¤âê¸$ L˜I”¢á’D‰Ó9°v?Y˜oÑï«lEЫW !z‡™Ù¼Þêbu~âÛQÆOÉ?‚6«.W¯ÞID º¼éSÌ9¤&„hŽ æ,pºLÑÇ篣4Îâ²*Â*Î3TåyR¾¸B—?¯Þ^‚æ„`óÔb>¸5£µÆd\Kõ6¼Yƒ•fG÷iàÈxÚX¬44¿³.“‰ÇäÔái=çæ+Hi¬) ð ›A Q¡–*æÉ„7-æürZ–Šcðu…‰Aø Ï0§\!&š ¸3ûÒMä.sµ&éq žÕ wY¾+ããåzõ.çX$Pí2«}V<¨©úr¡VäG*£î5df¢…Ux–vÖ"U S8Z"ŒÇá¯èãl€T3¬% I§šgÛy“F,(^õ&=Á€}P¸¡zªš…©=+ìÆ~ÞÍgN‹B¹àã­žçì dž€°Qª~cËuïÐΚƒ* Dafá¶oØ{(ƒ½@Üæó0Iúñm'áub»W.½l~Ó «m/Tîì:¾‰mÔ­´ç~"VÝ$ «õ¶›Í§›…©†§†ÒÇCòÍ%[Úw^üÔ‡–å}BŠÍ>µYïzÜ'cßÚìekYùROÍÈ${ÖUi°TÄ•†öh¢þlš39Äpp×¹Km#Œ.·à[Þ¡¼¨²¼rŸ.ñwù¬ õEdŠ:“œ6&­kë1«Z¶ØÌ  Uð:sJšãŒfcUÄ#¿€2€Ò£1„—6§¶àh´i^Ô%{‡\wÅê ?4ÜÀ`À,B” †3ïƒÇn¨ó&.wIxW¢mm²C©-Ëpc”t“Ê6µ‡mbôä†0‰Ý3 „Œ{¶wµ]σ‘°“¯ÁwªÖyš†YäKÉôˆ 'Œ3,Dƒn3Wt!9BŒ”_£Û0‰Ûǧ¤ÜÕp÷„1ÒoYüÅ}.d´CÈ AÜ«%}–áÖÄ€PIœÆ€”îò}µÛW@hQ ^î`º²q÷±®òô~ ß|#ÓÁNàþC^Í¿ŒNž*@Oä"O¤25ÂØfÁf›8³åËn!‰ÿé¿^œ¿+ÛŒònè ¢—ûÝ./ú¹ËçYYÝ%ýNmv;»]–KÜëµ·ò4 Nä( ó÷žÃ*Qœ¨…Ñ^Aãé„:0òxjo?‡é.±K”ˆ+>.r4®/¨Å©Xao¢ëðû±¬ÛR˹-ášPO¥O5Zb6Þž2â‘nqµãÌçFç›ðîób,ç¦öH#Êgä¯4Çß-‘Ñs6|ôF h& `-]¿ƒõã貊½iL /´æâ}W=?B‰Ê*„Ò?ÄÕv|œ¹îªMÑ©É?ãiÿб¼©’‚V õT­ÅÕ¾c˜i—˜KI( V_0‡¼ˆîé„‚V†+PÔâá}ƒ0 :|Z„úÌù‡©Öy'Gû©áÍ%öNù’æú²@ßäÖ1ÿ€ø¢tÞÇ'¡kñ4¥©g‹¯ €%}$DPñ(/é˜b„ñ€ü™é|3<áïõª-nkb^ÏÿÎ÷Evò.ânŸ#E¯Ç-C¯' ])(L(ixG=nîÝÛqAΰ°n¨ùy=ªéynÏÎëyÜÅÒpóqSŽ.Ö”ƒq¦<Ɨغ;AÇ ]þ›ÌþWŽ.ÆO‡„„Å­ÈC8„Ó0Ðd* :­Â/Öî 1Ra ˺agQ79ÖB;±Ý¸/ fÞVP3 ‹^x„-ִщµÊ:íäwk@Øí¸Üæû¤?@Xºä§è&ó%)ÇL‹šbLb¯ rúÜ@åî¦:ðÊ8Vènã:Ü£_¯!7°Ñ. ‚o“Œäò[Ú.%€kC¨lQåþ>DÁ³0Ôù_ûéöéC¦ÚîCà2ãVñh_H´Cåô!S¥oèC¦›<¨i¯dW-ðà“ÿA=_ý ’Ë# endstream endobj 2332 0 obj [ 2331 0 R 2333 0 R ] endobj 2329 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 2332 0 R /Contents 2334 0 R >> endobj 2335 0 obj 1632 endobj 2337 0 obj << /Type /Action /S /GoTo /D [2326 0 R /XYZ 72.0 686.167 null] >> endobj 2338 0 obj << /Type /Annot /Subtype /Link /Rect [ 403.84 302.321 481.32 311.321 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2337 0 R /H /I >> endobj 2340 0 obj << /Type /Annot /Subtype /Link /Rect [ 158.0 198.254 195.77 207.254 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2304 0 R /H /I >> endobj 2341 0 obj << /Length 2342 0 R /Filter /FlateDecode >> stream xœÍ]oÛ8òÝ¿‚5î!UÔ·Š»úq=ä¶H7û°Þh‰¶…È’#Jq½ûÛwø!’’eoÛ¢ gHÎ÷ gÔçF.ü½å¿’;I’¢l7{VxŒbù‘B…®x¡ëúÈ /D;4D…¨„;öÂëWðkpà-úuVÍ\ôßÙo¿Ã™¹pï0sϤg–lê¬$ù\´™}XÌÞ~vÑbmLìGN’Fiš‚EÇ÷RþÇC‹úíjQ×%CëºA ]Ó†V½þ-þgn{©ã'ü6~îè:©rTÕ-ehG*²¡;Zµòþ›ù®ë$?šÉ"BÈÅqì¸ãP„ãK`$E¾5d J.ŒÔ@þ>+²{"±k |…?Œpç0Šã4Ó¶œdBž›^Š˜F½Ó`ñ¸\® TsNù09Iºw¿¾“:s›é“qtš`‹-EíqOQ½FY½Ûw-mPÇh.r– V¯Ûi`¿A9i‰£è©lA Ò8IÓ$Ö’|>#IèŽrIÊ:#mQW\òTƒ’q†i Yì&`MÏWL¿ÝŸašD££œiC7k›#ªºÝŠ6—5Änì„iìº.Ö*~9à Brt–³ËJÂX±.,M+Dº¼¨_ Ö‘*ø  åßÀF¹nJÇç ½ÑY.£™±õŽlÈE%ü\ÑÛ“=m. ûNPõSÅÿçsfÇI8<ÊÙKkKî{²ÛoKÚ^VÙsᡉ|ˆ™÷¶?ÇÒÃÉèì˜g¶%ûV»{ÀÇO4„úà¥*Lî*tn}]‘fŸÏÔ@Ê.kíÖÚfÄZ¸Jš‰œ ø°9þ—ªø7cìx¶›$lœ$L/‘Žz™Ó5éÊöF#d\ÊõsGsÔÔ ëÉKÒ!ì ¢ºdî+늊,1`Þo%&´†¶|¨µ°–ï;IÏ]­I³¡­U‚jøn­—ǺÓëŠ )$@ôª¤ëöV¨}3±Û›íɶșñÉuW–]€AeRp$øÎ(».RNX¦¡e†P5âÿs,¥ ¡j‘V0KT•*åU¯Íš˜%¯RËkkKF»âøWs¤ö½Wò’/©\ƒ'q_²©’K26×]ûWTTPîvržÞ·kQŸIVÝÀÀAy—£ßÇN{ùÁà ’}ÅòaT¬$BAêBG@©Fò*ûÙ7B ÝB [ªð±K Ÿ˜~y무Úô/M ž'³ûøðº ³™×z OŒ^³n¿¯ózõøXJ¦*£§CT%uŸkÕ¤Ñ×)߀YKI>ö<§„8̘(¢ ÜFg+ë€d6*Àzò$b »²®ƒj’$Ø;œ…¨ Ú’ûZmñḏfwO«ÝN¨Æ#µelj¬ë‰Aì(é“^"DyWk%¹¤j ć' ªÍZÚEQ·zoP}*ïë4Nµ±èS#r ¯E) ¯t t Ç„ ¢tdúæt˜OFg±ç;1ÿ‚EÁÄ-´¢0©NÌI!¤h.Ž0¾4Óœžë»Ÿˆ¼»Œ3 gÆ…è{ ­ìû–}ûí£˜–Úb9hµ ^u}T6 åßun!ª«·`C&V§ÊF|¦(Ë?Ë‘¦`"ßï*5(fPŠÀŸ<çø˜qƒæÿ†ü™ÿsÞç3XyÅóƒàÔx1 `êýø’7Nω‚XÝËÈõù®4åŸ Cè'So‚ÜëšRÌã óoJ^:ADK¡%¦lO2YµOE>lëÒ@ºû’à®c­VæÌõe-?©¨½£!,ŠÏ]ÝŠgr¬~8RaGš'ƿlj7SH„ À[¶ñâSÕŠdO¬$l‹æËå|ì\˜Ààpb&¼ òÏ:7œ:÷H_ÔL$ƒU‚P‰vLC2ÉäZXH¡ëÝJõªj益Òürý¡ó[$ì1[bæïï?Ío øõ› éœÒëû¯‹¹£!¨Ç µ£d¤6×4Ø4uÇí ¯àåx¢0Ì—WËëÞÈâ?f7dÎÿ endstream endobj 2339 0 obj [ 2338 0 R 2340 0 R ] endobj 2336 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 2339 0 R /Contents 2341 0 R >> endobj 2342 0 obj 2149 endobj 2304 0 obj << /Type /Action /S /GoTo /D [2343 0 R /XYZ 72.0 769.889 null] >> endobj 2344 0 obj << /Type /Annot /Subtype /Link /Rect [ 379.444 716.343 487.045 725.343 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2337 0 R /H /I >> endobj 2346 0 obj << /Type /Annot /Subtype /Link /Rect [ 282.123 704.463 307.103 713.343 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1713 0 R /H /I >> endobj 2347 0 obj << /Length 2348 0 R /Filter /FlateDecode >> stream xœÍYYÜ6~ï_AøeÇ@G–¨{p0ë…ƒµ7†'09N7{Z°Zl똞އüö-ªH±ZG'È“=0¦¾"Y,ÖÅ¢æË*`>ü|£eQàeYÎ6‡ÕÃXÊY˜Vì{}?d<òxÌì’³ÖP‚[ ~]̼gŸVÕÊgÿZýòÌÙ2ÖVþ‚ð^ÔÇÕ¢›™ôפŸÏW?ܯ^½‰Yà³û3q˜xYžäyͼçúg÷öËͽReÃvªfµÜÉZVùò7vÿ£[Ís/ÌôêöóGËEµe•jeâò «×ÿóþÂf¡ï{Ù×f²*BÈ¥iêùãP„ÿ‘"8(Q](2†¸ËO€¿Uö'ûTái~5Ê-`’ziäyšç0äe!ăàZÄ|5Ç› ×zõB}ÌÚ?dAêñÌ÷ýà }¥æðxv`Àñ<öQ$“Ïâp,%ûÒɺ EuÆ¢QÆBÈË4QQlRy_4ì%û&K½œÝ4rÓª"Œ½:‘qáÈ<9`µFÇh•£÷²<:tV²%[ˆCQ¢vœSÑî‰Ì=Ù±9W­xöãínaQ“eP‡F¥ ¬#+MÂØ‹E H×ò±+ÉDù|¬eÓ€Q›×5r;€=ÔÏõ€Àˆ¢qÒŽ²î¤´ýÔ‹¢âŠÛDÿ¿¢•ñýØAìùQìaNåzÃêO’ئ,§6MÂÑZ°¼vƒïÞ$ˆêì€Ú9Ú8ÁNT2¯—lör²•{õ&'‡:p¨!A0ÕBn;»v’\ø§IN»Í7êpÐàÀ°`Ï¡´V]{ìˆÉ´™‰ÍÊ“8“Ã?P{é…ÎÓ©wÒx¤pY4mQ=2(Z‹fSKYyöôP­¢Ëb€= :ÂPW° e¼‡;~Ñ^z\«i»¦‰m,À½âQÕÕ–•ÆqDÓt2£Ý‹Ö!HóÚ¡­hѸW=ÁMw<ªº%ò®Šg‡\Ú yã9®®¡#“êÓA•æ‰ïÇÜØt¯Ê­qÕëN@÷R–~wþøáßbèŸTÓ>Ö†×ï¤ãG4NŒ­ƒYdϽÀP¨éº6Ÿ9T”EKIQ5­[o_A@vÀ:ž¸î“ü‡‰ßtiEÝZ`‹|? ÐÛš†Sž-mîÏâ7EÝ8Ã’“¨.Þ@šÚͱƒ,a‰¡™Ód˜Õ妨‹ßÞYê×0Š¡‹jØwÚ Y82ˆ ö__ÞÚœÉg.pè:¯35°¥…±©Ÿ¦ÓàpÛ‡Ííx® Íú‚ÈWoàÓÄ®ÀâÈnßÞÝ~Çã«€‡Ûh·Å¡§C)My÷ÏPUäsïÓÚ,ëkCo#B#­«™CÁàôÆñÎd²#©çÍ`×îUí9ÆÕ͵†@U%‘kRÑè'¨~•81ßdlkŒBòIÖbæ²åPÏ/­†šb%€Ywv¦BØš>‘Õ‘Ögíà‰,Û‹'*Dù½±Ît2³¨Š¶%ÙR4t‡²\Ï醴¢r6€nF™ÊÙc“]3¥‰C#xi«·½PˆSw#ØÙ*ƒt½È8Ú¸p$½SŒ[@ï  —Y;¼•ú½¼u ŒÐۢܨ ƒ­ QdÙŽßLxx*D+g*´2#»˜àÖN ($êƒ=ôçJÈ]´ë0;ŒçˆÀ ›¢‘åÙs¼{ºØ¹11?2ìU‡H8²„ òÄ1zû:hï-ÇÑ­ËŦö ƒ`dt9ÏLëɇ˜ÔÔÒ­5ô‹ß_ªßˉ6ÈxF¨Ñi_ôZkú >÷‡ÕtÓÕr#Ú‰DcgMŠMÛAù;Û•úÞµbÌm7VûX´s%&äãÂüÎV©Ýü$Ô'pçÚñ„#I½ /ê+>ôâN¾ƒFj`ÛÊŽR]¹upp¨Ùª!3¡˜Ílø#jëbóÙA:dÞ'jù¥+jIvÄÊc¤ÌÆG8®Á&€­SAImgœxÓÇëÞL¿ŸëS¦ó®]«aê{~ýDó+}ÁtÚr_f|IäB_0]aû‚×?ßþñ;:òê)òh¼åT¯ˆgðXI©Ÿ]9êtÚòQáá¼$rá¨Óä¨ßáI×?zwWÅ|¼íµ^(J¡źùÎsSõÍ€~m²›;,òP‡O˜„#µÚvðîÇ[ÜðdݨjíæUeWȧBuDœîÅ϶?@IÜÕfr¶ê²"²ÔŽÎ¶ÙÌ­eÉÈïÍ­ƒФ£[ÔŽ“ïPHE#!Vø¼æôã‚£8^L¬¯Íkè hç•‚7–aƒõuê9ˆ-ÈÌ•é~9ýî¶^Ú£ÑõmæW”g#ëéM`~WÂu6Òð,œ%Èó`­ºÇ½ùÕçIräi\ËÍé´åÜŒ£hIäBnNWÌ”!öúý»ýé¿·ßá¢}Ë}ß¿zÂ8«s-gã4÷¸Nq?φœí›ímÑÿ„=Ôú; $Ô¦TÐ@@§–^3p¤Î$¼à¢Ú”4v‚m¶òWÝ¡—‰ÏÓ,¼â†é´e7$<^¹à†é Z"ÿ nèýr§äßuJ¦cå®9%‰s/Óžß|Sm“*uO!DGUTdpȯþSžéAV¢®‡¤›vóR±RÉÊRË4 ©kç‘–ÏÚÕ:&–ÒÝ”ƒä-ge ¢¢Úµ’l|ìàù»—DSÝéÍx8 FVÑWŠ¹ÊØGýb,êZ–òI?µõËô–üæÃêÿÉMè— endstream endobj 2345 0 obj [ 2344 0 R 2346 0 R ] endobj 2343 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 2345 0 R /Contents 2347 0 R >> endobj 2348 0 obj 2129 endobj 2350 0 obj << /Type /Annot /Subtype /Link /Rect [ 429.024 138.811 523.276 147.811 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 32 0 R /H /I >> endobj 2352 0 obj << /Type /Annot /Subtype /Link /Rect [ 123.33 126.811 215.56 135.811 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 32 0 R /H /I >> endobj 2353 0 obj << /Length 2354 0 R /Filter /FlateDecode >> stream xœÍXKoÜ6¾ï¯à!‡¸]Ó|I"s)Т)Z´‡ .z°@»æî Õc#i³v‹þ÷Îèý Ô“Ä1‡âp†Ão^ü¼á„Áß[ü¥§Z²O6Ÿ›yNA¤ßLyŒ*á1&‰PTx$!ã)ÄÀ3ˆv¿Fk>‘?6醑Ÿ6O°æ™0à»nØÂæÕV7º5 `ü5éÇÈqóýýæî½G8#÷‡ÞÄÒ§ÚøÆ°¨¦Rü#È}BÞÞgY\C–“ÜlnÓ½½y"÷¿ôÜÂP©‘›ƒ<6aÓg’f¥-H¦áÑ&6-kþïG6“ŒQýµ™ìÃHE€\”M¡?ŠÊzfêñÓH‘)YKÍÔ'¨/ªÌf³¡Âs~5Ê-ÐhÀ¹11ð‰ê„WkˆùjŽ7‹@½–O­ôÜÛN–ÜÛÀ£>y›Ø2ì©ý)ÌÃ}i󢟛x"—’ FTr¾õ£òü§¦L ¼ßÓŒñ€Ï˜zQèÈ‹ráþ4®À›”ûÆ%WsêƘPjMn>°H”œ³¼ Ó²Ÿ*³~ülÁ,í3 K‚&îí@ÉÇ(‰â0_·kfÐ*dcJPêÍš83TÎÅŽÊ7$P”“·‡¨ÂrMLN¦%ådIO9¶Y±ó¨4¨¤/Œ¸Ê4-q=Ù´#¢²ݰ5^K‡ýª¯Í²ô5°¢ñó¡¾f—n¼Ï’Ý6+Ô5lýgÿ!JâSûÒëe_ÂäÛUdsÉi ±â¦‡öú¥zŠ2åæ âþÇm–1æâ«bg¡ª¹Z´–è+ðæ#”à¢qU²lkÄbÀ@Æa g:wøTJôŠ@ö¡ýÅqvEÖ8*J²Ë#{áöå‡QZ"K,I2yÈÀsO8-†À“χKLàr{¼€Ó Wn‹âYÑ(À ¡ ùq¬‹ÑÔçàæ¾hqüöñ¦a!ƒµ¾O¤ßñÚß+\Ür& ϶A²¡òÊ€=½ƒ õ§-‹!C6 ŽÀpÐãœæâãÂ~¾`ýIsU€ëÉqÆÛ_ª3˜¾-ÙO\£ò4>âä>Ñ.BLìî²/pY¸ðPÌÖƒó|³%ßn+°|G=7V>¥xª½õÍ7‹Î€\qy›<ûHC¤ÆŒÔ„»šh"Cýeó¬# u«²*ÑÖ`²ìÞö;V‰²Ö¨Çí•tÓÞ@+ª}¨Ô|Ï8”^ö`É Ð jæ9i'ðçÒ}ê&Èׄ¥Gº¤¢ àÖ!ÉjOº$­¨h û*ÆN^8Pd(0ÿJì<¾,Û-^)M¡aL3¶ f²hw)±;›–Ƨž×”ss¦Z«ƒ3 ‚—TqW«ÀÁ¹¦$ã5}¹A×ëžÜAJ‚ÙÆ++Œ\Ãô•_cá­/B¤/¯2-·P«>)¡¼ ô#‚7ÙéÝš§5‡”ž†,ù_qoä·\@óÐb³¡Z—lHÔº#ž£cTÒžþ!ƒ“^²Ë`·8½sýò< "30­r§Ûäññ÷z¾˜0ôÊU…¸}F(¥Ï•ͲÃúu ¨F¤ÆWkÇæP‡‰ @/ß&¾`‹¦T˜óÿß;‚b ¼Œ‰@ËG`±•!Üwå3]䡿˜7 M3»1”ɦa›ï·\% Áñ‰lÎâ ŠõoB‹Rœbð ÊÔÑyθ% •ŽdS°ÔáÊe¦Z «ö hÐÄ"ÇÙ°°žpȵ9eø~Ýźus4¾À ¨ñ1¦iRÞW>¾ðAE|Éä=¥‡,OÚ±zššKÙQ-@ZzÐqn»IÈýݸn :fûÒQ€ðs9îdššÀƒ.@H|Z8N÷ÛëÇ¿v¼ÏÙþ‚íXu"‡q[cö‡É"C=àãà^óÕ§²<¿»»»^¯4y->ÇtŸ%³§TÙÎóž\/¯hgËÛ˜ˆ¯Ï0WEÅ»÷r ‹øÈÍ8ºÅ7ð›”È¡A¡‚´’ãÕ  ¯‰ÐàÌíR5*-lT½P$ˆùE„ï&ùS‚ÍVŸêLpÍ&=ò»Á³þ‡Í¿‰T‡• endstream endobj 2351 0 obj [ 2350 0 R 2352 0 R ] endobj 2349 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 2351 0 R /Contents 2353 0 R >> endobj 2354 0 obj 2027 endobj 1499 0 obj << /Type /Action /S /GoTo /D [2355 0 R /XYZ 72.0 477.679 null] >> endobj 2356 0 obj << /Type /Annot /Subtype /Link /Rect [ 177.44 683.479 214.65 692.359 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1445 0 R /H /I >> endobj 2358 0 obj << /Type /Action /S /GoTo /D [2349 0 R /XYZ 72.0 125.311 null] >> endobj 2359 0 obj << /Type /Annot /Subtype /Link /Rect [ 170.22 587.269 477.69 596.269 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2358 0 R /H /I >> endobj 2360 0 obj << /Type /Annot /Subtype /Link /Rect [ 170.22 244.859 266.31 253.859 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2330 0 R /H /I >> endobj 2361 0 obj << /Type /Annot /Subtype /Link /Rect [ 363.318 193.599 484.99 202.599 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2330 0 R /H /I >> endobj 2362 0 obj << /Type /Annot /Subtype /Link /Rect [ 156.0 181.599 254.87 190.599 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2358 0 R /H /I >> endobj 2363 0 obj << /Length 2364 0 R /Filter /FlateDecode >> stream xœÍXIoÜ6¾Ï¯à¥@RÄ,7Qdo)’ ‚FôàºgDÏÑ2‘4qüïû¨•Zë=؆=|¿Ç·ññÓ|ÙQDà÷Ê}(A±RÒÝ—vž¢!.Û©€`ÁB8¢³¥h< Äa¼ëFð1Z ò ý¹Ëvý¶»½ƒ5"€{Ø‘嵪»k϶vŒŸ“}w¿Üì~ú5@” ›û!Äœc„„#…9Ó›ݾx¥q—Uaª8ÏP•çIùòݼ߽½9Í Áê¹ù|=2j& CL¦µT«áÍÌ4Ý£‘!S±Ùe4ÓxÐ|®šLfßày=ãÖ+H†8¤TëPkx„Õ¨„¨¶*æÙ¸7/æìê½®kqäµD”bº£ÃDãìïyeo—Â$¡ia.a=‘´¼ËÐKxÆ)˜ø"/"[xr•û‚MO,ì}´˶°ÙÁzs‘©ÌÞ”¶ôæÌÙ•'ßyê›PF&,©HMœUðg#orÿè ù¥hÂà;/ÔÄùNy ¦èEi‹¯¶xåÍÔŽFÞÄÉ”žÔƨÎÖ~öD0ÓjÍáä‰ »¶º_ÍTëW»ÙÉn+hÌÇsß%™øþÆžmÅÙÑ¡%Vú¬¶ûÔãì’î›”4«îû¡ùjâÄì“aí([­¦xRó8<0Ÿ\™§ƒPũŽtõ`ïóbxW¾Â¹«!›¸º¯±Ðz]ù ÃcžGƒGÖ{Öä­_Êeü!OÓ&f|;ãoƒ F{¸æð4Bvqµv¹7¶ßÎI_í­±Þ¶m®¡´wQ΃¢Ä$(fŸ_*TƒÛ~Nû%¢î.b®àPXSÙh¿Ún¨`X hÄ\ÏÑÈEÏdîàÐÞØ]h0ÓªAýqvÞµ €`Y¯-Ž×ÓÝ…B˜c§¬½ ®N-W$ÜÌ›¸„ø?–È “MÎ(µei޵iq'h3ŠŒØÝLÀqø‚úØÍF™ÐÀ> ”Z@OÂ8 %K1‘ r ÖHŒ›àUaàÓ¿H‘‰‚×è«IâMŠN«ÁÖ9èãõ^S¸HTGðN1ôÈ$N㪬à Ezvuš£ÔT‡“‹vßö2¹Ø* ,iÄ€·e÷ö›IÏIE.U ¾Ï¹³•·—*BSß óeõ©6?O×:•_S i¢ Qž#š:Pl~Z—6Šö?l:+ƒ©e«¥è–+…×TÐ.¿qýý!†îæ D®Í íì!®NM– —¦BeåîþzÖåh}}ÿŒãåxY_8ó ÿbŒG{ø/¦8ª1m[ÌÖ`\¢; 5Y“šá4Àa ¡éI=D¾¬»ªiŽÆBµqèwŒB»‚A[äY~.ãr+2 ÝÒ¾´ßRg%l‡nW÷¡$ÄŠ»˜*¾€ìÚâÒVÕ äºJrÖoJ½®µ¥Hø–t·qþ¹¦˜@2• ÃŽõ”‡">wär (ŒPj­4iÇ—”šhI M¶»Ï;ÉgBíÜ>Þ'q~,ÌùôèM×Nûšê“1ˆu›óäõ貺›Ü{3[°øIÑå,ÜÒ=CÞÝ{B–ûÞÇKj3ß‹Ø÷ðµÙ«Ÿä,ô‚À› ˜\0‚¾™5&§€>/mØëN|Ð1aT·/GK«¹,¯Üã—x‰@&«¶nÀ˜c6BŠÿBQD9äíõþDŠ"T8Áü¯e®þ{(ÊýÝ%p¯ðpi«€k¥¼€± ú üdú”•Ÿ”‰ª×\,íü$:S;7ç2ã{I ý‡\º,Ñ'¼ì;D(°ûZÝ…Ô¼gÁ9£×ÇfÂfGxÍ(_õIüyx Œ-®ìð0Êû¡;5ݸ¼œÏy1È“ˆ1hÉœB­q* ta¿j"Ò)è’Ð[Ù'£œ2-Ê0~­ ã ºq¯âSi'P-%§ÑZä¨Ó]©‚´Ë7W‚â ZÙ|Ñ‘”b¦$kZ<™§JbâîBÝ]n‹> endobj 2364 0 obj 1630 endobj 1753 0 obj << /Type /Action /S /GoTo /D [2365 0 R /XYZ 72.0 445.533 null] >> endobj 2366 0 obj << /Type /Annot /Subtype /Link /Rect [ 170.22 239.065 477.69 248.065 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2358 0 R /H /I >> endobj 2368 0 obj << /Length 2369 0 R /Filter /FlateDecode >> stream xœÍXIo7¾ëWðRÀb†ûÒKÑ"I‘ hàZ@I# % :‹23²cýï}œÑ,šÍ.z± C$Åï½ÇÇï-ô·E~oü‡cÑ6Y};¯S¤âê¼$ L˜I” Ë%‰bÀô¬ÁÇÅ^˜Ð_«tEÐï«Ï_aOˆàVdFx%ênuÛ³í¼Æ/É>‚ö«ßÖ«×ï$¢­w‹¹ÂÆ*k-xÔ`άÿah ÏWë,‹ ´Ër”»Ë]ºu×_ÑúC‡fsãÑô‘W¤*ìÊ÷#v"FÂ!Ö 5¼>Eé’#.öI|öSÑE CÑ©ð\ñ¶lAlK—#¨iYè—ßß}º1FÚ*q-ûõ;Ž(»K”X(æ¥ÖB.>¾B¿ôd€€ªÁ…ö†œ/âî1ÍŽET4˜©s[ˆj¤m§gLlÈ›XRîoYÔû–,¡~–‹šnÕî7®ØæÑ±Œ²´ÁMe*ª(¶D"MŒŠc<(@ÈJ;Tœ ]å(ÛUîƒ(61¸ºÎcEß©â²(DÂZàjÃÖ? o˜5Iyzû0éAö”â"wúi÷t#Ͱ³°Ù•6£š­Õp”ÛC3I²°ýâËÕ©p€ÙKåD`«!")\ÕÈú›Ãìa9U ÀFoV]bw–¢tAë€*«Qîî#÷г{À)ïYF/U4ÞŒ£ÔA A#÷å/ÐŒ ¤„ËÔôL޷߃ä»%Â3-Y×z>BƶAgn¶?÷z‘Fω|ýŽÒ)R]ØÍ˜míPÇR qÈÊÊ@ %z´­²nå3bg˜¸àØPhž€'µH/(Ü,\Wk¹‘Yþü”}>VZJŸR4:¯ôyV‡±Ø4 { \ˆJèòk§€C,´œp{@VHmcl”Á&(ÜMîöîûqÖ¨ØZ0A ;eÂÂmb Þ¤¯ì?ee/¢€LVžáBª\ùÚ@Š«jy3éç»z©9\íºqšõÐùþäŸo½=TqtÛh¹wkï{’æÝÏŒÁFpt[ã=×ý\/ŠyÂêWÝZ–ÆãL"HôqÚ¹/ñU¢î-@š»¢ðé¸ lh£|¤€w–X ÕKZžɧŠEÓ*©jïl£$ ÇBú¬mèeÀÌ´Hî„•L¯¬û̇8ä{¤8ˆÒ¦}jΡG×É$ö9+5ŸÿDÂ`2€oz„1è&â —Œ™>‘P9•„îˆê:ÍûG2s‰ÿÝqk 4kŒ‘:€G˜»ÛÔUM|ŸhäIë}znÄ¡T·ljÌEi±Ä R¢¥·€>»äJ  €¬1Z/”Üñ¶ù’+áÒfDΔÜ1¢& 7?-¯ˆjZÊ• ®ú ·½ÂÛ´6]ö9³K•]ˆWï½ê½‰ê—ñðÿ`¾þ¹ÅÔ”2ÿ” 7S/bJ1'çà·Tø•(TÆ…è> endobj 2369 0 obj 1538 endobj 1763 0 obj << /Type /Action /S /GoTo /D [2370 0 R /XYZ 72.0 465.653 null] >> endobj 2371 0 obj << /Type /Annot /Subtype /Link /Rect [ 170.22 632.973 266.31 641.973 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2330 0 R /H /I >> endobj 2373 0 obj << /Type /Annot /Subtype /Link /Rect [ 363.318 582.965 484.99 591.965 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2330 0 R /H /I >> endobj 2374 0 obj << /Type /Annot /Subtype /Link /Rect [ 156.0 570.965 254.87 579.965 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2358 0 R /H /I >> endobj 2375 0 obj << /Type /Annot /Subtype /Link /Rect [ 138.0 142.713 161.32 151.713 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1713 0 R /H /I >> endobj 2376 0 obj << /Length 2377 0 R /Filter /FlateDecode >> stream xœÍY[“Û4~ϯÐã–!BWKâ ¦À´Ó–]†‡v™q'ñàØÁvÚîPþ;G¾_d%å©tèJZGç|::õïEþ¬í-(ÖÚ íiõw³N‘bˆÍ’$X0IGL`&Ñ —$J3°v?FßÂüˆþX¥+‚~Z½}‚ovˆîÊ,¯D=¬îº5ÀøKÒ ÃêûÇÕ7?JD zÜ÷ókc€Q93ö?†OèíÝc–%Úg9Ê£}”Gé6zñ„_÷hf0×Ma?2‡é¥Yè¦á!:EiYãxqÆ ÁúK£ì~¤"¸œR “©+Âÿóz Vj‰öW#E¦Óz—ÑJmAýsQe2Ó˜ ž{á£Ü² +JQÆÀ¯°¹UÒç1_ŒysgaV¯Îj>µ"–ÄNkS_FÅ6Ïeœ¥µÉ®„˱áp¤¡èM\”zÖZ`ƒîÂ$LÞ‡qn’¨_ÚÄ›$Îyx>>÷«EùœD)å1,ûÙ),·Ç~ÚªÊMô^ @žMäŒyDàWû^4Xš.6¾ô+ñÀœâmã}í¾5 fÀ®`°!7FÓæTzŠ>Ä@ð&B Ðípk‡ã€‰UŽJ„©eýRnQCªOó ã µÆTÀ½€ QÃ×ljÎ{À ™`^ÆÅ9 Ÿ ¢c”œÑ)* ˆÄN ã4N¨<‚w4V¨Ù2‰íÍ4Rq‡xKÂn³x–LHÞ–­h´ÍNZGŒÌ} (¡àJà ‹å!‡‹1ø;ô>Lâšxј1Ð6›c~Oã —$Ì-‰9ðÙ]ØN5—°¦¤c_ôáÃuJâS ×ÒŸ]Êó¥De†ª›fO¥² ¥!ØÐÇÄÈ*- àŠØü-Ú+ò3dÜűp%ÁÇ•®ÙÉÆ`îvan¢_ˆÒCœFÅ×ÝBÿÕÿöáþM\Fý/wY7„Ìß‹Ëùœåý|VEPÌ)¸§Á\?Ëùºæ£Å·'Ð)ÙD1½Ón´†£ ŒÏEãNÂïÅ´´±T™`BÕýÇéO÷¤šáª(’”Íe 8…ÈzC£K› ™”5ê‡áéœtë Lrpp]ÁÛ †¦Î ÷`þw»ÍöÛé·V$İ‘pE©ã–Í6F4§×ÙH™ ùçkü•×`(È&Úù3'¤ò.¢‘m}{Œ›€n•D6uŽÒcò«dX”!8ð‡¸$òX+¡¡[FzÙ¥Jû°Oÿz© ÄÖÞÿ¬^0(\l„b¢~·ÛÙvUjèîºÇ¶~©Ìú¡íךq××v+ç(/²Ô–&SaÝJUë´“8u Þ^ò¼î¦ëyòq·R5âõ0ÍnØÞÑkÃE³Ðh¶¦„aÙvðÍdÜÂ7‹µÊílíÃK2”0øînæù³í¯–dái8MÇÓp¨Ñsvɇ»÷S»t)¢ÜJx÷b°XÕ›ýt3ìDI:!ê†B(5•Ðv ñž„QúXûôr½î ˆã{Ï ¬µsĸ¶Znå%1$´oU'Ýù_ïö•X©;BŒBºeÍ;Ç\üÕ¢ÐåAéN¡ëwà]/.Ò%‡ÂÉÀÞFO™¤Ï¿¿Fú1*%<œ >þŸ£ÑóÅ1Ï.‡£/Pƒ mŒ5s׊F„~3ÉpV‚P£”¼^N[’gß_%y†—Ì–!‘UÜ{®ˆî¢ð–„bb»C*äÕü –ο¿fé§}¾]¶3 |‚û â™}©ª¯°5¼ždûnøêe7|&—*UÖÓ*£ÕÃ:´×ãß^=tã}–ŸÂ^ì>ÏNÝÄ÷¸-°í áÆaÀÐpgS`Ÿ?!Bˆ@:иS z”pš Ÿ»ñ&rZ™GEg„õ”žóè}œ]¦¯VöT˜œ¨uˆÊ®Åï_Æ t˜¦ª™ß«®ÓI…‚*ªéÖn|è†ò{‚iº¯¼s®jPÚ§m —¾ÖèØû3ûþêý™!¬Ý’Û§ŒäqMÞ“[C…E‚¹nS©˜Û© Ð#Íߤ5Ì'£}õDà’ WQî@I<ø·½ûÕ’ô)q endstream endobj 2372 0 obj [ 2371 0 R 2373 0 R 2374 0 R 2375 0 R ] endobj 2370 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 2372 0 R /Contents 2376 0 R >> endobj 2377 0 obj 1986 endobj 2379 0 obj << /Length 2380 0 R /Filter /FlateDecode >> stream xœÍT]oÛ }çWÜ—I‰´Q þ€×J[Õi/Q-í¡­&êÄ’ )v¶åßï:Nl×}N¢îÃ9]òJ"`øýÒ 2ލ” Šš¼žñ2"=C £1OÀcʨa%P!'œð·ƒ½Xïà'±„Áy|Æ=k`ÈûCØÌá§£È*ðvÞ€ókòÇ`Knsró-ˆA¾¹D,R*Uª”ÂD%\uy ‹Ü¹ªóàÍÆxc ³|†üû…ͲcG¨ÇFtm×`]k¨µÕ[SÛöü¯ù 3Á•×Ùj`[.Ë2ÊÆ­ˆ¿˜ŠC¤?±[—½Êéoг–ÙÄ1 O»ðjÌÍ7`šÑ,Š”Ê”Â%*-ģ䣎¹šëM›…w¾MOŸ»|,'îSá.°KFéôuÕº-vø¶´=BÓúÒnÏÄ‹f(s*05IÑóÁÓâ`ׯ7…óæiù¾lhY­ ;íuÑ?ús@Õ,Ñï-,q-‘”ÃÂy”êÖÅI(¨u0Xý*o¶‡J‡™¿{oš¦t¡Z³7E©«ùo<Àªk]UÇÏxt‡ Úéßfεi ½WË6(^ŽÓˆ¤E´v‡— “¥Aç¯È?bLj) endstream endobj 2378 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 2379 0 R >> endobj 2380 0 obj 480 endobj 2382 0 obj << /Length 2383 0 R /Filter /FlateDecode >> stream xœÍTKoœ0¾ûWÌ1‘Zglž¾¦m"å¶-RQ„5‹%YCõßw¼Ëæ¾€äyxf¾ùÆøÈ ½ßÝ’†‚§©‚¢aÇÑ. ‘Ä£)BÊ1rAkSµ‹Yr’hYí%½‚¿¬eìù…öì)îƒáÉO©þ°ÝÛ¸äk·D òôúîÖN’„ãùàOio#‹Ïè\+ 窯²²øüú%dÜ ÆËŒN3¿pvŸ±»„•ŸTœðD¥¥ÈÅS©Ü#!kàùFŠøö²'ö+»tb®¦½ía‘—‹ŠJ²Ú±ÿdH÷‡ërE‚\¦ "ƱoþG•¿ ÚRIY×Õ=”…WóZ›î`ó·ÊèÞ³ãØ½@m˜ÒÇÝVJ‰Ô'Í*ÓÃ-(.ঠŒê§#Ÿ«Kmu[èÉàŒ¢/}÷œ—±â1MTEBnPÊ=õ0Eo@Kt> endobj 2383 0 obj 469 endobj 874 0 obj << /Type /Action /S /GoTo /D [2384 0 R /XYZ 72.0 769.889 null] >> endobj 877 0 obj << /Type /Action /S /GoTo /D [2384 0 R /XYZ 72.0 277.981 null] >> endobj 2385 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.72 666.532 170.26 675.532 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2180 0 R /H /I >> endobj 2387 0 obj << /Type /Annot /Subtype /Link /Rect [ 175.26 666.532 200.8 675.532 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2194 0 R /H /I >> endobj 2388 0 obj << /Type /Action /S /GoTo /D [2381 0 R /XYZ 72.0 769.889 null] >> endobj 2389 0 obj << /Type /Annot /Subtype /Link /Rect [ 222.74 666.532 251.62 675.532 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2388 0 R /H /I >> endobj 2390 0 obj << /Type /Annot /Subtype /Link /Rect [ 442.991 619.454 505.274 628.454 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 148 0 R /H /I >> endobj 2391 0 obj << /Type /Annot /Subtype /Link /Rect [ 141.33 607.454 250.75 616.454 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 148 0 R /H /I >> endobj 2392 0 obj << /Type /Annot /Subtype /Link /Rect [ 140.0 158.042 200.27 167.042 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1270 0 R /H /I >> endobj 2393 0 obj << /Type /Annot /Subtype /Link /Rect [ 140.0 136.903 285.81 145.903 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1620 0 R /H /I >> endobj 2394 0 obj << /Type /Annot /Subtype /Link /Rect [ 140.0 115.764 157.22 124.764 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1692 0 R /H /I >> endobj 2395 0 obj << /Type /Annot /Subtype /Link /Rect [ 140.0 94.625 173.88 103.625 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1713 0 R /H /I >> endobj 2396 0 obj << /Type /Annot /Subtype /Link /Rect [ 140.0 73.486 166.1 82.486 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1114 0 R /H /I >> endobj 2397 0 obj << /Length 2398 0 R /Filter /FlateDecode >> stream xœÍ˒ܶñ¾_ÁS,Uv!¾ºÙŠå8Uq,{TJÖCbfPË!hÜÑæëÝ@HbìÊMV•·»‰n4ú ÌowQ¿ù§L#R–UÐ\î~Óô((â É5) Iga˜QJâ,¸kRt’ÇbÁŸÕZÀÏÁîú»0øîîã'XÓ!ð]Ÿï>8ºéIú¹&aHÊ/OÁkEA­㕘i@A‰òÓJ‘-Š»¬(xü{Såp§qè·¨ñù£\œî¾y¼{ót ƒÇ£Í¨VEQUUŸHWò¿8x¼_eÕëOÁã?î¾}ôÌsº}¬ÄR/É•Wa ÔQ? âʇ<äÊ aG$.‹0 óÏþî\‚ŽAN‚=Óñ™ÑkÀ8Óà'züÛ7hGB‘(ͤõ"”ÐðË¥îÛ‡Žõ4h:F{1!—t‡Çi QN¢2¯ª<Õj<žéHƒ×A‘¯êš(¨TwCÙfÑ0t¬©ãýt¯i´nÎ佑1ÐñÈÇ ëO†sÞÞ‹o q>LÔìv@@ÔÓÓD4òxf“Ñ·±œ¯¬6çFþÌZ* R¢Mg>ŠãÆ .aA¤­y¿ GZ‹yt¤*”\ØÐ+d!üØÑz²ßGzt6Ü+D-¢}ãˆÅãOûóGa´1@}à3œr½²ˆIC0Fqìa ÛC½a©JçÀCÙݳÜowˆÂäÖ«-š-O\’XÂ$̼{@´ïöŒ-RàÉÒêÖ>ì°e**’CQª²ÈwþâV%bÏ„x N£úÓRØn"(Kæ:œÌM/Èì(ÎHUÈôÏ ”õÔpìRr¤Ò®)p$•ÉHæUåïdø¬Qã Kç;ﻋé°ÑK1ø,a:³aP§ W&ÎSe‡XÜÆ*âÏlbâÆ^'Pö«*„²ŸDž#ª5è$Ó iœ<Üp~Ü.ªH’È@.Ïê³ÃÛ7oT‰ÏcCÁµ'Jz*v!Q¨,{Ÿ¶ Ëæ„›[©JRA…à£9XÊ"ƒªœÄàïær[('*‚ÐY!µçÝä‘~àʇ þöR7ËHE!ó× ÿ›]‚ë™A‡ŠÖ˰ŸÓ– aÆz¨Ið?zk‘SÏЦ,騎 ȯŽqX1œ_‚i(«ÄSšª„¤!¤j^ÙÞcúV0Aõ¥*鎼ëøUî1ÌãÀ':½Õ]äJ4[Wn,GÅTæ\\ìë—l…®â8߬~Tqe*C^&A/ Z·Ð¾Ø$àð|üjZèòð²€Í}ÁJSNB°¥u¾´µ¨\ªƒê­U÷Óû6 ìv#;…³T•A ë–¥?tV­'Ö·Û!ÏŸ”›óCëšôóI°ÆT·[¦Î n–Ð8ò2Ý×ñ©‹h³Ú:\•غmÁÍ÷*Ú ¬¤ yĉÖcs–`; °ŽŒþ™šU ƒ&Ôõ4õt­šI˜®WK-•‡Á³Ú£NˆÛÝÝ-Yøåp­;œ*rrÆiÁµxS÷9Pgáì|`½+Î¥Ã0P7‚=;œÞ:ØUWBž½XLÏH«Ïl´(¿:›é©Óäøyï±HRl,2± ëj)·HÁq˜8Ö ´j ñýãvÁ2Œ*+!Âôs}:JÂ#‘y²±w!üÝ¿,0x»]íܱÃXVˆî˜ˆ0Õ\øæÝ¹ó"­6†ÐæƒÞQÉ÷Ï´×gÒ4–°â€ùÊÑ‹#¢ê뀇⨉äï{G€ûYLgÚu÷–ôÂgWZ¿ÖÄÕU9g²î¬zpAì0³NÜÔ?™°Hª0JrßáWú;jñ•9!x\_n;‹M˜~ Hèú¢n¢ˆ¹_ެ£êë½÷3ša´Âh<„o;<©H > ³Ê§ä;1v·ý$OÁßaœyxÿz{Ó<‘Ï(U•&¾MÇÛ;æÜx1‡©}ϸWùA?ì—³5ŠÍ7ÄuÂh /ÐHO36<ÄégȾi‚ùß7ATÛ~ù*ÑqÕíõò-E½ºÒmÓ™Ï]@ó˜æN¨¹yé]xeôl‘F +áΤ,Ã0KI´ôD샸N0½²›¸ÅpdÑl³³Œ9ð¡Êž• ±¨.”ž­¦6ìøb øÆd£…u¢ëíTrp+>…ç %M¢•P¡Œæ‹nÕÇVn-A„Õ6#¸{,¯ûmÞÝ ß¦v¸K‡a{ÍÆx·\tE_Jp`â¶7 ÐÜGÚ,‡‘—«‹Ÿ†'c:1˜yžP«è™bû‘0”„–5Géj-ÁkíÚÐãƒ4Ùú`\Æÿÿ`6—‚Á<É IM24R6ß\žæÐY¨RyV­î°{Vª«WÅ‘ž‹>×jœFD…‚ëiizØ6kÛnƃ]‚9‚°~Á1Âír.v²`xgÕ²¨*½25Rì¶¼ÊW,Ú{LTä¡ëÁrè|> b ‡A¼}o)àׯpŒAü\->J!NõC*bºn¡ˆÙJ¯-½@mM/¼¿·*¨à^d gËëÛ¹=— ? £(N<¶ØœèÁjô—›m4MÔÃ|™.<" ¿‚ùvÏÑeÃ-mÍñ³<¢~¡m<¿gÄò7¿4.<Ì*@.òW? ÿúÚ+y’2eu€%žHÙ®Qjé¡PÍpæÊàüT¸‘G )Ch¸E–ïäÉbüõ‰b1¡òî™Úw9_ëÍ3yÑϨµ˜Ô§únÕ×íÖŽ0®Çæ×ªýzG ©§<µÉlŸV…œ,¸ADºg>­v«~ÒgÞýÌ×·Bš n2{.W7(`|lñí> endobj 2398 0 obj 2724 endobj 1067 0 obj << /Type /Action /S /GoTo /D [2399 0 R /XYZ 72.0 769.889 null] >> endobj 1070 0 obj << /Type /Action /S /GoTo /D [2399 0 R /XYZ 72.0 553.909 null] >> endobj 969 0 obj << /Type /Action /S /GoTo /D [2399 0 R /XYZ 72.0 453.551 null] >> endobj 2400 0 obj << /Type /Annot /Subtype /Link /Rect [ 330.402 683.031 355.942 692.031 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1692 0 R /H /I >> endobj 2402 0 obj << /Type /Annot /Subtype /Link /Rect [ 378.022 683.031 415.782 692.031 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1796 0 R /H /I >> endobj 2403 0 obj << /Type /Annot /Subtype /Link /Rect [ 275.224 649.22 307.444 658.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1930 0 R /H /I >> endobj 2404 0 obj << /Type /Annot /Subtype /Link /Rect [ 312.816 649.22 337.256 658.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1938 0 R /H /I >> endobj 2405 0 obj << /Type /Annot /Subtype /Link /Rect [ 455.412 649.22 490.402 658.22 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1940 0 R /H /I >> endobj 2406 0 obj << /Type /Annot /Subtype /Link /Rect [ 270.291 479.051 293.611 488.051 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1713 0 R /H /I >> endobj 2407 0 obj << /Type /Annot /Subtype /Link /Rect [ 312.343 479.051 341.783 488.051 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1824 0 R /H /I >> endobj 2408 0 obj << /Type /Annot /Subtype /Link /Rect [ 494.396 479.051 523.276 488.051 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2388 0 R /H /I >> endobj 2409 0 obj << /Length 2410 0 R /Filter /FlateDecode >> stream xœÍÙrä¸íÝ_¡·õTµe‘ºç-{LâTŽÝØ[›ÔÎVŠ-±Ýʨ¥^ö8_àÕ»íÉÓÌ<€DA\ê߯HÁÿñ§HHXeP®~Wtä4ˆ3EJ£0¡iÅIBš‡à””­XãTCðçä]À÷Á/WÝUüñê×ßà:ˆ`ÝóUt†¹duõ“£›zà¯I¿(x¼úöáêöC(xØYÓ"$IV–%X´cZŠ4x8¿^ÿƒïøÀ»ŠÖ±G~àÝôî·àáÏW?<œl:Ž¢°øÚöüÓ‰Šà3yž‡ÑÒ—$›i@AŽâщ"K¥œPpø÷¬ÊÑJãÈUxíF_rç=(‡·)˼,áQXœ¸P‘\r˜¯fwk_¡B/É4¢@ÔîÁÅòQ‘#H7ÊÕÞÕÖÃ2¤aðÝž ¬šøÀMêë¦{ƒ~4‡c?L¼j61´‘0±Ç¾IÄEXäpI ÅúþM [eO<˜ú nÆ ØÎ͸¦gï佂DHiBÈ{%%Ì$gØ‘+"zGX決üw÷V-óf–iàM°@œ&øæÃ¾ƒwÁ°ôõ±eMw3ñÏ“!íúáÀ,Z÷ܾÞõöÜF˜¶sÓN7MgÏìÅÀ°}×W-,‡ioáÊ‚¦èÃ0°’o¥°\ˆ†pP$ #ÜuãÄY-Ö‘˜×/ýl`½1‰ ÆœG‡¼·0Š»ýP.]iΗ–kn~Ð W>DÊüÂB#¸?NMßYtwA=›AÒ"L"EEä± «ëï–KŠ8,RYT\P‡uõ9¡q”…¡1É׿#_Ë“X\ÒˆÐ2¹ ·êðêÑwfã‘WÍîÅ5ÌÚ;ÊlÁÚx[7 à¾ØKºúC ì[ó›Û)øxýóÇ›âã;߯.Kˆ?iЬl9C?Š!2Éå`ÓožÆœG,¾ƒkƇÑ–‡Å!¥1„ˆˆk=¼¦C3.Åi˜$ ¼GÏ¢Íyi dðÖ2¡¾]óÎ',K!¤gàè¥o#Ly–²Jï<°`Û  bš8/ûn;ögõÁÅP¤€xê1*Ïâ\¥õ*+lœâð<þCzƒðßg>žh¥‡÷ͳíCCGšCM—c]h„q!ZŸ¾Í‚ŒM©v*%"b: D'NTE‚Œ©ª˜#áÅùB%Ò:˜(Î=Ê<òÉÓfPfŠKšÄž5V¥®>'VÜQrP¾B±ïk«§-å, (ÓKb6Cmg@ØL½­¬†ö¥g.¯ÉŠþ63&¢b eu•ݤØf»¾[b`sújÕ6àʲ$ŠávÿÂŽ‘ÖZˆX·VÖ9OÝN)¦iIÔu,ÖökTÇnCåy]—(ª*˜GGßóI­ÈÜB߯Ìá;‚/&;è¨L! PêajÙôÃYÅÄ9@V[«#Eÿ»?òîü²P‹ëg.Á¡½­ƒÇæ R[PµPùaiSH ì‰5-ÛBh“]fS@H¶Ès¢H(D;%f4F¢0ø‚ñ±†ö·Ÿ^€Á"Bý„¤¦‘›ÑÌú¸'àA?˜™‹Ù>“Eù¥åFüôÂ$†î×?Å|‚°,£§~°k&g?G6íGß’¿ÿ``Y+r?Nc54ÇÉ>ÝíŽÐÑL£Cq²‹=ä_5£bîH›†ÄÆ‚ƒPœïvM%B€l%i×òÏ0„è´à‹ww3„+±¡å0ØC«Béín^º§šfa\ÿ…p×ð¶6˜Ü ‚Ì@f†‚-"ÂûÞY?9B„föAoÛµ¼åÕ4ô]S’ªn|¹Ì뾚*H"EåHlUý ²]fa,’,Œ¥*T™J)‘]… ]Ä_(•?™§ PžПdÿ$@¨ë޳¬Däò®^½Üq”xl™f&·#_Ô¢EZ-Ö–X=p<öÚ_%;ÀaO- J ¢7âï}¢¼Š9ôPäA¢ª>…Š"ËÍã-4L|`Ó<ðÛ4 /`'ŽÒYÄ7<à$Œ‰áaî ¬3QC‡Ñv¬Z»pìûî½Áä™­%©©:"^I£…Êï‡GÖ5ÿÅ1¨õÇò3E[ãáÌeÌcü§NA">4D‡~x1 Î7am«AÓ¼ùNƒ"ñg™²uô¨úA 5ånY÷нgËЪLWÊ©@%fLU×±Ô“¥äxÚ,´ï9Í R œ…"-¨^öKÀù˜¦3ËปJ6èš$/¤e£òÑ)nã>÷˜"_NkÁ¢¢™…kÜÎÕ§@†’IN'ñ¨@{QjûÒV AJ9…›¶nâXzzÍ™ƒVƒf ëP£p蜒BÑäÀÂ`8½ô,UÊ0:óš›- ŽRy±Dõ„\!Γ/Ômm¿4*öÓZçy¨3•‚õV"gë¼2 #ñÓ…œÄ>î¯ÕyqËE•“gžåV¾ÞyhIoÒO|~#T’´ ÿ‡‚úö Ë× ZŠž“Kdë<ùdΡo}:Ú)~}·kçÁ´WH™ÈsТ(“Za¢f’U">ûëä­0fA;ïS5ðS˜;(Âw}76*t#…‡ÎsåCˆ@”‡â\µ›H›i–ûyoiª™E¤æðwy8²DŽw”ÛŽ$ -bº°ÅÀÙ(m˜d²éí ¨cƒz°·°[Ö#¥±Æy«ÓQÃíìûAOŽ–¢\æÇy ¥’>Y¤½p6„{pÞVU‘Zª²bª–ÕfOg‘‚¹NÍÎI#UØÂIÓTñ¤Ñ·P„B…@DóÔ#ôöLYD 5¾…²'}µ6Š“@…–BU· 6S&½Mý8õ_\Yáã~¢¾ÇÈ¢›8Yàl‘F¹Í(òo¼¸CRdNò~eaaB „E&hp>£pUõH Ê'g‘lôÔb˜IVïŸ$/I1¹Kb•.œôÊå78aš¬ðú_.gÌ:8æ¶(øm§Vd!?‡*¢Ô#HUíow1]ägµSö%ªR¸”ˆGBÏëúf_‰r‰Ýƪ÷ ‡³Ñ1óÞ9UâZÂkg_T-–csÛâá³¹9OÃŒde™å¹‡Ý«µÉ/-7âu1Øv©×«a,1T8ІyÄœ c—Ï*"—x†FÅ{ÝR# %$ ÞéD¡¶ôb@ù]Ôî’çàÊe:÷4€b_ü…8;hÖ/2’„”F¤ˆÔ$?äDvð†p×?ØäsD1F8 cÃÀºGîò ²gCm¹ Í“lõÅ^Ï#˜óÚ'ª¶ ìV/`Bø¬÷Æâ¢Ç ¯ùm\Pï:#mß¾8´Z¶½ïû[F³7†?LÈ´Erõ‰o&T{eíÜþêßrkIprIØòVž©DÞí $‰ÅE²^«ë\Ë7G|Z>ÏFëôñºÙy÷ªôí‡l%ÒmAÕ’>³Š®ùüÉæ4Œ2Qñ$‰gíÆ£Ñ¸ïûÉ¡#o=3…,.ÌÔ=݉åÐ#>³—õÖÄ FIJJsI…|ùu\^Í#ä]³%®œ<0ç—rz°‘‹åügŸ†¡àÀ¦`|ïžNi`¬~Œ÷‘Òtñ^ê{Oõ4OœNJa‡~ÆŸ‚)\e/…L…ôç' ˜»žk«É‡&‰™õx^„ø]ªƒË°çÕÌœ‘ŽcMÊdaÝ ’‚,?3hšn¾4*?”»/¼1åå$,EÓ›Bý¹VD¦¼Wʦ‹ …˜«³BþöáÞÁFˆÿ8ÜSý#_ÄLÝ©pã# ×F×hÿÅ6‰Ë(ŒEyU¦Ôg“C÷Ê—4ñƒûóë݃íN·98?ãÿéê×w!$ endstream endobj 2401 0 obj [ 2400 0 R 2402 0 R 2403 0 R 2404 0 R 2405 0 R 2406 0 R 2407 0 R 2408 0 R ] endobj 2399 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 2401 0 R /Contents 2409 0 R >> endobj 2410 0 obj 3650 endobj 2412 0 obj << /Length 2413 0 R /Filter /FlateDecode >> stream xœÍËrã6òî¯àÑSea|]“ÉfgwòZ;›lÅS[´Y¬¡H IY£ýúm<"+9Mr4ˆ~¢ÑÝhÈŸoH„áÿ•ø'gåy­÷7Ÿõ<‰²8¢©žJ0bq‚1Cqí£ùTÕg2ˆÇü3[ ð.úí¦¹ÁÑ÷7|„5›Þé{ˆKR÷7¿LdÓ `ü5ɇ£ç›onÞþ-‰Ž¶ÖÄq ö%ü—E9¢±qô°þ¸}hÛº¶m=UOuÕ>wåaWñþÍÇèá7ß=̧£ükÓû—™ˆà7Y–!|éO’ Us0£(ŠO3A.AÅe6£4PÿzEÆ ‰ñTà¥+}5Âù½(ÍPFÀ‹²¢€O(Ÿ¹QL²Ç|5ê-%rI¢8†ÉN«>–¡8Ç“™¤eZy¥ûåž+å…ñ–cy§‰ÀÉRÇ·8q‘B4K³ÑLTxóÇÙÅú<´>v|z¬ÏѺ®x3Dí6úß¾ûf”z¢|Hó$C )`^| îÏM{è«~ª}áÐ>‡ ¬(RÊfÚ+<‡Å ¼Ä‰ÞD«¸ˆÁ‘nÿÌŠe lNN“%…ÕÆË€Gû'¬G €¿ ‘"’¥Ç ›r(ŸÊžûH`Ãî±<[¢¼Jyàž§…Cûw~æy@¼Nû‚¢41Ns¶$Ñçš÷¾^mªŽ¯‡¶;{…¡8 PºÎ”(KLXêòÿ6PJˆWY‚Ò ‘<+ò¯6¼ª¦ª¶ñ Ââ•ë¬Àhâ vùÃw~àÌñùzÞ¬ÛMÕ<ûmºD’‚D‚n‹p}3Kã%…Õ6ph³¢á:²¸š¨Œb²$Р®Ÿ9+¬›þ5½“r#Äœ4§½w~Ö ÎWÉÇ(¡v×–¯*¿  ^cûª4–ÂæálIàýÏ«r³éxß{%ˆ“k”Sˆ—ÎX†®»ªý¬³<€x…ò^QCÀ¥…ÃñDŒ¨ù ÷ @) à_£;eå¢V …Cõ~ÎIâÇ»Bs NÏ Ûœ9ŽÐ|[ÕþøÌp@¿FqF”ˆs‹3שÛ#²ñO:˜Ç,³”áÇ``&˜] 4Çý"C|ZâH1áâ«)ŠQ“¤. «ƒ?8@D÷#ZÎè€ÁM ˆÌi–9HÚnðs§1àÂF™ÿªæ„ÅPLCeMIêÒý³Ÿ{ÂB˜–ùur@ˆJRº¸÷À¿ëbTóÏÊQ„Î/nsK9îý±Óæ5΃;A”‡‹G;HÈâÒÏŸ‘¯Ò>fàÏ Jû$vjï÷E‘¤–"dþUíS¸È¦àÎIêR =‡ã°·@U§!WÙ€Òaq×dÔƒV~î,a^c —y¨4 ìcâ 1Tû€ò á^§|ÕŽ¸óç™Sù£Ÿ{‘†0¯R¾(ï#Ìu›2 ;‹iõ*Õ…óƒïPâŠÄ«?s85ÌIºhjˆ$GÒ‹å~ ‚(ªá%Þêß^SBŒ>F~žÂ§Ä™ÎòÔÅóäOÆi1ò{ANàG<”}j»@ƒn¥ FÅ…?¤+T)(eªäsèú% óbоâŠC±P7qØß>7šfÀÂyîÇ\·ÍvSùn,Úì~ôÎ1T,)-|–q3i2^Ù®#Pâc!…*SzÇûuWlãÁß°$i‚² nWñeÃRôóè¶êͰ4£u»ß—ÍfUW ·“ªé8‚Ck†Ï¼á]9Ø¥ó73}ª†dçòñ6{|ƒÌÜ¥p/7]´A­„ÍÒôŽ“esÛ-`8è68§‹Ø®6=]˜ï›«cB‰!/‰ÊäùÎ0?íªõÎ@B²jz3QšQ]õƒ&Ò¯«A6›&8“ac†¿ÿðÁŒ7íú¸Wۦ׭×_ªæÙÌÈ|Å>4…°•A¢ÄaáQ0!ø´üá‹Qqn1£![ó9vbçl}ÏéÚ´ÕhÖ+'«Æ •#©qÇ?y?ð™Ù¶Ý¾ìâÖ ûae2ðû­6í„r–8ýd¥]Ôj[ñÍÝD”Ñû5çNž…âX,Íc27Rs÷Ý,’k m»vo!Ù!Cþµ©yßO¾ÑÃQÂêÉj°ã²î[ ºjàôrÊé\O„ÒFXKï™HWM=Þrˆ¼s|wÿÁ‚ítUã°¡sý~ÿá!RmíçÃã›\/*£oïï'Óòaõïp®T™ÁfœÛcmªþr°¡ ‰3¶»™ »™ »rT·'Õ023CÛÖÈ@ï'þæ¥êË'i²Ë ½n›ÉxkWïìô ÎÌw–x¿«`bcèž™nÅëŽ ¨øxKÀŠVN‡u ™[GÆ>¸Û~¼®-$ÓœM•ÐŽò3+=Ôx ¡P!TáŒ!ôÎLÔ–†Ý&ÚLÈWýŒ¾%!\Æ,ëʦ!Ä-Ø]NIÈá4Íf´èJºzëõ¸´ÃÊO\œ•xŸÚØùþ Ñmoáa'ƒ›†x³.ý±Ö–4k¸.¢©žÕ9_Ÿ[-M3á;jêPŠÂ¹¢ÆhŠ äÆÞˆj£>» U`”bÝ7W¿~P{³‚+øÜ^æB Êgn¡¬œžød5¤­³…´æ 臲އÉÚØlj­kßAvæçš—ý„è¦<Üäišiq,k ?BºãKcP_ã‰CQ“$(‘ Í¥nli'µFr<Š'1­tÔ^k$§a+å!—÷v|RGÜñe&é¡í‡Õ¡k×yT½b$é‡î¸–[á0TsƒH/;‰\_up8Ÿ¾ÝsÎÏÞ£?Y—S¸õ²îrŒh7þé0‘ |T®í|¯éT<§‰h¨½þ°bÇúÀU$ÁRKŒùûµçÚ¦ÍÒ Ìå 9Ä0Q cå.¹‰rr¸áÛRû¹5S4Nü§=ŽÃµ:«r¸+›gî"§ñG¸l΢Sd>;íêã8ªà†Ð•à&/—ÇF(˜ç öÂÍÚ]¹{ ç(ÉÀ/₾ú0»·\ÿÚî-1¼Ïïþd1¾ r/k.ò 8L¶¶*Æè Û£:£b|(eΗãÖ, ¼EB‘Š™j•-ù£À•¿!ŽŒeu#Gª¸Q“;3\»NÝx$xj»OÚ?h,g4µ*MˆØˆV˜ x±dÒ¯žYœÆ—ÛvYå¢êÓD½i‘Æ{da}ö©zP¦àµ> RyPO:Ó+謎=ä•÷ôÚ²™¬­¶<(–&€)–F¹õ­BA`*‡u»°ÎlC¨Lu'ðHnAYièCùÀ·`;ùtÿÃ÷ÞªÛ¯ž™\õŒ2Õù½…l€ìÄXG,—Ž7:ÍÛš‡vo;“Ýa„$½4B5íõúl–‘µŠÈ]u}uX‚À]â·”¼ú+–ë_ K çoa! Bo€t!\ˆT¯Óƒ†vå Ÿ€z4ôRÖGU×é |7ÈP>£ØûeN_ÔÀC;“ž„BbË”k …£"‡«g‘‡ àÎ;W’æ)ʳ F\¼»J‚$ÈH‘³ÜE. °þÖ ÔAl¯½â0ñ¢WPLËÿ`9ÜãWüJÏ!ÌòÌAª¿XÔÉT*ʸe€À ‹k‹ >e ±ec¿JAÊ_Ô,iÆUc¯6ãÜs;!3´–àá.C,ËT]»ÔÞíhÑp~¼ýïZyqP{^6½S»=ÔJp¯º¬¾…™ øXÛ’Õw©B9¡…¼ÑçG*—ßä@“H|ç 8'Uí÷|SÁŵž­y)«ZwCÆ9R4ËÝLžuÇùôóÓq˜/žß—SH˜[>JôGV‰Ù…Ut‡]aŠÇ3Up ;ᯯ¨ð}¸à$º$ðC7æG³lO•*ü$:¬2¦³O>¶ž…*®Xx[®«ºÎ]ÿÉùÁBUcÇûj.@9ø ïýäë“£úHhºØ‡f[=;Ý1ÉÅ~”&j\®×ü0XX3TÀx ìÌX)êÓÎBp•}îʽº«)¸ÑOØî&€Òíñ6×ÅOeCMN764ãvÂi{ìDQïПåúOb“ÚLœï_›ê˪®>q;¥ÚH½˜–jŘ3.ú 85•šÑ»œÙ ‡á‰Ûwê)oįó4W c©ÊÛ—²{ F{+ÌŽL*ó½Å$D ] ç*·bñËE\ä !qà„†-kq»˜â yL…ÿ3ƒ—Ñø£ðYÙRWýSQS=ñÈ<@D²§+½Ï›{ûú]sÉ=ô3C(züˆ‘ê§][Û&9A 9’]þôÙUÚ.–¿VÙ.æ?•öW´IAçˆ÷¼†ÊBîcŒLSB'qSÂë])ºúJ'§F¾ÈN½ßÚ±îDôLOÁÓoâNa€ãø~3Rá¸ìñªÙñÍHA&3ŒÔf´–nšâdn«é¨ ø !‡íÝCD¬Dÿ÷¿í7·⟈me$[ú°Þ&ø‘J­¥q‚rE4H÷ÚÒÁË_s Âä§ç~ïI¡°›a锚ÃñqS¼wÇA¾Pó$XˆÄ C5ÕoƒªÝ! ½ƒb¨S-ô{ŸÚ¾¯T¹$ÀÖÌ×å0>cH^*õJ¢#[å^R¼ºnOãøA2ÊÚᬘ«ºá_kÿMëV‹jáõ¼]"Å¿3 ÎS ø ê…öÔ¿ýöü|Rošjþ§ ÝðRÑÓ´} …t¾W•Gœ¦äBE¡…4¾2{µ•î.ÒÆ—¯öà> endobj 2413 0 obj 3739 endobj 1935 0 obj << /Type /Action /S /GoTo /D [2414 0 R /XYZ 72.0 769.889 null] >> endobj 2415 0 obj << /Type /Annot /Subtype /Link /Rect [ 235.403 526.867 312.613 535.867 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2063 0 R /H /I >> endobj 2417 0 obj << /Type /Annot /Subtype /Link /Rect [ 166.23 314.251 189.55 323.251 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1713 0 R /H /I >> endobj 2418 0 obj << /Type /Action /S /GoTo /D [2411 0 R /XYZ 72.0 769.889 null] >> endobj 2419 0 obj << /Type /Annot /Subtype /Link /Rect [ 277.894 314.251 306.774 323.251 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2418 0 R /H /I >> endobj 2420 0 obj << /Length 2421 0 R /Filter /FlateDecode >> stream xœÍ]ã¶ñ}7ÀZGê[ykš&¸v“âr4ÀÝ¢ mÚfN–|úXŸ[ô¿w†¤DJ¦œmŸ.AbÎH3œÎ'µŸï¡ðï ò˜y^Íñî³Á3’…$J *¡A&”F$Œƒ0!G2E%¤w+ø™¼ ðü㮺£äÇ»ÏðΖP ;ßÑæŠÕû»wŽlæXMòQ²¿ûîéîÍ a”<í¬‰£4È‹´( °hDaÿ„äéH>Ü?ÕuÙ’]ÝFìD#ªøæ™<ýÕR‡EåHÍ`?:#çÕ–Tu'Zräß‹£¨:Mÿ—§‰Í"Jƒük3Ù»‰ˆàrY–tîŠð_DÍM™ƒz— Fk E¦WSWàk/üj„[vÀ4 2ÆŠ"+ xäby|Ëc¾õ®%D¹S²1êG„eA˜SJÙÄ Ê2£¼Öýg~4á†ÆóX.Î1þhš M®‰Ör6²} f±ê»]NfQË"TêŠöcfó7cï›dSW/¢éZܦ_ð§”õ¾á§ƒÜ-ï8éjÒùåí{Ì GÞ º8&¹e$ VŸà¦ï/U}jeëÚ¤ðØ$ƒ"I0œÚDÓyìXÐkò YE´ ÷Vb\€~Æ‚±034Pæ ¬÷«­h;YñNÖÕ¢ !½ÅåÙ‘é0®]ìï^lù ùÃ, "0w^d‰_þR¼ˆrQò^¡×¤ö°âÆN½šµoÃzªd(ðß‹vÓÈ“å„å,HQ‡œ&“XÇCcTÚØ.XÔwrý$~sN qqШ‡K'+h,,ˆíÅìåÀA~ãT×e`Á'W¾Ñ…=ŠÌÝAce» êI]g4bë±mNDÕ£‹òM©"ÌupˆjÙ¡›·½ìøºê½5£vd‚§ÿþÇŸßüöÓãdF‚,åÙšp0…i8Õ»ÿZî‡FD¥'åqZ €ãnÄiÈ­ˆé«­hÊ˘Ñç¦[×/0&Q¦£ÜˆVájÉG‚Ï ½nåN]uÕÖ®ð|î,¨{žÏt%ŽA‡ý P˪îÆu#øV*Ci¸JK €ÑŽ­(_T51(ËÆòÞ”0Ri¡…:è£Ò¡×Úˆz­½&ᧃ´»:KWxŒSað¦cj]K(ž¡Y@Ŭª%.NMý"·š›ß5ßšËN¥…ÖÕV˜£õª=Ô}9¼½M½¢ú,güwâlV–NPW<Ž´mÛUW1èpà/ó;ETúÄ©Ò:ÉBŸQÌúÈ·¤j¥Y×ÍV'S º ö¢³8M[W*z\Û—î$4æ­Ã™W lx+œg­³åÁa9ĻފÒyUÇŒÃ,g×€X—»ÇTa<3UY·íj×}o‘`;ÓÔVX|,nâÙ·ÝYaT0À¹¶À yt9é.MƒÒYk7À dƒü"¾µ¨·;»Ö¾7Ð!vöÓÉÁchžB'm%ö‡x1…±ŠÔ«Èšo>=¨–D;9K¨ÊæD܃ »¦>bµ ÂæË³R &e¥f¬a»º,ë3æã‘Ž~:[sS¦,ê)2ZΡ_R• êñ·ò0ˆX3Edd`sISêyË–ˆ4Tå³ê­‡׉|™r sà°ðÈÕ®U³ô°ÄT§4èŒjú[ƒ›ô= SÊOšÊaWñ£xðØ¡ˆgv8CÓwè”XÐ`j®îz­¯Á´'±‘;¹Ñ‡ºH8hg@£žt¿`aW·¾v´«Kïôªc*¼+#/¯õi:ÓßirMàå™_Zy×Ä$Œ'g ]ŽÛwy¢!¡ÝJ³"Ϩáz<ñú­Ñ™;º `œ—*Jõ‹ˆYê„…«Á¢ÌÎ\ävñL ]õ ;&ÂìËObðidéßÒ£TÌfJiɦ’§ØqÌ4,ªMm&PPÍ­^ª|3ãw8Ë dZóÖ"ú fàÖ%×££–J×åç^´VnY;ÜTN¾I4ÓW947¹Ó(©õŒâ/Œ0c‚ÿ]sR :Ïg–I‚4Ц_ÓŒ;Ùc×° G½|­t8éæ„GÆ ÏVj’ë9Qã[SÒü–|ø£¡¿ q•&õò(LÑŒÜút48xüÀ¡íà ùÐm“ðÊsxi2?¼ºù¤ª- Øh,#®ÇF@A0Ìë­Á¡P€-ƒ#JV P§dt‘ NËzÿ`üŠáä}èì¤vmƒhûÖO²lfœäp:ÿ$1 C<Öfo¯Àc-lš°"Ë’Ø|^ûØã]äæß‹˜1Ÿÿ­J,Õ®%J ¯›Ò“×^ç%¬YšPçªIÿ®{nà HÕ»ÍÒ´æÐ÷Âîš~µ|¥‹¢^½ãÚŠqâ¡ð^Ê/\:Bk•À¸x“Qófa\ÞL­Àq”VÐ /ûá¶Q!èƒ0Ð¥Ýáâ“)Hµögc…ÄK¡jïî:X/½¾ƒBý½EÂ<6h;h-—/›£< ò,¿`> >¼J‚$€\˜Ç¹G{iá nÜÿg·¨­¸(N ã@QDÐïÇ™‡áíqYhi˜ø„™Çd ¾Ng/ÁÄ5µS˜ê.–â˜fÆ} (Ÿ!S‚…}~>ˆÆ>7×±j –ײÒ°vmÛ×›®¶û/æ¥(‚4—eE‘æ‘GzãKRt‹pÜùãý¿DS«+=n¯µ;B—™°õ˜?¦Oø×M‘º¾k‡ø‰Ì¥¡ûL…@à` }»8à”•<ÅVÚë5óÎ —åp#`p&¥Dîmâ°ç¦1C³AèËçe—ù‘» z¢Ù‰‰PXn=VÁ?NšXŶ7@9ý&`‹ŽÀ"ôýòˆ‡/[þ\ÇËdv[Ó¨®Œ£é&Ÿ%†‡õ‹:¯XxÇ7êÓ„£«iŸ $+»6 ÔÈ—wËŒ}ë<]_uöpѼváG>¹‡™Pí’æª©íšoð‚ÖÂfC a`1j¸!è A´oøQ™ÕꋳíÁ´nïssÅ®÷ÓÕаƒkg§]ßà×þñ> endobj 2421 0 obj 3134 endobj 2423 0 obj << /Length 2424 0 R /Filter /FlateDecode >> stream xœÍËŽÛ8òÞ_¡ch+õÞÛ™d‘$ÓÞÝÓs-Ú"KŽÝé¿ß"‹")‰’`™ºŠb‹Åb½èùvç9þmøŸ$ðÜ$Iýùî›÷œ˜:~$‡Bâ4$Äw¼À¥¡svÆC¡Sr Fs?9ÿ½«îˆóûÝ_ÜÜ!@÷rG˜ VwŸ Ùä€&ùˆs¼{·½{û[èxÄÙ´ŠiúõRø/v×§J©³=;ÝoëºlCÝ8»bWõ±É.§‚µoþv¶ÿ¼ûu;Ú¸Oˆ›ülûþ<ì&Žc—LíI°ñq F#ÿ4dŠâ*£Üþ]™Ì$&¦ÀsSúi„[¶¢(vc¬(NSøä¢^²f1?ÍöæÆB¹\ÄÄP#7ŸN7$³›³)pÇ6U‘Ùlg˜ S§³)H>ÿáÓ&Ëó†µò&òs±­9”LHYç¼q6 p½ïNLÁ>)P²Vx}°Rìêï ~9û“ MÛôUUTG+ƒìr)‹}Öu¥ÆZÖ<³F“³C¾ËŸî½§7®µj;–å×äûð •cªÃ§®VG¼ÄGu轂;÷¯u?€û¬À¬lën/l_^à©n»*;+xÕd®²xRç/“"Vù-2øKhLHB,§/ :½pÝÌoiœL¦×•8σ@!¯;ÂÒi»\M«ᢩpžŸ¸ž‚ìr¾;³æ¸¸1/ò]:R íÃ-«G‰K½(MCÌ9d%kºåÕ“VÚ òpõ”º”rHéœÃnÑââ”D 6 %ÑnÂwJÁÇ–µYÓ,/M}7 ’ùžÅ>nZšBTCžçZ8¼d SËëGP†¤@‘ôׇ‰”Y8TuWìÙòò©ÛâÐûÁc§iä†%žgS}QêÅÅ}º7™”&?¶¸ïÅ.õƒ4 ýpÎ!g»~Yó>÷1ÐÆñºæ!@BŒè ˆ.¯zô R ÃGÈP.±õqî}R2 Z<`‰´‚¸žâŠªàYK;d%b|Ñ…zà £X‚úfÌ7Þò]é2!OÑf»’µz„Ç­!éûú|)YŠ1äýÅ$xQÈxïeñ•ݰcnKH Þ–™èˑˇ;²L§>³¬2öÛ²Ncu…ç?|có#öð>CòƉx]à/™i©GÎ$fGT2ŽÈL#SÀ_4x*Ž25Ps dÐﰌܢÃƆ¹m»&£Îe%´¨Â›æh"CÝPˆ-±²t5ºxàiê)”S4-—³„k„† EYj¬¨öeŸ3= \ˆF‡Ó2DßžŒéeÖux$ˆc.‘1j‘]Ý2i’È®¯ò¬êôz„±˜6ó4ÖÕ–“ Ó,){®‹ÜéxÒÉm¥¯„pæƒr’Û®Éö_¼~©¨ÀœÛ[+/JxP #é>®•óù×j€9/EÉ®Õ^D&”FFFþ‡È¡GAì’u'cb­áLƒÃ]DzÉd-ïžÀûC¬a{qfAŽÓ‘)âÐöõÂ/n9Úr±º/sî Þñ¢Õ-lºbfê§-¾µØ^L'“ž³æ-lä­¨À³Õ£òBbap³¦pëyNé“PZàùzW#šÐÈÊŒz¢~):Qä!ÚõM¥?B–Y7Ýg}+ŠjDEUà¹h[Œ¢ˆƒ&Xê=ÓÄO÷…Ë\Í«èLV}§`Hïœ=gEÉ#¶)*-ëIçY—í²–=½™õ’‰Š l\¦±íƒÃ÷Å¥çW츛h×°(d*)p|B!ξÎÙ­GF!¡¡ ¶O‡,æ5§1ŸÍiÌ)°Š¾j2éþ-¼7•áD õE6žä·ZºÅƒø „o“‰†Q(i$Èõ`8¶1dˆÒö—K-­p&L—5«Ð­ÁѬ/;‹qDK¡X IHãÞ…ðÐã¹ ÚQú@RF¦?úà Bà«þpP  w‘i@Ð÷J®;4üáË‘ }“aUÐ\#52~xÐÒjš k6ÄÑDûSváQÂQøù¶ãþ}ˆ§àpñdÝCšÏö=–7_*üÌ0‰yA.«d6ÿê™Q\ê¡m°|=|L¨x;˜*§æþ€Ã¼±‹m20¡Ë?˜ [lÔÞª߇{Áº)ñ¤B¾]6&4ü.À¹û¢‘Wt§ºWh /¢¯»ƒ„<ǾÍbÇz“}ìëéÙeÁ*cöÜ·ÌÊý|^›®8«1y1[µ˜°VBØ·t¥!¶wúœ•ý`›ü^åµÃCH §Å÷ Vy>Ã=Ü”EÅ wìæœÏ‡*šFp5Ò8–‡qÕ±úPiбnâÔMuþ‚˜v%òk­á†}ƒuz 3¾e/)t—_r=X‰öuý•ÓŒëÕ.ÿiòž;ɶ1ö ŸU@èDp¸g^N"å+#Q,¼àKöªGÕT¹!q‡èÐj6âœ%,ÓKB<€š£QÓÞ×ûw E¿È¡í¯4Í+Xû‰1¬QH¡]Ëùëéhƒ w! âOvxÿÎÉ›‚?ÒàºÑè?âmhnkÎМyÍ šsÅ.¯ÙqÕÈ@€Õ„4/Õ1["¦%éQ±Œ«ñ!ˆ"Φkø£¹¥4ÙœÁ1ÙϾu}i>–ùEµéØw›ÑFDmrTá[pñ¬‡š×ûþÌlD™áÍçšÀ…ð!¤*ŸÔ6Ë d~º³ùWÏxFnÿÒw›îõrý¼¡º?²’í¹ÿ z.¦`ä«?Waèï^n®Ç¢MMˆç–µó¿ÒîKWiµXµ¬b×´`Ú þøû¿>*dìõ®ïƇ¢.‰¾›ï˽¼4† ˆi”¬mƒãHü¹‡Pð鿈m¨¿%ÊO÷ï·ï7¼ŠÊŒa|”†'‰@1úôÆœºÒÐíˆÅÄ&`¾ ɲvhC¡Äih¡5–Gõ (h'½½ùOh kJ±(jÈñºO÷-$ç †zˆÅcúÊSuSn#XíœcÇŠe%xAìÜDx::§U‹£ư†ð§@¸s„çv~e4ærð‡­Ô&ì!\9É43b? ?´‰ðÿ³‰€ÿË #›À‚ògsàV3¢A‘—wÅn˾(t.ŽctBxõ ÒOÀÓùüÜgË6Ýaå Òƒ]òçËØ·ªµMÑÿÜþ¶ ·«Æ±@˜û}…ˆè,Á!<È­âS"9ƒÒò Ùx«ÙØ^Â`Ìäj›P¥áe(ýS>ȳ¯‡)!äœjTµ0£¨†b H®)þYžæz²ƒª“ŽÐ’¢„¨z˾Ãi§Ba*z¶}Ã!²Y*††ô 1ÞyË4xVÝ}9ñ aÈÏö¬© ŽÆGÙÁ@dhØ#&wRbŽd]ÛHÇqî´EÑ,Z 9/?B ‡ü1©sDÞ?>>~Ô¨‘ÞÿC~¨LjYž lŸµ3¹iÉê4´žïÍ™Ëyµ¡,‰jÛÛZÖãG«´Ëú0w„§«¶Ö»O¢L64°åÛ8 éâp08€ #<<'KLƒPÀ¹F¿˜ëHŽÆÊ½Áx6ˆz÷Ø‘uÖÕ”A *ë3…ëÇ–‘:Ò©÷4ûÂÎàhzX.pÙ„M,†R?t#Þv£A`Ya=e„ºÓõxW;H ±;ßCäñ³@AY­þQwŒß°¤@^ñ!¼ï›Ïñ‚?ó3öÁJ³øöI)l™€Qâ[Z)‡¨¯QΖžH  7ð“4 }›2V³/ùk´juÕÍATZ$"Òþ‘ï ꛂ´SDܼh–3£‹¢~³†¢ëÎXÞjTºfËȆãMVµ<ÊÈè6›œiP6K$“iP qß!ÃÃÕDǧØ0d•qZö å; ‡ä~o—xÉ«°ˆB‚I©…‡–B‡ר˜MNËüR—Æ>:áùÚ„-%:oÂLín%cNm$Ž4³}à iÁåE…:Äø^ü¾Åág4jîÝØ¡ˆBþs»4ɰíZƒb6ýZbFÀ[ÁWß“1þ.Òvo0. 3ls#މ-ÂØ«~;þ5~R¿£F4/²²>öšmaN…¤(9ü¢¨«Šÿ¤Ê`,¯"}Õö{ž zK[;âsì炵EC«á—F¾ù ʸó»•r‚ŒƒˆíŒ¹ü¦ÈÅ[¦7(óÑ¢²{†H—}ÅßáÊ™üzæA&‘r®L8äÇsÝcN ÷r0fâK€ÄN™¥òŽx;ÄÔ +³‹nº‰ÿMâóÝÿˆ¨@ó endstream endobj 2422 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 2423 0 R >> endobj 2424 0 obj 3490 endobj 2426 0 obj << /Length 2427 0 R /Filter /FlateDecode >> stream xœí[Ýsã¶×_·ú:6K‚Ÿê[/îç´¤Ö¤¹<@"$aŽ"uiEýë³ $HJq}±:u.3Æ.ìø-v±€¾,<ä¿ñ' <'I–hsX|Q|Åù‘b…®àÐu}äÑõY!ÊD£€u þôê½Gÿ^ä ýyñÃP'E.´;-܉Λ®žßº© P¾%ý\´[|\-~÷§y.Zm»)Æ̯·„ÿb”8>¥%F«úánUGÛ¢Dk¶ÎX±+ÉqÏ(ÿð#ZýmñÇUoà¾ë:É­û»žŠ€›8Žwˆ§¦_ò€#{ŸzŠ I)¥Ç‘#'Uv-]SaJ7£Ü4Š¢Ø‰=@Q¼\Â''éÁ{Ë9ÄÜÌðl°`¡—ëD «Tƒ_$–å<ÔrÄcSåZµ‘® U‡µ1h>¬Ÿ“•MÄŠŒÉˆvžh…> ‡Ø Ð]µ§m¹æ´¶ aïcSR‘5áƒl6”s§¥ÿYTô÷-µÚ3>-$§4툢SmÝÕa)Í+¶!Y§N1ªYVìX.'Äœ;>`Ìõ¿›7Tl‘h+4rP£$ü¯9M’~©Y ú89Ææ{;~¨÷ Õ tè‡Fè;‰AXiñð|ií¢pÐäÛ’åG •³"G$OѦ8žK¶ÛWˆå°bRÁ—{¡hŽèO¬â×ê—Ä0K>à$Òú}I¿årÐäéĪ͞r1c äº€Y:)½VКøár™„Râ4g@výK&d·8ÎOE™^¬0ê·T–$üL‹CIè>;Ž2¦‘º¦9IŽaO’Ñ”$µEMÉÒ6¥¨ÂÐrmˆé™•R¬˜Pr²¼ ˜˜Íiójk¼®yyQ`¿:?]\Ò8´y¢`RZCŽêœæ›ò|¬hzµ`‰´ ­ÇyÂVý‹¶ZlŠ|›²ò¢+ð¼Aç#ݰíY¬3v}è[¯º¢ Sº©ŠÒ¬qÚÓ’N¶ØeÅZ"J1„nlW—;dð·,£Ü I¯ÓñŠþhjÒ-©³êÞl™2ÿE·m´bìÆOŽÇ ,@¨&u°^|n e·MFÊ:ÊXS¿– X÷´¥þ¤ÊŽIÕµéšófy˜´fÙ¶°35²ô¡#÷ÃÁÀyEÐ2ˆšõÌUq]³,•ý Rö.JG²ùLvÔQäJê+ŠŒß«Ò¹¨U)-òßèïj/êw§nÙˆ…¿ó0öF´ž±$ßÃs-•àâ¨Kuž‰=g¨}ÍÛQÃ:‡#¬h:2§A<±f9)áTŽ6Žš×`Y¡Ðu¨³sÐú ÛždÂ4THO®6_ˆQ]¬·8ÆÄNÄÈzãuŽC'^†®çÊû>2²Ë {:ŸÝ `—‚ˆÐ aãK¢0Vg<G%°Á݉À¡£6àÁ;JEsMÙ5ØÛ®¬¬Q'ð2µe9u:ò¯Æ§3›­ ‘Þ¸˜ÊTVê â¡–QÒª.sjpHnŒ°,‹ò¾£U¬;&£4¤œˆ1z2@Ì«[l^w4§% ¡ÑZž²ƒÊ’yEʪ>¢Œ}¦€‡ ° \'y&,#ë Â'z€­â—‚¢2'ôÅÁ Úèñ¹]]‚‡ùŽ <Õ©¡¤Ûÿˆ>“¬&•¾ZûÄ 9qE^ÑóaßuEf!Œ¦».7³ZyŸÎt‚ú۱؆lRzz!Ä`9L<ÉØ(‚¨˜f[Go&1D…Ö $‰x±86ii–à ÏA•á<ÛÃæ$ ;ƒÑ‘<ÏÂ-2AòÌù |xsŽ…€Ò‹»c­Aªc­ï9KóXû€çϵ²ku´µºSù©¿WÓ‹œx X£ºL¨pU÷–&òC37"Ï¡ªÁpméŠ3=m3¢ûÕši넪å1͘ùN§Y \k0Bp“6ˆ‡Èv›LIÖtý=8·Ñt‰—N_€þŠÃï {Èþ 8™ëú"D=ʘy<ÿ殆“™‰û p²ÓqSp(຾àÞÑvmß@0aß(Ú¤ À‘F£h»‰=*p-ÈîëíQº{KùAϽ®ãµ¥WLînRt¿Zãû:¡Ž  8]£DN¦øñ+×¾8h­Œ­gÝá;¢nQo œOwy‘ÓOfÜÞ­ÂfpÃÕq: ½cë-±¥&Ë0ÝIµ7ÈbkÄ(·É¿AîÀEÀ‰¶"pj•ù>”LÐß“’6'ÑŽ×æ-r V÷¾ÈÔ›—`«G~þ²úÇßQEǬ9ÔÓjãÌyí0šˆobË¢àõì@woi"?h4éj0^[ºâÌNînRt¿Zã¨;¡Wxík”èˆ)þjQiúô‚Û~‡ÔMBê-‘sÛ¾QØLºíHïØzKl)·~ãŽåerÔõ³cðTº÷²ËÖWN„#–WIšªÔµ½"Í{]¿¹‘ºìºåe•ÖŽw—¸ŠSõǨqƒg]æ»(ˆRT/¾x‚î6¬jo:‹fTœò¹Á’q"@ÍÒ&1i±©›næ»7¥ÿ¿[òMG²£ålÐñ§Û„Ó[¢†WiQÏ%Èo4ï!Ç#K…8(2*(NÆr³‚ô¡Š FÙØ×æ‚ýšÈóB'–¯ ÒI+Ž~Ù')ý±6HùŠhBŸË‰Œ ¼ØmÀ’˜I«W…’ YVœÌÊ›²È2•äÐuòმ‘ð¤O3 käl[[ B­|×¼ ”ô ·;~œ,—qbwû c_nP  =&ÅMä‹W«i+ŽÓ<µÃ8+òѯÅë)r6J›<ñèÛ(Û·l~½½¥`_µÉ/ƒÚ¾JÚ"»NÄU˜­fͽ¯—†íݧ­Ø×âr”tY‹á¶$;ÿ…Aç§t>JzGÜK‡_rø…˜{=pá8½ßÎER7 ¬ÉHJ®ç¯‹=ÿ"ðzÊý À ðÿðT´¹2dê~!9§=Ûì;R¦dd¹æÔ¨¸-®ˆµH-~hS©7ä2ÁâˆGòL^IªÍÇB§c.Uê2lÒ6ò¹¬"ÔCqI‹JèÑÕÙàÒg–dU\«xUȯžß\X?0¸ÝO$:ÞHNÉNö0.ÞÖ‡€Buoå´äª¶˜QÂ;ê@>Ó–àuÙ"Ôµ„Æîx"K¸5ñ³—\¾mVdóRÔøÊ BÿtFR%%©¾yÓG0’àx’Ÿ àÇa³(™Ê.JR?¼ùHÉà´OÅ-)Ë!X6¤V)>Œ#17úÅnÇ‘q¸"ÿlPúg’MÜyî*­q±¼¢%ÙTì™fg3†ÿ~›Åbe endstream endobj 2425 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 2426 0 R >> endobj 2427 0 obj 2519 endobj 2429 0 obj << /Type /Annot /Subtype /Link /Rect [ 435.044 124.139 458.924 133.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1496 0 R /H /I >> endobj 2431 0 obj << /Length 2432 0 R /Filter /FlateDecode >> stream xœí\[oã6~ϯÐch‰º£èC§7tÑ[Œ· émÓ±0²ä‘ädóï—ä!EÊ´de63ˆ&À˜çˆâ9?’H}¾òþݰŸ4ôÝ4ÍœÕîê³ÐûN‚œ ªÈsCy^àø¡‹"gçôU‘S°{´’)úÓËKå­ó×Uyå9¿\ýýͳv_?£ÿ'uÄRr;çïëEU³©jg™/‹¼º¯ñ~›“æÝ?Îâ_W?-z<ÏMm«÷=)n’$q½c<ñbÐQ ”È.õ9ÁJO5€ßA—=ÃcOwØ„’5Î £(NÜħ(J²Œ^rÓŒòÆcMõL° >N"žù†ÿÏ/Ü –…R!Gäú‰ò[…ßïfºß7hÜq(Zøn' #}/§»É‘eª:éË€ “Š7< üÙ0 ‹l´º¦u¡~]#¦ûÙøcSFEóh¦=yåÓ¨žQ™^ÇHŽ;†Ç»CÒÞ…ÐþÄuŽ—9Ù'ü4tãddè+¢ Í0û"˜ý€ÒÛõ‹1õ#ÙàCÑžfýÌõ'Jn¿ Ì1wPGŽ„è__ r3Þ¦áí‡j·#åi¼Á,I‹>‰7+Æ©84@‡/7NÉâ Oà‚|ú2­¯i]hF,nÐt?Ÿ•QWÃР¦8Ñ”n~˜-z&GÜWõi4É qÆ“xº4l²$G&=;As´ˆQ£Y—FÖbKœwND'H‡NP•]òq›¯¶T“Íz¹îÄ"oZR6.ÀS3…Б©¶¸¼gÖnÇÖÂ×í6o4‘`”„‹B“VENça=7.×†É tSºÚöü4“-¯Ý¹™sÝúÔJÎ7*-]éíÆ¼lI½!µŒiÃøÈâcÞ²GunÊœ¬¨ µRìk]Ú)Å¡ÉË{%2? #Qzd„5”;BJR¡Á¶ñà­wukI tŒ|?JLfLÙˆ©KCÇG‰ëÑ?„؉œ™¼x;¹ MŽ¿þ[ðzM'äFÓ}¶jÚïÈyZRq$!…ª$ BÚáÕ6/uÍ#ÍuÈÐy"R(E÷yùOC”Ðn5a .¥¸».ª.X}îÞçúcaO°HKK\Ð(((£RÂ@Å *B+æPªÈJnèãvÄ#c'~Ù¸\š45ú:U½X_—ÅžÀÙcd6Z_ӺЌ>YÜ é~6ÎH”Ñ ôdнA@7ÿ¬A Íw¤:œ ›Ì˜²S—†ŽŸ¼’…°‰ d& F3².,ÁLPœñ)†(M“—šÐUU®Õ÷›–ÔçɉŒKdAÄÃÔŽ&n±~‘xßõ7š Ÿg&M‹‹‚ð™?õúœ®©¯%Yµ9I%¸!„"åy.²®K =™Ïù[¹ª ÔT²~Bì/BÎ7çÈSu࡚ a¼…”«êÀâ5šnS“ÏÊu4UoNÑJgä±W:©ëªf.Æ> ­¹{n«.¹Íï·P’ö±ª?©|5Þlò•a+EG¶(å´«q*º/*¼£Q(l\W M„Œ)B/70Éâ Oà‚ìÞ2­¯i]hF,nÐt?gNÊè5ʼnވ¥›ÖˆuhH­VDFqý˜‹ãª Â[}!4¤l]Mþ^KÕã”-03®Û﮽»wšŒ ZP£)DDŠ”ëœ§*»ŠIhuÙ;“;dŠK¥‘µþ¦Óà.Åö?žç'Z=ü 1Îxw@=„¬ê¡š$]8¿m3/WÅa-Œi ŒvyÐåî Ž¦»1餱MsGpÙ8ìd/+Ÿ·ü’ïø'£6#/µqmöÖ‡.kyVuhÛ§ýøÛ SVbêÒÐY/ƒ±(‘¥¨™™Ö+€–<ø’ÁÙU:@i"„‡¤ph÷âL (îIIjÜv³äÇ'dãˆÑÈ~û³ï;èÓjx>‘o–¡zÁ‰ª…häNeZ|”„«Õûªú¤~ùý·óü­ÿUY~>Ç÷“„E¯†k–n–ùY'‰Y"«Ù«æ{c÷êæOm—5x¡VkDaJyòÇßÓ¤£ê Wé%lI>\š7pïã ÐÚFŠ‹Ÿ~ÕÅ'šÆà‰'šyÚahFZ)s£˜–DáÉÂ[2ÒL~4r³²~ª‘ Rú>_.ÈÇ£²Ñ,¶qµýÖ7â[{|ˆŽæºç£3ªlDÕ¥Ásw]V%‘߯8ÍIíDÎ|zèÀk!¿Ú0š©Ï+Mß´O…žBò¦ »£FQ¨Ñ!ÉãB ÷u5<$ÄŸyúz 3ÆÕä‰(! ª ÖÒ]5åµFòVñ„ÚíkòW‡†Ç)kŒ%RLš²Í0dL:<ù=rü™8¡6È2öšè8g„·ŽHòçiykŒÚĬzö %B ESó僄(Kï¨\%È…¸<‰[Ï]Sj¶Ÿ÷ý9†ØfOVë¼esÃ4ì…ðtg„yÝÒ6œ×»6›ÛÞT%>›¯ÄÞ^!ÁÔ i¬’´ÿ’U[ÕOJu§^ÅLùÚ |u5¸5Î ù¾T=B×=®1Užø<Ú‰)à ˆøWâº×v ÒÂIþ@4œ‚A‚jKˆ¾bÿH; endstream endobj 2430 0 obj [ 2429 0 R ] endobj 2428 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 2430 0 R /Contents 2431 0 R >> endobj 2432 0 obj 2749 endobj 2434 0 obj << /Length 2435 0 R /Filter /FlateDecode >> stream xœí[moÜ6þ¾¿‚0ˆÄŠD½Q_îCš¦h‘Øh¨‹‚»Ëõ ÑË–ÒÆñ}¸ß~C‘’F¢´ÞäìË·kFäp8|8|HÑ.<â¿+õ‹žÃXBVùâO£÷HL‰Uè: ]×'^àÐäd¨ I¦ê Ú>Á¯AY·ä×E±pÉ‹ß~‡2kâB½û…;c¼1u½ø€|3àù”üsÉÝâÍÍâõ»x.¹Ùô!¦Ä×Kà'&Ìñ©zJ(¹ÉÉo—7e™UdSJ²L—YZÞI¾Û¦¢zù;¹ùiñýÍ ã¾ë:ìÔúýaà"à&ŽcÇã©1ãkh´EõjàÈXÔ­ 4ºú÷¬Ë®å±‹¶¡t2ÎÍ£(ŠØÅI¯6€¥Þ!ÄœL÷l°Ð!N¦ðUóó⊪Gc„P;êSÇ‹{¿‘hüö='Á~_ÑÃŽkÓÆwËœI@#ý ¤9ñ¨ePMú2ãÂQæ-Oô‹&6 Ȧt×nÝhæ#Ð8Ðô°X¶¾Q3â>iÙ­ÇG$’ØNZñDÒŠ1Õ‰¿„êãÄ ›ÅGf3ë8¬ª¹¬‹}¾òàÀW'‰«o Ÿ™³TͱN2³$+¶IÖWßWšC¹Š.éäÔJ÷[X+[¡îKIÑ,¢+{­¦td[4,&r¯h²`Õ˼vzáf›¢Wå®NËÂfRc²£ëPÐ{šê´œ¢QØì3¤PßµziUæ»4›"‰Á˜íðõ'ÝÖ &`0—Ãïcè…iC ТͥƼ滆|Tõ|Yb+øºBºûm‰$ k©átZ¡ŸÕH<¦5«r_(^CÌ0Kü—åAš'§¸3šZi#¤O—6Zó–'úE;ùÚbÐ_»u£9‚ÖÜlÓÃb ³é=‚æãÄ Ÿàæ¿(ŸÔ%ä†rÝͨ9–s†Õ)Âê[£ç¶YiÖ¼æKû¸J·/±ŸÓ„Ò,ûéÁuÆÛ·Æ[{‚b@¶\òUm´®… Ra¤©“‹ !¢ È p àå¾Þíþ£å7Ýc­™ÐcQÚ«¼EˆªX¥›T¬_i7vGXFR3 ‰íù—ÍJ_óqrTñ¼Ÿ®„WÏãCü‚ÄNpïòÿ¾-9Ùc”ô®(¥ø#O«ê1Žq†ÖIBë[#hs€Kœ(dÎ')\5Ë÷•ÏB½hêc #„JÔ¸d‰„‹ÍÅ+$²Ü!~ÑÊ4íxQsRs{™:ÂAŠUZëã #/õ×#·@RzÄÉ‹æaÔ|}3kýíËNeX…ê­,ï;‰Ý£²”Îã C‡—úêDÅDP :€úù¢ÖñÓÒC¹‘e½|‡«ñþñžËb*ÌÖ!M°æƒœ¤ƒþ’×’+-NQ8û †+æÖÀ ôPŠz/ qÃñšdT¾ËNq?d4k¥§À}ºôÔš·<Ñ/†e½–Þ´O`­5‘°ý ¿®;ÕŽkç­¶Ø ùÇyÖ£Œ³Ycú‹SYQþ(–»é«^-Á:#í ‘FŸjôk°öT¨rŸ{(šf¹W3’ÿC¼y ûõ¼` è_lš1„Œ"Ê`$scD /꯸ãUu_JýõÅè¸<â§–¼¨ò´6$+‚”\î “JÅÚAꛉS‹`µWš€>‚ÇÆéÄ, ùâL¤ ‘O¼Ø¡LÙEÊ]‚ï, u;ßæù.kÿÂKy"ƒ¡ ŽE®›„èm“ʪ&BÛ Õ¶¼¯ü§\^IÁkA8y[®Þ”åGrýÃÏïÉà4L]2yý.™jÔgŽ›@£mTHó3Š ì‚û÷¸”2,iÖÜëwž7vAY×i™ÙÕšä Täêš\¼‘ÎOÎ?¶\æ|UfιªÉzé{äê-¹1ØñNºv>çù{§SNu—gÃQÛï¶Âä`±È,ó}•ºúÚWžób4-U5¢94’9A4RwFß«F±V—º’$J@Í„3·”ú:vðŒëF‰1$/ž¨‹½*‘,Y¦âÓ¼×C‚ÞvElÒBà8´›× ”G ’wsÃ’°‘sÃQ>8¥ —NhÒD¸æŠãÛ2âR aSîÚäct|µ‚Da6)Fgr_€>ìwö†ÇÔ­ºª2\lųL¬í©B ¶y4+&FÛ£žã¨\H¥¶}2VbW#µÑ0âR A }_Rà i¡;oÄ>ê¼Q«ü„Äã€á«/q$~2Ñ¡éi?—vvÀÔxã¬Fª$&q2øÆáÓXm?ß^__¿G2ºÌªmx{™ÖHìnÊjq‰‹ò}]S¤/x®G¡-·©-ÖÇÃ`Ô _ jqìXZ=eCXgq€F]WLÚ0²Lܾ$Md U]öHZ4Ÿ@Ú‹½íuÞîïÔÀ…lbà<ª¾2UbU6Ø×b»Øv¯›E·•¶ÍI‹~n¯ÍbܽAæß¤ËñÏNVnd™wÂC¹—ðžãÊërµÏõef­0ÒB;NƒŽÇî ãÀoö 2ÍCKDªó"³ÔY§äù¡C=HQìY¦2èñçÙUÒ …Àà‚ЮªnÇd‚µ)aÁ€¡…+Hs°gV΃´%r£ãh‹Up’¶DÞ4C[¬:Ó´EÍφ«À+ˆVÇJøþó£ì®?A«Ñ“( Fh7¹šŽˆ›ÐÁ'JŠ¿PRüi“v_6[^¢5ãÅ&‰¼Um[N&%jÒ{Š vMäNÙ?cB2á쎘ôlD+ÒbÜ—GW¦V?a£–£htXwfŒLd¯(Ц—pV-¼B”Nu2Z;Õ+-A­é¦zc’-j§>.V4fK Ó÷ÁÂþL¬|õsFz  §:U ù õ‹W¸îßn?>>V±‡+G³†7׿’f;°ýK’˜EVm擦8Šƒ¸~d×Å[Ò‹ÿ û endstream endobj 2433 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 2434 0 R >> endobj 2435 0 obj 2678 endobj 2437 0 obj << /Length 2438 0 R /Filter /FlateDecode >> stream xœÍÉŽÛ8öî¯ ‚9T.¶¸KÓ§é42˜L¶Ât€T²M—…È¢#ÉqêïçQÔBÉ’ìô\ÒA§ø(¾•oã«|[ÀŸ;û#ä‡a„ÖûÅ·zŸ E“õ–0§""Sö¨¿%Pjq¼mVð£wàúk‘-ôçâó8³AàÁñŠÔÇÅ{O¶ú¬%ùô¸xq¿øí•@$@÷ÛÎÄT‚}Iÿ)bFí*¢è~>ßÜ“hkr´JVibóø°KtqûÝÿkñÇ}Oq8üÕô~ßüF)…ƒ¡?Ud˜ÛƒGÑ~ê 2—ÞŽÓÀýœ98“8ð>w¥_F¸i/’ +^¤¢>á°çF”²9ùeÔ;wj媈6óZ}ð1…iéY¡ò#U+ïtÿO¼×Nyk¼ËñÑRXœÐ!åz»YeäÛ£!ÁîWç8”ªÁùhî„Úe£B©öEù”Nófd÷2o ÌmþáÏñu¶6›${œf/Ãô†ýçþJ`ë7„RrN`]w6SM8e3è_®€3  Á€Q0BakîÉ׿ <$‡<’O òs”/hF&È€P‡òsWîÓ» ‰ˆf(Ìò&Òv‹M$Q\Ãò`†Ä—Ÿ,6$]l#+Hõ_êb'‡21ÙÅL ,Áƒšýý.)¬[ðGèÆòà9¦›^én]î<`›ä…‡·Þ™dí†ÊÚ™ù‹‰¯U½†óÎëS|üóÍ¿—ŸàÿnËÇþpÿªš:_œû,¥b`ˆZͺ9ºNI¹ë ªAx¸Q·¸Û|½íÖë8Mõ¦nŽe·çN¬e·WÓÝ-88?fE%™Gª[:«ÞmóDg›ôÉ?ßÖö;05°ƒ-ÿ2òÙ¦Y® hµ.‹öS³ØºÛqÇ‹“λ#«FmÚ)HÛû´Ëæ†p³ñ KËÓdv¡'Ø$-S’¦­¼UÛ×¢Œh>Ò×¼í­)vâu;qÑ­OÚ±;ÿwËõ±(Íþ®Œ“ÔäN5÷¡í:Ûr{œ:—ÜûT}v™†*âü©Û*J}ðŽ—Æ“¢²Æˆ$¸ˆQõ² ƒ}\– )\Þîo››=²·×ÞÕ¨øŠ‡ðjÞBÏSpº,¶NWù"³žødŽÍrgݲҋ¹0¨²ëEAUbÔë¸Yl’|ÒäO~Üb¬MVÏZzGý#)êSÁUNi€OÞºJ Õ òʈڑ¨m/´òeB¬ÙßÅEÑAu8`{t·é ÛÊzÍR—|Ú鬃ïK\|õ8×¹­þä탸–õÒûêBþ扯Aé<ñ\Ç£öP˜ýˆ²@ ,i¶•Óº´7UtnØ^^eëRðŒ¨}£ª)q@Ç oݮΠ–Ö’š9Ybm¤Ûƺ¨Ÿ?–áª"Ë‘rÊÅA$ª~«®Åfý˜¯ÈºÔl1†F„I>Àþ/¤5¨âøY"øjÿ"× o*¡eLõ…ùt…,Q8@ne 0µ‚T±%8¸R$n»iû ‹D3jûãõ5âpxÁô[qÞñ%z'®@p, “µZ’õÝë%zUe:ô`cûáö¢DR(Õ¹ƒ9ºÇ|<ܼùGýeòMA/¨:¨-²Ðqž&:_v;o:{»ÝBm÷6Ÿ¯Kr9Aeoвƒ ¸zÞ6/êýÁäP<ácõTá@Ï“•ýL^4¦òÍ >ŒU(áÕź»…[´ü¼²ê6Ú¶¬Ýq!¹iáÕS»,}JMª±\‚=@âCž¸ÀíÁNj[Ð%Å.Ú6:ž4¼#zÚ×Ûf*ÿKˆà¦-të\;&uàvÚÂSo¼¼y·j ·±òp멊X½'¶56õv²2)Ÿ:صön½Ñë4îñO ÇdbÿĈ1(ïüüjA’­ÓãÆ¥\oÂþ„vÎ&ìHˆк9o«GOqe2 z! ïÚPˆ±)Òtð xsõ1­ƒ7ب®UŸ,Q‚Á èS‘½£Ì¦ ŒÀltŠm•1ºtt< ÷¸¨ŸŽgR³bf'1’ñ)¶ÆàÃf;= ðò¬ç8çØKT=s¦xsyŸÙ©f4† ¼Ïìî[[Blê0Ôâ‘¡Ù´±%øQñùwèžã•ë•4ÆÝ{‚[7ËImˆ˜„vî©ÆXlVŒLÔ,îò2ó<\B9ã’2çÁôô ˜Åm™×`VjÇC–ѸÓF |·á]·švÙ´5h“ÝïEdL€Ç»iÉ„ˆ?¦Ço"ÂJ2#êo]“pÓ„Á¸—p:ÃbDDFü¿Å!xhT£ÊÁ¦åàLbÅà<—c&ônê¼üKÀí÷šÈß§“aÐ2›³C6B¤ÔÉ´¼vʨàrªFp«_ËÔ}ãŒrý½\5ô>§’—Ói’Ú6ÕÎË¡ž }^,3R@+M  ÉPŽÌëgŸ ˆÍpÒkª¹[›L{À¶[Oß•˜[¯ÅFXAyŸ¾ ;$â¶kåbuy wÈŒ×os+ð°iöÒvYÂMogÙ»ÜsI”Ðþn²9 ø¹8/“ṏÒz: Ë1ctl}iê(òd­ÓÀa)<ê¸ß$ј°˜N'¤ „˜DžÕÒô ž 6£Ëq§L3;ãÉ*ÐÆ .¼êð±j[o»l*àÍÞÜ9û0_6ÐêØ~Ø‹v½jir]xØ POÝ,¢Úz¸9Äô ú™g­ ­ÏVqþ¬åºÑð۸ɑ;8샭²( m_ŽöÆln±÷/Þ/þ!+,ö endstream endobj 2436 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 2437 0 R >> endobj 2438 0 obj 2412 endobj 1202 0 obj << /Type /Action /S /GoTo /D [2439 0 R /XYZ 72.0 469.169 null] >> endobj 1206 0 obj << /Type /Action /S /GoTo /D [2439 0 R /XYZ 72.0 241.15 null] >> endobj 2440 0 obj << /Type /Annot /Subtype /Link /Rect [ 349.581 678.605 364.581 687.605 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 916 0 R /H /I >> endobj 2442 0 obj << /URI (http://refdb.sourceforge.net/docs.html) /S /URI >> endobj 2443 0 obj << /Type /Annot /Subtype /Link /Rect [ 319.406 553.037 404.965 562.037 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2442 0 R /H /I >> endobj 2444 0 obj << /Type /Annot /Subtype /Link /Rect [ 411.074 553.037 523.274 562.037 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2442 0 R /H /I >> endobj 2445 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 541.037 159.17 550.037 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2442 0 R /H /I >> endobj 2446 0 obj << /Type /Action /S /GoTo /D [2436 0 R /XYZ 72.0 769.889 null] >> endobj 2447 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 192.346 151.1 201.346 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2446 0 R /H /I >> endobj 2448 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 109.498 151.1 118.498 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2446 0 R /H /I >> endobj 2449 0 obj << /Length 2450 0 R /Filter /FlateDecode >> stream xœÍÉ–Ü6îÞ_¡çKì÷ºeíKn¶»ñĉîÊsüâT*V‰Ó*IÖÒåúû nÚÊ37Û‡ @ÈúzåZü¿a’Àµ“$µòãÕWAw­Ø³üHBǼÐq|Ë l/´ŽÖ˜Z%ã1OBðg4ðÂútU]9Ö/Wÿcv–|§+gE8õpõ‡¡›ð¤Ÿc®^o®^¾ -×±6{íâ ´ã(JÓÄK­Äö½”ýó¬ÍÑúûùkº-i}h³¦ ¤{ñµù÷ÕÝfd®ï8vò£YûÇHEˆ–8ŽmgE\Œ4  Döi¤ÈÅYF´ÿ®ªìÌ4vL…çôÃ(·;1ŒrÝ4Ó>ÙÉ(xR÷RÀü0ÖÍcÅcz]Ø0ÉlŸÐÊzaÝøÌ÷<«Î©Ûi5z®”ô‘Ø}U–†§Œ–Ù¶$šDJr$UßiJžÓu¹3ø5ˆ‹ðòm:µÃ‹C;ð=lj’`fÑÇû»7ww·ï~ÿEòÏüàûøMüŸzù‘gÇIê8nÍä¾ýðþý‡O—Ô Üh}æNc®­çLxNÍ Æ@àZÏwdO+¢ñ®oiuè4¡/²^cYkŒ¥UGÚžì4eKöµ9BxK û£G 6æuÛ’®©«̮ɬkMa£HÞÓ'RžmMÞ´›¾ñaƒ:nâ£ñ2ÆÛeÊjxèÐ ÄúZÃM™åÆÀf¨ò~ÈzZ’ò"k³¬ë4­n™àë#鯧‚´ä‰cº—±LƒU]ÝcÓŸ5I¸Å˜,χ¶³ç‚‰^1&/å3‚#iVj‚! ´Óðj€»àå <äDî|¾‡»¯î_m>ܯF¸›Døµ*pº!+˳&deWk,¯«>ƒÕ”ÉʉajålMdÁ4óÊÜ·a4Ѹ²ò”;Kí XãÊ¢{‹{Ó’œàûº,ëC¤Û¯óÂ2Âyïº>T5‹Smpó¸qjGlÓžKÒé ¶d_¦1(ýˆ¿/ZBnJP¶qÆh¦|&>ÔûUI[£ÄÊ ú.ë³1Ó±#åA· ê[Ü3Ò†¹’tâ†íò¡ëP=ˆ@(‡`ëˆÈÌ$w„ã5¼#]ÞÒ¦_­‡Nôô`±ÂÄIS? ç·´û6eH½ jȬǬ·þ© Z5<Š>µ´×Úe ­Íܹ®ãN¦æaÅs¯zvª|Ù1PLš9fæ·nhW‡644¿æH~.ˆÈE RS©¬3 Hž‰3IÐN´/V'X?·c׎YyYiîš¶.Éz)‘†XMÕ{8m·C?r2¬óÂâ¸þDŒ0ª v´}›ñ’vxÚˆÏx #2bìi_ŠMˆ„;û``™!S6âüFl¥ö¬ÑS=”æ,gXW™ ‘$ã±uÇÉƉãx©¿`÷«?7ÿúpÿþÝÃf½fr.JXñ˪BçÚ^ì§I”x â6ï6ïïÖuµó ‹YüBéEL,"ë/èE È…>ÉÅu¡O†6BÔxõì*D5©#½¡j­ágpÔož-ƒL •ÔyÅF#¸Ä´* Ž+%XYÐ^kܬ ¯öŽ?==QZlÇ x·£,É‹På´u»¡íD°±½ Xû?„¦_” ´Ò ®+“B­$ʦ¹¤ËQéy—xåÔF˜r\)‡qù.k}lÐzDþ’±—s¨ç_âUŽ2“08QÅZBÏ>þùúٜܒ úÙ…€ ¦‡0³*·B’- CyZ5–v'èW‰µ­ëÇkkÔ¡,R;aW Ḓ‹‚ žŒb›mVŒš‰€7ï6›Ï›Eí*·šÛ(þ9.Z%ë&‘£¼\Ôé~ÍŒÁj”£.Z*Åú«ûùûFû° ŽË*ì éýî÷ÍÝ_›Û»·N}Q¹–†2[ ˆÄq++€5 m_!ž¿ú˜Ñ/äqõ¤'Q4› sʇßß¾Ð@]àךð”òU<‡q»x}:õùîÕeE¼ ]çV“£Çž;R\7 òHHc|!Ú~³^Ц!»ûÉÄ ¼,º'ûÛ×sÃ~hArkºËªœØrWñW Ñ©±ñv¤…©¨h³º CdÀjþ8)kñQ ‰5mýÑŠ—ÞHŽ`UÐíÃÞ„Eôjüè#+-â¯‹ê° ®èaŒÍäq+ª¤‹ˆšûÚ ‰-ÌnÓnhÅ6L>ŠÈc)¦’‚$qÄÆK¦é⑎)”š@*±LJ‰»¡Ûݳá;# ÖQcø$‡p¦ÁŽV<¥Îº²5åÝ^ÃâúqܪÉ4RÐC¡/ƒÅp~§Q‘tC¬Øf'[ÂoFƒæ1ëˆâ` ºíÎ ÖA [×´¯…å+œÏn²†N>¢ùæC›ovÈ ò6ÑL„3 ²IóAÄ6Ò íÏSeLož Hჭñ[sß:/˜ uÕØdíqH½É’;‘.oWQÈaÐÍ<(HÊ{‚³0†g 04-ÕŨ´®+ˆ¸ã´]KÅëâ{ZšÊ™ûG(µ´ÞA°Íød⻬“¹ÏN6÷…øðåy>´¬GÇûXA톦©å® ÕÕhˆlùX`*{~yaPÅÛA©jÑ1µ`oMìÁÍ„…XWðKfV^áC󖽪ÉÄ…cë%y âì5„ {nÛܽ³ôB->•²Õˆ{’qîðÆåC·5?&8J—^ s%ƒå£%ƒÙ.=6½¥øwDÒ [i+‘¼>6%ùFù°'¢Æ æ¾\°-I'¶m™·ÀoøòzFY-0è'A¤©c@àêMVJ(±ã–8ùeÉÚ” GOÛ¤«ò˜4•Äõ“¼@[¯O G '¨‚B¼ýF¬?ûD~Â_® º§m×k_E‰Ì.“#ã“iÒ -ñUbÒCˆaù€pŲbRQN ÆŸÛ•”lñÕÞ '€Xz¬ l¹¾Fí:ž®þ]¨óöØ?iÂг}'r|Ç3×¶~%¤a ‰öTˆ°-^[òÖ¥Ú}¯ü¡>ôc/MBÙfŽõoÖ`c³_÷$ÐÌyxå±7’Q»ç0ˆ †NH1ãV0ÔÆòéZްzYœ ˜Ns›UKçš4ª¾‘$«oÄø¶_XA(ÇfŽÏ=¬~ëù‡ ¹Ã`ñhÅÀ¡¹– †2!Ê~Ò˜¬,ìv˜ÆÂˆŒ¿¶C¥f«¤/DÁ'RãE,Ìèë­p’Ø´˜NèÇ ¶Ë—v&£Ùíׯð¼ÔN<"Å Ä(§-g4Œ×?_þÎåmË#*o -¯± B¬àgÂÜm‚‘/ ÂC£ÀLA"òoŽY•°euEÃÇî7®¿7¤Dë%QSÌý¹îÄlÉ@6rG`döã‹qÒˆüÈvpj䤣¤iã`½žÈ,aá÷’EBÛãA»$‰ôý\1cai3a»Ž‡6‚¼]T}™£hâ*E¢*k':C²4Û#)I_kÙÒƼ»¾|èúúxèýôáîsvcÃý>Åw;Žƒ4õÓ¹ñ¿Á&b%úeGɺ„…‚2b¿'6Ç<ôìÆ‰«­zn„MOÊnßUÍ>ByI2M‡Ý¶£ì§15ÿ†«›p!ýÜàæDt5»xñŽe‘¥sGq´ôâÃ~t¦Ž æœÛVÓ–ÉUè©-ϺG¹”ckëÓ$¢¼âEJ•Žg™kE"pN-ø?ñÆúp!~̯yD¬"Æ¡;&IØïiN1&‘´ÍòÇC[<4‘4† ¹üB”—½¶BñTÌ'×_hG¹³éñw^ˆ¨k ù­% é:Jƒ±åØ~~y~âÕmÖu°ß,þÔÆ¢p›u¤Ê$…•[ª?=Áõl_×Ͼ¼øÙøýûWÿ‚Á#q endstream endobj 2441 0 obj [ 2440 0 R 2443 0 R 2444 0 R 2445 0 R 2447 0 R 2448 0 R ] endobj 2439 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 2441 0 R /Contents 2449 0 R >> endobj 2450 0 obj 3684 endobj 2452 0 obj << /Type /Action /S /GoTo /D [2451 0 R /XYZ 72.0 618.181 null] >> endobj 2453 0 obj << /Type /Annot /Subtype /Link /Rect [ 369.884 747.389 425.497 756.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2452 0 R /H /I >> endobj 2455 0 obj << /Type /Annot /Subtype /Link /Rect [ 489.675 643.681 520.775 652.681 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2446 0 R /H /I >> endobj 2456 0 obj << /Length 2457 0 R /Filter /FlateDecode >> stream xœÍZYÛ8~ï_AôËt€Ž¢ûH²Ò›d¦›YdãÁnä¶h›Ó’¨èh·óã§x‰”,«³Ø—¤˜Ub‹¥ª¯Š´¿]xÈ…¿§ü# ='M3´)/¾)¾‡±bE®ú‘ëÈ ?B%³"Tpkàë|Œæ½Gÿ¾¨.\ôóÅç¯0'G.È.Ü3Ê…ª,ÛÔÿHö¹hwq³ºxö.Bž‹V[ãâ0r’8βÔÏPê~ÆÿùhU¢ÏW7t]P¶kp½§¤}ò­~½x»m7p]'ýÑvûad"DK’$Ž;"¡&<àHüÑÈ))WqääçY“Ý‹]ÛàÓúaŒ;; Ìò¼,K² 9é(x2)`~˜ÝÆŠÏírX°š³y“ž¤Ë–1§Ý³¦s>·»²øó¡,¾Jp’qŒ|w"ºÚô= ðÊÕ¥Ôri8 )i•·†qd½!º=îF~j,mm_׬%¹5Ÿ™qß[‘EHË«ý, ]׳Sû…ÁF¶bî(«&:‚(pÂ,qÝÌOOuñ-k ±¡R—µ{ZÙ6SëÉ–Ä™¬ þ|'€Às½4Ðþ)øßÒ².Hsú¶ÇEqD%ßmXuO*Jªîá*G°»¾È.øØ¢5AàãmiÓvh³gt£×´¢Æ”(t`eÀXÏ3‘òXŒÄñDh¥vêdgr«9zöGßv‰­qÞ—åÑ–«ÎLÜ6¤Ý[tݰ?Ȧs,ÖíÖ"TH*ŠäÔ¶@EÖ¼éÚw¡Hå˜{ïÙ»lšpA8A¼$3Î1¹5K\/ZÐs½hô÷Y //Igì{Ì2ÏMOÁ‚Èstu E1¸ïX i±A«¹k2 û:ÇHz%P™ñÖâ ,PýoûuK¾õ Þÿ†´-­vfVGêv *ò`fw´4Ú 4Ns2s';mzE1íÙ»dê›Ú@Á'’%¾#ZrÆ«‘ãÅ Ì-ê ß«¶ÅSÝUì€M9•³kõYýÔ¡_€·:ÖoöH Ž6gßó|Ç RMW­÷Lµ"i’óžNæIï&ùl[ã d<+é%Î+¦^ÌbéZ¡ÅXÕaZ´Š03ómiZ4—ŽÏëÔ@ )›{šÌ’õG“À½Ä‰“0K“$›qGC¶ùºÊ§Baê$ ”s23õÀ b˜mK¤rÒG^.&<½e0jbÃÊ«ú+9½#†:µ^’9A’Ô¤3kò°5Jê|{6†}^,cˆÿ8Êf%²p>b•@F€ÜèQ£öƬ9« )ã ÊÒ8­’/\ù²!LÖ¶ !¸.Èü&~Y½ÿ‡õ¤ïê¾3ôvû™· á06EF-ÇCÓMpD\8hÛ°RÖöœmúÐO§7’˜/ð^œ5‘' uLhÜ,‹¹$ôÃã9¾ƒÞB)ä¨9R¼\¢ Z Ý‚V `+KÇ-¢g²æñBQ=VšÅ3 ‡’9׉Ìijá‰:c\{G ÒIˆ½kñGr:{ Ú¨¦UpJÜÜõµ5Y v¸±tc3\3vg(ÖLƒ·¡Ùd#Ø2ôÒ  ¼á|‚öZ"¤¤yÉQ$fMd5©ì½Rkç¢%E­y"dÌ<|4í¬É¬¹ŠâMkæ 8Lmoó—oÇ2I¶ ƒš·ùÞÔm¹‰SUñC IçÞmeÆoØæF½(Éøø³ÌzI)c$ñû‰Ž«özf1K<I‚T¦ê‘zjÍÔXw’J¡8¾*1§{×kž…Jî18¡Œ¥ K„ñª¥N]­˜Eä´åÈÑS݈ .¼º–X´@-CžÝ¾“¹°…4™³æÑ=ø« ò– zc#£U IõFÇE‹*‰Ê"-j»dmË©–T5jÂq&X¡ƒû/²}sÃÆç2-éôPæ…¿èH #ʸ:ûSÝ +ºQð[”Áé#pÃY½6«†®ûn0F8á³Rxzò*ofËoß½¹9ÿr½Ea½¸'i¡A1ÜàZİ ÞâÍþQS}05J"׃TšYíÑP„Ãü’¼^_Åá`§©9‚fÕà^šbÄ/f"(š–;èDIXBöDPƒ!ŒjÜèSg¬æQI7¬P(X²ž‹a×`Z¨ƒÕh¶fàmGša¶,°8ç‹ñ`fˆ#F¬æÞÄ…±”YÊfvOkâ–;p­ r¯[V@˜BëÌ+ö=.ÀßÏÏ£(è†#Xæ©ã˜ÐýR«Dš1t|åz±ý÷ø$ðØYš¥Q<³±îXŸo2h…΋Z†°ï±#ö?€¬ ã`F›È­¿ß®^¯nÿùÛùìÝ%%–ï§ßðÈòÓÉ|Þ|ð®cˆÃeišh\€HBÜs ´ÙC±ç30‚ÆŠ–a ¡•ÊÄQAÌ~½ƒ®CÞ%nàpÉ£hŒГtçˆmülæ‡]+öð|àŒ aN¤ú[N½ûÞxÛ—ŸÀN~½Ñ¢oí8ñ›—É׈1rß àœ« Ïo¬;_ö¹€øIÀ¿› øß*ðN´¥º$ºïQã½™xسÂPÚ×GÞØÈ16êÅu)¯Ë>•J­fWÔk8LiÖ{þém ÍãhËChˆß˜\•ò»pIèBX‹‹ØÆš4 ® ºÛ›gú$~ªC_B«'xç Äû¾èh]˜¹ö¥äô­½¦­×ŠÎ™ÍgáxóPÒL)k»#,z?^ßëT µ¤‚€ÀÕñ€uì‰_è|¸ø O+cú endstream endobj 2454 0 obj [ 2453 0 R 2455 0 R ] endobj 2451 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 2454 0 R /Contents 2456 0 R >> endobj 2457 0 obj 2865 endobj 1159 0 obj << /Type /Action /S /GoTo /D [2458 0 R /XYZ 72.0 399.059 null] >> endobj 1215 0 obj << /Type /Action /S /GoTo /D [2458 0 R /XYZ 72.0 138.885 null] >> endobj 2459 0 obj << /Type /Annot /Subtype /Link /Rect [ 341.467 672.374 372.567 681.374 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2446 0 R /H /I >> endobj 2461 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 627.369 406.176 636.369 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1159 0 R /H /I >> endobj 2462 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 567.369 148.88 576.369 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2418 0 R /H /I >> endobj 2463 0 obj << /Type /Annot /Subtype /Link /Rect [ 372.751 567.369 403.851 576.369 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2446 0 R /H /I >> endobj 2464 0 obj << /Length 2465 0 R /Filter /FlateDecode >> stream xœí][sÜ6–~ׯࣽe1¸_öm½™ÌÎÖdk3qÕÎÖxZeuÜj*Ý-ÛÚ_¿ß@`“ŒäKbÙvR%â88WMþzÂ+†ÿNéS¼vÎWç×'¿¦z^YQI“ª4«•ЌɊ«Zèêº*«tµ¡6YAt%ü)ž|UýÏÉö„U>ùÇ?ñÌEÅÐîí ›!Hý|òS6¶ôÊŸÓøXõêäù‹“ï~ÐgÕ‹ËÅJ×Öïð•«¥ðôOT/®«Û¬ÛW»ÕÍÕºÙ?ýgõâ?Oþô¢˜®d¬vŸÛl*†i±ÖÖl,EŒŒu¨‰ U d Æ^Šš8ƒøwvÈìhÄ,ð±}6ƒ›—ck˹÷Ö{ jWgrIb>›é ‹ qÍÏZ»#Eywu¸ÞTO«Sik^=io7·‡gCÅj{1‡«æ.Cíš x³ZoVg›¬ê¬=\ Ðe»€ïÛóçmûz¦›âÑúË˧ÙÚ¬ÑPeÉÞ÷å̬ĊÁ¬D¸3+êÍJiù÷=ôöªÙöÀ¾9H¼;øöf²ÿ4óº¯xqµÎ(®îžõ@³Š˜·ëáóÕv‚ ܸÓW­à./a§!T%)X!.òÌÜ è0Ã#HÂ,¸‘dmˆg —?îÀž«¦If$bÖÛ7íæMäx_•É¢$Þ¥Ê~ÜÛ'ô£Æ²'UÍ­ö^9{<òŒÈ›õþvµYÿ_“ïª}›A«‰>'Ø£EÙ ŒÄaµÞÆ9$Û+†Y x6Dòw±&,û`QƒÈð®C¸1¹Ä0Ò£í6þ…¾à¸˜]GðE÷`ónu}³i&¦bT9•=ùÃ4¢·Nx;h·ÚîØ\Gs8 ¢º%`••³)ÕüýÇ¿fPÇ弓6.sàeæ—bÍõúÕÕ¡n>¬³|ð9§‡¾&xbMÉ“¦~VÉÚVOþûû^>Íàÿhß60φšÄ³ìW×t³[oÏ×7Ɍĺ&6š™BÐD¯ʈF£AJ`ˆt8®MN<†¤“$ܹ’‡»›f&Í•;N¢ÕA›æòW©×R„ƒ½ˆEøPÊÕX3²±òv—Dö#Sk)öCÐÓäc;»Ë€ °öP°‘U ^p}6zrãŠy‹Üæ¨IèF‡nr1Ž5׫» JR«Ó ß´¯Óu>äÄçYVÓŽ™g·×bÍ*+O¸t«9c–Í1à8 ©%g\ò‰6YPöù[Qž4®æÜ2¦¤?&ûãêuCŽy1ÊSÜ,ˆ©YSå8È )à#³¿ ¦Æê¸L‡fwÝ\¬Ñv¨äp¨+œEªKÒ›5:QÐú<¼õPÛóæøaîÒ"¤¾'L ¼l9ÕhgNÉ #ÃzçQRû()Bm†iŸõeÊØ¨3TÞ#u=¬¯3}z 8–º‡;Sûî•@ª75¡á6eR€åó–#ÓÜ7Ù Hé%7]ŒÂ릹IÅõ!ökòºu‚ÒJ-Q‹yy÷T |M¥r3Ä¡ñ쟥rgkýmGúv7 iújdö³ñ¨Ä´¾ OµkáÏ¢ÀǺör±Ž ƒûpn(¢Z÷u/2ú»äÚ#”\JjJÒ§çB<—F;t–|H>‘‰é›‘]è|7ÌÚ(T‰5)XKÐj(æ;C±m¯"NkÞÑéÜA“7HT7‡¼a²È’—D6ˆ.‰u14›h=ïþ…Yº—H¼^QSrÄÐÏ:à¬Ý!ÿß÷ðe·ü°!æ‡,(7ë×M ¡øoýã1 ö)Áé»k†Þ²'ÒÖ‘ï÷Ó|J”ÞDéðÙîÝxÃúø!Í›àƒ™Á^U›Õ•ûbóëíúÍj%V…%ˆÅN§©œk5Áƒ^ªb ›0½v4èwÔ“ýÐ×@!møu`ÚGš¥>´‹Ûe¬ñ#K™ömö‡öüuÕñ7ÓñHâ»ÂÑB±‰m*)x͘`n:Rû¯öÐt-Ž·½Ñ,7è^šÔâ‡Mª(;¡Øömç˜ò¾é ÕÅE_¶ÁòíµL·fwÛ†½´{nWyQ[.½óbj ×w!¬ŠëQ¿ÛoCéÕ±~zÛ~¦¤1£•$Vj=jz¸Z‘¨hY‹Lr"å7–ãZwРS6·ï±.Ë•bÅEmUê+ëv;t¶’;¢Í;‡VC‘¼ÀÐäí:,jzj³ißNÌÛØÑ¼É¸`IiÓä~ëÉ™¯ gQ Žé]ßÁÄž'÷\Q!乊B©m»=v"m í+pám³Ùôf+,vü: ¯áÞYYìèÐ>N]å;7ý~ V ˼bŸý>L²ôk8ïéNo茀ÉZ+î½àé¼ü3J8x*!•˜°ÔÒ`ħRÖN)椆ÜÕÞ9 Ù‰J³Ú+'¹”®º>1ˆN #I¦ Ô¦DIgA‘s) !›‚àª$xuδ0fa1t§$§?Þ‘HÐÔ…öµ“– k|¥y­”ÅÔ-—c5­³ É%–¶æ^) l¶_†3¯/1äx؇" ö/˜FqY½=QÕóü¹>‘¢Âµ3.!GmJÊ` Lœ@P%Á«“Ÿ?Ͻ=”±Ï…R¼@mJTÇX¡•ÏKP%ÁÈó¿ybtwXZê¾ 3"š2ãÎLi™–w]²éÍGµ Ÿù"LØ{äeÊæåÔ"æùåb/ùôödýÜ¥­žlƒ••µuþh©J'Qøëà1LÍçãKO0tµàJ ~¥Ä@úM.T Ã.(^o µéK%¡—O'¯XÒ&“Öš+-=§´C(‘ár̈;#™'c”¡6%J Ù3†ˆCÞ7ÁTIð>¢ekoù‘Šƒ˜²VÄ‹;¦M'\[½¶£\ÆWÎÃm“´|N{;¸ûž#çq„øªxËé¦b3Ê›([0L^ó ÖÞ&ý$Í´5B÷äæ‚Y$éˆZÌÑØ,JÚ 5L+#Ç©‡4ˆ-­3Ú¹qê‘£zÛ‡ÉQœŸ\@=0'ƒM3Âkx"ØG«k–†B;¼t¹Gz¯(V2ÞXà^±Ò£aÌd¬ä ’©$ƒ³üÁDàµGðî”æ¸Í版à<%ŠÉTIñ¡Ò½¸.ù‘—ެurœC嘑#ÎÉ- >8P¢” Ñ¢A$É}ØùäL[þ)Â$²»V%Ö¦&ÜÌFSDùý¢©Ç¿NG±eš`–·Ìɉ•Zˆ¥Ê4žg3ñ¼ç†Ãï5´/£šå#,t€§»­¤&ìSLK˜T8.­­dBÝs3ñ±0fÊqÁHظ”äÏñ6†~¨Ä˜dNÈ·ጄðyÆi_vS’\@•¿Ö\@„*§k4ð%ðêRB£E¼ˆJmFámÈÒ(Ÿ ÍYÿÌÆk0º–P˜½£ÍÉÞÅ^­èô, j¿Ÿ'üþØ‚2$Ä-ðÇÇ+¿à _-ø«r§a!I/ö WQtû·´ÜB‰ÅÍìïI±FH¦ª'φæ<àÑhþÐM†%ÉQ‡Ä‘¡Ë#Éó¤€<˜ãÝ\UCXgÇ‚7`ÆÂ•‘[@=Ðÿi2/H/Ý?„Á•œ;GÏøÚ0†$‚‡=nCÞÜȽÜßãàÊ”óÓ‚f»¬m†9ð}‚öY¬Õ JÜf„²L ò²ŒÞ\}Ië>^ï>ÌY¸žÙ^0?Í쀙ãè„UœééýÒ5Y+­¤ŸAKºGªa‹ÉÈŒ|ž¿ŸÏ»Æ(¼áGwL~m&R´` …4JO,Î{¦hm€x¶ŽC–T¬PA¿ð+K$ ŸS>XBó}=4ÁôG.±¤pµàˆK¨ìëÓl€+&Ç{ªêÛ¤uŠÖJÚD»ŒmÑý6ÛmíÎB„PfHÙã¦l·ÆžQ0Óïì’PvÌ"HèWËZ«IÚŒòÝݧo¬ý cpÊËŒãÂÙ‚5÷=[ _—–6}tè •wˆ\ºÌÖEñŽî´•Ï•«šLŒQ¶ùD'šÙ±’|À©R‰+fÓHÁ¼£_Y²ê|àïòFѨ ŒHª±cþâ¥LRšª™¡K©ó*LŒ›2 ^…4¹ [5âû Âšu:\rwÎ÷|ãîGà® 8éSîw‘ÝÝK’¦8¶nØrt昡F‹9ÁÔc¥áJˆVÖ‡ßÖRç†#y|– ¡;Ý\£“Y¬¢Ï?Ú¦öçÀ™ÉÓXm1ô$”ó ¢Û¥®†Ä8Æ´*q›ÎC¨ cNyº [Ò\•4?õ¾¶×NÏ&æÚÕ–4mÍЋ‘¾˜#ÙÇ¿RGù>”³6¦2ýíHöóß~HžG‘óÒôË}V[p¸÷^±½Dâ$X|ÝVpM¯Þ’ü AtôÛpºYo´×÷»KôH3é» ™¢;gFK"eáÛ½ó%n3¾5†ÁÃ5£‚殤ù•ú.úM!3pçVLÌ…p|Š—r C÷Áç«flzOxd‘únŠ&ßœßo;?OJcæavÛíêÄíÝñ¯hfÄ‚Ë+)–°„/²žñ'¥cûò¼Ë|jD{aVŽ ¤Ñuø5¯¶.ÜDáB`±ajÃEUf½ø˜?êùãù2yàÉ„S½s™eO-<®†°%n3¹ðêYK÷lÉ4—p%ͯԹXÄ8 «d«”ßß¼ç}Ÿ?ðìóÑ/ÎD.äjm¤–ÖL¬Í·£Ï¹ô哜|>zÑ[L‚ ½Ì ú55ºd°®¨ezc¹m/ÂÒÐO•PÂ[ù¥û)E[ïºßÀ›cmà êÌÚ .p›N 2ø,ÆÃ&]Ns WÒüJý”Óµ2H…Â¥ãk IÐ'taßÒ£ß×jz¾I{ƒº ôˆÓ£‡ÌÕŸ–ÑNUv2G`ŽÚ”¨îø yHqü‚ ¨’àÂC‚\öo ¡q@ëŒ!YÒ@…5ÜÑAb2ª6A¢A=™=r`!Aoð>ÍÊ,œ‚X“) vÑm¡1 êT WÆÂ)H8átÙÄÒL;•tMÅ ©3á=%’Þùɽ2bWÐÜ,ô7°éÏ':h½šÃÇ@à-\x‹¼„<+÷p T4]ÓV®r¢Ö±¡wá[AæV ¦¸¦ŸÓÐ+¹ŒÜ&–KCöà5…”䴬ɗ[ai$§äÝ Z øFw Òô’YmBÒα”Þ! â+¥1#òd EÜ›íóSèÙWÀ¬oú÷pýC3ƒ^§czŒÂRÜ&ÉŠ–(¥éž‚ è{ù3sí³:(¯BâfàÀ¢pEÅb¡éT*Xy˜:©"µ/‘ˆD=u,• Ç(áÝ¿’Yú­á2² »Yê3×6DG1 —né :È »¿çz”ÓŸÕŸ{qå+уÈ×3 ƒ+‰  6Tɇ+ mQ9¸>lì)]‹5ˆ6,þ?’9–ЯR‰¸t9’ù>?¹Ž<’ÙS‘鬈އ€`Y;…q’™Za­é÷™XsYã¯Õœ Rk¦¼§C†Ioì‹?ÍÊÙÂÓÏË•çF",‘5½dMˆø½G¤ÌŒvQ”À³á¥–ôVvºoÐ}F4Oý^ƒÅðº4ǯ§§c:SKn-¥XH… ÔiºÍŠO¦dH¨E8‘™ïï“äI_2›¾EnV9)|Í•â^k"7(›Kt8a¡:ŠÜ –_ÒÛ m¦st5Í;§:ûÌ­ïí3•³'$}î]´ÚNIm é1˜.b©öŒÞ‰`CðŸ‚圕´Ñu µ’ôþVÂäô-/B€¸zçeÀÑK0+z™ö”û!)·ˆ¡Ì\ïí¥¾tv|s[³:$¼óœ‘ÑÁs¹N‡¼äö0˜;$¤ÌÑgç²íþ!{‰ròGHn”¤Á#Õ¦xG)«„"<Á;m KZâð+gC‡ÛU¤„ƒÿ™¡C–Àެ cƒ‰íKi²Cz&è׉,—L›ðÌõù¾ŠôU°ä›2-)STA¿Í7ZpÃÌX™ý4a¡ »>¿™%uBb,ݧoäKG{+5°ÊÐUÝ-˜@Çô ïÙɃ± ‡Bã‡X@bPÉÍRŸ Ez|SÿpÝø)0æƒÎ÷ÃYš¤ŸßÐ/Xòó4VM§´aèT÷QéZÕÕ¿‡OdU]½hþþÝóõþTgß*Ÿû—«Œµá6铸ÝÇOèÑñsZ uŠU¿Þ®Ã—†"´]Ÿ7ákNL_â‰@úFE(cì*÷wûCs]÷ð_.ûbüÀL,ßìš7ëövŸõ“¾%U_ºÜÄ/fÄî›w¾¦’0ŸÚ2^8±?´áVŽ¾Î•>IÊý,´kÂG=Ï›ðíîᮘ¾€ÊÛönuPúºG*7CWáëT¡”>”•Êýô_úþɪ§|Þ^_ÇŒDrm?¸Ûm?’«f›Yþtòÿ ÚÓ endstream endobj 2460 0 obj [ 2459 0 R 2461 0 R 2462 0 R 2463 0 R ] endobj 2458 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 2460 0 R /Contents 2464 0 R >> endobj 2465 0 obj 5809 endobj 2467 0 obj << /Length 2468 0 R /Filter /FlateDecode >> stream xœÍXKÛ6¾ûWð¸º*EêÅÞÒ´›¶è#ÉH€$Z¦ÖBdÑ‘èlÜ_ß!)Q”dÇ^lPlrØJóà÷ ‡#^„Ãÿký'‹Â ËÊ·‹ÏÝzˆR‚hÒ-Å8ˆHŒ1EamÑx)F•¶ñÒKðgô.èôvQ/0z¹xÿÞY# v÷ |¹qu»xíåÖ½òSÊ£»ÅÏËÅ71 1ZÄ$|CÿR””h‰´Ü¢÷WK)«²A«rU•ò®á»M)ÚgÑòůËÑÆ)ÆAöÔöýz”"ÔMš¦žÖ“qCí¬XúÑ(‘©j£ŒVììß“)ãYÆØOx^JO&¹ÓU”¤AB¥ŒÁ£ •!Ñ·*æÉlo^,Dç…ƒÄ,5Ýæ“鿣lvrÖ\ño…Ý·Æíh "xzä6Õ|+,¹w W(—µâeÝ¢ƒÜ7¨…hD‹6èâ ™OS7S°‡YbõêPM2¦«i’^w8 ãòÒ„Ò8 a¢]3ë¶#×e}w.§,êœò ox®Dƒz7F™ï·¢V—æâ,È O°, ­ÿ¼m¯‹òß8…Oöá%Í&x˜êèŠ$¿tRšpÇ3z ‰Œ)‹ôéHmäÚVÒHÂpbüÜ”aÇNwDvº;FV“Þ# ù'Ç,8>ûHŽÐn¡?†Fq”‹4zsÂj¾äŽ×Nãs" ¡D:ÎÑÿE(‰â€dpíG4³|}£q:±6ŒÒØçSk›Ôk‰thLZüÚIÇ P«‰Æù@!ú¨ú&νw¦ÄQ×ɵԓ¦åc”A×où{S¦‡LzÒ`Öc8ì#ô1" ÐcÈÆfòÿ$ ¶KÞ܉¾£Ÿ ȧ$ p®Yšúw]” ÞúsÉX±ÊÉû•t⮑¹½¬n&ž^éqðßÞ‰¦: oˆ¨ÍЯ˜ë®KD ~Õa'§ùù²ªä½ïBù°Œ€ toâ_xYñ  ù»} ÷³¦íüuDþtá9£pû«Œá” óÜù¢Ð9ÆV/Á•€úAš¨Z36hš.")Ì^ŒÁìE:Ÿ»uq6èû#›!W¿Ü˜øϰPtQÆpH“ëÝ· ÂGÀÏØÆ‹/[ÕæM¹S& ôáÊ055YW‡Ï.Nˆbúƒ:J¨ Õ¨³ðDÀÓØhÈOŸ{ƒÒÅù¦„î²_º‘ÍVØ& Ö¥k´: -콕ͽ²GH6=µ¦D£àY„"F‚À4ÀHבþ–Jô³tÁ"†O¶4žÓÔYÀ)‰IBÓ«*'ßüãÄËÆ-É¢0MÝjvªìž˜îýƒÓ[éDeÙN1'Ò©[~prí¥t/›ON±MÝÊïÌÌlåSƒ¬Þ0I&¾/ÕÆ~…Á9Úï.­Ž&3’`–%´#Ð:ûý•à‰Q7ÌÃUÒ·U+ÚKÊÊkQp{Çu¯N„¼œ[º¬Ò“žN³ÐcÌ @cÉg ­þdÁŒèpzÄÖ×ïNow"/‹ƒmÀv‰;5ÄNÿ]y~¼­öeµì½'²8 _É/bæâÖg0¡Æ&õºôºlÕYŽX ™ß7žÍ(ÂqÁW:Æ4<â.€­wÿ~30JƒHÿA’ìˆ Ä›|³JÿQýð«# aZŒR¯ÕÀÝq < I'†‚gîîÁðÌ]LáyèÅ–@oHá¢d˜ÐK/¶ŽÓØæq¸ÌÜ=—™‹.ß÷ÂM2c, ³aÈ.¾pMŒ‡ÛÌÝÃq›¹˜âæïÇÔ׋ÿ¹¨ó¾ endstream endobj 2466 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 2467 0 R >> endobj 2468 0 obj 1577 endobj 2470 0 obj << /Type /Annot /Subtype /Link /Rect [ 215.07 451.917 402.55 460.917 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1273 0 R /H /I >> endobj 2472 0 obj << /Type /Annot /Subtype /Link /Rect [ 203.13 429.917 315.33 438.917 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1275 0 R /H /I >> endobj 2473 0 obj << /Length 2474 0 R /Filter /FlateDecode >> stream xœÍVÛnÛ8}×W ú”-Í‹$Š‹ Ø-¶Ù P`“Øš>Ðm ÑÅ•¨8ùû]\K²ì6}JDäˆsæÌáp¨¯Š¿ïšGà2 ÂÌùÚÛHÂïM%.÷(À\Â=È`lò m|¾ác´ç1üëä…?œÏ_pMýv=ÞB}rnÜú8~Mü(lœ÷Kgq㣰\$æ>êËþHˆàÍHqXfðùbYi뢄U²J“bSêmœ˜êò ,ÿv>,G‰ JIðÚò¾Qĺ‘R:­§Ft6´tˆÍ«‘é´‹2²ttÏ“”éc:$|\J¯†Üé*ò%‘ «H*…¯H0*#νsójÒ;.Þð¢ÄoMeŸ¼?MÞ ŽNN”T¶Ë¹ÑlN08·8©`—¤)¬ê$@ã¨Xƒ èUñˆÿË0NMEzè±yV.'E¦,]„05:ÿ/Ïxx•&kyô-¬“ÔToÁ<…fkÛNѰ­Šº DEXg&·PWI¾i߬kt «mRäÍúLÛÍFú^U\”ö‡R ‚§”äaZG{Þ?•Ñ<ÃS1¦pƒb]â[ª°ü/î–7ƒYQÛmmŒTšÁÙVçéó`ªãȬuŽt¹1CÃ.NÂx0.êÁ,Ôù0lþX< y¬†Ë:ÏY–N‡Åœî‰(‘v Ïg3ÚdúÁì}öÓ¥.¶ð€2.g\‡™%6.F2î+e´3|zJP¡v—߂Σv“ß´Uözñ:ɺʩ`crSjk¢®töåÜôÊ÷×’$ß_ÂI̧¤ý¬óæFŠ}­ÛÔwW¦¬°“]÷ó.ê"É#óDb›¥ç¨ æ§¾3«³œ…KTs%r ®&•Ê\A¨D±¥à3ëck·¿,ºDH×Á±?o É]œHìС––«T ¥šÁ¾>«ƒ³:àÑ1ªpFlG*h>ÇèXÁkÚ—Ì>«ÁŠ£œß:á1Ôõ Ïžü¶ò:f-Âo56äò{mA( ðnpEïײÇV¼Óxi—‰µ&¼y>êò¡®àÏÂäIø á*k ¿fqo!‘¹&ƒOÏ[çïÀgÎ endstream endobj 2471 0 obj [ 2470 0 R 2472 0 R ] endobj 2469 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 2471 0 R /Contents 2473 0 R >> endobj 2474 0 obj 1035 endobj 2476 0 obj << /Type /Annot /Subtype /Link /Rect [ 375.123 604.693 404.003 613.693 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2418 0 R /H /I >> endobj 2478 0 obj << /Length 2479 0 R /Filter /FlateDecode >> stream xœÍÉ’Û¶ò®¯Àq\e1X¸áê8ñ›”Ø™yõ\å™JQ4bEÊ5Ëß§p7Hö%¶Ó ¢»Ñ Ý€¾®Âð­þÄ>ñ☣ô°úÚŒQÄÂf(ÀžOŒ"¾Gt@Ã¡åŠÆh ÁŸÁ\À÷è«b…ѻ՗{˜³EèžVx¹fu³úd­­™ð´>ŒVonW?ý ‚Ñí®71 Á¾„ÿÅ£ âÝЗ«Û²Ì%Ú•Úd›<+ªä¸Ï„|un[ýr;PœaìÅ?šÞŸK„¸‰¢ÈÃãxÒl˜ƒÃQ},dŒ)ƒ£ù»¸døPöû¸aôVÈ´ÊŽuVç®4HȾmËôtûÉ×Ö`{iÕ ì²JÖà ÒBË£(T…aÙëy–y}¬ÊT›íõŒÚq4ñŠ<Š´†N:Ñ+#PÙÒÖÐ R‰ºÊÄ£°† Î3³æ5–l4«µ ¤5¶«Êƒ…¾”§ÊB% ©-ªµœgÝîEa¡™-¿µY·xw]$u Θ’ÂÐ<¢UR«å@j%m€x´OÌ`"{°è@ñ\‹ªHò~ ¨³º§R­ü¶ÃÊbV0©’´¶&¶Öí²6öAyÝàuÝOYÞ¯!É匠³Á\{™º×A¦¾€\$ênÈ\Åt¨Êž²Ãž²zß!FŸfš^j íz7d­ßžÖË>m¤øz2y¨‘Ý„G/¢J Ù±‘ÞŒŠtœg̶¦ÐŸ¢«7ÙæV|îÐÁÆ5Cݶ5èIjm Ò8LÃCmÚ±Ù©^rzîe¿~VÙËí÷¡H:h‹3|öI=c 6N„°Q ¡ Z!f€²j,¤™5ïZµxÖûÉûÆó‘†ªø ôõºö‡>ÛKohzpËdîî›rppGwŸ½†ñtº£)‚ÑUóÂÙ ½ ÃtHy«}ësµÏv'½é rLôn0ˆN•L:(=ÉZ'Hƒ~¾yßÁÝ>kÿ6HÙ8VYaòD#G—É^‡7…Å —}ÒБg@8i˪î¿XÚAeQ• RÄ(¼”]ÔãŽmót²+Q£Šî]è~Æbõðtî&˜>'8ÜΣ!±ñýšÄqç{ƒ4¾7HS)0é Î÷5¾7pçû†±q\ƒ”ý‡Ïó)ó ÞöSÆùnJ=vÎo¾ìgíc>´€ÍËèó÷º^=ZPŸbì3~ö|?ÎùSŠáKʲçõcÈ€R¹^5‰¼«öÉVì’S^£–ãÅZ«‡6Ö\Ê­—ßM”Ö“ùgµžP JZ«šj@y#rhtŒP]ƒ=l°ÇÓ}¢+Öªj{ýÐõ®‡ë6d ¿cS;5¸ý­(-AP¬l_Û\DŒÛY3ªœÔcM]ÜsðšÙœŽÌÒ«ÚjØ…EèF”¥eñø—jäî®t$j7'H·P0?yL²<ÙÀNm¹ÈK£( aÿä{î% ¢h:ÿ\M)~¾¹±Þ›–£( ñˆòºe%Á þïŸïµ °5å&¤¦P•èm^ôœ»«ç»W:½˜X»Ô8ñ"ÊyŒýhøNåXtÈF4o3yÌ“‰ö"?"ÕíŸdò „I¯Õ $ž³úr§ACN¡ü&Œ´%íò»•rÚdþY§M(ƯS @?<¤½ÑMß:¶îZ4|ý±Þn޾ Ŧ|îà§}–î;,ëi¡Ñ*L{8eÇNž¥mseƤ¨šcÓ«Ök:•~©…¬E²=·¾ëÓ]Bk<´G¯l¤ZOÕ;5`ªó¢UŸÝÂê¶Å\YE};¬Á})k}š´T×¼Ô&ê;±¨MG®ÎdQå$Xf™?êžÀÌ|±]uË{ã.ÞAuO ý8<ûêÑ;.z§Ź‡)?ùáˆêç}R<(Û„¼5º‚“üÔÂ: ­©€îŽF![‘æá›pÓlÊÈŠ4?m[>‡¤ú¿6³B¤º[S— þêƒì˜‹^4ô²\µãÇRJ8µÄøîBéÄ#Ý  Q­z¥’©T©RÅÈò{•ú-§jÍc6ÃË‘}HÀ]”ÈœÕRåìß’­øé8âpq0ÅÐ@“(hSáò;® ¦Éü³Á4¡½Ö:"Šû#R• a÷gJé$Giy8¨!Ï Ñ™Bí[X?éü´úûúSr endstream endobj 2477 0 obj [ 2476 0 R ] endobj 2475 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 2477 0 R /Contents 2478 0 R >> endobj 2479 0 obj 2696 endobj 883 0 obj << /Type /Action /S /GoTo /D [2480 0 R /XYZ 72.0 721.889 null] >> endobj 886 0 obj << /Type /Action /S /GoTo /D [2480 0 R /XYZ 72.0 282.637 null] >> endobj 889 0 obj << /Type /Action /S /GoTo /D [2480 0 R /XYZ 72.0 177.764 null] >> endobj 2481 0 obj << /Type /Annot /Subtype /Link /Rect [ 317.142 354.252 342.122 363.132 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1713 0 R /H /I >> endobj 2483 0 obj << /Type /Action /S /GoTo /D [2411 0 R /XYZ 72.0 737.153 null] >> endobj 2484 0 obj << /Type /Annot /Subtype /Link /Rect [ 233.522 191.264 295.0 200.264 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2483 0 R /H /I >> endobj 2485 0 obj << /Type /Action /S /GoTo /D [2475 0 R /XYZ 72.0 769.889 null] >> endobj 2486 0 obj << /Type /Annot /Subtype /Link /Rect [ 389.751 191.264 415.861 200.264 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2485 0 R /H /I >> endobj 2487 0 obj << /Type /Annot /Subtype /Link /Rect [ 259.538 85.508 334.547 94.508 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 417 0 R /H /I >> endobj 2488 0 obj << /Type /Annot /Subtype /Link /Rect [ 195.83 73.508 268.3 82.508 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2165 0 R /H /I >> endobj 2489 0 obj << /Length 2490 0 R /Filter /FlateDecode >> stream xœÍˎܸñ>_A rÓ4E½ ä`;ëÄ$ñc‚E°Þ»Åž¬–zEõ´û’oOñM½f›Ç°§ªT,V•Šõ üûM„üÙÈ_Eá¢(Ñîxó»¡G(§(Î )%8¡)!1¢ ¦):¢1)E ¬ j!ø5âü€~¹ioúëͯ¿O…¬»ÜáJÔç›n†àI?‚oÞ<ܼ|—¢ˆ ‡½w1ÍqL²²,i„ ÓRþPôpD¿Þýë‰÷O5¿ n†GŸøþ/o^ü†~öëcŠ ` ¼J&vÝñÈÚjÓÔ-G»¦æí ôúŸF^‹ ÁÅæ´#!èò<ÇdŒð7Á±¦EK”FŠLQ½Ëˆ¢-пWU&3I¨ð<åÖC0®B(/Kx„‹QeÑsóÃX7*õZ7:)fÇíý½@4ƺ»vgwçátÚ°þ‘;Œ»3*ÏìeTl`}w~<øu:±GÞߌ|üÈaGvupÏ÷gá‡.xÂ*¯MëÀ-ßw=_4Pìú®i&yü3K'Æ +7QŒ t÷¾õðp¨…ÇvLð{²€¯>òN9Ô.ݹ©<Úsqn‚ÇÀÂM¸GŒ‡—Ålƺ…LxjøÀÝBQ[.B”«í–]°#g Ž‚à QkG]êA¾êM‘ãÜGŒA}È‚Š[“4V\Z ®}bžøq™/µ¯›P‡p}ÝŠß kÙ~àý…õ•Àžø?Ù±Ö#:.½¤¹»’dâ.S¦f}ù.ŸÖ¢Äe+h’ÌW¬nÐfïVGtº<ŠRœÇy‘Í×C,JçØå³L¥9NJX‘&å|5«-#S½½ºE¬ííÑ®kE~¿ÔmÕ]Ðå _<¹"Ö÷õÇzS™Û2ج„ýcyîr¨æ¡å)ÁQ”™ÄŒcŒd ·]»©[xGl7€Ltì*.;ÈÕ–.Õä@†„ìEÐudy®¥)æUçq%cF4ƒœ–e‘&z(ï›õÊ,td`üž³á ‡Øv-Sý¾Üu=Ú²awøòB)ûj"QRÀFDv5©Þè ¥é„/]â3™FP5îì‰{LŸ ˈ¯÷WO`táh -;bìá6BÁ#Cå¬ËKcœ$Lcx}s¥7oW£fés+ýÞÝi¨»{Â癉M3e¡!lX1Ë8dÁý™èã“0‰•ö•hÝkGO|„xªàBÔÝh‘‘ªª¥¬ ˆe– °DcÁ»6Ù+ãó«&: \êY锎ÉéÄ1üßyL ©Û]å_þ­ð (LòŒ„ÄÏž€ŸV8‰¡33ê ‡³ÝŽŸ‡kÝê.GcÐ,8XtÇ@¢VÝ‹TÎ5ŒCU«Ԩ꧖„×BO½Ù¶á«òîº ” mPMÉÜ3”dÏÈ3žá«úÄ-¬ UоïŽv¬=¯êª#¯$ñ{‹˜¦GÁÖH…ȸ°ðÖmÅÑÉÑagÀë¢EL%7»¨\dTqäÕ<”D¦…lž³lÁA›ýjJ W|f¥ó¦:| /#*&+Œƒ6qj{5 Õ-´©¶øka¡#2ˆVþS„SÏŸêî,šë½%™³-Avº#ê%TÐýí“L$A·]ê‘iºb—+$¤¢Ï±tÜiÅÝ‚—®ÿº`lL&Æj©¥ëÉ´‡®Á§† pæŽÂQšZgN…ü¢ñòíõñ¢˜¦¿÷rmû]êŽÌtßF8g ;°ñ˜‚W£ú ­WY¦Ð[ÍÛ(GR°¥ÓVƒ(. hÄ ‰Ì¸ Èi¢£È+Ù9ðõdÁá ˆ’v™\­&"u’t~Zt2™C#%És©vÆfJÍ¡{»S½ÃNçþԉ౎6 á:Õ bd÷æ0ýJͪÎÃý¹]ç3¾!˜b0qàúØt××§û‹Î‡ûÀû€yôäo-Û`°\ð\ž=gwÏû//d$ç2ntÛ¦@=M(p_?žÕЪ0=4*Ðë­Ÿì-Äúm=ô¬¿:ijðƒë(ÊyØsXÜdSƒ½…•²¼Ý9MdÂØÂ‘Â6ÒchÍÆw*ŠI„óþ¥¦Çþg7¬OrMp‘ÁÑ IÃõT·« yMŒ›%h_æ‚U06Œ­Ò!¢ë&,Ýê똘ú2"a1÷¸gïö{Çâ )±òBëä[6 ¼­LÝ–ÊŸ¸ö&¶”®>Iì+ç'·o#:·Uk¡c=F¤•0ŒŒ­T#ô‹sm7RGi/ï @©¸ºPQmd‡°L¨[IBýpåÐÉ €É|%ŽIQ– ŠÚý§oL¦ž?š©“ g‘’ftÔÀS,#­kšî¢ƒ@SüÄ¢q(Â#jŒwhÈUßó Á«·.4Iq”D0íÓrAÍG>ÀvëƒkNpD)!%]2rÕ•ž­5C_ó'š§±·d{]4 Ú¿C×/Ü=Ñt¢Èí? x{ÎBúÙÞãÈüŽnaGq«æ´žÿ~æu ˧÷Ÿ‘¹–}L¦Y\á·d`[1Èâ"ðz7ú¤%Îäå;ôVÖ1“ò™,0ý÷OS6)+–e½|EÓ½¥Ø¿ Ÿ´v/К'È^¿A›·H¿qôêõ¿_ýY{íYÓ ·OÔQ?ßç•F .áHSZ¦öÒ+ùŽK¯zûG‡.…Ž6ISå¤ L¯·2Ť‰Ä„‡™å0|±W%šRËcÞ{Â-”Ðìv#†«¾t5RN§¦ÞùÔ§©ïQz<6¶“‰Æx­n={¨…V4Úl¶œÙâ¯=G¾IéÄ7—ƒie#"+§½Ó˜¹ô'¾A¨yåIöî%è 42ºyÑ»x‘èCÈì¾Áœ5¶ÒjüÑŒgfŸ.Pi¨ºÑÊpË ´ÛûÉ ‚*¸à&˜ÆnêÌÛÉbÙo[8bçŸ/ ºóëd~MöÂtÅÕpËC9vð»`Ke­QÄ~Zv„½ÍE‚‚G_¯¾a»_p 4úc§„³g!{»ÙSÑw~ä“}¶æ­)l²Q”E8•¥%Žò…-ÅÀúÁôM¥þ¢$_ h¼°»U7}H©¿ 9Pv lX4hú™ú†<ÉÉ’— ˆÏŒ“Ø74ó5Þwjr(tg¼Þ“žÏ'ªÒ|X[xƒrDís”ß !\IJü–Á®²I’¨ñëÿñ#‹`ç´$¤ÈK›ÑSŒÞB”ÁË›½Æ•³ ›Ý±‚¨$ÁyAÄFÔè?8¬çþL}ï&ÁGŒ×f$Ž Õ´¦ˆƒéå ÎBn­zÀ̇3c¿ç “ãÑ–â€do¾g]H×Ôà1­YA'FÛd •°”[ô=§®­ÌÁ1t°F%̾FÆR¦ç´€i9ÎË2‰—4˜VFŠÌwbzX3ŠÓ$+Ëœä ¢p°ÜOξªñîÀ`TîCû\êY\‡¿~ª«óÒwà¬L&zŠ8NÉš8‰Â)·Ÿç>¹»ù®0ýb¹˜Ä$]XmO Ù˜*½³G ÿÃããÍÿBî# endstream endobj 2482 0 obj [ 2481 0 R 2484 0 R 2486 0 R 2487 0 R 2488 0 R ] endobj 2480 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 2482 0 R /Contents 2489 0 R >> endobj 2490 0 obj 2848 endobj 2492 0 obj << /Type /Annot /Subtype /Link /Rect [ 417.302 653.921 443.412 662.921 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2485 0 R /H /I >> endobj 2494 0 obj << /Type /Annot /Subtype /Link /Rect [ 384.983 560.039 411.093 569.039 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2485 0 R /H /I >> endobj 2495 0 obj << /Type /Annot /Subtype /Link /Rect [ 411.205 454.571 523.275 463.571 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1120 0 R /H /I >> endobj 2496 0 obj << /Type /Annot /Subtype /Link /Rect [ 149.687 107.033 175.797 116.033 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2485 0 R /H /I >> endobj 2497 0 obj << /Length 2498 0 R /Filter /FlateDecode >> stream xœÍZÝoÜ6÷_A$lEßE[ F> í¡‹Þ¡î-qwu‘Ä­¤ÍÚ/÷·ßCŠ”–ZûÞ’yùÌyŠâœÃ|3ÚúJ(äš”G\^*UÍÔõ.L3ÔÖi¥“u»«òŠ\'>yI»J“ãŽirÛ†ën«zøb9|&^ùE¥ÉÉD=Û¬ äÅzO=/kX˺q·b›ºc‰i9h£ÌËzÖ•l0Mé¨é’·û¾\ô‡f¬÷ C©m#†þBIJéXóÎÓBgú$޼ ûÄØ ü4òBøyäÃÒqƒlxOzz$÷Ž˜ç ›9»gÂõÓd±ª hH^N#OûëP·uC{ù¡ÊTˆùáEe`e5¬­Ñ©Ý¤<ˆE³G¬ËÝ€Í%5à€«‚à7¶yscàÜ6ÖÔãbµÀ:qçÖ¡Ms%ºd¡—‚[=”l?¬½¨lÀŽ~eVCn芕`Cëã¤&ÂÕ=†°þ¹ïûqîTûÕêâ‡øÖ»[JZ{9ÃŽšÊà{Kø}Ïa» Ìþühèi-Þ½¬V‡=¦¥rˆ<öròò+ë-tdMcJ‚´^ DÓÄÑ‹‘û=W«®ÜÐJ!àö„|cOÈk~m·+K¼ƒ%º½¦¯Xïž_J×;¬øÁrÉé "UæÂºÂz44®`÷b¼2¼qÑ܉²eåŽvõÐZ¹ÕR|ÿsF{†z¸{åÆÇÙçÍÚZ²¬n(½@„Æ0u¤ç:;ü?Êós}-Ʊ¯aé,pÙ'IWåËDÿïÎ,RG/1a¤^‚=ÂË×?~ÿZwúÑ!dR,¦ „`3‘•ÆÐ°ßbÞšg.bI }Á†vê‰Ë{Ö±žŽBKfg,zðíJÎú™—ê+ý½kTŒ.âéà¤>v½å¼ÒtÏè ÜG@•<“÷ ªš¨_9Æ6Ç @*å(Œ/ B¯È¡z²À¡†Û £Âó‹¼ÐO}Œ4ê$” ìë½C¥­6¹‘ôtÁàXÌa/Ž ßÂo‰I%2s"Þ‚ÇæÑjP·û¦Þè¤KòÆÙ#¾¤j |©¸Õ”òðVe¨×ÝÈú -™a‰¼ØtE;)¡ðxe•ÃQ°°ƒ•’¦ˆû¸gƒ§À­\tAÙUÀÃá~`¥Ê¢ãXK Éö ­õ‡q½IP2îáGi*9¢4µžùƒn¾)(0dø>-/RÐ?C‡äíãžîYï Û¶9°£(97Ž¥’ºC@yB*Å”4l§¶¶¾Õ+휱-‚ÿåG8š;¬ù Èt¦ô‡¾gPT‡B 3üߨ%þpéÖÖg《aV±NV4²>ÙÁÖp‡ñÑž_4݃¨úD[~ªC3W–¯æU]¢òqî%:íGzye‘úÖZ$4Ut¤÷O@äè-® ÒAG[ ]~ô¤•=°©wiøwPXͧbèÇEž&™CµŸ!"l­ÞK£jÁ¨.SÁÙ0O:V ܪa´ï4ÀxLn(©-îé@9a졾Կ'Óµ¹{M/Ä“<ز=ž•–Êt´dF3—†—`º±ª4çXCƒÃÔšN²‹¸Y—®ú;в…úÖúB ‘áÊXï/ž¼¡t$Ñ >ñ™A ¨LÜŸ‰|òTÎöqŠÀ+Ñ(ŒÏàMò|i?:EŸ„*Ów¨X÷pìsy[¡¿RÓ¯äÝGÿ01Ü5B/#æÐÅÒÊäÙd"‚8z¶fˆr0A9IÃ)¡×)½¹«t5üï?–ÍÄxE¼>ÞëwApr—ìꃧ'¹®ˆ\Drý™,"ÃõHªû(m¹uê¸uŒýôT¦sGsæ^¤¾ŪÃ;±”è+ÎÛ·È¿àX5§é³ü5ÈSOÍ~…Ž9îiï=N/ù\žågþ´¡sáã,ZoeáOûà•DÈ;>î,8ݰ)¬4…T^¯!Ã|F¡Ã~Ör6,µg\œTн©ñøWðî¹ñ2‡zQÜ0ä~âÐUl%˜ðI\RœÇÖe¦õó¤”&‹à0ÏCÇèbÝ…”Oí”Nõ3Ã\zp¥î¼Qφ½(Ö¾²æQp×q\ˆüm"õó _­)ò' sŒÃËMÉzöâÅ™ƒˆE’'QíMR O%ág‡²4ÅÄr©„%=¦Ç ÝITåób–gêâE †‘ôHå¥3¢O0‡Fß8ZÙÞ5FÈ-ÍhÝ\"‡æÑ20*aå¯+-w³ŸW”DêDzó K« bÄš_6Q«uËd¦ÞƒèÞé‘™¦°Qó¤Èâ@ÿCºH$ì©Dˬò¼“4NÃ8_> endobj 2498 0 obj 3037 endobj 2500 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 713.389 151.1 722.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2446 0 R /H /I >> endobj 2502 0 obj << /Type /Annot /Subtype /Link /Rect [ 279.086 585.389 305.196 594.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2485 0 R /H /I >> endobj 2503 0 obj << /Length 2504 0 R /Filter /FlateDecode >> stream xœÍWK“£6¾ûW(Îag«`^“L¶2•Ý<*9lÖUIjw,Œb@,‚õ8¿> ‰—ç<öÁúZêOÝ­V·üec# _£ý w¶†ŠóÍ—^n£ÀA®ß‹À2®ç”Å)"qÌó2c"E­{5'Dj”‚Õæ’ØÛ͈+š‹Ãle™¸{¸ –*F\QRÓCwz!´Któ9Q}ØRÖ'äH’BWÔ|šîœ”r#jž£Ô’‚n»ïF–Œ€ ø€Jðr¢<Ù¹jÆFB—aóýY êŠ"áUÞ¥JëÔ·yœ“¢!Yv¹Uàë<“h()9³.[% ™àZ“Žf¤Crœò³©À>ÕìÍèWRÔ‹í”@иÏm‰³öH–þáÌߌ ·R&îäbë]´R¦lòÖ=ìÛRï[ÄK!y{Äò`Ù>²:SúÁ!Â%_d;»sÂ¥&ð£{džÙH¸ù$²ן1¤užM8Žvæ Ë.œ±<-hâæéÏx|†Ø®µ;œ×„Û$‚¶Ö+¤D¡PJ+z«Ì9–µGŽK"4ÁpJî.ˆÎŒwpû´ñ 6x»£à2Aœë¸®iG ÙÞŠŽÚJV4åTW™/Úø¡&H¨*‚„]™ þsÅ륥ö2…î°r8ѼäueÌ úû¬Æ‚äX—‹W%éºÒRkhÞJÀjA³äVᮿö;¨ô”jwjÏWº¦•4]å $uj*qÑëTD{ƈö,mD‡”ôWRÒÁó²˜áÕ$†" ÿ¬àãF+ªm ví.Eœ5ª2x= e ­bдP=t$õLO)­Å­–¼¾Â QˆOŽ™Ýck­àÌ|cèÒ^©¡¯õï¶#ÃX£i;È4¾Ö4ÀkJþÒù¡]twÞoþzJ endstream endobj 2501 0 obj [ 2500 0 R 2502 0 R ] endobj 2499 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 2501 0 R /Contents 2503 0 R >> endobj 2504 0 obj 1274 endobj 2506 0 obj << /Type /Annot /Subtype /Link /Rect [ 156.05 567.789 182.16 576.789 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2485 0 R /H /I >> endobj 2508 0 obj << /Type /Annot /Subtype /Link /Rect [ 165.82 416.437 191.93 425.317 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1270 0 R /H /I >> endobj 2509 0 obj << /Type /Annot /Subtype /Link /Rect [ 211.09 416.437 237.76 425.317 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2485 0 R /H /I >> endobj 2510 0 obj << /Type /Annot /Subtype /Link /Rect [ 256.92 416.437 288.03 425.317 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2446 0 R /H /I >> endobj 2511 0 obj << /Type /Annot /Subtype /Link /Rect [ 307.19 416.437 333.3 425.317 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1530 0 R /H /I >> endobj 2512 0 obj << /Type /Annot /Subtype /Link /Rect [ 352.46 416.437 378.01 425.317 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1632 0 R /H /I >> endobj 2513 0 obj << /Type /Annot /Subtype /Link /Rect [ 215.07 372.317 402.55 381.317 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1273 0 R /H /I >> endobj 2514 0 obj << /Type /Annot /Subtype /Link /Rect [ 203.13 350.317 315.33 359.317 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1275 0 R /H /I >> endobj 2515 0 obj << /Length 2516 0 R /Filter /FlateDecode >> stream xœÍX[oÛ6~÷¯8(ú MêFª(‚­X³v@·µ5°M™¶…H¢«ËÃ~û%Y’%JñöçA¼Ëwn<Ì÷ŠWú#F„ð!Lß›uÜÛk–\JË¥ÔæË…N—\ˆ5Mo`Gø99‹óü±H~^|ý†gÖ@‘îaA'˜W¬¾,>õtkàø9éGa»x»Z,o\`V›ÎÄ–‡öe>þ8b[zä[°JàëÅJ©8‡Êà.º‹#µÍ‚ý.’ùå7Xý²x·:nSJÄsÃýéDEŒÎ9¡ÃxªØØõ®ÔõÖ‰"Ãi-åd¥FP'U¦#i_áq(=妣Èã„3Œ"îû¸EÄIY–51ÏÞ8X,­W‹ºŠÅÔ0F|Î)¥–SƒýU²Fk2“¶K§ŒòšàÓë,5¼(v²çÁ}7Q›vª4òB¦á¡]{ˆŠ];9JçCéÌ÷CèÔuü±˜â…|œTH¸Ð&3xÕJŠn˜·Ã½Ês,! Bu@÷2Œ6£‚ò1Š£ ëv7Q‹Æ­Ê¢OZ@÷VÁàA¶E4¾Á` (¬¡†­É>|DWä‘Jáöâ<ÙÌöˆçÑÚ’#†Éaìe6«ãb†D)hwê/‰úÉ>–·—¤fÙ2qx>a:S9¦@EúA‡ÙÃd†‹ƒ*»IÉnò ²û(Ýv ¾;Ù cÕ?´Va™È´èVŠ]Л…Q!óþfOb$½Y&72ÃøïG¨YO‰t=¹µ ¢ôU7z*$Á¡›ÜɱÁlŸ•ë“åq ëj¸Ïä>S¨dÞíÖ‘]ÏŒ,T6ÃúÂlg,ýɈeÜ™!ou9æT5‰Òv¨²ueº6GI”EGµ.÷qµ ë¥[Óâºc’ªÎnXÔ6e>´Ž¡†9¸ïQ×ÜuLjž¨aèAß’`ù@¿à!À¢ ù>1Y^yŒ<‚<˜…)wL¿Ú’Õo/Â1œ|ùÏð˜fhû3 —7Œ µÐ¼GD¹Ê hê‡ øÊ4úŽ̘5Ú®Ö¸“®¾À‹³ê\P› ®[b\˜5€Ë ú)Œ×$÷ç¶â¼k{ âkGY^C±ÒÉ3´0¡®Vƒº‚¬L[]F`wÒª>¦<Ì¢}k…1‹¥3,â†ÞdXñÖ€×p—Öºe¡’ À ã9æ"vÔByUN£98±„®Ð' )^©ØpëVÉõXÓ `"æçUtƒåZx T`šÒÿûçw7þ\Ê"\V._6ŽÏÂÙ2¦°<Ì+óÊe¬³÷6VwA :;£m™!P,õUµ@K4¼¨QSzÄì™´Þ@ÂË÷¿}|·$çëè ƒŽX6²ó4<×/¶ÎZ&|!hÓÔ}‘xƹêkhÂhcb8Ô¢TÐ&1>ËÍOo';Ý=>¦ÅŽ‚ß^¾jk$‹Yýtó|y…~=)ÛuâëÆÚÌ,œÍ ×õ_R(ïƒô^ö™¤{.á.R;îÿ“޹ïkì‚ñ)ìé4x‹y„êÌÜäµ'Å[ºö«¶ß^‹¦¥{ŒÔ¹ÉqOKX´ñ˜cŠ›Jz8)ݦˆ¡îøp™”N&…ë0ç¶)Ì! ÒËÅ-v~aU6ö‡ÛK˜‰¬ÅuøºžÐT³|‡ÝçÛǺš]½Á~N7Ü×ͼ–ºÄú,É®HâYÕ}w^õy7«³ítWƘ¼Þ7ŽM¨~rÛ2œßÅþõ²BrUf¡Ü¨l+I*‹å°Î‘64çF#Þ×svp°ø™ì ê·ZaÆøôuæsám`³ú‰â“àY XYhN»zíÛÀêú?VzÇq‰p]Ì߯9üXâ‹rþõ¥­Ç1rmÍÑñ{9‡v‘ðE> áîƒì¾Ìá½’iÞð&©~HvÍ YËkÒûïȧſøqÉ endstream endobj 2507 0 obj [ 2506 0 R 2508 0 R 2509 0 R 2510 0 R 2511 0 R 2512 0 R 2513 0 R 2514 0 R ] endobj 2505 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 2507 0 R /Contents 2515 0 R >> endobj 2516 0 obj 1481 endobj 2518 0 obj << /Length 2519 0 R /Filter /FlateDecode >> stream xœí[ݓ۶¿¿‚“Ƀ=cñ@ð»oõGR§uÒø.i:q¦CIЉ5EÊ$å³þû.°$%;v­‡³»v‹‹½»òÿüOxn’¤ÎjwõNò='¦ŽIVHÜ€†„øŽ¸4tvNŸ:oc¨*ÁŸ^] ·Î¿®Ê+â|õûPgíhwE&„ Q7W?¶É P¾$ûˆswõôöêú»Ðñˆs»Ñ.¦ø×Ká_ì$®Oy)¥ÎíÎùýÑmU³©jg™/‹¼º«³ý6gÍã?œÛ®^Üö:îâ&—ÖïŸ{&nâ8vÉOBŒ<à Dþ©gÈD-=öÿNšL,‹‰i° ¥‹1nEQìÆ (NSøä&=QÏ!æbºgƒ…r»ˆ V-;Ÿ;$ÖÌYüˆ=s±j;ª2TÖ¦`ù°~yØ-Yø˜Œi‰JÍ~i˜ó˜³çQ»Í›Ž¨öm^•ú[Õ›=[å›cGßoYm Ñe´)/ï´ÔÍhÅšm@F¹bZ¿aJsØï«†­Gi³ºu;òÖºf›ìP´èÓ >u}Àñ t-`ÔGžÛo·¿s’«jÇôÇ\Øfåú¨?lºâ±:t咉Π!:£¤.—3¾Ü1ðRmjGä­®ÒÁÚZÝfÏê…í‚ ¸`µÍö-u§Ýf­Ó´yQ8Âh0vÉW WUÙ°Õ¡Íß³âèJðé©1>/¢âIÓ$ äÄ8 Û84AØ.âÔM;ÜJJ”üZérÍÞXÓjFf|Ëî5‘—M˲µ!u3ÚhUUo™QÍpßÑÕìצl{̤ØÚèSY7In€ex—µ-ZuH䥬<ªâ}vÔÜ®ªTÇ‹ûº‚©×h1÷y»Ueœ§¢“­\guWíyµz P$¢Ž—n_¼ÔmŽk¶Œµ6R8×îŸG¼AÁíÂnÄk¶yþÔY×¶ÚÙä õ\ÄyÔwIJ ¡I,!ל‚œç‡Ð–¯J[nÞæ{Þ/}Ê-H¼|®ËìC[g+…AäA¦ˆ%,ׇðàjÆ¿1N ±ÍÞZÉX†!{Ÿ¯™¡¦rqÔd™íph‘üíÕ?4Áý¨)˜Ïm–—±G'ˆá.3 ä¿|~þxD‰Äbµ4ÞÌ-VõSk£Õ@€ðäˆ'¤ßêF,trŽz©^´$aNvͺ\M«e)îášgÐã"儯%Sò$\ÎÕ/§øHý¼\´€Î‘¡Mi¿ç«¼Í8‚÷R̾uµ:ìXÙ:Л.^œ;àÔó!« ·J=9âí܈ÛõO ¹Ý¢:´ûC»hû“#Oi8h|à ¶âë$…©r#–Q®þòÝŽÂu ËÊâh¨Ñ‹}7 y~0¢{½ô½Içxél[mVÕïXÉê¬Õ†é°ôÍ÷"" Ñ_žœîS7‰‚4%ÔŸè͇ÉîøiìúÓ(™ëÎF¬-=ómS?´ÇPç%vªô¤ãOSÀŠ#BØز[–O÷˃Íñ mÄ#m;åØ/,㢉å?e8¬rnF6_cNy¦‡Ä£.4$^œkùÓ|yË~;i0F¦Æüp‡†i’Äcž«ÛÍtà€Þé ·óõíwƒÄöìÀ{.õHHüP®Ãlà²êŸ \V ¾\ŸŒX‰?huÃ0­5¢¾(Vs‰ή¸ÎÚl™5š‘­xw;úǪeé(µ¬+Q;$*mÚR×ô¥lóUVhsªQËŠê./G¦{ŽxÎå’7æ&¹Ž°2o:ލÁs–¼ÆÝ vW8å¨)æ¹ñ½È¼0Mc_­m÷s±ëŸ‚ˆÝbŸ5Í}U¯OÁħɠ¥„ ?ÓÙ ”LÍ‘H©kb9XÑ¡É. šÐ¥#©Ê°ri¨éaFVM9? Þœ†NWãã Ã˜UàñaáwiÂwݽqHð|5>¥Ò¤gU¹ÉïµÈÂfG™#Ò7Ï %ˆäöæ¥Þ¾†©ë«ˇF¦—HJŸ!±ªv;Ó‹"/ n{°ÕC¹dá¾Åhˆû$²¢©4µìÉÇ~1öåQ—w,+›q³{v¢úÁà‚+ \±2=)Ä\ß÷¸šük£Ëjó‹TVš¨Ùf½ÔäŒlé+AË£$v¸WD.6\†:]¼+ªeV˜ÚöFS³‘ŠT8쌦b…•&†\ËOGüt}hêë‡BìéW,*˜~׬]] o\Ï¢“'¶žÄ®×e¢\ ÄaYv‰½8Ã2Ÿš!\€EA­NÓrJ>éhêXòíß~zõb2ZÓx¶±Û©ÿ;û{ˬ]ntPœ¥iB÷¶›KªóÖÜïÄô¾rOù½ ´†ÔtdUŠ“$ÚmÕèšxP¦«ÞoóÕ¶£ðxËޱÌC!ŢȪ+ 8äË7¼7µ˜ÆÐžµF»ªèˆ­Q+o ãïK£_ó^¨n{ÅUC;†Í ]Ei‘DÞmeüøÕƒ´ÂuDoþ›­Y½ê.*ôE@(®ÀG’ÄEÅ‚r–¼LXðu[\Pø›c}_aò¾Â÷ÜÔ¼¯XÐù -ï,,qòâqÀïÕÇÍÀµe„³Ä[–àá~%«Awmí’3íNÀŒê~µ )¥rxŒA3<¯mšµ€XáŠÅ}P< %D\…}Su¶ùkVçp£÷`^¸Q|bô bŒ>€ì“@ö'àdŽë'!ê¹yã5¼XõRX\Î…“yÅúàdß³NÁi`H@èúB€{@Ûi´=ƒ½ìÆFÑ&×G¾1EÛEĨ(° Ÿ/F)ñ–%øAù^UƒþÚÚ%gÖJܤê~5±öi¥®  8cDN¦úñ·!Ä~Âs­ÿäåª8¬YVßͯŠÀºH`}Mü”°œ[ù.2ƒ×Kš£Aô€«¯‰«gÛ¬¼GO4Hôe ¢ÞgÅÁ¤ñÈJx(& ~rÙ[WâP:P¸f«"ÓgJ~˜vmEÈ0ipvYý– ŸTÇܤ÷ΧaâižÔ±hû rÆ|ï$ l­åÅ·äd5³¤Ñ@ú¾jš|‰'k^âÆâA–8r@ °Ü$ÈOMWœ<Ìñ¼X⌄¶òE>yCœ0ÔV§à×`å¹þiÏJ^pgò™0Œ&²ç‹XvBj…~…ù¹ÂƒoY‚Ô$SÕ ¿¶vÉ™u7©º_M¤0ZéùÌ9Fô↩þ£òÈcÆF«DæQ—‰¨¯ œ‰Ì¥Bf2‘Ñ zÀÕ×Ä•¼ú ,œ°Þ®×9_å 2åõŸÁá§S}•°ðˆHÔÝ1RýÖøðKcK·ræÞ‰6Qàñû‘o/ Š|c˜$Ib7™|N­>oÏÈavÙ‡|wØ9¬®¡E¾ËçŽ8"èÇ%n+$'I¬‰¬Ï6Ñ”xËüЯ›ªõY•@šž°í’œ¹{1=‰=UµžúÓ‰ÂI†óRˆþ¨IYZ|ó9›&< ìcQF?#Ìè§àìs!*ù„H¯_Žf—Š¦É BŒäÿoé)°™v}Y°ôÒÁ&Ó ŸèG$%‚epº×ÓŠÑÏ=cÜð_Õò·.qò]¾4Cý†)=æÒ‹7ƃh?§‘ï¡EÙ9²(«ðb‘µ¬~óøÉélB<Æ„‡ò_X˜ÊOý )Ô¨(Pj)±Î2”9­€µw=$ º§Wò@¯%;&Ù¡K° Õ>PT_¯`ñWÑùFýHÒÿ Ƽ–ÐR|¢üÄáêêvcžÉðÿÿ•%—6 endstream endobj 2517 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 2518 0 R >> endobj 2519 0 obj 2885 endobj 2521 0 obj << /Length 2522 0 R /Filter /FlateDecode >> stream xœåZYÜ6~ï_Á·uMQ÷¾­ã8±á ðNëEMKÝ-D-Ž%µgæß§HÝ#g¬Ø¦ª$–ªŠëàøó& þÞÈYÐ,ËÉî´ùŒò€¤œ„ ŠbF#3’ ¢<&'2Ť‘k<‚ ~ŒÞþHþ³i7Œü¸ùõ7x§$ Ö=lØåJÕíæ£g¾ô·d#‡ÍëíæÕÛ˜Œl÷.Ä<ø9üIIFC.©œ“í‰üúb+DÓ“½èÈ]}×ÔâÐ÷Ǻê¿ûlßo~ØŽ£Ù·æ÷Ç‘‰€›4M)›âI© µ $Z£|42dÊꯌ$Úýó¢Élf1ó žCé›1î2Š’”¦ (ÍsxD³Œ8Ï®!æ›qo.íRJa‡îÆRÊ3ÆX0Š‚ÂQŠÎkßoüùùå<ÜŸÃ…F 30…ÁÊ(Ök»j_ÂÁ#ß‘$û_ª¶êŠ¡ê­dx–ê#–Ý×÷bÝZ²(Ëz¨… NÇp¬,ýî%›ºêö`ù]W¥åïž,ù¾(«W¿ÜW­$¨wçÖ÷D+À<âÇ f“­£:XÉ™ç£d¤‡†ìÄ Ix»W–Ì¿úþ|Ò–KöIœ‘:_ÌÚöâÜíª¹nÜ6)t%¯ÞæÓý §yšäYžÆs/öBÐþpj®B „e—UkÛ©s_9—‘òÒôÓ<¸ Ÿèì‡'éæ*“œ†™Äu˜Ï½§¯kÑÐïÕ‰^õ1€r~Y ‘ôP7 9TÃ?×Ù~e!Â’<ŽSsÊþzÔ“„äñdýöXË£sêìx´52onoo?8¶ìê/ ©È#†¹áX Ž«Ú(+ï3½8y/›[4ž:ÑŠO¥1´ÕR}¸ªûjWïëÝàvÀ҉߲Òà÷\ÕÌî(úªu¼4'E<v¤NÙÚSÕŸïúêó¹j'+Åî|I†®h{ë^OݳYøÍÚ·@biÁqx8vüN®‰8 `IWƒrUó*;"yt¯Ýwf”¸Lt¿ëÍÐ|YwÕnݵ¢­·ÜbE³hµf”;š,Ü‚sÑÜÜŸ»{Ñ»7U¼ûcU9;tÌ5ýÓöç Þ‡xŸ0%‘ɱ%¹ïêv(îÀ céêÓÄœ&<`Œs—ìê’>>“î¤)I4^ªöþÉHƒ=UwªÊ*ùUTIs^äk»zЀÄäÙ¯°>‹iÆbÙþ&Î|€÷óùZ:§“Õ< ¹IšÆó¤SóHgÍES^Z÷Fì^ ñ»h |ã<‚j’2/X9¯K“Až¸z4×ál¨šJVê$ÿU…Öø£k­qGxáiw͹˜ Ò¿œåKŠž-©/2G‚)õð$ñ#dAéVv›T@.Áu½”ÂÐ(›¹u¨\$BùΡœ¥áBÚõýs`âpjÇ Ìq(È÷··ÿÇzw$;‡µnÕlfÊ€Ÿý!Ù–º2éÜq85“Cí7´×ºYž‚ÇÊušiƒ>­nfyQ–x¢,™v³7A |Q ¬Šõ»[éöÛû!o\£Í£MáÑJ°Ž)Æ;?Z úó‹ß(îÄ—ê¥Ç«î ™OoÑôž©;qn‡yÿ²d´ n¤]Ç×r£@õÜH?öÍp߉u¢ŸÄC楓ØùRèði®ð¿= g”œáFª¯úlòTjŸ5 'æMãøƒ*JÈÀF.„#È&á5:М¸MVŒB‹¢tÜYµ%5´×î+^÷ûŠÄ$¤è¶å·ß2ôºSϳ”1”Ò<˜»#+ÉsU0äù5ÖdnþG\Ð\ endstream endobj 2520 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 2521 0 R >> endobj 2522 0 obj 2237 endobj 2524 0 obj << /Type /Annot /Subtype /Link /Rect [ 165.82 403.301 191.93 412.181 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1270 0 R /H /I >> endobj 2526 0 obj << /Type /Annot /Subtype /Link /Rect [ 211.09 403.301 239.98 412.181 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2418 0 R /H /I >> endobj 2527 0 obj << /Type /Annot /Subtype /Link /Rect [ 259.14 403.301 290.25 412.181 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2446 0 R /H /I >> endobj 2528 0 obj << /Type /Annot /Subtype /Link /Rect [ 309.41 403.301 335.52 412.181 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1530 0 R /H /I >> endobj 2529 0 obj << /Type /Annot /Subtype /Link /Rect [ 354.68 403.301 380.23 412.181 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1632 0 R /H /I >> endobj 2530 0 obj << /Type /Annot /Subtype /Link /Rect [ 215.07 359.181 402.55 368.181 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1273 0 R /H /I >> endobj 2531 0 obj << /Type /Annot /Subtype /Link /Rect [ 203.13 337.181 315.33 346.181 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1275 0 R /H /I >> endobj 2532 0 obj << /Length 2533 0 R /Filter /FlateDecode >> stream xœÍXÝoÛ6÷_A}p€†&E}E°fMÖ-¶6¶¡éƒ,Ñ–It%º®_ö·ïHÉ­/¤}JòÞéxw¿ãÝñ˜¯3Šü^©?¾M±ï(Êg_>Ež…˜Û°‚mË!„!jcËA9:g9(S{Œ…u\ÁŸ3Y ô÷¬˜ôûìó‰}ûQ®UÝÏ>¾5°~Nþ´™Ý,g‹;Q‚–ë6Ä– ñ¥üxÈÇÌR«ÀBË}ž/…È*´%Z¥«,›2Ü&)¯.¿ å»Ùíò 8#ûÏ ÷Ç3!o<Ïä›OZ «yÀ©5ªOgŽtÉÚʧFPÿu™ô<&¦ÃýTz6Îg‘ëaByAŸ°–F–Le̳×OKù5ŽÚö{%³N3ŽÑ%º²ì¡ù2á-Qòu …Ô2ÄNnw²¥Õæ–Ú§YÖR2áEK­ ¹"ÌyÜ’u¨ŸŽ†‹Ê ¸ôÊÞf˜'Ü~Ù¯…Àà'.åºQ†6Cð @‡KààÝž’Ö¡°0¼‹Â»Ê±:t-ý0@Æù®Ó¡ƒ}B0tx–‡J ¼þnÃûÊDRk3À"­i¡ÎTçÁ1z}Ä‚ú( AyØòÁ0=ó‡€6ìùLyäÔªn¿‡ù6㓇.x×}Ð×ô¾ÅN9íBÒÏ«Dì²øD–»â´–IZµrQ™nå‰\—"7ùi§%¤('Î>áeûý ve+,¢]Î C-„¥µû*ÐÉã—í7C¬®½nK¦¶ 5Ò?ßém_¦RB IœmÉ+åØ^”i±A-,H½˜¯Ã]&q_3%^GuSá”ÙPqP:Y&öJaË‹Dž75ÐpŽ•}(y(M-¡±~#¢! ÎýïÞ¤q5LOš^ÒRl8à.ϼɘÑûûû÷èiÐA_Éh¹>êÛÐpæq™~k,ÕŒ“/ )ÌMr5” ·æœà6Ê”jXOìx¾· T—K€ä‡m¸å%®6y6Ýô\2¡n-Ï€µ‰k¥2h(†ˆ3  MÛ–[[{>êVic_ëq•‡2JNlm[/£T†2Å‘®SQ/;©£yúD„X(¼x%^„Y_è&™Ø¤Qûí·„çi%ËÃÅË#kŸ¤Q2€T]HgH÷u  Ô…ù`Æq}A4´~"šP×TÊpV&ë”ëCòê5È‹wXÁÊw|a|€žñ-»*;`ƒûº©åš‚kºaqÓw ÙtÐô½r ŽÓ‰F$ ¦ Q–ñU$T8NH5ÕNêکqÂMäÔ6 OªI§ÆÎž«°œ® ¸&7âã-ܳ¥°úPEˆ3b7·¯þéDÅ·$ÿ{ÑÓW2P¸¸£´ëèîo‚«RMkW1ÜèêuãJ¢xÅ(ê·ŽaœenýàŒ`Á{Ø8mZÎê#O;Xå„ë`ŸX ø8düõéöî\F =3-š1µŒ&ÏÚu‘o©s]ªåm2±‚ùºN7»²î=ú€FÑè~˜Ó‡Ë—¨®‹X@±ä¢’J@¥«º“µ°>ütlAÐñçÅÛ??Ü.ð“1JÁhZNãùÑIÙêÙ·ˆíûµ{µ›UÂôÐÀÈ\x13zmÖìüÄ×onF§\Sèz{ÑÃÜSqÜÞ³výÏ7Ø®ÑÇ£¶Õõ¨y–0:lœN§,Pou0Îì1ëéjÜ<ÁMæ::QÓö*¸Mù†Êºí]½‚ɵ‚ ¿nèÚê"-bþ'²íðC®Û~Òõ=_Mú Ów`5¡ï+C¯:wž™Ã–Çßõ­³ID ÄÇg,¼R?„åã®Bo/Òè1D¯rÍø5OŽù56þóöqö?ŠcH endstream endobj 2525 0 obj [ 2524 0 R 2526 0 R 2527 0 R 2528 0 R 2529 0 R 2530 0 R 2531 0 R ] endobj 2523 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 2525 0 R /Contents 2532 0 R >> endobj 2533 0 obj 1657 endobj 2535 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 588.421 146.11 597.421 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2485 0 R /H /I >> endobj 2537 0 obj << /Type /Annot /Subtype /Link /Rect [ 280.424 475.381 306.534 484.381 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2485 0 R /H /I >> endobj 2538 0 obj << /Type /Annot /Subtype /Link /Rect [ 336.718 475.381 367.818 484.381 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2446 0 R /H /I >> endobj 2539 0 obj << /Type /Annot /Subtype /Link /Rect [ 374.34 429.229 400.45 438.229 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2485 0 R /H /I >> endobj 2540 0 obj << /Type /Annot /Subtype /Link /Rect [ 332.806 360.925 358.916 369.925 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2485 0 R /H /I >> endobj 2541 0 obj << /Type /Annot /Subtype /Link /Rect [ 365.142 218.845 391.252 227.845 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2485 0 R /H /I >> endobj 2542 0 obj << /Type /Annot /Subtype /Link /Rect [ 165.82 95.773 194.71 104.653 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2418 0 R /H /I >> endobj 2543 0 obj << /Type /Annot /Subtype /Link /Rect [ 213.87 95.773 244.98 104.653 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2446 0 R /H /I >> endobj 2544 0 obj << /Type /Annot /Subtype /Link /Rect [ 264.14 95.773 290.81 104.653 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2485 0 R /H /I >> endobj 2545 0 obj << /Length 2546 0 R /Filter /FlateDecode >> stream xœÍËrã¸ñ®¯À!‡™*ÀXµ•îgR“C6³£TR5ö! µ©%Èñè’oOãÅ7e{sû nýD£äŠüßêRÌyŠö§Ín¢„¡ vKÁ!‹  1‹Ð —"ThšÀ<?£½€Ñ¿7冠¿m¾>ž {Þæ†Õ—ÍçnnÀ?’~=m~Þnî>Fˆ´=ô.f1ø—¦ð— ަ¡”¡í }}·­ªB¡CU£Ü²zª³óQ õþmÿ¾ù°‚ùf÷瑊7I’`2'Ã&°k°b9êG#E¦¨•2Z±ØßU•ÉLc2TxJ?ŒrëQ'8¡EIšÂ#ÌGaÄr-b~óæÁ´^†)a°X;ó!ÆÌ8!„޼`â(qÆ[Ûÿ‘„5^;oÁs!G,Å$Ž4 ·Du[Â…»=I¥dù„,}GA)ÅDoO¢xNûÀX2%`×P.Õ¹È. Õâ jQî…BeÕÀ½oËí.ȪóðŽ>¼÷¦ ¥$ĔİÓ7;uNüZ¯Î)o¯së‚ÌWúuNé‹Á`üýT¬;8ä×ø<^QE°6“ ޝ© ó¡‹GU™Ep£¼ý¨fį>ªåí•“ ®>¾1SPðä&Ëá^¨}-Ϭʗ(MRÌR`Òhè®ILàD(È&1] 1ù ½‡!zwÊ.¬Å¹ª5Ǭƒe=gʃm™í Ñm¯û[iÖ÷Ë’chñ¡zð„,82t¾+ó)M œ€& èÍX´©Î}µ°%£óZÝ!ãwëÿêÛƒá©ÐŒ„6ú ííCÒä3¤äé\ȬÚúZì«\ŸÎWç:ðªÝgÊ2~e®  59¤:Òõëí$«ùþ—²Õœb¹Ù[O[à™ ·jQdü&èC ÅN§ G;atÍÕ³§e¦‰ÿ¢OØÇA¸ k1ZÛ`@¥ŒÑ3¯>‚¶„0ÃdêŽàø¢K6¡¹÷câQg#­ÊžL8QÞh¯”H|—ZÒk~vZ±îR LDWzäu-COØ‚ÃMSáÏÏá¦Ï29M›Cõ;jz6&¯[2›ay7sêC·Ð,]Ìíð½¤îr¦â1Ni”òˆÒ{ö^ޯà ÊûìjµÌÊÎNy ÖåY“yX–M5O!å éVS–ªY®/„:‹½<\tMÕ¬Ÿ #ÎàÆÔp˜¨ßÚ!…a‚ƒ”§<æî%Ò/UyOm½f  ÃIH(ÜšÅW*yå^rèò“•´²7¨·ê ·‡\Ó(ˆ­Ðß3R_Ò6bМ&!\î0´„íL'ƒÚo‘Bd¦÷uhvªÚr€ÛvÈÑ]Î`êM¿`Ã!êXµEÞã:»DÚ6Àm5 ¿ÇuuZQ/—P8šª¾ôKÏGÛø÷J lóMÚ¼''NœbÅŽ5ÄØ^‹¦@ªÈñ`e«Rv3‘Á0[TÏ® tkºâ¹®Ë­¸ÑÇ£¹Ôp•ç§{u3@åa¨ly>«FÏFB~‡ûŸ‡ZÉ& #…|â#?}ÝÂtÛ\±£›…í«=ٹрΠëÔ°³œ[hkç°ÙÞS¥zî¢ìÑY3`ê+ËÜ‚åjHSÄà>C5§éFwgÎ7=kë{ì— ?kÑ(üàújP¶VKi¤ÓùH¶¥z±XQ²DŒ¯½Š k$@탟ÛÌßÄ7<\Øùß¿L·Ø$WB¦S-€÷œh’JowÈúàš-1à\ôl E!HÊiè*ÑÙ»PÕÐõñ’xèfô›¥ÄUsÇV»Ð$ı7¥Dï’‡÷7ÏfÒ ºíç´8›é@^y©ÌNˆ&&s‘‰ò+’©þTqDÙ²h?˜,‰†ýúëM%ÁŸ 3 Õn,X=¸ÑK/\¡¿àÄ}X–ŒWë³…&xšD|pºRy›À@¿y+ ÀŸ/:I¬:.§;·h'úço>~úÏ:BÙ¹ƒ¼qg> endobj 2546 0 obj 2084 endobj 2548 0 obj << /Type /Annot /Subtype /Link /Rect [ 215.07 759.389 402.55 768.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1273 0 R /H /I >> endobj 2550 0 obj << /Type /Annot /Subtype /Link /Rect [ 203.13 737.389 315.33 746.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1275 0 R /H /I >> endobj 2551 0 obj << /Length 2552 0 R /Filter /FlateDecode >> stream xœÍTMs›0½ëWì19D^I€¤N&Ófú5éÁ)3=$9`[&ÀãößwepcŒí³á iÙ}zoyÒ€ôÞøÁ‚ca^°·>.@KPQ ‘2DT .C(` aåkö&r7£aKë ~³’!|cÏ”³¤º Ãà[¨_lºÇ­O ù%ñCHÙ}Ì&_Cñò½Å2¢þ KÕô3+!.àñ*®ªU˪†Y>[åUZ'¯Yîšëgˆ°/ñ@¸BäæÒtOÉ7Zkއ~Ú¨.F‘Ñ9\v» "‚n> endobj 2552 0 obj 520 endobj 2554 0 obj << /Type /Annot /Subtype /Link /Rect [ 203.13 759.389 315.33 768.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1275 0 R /H /I >> endobj 2556 0 obj << /Length 2557 0 R /Filter /FlateDecode >> stream xœÍTÁn£0½û+æØ=¬3¶›UUíV»mU©‡t‘öPõ‰l´@õï;Æé6„fσíaæù½Ñ^˜¤÷«[L ¸11,*ö²‹ ÐT´ …È"*—!T0…°v5{ù¾£e”Kçþ°š!\³‡GÊYRÝ–áðê7›ïqÛ%Ðþ”ø!äì2a³«B²úh±Œ¨¿"¦GƒáJº],!©àá,išu«¦…¬ÌÖe“·ésQÚîË#$·ìW2®¹95ÝóEò֚㡟åcñˆîÓˆÈáÑß2Šx~=J'ŒqŸðÔJ'C"͵ é8¦OÜŒl$Uð?ÇœŒ¼©Y¤ãõOut¨:0“‘¹·«Ÿ—ÐÔж6¯ü“– )ylÜÜ™hç¾î#[ .¨a˜é¥Eß?›ÍZ»Zf¼k6íÂÒÐæ–×¶ŸÉ@q倄Q  Ÿ<´%´9Q§‘Ò\W3R€ôæÚ8°8ô?6}Ñ´ï(ùgº©i‘àEŽBìËæÓ%µ,í`Û–}okÈ^á.mŸ6Ü4¶.O)œWCà{Uì"|i/øž»æì ^ÅU{ endstream endobj 2555 0 obj [ 2554 0 R ] endobj 2553 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 2555 0 R /Contents 2556 0 R >> endobj 2557 0 obj 450 endobj 2559 0 obj << /URI (http://xmlgraphics.apache.org/fop/) /S /URI >> endobj 2560 0 obj << /Type /Annot /Subtype /Link /Rect [ 377.285 533.705 395.625 542.705 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2559 0 R /H /I >> endobj 2562 0 obj << /Type /Annot /Subtype /Link /Rect [ 401.066 533.705 523.276 542.705 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2559 0 R /H /I >> endobj 2563 0 obj << /Type /Annot /Subtype /Link /Rect [ 138.0 521.705 154.11 530.705 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2559 0 R /H /I >> endobj 2564 0 obj << /Length 2565 0 R /Filter /FlateDecode >> stream xœí]oܸñÝ¿‚}p€,MQ¤>úÖ\’6‡Ë%Wm€Øä]®W8­´'iûßwø!‰)í^Š šäÁœYÎ 9œ/ŽøÇE€ü_É? p’¤h½¿øÃàSFÅ f”¢€aÊÑQ’ÆÐnFsÞ¡_”ýýâãÌÙ t_.È sÅêúâ7kmfŒ¿§õôpñâæâê5GA7ÛAÅ4ý)ü‹Q‚C*G)E7{ôñò¦ªŠm«Ýç÷E^=ÔÙa—‹æÙºùùâÕÍhã!!8ùÞöýÛh‰`7qc2µ'Å&Ô8ÀhŽò§ÑB¦ –2Âè迳K&Ί‰½`×”¾›ÅÍ[Qã8+ŠÓ~ÂÉÈŒhÈ—,æ»Ùžk,T®K1%µÙ>ØXŒiB FZPv›Íë½ÿší…Þ¼TžGs,A4Å$â’&ÑDµØnî÷Ò”ýÜ$ÆARÃ(r‰n)'óÓ¥ù¨­³²çÞ£oA›j}Ü‹²mк*Û,/óòýSl_¾ð:ÿH)Ká1æA xù‹”{ýTV‡&ol­¤­$æ\.žð±V4¡G•iä¡gh8@—;:GX@(Í$Ìå°ZÏ à¸ç Ñ w8D8å¨|;ÞV‡OpÛüáÓ6/Äì:(‘\Àý8¸“ÃåîPX£à‘,ð°XmçeÓdðP˜@Ã0MCútðéPWkÑ4U=»ˆ„À‚’ÄéW* (Ž K“ˆÇìæeS¶@8ˆ>o!œd~®êYÅa~,Y <çB`ß$¨ç›¢]>ò&g©€1Ži>\<*˜„8p›4œÌif—Ç™;Í«„G6\öíS!šíB`ðRÞ¡… D9Žº`íP®d…ñáÂî r éÁ!”‰![G ÄwKbáLÁBá,õˆíãÜÙ& `¸¢pÊ “—¢Y×ù¡Í«òTî ÀÚbYÿÆ‘“|a £˜¡Ëc# lw‚s°›:ÿ,j !÷5b‘ÙÓŸª£­k‘µbca¾äíÎëc 9ùö2¸}fa³Ò&Ù ±±ÛòÚjDg®¹q],€,>ÖR €6V­xša_YtØà0óeµ~QU¿÷°ÅäæÕ›~,«’nÜU'>iU)†ñv˜±ÐÍñp¨j­S3ñØŽ;mí îo¶-D©£…j¥{u´”@;ðÕ`ÞôÃZüq ¬áyÒK43ËVÔ{±Éáè{äëwsŒ¿äEÑ÷ÅöX׺‡Í9©›ÉOý0ó êOÿY?„r3M bSê½S.ØUz8Rs빂RŠ %C"=UzEÄ3!êD²Ká­°f¢…,¢C6ap£Ž0„ä šË”—j@¨fýh}lÚj?€Jò±Î¤šz¬ PÎaXZ²Ô±–+jÌÄt!¸Â‰qsp¶ðúÝû) q×"wn/â£C"ï šõÐíÚöð׫+«ú±npvÈÖ;«úájÂK®’EîIMç%P¶`ˆ$ <wÓÙ3øPÆ<³ñ¹F*oºÄ€'kci¤Îü“FêP¸%ð‚…Æé„Z[(T·º,á6Ú*VêakÍQ–¥‡¶eiÌQGCU C+â;l¤A7=®²$ Ô¬JÅ9ÜÃ×VèÖ˜ÏYq쮡£­§ÁdëY-zmGSe%Êvy&‰‡Ìmþžb–ȆYâŠn/7b›‹ööÙóyñTÊLöÝ’ öp9dM%D+K0yu$Œú8,É–eõ<壘ß{rJ­…©W¦*BæäRHò¢—F!óÉÝ.Ü,à†þ+iSî¡=×Ã*N4Ò¸K2»S>Bi>¦y/ͶAZWû½Ürcšâ¸t&¨?…(•6ÄcÞž›C¹•ÊG]tÉ—¢‹;ÿTtq)>gu.=ð¤x:¡|)¶¹ª½‚D'9ù·cg@SèÊ¡ª…ä@Ú¶öç¤ "0ø9Ûˆ«wQÊ6È·àFù¡ç`‹Žroͱo¡ÙÍ®¶Vå­Ýw³esÃG…ßx°4ÈЛ\fç¬(žP^®‹ãF ˆâQY †¡Tžz_¥fëuUod x|t·C½^`eh϶W6ààBF'›Ò"œù'-¡ðÝõçí‚Au1¦ïµ)TîBÖµ`'Êd5†ûF?¥3ÓX,¦Æhäð~à%Ï÷uÓˆõ±®ápЧó{Y}ñ2ÝããÙ€Æ(ɬ¬ddpñ!+²r¾WÂÇL…R—öù¬P©s¤Q7³rbÙ0‰Æ%\HP_-^gÕüæÅ™Oêb¢d5Ùõ\ji ÒXæ¥Gà˱Ip.ý¹ÎÇ Öy(3½ñ½ùÖøž3ý”ë9ÓÖÒ‚×q2&5N·"ª'! ±nØt,ˆÛ¯ ãnéz¸‡FŒ»6†,üƒ(EÝ5-F]3õPy¢Õ¯PÈÛK{få°Úc]ú„¬!û"7eŽt²­ •Æf>k@ÖÞt!ék+u^j~8Û<&oÆp‘ºØ<ß0“öáÌ?i …Ý–[°Ž4šÐ]+‹E ÓHÐŒê,µòˆ+uYÇè½É¥H×Ùh±ˆI¢kaBCÔ]»/no·õsT·óפl9o Bæcr"V„1\å7rõa³ Ô›ÈoS,ò‘úìÀM â2Kxú—s§ÃCÒÏ—·3y+S5„ìdAöÛW rÙýR'Œ^ÁEy¨-Tç²ÞÐÙiT!à|ÅÓŸmÙpÇÇIš$]eû“Ý’8Õ<å!˜lˆ±(Ôäoʦ™îC¦Ò‚õ-³Žtµî:©2ÅôªÐUe‡nÀF×;Ñ<·p£&­¡6}L eESYàýXŽÞ£°×©ã•ö®³s›€E»½Až²‰*º%Ök¤¿zÄnÃÇ û€«Á¿5øëüj(SM?(gñÖªÓ°i5k`Ÿ=Ù@®"¤%n>Õ}VØÒO®"M´ Ù/br"ø’?ž‚%ÒX±ÍÕ±©¯Š 2À•h×WjëW‹æ€o/0T1Eú›Ü:@öƒê±Fýr}ŸH¸½ÊŽAÌ#Ç¿üãÝÛWó¡&X$Æa µÏÔÍ"PywC]"ŽFƒ‰õï+†÷ \™ˆQqæ±ÔŠJ”y±’ƬÞU„@ãá™…šg ?µŸY¬èò; ÍÚ<µpØ™÷RühfABKV_Ô›3§ÉBX×72¸ÖvÚÚ~‚Šjf¯µ™üÈSz­í»ˆQa2=$óõ!Êð²N¡L*2?Ù|!™¹çŸ§%Ûÿ¤”¸Ießgú)l.)ý8×™sýŸßзóGÿïôÜ&Lnÿçg«?3¯R*O±ûÐÜúþl€v4ÓóàH>í˜p·? ¬¢0–”æ[tê7MÐ}vX‡ Ë7*$HÌÕK?3Z±4±5Ns6€liYà( Éÿÿ>³ endstream endobj 2561 0 obj [ 2560 0 R 2562 0 R 2563 0 R ] endobj 2558 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 2561 0 R /Contents 2564 0 R >> endobj 2565 0 obj 2798 endobj 2567 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 730.013 223.613 739.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 594 0 R /H /I >> endobj 2569 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.127 730.013 525.127 739.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 594 0 R /H /I >> endobj 2570 0 obj << /Type /Action /S /GoTo /D [1258 0 R /XYZ 72.0 572.353 null] >> endobj 2571 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 718.013 233.502 727.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2570 0 R /H /I >> endobj 2572 0 obj << /Type /Annot /Subtype /Link /Rect [ 515.061 718.013 525.061 727.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2570 0 R /H /I >> endobj 2573 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 706.013 263.179 715.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1135 0 R /H /I >> endobj 2574 0 obj << /Type /Annot /Subtype /Link /Rect [ 514.859 706.013 524.859 715.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1135 0 R /H /I >> endobj 2575 0 obj << /Type /Action /S /GoTo /D [1176 0 R /XYZ 72.0 531.657 null] >> endobj 2576 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 694.013 193.694 703.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2575 0 R /H /I >> endobj 2577 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.297 694.013 525.297 703.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2575 0 R /H /I >> endobj 2578 0 obj << /Type /Action /S /GoTo /D [1176 0 R /XYZ 72.0 156.003 null] >> endobj 2579 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 682.013 287.856 691.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2578 0 R /H /I >> endobj 2580 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.656 682.013 524.656 691.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2578 0 R /H /I >> endobj 2581 0 obj << /Type /Action /S /GoTo /D [1285 0 R /XYZ 72.0 749.153 null] >> endobj 2582 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 670.013 177.437 679.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2581 0 R /H /I >> endobj 2583 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.407 670.013 525.407 679.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2581 0 R /H /I >> endobj 2584 0 obj << /Type /Action /S /GoTo /D [1297 0 R /XYZ 72.0 468.377 null] >> endobj 2585 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 658.013 184.633 667.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2584 0 R /H /I >> endobj 2586 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.359 658.013 525.359 667.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2584 0 R /H /I >> endobj 2587 0 obj << /Type /Action /S /GoTo /D [1358 0 R /XYZ 72.0 414.145 null] >> endobj 2588 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 646.013 212.298 655.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2587 0 R /H /I >> endobj 2589 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.169 646.013 525.169 655.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2587 0 R /H /I >> endobj 2590 0 obj << /Type /Action /S /GoTo /D [1382 0 R /XYZ 72.0 769.889 null] >> endobj 2591 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 634.013 176.879 643.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2590 0 R /H /I >> endobj 2592 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.411 634.013 525.411 643.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2590 0 R /H /I >> endobj 2593 0 obj << /Type /Action /S /GoTo /D [1767 0 R /XYZ 72.0 586.249 null] >> endobj 2594 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 622.013 176.879 631.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2593 0 R /H /I >> endobj 2595 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.411 622.013 525.411 631.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2593 0 R /H /I >> endobj 2596 0 obj << /Type /Action /S /GoTo /D [1872 0 R /XYZ 72.0 729.872 null] >> endobj 2597 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 610.013 179.111 619.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2596 0 R /H /I >> endobj 2598 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.395 610.013 525.395 619.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2596 0 R /H /I >> endobj 2599 0 obj << /Type /Action /S /GoTo /D [1884 0 R /XYZ 72.0 769.889 null] >> endobj 2600 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 598.013 176.341 607.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2599 0 R /H /I >> endobj 2601 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.415 598.013 525.415 607.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2599 0 R /H /I >> endobj 2602 0 obj << /Type /Action /S /GoTo /D [1947 0 R /XYZ 72.0 697.627 null] >> endobj 2603 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 586.013 175.783 595.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2602 0 R /H /I >> endobj 2604 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.419 586.013 525.419 595.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2602 0 R /H /I >> endobj 2605 0 obj << /Type /Action /S /GoTo /D [1911 0 R /XYZ 72.0 489.533 null] >> endobj 2606 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 574.013 186.297 583.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2605 0 R /H /I >> endobj 2607 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.347 574.013 525.347 583.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2605 0 R /H /I >> endobj 2608 0 obj << /Type /Action /S /GoTo /D [1966 0 R /XYZ 72.0 548.609 null] >> endobj 2609 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 562.013 183.536 571.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2608 0 R /H /I >> endobj 2610 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.365 562.013 525.365 571.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2608 0 R /H /I >> endobj 2611 0 obj << /Type /Action /S /GoTo /D [2425 0 R /XYZ 72.0 402.899 null] >> endobj 2612 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 550.013 180.208 559.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2611 0 R /H /I >> endobj 2613 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.389 550.013 525.389 559.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2611 0 R /H /I >> endobj 2614 0 obj << /Type /Action /S /GoTo /D [2517 0 R /XYZ 72.0 326.105 null] >> endobj 2615 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 538.013 189.057 547.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2614 0 R /H /I >> endobj 2616 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.327 538.013 525.327 547.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2614 0 R /H /I >> endobj 2618 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 526.013 189.057 535.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2617 0 R /H /I >> endobj 2619 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.327 526.013 525.327 535.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2617 0 R /H /I >> endobj 2620 0 obj << /Type /Action /S /GoTo /D [2558 0 R /XYZ 72.0 159.737 null] >> endobj 2621 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 514.013 187.961 523.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2620 0 R /H /I >> endobj 2622 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.335 514.013 525.335 523.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2620 0 R /H /I >> endobj 2623 0 obj << /Length 2624 0 R /Filter /FlateDecode >> stream xœÍÝMs×y†á=–ÌÂH÷9ïùx·N%©JyWT•E* Š„l¦$ʦ˜Äù÷é@"†Ó2çÚÙ^ˆ‚î¼`júñtÏŸ_íwÛñß߬¿ÌØïçÌ»·?¼úóóÇ÷»QîjþPÛm«w{Ü—v÷ÃÝå‡ÚÝ÷똿(?ÿêøËE{üýïþýÕ‡WÛÝ?¿úÿ<šwwÛqÜÿ¾Ú~åÁêß^ýþÅ×ö¿þ[úú^~…uÛîçßÞøûKà1Æýö%üãÃÔ§yzÄõ.¾/ÿöé³\|äé;xúë¯~ÉÛÕW¼ÿŽþlþ7óÅmwxõÛo^ýý?_Óv÷ÍwŸÿ5öûZöÌÙr?K®ÿ”»o~¸û×ïÿòwÿy÷Í¿¼úÇoÎ~^þf¾¹ë•²¾®_¾çãkÜ—¹mÛ~ñ­Ç\ßÃxþžŸ¾åß½ÿéÓÝßÝ}óæÛï~zúöO~׎Cë¸[?³Ì§CÛý~÷ww¿Ér?î^ÿîÇ?|þ›ïþçáûÏûîá»÷Þzÿã‡çÏðËãîm¿ïûñÜ[^†ÏpuX»ßêñMÔrrØýU=¥î;ÕAõzlTWª;Õ)õ,T“å$Ë$Ë$Ë˲‰eÙIJlbY6±,»X–],Ë.–¥ˆe)bY YV²¬dYɲ’eeee#ËF–í°Œã_~³Å uߨ®TwªSêQ¨nTO©çNuPM–I–I–I–)–u˺‰eÝIJîbYw±¬»XÖ"–µˆe-byü¡#u%ËJ–•,ƒ,ƒ,ƒ,Y6²ldÙȲ“e'ËN–ƒ,Y²œd9Ér’å$Ë$Ë$ËËØÄ26±ŒM,cËØÅ2v±Œ],£ˆe±ŒB–•,+YÏíÇÚpŽ˜F"êý^ƶ'›Íöe>ï"¿ˆòyØ9þw¯ÿío>¾ÿð‡ÏxøË§‡ïÞ}þȇ?=\-;}¿oÛÚòú3|>ôdN™Ù2ûvrØÙœõب®TwªSêY¨nTO©s§š,S,ל"µX®9Ej±\sŠÔb¹æ¨‹X®9Ej²¬dYɲ’e%Ë Ë Ë ËF–,Yv²ìdÙɲ“å ËA–ƒ,'YN²œd™d™d™d™b¹æ©ÅrÍ)Pïb¹æ©ÅrÍ)R‹åšS¤&ËJ–•,+YYYY6²ldÙȲ‘e'ËN–,Y²d9Ér’å$ËI–I–I–)–kN‘Z,לõ.–kN‘Z,לuË5§HM–•,+YÏí{ï™e—AbÍ)[ß·-z\6çõœÒ÷/¢ãÇâiO9ÎúëÝëß¾ÿöû÷?þáã›?ýñýÛÏþøðÝÃLJo>èÓÿýézV9NÁ÷‘#Òõ§ú|ìɹxŒò8']vv.~{½ÎÅ¥®TwªSêã\\êFõ”ú8—Z,×¹8Ô•,+YV²¬ddddÙȲ‘e[–{Θý†ºoTWª;Õ)õ(T7ª§Ôs§:¨&Ë$Ë$Ë$ËËu..µX®sq¨w±\çâR‹å:—Z,×¹¸ÔdYɲ’e%Ë Ë Ë ËF–,Y6²ìdÙɲ“å ËA–ƒ,'YN²œd9É2É2É2År‹K-–ë\ê],×¹¸Ôb¹ÎÅ¡.b¹ÎÅ¥&ËJ–•,çö­E¶“g½¿zëÿpkǹïy}XŽësñQ¿<ߟÏÅ÷ãGµÜ½þ‡?|zøË§ùéáÓÕ9÷qzÖs½p£ÄõC¾8öê¸v_~n¯Ž»:é>xÊÖ2?mo¨©ƒê!ulTWª;Õ)u+T7ªÉ²“e'ËN–ƒ,Y²d9Ér’å$Ë$Ë$ËË5ËI-–k–“Z,×,'µX®Yê"–k–“š,+YV²¬dYÉ2È2È2Ȳ‘e#ËF–,;Yv²ìd9Èrå ËI–“,'Y&Y&Y&Y¦X®YNj±\³Ô»X®YNj±\³œÔb¹f9©É²’e%ËJ–A–A–A–,Y6²ldÙɲ“e'ËA–ƒ,YN²œd9Ér’e’e’eŠåšå¤Ë5ËA½‹åšå¤Ë5ËA]Ä2ŠXí>A»ÏšåÆ\÷é]–«XîgÏÛ8ÑN®":Ω¯¦¶ò8µ­g™w¯ÿõáãÛ‡Ÿ~óðáí'zú'?ýéáíû7ßþÀÛ?¾ùøæí§‡_q×C´ã“ϯ?áç¸:l]]6·-öv}Øõ™Y¡ºQ=¥~¼ºìö:¨RÇFu¥ºSM–,Y6²ìdÙɲ“å ËA–ƒ,YN²œd9É2É2É2ÅrÝ™Lj±¬›XÖM,ë.–u˺‹e-bY‹XÖB–•,+YV²¬ddddÙȲ‘e#ËN–,;Yv²d9Èrå$ËI–“,“,“,“,S,cËØÄ26±Œ],cËØÅ2ŠXFË(b…,×Ë+úqÖŸ¥Ã‰OOòû:_jóä°ÓÓ¸üòŽÇ¿©~ÅD_·›øøðÝ»oß}|ûÅ¡ûzéæñ‡Möè×òâø«ãŽß‡us·qò¹¿ümØ×Ó†Ûã&ñ„x=g¸=‰Äë Ãíq•¸K,‚!‚!‚!‚M›6ì"ØE°‹`Á!‚C‡Nœ"8E0E0E0E0A°l X6,–Ë‚eÁR@°,KÁ*‚U«†††6l"ØD°‰`Á.‚]‡"8EpŠàÁ)‚)‚)‚ ‚uÁº`Ý@°î Xw¬;ÖkÁZ@°¬"XE°Š`ˆ`ˆ`ˆ`ˆ`Á&‚M»vì"8DpˆàÁ!‚S§NLLLŒ cÁØ@0d“ ÙdB6™M&d“ ÙdB6™Mæñ&ë} z ÙÌÖ«3bGš'ÇíådÖ[3ÛÕ®Wžw½x¾ÿÈ»oúøß×ËÞQöZïªÔ“ÇyñWöû}ízc¨«ã®¸”úøw·ÔêyÔ-3æ¸%¯»åaù üø·8åÕònyRÞŠåÍrSí¦ÚMµ›ê0ÕaªÃT‡©NS¦:M5M5M5Iu] E9©®K´('Õu‘夺.Ó’¼êºP‹rS­¦ZMµšj5Õ0Õ0Õ0ÕfªÍT›©vSí¦ÚMµ›ê0ÕaªÃT§©NS¦š¦š¦š¦š¤º.ᢜT×E\’鷺.㢜T×…\”“꺔‹rS­¦ZMµšj˜j˜j˜j3ÕfªÍT›©vSí¦ÚMu˜ê0ÕaªÓT§©NS¦š¦š¦š¤º®ñ¢œT×U^’鷺®ó¢œTc'Õ(¤…Tö¥°méqPÜûÓ}•dª[‹býùÎJg[aœLŠåêFÇå¾>½#øñe^‹ëÆAùüÈëGûü@'£Õˆµæ•“ÃÎ6+©SêV¨nTO©×í° ª‡Ôc£š,Y²œd9Ér’e’e’eŠåZ¨¤˵OI-–k’Z,×6u˵LIM–•,+YV²¬ddddÙȲ‘e#ËN–,;Yv²d9Èrå$ËI–“,“,“,“,S,×þ$µX®õ ê],×ö$µX®åIj±\»“ÔdYɲ’e%Ë Ë Ë ËF–,Y6²ìdÙɲ“å ËA–ƒ,'YN²œd9É2É2É2ÅrÍKR‹å— ÞÅrMKR‹å– .b¹f%©ÉrݨìÛ6«Ì.k#Ú{n[¯gsÍñ‹“hFü|·¢§¬¾¸œ4ŸG¢7'—“_˜¯£»~Ç_7ï#FæÜÚÉW§ÃëMA$Ëåë}A$¯–wË“òõÞ ’7ËM5L5L5Lµ™j3ÕfªÍT»©vSí¦:Lu˜ê0ÕiªÓT§©NSMSMSMR-©–TËFªe'Õ²“jÙIuݵNòBªë¾u”›j5ÕjªÕTÃTÃTÃTÃT›©6Sm¦ÚMµ›j7ÕaªÃT‡©S¦:Mušjšjšj’꺡夺niG9©®›ÚQNªë¶v’R]7¶£ÜT«©VS­¦ZM5L5L5Lµ™j3ÕfªÝT»©vSí¦:Lu˜ê0ÕiªÓT§©¦©¦©¦©&©®[ÞQNªaÛRض¶-…mKaÛRض¶-…mK¯j;¾ý´þõ-ðñ2Ù}?ŽqºDž½¨m½~à2‹“Áòí_,¯äÖÁòêÀ¿>XÞ‡åƒò‹ªòjy·<)¿,oț妦¦¦ÚLµ™j3ÕfªÝT»©vS¦:Lu˜ê4ÕiªÓT§©¦©¦©&©^–7ä¤z9X~=ßIõr°¼!'ÕËÁòëy!ÕËÁò†ÜT«©VS­¦¦¦¦¦ÚLµ™j3ÕnªÝT»©S¦:Lu˜ê4ÕiªÓTÓTÓT“T/ËrR½,oÈIõr°¼!'ÕËÁòëy!ÕËÁò†ÜT«©VS­¦ZM5L5L5Lµ™j3ÕfªÝT»©vSí¦:Lu˜ê0ÕiªÓT§©¦©¦©¦©&©^–7䤶-…mKaÛRض¶-…mKaÛRضt1XÂx9X^/‘íì–ë¡/ËòË`¹ß½þöý·åãûŸNËq¿ŸíøO?y˜pµn÷}ìOoy}àõ¨X-ï–'åÇI'åÍòIùqÒIyX>(S S S Sm¦ÚLµ™j7ÕnªÝT‡©S¦:Lušê4ÕiªiªiªIªëºlÊIu]™M9©®k³)'Õuu¶ä…T×õÙ”›j5ÕjªÕT«©†©†©†©6Sm¦ÚLµ›j7ÕnªÝT‡©S¦:Mušê4Õ4Õ4Õ4Õ$Õuå6夺®Ý–|'Õuõ6夺®ß¦œT×Ü”›j5ÕjªÕTÃTÃTÃT›©6Sm¦ÚLµ›j7ÕnªÃT‡©S¦:Mušê4Õ4Õ4Õ$Õui7夺.î–ܶ¥°m)l[ ۖ¶¥°m)l[ Û–žÞŠäøQˆ™4>Þ90#gnûÙ9ûÉf¹nôåfYŸ7˱>É»_›,îøÙj”“Gyñ'[gîe½H?9ðzTÜ,¯–wË“òã§òfù¤üø)¤<,7Õ0Õ0Õ0Õ0ÕfªÍT›©vSí¦ÚMu˜ê0ÕaªÃT§©NS¦š¦š¦š¤ºNÊIu-œ”“êZ8)'ÕµpJ^Hu-œ”›j5ÕjªÕT«©†©†©†©6Sm¦Ú–êžsÔ[ê¾Q]©îT§Ô£PݨžRÏê š,“,“,“,S,פ)µX®Aê],ל)µX®1Sj±\S¦ÔdYɲ’e%Ë Ë Ë ËF–,Y6²ìdÙɲ“å ËA–ƒ,'YN²œd9É2É2É2År-–R‹elb»XÆ.–±‹eìbE,£ˆe²||­dÍŒ=hÒ{z±dÛ¶ÙÎÜóì]×]¿¿ã—á±Þ½~øð+Ãc½óxN2özò(/àdx<þ€=žyÏýäÀ³á‘òjy·<)?~¦(o–OÊënyXnªaªaªaªaªÍT›©6Sí¦ÚMµ›ê0ÕaªÃT‡©NS¦:M5M5M5Iu ”“ê)'Õ5.œýéív`:|8~¿ëå2ëÉÀ™Ww¹Œûö¾=Ÿ8×uãÙŸ_0zõ8/âêÀq?kÍÌ^O¼ò6Ë«åÝò¤üx"@y³|R~< <,7ÕfªÍT›©6Sí¦ÚMµ›ê0ÕaªÃT§©NS¦:M5M5M5IuÝ4’rR]7”|'ÕuÓHÊIuÝ4RòBªë¦‘”›j5ÕjªÕTÃTÃTÃTÃT›©6Smóŵ-_ÏûnyX>(›åÕònyR>‹åÍrSMSMSMR]7¤œT×M#)'ÕuÓHÊIuÝ4RòBªë¦‘”›j5ÕjªÕT«©†©†©†©6Sm¦ÚLµ›j7ÕnªÝT‡©S¦:Mušê4Õ4Õ4Õ4Õ$ÕuÓHÊIuÝ4RòT×M#)'Õ(¤…T£jS]gÛñœv¬kt`{¼;zΘgîyrvÙNÞæ¦?ï„ǯî^ÿððîWfÂý¾&nußOæÅ#\Øî·Y¶mõäÀ«ì㉀äÇÊÃòAùñD€òjy·<)?žPnªaªÍT›©6Sí¦ÚMµ›j7ÕaªÃT‡©NS¦:M5M5M5M5Iµl¤º ÊIµì¤ZvR-;©–Bª¥j)¤ZŠ©VS­¦ZM5L5L5Lµ™j3ÕfªÍT»©vSí¦:Lu˜ê0ÕiªÓT§©NSMSMSMR­©ÖTëFªu'Õº“jÝIµî¤Z ©ÖBªµ˜j5ÕjªÕTÃTÃTÃTÃT›©6Sm¦ÚMµ›j7ÕaªÃT‡©S¦:Mušjšjšj’jl¤©ÆFª±‘j줶-…mKaÛRض¶-…mK«âzáV‚æºÇU±GæVÎ>Ïq¦z²*îW·l¿¼yv»ŸÏožýþÛ“ë«çýq¾y|™ûÙüx„“9rô£3N¼^ÃòAùqÖIyµ¼[žGÞ·­Ç¸%?Î:)o–OÊc·<,”·Íòjy·ÜT»©vSí¦:Lu˜ê0ÕiªÓT§©NSMSMSMR]/m¤œT×K%ßIu½´‘rR]/m”¼êzi#å¦ZMµšj5Õ0Õ0Õ0Õ0ÕfªÍTÛ|zN°—ý–¼ï–‡åƒò±Y^-ï–'å³XÞ,7Õ4Õ4Õ$ÕõÒFÊIu½´‘rR]/m¤œT×K%/¤º^ÚH¹©VS­¦ZMµšj˜j˜j˜j3ÕfªÍT»©vSí¦ÚMu˜ê0ÕaªÓT§©NSMSMSMSMR]/m¤œT×K%ßI5vRT£jRBªQLõñ§í©uïq„œ¹m£=>N°NFÈru+ÈöËb—õúÉÇò¿Þ¼{8yqã¸ßZÏ̲Ÿ<ЋÇ8YþÚ|¾"éúÀ³åònyR^‹åÍòIyì–‡åƒòfªÍT›©6Sí¦ÚMµ›ê0ÕaªÃT§©NS¦:M5M5M5Iu-”“êZþ$ßIu-”“êZþ$/¤º–?ÊMµšj5ÕjªaªaªaªaªÍT›©¶¥ú|uÉ yß-Ëåc³¼ZÞ-OÊg±¼YnªiªiªIªkù£œT×òG9©®årR]ËŸä…T×òG¹©VS­¦ZMµšj˜j˜j˜j3ÕfªÍT»©vSí¦ÚMu˜ê0ÕaªÓT§©NSMSMSMSMR]Ë夺–?ÉwR]Ë夅T£jRbªëuÇSÚ9ÆYþëƒÚãòWzf›íäÀRÆÉòW÷Hl¿¼­4-Wtëòwuà__þnÈ»åIùÅòwCÞ,Ÿ”_,7äaù ¼™j3ÕfªÍT»©vSí¦:Lu˜ê0ÕiªÓT§©NSMSMSMR½\þnÈIõrùûz¾“êåòwCNª—Ëß×óBª—Ëß ¹©VS­¦ZM5L5L5L5Lµ™j3Õ‹åïëùÅòwC–Ê/–¿òjy·<)¿Xþnț妚¦š¦š¤z¹üÝ“êåòwCNª—Ëß 9©^._Ï ©^.7ä¦ZMµšj5ÕjªaªaªaªÍT›©6Sí¦ÚMµ›j7ÕaªÃT‡©NS¦:M5M5M5M5Iõrù»!'ÕËåïëùNª—Ëß 9©^.7ä¤z¹üÝ›êÅòƒÚåòwu`©'o{²îôsµüÅ/o{²?/ùáû“á¯Ýgߎ/´ÅÉã¼xˆ«ó>r?ž´qràõ4W,o–Ï#/Û5oÉ3=ÊÃòAùq¦Gyµ¼[ž”·by³ÜT»©vSí¦:Lu˜ê0ÕaªÓT§©NSMSMSMR=BËIu½;2夺Þ™rR]ïŽ,y!ÕõîÈ”›j5ÕjªÕT«©†©†©†©6Sm¦ÚLµ›j7ÕnªÝT‡©S¦:Mušê4Õ4Õ4Õ4Õ$ÕõîÈ”“êzwdÉwR]ïŽL9©®wG¦œT×»#SnªÕT«©VS S S Sm¦ÚLµ™j3ÕnªÝT»©S¦:Lušê4ÕiªÓTÓTÓT“Tc#ÕõîÈ”“êzwdÊIu½;2夅T£jض¶-=½íÉñ“Ó:Ío3aÌ=Î,µ=ðß¼úýñßÿ“p’Š endstream endobj 2568 0 obj [ 2567 0 R 2569 0 R 2571 0 R 2572 0 R 2573 0 R 2574 0 R 2576 0 R 2577 0 R 2579 0 R 2580 0 R 2582 0 R 2583 0 R 2585 0 R 2586 0 R 2588 0 R 2589 0 R 2591 0 R 2592 0 R 2594 0 R 2595 0 R 2597 0 R 2598 0 R 2600 0 R 2601 0 R 2603 0 R 2604 0 R 2606 0 R 2607 0 R 2609 0 R 2610 0 R 2612 0 R 2613 0 R 2615 0 R 2616 0 R 2618 0 R 2619 0 R 2621 0 R 2622 0 R ] endobj 2566 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 2568 0 R /Contents 2623 0 R >> endobj 2624 0 obj 6292 endobj 1154 0 obj << /Type /Action /S /GoTo /D [2625 0 R /XYZ 72.0 687.218 null] >> endobj 417 0 obj << /Type /Action /S /GoTo /D [2625 0 R /XYZ 72.0 426.048 null] >> endobj 2626 0 obj << /Type /Annot /Subtype /Link /Rect [ 193.819 759.389 331.314 768.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1154 0 R /H /I >> endobj 2628 0 obj << /Type /Annot /Subtype /Link /Rect [ 451.787 262.848 477.887 271.848 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1259 0 R /H /I >> endobj 2629 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 250.848 145.54 259.848 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2194 0 R /H /I >> endobj 2630 0 obj << /Type /Annot /Subtype /Link /Rect [ 149.907 250.848 178.787 259.848 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2388 0 R /H /I >> endobj 2631 0 obj << /Type /Annot /Subtype /Link /Rect [ 183.154 250.848 208.694 259.848 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2180 0 R /H /I >> endobj 2632 0 obj << /Type /Action /S /GoTo /D [2558 0 R /XYZ 72.0 235.969 null] >> endobj 2633 0 obj << /Type /Annot /Subtype /Link /Rect [ 251.233 250.848 287.893 259.848 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2632 0 R /H /I >> endobj 2634 0 obj << /Type /Annot /Subtype /Link /Rect [ 416.766 250.848 444.546 259.848 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1935 0 R /H /I >> endobj 2635 0 obj << /Type /Annot /Subtype /Link /Rect [ 448.913 250.848 473.913 259.848 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1950 0 R /H /I >> endobj 2636 0 obj << /Type /Annot /Subtype /Link /Rect [ 478.28 250.848 520.78 259.848 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1930 0 R /H /I >> endobj 2637 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 238.848 154.99 247.848 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1940 0 R /H /I >> endobj 2638 0 obj << /Type /Annot /Subtype /Link /Rect [ 175.932 238.848 200.372 247.848 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1938 0 R /H /I >> endobj 2639 0 obj << /Length 2640 0 R /Filter /FlateDecode >> stream xœÜ½M³%¹q¦¹¯_q—’Y3ßËn›QÛÌ®gh6‹î^”È$«¬3YTeQœþ÷þ¾îp?çÄÍ¢¤YÈRZð©›q€î¯ÿÓwù-]ÿÿùŸÕò‡µöÛï>÷Oú÷ü6Ë[ú§ž>´ÒSªo¹}(ýíóÛãŸúÛ'ùM€btýÏõ×ÿðöÿ|÷§ïÒÛùî¿ýëšß¿¥ëwý.½S8Šú¿¿û¯¡nzÁÅÿžê—ÞþøÝþíwÿñú[No¿ýƒ7q/f.)åõ¶>Ô²åÿÊÛo?¿ý·¿û?þôå—ï?}úþ—úÓßÿ·ßþŸßýï¿}xÖšÒ‡õïíQÿëC¯®2çüž»Š©üÛõ–(ÿôP‘çÿä]þÂ'àÿ¾[åôRã+üÚ{þÝTîýŽ3¯«rÞ{î}ýÓ‡õÐuòþZ‡ùwót¯}¥H½Þèö:J~ùáãÛßK Ì·¿ûý÷¿|ÿßùøåüå¿ÿÝ—þïl”SZ.×ä–wJ©´—rÿáÇ?þågÿéÕÃÿƒ—ZJý¿>þáûÏç/?ýéà÷‡þôñ—¿þôóÿ¼®nOw.}¨¹îݯ‰ôùÎÿýï?œ"þ“?ÛÇßÿø»ïùø{¿çÏÿøñOþþÓoþü—ŸÿüÓ¯õ—?ÿóG¿ìó÷ÿëð?~|ªÓÕ¶%=UåóO_~¹~ñ›1>ä«´¿üxµï§þ—_~rþá§O¿ÿòÃÇ/áÂßýôùÏ?ýéãŸ~ùòüß ì(mvÍ|2íùYuý?~Œµúô—?þñÇ/?ø_~üCàpåñ†±êßÿéË_ÑL¯•ùôÓ/¯íTˇz¥kÒ®l§Ÿþðf}ïíçÿô—_~ùòáõw½¸~u5oëüÝoÑyëø0®&úô£´ÏùïïÿúñÓ§»¿ùÝÏ?þ9þäO¿÷ûËŸÿüÓÏ¿œÿþß>ú•?|ÿÏ~g4ñý¯?òóóÑ‹ÄûÐ;… …÷å7øå‡ïýÞý1\nñ—/ÿÚJc>µê7 ×ï~÷ñË—óŸüä3ø?œ?ý6ü3›÷üç0z´ÐßþñO?~ùåçëþÙñË÷_þ'º+ÿóçøý?~ïÿý»ïÿtø?†Ë®‚~üªôÓm…c»½¶ÂÜO­põ±/ÿëË/?¿…úþôó—·ëI~ºÊýù¯?^½ïãÿûç?_Oú»ëþWáøƒvÃÿøóšïž'Óœú‡ž®¯Èõ}޳Þ5Û}xã w½ôïßt&;•ÂTo·”¯ m]ÕS¿,R©R./zúOLòéíówûº÷™púœK>:Oyü¯Oׯ^ÿ"¿úá;ùþäëÃ!ûÍU›]×µò¸&²õáš­Så*­ÔüaôVöXò_9_‹¯¾Jªù¶oÀçèªj½þp]c5·ÿÌZí½Ìk}ô›ëûÖv½JXò0¿ióCíW¡m]Ÿ•õáú²ŒQ[¾žp–«¯×2ˬóñß>=ýÛ¬éú¥«>y×ë_ ýê?>–ʶHÆ^Úe¥r]TÆUŸ2åIV)וËó_“ÙÅ<åšÔÁ×+Ís/p_Âü­¼ö¹xMž,§Èõcƒóæõ©]Ü¥òe\EäÙx^ ˜y}…q¯‚r®÷tqF9ãz°‹å'Ôs\¯"Ög\Êc¡ü¾®kÆDÝú”kÊïC®éx–Þ䚆ò{íÂ(³_M“¯¦_·Ì£à·íj‚<2~ÛP~Æ}۔߲­Ú£ž­_Ü7ÊiMxá^ízÔ‹ù÷«S^Ì달?'ï•åúY_¹.¬Cη\eqØùìuÉõu¨CþÞÇ+ãÔ­Jûw¾¯ÚÀhŸZq ê\³ü–mXåý*—…¿£­ÊlÎ}:Ë;5.áš´gé'Zf–>ùÿ³þ7œ_¹Ÿ6Éx¶ÕÕg…× ùí ÷qÞWFòý>2úFö¿/ý»”¹ó+§ÓÇr­Â¼^Úppü>°ô(§~‹ë“Œ÷Á±Ÿ†÷íÔ›sÝβ/2Ƹ_Óñp–>Æ2óö2ÙËÏ»…r¼ü¼Ygðbɬóí,cm”–~e,sÅËØQž×Ê«9OŒý fùd–Of™d›óêÔ¿Vð’¶jüûJ6ÿ<²ô½Ñ•¥ô¥‹åô™GF;<ðü:˳L–)ã}`þÁ-/.¯)‹V¬©ª¬QyMÁÚ•åHŸ\¬“g×õp“ïìªý•¯ç]]×uW}Öཤ}×½,ãwm]^í³ùn2·ïÂrä[¹µ|yÞÍõI“1¾G}å«üÍòûµÜ¼׫׳—ÄõgÏbÄaùýzökpðï×¶$]ë¾pg™×šá4\?_E\¼¿Ê×Üâ,÷é•·3~kœ¿Æg~q \_Yžq—Sÿœó¹— âg–ºåÊß^]êbm·|Ï×¼}ñ°6w.çÀé–å½_Ì>3Q>ûä@9Ûú}Ÿ¸w8,Ïž­ÿçÃuË36G¸žãwç!uàþ«¶é\›sA™h‡Šv ËNøðªÎ39÷åܺs-ÎeΓó°ìo¯ì<–sïÎ-\_“se¦v8m/3M¯Cù{™©y™©xRe⽃³ØRÏéXP_i8±×¦j8¶”‹/´ì ‡ÔßjÙ&Ö}PŠèø–t?`_ë :}ß÷Ž®GÄÌEDÇ bÞ6t;"f-":±ŸÂZ;…µZïM=å qh”ȯ)vÚý‹±ˆx…ØZW´ï”æ«ôDY«eÚûP_.MÑψC*¹¸ é1…д]c©ÁííúˆrÍ>ß°ïxDiÉbTA” ­^¸´–g+´m\Ëú^OQ`ߨ2ܯ¸ ¼ þò˜rcHëÀµl’*¸¬Í¤¦¢ÜšÑ¾ù Ê­/×ò áZ¼”‹õXC}‰2s¬¢Ëèå Ë¢°Êê,wZ?Sd¹Àu®EO-X – ”iUQf[½¶§ƒ2O+Î~pkg:׊ȰŒƒ^® ½\1Ïë³Íu~¥|‡ù<›XÀ ëi‡ÕO;¬qê»æ©ÃÚ§¾;:ì|ê»ÑûÐ$»åƒ½ãà:*§ÌŠYö/‡3ŠãD^“s«Î}8ËZ'r™ZeÆUβÀ4–ùÙX¦í‚…s–uéá>e€ËP5Þ¸ e‡Kv®Í¹Mç¾gq^¡Ìí×׌:`QKuÆQÆXTÆ QFïV^áúíuh¹Üsñú·êõáøTáúéõçU÷ê¡ü^üúÊï¡|T¶9GªòòwÔY¾. ýúQüúQýúÑÂõ,_¡ÞgÛJ­Þgföëgñëgõ>69Ϩ1¯8s¦Ñŵ÷á¹ýúÅÉQégqñnÌò}±o<Ãõ+\¿ýúÏœrm2ªsÎm9pý<³* u‡}¾6Fٙ嫡n8³||y’OðØ×fùäí×g–OcË'³|5Úáz¼ŒäÌòÉk8o¿¾°||x Ë'×îÌòñÉ.,ŸÌòÉËøô•ÂòõÐ,9³|2Ê/j„[Î(¿è½8£|e”¯†1”¯\p= ,ŸŒ¹H™åÓÅòÕ(…ëièÂ\ôÊËE1ù¡L]Ç`å@ÃÌ8k‹Ò1—rÉÑQ&W"‘žÅÖ-ò^hŒX³îWÆhë¡1–?<Æ÷B‹¯œ2ÞNËrGñ¹Î[—dXˆáy'W¯< ÷òÅgנ̃әÜà1°âÓƒîíF©FØV¨›´¸ØÖCoù6‰ÏcÛ9$¿Ï廓h4ø±`cÃ<™Øþr~}Œˆ04Ò`ÜåvÛ¡º/Õ ׳¤Ì‹»Ý÷bÞW7Ÿq¨²{·ç‚Ï»ÄÊúˆcÂnî8°i›rø°9NgÃ*ûùcíV§9°ÚêÔðÀR‡¬N R¦.‚Å/c³á°EµFY¶¹Ø¯I”+e94X\w‹áäâB–k°i(8xYl‡%‡!‹FVÙÃ]]IYœ2hü;üÃwßšOŠz¤dÙû]ÿÚ®Údzk`ÃüÄrŠ1ÊßÀùë<Çò×;ŒØâÌ:¯Á@}b9‘AG¼"85îdœ2מø-¬4âœq§«7ŒSrež8“q*§ ïrcÝPz§(ã´W'žÊu8ãtR9û³Tœb+ó”~ù î˹uç®Á‰¤r‡Ëö2 NˆØž§lÊ<…'ãTN¹xûœâ)ãtœù^Ô5qJ¨Üý¾¹ú}sñûæì÷M{ßóò{¥áe¦ö—Ó—d“s­TÕr%uÂã‰á­4¼µzá4Œ'–ß¾Ny:ŸÂ‰ð#û‰0¯7.÷NÛÓðÓÛN“¯Þ=çpMñßÒËEc§ÿytçé^ðR.ɯ)Ù¯)5\Óšs_Î3;¯pÍ>'ÈØŒ.~M­ášàá –ÛÃðîP^^·–üš–ýšÞEkÞæ'ѯ<½ÝÚò¿÷Ðæròu8”ß›Ÿò÷p:ß§ŸàsÞS‡To¹Ã£fsÎĸ¦'‰80YŸ|dx³$ŸKÇ sr{âoì£hN«m`ùsÕ´¤ @XÝ‘ÊÍó¯3þb·úÆ,}XîÙ*'~b¨ýlÈíܯ£¬ù±Ì&^«æúŠÃ/åjñÂÚ#~Ã-}ÍÚâ—‰¦Î™¾ª_Êf>ŽYŽ:Ë b<³ó ×o¿¾¤m~«YvއkwnËY|eŒá‰£˜Ðïu¸Ò/6YÛþ¸Êm;Ë—»c[ÚaYAÓ¿vqÖ.βb0®ÓY¾ ³[“¯‚1üM•e¦SƪŽþ»\í—é\Q®8{qížçtÞ¨ýùà¿Ë°¸p®É~¨Êðmå*þ…Æð3æj>pÊð3FÿQFÿQn¸¯ž1gg¶¿úhú5K¾jôiÎ ¾ÑÊe˜?n^hŸîÕYæOcúIÓý³ë|2ßßk hÎu;³L=ïG™hç-ìŽÑ>Ü '´·ìb63ßkø·uìF®…MqX&ÿÎ29I…2þÖzü–æ¬b»úcìÐLnk;Ï~®o£8«µ¼—V‡3ÍB¯œüúj>yÂê-u«4i{u®Û¹è½®ö©¹.Œ[ ¯æL£WîÓ¹éõ×»P³9ogõ½¶ï‰´­žñ‘­þ¡ýÕ_‡\´ÌëÝå<œ“–y½k5ùçtÍY}ÖÅ7.Yû[ûçê¬~ä×ܾ×<¨ß5Á‘ªOþõʶ½Ú-15w˜“á¢Ëæõ(oK߀àÌÕo^P›üšªW=Þë+¯ƒé˜€5 E6d“0൯\;é2,ó 6Ä5±ª¿£àÐvÔvÔv¸–ÎCÛAÐ,Ò­Îxiö=.½`¾ñëñ‚½Ô®!hõ½0ŸšökAkÔõÖ´' Zaû­YaZa˜ÛÁt®­‹·(é­Î~ƒ¨c]Pûƒ vAí‧@Pë+¨@°Ÿ»•v ³a'X¼°t Ëû¦è¾uÐÛ!{ûf&òIm§seï}†²æiý ¯æ³Ì &ùn›[Y³Ÿ%Y¥(ÊâHQv¢Šâ®Ê»%™ €×‡!Ýá\e¬(é!žBQ–вßãYÚF}bÁ4”%ÃıÕP>6ŠòS”OkÓ(Šz“°k­ƒ²¬±C°z°c‚Ê·MQ–LeÑ©(kE†rˆŠ¡¬ ˆS”uhÕSÑrPúƒ¢,ve ¤XòAùb«,DW»Ãy~3œbóŸ‰Ë³b9u¨éÔ¡ìSß²N}Å!ŰûµíÜX6I†Ù¯MçÆòY4\çÆðžWìçÆðµW,§0ŒXÅtn,n¿†ó†U‘b?7NÃâ׿sã„…\¶¶½LqÞT’AAêù•P¸ô]¬§ˆwÄ É½ÒÌú›(%šÔ­»-4 ~Q¬ç®S2N$@s[]&jBíAÝ:5ãN‡ÐØ6’°Dšç_Ñ…AèÁ2øFµ9ÐAÉ,Œ@ê^“Ð@xÿ2 t<%O Ê6‡ôTo¨Ê‡Ò q\’†Þ·m{òH6ßpøâòfZ}"›ÖÅ”ž¹ ³ó~"˜šèQ&„X)жëhc»N=œ„NyeðºñVÔÇí"-ï"¬ „j¶ëøMU»®¶söR S^]Ýè”ײ]×´¼kñ¡~Yi\¤å]4íÉÛ:×m»®g»®»®W{ò~Ú”{:ÐÌF«í¡4’]Lj¹hÜ»h'ë§;³ŸŽkaΚηݚQFƒ×Éb?íªtM‚¼Peò:È"e`$ö} bµÕÄ ›°í!²\™¤sêY.°òZÙ9aBì¼û¦uPË•Ñ.†%Á[´Ü![5^+zZ® 6^˜ʘi=•é®h¹2ï ˜‰“ŽŽ‰Å§,…ˆ½ÄÖƒ3<trÊ6c5-W0óZYli¹XûñZY®aóB„­¦cý©å j¹Ó6éÄÌkeë^æA,ÒðØðl4§à½Ñ2‹ L ¶»A“r13Ië'¢ú]§Á2̓²wÈ äZ™Ñï6«uzí«˜Ïµ1õôök»_Ërév¼²\º(׃y,çZÈ("Jž8üZù(0¦ž D82(bB,çÚÙPIyˆ8V„!‰¸ÒÁ] eS|5µ¼Ù*ÂnG„َȈtàÀµò6^7q7Ã^BÄþ F™b ÆDd?q¦ƒ°¥Ácš¦.†)'tUå’œ!-€Í&9ûrféäuúØ5ߌÃÇTýÈ?0'Ë”þÙ¶P ~¾áüÊ2ìVßdYìúÂ0&'– #gb9Ò–Íh#¯À²#ÓàØ<ÞáìÌ)õÁïŽÓácàwÇÕ¯_áú…{õWF›èæûbý-ÖJ㕳ÍsúÛ6¦ æ‰ÌgQFû(s3Íý-÷Ø|G›÷íïn¨av›ó‰aØœ~ýÔß¶Ð7ÿð8bI$ìg ýŠ;‰Ë7 #²tæ‡BŽT+—ØIÄ£^S —âõ­bA K ~pdIQ1•‹sR…J´ hÚœRÞÉ^œ >‰óVjõ•ú°_\5Wº^–ÒîJ[jŠûîb5N\a+/-¥‘´¦í$ONÚrŽí\ôá²DoÖu°Ë}è>ÚA,d‰[nµ9¨ëÁ<´ù°e4¼fÒ¼:†áX¯~hxM~Šbd2,çq/5D eœšIH…ášVu‰¹2ċ‹ÑÚ°ž†·á°†¼Vûà.Úø×Š¢ë»yÀ¼Ö¬/ôZ\´ƒÝvð .Ë*ÔðšLk¢sÓõ?5ñ\_ÚAQÚ!©×Àõ˜‰GQÒŠÒm-ÒÒ1»pucLM–ÛJ"ýËÄÌÙh+v­Ã~kVØ…ZØ57-ì®…E‘U=y+o]˽úz×rµê×Ûõc/håö·a…‰¡¿´ÂÆÛ°ÂÑʽP? פ@1àÔW(XòÁª¬·ÉÀ] ¾!Aýb ê"äúŸ¥F0ŸXäUÓAµ_?[z¨)8óÁuj¶tañÚ-¦S³O}wžwXÎÃo<l¯xí`{²VßúU¿^Ö{8ÿ«5uÀªû\âîv‹œÒv.ÕjÏÑa]Q€Ç‰xÐ=®²½Éñ†U}rÄ®¶h‰È[˜µ”}‡ZÆÉj©à,;ãÀ:,±Ö¾^ãÈu¸hÝdm_´ŸáïÕË)­Ÿò‹6±Ô¡Œóöu¿Ì6);Yƒgìp>Qm<‹.ë¬.ËõPۡê©«e¹^»lÕºŠ+0ðóï0ˆë³Æ1½ÎD 6q]yÂ(>õ4öF^ßpÖ€w'˜Ì.ÊåTîE,Ø\ b¯e ¶2žK¹‡kZ¸¦ÌS¦xýؽ&Lä#Ö‡g¬'7èâÂÓ©‘L¨#“pÁç8ˆP¹¨ÀQ¡ÇèØ[[uXš•akV·ØaÕñ6muŒ†Á\™&®'p43tAQñ®ùîŽ"î8\ƒ÷®ŒûrõþÀ¨]5à4©\a¹å¬VaûV¸^—VŹng¼# •oÎná¹VsËçZÊ8ØRÆÉ–r ×ÓÆN7'ZÙÕýi;£ •Ñ”G¸ž'\êvåuÈ<ã"g¯3\5ŒaÏVž>¾­ùºçövåkŸT¼Ýà¦Â¶Ýû43fR¾‰AGìÛÞÛöW¾yVäatYiÒáÌS‘zp&ë Ë*ß­ s$£—#䂃bñ‚&“fCh®3² óÆ7qÂ…199EŒglŽÕ±øÏÑ©°J™‹‹G+R¦i‰*¾¸ƒ¡Ñ0b?•‘ØMâÅÀ:>pörDžœmÇî˜î01šY&{|$QX¡%KµPØyÜSÍ?†XóÁ¼&ÖÌjKœûà8gGŒ—"¶SX.§°œûÁT ÓÚç©=bP_:Ä5h[°œÇLÙšoï­Í@W˜'Âô,íÅE¨-#=ûZêÊI‰.0âíÏèh$,„Ké×¢­é{jz~ 4w3RÓd}£â*ˆ¯H¨±”"®ŸF™¥ˆ‚|W¢Bˆ/GhØi׳¢ŠÈ8_Œß‹_Ëõ ¥Ò)ˆ/EˆïDˆ¯Äéúm¯V^/Í(g­ O m¿¢¾.ÒMŸw¼µfmO£º¼ëÆç½[4¿ËHª|Þ&N.¸‡r"}î¼²+ÿ{±[ɱÕ<–ú-‰/§¾ÔGòÕ_\/7$rå‰x·HßpãŠÁQæ÷Ï$žž^»ÆÓX!žîÊv¶z½ A<£E7Ù NÇÿúVyJèúF*îË“>­K¤o¸éeÉ.+œÏßI%×1¢feTohÚJþÛHíP?Ä»Eúæ·™÷?ŽlÄÁç³°, ½ed'X¨ì±ÍO6"¶ŠÅ±Ýb·¥„"Öˆ8ÔÅ|ž«™‘êŽsŒ6÷Š>ò7÷fн1ˆuXN´ªXÖ¸½—¥Y§ºxB’Rl¯‰¡ÑJ´Ä²ÆÍùºžÍüeÚÒ³™&¾üëµn£³G^øJs›}}1ô,,b–kÕ¦Ú¯X³,·P£ë8up”¬õC ÃÃ>äð0l43‹‡a£1l^Mb•šåüŒR3­ÄõƒS24Ž[U‹óU3Ú…Äó©5u6<†I¬-4Þ¡Èé^üªŽ*._ïAÏ å”YÛAa;ßPÄaŽ1ˆ èìÈýZØô¢–w1bjìÞµHbuäl_c ʺI£5ÄÁCaà]à qc}i¡|œ56xêbÁ+jû‡a•Û–öÒX]Qa¥“ B„‡ÉÌ\È^"{qO•½™ZDe×H}~leTRZ¾dƒýW¶ätʆ}qà®8³d®·Ytk>Õ1çÚ™‹É”±?C'1×~qÒ nTôÏ"±2§nзºì`º˜¬ƒXÍ&-úÅ®FéØkz¸}GbŠWyAqìá© /ZOE8ˆÞëW¹×à_zà4Þ([›EðbªúÞõk.ãY³ª'Râ½¾ˆSWòx Û– •kyY {â€Õ Õø™I]?Ó–§wŽ7‰£Ö7/’CH¨8­Èašý5`ïçgWñü.n?Ü=ÀHï&ÞÕC埶¸Ø«ÍB*ÉXè)¨!ÆWaœ5dwG'.B«ª¹x,©yÂî† ठޞ3ó;#øÌ\]pò+sõË ƒ¬œӿу¨p%ˆt½%zGTñøawöDWs,ÌQrJ¿Ð"²h¡a~Á.O’XÒ^SÎÂŒ"Ú>Ü)J¸ÒZ<̽ö‚è¡2íR Bt‚¸ß t=!%1d™CÑ Ù/nt'«É@×n<¥X3)Ý!!Y4¨ª² F)²oæuE~ÑŸèÚ7Sc0KT =_®»Ñ@¨¿mL⃺7m&²9Où“YOùÉ¢vüˆ/ö8kçºý5 ¬ü…«¹dþoò©RÔÓƯˆ§o É;Ùxﮞ¹é–s=ŸY>°û˜¶6†ô… “»øtPz_sêÆ˜“ÿÞ˜èäšñ-‚j ÷•¶_ø ºÈš<~—ÞÃã÷‹Ôœw5] ³$o ®õ…WçÓ5TÙ6UIàÐâ1®„öOæï2GêÜsƒÓ©#0àõYžêÓsÕkªöÀµeŸ:.^pn1lj¨¥«¸–ìKô;—ª»‰m„Ÿékèêïªú,ç‰WÕA¾ðÑÅQS¢s÷ÕÔêÁ FPC)«e kØl¬òñr¾§†Äy‡]XÕsà°¢}f£'aßÀ®œÓŠ)>5b6ÿJ„`ððIF½Ú¸Dìjíyºå>6ÏœØoa0£ùsXt]0^cò@‰–PâÊJÍx²û(ƒËÄAµ$ë:¡ô³‡}”2cð0/¼EDøbVGüLˆ–ÅWœŽë+(ûØ”³c¹ÅúŒRõÑn±;Çy‹ë÷rB$Çúkè5›ý×pþz%ç>MrËÛwyK®úŒã Û¯á8ýýŒ¸Ÿq=âN_A¸ôfÇâXŸ°ÁðÝÙ•óû8ùe,ï#ÚW èò6;E}@1õóÃ÷‚ü8'¬Ï(‡©=£œŸ¤þıÀ°ÑMO“÷0ÛÂ{ˆb<&Iæô·a»E©$½äph’ÏG½âŒ;"ƒ±h·37¦ÌìeX¾Û8‘Ì/Øì‰—·äb;¤g<½N¶-˜í9Žñ à´‚/'¼ˆblèDšL'R€«ýG4\®¢ÿr +/‹:wpydL$Îܳ. ä@/\¹1’axQ}íÄxd~nññà "%§%êØ€xª¬«…ŽïÎY#àÔñeYõ|†ZIWrЙô-'ˆ<­É¿Ì­ƒ¸¹&êÝC}I3 5AùºŒœX©hYµ¸f˜&ÝiÍ¢K5xùq…†M̶MWÒ56]\Ô¢‰w?{ªÝÎ~QYD‡bëVLÖÌEcåÄÿE÷¡SWm(k}ºŒÈ Uoé‹þÒ-u%QViºY–è¥{a[ücBâb·ØÜ^¬õy,EMÚ}éšü¯ÅÎñkÜûüÕÜfpätû)޲Iõ¶°ž®ç©s2Q[yktö‘‰‘yŸè™“Ó˱rR;8B§¡v€Àuù5Ì^©ÇúÓúp ±¬gžýÔ­rÆûŠ¡QŸEˆ°:ÆÒ_ ²¡ÙêO)ë|µ’H“ÑÒ‹5¤Ķz*Ìã¶Ôð*XØÕ[£ISÖå~–³.u«Î6/KAƒd̽½„Zpa ¹ íO·Ô•c. ª‡lÒâ¸U¦¥Š·×h]š‘LÖÎjó’G㊘´xܱiY¯ÄnA¯“kîššL¶Ëê»rµÌ¤ ‰œs«ÉEÂÔMŒ«Ó•s'g±ÝLN,òId®Ÿ¼úËä†D‚U¢JœàÇ‚Lïjî½®šdí«2b¥Qs‡˜fÔ¾°êÒ~êªI+b½ÞqðuÚ‡út¼Z¦«ñõú‹ù^Kdµ»Éɰj¤ÈÂܯöíȽÞzí/h"ðéT‹ 1½`?ÞׇÒ®;5õ‰»ú£¹Ê‹‘ÔÔ~E dï¬Ê 6æüæLêAìHÖ¡â™ô™sg«Ç×G­ÂâêÃCæ,1š†bW®Ç¼ytS;×ÊVXÄ1ör°.¯„ƒaÚvXÊ Å VqŒƒ=ß!Êåw\ìÕŠb€×è¥5—™Nif£~þµ5£zþ5[Ùâ)J[o½¦=‘XIhØ_¨v­bG¯û‘äÁ䀀 8éömØ’‹…q§’¦†25õë¹î«aUbŠç’|èP‘uzç²÷ªG϶»êžQ4*U¬ƒ©âXN»8ùtµu õvñB\ß_D;ºü‚ñ©R ÍŸbÕå”$ö´¡{âªÆrÙZ ݦMñdû2tç ¶ÌôDלÍçèò7îһΡ‘®{pÔÍ÷C–þ´ËœMT)ÖYP1)fêÛþ•}ò[êhÉN Jr7m¿@2Ï1Êíjñ³‚ïÜ9ˆ7wBׂ„ç&²|çû&Oš${ç:D1æmêù ެHÓÎddþBW{6v«ZŠxØsÄÚË{pfEoK=RÄæÆ#Yn65“ÉPåJ,’m« K‚ ¹îç4HÁG%‹eÄEã@£®Êb[ã²d=®ae2]è!’,‡šEŸºëbX\Úu!š¤aÇ3f¹€K9éáI׺å |iôÚ™ì²ÎԚɆZ£âʶUÂdÙ«'~²Iæ0>³í~sŸ—â—D_½Ïªu[õȅܬQsÕµtdøFÖ³8\Âßþ®kãî<ÝõšÒ!ÊpC­ó…á|©×ÀÕYúº×¹ÂQÅDòºg¸RG•“Aùùo`ßGÜr œ§;þv;Öñ«þl~ÕºÇí/uäè{}²ïý¶¿ÝF´ˆ—ÏÅb/ó×"^BHÌŠ?{‰¤ùvÛM²³þ¬y¯“ºiPkŽ›¹«½x>‚Ø&@òæȲŠÐÀ9eØ–r°¿mO¢¢69´ßz€bî(º_”Ã5Ð ; ÐØzЉX Ý»ã0“GÈóZQ¨µHÎ7_!ø¿…# ’ÃÄ;æ>Úšæ}þvûE°D;Èox ,FyžeDf Z‰ÔùȰMr‰û¥šæ  ÒÚ;ÜÃõýõ·$H4’ÁUjÙ+fLõgyäoöåÁ, óÙKßiBD.—Îd‡]rBªçtbvÍ”2Š(ñ(<½C>Æ ±`w{ÆêØÇ3.;Œ œ‡ˆÄãÑÄF€ŒuË*¥èbÛžˆ4ök¨pžÃŸÓ>øÍv_úêµ…•WýÊÊ‹ÖbãVvÆR.ášì+»¼}E™¹úÓ`)¿oF2lÌ”’œ³¯d¡ÛZͰâ -[ Xd•êàìH¿øõAíÑbŸT|„G¬Œã6@š²Ð>Š ”™ëÑš}dY´i§lÿ2Õ´ËRõ1‹ÆÜñÑÐñ—* úD6‡¢þU<íÌŠÙ(xÎì$úÀ"R¡–¼l`dI¦Ç¸ÿFÞ^&ï¥õI6ƒ<ñ‰d¢¸Ì©ó Ïx Vϯ0ƒéùÞ—÷M†~¥ÎÉ\²¿ ¼_}_¨³¾ÇÈ>ÝËá}‘yDÛge…ÖÝG®vný3{Î7ŒÀÜâ¯ùôgÝ>0L•‹ïq§;Eƒ#ŒÍÆlc¹‡1ÞÃØ'7³¥ûXFF˜¯ï’¿áÉq€™“/&8=öƒO€ž=âxš/ø‘q 'VþV¯¯_ãX_L¹ão®Ñ«ŒˆëdŸ> 1Æþ¬¯A¶(2T>S¾^¿JâU®ý°ÊFA»¨¨ êht':xs¦æ¢ÑÂMŽD$VM>)jÌvr'¢B<”(Å%jÌØËAvK E€ìH‚…QÑ@v‚uDT‰ ª†Ç#­é¼vª®B@ÊÀfÏþ,é çY"B4“¬AuêñŒÐ¶Fa8Ëh§ù=Š8ކÊU}?*Hñ€°eŸ‡¯ç]ªrKÄéš T‹X:†o0¨:¸ÖCP€ˆº÷ÂÍ)p’ÃÙ +°±ž°å›I1; WÕ j^0–Jƒ¡!ÛÚªœÞ±@Ôùý(‡PD§Óm±ZSS£c–J<4ä@(„3.S±±¥_#ÔFš,è›ß”à§ó ã—;eHœèÎêþ¯KK_ñÊ4¢Ò-Õwê7;›¸ûyݽîœâîêq×õÎÎ,îÞâ®.îöÞ݆]cÜM¾·ã »Ò¸[}ØÅÆÝí{;à‡]rÜ=¿³ÃŽ»ð¸;oŸŽ6¬êêXý¾%îë¢ /ö‚¹ï{à³Á0˜_ìŒnˆ æÉ{û%æ>ö_†>Û› çí±ÑïOŸèêtý^Œ3>8:‹Ó·p÷& F Öxdø«‰ 5û.À'óZ¼òiÕ{`™ç²vh• 7dÓ"rs=:ºf A½lfºiŸ1x#çlÛ¾tp•2c¤“Èê÷Šó˜­f„qÜ œF—î\ÅÉtº¹>iÈgäÏîq•5÷d:®N=&€Ü wÆQ7t8MG‘Ý#ýÝsñПTG*Ûþ{GñH"s¼sKâ1J<^¹?ª`=~øi P}¸‚ÛÙ–ß–t<…­Ï ­ènަaBL–JŒR;FAò_®H®·/}F÷ƒr/}.ht©û9§j?A ¾ç켪½×ì”Ôú|êÀ;Ï»C:>}ïÈÀ¢Ú~­»Cñyœ—Ûr;áŒ*š|¡£çÁe{ÿ‰ý½ûõ¿rL£G0ñˆçöØÅX}u„ö^;æÎàù~ ÓÆõ†m£¨¿N=}‰çýjö¾H­ñž‡gðž¢ïz“FÓè‰=T£çê;Þ­-ûî¿ñÜ‘L_ö=Œ5]ðÑwAC»¶3“¹%ï·œþÙŸ•á\©‡5xÊaå<ÙÑOôè&2#\9Ò:2|\3Äs†(Ïûé¡!N4F†˜ÒiâOïTCkˆk Ñ®"cc¼lˆ¢ ±µ!â6Äá†èܳ"y=¾7DýÆXà!â†C4qˆ1‘Ç!9D)‡ØehqÎ1ú9ÄD‡Hé?¢ªC¬uˆÀŽÙ!`;r?xÇÀï÷‚Ãcy ,ç1=¨ÇÀõÐÝàc`| ˜ôö1ðþ!ÿD釨ýÛàþý4‚R€ëU¨5Þ‘(p W6zï"Å„ £Ô‚æBPbú AµÁµ‚ÂCÔ}jQ$"ŠGDQ‰(6E(¢8E­ˆb"Qü"ŠbD±Œ(¢Å5¢èFãˆ".Þ4=¢ÒGÐÿª A+$(ˆ]‘ 64H‚2‰ë•“¨mO‚JPG¹—O ú*QuåV–%è¶5×x Ê/ïHÃ혠(óŽäÌ¿D´&hÝœ_UËù5½ Íóë:>÷ò?÷RAAK¨?a~Æ{¹¢_U9 ŠH÷’Iù ‡cÆô„  ¾•xzÑ€ÂSüºŠTPœº—¤ šUAÉêoS½bÍî%´ž5¶\yëUš«=árœ¿†ý×°9Ö_Ãâ˜ÞKŸ½#“6oq8zÍ^¥Úîeݾ"—Óy-_U™{V¤Ï4í‚ÒÝ­^ÐÊ zAW/¨í ¾ Ìw/Ý´ý\ñ/èFuÀ ”ƒ¾`P Z„A¡0è5àqèʇA1ˆ$ºp¢‹)ºÀ¢‹.ÞI2º`£‹8º°£‹=È  ù $ƒ®dP› ”A™2èUË{™Ë¨ƒéê˜÷ò™A_3¨n-ΠÐt;ƒšgÐø<ÊŸ.$B]6ôNTÔ%G]†Ô¥I]®Ô%L¬©KùS—Du™Ô;U—X º«AÕ5Zƒrë;Ò®Aû5(ÂÞKÆFMÙ 4{/EëRµ._{'n{¤o]÷N,×¥t]^÷N|×¥y]®÷NÌ×¥~ü¯Kß »œ°K »ì°K»<±K»Œñ‘6v¹ã |'ìòÉ.©ì2Ë.½ìrÌ.Ñì²ÍGÊ9è;?¨>-è t£ƒštИÊÓAÚUªƒvuT´:×Aý:hbß‹fUm×Ú ÜQ—;¨u ï ìýŽô·kƒÅð¨#îêâAs<*‘»>yP-w-ó puσú;ré®§î*ë÷2ìQ§=¨·M÷ ôô߃*|Њ ò®+Ôæ£}P¦zõAÅ>hÛÅû ƒÔñ]3?(éG}ý º´øƒBÐíjþAã?(ÿ{>€û„1£@È3²„œ!SÁ}*Ïu2 ļ![BÈ¡2+„| ! CÈÍàB‡w=„L!?DÈrI„ žwâ>1EÌ\óYx–‹û4!OFÈžrj„L÷©8B®ŽÁã6ÅGÈ3ƒ„|!w oŠÃ±9æì']°d%Ò”ïd~?ËpyƲ8$2¾Ït,uÈÇ«ã`¹C¤gaå$í =@•s;Ó—ÜëE[=”ëA?’ŒóÍ# y·þpNü¥Üiëœñ7{ )Kõ¸éa•ãßI¥Ïß=h.%¦ ÏT›‚–SPxº•€ QQ9*èI•© =åŠT÷’UQÓ*(]ý« Š´²Ž‚–Ëj©-—ßrI.—éré®#çå_·`.æ’a.#æÒb.7ædG–̥ʂ|™Kš¹Ì™KŸÝ £Ù4—R òj.¹æ2l.Íærm.ávdÝ\ê-ȿ݉Ãé8—“»›s)º Oç’u.cçÒvGîÎ%ð‚,žKåEù¼ ©§2{.½çr|G¢Ïeû‚”ß‘÷sÉ?—ti@— t A—t©Á#?è’„A¦Ð¥ ï„ ]öÐ¥]ñH&ºŒbVt¹E—`tYF—jtùÆ#étÔƒ&ä½hdP• Z“®@t)£Zeа Ê–Aïò^Ó3ƒŽfT× š›A‰3èsÕÎ;u¹(?Dé‚TÝ­–Ý·äüö_¾“y ‡|Ÿñ•’¯ü— 1ýÿ…Ó4c\FRfü#±óÚk»ÞZ>ˆw$åd.­ˆøÂtDâh¹„b¹c{;¨å&s5"bÐàp‚r´ûʇHͤÄÁka¥k¯=!p !˜°‰˜5€YËËÛJ¯…P?¨åâ'Ôrµ\1/àݵ\1Eh¹É,oDì¤obOkÈrL'C‘ç§ &–í2¦‰b™B˜?›Øl´Ä®‘ ¬„x°'ßß…//ß)PçuUmO ZŒ ¯+zŽ-D\ЪFZ^V HË˺c“™z–l”–ÒØÃˆåÉÎKUËÂÚ„ùBú4¿D l„:ËZv]Ÿv]ï¼îú&ád¤å‰~s1b¢Ï)«»Ž«Ð´ëø…ò8‘6Ù¦”j¤å K5*´ì:F‚ƹ®ëê0:åÑ Q¨œòxªÒòæç fO^´¼‹Š=yÉvÝ@Ë®ËÓ®£íZZ2·}Cýµ8]"Á?T¥ó¯‡ÄbÍ6b»Èé$Ûþ‰¶ÑšFì÷®§d¯»¦*Fhôna'$Ï/@Ù×W§h)×N€}M6OZÊ]šWOë‰a=YlL kIeïRΚö·$†åg„k,>|Ãu?62 ¾1Gp>â$+Äç…±‚÷¸Vyœ›„8¿qÎâ;âXíæ°ÓĈÆ1(Äq)ëV>¯Ç›ÇL7÷ûšûŸ߯ػS2ÊÕ¨œmüW Ž)F|«BsíòB ÈñC%T¶Q;×u+osݲûê<«vêó:¨MXÍ¿…ØçÁ±®rpŸÂèˆ «ÑxÄZ¶~°¯ƒúvšù3÷)ŒafÄRê+’¯+çº~N爜uú‰ã$r~‚çz>×rN¬§0º6K—ƒ³Ô×/k}ÿ‚¹,ã`]û¹1Äy*iƒ§Ë ªÌç‰{9•ì-Ýbs<•ìþ@ŠâÐÒõ£v­($u_ç$±\¤%Áô¦«8¦a?ëÀü&¼ò)ØXïæ7Ê&èôMW¥Ï$?$`q ·{zhØÇ¨S<@øBñ÷ ‚…­D@ðÏ!F^^”м™DˆîÔo<€R¢+õ›ž/sÛK …7š”>B€·®ÕO ÂSÒÿ¦uû¼âÈ—´Ê+mû×íO ¢Ãþ#ó¯Ô…xÓÐhݦr>@úýá Dd<ÛnX §_ gwš¯à+N„«¸µöÁæ×ösãŠ2*eX(ÊöN}ÿe\(ʸP”ˆ$u&—q¡(ãÂÂñäZµÂ¯ƒ2Þž±$náy”`,Jjã ôEi_Eil° „np8ÚB¿HH¡Þ-b±V/ðÇÄÒ©@ë©9ÌD”3ùm7Ûã‘D°@IœQIâ‘@êç:œÄƒÄ×”Ïuâí¬‘ ÛÈʃw½†?ˆÃ IÊ#Iy$Ñ—ÖCqlák^Fâ1A7_R?×IP­'u#ñKÐÓ¦ë)é‰.ûz¤±Ùq¯ë²õf%‰DÖƒ³f$åi¤Ð6ë@²±d)¡òÍe2ê”$àœTªQ¶ëà›¾lx+‰?ʲ‰@©ëª¸Û<¢$®.<ô¼VšJË®“¹Éœo£v®«Í¨d£d×Ę́´Ú+Mû…̶JÍî+jJâ•ÓãdO)E%ñ P‡íi$û R³6C%ñ¥Ðƒñ¢”—µ¸¸ù* kñkéi$‘¤ÒŒÎû_d%Øw@Ò~ÇIOeš½}ñRB<(M’øw¡ ‰½‰ ^Z€nÿÔ´nDŠ?€xÐR%ˆUœ9`¦v{Ùym®NtpÈþŒ Þd°¥g‡Ë†ÿ´Ñ*6Mel™#.AF–=à»?½ÞdY†@û7•ˆ¢4\˱Të°Û QtBH¾S”ÆÊ0û½ÉR'BŒÏ‚Ü숙†T¾fØçáÓ‰Y‡~~eš¡ÚûDØ=ìsŽ¿ÕþDÃì$Û>a¶`Žô î ®9ùzº¡©ä{74r^–‡ $®…w i,cq#7‡e㲜ó>å#*Ò8á^û…åo\ªs-÷ÜÂoGø»¬Qì^;û3&ÿûi‡Gþ_y²WòYc-†Nv²æê®)ƒwÌúÂxµ&¡%¯§©G™üÖö&‘åµ™©¼’²½œ2_x–­†± ê†Ä˜±¬ŒeÝjܽÌ,+ÌáNX‡·ßKÏË~θø}KóûŠïóáá÷EP¸ñÆ}éW…n§Œ!¡Œ®¬Œ¶UîËy†kV(sãYè•“3†rÎm;c¨(Ïî¼ÖaX =:¦å2[rîõžÇpžËy£õ•ýYúòöï¬Û~e)_ÓÁ Þå5êöun_g©½ÛX·©âDùŒ‘GƘRß0Œ;.ÑÇ4´ñG`Ÿ.G˜.¸®áúö¯âù/äñÂòù&·$Ï«no˜TpéÓi,h÷Îâ ‘Õ£óåӯ΃Ÿ(Î3°3iŸy`Î äæý ö¦¡R‘9'w?Œ…гÿ«ßRvæœ@žÉ™c–.OèêwÅyL·ÉóžY¾ tgé¨ö>ÉʘÔñKJÆhe´¿ù‰5gÌc7,fš¡Žgòõãß TøŒ½|l&{ù%y™%±ÎØÂ&Ö™[WÖY·Áøm~aôÄëñ,X­Ä42Æú‰¯ßö5‡kæxåö/cX§1öåÛû†Pca1ëÐTýÄòÛÎßÊÜËs¤"[µQßqºç¶_X¾¡½²|igžÊ$& wV‘ÐÈÜvsžû\Cþ¶é½¤4+S,¥ÞsÚ‡yB§¬mNÅÖéÜë©3…F”ËpÎå0OC”—¶›,þgºç>[¸¾ç¼µ_Aõq³nò͢烲ÖlïnYœª²mÀÚ·Ñ”êá´“óœÎÃûC } U×IÛg>ö¥¤cAÌkœÍzå'ˆíôÇ­¯jnõ«¦|®}º4£gˆSTb&´3Ö~P;¤‡i‘¢Ík%(Hß,âƒx­ø³÷}PMiCüÙÛÁ’mN-W!Ô*6ì4µÈŠG¬D—×'iX¹q@´r³Ê‹9NïV׊x„v>9)Örå0Xí}‚Z®ø°½¶¿Ù¸ìæ4J\|xIlmå–·¦}Z¼Ö¬Ü¤ÎcEœ švhñ0W3¡äÐá.®¶ZnWæ}PËmUS+­Ü¢¾ÃEúyµr“ìÙ/-·Šã¯­âÀ†º:€ Á땚_°ªE,°? Ïž/ˆ £N#°6¿bSt¬°¢,Ãõ‚gœuøûê\/ÛGâ÷1äm(A}݂ڨ‚Úåû)¬ÌS˜Ms‚ûÆàk¢SÁz «ú5(æaNœ§êu-ÖÎc6ýø –y‡Í¯µvX§{fsU&êT‘Å•¢´Â¦:S­0q§Ø/(ޱå ½<΀Ì"÷Rêd#¨³œÄéÜ'¨3¢ Î“¢b¢³g–À zÐê[Uæ¤Ètj—ã ~G¯nÌÀ ʼnyÔn/†];HªWBœ~6j2àÖNö™«Ÿ°ž#›íµµµ(™œµ%ÀúÙIÓ?G)|¦ÒðÏX?k`ýÜAL7W^ß³×¹‡öï­X7:KÔÀâG1_aø_(_ºÊ Óù»˜gŒ –샗™7Ëä)Ë|e‘ö0îÕ–ÒÔ;3.ÍY¶)ÊPóg¸AÆQ¾1ˤµ°Wg–ùÊe8g\¯–ÌtX΢Ôûñ/‡GvnᚊkN8×a´ÆŒ¡}”Qåk¸…ÅvDÛÛj'ç<ñ®‡›^ºš=æ4Güé–ñ~•Ñ>Êeš?MGÆéøéÐÔDÇ9xÕ¹'ç:mk•%Úëp.‡¡{hÌög$"ÛŸÌö'‹ƒ+6È(FÿQ–-©2Ñ5ÈPôõc{§,¦…®Âêm9×î,&c¼ß©îg+ÉOéçiþ<õŸ§|H¨i=•àI/è)ßKHÒÎCý‰ÖI¸NJĻĊžvÑS1zzFOÙøÆ1Ù/,Ý£§€CQ” ¯‰ÐpœÂdÊ4l§0™\ å ±’øJQü?µ’ò5”hMEÑÇá³ ´Q^KR‹S6”-œ¶™œÊSÁ– CéQÔi‘P0Céˆ|òQÒ =mCqéÔœ#{­iLä`°[Üï5³5{±"¤`(Ó ’E+éåûd©UäCC‘/‰N5DçR×®}°œ%ʼ£òcׯÉpž®ŒQQÚAQÚASŸ”3ä˜IQŸ ×¹@ª ¥Û+bè½ Æ&Qf.Eù© ä>5K¦æ‡J¾cŠòqSÄ€<>Ã\e§Èv’=ÛQÔ•Ð 4´½„Y)IàÕ`pefu}ŸZ¤aã IÎ6ÑÉG•”íor,Í_ZÖ}Dñ†÷•È}ÕTnö˜¹ÏÖ›8§CHšÔ”+P)q—µ¨nE†}ë1‰'’W¾òÞ˜[TW¸-¸&lŠ„‰ƒŠ²oÜUˆn ·¢ðƒUÕ€LW3âêUTÒ¸¢â*Wˆëº,™ò+q=)Äõ³×Ô%©šˆkÖbò fuá64†W›7,J”ò“ç˜ú¼E…üÄX2õyeÝ>ŒØ~¢Ê¨–¶¦),„–z¯wÕnq'R†¦Åñ͈2…QG„È- °žšñõÕí/pœÇÔ­r=*Ø4E¤uP_ÔÁoÐ(ãÙp>w“1'fÒ± ;1óNÈÈ3õŠ‘ÞËš3+ÅŒK!SÌÐô¹)ftŠ™žb¨˜*fŒ ™¤b†©‡ÌS1#UÌT3XÅÌV!ãUÌ„õ!ë½,Z1ÓVÌÀ3sÅŒ]!“WÌðõù+f‹™Âb±˜Y,d{/+s5sl€ÊT4P‡øìÌò¹ÈB8¬¥ö¿k¶WF(³Šd!É2ª•Cù%ûo3£{ɬ3yzÝrŸÎÍ3²1ÆZs°çîü^nö¿ý!¯{Ì÷óÀÇüð1o¼ç“iæcòù’>$ªéëCRûêaÓè»8Hg—†û1{=Ž8`pð †#ØKê±Ê2M$¶è8Ш*5×Ìt<é*Š¥bÆ©~Om xÐÔÔ™Ž{±YŠ2¥pb§–¤ˆò3ªì!X]±ß!^26½ÜuìÛ¬:…£©€€ÖA,ïØçáqfÁ&¡Æ<JÓˆ¤ƒhÔQOS[䪰Ǧ´N=¨­€PDŒx"'²ýF¥È®)!—d¾Ë7ùMn TÁúów¯×Ãq?£Ø(³ Øl•/.ÁÅ®mÚ²â®/N<Ö5ç%üØÙ-®^ÜlÏ0LUýµS…ßKÄ25†ü1«cÈõ2@†¼![ä}:IÏ7²PÆÜ”!ceÈc²[†œ—!fȲf†\š6—à“ó1G§eî ù<³|zîÏ4æ ÙCïÓ‹jS‡¬¤ï¤-mŽÝ6NaOh#Q”;Î Ö<‹/˜j«¯©ñ(¸Îà j“öisÆÒ×"¨/ky¦{Aµà_?›šÈ^Pg,Anl§ŒG!–Sß™ÎS Ï?;ÖiabÇé}Å¥},í MèM≖„¶ª4!Ñ Éèms^× ºˆxçtƒ6bE†_ÓÌ Zÿ=Y €Z®¨xj¹‚Z˜Ø6­°¦A(8Õ {Bí´ù­ú(¼QÙ2üAœÿN½ÿ›Ù¯¿^uo²Úýù>Ïã@ò3§iUé£a¦iç•¥|Ó/@ä ­c6_ëÉ"ó+K`öahQ¦ÚhÚmb§ó^¯¼o¸¼«A ÷ºãá =%¶ïð ìõçéÃÅ–'^hÛ®K¨:ÔW>ÒˆøØdÍ ¢ÏïpzåvϲÇ;ÿžL³:ò7ÖùÑÝ)Ö±®A66]€À7X'&ÉÞ”›F<0乸*Ço—þ]¤¿²wGI³f]íýîû^w¿q=­w†_¢qè¾7¼¦€05Üw—§.ºÚ{Ý]ÜSugU˜‡ÝØîûÀÐDÓ:@MלP[ã5a+>\um¶R¯õGþÖºû‡ò¦sò8'-8 ÊԵƑ® ,«hŠ‚ì,[xê_ã˜È¶~¹ž«G.ãlY—LyvùÉFxóz>1D”OøUfØTzašž4GÌDš  &5àF愚¤Ü(Œ(cy=ØFa5IÁ€KÏ&‘Õ÷i8ÓhN†9Ât1Ã5Œ†¿á8”Ï:Üp}æüuF™Éï¥ù&Èë…a^0(b>Ú¿¿2®§iæ8K„ iÎüÊÇ—–ê;æ#Aî¯\Ÿ¹®¯ÜC`ùx¥©Øò#ó ‹m‚CM7´OÖbüÉþNSaÒP£âìÙ“&/Þ«ÒtƒúT˜îÍeŸçBŽxc6ðÙŸ… QîjÐaŒÃ*Kg?NÛòpHîÝ7ÜܬD“ ßQ‡[™~Ð43Â$¨ +ʦԂ~…g¡C6û Ä•©æªŽkëô=ê˜*³Lrõ±ÏÜÔÊð·ÔTýž—ÿaBÇ…mŸ:,*ƪpg™¥ÔB™l·Ó+ß õƒuC›½ÿ`½©^U84-&©ésà#o;#ÏßûÀ÷ó]À‡ßÌwâËnæ»ÌwHÈ«ît2fBËVó $úìã-f´~,-ùè®6s-ç6ë3„7çéëâd9 +Ö­ô8Yv•u3 Ng‘±÷1àì0œÇ–³uCù„nìÙÕË5‘XL†á²ÅüI©+ûÐÕÏîtéqº\ 6ØáV…±ŽYg UàG+i¾Ûˆ½jªöL“©[LŽÕf™·øUÎzri²<ßÔÓô€"y©ëbñ{zÄ.Rœêzx’G„&Q$#9é,ˆX²?‹0fÕ!"º­' vk«hѲÍÄ7q³ËN¼ÂüŒÈÁÌA€´Ó)éà.æ÷¸ؔ}2ЩãTæ×y<óza `dºŒx¾ÄI]„´ÓIu´Ó!«-W+ràÀô·Y²‘1¶!#‰mÓ“‡aME™ZžS¬ªù†p×ÓîAÝÖÂK"ÍÑ€YŠAx1ÌMÿZ6ÇaÙHÅEB-ŒÒ9Ç«¼9íiRÍF*ŽoÚ+¥êÓÞÜ0™“¶y.¸ºÌdG’€ÉiÍç·(jùï,æ2½>ë0“8ŒeNU²²é-Ó¡ZöÑèU•2qÖâSH4…Ú%tbçã¢ÊüÁ‰f‚ ¸coÕ™›§‹K¨õîú-,öæå¹¹ýÇÕÍ‹­móÆ8nKꛎŠö‚8ƒý¤Gu©êÞ‘\@T›'%%‰fJzä6-9C§ÓÔu‚0x$?¤â…‘8]ó½"í“®Upt¢«k-êôZ-U>U¹NÌhƒ¥¤9*Aõ1I\#e ÞÓ|ÇõBÓ¿ã3–©£ÂãÚ’t &ß8]wɽЭ÷"·sü„lKñ·êõÀø–Ñ6ƒuÕMÖ0úƒš#¼ïXQú3·gƱ²jµWJ^èßñ­äz/<†œ'M¼ëyw…aYã´UÒ:üÝÛJßûË‘h²ÔÈR>åP¾Lš SÞV'Ô‡û;“q:}&C~Í¢’E@ÇÖò¨ÖOpô¯jðØ÷Qi‡{ºlnÒg4X*\C`ÖY{<°¬É3?&Ø gÍ® ‡Á¤1ˆ+¯Œý)Å×1Œ]÷­Ü,£ RàkÀœP }Ân±{ŠpÖÀ)©&+t\$c´j³è?úía(E”AX4\(™£–E<¹}A&%Çú„²©-1‹½J³ª«·¾äX³­÷#¯ã O’¢¹N¡Ô¬B³ÿ&^ÇïâµÅ Ê9¡üÙ}²Y} ÿ(Ÿz1uŠinq Áýô)ç®`š7e׸Ì%²õó?NùdZky½eýÐBÅ*2ÛõË¿!ª¥Á3²ã1–Ñ¿5|æ¥nj¶k}Èõ•åyWvV§kóGþV»6Ÿ² ú¬.Ö}ðCåQ¿ÆlªÑ¼K‚G}ei~õ•‘iÈ^²Ðí÷XË—zª•}lí‘Å—EŽsÆÝ$½²ÔMOeŸ¡Ãë´É#³]@ì‹JáÊêòÞ‡­Ù"÷¸^÷<Âogøíœ÷¼Âo÷6¦íËLjݪà#ÅÝnÁ7}©d–3]‰Œeh¯³­rïð:] »ºMFg“G®ÞÝdݲv í<ŸøínжƒÍ質Ám_Ää8‚UêîeQd,³±˜kz‡¥{R­ ‚ÅLKX°„ä–ý‰+ë‰ë¥Tqc™ö÷À²¬ÞBÑ<ø3}R¡ä­ j,ÏK)H¬wèS ŒÉŸõg×Îxv–/¦P{Fg 7›ÿŒ,«Ùnz¤=ßa¹Þ|±PO5JùÚå#7<»Ú®äz5C²Ýò+˳¨I²ž÷ŽG=uˆœœeÔ\ÌÅ€tá÷™tÖÛL³ÅúÀK}4•ÕÄ;Òr†½ß;îGàù‡òéýÊûªÇhd™–v8ÿ5FŸ™¡=5H~ÆÈßzëž:ˆ5KYûÒ —pM ïëžÑæÊ+\¿Ç-s¼OçP‡G–÷¥â«ùô1ŸOù>3âdÍþ™‰®Îú½eçòˈݧ&k©‘_ÙöÂ-9£‹qm>ùe )ãí¼æ;ìëthæëº[¬¡y©Hâãygà¸<ñ·ÚF¯§ .ThÙ$Oç‘^Ù×à¢Ic]ét¡uÃ%0M§[µþÂ|íd|¹ÍÆ;¼+=pón˜‹wϺm`ˆëéi†Ø‚wßîþF»s#Ó+D5>]ȉµ4¯kºEi˜B”…&mÉâcågË—f³—/.vnü€ßh+O|Ý ‹6¥«mÆõãÛ Ä)1µª¾Ì¯x&GÈQR=‡ÈÜ,,î!ÊrÓ äžœù'®EÀÚĆÍ3‡í}0›Ícb/Î\qÖT>xAFà-[M&yÀoôý/®@e”-n0ðN¹~r;ÂðÈy‹h9Fòaò„±5á3™o1rç­¸ž±Ù‡°|§X%snˆÙkÕ݉UiÇ ˆªkÇó.¦¶JhÌ[,Ú»9?§%ÿÕøv1îÅpõÙ˜òØA.ËÐz "\»3 º*/ïðtáïœ ^y^w‡¥LjöãP‡½îú- .ó…Å´(RüÖÆ0²(#Í‚n8Û´Wmwº«Æ7¿Ã5p¼~¼2FX ì;øµÖ£ÝsàW ”A Q”9ÖÁÞms=°ÿ{EX$ Ýo(¥F°×UéÄ€Çf -IÚÇ7 /¸l»0ÐըɂÕ!J¢«$é±Ç!-=M… á":é‹¢‰ë©M(ÌZç¿Ñ®@Wcy}pA^ö1£«±î U ÖûGÎ6‚2g$UçΤ¿ÃZ¦L%ì^xúðÀÍO.8Z•aæW“Ó+f[2mïF´ ó5â´B-w64«äõ„°U«Œx&•œ¹¦¸áyŒWÊ#pâo´¿u¼º†-Ž›ó{ q†bxxEq^ä mýLóˆ’§+P«§»"¾žC>24FlÇd §Z:¾A(EqcØ·gœ6ý5öy—ˆ¼ç‚ú‡í:¶¿øüwL=XÔ=`±Ú±¾ܨ-û*üF{-FØø.¬+׉õ Ì`¯(-W)Äk»c}F”‹ýNc &7v±uE¬°3†pKÐJ®îGüFß^Ïé,Ò×jW<Ý3ƒ¦‹HQ–f˜L”„p㑜eú3–Q<™åG"RË`PÚà ×`%(žF‡{wnÅ™)ÈÔ¾<œS=ŒÕ®ñœÎ£9wÜ—+⺜Ù&d¶‰*$ MÆ ³}Ôÿ¸:ìÜ–sEù<Ë)Å9§ÃØ÷¯æ<ýzäþ6nùVç‚2Õ…~žlu³¯ÎÓ¯‡ÜŽqkε8çíœÆá±½L‰°><¼£{Fó2G ×g¯²ä(#Y±ñô2‘èØ¸{~ø„ë³×¡'¿¾m¿¾M¯C^‡ÆþC®^&t¸¦épù»‘ccdÆ1žÞ~bÜüý"3Žqñþ.e¸)¯qÏÓëPº×Mß—PfòºåµÞa)_] ÑW›»)ªò‹‡ˆFësŒ«šLù“ÖrŽqSÆ–º uS”òyÞÆ1>=ŒnÒ{þeµ¨ Gc¼weôeùD£}”‡—‰Ä¤ÆÛËd[)g/S¼c)c|)ã½(¯Pæö2á²k\¼ÌZ½ÌÚ¼Ì:¼L$07^¡Ì½n¹e/¿/nÌÆÝËGæãÐþ-´íßCû÷Ðþ§sûøUFû+£ý•ÑþdlùŒÑþÊhe´¿2ÚŸq2Æ|8=AÑÆhU+Bû+£ýMÝ(9ã»`JGÃßS7*§?/´¹)-gÌ9ÊhóéçÜÆhóW†¹Òí?]Òý_¹7ççr]KãÝŒ üQKrÆ÷B-=­;÷å<³3úçT«Õ:Œ3fãR17*cδ|µÅy†k–—)Þɇ³ßW"l­>¥yÝ Û„ìmR û$™}ë‡Ê> ÜïÙ&ó•1ràå×ìüÊ9prCíóúÊ©û+Ëz:ëõ²Å¡?PÅòœùZ+íΰVØôÙéš^ØO'‹ˆŠè™EÁX³eVøg0ñu…QŸ–ËGvþïjošTóyr <Þaü¶¿òºg1]0ê͸{™ÌìùÈÅ–6ãvÏh7eØ{Ö8ïÈFAeÆÈØ¡h}Ra —?e8ï*c£­\ýYÄ ?3}L)Ø)kFÎ]œ§_ƒï¦1Ü•áÈ`Yu×=ÃL2~*ã›n<½|¬íá#¥\½Lú{)go„l•YÓy6çQœÙþê/5¬áv¾/ËeWŒWwžÅ¹o{¿\Ï׿\²s:}†ëy‹ƒãûõõ¼1߯¯çCÜü.?ézÞï—.‘XÏc)Ëh Ó³²¬ç5’²ÐÆy:ËZN¹c¼ìòÂxÆÕ}쎽d¾#^Cïæ†ïCWF ¦•_¶(eø`­à•¡ë ôI[Wƽô»gWF›¨Rbd¼SPì6Ïdžó*£ÿ¨#ú•2Ì\ªˆ?-õò†¤r;s&ŒñNï¿U/ïà3ë•‹Íá°Œeá[<½./\·s >…)¿Ã8IuŸ+Ï¢1–/¬:×hÿ65÷•=ü|«×| ÏøÀÞÎÌ8\Ï5œOûЇA³¹¬sFýÈ#0lü¢YÞa&pg™ÏÎqùdÌW®çý² .-üý…ÕyÍ}•×+»êd†ö0çÔ^^Œ‹Rœõží7Ÿ£”Ñsåzú ÔmÍèƒ~ÎÉG†¿cñ¹N³÷Â徯Æ;j*­€úë¤{"×P7´ƒ2æa2ö;ÆÓ¯A†M=–@âMcŽ©ùz8û5j'cáQGãI!Ù=N(mñ.Sꄬá±ÍÛŠ<õï˜ÿÛ+ãÛÁ2Qãé×¼°–IŸæêÜÂßµnÕs¸¸rKþ\uíwØÛS¹„kÒ3k™)Ü+…:¼ÃÉŸE#oNã×z‡“ó,Σ½2i”á\¦åËÚ>W–k’–¹œqÖ§×àtŽíñ‰B¹¨=6øA(Ïx>ŠüÙ™Œ"ŽSsâÆ‡Ôæ\ø‚gVÜpi¥"H9Qˆ¯›ï,pë3Â â(ígÏ8nq>㲕‚"tBÊ<°×Äz+²uî7Æ›g¹ÄüŒg¦§K3DâÍÎõ‚Ñ×JKªÄIÀzúï>RÄGÚÏNëžIÑÖÙþ@ŽT—1.Ù®Hä¾¾Æ:”}ù€$<ºDºaS‹Ù^—]tòæçú†“³ºrb™¬Ò/ÜÏ2ÓŒ.èÀÍåÉãõZ§QÅÇž1ò:=…GîÆÅÛ*·ô5îKàôÊù´›rvf»=r±ÞFuXmÃÜÆ;¼oÿ-¦ -ó…UU—SKößÚ3¡­VvÞg "óßW¸.ävúØ «‹A·[YÕªxžå'Ý:Œ}iùÊZf ÷*¡/l »áYJxÆÈ¡Ÿà¸Éxz+ûx >qñûîó12N¯ÜlÒ¡kÌá®yáí\×®ÆGw ãúû¶Ryú5=½0¾9ÊÙ™ux—»³fr'Wö`Óòÿq÷溶$Éz¦žOqÄ¢À¤ÏƒÚ[ ÐZiW Áá°‘[i¥_ŸËþßÜÌbE¬Sy«ŠèÆ&pYßÙéËÃÃÃGéªQÙL•ÊþWõË•¡2âo¡=ܼ̅‡‰– T@úއ×v±7XE x®µáXógçÓ‡9ôm`Š1Ü„çp ßcþ‰ÝGš¬Ï%g¦óWÅ{ÊóÎ0ñ'gMÁIÅ–†ÿ°‹6KíØ\-/£ó%2ê<\óüë7%çÀåÎÃÔX÷4„ÖI qeˆðµ\ÝÓÔÍcõ•Û¢AP%²8ôÄèµc‡+ˆñ´:³‡t`¢q²>ɳýÕÕ‰W†Jg|àygWæ …yŽªC˜¿…:Hë'÷;7o3T—!ÓL@ß12¾©žÍ¶÷Ryîó£~ž‘ ¥XW7m?\hô[?°z…¸ÊByÝæ ‡kàñÌ0CPÞ^ž!8žxø¸%S¦hÝÈÒÇxáïz¾]ίv×ð÷Òœ_ÿóÀ›Õ—•õâÁîe›4[²¥9XŠ!êŠ;æÁeeE…p°/C¯Wda_kÙÁdeåâ}p¡,]¸“!ë¶nX½lÞ†i TÑœáèeâØ†}6/[½lö²iì»®lˆGì^¶yÙêe³—õz›×+~>½^Ér°Y#[õ²Ù^>"–U ¤ã<8­€D¶=Øìs‹¡ÓAÕ¿[Ù6ÊÊO8×çŠÝ @N-SÜù´iÎÐý@ä¨~Çéew>Ó´±2`±M§µü„ÝfwؤóÔêEjx0û_«•íPá.С»a·EL±;Ö7ÄÏk0S±Nk©üŽ—ªÃûç"HK7$Ôi3§,ìiDl Õ]µÞ‘êlÔ‹ |Û+½£™€µeÇÕ¶le8­ÏÞ½Ó†4Ý1YÙå?ƒ²6¢‡Ÿb:§^¾¿!úŒˆí¡º±Ô'Ä1 ÖšðˆdÀJË¡ ´šöŒc¿£YÈðg8É4·¹ H Jx Ù¸"6?"Ìèpþ¹`9o¬˜¬@™oC"c‰M]aŽvt ˆ.É윇«.Wz|Žˆù6·ÄãÂíjG¹ˆCŸMõý  #üðË¢2Üñ'Û‹£=^îÕ˜ouZ”5¥EGÁ"1³£Ðå q>ã·€õ ¦He@¯ú†ÉÌ ›“·&3ü ˆ;%‡=®”´ÄS¬ïh¦¼Öñ¯Ë (#â¾ÉqFK¬l¬õ 1~1Œø´Æ…ŸcDÌ!3€U cÐx…ÆÄ6¢.˜­ÞbFb¼diÜ3;ç–dV‹rÂ×m&s7¥Í™¬àª‚”¡©ÆïâC¼¡l(];ûbCÑ0‡²¡ zäI|؂݉öÓ·!ö"6áN/°ÖÁŠ×$f+Ëm‘ˆ# OÄFüàh†¬¸öÁ–¬¬Ì‹ƒeV/Û‹áè†ÓËbGÜ/¬,wHb±FŠ#ÊA|‰ÃÙ§—E¯£N6Dœ»‰¬ؼl÷²ÃËb<Y¯ ‚Éz8GË6ä×âPFó ‚‰Ü 1& ç>"Nƒƒgålˆ“îðsõðÓöð38¤B<™3° ÎëDœÚˆ8Ë1„z[†#r¬S-1ϨFÌwcŒ4å2œ1&4¿Å£Ç•qèSfÃUÉ—œ1”»IµKê*!nÎ8È+ãÞ Žmܹ°~•îøÔ–UÇSS¥£8³{Èìòöò7<^àTT®Ó¹'gÌr•8rQQ#¶eÌ ©œ½|CÿÓ “sR“]³]ÓRó0ß›9acf6sÚ4FÿSjÂÉ©ŒY¯Œé©ŒyDæUÆ UÆTjj”Sœñ}•1›”g(¿Q^Bú3ã[/é™q÷UÆPáï|GrhÓ’Q¦c\)ã»?0ë'³~=³~n2X)”Ùf2ÛLnÓy”gÆ;9 ­|áWÆÓÀÀcdŽ12æµ2Ç™í's €3Ç«©2.HÊÍŸ›»×™‡×™W¨s{%y¥x™Rë37¯Òý½Ê´¾*euçmߥˆ°qñ2œã<ðTÿ¾¥úø)¼p+o{¥qâPÓ8VÉÅæTáuÿlž ”—Íý+cí¢ƒ=ËÓ¬aý†³Ðàx±|wg­ C¢†®ÐÐëXix̳܅«ÅF* q_ôY '5ïŒ4,C+§l%ô#ØLß‹ÑY!)u¨n°R*‡é˜ãž¡ŽapŠV'4)ÓÔAN JŠ;ÈÍ\ï,– ™uÂp*«ÓüVÛUIùÀ,/F–ƒaÄ®Œ2¬κ緢]d^mègL¾ÚßÏX=&ÿÔ Gâøu˜:92åþ•gøqg—§×á&è¼'iF¤Ó\LS@¸á«IðÕäÙ—Öqµ†m¿³Êa{Tç ·Ç¥æâ†žRß·®^æÂÍëœáY`mç÷'£ÛxŸ_ù›F=ab%Qi}ýF¯}µæ†GãQÂês=0Ô¦TKyPGª“´›XUZA½ˆ…CÕ‚3S½—«if Üö¯˜P˜=ôå¬Ñ.óe¶ÿÖúÿÊßu¸å£YýY±!–) b—èýhçÞùÅóQÃg\ÂI®yN赅 )©Ùî,ŒúvVmØ…ÝaƒÖIª%Ã*¹æ³i§Óp§XTXk‘ŸPµR®µÆ{=qv‡¥\ÂÐ šíÀßt¸1‹K–¦{š‡Éæj«9D_Ô„c¿ÆvËä’›ÁÛóG:„б?b9¦´¸dþ³l~*¬gëÙÙ=éG÷VÇžÎ8±—¿à7ýÒê½ßå¨T ò.ñ\ ]à¡Q*TòyeSãÒ¡²ãR Wà!ðÊ8îð·0‹cä…Âèí³=Ø[´=ä~cHÀ•éÑÎ0½áäÊÝä0©Ð8±0—`ÐB9lV§þiRõïÓûíÂfz õ ½Ü¡ÏÇ;«Y‡ …×9bî{§Í‘]dÍè Eن핗 ˜h\_D[ÐX»ˆrrú'2LV•é­DfŸ“q6ÑÌ?®gbDÎe\œUMñÆÛÆI¦9Û‰‰—ˆ+oç:œÑÎ'žÞŒzÚÂß×Ç9¾—ìÞ€EÏ5w†Èÿpr.õ»Š€¦(œ_ü­ŽÏ;7{wÍbDóͬªOåÝ%ÏêÌì4éiR¤œ‡3Ú ÜÌë[#€(#‹òjÎÛi…‘ÈŒ,@†B’Qr¨áS!Ë…G(¹{‘ÑÉnfS¯Ëfˆ&ƒ‹¸œvÙ×s~g”ž—ù.'ºM1ï»B“L†ƒh>{~`¾W ÑvÑéDä Ìòl3¢Å)§ýåÒMÁ# )#jÕÃ{‡ï‹uþ0¼§(è¸ò e–×ó‰á“÷ˆ¬ ƒü†oHµñFSôRºù4\™.:&38ç‡ß.ó,4}b˜´³ Ûí4SÙ76sÝR˜ù*[ûuþ¦Ç¥Ž^x-ƒ_¿1¬ ÓªÐû' 4z ˆÓ°È , Y˜é´¼!7¨v¬íL±¼#~Vß±Zs9€`FÖñ†XèÕª«óCÇyº´7¤íd³¦Þ4CœÞ°žu¶{ˆmëß ~ÓÁo¸,H*`º[Q³Kú‰Ê wv/eõ^SΖ{àvgwaá³èþÂ6¤?Ãå—L/ÍM®æÕL¿¿˜þ7¤>m û”*›Â{Ež¡¶ Õqoÿ×À%pº³ùåe¦`Ѭ†Ã¥òóŸçn^š»¸Gëæ¾¿ÿM¼bnÜ3WÝVÔ- áMæ¸V…]µ1sá0–p>¼Ì ŽÑYÏ—ÀÙY3g^ØÏ)Ù·€…¤öÿ/8ÿ .g|j„JžÓ˜˜6&©}àl¾´‡Ë‹·Ùݳ`ècïxcí«Ì8zú02¢N({„…’Føíj¿`ÍàŠ´}…ß÷Gmç…áf7k=®Àz`ö'æ,ïbÊåÆË<ä5B7ÏÀ‰^èó圼=ˆ¨ï’9Æú1§3RÈ~©}xaìÈÕÄç;Âã‘Gàí<ë6×á’±­e½×›ÿì•éúéõŸ~ðˆWf”aÞ‹Aàð²oqe¿Ë(³~~÷tgŸ¿yÙˈ«ç#ïpžOÝóèKà¸}bŒ½Ë˜;ìë·þŽwÖ{Mw¥îGµAQ”€VŒŒ6«Ì>6NCñªŒ¨ʈz Œ¨ dŽyååÏe]eDjPFÔ]eDwÕ|IÙß‘k#u\ðÁ>¼’3"Þ2:$£+3j¶îYË™QžÉ\‡±O1*±2#AÜÑ“•i‚\ì{iÄdú±C4•>p?ë#îÈ/ÛÝš#3×ßawùµ³ß•¿éQw,wõõÛài_: T¨HaŠQÍ.e8“]díI Û3–#€fdRúÞð6Õߛথ#¢œÉøbæ]&UŒÝ7Ú€ý’i±l2Yc@úrÒ˜²b™H8b±ðXÌ‘Š»õıCí5 –¦Ýº]È©P•bÒ šÀt,“sÚ¸à7mã Iƒ")±•7„ßTÛs3|ïïh^‹‰A_¦a‡pæ‚íˆkYþMEJyÇe$ògû‡º-Dl潌S1ÍG4OÄf¡Ôw1äï áYhÁ[h…¾èç2Þqñ3ÖXC;Ž8-ç¢Ñ “•ùïMËœ@ô_ŒšÞŽÉ˜3+[([F¯e{#â¢^úñJ¯kDäýŽÓ tÇf•ݰ;¶_à<’j¶A›ŽuCsN^Ùœ[–G8˜¬ûæ¶þEí;NG ZboXϘœšÏ³œÒ@.b3 "CC„”æôvˆHb.P`ñ.¦3» 9?ÏjN(¶½£4½%{DåÏÐ;å ³áØ†tÌgÌgÆ"ô¿#ÀŽšÃ¸†xÆ_y¾£­%yG_F„e^ĈÅ+ƒ"«{·Åæ‚û,mlN£Ë€¹ÁGÄ#ˆè¾JWsªô2ÃŽ>£/ -%ŸùŒõˆ Ÿ y(äÖ›…‡ò~C:ù ’92y#K±š4{‡ˆE—ˆ%ˆÈxžÉÜ¡9ˆÅ*ãقح2S&.sÆžî[ÍYHÌVÙªVÙjV£X1¸pMZ hÁåuD"`E¬ˆD pb3çBdRœVãÓos‡0ÎÕ¹çñº~Å3ðÜï ­ž:³›aNÍ 0qÓ8õ‘C ¶³Çð³É}ÿ‚ßì“~q&:H•1‘Ìš³¸÷3™:§2OÕ|Cf‚’:‘„ƒö´VÙß߸§MAóuÑà½Î³â„¨« ‚~Í´5YW\.tðõÄ6àvY¯;>+3Üë­=!­±ØB†;©zÔ-åSPI=ꬾñ‡·„Á_—ŒÂ!ÏpÈ>r?'-Æ5 wI1x—ÛÌœ"Òp8ìÖȼĚŸ_›>#ÿ`l=f@þÆŸm&µü‚ßã¹h§¿qÑŽ7ñp?ÿpwÌf«h¾à·îéIáØÅ5”“mbµ±ÚNGoö13'i>¢ðŬî7ôèу‘ Ë pdÜâöjŸÒ†x.å ¡æ~BKˆ–q¼@0ówã>*)äÄ8ˆG”7„*HÛЬ½{."£Zòþf½ƒÉг?"$˜¸\M3˜Á©˜:« 6GSjMˆ­ÊzÃeéŠÃ笻!YoLáûœã£„‘h›õõÜi¿!ãÞ2bì8ŸPõÑùሃ;: –4Øm;ãá‚Ãq:î' ‘sC<]²bïÆˆ¼!NoˆÞbú†H¿ÿ÷Sˆàká^øSb*K-<«âô¿ÿkó¿2{Ðe«ôŸb©ù„HH¤ä¿ž¯®èÙê +QdüírFž"2¶›RÝmˆ¼D·Ñ³Õð‚ßxùìœJ·U8ûêžLñ°oSÍtרôaƈ©ÚVÓõÒž0;&ÓN¶ýˆX}ƒâ¬3ÕÚ´Åð‚ű;Î'äúÅ6˜6¿s¾a÷Õ~æ òmîŶ+tÉš©bįz"RèÚ|A[;­Š’c{DÔKk¤å¸ßpXGÁðK·×d/Ä£è >›A/Ð%8$cUCGE¬fMË}ƃQñÇ6³¢ÁÉ€³ŸY£õè0;ú¡†•Ýp:Çþ€ßx!à ^ÒšÎluðò ¯ý†ÌŽÂñ= á!yÇm•a¿ã#0tÖ¯pý¿ñW©SÍŽ¿~£c0î6ðSæEµÒ'g¼!¦9CEyš µßoÈü`”<Án”A·H…S!îTˆFå1ªBäªÏ*D¹zƒ…c+t Íu° >Æ ˆåƒH'|*k†§û.øÇ‹¹úŠQ°Bl¬Á³ŠyÒ1FŽËÌü«£ó•C|+Ž8óF¥ ;ŸѶ… ÚΈ¢L\18$=ÀÍéKîä8Ô‹ùœœÇYö#>sv"õÑ^°eõL8·YŽ0Š‘öK@ÌÝbžë±&ÛaÇÍq"N3Øin£ÓFzÂf§¬V¼l¶3]D¦/"ÚöØR{@F¶à œÃ `µŠˆ›T§˜ÆÌœÍ–;jàñ.YeÌÌôGtæe§¼œ(ÅÆM„» w"„DÜC(LV€ç`b†ÌPO…_yÂáe™¸­ÀLÖ²™­e³Úƒ'û«iè)ê§g¨§ÙÓäz+°ª`rt\D™£4"3£ãöÉ~xÇle5k<°yî†= ®ÃŠÛ B°1[L¦ }Õaj® Y“òϼm´0sŤ:ö õ£—2'‚Ô©þõh¼ú×£õŒ¦0 “qŠ®,õ3tÜ3§%Óä¯Î£§•ñ”[(SC\M•“—I¸í+//“àÃ=”ÁU.ó‡2pCSÆ´¿1Ò¸(N+½»À›XÊú Á|e2­F _ šèF±yâ²@Æ)J³–˜Ó ÀNbVš’%CªÕ€Å d+Û-Åe&%nW1k‰˜ËÄê²HV€÷jâ´íe$B/€‹K5ç E¶·Ú‰;"—Íjdj¹ÄVÆ HܶÑ©8¸¶£C6J¸F„Û(ìQ‰0C¾ã°ÊF³G`‘ææ°ÛHgP¡Fu¨Í_†‚!SñÄ⾓ÕLÂI8µ–Z/ÈÌò@nSè1G}Œ©!¤ŸsÄ~ŽáŠ0º…àvÅË9aÙaˆKßåúŽ0¼Dš×>D* ¡LC€Óöô1.j8—בE´Lz0Žÿ|‚å¾$gÖþ}¿þ_—ÍjûË_®ÿúãõ«û_¨á¿¸UY̼¯¿#f^þoï9&ß7¾ ä¦qJ¿$râDÂûC‚"¾ð$1üQ2£E¬?àð/Ø~àe_]–é±P‚ë)Jl½¬®%(@ïŠeXQ€Aäš¡4'sÈJóLG•Õ 7 `çdX¤‘ú ÄHÌ4‹À[T.@Ãp¡ÿÅP†Œ¢D·Ë !ÞŠaï†úJ`;E‰HÁÇÁb$sðA‰¨8¼Àlçir&U”3éÁlFñ“ox•Šc./°­w™@±¤Ó}“²‘´.L§«#Nûb[¯_HŠ¢Õ8XìÃ"¥"¾ý€ñ°ÐDô“á¥d(¡MK7¬6äÄ˜í ÆC9Ú‹ƒEUx2Æ}B+—á\·sÇÓiý„‰¢<§óFx8LÕ9g 9úîIŠ3ãŽyˆÃ°øKÐÑØtš®*5g h©Wâ<cL+cPkü- eeŒeeŒÍtž†söòóZ3 cb?pΘæ'czqÞ݉//Õ›×Ù:ú‹»ú1•±;Ve,%Ê“Êm9cT*cX*¯Pçö6ŒìmÅÛ0ª×9º·a oØކ±¼Î™¼ ØäoÃl^çì^ç¡<ÖlÍpÌñC?\Ž2ƧrÙÎ?ê_ܱÊ(c™Qæøáþ¼Î½ »zvó6lì ܇.ÌñCæø!sü¨ÿét.ɹçÊ÷P~†òËÚ_Z9§å\²sõò¹…òݾ;|úŒWsÞ6ž‹Ä4.Ź6g¬ËÊÿô;ãø'³~2Ç?ωÿäbkBAr•Ãÿ䑜±Ü+¯P~{ù–½|+^¾…ú[¨¿q~éÑ·9¯á¼ý#÷”×ÀýWÌÃÇd œï,Áiy,ï´«‡|4õpáñÎù—Œú§Þ–ý=ªÿÇxç’ 8ðÇD ãwiŒî_øÝ—óìÎÃË3à0oLøŸÌúɹ:'/¯I4.ÊpfýC&;×P¾„òL@N^>‡úó´(õÞè_¹nçÊçP>yù´¼| õ§P¿¢'‡úS¨?…úS²ò°¼7Fge¾Vî¡| åK(ïõÃôðÂøQõ¯Pÿêö- ë7f^rîÎ̶žÛËÏéåçðò3Ô?Cý³,çlé ƒøðØÉy.çáåGå›%YÈš§ÌúÉž}AƒÉ+O/ß=…ƒ¥Wö„¯óÆvΡ|²Ô¯³JvžÛÙSOäæ)2óB1Öl+Û9gÖÏð¾;àä¼vàùÌHv0ôŒ—‘¬lèY±=3SMè9sÎÏÌq³+×=Ç&g®c<—êŒô' ãp^^†‰¦ž½‡3‚œ?0úyúyþ0Æ¡DE*OÛ Ä6Fû•Ñ~åÊ@=‚iôˆHµADhMpVRDú8bõHìAĘ€†e¡«‰ÑDLH"e¯b¹%b5ŸÇ3ïŽL£G•F2î˜ ùDÔ°Þ°™HƒPˆˆäOä»ÑS(N+ËÅ€ˆ¹DÄRCÄJ æ×öà‘ìÁ}Ye}Úƒû°÷nîÕ*ëÅܳ=˜ùÚ&•zV¶M{pöàÖìÁܺ‰HB%;*Àº­×+2g5D¾føjöa™gXìkVDž8)2µaÄtDd1 B¥qþlL2-ÂÔh$3ŒÞ=Î8}âqm\V€ËcIžß¨Ø:WZzÄüˆÉ’Â!És,…ÌKR3ÅÜM!£ÓsʧüVàèç æ©àöÈœ:ó}?o¡¬ï†íl§ˆ§µ° ~7IªØRô¢Ç/áæw¬ÍŒ§Ò‹Ì'Ö2ù ÙÃéÎÉ9ïÀëÛž¦¿ý[l™¦J÷DIÊmßYÞ‘‰,øÜ¢ÏEnKþf%[ï+û8Á–J½CD†×âIÏSN,xëkiQìJƒ"û¹Á˜Zë¿0Â;ð~ãqðKclž~ãj–¢…‰ú’ÞSaæ Jf¾ÔóŒÏ #MÊÑ`ÜT“–¬À2å$»€MA*wnžLCàaÄÝÑÄþ[(ÙÿÊógÔ¿sxîS‚‘ýÃ’Ää$—¤%Þo—$'!ùILŠrM–²ü{}J´“±Ä$-Ÿ¹Äd/1 ̧D1—d2ûxº~ND“ÕÄ$61¹MLzó)1NLž“êÄd;1 OLÎ’öÄd>—$?1ùOL “Å$B!¹PL:tIF“ÅäE1©Ñ§ÄG19RHš“)]’,ÅäK1)SLÖ“8ÅäN!éSLuI“GŤR1ÙTLB“SyÒª˜ÌêšäêS"¬˜,+&ъɵBÒ­˜Œë’¤+&ïú”à+&‹ÉÁBÒ°˜Lì’d,&‹IÉb²²Žrö’Tí’l-&a‹ÉÙbÒ¶˜Ì-&y ÉßbR¸K²¸˜D.&—‹Içb2º˜¤.$¯‹Ií.Éîb¼˜/&Í‹Éôb’½|/&å»$ë‹Iübr¿˜ô/& IcòÀKRÁ˜l0&!ŒÉ cÒ˜Ì0$9ü”1Çd‰1‰bL®“.ÆdŒ!IcLÞxIê“=~J“FÆd’1ɤ'Ÿ 9)c¦Ê¿2dµ ¹.CLÏ‹²eÆš!³fÈ·²p†Üœ!c§çñ Ù=?¤ÿ ùACÖÐK4d yG]r”ÆÌ¥!ŸiÈrrŸ†Œ¨!OªgO 9Uc¦Õ5de ¹ZC××Õ³½ñxÌ òņ,²!·lÈ8òÐzvÚ³6f² ùmCÖÛ 7dÈ ys=›nȱ3ï>§æ ¹{CFß)Ÿo¼·ãp}öKõó­;^ËÃeýù6ï×ý ˆ¢ 0b„ \"‡ ˆpñDZDQFp±G†Iœ¸8%Y¢è%d‚˜&o‚HÇ=Aü…BATHA¬„MAå‚© ®ŠB¬ Ú ¯  ± 2sAZ¯E¡[Åݳ/ˆø‚àïY2D‡.P|–8F‘dTñejQ§ @ƒX4 Kƒ5Vƒ¸5aƒhÖ¶QŽ{•ïF¹o”G9q”¹r”7_äÐQ>ýI†åÜQþåâA^åèùz”»Gy|”ÓGùý'ÐDýÀGBÔ3DýCÔK|Ò]DýFÔ{|ÐDýÉE¯õ-Qõ3Qoõ9AÏõ?½PÔE=RÔ/E½SÔG=UÔ_]ôZQßõ`Q?õfQŸôlQÿvÑËE}]ÔãEý^ÔûE}`ÐFýáE¯õQõ“Qoõ™AÏõŸ½hÔ—F=jÔ¯F½kÔÇF=°×ÕëF}oÔGýpÔG}r¨?êŸ/z騯Žzì¨ßŽzï¨zø ?¿èÕ£¾=êá£~>êí£>?Ôõÿ»€h/í¢}A´;ˆöÁN!Ú/\좽Ã'›ˆh7í)þY6Áî#Úƒü)û‘‹½É'›”`·íY>Ú¼D»˜h/óɦ¦>Úã|²Ù¹ØõD{Ÿh탢ÝP´' vFÑþèb—í•¢S´oŠvOÑ*ØIEû©‹]U´·ŠvXÑ>+ÚmE{®`çí¿.vaÑ^,Ú‘Eû²hwíÑ‚Z´_»ØµE{·híã¢Ý\´§s;»hwµË‹özŸlú¢Ý_´Œv‚Á~0Ú^ì £b´OŒv‹Ñž1Ú9ûÇhy±—Œv”Ѿ2Ú]F{Ìh§ì7£]çÅÞ3ÚFûÐh7íIƒi´?½Ø¥F{ÕhÇí[£Ýk´‡ v²Ñ~öbWím£n´Ïv»Ñž7ØùFûß‹]p´ŽvÄŸl£=r´SöËÑ®ùbïí £}t´›ŽöÔÑÎ:Ø_G»ì‹½v´ãŽöÝÑî;ÚƒG;ñ`?íÊ/öæÑ=Ú§G»õhÏíÜÝþ=˜ÅGcù`B 냹}0¦ùn°Ìø£q0ùŽÁ= 8 ¸+Ap0ˆnÁáÙ[!¸3'‡àúàÁM":O—ŠàhÜ/‚SFpÕpŽàÖ=‚ Hp î"Á‰Ä]K‚ÃItCyöS Ž,Á½%8½Ww n3Ñ™&¸ØÇ›àŽœtÜu'8ôD7Ÿàü\‚‚£Pp NEîj¢[Ò³ßRtl îNþPÁa*¸Q=Ú@\Œ$‚éijmE6¬~«^YD¿ããÊKi$ÖøG0Ù»aYcj)âxB®8T¶A>%òñÝx÷ÂÑë¢üŒRô€QÌQqÆëFŸfK•黎wåÃÛ丷üwÊ’U*m é&õϘ"ÀŠÙMÿPÌy-*ö'"¶­ÉØÉË >dŠØr¸Q(+áqf´ƒ€X™‰“D Z"–w OÖDlÄbî˜ÇDÌn"æ<+q[#G²×yâÃqüc0[œ:‰8Œ—õÙÀÑrP,¸ qÐE¯Oœ¯‰XÚ†Iý²æèpDW±®±Úãs ûòÜ/0¸‹11`¸ã±þ2·9v'"ö,b±!Çý ‘»«F*wH¢_ÝN•± tq0œ1&”1(8 ¸+c{WƸÐ8Êʘ"ʘ#Tgñ¸¡Œcˆ2Ž'ªFÃJæqFÇe,Ê{œñ<.)cô)c*cüébHuiÊX畱Œ<0ŽT9òx¨Œc£2Ž“d3•‹—ç±Tó¾«ÕÛvÆñVãQÛ™ÇdelzÊ“]—ÁíŒQ©Œa©Œq©¼½<ùʚʛʜTó¡Œá©ŒñIæuD+¬2/TSóZ£Œñ£ŒUKË–2Æ™×)eŒOªÍyýRÆøQÆøQÆ*®ŒåKã‡*}^•1~”1~”1fh>Àëæcü(cü(cüÐL&aüÐ4&ᦌñ£Œñ£Œñ£Œñ£Œñ£Œñ£iÂ1~”‹×‰ÀáæmàéDãGy…:··¡do,WW¯âºÃÃë,ÓÛP8~h„ ú˜5gŽ2Ç™ãGÝ„†3ÖŸ¦¦aÙ¸qüÐlŠã‡ŒõG¹Ù9¤èÑVÅH8Ъ¨)9ó<\¿Ô¼ñÂ3ð Œ#nûÀj&™çÜ£~5ÉôràohUkvË_¿6l¾ÙCÃ6†šd9Éÿ@ MLÓÇ0Yy4ßa=YX Rx õžü¡iœäb¡QÒ>…ÒðX1Çsˆá"{|ýbƒ„ˆ!!EBÌ‘‰$Ä' QKB,pâžÄh(!FJˆœâ©„(+!öÊsp–½%Äty ú¢ÂÄX1Ád<ÚLˆA#Ó„x5!ŠMˆm"Þ„88'Ä̉‘tB|u'Äâ zTˆbIíê9Õ5PUùA®b ¬ +ΊµB ­€ë˜+슼b€¯øëCp0ä?=ê/ÕÛVº¿o™þ.egÞ^¿Øò/Í'CnÛ9´¿†öÓ– îÃá[´âuÂæ~2Wfã2bvÆœKd~w³§4Fè9åâuöÊ÷PËò åaNÖÙªRoƒÎWr å»·I¯P~{fò60è¿rõ:ìO¹{îOy…:··a%oÃ*^~Uÿ ¡®Üýû"*ýáå㩪”wöïæ.\7Œ9æyèÆ† <«óÎ{?1óhs©zíïÝ™ãG%~ÙyØB “ c_ŒKNՙ˛®C~_ìÕ ¨ÌïKæš@fÿ«ÍúræœU÷æÜÐ6ú¶äÌþQŸ÷áÌ>ᙄ}BfŸÜ냆Y»¨ÿ ‚2¦vgiO,ˆþ{üL¤Ÿ/Ê…á¯B9l…¿J³6<±´yìjïrXÞñ°¼ûaé“ÃÒW‡ùÜj}«õ£Ï•ñ-//ƒow¸‡2­8—íœÑ¶ncFcéðœÖ{‡{vf¿ ÇÙ'ÓÆüaöÉ´ùr¸£Ìâüε:—ôÌÉË#«çáþ>Êù¾ˆ l\Ë3—ꜻsšŒ4z‡çvþÛÙ³s ¿ ωâá±ý·cù{!ùááÞ>p ì}5ÚþÛ\—POþÀ)”ßb¤úÈÈ·xx†¿‡1€ ÿ:6zññÓù-È)‹°Êx†¿÷þÌÍÇg õ7Î Õ×VcB><½Œ¨…ŒÙϪ—Î¥9g/#º!ãåeÊÌÎ}9·P†c•œ½m8S)çíeòô2y„2ÝÛ/r†Ó¢{2Î>OsèóÈbca<ü·©yߦZ>pvß"•õ·9‡òÉêDv˜´íµÇ{Èîöž»Ú°˜m@‹1­âÚ6íÂJ¤ °ÙÏVõŸùʶ|2Ím?äÁa?›>Éq1ºc¶•e&[pߘÚ«aôú„Õ<Š=xdûYç‚\þ×amè¾v_»¯qogHs\Jˆ8w2º9Ž»Dœ‚5Oëlö g†DM/ްÇiž ˆc>Ó×»œÞe!0ݱzGœ4)}À¡ F’P†4–!¹åsöKxäR&ô#<3Ñ×y[¼hÈE˜ÙÆ~/ÃR0fn¢ÜpŸ°õ…9ê">uŽÈôŒ(&¼É–r± ÅkRÏãÝ,F^šš7#}íñÇiÍ„,ónFÙ©}‘gQÐ)Í{Å 3«%ñX’þAÝkÒ{W@÷ŒkîÈõ! „eußQ>ÉôYR…æÊ8êU׎÷1w¹u¢à¼óÒò6c‡7Î'µ†rÎmß¹Ÿ¾P}i`ß\§çß½r³GÎÛ9õG¦Ç½òôòço|ÚÓ¼¯0Ùr¹3²˜é»¬ÀÃË8ÃáeY¾.iBrrÀ„ô1iAHe„´!‚§H‰b:…d!¤^ Bš†¼á1»CHÿ’B>ä‰IBBêÇÜ"!ùˆ§$yÎYrOj’­9÷´(!YJH¡ò˜c%$a ©Yžs·|Èóò˜&$ ©dB‚™v&$£ )jžsؤfËž‡éêÍí9"4DØÕw9)Й1GÿúŽ8C È S0ëzzGiÃ25ËædÈ%"^¨'{ÍJ¿ÄǼK11“§kzÎç>y¨ç‡èõnŽj™o~„DÔK„·8ïD)íg.ͦãÊðxUáï«8³~Ü×2#¹=0¦ôœO™×b±Þ9!›2î’ÊØž8”ÐaDÙúȪ±ÇÚ5÷;—³ßé³Fñ64ý­l!eß›ˆ2Þ‹,&zÆe}`ÔßÈÒC=zÊÙiŸ˜ýŒvÎÀûÎóì9ÃjépóßÞyܹ{.<½Í0z¢)$4fç#À˹¤úË9å’\v‘¹ÁŽ;¯sšy1Þ½‡}ë+¯³+Ñ|YÇ-´…ûh㛲΂ñ¬QpXÔˆFîÖ'ç$º@œ3kùÀ9pr.ûÆ%ô•È×þQfN^F=×"£ÎÃÍ9¯ ¦–—3úvË®=1Û€9#]á³³š•#ûpO7Æ=Ab[eÈ”åü™»³>—<ï,ÏZlÿ2£>òÎjÚ¾ü›^xžƒ-qxØ¥FK¥¸WçìÆç/sa‹:˜ ï¸ô6ý-.&ëÎÓ¿é^þí "Ðïrçì|úp‡¾u†6ïp \óçžx¸xu1Š\{fumÃ'.sätçuÄ*ì[ãÊÜx;ŸgåІÀÓDG:†•[r.õWÜmþ.]gJóçÞ99çìœÊ¡+ñuɸ{™k9<+‡6\¸z›sx—Þ10Öüôo%S&Onû™!XâÚK¦ã™ëÛ…ñÛ¬ûÝ:r¯,žÏÜ—ðÛê|gõä%ky´3}à8–_7Æú©œ|Œ‰Ë±‹ëÞsd:Ó{Z"¨HôÊ(“ÔããžÈÐ}@»øÆùOgÎåzgï7QC~Sî7î>Çd‹µ^7nÞW¢33ÎÖŸP‘?`?µ)”…™+—ŒþŽãtÒv‘*ôíì– &ÿY:kŽâ|ÃeUª¸xó3çGÄ# Ë¥Yîò è“ ÖFŠe>¢u²"žVlÝqÊ%?3ì’•{q†A‘2bÆ“3ôÝz›gï\BØ3^Ï {håʳ äÊx|zÄ;4†Ÿr eài£FÑoöaX)cïPƘTÆš¶4Ž@qÎ^'-€sP¹{ýôåRž¡þíõ—äeh…¡\Í ´”Öœ»÷C™ÞÅÍ\ ­È4M§!|-Źvç¶œ‡Bo¡'^ΰ:<žyû»('–±5ççg½zã89ÏùÌËÖLæäT÷þ}ôcœ0×(ärÜGÜìä2e¿i®NÜ7wº3,ðYnæ^¨¼/xŒuR¤sDf;«ÉëžX뵘,ëÊ5ÎË^Çoæp(ü¬Îæzô{ÝS½(‘ST³?ÁqG1z¦Æ†ÈÎe:#. ¿]¡Ï˜±u”!U†œSòOåÊ@^ªœ½Î´½NÊ®•§· ÚæÃ­;³OÈÅœ© eéšþz7畜½O^î~ñÆroeö ’ÿ©kò~æ9œGu†“®2¾µ2â)g¯ç ~w8}C=¡<’s›Îµ9—ìL×5ž{E™Îkz–HΈ¡£Lÿ5ž+0¶•¡ZQæ˜362Ç$ÎÕÊP#)Ó‰Œþç¹…±Š”Ñÿz¿FŸ+£Ï•ÑçÊÐ),¿SFŸ+cLª§é^ϼ¼ ðe9<¼~¬9‡«×K«ÃÉë„•Ùáåu2Õrë¼ÃÍëÄþu8‡:“×™·×‰ýñðð¾BŒ†ÃÍëÌ¡ÿsèÿú?…þO¡ÿ/¾E ß"ÕP¦øHÉÆÉÞ6”ö²‘´‡è^ ÙpÔ™ Ì^ å\ËÊ®ie×°§­fO[\Ñ`ÎPl²,ŸOs[é³iúdš>—¦ŠXmvÎlާ3™ã)U¦Äi+ÂîæÚËþ<æWî×äÌ»N"P79¼0¬X”—›B©wÌá»öÄÁDÂÿ‘÷C`«&®P:,57ž&4»ò0á*¼ -K ¦¸iò|89ã`óÀ3”éá·­~`´Gͺ§ ­ÿ¯üói-q]V/þÃÅŸ4å™5Ö5|A{ œo¼Ü¨á˜—ðUëþÀæ`zx:tçnï"±íÏWÊÁ`úÊ¡§³‹âÐÎNËEw ^_YÒö3Óî„‘Ñþ¿òOxiAVó¥ÞjxV UÃåŽ!4âú‘qc .ôŠÄÝû†¸ÒÍ‚:‚a8ѳ›ª¡u³nxF„š“HÿRÁŽùaUDªx€Ô!¿a±ï‹*ž=Û<ý„óo!Æ|¡pKƒÜ>À_BŠ"¦Óu÷`v %Hð/ˆ{C¶ÆÓ…¯˜[ô‡5è†ù 1¸5FÀ:ªD–âÔ‰8l¢AU¯¸­Àðµ3"V¼A„ö_&ÖÌMÝÚ­^6J1¾q@ªvðÆË´ fôZ_Ðæ±°,„zõ qõ'B¢A¤[zç| þ¤ë\”¾ÔŒô¸+Aøp0¥Ã”Ué$ļ#6seElEÅbµídšhT\VÙšV%T©VóÚZ+xP¥­A•Ì5 †oŠÃ*›Ý*›Í*£ÜXíϼ²d•QHœVÙVŽŠÕ*ìV˜±WÉýWÙ©@vê Ms£@þÌd?´Ø;ˆÛ´u@Ãk©¾a6?^(§¡¿` 1Qjh,+ÍÁ&ˆ0u{ÜЄåìYì¸Ö]YÔ™ó øv¾á0A‡êUøW<¸¼£ü gØ=P¿2¦©«"nCb}F”…ý$º¶ª¢hï˜Î·à8ƒ¾gb?ÒüäñšÉ1é0 qÎxG|cœ[1õ8D9ûñåQ–¾ûh>­KBùD„,”¸qÛÏ8 ‰®^º ÅX0/zyÇtº1)ó§Jcý—ØÇ;š˜õ*šÃ~Äl‚æ•M~H+‹h ¾1›^LMrÁzæÐ‚l—&ÆÅ»/`óþ¦óZÓ;• ½#Æ:/[óL‘µLR}A,bÅ~F³KJÓ÷;Êø¼ÏÕóB;™o`Äbe܈c?â:cR‘&ýóÌØ bØÃôsØb³1h™ò:¢­%{šº…Û¤=”^ÇÕh£;ý’=øÕ![Ó‰é ·{NrkUOà! Û#c¨Ð›…3Ÿ—l1”é6Þ?ð<¯7þ©ž¯7ûRéLDkŸ7Ì \e¸c)ÓÝ‘ÜÇîvgE0s½Ñ(÷;—s2§ë5Ó PÈÁóä•›ï_,/«·(ó©HàXËãÄ»nŒµ]k@¦£]†¶Ÿå.ˆû³{ÁДù| þTg’.‘¿6-¥ð †ŽõŒé\_1¢i,ƒqNÏÐ âüÊÑoÆO{ÚëEìŽ|Š}žÑ4΃Ÿïìq/ˆk ÊÒµ–Èn/äøSÝ>ºˆYÖ0“´µÌš gL"Â:"šÕšÉ1¶],rÁqnPÊKkãoh8þó;ÚU™ Æ\OÓÙ—u+ÜÛ}^yÇÿGFjè>\°–{ Æ­SþdfQó1š)W zœð¼ã& xlÌf?ÈGß±Y+³‰m+fÚGM¯¾’#í¬è ƒ%§«i÷* <#f?¤ý¼+æwÄ •Þ4ùŒë’ þTŸÌæéƒqúʉå= ÕìÖósìGœÖï˜üX04_#–ãiÆ¥þãLÖ âŽŠþifŠ‹níµ€Åƒ¼ÐUe?á2û·ÁEòe–‘œgJѬyóð^ÏfpA¼ÛbdsòY/XÎjÓîJö±.øó·ÁÅE>"î ìl>zÐå&Ÿ¾ m¬^^¼ý,3_¼ – $É|}8ì.XÏ×´­ãU5{g;â‚EÄþ›0„WÄŒ¹£Ùñ.Ëæ@²´ß‘Ñì L9Í ß|~ÃfLJ1l´åNW_ð'ïÙ"þÿRw«Ä‡À嫨£1/»o| úUVk<¶&óU€ÈEq˜s‚V~BÈošYç+¶GtáUa æñ±úϰ.²ÞjíX¼9y;¦lp -ûY›ó»cqLh® §†§¤n]±'GxåPÐQ‘*Å}ºO ¤Ò‰²¿tPtÞ‘î@Áݰ>ãpœŽû [rÌŽåÍ•HÖ½²qÅŸbm¥_Ç>ëÊ%pº1|Ê)ŽÜÔ¢ÕâwÖü·Ý–È Aϱꌸ¹Tcp <Ñ—ÝãàÊå,Ñê}öQ“Ú;Æa°™(»ÕJ䟚»A ’º rõÑiÞsÁ<ñðQ"Ï––ð‘ƒ_·[åõKîÕ¡Ú¸r;ûí–ÚÍ-·m¿ðÜ‹óèOüóX‹²·Œÿø³œ¼EÜzÕºÛA}fµ0Þ~)T.ï¼²{¡ SÐán÷£'ÞdŒiµüëÖ‹Ê,­Ç®LO¼·Ö3ÏVye*ž‚%n*¿èOùð9Þü8ß铇Ï\^„ÆÖ·îw£œoì»/ ãìJÊ ûu ú…s-ßÅÎjWNË{b†H诓÷eyïž>¹òO±r‚4g¿z« “…ZÃÁÊé0ŽøÜBùþžëC€b¼Â߇ s¯LKg2=6´‡ ×^7é/­œÏöƒµõÖåùGà¸ÝR·âÏ­Z?ŽãkÛÜ»E¹Üx»5:õDŒË³Ë†%)­Ý7%ðÝûsä»Ü\-sù¾»»gÕ!A­,‹ G7…BùƼ“gh'Æ!3n&ªÚÓMÕŽtªÃ+(•}g‘"¯JÕR¸·;ÃÒs†ñÌçBx3ÚMd|æÿÞÌkáÊX˘7US¾k9ݘ 2û¼B™=öüî/†íd|ÃÑîlß½ÐÔað·a._ìÃa­Øã‰ªÍ·¬ƒ_j×xÖÄé¦9”æ1Ñi‚‚ù‰!6aÏAð´t؉-2spæªÏ8ü–û¼®Fë·Àá·­f5ÇÙÁSyÞGýmõ=£™Žÿ!ÍÔ¿l?³þ¿òOµP•Þ•=€±Ù8^qPžÉwާ o3šz1ÌVÔ’ÖÞøÊk8ÏÀãgˆv—gfÏ‘k÷Ñá;ì›xŠëE&ÊkÝÙvðÃZO=ç¸'nkà|gœš­_žø÷ºòOñ·Ác>®ö/Æ ÉØ•æMøT çm·q;¡ {ÁùBí¸iô¥—–ê³"sÔ(/gújß·®Œ²§mÛv·¿2Ãþ(ãFž½Îæýœ<÷õ¥ ³C3K3wæq¦íÿ•¥¯²²¼ GVAÎfƒþÌó\ì_ ûÓycĨÐ2°CW†E§ÖyÛý¾ yñ>wù+#¯ëáð÷bþ7>,ßÏ:½ò%ú`æÄò8/«ÏÏ’ê>ÊE“ Ô;Ÿ ªòYëu§ÏýíÊÍîƒïHdžNÝoã0ýð´OÌž£0»„ò²)¿ãaÜ|”[uÆ©`r,áf¯LJîø<ýÞy†];œÞáW¹Ì¼í„“ÃÉG9ß§¦¦>RãœécqN&‘Ãi'W?í¨ùê÷Àpè»`½Zw6¹Äù»×©;Ã…«ï6xwãüM°þ:mÛ Ljûñ÷sÿãiв ž¾V»3bññÔÊv*ÃÚR™‰;xÛî¸Gºgì ÚÛ4”o\üÛm³½(4UÖú/ŒïÎ>adg®“Php׺²YòF^Ö}>”ÌìreìSümûT û¬¹.eÚkÿÒñÉýe¼3ͽubŸw[{?ó²u{i;ÉíÆLÃ5¹ÛŽ{Š~‹+ãf¤û©ÙBpÏÒùue³kâ}ú gÙÞïÈGæ¹y;¡³9ò­äýsg–dCï¥yøwá:¬kfö:?rùìó7%¿å$ŽÃýÌÚ'举1¥1mSª^¯Ù7€'.^¹Î7fôa—°kljJáÓ3kôº?ǦƒÔ}pk„r¾é¿…Ëí[°~•½9Ó.kàþÎ0ª:êëê&Ñkmû÷þøIÚüׯÿò—ÿçß½J¥ö;"˜ýå¿É¿Jù±(þòßñßÊïI\Ùþò_µäëløú×ñÕùÏÿî_üõ?ýöÿúÿÛ7Ÿ¯B¯‘X—XÀýßü¾þ5ÚïS %_ÿé­þwL‡šhþò4øßlÄ÷Žuùy:<ýÇçé Ö‘ºDÈæÔ;œ¤‹¬®½S%‹iï°é+b‡òbœ‚͵wê­Äî´wÊ<Ä€¶wÊKÄ?©wÊ$f†öX&·0NVbÙÓ;o%b€Ù;åâˆß;o1båóêK´A¼Òzã-R¬‘zc 1 êm“Å«7Ø@1îêr‰¯ÚÛ#¯Úå@âx×O}â?úb¼Ë«¾óô.É©{ãÉ_²S÷Ê“ªØÓõÊöH{¥\J,ßz¥nAŒç^ß„em“f½êE=3±×Îß¾¾_¯”™µ"uR–,ñ"_Œ¶µ,åÙþ+WáA.å·µ¿³dYí•72iz¯EåÄò÷¼ï,e²Ê¡›0eá lq|^l²ó^3ëLÍXt½²o%»qŸÎòM—P&-c‘í˘ÔúÿÉÜ÷;w뇌w)&«îµ”ù­Þˆû°o—чußYêW94þÞMîûâ~çdc,Wù»ÊÎч³ÝãaÚíøÅªÑ”ߪp`ló6„ï®ÚкKwæ¼0kcŒ1e¯óʬ_­-B=^?Œ+/´Y™m&팹¦¶SWÊe>3æÎR+µå¼šóDÛ4æ`wfýj?817.ò@ûyÃKðÞ’ÅúÔõçÊ2öoLbmÙ›ÆÝ–ö4IYúáßIJÖiÜj™ïíÄ<•2ŒÏ{eiO3«ÐÞšZ‹J+öδ-Sî×Û~çý÷³Zµþ#Œ¶.eùÆØ³”WvÞÝXbE—ê\ý·â¨a<ÂogøíößÊ%ꑳ·YüoŒe¯9ŒýôXNzb~)oî­<­QÁ—ô̵:·áܽm{†2˜#ú¬mmƒTÊXÖŠÃrö8Œ>T ¦ÑœçtÞ6öŠDy±ê²†sÙέ8÷î<–3¾{7ToGw´œKv®Íç呜Ñ'ÊìO·+û„\ú3Wo[­ö#¯7êµ.̹@æ7R]´0u¼ÆZijbÅY‹{“Ä^|dŸ#E–N{Îl£ÝxKî_ g<êù›ŒùN]:ÎB=ëYH΢<ïI~‘Þi£³VgŸHŒò×Y—õàìÊó°,…½ïyç×ûJ›ÌýA ¶teÔÛ_XæïÐóžôÏ`ÿHlµ>¸ÏJæ÷>çÉ™ôœùzîä9íʯú§ži_[HŸÔ›Ið—>ù$hLg­"Çî® ·ÒUj}gö›øbtJiŠ„}é*þȲ¶/á}çíÌß*ç_0Ï«8‡«„V¹ÜùõŽ´ Óöð¬µnŒ¶mí·.\Éù™eݦ]2ûÜXÚ }{g-“§GÆwW+.Ü#Ôãcvw¼;¨>cû°´Yõ±kÏXÖ Ú[‰µ×i‘^$Öž±¬?‡e}8ö)%;K?(ËMØXö‹Ã39w´AuËݹç¼Ó4qñÊÎÃëÄ:l¶¡|MÎ9Ô™šqÚ^§h|ŒÇpî^§¸¼oƒhLŒ“½ìB»zªˆ­¦ñhÎ=?s]Î¥;g´‡Rú”ŒÅuÅx¢~JnGqnÛ¹çRs2ž?*¹íÎ?dŽ2Ç™ã‡ÌñCæøáã‡g6Ž?ÓîÓ™ã‡ÌñCÆø¡fDr–¨MÆ?Ê?Ê?ʲ¿ÆøQÆøQÆø¡F£íâŒñ£Œñ£Œñ£Œñ£\P'Îù¸×Æø9y&¶óΣ:cÌ(cÌ<0Ƶ ãGã‡\0~”1~”1~”1~4»tÎ¥9cý!gŒÍ<‹õGyVgŒÏlÛ5<ƒ½3ÆøTÆøÑ° {:¯æ<цmèÛ¹ çŠ:1~ƧrZ‡%ÒÆAŒNÜö7'c“(×uš÷lŒL"&3†b\2i&†%£’ˆA‰ ^4P±¤1Ï%F$’({#ãM GâJ†eé Þž°eÂöÂ+>ÃTŠƒs§}¾8-hƒt®IŠu–aˆñ‡}}`øÑ7v-C >"ÆöýŽ¡GÄÊEÄÀ bÝB<§ˆU‹ˆAAìVYkVN‚wDWãŒÁ© …$wSèäpèݲEÄ'„H®¢qZ«˜ôČʰ—³½Ø¾1Έr°fà©‚5JåòšDÄÐP£0©LíPåiç8nˆž¤›ú—g_ô:Ūx7J4å Éø9óòáŠéqQÅ·€ä¥bòâð,qÅ;C6ULu±Ï`/a$c/ñ¼¹jC½8Òãt£ˆöâ ÖP/,dÚ»ïqgX#Œ‰8 kd5ÖK¿êiÈz»3"ë²Þn#•˜­ìÀ²ª¼Ë°{Y¬ÓÄée—•^/äDŠ˜-›ÁÅ–!z"ëN/‹ÝbsQÈO˜­ S¬þ³n}¶0¥‰ÓÚ»¶µw'kïÆRA,VvcرØà<»±5±F±ri0#,hÊy9cŒk#¬ŠÊ˜i'érÆÒªŒ—œqÀÔªXŸ•±l+ã ¡ÜCyLpI‹©ªŒBÓÑcQÆÆ¢Œ‘2JÊXŒ”_p$šrˆóƒñ«é‡ëk¡3~­Ư)cüš‹Æ¯IcüÝÆ+”=þ°\ ¹øoEŸbܼý‰<½OtŠ’·—×IJ.^^§)9ÔßCý:SÉË¿QßþMu²’¹ «—-”¡ü å—±ÁúÕu½8c“õ“[(?Bùʇú'ëçA‹£riÎu8·P~ø<â%@y…òÛÖ= ×—ê\‡s[ÎÃø¯á¼m=y]ŒòYá"dÌúɬŸì |IØ9”Y¿ºe-㜽<‰jnÉúÕtq9ã°¹]isx gÖ¯†ÝÙõ³ÖîÌ}O “3w>utéΨ_“ŒàТÌúU8×Y?wqÖ¯;º|kMPÂúUÑ·ŒëÇ·h¥8³~2Ö"z±~2ëW%gwÆ¡ûΜËK…4ØêU¹šœ±PÉÜq¾¡0¯c-å‘££NžD"¼Ë9·Èw¡"zàÌJØ…±uRÈ7ðŽZû…Ž<¸êßñ½xp‚ð^Ýk¹]7=’á FÅ8O¯Tzû ¹LÈ“3……“‚*«÷2ÁŽÔ ëQ¾„:)Ås'Џ̬í—2j ï5ÙW¸[̤}’…µÏEàJ˜$óêƒë†Ä` °œ ǤØtôÁ÷º²h§5HTJx¯>(̆²E…µbåÞ…Ób-ÙÇ•XñõA¡#'ƒ |‰ÚïP¼ ~ ±äìƒJuÜáFR¡5ßË 4®ü¿ÙDëÿ›µHɸûÑF‹ycŒ+‹ƒÙCÿ·_ó<ÃoWxVd)ŸÃoi·‰2õd\‹,šhÍÖ¶¡5ÖC ´ÌãÆglüÖʽ>3µädjœÉ¹9§lÜÐ6Í ëeXw(·í ‹åR³¿K¥žL-9aØ÷å «åÊÀbD9 ã²½Î"‹ ögå€2´ðÊ­8ïñ84–‰ªœñ]”çt–…àp÷çJ*ãâÏÍÙŸ›ö~æåÏÂáæpûÄÅÆ.9õ:EÛúa­´­žFÛÚm2턯ÜL›Ÿ¨ dùbšÓ7v°–W.Ï´ð¢ÚdñïxäÊÿ-¬\÷PftçéÏ…¥²øg/SB›ÅÏȸû»‹‡«ñ eö4Æîpñ2µ†2=”Þ~Ht/o[K^¦e/Ó·hÍÛßzæéÏÅN¹‡>‡æëpq-|GŸ(í|Úy®“j‘ê#ËžvƤñ:ö$eouÜÖ,ÕÖRµx±=âÊßlS̺%¶×JWE.÷¥u9¢æ* 8¥@7 ?ÃÙ1à7ë¹ôûrWQýU 'aüÇ«ëï…³tœr}ñR7òö£¥ôÀ#”éòÛõü¬þÍ»ýµ–Ë>Y‘p$•¾#Ò]Æm8÷íV‹Èn ÍðaŒeŒŸ¢—Óý¯Lk\‹ŠxX|’Œa‰©\Ð6ZŒ²îÜ«ó@´ªcûɟǧ ÏR«·æÌ:ÕÒMꤦq£Neœsý“Õ?r;ãl®1Åp>US|_åá–ˉuòï¬S}m½Î+KûÕ·XÆXQŒç¢–Â2wŠÆk<2pK^¾Lgµ¶–ïRÔ—Z8ëzcµ\P^#MHÛòñ9¦`œºqR \¨Ó\Îi¬Ë5¸Žg.¡¼úˆ¿Î;‚beõ­Ïê|ÚÿÚ>N\3píÎêƒÖ(!Âj $¯ÔN´ðÔòãÅÇ’Q¸ug÷Énê +J¦>Í`ÍÌK^ÅùÄJ[/îùUgõ ûXjóôÿ‹‡ io<·ó‰ã–^Ü›3uœd V«ü×gh#™@¸uõ­k4 °ZÊ¿Öá×999«U>X¿ïk˜¶®ßWX½RÈKŸûú.ídà¦PެÑ:ÀUŸûú^êqBÖþ®?à5-›Zß“O<;aµúMûV[yæÓ?¹9ë\.'†„°Ž°ŽŸ×'lE¿/¸è{½¾Q9}.¬1 Þ9Ÿþž^>Ô¿¾]ÖþkÿƒµÿÁÚÿÂIû¬ýÖù^gj^gª^g*¡ÎduÖ­ó ¼ªóLÎÇ:xËq±9×|g9Ÿoфͣž99ÉɼؑÒ)  Dœý‰°íl‰êÓ+ËÙî·!³ù™ãÈÌ¿À½æœ K5¬Ý°yÙáeg1\öˆ¼OÓ[IÖô¢%X­é¥ þ §—]ÕpŸÞi5Ù#x¡”®n”#[3ìÓplÕ i2÷ú„¯“è0Ì˰&ÃVõË7úðq8%âNHT«<9qÞȜÏÀrFTë-öj8†áä#ä8Ns@Á‘ª!øë34Ʋ ¶dØ‹Žê6F3œÃƇ¯Òfbsä⣓Ay§Ê ·¡d8Š!‡ò’뇲 £óÈ$kËæ[[šðZ°rÆf¹¹-CåW6F%®nÈ!·årÉ¡ dJ–mWKb›:çÃæg1äP~-mk½óuÉåP³®Mµr(Ëå>q(qn†ª!á:I¤a%/çÓËJ÷«<|g2†2±Ÿe°gæk2áµH*2-:Kâ#ºÈ–!í‰EËÈ› ±³ìþøÿš1·ÿ½ëo‹ðº±ÈÛ sTˆ¹}/š×!ãïùÎIjä€x|`‘m2‹ >•qùÀɆ”ÆþÜ+W/³¶ÿ}áYéÎè+5Ú”çjÜ/´åÈŸ#ç³Îéoõ.ŒgݙþQ®øûdŸK{ôÎ.£¦”æßNã´‰<¿Ô}gÈ~søÖì·3f®üó7±`kƒIæ~ËL×öÚEU$'ô–ÑJ ŸÐ2ö£)²Æœ8÷!Â__?nÜc$bKÌuøz‡–6ïYŽ‚ Ë€(ñ°EK,Â;ŠhAâÚz°Õ'ìÃ~öêƒr€Q” –(¾oÚ9D„N‘YGÛ4é4]É×0Üò4ÆA“C²¾r¯x㺜»c`w‡ý¬oX_[>²XÈËÇžWà}ç,Ë.×ò×àÅ9p½s™½>KÚ¦9­ä*š5³ XãŠÊ“º>eͯ$ßñì`­S.ŽEëkÎræ{É÷ªšOJæ‹ê–Éú^²ÂW=_€5»Œ\úNt!°Æ<n«TæˆÚ†ÞYûܵž)×áî¬ß¼½LWÏm™#ýè{…=¶lc$5å eË]¸:¯a<’—¹Ùo‡ö9Xû|údÊ•xÝYÊÌPÏJ^FÇí5ëoÑówámßeªÞ@¾éÔq~çî\Ãßuü_¸žÛ¹òð10už‚·•| œx»àj.z3WÖó#X× é‡“ñHØ¢DÞÂ|Ùg'?yß9ËÕ>°ž¿d¢#‚2sonÜÿu‚µmxœúž’ÕÓ“Î#¹e¥ROzª6zÒó»œ1S·>ïIs®É%ð¬™bk£ûlt_–ÃLÏ/X®’YßQnV9«ã‘°~w±ñÉúÝÅ6!—ýΰ¿ ÐÉ zÖóò„0빜au=µx×5PÔâ]×@éë(C¡gö-nˆ‡ìhc"ïuþÞC™–œË´:ÅôꑼšµŽhºžÃAípÅûÒvFl@‹í‰¾{d8ÐäcOY­¯à|“9$NÏjCÔŠ³\ÖµŸ!Èj„öµ/ŸÎߎç|k~;¸X?r(ÃïNæsÛÙ¼ ld•ÅtÚx¢=%¡;c¼;ï1‡ìÃøFœû•ïHÛq|#å9œGu»-ʱ²ä90;¯Ãbÿ¥,Û¤1úPc@y„ò-”ÇP.¡|ö6ÃçðêÎÓÛœøxwhÞ’s̸x¿%Î;3À°B—oÌ:"&>"z)ú'Ç ž#D®>:pä\¥ÈéŒa†øc}âø¤ƒRç2TMœÊ·`&c”ÃÆƒ‘Ð8?$ö‘.bÜ¢³i²^Üû£(È#4¹y3œXmäÁðz⢱[#êe>s|ª¥*lšÖŠŒ«­b6Äyá†ØåaÀGµ +k¬¦OݰP &‹;dÍ‚*)&®n8ÙÈvdÍÄ6 k3ÔTõ0xZ§†µ­2&"N{0S[3¬EÛÛVÞ†id,yÍ6W6Kû¡ÍÞŸŸEn½“±+€y¦#ßTó&"ND˜åH¦ç/bãrZÛ†wÈžš`ׯَV„8ºaçƒEWÒ’!w3,z•T2È®¨4[›ÃpTCZ`]†…Ç$0¥ƒtA"rœ‰PÅÁ‰ÈÄÜ$–ö†¨!çƒEÇºÝ ÐêΈòn3¡wŠ~·!“y>KaÿÊÐÈ–í½eö¯328²·Ìñp$VüƆÝ2r_Ÿ":Ñrrq3ãÞF‡°;zY 9f#®7D÷ž_ð÷´BÏü¥HåœÈq2•~@ê¯#fSD©îª7ˆÝð‰ÔÍ‹ü†ÛÉågTU¡ Ô(Ÿ–]ð ¹49~|ý&N¸' ˆf(]VÓ;Ç}5ܱ9öS¯=ø‚ß®§Ûñ=,¦¿„冻ª«iôÜ™!WŠˆ[²bqlÇû‚ý q{\1Ë͸m—à {™ÂMM»#»/sg ‰^‡KÑóU *W=6™è<ö¾H(yä ÕòÈÑÓ í%‡¼Ú_YV¶Â» $”|íܼÇËñèÆ¸Ï«Ý§ìãš÷>²Ø^Íi/²çrrÙȳŽÈðöæDgûÅ–´eÊu&m~T Óžr¾‰¾bŸLô•þ}µú¡¿¢ža`Í8fšõÕ`ŸÐN”}B™Asy*N+åÈú±ÛÎe­¼-KNQO™5Ú?ß‚òï i2W±XkE}ÛEŽ^)¿éòW•à|Æú彎ïP`±ÑCü—ÔP)Ó”©«¿˜z•Žý^u&ÂSåÂìqm•}Ø`㮆dLÒ¶¾ê­q\UÈb]NÐZU=Ï4™®M5j.¦jí^=CfÐñ8‹ ŽÚ>Á>µ5Î9£¶Æ¥Pî«z*È}ÑŸâÏÞú‘¬c…(‹ê“E­ú:Ì«Nl+)Ø­¶N¤›5F0¾° ©Ö§ÊÖñ‹€Ï{ë +2Œ¬¸ÀÉpo2` nåÏÊÇwö²¯vò}Å£Sö#ÓX¯ÚNæÃ’)§—\؇ÃÞKûVü²õ¾A½_Óú/\MÏßž(”ò[ÎÉÙ˜¹¾ÿgœÈ”Ó‹ |Æ›ÆaÈ<Í®÷î¿•ë€úÝ˶­w  }.|lZV ô Ü0ÚÌMe‚ÕÞWÚ¬¾ù¢›mM}ÿqïb=L ^ÍX§¬cßHl[ü€Ø—*H¹;f,”6¦½¢W£îaû°ÛuÇ ¸u\ÎÄ.àõ½©¬Æms¿!>6ÙÆxÀ÷•s”ª%µ4†PÖ¶A9ŽtïÁâq÷ºSº#¦{I`Ý“vÂí¨#"ˆºþ ý*ÚþÊ3üLDyùÉ—ò`ưCÕ$D¬Û @`@,øY{GP”á*…ã hϧ.]æ´4µM¼±DÁQÏ« ¦£¿ãÄÆT­¢HQMFÄ Ÿ.7l/0`†¿ˆÐÇlZA¥c·ˆÝ“"˜?ÌÉp¤hN?kâªQŒ f£Ø®Ÿ—Ç€}¶ð…(/LP AHˆ.Á¹!áɯÂ<Ø`´ ìÀóŽ2ÁFãÙã (GkçA“–£9Á•,é”’I çÀâj¶„e˜ËUÂDáÖ$Áeuz¼¦ò¶¥Q´ëjÛze9>tn/Xº†ßÕ,Ò_Y^Êž5Žà'‹„N§\Ž PÌ2u²Ñd¨W¶©QMŒÛ†.3è‡nËÆ颯)Ò•Áue@¶ìÛ¾–,Zú ÊQA?²|à ٬8©$mcbðÁÖ|°¬b:Ð6†ã"Ý ·EüUº›a­ÄLViÅgHuvXA(ëÚ¶060–°ÌSêî`ë³hÊ/IÎYÅ {Rg†CTÃE”–Q!'båÆàa8"2½8O¶=)l¶ÄʉvL¢6HL]Phyº8Œ#½c{ÄþŽ¢ÈcÐ_ât\¸ ùÆÿ‹»3ɶG’ìqxô³S{öd¿>qÞq‡>ǃkq|âéÎÚ'®OŒøí'^Øá/8é)ß±&â~{ýŽŒâÝn†9þ€ÝÏ7ÜÊïíx íŒ:¸œ~ÁåÁë7„{»üáM©öu¦¥~Ãâž—oˆ$u<æö-ßpþ3ì¯ïhûšWÍ;‹~„£ß“‘û ÎÝžY„<ü'nØý‰ÏìÉý0ç'ÆCD5¿–=ÛÛÇ‹ØVN+®>LSÎ(®"Í'RÄf™]goÓ™R´U:¥'±Õ¥Æ 6ÀƒÜÓt¿ðeaÕ»z¬…ôVÑ äˆÍ¦6¿«hpà·Ü·Ÿ›¹é“çÖý!÷Óöí{%=m?¿XºµØ)ìXÄ•ØbŸg­>²åóglæi*úu¸Ë Ú+¶ù+‹²ë›5Ïó‡ŸÙVݲ-ζ¿cœ&wu<7q[W*6‰Œ_À¹»R±ï­vƒ{Œç;ìy?[Ÿ¥O>ó¬7—ï3~Ÿ‘—oõcyÚÞ)XÓÎÁè^äÙÜ6:7.—o ¡óòûo©_wàlÁ{¸°×éù[v~äAÂüÿ#Ÿqž¾ÏÿàÝ·ŒÚaé} ãÃ=öïëÌö§ýít-èÙf‡ý`µ¿·i¦ŸÖ·È²ø…9E|ƽÉcEž²%=:«ê”V…ØlgŒ%Ø@è=e ìéU'„ÆÛs†ûÙÇc–]D³³Qé8MÐ.ÑqT¢=aÇ}ôÅ÷Ø1>ùŽvX÷'\ËìHŸ´™t¾Úv?,ÓfĦ–}8ð®]/qo”Ù绺‡)¡©hGMˆMÛ†ºg>f6¿¦Q¶Nס€YŸfû¡·˜Ím¹ïZ9}0 N_;TÀvgúÙ§Ÿ¨Ë>ÄôáåFØ|o¶ }(ê4é–XÐïgoÊ=®poÅMÃâÔ² ¢äûe±·°É¬ïù¡óÞvø\ï¼·ÞÖMÛ çF³ÕàÜm¶ ì Mà 1¹f«9a󱜄v†nOs½Yuå¦m–ÎÄÈ0oâ·ÍªyžFÉØÏ}°6{ã¹î¦ý„“‰ÇîþoŸ¸ç¥vœO ÆêV‰ÛõÕŒi°Eówwßz ì>3U»‡½.T‹?…¿ÙâRÁ¯ ž+Ú‹ûKþq ‘ƒ)uÛö~ÙT\œBÍl^Ñ6m¶™ —Á‘©õ0S'þÖL %®yc˜Ä÷ÔäÜNOöE(VðqE˜Îlð¬ñg¬ÀQü` .º i@†Ç gæ;íˆO„ ¯Ë¯pÑqæ*þ,✾m&LJ3O¿Øécƒ/ÙÒù`k³”¿m£é– xà+™föO—R²*·ˆ8Øò±³B,ÂéÆèª¶uÇõÍeƒ/`YþÝÜ—$YìÌuæ–ž²nw† ÕáR\‚+>6c.y¶=>â·°m®¾µÎgWn˜ †m_k¸h÷k“DÎùwþqË\ÍEçmèhBÿú°óÒ‰´ùÃ;×céoŒÚÃ|“%¹Ê¿wù÷"íŒpXúê ëíŒXåF„î>T¿7T¤³{F! §âòÊ;ÞÞxk]ŒÃÏ]íßäž×¹q.ÂÇÿÜÁ÷¿>ƒïû{À½²è÷¿ îÿ¹™R¿œ=SjýƒL)ͦ:?þö‘‰õs;qBKåÂHDV÷â‘iArÒÒ<÷Ñ‘~!¤ÒôE_]›–VÓg¤ƒÁÁbieØ8./VÚÔ³ c!8Êû,1yÜ¢‡˜gºˆ‹/w3eÕÌôÓ§·Ën2£–ëú¢)„!;4‘ðè¿èõ7¼>y|ðÏ({SÖwÀÂ^ gæ¹Á6võX ;µi»Ä6 ‰þ`ÇµŠ¦´xœ¯¬í¿ð ÝþÖ>À°†£ß3¯ãÏrçûò˜û×w­!ŒïÄ•8?pî D‰1ú+Q,ð(ŸˆTÃê›qsBXÄí¯ÀQë'žî”Ú¾sòì©Ù\4”–9ѧ»­”!ÖB§3%‰+œ`Ñ?7ü±Ã!÷©¾¯½¬îq_÷d°‹ÃÏe ¯¤q•6%÷|(èæ,ûBhÎ;÷Pêe±]íH.¹Ç-Gî}•¡qmù®ÈÁ3}hV›ÁÃåY¶ž³yn©¸c9·7†›«Z¾ßþ-«´Œg÷{Žd¬;ïœåã°xyU·ã~Ì—…|`3Já‹°à™™a¬ýÂ(€^î»cízÿYëÆrŒoÌ4 \9ýÃ((&hýó7<ÿÌW^“¿e1w‡Ï ‰pTTŠ{^ò,³ø¬UÌ`^¡ï+ÇÏq4W|~ãZò]Ô™ïko8ü=*WÄ’Ô«ö»¨St¤ÏÐfßÞ÷c¾>ŒO3Hpž{á}ýóÌ·{†\›=—2rwkž! r)‘ƒißÔÊ3jáY´Ä·ìgÝ"ç^9ߢ.²Ï-#¿eÔúóùùO¾Ä''_|„f±Á€6+ÝôëÉhÉ•^}kßþÀ~}e»‡;ÿ¸Noû‹øýŸ½‹?þkîܵÿk¯–ýáýb]‹NDË ° µ­è ÜûPª”–í7Mô2¡åb¹ÈBtÍé}MÓ¨Þsƒé* ’*Ze"­ˆsÃ@ê’ñ‰kÒ¯9qMú5·ÅÓrÆR"éoÞqÃÝr÷p­I¨–¼&3\GòBòMз1­€kÒ×Û.Ï>+»Ÿ¥?•¾SÎÇáyS¥!7Ãâø¡Kã1ýH³¢ >3ãc¨ñ¼-˦™€Øý’µb‚¡‡“µe\{šTÎx§^£¦$ãzM›ñÎx¿^'õ| Þ¯×ÏéÉx¿ÆåŒßB\ˆñÁÔ4‹AÏ{>ð~=î¼'÷’\Ïè“ï×øhÞoHÂ2„úqvïpø7 [¼„øòMÁÞnÈ÷ú6\™;7"Ïîäo©Æ(yO£»åÙIöÝ[zžäïݲú^ÓþÖå7¹RžS衽'Q K«„ËGaâ2dî˜vŒþeR6F3kéšC’íêî›ð©ÔH§¥8rhéå€ÔÝ+ˆ0¨–¦‹dŸîH¿7ÚRÜ”ÈTm&ë}KÓ½åñJvï{úïG~ðß§_W¶e÷vD©`¤¶1‘Ùà )=/H©yDÊ t›½¤„Á~ƒ‚ @Ê'/6\ĉH!„XÛ+ü@{›Ë׉-Þü49‰ÓC·‰0{LRÛȬˆm}쬸K¤:B½¨À¨/\ 6%@ª@R‰4”´Ù¿@j'@MiÌ@J.)Ä)%޾ ¼&Ö#@ ÍǸâb4&^~1¯@@am|o8RþHQ 8(a<ç®Ø¹BÀ– ö~9.סµ#ª|@ÏÃE†©\ ÎPwÙ£ÏDYPÚÅ1§ë¥ù™¢A¯¸RiNŸîßü‹‰h•¤‚‰èš¨ÚÉ» öãæp.!É‚?çIÁzN‹EŒ³/. C%ŠÅ@ßßå›*B±† 1Ì7¡‡Ci(ÌÔ˜) w˜ÞëÔ—¢} ò7Åóì^Ëahè0­ Ò:D¼«Ä€ÃJ<°X4&–]²’!$tØáº%ã•1àî€ ÑË!KXeÏÃÚó@§‡¾ûaðËQ•zØÔCè׃ªfõûí ,‡e=Dß×zèþv0¿ÞõPÿåà¯Æ5|3,"_mæŸ „aCTË¢ØÅ ùÅLùaÇëæÓü™öQ±š¾›U1÷žqïqÕ_rë%ù>Sò¿äìGR¿æúK­gjÖeQÓˆ²>Í*¹4wF¸·…OôîëBÙc¹_öòöfÄ”ón¼×ÈË„§ýQ™F¬oîE@¸×åQÖû¹ÌBÑ—/c¿çUëY¥—¯t -;-ñL\‰óßuäþ 9×Eª®¼âñ†ïy*¢·ç+æMªd_û;Ì;{jŽ;ŠÄà ÂìT“.|×6üƒbûDU©ÅW-Fk Gv¹GiÈwíH—LÉI¢TyJ­)K¸ÙKÉLÎ9MÙLéMäT™NïIOúùÏw}PYQ Ò&U½Ò»Ž©ê›ªî©ê¡ªNªê§ª®ªê­~Ód½é¶Šžë7ÍWÕ…U½XÕ‘U}YÕU=ZÕ©MýZ‘µU±[‘À}×È]‘ÖÁ]‘áqÞ”ì!_•÷Ñ_‘~× 1a‘áá”#‘â/*Æ"s,âÇïêÈ*Ÿ,¢ÊïªË"Ë,bÍïjÎ)÷,"Ðï*Ñ"#-âÒïêÓ"O-¢ÕïªÖ"{bØ"‘ýEC[D¶Ez[¹E¦[Ä»EÒ[„¾Sþ[DÁU*ü]K\ÄÆE‚\„ÉE®\DÌEÚ\ÏS]ÕÑïªéª¦®*몾®ªìªÖ®*îªî.ªïªS‰WõxU•WµùoŠôªZ/jöªrS¿WU|UËWý¯Jû¢Æ¯*ý7õþ–ªþªö« Õ´j€TÐ*·êZ•àkåLç‘íéU¾UF¸UOЪ ZmA«0hu­Ú Õ´ÊƒTЪ·jZEB«KhÕ ­F¡U*´z…VµjZãVC«fh5 ­²¡Õ7´*‡VëÐ*RÝã[[•­¢UE´ÚˆV!ùV©Dª™h•“[õ­Š¢ÕR´ŠŠVWѪ+ZEª´hõ–¯^´ ŒV‡Ñª1ZMF«ÌHõ™ojnUlnÕm¤êÍ·Ê8Z=G«êhµ­Âó­RVóÑ*?_*iµ [!­.ô®jè\’ÍçBžOFf•Ùð[d5}¯ˆ~dûg5õù`­Ê®ÕÚ¿Utß÷c¾`Äi×wÞvN¯œ¼×Hç½’›¿xŸºù‹wõãn>»¾Ì{0>®Ï÷‚ì½ãˆñcþ_èó™cÒìê¨X|Åî¾ëÈh¼óÿ+…¾~ýë.¦"a*¦¢b*6¦"d_„ÊTÌì&r¦âg*Цbi"¢öMhí&Ʀ"m*Þ¦¢n*ö–"p¢ §Šq¢#'êr¢9'Jt©O'ªu_díD÷NÔðD#O”óDOOTöR{OùT§OÔûDÓO”þ¾H¦V (ª® ¨ Š¡(Š^¡¨¦¶¡(ªâ»Pb*)Š¾â»£(4ªn£¨9ŠÆ£(?¦¤¨Dªv¤(J~èLŠú¤iR®TªýÊTµ­KUÀL]LQË MQÖ½MQámNQìLOQ÷TÍOQ}— -QQÝÑT#RU.=SQ9íSQDÔTOUQÕ»ØªŠ°~jU1WyñW…½‰Åªˆ¬ŠËªèì7aZ¯UQۛحŠàª8®Šæª˜î»àâM”QÅUÄñ‹ÐãOKñÿëýkïmÇvÈý"ræ;'ëKâœ8•1ÝÕȪÄDX÷bð­ f‡™³NþÄŽ÷ÁjAìl[<‡ŽX®Àƒ·_ËĬÓðwâ,܉Ÿ_¿ÂjJÄèíWdZvd‚°$-•lƒm»§T±;ëH©5°ðvª[B‰¬… \¼mÝœ%°óÖ·©´ÍÀÚYêv/i'¶@@Zšp°YØ&g l ÃÌXG f³s¶SvLœŽ‰ØŠ± íU§ÏQûXy;ÍM}Ä£92b}Ú/‰sŽÈê¿{êàA–XVàÁÛ9ÜjB<Ày²ªðÞýw e"†2C™ˆ ÚíjÊDV+bí'²ì0C™gÏz˱^#ðl«r(9”­ÖlË¡Œ“‡i=CÈ‚È@9 ‡ò E b‰¶Üϸâ'è##öËïŒ.b[gˆ÷ÆÆÈoâ¹×œ-pÊ¿»º1îü‰5°¬Äö‰s#¯[løû¥7º½‰|¶¹/ÆžüDÌrD>Ó•"½3gtÉ^ûáü²ö¾æ°ªØí'ö9Ê.¶Ñ.Öâ½})›]ÿŠºÚíºû0e5¸7Jen»îñ×[Aï½JÔŠjÛ\t‰ì( ‡ÆˆÓÒ¼xÀ!b«×¹/…[FFlW g#Ú€x1ìGÏÀ«8vÎF@ g‚Q_{mös 3ðꎃ_÷ˆø-"`üºüæì_à›“0kóÛò‹rÈ1ù¦¼!?S ?^ Çìô%Ú®miÈ'ölkïmc^×Ö¡Ñbu–hËp&b‹û=G¶ñl犎:Ïè¨ëˆŽ²rD ±E¯3Ø–8£S™bI<½­e~wäG”Èï ÈõmD3qfÛ•m¯h[òºŒÉî ¨+°£r-Æø劶5Æïàù?Á³ ±—À7Yg¶]WàmÛÑ_1ž­•¸‡VÚî´Šf“nÙÈ•w#¿¬+þ8†bkÙ ·u§ÿ°àÜ…cI™Ø…"7Ãí –*tU½{ üýŽ~#:« ñ,¿ç*ÃíiËÚö„9¶سÁÄýîW;¹FÏx]ŽÛ‰çXG`ÃíðŒ^gÄšN¼_†O><°Ä:}òáiŠ%{› g68ë^ÑàÊë^xx à&8³î×Ä2Gøì‚ËH®gr—ö£%cé7^ÒþÊknSfpYÉèã.íGÞC™yÍræ=ìÓ¸ó>ˆ—¼fm%¹ç=lƒ[ð”ögÞÃÞè:·#ÛïmqpË{h=çm[ >û;_ù·¿w>É5ÿ¶çk†ÿ(xæýp+h|æýïÓ¤óvÞÚÈ)¿OÄÉm&÷3y–ä%íùÑ—Äi¹?Å?Ÿ²ÓeƒÛJîWò¬þÁ–½ÞŸñ!—Å™‡öp~©ä:’Û™<Ÿ\à æ®™öóó >s:+;þ'¸N߆#(xÔdδùs: ŸWðÅ9’¾|_Æu%ãû²œ|_5ò‚yB ãû5ŸHr=ð­—3¹ÕdŒU,zõÀø1FÿŸq©÷ÿÆSXÚc ð·n\ã½Ô‚wwÿ¾ósë>Ƶó$ï¾b—&ˆïKðîçý^œ‡´ßïÑ¿k\¤ýä²7\Áy}äž´Óó‚K2¯o¹]3y+g^Ÿ> ÝÏÎk$Ï–<¤}C{ú’êH.5ù8‚÷·YQ.xwÎû{qnhOßëþ~q}2ÎÓ|Á{p^=yÏÎ]Ú7´gÞµq)Á;#˜×1ÿ8óú#æ+ç†gì1¿9—#xÛÑ‚ÏlùÓy\É]Ú·ž\Kò‘í1Ÿ;ŸýWþ-Ö çž÷³­1ÁåŠgܹ¨ÎÛò|És%žÜ³ßöÞÛû¹â[3Æ÷E.ÿÆ+ß]™ùî ÇyþVrÍñPJއƒï×BùF2û?âÿƒ{ޱm ®GŒÉ­ed¼ãüÏ8OäûƒOñ\õzÃ2æŸÕö‘8®ø w·Úwº£¹ûX—Og‰ùãÌélålƒÅŠI‹sGÈ;r& ›kržŠÓÀ~øÉYf?ÅÄ$`ªû‡a‘žx…_Ĥž^ LÀß?NËXîyÀ˜]p&øøi™Ç· äÀ§O»:¾|Ø®‹süÀúp¸)¼]<%*ÆBѯØñ_KýÄé›îyŠÞã\øOheï ÆÞî‚9;1Ýþpܳ ~C Ïy§z8ï¤çš×„hDpM>ð[åÁ;ʶäVß¹ËßNù÷Ðì¼çÆ;ú1žÑûáÎ?ñ•x%cWþ ˆ^·péûO¹UŠz,¥2^­ÅRîü•îg½ßkq’wn›i±óRšÅ|îëXë§ð–¼sÞ>¯†Ð¡óÎÁwÞyÎ#¯YfOÞÙTÎWþÖ¶:—™\ówkÏß­#*öÎgþîÖ[ÔÅ¥.„óþ$œ÷PvÞ}ë¼õ+œ—´9åšÛÏg1¨;î"x6Îm&÷+-ã5’Ï3þI‹eÝa£Áu%÷#y´wž3yÉîa>9ŸeÇ){Ü›Å"ÞxÒ–Û æùmzÿ&¯'ï)ŒZR¸7Ë¡˜V,ÆòÆùMí=ªkÛOèÓͧpN—S¦ËWá&íûÿ$[Üæ?áWÇHÄpŽÞí:û{ç#ú|bžáùtn‹Ó¾ñ0¥Ó9Ý>Ïl+Ÿ™cN0î9®¶¥o´s<s‚ñ5‚÷é•9þiCÀ«%K‘23¹7{¦Qc\ÎdëjEÖ'7ÏM2žg²}kÌr³öHJ²öH[Éþ[¡çYQacøõOÅ«…éz#Ù®¼»>Øže"ïcw»>ôaìú`»ÿ®ðZ yb}öë7¡©Ð=è~ýêQ4¿¹xM-Гñëo¶ëCËŮ߿½ øöíúàcúÜÒ«]¹v}D%Û»ÎåÊèjû–¹è×G8§]ÿð¨ÄZP‰Ålª;j·ØõQAÅ®r»þý->FuÌŸÝ¿e°UÆ·[û'ocu‡R6‡ïø]æ×mê‡]GIö-ìhÞþ…?{Øõo¼íá6Á§c÷ßöi¾?~«¦ÌëÞ__¸»=¿ºÉð%Y›'wá3ÙúíÁöì°[Ÿ€­¯ÀgK¶yfçòP³Ë8méÙáÆ}%Ï#yµäs$_yÍRòš¥æ5KËk–ÏÞˬÉk$ŸÑÝ×”—lïëb‹íÛÛü ¶ylóyA˜ÝÏò8c›m>¹ñÌolß2ؾ‘2®ªçÄ{ÿïyÕöE`ó€½ÿCW¹–ZÄÆÞ?‡ç˜þî:cƶ;®\/>Ù×—÷äëØÆ?ØÞ/Øæè Û· ¶9äX¹+×ÇCÖÍcæz ¶ulãšê6~¨¯nÏØs‡>Œ­ï`û¾Žžû£ç>áh¹»Oªå~lïU'íý‚íý‚Û|g{×Y±ÒØöKGÉ}cG²ÍÕ‡ìÇŽ#÷i`¿ÿ#÷uàs½2«UØj˜E`ŒstEq ¦*s,‘çÊö¶Fï{óµo^ûš¸ÏȾV 8»áÌXØaŒg/þö"cØL8ŸyÍrñšd^ózðÖít†ÝÃç óÃÖžŒsENZ5_MÆ5Gœ¨3ùÆu&ã¬jyˆŒ_0Ï dØßªgWrëÉmxþEÿT9/óþí|6ðü@ [‹xޏÂXˆé€i2°HOæýì‹a“Å9kðÀTŒ­g &áá™#„ûÅ~ž…­»¥èЩ¬n†®^ùXH®‡•Œ/‹ÞÛv4¾Xzo¯°Þ­#Œt CŽØÂÄ9¥f2n3¶F8“Ï0§.z7Ax„Cà¬á8[¸Î^ˆs„ƒe¿ Ó­aLzÒÃQ‚²_†-\/P?6L'jÔžáî¹Ô›$¤C(Ó¦]˜Ú(C+xÆ ƒ ïºI¼uWñ‰¡ ÅÎ]ôsbÆižf²å3>'v2ÃúÉ]îÒ¸špÇ,ˆ5xÐŽV}Oˆ¯™©Ï[ÙD 'ÔÕf¬BR;qhqû 50^·†‘¯ íµÈC05Ñ  ¬MC+„û–WXq]Zt€ÔK%r› õVnž<ôÔÐý"ÎÈsb@@ê•î´“+%ò8ä! :µÜÀS²v²÷`Ö¿Ã…Zп,yDä¡…9z Ý_Ëœ+ÇG •5üšD€|oíp§&‘ãA±xµ"O¾{h,³nTwmi8hÍ›D ‡g;à™mylÝË_yf¶Èó%pÄS<ˆÈ¼àå?ìÖ‚VÆТº;m4´7´¨?@{޳+,‰?в•¥Ð~9k¹4-£æåÕ)»vd96-Óv+ߦeݤÜÛ·’pZ6NËÉi™9-?§eé´\”±Óòv·²wZï[É<-«§åö¤ Ÿ–绕íÓr~ZæOËÿiY@-(eµ¼à­ì –#Ô2…Z¾PËJ¹C-ƒx+ø­„¢–YÔò‹Z–QË5JG-ïx+û¨å µL¤–Ô²’Rnò[IJ¤'8ÃjLÅnÑzIæõÉ%ÿ}ÍÁg}çía³£ÑŽ$îG²\¿–üÛ-êÌ{&¯¼‡2Vroñ,{‹\Fô B/^xïB‚aQfßîÊÞÿ;’#¸­x_; $˜÷¿ßïÅ.gêâô‘œfo×ûò¡v¥EþLxY8ŽÀá rŽzøiøaÀ{Ãcù‰Ïˆ:óøŠX¸ƒ%¶Wˆ¦øŠh-X´ˆcc¶'³bAÆôö÷Óø¥ˆ8\ ï—R›°ësªVl‰=q¼!^2å31^i‹;ÃIÀ[oáæâ=ÀÍE 7É.aÑt”p:ü1Ù©´º¡««ï—­wöìØÐgð-á‹gA Lع]+| †0«{\Ë‘n+3®µ&·xuåÀð0ƨ1Æ`¢fŸï‚¯HÖ ®áÓ(»»‚û•€±ÍŸß³›çww=˜ß w`X¹mg† ‹;‰‹+±íư*XBÎrw§íähtánÏ‹à"ÐxxÙ­ß|zI+ˆ€X¹¨ç³¡G‘r+N¡<w–5x€ÚoM ~l®Ñ’{õë[A%c ŒÛ /üd»ç½£µb·_‹wa-$üZløG \_ÿ׿^4øU›ÿE¿ö j$=? 93ÚS÷ú%½Z[æD™É¢Ó>lªì•äû;_qȰíïµvµ¯Öé½ÕïmR×·K½_­œµ_¾×>³Î°Ö¾Õ%ÖzÅZǸI}ã.uµ²ÖIžR?yI]åõQoÙë0ŸRŸùü¨ÛìõœµÎóõQÿYëBk½h©#­õ¥¿Ö öX8Éøü^k\wi3äog^óÁÇŠOÝj®’Ïo|$¯œ&˜ŸôÁgö Øú \WL=ÓÞØÆç™eÀÈ®ýsºKÞ¸Ïä&müÙ‘Ÿ4ƒ»×Gý™lÓm<ì>±brË>ôq{cÔ;*Á>þÁöï÷Ò¼OzÔ¦FsF;×XZz³åjç×cÀ¿ë¯4NXm²Ô!·z/äúIQŸ|æwTüšÛ6ò´eþ…í·¶­ç·üVoDk’h­’÷z&?l9ùý¯¿ï½oÇÊÿýß¹¸Œ­zð‹‹Âð×#¿àxY­£”÷þϹ€Ù”XOîž„ !´ásà:Êç'×?3þ–É Îõ Ïä}Î žqÍ;/áS8ïùÆ{ßo¥IØ·pºfõÄܽS,d£ºÅÉ»ã°ýmçqeû¡ÿncàÎ?lðc¸o"hÎþÚ<\¶ ª»º^ßîÏ×Pޯʎ̧¶¿Å9ž|ÉÐl1¼þÙPÖ¡ÿþyè'tÿ´¾|~ú‰ê§ûíó¾M25¼—!%CíÛpœQ”Z~ý}<­>_+O¯Ü€½ã°ª0TÏÇÙ}RÒXmï—}åïúzãŸ6Üÿ«þes<zöyð—‰ø„…R×ÍlD—W¾ó ÷ÑãàöÀÓK¬Œ8K"™ó¢SúÆÎ#³#qÞ,é_ºó¶êÊ5Mغ”UçY‰%væ½3ÎÅÆ‘8WÀv¬ÃÞeA HN³3xǬÃÊô‚ðÞZZ¢!á ÏÊev°X¦%Ú¿K†ÌÏnLO •Ò§´¡˜Â a¹¾ÜÃ[xzþãšS~k÷æaA¨&ÏMñ^þÜÛtgØ@ÒhÁ#Ø­ç# šBNæÍ2.OFûã­˜å»ðð$L’˜‚úé]³d­ã­^Q¤¾4ŒÛe~Ù¾á>Ñ<ŒÞß&«¡oy? ±Ü¼ÏÆú2 îÛv6{ÆN§+ÏÂ>AòŒ !ÇùÊþ„çÉߦŒ„Ó÷…{Ú²`‡´w´ë‚3‚ÝW¼kxÔœñ]p< =Æ…fÊÖ#ÐÏǃÞ9Æ&¿5Ú ù­ÑfÈoÌoíÙ1†%Üt/°Äò›&R@ìÓÊ ïµ’Y…Â[§11öìL·E¦lœ (sq®ìVbŸ-T’Øu*"ðïuØ­þ~äGû;cÌ×q ¦¦uï¾â˜ÿ€ÇŸùô›¤Î²m¡ÃÌrçfW*nU‚TéÞlSê6ý™{R6¶*’9Óܸí„Ôƒ÷†êl»ƒ×7nO>÷½qç¸-=“.Þ‚5|úŸðŽ sÞ'ªifÛ}âå}obÆGrïOÞÏk+ìçSx|ðOb8ÜîÍÖ/sèøðÙF%çÙþÄq ‰!IîOÞÝoÖý= MZ¦!ò2Ç7ެ´á›æ)ÃAyè#pÚA½®/¼ïÍ,è;¨È½ÿÞ'wþ±C`Û%æï5ôW0ϰ`sȓ˃Ç!Ü…Ïwžò·Kþv­ü-e¾R‹}ºœ)šüÆ{1â°ªX¤¦‰¦í SÖÈTFBð¶úkdzoGÎ+Ÿ1ä!mgØ|f;ŸÜr¸m;çÒŸæŸLþ¡Ã ú‡c;úEÀ±\opÏ8ØjQËzRKðÆ{SäŒÙÇx›¨Ûñ…w—SgÚÚ” ¨pטŽâïí׿׌Þ¦AÆè ÖÕX¦ƒ·CnWéO.û&‡ðJÔ0Ü{¾1¯ãɸí‚gçõ·©ÕŸ1™ãÎ;aÁ™ýf1jë ïö®8pŸ‘Ï<<öH¹ãÙmhïöfrc¿•'ï~¶©ï½ìR@qÊGòyÉ{ûÍÜ»ûÄL äõäÝ·–¾ðެýô÷ûÆCx ¯/,×§i ¿KÝÎ;ïiÉþekÀvgô§ûj[ò<ã·n|¶ä+þcé«´éòïã|çU’OiÍWÆ÷¼’åî\ãDÈ<û<ç“;ÿÐé³ ©bïÙ±¬\ìß{I®ßxúfÕ­Ø ›%«l0Vµ©úÁ\ÅŸŒOÊùJ>WìåïŒ{ ÅpŸ‚mß½-§crª¸3ž÷žÂíƒê˜£Å˜Ü¨ÐàI>“Ípzã܃OlÌè¨B%ÛŒ½pæßNÕæƒùÚͰ¿‚׎Œyå÷§á䬷‹Ç+†ì¢E•nãpðÈã®ðpïxÚ_ÿ‚Üꌒn†{â'þî†A#¡eÀ¶õþý\Š;܉ É?‹¾áíå…ïãܽ¼0Ô`«…š/´!¦Ù'ÿz TJ/œÔÓ¤NªŠíÕƒ¶»ñ—+ÐÏV¿pÖöëÉØ—ak?|¿¢üC‡çäW¡Çè‰oÜ*ÙŽ@,.O„E*%XC)ÂŒó6ÕOÃP|Óýä!áá~˜jØ6rwH…AŒcJ ͰÇÍh¨ªðEBAŸßà ›Oe3MÑ;7ü¡C¡Ìûõ!ÄoŠ®VØŠxZ€ƒYïïŒýv˜‘RÒf‰7¶k¦cêÀé¥Ô÷ô\ðk5† ˜«&§'ÿ¡+‡­ÂýËiÁ<ñÀ¬Â®ˆ­ø2_ôH¦AÒ:n~atôžÂãƒèx|u8âlñ®ýŒ%zõOÜY|¡K ŽºHý§±£·ð"@4€»³Že>E,ªDœqõC¬~gº!®À£SŒÈ 0é†XW8þb| L=ØÔݰúz6ŽxÌè¨þÐQA‹¾'öÀ÷‰-f°'Ö}‚…öJÇx&öOÜ_„è@½€ežp&«—¸w<C WÀM*áý#äM þзWwY›±ãÜïvjñ²®Õ.³ …Ö+B:ƒó>:£\¹1jo³~ØN# ÞƒñÖ>Ñ»¹­+˜ýcyê-y–dÔ6n¸~Jg8—#ç>ç³'¯lÏ2õÆ}&£Æ°ñÞ¡ÓÙÝýoŒàç½J:¯l !g|ƒÆ{sæ¼ #ÎøàÈóÊkîóbðÌ{ÀVÕ¹ç5!žç\òP?ÉuµW^5¹GÞ ³8Wi_òÆ‘íia3^y}æ=léÇà–ׄ¸˜õÿÖœ>òý¢f’óÊñ€ôçžï5“œkŽˆ‹£f’ó9ßyå= ÕȹåýØ7K>òÞÊy~aôy%£²x¢ƃw„È ‹߸éI@Œl¸ÔÒîÿjéo»ÿ«¥Ýíë[*ÞÃ}q2“¦¼w‹ÆH‹cU œ9c<ï%ÊãÇãÊx]ÉW^}å\òš»Ti0¾#]ÉøîŒO¹æ•×DÚ”sÍkî2YÁ=¯Ùf^sW>åš×ùÊ[f!¸æõQÌyäõQSÈye_õ3ûj°ÿK~wÆìÿ’ß©1û¿äwm¼òr Ï#¯9K^s²ÿmžéÉìÿL¡rÆ|hŒþwù¦+ýoŒþ7Fÿ£ÿ÷ºàŒïÅøÂ5#M }nŒ¹ÅƒáJ2ú¼¥?Û}þd˜+Ñÿ-S¨œ1þîÁÒpV2æsã+ÚTÄ£:cÝ1‹Ö clàŒÇ™¼ð»ŒÃÀø4Ƙ´:¯%ÛìÔÚà6“û•ßùB,È•Ü嚬?zçš¼÷0Áý'®ÉþA|ñ~Gε&ïùjÑJ áQg<»ñž÷œ÷|h÷Œuʹå³lÉàcct^Ùë¦óÈknÉš`ĵ¼pÉG^kºóÊëcoï<òž±·w®yMÆÖq?Ð(²>Oð¬Éì‹—šÉµ%#öÅô2®3ùÉ«&+¹Ïäc À•é|Ęá~~™×žï×Ä‚d¾_ îÉ|¿\ø~m½›ÁØÏ;ã;¶Ÿ_É{/ç¼÷óÎ{þ±Eìç÷^Îxà{yás ·äu}á÷i<²íC”¯#xˆgò½„pEÚ36ÿÞ‰áŒ1i©pÊø-Kcij£O¸žÞgöŒñÓ,¨g$_W0ö«YÿLî1g2QÁïÔâÞnŒ¿µˆòñWÄÏ‘Ï'WŸÃË çµ¥Ó{] Cà’dƒ%Io\}íp¶TÙæëÈ“—Õ¢Aÿ[ª&Ø3žl×Äs5áõäìg$f·hsçýÆ˂ªÂG}gDß{m–+¹~aÄqZúóç~ÕïáÆ-Þ5®cãa‡ïå¿?Ø‚×2–Ñø|rƧî°Ü¸W\/|fŸÀèʘQ²=£ð¼²æÁ”f}e„Ø÷Ûcl òàr1teÄ;ÖœëªE71NnÜÓÌûÁÉäRn÷ ÜäÞÐưHÓå€óŽ3cˆÉ0¸iÓ¤M•6ŒKÆ{7“8~ã%m2â„Ò_™éÃ`“ Wù÷fÿŽù¿=kSk̓회i–?òßýÞZºsn\3F¹é"jçõ…³?›´)Ÿl×,ò[Eîáxç)÷ìýßÉù…KrkÉ–’|c8iŒ\f}²ÏVó…w›iéÌg2ÎìÖæÆûáu“ZþØ¥¡•pZ„¯ä>ßyÈß2ÓÈÆäñ`P™MþB^ ;ç"ÿÎЙóÁôµ’•ÃgçñÎÈ CæÅó¶Elöñ'îÂ%™)BwF_ñú=",Œm{p¹„§p{0"bŒ³9ÊxõwžyÎWÆ4}cÆâ•dJ=°ÍÑŒó¦ñ’?óß'ö´U¢õcÎ4Æ{?¤¯¾rîéTr^_¸ çuÆy}á),{–'ïoÖêªõ3¶;kóä.l‘Ì%ïáÁ&=DnÂãÉ5ŸïÝ}5ûP™ïŽŒx€Ãö_6ºk wáãÉ»O˜r¾·ƒÃå8Àü®ïP"Ôe‚ëLf(yœb ‘Ìí* Ù±é…M)§ø7DeY[®_¸$[('¦Æ9ž<¼glš1^Ñ»wF‹`œ1Ž âϨ|ÆH1—»q;‚ ÿ;Oá.\ž\¢ßŒ[ò:Ÿ\}´Q}Ö”ÌJÏ­ÐOisåßb©±k>ØyÁWÍ¿õgžÒWgI¾â,µ´?ñnäcìɦä wåªÉÜ*Þ[Wþm-¹µ|2ÍdSóªrO¶¿•g©òŒÊ2Nþàa)9ÆêQ‚\ówÁÖW~;wîñUÎÆ—´ùäSØë’{Hn™ÆÇp çöóXi|fmoÌ䊒¿UòÞ¾óL®Ux=9“M+Cá’}áæLô­™rë®Tö¿¹_î|„¹áHÁ=ÛÜ8] . bœ&á;§¹”<òwMÔ†c©ž_¸&{é[aš1JŒaç.ïñ¯oœ9Òä*ÿnïåÁÖ·c½ŸOFˆ?¹¤i áHf¶¼1BóM¹¹¦¸¶ñ…i]„g¶1Õjeæ‹å<àLsþö¹nåû-i¾½óŸ>—b|Θ'M2âÎ5Ü•îY^®T?^(ï¿åœ åò5lnÇîO^áB,)éÀê¦Tª\ár<Œ÷»6UòCúJGç)Ü¿1®ÏµŒ¦q>KKwâ{¸_x=¹„;´Ð5Ê5nšä_˜ w]Ÿ<žÜóžáº´g&‚=£2æIS¼²ßPŸÔÆ“îÞxÆøAò›¹zpt³ûG ½ë¶LtY¯#<Á¹ ÏwF‚ñ•í)ÁñÆ3Ç-ydÎ Êôq>åß!WbŒû4nòïxG4ó@íéÉ/G Cø®‰#Û"òزmͶ¸.­(Nhˆë¡{B„«œØ³-Dø!‰G´e4ñŒ¶Œ¥ æué™Ç‚T"â(ˆRa-{,›+òé g´EH¢a϶-Ûæuá$Ž+~x (Šˆ—GÙ¶gÛ–mK¶Íëö¼.ò| óº}ÄÃÓkGlÙ¶¬7<âÙPcÔ±ZèÔ­lëØãu3Љˆñ@Ì÷Æm ý€£¸bÜölP?wfx9ò׈°""úž™ÆQý‰K!"`²KÎÀ‹N‡tÓG|Ýc’ˆð¬O°–üW¼bÏÇŽ˜¬ Gbû@üYç° -£¥Ê'†.Õ>fؾÖR  +2fˆ5ˆ-Ë•©Z8• v®¯èlAñkì~|b„kõ3"–8Ö1³+®è3~è>#@é‰G´íùgØ©)¦üï[$ ø%"c—Ž[Ì #Öö†X˜ŽG¡&üÄ ¿`cäÐŒš#æF„ ÿ ;™ž17‚ˆ dÕCTP7DJ g"ìnXý‰ K48ÏD’*1µÄ0Ãñ‘=z °l¢ZCH0]Ñ;«ˆ 9ß<Ò;_¼«ܛޯqùž¾S˜°} .Öò°ßèðPvvß¾_|om…ï×BiñÄÈ^ì(ôCý@üßV=|"‚^íÿi˜«ññ¶#ÿ992´—[äšØ>1B;x¬ã¿žì¨xEˆïG(Ü$wÿŠ­`Ê~íà8Š˜wpöFáS;dð ƒw§–¸n 1ÆÃšîY„V,ù¦ ÚE÷êÄX´ý˜§¥ü5N÷¼ýÆR?±&öı±}à…?Ãíì~2*{¯N'¾y”¢<ý ÷=P±mO+†{~âÊçéˆñ`X¢mãÚâeíͯá™0äuçåˆ/À°D[|-†-ÛŽ8Gàʶ×áˆ\Ãm‘‰bسíh3n •!z½Rv –Èë{¶Ùvf[Œ"¯ËMd,+°^|›À1çòA/í¯æˆ|Yý£=“1œ9ÆÈu&sŒ‘ñ]c ­Ç™÷OæŽ2fSãv$÷–<òšHPw>åšW^³yÍZ³Mmí{>Wù\¨Ÿç|ŽdÌ!d$;ã?,Yk%çû­-Ç“£œ¯{µóä΀cÕ6 ñMÕÎo„<â;­}žÉg|ûw†5‹ÉÿfL¸È-Žä8汩ö‘ÉZ7†iÀö58Ñb®«8*Û^îÆ´L³=t_¦=Ww úï6Íúaº—à7#@íz0‚½˜ÀÖ©ÖØÈðÄro™+µeò0Ɇ'³mwqHö~÷œÓ-oo—úOî›íýÖÍüÛ½6uŠRß"ì&œÏL>|e´áXÚópümÙ¼žŒ{8cLvÛM»ðÄÿ›ŽòúËÙª:Ršþ3îáç“ÓžÞf† 3uÎV³O¶ôòi©Óͽޙv^¬–æ!×ùä÷c>o¤=šúÎgø#™²íܲÍ{^sÉoíÜäQ“çüàªzB·Îvýú³öÝM+’¹Q” ¿0ܦ–ñ¿ /枃ëÁ U=ÙÜXâ^ÄÄa›6a¸“œÏt;"ÌÀ¹_b u@Äô•\ë“W a„Lسcñ›n! w‰1Œ8Æg{çKÚ\ù·Ñÿwþ©Ã­Ô+†[˺ë‘yÏX»¢¼3ŠŒyîhòÚ•« ™#=ÏÇ™^kJJš Û“3ÂȆÙêaß86Xü¡[TTõ5ôƒ÷½Yð"¥«Í³”I57^9”Ž3½Ö|®fR“yeèÕëèp»üÃüE›IÜr¶G„Ô‘ë|ÃÝÁ¨EÂJe”_õá¡8™ÂPÄñŠgÀ™‘ˆÆ Ä-cW›oÊ(’‹½ ò¨¹ Pl‰#1g%Áú¦-{¿lÈZáEä¸bSÍÍ6T*ÌòygXOÍ>á3@Ó½3>pkƒ±ÙB—OoÌ Ön’çƒaž6fh­ª [O>IV„T˜êÃ%FÄLi‚פÒBBLiá$Þo7ŽÐ^Ç4è–ùÉÖaFáÓ·˜•!!þ,Êi²†z‚™™eͼ³èý2 „º¾°›Ö.TN¼”ñ~™¡DfŸ“ñÁqÌܹùDE~Ë<8ÓMñÁWŒN´ƒsa²û¿ñ•ÜäqŸoŒwj‡ô=¡ðÀhÿ~>×ä»Èl@»æ*Æ=8ɵ}áð?™zÅ‘*u«–/ÜãÙ½‚ Âg¬²Š2üÉÆRÝ¥àØc ïÆ“Rä\"¤®V܃¿-áƈ¢hü\aŒ±MnT°CÜLFÖn3ãCK¦š@ò”6Ê#¯©Œ~à<ÓF„Mý>lÎøÆqµ±qcfÉòMgÿã°\ñ,®nS#û®Âo6ìpœq}aÞ™ÑÁgA¨ì¨f{ã–Ì,—òä#˜á®ÆP­¢GîÆÌÞÉyÞ…0÷¾ò>óoÉåÁÈɘÆÍ¬¿yx8íO¯æxc(z­#rî •%ã%LÉΖ¿Eb‚©R^ŠþÁ+æ=\‘Êkúz¤¼Ná\§`œå\§°Fû:µdZ²N²NaÓÎ5âÎ0m”¸·å÷¡²ẵ²òU‰û·ïHø‡n—zpmÃde¸ f#žË0v¢ŠLßF[Ö¶D KV:Uäbl±­,PÿâÏÚ'b° ‡k'Û>la©ÄÎy”8[9ôdìd[?éåì 8}`ó1:ò¸ý{Ã:˜ÊY,}a—fº˜Të3îßøJfЉqù/á)<žœ),ü­5òæ7îÿ˜q}†—2•Ï9¶>x…ÉÒ2- BžKy]ÉHÝ0^öùüÂC¸ —'G^^Á™ÓR^˜9ÿY ¼gf#ó>k¤iþ—?ó Ó°¥š®úÚ÷ÆMØR2eçÆ2–pŒv># ÎÔ¹†¾p®ÂÇ“ã]üæx¿¹úxû—OnO®±7ãïbNfaZÛ·¼°9¼ÎW†™ÞÚ÷|Ž·ã k»Î™}¨Üz2ß ™û"2ó6Û;[Wì ¹ïBˆ·íÇîŒ4»%l×Á¾÷xgž³|³ÜÃ÷gÖ=ºm¯{\‘Éüw|ý‰Ë‘÷Cµ_>Ká›OÆ^ôL¾ÌAœïåÆT—'§Z‡)¾ñ¾’WûÂx<bß¾ì\çZÎÔOcöUIEƒ;ão¹ŸGÔ˜íó Õ Ú“ó,clgÌ#¾‘;·øÊ™ßu‘=ù/ÙÏ#™)O®ÂM¸cŒ;Ë1>kËg|asÐ_åÙçø+ÏDÂUÎJ¸O:Ž©*ÛÏ|^cöù™ãÄk´1TŒqö4ÆœÓå[0>ów©¢kŒ3請ƘÿKž97ÒÇÅlª7ROÀsŽ1²ù½`vI®g2×AògUS%6¦D}ð<’{OæõÉTF`<$ë ˆä=¿ððùŠ{®üreZ³2jý_ɾ÷»óÝêNlæçv(Lîöw§AA…i,1Š%DpqE`“aÇêç(“Ò¶¶xš‰a¼ôû4œN¬¼Ë¢ŠŠð}£-¤!X–Ç8kd.'vB"¨aÆVdN'î—¾Û OŒLÒvGʨ6áÛEúUéy¹aL'ËòâÏüÜð‡Ž¶ ãêÚe )1q¸•ÈòçŠHç)áÔbÖå{q7Œ¬EHb86ϸaws-ÛbT\t¤<ðŒ›œ‘ÆraˆQ;D¦kSI<"çõ†‘)mZtOJþ>°xX=u†1Ëž™çrÃåægþÙÁ+tÿaÅÙÖ'ƒf€=À†ñÄðr &O'•@D>ÖYK0ÌR½–õ+ñ q]æñ"êøˆ ±®l0{\ì#±ÿ—[ªyvëxYî8K$·œ©pªxD÷­|,£ý@xx/Np-‰0Ol>&æ+¦S–>ìáAd‚#'Nä ÕùL æŠUÃgvÃË=f«EŠ©ÓöOÜ]ÍJL0¦]ü³$X'k˜z×;ÿb!ýÅ7DØúÀꟈI<ã_©À¼>1æHÞ1„а˜KnX½Ï&s1»˜lnxùÔÆÛ±[4xExf‰-âå&ðˆL:Á „¹xP´Ç3—´·¤|6Òý±9˜·‡ åë™äƒ~`Æß^#"¥^Ïè"&]"¦xâ[G\ ƒÀ°ÆÅV‹­[3.†ÚÍÌæ[™[¯Ð°D2äÙ"Éúd%5¬"ÉÇÄ3’¶QΉÈôeb_C:„a‹!Â03À©Oïz`Gr‘Dò*ÉãíüOá!ÜŸ ¯Ãqz¤þæ À<º$Ú+×+¹Däà }Ý¿áÛäÿµÍ™Üè j7üõ/Ìž‘»×™ä¸'SÖXRd%(äIíŽg6np°ÍŒëäu‰ØUgîÞßQ¸¶?ø–Äù$.©WŸÕ~ñQ0ø×­¢°Ô–êÃR“ø½h1Ži5·…ÿaNŠ ÜÍ„!Cr­¼!Þ ^1«;óÎ^+ ÿà׆¼©Ý#¿˜÷híãoÚz—óù—|b‰XÅøáþèž^4Žý¢¹†v²É°Zyú®DŠ·rïù#bO«5©ˆO:õǦz4vñ†g4àÈx"ÌíÃ_1­ÿ쇳} L®´JÁKˆ;[Ô×+ÿ †)51èùØ¥£D® »‡÷›ÚsŠ [¢*MôÎbðlÆ+‚‰ý/¯øaJŸØéµàËŸIñ ÇJÇá{Õ])Ö«%|ßküb”œ´? wp¬¦Ÿûø@êÞr“>Ýøkþèú‰Ó»údÀ¯€^ïŸ8}”Üto¯7å\ÑÓM•]ÑÞUE^Ñéõ^Ñô¥ßÔÿý&|—VyáoÄt–¦1&dvõ•½{ÙaÚa4Òåh?,8££øÅåõˆâVô)Ÿ=8‹M2f5:ˆ¡Ogâäj~lÅQ4Üà3fÕhÛ:–ÄÜÔðb\‰3q¼àžF±¤Æ_jØJ ÔÊoêã™æÃñ=‘!ùÄ+.†zc„âú˲)¿áùgüÁo¥- ;þõ/$ólÃõÁ¨Ðƒ¸Ñó¯¯R¢0%ºS¢F•U¢\¥zV¢rõ.ƒ…m+’Mzú`;ìÇùHÎ 2 Ÿj_=лï†?x¼„ÈÕ/UÁm¬/âY5Ò稆Uµµˆ>F?Ýì’ =IÌFe_Ä£ß0–…ÆÊ£ˆ}M™8bp˜e-€F$$Ë—^/Ø3Ðp$®;òb+]Â8‘ñ‰¸_6h¾äµ¬„£xEäT$ ¿Ä øØ^Û¶¦Äf'ÃqWìôŒÑéóxÃ;½ÆŽÌŠÂÔ<ÎÄ™Ø_ʰ°MÂn7híq2€Ÿ1+jóΨ‡óÜjØÈ¢«‰ùƒuÙi ­X¸‰ØìÑ©D1ˆØLÒØvDîƒ[¸© ±¥há¦æåKÄ ÈªàÀ+Ðî@Äf’ˆÊÜDö]²+0KÔ¯¬Pϰ' #”ˆ5œ-ôlÀè3 ƒÒx5‘žI–‚¿î!„×HÞ/À¹K›&möÑÔùÈ6ÇÕ“Ïlƒ`ç!m Óâ•OÖ–6{mp>棌‹áŠÖ×ÈЉ±b4õ ó¾ÒqÖ@¨ÔX±ŸسAÍ%Í(à 'Ñ-öá¤[ X³A‰ˆÝ2<£ÁÎ!§+ű{lÙ dƒ#Œ+À³nÈûŽl- y¿@Þïð ²cYê¼ßî“)½‡ŠYŽDœ;o’KÂt¹!(Bu*«â&¹Rã&¹*î‚• •à ÷Zÿ‚ø ì7fŸ˜ÓÇŽéØŒƒØø~!#4°»d 2-üÊ&iØC0““ÂÏȹ±*ÿq bb“S{8>’+Cãl«ïÓ+·ìøWæ.÷ODà%¢š{l×¾(•Š”©œŠìé«.ªlŒëï-ËŽ³±þßß»àýŸ_»$Ö†ÿCÀÿüŸ Ð{K™ =¼_ÿzxÚFÿö]oïïò‘оø_[ñ7r±ÛSÎÉPhˆhZÍXÁßïÿd¹ hÀ±¢äò˜=$á<ÏÚÈ4ÐÓ¡÷\w2Å·CÜSÎißP¦w9¢¸ÍÉ/Oegê:ŸÜaCÿÐæƒÁXFJ@@’“„]mþÚ÷Ë Êu6×Õ@èÖq2„lÝ!ZG„¾MnG4@2¦aËÐ>$Îl°²Á °ßäí`¿i["Ä.‰Ð¢Ä³QŠ’5W"Ô\ Bzgðy“ô-ï_ö|âŠw¸yChž\t‹¿Â³Æ‹¥È$ï>ôqÅ(ýŸxAó‘åä [J„¢!Â, =C"Æãˆñ`å×ÐÁÆèáÓ6œ3b’Æø¦Œñ¡œt«@,Ñb‰Ë6f-‚¢ÆrÆýu ­– Z×Óº’¯l},ûX¡Oâ ±JcŒi*KcÙqÆP6ÆX6Æ8±Êåó4ÆgÍ\Q”¢rƇý‹6Ægn|â~(Qw`'1*!†iŒéÍb˜Æ+¯ gL$dlœk^s´¼&ƒÎ•Æ–Ƨ\óÊ{@3†&óF'Ʀ1§1ç\2†§1Æ'¾iç’×DЬsÏk®‘×\SÚ¯¼‡uå5OŽrÉ{ÀîÙ™ã‡<òš(§é|æ=œWÞÅ`=6ïáâøáÂ1CÆÊðÂ?dŽ2Ç凮äz$·šÜ¥ýöKÚŸ-‚Ï–³vÄýS£Æ¹µä>“‡´_1–*†ÎWŒ½ ½@çZ“[|SÔßpæø7}†øÆ©çàÌñO½ŽÓÉö°å9süÛžñHÆtoÌï‹|eû^²}¯Ù¾·lßåúßyõä3æœÚù}=xE¸ ?q'ç;5>ž¼ïsp§Ž•ŒzJ¦¾Íç'd\Ÿz5}ÈúÿŒ1Œ©øÎß‚ðï kJôãY:•û ßû™ qfã™í)&L],õ'óúd^Ÿ|d{ g “!nܤ}•öXÇl_äú…×·\ËžÌë[®å•\¥}‘öG¶?ÎlÈõ¹¾‰Ì“åú‡\ÿë#?\®¼þïùp%cž7Ò¾Iû*íóúÌ»4>1~Œåú§\zìÃßÓØ‘Ìë[ÎãHæõ-w2Û¯•í¹NËõ—\©#Î,€½¶Œçu$¯3yfû9¤=‹-`/g5ȼ>9++˜P¼ñÊö#Ë3˜à¼qs(ƒµÈEÚóúX;¯Ofr–•(=«M”ÎëÛ~éJæõmO…ësßÅë¿ð‘ÌâÆë§´r¬³&%ÌrOf ÛgžÂåYŸƒûXÎ3dÎ3¶×Eîc=5£.ÖYã3Û°(ƒ•adqÛ“×wF?³ôhÉùÜöùMöÿÆ+Ö¨qÿƸÿ–†ng¬§\+«;› Šrb/CÄvŠØ²6_DŒ ¦Ï¡«‰ÑD|DÚpÃtKÄlN,õQ"Ï#† D[½àȧ Ž7ìùg5¯[òÏøl0òÙ"Ù“edµ@L5DÌD.ðÀ#l)„2Äè$b’'ŽøáÑâbˆ¿7,ñÃÜǘûêô[G’aví [<1$é ±Q±Š\ÑÎH¾ îâZøè {¼Xn‰5Þ&7ŽTºç@¤q0†wŸDlJMúã–XcL²=00vöð®¸òÃãܸ¢§ŸÄz$Ö˜Ÿj?^±¼b}CÙ$eý$©ªô¥ì’Öeª‰å?ÅÜW°—GÖË™Ÿ˜ëy—¶¹*ÆÞοÖe üi–Ô'µ´mÄúµy÷ñ4ƒüî"j~Œ#óyàH?’ëõä#¹\ÂçŽ5Íÿöo¸ÇYÉØÊœÝxû¨dU?íwwf#‹9à,e%ÝXN±ñ܆ôH?‹##ÑŠ`09™Ân¨-ÄxLꯠ<—éÂÂÆcÚ±wÞŽû@Sã¾vêˆ­°'™FQ§^—Nf;ígŸ#~È ntDþRÁ!ô>UDt?oo—é‰Þ¸g¡ 8f§¥Î,šqã™4à¶¢`ÞÿÆ3 €åwߊ‡\îñ»¹$É~»0‘Â&Zðä^?3úü­ˆŠZÑ,ߊ´h!-ðò­Ì­PÌåY¬ß‹Ìh!-P£…k´ Í·¢7ZG æh!-°£…w¤ ê¹ðÑÂ>ZðG i )¤…n…†´‘&Ò‚Eߊiá#)ˆ¤…’n”´°’\ÒBLZ I 7IA'-ôt+¥…¡´`”’ÒSZx* Ri¡ª{«oE®´–ÈÒÂYRPK mÝ pia®oÅ»´À—þ’‚`Z(ìV@L ‹iÁ1-Dö?㜽L»RÓkZxM ²i¡6-à&…Ý´àÛ­œˆÓÂqZPN Íi:)L§ën…ì´À¾Ó‚xZ(O èIa=-¸w+ħú´pŸôÓBRP Þ j!A-0¨…µ ¡*”†ßŠÞ !jD-œ¨µÐ¢`ÔÂŒ·‚ZÈñ[±G-©…"µ€d–”z“Z…RjSJÅJ©c)Õ-³æ¥TÂÔú˜R5SjiJ…M©»)Õ8³F§TîüRÚSjJEP©*ÕC¥¦hÚäþ¨V%•Z¥RÁTêšJµS©š•Q¥^ªVQ•ÚªRqUê°JuV©Ùš•\Å<®U_¥¬Tˆ•º±RMVjÌfåY©G«Uj¥v­T´•:·RýVjâf¥\©Ÿ«UußËîJ]^©Öû¥œïû‰÷õt,ÇçCÊ3;uw8Öê½5þÙ¿ýÙÕÀs^§¿c¬†5Þ<Ö Ž¬"†3F VެCD¬N\X³ k 9¬o†{Õã˜ÄZhÈñ ÌñËåÔ¹ôdŒø¸,;cP˜‹iöäµ’1.øÕ`;àŒ‘aŒOÄ߈¹ÈFKž3yáÌW‚±q.+¹É{æâÃà3Æè3ÆghŒñg“ ]ˆØ¦9·’ÌiäÉCþvá~l­Éׯ6Ó¹f{lKñÝ+yoo/s½b<ïeÌÛdç½è9cLcPcTÒµ‹ €3Æ¥1æ2¶ùÎšÆ›ÆœÆÆžt;ãØaŒãˆ3fX㺒û‘Œñc<¥=¦-ºÄql2ÆqÊãÓS—1Æ]ô8®9c7ÆôeŒñCÆqðbhމÎ?Æ3Æ×lÆø1Æø1ÆøaÌñc\K2Æ1Æ…`üsüر{$sü€ Ç™ã‡Üòšˆàtæø!süO¹æ•÷PKÞC­yµå5a®sžyͺòê™×lG^&ygŽšß8~,Ïe溙ŒùÇ[¸+ÃÁœq º2ŒË¹Ç>ÄLt2Ư™šÐž»Iîç%õëjO^§ðõ÷Œ]®sùÂCøôÍt†šÞùFÕFÜò¯3ܱ1…Ä_cáŒQ]JëJ\0Àw†}D^a¥¢K=ç;_yýÿÇÝ»$[ŽäLšóXEn Rhor=®Q/ Eª|^"ÝûôBaPÞCFfÕ?sÉA|y‡4í @_ÞàšïÅ\1ÎýJ–ò7)¿û²_ôGÌ2tùØÃçþàâº$Ûˆ -n2ÄÙœ±†¬¹æ=]ç˜<äzHì‘—\tg׫&—,ƒ«“»\?² H(|ÊõW–aYô'·¼§ ù‘G–Á¥üȧÜóÊ2 ]pÍëÍ%êòèÁ#¿/çƒÏlHCE¾J~_é»å’6y›§-¼$¯–|ÎäëzbÏ‘íCÕg¡=’Û™ìÓóÜi=r,öœÑär´dÞœ›\ãfZø”cÂ"û˜àìƒmxg²÷ÙÔjî+æŸÏâúHöúqöúqö:áâº&{|3Æ.\ð.°%TÏÅX‘[O‚A˜q&¨gÆ¥ÜØÞÅ—5Ø w·{Æüb”yÌ|2Þ‘Œw'£NȨ+²?wfÝ’QçÌ7}åsýyÙüÛ‘ñMɨ2æ82ÚmÆÙÛs‹£ôÉF›$£Þ˜sÜëäʶ=®lód¯“+û‹§g¸ÐOÉè¿ä&×`¾{à#¯‡_›ÇyÞä`ŒídÔ9¹ÕgÆ:ƒ\Fò±~ÇÁˆ"Ïü-I7ù­< 'ŠdäS θ)ÆœþÄu× K‚ûõï¹ W¹OyáC®—oì_Œ\ŠÁÒ†´øWù{Ùm¬ ÌÅ#«‚—ü}ŒgîÙ>{Íöéël²÷ ®ò #O¹fäs}Œ²ö —¼¶¡à3¯©Ø-Ç™Üåš–åÇN/øÈw,W^ƒýdð”kF–ñÁ5ß±¹Fê\>Á3{ô|î!e¾s¾ï!ßâ¨ç¿gywøœ9#óËî]ù=}HBóRœ»‘^Ù®VŸ°äµÇn·p·#®}_DÀ¾v¶üYŽlgv&Ä'=T‡s÷xß9¶ù„e,ëØÎ<÷¾ sí Û~ð¬ûÁ³ìŸ°`‡!Îýˆ‘#àÈÐ÷ ž€OÐGlh¯@Úý¾néÅ}±·õB½6ÙÃ×­Ïí¼Þ]™½ÎeþÑh—›wíi8ë¸áJ‰í 1z¹@;Ïðœ`RRTJâÊçÌ–ˆÈõ3 ,~Ý6õt÷‰ÃöÁÃMq.uz,8\×½Zчû~yV&?ݹB’¾z~þ6ÊpD se²o"Žë€+r'À–éÑÍpòòôéiýp©¶i =#«.ξ˜FÕ>ìœ7ì”ËÝ{íkÑ“ØNÄÜ91¦ë'fd\ÏÀ¬g…‘aÇS¹?ñ|‡WvjöÛØZÊEÓ|ècŸå&=Ï¿¸ózœŽäy}s‰Hdò57¯ãúæê¼núrÑÞÒ\µw~sô äu%ÏùÌô÷#¹Îg>òžQWèláÁ¥l»ÞÅú9…g^“ü6¯à÷-E€$t™d`dêMH i $y¤4D™þ@’"hªI  i$Ù‚¤`Ä ™$µƒ$|xÎqKqþã!½„ ¤¢Ï,$Å…$¾xÉŒóqÕ*¡Dð’qCRrd¢Ißñ’ßC€Ìì´ ö³¯¼!’X$Ó<ç#ùNXÒvq¾Sž¬ÄžØþñ?E¬HÚ•ç¼,/9\æS¾I#ib$yŒ¤”‘D3’~æ9?ÍÑ·bòÔ»øŒEÈ0tCXˆ°.°…¤§7÷l8üëOÄr"'hrÍ3ª?ÑÊ‚ò«Õ(¤k (Ú -˜oü51ô¿äTÒ¤K¶²p£Îs®&Mæt…ê%”$‰’ÔQ‘$e’$RÒôJÏù—4AÖRþW|ùö‘Ü®ú}ígˆ_€ŸÆä”ˆ:óÔQX‚Óœ_أΰðð‘Å`3iXÚs ™8ßâÜßâíZ÷Œtû‚ëüøžj r7Žç ÄFÛÛƒ úñÊôU«øðj˃ú…ÖªSÌM ‚=>‚ –ò&Ï|­@ –A­ÏöIÇÕâqvÿf!ZÅqx°ÐÖ³|føB”a®èYÄòÑ7×¾/6°×šý ë¾VÜÝKf?ëÇDõU‹+º)ü…¡2ãvD4pÇylDööolû¾x OÙn‹C@nX¢¼¸¯×އ|ŒúÆ‘¸öÏP;Š}×™mKþÕ&”¨Ô¬_¬<ç€hCÐ7ÂÔ>w[œqÊF|7G”÷ ­R‰×bhó›ý@ ‰ÇƳ©÷È÷2¼æÚã‹‘¥’lï5OžøÉHwúĸ?Ýp­Üí½ U´ñÂÓnJKøüfûv~¶'~Ÿª>Üó·ß<¿ydn¼²ÌýÈwÁ¤ÆwTžÂgr=Ú ×XwÖ:-… ö1+òäï^çþÖwÆZ€ÏÚ³NµíçÆåØõ Iž»!ºy…r‘òØí§B}ŽXg^í…‹ð‘|^_\¥®p¾HvµºÆ5S¸ä5‘ýC÷ îÉH’Ë,"7Ʀ36_ƒl+èþÆ^¬Èq>@fÝ~³\ïÇ^T—RÆ>Œ>+ÊTÁ¶®xçTœpåÀàó›íYÝ¿ã¹úÈQG»ø¾7¶¶êîã¾åldì ¯oFnû¹›k^scŒ ^·¾àßÑ>ù÷½1ùÁ+¿©õ—øvÖïâ»|sMŽ:¼¤n“aÍ ®Â­¼ðŒ}bpËkÜ“åÆU8³¦³ /<.á3Ë̳Ç;Û‘FÔO®rÍO>…ãYEÊ ¼öÑ‘·áà~$×öw툦ð˜~íz(»I({ ÁvÏÇí3Ï´¡£ú€Ûÿž¸EÇüÁßè?kñçèñ5oˆzðkg|ù3FÞÎh%þ4#OæÌ ®àãàüåC7vÀƒ¡ø‚»ÙŸ}›øÎ¾­ßè?«»Júž±¶s[àŠ’Á Çý:þOq&bQæx>"VvÃßøH\OX·Ç ž‰èzÃcëF4#G´Iàé–Q cÛ?ó¾é8ógnâÜB§$‚P8#–ükË¿ú}˜ƒWþõÚõŒàZž¹­d ICVdLRÎÐ0 ö"~s•kªü6õûïÜ󹞸,eÀéEpêÓ»Þa0z¹É5XE’§\³äš+¯iG^Óä½Z“kܲí<ò]5|ög¾òž´›;Kù»”¿÷|Ç>³`N >³ C¾Ñ(ùÜQó[›{ÃæQ“±È #ƒ,íÊã1Èe÷Æc{Köoê<Ïd÷ür¾v*ìªÎuwæ‚æ`ïÎX]’WýO¹ÿ=È\ïÐ'û²ÒYàÎ3wºÊ.Ûcí›ã·ÎÓ3cÿf)CÉ]ŽOG¾Š`½¦ý=çÎrÁÃ#xæ}¾y¯üv¾“øfßùý©säÎà»0=î©Ãdè\/ÌhT”©ÇÇfÞæÒð‰›pIöÓ¾;c3…»pùb_í¹+¡ï\ÏìGqÍK_㳜¯g¾ª°ü–ïþÍùÛ¨+çúÅp„ ×±O‰ cúľê_Dºž™;ç!ïå™Ö)3¹”¼ÆE0nŒïN†' ÙO(¿ùÊë3Œu"¹·¿ã),õYë3ûI?Ú€»¬½ðtó›;áÜ…çãt9Ô“àá¸üg²iO ÏJrÏSgˆ_=qÙε®›KF¾…`,ÆÉ?±ñ)îŽòĸOMö±Ú¹Ïgn—pqF÷gܺû¼_8¾Ý1“^çîpÜäelÈ#Ÿ…SÕúžgÍÙOîÉç7Û8Ö8EnɬCeœÔúI|MÈÍOÐ×4á)ל?™÷<åYKÊðÂW–yù^«Êß›ü}´oNk¤[äG¶‡¸æÆ#ï ®ò÷#ÿeëi±¹1¼æÈðK"ŸrÍ•äé ®YŸÃÝÇfŽWä)×,¹æÊk`ò.i Ñ?ØËüÀiCl-˜§Ü“ég]MxÂpƒ/<ǽŽ˜iIÃo£ ÊȰ„¬\ ½òIÿ÷´öøºKÖZÁð18Èu[i°ƒw­'æ5}[Èå›·{¡¯]ãï°ô2‚àÆ-Ë‹ŠÏ׫^ùŽÊ]xJýÀÒEMÓ_Y'ðîq Øòüoë›aÃo¡í½yìk˜×lï·àöÌÛvÛ8ÓŸîÂ} ç²ßñÆîŽêì}ÊÙûiýb÷ó{¢={ý@›œmà/ç´"â(’ßúÆž‹ÌŸë}¤Úz.YÏ˽ùMG2üRÈpƒñ5ƒ{Ýá}ÐæîO|¤'ÖÏÁkîñðÆðJk¹† v¯7à¨èóÔáMàÞâ¶qì‘áè7„¯¼f”/†CQðJF;ÿfìaƒK^5RpßÞˆëÈéòècT0úŽ—{¢`øHõì×Á˜ƒ|@0ü¤Èîé ëqgû‡¦÷Z’1žûv¦vM`´²;T:Ã;ÃùrÏ çº]1ËÕfr?“ÝÒFd| WÈ9¼ À›š Áp$Ã[Š Ï#2æ2Ú$ù¼6ŒQä’÷ÄYÓ÷,Gj‘gÞ¿,¹ÿ•÷¯G^ãªEä–e®=ïYýû:û÷õ µts­ð »k:¹îïå:èÁýLv÷SçµÛÀ>“áq<ŸùÊwqv‘&höû8óƒ× ϯ~p>’á‡ùÀç3=''Ãüïu|1Ú‰‹/á\Îç7c.S÷®÷\¦-œž+õÎðÀgÃýÝïéû/ÎÓ˜o‡ÊÌÏég·ë…©ï­^ÏÜa¹¾Õ¶½I¿„k^Ãï¨\vèѧí!8iy›Ä5ÓÛ핌À2Œaþ­!ú\wRuO²ÇLyŸÂ¹%ç±dœs’qþInr ÎKÉ%ïy\yO?»&/¹g¶^Nèè{8×#g\>oº½™Œ3@rÖI¹†\ãu²|,=“ËHÆÉ¿ó “د™<[òØ!fù”‚kO.;ÊÌ×Á0Ê5žs¶dX-È0걇%㜟ì¡k¾€žŒˆ*® à¡@†Q”Œó.2Úv¬%Ðn9_Í® Ôs Œ¨D2ÌHdìÙÉ5ïéZEä#ï‰3 ï/yƒQçdœÝ‘aC!£ÎÉh“ÎÈ}ñÄhŸdœ?“gÞcNpËûÃÓ*øÈ{ÂË,øÌ{Ö•÷tÏ&rÏ{Ö–÷¬Eîyä=Kæ v†à™uUFÖ•{ÓkÞ³¹ç‘÷<Îü¦ÇšÏ<óû#¿ïÑäš*×ûžî#âxî¯~ͼ`ä^t`¶œ+Ž;#üÄóÜמ0$twQ¨1¤9z‰·¹xì Öµ/XÙ›Vv&×£Bs™*Ƕ{§Ý7Ýdê¸vïņ8êþ¢û•Zþ.éÞ5CÙ8]oŒC ò™n†w_ÒÕ÷‘ÅE‡ÿtMuž_Œ[ºa"|,3âÒ®oƤín˜8À\_ ÷·ÍG²}¦'^rÍßööÂYž‚…]Ë£þïü‹NZvø›]„ÁáX>ÏHYgoVÛ3:œÍý%Éõ‹Ïtê…Sp•¯Ú®Þ¦Ágr-ß<ö»@Û>j¥æq㥦ý˜íÌr~óq¦Sõ±äïãzf„ܽïHç9Ç ÿò(­ Åz”÷Š•¨é– ƒŽ"ŽùàZÑ]‡ˆÃìÓãþÖâ$Þ’Që ùÂY±G·èÒöj†Ö½K(âÎÑãK ¡¼;s—#N4ú…u_H¨xóD”÷Ó7\ÿÑ>h‡Sùýnøù0ljf”ݵý=–Ë»±C¸!ö [ÿÅC[ýýÑŠèÆõ?B4nj ~%ØwWSœ»£yТãµ/˜9v*bÄó\Àèž°­#ü Q­cß× ‰g´xE7í †Ïme%p }ÃÝÇц‡¨´ˆ±Ë-ØÑÃzð´ø„7ü¡WŸ/ó›n¤®T$¼É#ÃÝírmÌ )øÙûe…¶"±î»y ÄsßÌCÕǾÙÙ÷ÍàCD,y³c~e(߈d //?©úÐϵÜmmnÄ©+Ð×¾ÙœûfXÛ¾Ù¬ûf³äÍŽ}3Æ¡1y¥~!.À×[û Ì{û‰ˆ7BWÃa’éQKýºÎaáê8×#Úk~­“dêVýÂmðÚÁæ&lo¸Pü,±»oŽOÖœû ƒvÿ+\¢ý 32üXôµÍUŠ×ÆåÑQp»lψkáXˆ3EwtEÿ‰G| ogÅ}"Wò†;dlyd<ìIIñÑÀÑõoà8ʹ~"¾<®õØ}” šþB‚X9ÂNçˆ!ÇÿŠöÜŸÖÊi^º!.€?­G¢Á¿ý_è†GT 4ýÌßM"½ÿ;‰ó'îCb¿/ñŒž¥XöAóYö²› üfŠÛ7fÑë6“Üp7 ¤zöÏ3+J°gýºº’ïš²Rå(¢­»øŠ.ræiê 1ˆåÏ0+Ÿ×¶*ÜðŠæyap,@¼ã1¹ÿzOœ×#žÑ&‰p†‡%=ö†höŽ{°ABKn¸Ç$·„egþÄg£†x m8Á⃠‰]šÝñø—DçºØ‹s½’Ý~þÀh*îgê=ß7˜b!ìÓxá!<…×þå‘úRˆ×ðçåA…ŽX%Õ;–øÎË${¸c†.?2–Á^0 AµÏoƹV²î/‹‰ËnìÎ8~O´BîJ°_tãùOa†pÏìÝrËÔQ¶CÇ•›˜+×r7ÜŽGXWyq÷¸á/&™È8q¹§¾ÁÌÏq>#6û5Zôd–÷ÕvC¬_½õoç§+·äЍ`]-±<#v(¿ ¥Îà ±ñð+Cõ˜±_(ñ—‡}تê÷ghÜ.iç¹½Ù°Ætô‡ø=·×™mìòc‘öQUøÎ8†|{³ý…óxÄò·Ùymg/úº~๫ÜDoŽ@º>žP.ø;lÛ‰ gåî+†H˜Yýi»Ryf3uÿv5Sovˆ8™e/ÇýjÁ¯ïX¶ÿ ?úû.š— m®\°ôÆ;'â¨êôÂ])8Í'ÂÉá—o¶§ ±þDìP=š¦D;ÙUrÃ_~Èè½yec\9rbEù)CµÆ®ù5¯G\»ÞÑ7ük`Àð z–gœÕøÓftÖbêkÒíVåÝgù5ñØ8ýÈæ'žÛÿmú ¹X|À¾áŠ.ånÍ(/¼ |(»!|q_ô®–1=µýÄ£\?|VÚ놿þš>¸ØGô}CYûѾóðysýÄ=±NªaéÉ^ìoˆÅ«êŒcºfý‰-šè\û@Ï]½Ïú1ç:¢w9bÄu<Æ#^ûi>’;®ý ë>§qW`,«¦ÇÍר÷òaÎÝÚ½E8FUßð—ï³Ç°Ó\„[¹¿½‡YxûAl¬70Eø}ãkd\¥Þ¶«àG.ŽswA´òÝ=|ôíOœ¸¯ÜÃßrÌ¥›ˆ7fj<ÂOÂvyk§\‰Çö@¤ q­G‰5ñxÄÊÐÆåò”°0¹ŒYâ8=*Çßâ=,«ìêsôàŸŸèaL~ö/oÌý K¢Gfy[¶Ÿ8Wâõ„ýH,‰õwØ6ófç™·=4~Ó-¼Ü›pùbLqÞª)éÑŠ)ãxæðnÝCdÁAOxõ+cP*Œ`*›WɈƒ;×=ú†eóÓ˜ˆÜIöÑ€ŒÉ„œ^+Ê¿˜»ÁjÈR·¡¤Œ×éYs8‚yämp_×þ­òÊWáÓ-ùü[žÂéãÆmÑa´òZñYƒqWéÛ~ãu廸Ÿ¾±ã‰…·è´vò¿þSÆÔLÚ=Ó¹×,MjÌësSHn?ù,…r¶lsçØû£öûŸÞ¦Ýó“¡×âË5^ª{ËôÀã¦gኩòÎnxr®Ç¿«Oû8þ5°¾suøÖ²çúF¨¾1ýo3î†\¿8gßâ;rI#ås»V.,déßèê·å‹½ž)ðˆš˜×ßð /ñ™µurç_æå4ý¤ê·y9mÏt÷r ç3w¹¾ÊßK{âr‰Î×uÊßçùÌî錯qyĆ31¯Ïèrýâkï¦Ê•+ÍrÕÆ2Rhö8Mf}úyã<7§g®¿ï52²áÎÛZð¹oÝ~(T¿Ø7äÎ+£‚ £â씹EýT¤Úv^õ%¬ð>"õt¾~BHOáÒ¿y†¡ ڳ߆‰Ú¿yG_ð¿÷µpgœF2-°K>¯}ÏxGå.uâõæ|Ê5~ìñň°÷ïþaXð¬R²üwÞß½–ÔÈ«Eúòa–±âšOü‹>ß6þ¦_cŒ‰+]sü4Ï}m‘?1ŽM¼æÐ:[f‡ã{®`C×zá\ù]>Ï;ó…»°üVâ*øHfN°¾ø~0ŽÑøÛ–sFß{ÇŒÓLöøsÏg»þïü‹ªV»6¸6Çú–¼Žd¬–øÚNS®ùe®ýÆwÆjŒ¼„ç×䱄ë3{¤'û°<·®Þë|“Nîç7ï<Øû¡¯z× á&\¿«…±Ç¯cÓ‘½!ù—Å,76ýf>Žx¶+ÏxEB·¥ýà}øT«÷úk·hµb}¾Ûpúâß±Ã_ì­†|&{¬ö7»‚^ûÇö÷ÑÛu5˜cQÙeüzWªûžOìr>ÎSxœ/l×x²ndiv}šZ]­©|³™,²mP§3:ÆÎ𥽜ç3C£‚ì!þ[xt>ðµ÷÷µ¹  ùzfHy«w_~rí/,1~ý¾¾IËcü|‰Gàß10¶`;˜UWd,‚'Aèß,1nÊ÷X¬Z‹ÇIÀÖÉøïø¹,±#ʾ:eœÄ•ìqx¬ÃºÙ³K´ìƒÁžþ©ìöæ«ÓZ{Kƪƒ Ç2b•8 Ÿ×3/™µeõ½œàº^øÊ•€¬|È勱j ³B%ÙWƒc+eYí”–«º¯>0L‡‡3f¾ Æ«ó›÷¹Dü]î9/n9Û¸#hpyá}°þY]{6€Ž‘ÏÇ?c&ûH2ƽoÆìÄ•›Ç 9»ê˜³'îxàkÏ®Úì³q‘YWÜðÞ¡xÞUήÎìcõñÝý[¸²³Éðà*ó›·'Ouååʶù«|3æ)ÿm‘yêyêÈyª\9OyùÙ>}~Y?ÙïÉ9Èë|î±÷¯=nû¾?x|1Ö…ì³c¯á|Ná·¸3vF~Íܾ>g¹KÌÞ~M>GG½!Fe¸ñÜ}ÖÇ"oEÑXùWD 8ë{4W¤GMF@¹žÉ~T›«åàLÛÄ(ò•3˜GLuž%äìçVdD^õ<ŸÆ ɵ”³ÈPÎêìmG²Nœ{$ö0 g¾pö  gÕð/päs]—\u†?žÙO­9êËJÁ¹}±+‰°UZÙïÙs£Ü„«pya˜œ©Ó[ó}Ÿ«!2VCd”ó›W®ÈÞkW¾ãó[#‚uURìo+y¶üí\ßlßÎ{^A$Õɨ–兀{OáúÌ]~ Û‰¯^±Ÿ~dܳ$sFuAÆùÍhþ.XñMióÌPý÷|þ=oÛЧOm̧¯¡nߨ÷T§”¼ŽoFý7aßó Æê,ßÜöªÜûøy%_í‹}ÕŸ‘áÁÞ/œS1íçw!Wáã›ûî 8Çb_pýáÙþ–±*÷>B.ß<ó»ø8ìïžÉីçõÿŽ[~‹#ûµ?÷:^X¯iÂýûi •Ñpê,ŠiÈ‚NU»;W¹¦Æ³‚ë»ú0Ù¾Ï]ý?áãïyÛ cdtnúÿ/òþ¼?ßÅÛ[yá&<„çO†SUÛÎu%Cô±=ÓvC%Aj·on»® §Œ°[Õþ7x|óã6ï’³-=ð–(èëüæ#Ù]Î,Ã7aWÔvö:¿¾ØÕ ÉÇæå§ ßì)$i½1®RM’ •Ê×6Ã3Š{Цv&÷ž<äXûÝùOËÙúO;,øŸž»µ>A³Ó\ó™ùô¢vuúÍ{(†‰J´Ëã6,sv»Ü¡É‚®ÛUüš†LëÆX°Obh'>å´C‘»/ħ´ót‡ OqÚyº‡ÎiìÎJvˆÕÎðÜ1v/;—±¿£mÛé_sÛNG[&µ›¡Y>oçáN"Ÿ•A[èbÓ6îm]î6ôùmù{Ù·-wh³¦Ñ<¿Ö,VOÙ6mÓÜùú³å*Æ(ƒ-šûæO‹¶lŒ‹±(ÕÆ¸—û­‡Ü˜é¦ù¦gÚ‘kóé<ð\ð0“TsÓͶßÖ+¹ Óƒ<…= ÐL |w²§{Únr”Á˜¡Jàv&÷+Ã)yåsϳ&_m³·Créû¯šï~5ážõp >÷óM¯)|² Ÿ:¿®܃eh.í›Ë‡ùÜOÿêŸûiîýè^¶ÏcúÁ÷ÆiÅꇇ}™±£ -TþTß¾æÓdûá9­ ú1<ð3´nþ¼Ææy&•Üó>æV±¹Öý,‹‹ybÎØ|fÙL,8îcMó¨É=ËfMpsɲÙù[ðDý31¤òÙ’WMž%¹ãþøîÓëÓ¹ ûsñ]ìl$ØfÙͧ=×Û§­`6Ïšð‘¿Å7õç–žýëÆ-¿EAc9Gö1óÆÞü·(?¯Ç7òPá;ÛýOÞÇž{ñþŸû”£~±õµr0xûSWÅǨò™¢z)þŽVÿs‡×Uaô¹-¥zý[9Kí_lm»x4¶ öâã^µ~¼pO·~Z0ÿKSlâJ½øÔ>SÅæ*ÜV²“ÅC´-ãêæ)lß7ؾ;¹ãÉÖN‚«°µ«à.<²<–Íw³µÛ`Ô'ùJ6ÇÛ͵ìw·àöÍ=ëÇV·Qo7ž=yÍäsî:·Õy°ën.×þ^v~»¹×ýMçög5W³=L–ó…z¨>VŸ»ý,–³?ëð1¿$ãYÞö,þ´_“¬Õ“ϱ۪-¿‚-³_WXðe/…sÚ³ÏShŸdë¿lÿ'Ú'¹Ç‰öé*”¾ùÂs} `sAq‰ÛfFŸº±Í#ÁÞ’me8| 0…ñ\®‘Ð/b½Ôƒç~ákìý‚ìÏšóÈþ>׊öއ¯-ýYX‹˜+}­~`½|=ŒyöâÚuÅØ‚5m?|=_0o^t𶱋k`Œ“î\oGŽý8ÇŸ6^¹/¾Ã‹kò3ÆÀ›6 ǽYQs¨(Ïy|qãž¶_èÇé÷ç.›Ï)dÌ5¼þ,™Y²v«Åا Ôª½q‰ý¹gïΧ±/Ùnü ‚Íd÷a_òZÝf<×—o¶Ìßüò7Ïž¼f²½;u\꾿éø=²Õy÷e©0ÖîK*ËðUûúæa¿å·Cy–Óe×Pvï~ºrÇiïÅo÷>ëàvÐÊ9(6cu2|Z³Ðø:¸½þt£:¸åý\ZGæ6Ô¾‹Ÿ~Ýùó «[Ã0U· ȯ :B¨#d™¾«û`;X݇nØiL¥–Ží¦«{}Þ÷SÎЬù ÛÕ£S‡é9×Чù±ºÚÒ°ÐêðÃN]ª{‚zû_œB?C]u[¸·y—óY=üÞ¿©Ë8 Sl¨Ë—ØëÓô«gBv:X=Ë÷°Ó†ºüÛÝy Ûõ^f;e|bÓЮ‹ ;VŸËëÓN{êb_³ëÏ£ñgv¨§OïãQý¸¢õ¤ör3æ’Çêáô夙¯ëéÇ-¶Í­§ «ÖzŽ/FŸ=c»l×Ç6º$ùÌsîû£¯½ìz;›_sÙ=ùP_Ö('—Zx.Û˜õ5Ö‰!D½Yëºü·u;w[~¬‚vÈï¥l‚Õ͆Y ê⑌õñ8vúâ)Ì#+p?’«Ü‡G_`.Óì½Ü/„ìevfÙÀ.æäÌcp'[¿k5¹–ä’}¶J_¯3y®ä1“;ÙÆ–6’kO.ÂÇ>:úŒ]ÂgIfƒ9»0Ç®/摸dÙú‘ek<®ŸY†¶² mfš<·É³š<«É³š<«Ê³ª<«Ê³ª<«Ê³ª<«Ê³ª<«ê³È6¦UÖ¹çµÖ=>×¶·p‰ˆ6_9ö~ºfbì­ ³¹¾.Ÿƒ†ý–ãU·ßzÄ(ÆÛÊ~gãm;ØO»ÕëlýÀ¾lsPã\€õF˱®y»²-1Và»”/¶5@›-ïÉ2ÇéÎê’Ð<œª­ ~ÿ…8°zú§0ßézù§°Ñ ºqoõâîúS¬z5ßEÛpëVØñêåÃØmZ»âÒî?y `÷ñ!Ê|ª¯àa?¯<¹¶Ézùc§ íðaÏÞ·ÞL,v¸ÞLLÕ¯'•ÕØO%>£};:C˜?;žÖÙ©G;|¶Jk<±êfÉðÝN-›ïʆ­ÐÚáËaO¬ú§ÞwÝ–&¨ñ šRã)Æ[·kö‰g㮾›u„;jÍšïr?e°wd°õ²w§†Þ§É·cñ½¬Ì“ïkïîMÞNpâ}muõ`)ÛáÝÚëÓ»»v7ߡᧅ'8V?…§ÆvwùëåKK‹T¯—/9½ x×7¯âz-¶kWs~±-7Ûõ¾¶ç™íþSÛ›·a›Š/.ùoŒvÈç®dëîOܬ \ÚØÒûòiÙNšvû·eÔÅÓ(/ÿîØv\Tvü|¶JKÅ¡Õó¢…àô>øƒ'–ld,yÈÑgïü§Q µÝ"H‡ÙŸÚå]ÙÎÁ«ßεiüýÁå“ñÛõÍmãn÷’ç^ñ,kêÈñ,ÁýÀA"9žõÆvUvn~k·ÞŒC6Âî‘q8öÄ5¸Ð¶“ç3Ûaéqø³ÞÑ¿©90\ü¾6 r:µs·vQ+×ûð¿ûÔÿØ!Äš˜9ˆüf×l¾ò°ãÓÖ|¶0µèÖ|”·#âÆ…¥)7.8í8ºµB¶¿S ¹ØßÑĆé·zÑ>öù{õî ߊê3ŸÙ¾ÉÅ|jØâ>Ÿ¨Òvg« .æá»Q}5cgÕŸµ°?kÚ³Â&f÷ôÙÅ\t[ñÙ¥Ø;à3Rm‰ÓØmevžZ(|lg¥…6L{—â«Û´âå1Z£MÉl˜ö“ê+ÚÖ°*òߎ¹W0æ@+s‚o´ÂÆÏÔ‡9Á7?«„Öhï…í¥¶_j‡7áæ+<Úlíž´Ëaeã–d¡±›Z#i~– [\½(Ic6†í b%ÚÖ±W¨ÖŒª9Ã=ÔkÒFg+ê=cuâ‡BvÞ\¯æR:X1Ó¶VmeàõÖ«•ÁëÍlwõòÕ­%¯¬'y|uÎÕá²Y߯·C¿“+?[y¸ÿѶÕFØäí·^ÎŽÃ/§­ëéu8pPC;žm yøc+ÅzúÐ5äðÄVäu]´õ•}e^…uù÷µsÀºüûšÝ¯._á™g`]á§ÐöVlTÆŠn£qÝtX¥y¨ÿqpç}Öô#êâ*Í6Wº—Ý“;¾±Nlcë‰Àà¡ZÝï ¾uMîRÚ>ð±sÐÙUé[„z‹:Aù½o{¯“«gÛÌò ®Û!¶ûs}¾WÝY¶‰ïrc´æí‡f¶_û^>žØyG=}SÜípûÙO_Iw[…Ÿ~0Õ´+úV`õI§µÛaC» 9'¬ný¬†}Ê2›O¬†m«d³ÕËë߆×Êe]C¿èô¹hÙ§°ÃŒq`íBÅ®Ò*VÛ'Ç+ƒ{6ÔVN•ðËóå€Q‡*ƯójS%w’Õvkn¿fÇ‹qã$Ç 1iô×(Ø} úhظGŸ“ÃoãÇa[BŸmœç®Ò†ÝV8§4Œ¥~}Ó>6n»ÛÌÇ1&cn*>æÀ_¯x}b^+^Ÿ˜ûŠ×çacoᜨlþŒ…K «·rrIö¿ÛޱpÉY…‹ðöåÛ…ßîeç£nŸ­•Å¥V2tûÌ,ç¯#™)ÀWÝ\–Œ1–\Gr›É]xœÉSxeê•Ïm‡pÉ2´šeh-ËÐz–¡|n“wo+ŸÛÎ|n?òÝ{ÉçöšÏí-ŸÛ;ùSÿËyð|á5“Ï•|›3H€ ùóMG;’{IÂÜ^ØVf𻃙/|%{beráVàÓf\|‚ܸøô7 ‘ÙfÀl3ÖÆ"M˜mÆxÙÛ |Z«plMŒckÒÃ7–,[“µøÌkà?Ëövš*Ëo}vñ½à÷Ê­ª94 yÀá°Es™ßêMn +Þ×·}¶E`*l <Û‹ÆtæИ|[ä[m»§Ÿ ™ J›Üþú7â2ìÛq]ì›z¬¿–ÁüRÇC{Mð±Ë؆-%?í‡>ev Ç4[× ¯‡bëºákKJÕF¡›=Ë·JåÓÜžo»o£ÍW®u&±2w7Ö˜¯Gë^'7¶o×¹nŸ#úËçþÖ¿è×Wr[y­™ã·¶F{ÚÞ¡s¾°ÓI‚M®¥Ñxc€ÎíšÛ½±žíï>æ([åQ•YŽ%º¯ÃÁ4ÊãšÆãØÝùOÝÚèTMëñ·qqþ—»²%·gî°WséWÍöµE+›6–Šcå’6p ̪>ìù&mbXÞR#ÒLÞ•MÞ\{«'è‚Ëoõ<‡< ›¼™¼Ãnfaöa··Ðñ°¡YؾUµ¨Š:޶Ì5„ù.8¼Ü‚ Ì\†/ÔOͺ —å–u‹òЈ`ËÞÁ¥7êíâ–åoºùOm摇‰C MÍlß\  ÍÏ ˜Ñh*¶Ws9¸¼4ôDјiùÌJ›};½è¯˜‰á]ßhN¶Í gkx<6š–OÌFô~´“ɨnl£ù¤©ÞN@¦¯ŒO”R·gK¶ÙÅ¥kàÎÒ&½mFqy€>ŽÍØ‹…6ÖLž=™ `wG¸lÕî2`·™8‡©«¨þÌñ\°ü}]_üé²1“™ëLÜÇ6gmÛ#´ƒn1VNÖóD9ý»Œs—Ù‚X»à‰Ù”9zìÄŠC”™fÛ ‹’× Í¨vO_U˜'Eó`ao¾ª «‹æØfL·°+ÖòÛYh5»M°Èå‡'vØxvší·”k†­ƒ&ÊÖ½âPņ¶Ø„Ùè¡ó3=”lÒkq°† Cš«í ž>&§À>„“·Ó‡1s¦iqpd‹4àÃZ±Ù~‰|îb¿…]6êr“'ú¨ÿ‰:ì{…ßËVe&îÂMêcrc\O¶÷ŠÃ7öqÖ¿qFP W W>+ùOí:vlÏ›­Ïº½¬…7úô›ÓJx(ŸGz`.á‡3û+¯çȨl£UéŒa°3$ ÃÎŒ8ã ÇØòÌ6ÿ­Íó £žŸë@³•“£p‰3!$Nà™ Ô°[¹¸¸5ÛÖ$+Ït­YU6+ØRêöNiÕg[P4:+Ù¶”ç:8ëmu°»Ø}¸˜´òÔðHiÛVƒá‡NX~踄á§òÌÛf&:pÙDÚZṯٚ*‡Û{Ñ#åHû’2†:1Ù‘K£“MøŽK{8žëÛþ›ŽÛv¤Óè¸mç¾­ÑV`ݺSà¿a/èçÁVWÜ#ÚbïØ±ªðîŸøîuh·k݇7³{ð öÖ}Ð|?ígºØgûJÅ΀y†4öÇcíleૺ††ßfg®Ü ´²öêäÆõÜ+«¾XÙ4¬`ÆûÆnŸYX!y9í[sådþíQN‹­j=ο…±GŸôÞÁÞ1W×Þ¯Ûùzì×QÿÓÎhÿÁ™ëÖ÷ëcO5^@¨gz4ø^´ÃØs9ØpÈ}<¼žè¤oÇ#­œF°ç4f{»ýØµÑ ÎöKa °zߟhŸt¨GmÓ&ƒ6ϩ޾i‹¸¬sÛK1-СÏ_­ܨ‚¹QÅy*‡Ñ×|×q Ò‰¸o›*v/ÕÏo°{¡³!v/•×¶ÖܽT:#¯²Çì^è̸0&øª»—px<ÀtH4æŠY¹^{,Âê¹Æ »&[Ÿ­Þ×L’z_o}ªrܾ`ïÍÝ Ë`^1Ž]xnÄQÿd:ó‚éÌëå¤3)ÆÏ#ùH.áÌ‹óø39œyÙ7m έ'WaÆ–ƒ,ÃÁ¸tð™e8™7m¿Î 8·•Ìxõš6gÆÕæt 3濚(±…a§¥s1ìNtV…ÝéÚá…hÞ4ñ\3Ÿµƒßƒtž… ¼ån–Þwfª ¯<ì²è­gùÛÁ’Þ}–ê1¼þÐ>iK_°“Gðͧáì?s-‘ü§.£ ΢&–Qf «Üœ«ÛÁæ`uùŒrÀž¼XlÐøV®í\vÔtx±5D½Øïà8ã>ÜÑÙ/úµÊL§¤^ôIe»£ÿú7òþþÄÖæO–u>{YÜ|8ŽpYœ)ÑNèxR·óQqg±ñÅptªÛ!%ØÖ.q Æ3 ˜õôú>ÏÆ8¾q|€C}aáxźµèá>Ð}Gì¡—oNÍŸ'¢î¬YDÔ¦sÏ1ÄŪ”ÿܩÂ<èðo¯6_…‚ß¶»xmôŸ¸@ÎáUôoØAq>”¶N —CÝö‰±kجٶ2òïG{õšßŒ`9úaXÚÚ®ã Hëæ^}Ÿäå¬VÌÆ2X“¯Ñ•íïlzf¨d°¦ú×Ú²¿òË|,ja7²¦Tf6ÃðµR®à3ï38ÿ\.¶Iåyå=?mió§èû·7Y>¶70Û¡-‹|¯In+¹ s9`ÃÕÁå˜Ë0—fÀï.Â\€9ÕXT\a»a.aÀôßÇ»_Éõ8“ÙfÀU˜S%8¦J ÚœÂl3`Ö'8ü·鿇ôkcÖ'¸ ÇòÊ8–W%Ç–/Ž¥D%êæþÆñ\ãxn‰``gz,= ¾P’céa|æxÕcüÄùÍW^‘ŽQ'î¹vßé±í;€ÙºJí#ûNø™_lo‹®xø_~Þqíq†g‡X&P€ËçðûQîK¸ä˜óÂÿÐi°[¬j¹«[Æ;¤uÛÃCt—i¼¾xÚvì•eq‰G ¥åŒ©IØ•ÃÞ;{u®ºn|ý£PÁF¤ÂÕ˜5Ø ß¸Ú5\ÍTüýˆÏäwð^A–3¢ÜÀÇÛð«´nå§;b+É(›äa‡\ýÛ²;â@ Ü,qŸÝeËYê[Ÿ1LÚ¦>¾‘ý–»å~å5}æý{²ýàå¾’kùf»'—}ÅAD·˜Q~;–Ãä° NS`îТíÝùíjÃTzŠm{ì32IþË-)åÊøè Îís1’ c/;¢\Œ¡^Æ­i=ºæèhz-,Æ™aŸ1"6Œ õ+>¬~ÑMÍ8_NZO&ºæùÅ Lgðvÿ‹î;á’טû\üÖ²§”3”@­Ì~J<ÑÌ+=vƒ5ÊoñÈln0ÔFoL¬–ŽmåP5R¨‘o¦úž WyçË~RL`ÊÃØpè›Póˆo±0ÑïǾõI Ô-ý„ÐÅ){ƒw¡/ÚÂpèVi+Û*®mŸÿ™Õ;†:e;!ß¼r8\s%ã¹d ä&÷©Gò‘÷™×zæ3ï9WÞÓ\êbèµL9›{ž_z —•|ÌÍæô±uÒ¶Íæy$c(¢3Ú6mžŒ!®˜GÛÜ1M‘ÑÁÉhóýñ|á’ŒºmÛrúÈ=§/ÿ-qðh ÇýÙÊpî9N¿P˜-<ÙcÎÿÔ! Gvô›ªa¼µ¦R Öj²Ò°vc;b€“…‘×Ã?ʼnÍ ŒÇ¸&Ö‚¶…è 5?9ŒxØ@Íä*¿-ûúBƒ›ó9’×VÉ)Wªá”Ǿ± Eƒå´¡kR­ÉVu‹n“v½7› ¥GN îâuBwʉrºQÎ6h”Ê0J$DúÜ?«6aê]·7î»ÞÈþâÛÝùkªÇ?Ï­ó?|ÁT§í‹*·‡s±åvàžc„nÛÎ#Ó…š‚qWŽ 6!îYbµä™³ÄÙst?12‘ë|æ"×”œ%Þg¤œµn³™Îr:û鬨³¥Î¢:»ê¬«³±ÌÒ:{¿Îð·U€®dÕ «‰Û*CVº*ÑÕŠ®btu£«] é*IVOºªº­¶tö¶RÓÕœ®òtõ§«B]-Ê*RW—·U§®Fu•ª«W]Õ¾­|uu¬«æç™í>ûÝfE-uÕÙUf]ßfll8É%ûcÃw!Ÿ+í܇ʆ~Gö }»°*aœð£5÷fñUKð«µX-Êji~³F£®È>FyÌpË1ªâÝ©^Z2ú;MXú·+h“ä‰{îX²rVÆäÖ’+îIóKI>PfÆ÷âž~@°Vòëf^6üzðvX  zÐðv¡zñ|Ø¡"÷ƒ’·Ã=pу˜·ÃšÛŽôT§ÄgçÀ»¡:ªÃá›S¢1ãðK:12nÿÎò®ÿ…k£ínlý%âÿ—þæö%®aê2¦®dêb¦®gê’¦®jꦮm7—·G÷»‹ÇÍõC\BÔUäæB"®%êr¢®(ꢢ®+êÒ¢®.⣮17—™7·u½—uÕ¹¹ð¨kºü¨+º©ëº©«‘º ©k’º,©+“º8©ë“ºD¥«”ºPÝ]«ÔåJ]±ÔEK]·ÞÜ»ÀáÎ6Cá•®sÛoš,z.¥¥†K‰±÷E³FumTïFupRGusîz:ª³£ú;ªË£z=ªãó¦õ£z@¢¤úA7]!ÕR"Õ'RÝ"Õ3R#Õ?R]$ÕKR%ÑWRÝ¥›“ê4©~“ê:©Þ“ê@©>”êF©ž”êL©þ”èR©^ÕMÇJõ­T÷Jõ°T'Kõ³TWKõ¶T‡Kõ¹D·Kõ¼n:_ªÿ¥º`ª¦:bª/¦ºcoÚdª_&ºfªwvÓAS}4ÕMS=5ÕYSý5ÕeS½6ÕqS}7Ñ}S=¸›Nœêǽj̉êÓ©nèÙ©ÎÝMÿNuñT/OuôT_Ou÷TOuúT¿OuýDïOuoú€ªø¦-¨úƒªK¨z…ªc¨ú†ª{¨zˆª“(ú‰ª«xÓ[TFÕgTÝFÕsTGÕT]HÕ‹TIÕ—TÝIÑ£TÊ›~¥êZªÞ¥ê`ª>¦êfªž¦êlªþ¦êrª^§êxª¾§è~ªèM'TõCUWTõFU‡TõIU·TõLUçTõOUUõRUGUõUUwUõXE§Uõ[oº®ª÷zÓ}Øg]¤ÚIª©¤ZKªÁ¤ÚL¢Ù¤ZNªñ$ÚOª uÓŠR )Õ–RÍ)Õ¢R*Õ®RM«WÝ+ÑÆRÍ,ÕÒR-ÕÞRM.ÕêR /ÕöRÍ/Õ0Õ»iŠ©Ö˜j©6™j–©–™jœ©ö™j¢©Všj¨©¶šj®©›j´¥v›jºÝµÞTNµáT3îUWùëæóÉálkæYo•þVIð” W ñ»´¸JŽ«¹J”«t¹Jš«Ôù«4ú¹ó)“ËßóÌ2»lûÉsÄB‰:¡„{ìa-ÉkVžQ´Åõ¶ÝŸóõm½Ê9½@’crwn©ŽoŽ=þ¹¥LиvrŽ}âŒ\áØ†‰s&#ÇtpÿO¹ý-{®F_ÿ 4¹ögn#ÙëÍyÈogÊì{¾K²<«‰ü¾­Ç6×Ìink¹Í=ŸkëÀÍSXžÕ¼þ}täs;òAÓ†[³>{îY‡ù¦Kùâ™m¦Ÿ™ û;?Ù¦ÕÍÈ+JFîÎcï :÷³ïxl{÷#Ÿö.̨ã9â¹g™ÉhoùCèÿóÜ.ïÏBýL|»,É×NÇÀÜè\pzÛ!¿§û?Ø<lëÉ‹ñî¶æ ƸÄÌ*'ú¬«ŠÙšý9—ÛÁÍç·]Lö†q€Œ±‚.@gÈS)'ÂMh$_yÏËó“¶gcj€}çL½0õP~ºK#q#Rl\ÉgÞ‡{4gªØG–‡’UΑôqmÙ¬o¦¢æ¬x_Ìeüíµç>gjT(›® ÏcéÏæ³lÝ»BÁÏÖi¡˜•¶–ÌiXwEBJ(ÂÑõËÖoô S£âMP”UQð¦4¨ „ªL¨Š…oª†ª|¨Šˆ¢”¨ Š7eEU\T%FUhTåFUtT¥GU€TeHQŒ|Q±ƒ÷ëfHw‘[*ãAÁ/Øê'x¥bÞ‚„Yî–ã…qÿ!|å5¥þd¨cmF†v3}¢fI¶±ÅuŸ‡© m¶ºZþ½ 4|àYô³ÜgéM"MeÔT^Me×TŽMeÚT¾MeÝDîMeànòp*§rr*3§òs*K§ru*c§òv"{§rx7™¼W)=‘ÛS>‘çSÙ¾›œŸÊü©üŸÊª\ Êª¼ Êª¡ÊŠ|¡ÊÞ䟥ëîòv7Ù»i¼"×`ÏÈú·59ï3 6I6]õÛÀò†¶G~gƒÉÈ&Çä£ÈŒÇw„ÛmG¿ŽÈ +OÛ~bmùšÜrln¶3œÅscÛ¸–ú°œÒç¥&e¶ÙõÖý J›äQb¿<¤©úÑ„QÿdÌM¾Wªg¼­VŒ dôÓ¾Ïÿcn2wÍvþÜ„ñ}É>¯qm|%£-‘×JžÂc&÷‘Œq•Œv’!øñ\œ“<ðág <ËyÖÿ^åúr~±ug>—ŒòøXçå$£ü´Ma¼/÷°>NެÚb|ÜîYŸqÎY“Qÿ±_È1Ü¿—íþÉ2æûw§ å.(Ïx¯d—°<²½ùØèíŒöI>…1ûÛÛ9í?ÎÀW2ú }DÑÈCxÉg®‹ Ç9ãp°Ì•óm"ðXÉOgÈh?\ç£KM®Â­%¿)èªÊ®ªïª*¯ªõªŠ¯¨ûªêïM XU‚U=XU…UmXUˆUXU‹UÍXUŽEýXU‘ojɪ¢¬êʪº¬j̪Ҭêͪê¬jÏ¢­êÐ7Õè7eip$qG¾•L½70÷#`îGÀ±–>·ö$˜>`ÎÔ–S[Îl命ÜîÓ/>Ó÷ ûÁ¹áûtýdì ƒá+E¶õõ¹½lŒ½ÐLù.!³Þ¶}Âq[sk~/øeÆyÛ7À–ø¡½º<3¹¯gFKMÐÙŸôAï¬z¢ª3*ú£ªKzÓ+USÕ7UÝSÕCUTÕOU]UÕ[UVÑgUÝÖ›žë›æ+ØÇ"g®À¡qû“›\_å>¾š~/Î>:ó<ÌóXp„жâ#7¹'ÏE+$ýÖfžu8‡Æ-|¥ê›OÚš<§-ۇʎŒ?<¾x­í‹Ð×uîïUWœ™ôUú#™»jøÄZÛ¨'Ãfá³ZyF7¶oÒ‚ŸjÑ£ì(¹ž\óÀÍç‹›ÏOð‰úœyÿqýd/ƒ¯ —\:»Â¸çÉg•í7k.\ñ}üåxŽÚà[{Åøö”éýžõ=3Ãß2Æk&yÍ0¯™ç5#½fª× ö¯Yî­ïŒã´ÿ `ޱðä{öíß‹„QãXøs,J­åþÀ{-úaŽE¸O~ß`K` ËX÷ »?ØV}ˆòûß§\Ïu¯ò‚ß&ÇÀsv´þœ ~˜‹åɵo¿2Ûcn¶~ÄküÛEf™ôò¬éÏâœ5’ñ½æž¯£ÌHœEÿÒ}? I´8ÖÙœU¯“ëä3d2aûk´ÇYâ²6D›?Ã1KúWûYÇá_8ªM”kÛX3s<ÇZˆã<ή©Îœ:ü´½OÙV3æœuÐç­#ÅAňºç/Ûv¶Âµw{Þ¼qËœÝç>®¯­AÞáëËX]Ì5'Ëfe¦¯,|˽tÌ5“çÒKÞ·K=À'çÒV'±<·ï±×'5þm_¶×r¯[OhOèq†Ÿmo`Là:m;ò(ÏÝO•'æDïws"Ç ´1®7æ/Žðÿ÷6æþœsޝ”ûH¶ûÕŒ1–ë[óádÜúϾÇÏÿá3}wÏx÷ä _bö¯bc,û‘ÍÅôSEŸÚ1æsϹH ÇXû‰¹#²DÕ=GLøÇŽó'/¹àÞ2ºçÇž¯í;üo1žœÌå¢ÜZ²Å[Ñwc)ÙŸ[özû‘-NíÌuûæÞ÷ýý»”½ïì‰9(|¬lþÝ៶!å5Ò÷xõôI†¯u¤#2ì³üd´^cª6›§sòÜ &‘<åúu%Ëýíì"Ö* ¾Ü¾÷¼1žÅ eð£^¹– ï–-6ŸrÍ7ämÀÖŸkr=Üwl‘}†ð9·sžð Ǻˆv[‡¹­+ϥͯ†ÝÓ|Ýiû¶¦YçÉs'‹âzÛÖ<ÅšqUæ*W'%GŸšöwž;!þ«pMx츼ë@ÒËíW1h—ǾñÌ-]ÞÙ6†-Þ˜’,ˆ¡kÛ— ’@^H)e¬Äî±³yqjq'Ïâ,ö“{óK癃I?ÔÎú±oݹ¦½ñºŽ.ÃÒ¹¯©àþÅ¥f[>'(}QÎdÃ;Ï­=÷ðc±º¥¯K«ÉH˜¾1o‰:%Á¦&ùÔ䟚T“…jQM.ªIG5©Ä?jòÒ[RSMvªIP59ª&MÕdª¯ WG2bm¿ÞlDê™Üë¥àš÷Ǽ,ÏÂøŒXÅ£ì1'q‘ñJrÁýéÑ“ÛH¯3‡ðÄýé׿š¶lÆZ7üRü½¼¿û{åþkûœã˶/D·i,b<Ñè mçÕŒ/¾sÁµ÷Ú¼<†”š6c3Ëc?=fyŸQoF\'±Æär%9vÙ¹Ðæs&˳¦1tÁ+Ÿ[g>·Ž|níùÜÚò¹µæs+úE£?jÙ\®lÛý‹<…ǹ¿‹>rË2 ¦›}‡|ä5E~Ëøe<‹ìãÌ•eó¾ìe>V¾ õɘ Ô³ÕÇOÆ6öd|/[ê^s?õ̱ÈÌ<1^™ig34ÈM¸çØÐþÉ©c[ùæ3Ç^óý6[ùæ’ã°ÙÊ7·ó{Ï1ßÌ'›11î ºä+×3ë–ùbTMþ˜DúžhZPkbjMX­‰¬5Áµ&¾–„Øš(û–@[k¿%ß¶:éÓ<|MÅýcK^[×Âcƒ‡0Þ—\qÖÛLvú0÷d|‹"ߨä·¹OߌgÑ/Úb-ƒËHöu£·+|_²?ë›W®-Ûîù,Ää×|–™6£l kãBŸ¢|—zæ»Ô™k3óoú1óÌæ6’kÛu‹q,Øú>¿‘¥iÛ¼ò[›‰å‘žÅø¬ž ­‰cÇÙÅÚÒµ/Æ•{}k)Ûj?wMí_£ÜBGÅõ7zÄ”½Þ¾sÍë¡Ílkfê?ÜøÚ -‹`ë ÁVŸÁ£%¯’l}l¡Œ›K>ËÌcQ3ù?rÏ÷5ÓûæUŸùÌýHõ÷b éÚubþHQocƒ{Iö÷¢·'/”™ó8îÉ~qnîêãªÝs2>·&[;¡HǞ屯ñýfÇ~‡6k×ÕÉXïà‚g1N¹%cÏú{¸¿‡c&Ï34ù}Ììa÷<¶f¾ME›¡ÄsìÝÈh¡¦lõÃ3p|;24xŽ=æ£ G¶q+Cã¹·1ý·Ñ&i§³õ3} ̯¶ˆk¶±4ÚJäclÆYP0ôšÂ&[“=ÏåòþØëû³x¶<“ýY;d³?ËçŽU’‘£ìÏ¢Ïð™ìÏâºw&û³¶m}³?‹kÝúÌþŽ\÷v{$×3¹CÃêb¿˜É§ðÉÐÑ"–Ükr+ÉõH.ÇÖÅ2¥Íç™ .òœÉ#5µ°î n=¹fy0_YÓÜ|fÙ°î grÏú1Ùµ¨7;^d› ]šc2¸}±Í;úÐø¢&’Õ´ˆ5ž¡E6,I¥Ÿ˜…£×ÆØFè’ÍÛþa_ë¢þ'}G‘+Ä×´]:c“{ èžÑ¸‡ÚçdÛ—5jzÂhWdëãôMjýHFûÛf³­‡ƒm^h>þ`=LÆz8¸¬d´m2Æò8’ÑGÈ®ùöÍèk#µ ÈX—,ÃÀw'·,ímYž1…Ï,΄É·ƒK–6Êà&ܳ ·ƒ§ðÊç⬆õŒ³šà’ßb¡´Ûò›.ô;ò˜»=¬)ìzå‹Ñ~蛇÷¥ŸÃ|7~Vƒv~€vÏð´2žIBë/Ïg胇sú ™Ù»Ö“qj¦7è} gÂÔU0SJ¥ÞÎéCh’O5ò Ûš¶6úXÚoéÛP'ˆ¾ kçÃúây}×ÖQtÿ ã~=sH‚×|VaŒäÁ瘾¬à‘W‰r‘.WIó›Ô¹J ¿É¤«”ºJ¬?Ëw7á.<¾ï%|òþVæðµ@Þ(o6”ð;="o¹ó¬Ûô3YNü=üs+ªä=é×aÏ­<{·q›Z7¶zW+ÂÇõÀßÓ^Ïëïœ÷·8Íh?¦]éK†¾ÃrúßÙgq}çéØï‹{–ð-ÉúÁs£Þlˆú´ñgçX®Yÿ7†<û±ßëhü;äßéßr˜žêüf»Ï‘õÃøV؃ž¸Vá‘¿µ¾÷¼ñ•ehÐkíû=ÉΫ4½JÖ«”½JÜ«ô½Jâ«T¾Hè«´þMr_¥ø_åúMÛ6Æ3tw‡I•ˆumHœããÑ· :ðÞ_,\64½/×/_ÜS Z’÷ŒËµ¯û7·­U-ß“ö¯‘šçÔß|mýmhÓ®í÷´2pŒ©K¿µñïüËV@ˆîm¦š_¡AU!óΠU¼"zoíÐfó6OXª‚Ù hó9’ýY=súª Ñ3ÁõÚJˆž 6oZãá|ν ¥ D}Ñ Ñ`¡L†hf);TF&=ÏP%qoß­\~$O<—§MõgÄ!=»û#<—*bxn¬€®d¼ãاþm+Í÷ä5w$QNͯ…¸µ¾ý5Ûå…«pî_|¥v˜ÿþK0¨} l_>âúl4¥Ž˜ùø†ÖÂƙ蒌!ÀÇ7¯¼§Õ?mEˆ¿zbÄÞp”*ˆ3d\Dá*œ×›?qÜóÎù[ÄRÆßCx®gŽØK{s´  pF²Q!ìU¨Ãˆa@Û ÿÚÕõÍçno¸?ÛänÛwþå'PýµV_)à¿®3Ù¾ =W1æCu–¼2ÊÑ%ôØDOzàOW¶èZ·¤ywlFDy¦b$¢Gã·g>÷Æxï>˜¬»%áÊ·m·î#vCÂ6VRyów  ^¯Ì.Ô¡„ì÷:.Ùæ9îL1Ï‘½fFâðú¯¼ÏÄ»“{>k–gú³è±smußá¶ã‹Ïs«þŽs«={´Îž5¡•ýMkäèøíºÈåò;!GÊ•z…~ñwFª±­‘V®°GÙþ†Úu–{£ãBîh·‰]HqVmßF­20õçÀ|Î$¨“ ^W2s,`_{Ôdêsƒ©kx噊s_ÉÔ¼SL;Þ{ä‘vñÍ%¯¹qž+XÑwžµ2_r}PÿÒö—ôݶcœÊ&Ó™«…Zkf³õü!Ð ¬Gê[WúhسòY³ï3gÖƒ~>íùÈUŽs> í$žU"× 9žU"ß‹ò/ÖœYS~»`íüJ°Æ÷mq¹3²_Ì]£-T}ZíÌ– QdÔÉlà#¿L ®²ÚD+››­Å5wîûžPŸç³œCÑ~ì²9G…¾ß÷ä;ÂÒïuxç_$ÁøÂWÆOáÑ’»p«Éåô¬×§ó‘ܽ>}îõÉݸðXÉ}ísìŽóFrÉ^ŸôJ†¿¿5|<‚˜'%yÉ8Kgœ²¡›M'øH† (ØÆAÏÑã>TÁs$›=+¸ƒÓG+¸Öä"| ÌÜ!ɧð¼’Ǚ܅QŸä*ŒsÚÆûFï—¼†v7eÜ“Œg…þ𙌲M)3y ãgúì£NÈUuHûê–<„Ѷî7’ñíÈø¦³ä·&£ Ì}ªµm†<„ÑÆB‡¼&ŸÂh«SÚð”¶=¥ÍOé dôòžYNïkä3Ëì}“\„k–Ùû8¹g9}L Ï,çúô±efÌÙÇ"rÆØ«Á+¹ {}Öcµ™mÀÇR®Z1Æ’½>[ŽÉ±ÊÝù¶8†“½>eÌ'¯lÃ>GÌŒ1d›ßóѹ’¬R¿Ù hÉ÷­ fX¬‡[ÉLAa3¬@d›ÙâzXü>ÕW†c·è­(ß“±Úy`³HÚD®iq²³‹Í°–ð,Ùá8g¯´¼¬²hÕ·VÃÈïÃÚ@«¾ókڣ̡DÞ÷ê®à}ÏR°rf9¯ÈJç^´ÎUXE¨ÊßÓ’‹£óœgm <‘ƒmdâÞK¹Á:Äl¨+f'ðDÇî…ºíô˜.Éx/²Xá÷Ä®Á˦Œ¬|wŒ"ÏÏ£½ÝùaZ ¿éûB=sGªe áõͶSy³Ãñ¤ßú¡Ÿ™²½uà [#ùöèÇf6ï`{›ùTò·È¹<Ïä1÷sáÜZ²çó+_Œw¤ß ö7l¡x[¨ÍU%tó±§aëî»~˜-zîz¶íÏ#ãžÁuç/´ê~d쇘›{©AŸžþ̾Ï;vÏF=ôô= ¶9›û³£œÑ3ÊÞGš\Pܰ¿²å¢½EÏÀž=ÃÊÐ¥=DϨÉ6ÝôÁzâóÚ×›ÄK”a·ó;ÿr{¬“¶k(;“¦gd¾B¹KVN²eƒeòñ5…;²súÉ2ó’aÍŒ“WácS²sšÍ`32“gKFÖQrn%ÖU*±Y6dF>³œceÙ,Ê8Þk á>v= d"&Wá²³šÂfܽ>¹#(É+wÔÝë“»”s{}3“)ì|qÚÒQŸdÔ'çÈ L;"¬Ï#ÆÖÍȼ̑F™[c”ÂG7lF6í´}Fè#ãp0ž;ÙKú>-²ELa´~EVY²YŸ¯ðX;“ñŽô^Ã;Æ y$#,çNå•÷D6áà.×à½x÷î(3O|ätCí'²',9³gQQÿ¿ÄgdÔåiZß'bû´îÆ×>¹+ÈlÎÌ2¨7fBçÈÞ=T4ñ[Fñ€é i÷iôBlÉËîÉ,6¨fކ·Cd;’þ>ò»7®Ãf2ú#•àAÁìØ%ÿnÇ)›Ñ/"ëHF‹ˆ-a¿ÿŽêÚŒº ο÷ãxæ’÷1ÅûÍ­%÷¼gG†e²¿/û¾ð™ïÛ½ C®d¯OžBc $aÿ^û”c3úfÛ§"Á}¹íS”Íî…²í²›½ÎyJSö·ž^çÎèd¯gŽÿÂeìöc¡Ím%÷s·7³>mF§ÚÀ)Œ6ö‚šŒùŽÞ>·{ýb|GÚì1.…"eÛýÝyμfõümœ¼õ=Î ÿúëüõßÿúÿ:þy˜¥ÃFÍÃþ—ÿ·ü³›UÏvnÿíø§EiUðø~ÿõßúúg3óæóŸÅVd6NÿþkÕ6ÿib†‡ýNÿí_?þíóŸòÏó0/I|€ÛMÿöïwýõ×ÿý×ÿú¼†E_ÿÏ¿Žü_8öû\v :Ó`4 RÓà5 jÓ`7 ‚“à8 š»ÓißiPžëiŸ÷IПÞ‚5xPƒ 5ØPƒ58Qƒ5˜Q‚5øñ©Á’Dùh©Á˜· M Þ” Î·ÀO Õ Q &• S >½¥j°ª±jp«½j0¬ÉJð¬ÕÞ‚m5Wƒs5hWƒy5ÈWƒ5(X‚…5ˆø\¬AÇŒ¬Aʼ¬AÍoÏ­AÓ·`j ²Öàk ÊÖ`m âÖàn úÖ`ð[¸kP¹›kº§kк³kû-ø]ƒâ5X^ƒè5¸^ƒî5_‚ô5xÿÔÿø¯â7Ñ‘7!+P7Pу›‚Š$¨x‚Š*¨Ø‚Š0¨8ƒˆ6¨˜ÃMäAÅTBÅ"TDBÅ%TtBÄ(T¤â&^¡¢*v¡"oBM–Û°¬AÍìüý'Oßð¯n´'z OÚŽzïÐ ј%Ñ=‘˜U¹Å°hl‹Æ¼h,ŒÆÈhìŒÆÔH¬ÆàÜbs4fGcy4ÆGc4&Hc…$†Hc‹n1GoqI»¤1Më¤1P%1SKu‹±ÒØ+ÉÒX-áÒØ.ù’X0»ÅŽiL™Æši šÆ¦i̚ƲIŒ›Æ¾Ýbâ4VNcè4¶Ncî4ï-^Ocú4Öï-Pc5–Pc 5öPc%VQco±ó¨±#©±“S©±–ƒ)±™³y‹åÔOýÔ˜PÕR-•˜SE½Å¨jìªÆ´j¬«ÆÀ¾ÅÉj,­ÄØjìí-&Wcu5†Wc{5æWc5FXb‡5¦øk¬1È›¬1Ëˬ1Îû,1Ñ+}‹¡ÖØê·øë‘ÏÂR*xe™—·.WŽdoŸ\2]W7nÙ°”¢¹3ãp c²bnºóŸ<oC×ïÆ05’©ñLjjlS#œçÄh÷fØ»ÿÔ(¨ÆB5"ªqQŽbŒT#åÍx©FM5v¾DÕhªÆÔ7ƒ«eÕX+F\5îÞŒ¾j V#±ß Ìj„Vã´­Õ˜}3r«ñ[âj,W#ºן 7C©P_Œ¬rÛ–½ß?¬jk¡Z_-jT+å›%ófí+蛥ôfMU+ë‹%V­µjÅUë®X}Õüj1V«²Z›Õ ­ÖiµZ‹5[­Ü7ë·ZÅÕZ®Vtµ®¿YàÅJ¯Öûw ¿z¨wÀ£5õfqUK쫵V-ºjéU °Z†Õb,–dµ0ß,Ïj‘VKõ³5ûOîÚ;”á nt CÒð$ [Òp& sÒð' ‹’p) £º…WiØ•†ci˜–†oiX—†{I˜†‡ÝÂÆ4œLÃÌ4üì-DMÃØ4¼MÂÞ4î&§ásV§áv†§áy¶'á|æw ÿÓ°À·ÐA /Ô°C GÔ0E _Ô°Æ[¸£†Ajx¤†Mj8¥†YJø¥†e¾†njx§†}ÞÂA5LTÂG5¬ô-ôTÂS5lõΪa®þªa±.«a´^«a··p\ Ó} åÕp_ Öð` Öpâ[˜±†kX²†+k³†7kس„C¿…Lߪ5ÜZð5<[ö5œ[ü%ü[ÃÂoáâF®áåv®á覮áëÖ®áî·0x ×°y §×0{ ¿×°| × '€ÞBCÃGÿä©  ¶ÿM_ÜÅ\-¶¹xÔfV-wÕxWíwÕ„ÓmyÕœ¿iÑ«F½j׫¦½jÝ«¾hã¿éçß4öU{_5ùßtûEÛ_5ÿo¹4G€æМškà-ä,Ð\·šûà-?‚íX6øc³Ìhgä¥J† )òÙê‘õcU°sD[ºóŸÜ}vêŠßÝÓ[hÚ M‡¡i24}†¦ÕÐt’†ã-UÇ=GÏ4/©@4]È-ˆ¦Ñ´#o©IF*R,åoßÒ0ÝR5i 'Mí¤)Ÿ4”¦ˆzI#¥©¦4Õ[šª[*+Mqõ–ËL ÁHGB.ǾÏKZ“?º CÓ§*~ÿ™qÎ=*^s/¢*ý$•=ËRðùœ‰IY37iF'Íô¤ 43”fŒ’LRšaê–yJ3Ri¦*Í`¥™­4ã•fÂzË–%µ¾3m1ó×[–.Í䥾4ó—fÓLašAL2‹iƱ[&2ÍP¦™Ë4£™f:{ˆVV²ƒm.ùÛä?¹ËìÐûßÝÂóoaûίaþþ¯²oÒ"/ ²79•)Pù•5P¹•Ax‘JP9…»ÌBÊ/¨,ëtƒÊ;¨ìƒÊA¨L„ÊGˆ¬Ä›ôÄMžBe+TÎBe.TþBe1T.ãY*á&§p“YPù…g‰†?¹;,äx-Õ÷ È»ÊfPÿ}U͵ª9X57«ælÕ\®’ãUs¿ÞrÂj®XÍ!«¹e5ç¬æ¢Õµ’»ö-¿í-®æÆ}ÉŸ«9vo¹w5'¯æêÕ¾šÛWsþj.`ɬ¹ƒ_ó ·™Œ<ƒÔBŽã‘CËàßZßÂ" óÕÚ1ëÓö;?o´™;ÿÉÝdKSþþ)_)²–oÒ—7yL•Í|‘ÖTùÍ›,§Êu¾IzªìgʪLè]>TeEUnTeHUžô§léyäõ!sªò§Ï©*£z“WUÙÕ7iÖ›|«ÊºŠÜ«ÊÀ~ÉÆl¬ÈɪÌìM~VeiU®Velߤn¿äp›pùæþ”Ûç»?Ižª,ªÊ¥>Kªþaݳ|JþÙAÛKü1—-ÓëêÐs³¾ãßÛÈ{áZ,lË­+¦õÅ¥Qsþ‚Xýb;ö‘7ÁîCŸIè™e.Ý6¸Ñ¾ñ‘šjÎtß}Ö9S-´»FÚ‹Žšj­©Û›NÛMËM5Þ^tàT+N5äT[N5çT‹îM¯N5í¾´îôð¾5óä>Oz{5¯·õL\íçÎXDZ®Òíl œXöuÛ7—ck·ø×w°gžž:×2ú¦9?,pôô´Ê¤Š}Y`nJ›!%\(%e÷ñ±éƬ{zÚ'I’M4©0º­FËY·ûæf Ð:+£YF²ˆOÜ“A¤VfFÅ\e³M#!ClÓËæ:’!¯\·Ñ}3ä}ùhŠMŒúlÛúl~B›k{f<·ÑºlÏŠh–’¼zò‰ûÓOèÚÜ-X4ïås’Ÿ¸÷dHEûPhÙfy^ÉhtîÑu3‚¨ƒÑÜÛv³þðpÝìï»-Íåd j´UòÙ’/Ü“Ëý™\Vr=“!“MöwäÒ¼%£nûÞ©nÆwüf[¦o®G2$¼É=ï¹FÞÓ¦¨ÍK*O\á3¹ÎgnrMÏgSžµRªÛŽ~7_YŸÞ—)oñ¾”8oÙÞìÜ+ÚóÇî#v}êEÜeÇ9ž¸¼¸›O A¾(›nAïëÊg-?³¾±Ü.JºÛ8FÓ—¥.4‰™ÁóçÒÍÖ΃MÖœ¿5#yY±î¶zþ m›k—ÁÖâ›­¯ž<[ò(É ÷át¾’Ë|æ£o6+þf¼c¤ Æý}+;ä~&·•\g²m³­&6Ÿe?kÌ,ÿgrÏw±9msÉ%ßÅ2¼›wËæ3¿uŸYç}œÏìÏe¤_~‹îÏ¥?¿K?’ەߨùÝÛÊïŽq;xÉþë™\²A ŒGðÙ“—°·† Ôä^’›p=’ìÅÛ'%³ žs—Ù|î6K_À|\ë®+ÌïÁG~/È‘ò;šÜææ™íððoçëÿvÎþí|­âßÎ×*Þ>}}âßÎø³ÎAÙ.0¾Æ~áÛa©êë¥uµ/¶u΂·P÷´ ‡ÿÖêÜÍÒ?¸ÅØÕ9¦åýÝ„¬ü.=ašë¶Íµ]Ú1Œ}÷ðiî›?3ÃæÏ̳ùS•´vú¸yä÷¡ýÚlÓä#ךüi¦qóqÚ<²lf)Þ|fÙÌ,ز¾o.yË Ï2éƒN·ú÷3¯(¿O¥Ó˜™…–]ã»[“»éT‚µÄ%ý¨d{?2¹³•ÍOŒ³Ør¿QóÀÙO.;¥VŠ3³š€ã¹Æñ\s~dV%ð‘ÙBÀœ†¯s;%93»˜ï æRÌe¸Ìdf&1^WO>ó¹kÕäY’‡0—8àšï¾ÊùÌGÖü„ÏžÌlN`fq±zž#ëö¬ÿÏý|£Ï2>ÖæÏ‚²ùˆoÊæÎ³%³{Iæ² Ìe”ëó‘ûµ’OáµÛac†Lç!ÌvkŽ`ËDp.5Ùg/ÛÁ3ÒÈ™m̶ vƒž3ÛªîS·×¹ ³ýØ©cû1¦Ê¬ó¹ûZc2g7Ð9aÖ-˜™ÇÌá®Ö#™KXãrÉ'Ù,Ì6žd;qg}‚»pëÉU˜}Vö}cªO;ŸÿyçÒÉqÜñ;?n^FÃzw÷ÁÉ–TÈ!ËZ‡¢³À`w,`€ÀZâÛ»2óŸ•9¯iûÀ€É`ðWƒî®ª¬ª¬w&ÒIeS0nŽÑgÞ”›“cYXx£í‚÷äǨ«²W_Œ[Qý¦{ݧ\C¶tWcl™£±zUbžÁt´Dá C¶ÌÐÛÌÅqFšéø dËË©´…O±A¶r¢Í1tÝÖ [æêú‡99† sôq[ÃáiðÅÜ£a.H³B†—eºØ§ß‰î›œ~½ÊßÄiº Œ ¬t1ón>À»àFYŒéÇbeGZWÄ ^§•¹‰çÆëŠà9ŽuÅÆk¤àÊß‘í¥ÂÏc‰Ÿ—³çq1üü¸@a‰KXâÂ%fZ§•õ–ÊëÌ¢»h[Z™Eže^k•:Cv×zž ¥9b)'Ç1‡0ÖfIý –x…%^áê˜×¨Á¹'[ï¥ËëƒCœ‹7¹¸RsÌëÞàbñÒ%ûÁ©œç`ïF™ƒ8ËÍÒLVU>4¥œfc)GlÕÁa1ù“ï±Á“}3Tûf(óvß交Îs²ô¶Á&óB냧z‹ãì8ýLÎ_âôó8Då¼èöéœi1n³æ%‹}epiƹ'¤‡ur2ƳÆE¬q5½è vqÍ.®ÎÙ8.ÆÁÒ#}“äešæóÜk¼™úÄf¬y$NEË%OÑqå•›ÆKËâá¬å˜t¿Üì›EëOÔµ,pjƱk{Ö+Á³}'·ù”‡V°Ê“ýž6ãäXã º(œTŸ³Ål<%cä‘ÖÃSuŒöÈœãèòäuûe2žCŸ3£ÍÎu•®ãGèpæä:œu†îøÔUæÙqÇhR€<™!Oæìòd“‡'sŒ=9Ö³ÌùЧæã¡h¿¼Y¥Å¾yÂ9Ǩ|ô¶9žªñìm–÷ Ð0#ͲOáz>ýps 2Ï–¶G¸øêLpŒ>W®ÔTc´MæâãÀ4LW‚1ÞÈÁê0q ŽQ˜“cȓ㟬M1£­1OŽÑG3/ÆÚ–3ï:FÛg†N`®Ž¡C˜!Of´ æÅ8‡bŒúÃŒ6Èœ£>3WK›êÌž,ÍÙɶ8Ù'Ûâd[œlKq\MÎ¥9žLæÚ0/V7j°úP£ãdu£æQŸ±®³q[Œ'Ç˨Ï0l_x¤!̧áàŒúÃŒ<ò¾†¶Gâɱ¶GbÍ#YâÑ<GÇšG‡ÌÆÅ1ô¤ì_€³Z/Æ3ôÖtÀšG2y‚~„¹8ÖDuN°q s¼Àš_bäWì:,ÆÕ1ÆäÌÈ/YÅ^0_ µn_ÓúžÎ»™“cä—¹8†Nˆlx £_ŽnÜNkÎa1ŽÐ±ÌÐ rs\ô60¸8Ö¼'Ìë™Ñ¿ÐuJŽÑ—1cÌ@ëÒ ã^ææXóH¬y¤=ŒUˆsp¬y$NŽ‘ÇÀgÆ£aFïSDcŒýïY€yÏ"'ÇÈc{`ä‘Öuu.|ÂÈ/óìù%C}58F~™‘_¾¨ù%.Ž5¿|sLg5¿YoïZ¦ÉMó›to¢­ËÜ4¿ÄÙ1Ê”n:6Í/qs,y¤%û®ò'ãÅXöOËÌg;%ÂÒ— g0Ÿí ÆÍ±Œå„gÇR¦Ìsp,e*,óaï ÇÕqkÆÓd<;^Œ—0GË×âò¸dÇšGZÛoÑãU’í2;^Fya­žËq¬0­IZ.!v]tŒh-´Œ±V ¨Û™Ö1^âµñ2ŽÅã s‘sζ>P‚Îg=Ï|ȼ€úÌç®eŸ(ðz¾œ ”5ØŒµÙñM¾Pp¥ž¦ zvš¦ÈK —œg—ìÅ>_ ŸŠ|-r\êƒ±Ž³ÙQòŽkŠ“Ê„½F@l˹øxôÌgËÁ¯\;ärMk–¿zÀ-Ƽ>¯¾¡) 0ß.çØ…å»[ÿ‡éÙÎÌç`çä3ïYÈnNv?Ë™yÎK.vî=óžˆz#iÆ“c9«/,gõ9%8æz£›¼g.é‚z’ƼO¡žä“ñdi eÖÁKé”}®:®)æ¶£DÙq1™•[ã5ðœõžÅ!¿Å+%´ZÀÝÀ=5QZ^Oã‘n]Ëïp{ÊÏ£éz¦a‡râe}iÒdJ™l4)“­`eZ¶VžÓse“l¥cÛÌÒ@§6ǵ7Ǽu!*‰F@ƒ¹ƒ‰rÞzFnUä'qpqLdd(/¶g§Œ¦›éHú$ª“mØ‚éÔ¶@*Ën'¾V‘¥ÏÆ…Ó#[¡Ó Û¨S4žã(GòG©W2ÈSžäè'Û¯V&ûÕ2-áz4¸ðuÙN®<\[OmÖ­šJ³®,K¨µrýn\O`Œˆë‰yi\OÎ0Ë3â†ñ¦ÔÆåu†¹žÈQ6!S,6‹—'9ºÄ†”É.÷cJ,Cp㶠Ǹ¼À\7ÔhϬýÎ!¿Í.¶ŠÙú{exa†×>i%ÝL”Ó[“1DÏ&ÂC [ÆÂÓtÊ$z9-XõK¼«‘Ü:dz¹ É)§À.¤ú «á‘¨§ø´ˆš¶lŠ]½Âl¨DM–ÿÆ 2ŽËË?…Ù<:.8pÓ™¢ÈyG¹ò[¬‚ù7Ù`óÀcpï0üÀ‘¸w0î{‡äÞQ¹w`î›;‡çÞúƒtï8Ý;T÷ŽÖ½vï˜Ý;lwŽÜ½ƒ÷ÇïÞ!¼wïÈ{ÇòÞá¼wDïÔ{Çõí½£ûæ˜7ÎÔ+r1f'êêE9ÇhÂYÎ’†¤=ÕàÙý>Ûwòdß§^kpußÌîÝTG¾²¤'kO5xv¿7“âÍ;p®£ì’ȓ˚î„(³½!ÔŸ(2”æ*å%êO¾)Ìu‹ ¼Q¥3ú>f1 çö¤v#ÏS/„ÈJ÷aôÂNXìBÓ!s›jª¶Æ»d‹‡ðÿwLò¬îûP©,™ðzŽÜ¾à/ŽÛ|Äq½mXH!¹Á__¶sÏù<“M«E]6c‰ #‹yâ8^õDz0cÆHÒ0aQe6æv1a!…/Çañ„Ò6ÙØ`n°B¶]ÀlãiqöY”YoÃþKvL›ÑÊÕ.ŽÕæ˜l„-3ÏÆ\·…[pÌmœ9²Â:\s³<Á,Oðb<±<ÁÑÒÆöw”³¥s*–¶I䉃َEž2{y2K¿Ž&[éEæÌúVm…QOfi/ÍØlaªwEŸŒ~ößâ"²éQñ”M£N½ƒ•ÄÏÀ1g6U:uÞÁd›]¹:¦»ÐÊs0^ŒÙm¥2™ŠM3ºÇl LÞL”+3ÔS5žšñìxá{†²˜ÃùGÇi1.Á¸2c(OÉxf•·äÁì¶w›ÉœÒ`ÚKVfy‚Ëd\™q6ž“­~p |FJÔStœ¢1™QÅKº30¸:nÅxrˆÞO˨o¢ç›ÓÿÍõ †Š<…¹ÁjŠöG‡ü&»Þ™âÊ‚Y$/2¥-ÍÁ‰ŸN¹“33}žª ˜ÖþS3V®ö}:ý>8ã0 ¦Y”q;Ë4S“$‘Žù$ã➩˸þŽ´ÉPCerÈo±øi`™J-²˜“„©7ã$žø¥/f§yp+Æ5÷.ie®"êK¡ ¦Û‹ –©ØÏÛ9n‹qåôÈä¢LÆ\°Ó*ù’-®Êà†%ÚRLš£èò¬'ÒyB¤Ölh¢4˜ ÃËéÄ^àôý†-…hÌ2„‡äy1žøû21k921¬üýù„K1æª,X:L98,êC–f,Ûy2ž¸™aq¦ ‹=Yš¢p‰zÒ’'Ńãl,ÍRF»Òü0ª-ÆS2Õà¹:õQòµâØ©!¯ž.4ÑÃfì›·oö^x5áÔÇ%C 5š6ÚÊ6ŽC&,òkâãy–•®S;æwu->èí‰JR•[Àt@Y­sÐ!þTT[–𨫹²Xpj'LõPyæÓ³Óè]•ã¸ÍQé€à`jkrËŒO¶ ®“±X‘’“04ÓR¦Œ@9þÓULaiñÝ¿Ò_Zêâî‚z÷ÚCK]Í´úîO=Pó*ÅÞÚßý‘^ê1‘†w¿ÿú/Wï÷ÕoÞ¿©úÕëU"“‘ljß•éžU”;íìÐ7ЇD{æí51jZ4LtÒí¾kZD‰,ÞÚ”-{æ ŠàãqCNËj¡f4èé]*î¢,îùÓÛ’Z_‘ï­ÙG`ã³¥ñ‰=ó«ÂQk yhÎb(*“ÁPûÕz5ÐfP©äÈ¢[o¯¸±õø­°r6UÍ|'<‰-7zÄ!žxk• ÄzK$Í$‘D'ËÁìà Kã0þêS U¢Í)2t8÷¼®h‡x¦ÑÐñðk>~Ńá×t0Æ:õéлõñ€é—óšæUšÙ©^þ/s¾í¡ÖG¸´6ÜÿôKÃÔ[J¥«žâ³jYÑ"x ½Ô#9Ôèå‹“]Zôr˜äpõîú™ó–WËÔú ¾t¿\÷úÔc:®>ë¤T³JeÇñH_œVid…Ç'Œ‘,+2,sAŠÊ*÷¯ÞÚ\Ý¿îŸ7O¯W·WÏ=xý°»Ý~|yZ?ovW·Û»Í^â¥.ì»ßÖ«>dñ_'oéKYÑ®ûBgQùó¿ßþuÓgG­®z‘}Þ>û‡ýóüÇnûã·ûç×;{xÿpûüyýd?<®¯ÿºþ¸Ù3~¡T*Ø|Zÿmûðò4~éÙ8÷à¿onÿù×#´~|¼Û^s÷ãÇëõÎ}×¾òy³þëæF„à³Ýû¤£lxå)aŸyö¯ÈqüÌ]Yø??mž6Û<Ù/ÛgãûóÞ‚ûÍn¿ùÆÂÏô²{Ó=ú°søx÷ða}wœ¶ÃDYå…ÐË~sûâÞ]ßÜowßž‘Fïá¥ñ¸½îr£7s!AÞln×/wÏ\’øi½»ñÊýУv!K´„5Ñ=¸G¥àØîn¶ÛÞ¼ˆÎ}ùùÁøñnýj!ÅÊ‚ïýw_žöî®y–‚3"ÊáHD'•$¦ ud„¶†’PÆýæÙøá~3O›õþa·þpg?Að#ü·õÝ‹‹¢“>Ùk×÷÷½€¾½ÛîìÇ}Éõ'÷¶äZ_>“é’Ž2­M±w½>=>=||Zßs›_þ°»ÞŒÀëÃËàÞÔí"á±´‹Ów>oïîF`‡–væs,Z|ùqs½½}=üú áI‹m<7²;#Žz¬+Y¼ëëí—]/ùýeàóz÷|ÕSõ¼¹|xZ?mﺊîÉÚÞlHQ߯T-‡U‘^€»€ÒC‡Ú¿Ì4ÐìQÒÉ?§ýc×ÿ¯=/½ÿZ¿RÇ4Å@KýüÕ_±¤{ÇMÝJèHÝâGnûÂûë§íã³ýíùÓúy^XúÂÇ F~Õ#¡F‰!¢§û°q×R$xTV¹«»in ù?ÉêÓæöæÃIéöqàÜßXhŒòÊ7gÓp}·Ýìž÷§õ¤ÆÖßËÛìâ¼>zrÊ+ºqhoáôî33é£ãצ^#zJÉü…˜¶ŽÞ‰½»›úƒ!õÝψ+ƸŠd‰.¡^ˆl}üNŸtµ…2–ÊãBÏ,•èb2zyöauMñR2~¼¿;z+Å^¦K‹N¢|)!ëýÀÏn'¿û´özÜëÞ^*±üÔ+q‡í/¥?—>øoä{6K/¯ô´=®HyJ+²µ1Ó¾ÛÏ(³ÜµXhYèßé{7çâ*}öû…w.ÆÅ艖§sïÝon(²ÕãqÑ”2÷ÙÐÅ÷¾9Ó¦úÔìèãë§ë3Y™ÓŠEFÖfN_¢œôÉÍ¢*Lø¤µô)A¦ýN*®“olvg¢í§ÛYhþô¾‘ÉPUXÔ£ðóç{æHUʯª*%´Y_óøFBØÙ—Æñï}l¶öÙý )ü çÃë™Ò(á(ƒÔ@ö4¹¿âQævÿÜ#죒3e¹Ê{no¨[¤î]1w¤ä©Ó¥Þ‹ÞèMy½sÛÉ~üæê®ÏKΤ¤¦3)ùúªÎT]¿ÿ·ë››'êŸ5ÌcAÿ†ëîÆoÒÙ¬FøWc°+aˆRR¼ÂìgÎûøýu j^ýSöYÖ T(¯g<Æ4ú§õó)µr$¥Ï˜}ôigŸºö Y@‡§ØîŒu€É›—HX‡ô°T^{p¿ë(ÈÇö¼Ý}Ü_Šr»?ŒceÁ÷>=\cþÁÂ×Û{WÊ ZÞmÖ7=5g$8(R‘Y®cÒéòÆ¿~8føÁÿ…û. èxZÃãO{‹ðéõ4î>{¸Q^»Ýlv:™³hâ¾/îÆ7vw#–íí‘ÌÇZŽk4U§^÷o^ú×zf_¯(Á=¥œÄõÕîa÷-F‘ÿðõêôë­=j¡Cº‡n’“šz‡U®FàCô é‚Ü/¢sÇÓŽ÷›.ÿ²Õqüp"?ü®•Áí­ pþ]„Oþɧÿ™õþBÊþé_¾?#¡”$äÇê««_]Ý=\÷äŸÎ®nzu¤R¢EŠ+^š¸Ú’²í’º^ï7çÊ£ô®>’ièI"“Ö×ûîäg©¦ˆ!"ùAæ©ÂÏîÅ!a Ë/£õHhkˆiÏ¡BŸºñnì/½ÌV#ôýí@™Iã‡ûGô÷ɯ¨IèöéáÞ}ÏÛ?¼<]oöç?)Ãyn̺%¼t³½½íbØ=»_ž6×}``OÓBÍyLáP’°ÙÆkgŠº¥UË}âFfO>ðí·½t·?êÛ'%c¯D9,tˆíäm›+ò—S{Üæ(S´3Éèã$ªè]—“²Ô/|b¤åQ§å¼=NÚtÒúÀm¢ÉÝ<ùîê;m€›‹)KsŸÞÑJ=-‚œ~ASð›ÕÇÁÛ‘.©@ŒVg¾,Ìܦ>ÅèSWò6ùEaþãwgjQŸ¼ÐÛøÅ¬µvú<õ,½'’² >QZüëPZBO.öîv·îã]ê/¢z«ÍÑC¤å'éÿ©J-~é##E?dü§¥/ç>²jSŸê…3òý Ik_z$æqýôlB4ɯ_žî{Ñtwf&Óhÿð÷¡›Ý¬}§¸š1Zcä&Õ¢¢,퇧‡—>´ÝìûøÆ~üþÖXš:.á@×TÐÙ>!ÛÝúi»Áhçô¥ƒÄ]nPÓ²ÊË"=Éþ·¯›u|—_´˜±~j?Ð*éÁþ×êiZ endstream endobj 2627 0 obj [ 2626 0 R 2628 0 R 2629 0 R 2630 0 R 2631 0 R 2633 0 R 2634 0 R 2635 0 R 2636 0 R 2637 0 R 2638 0 R ] endobj 2625 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 2627 0 R /Contents 2639 0 R >> endobj 2640 0 obj 115278 endobj 521 0 obj << /Type /Action /S /GoTo /D [2641 0 R /XYZ 72.0 718.592 null] >> endobj 524 0 obj << /Type /Action /S /GoTo /D [2641 0 R /XYZ 72.0 430.937 null] >> endobj 2642 0 obj << /Type /Action /S /GoTo /D [1379 0 R /XYZ 72.0 137.153 null] >> endobj 2643 0 obj << /Type /Annot /Subtype /Link /Rect [ 430.513 732.092 456.053 741.092 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2642 0 R /H /I >> endobj 2645 0 obj << /Type /Action /S /GoTo /D [1767 0 R /XYZ 72.0 636.069 null] >> endobj 2646 0 obj << /Type /Annot /Subtype /Link /Rect [ 461.204 732.092 486.744 741.092 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2645 0 R /H /I >> endobj 2647 0 obj << /Type /Action /S /GoTo /D [2425 0 R /XYZ 72.0 454.639 null] >> endobj 2648 0 obj << /Type /Annot /Subtype /Link /Rect [ 491.895 732.092 520.775 741.092 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2647 0 R /H /I >> endobj 2649 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 720.092 146.1 729.092 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1520 0 R /H /I >> endobj 2650 0 obj << /Type /Annot /Subtype /Link /Rect [ 151.1 720.092 187.76 729.092 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2632 0 R /H /I >> endobj 2651 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.76 720.092 220.54 729.092 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1876 0 R /H /I >> endobj 2652 0 obj << /Type /Action /S /GoTo /D [1881 0 R /XYZ 72.0 124.513 null] >> endobj 2653 0 obj << /Type /Annot /Subtype /Link /Rect [ 225.54 720.092 250.54 729.092 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2652 0 R /H /I >> endobj 2654 0 obj << /Type /Action /S /GoTo /D [1966 0 R /XYZ 72.0 601.889 null] >> endobj 2655 0 obj << /Type /Annot /Subtype /Link /Rect [ 255.54 720.092 287.76 729.092 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2654 0 R /H /I >> endobj 2656 0 obj << /Type /Action /S /GoTo /D [1911 0 R /XYZ 72.0 542.505 null] >> endobj 2657 0 obj << /Type /Annot /Subtype /Link /Rect [ 292.76 720.092 327.75 729.092 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2656 0 R /H /I >> endobj 2658 0 obj << /Type /Action /S /GoTo /D [1947 0 R /XYZ 72.0 745.889 null] >> endobj 2659 0 obj << /Type /Annot /Subtype /Link /Rect [ 349.69 720.092 374.13 729.092 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2658 0 R /H /I >> endobj 2660 0 obj << /Type /Annot /Subtype /Link /Rect [ 469.395 621.305 523.275 630.305 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 417 0 R /H /I >> endobj 2661 0 obj << /Type /Annot /Subtype /Link /Rect [ 138.0 609.305 155.22 618.305 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 417 0 R /H /I >> endobj 2662 0 obj << /Type /Annot /Subtype /Link /Rect [ 442.07 195.719 467.05 204.599 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1713 0 R /H /I >> endobj 2663 0 obj << /Length 2664 0 R /Filter /FlateDecode >> stream xœÍY[oܶ~÷¯àÛqW¦¨{ßÒ6iS¸ R89è) ®Äõ ÑJIkwϯ?I‰¤.k;yJŒÀœçÊ™á ýùÂ'?ßÉ_iè{iš‘|ñyÀû$a$ˆTD½E”Ä=‘=™¢"RIgÁÆ~MöÞ‘_Ô”ü|ñç_ØS ºÇ z†¹bu{ñÁÑmØ€õ·¤%÷?Ü]\¿ˆOÉÝÖº8b^â3Jý”¤^À2ù‘»=ùóò]Ýõ¼ªx_6õ«¿Èݯoî&¶”zé·fꇉŠ•$I<:!Å&Ð8`4Gùi¢ÈÔR&mþ}VeºÐ˜º /£ç›Qî|à$ØåûY–d>yé$t˜ÿTÀ|3Ö-c…I½$UT;Ø®,œXýÌ üŒRÊBm3ŒÂOè‘›z[Þ[•8d[V‚<ð¶ä›JtÚ-Ò«+. SD^Ìâ,C¼*¦o›–¼Â·ÈóÉ%·Ëªìú²¾·ˆfëì{àe%ÅYT>ÑÉ •r2ZZÔ¡¼s¶tÂú Ì(·®æÚlch¥^ä#h˜-LnŶØð9Ez4E†œS\”f£!õQàÖå3ŠG„A–¦4üA¡Ÿyibç9AåfN¦^’„Y,}p5ß›’0YaZÌö%ð’LÃ4LP~¶9;¿Yqÿg_ÍH|ŸÄ2èQ£Ÿ€{åün8„µe7'S¢Já*z€(8¿»XåŸ|ÿô þ{Q¬`ÒCHÂÈ^“:·{ÏÛ|MB$%¬ðæu±à»/ÖEjy¢^áPæéÌL—1çå Õ•2]!UyL<–R™cәĈ°D~`¶F¢B¾©ʶ©÷¢î_^‘Ã^ ¹~â©NIJ.ÝX~¨Sš¨¬DUÕ<šj Œpä¸Yñ“<³¬šœ÷b{éÒ¨3ÖEÙŠ¼oÚÒù^ZµŪ°öX/Óß—÷ÍÄúCÛD[ÆCñbµG2¡ puù!Ž Œ5Ý/ï{c}möÆ1’/ží½Û•JÅ(Ãýg\d1Ý®9V……7î7Ñ[`¸ 4€¦Ò8¶Ö‘ÁëÓ#?yñÎáâ*:G°vŸ^Ûþí.ëšš; Ì Kàè¡’/=2¹Hg¤Ò…¸Ù¦*>fQVù2-Ø ‘Î’Jÿ!¶?ý@òªDœvÏsŠ–%å<¸ÜþüÛÍß?¾¾{}óþç¿ß¾»ys{æÐ36£|§Z x\žš£Y#ÞrÑu–  ¬¼2`?ÄܰQˆÇR€6ßvǪ×çªù4fiOuàÐqÌ)ÍýTµâó™h™Â½ËƒC—0sC+º¦zeãpÜTeNÊçPnK¯P ”-‘jUªÉ«ù^)ëWÎéöqRÌÒ°€¢4F:”¸ß›^Œ‹ò')p×±8ÌT¿ (Þ«F. —]³têz±×ç¡1c(àÀóOü~±ßÂ{^Ö=þwÅݯØÝZØq¿F<îšn"®ßY¨t˜îx[|7Ï ˜G05’YWà¡”r;Q¡ÇœŠÊÃÎ#ïj¢‚.G»z¥6™°¶nz2ÆÁÓ‰ÄRy—1œK6ôõ_–G˜f„*âÔccéµÍ# Ti¤×&48¤‘œ4Òˆ=?™õÆ¢Ý,Ø4fi²h){8ÆÎ3Ç€§5YtðGàû3ÈCxE‚ÀKÔåpe€=оú¦©:UMóÉêüÍ>Ñz]ˆ-‡ÉU>:1y¨ÆX÷-Ù<Ë.š ß‰0¤.õ¿}~žøzðÔ“ K€.í ^ŽMH&^xñ‡Ø‹ýFå×h(ïWÜË‚KSXooîÆõoÍpËÆºó×<‹º„†kTâ‹¢”.nJ`~ÅX9®óŠwC»5%ƒ°ÔI£‡¾"¢Y•%çx84íša˜…¦†ñž cøÒÞ3ˆá½|B?¶Ígä‘[é'Ä"ÔojU)TÖ©øìxž¦CåsY’2–ÑIj¸tÐ RGql-Ùxº4îþº!sË tf9F¿ý˜7{ár¸ƒ¡º(BVNôÛS[­Ÿ@‰É”;܆Sv'ƒúuºîÌTñÓëÁV T‚·µJ»ÔFëµÛ½ÐUæ J4–´1Ë|Çë{Ëèq'Z±*BùuÅh¹W ½†¦:³§!ÝÈèõpŠ:ÍÔÖ®‡¶jàÂõ¢!JzÍ ~p?í–Ll-©»ƒÈÑ­äc& 6SZ‡T²gwß{áè4§‘ncáÌmÑë†!o¿—¨ÜJ ½|D¡3€v‘^ïøƒ0€¾ô’²øœ·bk¹]åY4õ¿¬´ªt8 7‹Þ¦SZÝɃ2‘£.E½ä³®_ÓdÂ×Ά+ â™Õ°³9é‰àû—Ýf’f »”×Ç®½V=ëõ¦¬Ÿ,w¨ÅaBgôj •?•D‰’e L9ð:Qä0ÜíÐ]Þ–g†y^sL%4²,–šË{XÍþÏé¡©Ÿry eî«fƒkm˜®µÐûx@»©[JcîËÕXìù4 , –êwh{Å ÒŸq"Gmb6ŒNƒLë®1Jžì×®,N>p󂬷™!@Ãe]ˆ\1>’0Ó z®?ç£uBŽÛ{^—ÿÓq°¼ý£ˆÎ æ8¢ã72©;nœÄù~…¥}‘! ê¢ëºêiè ™Õÿ§ÛÛÛ'>Vu–• ñ)£‘ÿ5J/È‹¾x.²—D3Ÿ7ùQ½¡ö§ƒ:².ug6¹¯Ö¬‰‘æi’¥)K¿Æš¹ø‡ïÏ="û¸Å–¤ª aò‹gµS£¸³ÞŠGD:䚃:wqÆ—…}-Öì]àQè~ríÛøÚ6~ß™ôqò “Í|®’>“¹>1|<>y\²@ "JÓÙÄA"¨ŸÐìkŽmAÞ}~:qd.ˆlÞ~¸[ rhU ò W ‘¾ßpÌ©žó×èÿ<&, endstream endobj 2644 0 obj [ 2643 0 R 2646 0 R 2648 0 R 2649 0 R 2650 0 R 2651 0 R 2653 0 R 2655 0 R 2657 0 R 2659 0 R 2660 0 R 2661 0 R 2662 0 R ] endobj 2641 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 2644 0 R /Contents 2663 0 R >> endobj 2664 0 obj 2424 endobj 2666 0 obj << /Type /Annot /Subtype /Link /Rect [ 480.648 223.658 506.748 232.658 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1270 0 R /H /I >> endobj 2669 0 obj << /Type /Annot /Subtype /Link /Rect [ 157.425 90.815 195.185 99.815 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2668 0 R /H /I >> endobj 2670 0 obj << /Type /Action /S /GoTo /D [2558 0 R /XYZ 72.0 769.889 null] >> endobj 2671 0 obj << /Type /Annot /Subtype /Link /Rect [ 216.695 90.815 253.355 99.815 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2670 0 R /H /I >> endobj 2672 0 obj << /Length 2673 0 R /Filter /FlateDecode >> stream xœÕYKsÛF¾ëW̪¶*R•8ÄàÔV²¥Ä.§ìX¬ZoE9€Àœ` š{Øß¾=/`B´rsìƒúkÌ£»§§»§ùå‚ þ/ÄŸØ'8Ž”í/¾h>A‘‹¼P³ûnà8">v´GcV€ 1Ç"\CÁŸÑXÀ;ôï‹òÂA?_üþŒÉ‘óÎ3‹Ë¥.~³dÓ€þžäsÐöâvu±¼qÐj3˜Øp†I» бç&⟋V{ôûÕ-[¬Ú6i½c”_ÿVo/îV#u=ÇÁñ÷¦ío#Á[¢(ÂÎÔ‹ä2žâG­(>™BµËˆ£4PŸÙ9‘ر>u ïF¸ç}'ŒpDH’DIŸpœšÊd$JÚW)ç¾,F»KÛ«®èIZft`AdL×)·8öêà¿…Š« _Jó\ZÛ—ù™­­OÍÑÕ@׸ß%ž‰¥$ž˜¡NkÚ V¢ý SÊ´@rÿ4ËhÝr髼=Éx.`™îéä\ñÌV¾ƒχdè­ÞȜ㺠nž3qw VšHJåAŽnˆæ‰‹rc€q7 ¬(ú Þ/™©Kg¾âõÃÃÃ;xÖ°ºígTe›²RgÔ‰XÒ3êîD]^ÓŒmX&£ÓI`XÁxž†B' ޾¥u¼­öì¿Ê‘43oØmž_mSÙµ}¤›×·‹×Uv[UŸ¿µæHª2Ÿ1@èO P7ÕËafвª«A®jƒžÒ†¥k !ÎwðÍX I…|[ؼ‡Giò9‹#ìA’x& ¿Ù q_)dpª--i#?EMz-zƒ Ô‘’©J©`ŸE`fü™â!!˜¸áß67*òÎ×ùÐû—+‡gM/„{ľšìÍšb|àzq\}¨*Þ.À™D}wÒLž ó“C‡¸~0 ó𼃛KkMö<¨Žšlè—Ž5òv ¨nŽ >ýúNS¦ÈåX3îYÃ[M¨&vé“!e`ĺQÑD2w´—›ï(mF«QÉn\ùìiÂÛ+tBì‰_I‚¨ïETŽK Þ%C‰¥¾n¹áéÄ¡}©Ì€Ê^¯/s5£†‡P+O÷(0Õ³ùÖµu§*gÍQrVúŽÛËf èÉéƒUH<±ÊÄKÅ¢æ­$–*Ëf Ò­U˜Ž…‰;:ä[ºiÄ›‹¶˜ã%‰é Ë®˜ëãdÔS iJMJ³+Z?¢z¼¯ò¾ÑÄ{®L‘ýd>Lïû; šRK!õ\4H'€iÒº–NtnÓÙ™±è•Ù6PÕ› Ù\ÑuÚ´,ëŠtøl÷^Gu‡z… Œ©ša€òE…’¾òЋHa³R˜N¡B–¨Ÿ,¶ê‘Ž—Ó&™1€è•  »v¢M` õM#u¥r‹ÃÊÑ\{¥º¡O¬êìù¢ ‚-|¯Kk…L§ÛlV•O´d¦Ùm6´¥cöâ¹e­™Ôý]ô%ı$¢‘}xÇtìx¢Á=™©ú©Õ N§Ë<ðçi.&®‡I¬{–'³¬ÍÌûlvk9$L`ïÈsŸÙ»o¯ “à¥é°uyg·V­inqLOW¡¾=+ê§Ñ·>ž««zc}E3d]ˆ ÅÑæËžËÌ ÅñXâÜ:”Sζ%ÍuhÏhSþy訊Ÿ¾ÿe‡n× endstream endobj 2667 0 obj [ 2666 0 R 2669 0 R 2671 0 R ] endobj 2665 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 2667 0 R /Contents 2672 0 R >> endobj 2673 0 obj 2557 endobj 1212 0 obj << /Type /Action /S /GoTo /D [2674 0 R /XYZ 72.0 396.879 null] >> endobj 2675 0 obj << /Type /Annot /Subtype /Link /Rect [ 327.05 603.299 363.71 612.299 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2670 0 R /H /I >> endobj 2677 0 obj << /Type /Annot /Subtype /Link /Rect [ 343.317 221.553 372.197 230.553 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2418 0 R /H /I >> endobj 2678 0 obj << /Type /Annot /Subtype /Link /Rect [ 389.81 221.553 415.92 230.553 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2485 0 R /H /I >> endobj 2679 0 obj << /URI (http://www.sagehill.net/docbookxsl/index.html) /S /URI >> endobj 2680 0 obj << /Type /Annot /Subtype /Link /Rect [ 335.042 129.523 421.085 138.523 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2679 0 R /H /I >> endobj 2681 0 obj << /Type /Annot /Subtype /Link /Rect [ 426.607 129.523 523.277 138.523 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2679 0 R /H /I >> endobj 2682 0 obj << /Type /Annot /Subtype /Link /Rect [ 130.0 117.523 221.95 126.523 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2679 0 R /H /I >> endobj 2683 0 obj << /Length 2684 0 R /Filter /FlateDecode >> stream xœÕZY“Û¸~Ÿ_Ár¥jíª1Ìûð[œ=²[©½<)g˳”¸¦-Ñ(ùíi )hüÇ~pM ÑhôÈÞDA_ËÊ4beYÛÃÍŸÄ‚"’œXYÈÒ8 Ã$ˆRgÁ!X²² “s"Öü³ x|¸éoÂà»›¿Ã˜&aÞé&¼"\‰zó‹£ úKÒ/ nÞÝݼù6 ¢0¸ÛY§+ò¼ªÊ¸ J–Ä•üw‡àãËwí¦kÅÃP÷-_ýÜýpóÍÝb»I²òKÛí/ Á[Š¢`áÚ‹”˜yÀA‰òÓB‘5ÄUÜþ{UåðBãÐUøÒ¾å®ûN^°"Šªª¨*øÄÊ…óDaüœÇ|1Û»t–XëEû®Öûƒ8dIŸ<ÂÝA€»5ƒ¢òrÔþ²I|MÔ›o£h½4H½˜0ð]³ù£nxðz öÓ¡ ^ÁìûaàGö+Y3vÁN6>:-Ú³©4]kâ=@XJ =kH%¥t†¤zÎ>ëQ>û¤á5QWìs1AÙçIše ŽÍnm`O` M=°§gí“ÅkMû<“aË Š×:}¿ ^EÅâàåY̆>ÕýdÀ$ ¹Ý×ý·_ö–ÞØ$}6Ìq:wvˆX,6Јí|àýtk8u×yõê9o|z5–lG߀so6nqa£0cy^ÈìQx¬2`›zö¥…“ŒE1Ì!v/gÛÝõÍu à”’õ›ÈººtYÞ2Iž{æÃÊQIè¥ yUH˜,“³Ë´¸¦‹ã ªDiÌÂD΀RþŒ.§vÚ€ž„tÏO†>ÖC}àFfx? C¢?ŽVŒýD†àk±}'Ä'ƒGø¸µ+Öƒ»ú–c=œÙ*È“ÐK#iš¨ÀÝü<9¼íäéFPKŒk+ ]Û0h×jC õÉÐëH"Aj›za6ínÇí‚»A 8^jW÷V¦«Û™d#Ï®ótµkåF¯£(fyðòî›ï¤7ÌÞßʼn?òáÖaaPk´­{S«Â_ãyäBOÑh¥mœe,Ìd„™Gï¥ïÚYUÄŠFiî™åª¶Úãäj#P?жqð¾~DÓ{GOçãõ}íæn­¥<‰"_鶇¤93­X¼ìÚž[¤2.Ñä—„þõþŸˆYÞ?GGÎ( ÷´½Ð'g|$.d[FmIp¹ †%1àô,Юä±CY®ì Âªd¹áóÖTÆE¿]A†R]øÿkßÐl²ÿµQ¸Ú$Ä2Ê0Œ "pÚºfžÛˆó¬Ÿ‹jP’Ưǫ£(Ÿ›hWÇ©½ÅïºÑ®–6P飰4å߬Il?Yh«†ùí̸ç|rÖÝa6Din\(™1KÿDùV­»™;‚  ]ºz,C~aÍæ…L¥Q"³ö‹‰·Ä\`?e/ D=‘¦r›8yß`»IïT»CÄ){ºõÊź€ôÏ©GüèW{%Ãcý “üœ ±|;µ¼;k·Swù¥¿ $Û(+Â(®R”ô£˜®7YrFzÉæ&OR§ƒN j9 M4å}Hn^OÜÀÚP«ªL4<Ò¼Þî €¾ÈŠ;Ÿ<q~4\+JZÉŒÆ0•íÔ|i{K5ícÛÌõºøÊ}fÅjŸ»¶ÃøÍ"i'&à”=d€Z˜wÚ•º³#™Ðp™Ä6ÜZoÄ£#ƒ2‘oÁi/:.š2dý&毰ËBüÀ×uVn9¯V[e#WËyqêñZdj» šöõd†ÒØõ!ÝöÛnn¸ƒÕáj öÃV 2º˜Ou#ÈuÚld˜ßшzõLưÉáóBÁbH'a´*ŸI•±2Ž¡Ë€f’Þ’„?  ¡ @?YH¶3ƒ›~ô*Wêk•,J²ªÌ“Å~@‡å9@Ïè za_e«ÆÎ‰#8ü±óè§aÞÊš9º“êéŠSý:Õ@Ц¦_O\”Ebέ³l>/3yš„+SÈ ¾-y*ý˜÷-®3ÄÓ]-"íê¶H<÷öœv·˜o=/ª•!‘´Û¹«µ úõ4-´Žd²­0z wå¥HB go 9>NœÓ¾Å´ˆo±(ó"˜û†;’´f lE? ¢³ Wƒ_ùîëwÞ¿T—€Ñrô-Ñd·®ì¶àr䋯ößÜg•,]YE_q VÊØ¶´èï_ÝZx6Y ±Ž&D“3ÑÔaµ%›‡Áb™<,¢ ¼]Ðy„¢"úÚQà  ÖµÛZE¡£èjC¾'gVýÉÓ ¦Ð&.Í2ÎêÈczBQ•ÙBÚgd°ÆlÜE›#‰NŠ]‹¡Àä 3¬;W›‘o©u'Yíys䣣¼Õ¯~¬Û®Þt>ëÜyàò ¨xÃLM»E45û–aŒ<}Nf#l*<ÂÚ¥±|x ë8óÄpu Æ4XÝk˜eümds„²zá1FµÎž£ì±ŒE8cË@6 ÒÊ_¿;vR¶ç+ƒBå 9‹è þ¯R•¸*U7aŒD  ±A# Ý¢ŸZÝæ·vèÅ}C3MjÓ2GA½q(‰!T».„ºs(ê4jšñŠN;~òX%†dça”åÚùÜèVgÎã 2‡¢¡§kz,2È©-F¤«3"|«3Swmßê0ò0UÓ`G ‡š²éлk8œ³TØ%ʇoCÛðq1Ûc™$]Yf©-Ü!R­Ò¤}P‡‹VAŽTƒYhÊÂ3‡Õ:Èz¿añ§‰÷£º :³„¥!}A+ίh·¬óÈ;Ò|e„m;Õ¦ý‚Ìž»y?_4ÏíÖ²»v”«¡C!ëƒMÍÄ¡¾þ¶A`ý¸)_w£²DèÓQ=.éß4Ì$ùãhTåUV…g’]ì^§:ßÒ tÖ¥|W-²Ü·´ókŠ“&¬Š¡âÙ•M†@¸­é1! y‚|°‚<ÏùeåÚ‰upä‘”Ï!‰­Dc°ÖŒšÌ…¸6Ôœ)Þ¥k/GäYœDÕÕ/çYµ{CNóÐ;|uÿò4cY®ÌBµÚy/‹/ÞÆbåvï±yå—ÔF èážÏ›ûWŒ°zL‰Íù}~Fô_Mú+Þ8âÜv.9öôªó">ö‡1>ÏûrY¹Îò*t†˜N" óªÖàíåü<„ùÔΤ¤×©û8ÎVã2ß8õv³¬°‰[_ û^h0ñÔ¿dQSɾ¿n{û™l†`QÙ šhi1ÚÅõC‹o!¼– ·%¢te }_)2ùs©Š‹¯FƒéÆÂ 㧺úvç[⢀À˜!™ÁaV/MÐ_!vœ6¯F¶}2Ìßð‡jÔQù:ÒÇyZèå±@œ¯,`ë2äP§ÅBD¯#„¨M@Æyä}K &òÆyÓ´ôàb8»B,­¯1ˆöp±ÈLe–÷­pu›ý°­%cͤêOZnÄì;|é‹­ãM( Í ÉQõ‡HÏGCÖ†²Aê[Û­AÇŽ×è¯$ÌÒïÄÆÐï§ú å fjÕ~ ÃZ ±n+™(AHyÎÛˆlñFL9âóbäÃ#¯­Bªj ‰Ç‹´Î¨]½JTéÊwê`å/Aö€ˆ÷Í­E[q<»#¹ïø#þLCÇáa.mVF¬³2"彃è]à›ëhMoù8;ñç@óŸ‡Ô¯¸¿ÜüíEšû endstream endobj 2676 0 obj [ 2675 0 R 2677 0 R 2678 0 R 2680 0 R 2681 0 R 2682 0 R ] endobj 2674 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 2676 0 R /Contents 2683 0 R >> endobj 2684 0 obj 3102 endobj 2668 0 obj << /Type /Action /S /GoTo /D [2685 0 R /XYZ 72.0 769.889 null] >> endobj 2686 0 obj << /Type /Annot /Subtype /Link /Rect [ 364.597 625.537 390.707 634.537 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2485 0 R /H /I >> endobj 2688 0 obj << /Type /Annot /Subtype /Link /Rect [ 251.36 580.989 288.02 589.989 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2670 0 R /H /I >> endobj 2689 0 obj << /Length 2690 0 R /Filter /FlateDecode >> stream xœÍ]“Û6î}…&wÉLÌ¥¾(éfîáÚ¤m2Í¥íúî:“ìƒÖ¦m5²äJò&ûï (‰’(ÙÍS’A|@pÿ¼qÿWø.‹ãÄÙoþÔx׉<Çrx!ç¾ãÌ £3D…NŽ4ÆÀkGð3˜ ðÁùßMqÃo>ÜÜ­Ãîó ŸY\-uwó«!›žãoI>îìo¾[ßÜþ:.wÖ»ÞÄžûº ü‹œ˜ùŽÏYÏ×e™×ή¬œ‡ì!ÏÊ}•ž™¬_Ü;ë·7¯×Å}ÎYü­éýë@Dð›(Šû“ZÆ'`hEü4d —†4 ßY‘ùDbn HA<bË «yÖO¯P>p]–„|½ÄŸ.€ù ]àD Ä÷£üÁÏÖ`μIB—ù>FØŸ’­geþ3o²x–î1­²ô!—þ‰qï~>ú„K«Ü/°w…Ëfg_ˆ)å.Ëå_L°˜ƒüc¦+¯W²ÞTÙ©ÉÊâR‚ÉÃÅì! ”Œ«'qžŸkYÓ¨9hTPÞVÙ£¬hŒò·ÓSýý©<Ó`SÉ´‘[>gÍF#ïñÀ(a"À&±°Éw. Ñø.LÌÃ-4Ÿ»_3,wHR)·Z³L Ú”ôû´¿}’Å󨯯, Fëa_Uº•óªÜ|W–Ÿ¨Ä‚›”Ya90½,¤Sî´i}>Ê íRž›Ó¹qè,ÖÌÂ9‚BëÌÔ¤B³lä?@êU,Hþf×ÉìÀ ®öHÃJÕv܉nÒ“[e:jÓZFom»¼ò›–òΠì©î‘©1>–uc±|Zá$ËøÝ¶DƒÖ0HŸê— RÀƒÇµÁ‘Á3È…kYN/Ç|옮` ­À‹,TädYQ72ݲ¿xˆ=ׇÌÅ„ë2ù½:¿m•Ì„š[ÍËž/X(à*&1¬ZgÎ>(=F4¿T^R¸xRj]«ƒ¿’¯Â–…º3È/YsµtPo¸¡âÐ/Ö³‚[æ/ÅsŠâÒ -»#ªïi±Gçâè1ÍÏí¸ÜéAZè8Ö¥u ¬ñ¨ÍÖåvLt‚›®µÊRc²Dé”䨖]éL>Bõ›´²Ì_À—&Ó/¹Ò„`t˜w'ß ‡”w"Óí6C…Ó¼;Uy†Ñ_›ûl–„sÙ pýð8„¾hí0c@;Læ_4Ą¼,˜!ŒGtëCFQ=‚eá„4²:‚ \Ú‰IëBBCæB`Zu€Ú‰¥ñ)Ï{‹ õÜ¢û÷hªWXê±Q@ãB ñ‘! íÎ(”®–˜†éc™m;¨•¸ClÊb—g•( “íº!ez½¤‘Ì SVÝP¥B=®%mi/KŸä îûAÇ¢çr0êí@÷Øé¾+󭬮=å÷XÂõ>Š/^ Á»'Ó/9÷„`|ý›÷ïÛ}&iëœh×\Ò>¬ËúfV΄êŠgqãY Ö¥5~/ ØHª« óðÔ U)“=´0!?>ÿ|È6‡~±¢—ö\6&8Pr;Ýæîä[oªÐK`ŠOwk3R•Û`—1+€W»¤'‹1·Ëó·WôÉü‹2¡0ïÈ ÞéoHw§<¯èØò¦²†ºàoAbкŒ& !WÐt*w°þE—BÕ+ý|*hܪ-¦(oC-øT‹CÓÄÖÖŒ×ajBZh_^Á݃b4Ž!wz6VÍnž¹-Dl16Òk˜Ã1JB`ž$–¶óÕŽACÉ“¸žû•Ì(Š|îrÏf÷ÓvAó<Û2 ÿZ³Gèåø ÚlwZèÆÅX`ã÷«O8ƒëÓœÓ4r¾ ‰Ñ[¸@ø¶ 뙫 KÃ6NZ‚XäŽøiýîg\dW>Hq¿­0 Wÿ}c@¿¼2¿ÁIlîTóÅ@ª ¬ÇXa¬åïÆGŒÙ•¬Oxx”ùëÑÿQ¹[ó6æ~Nôj–64ŠY‚Íhއ`BÚ3§ÊEI’˜E§·È"É‚_c†í¦/‰B%©Z³ìnìèûMBjÏe^»G4†-5>ôûCs ô®*=¤³>p©†‚Wn3¯Çž`rêáAb'ev§Å“EÙ$)«®«+! £¶RPC~Ù¨(&Ìì^âÛTÁ9‰×Âb)>b3.âX…o!}y ÷ f~Z¨—|û¬n€ÌPš|%cø{xš\+÷ù³äF!‹èÞ,3'¿»$Hâ±R>MW[ ”Xˆmò ²9ë™·µ&A渻´´ß ÒMFé£á_t6i ¾ß̸áøpVŽ©ƒ‡|R–A]Œ…k;ª’íY(hï3Ô°O¢>d»¦ƒNé^>@ùT÷Ôª™JCÝ%àÕÝêbj†Å¯ó-XöD›C™mú/ʤ4l¯š/M=ªi ¶Ÿõ ´†k+ÓªYw€»ªøÞàFZ4?$.®Ò¸ C=¦J?÷¦ÊêcÁÛÍ&°¦;­†¨Õk[æÁ\ëàÒDP“·wç¢xêAì®´Í}Ê ‹#ù“”’JÈmMº¯?¾¸ö&†.‹L¸arùÍŠ[æ_º‰L)úW*Uèß_º“„­Ðõ9W>|êŽ$m·Sƒ”Ahœš³HˆC÷HË‚ý½—õH£Å©1}—³åV_»^gZ·Ž`›®zœ–}‡Ð<´…rClÝ gu-&€jǰ G}£²C¯•’šô î¸_:ðYkžgj“êÇ´ÙÇceÕ.˜Ìxö·æ™]ù¥?¶*`¨¼ûÙØ¥ž95>Ëà6vݨ÷g¥Oá¨i¶C2‰SpH‡Å¥ºãL:çÜVx|D…ZR'œR½¡Uα„m7ßÙpiã¯SØËîqês–çõT•©ºßµ/ÒÜäv—íh†$™—Óg+À‰`A{ Âf{”P™;]æö\W·y¹Ió[Ùln•ê·‹Š»µ° êçáÉCEœ“¬ð}µr:qmæwÒéŠÿéý»×ó·Rw‘˜búëÍÿc/‘Ú endstream endobj 2687 0 obj [ 2686 0 R 2688 0 R ] endobj 2685 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 2687 0 R /Contents 2689 0 R >> endobj 2690 0 obj 3000 endobj 2617 0 obj << /Type /Action /S /GoTo /D [2691 0 R /XYZ 72.0 769.889 null] >> endobj 2692 0 obj << /Type /Annot /Subtype /Link /Rect [ 368.964 315.767 395.074 324.767 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2485 0 R /H /I >> endobj 2694 0 obj << /Type /Annot /Subtype /Link /Rect [ 165.82 116.336 194.71 125.216 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2418 0 R /H /I >> endobj 2695 0 obj << /Type /Annot /Subtype /Link /Rect [ 213.87 116.336 240.54 125.216 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2485 0 R /H /I >> endobj 2696 0 obj << /Type /Annot /Subtype /Link /Rect [ 259.7 116.336 295.25 125.216 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2670 0 R /H /I >> endobj 2697 0 obj << /Type /Annot /Subtype /Link /Rect [ 215.07 73.49 402.55 82.49 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1273 0 R /H /I >> endobj 2698 0 obj << /Length 2699 0 R /Filter /FlateDecode >> stream xœí[[Û¸~÷¯ ¦:fh’uYlØdf² ²È&q·-’ -z¬,y%y./ýí=u¡EIvÒI㇙±Ež?~¢å?'øw.?<›bÏóÑb=ù³j§ÈeÈrª&N°Í8!¢6f­ÑnG±£]°ú >vú‚¼Bÿœ$‚žOÞ„>!"0îvB”—ªÞMÞh¾Uàú˜ü#èzòt6™^qD š-Û3òK}øs‘‡-&¯|†fkôþt–¦qŽ–i†æÑ<ŽÒë,ج"‘?ùˆf/'—³À-B°wlq¿Ùqpãº.&]<•j,Õ-J£¼µãHWTVvZTêsÐebxLt‡M(sÃ(r\ìR@‘ëûp {;0b–5†˜£ Ï “~5Q»ˆ²¨mOK˜Cà¯^3Á<`[ebÎÿB‘-š´xišk„2þs&[*Aà*n‹aê¶iÐÄ* žž†s6ž¥ºJ…¡®ªgöžÔÁnÇ24õú2àÂAê OÔ27r]TÝ \ÓzÕ2œFÁˆéÝneÚZ£Õôh“¦e¾õiÔb# ×hÛ]c¤\Y܆…Åm¶ßƒ,’xë]^Ô³±ãŽ#Œ}Cˆ±GŒ}Æþ4éóúU€ºË`ýåšú˜Š&½n4™Å{MGlÖ×7ÂÛ#ØöƒíYº^‹¤ljs´$YëÛQT(Ç6ãØW¡jõ†'êFúºÄkZ¯ZFSP«4½Û­ÜøZ£XКqbMºù~¾IL–)yÖ§(YÄÛPÙõè–øˆ«£ÄÕ÷„O’&ý4Jm{GŠ˜ÎóPÛÒbèVßVÏVAr-ÐÐa{ØG§ÅJ—n‚x«ËéR‚D`£ŒŠ{…PÍ cƒ¡XÄAQZ޶¸ñœ©&TERkYÙgÊ-{ðN¨g)å¹XHÅ9–cm·û+ðÅh ­ |Í"‘k-A& í¶ÓѾIó<‚§©zØE§³•ÈE#’æzä¹Û[ys©ìL¯üîìPêV8#Ü4~Õ{¦•{Þé¦Ì‚¼¾„}gúz#yGÈ %t€:Å®C)3 0eøÄU0Y°ºÓɺ£d¢¦uÓ8®U;Ð騞î[Ó›ƒ<Ùåɺ _FmnyÖÄØ±cìû"iË9Vø Ò P ;µœ‡:[ 穤†óT²â<•ìtÔ+Þé‰J®ã9.ök•”÷±ÈWBXk­IË~Ê£qZ°F*RK:i©ÛJÚ²ŸïTŠ\J—FS7”œ¦Yëaʹï{Ìê!57ƒ¤Æ'#ã4ÃÓ1¢1(QM1‰ÌÀ.)ÒnÌVB“òû¤î Ý.éè>©¡pR2b§¼¶¹š˜ª¡·W‘ê=ÖQ?W>yÊ'QhR•NþRœ`M®ƒQ’¸+DöÐhß ÑeØŠÛ˜iž¿ÿ{¹:>žh7Á!3ý”tçL¾V#y©”¯£‘ Rå3eÔ>ʧ۪…›õœ?`9çCÕœïTÞÖrÓ:? ²r³óž:Îu>Ê¿„ŽâÄNyç_KFƒìºÿ%€æ;§GD%¢¾'pöpÏc…Ì ÷ä&õ|ÄÕwÀÕ;µas¹#k ÃH2– Öéz$¡ÖGɼ²>摜””Yòe¨V2iNuã=üϤ–øºãØ´dç—šDN4A±J£¼ÜãµÛ«Øæ:¸‹ÖÛ5Y1ÄÑ:ûæ9ÎQ> V-61šMn¡Õê OÔݾ´ÞŸë+ÐV+€L˜~Ùû_Îé³CÌXwÛ1¿Ÿ(ìu ».KÕ_´(ÓmKeôc¬¡ (ûB”±„ûœ=¢ÈWTúB܈#Ó ('òÿ7ºkº_ßk6;v¬U¬Â’7š3¥J Õ[RZ ”»ÍVoPÅï§ï¶›Mšêä‡ZnsB–k ÕIQ%Á28ÓÄU±ŽÏö³¬Xž¡ð&:C›®6ù*ä’Ф­¬ò5Z)GYõê«…¨‹™'õugløžË¹2t™ÜDYš´¯öÈh§WN7鶇,Î1e.¡6uªt<ÿõÕ§g?Ï~~õúù§«¯.ß ž`Éñ®Æ!™„UQÎV‘:âê‹ÈÆ•¶±9$iZô! à{0·j>T“b_ê:yßhc7Ûy-4]¡ü¦v‰LSªÎ'+m+m´ ·•òt›-´»aºØJßó.Ždèž× ýE£KÛˆÔu“Þ0FÕ¤"Rן…Ø´Rœ.sVâ"ÝT‡ŸJVgµ•’•¦ñbvÑ Ë(ÖUÌ»öFê¹5Þƒ%‚Ty®Ûêëß/ß¾}qqÙjú÷P,—Cp¥¾Ó£¬?-;Ñé¦?÷0cæÜØ„tl,‚"ˆÓkTf£¥€pBÅ*(ÊÓ:•û*årÉoå°Ì^p“Fa޶I""σì%¢¸M³Ï¨È‚å2Zàz©i+wlÙÚÌÃáògÕÊ»¼ Ö͉¸Z²}KÎæPô9õ}¹Õ–eur-ùšÂ­ø[7Ò6o宅ªë Jº‰ÈµäTK¹^Ìaq ”¿ÌÓ›Vúpš‹VêLóì;–ïùÌé (Û&óhÞc1 f–S«ġ'­#Ih„ÖÞl®’h!âû6%å†QÇÇ2åŽÕ±öÛÅU ¥¿Ã|ØlØg)«öTþu xvOÏÿüµÛ rx¶V8½¢´ëè65¿Š@ç!z‰ŸFiŒŸ­Ä‡9ìï…ÜžÐú~lD†óëu<#g´ƒÿÄm=Û1¸ÍàÉÃõ]7?rBé¼r¿Ì «ü ÁÊFlo õm–ÄaµË÷òÛ¨X¬F'€ÃîD\(b–çO€Ù³ v +šcо „âàp Ö™>}a5r˜‹=îø>@½¦_qžîc¬D0¥Ö­æó­X^<„€ žòç:–ãôŒENÝOΚ„} «Ë9~Ïð2±uåè1KCªäÆÐç9X§£Ö©ü1¤#ß ¦¬Ï¼V·ú¬;挶XŸóû­{.vTì|(ø»,æ/ ¡‚²¾‘Ê24,§ÙÞ ÇܚΖӌÖA²…=óÃi³wÞËJ<œ‚i‚¡ýööòêÅ¿¦ù vß)°¯iÔù7Àæ¢4ù©’•Õi”„âËÕ2êºocÆ|€œO{]¿óQŸÉûò‘9}ÊÐ:Am¹QÄ]‹õô_Åæ‡© + [ϵÀ@(¦µ›  Úöì»~gˆ7“ÿJÌÅŽ endstream endobj 2693 0 obj [ 2692 0 R 2694 0 R 2695 0 R 2696 0 R 2697 0 R ] endobj 2691 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 2693 0 R /Contents 2698 0 R >> endobj 2699 0 obj 2514 endobj 2701 0 obj << /URI (http://www.sagehill.net/docbookxsl/UseCatalog.html) /S /URI >> endobj 2702 0 obj << /Type /Annot /Subtype /Link /Rect [ 473.323 305.607 493.323 314.607 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2701 0 R /H /I >> endobj 2704 0 obj << /Type /Annot /Subtype /Link /Rect [ 499.374 305.607 523.274 314.607 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2701 0 R /H /I >> endobj 2705 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 293.607 309.16 302.607 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2701 0 R /H /I >> endobj 2706 0 obj << /Length 2707 0 R /Filter /FlateDecode >> stream xœí\msÛ6þ®_7S{Æ¢Hðd¿5M|×L;Iκ¶3q&CI”Å+E(|±åßÅ I hÙµÇìš™»wàƒÝÅê·‰…Lø3eÿøŽeø~€–ÛÉ7É·ÁÈö$Ë5 »¦i#Ë1°‹¶¨ÍrQÂÞQ¸jÁ?­¾@oÐo“tb¢N>>+dÂ{wó€p.êjòI±Mv€ö˜ì3ÑÍäÍ|2»t‘e¢ùº™bìÁüZüGoؘµŒæ[ôùlNi’£5ÍÐ"^$1½ÉÂÝ&Žòó/hþ~ònÞ¸mš†?¶qj™¸!„fO\Œ-xÀÙ£–!]RhiqÄÄ¿M65‹MÕ`J£1î0ŠSo£uX&E¿›µÃ:Pª»}@é>÷ :†8¸ƒ¯‚Ü oÇáíGºÝFi?ÞD”ѽx…Ÿò°?ŸŸªÄk–ˆÕìWÝ`¼ºvÉœ‚JÜAÕín<6J CuŒ-@©êûÂÚ cDÅ |€Æùé;ІӀá„ÀÇá­¤‰üÎþqMÑ9šÚØ­ã$Ê …qUîv4+¢•» “2ÊF˜Ét[Qƒ»ûÔ}ž»Œ.Ù{&†Î®ÏV"³º>¿PØû0 Ó£¸ÐäÃôú°Å5-ßòópOÅ[Øf+B0¦û([ c%ûú¬ÌãôFáÝ|Ç鈯åxt¶ ³<Êj2Nó" W5M×u¤×íE'ÅTSæzeqŠ„‚ëó$€øì‹mÍKÑ3GòŒ›r(y$­4Ž4É£®‘Ð=y$=É#Q÷ÄÄ{DpŒ­uNú²Êžu®ŠØüºLÂ<ß…Åfp|BÖ‘õÚš•y6Ë7àígÿ oÃíð8ñs0!úÆ÷²WÙÕ.ZÆë{ým"óB­â,Z4S{ÜmâåFÏ@pGô’¦E‘š½éàÀ°kÙ’z¨VHî+#µûšfz"Ò͘”é"ÌEÎäzÄÀèì÷«Ÿç É¡(Ïi–zêÑÍ曘aK¤_¢Â©°ZÏSZ(T}+aÊVjﵞø÷´ä žå³q—y¤P¡ÒN!Ū¦M²ê±iZˆÙÑr]g…×çÆP¹ÃuǸ½©ò{Gß¹8ϸsqí\œÖÎÅiv.švÉÞ¹8úÎÅÑ}…¢UUzL½ã#Ú[ç‰NdM¿vPx Ñ9k”Àz}üì²›‘‚æp±ÅÑÒ›²^ YóM·Yô ·*É«Q´z^~PˆÃVËyJ™†xØæB©JdašCJ³UxB$x5èá„'N…X0ÎeÆ]å'‚EËbWFè«J'?M±É²ØC^mRIX«*©Ö”NsváÅ·Qí/Ð>Ú] 0]¡=ÌÉP6‚Á Œp{óÿ¾smᲑãÊ.'`X¯Ÿãë.#Щðò7@ÙÿZáÅ2–jÈÄIJÙEá²úÊ1‰HSv!ìt«*»HB–]$¥–]ªÞ#*»4yÏp᣾¼ø$hÓ²`Õ¼°ÿâpvO@{$Ðð3" ÿkÖ›b› Dã‘êðqH'¿4äÄ›j×Ëâ­s 4R¼]E…Ø×òm³¬HJ÷Ž8\PÂê÷*´@ݺÛJ\Ò¾Û*ò´ARl)ôÜEÕ.‹ò~ðd’ŒÕº!Ø CÕΊµQo¢¦ÏP+¨bS¹ô¡ú(áLœF‰$@‹òDŒG²f!ˆ\ÁZÜ?\²“r¤ÝhᾂÿdÔ¡LÀF1°Ï$tpàXŽaº.û­´'Dÿ;ÊirË.ë~,I¼D?­¢´ˆ×q”É‚ ÃU¨9¶oXìG³k iR†¼÷뢳¸‘¦p—aªP‹H!2n˜ Éù¢$º …æçgªÂµBÈR¤6á­ª)TÚw4ûC¹° œßù¹ep&T}NÓ¶žnIˆMdíéÉïó"âG»ª,ÄÛÂnÞdÒj¢ºÔĉ5G*oú »y[Z- qœÃ¯}÷êç7¹kJ–Öšž«UÌRm1õœõ¾.“·ÆìáΘ•B#x‡:ými~è¦-ûëRŒ]ë2Ï¥0âT8¦¸º¥Î¹»$ E•OŠ¥i.ý›`¼¡‹†¸*Âû‚¦ß)w‡iZ†ÁÍù¦Û3à¥tßÀƒo4š>k/Ã&6¸Sp¨ú‹›¢Ø}?›õ|âtºÞÝÝyxmâ$1Ò¨˜­è’YºÏ“ÙòèG1ÕF“‡4ÿV‡öÀ™Øž×#øK·»cNÝ]'èéŽÂDÄ`mTþEñ_CÎ :¶í›&BÖesv:YGÃB‚oåbϰ;ð­ÀV}¸C™EÅr–EëÕBü½ß&ÙrÐýÁ\¸àþÚÙÆ÷&¡ X&=;TºF•ðÊh‹ã&{}&{àA<>¿ ÿø×‡_ÞÍŒGIpG3²d?¬6Ñ8~bÛø`Ø‘?®äÓ 2fr?d¤gº ²„àð)§´¦¥“„⚃ ä¢!«Û‚ÎG´e¨i»:z Z ^FÃýX»§ ð Å •R1¤ñ©®9´{\Áæàßž‹BÞMumø |x ¥>ÑeºŠvQÊ,7šG?$9½PzÒ­"£¾7Ë©&Éhx+Ú´«|Fjü·`T.[QVåIœ ÌawO‚بqÐu‚”ÐS…ˆ»¤¼a§]ð=Á¸œ>Ö—xcÁ²0-דk÷Ý>ÜîªrúáœÇó!ñ†µä;¾Ì ~‹¾K88}X*í ?œ#£9oƒÓ-ÙÏŽkƵ8ß«iñ=y3Š«àÆÉ°n½¥Ë7à¹M§ù»Ÿê¶\%-½×ç¡´Gt/£iÂ!Ò£Š8±|{)Ç‹Ú×4IèË¥–t»…oÿ½’ª~šü Vžž endstream endobj 2703 0 obj [ 2702 0 R 2704 0 R 2705 0 R ] endobj 2700 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 2703 0 R /Contents 2706 0 R >> endobj 2707 0 obj 2531 endobj 2709 0 obj << /Type /Annot /Subtype /Link /Rect [ 165.82 578.773 194.71 587.653 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2418 0 R /H /I >> endobj 2711 0 obj << /Type /Annot /Subtype /Link /Rect [ 213.87 578.773 240.54 587.653 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2485 0 R /H /I >> endobj 2712 0 obj << /Type /Annot /Subtype /Link /Rect [ 259.7 578.773 298.03 587.653 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2668 0 R /H /I >> endobj 2713 0 obj << /Type /Annot /Subtype /Link /Rect [ 215.07 534.653 402.55 543.653 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1273 0 R /H /I >> endobj 2714 0 obj << /Type /Annot /Subtype /Link /Rect [ 203.13 512.653 315.33 521.653 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1275 0 R /H /I >> endobj 2715 0 obj << /Length 2716 0 R /Filter /FlateDecode >> stream xœÍVKsÛ6¾óWì¡{&†ð 0ãñ´nã&™&­Í´3q”‰lH‚!©Êºä·wIJ%>ú8™<Xì~ûíb¹ÀW‡Å÷ªþh—­}X¦Î×½œâ ä^äQârRÌ%܃NE$µMgÀ#üœèâ<‚ßÌ¡ð³óé3ê„@ÑnëÐðê£sßá¶WÀñsâGaíÜÎÙŒÂ|uL1—˜_æã£@Áë‘ÏažÂ§‹¹µI +[À"^$±]AŦ¼ü ó·Î«ùIà‚R¢Ÿ[Ü÷'±n”R„ž×S#ZJZÄzé„Èù´õr"i#h¿£”i1íî—Ò³!7^ERŰДïãÑ'eÄ…šª˜g^¿XxÍë)jÿTÿP¦}£±:ª49Tj=þ·¥Ê„­Õ¦3PŽºÅÍñ”P„ëz NPðÇ—.Q7ÇU²ùh Ii@µ½r¯}B¥çû.ß[~0«ŸnGÿåY³RØÂÃ…z¸|ñ”ÓžG_öÜ–þ€y“Ûx1êœqN­ÍésôÎ&½³ú^&ÑÜc|Èý&›ô.5ñZã}ãy׊È6vo,ø?ƒÐŒàxí¡õ!¥ÕxødÔÝøÚmHƒl$Ø%~—6ß=\Ž7L&)a‡Hú˜ðÛ‡Wwoþ˜•QP˜Yh—³&¶«ë¿LQÆ6»ÙÏ[¯³8 ÍcóÿLRbšúÖ,&9 —øuò¸ƒë³ŽÁ\TQXéJðý¨ªò—³6RÚM±4ØÏ׆d¦šö„m”xn½ÊÀ¾™Ìƒç æÁfMÃÅ,Läÿ_×·f-€ú9Œ°ºå»zÈñdΠ8¦óéôèCÝüdžǵ ó)ög¯EøaSE¶è¶»¡s^PE4åè{gý|”°-âª2,vð.(¾lJxmM/¿p6‚ïÓh/!¡¹!+â½ó7N°%¨ endstream endobj 2710 0 obj [ 2709 0 R 2711 0 R 2712 0 R 2713 0 R 2714 0 R ] endobj 2708 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 2710 0 R /Contents 2715 0 R >> endobj 2716 0 obj 960 endobj 2718 0 obj << /Type /Annot /Subtype /Link /Rect [ 361.696 633.181 390.576 642.181 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2418 0 R /H /I >> endobj 2720 0 obj << /Type /Annot /Subtype /Link /Rect [ 167.908 445.709 194.018 454.709 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2485 0 R /H /I >> endobj 2721 0 obj << /Type /Annot /Subtype /Link /Rect [ 165.82 311.093 194.71 319.973 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2418 0 R /H /I >> endobj 2722 0 obj << /Type /Annot /Subtype /Link /Rect [ 213.87 311.093 240.54 319.973 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2485 0 R /H /I >> endobj 2723 0 obj << /Type /Annot /Subtype /Link /Rect [ 215.07 266.973 402.55 275.973 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1273 0 R /H /I >> endobj 2724 0 obj << /Type /Annot /Subtype /Link /Rect [ 203.13 244.973 315.33 253.973 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1275 0 R /H /I >> endobj 2725 0 obj << /Length 2726 0 R /Filter /FlateDecode >> stream xœÍXKoã6¾ûWðÐClФHjíbwûÚîÃÀØä Ût$D–¼’'—þöIYo)Í-ÉÁšóú4óqä ø¿0Š{X©­w‹Õ¾‡$ELT[>Áœú„0äqL}´CÝ-%F§µ §|t΂¡o‹tAЯ‹ï·pfƒèd¸5õuñ¹[uÖ¯)>‚îï–‹Ë>òZnˆ©|½þ$R˜Q³ (ZîÐ÷³e–%Úf9ZÅ«$Îîòpź8¿EË?–Ä!X½¶¼?wB„º‘RbÒ¯'k†¹=ØqÍW@ú¢óÒÙq¸ÏÉÉ bÒxXJ¯&¸é*KªH|…U§Œ(SsójÒ 5qY£„Âf^¥5&1U„¯ƒ‚­#Y%ïrÿ+Üi—¼o9® 0¾ÑQN)×ÛÍ*/·ÈiÖg•‡ ¯(ÝP*{烹óhuˆ“ ú²üˆ6Ùú°ÓiY c\Fè‹Þ¾7Úò(æpð%ö½öÍ7ÆÛ×§4ÛqÑÆ"ÁRT„‚bàw±pŠ#b¨„¾ŸŽ|@DX1²bCŋդÏc3Šè¤ZEÙ¤"À¼=íÖW3Ú·s™BSrxÄçÁH¦Ñ´KÌ(¢ÛÖ‚ç™ã@´2ñ^ë<Þ—q–>׃‚­p6h8¢³2¼×E#†ÍÒw-´ ú©Ù5à7ÒÍYqXG-[-»ë\‡¥Þ4¶Yj©×{TX‚xœO%¯z:ÌSØ—~ ””#J7ç­ÀÒV qZè¼l…ZF­œÖq¨‹ m8Ü‹ÃàÎEÏ{›Ö ÍÍÕ}–ÄE§wµ§eV . ·®p~Ñ{,nóhwë÷ÊRžíp--[¦Šì¯Ñ=}·>Q\hãìoF€Æë"`£¢ÜÄéd4Y¬³Ý>;¤]E`¼0Ÿ€œÏ%~iÏ(ƒ€@ϰŠ@ÿ¶írâO,ìÙ|ŠF©ça*û)QÏ2› #çgMP@m¨Ña²‰ŽQÊzŠæîCè%€Ë`j ìT…1‹ÿoæÜïg=\WT²@ U,ŸòØ\‡¡y¾;ó¬‹êþBYjcÓ:µe ãò¥÷#U>–T*'~x wûgЃô)ܪp¥EXÅo¶ÕEgQøP¯ÃCe¹c++ŸuX©ÕV^‡IÒ(ížöá^ç¸b[³u„æêÓYZ†±#–Ž“‡0uùt³Z½æ"|Ú‡Ÿ›QÚKóhûZÁãŽyÈî!X¹?õø8 зÒc#vòC:$^Ï3:’èÔžNÙ;iŸgñ¦HX¯va¹Ž*^´}–³›'N´B }e¡Â þ¸þ¢"ÝfùÆ©./'²jf|­/C0âCÓ׳˜Êã>\lBµA¨F€`Ð…in8%F `öÌk'WcŽg!è¿ ˜õìÐÔõKZð!238qQÆ¿ØYç¹É ^¬07müÔ£Ró¶qÌ㲄‰nõ„þ óûC~Ët¯ïCtµ³?ï¢joô5ný¤õyñÒ<" endstream endobj 2719 0 obj [ 2718 0 R 2720 0 R 2721 0 R 2722 0 R 2723 0 R 2724 0 R ] endobj 2717 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 2719 0 R /Contents 2725 0 R >> endobj 2726 0 obj 1579 endobj 1221 0 obj << /Type /Action /S /GoTo /D [2727 0 R /XYZ 72.0 585.917 null] >> endobj 1224 0 obj << /Type /Action /S /GoTo /D [2727 0 R /XYZ 72.0 497.195 null] >> endobj 1227 0 obj << /Type /Action /S /GoTo /D [2727 0 R /XYZ 72.0 314.48 null] >> endobj 1230 0 obj << /Type /Action /S /GoTo /D [2727 0 R /XYZ 72.0 189.758 null] >> endobj 2728 0 obj << /Type /Annot /Subtype /Link /Rect [ 344.683 737.396 370.793 746.396 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2485 0 R /H /I >> endobj 2730 0 obj << /Type /Action /S /GoTo /D [2717 0 R /XYZ 72.0 769.889 null] >> endobj 2731 0 obj << /Type /Annot /Subtype /Link /Rect [ 170.957 725.396 201.497 734.396 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2730 0 R /H /I >> endobj 2732 0 obj << /Type /Annot /Subtype /Link /Rect [ 153.92 611.417 269.235 620.417 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1202 0 R /H /I >> endobj 2733 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 599.417 151.1 608.417 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2446 0 R /H /I >> endobj 2734 0 obj << /Type /Annot /Subtype /Link /Rect [ 298.188 522.695 329.288 531.695 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2446 0 R /H /I >> endobj 2735 0 obj << /Length 2736 0 R /Filter /FlateDecode >> stream xœÍZÝ“Ô6߿µ/ª]Åß÷r!ä’:¨{Ôƒg¬™Ñ­Ç,{‡¹¿þZj}Ùãä Raû×–ZÝ­VwKË—«(á¿[ù£L#R–U°Þ_}Ñü((â É5+ Iga˜QJâ,ØSV´rŽGĆ‚“±€wÁû«î* ~»ºÿ cš „yÇ«ð‚p%êÝÕO7=èI¿0Ø^=¿»úùeDap·q.N3RäyU•q”$‰+ù'îöÁý“çlÕ2¾íëÃŽQñôsp÷ÇÕ¯ws“0$åf훉Š-EQpEJL‚<à Dùi¢Èâ*Z€?/ªžiú ŸÐ£ÜåØÉ RDQUUŸH9 ž(Ì¿1?ŒyçÁK½¾qbʳƒ’4õç—Å™Ôè,…ÁYŠ£éi=Рu‚öC0ìh°r‡íd¤{¼ÿÁâjõ ÅÝÁä§Ám\Oè×z=pèùš6co¿YÛze¹ ëž­hã>µüH ò¤£VV—¸ˆI^&a”€δêÇ,šO©JRTrX\œO1ë¬ù~/c r—0°¶zz3¼ kéÍlQðYÃRxQ™ãR(>ÉH<”…HϦ‚ºUV„aX$ç2zºiVý°™Í‰âФdÔ4ŒÏ'¹U9o-‹W¬S6žë$øØ¯løzÜÓn°ŒK¶ÌüƒLé O'ÄR=úzøØ5çÍÒ™aoï^ÊM€r’;‰c½æuhØÕƒCe xï'0Ù¡#ï‡TX Áûóå<‰þgtŠ=×üpr¨î½qu;О.Xžç¶e¨Ãvu‚óËD`Ï™M’ r@”KwU8)ývÆ€ái‰*Õ æwØÈr«7¬«[ö?('Ó¿•1"ÈÍ ”¿ªŒ"÷‘`)œß|Pw–îøÑÒü@Ýt¡ž ƒÂ2Ð¥H{[ŒQ°nk‘ÞXz_øÛŠœÚ[¢n­à4ããzgš“‰Õq<³úÓ“–=¨èOµLT !Û×[< wl½³è¤†tûŸ‹:ª2§þ4ö¾H}qµqØñÉW1Ðç§ÄâÞ¸)z\ýHEN÷~b; HÂ* ³B×Öu î½áý¾n€Ã`ÃPÀ¤_U¤16Sþ|ñ29c!¦£ NBCP›þL%éª.ÔšagÁln‘ ºؘbAÈ»ß^ýÛÎÔe@Ñ<¾1}¾ïQU8æÑ‚ì+@§©0ËA÷#•R‘ûÿS§skK ¶?´nÚ¦;ÆÝ@s$ô´ÏæåLqUkÎòpQ‘PÖÏ2-æÜbᔺFIƒ'¯êªöÒr°¸#½ç½òŒ·ô«ÅÇúdi¾±$ùmANñNzmÇA=ßÜ*îÔPsþâœò¼PÙÌ‚P¹’x L£‰ÛÆg º ÖBØCó~¸Q { ü‚šË§2ÎdÄÀ(M–lóV3ÙMkF[ŠÝ»f\Csyí>ðh¿ÿѬát ¾WîvLLœØ¶ š‡qR•y©ûŽ-í¨<"rjîÖERŒl¨W­÷Ñdo8šx>÷¬0)"G‡P>±ˆ8–ÞW:@èNE#nù$Z™¾Ѧ~Ìºà‰¼šybZ;U©TÝ#(B¿2ˆ*8(“/-W¥J)tKÐÞÊD%ê= :øëo§¨l©¼Š@_ã囨æ›5lÆeFÀ¥r^égåòrÎIâ’4ªfu¼¤ËJ¸ôtÍ·ôžÂpjC¸’'Ñ¡…*y;Яƒáí ÆÞà fù: Jï¢#ˆáübM4Ë÷vIÚ­[.°2£Èó]M £N¬_F‘*}_¯(®§¿w‚5ösmcËaÐZµŠŠ†œÉ´[ÛiêÜ¡€m­ Å9N_f¿|G©·f'·_ˆàD>ìù¶‚%P^7L7/…º"ž ÑÉzý CÎ=aÉ@¸ámË—¤ñŽz`ãèëÛ×7>|æC“õ·×ž~ÜÑ`оN"îévlëíÅü1@z²ÜÄ3Øšßò®Åw„d*ÁñðR‰ô‰ÖeJOeÙØ#õG~2wR„ö!·Þ¶f8–é4ÜŸZOÀDÚ†õb~'fCJ›˜ý¨b ¼¬íãJÐ/#ÖdñõzìM$#‹ 1:$ Ñwƒ2 å¤!ÓÞX ú‹ ö—Ç“kÉŽ;oV粯oß][€c>¼ñ>´°«ãv·à‰r–ä@h1ä¡{„«u€·åÅLvÇå2¹«l&:v8Pø¹ãG¾÷òî?̼ZH¬i$ßÙ+ÈÞ©n` !G¨èRRwÿ 2íå­èöÃçÏrmpŠülè\Ç‹«g’mÏÇÃüæ#׈‹Ù0ÿH¡Ý¹¿Á)tÏ!¿ÿΦÐVúâG íþþ5íøß>ûü9XïdÝmaeù¼±°\RÍ–{dô¨›&T KP†<±a=²p“L³h&)Pþf‰„fºµ´ªŠ,÷JdB‚?±N ôwka¦¢®Wæáï·Eឤ$=y*ŠY,-¤pCë£Z¨†O^bL’•œŽ”Z(»|ÝÖ®—’$–OÙtÜx‚{+šÙµG1._©²(Ÿ™×a†÷Jq}Ý \ÆTüÐCž`½Îûz,Ÿ|¯ýoè ð¥ÁáÚ£'-ŸæÙØô¦at¦•®6Â\®'ê.=H'ÄåÌ ›žïU¡žXTfþI8Æk beCZE¿E¦5ÁG"îÍ©»“ Û¨rî}÷‚@+¡{¢Ô½Ši ouåä9˧¿ƒêò³à…4œya‡n.b·½š6aáX¦©F¤•Eà_Ls»,öD½1uÇÍsð7dÇz¿Ów3B‡BÁo`Þ:ûZùæ·à,ž9ÄYfج¹æ6ó[BáAÕˆNèÔ±@¶>ǺmU¬–už_ˆwÞó>[;6x¦gTÇ.Ý5=h×xòžŸ²|žø¦jæËË稽º Çy†×møŽª.ðiCÝx4¦²ó1úâŽàâcz\å¤J#¸È…K†íáÂzñé<‰CP¹’¨X˜ëÙhn׈ÌïÙá+œgÃÎ|øŠ‚X^žu]"©úÅfŽUo©§ÈŠyßpNÔ£±¿—ºPߢ8_˜¨ì§bÂõ¿ò9¯óI¥2.t™U•Eñ%å¾£VœUßá]šs×À6I>kò° e·f l3“à?ª>¬G1€¥b8µTì(ܯ é3æÙ‰Y ä‹4«Š(×8®Ä«†ÕÂ?”¸ÜXäYIâ(v§˜ü·”Ï .cKä+hx®ù/Ý›+Ò¼iØÀ¨«ë“$]Ë`Y6©I0µX¾¯8 ;…^ðõsÎæýy.É‹pfë¯¿Ë yˆqóéìC¬ D•.Ñ Vd¡HÛžÐ/h òÞ›ç!…ØæÂ:So/4ÜÊÜè­ËoôÞ!ïÝæ6®‡omüƒc§ˆL§º¹Ò:`j¢=oÔË q¬×üè-ìZSïßļ¹ú?Ÿùui endstream endobj 2729 0 obj [ 2728 0 R 2731 0 R 2732 0 R 2733 0 R 2734 0 R ] endobj 2727 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 2729 0 R /Contents 2735 0 R >> endobj 2736 0 obj 3006 endobj 2738 0 obj << /Length 2739 0 R /Filter /FlateDecode >> stream xœÍÙ’Û¸ñ]_ìKfªFÞÇÚqª¯·¼•ÄëõTmR?@4b†"d‚´fþ> 4@€—¼ûfûaº›è}¡}Yćÿkù'/Ï ²=®¾hz@²D©&%¾‡‰ïG$ˆ½0!G2$%¤’<þ Ö~ ¿¯ê•O~^}ú kvľóÊ_®D}\}plÓ þžìóÉÃêõÝêömBŸÜí­‹Ãüð/#¹…*Brw$Ÿ®î8¯Ùó†lÊMUò‡†ž%ןÉÝ/«Ÿî|ßË¿·}˜y“e™çóI‰‰”(? £¨e@ÁàßE“ý‰Å¾kð4•¾ã–³(ͼ,€,ÊŠ>yù ¨¸”1ßÍö¦ÉJ»”P?b£·9–yaîû~0ð‚Ê£Lo÷þozd¸yé¼ÏÅ9 ÏOÉ“#SÃö»ÍÓ‰\“ $WÈÞ3äKÕ´À ç}f£õÅ¥õZÅ–×_YÓ ŠoZ Óz§¡}WUf}ÙÒ¶äµù›#í¹KCþøó¿þ9‘òŸž¶ãÛîÈꞌhiY—õƒ&üÆöo^vî‚ÁOSð}®}l¬žñ´°KÑJ /)EhIŸk~¥p#VÌD¬H¼ HÁ‹é `È6䟰OfõD,Í#inMØÖ‡E%Ÿ-ó‘ÏBåBŽÈ#–O4ŠeäV“¸ø“ãÈ bÐM×í²Â$Yd#† x&l™—.°•õ©kטÁ‹zC(œ%Ÿ/(£Ä‹¡'I6 É iþpÎaâù1Ø’ÊyÃĶ)O²¾ÕidßËBÈ‘,wšu µªøYX¼=0‹”uËì«_àûÓIŒtÕ4¢û‰ÆjÞ·”¡}‰»Æ,éìN'ÐÊU²MI†Cohó‚’Ót*ƒ¹ÝÊÐÐB¨nu•Ý_{õ#c¦ít9üHëŽVáþJ Ø7 ‚síPälf±²Æ<ÖnÔTºá];4bÆY<ôE{æ’'rc#¼žt‡;Qð0#©=Øð®Þ­[ÈО$èžÝô˜ö:òµv†Ñ :–Ox6èï&µ&BLbE㼊lÞD:mf<‘§CO8ÂU*^jy×lÜä…gIoAÿzÏŠ<ÌaE:—ºÖ G®IidåMö­%°zËwÚHÑ™ ‘²ÎjSv¸n#Ø—LžÙ{‘÷nm†\—&)g@×` ˜À<ÓúÔ˜>aØ€N•™®‰ÃoÙb•О¢ÔGIŒÿå´<Ï•åÞU;‹o˜…é™6Úhk1§Ë!Óa”#Æ‚zzÑzah ë±>¸)y}×ÎërÄ‹òxª\ ìiéhQQyö³á©¢[&SŽH­ä\¶"¸ ‹€2Ûªxý8#+‡xøp¦dyÐO‹Éh]6·îêsYîÅäê#‚È–•!=AwýÕN‰šÂ*e¸¸±$Hªg‹‰VW„‘ß¹Ò©°p¹_’qfÄNà•‰ç«¬3(²‘TAÝÚÒ‘j4œƒ#jѱÖèçÕWuIôÞî#ÏÙq&ê¿é5?kÐôp cgPê9Ôàiœ6°È/FÐGU¢z¥uÍ™¥hïj ›K!{.‡ÝuÄž¨Lã›7R. ¯(v,•µóÍ´IÄ6lA¯•#{l&²QŒÓ6´òØd;µ‹Æˆê1VÁ{ª.·æµˆ3,+\—?"XýšK†¸ÇœÊ×]ø=A_©«ç›ž„!ÒÆZÁò’eÙtM£Ëf]’‡#oˆ‡cUƒS/<Û^džm§ü :*ä<{çLy:©î‚] ˆ ;þ…îØíû«%ÐSOtûH˜PHš‰Û¯p±ì“c*Ò}æ@Êå•ažÉŒ"×f€”{„»’¼I˜¦µ7í;7ä̪Êó<¢òûLËöO?ñ‡òŒKý01ïÕK©yâ‡qÅ7Ræ^úÓ¸ðR?öý¨†/𠯬°ñ4 F<¿6¥¬VJdáÊšú‡èñø¬ ÆYù‰=•mÿKÆ7ÍËc¯( ?Œâxø\Á¼"ñüÛ£}ìéTl”aê•Í> endobj 2739 0 obj 2332 endobj 1586 0 obj << /Type /Action /S /GoTo /D [2740 0 R /XYZ 72.0 204.879 null] >> endobj 2741 0 obj << /Type /Action /S /GoTo /D [2737 0 R /XYZ 72.0 769.889 null] >> endobj 2742 0 obj << /Type /Annot /Subtype /Link /Rect [ 347.02 534.484 378.12 543.484 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2741 0 R /H /I >> endobj 2744 0 obj << /Type /Annot /Subtype /Link /Rect [ 205.95 242.379 237.05 251.379 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2741 0 R /H /I >> endobj 2745 0 obj << /Type /Annot /Subtype /Link /Rect [ 285.524 163.937 309.404 172.937 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2452 0 R /H /I >> endobj 2746 0 obj << /Type /Annot /Subtype /Link /Rect [ 388.911 139.937 420.011 148.937 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2741 0 R /H /I >> endobj 2747 0 obj << /Length 2748 0 R /Filter /FlateDecode >> stream xœÍZK“Û6¾Ï¯à-vÕ˜áû‘£k⬳JÖ³µÙŠs HHB†"‚ôŒö×oGƒ¢&U{²}˜þšh ýqü'ÿTYVU´§»?´>Ê$H ­Ê£0Kò(Jƒ8 “<8¾*zY‡‰‘àWð1ø÷Ýp?Üýú”é‚ê=ßE7WM}ºû™ôMùkê_îÞ?Þ}û!â(xÜ;gyXE]WITašÔò_<ž‚_߼绞‡©99o ¼ûþÑnEaõµög¯‹°Zʲ £õ*Rͤ¨ ¶(?yYC´âipø÷f—£«G´Ã× è«éÜíµSB©8®ë²®áSXy‹§Î_[0_Íè®×J"ûõʆ©®öIÓÎÁÛ ÉÂ"xÓ+/g6õ|xr*>XQ,|nv=³Šq™Ï‹kh?N§fvU{þäÊþåñïs'+þôð!´à£36±¦'-íÙ½E—q±òó¸ôEçiÜA/Vñûr:ã¤Ro$ÑÊ»¦}‚:ïb9oš¡s5ïÉÇ®ãÃ`'îù\œ– óDàó‘ ì ›œ‡ãšßl{`Ï´03‡û}æÃ°ê0™8­ùøpí•4 SXëQ\¥è•/M¿0€èãññ6Ë$˜›éÀ`Êa Œu¬ ±Ýo?(B¤«°(‚<¶ÁBŒþ1ÎÌ”¿ZµP80.ånJ¬ðx”cˆ«0Þt\Ì|h¥¬îÔt®À‘MìØü̘+ÙXÉ8Ó}R®\ó¯–&ê'¶;CËH'.VãBZ“båweU¯F9ðùÌÛ'Xfj‚!žHÀ¾Úhp"?ó¾'Å)u:ÃâmZø¨|`)Üá~³ÎG‡Œ‹„SÍdž4ÛŽÃÜpÒòiœ˜W˜|‡ 'ÄQ¼òÂÚáÖÑáõÒ¨]ËÅ[ÖXûŸlÿðl¥\îûcáVÑXIôüpœe Bw¢´žÿ—u®êX¦i¡ÕüGm`”ÍW{™™+йúàzrn&(´ôÍäj]À¯/êÙC[rÃi ŽnKãÑ‘Îjq¦8N¶ÓzoU¸Ê®‹Ʊ³¸HXÀ©Ð¸Úfu#såšþ4Š™ÀÞÊã~Ó‚ò†Þ•r›¢e”½¥¯4{>©Î#Ò¼«äž9½¾nå¶õ¡¡”¿/ÄÄŽíõnRPhèÁDçZP+L‹S3¹7\‘—+WȮứÙÏ[{ X9‰³(Êò„îµEÀÏlj± ã{µWç`ûä)b·°øÛàŒ–-OßD &Rˆ{¢BŸŸŽÀd¶5]98x’Dõªp亽ª ‡MkDÅÅ=A*02`öÚš…À´=Ü7¼ÊDîGjw߈ٜÿØôH„`´s®ëN,´O†e5†sŸƒßiG`K_Óm„éû ”8ÕkÉò¥Q!ƒAtZyž0#L®0êa´gÍÉᚢfĨ«á ÙÁuLÌoíŽ4mŽžÚÂss!èš4¥3€4}gµcÇî –×M ZÓ Ô{™Ù ,9ëö÷ÌÞÈÆ‰8œ">‘œç“‡ÇX#2öká,‚ÅÈ£A€kD&Ô `(r„VæqF_‰¥=–OÂWãT2fYFQiãÀ¥~¤’í¼J8‹Y¤r#‹:Ç DÅ(ã%±]XÞ­¦Ña ÑQ&ç4*+a̲Ž@€»K×P|¡?áNC«ùèÑ!¼Áºs( ÐóˆºNoPœÛ0AŠ6â-%+ɲ6ùßÇå nc±½‹Å*c¢ötl®[JhžLcmc-à¥Ã3e¨ßû¬Hc˜’åüa"'™Ú½é£Î#}Tá.A¹q¢ ™ïÉgÚ¼¾ зO0*BùÔ æn¤56°IßJPƒd²#{Ä:P@°Rk‹øSÉžK,‡¾7{™m¿tŒ\9QC°ŸÆS d¶ MËù šI•™¥,Ö|û#Þ Ô5Pç!É­R‰†VñN;º”Úº ÞŽ^9ƒñÚË&­q1ÀЯš{ñ²;é§4”›š4 ò-š.c—Lé°0¬*9ó"ÑW¹/îKã‚¶$Ãæ`YØQ«[\óì¥Í;Ëš3 ÄUK{=êu‹àY'©tœ9:YÓ„Wo#'MéÌÕFäݱ}ËÐ)Æv7ŽONA£áÇï?: æKÏÄ‘1õÛPTGËNmLСïz÷Çý¸ ¸4@’¸=g—¦IòRá'v1"Þ^Uy[\íj4ãø štl½NǦp»Îr¸RÄÙÖPd6˜™(x#››æñkÕm§g¸RÀ ÷v2‹‹0I°RgV^€anö0ƒÓ앺¶CÓMërŽá,Øšã× ÇI´QOîùDÞßYÏÌj{ ¨sëƒf/%«„åyâÈõ¤¢ÎZk3úHår¯›¢ 6´Z“ëB$3r‹N€äü‰«0³§¯’WY1Tšýv]ÜÏágf ¬6Âu›Ó˜TIX'p¤ÄIºÑo~{‘'uöZMkZÑÌŸô"ʰªòº*Ò­¶^Nýw¯ô$ÍÒ×j[óŸõÁŽøð=ò!â<|q^4Ʈ×ÇOùç·ÝѩĎ®4ƒ Eeâl}¯Îäeƒ}ƒa° l2É¿=öT©LœßŒÜ™²Ú?Û%¶á%ZÑ™ò|P;Éoð0A<„É) ]®$3Á›_ÞÄðÄþ–’|å¿2™Š.+ž¸š:‡f³òÊ‚|¨3`Ý¢Î7lm'â"#™µI£­JÖðJÏ[³ïL‡g6©<ä¤뺇fbtÞ \)í=ÖV£_\”Ü6μ¶¼áç´\ Ãĵ~ŸpqjÌ“pº~j ž„É7áäq?³aû“>×kØ |TFh³RX9¬³µeO\ç*P1“š.y•\%¿È“5³á¦¬^¹‰|ææâPæÊÉÇq,t õj¯å}Óbö¡y¬ÈÝLipâ/ìFt("÷h`UœÔlœ(Ì !6ÓH:÷Aƽý…ôÉðŠiNçu‹ÇqºI¿ñÊ/ì¥9ÁuÆFØ$Ó—ñÄ#ë(È+Ãäõ3ŽBPÁÿ8 ¶?¶æQDiXVq]%Yâg’àdÊh& ±—IBÕQ¿z Ú᛹-°¹N–¡n¯NÏé«h«?Ínü²N$°9³ªu±Q…Øòú69…ÜÿÆ^æó‘·G‚Í0é`Û´L+*κw׋¤ˆóUÏO Wïâ&¹˜ëߨüÎÚÙä;•Îæû“¾ËMVæ@°ý½ˆB'}GÐÐæ6sý‹<֌¼ÿo–^„oH•hLšQ÷«™ovˬÒâj•Ê(±‚ã¥.Ë-—-&Årc…'媆Ë%IóYtõn€*ûƒü ùÁ‚÷“Rƒ~¶!]P¨±?˜Phý×’:Ž£8*³ÜxÃɪj`w]ÉsïÃý=‘¶É™QO¬7 ôkZ¯ Ø#Ž˜q`6•€¿ùÒ¿õzÔ Í2­£8-Ö¤–„ÁFFõÆŒC8ž$)1‘ÇiÉ”«¬jaka²¢…KŠ$'Z`ŠUrù‹úç*Z¶¥„|åe·¬QjD£’éBƒ>FZ†×jáveŒ»11@;þðÅ™µ|O@y‚?h„^º¨À¨eû–‰Ð[è¨Â…޲v¨Ftëï2%g ¹™[Œdt[3‘‰ óT¨é¾pa~‘vÝeM¿úѵɯ4¾ûŸô” endstream endobj 2743 0 obj [ 2742 0 R 2744 0 R 2745 0 R 2746 0 R ] endobj 2740 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 2743 0 R /Contents 2747 0 R >> endobj 2748 0 obj 3269 endobj 2750 0 obj << /Type /Annot /Subtype /Link /Rect [ 309.078 759.389 340.178 768.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2741 0 R /H /I >> endobj 2752 0 obj << /Length 2753 0 R /Filter /FlateDecode >> stream xœÍ]o9î=¿b§H¦óýQ´ l.í"w{»×­[`½²-ǃŒGî|ÄÉ¿?JÔ×ÌÈNqOmBrDФHŠ’üí"ôøÃÿIèEé­÷ß$=ôòÈ‹3IJ?‰Ò ˆ½0ñ£ÔÛ{cRêÕœÇ"ÁŸÑXÀwÞŸÍEàýrñ×ß0fãÀw¼N¢¾\|¶t“þ‘ô ¼‡‹ÛÅÅÛO©Þbk\œ¤~žeeYD¥WøqTò‘·Ø{½¹­VuÅZrØU´»úÛ[üóâãbdn~ñ£Yûy¤"DKžç~0"!&FPP"ÿ4RdŠâ,# Z€OªÌ4l…çôÃ(w:vr†e™—%|ò‹Qð”Ù¹€ùa¬›ÇJÄõ:“0Å,OÖ“¾bwåÝ@¤eÞÒl rhé¡ekÚu†ö†Ö`¶ö´é­Ǫß ]©uˆbˆç¼‚¨ŒgÚ´t»Y=¦,Yᇜ¥ æ,¾™i±£aCzƒ¯[Jzj™¶z1p¿«,ý‡¾ª«ÞúlìíI¶C]O”GÁ)'oh·n«¨Q5ž˜´£kþÅŸKI"¿(C¬nBŠ4/Ž`YHÛWë¡&­¢t/MOžƶ ZW8u§ry9¸²jäZa hKXrE©4ÔP ¤}Q„-Ó ôGfDf|§GUm×+äH禦ÉÄÔyâ¶B}ÁLC´®üÝÞÝ*äúï2µJ7¤'+Òi¡°Â ,¥Sá¾"«úåZ¶-Û;'R2—Wú³–$M?·3Ë&v Ûxt[~÷5é ]³fs­q!Á†ŠPFÄ’ØÆ SúÊq/óI„‚*FÌ·v®–K n¥QãSêñLÖ½Æö¤}¦Y þÈ‹‰?6ô@›Mç1žÔ»[ÜÁ_Ò{¢ä¨Jã í®½d7KP­;´T ÙSG6…Aè'ie'.p®{QóÂ$AðdIôŽ­o{´(2m$¶øxoaº^[DÐE„›Æ1?Ô|L‰b¾J¤j ­öº*+Z[®ófÄeî{(3COÇ“8ÜÆ·ÐšêržÜÒ+k¨ÂˆêªyT°ÌɪÇÚa„ߘcÔ¬ q¢HU_a¸jb톶sq;X©ZKÜu_jGÍ £tb¹]*Ó{lÍÚê³,¡½¬ˆI˱<‡™¤’‘ipeTMWm J4t'„}#á¾&|b­ƒÍ.â*4¯€8Iã²Lò 2É3n[aÝ^ÍeÖÕ#›Ö;ööSéh0Â,ôË4-Ë8“bßëúÒ²š~¸üãã§»ÛËŸ<ñO‰‚¦y"+Š"‡°e”eg§ÏS¿È€#Cä€IÞ?ƒ_,¨..ïJ³*$™C ¨ŸU¡È*¼U^øÉ±eéàp»ÍÑn@çy@Tœ2ù×ûÅýínîï"aùy“ç—Qœ39‚dš«pÎdÞÎ8N«Å9 2ÕÎbÁÑà4bA„±jÄd Å b¢:S‡EEiJÃ\ˆ²êäԣ̚ó[Ȭ¶(Ug!Ä‚MAPÙ|IŒ5¶i£O{ÖÚßfUVÒMçç[ÔïtYå~”Çe‘‘ÃfÂg—*&z ã³§)œ‡¤oîho¬þŸÔ0LB? !à‚,tÌ'Òëô’æg™Ýªlª®¯š‡¡êvÖ€mÆIm£b§G–»&|5£’Ç ABžÐgV6bŒ×üïP/N2? “²„ùÔ‹Ëä¿ÑÀnG”É´µæT$Ó'„ndžzãÕ”Ÿ(H Yâ{ oŠOz>ˆ|ž·3¯ûNéNNOåùš4ôô=n',¤)&çI?™Ÿ‚›ŠKt~ ÈUO÷fñkn m)0ˆ©"‰ØÙ×öGjë`/)êh¯”•—QÞû;‡Ë+‡/¢é>&ô„pÔ`GƒHɈŒŽ;H’…Hã«ÑðÎ2Ôúº„ ŽÚƒkv\^ù†rß*J[Mg(vÅ:X÷æÁàÐ _lËj˜‡nžˆ§%Z^ŸÙ^E¤G[­ImHö"åãEÊåJ\D]@êh£fiIUKí‘ÉzSÓ¾Ç-KŽÂK‰©·,ß\~½4(†]> »\‡ÝòjzrâÎH¦µ´£ÒÊëEÞØêmôÂ-waˆ'"H4´!ÝÎרuB¤«ö‡ÚÈâ÷†Q3°af}'4WÆZ‡Ú*Ï5ŸÃé´ÆØ¡ñË¡~¤ï©´Ò_C]Ó¯Ð?w´Qðm(8Wì4ŸUtÄé\_Ø Àc%î ŒAð¢P¢€ Ý’¡î5*á°2›ÖDÕ5±U9BÄ´ߤБP‹^J‹±‚èó¡® ¿P¸0¯ T#Å̱ÒCzòHµ<®ž¯Aø#FÀUç°´˜V¼=ƒx… óD›ŠoÕÖã6йqåçïẞµxÇÍ·SeÌù>#.ãYŸa®>TœïÐÒ(Lüò•N#*¡¹.R‡”×;Ó¼ÖìV¯!)°mýdÙT_õ ¾$1JlÄI²cF’–oðÜo‘ªf¤ÀÈ_ku™­;"$ fÅOÖX‘ÅYj"„íƒRT‹„˜µ{!o¦SS«²é>²mœÆØí®"ôî‡(ßüÜõæ°?œV¼‘ã#koãˆÜÙ"óòÂAµòÑxW¸Ü¿8¬w/_Qt„G&—#ýFá=LC ÿ´¬©5\m„¥R€ºN9Œ¦…oÚìE1ã&c¸,ˆlª­˜ 7é1à ÂAYäÌ/ó —ºÿW„åò'©kMÀæ}<‡&¬‰™cå²5™–>yÇÀ+u'Õ?Ú›Çͤ`Ç*Ëè†UG¿ ²Äây‰¿¡Éç#zzÀ‡Ž0 Èå‰yzȶàAO`ôÐ-ÁUÞtؘήY –[lÑj-Å %é=ë­Ñ¼xéZ.~î`È,óèŸÒ0³Þu~cýéëàHáÌÅaY&Y<)å °•:~l%«–Uç'Y7H Ï„ûÈ–×Z"ª'YhZYð—_þý«ÁÔ3®oHÿ¢ôàfÝW#l²ÜjþÑÕP›‡Î•ÿÈÚGn—8À|=ô3Ó;‡¨8óó2 ‚,ÖåQ: ×8^ªéþÀŸ»OÞœE¡Ÿ¦°åÅAêp~¿LÒs¼úÂ%Ä[×L$GWC÷ˆÃÙõ=¿Ä~ûÓô•»!-}hIƒ°ò³n˜û{ª4[íèîQĞռş¦5RäÍŸ€Õë´D÷Cg \Yb1bøý.߃}CSi &å;ØZ½ JÖ¨¬›ŸßÀà<œ,Ž¡õ“„ÄÐí1¤`ÞȯCË‹zmÆÓgØÌÖx BŠÜæÓ¨Xö5EhÜ[:¬,ž–‡Œpá;k8{ÍÊX]Ä«ŸhÛÉ·-6<ìÅYú%0DenýîB¼vÖlDpb« ?ÛÙ)Þʺï|,ËâÀOð\>ü¼ïèƒÇ{ùàóûÅÏ‹ûßûŽ÷²$pÈ{í½,ãgÙ8Â<(ÍËÍ¡o½ž´¿ó7Ö—ÿ½íÕÛ·šï5.a$¤â«/iI9¦zí%-ã§Ë™roÁEŽ¥ŒÒfƒOºÓ! à›P‰wÒßáŠÑ›ÚÔ#¯¸b6Õk/lY™8”³\!~«öùâóo§ endstream endobj 2751 0 obj [ 2750 0 R ] endobj 2749 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 2751 0 R /Contents 2752 0 R >> endobj 2753 0 obj 2951 endobj 2755 0 obj << /Length 2756 0 R /Filter /FlateDecode >> stream xœÍZë·ÿ®¿‚êú œxû~´A€¦±N äE.(VZê´õj)ïÃ:Aÿö9|íCÊAŸ?³äpf8/òüiåþ­Å¯,òi–åd{X}RtŸ¤ EŠ=±ç…Äh““bR‹5Î Ð#ø5š xO~\5+|·úég˜SÖVÞæ’Õ‡Õ{G65Æ_’|y\}s¿º{ß#÷;kâ ûú9ü¤$£a Fy@îä§›{ÎëŽìxK6Õ¦®øc[÷ë^ýLî¿_½¾)z;4½ßD¿IÓ”zS’lB¤9ŠO#A¦wQPü}Qdo&±ç ¼º%Íê ñ²(/z>]TÔ÷G0ßåfk‰Õïï?¼»%E]¥Q'$*šò²TAâÓ‚9Ë=κgÕe©‚4¦y ùÑ‚A@ªû×o…D¯¨v\M/Àðº{Ù;¥A&øz$Ωböú©8kvÕÿEdú4 ±.ÁuïX/Ò3q’»ªíz÷íÙE øhê–è!Š0tÅ£;ãG–íÊÍÓ‘:¤û÷¯k~ªšÇÉò¬ …=àj ÎÖYQõE/Žùvâ¡`‹<œØ¢eE[Ö¬üà¸"%3O{ú·8€‘¬&¶Uß³ÆàÊ»=dËÜ2Û Rl G¡oí^ÜÝöú*+“´”•‰u‹LZÖ u?7ïÅû€i؉쪚©€Ê!ëL‚;«>Tµ@Fµ·ÄrÇ9ZÐîñP_u^?Íhà‹•©¿Àˆá>2-“]ËÏ/ˆ¨x ]/qâýªdA-–X•§éRu¤èºá•,¸aDç"‘bÿ¨“ÇRN *‹Fb\ͤ8Z˜ôŸßO§ ^PäyAõ§{ ¶³ù*dɺ'"“¯ˆ6ùš,ä †Oä?“¨X“§z`Ô8SFÕ¹"…ûÐ4W ÍÍHyäX{ìG,¸ŠmOÅ™:ð~_ÖVwñ‰6n ¶ôE§$õ]§$w÷;ÝÝ „EP*Üolœ’oÁÛšþVVhäNjS4ÕÏL’›"¨ì¦nT&ùM*g¬3œÞÃa©²•Bn’Ó{òÑþ™:™NË×”sÃ^21ŒÌ‚D°Æ¤GFíj(¢ž¤à¶‰—_ Åù¤ÅP„V{™×…PœÏwBQ4 dÝA4nŠ–>É`#i3¯jæ›Hò«Ád!õÒ8Ï2Hwn0¦Ð_hó°+@İ-±ëÔYÈ<5nYáðÑ.í,í÷®rwFïV›2ˆÈ¢¶qܵx¤Ó #Aäé…S„¶|l‡¨Ž1ŠÖ –IžW )ItvœïYöŸ¸Ë3 fv••¬j¶õPbnDŠc/$˜ì¨¾›Ñ µpÆì dl\0·ê+eu$Ý‹3†¬=·mè¥qû=ï„1“ÛÔZÊ‹¨jÊêsUgφxªú½:^ÌG>Ô¥Aݶe'ƒ;­ßƒtvŸ¢s¾¸Â@Ï|6騧Ô4t¦·‚BÀÆB,èîçÝ!ßÁ"hÝr³af(CD^/o9ÜA·xE Ö?ýµ®«NÕ$ÉQ3‡žÃõ¹Ú*ª5“à®|@¿ýÖ2Ó&E„ù•Œ†cS­tý‰îºŒÃo8qÈ*{oÁ‚®/¢ÆÚÊ IÌÓNJŒi®æøÎ%ŠDs_n·æ“s|W¿E^rü|>Þðö@ÖeC½«9œÏ]·‡r|'¾Þ‚HUwõõ˜–ÛšLòù…L›·ÿ¡c ³tªÊ¨HÈGÉÉ;Käû4Ìẇê ÿÊ{vùVÀm$Ë|Ï÷sU­ÿÁ}“ƒdq(ÎÚŸ™ÁOëê߬tHº<ÈZö²s)'î îà\[¾ow¨Œb9VÝxÁ–•C˨C|#RíCº¹ß å£h¢üà xe<@0ˆdRSBFò¦ÛqT7Xw·Q:NÆH¹øìÌU¦Šä»é‹Ju§‘|Â&n.€šj0o¶vÓªÙ-('EUŽyx%.¤±:*3v^ÚφhÓb›¦Ô";Uº=5ðoe}*ì´¢åCS:È£Eà ñãAZN…øö£¢H-X É&Pæ‡E>¹ù×ÐYàœŒi|炦àáxHÁw9,–a;jêHÍ“÷TÏ|h 0ÉTž×ЄYLƒ4Êó0_ÐýYlaµÌ›¬<Ø|äæ`r§™1öf8q¥ÜxJnsa•±²D%ÛÖE«‹znÛº%Åh¹ð] [ÿ…+ÏŸ.7Ü^~‹–Bz–}Áéòir…tuTÞÎîF”¡µ$}Ç–ÀI«Ü'Çh•}ñkcǽËfl@E”­SoqÑ_XÝó£êÎ,ÇÊQ5?@[¶~±7ʹضÂa…f7nÚDŠnè=ó, ©ïÿÇi¸°»ð„g¼2nWøP+œ[cÑ«(¸}a—¦0fN‹‹ß¦kÁE5Wè0~ƒ®‘\ãcÅ%yáŒ}Qd `ü(Ö)–ûH$Òª¸º\n“0¥A穟dÈä«ß­×Eízýõµ–&ŽSǾÄ¡º]ÿ(LÈì©:2á½ÊÑöëÞÎ4q̲~ R¸»®³°ÂñÆ’mbykpEe3ßùX´Ìu¿¯&¶ç…sHò‰þÎ;vËŽu±µÏкæJ`k>ï<Õò»ö®¨ì ø†m U—g¯ÜŽÎ^E APÚOVRƒÿ¼ëǯþfŒ/}âNµ ;Üuƺ«@ÌÅCžªò†©S|‘ᱎ >bz’c8ŽâÀÔ{ƒ¤ ŠÔà·;3t÷®«–KÍñÑ4wžL»ÛÅu[:$*ù‚Îy8=oq¨/c;¸Xʽñjè%àS¹Ÿx~œ„æÂ1Ù.‹¦Íob‚ònKw1Áx¶âÿ{û…tà/»"Ã<<ÌrÌ‹)íÅËgßß„¢|j€kY+I=ˆ¿´è¿S~`àè%¾ÓFâìåݤq/'H×—Døj¡d5ñ—ƒõó®Uc -R&mm› y:9 uD!rgÕ NbÁG²`¬3†a$¢\u7+Ñåx„Ñ(Ï Üñvq¡{œÔPÕ7Âä¢Â ùTOl¾$ЗR 3êXép’a½ µøÃ•«u!Ó³® .h±Ðo0âí¶!ņC彊²$UO6Üyà»|~£Îmy¿ú/‚d8 endstream endobj 2754 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 2755 0 R >> endobj 2756 0 obj 2703 endobj 2758 0 obj << /Type /Annot /Subtype /Link /Rect [ 165.82 728.773 196.93 737.653 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2446 0 R /H /I >> endobj 2760 0 obj << /Type /Annot /Subtype /Link /Rect [ 215.07 684.653 402.55 693.653 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1273 0 R /H /I >> endobj 2761 0 obj << /Type /Annot /Subtype /Link /Rect [ 203.13 662.653 315.33 671.653 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1275 0 R /H /I >> endobj 2762 0 obj << /Length 2763 0 R /Filter /FlateDecode >> stream xœÍUÛnÚ@}÷WÌcšõ^ì½Tj£&½H•š©•B ,±_ˆmJò÷c§Áøò <ìîxæÌœÃYóì0 ø=¯í1¢µeâ<7qŠƒMȧÄã>¥˜G¸ ´C>ÄUÍÁ†¿ípiåâ9„ßNêPøêÜ?`Î (Öí:¾‡ºsnfkpJóQxt.gŽ{í£0[¿KÌ%êË ~h"xµ3f ܟͲ,.`å°ˆq”=æÁ&Œl1y€ÙçjÖ".(%úÔxß´FDß(¥=öÓFÔ1ŒÔˆÕ£Ö ÇǺK+R3¨×Á‘igbz8p×J'3ܰ‹¤"Š¡‹”1øˆè–¸ÇÆs2ôºfáÕ\{PÊ1˜7ôÑcŠpM)e-ö>R ùšûµÄEV P è^Ëcõ< Â*%ê¦ðÖ®¿\ÖU=z+TÙTHÙ-…ù™šO>À[u§Ÿ¤¾òÒt«s»^-ÒÕ`kÆ=bð§Ã欷7›OÈ`k¤*YUH‚tÄXgK\—Ùæu>á1$% ¿ ¿n¯®¿ÿq‹0È­»Ê–îžÖùÅ_›Q–N›sÝÔÒ•}!a™Äcƒk1>øÎ.F'(\å .{°à¢.|O÷0E¡ÌJðnzX–›nÍ‚Ù6_Z|O?Z’ÚÒ`õZt´gŒVÊt¡§c0ê÷Š¥P†P‚8'FWÿ4ZöuŒ°Êižîk<*ÁG1EÅ´èš¾]σ›>zÍ… >VÅ„ÏÛ2ÌòÃ[Þ¡_©ç+¢)G@4íûm{ÙÀ.(`—GeiSX¼ÂÏ Úð-³i´| à"Ù>%a!+;%oÕç¡ß endstream endobj 2759 0 obj [ 2758 0 R 2760 0 R 2761 0 R ] endobj 2757 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 2759 0 R /Contents 2762 0 R >> endobj 2763 0 obj 645 endobj 2765 0 obj << /Length 2766 0 R /Filter /FlateDecode >> stream xœÍYKsÛ8¾ëW |rªd.Iñ¥½%eg×[³™d¢©lj2ˆ‚,ŒI‚áÃŽþý6Ðx‘¢³Ù[’ƒûkâÑøÐ/R_W áÿüS$QP[RÖ«¯Z‘<&›L«Ò0Hâ4 7$J‚8%5™ªRRÉ9ž þLÆ>‘O«f’¬þøÆHóžWá ‹«¥>®>x¶é ÿLö…äaõf·úÛÛ”D!ÙÅqüF[ø—“"ØÄRÚÆdW“?®wBT=9ŠŽìù¾â⡣퉳þÕŸd÷¯ÕÝnrðMÅÏvîÁoò<¹?©e6¨ ®(M ™CÜe¢ÁàßM/,}ƒ/]é§1îe/Êò À‹òíÅÄâ$þžÇü4Ç»t–XÚ¥ cPvúøàcyaF”åúðxöw´fxxIÞsIAâmf©œSऎû›º'8ÓŽ-²‡%ùå¤/qœÏÆo¿7žPRЦ»ÙÓžH?œ+FXÃ::@Ì˸ÿoßû=¾ÇAši´½|"wúxnDÛóÞça»ÀC± ¢4'Êf<üŸDQl³d»Í6 .tËú²ãíÀEó¿.#ÚAÂfÅfv¼ÿq΂ÙUÈ•³(ئ!qšâÊ÷ éO¢Öd8ÁâãÀ+>œÕ¼z"ްa%DKxCžO¼<‘³ í¡ý#l?ˆ¿/ìS¤Á&‚àÚ¤‰ut6.]׳Е¡ ¡fÍ@ލ¥ `Ž´F«‡ªÏ`Ø5œè@ZÚ©É!'ëK»â˜Ír™òïÙu9¶djmÛ‰¶ãt`ä‰V#Ã"UÓæ oáLè0t|?¬_²ca 7œ~׊Ù(½µPND+o µ·bÁ°v´øà¶qÉ”® N½(^2æbÜ_U,øbœA¾»r¤;é@kÉúŒ?ôàp¬Qþv¢OŒ°o':öƒt:¸ãÛÝíª›8+Š02w÷Äà6^‘›8$ׯ™‘å²Z”ެŶc½äí`Ï|8ÙqFP'Ô2TKö¼—;(û'+âU^®„ÔòæÁÎgUp+¼'½X jÀ„„g^UrB”ÛHé‰±Æ sìé±®)²)!Ú+%FK;Ú8ƒd—Ôç–¢ä/0`çô=­™®O)Á â5½µîä,–€žr€¼bw·êtÎQ] -yT² ’¢pe¸Ö'Ü=‚Òäx¢YÆj *èhAÌ{+vìëÈ;år¨ØŸ­ˆ¤¡ ïé½LÖ6X_7¦v_'Òq5x ©ôXõ[Ïê^˜ÞaB ”‘)%bÿl¢î'ÝȉÚ÷÷CÔˆÁ C Ñ œ ‰à‰˜S𦽙2ÃYÐ{559n§§ó'{OõåºÿòÊÛwÂÚ9ùfFŽÊk%8Êž‘ï¡¶–¬SÑ ûÈ; ï+Õœ€5˜Ýt'GàgOËG˜MÀøÂ–Ðeå[ÈÍI”:eù”ÙЊ¸ Q@'< T·Pß’±‚X(<Ùº•YʼnªÖ8xô§©p1²/ ;èˆYÿÈøkÙwœ/)K ÂO)«[u < bØþ[[QÞè$„:íÚ±kEï)0.ŒôR¢Ù9Ù²8Ýë£æ]Ï×éõ…ÕÐÝõj‡^¦6C¼`’êh‰Ã-šó, Ë9‚I©D•©z´¯€Ý‡NÖu«êX }ç•S@ú¬ÙF…6Á—ëšþ%:ŒDT™z8Õýàäšž½µè#[´ ’ÃPy Ç]$z±)1Hm&’α90ˆc“´Ò$" M(žîµ?@S­ܤ‡üÞÂ.Ïδ5ážùkÉê©ÃÌÓ¥<„7ã›ùÉÔ[kèCI2c¨„€ª„7%êîˆè~‡¦ò]æýïovŸßßÉÎúõï»þúÛ/÷wk® Óךp8r?î{~à²ó04,lŸÎs :+¼ f²æX±̓ .„!ÎÏŠÔÜÜXQSŒÀ_ïê(*àó*°š^6‚Ú=µ´tSÑGP®Á+Ý8UšQ„bÀ=#g>´ åcå¬rž·ÀI6OrÐ8©SD©JuŸ‘ÚÜ`z%ÊÔ›Lo²ZèN‡Å- ù,Rž¹Ãž×¸Mjáíx¤5ÔrÚY…N7K'èÆr½¹*7Û Tóć,ÈžKűö¢ÂL[ÉÙ>ô´àBÆ^Öç…êœBÐDé&ŒÒH¿ä¾–ü„Aí4Tq¤ ¤¨7@žÎ=Ò²6£å×w¿|¶ªÏw¯•Â`ô4%Þ¿ÛÝýgw{÷Ö(¼|¢ðbH§ÐN-×1¨"»¯@Uâ© ·ONN†’ñÄÅØ[Å•J Wk³7àß‹Ü ¾Eà ë1¢RtPqZѰª\Úq·Ì‘³ê°Ôþ§q1ãÞW°êÃq:Į́х4rú†µB!ÝåôÀ©Þ ÿù7*³èÚi¿ºP¢†zË»,z±‡SH'^8jÎŽj¯ò& ƒ6ƒÀ”gJ(›‡«j|^Pƒý‘™LoÝ®®sؼ_#R‘8üY·$¸1õö|âìù%M1šè{­êBnH¡“\àE¾¹‹²»E·Éè0ßnÓ,š¼5Ê·ˆÂ?*&½4bLMLi¾\so)üôW­ÆÄ†ó@0£„“;î-±`ßyæÖz/P…é3´%¶ W6 ¼ùŒÑÊnclð% šˆH›†b)ZO¯nåZ(Aб(ªÜHõ梊ºÆö²+_4‹R§έr5D÷nR m: $xÑÚµE.Z¶ßHÙng¤`ꎰ}÷7ž Ò¼â+ îE0€³C`±nKôCüXa[ tÆþÄJ•zQGë'6#ø ?®­Œ/z({iËnážÚxשOÍþÑ.9Ê¢hÎQõLÏ=~T}åÇ#°^Îez\Êl“Eoó,ÔŸ…Ü‹Vl¬Ÿ#0ßìᇂÃd¬7ÓôLšÖ‘÷ &„ôÜÉF|ð–N¦N„^äÑ¡#×ÙáýðÒ>´ê½õô/lq‡Þš³$›è}„,¹1Ie>xrãäÓPWá•N±3pºØ¡¤ÞR{¶¼õƒ¼.oGVµ™Ï‡ˆTª0™Qi:v„äÑ”¬_¶_^ý9i1#Ç®Ct òçš%§,â ŽŠ0ÊÓÂû^¤ªÒÄu²Ð]h†ß‘#‹ã‘uö°³ÛJЃ7ÁˆÖ]§ãñw#ƒvúeAgRc‡ËrÙ3¦A4Z[¹µ7²Vð…˜m“ ¢•î)‹l)ÆêÖôvSb×òªú™zpxc”ŸÕÔ0ñܨl÷Ûï‡Õ½Ps endstream endobj 2764 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 2765 0 R >> endobj 2766 0 obj 2564 endobj 2768 0 obj << /Type /Annot /Subtype /Link /Rect [ 215.07 597.917 402.55 606.917 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1273 0 R /H /I >> endobj 2770 0 obj << /Type /Annot /Subtype /Link /Rect [ 203.13 575.917 315.33 584.917 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1275 0 R /H /I >> endobj 2771 0 obj << /Length 2772 0 R /Filter /FlateDecode >> stream xœÍVMo›@½ó+昺ì°EQ[¥©Z©UÓZj¥¦‡Å^Z`ÀqÓ_ßÁ€gíª·$vfwÞ¼¿¸wPüÑaLÇ„ŸJéÙ;®¢@ÉPE2Šp‹„qOœR̳)ï©XxÃkJ9:Ë®|Ô˜$<¤”²Iv:’]ñmí7iÖß—¦{îMpØ:/ˆvQŸõòúõÅÅõKWõc¦[Kß18`Á³$­àw9}–›Å&Óƒ=Þ+õý&-õbðÄãÝå"~‘Wdp½«í@êA¥™ŠÇyÔx{XÖª$«?£­rž¤£86¶¸k§ª쵚ÿR«Qܲ4ù(MÒõlÜ))lm†­Ž«´Öp¹+˜TfSÎ5½•&…®¯HÿëTpR”SD’ui¾h *«Ì¿dÀ¸OBÊ2òÿSŒãkK£4`¸;w礷&÷¤-9äªØ¨ 23ÇçܬïÎá8‘€’ÝÛ$ˆ| &|úüææÝ7·JT©Ý…™»­Ê.tY¥¦¸êì6«› ý›$už¤D§©ã/|’³ðHÔ\ZØÀàò@JÌC!IìµÜr>©ëõ…ëZÕä)l-ÊÌ‹¢PÊÈ‚}u²³öÁ€÷¡Ñù‰pN¢°ù  ÐÓFpê…¶Ä'{p…¯"( ÔÕÞ?Λ‘î·Ìv¯6ubÊñí³ÍQîá·ˆÀ˜'º¸~‡ٶLëZ€òZ=¤ ø¨cµÑ%\.óeÑš«ìGÆ=Ðû1Õ7cºÕêÞ^wíµ¶jt´g²w´C»]·ÜöfOrï°°6—ft²‘Ì»¿½ÒüÔózpÜÅ›ÚR¶ ÊÎÕ#Ä6¾v¸Á4eµŸM»/„[ç/º¼ endstream endobj 2769 0 obj [ 2768 0 R 2770 0 R ] endobj 2767 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 2769 0 R /Contents 2771 0 R >> endobj 2772 0 obj 856 endobj 2774 0 obj << /Type /Annot /Subtype /Link /Rect [ 265.535 483.181 294.415 492.181 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2418 0 R /H /I >> endobj 2776 0 obj << /Type /Annot /Subtype /Link /Rect [ 165.82 255.093 194.71 263.973 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2418 0 R /H /I >> endobj 2777 0 obj << /Type /Annot /Subtype /Link /Rect [ 215.07 210.973 402.55 219.973 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1273 0 R /H /I >> endobj 2778 0 obj << /Type /Annot /Subtype /Link /Rect [ 203.13 188.973 315.33 197.973 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1275 0 R /H /I >> endobj 2779 0 obj << /Length 2780 0 R /Filter /FlateDecode >> stream xœÍXKoã6¾ûWE °¡I꽂v±IhÚÝ.ä Ët$D‘ª“K{‡¢,êe§¹%9ˆ3"‡óøæ!?Í("ð¦¡KqF(ÙÌž>ECŽß°<‚]æâ êbæ¡ ê³<”ë3Û¯àÑÛ tŠþž3‚~™ÝÞÞ"pn7#„×¢nf_;º5`ýžô#èaöi1›_yˆ´X[3üK#ø Pˆ¦WC‹ º=Y‘K´%ZfË<e¼M3.OïÑâ÷Ùå¢g¸Cß›Ý_{*n‚ Àdˆ§ZŒcxÀ1õ«ž"CÒÜÒã Ìó Êd¤1é*<†Ò»Qî0ŠüPD¼ÂaFÌu!æÝ˜7 ÓzÕB fÙ˜ 0 !´ç…GAc¼±ýÏxÃñÚyžsCÄ"L|OŸ Í¡R­“LÅ*…D§èÌ%8@'FL{0˜;>òèXÂcÁ`?%ÇØk.ŸU'ªsñ7¾þüÉ’ª­K±±Tl—Š?«Î¶,çmÅÊ»2S¼#Q¥¼#1+”è´ëï×’_ɬxèIx\Ý…ø>Ä1lâµ7.ϤzÆ+µÂûèu@p ~„=´‘xóRˆ­ÌdÑ "‡„ÀÈ£Àž€ed|Ýî÷.¢Ìá£õñÁ³ôðENpä º£›(cx.ø‰5">s™”ÙV›ûZÂP×ÇžµÆu¦3Æñ¡¤œ”<^Y*nWÛ<Ί–j jˆ•Hª /,ãîDVIj…Xy€§v½åÊŠ/EÂ¥„®¹ç@ÝÄVæ·ÅÕ‡–Hy‘XA™²P:îN­ȱ1€©\!Õª¶îŒ†˜¶Yf™Ä&m ™)»^×ú6Ä6.U–TyÜá%i¬ëï°$ª´ú‘»4«ÝÕ+^Å-Ý–’Fæ>fØò)ŸØÐ1¨œÈcQüÃKÅë¸0—huõÐ S:ôªu¦]‘çbgŠG}ÔDš¡quheîWÒŠio„ˆˆJá†Z´Ò²b[© ¦…l`Ú&~AKŽââIUV‰ªJ0âWˆâ¬Ã©‘m"!œJÚk`í¥¢öðÇ&ë°__ùÛëQÐ=úZÜd›-”ÛA‰ÒIk§1:LÕË"É…äµ"{è‘¿ À.xk ’åS±FK@Ý#Wò‚䃷?ÜÞ^gyÎK=´Þßÿ€ëí óãºÊUv–BmxUwoª½îŒŒ'·Ÿ×ªpˆ*“ž‡]]¿¥Ö»ÎCÃ1)kÖM³7DRgµY/-{]§¿Y×éh–ÃÉÚ™çèiP?R©äë|ÿ 1h`.…ŸL‡¦®}à/ceÕ‹­Îöûê倅¢PжºÞP_A4;¶B?z”o\ÊphÉ5Füµíf‡M°éÆ Nú!ë:9xÛq£Á™/% {ÅPš6yÙÌOI[ SçÒ¯ø3ôË7› _€ó£0 šÉãò9֥쵩Ã%  £ °`íÖR£0ßÐqžÛƒêy-†Y¥Ö¾yëIP¢_e+ü¼É?œÞ´0 ´=wµ>2?ÞôïÃmZ–NËš_Q:¼[‹íïÍ]ç­ykŽã“¡õßCê†!v}‡PÖæ†C{Ì¥è†ÔŸ¸ßÈ®úßäm]ÂÁ‹õ×B](ÆgÑÝIpwú¡õáèF=6×?µøÑÄñ^™õáÑÇÉ”æp;½;Å/׿:`[Å9ÈEÏDl_ôàyPˆZc†7!}ùvyõÛ÷¹„‘Ïa°™×–Ã<&( mngÅŠ?ãTY¤LªîùÇUßñåQAÍH˜3J:ö×Á$€P0÷§Jm?Î!XŠªL8 Ð\ÍÖÊvÀ5tŽ0¢ ÙGý„“~hŠ#xáˆ@Pö À‡þ„ ±Š©þäƒüšØÔÃn îtö_cQoýÈ& *¸ë7­êçJ¥¢|­„û`‘«SªÅDÛÁ£«²‚þ²|A×qùXIô«àLÏ1:ßÔŒŸ6iÃÁ+~;?m}ýMËe endstream endobj 2775 0 obj [ 2774 0 R 2776 0 R 2777 0 R 2778 0 R ] endobj 2773 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 2775 0 R /Contents 2779 0 R >> endobj 2780 0 obj 1673 endobj 2782 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 730.013 227.116 739.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1259 0 R /H /I >> endobj 2784 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.069 730.013 525.069 739.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1259 0 R /H /I >> endobj 2785 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 718.013 175.1 727.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1291 0 R /H /I >> endobj 2786 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.574 718.013 525.574 727.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1291 0 R /H /I >> endobj 2787 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 706.013 170.1 715.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1270 0 R /H /I >> endobj 2788 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.613 706.013 525.613 715.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1270 0 R /H /I >> endobj 2789 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 694.013 165.1 703.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1628 0 R /H /I >> endobj 2790 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.648 694.013 525.648 703.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1628 0 R /H /I >> endobj 2791 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 682.013 177.32 691.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1319 0 R /H /I >> endobj 2792 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.558 682.013 525.558 691.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1319 0 R /H /I >> endobj 2793 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 670.013 205.08 679.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1402 0 R /H /I >> endobj 2794 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.357 670.013 525.357 679.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1402 0 R /H /I >> endobj 2795 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 658.013 219.359 667.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2180 0 R /H /I >> endobj 2796 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.121 658.013 525.121 667.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2180 0 R /H /I >> endobj 2797 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 646.013 169.54 655.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1530 0 R /H /I >> endobj 2798 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.616 646.013 525.616 655.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1530 0 R /H /I >> endobj 2799 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 634.013 197.31 643.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1642 0 R /H /I >> endobj 2800 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.413 634.013 525.413 643.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1642 0 R /H /I >> endobj 2801 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 622.013 195.64 631.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1644 0 R /H /I >> endobj 2802 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.426 622.013 525.426 631.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1644 0 R /H /I >> endobj 2803 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 610.013 181.77 619.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1546 0 R /H /I >> endobj 2804 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.527 610.013 525.527 619.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1546 0 R /H /I >> endobj 2805 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 598.013 183.43 607.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2191 0 R /H /I >> endobj 2806 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.514 598.013 525.514 607.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2191 0 R /H /I >> endobj 2807 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 586.013 309.491 595.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2194 0 R /H /I >> endobj 2808 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.507 586.013 524.507 595.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2194 0 R /H /I >> endobj 2809 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 574.013 190.375 583.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2197 0 R /H /I >> endobj 2810 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.463 574.013 525.463 583.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2197 0 R /H /I >> endobj 2811 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 562.013 290.227 571.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2200 0 R /H /I >> endobj 2812 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.735 562.013 524.735 571.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2200 0 R /H /I >> endobj 2813 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 550.013 215.738 559.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2203 0 R /H /I >> endobj 2814 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.429 550.013 525.429 559.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2203 0 R /H /I >> endobj 2815 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 538.013 217.411 547.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2206 0 R /H /I >> endobj 2816 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.415 538.013 525.415 547.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2206 0 R /H /I >> endobj 2817 0 obj << /Type /Action /S /GoTo /D [2074 0 R /XYZ 72.0 245.939 null] >> endobj 2818 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 526.013 222.392 535.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2817 0 R /H /I >> endobj 2819 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.377 526.013 525.377 535.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2817 0 R /H /I >> endobj 2820 0 obj << /Type /Action /S /GoTo /D [2074 0 R /XYZ 72.0 183.957 null] >> endobj 2821 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 514.013 209.104 523.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2820 0 R /H /I >> endobj 2822 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.481 514.013 525.481 523.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2820 0 R /H /I >> endobj 2823 0 obj << /Type /Action /S /GoTo /D [2074 0 R /XYZ 72.0 133.975 null] >> endobj 2824 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 502.013 214.084 511.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2823 0 R /H /I >> endobj 2825 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.441 502.013 525.441 511.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2823 0 R /H /I >> endobj 2826 0 obj << /Type /Action /S /GoTo /D [2211 0 R /XYZ 72.0 745.889 null] >> endobj 2827 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 490.013 220.728 499.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2826 0 R /H /I >> endobj 2828 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.389 490.013 525.389 499.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2826 0 R /H /I >> endobj 2829 0 obj << /Type /Action /S /GoTo /D [2211 0 R /XYZ 72.0 671.171 null] >> endobj 2830 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 478.013 224.045 487.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2829 0 R /H /I >> endobj 2831 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.363 478.013 525.363 487.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2829 0 R /H /I >> endobj 2832 0 obj << /Type /Action /S /GoTo /D [2211 0 R /XYZ 72.0 584.453 null] >> endobj 2833 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 466.013 219.065 475.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2832 0 R /H /I >> endobj 2834 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.403 466.013 525.403 475.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2832 0 R /H /I >> endobj 2835 0 obj << /Type /Action /S /GoTo /D [2211 0 R /XYZ 72.0 449.735 null] >> endobj 2836 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 454.013 224.045 463.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2835 0 R /H /I >> endobj 2837 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.363 454.013 525.363 463.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2835 0 R /H /I >> endobj 2838 0 obj << /Type /Action /S /GoTo /D [2211 0 R /XYZ 72.0 363.017 null] >> endobj 2839 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 442.013 229.026 451.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2838 0 R /H /I >> endobj 2840 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.325 442.013 525.325 451.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2838 0 R /H /I >> endobj 2841 0 obj << /Type /Action /S /GoTo /D [2211 0 R /XYZ 72.0 300.299 null] >> endobj 2842 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 430.013 219.065 439.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2841 0 R /H /I >> endobj 2843 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.403 430.013 525.403 439.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2841 0 R /H /I >> endobj 2844 0 obj << /Type /Action /S /GoTo /D [2211 0 R /XYZ 72.0 201.581 null] >> endobj 2845 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 418.013 224.045 427.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2844 0 R /H /I >> endobj 2846 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.363 418.013 525.363 427.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2844 0 R /H /I >> endobj 2847 0 obj << /Type /Action /S /GoTo /D [2211 0 R /XYZ 72.0 138.863 null] >> endobj 2848 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 406.013 291.893 415.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2847 0 R /H /I >> endobj 2849 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.723 406.013 524.723 415.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2847 0 R /H /I >> endobj 2850 0 obj << /Type /Action /S /GoTo /D [2222 0 R /XYZ 72.0 769.889 null] >> endobj 2851 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 394.013 215.738 403.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2850 0 R /H /I >> endobj 2852 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.429 394.013 525.429 403.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2850 0 R /H /I >> endobj 2853 0 obj << /Type /Action /S /GoTo /D [2222 0 R /XYZ 72.0 703.829 null] >> endobj 2854 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 382.013 217.411 391.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2853 0 R /H /I >> endobj 2855 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.415 382.013 525.415 391.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2853 0 R /H /I >> endobj 2856 0 obj << /Type /Action /S /GoTo /D [2222 0 R /XYZ 72.0 628.445 null] >> endobj 2857 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 370.013 222.392 379.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2856 0 R /H /I >> endobj 2858 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.377 370.013 525.377 379.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2856 0 R /H /I >> endobj 2859 0 obj << /Type /Action /S /GoTo /D [2222 0 R /XYZ 72.0 553.061 null] >> endobj 2860 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 358.013 221.276 367.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2859 0 R /H /I >> endobj 2861 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.385 358.013 525.385 367.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2859 0 R /H /I >> endobj 2862 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 346.013 248.571 355.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2235 0 R /H /I >> endobj 2863 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.037 346.013 525.037 355.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2235 0 R /H /I >> endobj 2864 0 obj << /Type /Action /S /GoTo /D [2222 0 R /XYZ 72.0 364.822 null] >> endobj 2865 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 334.013 319.794 343.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2864 0 R /H /I >> endobj 2866 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.613 334.013 524.613 343.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2864 0 R /H /I >> endobj 2867 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 322.013 303.962 331.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2292 0 R /H /I >> endobj 2868 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.737 322.013 524.737 331.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2292 0 R /H /I >> endobj 2869 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 310.013 290.893 319.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2304 0 R /H /I >> endobj 2870 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.841 310.013 524.841 319.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2304 0 R /H /I >> endobj 2871 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 298.013 249.083 307.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2337 0 R /H /I >> endobj 2872 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.035 298.013 525.035 307.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2337 0 R /H /I >> endobj 2873 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 286.013 322.185 295.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2330 0 R /H /I >> endobj 2874 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.595 286.013 524.595 295.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2330 0 R /H /I >> endobj 2875 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 274.013 299.126 283.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2358 0 R /H /I >> endobj 2876 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.777 274.013 524.777 283.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2358 0 R /H /I >> endobj 2877 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 262.013 234.283 271.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2388 0 R /H /I >> endobj 2878 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.021 262.013 525.021 271.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2388 0 R /H /I >> endobj 2879 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 250.013 172.88 259.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2418 0 R /H /I >> endobj 2880 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.59 250.013 525.59 259.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2418 0 R /H /I >> endobj 2881 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 238.013 175.1 247.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2446 0 R /H /I >> endobj 2882 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.574 238.013 525.574 247.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2446 0 R /H /I >> endobj 2883 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 226.013 170.11 235.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2485 0 R /H /I >> endobj 2884 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.611 226.013 525.611 235.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2485 0 R /H /I >> endobj 2885 0 obj << /Type /Action /S /GoTo /D [2534 0 R /XYZ 72.0 769.889 null] >> endobj 2886 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 214.013 204.56 223.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2885 0 R /H /I >> endobj 2887 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.361 214.013 525.361 223.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2885 0 R /H /I >> endobj 2888 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 202.013 181.76 211.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2668 0 R /H /I >> endobj 2889 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.527 202.013 525.527 211.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2668 0 R /H /I >> endobj 2890 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 190.013 180.66 199.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2670 0 R /H /I >> endobj 2891 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.534 190.013 525.534 199.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2670 0 R /H /I >> endobj 2892 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 178.013 174.54 187.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2730 0 R /H /I >> endobj 2893 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.578 178.013 525.578 187.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2730 0 R /H /I >> endobj 2894 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 166.013 175.1 175.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2741 0 R /H /I >> endobj 2895 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.574 166.013 525.574 175.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2741 0 R /H /I >> endobj 2896 0 obj << /Type /Action /S /GoTo /D [2764 0 R /XYZ 72.0 769.889 null] >> endobj 2897 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 154.013 180.1 163.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2896 0 R /H /I >> endobj 2898 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.538 154.013 525.538 163.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2896 0 R /H /I >> endobj 2899 0 obj << /Type /Action /S /GoTo /D [2773 0 R /XYZ 72.0 769.889 null] >> endobj 2900 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 142.013 187.33 151.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2899 0 R /H /I >> endobj 2901 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.487 142.013 525.487 151.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2899 0 R /H /I >> endobj 2902 0 obj << /Length 2903 0 R /Filter /FlateDecode >> stream xœÍÝOwG–˜ù½>–ô¢0qÿ/mŸž9ÇÇ›vËg>^PTʼnT“ÔŒüí7_HÀ‹LµâÙuբ֓ȼyù¯ßŒ‡mÿïßúRÇcf=|ÿó7ÿúüëã!æƒøó/Ùö¨Ó¶M†>N{øùáþ—ìá§¾æÕ?ÌßÿiÿŸ»vûÿ÷7¿Ùþ¯oþÇÿÜ›¶ýºÿÿ›íOÞùñ®þå›~õ¹=û?ÿ{úü^†²mùïïüç{àˆxÜÞÂïFn¿¶ÿÊí=öÿu÷‰¼}óöQî~åö;¸ýïŸ~ÊÛé3Þ®ÿD7ÿwóÉmÿæ?}ûÍÿñîŸÓöðí/ÿFy<ÆUQµÿ_9«ÿ3¾ýùá¼CÿÃÿ|øö¿|óOß^ýùwóÛ;ÿe™ýyýñ»ÞÿjÅãÌmÛÆÝo^³ñü›¾ýž¿}ÿÝOOŸ~|øÏŸ>~}úøõËíOàân¿Zö?½Í÷w;óùOl>>ü‡‡¿e=æÃ»oÿñôòÆû_~ùéÃ÷ï¿~øôñå¿<}þÿž>ß>Âïw˜=Ža»‰ŒóGx¹øtY>ÚÐm ‹óeok¨VT©cCµ ÚQ]¤Î‰jC5²,dYȲˆå܈å܈å܈å܈åÄrb9±œ“XÎI,çD–‚,Y ²d©ÈR‘¥"KC–†, Y:²tdéÈÒ‘e Ë@–,Y&²LdYȲe!Ë"–²KÙˆ¥lÄR±”A,eK™ÄR&±”I,e"KA–‚,Y*²Td©ÈÒ¥!KC–†,Y:²tdÈ2e ËD–‰,Y&²,dYȲˆ¥nÄR7b©±ÔA,uKÄR±ÔI,uKÈR¥è£ÇVÙ#•õñ…î_ö7¯mÛ¦^ÌU†½éc>h½©>?ýøÃwßýéí=ì~Ÿ¹õ„'5Îõg´¿ûó³ýsœ'‡ûw$ßo·yñ!Ï£©ñþýÄFâñþÍÄJâñþÄBb"èD0ˆ`Á ‚I“&,"XD°ˆ`Á>MÄ@°Ï•[ìæ@ û¬9Á>uÄDPˆ A!‚J•*4"hDЈ A'‚N "D0‰`Á$‚I‹, ØGÞöáwëñ‚} ˆ`ˆ·O ØG㘠"(DP‰ A%‚J4"èDЉ Á ‚AƒL"˜D0‰`Á"‚û\>Á>¡Ä@°Ïê1ìSûÖã ûü>A!‚ûó{QvQÿùx¦Gb^¥~1ÖÙÿámŸ·'#Ügr<s£ïþã?øøáË×Ï<óöë_?}úéËiÐûGÏ*1¹x¿/Ÿ&#½P¶MÃ/®;R„åÎòBù±äÆòDù±äÊò@y2ÕdªÉT“©S-¦ZHõ¶)äHõ¶-p=Hõ¶1äHõ¶5p=ŸHõ¶9äLU˜ª0UaªÊT•©*SU¦jLÕ˜ê±Op¿ñ.[©‚ëµ¢:H}ì\¯ÕŽê"õ±_p½6T#ËB–…,‹XÞv ®×Äò¶op½&–·ƒë5±¼í\®'±¼í\¯‘¥ KA–‚,Y*²Td©ÈÒ¥!KC–Ž,Y:²tdÈ2e ËD–‰,Y²,dYȲˆåm_ázM,o; —ëA,o{ ×kbyÛ]¸^ËÛþÂõYö¿¼j« ó“žúŒçÑÒÕ8g¼écÞž7y—ë…Þ¿)÷—)Ö‡³muuÉmS\-ÚoY÷Oè¶Wò|áé†x¿eEy |¿eE¹°ÜY^(ßoYQn,O” S¦*LU™ª2UeªÊT©S5¦êLÕ™ª3Õ`ªÁTƒ©SM¦šL5™j1Õbª…TûI(Gªý¬”#Õ~ÚÊ‘j?ïä©öPÎT…© S¦*LU™ª2UeªÆT©Su¦êLÕ™ª3Õ`ªÁTƒ©&SM¦šLµ˜j1Õbª…TûY(Gªý4’¤Úσ@9Rí'B ©ö3!PÎT…© S¦ªLU™ª2UcªÆT©Su¦êLÕ™j0Õ`ªÁT“©&SM¦šLµ˜j1ÕBªÊfKÊfKÊfKÊfKÊfKÊfKÊfKÊfKÊfKÊfKÊfK·çFض…°ÉäíÁV2..2/†¥ýS¸m¿fÿrõjXú·ïÞÿÿþúËÅNúa~qåmíÞåÃo÷?°Œ~¤[^\w5‹#µ¢:H­ªÕŽê"µMTª‘¥#KG–Ž,Y² dÈ2‘e"ËD–…, Y±ì¡©‰eÜHM,{àFjbÙã6PObÙÃ6R#KA–‚,Y ²Td©ÈR‘¥!KC–†,Y:²tdéÈ2e Ë@–‰,Y&²,dYȲeË©‘šXö@ ÔƒXö8ÔIJ‡i¤&–=J#5²d)ÈR¥"KE–Š, Y²4diÈÒ‘¥#KG–,Y²Ld™È2‘e"ËB–…,‹XöÄŒÔIJçe IJ§e¤&–=+õ$–=)#5²ìIŽJ•Eã¥|éØ_&ìÿpqá°íbðÕ˸/_ŸŸ¾|ýôùé4À’G—~ÔÅ¥·O-ýbòÕ3Wß6Ñ«yOm,–;Ë åǺËåǺ+Ë™ª3UgªÎT©S ¦L5™j2ÕdªÅT‹©S-¤:7¤:7¤:7¤:R©ÎTçDªs"Õ9‘êœLU˜ª0UaªÊT•©*S5¦jLÕ˜ª1UgªÎT©S ¦L5™j2ÕdªÉT‹©S-¤*R• ©Ê†Te UHUR•Te"U™HU&S¦*LU˜ª2UeªÊT•©S5¦jLÕ™ª3UgªÁTƒ©S ¦šL5™j2ÕbªÅT ©ê†TuCªº!Uݪ¤ª©ê@ª:‘ªN¤ªl¶¤l¶tLãlÛ6hâu ãö—¸¥»Ú²Ûg\ ã>|üðõínoö~,¨ëÅu·Õqój·¿Nêßþå<ÝPï¯P^(ß_' ÜXž{¾¾ÕJ¾¿N@¹²,PÆÅeÏŸÖÅÈÑ·¡î¯]..;ÏåûM#Ê•åòý¦åÂrgy¡|¿iD9SU¦jLÕ˜ª1UgªÎT©:S ¦L5˜j2ÕdªÉT‹©S-¦ZHµ.¢©öÂE’¤Ú QŽT{á"Ê‘j/\D9S¦*LU˜ª2UeªÊT©SÝo7­ÊˆZÊ åûM#Êå‰òý¦åÊò@ù~Óˆra9SM¦ZLµ˜j!Õ^¸ˆr¤Ú I>j/\D9Rí…‹$ŸHµ.¢œ© S¦*LU™ª2UeªÊT©S5¦êLÕ™ª3Õ`ªÁTƒ©SM¦šL5™j1Õbª…T{á"Ê‘j/\D9Rí…‹(Gª½p‘ä©öÂE”3Uaª½p±tS¯^ÿÙ°î˜ ŽýoPX\\6Lß^Çmý›LÌö³òÞ}Û’}yóÇOŸ_ÞøüôãÓç§ß?½üÒû?¼¼ññÓ×§W×þüþãû¿?ýüôñízÈ~¢Öö|èßéóyy§ûíѷܶW×o[„åÎòBy?äÆòDy?äÊò@y0Õ`ªÁTƒ©&SM¦šLµ˜j1ÕBªýD”#Õ~L"Ê‘j?(åHµ•Hò‰Tûa‰(gªÂT…© S¦ªLU™ª2UcªÆT©:Su¦êLÕ™j0Õ`ªÁT“©&SM¦ZLµ˜j1ÕBªýE”#Õ~"ÉRíG)¢©öÃQŽTûqŠ(gªÇ.œ½Ö½¯ûu¿_°Í+ÓäêþÅìͽP¢NG*éãx¼í«G{¾Óysa/gØ¿D\\ýê·×ìß +¶>µüêþýCè5 (”ïß Q.,w–Ê÷oÐ(7–'Ê©S5¦êLÕ™ª3UgªÁTƒ©SM¦šL5™j1ÕbªÅT ©öš”#Õ^Ó@òT{MÊ‘j¯i@9Rí5 (gªÂT…© SU¦ªLU™ª1UcªÆT©:Su¦êL5˜j0Õ`ªÉT“©&SM¦ZLµ˜j!Õ^Ó€r¤ÚkH>j¯i@9Rí5 $ŸHµ×4 œ© S¦*LU™ª2UeªÊT©S5¦êLÕ™ª3Õ`ªÁTƒ©SM¦šL5™j1Õbª…T{MÊ‘j¯i@9Rí5 (Gª½¦äl¶¤l¶¤l¶¤l¶t¬iðÜÆÐ@µã4&ß_RÌ«ë.§}}yšöÍcÚ·ÅïþÛë¥ ·_úáý×÷/o}úõë/¿~}yûÇOŸ~ÿõí|ðx>|oÙ²‹ùrñé.l<ªEÕ´«ëÎ7mÊò@ù®ˆra¹³¼P®“åÆòD¹1UcªÖª¹m‘c%÷åÂrgy¡<&Ëå‰ò,W–3ÕbªÅT‹©Rí£2PŽTû¨ ’¤ÚGe ©öQ(Gª}TÊ™ª0UaªÂT•©*SU¦jLÕ˜ª1UcªÎT©:S ¦L5˜j2ÕdªÉT“©S-¦ZHµÊ@9Rí£2H>j•r¤ÚGe|"Õ>*åLU˜ê~Kh›ÏÖ÷O½þ#D+M®^:ÏMÞ\P~üÔîâŽð÷ ñ˜ï¾|ÿùã›+ûlÖØÿ¥ßÜêâ}¼ºøtaX‰äÆòDy¬Dre9SM¦šL5™j2ÕbªÅT ©Î ©Î ©Î ©ÎTç@ªs Õ9êœHuN¤:'S¦*LU˜ª2UeªÊT•©S5¦Ú‡v÷¡ûes%ïC»I®,”÷¡Ý$–;Ë å}h7ÉåLµ˜j1ÕBª½™åHµ7¡©öf"”#ÕÞLDò‰T{3Ê™ª0UaªÂT…©*SU¦ªLÕ˜ª1UcªÎT©:Su¦L5˜j0ÕdªÉT“©S-¦ZLµjo&B9RíÍD$Hµ7¡©öf"”#ÕÞL„r¦z<ëilcÿˆ&5·‡=e¥]½¾&ÍÓÑ =Lš “ÆÃ»|ýù§ÓLÈulU¦yñ>^]|º0+Çþ‚ÝåâÂóüf°\Y(ï½*$–;Ë å½W…äÆr¦šL5™j2ÕbªÅT‹©R=öª©{U@>ê±W…äHõØ«Br¤zìU!9S¦*LU˜ª2UeªÊT©S5¦jLÕ™ª3UgªÁTƒ©SM¦šL5™j2ÕbªÅT ©{UHŽT½* HõØ«Br¤zìUùDªÇ^’3UaªÂT…©*SU¦ªLU™ª1UcªÆT©:Su¦L5˜j0Õ`ªÉT“©&S-¦ZLµê±W…äHõØ«Br¤zìU!9R=öª€|"Õc¯ É™ª0Õ&©ìùP4©9†Iö-íê¹½=³§Izqç|”çi’=·w¿]“އ±í¿§œuñN^]}ºpÿ;«û_ômêÅ…ç³¼PÞ¯ðIn,O”÷+|’+Ëåý ŸäL5™j2ÕbªÅT ©öê!”#Õ^=DòT{õÊ‘j¯"ùDª½zåLU˜ª0UaªÊT•©*SU¦jLÕ˜ª1UgªÎT©S ¦L5˜j2ÕdªÉT‹©S-¤Ú«‡PŽT{õÊ‘j¯B9RíÕC$ŸHµW¡œ© S¦*LU˜ª2UeªÊT©S5¦êLÕ™ª3UgªÁTƒ©SM¦šL5™j1ÕbªÅT ©öê!”#Õ^=DòT{õÊ‘j¯B9RíÕC(gª=ð™ÖG™ 4KéDlCÇÕ$çzàcgÏÇÛcWFïE|x÷ùÃé,âýŽdlûïHj\¼‹W×¾½p¿7‰í÷“&Nžn®{ËÉå…òýÞåÆòDyŸFMrey <˜j0Õ`ªÁT“©&SM¦ZLµ˜j!Õ¹!Õ¹!Õ¹!Õ¹!Õ9êHµZ"ùDª}ÆÊ™ª0UaªÂT…©*SU¦ªLÕ˜ª1UkÕßw¯ÿuîË…åÎòByL–ËåÇ#@®,gªÅT‹©S-¤Úg,¡©öK$HµÏXB9Rí3–PŽTûŒ%”3UaªÂT…©*SU¦ªLÕ˜ª1UcªÆT©:Su¦L5˜j0ÕdªÉT“©&S-¦ZLµjŸ±„r¤Úg,‘| Õ>c åHµÏX"ùDª}ÆÊ™ª0Õžlý1 c£c)Sn•qùâùz²å—çîÚóR¦|žlýv ÍÇ-¥ªzuÖé}¼ºøt¡=ºï/ðkÆÅ…çáS¢¼ÊHrey ¼ÊHra¹³¼PÞe$9S ¦šL5™j2ÕbªÅT‹©Rí}t(Gª½Žä©ö>:”#ÕÞG‡r¤ÚûèPÎT…© S¦ªLU™ª2UcªÆT©Su¦êLÕ™j0Õ`ªÁT“©&SM¦šLµ˜j1ÕBª½åHµ÷Ñ‘| ÕÞG‡r¤ÚûèH>‘jï£C9S¦*LU˜ª2UeªÊT•©S5¦jLÕ™ª3UgªÁTƒ©S ¦šL5™j2ÕbªÅT ©ö>:”#ÕÞG‡r¤ÚûèPŽT{É'Rí}t(gªÂTC™üyÛìÃ'χ?.¼>ÅåßþÇ>º|x÷ó§NëªúGÐsÿ-yÊÅûxuñi€3gÚóqN§ Ïócy¢|ÿŠŽrey |ÿŠŽra¹³¼PžL5™j2ÕbªÅT ©öÚ$”#Õ^›„r¤Úk“PŽTÇÀ|"Õ^›„r¦*LU˜ª0UaªÊT•©*S5¦jLÕZÕ·±…®ä¾±\Xî,/”Çd¹±(Gª=ñ!ùDª=ñA9S¦*LU˜ª0UeªÊT•©S5¦jLÕ™ª3UgªÎTƒ©S ¦šL5™j2ÕbªÅT‹©Rí‰Ê‘jO|H>jO|PŽT{âƒr¤Ú”3UaªÂT…©*SU¦ªLÕ˜ª1UcªÆT©:Su¦L5˜j0ÕdªÉT“©&S-¦ZLµjO|PŽT{âCòT{âƒr¤Ú’O¤Ú”3Uaª=ñÙïÏKÆÕDæÏg)ÇÄÇeÛÜêâÂˉl—kçóÄÇûÃüðŒ·7Éû—ýýÃôÉQzñ>^]|àlý)nšyqáyÞ#,w–Ê{ƒÉå‰òÞ @rey <™j2ÕdªÉT‹©S-¤ÚÇp£©ö1Ü$HµáF9Ríc¸I>‘jÃr¦*LU˜ª0UeªÊT•©*S5¦jLÕ˜ª3UgªÎTƒ©S ¦L5™j2ÕdªÅT‹©Ríc¸QŽTûn”#Õ>†åHµá&ùDª} 7Ê™ª0UaªÂT…©*SU¦ªLÕ˜ª1UcªÎT©:Su¦L5˜j0ÕdªÉT“©S-¦ZLµjÃr¤ÚÇp“| Õ>†åHµáF9Ríc¸QÎTA¹hòrlÛö+l\l®§Cãòîz½¨§Cÿær ó;Y\t¾ð<ÀI”¿^´’+Ë寗­äÂrgy¡üõr •œ©&S-¦ZLµêÝr •©Þ-ZÉ‘êÝr •©Þ-ZÈ'R½[´’3UaªÂT…© SU¦ªLU™ª1UcªÆT©:Su¦êL5˜j0Õ`ªÉT“©&S-¦ZLµ˜j!Õ»å@+9R½[´¤z·h%GªwËVr¤z·h%gªÂT…© SU¦ªLU™ª1UcªÆT©:Su¦êL5˜j0Õ`ªÉT“©&SM¦ZLµ˜j!Õ»å@+9R½[´¤z·h%GªwËò‰Tï–­äLU˜êëå@d–r·è|áõÀg^N½Óß>Î|ôžøØvžøÄã¶¿ Þ¶Ê‹÷òêêÓÔdÿkeûmó(»¸ð³åHµÏlF9S¦*LU˜ª2UeªÊT©S5¦jLÕ™ª3UgªÁTƒ©SM¦šL5™j2ÕbªÅT ©öÊPŽTûÌf’¤Ú¯úPŽTûÌf’O¤ÚÊ™ª0UaªÂT•©*SU¦ªLÕ˜ª1UcªÎT©:S ¦L5˜j0ÕdªÉT“©S-¦ZHµÏlF9Rí3›QŽTûÌf”#Õ>³™ä©ö™Í(gªÂT÷oQµ1M;Ž™Ìþ‚{Ì9..¼žÉÈå™Íûá«Å>_Ÿ>œŸözÖé¬îÑ:]xº½¾Û£µ;Ë åw{´rcy¢ünÖB®,”'SM¦šL5™j1Õbª…Tï÷h-äHõ~Ö_ç©ÞïÑZÈ‘êý­¿Î'R½ß£µ3UaªÂT…©*SU¦ªLU™ª1UcªÆT©:Su¦L5˜j0Õ`ªÉT“©&S-¦ZLµêý­…©ÞïÑZÈ‘êý­…©ÞïÑúë|"Õû=Z 9S¦*LU˜ª0UeªÊT•©S5¦jLÕ™ª3UgªÎTƒ©S ¦šL5™j2ÕbªÅT‹©R½ß£µ#Õû=Z¤z¿Gk!Gª÷{´r¤z¿Gk!gª¯÷hÉËý­Ó…×ã!½<³yÿÎþjiÐ×§öooÒ:½—ÕMZ§ ÏœDùÝ&­…\Y(¿Û¤µ Ëå…ò»MZ 9SM¦ZLµ˜j!ÕûMZ 9R½ß¤µ#ÕûMZ 9R½ß¤õ×ùDª÷›´r¦*LU˜ª0UaªÊT•©*S5¦jLÕ˜ª3UgªÎT©S ¦L5™j2ÕdªÅT‹©S-¤z¿Ik!Gª÷›´þ:Hõ~“ÖBŽTï7i-äHõ~“ÖBÎT…© S¦ªLU™ª2UcªÆT©Su¦êLÕ™j0Õ`ªÁT“©&SM¦šLµ˜j1ÕBª÷›´r¤z¿Ië¯óTï7i-äHõ~“Ö_ç©ÞoÒZÈ™ª0Õ»MZ`–r¿IëtáyâóXåxšøÈ1îéœïþé·¯OxúáåW>~úúôååÍO¿~ýåׯ/oÿøéóÏ￾}ê{ÿ8?kÿÜLâ⃾\~ºo“ÇÑ>¯>Ùómž³¼P.“åÆòDùþ}åÊò@ùþ}åLÕZ5·1ôê/Ï9/”ûd¹±H>‘jïû@9S¦º;ЊJK%wDÚ?Êßo\jÔÕu×?׋³W÷¿TÏ?Ö~äó—ï?|såØ¿I„äó åé}¼ºøta<ÊØ[WüíEoA¹°ÜY^(ßïPn,O”ïw(W–3ÕdªÉT“©&S-¦ZLµjoA9RíM"$Hµ7‰ ©öT‰ä©ö&”3UaªÂT…©*SU¦ªLU™ª1UcªÖª¾mes%÷Árey <6– Ëå…òœ,7–3ÕbªÅT ©ö&”#ÕÞ$‚r¤Ú›DPŽT{“É'RíM"(gªÂT…© S¦ªLU™ª2UcªÆT©:Su¦êLÕ™j0Õ`ªÁT“©&SM¦ZLµ˜j1ÕBª½IåHµ7‰| ÕÞ$‚r¤Ú›DPŽT{“Ê™j¯°±ý[ šÔ»DfVÚÕ‹á¹ùÅ0)/Îu•ÇùÇ0i<¼ûÇן:Í„ìQÇVešïãÕŧ ó±rì/Ø]..<ÏoË•åòýë?Ê…åÎòBùþõåÆr¦šL5™j2ÕbªÅT‹©RíiQŽTûDZ’¤Ú'Ò¢©ö‰´(Gª½2 åLU˜ª0UaªÊT•©*S5¦jLÕ˜ª1UgªÎT©S ¦L5™j2ÕdªÉT‹©S-¤Ú+“PŽT{eÉRí•I(Gª½2‰ä©öÊ$”3UaªÂT…©*SU¦ªLU™ª1UcªÆT©:Su¦L5˜j0Õ`ªÉT“©&S-¦ZLµj¯LB9Rí•I(Gª½2 åHµW&‘|"Õ^™„r¦*Lµ‡I*{Þ'‡€IÍ1L¶miW^O“êâDZyÞ‚2ö»Ïùðî·«qR¯ªý÷”³.ÞÉ««Oîguÿ‹¾M½¸ð<ðq–Êû>Éå‰ò~…Orey ¼_ᓜ©&SM¦ZLµ˜j!Õ^=„r¤Ú«‡H>j¯B9RíÕC$ŸHµW¡œ© S¦*LU™ª2UeªÊT©S5¦êLÕ™ª3Õ`ªÁTƒ©SM¦šL5™j1Õbª…T{õÊ‘j¯B9RíÕC(Gª½zˆä©öê!”3UaªÂT…© SU¦ªLU™ª1UcªÆT©:Su¦êL5˜j0Õ`ªÉT“©&S-¦ZLµ˜j!Õ^=„r¤Ú«‡H>j¯B9RíÕC(Gª½zåLµ>‘åHµO¤E9RíiQŽTûDZ’O¤Ú'Ò¢œ© S¦*LU˜ª2UeªÊT©S5¦êLÕ™ª3UgªÁTƒ©SM¦šL5™j1ÕbªÅT ©ö‰´(Gª}"-ÉRíiQŽTûDZ”#Õ>‘åLU˜ª0UaªÊT•©*S5¦jLÕ˜ª1UgªÎT©S ¦L5™j2ÕdªÉT‹©S-¤Ú'Ò¢©ö‰´$HµO¤E9RíiI>‘jŸH‹r¦z |jÛ6Ð,åø¤m[E\\xøÄ<–B>·qÏ~—=Þ}û§—7þõ×§ÏÿëåÍŸÞüû¯ïÿ~õÓnb«ªaàåú‹!C™lÛþšë⺫!Êå‰òþ1"É•åAò2 \Xî,Gª=d@9Rí!É'Rí!Ê™ª0UaªÂT…©*SU¦ªLÕ˜ª1UcªÎT©:Su¦L5˜j0ÕdªÉT“©S-¦ZLµjPŽT{È@òT{È€r¤ÚC”#Õ2 œ© S¦*LU™ª2UeªÆT©S5¦êLÕ™ª3Õ`ªÁTƒ©&SM¦šL5™j1Õbª…T{È€r¤ÚC’¤ÚC”#Õ2|"Õ2 œ©Š>ºõ3#É=zÏ6ñý²«r½¦D.Î7Öçó=þ1ô?~~úñéóÓÇïÿø…?&ýÆŸÌúÐ(Ý6»øh¿_}z¾ÿUòý*µyqÕùe½°|ÿ«äû¿j5¯þÎy¡¼¿ì“ÜXž(ï/û$W–ÊûË>É…åL5™j1Õbª…T³HŽT³@>êqöÉ‘êqöÈ'R=Î 9S¦*LU˜ª2UeªÊT•©S5¦jLÕ™ª3UgªÁTƒ©S ¦šL5™j2ÕbªÅT ©g©g©g©g€|"Õãì’3UaªýTu<ürù…v?ÅÇó“/ÏW]ß3èÅ1–ú|Œåþãå“·7^{)w?§¼½ùg÷ Ç7ùmæóâ#¾\ºÎG=/à?_wþQI¢¼Irey ¼Ira¹³¼PÞŽ$9Su¦L5˜j0ÕdªÉT“©&S-¦ZLµêñèH’#ÕãÑ‘ Hõxt$É‘êñèHO¤z<:’äLU˜ª0UaªÊT•©*SU¦jLÕ˜ª1UgªÎT©S ¦L5˜j2ÕdªÉT‹©S-¤Ú7I(GªÇ£#IŽTGG’©ŽùDªÇ£#IÎT…©îßl³mÓLrWq<:R¼ªl\\7Çvq›dç³éóùl‘úðî_>ýüôòÖÓoïþå§W¿ÐwJž¾¼}Ô{ñj¿e3‰‹òrùÛëúÛxͲ‹ëN¯¶úÛ8ÉåýmœäÊò@y'¹°ÜY^(7¦jLÕ˜ª3UgªÎTƒ©S ¦L5™j2ÕdªÅT‹©RíS˜PŽTû&”#Õ>… åHµOa"ùDª} Ê™ª0UaªÂT…©*SU¦ªLÕ˜ª1UcªÎT©:Su¦L5˜j0ÕdªÉT“©S-¦ZLµjŸÂ„r¤Ú§0‘| Õ>… åHµOaB9RíS˜PÎTû®ÎöÜSÉQßÕ¥ŽmÛ¿„_\7ÇxsAïÉó‹C˜ì÷=yãáÝ{úû¯?½ÿüò O¿ýòùéË—Ÿ>¾½“냷œUû«ò‹wüò.Þ^—Û£þ±ÜítÝÛ?ž>áåÎòByM–Ë“ä}Â3Ê•åòTû„g”#Õ>á™ä©ölåLU˜ª0UaªÊT•©*SU¦jLÕ˜ªµêïëþ:÷Árey <6– Ëå…òœ,7–3ÕbªÅT ©ölåHµg (Gª=[@9RíÙÉ'RíÙÊ™ª0UaªÂT…©*SU¦ªLÕ˜ª1UcªÎT©:Su¦L5˜j0ÕdªÉT“©S-¦ZLµjÏPŽT{¶@òT{¶€r¤Ú³”#Õž- œ©{ñö¿ #È-úm+žmÛþ•äâºýæíÍýã¼8îÇ~ß‹çýQþûÇ¿ýíË×ÿuû)ñí×>¿ n¿ðç‡cÅhjUØÕ‡{y§ëäqÿÞ²§›^\w~eï{îÛ–²T©}¢ÚP¤ŽjEu:7T ª‘e"ËB–…,‹XöZQRË^) êA,{(©‰e¯õ$–½F”ÔÈR¥ KA–Š,Y*²TdiÈÒ¥!KG–Ž,Y² dÈ2e"ËD–‰, Y²,bÙKAIM,{!(©‰e/%5±ìE  žÄ²—€’Y ²ìY¿ì¯æ7Mò¸Rhµ¿œs^\wýr¾.ŽÖ°ß·É…ù—þ¯/o¼zû…ãu|¯®™ûo:¶¼ø8/ïâíuý‡¹íõÕuçuËå…r,7–'Êm°\Yýp ýoiÿÀù¯sßX.,w–Êc²ÜXž(ÏÁre9S-¦ZLµ˜j!Õ>¥åHµO)$ù@ª}J!Ê‘jŸRˆr¤Ú§¢œ© S¦*LU™ª2UeªÆT©S5¦êLÕ™ª3Õ`ªÁTƒ©&SM¦šL5™j1Õbª…Tû”B”#Õ>¥ä©ö)…(Gª}J!É'RíS QÎT…©ö"Í©{Qä–åØy×KAs»º¥šCß^¶(y^¡½ ôÛOŸ~úòòæŸ>¿¼ñ݇ï~úðéïŸßÿòó뱩œ)Û¦áä彜®³G7¯ ¿úäÞþIýk&É÷¯™(W–Ê÷¯™(–;Ë åû×L”3ÕBª½4åHµ—¦’| Õ^šŠr¤ÚKSI>‘j/ME9S¦*LU˜ª2UeªÊT•©S5¦j­Û˜¥+¹–+Ëå±±\Xî,/”çd¹±œ©S-¦ZHµ—¦¢©öÒT”#Õ^šŠr¤ÚKSI>‘j/ME9S¦*LU˜ª0UeªÊT•©S5¦jLÕ™ª3UgªÎTƒ©S ¦šL5™j2ÕbªÅT‹©Rí¥©(Gª½4•ä©öÒT”#Õ^šŠr¤ÚKSQÎTûî@cÛdGkSçVå[]\·ß޽¹ 惷»c??ýøÃw¾{{—»¿Nɨý…ö´‹‹Žçcîßßó<#Ùo`MrÛ?±qqáénz¿%ù~‹ra¹³¼P¾ßÀ¢ÜXž{¾‹í+VòýåÊò@¹n,–;Ë å6Yn,gªÎT©:S ¦L5˜j0ÕdªÉT“©S-¦ZHµ{‹r¤Ú½E9RíÇÞ¢©öy~$ŸHµ{‹r¦*LU˜ª0UaªÊT•©*S5¦jLÕ˜ª3UgªÎT©S ¦L5™j2ÕdªÅT‹©S-¤Ú ÊPŽT{AÉRíe(Gª½  åHµ”¡œ© S¦*LU™ª2UeªÆT©S5¦êLÕ™ª3Õ`ªÁTƒ©&SM¦šL5™j1Õbª…T{AÊ‘ªnHURÕTu UHU'RÕ‰T•Í–”Í–züYû·¿ãÔ?2jìù§eU¹\]8G\Ì?çÛ-üÇüóã§¹¤Êf-œ‹2}€Íb¸*#«2²*#«2º*£«2º*£«2¶*c«2¶*ã«2¾*ã«2±*«2±*«2¹*“«2¹*S«2µ*S‹2}†Ìb¸(£«3]èê @Wgº:ÐÕ€®Îtu «3€c€4uc ˜Õã£Øým\]¶¿¿éÛ#c>ÿúñ¼z®p<¶ý?>..¹}B~¹xnô&É;åÅ…ç!’²þý4Èšfu{¨ÍùÚãsëÏSÓ~,ü¶ÿ¦<åâÂóÀ¬PÞ…'¹±Øy„h,O”ï·˜(W–Ê÷[ÌÙî/.–ra¹³¼P®“åÆòDù~‹‰rey Ü™ª3UgªÎTƒ©S ¦šL5™j2ÕbªÅT‹©RíeŽ(Gª½Ì‘ä©ö2G”#Õ^æˆr¤ÚËQÎT…© S¦ªLU™ª2UcªÆT÷[Ìã›|š.å…rŸ,7–'Êc°\Y(ßo1Q.,gªÉT‹©S-¤ÚËQŽT{™#ÉRíeŽ(Gª½Ì‘ä©ö2G”3UaªÂT…©*SU¦ªLU™ª1UcªÆT©:Su¦L5˜j0Õ`ªÉT“©&S-¦ZLµj/sD9RíeŽ(Gª:ª¤ª©êDª:‘ªN¦*Lõ˜8JU?Rxy´wŒe¿Ê-/.Ûo9.ÆùöäÄcÜøùë§qã|4ý}˜vºê÷ç|ÌˇjŒšÛ6ú9§ O7Ó½²ä½²–äÆòDy¯¬%¹²«¹{Fðù²)u1>§Ç^ôøèo?9ÍwòÕüètÕó"½«q}›"sÛö—øž‡9Êò@y߸\Xî,ßÿuÙ_”º¬ä}CCrcy¢¼oqH®,”÷MÉ…åÎr¦êLÕ™ª3Õ`ªÁTƒ©&SM¦šL5™j1Õbª…Tç†Tç†Tç†Tç@ªs Õ9êHuN¤:'R“© S¦*LU™ª2UeªÊT©S5¦êLÕ™ª3Õ`ªÁTƒ©SM¦šL5™j1Õbª…TeCª²!UÙªlHUR•Te U™HU&R•ÉT…© S¦*LU™ª2UeªÆT©Su¦êLÕ™ª3Õ`ªÁTƒ©&SM¦šLµ˜j1Õbª…TuCªº!Uݪ¤ª©ê@ª:‘ªN¤ª©*›-Ývàú¶Y^M®þ|ºwÛ„ûÇ‘¼¸pêÅ™>ß øùëßøúþë‡OOsÇ>ô}ɲí÷÷WÞ>³íòY#ùX²·±‹ ÏøÁrey |ÿf¾ÿ¿Û¦®K¹°ÜY^(ß¿™£ÜXž(·Árey Ü™ª3UgªÎTƒ©S ¦šL5™j2ÕbªÅT‹©RíÕk(Gª½’ä©öª6”#Õ^á†r¤Ú«ÝPÎT…© S¦ªLU™ª2UcªÆT©Su¦êLÕ™j0Õ`ªÁT“©&SM¦šLµ˜j1ÕBª½åHµ×ã‘| Õ^›‡r¤ÚëôH>‘j¯ÙC9S¦*LU˜ª2UeªÊT•©S5¦jLÕ™ª3UgªÁTƒ©S ¦šL5™j2ÕbªÅT ©öJB”#Õ^Uˆr¤Ú+ QŽTu UHU'RÕÉTÙléxqŽmìw¢hþÖ“AM¯*»yí/ôoüÓ·ßüóþßÿ ï/±C endstream endobj 2783 0 obj [ 2782 0 R 2784 0 R 2785 0 R 2786 0 R 2787 0 R 2788 0 R 2789 0 R 2790 0 R 2791 0 R 2792 0 R 2793 0 R 2794 0 R 2795 0 R 2796 0 R 2797 0 R 2798 0 R 2799 0 R 2800 0 R 2801 0 R 2802 0 R 2803 0 R 2804 0 R 2805 0 R 2806 0 R 2807 0 R 2808 0 R 2809 0 R 2810 0 R 2811 0 R 2812 0 R 2813 0 R 2814 0 R 2815 0 R 2816 0 R 2818 0 R 2819 0 R 2821 0 R 2822 0 R 2824 0 R 2825 0 R 2827 0 R 2828 0 R 2830 0 R 2831 0 R 2833 0 R 2834 0 R 2836 0 R 2837 0 R 2839 0 R 2840 0 R 2842 0 R 2843 0 R 2845 0 R 2846 0 R 2848 0 R 2849 0 R 2851 0 R 2852 0 R 2854 0 R 2855 0 R 2857 0 R 2858 0 R 2860 0 R 2861 0 R 2862 0 R 2863 0 R 2865 0 R 2866 0 R 2867 0 R 2868 0 R 2869 0 R 2870 0 R 2871 0 R 2872 0 R 2873 0 R 2874 0 R 2875 0 R 2876 0 R 2877 0 R 2878 0 R 2879 0 R 2880 0 R 2881 0 R 2882 0 R 2883 0 R 2884 0 R 2886 0 R 2887 0 R 2888 0 R 2889 0 R 2890 0 R 2891 0 R 2892 0 R 2893 0 R 2894 0 R 2895 0 R 2897 0 R 2898 0 R 2900 0 R 2901 0 R ] endobj 2781 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 2783 0 R /Contents 2902 0 R >> endobj 2903 0 obj 15496 endobj 2905 0 obj << /Length 2906 0 R /Filter /FlateDecode >> stream xœÍ”±NÃ0†w?ÅmÀ€9ŸãØ^‘‰© U‡¨@ꢯÏ9NEèe¸óŸ»óçüŠBòs™ƒk”tÎÃ&ŠÃ +°º$ƒ²!ƒ¨A5’ D¨%»Ü3Jè˜q¨jyýOb/îÄjÍ5Ï€Ü÷-ðÄð~ÔƒXŽØ†ÎçÄ7&ÔˆÒÍpYl­•85¾£‹ÆJ™˜_U ÓeÙ¥RÊ J<‰Œˆñÿ/zô|–pƒÝ3b›:M™+wµ‰Õ´×A\Ýj †~òÞCxý½Œ’"z¤$9ËyÛBˆ°:_té%,Òû6u1¾¤³ˆÝþ«Û]¬!Ü‹›Ð#üt^â® endstream endobj 2904 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 2905 0 R >> endobj 2906 0 obj 260 endobj 431 0 obj << /Type /Action /S /GoTo /D [2907 0 R /XYZ 72.0 769.889 null] >> endobj 435 0 obj << /Type /Action /S /GoTo /D [2907 0 R /XYZ 72.0 740.03 null] >> endobj 438 0 obj << /Type /Action /S /GoTo /D [2907 0 R /XYZ 72.0 611.229 null] >> endobj 441 0 obj << /Type /Action /S /GoTo /D [2907 0 R /XYZ 72.0 382.592 null] >> endobj 2908 0 obj << /URI (http://www.refman.com) /S /URI >> endobj 2909 0 obj << /Type /Annot /Subtype /Link /Rect [ 415.925 672.729 494.021 681.729 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2908 0 R /H /I >> endobj 2911 0 obj << /Type /Annot /Subtype /Link /Rect [ 499.377 672.729 523.277 681.729 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2908 0 R /H /I >> endobj 2912 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 660.729 192.2 669.729 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2908 0 R /H /I >> endobj 2913 0 obj << /URI (http://www.endnote.com) /S /URI >> endobj 2914 0 obj << /Type /Annot /Subtype /Link /Rect [ 211.827 660.729 247.377 669.729 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2913 0 R /H /I >> endobj 2915 0 obj << /Type /Annot /Subtype /Link /Rect [ 254.69 660.729 354.13 669.729 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2913 0 R /H /I >> endobj 2916 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 555.928 143.61 564.928 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 444 0 R /H /I >> endobj 2917 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 533.969 144.274 542.969 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 489 0 R /H /I >> endobj 2918 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 488.01 143.399 497.01 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 871 0 R /H /I >> endobj 2919 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 454.051 144.44 463.051 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2165 0 R /H /I >> endobj 2920 0 obj << /Type /Action /S /GoTo /D [2904 0 R /XYZ 72.0 769.889 null] >> endobj 2921 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 408.092 143.797 417.092 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2920 0 R /H /I >> endobj 2922 0 obj << /URI (http://refdb.sourceforge.net/doc/tutorial/index.html) /S /URI >> endobj 2923 0 obj << /Type /Annot /Subtype /Link /Rect [ 292.473 327.291 354.273 336.291 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2922 0 R /H /I >> endobj 2924 0 obj << /Type /Annot /Subtype /Link /Rect [ 362.183 327.291 523.273 336.291 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2922 0 R /H /I >> endobj 2925 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 315.291 163.06 324.291 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2922 0 R /H /I >> endobj 2926 0 obj << /Type /Annot /Subtype /Link /Rect [ 184.835 293.332 257.543 302.332 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 148 0 R /H /I >> endobj 2927 0 obj << /Type /Annot /Subtype /Link /Rect [ 264.151 293.332 373.571 302.332 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 148 0 R /H /I >> endobj 2928 0 obj << /URI (mailto:refdb-users@lists.sourceforge.net) /S /URI >> endobj 2929 0 obj << /Type /Annot /Subtype /Link /Rect [ 138.239 259.373 183.219 268.373 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2928 0 R /H /I >> endobj 2930 0 obj << /Type /Annot /Subtype /Link /Rect [ 189.238 259.373 352.308 268.373 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2928 0 R /H /I >> endobj 2931 0 obj << /URI (http://lists.sourceforge.net/lists/listinfo/refdb-users) /S /URI >> endobj 2932 0 obj << /Type /Annot /Subtype /Link /Rect [ 498.845 247.373 523.275 256.373 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2931 0 R /H /I >> endobj 2933 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 235.373 175.987 244.373 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2931 0 R /H /I >> endobj 2934 0 obj << /Type /Annot /Subtype /Link /Rect [ 181.481 235.373 383.701 244.373 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2931 0 R /H /I >> endobj 2935 0 obj << /URI (mailto:refdb-devel@lists.sourceforge.net) /S /URI >> endobj 2936 0 obj << /Type /Annot /Subtype /Link /Rect [ 139.772 201.414 185.862 210.414 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2935 0 R /H /I >> endobj 2937 0 obj << /Type /Annot /Subtype /Link /Rect [ 193.414 201.414 357.594 210.414 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2935 0 R /H /I >> endobj 2938 0 obj << /URI (http://lists.sourceforge.net/lists/listinfo/refdb-devel) /S /URI >> endobj 2939 0 obj << /Type /Annot /Subtype /Link /Rect [ 212.347 177.414 297.525 186.414 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2938 0 R /H /I >> endobj 2940 0 obj << /Type /Annot /Subtype /Link /Rect [ 304.844 177.414 508.174 186.414 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2938 0 R /H /I >> endobj 2941 0 obj << /URI (mailto:refdb-cvs@lists.sourceforge.net) /S /URI >> endobj 2942 0 obj << /Type /Annot /Subtype /Link /Rect [ 139.463 143.455 177.223 152.455 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2941 0 R /H /I >> endobj 2943 0 obj << /Type /Annot /Subtype /Link /Rect [ 184.466 143.455 340.316 152.455 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2941 0 R /H /I >> endobj 2944 0 obj << /URI (http://lists.sourceforge.net/lists/listinfo/refdb-cvs) /S /URI >> endobj 2945 0 obj << /Type /Annot /Subtype /Link /Rect [ 281.35 119.455 358.543 128.455 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2944 0 R /H /I >> endobj 2946 0 obj << /Type /Annot /Subtype /Link /Rect [ 366.034 119.455 523.274 128.455 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2944 0 R /H /I >> endobj 2947 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 107.455 157.76 116.455 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2944 0 R /H /I >> endobj 2948 0 obj << /Length 2949 0 R /Filter /FlateDecode >> stream xœÍZYsä¶~ׯà[´U»X<@ú)qÅv*å$>”Ä)Ûf1ÍÊ¿> 4€$$¯ßÖ[e¡èƇ8¿ÞÅ…ïÔŸ"IQ”QÝÞýjøqÄY”䆕Q’²ŒÒ$ŠS²¨Ö¬,j”Œ×`K þ¬Æ}‰þ{×ÝÑè«»†1Lj‚Ü펾 \«úþî[Ï73ÚŸ’¾‡ ¥¤øôüv½ÀœsB· ¯Õ$ÈjT]+G¶$ZYqpø÷E—éÎcŽè²æŸŒs4:ß}þp÷þKð‰F'·£8#<ŽË’—%t‘‚•ê?=´Ñ÷Þü=üýP¾|2“Û§ S~Ù9'K3ÔÌVS§‹ +8¥4ÏqÂß âTÕ§­Ìæ0j8£J8 ÌZCÆI–å*b1jˆIô8ýõóHvQuó4^DÓ, Ï¡%H‹¨`¤,@ /Œ#¨ãM”pRF÷r´ÍʶNƒŽÝmûÚSuh\'LJ ¢«Ãû~Nÿ±ÙjtC§¾oåäDÝØÌ,Äw>ä¡‘ýy¨®—g×}½6²®&Ùw?eº‰Ät©”ñ”“4ºÅð¤E²r²•M5Xú:×^ÏéSïú¾ÿê_¿µÔ>qÁö×ÕƒøÁRǾž[ÑMÎx#þÍD’4!%KË‚ór?¥ï¼õ@ñT]uÃ6ŒÊhYæ4 Å ÿ¸ã$áœÆiœïÅ.Ótýìýû}äcšo†Þn7¹ÓV©ûv#Ã~ˆVäeýy7ŽŽ/ýÜ}ð†^!Ýû¡~÷³kWž–çq­×å|ß³ ‰ü§¦qt'|Cµ€ Vvž3ƒ|’8 O…) å8@q¾ÄaçYÕ‡3àed¦ 'vt©žD(„¼$œ–PBå*íàÆà—ì“=Q[^gÝNÔŠy … \rl/Û`¡çÑõéUÇærÔ!…'å^Ù2]OÙ@,õ€i„ »žÖŽšzÛlúþÑ ;Ç4-í_æÑK-m Âe¼ بŽÇ¨Wà7ÁÑô$ ŽŠ ÆüSˆ‰›ªÚzDBY°·•Ä És®ni| "T=éBÒÔ}{ÉE jŒiEW˜Íªi6²jvÕˆ'¬"Ž$+[y#à$£ë®¬³¶ÒQÄx‘W;JŸ-Ä_VÞŒÂóú4p‚IJÍTÍ©úΦ9S—·ìÔ<‘³Ô<òÉ2¢Þ(„º¥·;Éól± ¹'Ù8ª8QwØÑrLÐgäBÄ ¤ g ÛÇÀáö¹ž $Q+Ú~¿…0 ÉJ’3sZe TÄ<ºÏö Àá2TrʲNl·B%³%—2^pDBN·­<Û¥÷ˆ•ðäõ´ýQžžíë&aŠB”3õ¤&QbtÙ“kã‘ãèÿY7¡Š(QÅÀ*êô(õ¢‹ÛÒÔy¥ð¸0–âZ•.uS;TâÓÅJXhÔA½zÆ%&Ž•t°¨I}˜öa¶²­<_,q˜}ÅX]XChêRÕ°|ˆÉ&" Î#ÈÅ~£º‡þ$Ǥÿ@­—ƪôLáz›¼„D_΄à³Sç¹w×y¹Æü#)ƒš±¤ÉRG`ÚªÎ^-ÃëSeN#T/蚉…ƒnšlÓííÝæ”r¸+sðÀ"ª™U¬–juuÛf "¦, è°âÛ›>+)‰ KÊmsÓh9È»£˳ ˜ÞC4Þ/îžUÒŒm´ÁÈej·ÞÑHÕÝŸgy@lûTP¦$Q÷ò2)£#Ü=¶äPqÇꯊVÅÐMÂVõb©G_tçFŽ—&¦\KRs™ø¦æ®Ê9È>ÉQ?Ò,7Û畘‘"l-iH³]p¾ô­¸Â%j÷F“‘,eˆê{%N~÷¸S2gêRR†¬¿¶äÛÇ>“ŒÇ°™Ó€¢í²%ö(}Ñ®sØH@e$ÝKò¼ í DhG¢·Àª áÊ&\¼FUp<£IÒœÒÂÁrZ”»…k S)Y€â Žä;•r[<ŒázÈâRÝPù^ÎYÛ­`ÌÁWïzù^®…Zkê?óÌþ¹QB¿³˜°‰HB D‚ÒýsàxR¨ç½ò5ו3æ ÊGÙ’À.GDZ»zž—c=ÞðÉ_˜f` VWn™—êþH؇äN/ØpÄq–S©ZÝØ=Ú”ÀFq•µ×yúÖQÛ»ó"ãÚÃÜu&bÈøuƒ4¯~ÈùÏ5©ìžÄsR¤¤cû€`Ž"—°õ@F`$U·kˆDšhBJµÑà8Þë²’»´¦%I VÄ .S¹úÿ Þ¿¼åõ"£¨P[nkcYqFheEþÊDôòasœc=H]!Ë >”™îЛrÆ‹G:ýÕV p×*–kŠ!Ü=Å0þ5Š¡–w?C.³Xz{Í]É×Jß~=Nµê÷&emù–O¦÷$^˜M %ÝDb™‡ú~Sêã/¢žˆÇ²ièå¸HCç7d"ì-õ=®{k^z:l ö8Èä#Ku¡º×êÉîªr€š"]y'ùÇ¡0´{Ó$'1_Ògd»[À’ÑD}{}2S¿_Áœ²€J•GyÕ:éȾo9K Ë“’sš­á-ßNÞÒ eeê^T?íŠ3šÆT}ñ€˜gn_žÁ$¤NR\Øý8hË bÐYf!;hSêsªú€þªó>´!Çåµ&Q ‰¿=XX?Ýãµ!Ç«œüð›w$ääKvU+~zXQÈŵ‹f¿f\[˜¦Tw<@£úQzŒVŒ£ý<Ьï½ÓذãLÛ Rƒ¨Žïú®yv¬%{Q_%^Gï‘SúÙôçÒwç>ø™ÃöYÇ`ƒ1Qîc%‘\!².£¶y%X’áÇ«½?6e=6[Œ„k—½¨î•zÂûljÊ/€œ< …çÀ` Ü9ýH$€ª‚çê]Àx/µÝzE©~­>'¡Ñ éÖЧn»§ýKUöÔK(céò.kß ræNlÕvU4y˜ÏKsêgRãBbRçÌ}†c‘-÷5±¬°jÃηíåµ XÙjil»5ÓüÀAÛP† y{hDûÖ* ½¦æëùßÌW<Ʊ†žGKh‡°‰‘tÓ{À42½fê¤t~zC,ãoý ¶£þ¬gt9µæn«kž=@ÎIž+|\üt0m-©ß? ,l ©¼ó~•øíÝÿô,‹¾ endstream endobj 2910 0 obj [ 2909 0 R 2911 0 R 2912 0 R 2914 0 R 2915 0 R 2916 0 R 2917 0 R 2918 0 R 2919 0 R 2921 0 R 2923 0 R 2924 0 R 2925 0 R 2926 0 R 2927 0 R 2929 0 R 2930 0 R 2932 0 R 2933 0 R 2934 0 R 2936 0 R 2937 0 R 2939 0 R 2940 0 R 2942 0 R 2943 0 R 2945 0 R 2946 0 R 2947 0 R ] endobj 2907 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 2910 0 R /Contents 2948 0 R >> endobj 2949 0 obj 3217 endobj 2951 0 obj << /Length 2952 0 R /Filter /FlateDecode >> stream xœÍXIoÛ8¾ûW=5@­ŠÚÕ[ÓvŠÌt¦HcÌš"-Ú&ªÅÑ×ÿ~>.’([væ0‡´@M>¾å{ ߣú8£ÄÆß¹ø‰Ï¾ÿOJlÈígöåRÕÝìÖÀ¦°~IøL„®m[ÑËx;Np†–}œx©ÆU4P”Fq4r¼UVFåú= Ù>AlOG´Ëù‹g“Íìz1{û0Ùd±nTZ!¥qÆ1Ž¬È‰Å‡,ròýµãEW?Èâ÷Ù§ÅTż÷N‹Å¸„TÛ¨•öß%އþ!¼…Á&µœ(´m;”ó¶É®a¡E¾±5«X±b$Mšd™ÔLÅÅ÷©E=_*ù”Õ|S(>ÿ‰à{ #Ë ü0ô”ØbËkrEœŽ¿®ÙªáeÑï7ü‰ §ÉpP>±ê‰³ýˆÐoš-ë× ÖÀ·žäªz‡{9íxOØófÛoþ<ÜÝ~€ÕÓ¦§c‡(ÄöQj¸Ã* ¢sêFVLfìê$7·½SAư۴5K­Þm›‘âÛÊÔ<¸Ý‘X±á«ß¤$k¶e»9¯6eMÂ3TžÌs¾FÀOCmç82eÎöÛ¤±ˆ¬”=Ï2²d$g…¨8º‡Œ$»]Uî*ž4ÌšP‹[àEPÅAWv® Ü?¶¼bBcÝÑd™ÈU30±‘û‚­X]ó6;’@ÛK&ËŒõ÷[¾Úv›m™¥g tkáŽÌŒÜ%EzÞÄ„¿n#\n?Vþ*󫪬ëùPì° w”«»ºh"ªƒÈöa[!ÞãÞAƒÈ¢ÍÃsµz4 *2¤•‘æ!G<× hìZ¥ÐxCZ”¬V´* TRQ ¨d]fY¹çņŽ9/Öe•'²c$˲m$S—¥wÚºôFúcšv€ØvaÚtE•(£ô04â8Ñ¿,Ǻ©œÊBÜUXC_ÆW bƒ*FÊ%!µ.#õEç‡åÐŽ ¤h5´žA8G2gÑj=¤hó%êíÄáÎ…À¹ìæ°cg0ÇÁ˜ß„Œ†·ªø’)ÌBI‡´C>´ªºÉ¤,ðOÏøªâõ¯WD(kw»²‚—‘»4Â’Øw è*0xÆ×µä¤ ÏYÝ$ùNB` Y®`º”½«y!Xt¨ŸÁè;VŒ«Cí®QJŒy‰Îz¸„1ðŽäN1¶»TæzŒ“‰ {‚u››ëè.Òì{xwD¾×÷gÜ;¤Õçš‡ç Æ]hB_=%ÐûºÖØï̃í@Îq ÎHÈ p*aÌEPY­E[ %˜TÝzÍ™yÔ ÍX êÚ‚?¶Ã¶)@Å@6Ÿ+Š‚Â¯§ƒÀs½£ ¼EÙ5!†iÚìêφªžžž‹‰”¡°©Y2—úóªÌÚ¼¨/÷`Á „bêè+/ÿÀÓéÚõðlóëŒÏñ‘LØé=OÅ#¡¯&ưAãÌÐ «A¯u‡cÒ6¥˜<+$ù07¸&•¼;=ii)T¥3¡½nÊÊÔ‘xÃÇKiŒ„\ß|¾ùkAž’ a¸õ§ÏŸ¾á3ž«¼a÷W—»Š/¾b7Ž0™ÍŒ¬ û“¦Óâ£ÇB:-”Z‘vL-“~%jm.ÚqÆ¥£šÚ%PKšùS$•>µ²§Ù‹~©sgõ„›u¿Åß­OÈli[6‚û¦ßáëèãõDF¼è(ò±ªÚ9IˆöÎðªoÿòöŠ~š¤ésßQ‰wƒÐÌÑùÉêGî‘„L/R1â§fj¹jÅsX¿¹kþkŽF_%+ñ}¨'rÞÖ¢uÑ–´Xýß'°ñ`uÏÕ/’{ÇñøÂ)¾÷×w s²„a }š0#¾¼D¯ (½hæ„ïýǿ6åå¯Û$#¸à _Ù¤!/¶Â8ƒÈ¹hè„ïý7éNÕ}YýœÔ Ç1ÀE¾Q÷ ßõÍ—/P¾Dݽ­X&,^p“6b  \±\´qÂwýõ백ǰcdY–?O3"ÿûävö/jÜ*o endstream endobj 2950 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 2951 0 R >> endobj 2952 0 obj 1577 endobj 2954 0 obj << /Length 2955 0 R /Filter /FlateDecode >> stream xœÍW[sÚ8~çWè±™Ù*’­‹õHIÉ!Álg¶éì8Fo}«/Ítý²d´³oÛò§ï;ÇçfPDàÿÑFq(gƒïûuФ‡|±_â3â#ʰÇQ†Ž—8JÍžƒïí GX¸Þ¢Ïƒ|@ÐíàËWÀ¬}¯r†¼£ZlÛàü=ÙGÐfp.o8¢…/¿±ça*%Gö=e~ 3ôåã~Ñ•ÎcÖQ=G5œè:Ùä_Qx7‡Gžû„àà½9þpd"$Ž”“Ó„êhüݬìÍ­#CN/w*G+;vdz&Ëbrh°KïÆ¸ói$$–”*%•‚[88Ê#)WƼ÷ìdñŒ]¯…U3OžÇwÎþ‹’6j4\ŽÑÓ‡Jêéâ¤>Á¾ò &¤§¨Ñ§áHŸ‹âŠ·QÙè Uo%Ü'Ã≠¯TÀ¥KÇ‚îgF(.²²5"eUlª(ë“Pß”ÃÞ€¹$,Øè~~ÓIäo-Db­×I¾éÓQsÀ£P¾KÇ‚Âémˆ&J‹^fJ,|;_¹¨mÜõ0·éè%I{C@Á’@áp(»…OÇ#`שޛªÈ“ÅI5I‘÷êKÁ‘îXÛ¸Ûñd6:×U÷R ê]ˆóÙÛ¸ $Ò È“²(× ‚ŒÊZpå¬ð:$Ì 7™/;)H$]×îÂð¼+¡Êww³šNA篢­ò(EÑK›¦½œbbZ¦Ï¨SÃÂÝݯ$ÜžH ñäÔ7ëšI•½´ŠcêsßMkáf·Ì;ÞMôw’kUM÷׆O%¦f¢Ä7[ŒB#R˜œÜ.ü46Ölᛦ¾\'5„äüå…^ï*Ü.œÂVó«I7Ú\çQÜè5zNÒô¦P‘¶çÔaØLJ/p'®[ÍWZÙ>§I½½×¢úæÂ˜MÔ)v‚úrë´~@nv,ºÍÕæ `¦™È½É`ÚúùO°÷§Žªý^´96P“Má6©QÞfæµêèG”¶lYΆÓéd>] $_›Ö k!FÝãØu dt°ÛȾ‹UWHìÐÈZÇ#;Ùôú"_GÕÏÎD¸ùRTYg3>ø‚züùóŒ endstream endobj 2953 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 2954 0 R >> endobj 2955 0 obj 1155 endobj 2957 0 obj << /Length 2958 0 R /Filter /FlateDecode >> stream xœÍYYoÛ8~÷¯àc4ŠîãµH·È¢)¶‹ES²DÛBeÉ•ädóïwÈ¡xIJRô%IÏŒ8äÌǹäü\yÄ…ß ö‘†ž“¦)«ŸBî‘Ä'A,D‘ë„~äºñBÇȘ¢ˆÔLG#ü‘‚c-ð{òϪY¹äãêÛwXSôWîÂæ|«ÛÕÍ6±è·dŸKv«÷ëÕåñ\²Þ*ˆ}ßñ’Ä…Ÿˆ¤NàgìÇ'ëùvö•niG›‚’2òMÞAûjל'ë?WÖ†çë:é[sü‹a"N’$Žkß&@HpGöÈ0ÄfñC‚àç¢ÉîÄbW7xKoƸå0Š'ñ¼,K² 9©G°ÏsófÜ›‹Ïìr˜‹º%çÃt’:Ý–›û~È»á˜ï(ºÏàSˆÅÄw-­õ¾êI^÷ys:Ю*H?tU³#wg§#ZâG)öy—íú»sR´ÍWMO†=%ü8ÂÎ#U³m»C>TmãˆÃ•ºáP_Ã0s]/ðtËiS.Û–ÎoÚ ‡ý¢Õ ”8…¢•dºÕùÎ…3æÍNcK‰›ýwU¾©éEM›Ý°-7 ÷%mG¶˜´[¾‚6CÏhôbèžž7Ûs'Nã,‹ÃX·{¨†zkH*Ke ö¶¢uÉÌ}!Âà ~ȯBvºDgbûÐÖp‘oépkÏÉE”’3Ãh!CÛÃÃEÐ5‚bÁ#H#†FÙèä¨î M98yC»‘k%U•€F†¨g[m3ôÔð2-/àR[VE^¿€i9¯;Ðn5L«¾?-Aš%–ÊR¼.ÙøQD` ôGZp矷܇8tÃÐuãÀ°|Ó¶?ž _?ð,5“Í„—ª à¬¸NË—ë’7âKƈà 3X{Ä“B²wÖc€ñ8ˆ¸@S4úqßÖÖÆÓXñÃ`ŠNUwç/@aæÅÐ Â Õ!/ªáií$¶4Ú~-Ö…#Öȉ D†§ ’˜ƒH[I(„ u¡ÌAÁbÉ<îÁýÙe*‹¤ˆã¤¸±IÞÏ`¦–ûÇÓ¦®ú=-ŸG:p3ÇO}×ó³PGzTïæá|ÏRû½Ôlòƒ,Ðòè,}'t=hjY:é(÷=˜@ûã£ÐÒc%qB3Vð>¸XF çxb"©å% dZ"«Çˆ‹GZdád×\RèÊÜÚƒN’‚Oý (&‘Áôšf®1åeÙÑ~ À4±”€Q2I5&¡c47ŸlŒ• 1ÊK9î‡hñÑ&{#µ h;Xpl›’Í1Bé4ì92œi¤ƒŒmó,³<ã·óÏëÇJ˜mãfÄÎÑ=uõ<šaà[ #š)Œî<¹P"Ê9Qºá¥ I,]H[¥ …gÒ}dLôQ¦ÐG^ /N)ËŠÃ{‡iÕC?r wL¯¹Ñ0<Çäì¯-E6ߊa Ya2Úe)áÍ;G±k]mU<ÂŽ´e²ŸÀü&ÐJýtÆø;ß.on.¯®.ù}3@Z»›Agi˜ÎAðN?^(r77ŠÞP,ú tÃØÚúå#$vdƒÌÕ•¢åîÈŽΙ2RŒˆ£é*=e”ôZ[N+ÑâV½¶™HN ‚qïÎ5šâ $P–MHú:ïseÊŠ÷t-¿ß™ …á æQ˜°‚Ù#H?TuMöyÏŠù†¿”Ãh\:„Å!½á›Ùv”šóå«;2T/êW–x±1)ö´x±ež¥*[@”̼XŒbÕ—]@hi´ÞP"2c'@Îj(~øªD[lšÈÜ~ùT ¿vA‰þ*Ž’c[±/Ä$ßáz¯/ÔíWâªÑÖ߯ƒBú¸¯ŠýÌ……™å¬Jxž]¼]«ý»«(ÌUÝPàC~<ÂmÀ„W½Gqâ:~/ô©ùÝã ÞP<ظkO»=Q²házRßÚf=7ýcšTBÌã¨×cVj­e•`V Fd•à̬B‘Uš¤?æ…΋ óø¢¤Ûª¡åÌ5e¡åô´|ñÿ|Yý×Uüá endstream endobj 2956 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 2957 0 R >> endobj 2958 0 obj 1871 endobj 2960 0 obj << /Length 2961 0 R /Filter /FlateDecode >> stream xœÍ˜M“Ô6†ïó+t ‡8’lÙÖ‘P„‚a¨(*ef¼;®ŒíÁže³ÿ>-·¬ïaHN ‡ín«eõ£ö;²¿l¡ðÿGõ§.XV×’ìúÍg¤â$/uHЬà‚Òœ°"ã‚ôÄ rT9ŽÁW þxcÁ??7Æ’_6?Á˜=¡w¿¡&_¦z¿yç¬Mû1­’ÛÍÏÛÍO/a”lo,bÎ3VUþ Rg9—ê'Ûž|üáö¦Úa×’}sn>73íÜÝO>‘íËÍó­WyNiV?¶ÂßyK„Æ©ª*£aC-ÓäƒΨ.y ]¼‹Á ðïÅ%ÓhÅÔ]pÜKfq—Û¨¬²Š1)+)áRV{}ÄûVÇ<šòâfáj]4+—Ðt©ø¢Ž©½ÙþëüpjÇ›ûqúëWü,²’p¤mÝLžÀÕœ’šãéÐ w};u;¼éÚãÞx÷Ýù`Ç«oþéú»Þøã1¹ÆÞš©ÙÛÉÞs>SkÝóCëØ§65£*/ŸÇ¾Å²Ý’sžå°ï”Õ¹!¥EFÝ`Î4)ËÜÅ,DVÒRʺ(\ÎÍÔ6iÂЗ%yã¼ô ó2ã1bŒÆè®uŠ5ÌÀêÑÖ ÑñIcÌ¢Fÿ|h»@EÖ놛qê›s7雽~ú6F]É öv8OÝ5ÄŒrøÅ- ­”.ãqVû“¦Ìàös4fØ/QÆà =ÍX7–%ŒþR3šÈm/† ]t®¶±‘£Ý1ã©€÷pk'|˜ÏmSf°~í0eCvcºƒ‘Ó4ÞNM:è+©”ú¾½ÚKÐK䬽-E&ãÞÆ¨émt×ÞÖ)ÖtzØnhëÞFÇïmŒÙÞF_÷¶v´ÄózðöôÀ&±Uâøõù{bä%»²²Êм†_áIËt7 Ð箿° œÊ q݆ZdU¼ 5Û€îº :ÅšÎ6`) ­·0f·}Í]™sjLßhn¿ÂãpŒ¡s΂âû»£šgß5ä?);/ 8AR–¹Çwlæy7îÛn8/ì€(ƒT#òY‘Ðx´¯<£ðËxc¹ú®|­¸Ê\Õ]Ù¸«£íÊ]¥]ÙPG; ‹–7G;‡*ÓzP¯s×÷²J~ûtk_c-YGJ‹\&YßÍiÒ9̓Ds`a NXñ‘ÃöЂ¾9¶è,Çv.ÑG tÖã zÁƒÎš¾ö>¼w'X±¯¾Ÿº5Ng˜ˆQ~×&ä¹Ìà'ƒ2^wævØÃ}Ó]h÷\° Qo‰vÇàºèiüz¼±,zô—êÑDìh{Ð1d£‹ÀÑ^ ±7Ûïaàœº…›„ ´Ë<(]ýÖä·go^¿v¤þÛàë2…5»=¥owÝ©ƒ3Ò·ØË:È5@•Ðú%h›¿r”ÇËmûʨïb®-_E"¿„œv¯¬Ä/öÊ^ß̰nI1ìÞãBNšùØ‹<‡×BxÛ©©×ïËoÅå£eQˆ m%.àh#ǨaŽî ]§XÓÁŽ„‚¶ŽOc=úš½vô)'ž×¦Ê¿´€Ä)§€+ÅïÂ_³Œ©Ï<%s鹯ãð]PüBæ~šÕšXî1èhpµF­Ö+ÂÑšPà1äjpdCÙã¹9ÖõÎ߉;èŠK1hA…_xCúqPGùÓŠí@%È=X> endobj 2961 0 obj 1633 endobj 2963 0 obj << /Length 2964 0 R /Filter /FlateDecode >> stream xœÍX_oÛ8 ϧÐc tšü_¾=u‡v·Ã6¬k†=´Å ÚJmœíd¶³µ‡}ø£LÙ²»Ý€{h,$#RäO$EåÛÊ! þ½PÜw(ç1IÊÕ7-wHä/Ô¢€Qß óˆãS7 %±E)”Έp{ >¬µÀgä˪Z1òfuukRÂ@ïÇŠ-ïL]®.F¾é@?'ÿ¹[½^¯^žÄad½1».u¢ˆÁ_@8õÜXý¹d]’«£Or#kY%’¤¢·¢B6ù]u|CÖ¯ÎÖVäc”?·À/,!q¢(¢lšPe A‹ê+Ë‘)‹»XŒ?]f³±Ã‡¹ôlœ[N£0¢‘ãÄqÇðåV¹ûXÆ<›ð“ÅU~1v¢z)xŸ”N-7éíפM“oòD´ùVWÂÐÀ—MT×YÞcrr$Š]&ª})ë<„›\éÀýÈÛ̬¨RÜçå¾øíf Ý è$µHZY›=›v[Kö™4«­€æl—û¢ÍK™æÃ‡ê¹Ôƒ3g÷0TYµu.ª‘18¡  œ9ä· md²Œi‚ gÌeÎS KİÃN+ˆCa3ÂDc¡0Ð;ªE‚|8ûrI”û;Ï9uý<±œß‰r—²gæp 2,=/Â`&+´´O Íê¼èU i2C ºãÓ4æ†f¬äв!;4é¡ðéVÖó–­…=‡Iâ8®z‡÷ÇÓ÷oǃla^ûQ`Ub&vÇ2à~8Ñë‡Ä=D¥âÈöˆkCŽGâ‚´Fq”Ä‘×@"c?´l-ÔŒW΀ð ‚üù×éz‚àô/Ï=ÕÀ"ÇÆ Ú'i1èjŽ6ä„Ô£d .Á(QÀÿ_žͶµ9ùÎê:…> óIÌG'ƒFTU“"oÚ®*‹‚ Íæ„@j;BT)”®j3½ìñ r½Æ!xÎ_CÐÙüš§ Üçä¾Ê¿íÁÁƒ† Àƒ‡R$™vQ¹ÞlJ„ âõÛ7o?¬ÉwQ€ÖõÐgoÎ>‘ ¬¼¼x—·òúø ¿#Fc'f,ôËïJ”rÁsîNTÖ]Æx` 2 ô¦K+$ÛÑKÏvƒ¤Žmø¦2:†•(q_UÈ]ª%…¬î²v`±~6åp Rˆê0ÕÝØŸßœ ìö|)ZòN4­’_\ÓŸçyÝ´×ÇW×GïéÏ÷yšp.W'—ûÍ&¿¿¹¹ù ñ\uI…Ìa‘?TˆoWÈ?òáǶNŸ*/p`úŠb±ðéÑFŸ(/òhÐ x„6µÞbx<˜h<^ÚÞÿ^>‹hèùp„±íùr%øN<ÑéÛ?§Î¨Ïw\¶-Rón²݇Ôó×J2p»¬VO¨ž-…ùêÖˆÅHØê†Ý±–eÑÌ(L·ïl«F%AÏã=ª‡Ãòð=g‚ˆu60¸Uw'$¯’bŸIšHdWvêØûšmò»´Çªß(?ô ýÃ<1>”I`—É\Ú¦ª‡Ìc>Ì ŽgMÛ •bì>5¢Â“Ç‹á p\=pÕÅz àém+ #Qëº×´>d6û¢81ì¾··µüž‹±B±¾?5‡2c̸JpÙQèÉPª½ë›²ýPªU Yäe>3œMP9xÑC­A2C²ëÛììFüB6¨ဠѬkYaçD¾ 4ý:ß&™,û¼Dáe’«ŸŸšWFô±Þ&RªŽ32„à"­ÁEæC÷N›> endobj 2964 0 obj 1726 endobj 2966 0 obj << /Length 2967 0 R /Filter /FlateDecode >> stream xœÍXÝoÛ6÷_Á½%@«R”DIúРi‘a-–ÆÀš"`$Ú&ªW–›dýŽ")Yv;lIúîHïîww$õm" ÿ^ÊŸ,ƒ,ËQQ/¾yˆR‚"jD b’`¡0H‚j4%¨’k<‚ üŒæ¿A-šFÀœaX÷°ÀG”+U7‹kÏ63èçdFëÅÅrñê]‚BŒ–+bB‚0M1ü%( "’Ë?‚–5ú|ö‰¯xÇ›‚£’õìží€à;±nο åï‹ËåÈóã {nŽ_L„ÄIÓ4ÀÓ„Rj"-‰Ö(‡F†LY½ËH¢=пGMÆcßàÃ\z6ÆO#šiæyšç0d£<"It*cž{‡ÉB¤]8 JÔs>ÎJgË;Ñ–¢`Õ]±ßAñÜwü{¨£ £èGÁ“ÅËØ¡s¦AŒÎ<’YJêlk7 Ô Ö‹¶ya¥íªçåv›¶ëyçÖ4¥¥ë¶ã–Ù¶Û}ÅÜÄ~Ãážþ•(«fͬTz£÷ŽHþ8Ì"í4øÉÖL4vcÕ6Ý×Ä­¯Jô ú b¨µèQ»B$IP±a+À©]p¸A9‰ePc½Áå#«·ßýŠ–W7¿¡??¾¹1€8€}L¡S$Ò9¥ñ PÉ<¨Y>Yl@MrHö3dM Aí,o¡5Ãhµt€VsÚAeii­f´š7Ð ÷ô[h͘ vˆÃ9wÿLeÍR Ϋw‘,–¿ü X£(HHŒ1Á™Þ>¤ Ð\˜*øÿÂÌTóU‚³IiI"¿µŠ¢mzðXÐÊ€’—Hªµ¦ÎçQ˜Á›eÐl¹èN”ó™æñdºI—adèl߈o{îxQò¦ÑÎÉV­ÇÀp'¸§A4ŽÖñƼyl™CÂWON¼æ ïXÏK'º÷†áÖðöÂSÒ”óÚ!Í;_›éÓI,º¸zõq‰¾³ ¢p{ôåûËOHº|sý‡èùíùi<É‚4”ã”zx|åOGúsŒ'ó- ÄvhC3Gîw¼{¹Ûo·•0nj±ƒO¯çd|ŠñáÓ+Gkø'¸Z9†sh‰¸¾îYþ± Ðl2 ˃¨*TtrÊÚ8êù÷°¦¥ª\zRÝ¡„úZiD)Ü+pJ<´zÑWü^Y:Y¡ðši@·gû-êÛIã¹=׺ÚJö'kúi‹#œy ':T²g±Ô «çmŽH8YsÌf°cߨ– XV¼YC› ½i°V%Çicc¸SVÒCcïú§í‘(G ,ª"‚s*Á7ÝJµ–UX°´„Ä2#lœtðÚ)ÐYl0ÝqíêÈ4ù´qœ®­™i‡Ž‚A³I0”£?}!Ìã(› ýc]U¬YÏG?ÆÑdí}B碯¥6úš¢¯9}M›èkf}#õ¢oöl=îjZ¦!0›éØjFº¹gkþS%Z‡áÃd ÑØüŠ~’ÀNÀ1¡¡‰lˆGÏë8Î'k(°ìžæ¸Xw` Óì=`VðuBÝ>Á¶Mï´kа×ÂñÐÁÁ`Ëë´ÖÓ”7–}؈bc¹¢í:¾Û¶M9sÇ4œ8 »Ë]•‡Mkzù“­'Îàá—jtx¨`ÄGZNœÓÉé·o–—Ë«—¦Aª{…n…R•5=0sà¼@rÖHïïãçõâ›öÀ endstream endobj 2965 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 2966 0 R >> endobj 2967 0 obj 1769 endobj 2969 0 obj << /Type /Action /S /GoTo /D [2962 0 R /XYZ 72.0 608.015 null] >> endobj 2970 0 obj << /Type /Annot /Subtype /Link /Rect [ 270.23 596.373 303.56 605.373 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2969 0 R /H /I >> endobj 2972 0 obj << /Type /Action /S /GoTo /D [2950 0 R /XYZ 72.0 401.308 null] >> endobj 2973 0 obj << /Type /Annot /Subtype /Link /Rect [ 323.0 596.373 351.88 605.373 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2972 0 R /H /I >> endobj 2974 0 obj << /Type /Annot /Subtype /Link /Rect [ 267.048 527.073 300.378 536.073 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2969 0 R /H /I >> endobj 2975 0 obj << /Type /Annot /Subtype /Link /Rect [ 294.187 492.423 323.067 501.423 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2972 0 R /H /I >> endobj 2976 0 obj << /Type /Action /S /GoTo /D [2962 0 R /XYZ 72.0 471.3 null] >> endobj 2977 0 obj << /Type /Annot /Subtype /Link /Rect [ 270.23 316.94 313.0 325.94 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2976 0 R /H /I >> endobj 2978 0 obj << /Type /Annot /Subtype /Link /Rect [ 332.44 316.94 361.32 325.94 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2972 0 R /H /I >> endobj 2979 0 obj << /Type /Annot /Subtype /Link /Rect [ 478.005 247.64 520.775 256.64 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2976 0 R /H /I >> endobj 2980 0 obj << /Type /Annot /Subtype /Link /Rect [ 294.187 212.99 323.067 221.99 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2972 0 R /H /I >> endobj 2981 0 obj << /Type /Action /S /GoTo /D [2965 0 R /XYZ 72.0 223.271 null] >> endobj 2982 0 obj << /Type /Annot /Subtype /Link /Rect [ 270.23 142.807 294.67 151.807 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2981 0 R /H /I >> endobj 2983 0 obj << /Type /Annot /Subtype /Link /Rect [ 314.11 142.807 342.99 151.807 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2972 0 R /H /I >> endobj 2984 0 obj << /Type /Annot /Subtype /Link /Rect [ 472.95 73.507 497.39 82.507 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2981 0 R /H /I >> endobj 2985 0 obj << /Length 2986 0 R /Filter /FlateDecode >> stream xœÍXmoÛ6þî_Á r|§øqŲ"CZ,‰‹ h‹@µéX¨-¹’Ü.ÿ~G‘z—â È€8ˆÍ£îŽïG}_PDàïû‰ÅQdÐj¿øæ)Ò q¦$Á‚IB8¢3‰ö¨?%ÑÎÉt¬ÁOè-úk‘.z·øôxÖˆ€ÜÏ™Q^©º[Üt°¿&|=,Þ.¿ü.%h¹iM̦ZøHaÎŒû0´Ü£Og·vcs›®,ZÇeü5.``‹ä!=ÿ‚–,.—½sBpôÚ6~Óƒ£µÆdP•îç`Æktz@†¤_¥7ãwàg!“bÒ<Ž¥Wn>Œ”ÆšRc´1ðG½8bR<1¯f{ã`a—“R0•‡ÍsÄÖPº 07HÎy_dmÓ¬ n#ίqÙ!Ú›YÚu‘"Õ(·Ç]œ·Oª½héVÞ®“²û(Ë'ôAs–Øb ÓBH'>$?lÚŠÐÅ„- ýéÙ"·ÅÁ®JP°{ÄèϬ(r Ù‰’ýag÷pĺCصfîx½{ÿëõusÀ^„3Õµ”îéòòï¥ïÚN¤µ‚NÕöï§5dTR&Y:“Úé‹Õ© !!ÑY(TžhòÚ“U¹ëðãy"Ë“‡$wíL£Ã³™nŽé@'é ã!†pÂ-½ì>,,t8áØ/è×èÀOŠ ÏÖ·Nƒ Øäپꢚ%€xDñá`!j­{v{u~ÛÙÿÐG &°’PV"5}4\ûô7ûø3Ë×§:i79­át úÅé‘Îò¾‡¦­É‚Ž™'Ûg÷MµAòL¨Ÿ< #ƒ9 õs$ótšÍá~™H†KdmÎÙæF@™íIŒn€PŽZ·øúÅï‚’Dpf@±&õÝîn !FÀ0Úˆ~S±^âɺ ñT·ñ3¾‰ôãq3qÈWÒj²ÌÚá¶UZ5{~X%☣6aMWy?fó1\SÃ( M·¿cm0°BÀi§Eu ¥NøF0¬™!„úœvYJ1àíòå3Úå±Ðki—¥RdÃÄ{F†nk¸Á³:0\}¦ƒúìÞ*Î *½¡P[5±â<ÒYÞ·Pz>VàbAÁ‰L–hoèà£èÔ"Óo:®n&„M;ñ‚Nh,#”êúM‡ÛÇl:)iü3ºzI÷ÿ”gµˆÁµ Áõ4b#úÜ•÷Ÿ…J Ö…ß\õ:§zÿ˜¶¡2t"±ØH÷‚ŽÑñú“‘"Ü/ a¨Pr,‚;/®oÿï°>Û endstream endobj 2971 0 obj [ 2970 0 R 2973 0 R 2974 0 R 2975 0 R 2977 0 R 2978 0 R 2979 0 R 2980 0 R 2982 0 R 2983 0 R 2984 0 R ] endobj 2968 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 2971 0 R /Contents 2985 0 R >> endobj 2986 0 obj 1671 endobj 2988 0 obj << /Type /Annot /Subtype /Link /Rect [ 294.187 747.389 323.067 756.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2972 0 R /H /I >> endobj 2990 0 obj << /Type /Action /S /GoTo /D [2965 0 R /XYZ 72.0 664.699 null] >> endobj 2991 0 obj << /Type /Annot /Subtype /Link /Rect [ 270.23 422.449 295.23 431.449 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2990 0 R /H /I >> endobj 2992 0 obj << /Type /Annot /Subtype /Link /Rect [ 314.67 422.449 343.55 431.449 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2972 0 R /H /I >> endobj 2993 0 obj << /Type /Annot /Subtype /Link /Rect [ 138.0 341.103 163.0 350.103 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2990 0 R /H /I >> endobj 2994 0 obj << /Type /Action /S /GoTo /D [2968 0 R /XYZ 72.0 769.889 null] >> endobj 2995 0 obj << /Type /Annot /Subtype /Link /Rect [ 270.23 189.528 293.57 198.528 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2994 0 R /H /I >> endobj 2996 0 obj << /Type /Annot /Subtype /Link /Rect [ 313.01 189.528 341.89 198.528 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2972 0 R /H /I >> endobj 2997 0 obj << /Type /Annot /Subtype /Link /Rect [ 471.85 120.182 495.19 129.182 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2994 0 R /H /I >> endobj 2998 0 obj << /Length 2999 0 R /Filter /FlateDecode >> stream xœíXKoÜ8 ¾Ï¯Ð1RU’å‡ö¶EÓ"‹"‹´³ØCSÊXõØSÛÓ4ÿ~)K¶äÇLZ`ÈaÓ!iR¢HŠ•o+Šü{¥%œâ$h³[}³rŠb†‚ÈŠB‚9 嘅h‡Æ¢ÚÆ#XOÁ¯‘.ðú{U®z¿úütRDÀîqEŽ,Þ-õiuãùf€~Iþô°z³^½~"JÐzëB̦qLà'D ˜Ð? ­wèóÙGµUµ*7 ¥²•÷²B5ùCyþ­ÿX]®G'ÁÉK;øÍÈE(œ8Ž1™T·L`d 1+êO#G¦¬Ùe$1'0¿ºLfßáy-½玗Qã˜R!b!àNFuÄÂðTż˜ãÍ‹…i¿Ž:Q}ìð<™]ZmÓû»<5çÖqs¡Š#õu–7è½ȩ̀ÛL9æê­£«í¥z¸µnÁòˆ®qÏkÐ ’Hˆˆ/8ÙÞu§šÚ„“: øÜÆÛWÞêÂñM[Õ*u¼ô-ùæêýÕõÚñßeqðp{_/ß_~t¢mUO\„ˆ Pn„&qìÓ͇¼U·çØfÈåØOkbBà@I³‡FÕ‡}—írrá*ŒmºäÊbŸÉò°Su¾AM æhwhZ´©ÊVB‚ªR!È©N϶*Šê4~›$8Š#ØÀ.~ËX8ÑŠçZ×®ÑÕ5zwõáÝB €Cð_­<-Ê·¨¬à¸_š½ÚäÛ\¥·çs(…`ò’LØ)'æz^£—7]~Z/¬@¬ƒ+Iã“«ÎôìÁN&’†1Ž\ø8`~&ØÔri$&ö’B½Stöö÷õåÀ@¤ŠtಪH¢¹o†Ö» Ìc¦Ê‘ekË©ÉÆûöí šV¥x]mrT›ƒÔÖ—[¤©vªKôB:9³*ô[¨\4Ѧ$À1t E|Ár¸lǧö1 ¿®(X²¿@]‘šÀµ‰jU¨ï²lO_YFN"À¡ˆ2-¿Ë¼8ÒŽi41éû1%1`ÓÙèò:qŸöžÌÛÌ·òèü‘ï;Obú·e!=n“ÉZnZUû>xyìE¶•[./¡óíd›W¥ïS`à;5Ï:cÉäøûì©É7²èš*¤Þ}ÿä8‹=ÝãIÇȺÍ7…'°PÖѦãc'P¯ãvÒÛáÞ_Ô‘uUí¹WõÅ¢f®Më{gU.+ßçeªPƒq2‰LUk+–h˜)À¦çJ¹S=ítdùdZªå»Ûdi¸TmOgªØ7Çj   ¾.é÷ÙÐtZ=–¸gúˆvöÕ©'Îëþ ’­ÛC-!d“ ô-¦ie{húë9½àœë—üba Ý lã^êIŒ…$X”,?Ób@NDRêwpR5G:ì76™ƒ¶‰'”þwYçz˜A…*àÆ7³ÛAú7Õn§ÊHS˜qîŸ:¨ÕNôž#ã;xþú] Ç¦^´þLIP@¦ŒO 7>A›HEkX«›¦P{÷Cïéδ<œ<Ä zu"ˆ:³Æ¦®šæÕ04š© ûÔÌR*ÌtVÂ8XX´½sÎx#epÊÉ2nÃ8ц–~i›Å14¦8ä ÇbÁètÅ@uaÁÁË€F¶bôQŽÎïA,&ú:'‡2xF0¤C‘bÚì ¨„ú©›ªÌÈ €.‘kÍ8ë¦XháèçFSN J4„'W`ÏxÒe¯¬±zß+’sÎ6ü0gv4gÑÖô9Ãô>;ɾÊõ xÓÖ,yK›G¡ °,(©­*Só^0’.´g^8 †]%Ï›gÑ$‹Õ+è‚æ3yá3(íŒü!ŒHc‹þŽ¢„¢¶;¸÷ù1Ë7™cõ>Ž3•mh/7Vb“c¹[÷†¿pÒ¯ê鱪SO"mVÕžfœ¼Jõäfn¢u$óvZ(r}rÀQ‡¶Æ5øµ0@eÙ¶úÔ ¬ ç„DýóW£V0A-]NÏ¡V'˜ " Ÿÿ[˜5]²½sŽxˆH¢ÿ"ª#S‹e¼¢ðâ‡-8Do¾Å"ZÁãÒ–u839]Ö‘þ£YÄ вe­q´ÁD02Œõ`•^å?Â*¨€³ýëËiy<Öî2ÿN ‹95º Ìá4Õ b(“i ù€÷'‰è|ûÅ*á0×@ÒaœÏMž G ¯ ¦pá~"¢„MÔÿ‡/:‚O¢³P—ÝžoVÿäŽ19 endstream endobj 2989 0 obj [ 2988 0 R 2991 0 R 2992 0 R 2993 0 R 2995 0 R 2996 0 R 2997 0 R ] endobj 2987 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 2989 0 R /Contents 2998 0 R >> endobj 2999 0 obj 1794 endobj 3001 0 obj << /Length 3002 0 R /Filter /FlateDecode >> stream xœÍ”MOƒ@†ïû+Þ£Mê:»|,\ÖÄx°Šñ Æ`YZ"õß»[j %xîrØÙ—™Ùg&ŸL€Ìsj·À<B,Öìs§ ( ÇßIqWzD„Ë¥‡5ú’‡ÜÆt ùg™­çkÎ+<²‚®ØÓ‹ñI@&î‹ÑHòmª{6ï°íŒ}L|„%;ØÙ̃ Dé¾ÅRr¡™å!àŽ í’ˆÖx:¹Ó©®t±ÐHâ&~‹kcè:[“D×ì2êUîñàØ Ÿ÷Íà(¥8Ô6ÓjFi3ÚW=Ãc{KOi+h÷QdSx8KG7>F¾âJˆ0Tah^ñ 7GÒóÿ›˜£)o8,Òr÷·R5V¼ >ï<+Þ_›ŸÝVn;·o–IÑ*«‘f:OP7e¥k4+ ›eºµmF<Ÿ<ÜÝLq{1›"Ýäy£¿›)*ÇN¦(+dëx©Ÿ'|wïž½‹ëJî˜î“œ.o]nªÅ±ç„ ‰¿VÚ€V{Zã°©u‚¬@l ÿþ&–Ò*EÙhÞ™Œ9ûnOï endstream endobj 3000 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 3001 0 R >> endobj 3002 0 obj 411 endobj 3004 0 obj << /Type /Action /S /GoTo /D [3003 0 R /XYZ 72.0 398.405 null] >> endobj 3005 0 obj << /Type /Action /S /GoTo /D [3003 0 R /XYZ 72.0 317.522 null] >> endobj 3006 0 obj << /Type /Action /S /GoTo /D [3003 0 R /XYZ 72.0 248.639 null] >> endobj 3007 0 obj << /Type /Annot /Subtype /Link /Rect [ 236.857 423.905 286.307 432.905 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3004 0 R /H /I >> endobj 3009 0 obj << /Type /Annot /Subtype /Link /Rect [ 292.18 423.905 337.73 432.905 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3006 0 R /H /I >> endobj 3010 0 obj << /Type /Annot /Subtype /Link /Rect [ 361.416 423.905 425.316 432.905 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3005 0 R /H /I >> endobj 3011 0 obj << /Type /Action /S /GoTo /D [3003 0 R /XYZ 72.0 479.288 null] >> endobj 3012 0 obj << /Type /Annot /Subtype /Link /Rect [ 421.394 331.022 468.614 340.022 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3011 0 R /H /I >> endobj 3013 0 obj << /Type /Annot /Subtype /Link /Rect [ 406.612 262.139 452.162 271.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3006 0 R /H /I >> endobj 3014 0 obj << /Type /Annot /Subtype /Link /Rect [ 226.94 250.139 276.39 259.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3004 0 R /H /I >> endobj 3015 0 obj << /Type /Annot /Subtype /Link /Rect [ 403.548 193.256 452.998 202.256 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3004 0 R /H /I >> endobj 3016 0 obj << /Length 3017 0 R /Filter /FlateDecode >> stream xœÍXKsÛ6¾ëWàV{ÆaÁ7Ù[â8©;IØêt2I&KȆ"’²ãþú.°xñ!§¹99xw‰öñíb¡o ŸPøÿLüÉ"ß˲œ¬v‹oJî“4 a¢D1õ¢ ¦4$~ä1Ù‘¡(&•Ðqˆ@Sðg°ø‚ü½¨”¼^|ü kÖ„‚Þý‚Ù\nu³xïØ¦ý”ìs- )õ²§gàûa‚Ó4õè8ñr›e Áŧ!cOHÐü{Ôd:±˜ÎGTçüÉGÉvñb¹øõØDÉrc+*I½Ô÷ó<ÍsøäeA.þd¹#O‚8=ýL–,.–sˆy2îMÁ»„V’Ó¤­ò?$AýCx9%ïYJ)Mtþ¼`ûž·ÄO=²,8¹æ›—/Èšõì–uãâèǾçG±žúkÞ•Û׉øÏ?ÊHšy4‚à'±Š¹8ê”<Ësˆí žiX}¸•”¥™% ^íÁôG7ó¹äÌ–oxËëŸîÖyVvÙ;§7Õº.?~ð(’œŽBÒòU³­Ë¾ljÒlÈ¡f··-¿+YÏ×ä¾iá°²&ÿ4‡¶f©ÙŽw„uäžW•ø+¼»-o«²Ù¶l_<®¨8¨€);&võt–/‰ê¥p­ aâN¢Xà$ Ñ:À‡¨À¾ýeÉiÚàG‰—‡p“&˜Õ!’›ÖÄYfɪìzËÝ—}a¹aÈŒX‡Ìj ‹=˃Ws8kùh­e!ÖæÂY‡ù0,$p|~7Å€g£¨ÜåJz…S©›ÞùR;´öZ@ÇHѤ»fÇû¢¬·VÄ«Ž{–}ËêG·®Êš»ú‡v…þM7wPW®¬ØAÞŒç)y¾o›»rg¦Nx‘qrˆgw+ph½@{(Ì ºÆÙÂYX:ktœ%³ª8k ˆ#wÌùPq œ]4qDg&>Y0ŠZèû¦f·¯xÏàöÁeßñjcXlC’tLW+-i÷F\!éÀÊ3Ò€’=xœz)ÅÌ8{v_Ýo†VÙ™ñ>FÞ³M¦Óà±Ì¥Lê™a1Ñø…²`w–éí’-ï­XwÉ9’ü¦mvÎ!;am±¤ÈÜ+hèÚQU€žÝ¶ÜL£ÐqϬ9aÇZ¬ÔØËdVkË1Kn4)ãÊõƒ‡,ÆBÑ…££oAÏŠtçV0Çš‡æ`ì™]átyÑ©B@ëë?î”}ÁDÎ"Ó)¢A½KδÁ± LÕŸŒ.XÜ*²`5^ ‚¹ÜØŠZ7õ/Z­æ2z‘¬£3CiBÓ·%À´Ò\£ˆäûÏÀZ}cËûZÞØƒ˜Dãj{‰¸‰íô› ÷“ç6Q “'„fÎv`ÀÊJ7%¯Ö–ýt²cßËÝagE¯·x#ıeVk٠ʶûtj¥*mŠ3÷¼²Ã’º™"W:Æö¨•óÔbqkŽ@#œNÆm n:Z‰ÉŠ f+of»l\ß™èÄÝoäüâÍ›3òâòêü÷‹·—7Ëëgäåõ_¯oþÿÌÄÃvOÂÈÌ\;s_.o–Þ\ühØ £ÐË|Ø*GÃV–ÊyT[Šm¶æf@‰«Ô÷ÂY< ‹!Îâ$Ï£$œ9÷úâ•c±Ñ Ä›ŠÂx™dÑŒÖÙÑ㈜ŸŠ§[2çæ»«›ËååÕŸc­$†xSêCî?:Àñ³³Ü‹ü8Ïb¸»¦»Ü\¼{~ý|yu}3Ò ãÐ ý„Ò&ý©Þ(-NšÔð‡Ì¡ãk7e–îú¦™ BÑU' ^§0|z¹Ð~XPïeDiHkìr«¦îYYwFÐÔö#¯ûÖžˆO6¤›d­o.$×|c©=döaÂcè8ƒŽ½HÜ…0· 8¯Ê^^4“Ô–×¼…0UqMý‰—Øá¼Äa¦1UºU=¬‘ãUÁ›>É¡ÔhžÑ€¯”˜R³SæÈ:)R’yÛX3E׎¢NŸb7îB~ÇÝoûie§r´ãaïìöé¤;¨'Žä™cÐmÓ|=³¬êÇgÓGa2Š»…K®¼k ÒEi¨_7›¸iÁCûkÜW¼–‘gÒW,L%ÀÊTŒ ã±jW¯p—Ž[HÒ<¢~Å3¾ï«•ÃB´ "f´ÜÃ5R7ãд™ DÙ+._’USv?ó{C”A_§Ð[S˜ t•Dn•ŒÛëñ:‰iìÅpGdI<¬“0 ²Y™ñY·RP¢‰ŒÉ#² dÈt|m£o‘îÜÈaÒÕ±®]ãä…Píâ'Ë<ög\:rÓ…"މq g”F{–×wœ¦<†œÄ\£)ÍÍ8¥ `ƒF\”ž&…†±ˆRDÑÌVÇ& “B&~o ó-Wq¤Þ (‡×Ÿ@` xγ‹E#0v8 ù#øK#¦!(Ö!ürñÈ¢OŠ ø$çbO ô$m'9ýÛ§ ¸“ »ßVö8Çš æ|â@)Œ9S7ŽdH@Nü°žÅ0ËM”†^z†Õ€³nÍà æíÁfn3 £›Nf¿óœŸõß/þývü endstream endobj 3008 0 obj [ 3007 0 R 3009 0 R 3010 0 R 3012 0 R 3013 0 R 3014 0 R 3015 0 R ] endobj 3003 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 3008 0 R /Contents 3016 0 R >> endobj 3017 0 obj 1962 endobj 3019 0 obj << /URI (http://www.risinc.com) /S /URI >> endobj 3020 0 obj << /Type /Annot /Subtype /Link /Rect [ 482.746 689.671 523.276 698.671 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3019 0 R /H /I >> endobj 3022 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 677.671 155.54 686.671 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3019 0 R /H /I >> endobj 3023 0 obj << /Type /Annot /Subtype /Link /Rect [ 161.947 677.671 251.947 686.671 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3019 0 R /H /I >> endobj 3024 0 obj << /Type /Annot /Subtype /Link /Rect [ 260.197 515.388 344.197 523.788 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2036 0 R /H /I >> endobj 3025 0 obj << /Type /Annot /Subtype /Link /Rect [ 155.26 167.905 184.7 176.905 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 52 0 R /H /I >> endobj 3026 0 obj << /Type /Annot /Subtype /Link /Rect [ 190.53 167.905 363.57 176.905 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 52 0 R /H /I >> endobj 3027 0 obj << /Length 3028 0 R /Filter /FlateDecode >> stream xœÍZKsÛ8¾ûWðèT94 ñ9U{°“)í&³“±¶fRqj – >‚´¬ýõÛ@ãŇ39&>¨¿&6è¯`¾^ÄA¯åO‘ÄaQ”Á¶¾øªõq“`•iU… I£hÄIHÒ ƪ4¨dO F‚ŸQ[À‡à‹æ" ~¹øôÚì‚ú.¢WCÝ]|ðlÓ @þ‘ìó-\EQXüx~/pžça4]x5Ì u Á壑!Sˆoipøû¢ÉÑÌâhÙ£fÍã¢àñâvsqý3Ø›½‹¨,ó8.˼,áQXRþ#Á¦>]’´xõ9ØüãâóÃLo¾Yˆ´KöÊʈ€¶Óó_$þ³¹! H’"¢(Ëpòoôس.ˆ‹0ø}}Ðft\<û¶«iŽñHã0NRé½G¶å{¾¥=oíåB,¬BRyF ¬B–j篛àU@H˜—¬a­®¬âw¶{kQßq&j­(z¾ýbum¶U+Xu^ztl…à[¯?8µt‰‘Ñ#îµþÄ­¶Ý/Ž3ñc›0O²("dî˜6ëX³eÓNEPF“¶ïiCY7iY¬Â4EŽ`‹Ïº€M¯Ó\õiÚ­ Ë$+Ë"›÷:ôýñ§ëëÓéÂöàÍ6ܶõ¤œË`wed5áó´5XIrxY˜—3R´ûþD;æ4O¬èr­(œx^çÂa_ÆõРnEïPǶ¬é¿ñеOÔóÔv_xó8_©8"“)x¸ʾ¤ ³àr£-E´Õh°ß÷j÷jI«Êë¢'„@GSˆsÓÓg‡ÕÎÔ2nk dÈ»—ÈØ·hÏ+&^h9zûžØñ½ÞÁ^_Þ,8 ¸uì$9(¯«a=0²Xb¬ lXzÓ+®RÚ&DT1Ó˜¼Â$• ˜¯ð•À|qlàÅÈ7Ò7cþŠÔâ< ËUœ˜kV]×Ƕ3û©÷tm훉U™)Y…v5Ák^Qïépo;z<ð­SïhO¨`ÂÇ“O¬ª–Ÿ°ç±½âЕg€Üæ ËWɼ¹ ™œ@:óé\khÕø§á½' '7mïw;ѳ÷X]¼ÞwŒ9Õnð€¢r#¼O´;C°zÝØãh ”Åp4>AÐÿ ãîô+"Ø? ®*“‰«FéC±B©Õ±"Pá±*ÄP×´ãÿc^/m‚I4êatP-wmPTyT·Yš&‰²oMSEìéICm€­.ŒBŠÉ(÷„¤“véR;UM@‰²ϵMßQEò¨PÛB‹j²(×”7ÊŸÿàÍ®=‰×2ŒvV;7ÔÚp»²*S² ‚°bÛ^,¾)eC³ˆd¢X˜l2%™ÿºþ:e°o˜Y³ƒ=.4º¿|÷³ÿ¦£çèóDï1J±m¼aD;t¸c$‚¼Óž´¬ü(ðSSµtgôÓ×LGÊŠð17:,¤ŒÀ¼ ³M§Ôb<û:•g²Ë#Ý~ é´­Crõaa…÷܉šÏÃ$ÀŒ¡òE9%ö¸€ÄPêjfnOÇö»‡ÿìZA††?3E †¸„J'*ó…‘œaâ`á¶ãÇÞál¾ÃhŽP§ôÞM…£€^Lô¶Xðt6e&“¬bµßþëÎ[kŒT‹²ÞŽ/´¼¿<·ƒƒ5=;4à4ë¼aè`Þ{ ެ«j½Æ’YØó4ÇN­7Ø=£»«?äSê‚l°…— Ѳ@Råw’Ô¬")¨|²1Ñ¢Fóì•Uàš¢Ü õƒšB•®P¤¤ÖN\³ïå¯`ú´4zlñÑ¥›ÙÀ]à *^¡¶¦µ"IÓ©[`º«xJS7&ë+ /³û>1HçàØÑ-à r…ý,Ø×Aeª+!v-̶W#tLÀQp«Òæ|YV«ix-/˼¬­Yph«új ™ó¿°3”?;ëF[%×D¯¬iH¯:or4\{pÉÔty/˜:kw×ÖêhYÚ¢E}âD™ª$€`ÇöÀ;‹+ÏûèÓn©Ë}ÚUpvÚUZµ*¶É¹i›s-B7ž9À£-sa…‡2Æ¿5G,äƒU6Îj‰¶V™{•(9*ôCz÷VÄ9¢,¸`½Êߨyð: XH# ®“õ%b1<À¡Åº€óZˆ´§_Å–×Åšgz³äŽ|J*ýb5GB2-à”Ê/à”B_ÚºS!w@¬Z£¦u²‹_«òÙiuýŒÀ”› Èepˆ7=”å¼?/ôªœ²‹¦ ú˜¯ÕxÎg´þCLJˆèÞœ¸ñªá0ì÷•>! Êì§ñ*gâ_+hpjÇíqL«¼õ5oŰi‡…äœDS–Ra-·lXÁ%^IÈ÷ñʼ¤ÀÛÍõ†{Î`ùÁ‘&ñÇÙ?o¾pfì'm³Ä¶µÇó‘É4ž_°qÖîFz.‰ÃRî³á¨®ð4ÆãÊjÂa<™¢L8 Ty‚ ³ŒNc¢ƒzÝo?™Å*†XÓ²HãxyÞ+Œ'ì=Š'TU¬yì–~†~ÉÔ¯êÖ7 ÌÌÞä9ʳ¶_*¿“tÊ/Ö†TîYe*Ü”„¤žz·£x†R±fÁa"4òí«ˆßÜ~æeêÕ¶!ÞNßÇžÁmxŽSwÉüIÅ(h¥»µ‘ hGÞOÍõž¶Ô¶ýï ¦×ßÒ3³»žŠãM"毓!/¹j°m;¨] Kí Å”X§ƒ/…øSÇ TC˜úOýöñúc|åðG2j9yÛyfµN†2Î3ñ@åöcgèi×Ïï8¥/f÷?îè@ôÞòОw¢÷°¨¨8xøþ’‡,ôìy[ ÆY‹Cží<ȬZ D¹uå=ج¯7ñõ›¯[ß]¿ùÍW(æõZùèæ­À¿ þ˜]òxžO"ãw)I~¼2àæÖHúÖOŠ¿ÆV‰k)ÅÇ‹³÷·¡kÛSˆ¡¶Mî“2¤«×´¹TàØêÌ¥F2ÂìC “()Ë"_š¿$7Khs‡¥³ë"K3$±;wéâ¨Ó˜.&da”аÞ[ÏŸD´uyƒðX©°G€_‚ðÐü¼eÌ53îñlS2ë×:ð8iaǶm}䕯ÙïÜ q; <,•Å©Ì-päZE$Ç©G™~e”Ôô™×C­S¹v¬Úò©MjpR|R瘽ŒúûK>†Aò‹ÊÞïÏwÞÙÓï÷\¯§i®’("Y‘Ùëu‚×ëêÓÂÛÍÛ¿ºNOó4,b(}Ò¢pu‰Œ½4–¢ùD¡!Œè!uS%<…¾¢@Àž@Áþcý%D#S‰jˆT¬ÁŸïßyHÝq…žbÝ{à@ýwøCê%æÉî‰6PÒ1¿yk®0¬…W¬ø—…ƒi‘O|f.¥Iª>¹ÛlTèjA=T=‡Rê5l2O éï65¦O”WôW²8÷Ôú«PŠ· ÇŽ7Þ‹> endobj 3028 0 obj 2777 endobj 3030 0 obj << /Type /Annot /Subtype /Link /Rect [ 279.448 632.176 305.558 641.176 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2485 0 R /H /I >> endobj 3032 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.47 608.176 233.57 617.176 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2446 0 R /H /I >> endobj 3033 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 562.87 146.66 571.87 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 781 0 R /H /I >> endobj 3034 0 obj << /Type /Annot /Subtype /Link /Rect [ 152.823 562.87 310.853 571.87 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 781 0 R /H /I >> endobj 3035 0 obj << /Type /Annot /Subtype /Link /Rect [ 344.902 562.87 362.682 571.87 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1722 0 R /H /I >> endobj 3036 0 obj << /Type /Annot /Subtype /Link /Rect [ 368.845 562.87 517.445 571.87 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1722 0 R /H /I >> endobj 3037 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 118.803 183.243 127.803 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 781 0 R /H /I >> endobj 3038 0 obj << /Type /Annot /Subtype /Link /Rect [ 189.276 118.803 347.306 127.803 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 781 0 R /H /I >> endobj 3039 0 obj << /Length 3040 0 R /Filter /FlateDecode >> stream xœÍZmo·þ®_ÁBÒjß_R4AãØ‰‹8ˆ¥no—§cµ/.O—˯ïÃ%y+ÊNúÉöÍ3Ë!‡Crf8¼_/Ãÿkõ§Î“¨®Ò¿~Bª”d¥aq”§Eg$É£´ 9g¤W2‘.ü9k xGÞ^Œ1ùââÇŸ¡MGb;^ÄOt®»úîâ§›iô‡¤Ÿ¯aÇQýá)øæ|«ªŠâõÂën2ä{TŸÎYC匃3À¿Oª?Ò8[tYóF¹˜Ü]|v{qótŠÉíÖ¨²Šª$išªiàST§ú—’ÛüøQZ4Ï~&·ÿºxqÚ1Ìôo–T饤Ê&N+Ìü3’æà?Ô,ÏÌ“4‰ÒºŠã¸,qòÏwt/™ I‘ïg>Þ‘oÙöóÏÉi:4Œ×A‘DI^(ë%ØÁ^Lw‚3¶ÔÊ &Z8ªÀgëP—QU‚qã¼Á.`ì$"_°‘ Ú¹›w;i;¼ -h^“$I¢"WsL+ì5F®Ó&ª‰Òìwlvœv:v×=™Çí9¥×LNަmËfÿÛΓ¤û}Ï[*ù4:æÌÄÔbÁ¶Ý¦‹ãvǽzï«È¥£O¾V«ÅP6H³• èAN•JI0~bt¾ŸÚ e]‹çë{‡ZÁ÷Òµž„%_ƒš[Þ³9²¬Å܈3s‚›Iº1öÓ<ó ï¹ä^“­×9÷Ç<ŽNò @Æ Ì<+V3¿Å•¾’|ð ûûÞcàèPG.öX 6ˆÃ¸pH¯tJã*Êsp0u\´‡qÃ7k™ –¯P2pË\¹ÁŽ;ÞŽ3Ìap,uZúÏë¯è¦ö0,[Y›“7©ñaº‡“°r^­÷×0Ù¤Ò«çAÌWŽaÎ{ ‚z®¼Å~wr\<~‘cØ­æXTx½“à Š –÷¼aòq¥¢7Ü4Jö›œ½aç¦^4«©/z‘V0­#ʈçrIŽ[¹×$M=hW0vk¡™ª²M÷ßÃ,ÉNËläШ!Zå5Æ&®}9x"½8eFÙ.ì•…<ÒQ.ôbXEË=Z^y²Ã#²G·©(ç4B¸ ­˜¯/±Ðxî5¹„”ha|ÍØÚhjÆMºš±ÝoYØ|Øï'!c9õ؃Ÿè`Ž›Y¬ãrŸ:Æ+¯+ã 4ÝMtÓ³+Ç óÙ0´hT£ó[̂Ȝ"«YqØ¿`ž%è,ÌÇöIã|eŸmçUÃ*Ê6_.豄!ƒè£Wrj»¥)º»Çr;)÷ßÜè¥f°lËÀøw,™¼aJh'‡þ‘?¬!ã‚NË: túóºyžF‰Êrê÷è1ßô H¯;¬ÒÄ㸎Cþ›kÒÊ:ÿSÖK›Úè(þ¤ùø2^ž€ t#ï7^ž×QUåM“5Ö“&åªÑÛåðg‘;þšö@v¶…MS›…XsàÈ6Ÿ:ÎYx¹×+uä7_~ãµQ.R<{H?mƒ²0žpGyÍpØîÆ3E–Ië'„OX|\ÀÙâ#×ÙPu”' µŽHŠI»躆ùAj«g¨C/rq“#-ÑL{74íçÉK}÷í÷®5ø±¥-‹,Ë,´éÛu°£!säëH¤]ÔQª’Aèÿt A¿½?9¶6»±:r´ž†v1ñè}ë!ÁøŽXéäôZ²ñÁÑl9¯iëõÕxËÇnúÝk y®˜Ä=…ô‹±ûz’ìÓ€IŠu¨z y¦Žµºû6¸±ù4ud»£=ì–;æËQéÚéiôší¨×£œuž&_ˆ>SŽÆ“4á Á–ûŸû³fÂkçSd½úü…7§Ñ–TÈ€ÉʵOj§Ne©N ! ›Æ®w‚¨•ÜN}?áóÇØÓÍË*peLáê™àóêªÆ>?WSeÉiï}Ø;ÃE2`1}ô¤ò#\/iÏgó¹TÈ4iº2+ÅD¹ªA,5…T'Ð=Å :MÃ%kžÙ°é=QØ<ƒÇ-áŠÀL•Eáw)Кë¤h,ä蘒­4ÅÅa#:À”³|5eðG°fÈ8ðâ’cL@ObÐq3^r?!0ëc¾¨+…ƒs 3G'ŽŒAY@qò%š™H€ÀÚ¡ÑØwzB».Í¡¥Ï×.I'l&ˆ¤EÔ,1éy7úΑa­ •’ ºÞ‚X+c>-¡­=idv3y;´ëÞ”–4½Ü1ÝG÷ ç4. Ò=(Û‡lP¬Ýã«q–ŒvWª†JÌ”ëOp‡×áÊæX3ѧ£½õâzþH%5«!ñ,!DIjK©iD^ÙîßWDÍ“,*Asu p«GÔ‘ÇÉד>PÞëM‰µ¨#‡Œl£*ûž‚Óî@ö´/–š´Ò?©¢´V…‘Õò<‰òÂ|YÔÞ’ˆ<‡dGë9Y*´ziõ’šå{ïô ‰PUÿº€û™îkÜÏtQUmÇ,Ôàp ƒÎrÞR.ú“'*åw; [ýH…-ð” 2ªgãú¡Úµ3ÑmÑ<‰‡Vzlihq\úóª\ÍÎ-#Ūfnâè²÷ g¹ ç6Á7ôÌü/‹ç~ÜÖ‰ OLB`Çáãþ œD¸púOŽgK$lDHÓ`È€…àМ[è§ o€Ó©3„2u‹ðB;rLIÛ Ìº íHÉöÓ³È1LQMR˼HÌŽsÇ<ÌöŠØVIoèÉ“j¡ß}ÏgOcuÃxlŒ"ŽWÆ€„ã&z›G7cU( gYSç™9´—hmòò‹.Z´äº#—Ýf¤#×ÏÑgtr} —êE®ärž¤ŸÜtìáf<ôý/(ñe5”`ó¡z(ÚuÀ'×’\ÊÓž†¼ä£®ã¦Ÿü5 Ž þü|L¢ÿ=™¤+H !ECfÅÙ{D’ëL®Nè VŽÆƒŸ!+Á}`XòLÞß߆ńÀcd0f2Ai³Í<Î9:ªËš?ø4¢«û£º˜å÷$׈¢IV6Z2ŒFÕVT^n³ÍyrÂ}$OsU´ tzéŸüÀj%¹z]Í j6U@¯ÆóOµ_? T4°IñÄÌ:á'ÕPH=[Àé³—cåØà2­]–¡'¬z€Ÿƒlml!YOÈLË ²¤Œ“¢Ì¯¤sš,Q1ážëM‡@»$m²n-÷™0Œ`ÀTÁy¦ƒ®æèS½Å•ièÄɯ«û‰Êv+õªÒ„Fÿ?Gª"ÊbõÓ‹ª túèq¤‚{V4u™eïTÞ<Š!БÈáËO4¢žÍÌ4m.£6xÁE9ê¸$<±IÛ TÆ+õÞ‘ó“n‚£½ÏȪÜþ ïõHãË&Ò‚©³ŽÈ`\=H\YŒ@“Æ"à®j) iúq˪áúsQ ±ôªÈQ•¢Ùÿné~ºã­÷S°7ÿjô“ endstream endobj 3031 0 obj [ 3030 0 R 3032 0 R 3033 0 R 3034 0 R 3035 0 R 3036 0 R 3037 0 R 3038 0 R ] endobj 3029 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 3031 0 R /Contents 3039 0 R >> endobj 3040 0 obj 3175 endobj 3042 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 759.389 246.376 768.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2817 0 R /H /I >> endobj 3044 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.345 759.389 525.345 768.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2817 0 R /H /I >> endobj 3045 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 747.389 233.092 756.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2820 0 R /H /I >> endobj 3046 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.457 747.389 525.457 756.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2820 0 R /H /I >> endobj 3047 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 735.389 238.071 744.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2823 0 R /H /I >> endobj 3048 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.415 735.389 525.415 744.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2823 0 R /H /I >> endobj 3049 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 723.389 244.713 732.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2826 0 R /H /I >> endobj 3050 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.359 723.389 525.359 732.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2826 0 R /H /I >> endobj 3051 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 711.389 248.029 720.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2829 0 R /H /I >> endobj 3052 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.331 711.389 525.331 720.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2829 0 R /H /I >> endobj 3053 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 699.389 243.05 708.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2832 0 R /H /I >> endobj 3054 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.373 699.389 525.373 708.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2832 0 R /H /I >> endobj 3055 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 687.389 248.029 696.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2835 0 R /H /I >> endobj 3056 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.331 687.389 525.331 696.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2835 0 R /H /I >> endobj 3057 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 675.389 253.008 684.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2838 0 R /H /I >> endobj 3058 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.289 675.389 525.289 684.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2838 0 R /H /I >> endobj 3059 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 663.389 243.05 672.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2841 0 R /H /I >> endobj 3060 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.373 663.389 525.373 672.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2841 0 R /H /I >> endobj 3061 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 651.389 248.029 660.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2844 0 R /H /I >> endobj 3062 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.331 651.389 525.331 660.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2844 0 R /H /I >> endobj 3063 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 639.389 315.738 648.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2847 0 R /H /I >> endobj 3064 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.644 639.389 524.644 648.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2847 0 R /H /I >> endobj 3065 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 627.389 239.724 636.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2850 0 R /H /I >> endobj 3066 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.401 627.389 525.401 636.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2850 0 R /H /I >> endobj 3067 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 615.389 241.397 624.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2853 0 R /H /I >> endobj 3068 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.387 615.389 525.387 624.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2853 0 R /H /I >> endobj 3069 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 603.389 246.376 612.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2856 0 R /H /I >> endobj 3070 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.345 603.389 525.345 612.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2856 0 R /H /I >> endobj 3071 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 591.389 245.261 600.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2859 0 R /H /I >> endobj 3072 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.355 591.389 525.355 600.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2859 0 R /H /I >> endobj 3073 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 579.389 272.489 588.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2235 0 R /H /I >> endobj 3074 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.985 579.389 524.985 588.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2235 0 R /H /I >> endobj 3075 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 567.389 343.61 576.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2864 0 R /H /I >> endobj 3076 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.521 567.389 524.521 576.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2864 0 R /H /I >> endobj 3077 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 555.389 327.797 564.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2292 0 R /H /I >> endobj 3078 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.655 555.389 524.655 564.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2292 0 R /H /I >> endobj 3079 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 543.389 314.781 552.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2304 0 R /H /I >> endobj 3080 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.765 543.389 524.765 552.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2304 0 R /H /I >> endobj 3081 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 531.389 273.028 540.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2337 0 R /H /I >> endobj 3082 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.981 531.389 524.981 540.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2337 0 R /H /I >> endobj 3083 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 519.389 346.044 528.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2330 0 R /H /I >> endobj 3084 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.501 519.389 524.501 528.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2330 0 R /H /I >> endobj 3085 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 507.389 323.006 516.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2358 0 R /H /I >> endobj 3086 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.695 507.389 524.695 516.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2358 0 R /H /I >> endobj 3087 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 495.389 258.205 504.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2388 0 R /H /I >> endobj 3088 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.969 495.389 524.969 504.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2388 0 R /H /I >> endobj 3089 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 483.389 196.88 492.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2418 0 R /H /I >> endobj 3090 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.576 483.389 525.576 492.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2418 0 R /H /I >> endobj 3091 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 471.389 199.1 480.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2446 0 R /H /I >> endobj 3092 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.561 471.389 525.561 480.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2446 0 R /H /I >> endobj 3093 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 459.389 194.11 468.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2485 0 R /H /I >> endobj 3094 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.599 459.389 525.599 468.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2485 0 R /H /I >> endobj 3095 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 447.389 228.56 456.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2885 0 R /H /I >> endobj 3096 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.328 447.389 525.328 456.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2885 0 R /H /I >> endobj 3097 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 435.389 205.76 444.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2668 0 R /H /I >> endobj 3098 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.508 435.389 525.508 444.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2668 0 R /H /I >> endobj 3099 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 423.389 204.66 432.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2670 0 R /H /I >> endobj 3100 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.516 423.389 525.516 432.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2670 0 R /H /I >> endobj 3101 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 411.389 198.54 420.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2730 0 R /H /I >> endobj 3102 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.564 411.389 525.564 420.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2730 0 R /H /I >> endobj 3103 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 399.389 199.1 408.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2741 0 R /H /I >> endobj 3104 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.561 399.389 525.561 408.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2741 0 R /H /I >> endobj 3105 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 387.389 204.1 396.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2896 0 R /H /I >> endobj 3106 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.521 387.389 525.521 396.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2896 0 R /H /I >> endobj 3107 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 375.389 211.33 384.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2899 0 R /H /I >> endobj 3108 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.465 375.389 525.465 384.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2899 0 R /H /I >> endobj 3109 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 363.389 221.674 372.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2920 0 R /H /I >> endobj 3110 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.107 363.389 525.107 372.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2920 0 R /H /I >> endobj 3111 0 obj << /Type /Action /S /GoTo /D [2950 0 R /XYZ 72.0 769.889 null] >> endobj 3112 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 351.389 267.514 360.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3111 0 R /H /I >> endobj 3113 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.899 351.389 524.899 360.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3111 0 R /H /I >> endobj 3114 0 obj << /Type /Action /S /GoTo /D [2950 0 R /XYZ 72.0 629.731 null] >> endobj 3115 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 339.389 260.42 348.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3114 0 R /H /I >> endobj 3116 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.079 339.389 525.079 348.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3114 0 R /H /I >> endobj 3117 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 327.389 262.061 336.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2972 0 R /H /I >> endobj 3118 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.067 327.389 525.067 336.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2972 0 R /H /I >> endobj 3119 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 315.389 266.46 324.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2969 0 R /H /I >> endobj 3120 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.033 315.389 525.033 324.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2969 0 R /H /I >> endobj 3121 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 303.389 275.79 312.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2976 0 R /H /I >> endobj 3122 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.959 303.389 524.959 312.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2976 0 R /H /I >> endobj 3123 0 obj << /Type /Action /S /GoTo /D [2962 0 R /XYZ 72.0 334.585 null] >> endobj 3124 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 291.389 280.732 300.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3123 0 R /H /I >> endobj 3125 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.921 291.389 524.921 300.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3123 0 R /H /I >> endobj 3126 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 279.389 258.226 288.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2990 0 R /H /I >> endobj 3127 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.097 279.389 525.097 288.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2990 0 R /H /I >> endobj 3128 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 267.389 257.673 276.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2981 0 R /H /I >> endobj 3129 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.101 267.389 525.101 276.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2981 0 R /H /I >> endobj 3130 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 255.389 256.586 264.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2994 0 R /H /I >> endobj 3131 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.109 255.389 525.109 264.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2994 0 R /H /I >> endobj 3132 0 obj << /Type /Action /S /GoTo /D [2968 0 R /XYZ 72.0 653.056 null] >> endobj 3133 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 243.389 271.402 252.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3132 0 R /H /I >> endobj 3134 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.993 243.389 524.993 252.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3132 0 R /H /I >> endobj 3135 0 obj << /Type /Action /S /GoTo /D [2968 0 R /XYZ 72.0 373.623 null] >> endobj 3136 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 231.389 285.674 240.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3135 0 R /H /I >> endobj 3137 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.881 231.389 524.881 240.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3135 0 R /H /I >> endobj 3138 0 obj << /Type /Action /S /GoTo /D [2968 0 R /XYZ 72.0 199.49 null] >> endobj 3139 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 219.389 267.557 228.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3138 0 R /H /I >> endobj 3140 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.023 219.389 525.023 228.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3138 0 R /H /I >> endobj 3141 0 obj << /Type /Action /S /GoTo /D [2987 0 R /XYZ 72.0 479.178 null] >> endobj 3142 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 207.389 268.11 216.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3141 0 R /H /I >> endobj 3143 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.019 207.389 525.019 216.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3141 0 R /H /I >> endobj 3144 0 obj << /Type /Action /S /GoTo /D [2987 0 R /XYZ 72.0 246.257 null] >> endobj 3145 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 195.389 266.469 204.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3144 0 R /H /I >> endobj 3146 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.031 195.389 525.031 204.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3144 0 R /H /I >> endobj 3147 0 obj << /Type /Action /S /GoTo /D [3003 0 R /XYZ 72.0 769.889 null] >> endobj 3148 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 183.389 274.082 192.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3147 0 R /H /I >> endobj 3149 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.851 183.389 524.851 192.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3147 0 R /H /I >> endobj 3150 0 obj << /Type /Action /S /GoTo /D [3003 0 R /XYZ 72.0 676.171 null] >> endobj 3151 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 171.389 298.306 180.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3150 0 R /H /I >> endobj 3152 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.783 171.389 524.783 180.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3150 0 R /H /I >> endobj 3153 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 159.389 280.188 168.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3011 0 R /H /I >> endobj 3154 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.925 159.389 524.925 168.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3011 0 R /H /I >> endobj 3155 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 147.389 282.392 156.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3004 0 R /H /I >> endobj 3156 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.907 147.389 524.907 156.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3004 0 R /H /I >> endobj 3157 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 135.389 296.675 144.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3005 0 R /H /I >> endobj 3158 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.795 135.389 524.795 144.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3005 0 R /H /I >> endobj 3159 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 123.389 278.538 132.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3006 0 R /H /I >> endobj 3160 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.937 123.389 524.937 132.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3006 0 R /H /I >> endobj 3161 0 obj << /Type /Action /S /GoTo /D [3018 0 R /XYZ 72.0 769.889 null] >> endobj 3162 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 111.389 299.147 120.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3161 0 R /H /I >> endobj 3163 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.669 111.389 524.669 120.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3161 0 R /H /I >> endobj 3164 0 obj << /Type /Action /S /GoTo /D [3018 0 R /XYZ 72.0 652.171 null] >> endobj 3165 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 99.389 322.856 108.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3164 0 R /H /I >> endobj 3166 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.589 99.389 524.589 108.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3164 0 R /H /I >> endobj 3167 0 obj << /Type /Action /S /GoTo /D [3018 0 R /XYZ 72.0 247.288 null] >> endobj 3168 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 87.389 249.439 96.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3167 0 R /H /I >> endobj 3169 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.165 87.389 525.165 96.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3167 0 R /H /I >> endobj 3170 0 obj << /Type /Action /S /GoTo /D [3029 0 R /XYZ 72.0 769.889 null] >> endobj 3171 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 75.389 288.786 84.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3170 0 R /H /I >> endobj 3172 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.745 75.389 524.745 84.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3170 0 R /H /I >> endobj 3173 0 obj << /Length 3174 0 R /Filter /FlateDecode >> stream xœÍÝÝ’Wz˜és^Ά>PMf®ßïе'4áIÝ´Ý,²a@ mêî'¿,€õ“ õ~Î$F¨¹Áwí*à)TåÊ\¹ò_¾Y_-û?“ÿ3ëz7g¼úÓÛoþå󯯯ÆöªôϿԖ»ºµe)¯Öz·µWo_=ÿ¥öêçóä_¶/ÿ¶ÿϳvýçWÿí›wß,¯þïoþûÿØ›^-û¸ÿýÍò•7?ÞêßüÓ“Ïís°ÿû¿§ÏoyõÓ7ûÝ7ÿçj¯ÖåÕw?>þ×ån="z5ïÊùÛ«ïÞ¾úïßþþþÇ¿ûÛW~ýî‡?¾ÿÏÿá¼úîÿùæwß=ûí–e¹›ÿÞ~·ÿôìSÜ¿ZÆwË˯¢ãmÊïí¿òðŽùŸž}"/_>|”g¿òð;xøß¯~ÊËé3^ž~Âç/ 7ŸÜ׿vƺÁ¬³ïÿån>ûÚù_oþ­¯—7¿¹ó—Ê–Ÿ××Ïë¶œþžä×Þ]¹{õö`)wýÕ·¿þùÓÛŸþGŽý7=ú²ŒežÞâÉØÓ°qûG]¶vþz÷2ž‹ÄEâ.q@›ÄMây{¼-«ÄUbÜVÜVÜVÜÿZC¼à¶à¶‰`Á"‚E«V¬"XE°‰`Á–‚ûßÄQþzÛWh+´ãöv,Ðh;´q{;7h´ààà·»åÅíííne¹Ý­,·»•õv·²ÞîVÖÛÝöƒ7how+¸p+àVÀ­€[· nܸ5pkàÖÁ­ƒ[·nܸ p›à6Ám‚[€[€[€[ÜîV—ÛÝêr»[]nw«ëínu½Ý­®·»Õív·ºÝîV·ÛÝênûñõ\fÄRe¶[ËÞÖ}–¾nÛiØ>ëz9ÃÛgãûÌÅt¼~žŽÇÝöêÛo>¾¸j.±F´­žßáÉÐÓ¸z×g]–6.Æ& û'Ôû¡§Ô…êNuH½‚JݨžRï¢R“eˆå>;¢Z,·E,·E,·U,·U,·U,·M,·M,·, Y²,dYȲ’e%ËJ–,Y¶´,?hþzݪ ÕêzlT7ª§Ôs¥ºRM–A–A–A–!–e˲ˆeYIJ¬bYV±,«X–M,Ë&–eËý¿J]Ȳe!ËJ–•,+Y6²ldÙȲ‘e'ËN–,Y²d9Ér’å$ËI–A–A–!–u˺ˆe]IJ®bYW±¬«XÖU,ë&–u˺‘e!Ë<Òë^oEÎ1ä9ÚÆ²,ãbÜõIýÇP)ûˆu–''AÚç“ ãn=N‚üz:?Ñï–±ìo¾¶ó[<{·ûÕ\ù±ÅyÜùlÂFu£zJÇ®PWª‡Ôyì u¡ºS-–Û"–Û"–Û"–Û*–Û*–Û*–Û&–Û&–Û&–ÛF–…, Y²¬dYɲ’e#ËF–,Yv²ìdÙÉrå ËA–“,'YN²œdddbY±,‹X–E,Ë*–e˲ŠeYŲlbY6±,Y²,dYȲ’e%ËJ–•,Y6²ldÙɲ“e'ËA–ƒ,Y²œd9Ér’eeeˆe]IJ.bY±¬‹XÖU,ë*–u˺‰eÝIJndYÈ2ÏTÔQ×*çŽ3k[–Ù.Æ]Ÿ©ØÞ/ÎTôÏg*ò¾oß¾ÿá´^clwcÝ"F­ç·x2ö4®ßm­Eôqv>™ïßA nOˆ÷oW‰Çíq®w€¸H ‚¹ØáöxÁ\ê1æBˆA0—9Ü,"XD°ˆ`Á*‚U›6l)Ø—u~Cݪ ÕêzlT7ª§Ôs¥ºRM–A–A–A–!–¹¸Aj±ÌÅ P¯bYV±ÌÅ Pob™‹¤Ë\Üu!ËB–…,+YV²¬dÙȲ‘e#ËF–,;Yv²d9Èrå$ËI–“,'YYY†Xæâ©Å27@½Še.nZ,sqÔ›Xæâ©É²ež2Xû²DÛdB~ÜàÑbYæˆó¸mi§ öo‹§ ÆçSÛ]¼úöoþøéþ´¼aŸü/ûÔÒ÷ßÑéMžŒ¾8ÐÚÈ-.Æ]ºQ=¥Ž•êJõ€:OH]¨îT‹ežZ,ó¤Ô›Xæi©É²e!ËB–…,+YV²¬dÙȲ‘eK˹¬ûAÁ u_¨.TwªCê±QݨžRÏ•êJ5YYYY†Xæ©Å2Ï@½Šež!Z,ó Ôb™g¤&ËB–…, YV²¬dYɲ‘e#ËF–,;Yv²ìd9Èrå ËI–“,'YN² ² ² ±Ì3R‹ež!€zË[pCM–…, Y²,dYɲ’e%ËF–,Ÿ. øëõÓ%7Ô…êNuHýtIÀ u£zJýtIÀ u¥š,ƒ,ƒ,ƒ,C,Ÿ- ¸¡ËgKþz½Šå³%7ÔbùlIÀ µX>[pCM–…, Y²¬dYɲ’e#ËF–,Yv²ìdÙÉrå ËA–“,'YN²œdddbùlIÀ µX>[ð×ëU,Ÿ- ¸¡ËgKþz½‰å³%7ÔdYÈòé’˜}?[pw}‚ .wDÜÁ>Ìr7ó A[Ngö£¹eÙµ[_ÏoòdðiÜþuš7Dô:Îãγø!u×A]¨îTÔ¹[ Ôê)u×A-–¹[ Ô›XænR‹eîu!ËB–…,+YV²¬dÙȲ‘e×­-bÝ.¾ë:ë nTO©ó¸êJõ:ë .T“å$Ë Ë ËËÜ-Pj±ÌÝ¡^Å2w ”Z,s·@¨7±ÌÝ¥&ËB–…, YV²¬dYɲ’e#ËF–,;Yv²ìd9Èrå ËA–“,'YN² ² ² ±ÌÝ¥ËÜ-Pj±ÌÝ¥ËÜ-êM,s·@©É²åþÝ~Ì}Üf—rÎâ÷c›½­ã®gñÇ&Óøõqiÿ§û7ç«üO–öŸßâ–µýçQ§©ð“Åý7ÔOV÷ßRª;Õ!õ“þ·Ôê õÓEþ·Ôbùt™ÿ õ*–OúßR‹åÓ¥þ7Ô›X>]ìKM–…, Y²¬dYɲ’e%ËF–,Yv²ìdÙÉrå ËA–ƒ,'YN²œdddbY±|zÀ-µX>½à†z˧·ÜR‹åÓ›n©Åòéí7Ô…, Y²,dYɲ’e%ËF–,Yv²ìdÙɲ“å ËA–ƒ,'YN²œddddbùô>[j±|z§À õ*–O︥˧w ÜR‹åÓûn©Éòé·OÕŸÝ2pö•“ ëåF‚ûOì'K>Ý¿iÿæ]çw¹ñ¶óÀóÔ|³¼Y>)zëÀ-yµ|Hþìî[òby·œTŸÝApKNªÏî!¸!ßHõÙ]·ä¦ZLµ˜j1ÕbªÕT«©VSm¦ÚLõé 7äOï(¸%/–w˃ò§wÜ’7Ë'åOo,¸%¯–›j˜j˜j˜jê³û nÉIõÙ7ä+©>»Çà–œTŸÝepKNªÏî3¸%7ÕbªÅT‹©VS­¦ZMµ™j3ÕfªÍT»©vSí¦:Lu˜ê0ÕiªÓT§©NS S S R}vÂ-9©>»á†|%Õg7!Ü’“ê³ÛnÈ7R}v#Â-¹©S}z/‚ÌéŸÝŒpx>õç ¶‹ ËqÚ!®ýêÛßýúéþÝ÷?<þÊ»÷Ÿî?>¾|ÿ˧¿üòéñõï?¼}ýéåcóúäØ¿O,½ÅÅ}~×ïbŸE‹q1î<; ÊÛfy³|îùþwzÝÊ-y_-¯–ÊÇby±¼[”ÏÍòf¹©†©†©©îÿÑrRÍ«—”“j^¿¤œTó ¦ä©æ5LÊMµ˜j1ÕbªÅT«©VS­¦ÚLµ™j3ÕnªÝT»©vS¦:Lu˜ê4ÕiªÓTÃTÃTÃTƒTóê&多×7%_I5¯pRNªy“rRÍ«œ”›ê>ݨûìds•#óš«ëþa¶Ú.Æ}åBg½Ø­Ü}Y4Ýïê«o?þéû—C÷ƒ×‘Þ±lïñdðËùHÇ9"ö¹ÑÅÀ—¹ÎšòAy>ÕQòby·<(Ï';JÞ,Ÿ’ç‚kÊI5—\K¾’j.º¦œTsÙµä©æÂkÊMµ˜j1ÕbªÕT«©VS­¦ÚLµ™j3ÕnªÝT»©S¦:Lu˜ê4ÕiªÓTÃTÃTƒTó¬多g5('Õ<«A9©æY É7Rͳ”›j1ÕbªÅT‹©VS­¦ZMµ™j3ÕfªÝT»©vSí¦:Lu˜ê0ÕiªÓT§©†©†©†©©æY ÊI5ÏjH¾’jžÕ œTó¬多g5(7Õ¼ˆZƲ´ng ò"j]Ö=Ž«³-ýê´F»ØÓmÿÓør/øÝxõíŸ?½ýùtZ#îJìŸdYÇÅ{<|:ñ°ÝEÛ¿ÐëhÏç)šå“ò<¿*yµ|PžçW%/–wËCòÜ”ŽrRÍmé$_I57¦£œTsk:ÊI57§£ÜT‹©S-¦ZMµšj5ÕfªÍT[ªßÊ×›ò ¼o–7Ë'åcµ¼Z>(Ÿ‹åÅrS¦¦¦¤š»ÖQNª¹oä+©æÎu”“jî]'ùFª¹{å¦ZLµ˜j1ÕjªÕT«©VSm¦ÚLµ™j7ÕnªÝT‡©S¦:Lušê4ÕiªaªaªAª¹­多ÛQNª¹µ多›ÛI¾‘jnoG¹©S=nJÏÛ#›18Ö†ÏQêÕÇùÊi~±Ç]ù¼<|Ím^}ûëÕyýsÿ6±,c™oòdôiàþ‡·äe?x¿x>7°X^,ï–åy¨)y³|Jž *(¯–“j.¨ œTsA多 *('Õ\P!y1ÕbªÅT«©VS­¦ZMµ™j3Õ<Ô\÷¿±£ÜRç‘&Ô•ê!ufB]¨îT‡Ôyˆ u£š,ƒ,ƒ,C,Ë"–Ç}!P‹åqWÈíõ*–Ç=!P‹åqGÔbyÜr{]Ȳe!ËB–•,+YV²ldÙȲ‘e'ËN–,;Y²d9Èr’å$ËI–A–A–A–!–ÇmP‹åqÓÇíõ*–Ç-P‹åqÃÔbyÜî5Y÷–ψ¥ÚÌü8PÛÞnÛÅÀ¯œ?ÛÚ•»úùüA½[_}ûkÞN~: PîöãÜ}\Þ,~z“'£Oû“[çOO³äý¸QòýÀ‘òfù¤|?v¤¼Z>$ÏMð(/–“jn‚'ùJª¹ 多›àQNª¹ žäÅT‹©S-¦ZMµšj5ÕfªÍT›©vSí¦ÚMµ›ê0ÕaªÃT§©NS¦¦¦¦¤š›àQNª¹ žä+©æ&x”“jn‚G9©æ&x”›j1ÕbªÅT«©VS­¦ÚLµ™j3ÕfªÝT»©vS¦:Lu˜ê4ÕiªÓT§©†©†©©æ&x”“jn‚'ùJª¹ 多›àI¾‘jn‚G¹©SÍknµV:8NT´¶¬K\;8Ÿ¨ÈMðæÅ&xg)ò‘F¯¾ýîÏ÷/þå—ûÿúøòç×ï~úåõO/Ïa䔸Î1ëzñÇ_Í;Ñrw97–<(Ϲ±äÍòIyÎ%¯–Êsn,¹©S-¦ZMµšj5ÕfªÍT›©vSí¦ÚMµ›ê0ÕaªÃT§©NS¦¦¦¦¤zÌ%'Õcn ùJªÇÜXrR=æÆ’“ê17–ÜT‹©S-¦ZMµšj5ÕfªÍT›©6Sí¦ÚMµ›ê0ÕaªÃT§©NS¦:M5L5L5Hõ˜KNªÇÜò•T¹±ä¤zÌ!ßHõ˜KnªùémŸ+Ž)SÅÜqŸ^Æl¥]Œ»¾&ŸóÒ‹¹îÃŒû7°úÛl÷áŇûï?Ü¿ûÓ“_úmüðòkà‘O Œ‡ÏîüQÇŸÆÕ»Qê²ÌãΦƒòý;åÅònyP¾'¢¼Y>%Ï»S)'Õ¼;Uò•TóîTÊI5ïN•|#Õ¼;•rS-¦ZLµ˜j5ÕjªÕT«©6Sm¦ÚLµ›j7ÕnªÃT‡©S¦:Mušê4Õ0Õ0Õ Õ¼;•rRÍ»S)'Õ¼;•rRÍ»S%ßH5ïN¥ÜT‹©î?~ÛÏ ùò@¶mû±â~¼x1î+²ëÅž[õóž[=òÒЗÙãÅãc‹Ž—±Ç˯Äæ÷åèû‘ù2.>âãøÓ¸¹š~ÜÑyÜùTïjyµ|Pž÷uI^,ï–åyo—äÍrS S S R- ©·xINªÇM^¯¤zÜæ%9©7zINªÇ­^S-¦ZLµ˜j5ÕjªÕT›©6Sm¦ÚMµ›j7ÕnªÃT‡©S¦:Mušj˜j˜j˜jêq˜ä¤zÜùJªÇ}`’“êq'˜ä¤zÜ &¹©æ£z‰[—£ÛãÑ?­FÌ1/Æmëru¼¾]l&óåY££æùí?¼{ÿøêþ××oÿòó“_ÈCö7÷ç'‹î³·¹.K›ýâƒ<?ëw˶ÚoóbØéh«†Ôm£ºQ=÷zŸdÍåê÷{5µ ¼Z>(ß§”Ë»åAùÜ,o–›j˜j˜jjN-('ÕœZPNª9µ œTsj!ùFª9µ ÜT‹©S-¦ZLµšj5ÕjªÍT›©6Sí¦ÚMµ›j7ÕaªÃT‡©NS¦:M5L5L5L5H5§”“jN-$_I5§”“jN-('ÕœZPnªûÔ¢­ñðtP8*Ï©ÅèmYk¿·­ë‹ÑÕò§™EûrûF}õíïïúåç×áþ׿|¸ÿøñÍûw§ÙÄr|Ä>·™oüø§qû§:·e)ãjÜék”¯‹åÅònyP¾m–7Ë'åeµÜT‹©VS­¦ZMµšj3Õfª-U×ýï`+·ä}µ¼Z>(‹åÅònyP>7˛妦¦¤šs\ÊI5縔“jÎq)'ÕœãJ¾‘jÎq)7ÕbªÅT‹©S­¦ZMµšj3ÕfªÍT»©vSí¦ÚMu˜ê0ÕaªÓT§©NS S S S RÍ9.多s\ÉWRÍ9.多s\ÊI5縔›êqÛÆØçªëÕ$ô«sŇû6–˜£µ‹qûìíÅ€ãòY½Ø£ }¹ocÍó_Þ½ùõo>~úׇkf¿öáqêûð ÿÆÔwŸ/µ.KÏ6Nîñ-NãÆÝÚF̸v>\¨.TwªCêØ¨nTO¨óÎ ©+Õb™·]H-–yÓ…Ôb™·\H-–yÃÔ…, Y²¬dYɲ’e%ËF–,Yv²ìdÙÉrå ËA–ƒ,'YN²œdddb™7VH-–y[…Ôb™7UH-–yKÔ›Xæ R“e!ËãäóçGvÁñØq7E>P,Ÿ¾u÷•ÃËœ3y°ØãáåÃÝcÍE`ø§ÿüøâÉqåÃ/üÇ•yý{i}\|˜Çw8 «wÛºÿöÛV/ÆO=߯—vK½Rª;Õ!õبnTO©çJu¥š,ƒ,ƒ,ƒ,C,sk©Å27özËÜÖGj±ÌM}¤ËÜÒGj²,dYȲe%ËJ–•,Y6²ldÙȲ“e'ËN–ƒ,Y²œd9Ér’å$Ë Ë ËËܹGj±Ì}{ ^Å2wí‘Z,sϨ7±Ì{¤&ËB–y—ÅürõíÀÇ]Ñöãø²]ŒÛÖúbÀØŽãÇñŸBÕ»ùêÛïÞ¿ÿùããËßx|ñÇ7üùÍûŸ>¼þËŸÏ7Yä³p·¥=L#Îäñ]Nã⮵½Ý¿Ý\Œ{ùG•Å¥¼Y>%Ï¥`”WËåû_ZÊ‹åÝrRÍ`”“j®“¼˜j1ÕbªÕT«©VS­¦ÚLµ™jKÕ²,±\}Ã9Ï¢WË«åƒò±X^,ï–ås³¼YnªaªaªAª¹ŒrRÍ`”“j®£œTs˜ä©æ 0ÊMµ˜j1ÕbªÅT«©VS­¦ÚLµ™j3ÕnªÝT»©vS¦:Lu˜ê4ÕiªÓTÃTÃTÃTƒTs多+À$_I5W€QNª¹ŒrRÍ`”›ê±l]–íjêýÕYñ±¬ÏˆýOöbÜ>{1 orÊŕϲ÷?þ°OÚ_Nró±'yÿÒØÚÅ ãÁ9y±õ‹rRͽn('Õ|–ä©æÍ´”›j1ÕbªÅT‹©VS­¦ZMµ™j3ÕfªÝT»©vSí¦:Lu˜ê0ÕiªÓT§©†©†©†©©æ¢ÊI5—ÍH¾’j.œ¡œTsé 多‹g(7ÕbªÅT‹©VS­¦ZMµ™j3ÕfªÍT»©vSí¦:Lu˜ê0ÕiªÓT§©NS S S RÍU5”“j®«‘|%Õ\YC9©æÚÉ7RÍÕ5”›ª[ʳp±Õ˜#ØÀ)¯|Vt-æÌkÒ§Û:.ÎÃåÂçópï~8NwKä>Bu\ zø¤öx>—Ï\¨{Üó¤âiàùLY±¼[”ç^¬’7Ë'åûLŠòjù ¼›j7ÕnªÝT‡©S¦:Mušê4Õ0Õ0Õ0Õ Õm!Õm!Õm!Õm%Õm%Õý9å©n©n©n›©S-¦ZLµšj5ÕjªÍT›©¶T-Ëþ3ýêÇý9Êûfy³|R>VË«åƒò|ž§äÅrS¦¦¦¤z<ÏSrR=žç ùJªÇó<%'Õãyžo¤z<ÏSrS-¦ZLµ˜j5ÕjªÕT«©6Sm¦ÚLµ›j7ÕnªÃT‡©S¦:Mušê4Õ0Õ0Õ Õãyž’“êñ·tŽei}»x>µR,ï–åùÜRÉ›å“ò|n©äÕòAy˜j˜j˜jj®Ÿ¢œTsý”ä+©æú)ÊI5×OQNª¹~ŠrS-¦ZLµ˜j5ÕjªÕT›©6Sm¦ÚLµ›j7ÕnªÃT‡©S¦:Mušê4Õ0Õ0Õ Õ\?E9©æú)ÉWRÍõS”“j®Ÿ’|#Õ\?E¹©S-¦ZLµšj5ÕjªÕT›©6Sm¦ÚMµ›j7ÕaªÃT‡©S¦:Mušj˜j˜jj®Ÿ¢œTsý多ë§('Õ\?%ùFª¹~ŠrS-¦ºÿ8˜ËQç ³y&fÿIµ,[”‹[Y.ÎÄ”—ûˆ7&þÏ×?Ü¿œèæÕæ< SÛz1ìáÑzu&Ÿo?úÇŸÓ|:ou¡ºSRç£í¡nTO©ó¹öPWªÉrå ËA–ƒ,'YN²œdddb™+ޤË\o$µXæj#©Å2×A½‰e®4’š, Y²,dYȲ’e%ËJ–,YæsëÇçDßç3>$/–w˃òÜÅTòfù¤<Ÿ[/yµÜTÃTÃTÃTƒTsyå¤z\b„|%Õ\^D9©å’“j./¢ÜT‹©S-¦ZMµšj5ÕfªÍT›©6Sí¦ÚMµ›ê0ÕaªÃT§©NS¦:M5L5L5H5—QNª¹¼Hò•Tsy多ˋ$ßH5—QnªÅTó¤V,ëfgŽåEˈhýjàV¶‹“Zõr×û_ßþ|:5µÝõ¾,KéW£>«íjÛû}–³/>ì5vxšjïÓÉ÷yåÍòIù>Õ¡¼Z>(Ï'pK^,7ÕnªÃT‡©S¦:Mušj˜j˜j˜jj.袜TsA—ä+©æ‚.ÊI5tQNª¹ ‹rS-¦ZLµ˜j5ÕjªÕT›©6Sm¦ÚLµ›j7ÕnªÃT‡©S¦:Mušê4Õ0Õ0Õ Õ\ÐE9©æ‚.ÉWRÍ]”“j.è’|#Õ\ÐE¹©S-¦ZLµšj5ÕjªÕT›©6Sm¦ÚMµ›j7ÕaªÃT‡©S¦:Mušj˜j˜jj.袜TsA多 º('Õ\Ð%ùFª¹ ‹rS-¦zœûª1cYé,ÓqîkmŸOš‹s_ír§ùŸ~|9ÏÍg³ÔÜ+¶‹Q_¶éj—[ͯ³~¾ï4ð|î«XÞ-Êëfy³|RÞVË«åƒònªÝT»©vS¦:Lu˜ê4ÕiªÓTÃTÃTÃTƒTóÌ多gÖ$_I5ϬQNªyfrRÍ3k”›j1ÕbªÅT«©VS­¦ÚLµ™j3ÕfªÝT»©vS¦:Lu˜ê4ÕiªÓT§©†©†©©æ™5ÊI5ϬI¾’jžY£œTóÌšä©æ™5ÊMµ˜j1ÕbªÕT«©VS­¦ÚLµ™j3ÕnªÝT»©S¦:Lu˜ê4ÕiªÓTÃTÃTƒTóÌ多gÖ('Õ<³F9©æ™5É7RÍ3k”›ª[zØj>–¥—Fç°¶š/­\}œ}qqf­Ÿ¶š?V•ýåtbíÉ3σn|†ãyàÕ‰5Ê»åAùÓg8Þ’7Ë'åOŸáxK^-”wSí¦ÚMµ›ê0ÕaªÃT§©NS¦¦¦¦¤ú쎷ä¤úìŽ7ä+©>{†ã-9©>{†ã-9©>{†ã-¹©S-¦ZLµšj5ÕjªÍT›©>}†ã-yPþôŽ·äÍòIùÓg8Þ’WËåOŸáxK^,7ÕiªaªaªAªÏžáxKNªÏžáxC¾’ê³g8Þ’“ê³g8Þo¤ú쎷ä¦ZLµ˜j1ÕjªÕT«©VSm¦ÚLµ™j7ÕnªÝT‡©S¦:Lušê4ÕiªaªaªAªÏžáxKNªÏžáxKNªÏžáxKNªÏžáxC¾‘ê³g8Þ’›j1Õ§Ïp”sXÏžáx¸•¸8±6O»Á牵¿yûñtNj»ûí!ާA_ÖÑ]XÛ·²,¹µýiÜùÌ×”:g:PWª‡Ô9ͺPÝ©©sŠ5Yv²d9Èrå$ËI–“,'YYY†Xn‹Xn‹Xn‹Xn«Xn«Xn«Xn«Xn›Xn›XnY²,dYȲ’e%ËJ–•,Y6²Ì)̶'kÔ[òœÂH^-”çFòby·<(Ï)ŒäÍrS S S R- ©–…TËBªe!Õ²’jYIµ¬¤Z6R-©–ÍT‹©S-¦ZLµšj5ÕjªÍT›©6Sí¦ÚMµ›j7ÕaªÃT‡©NS¦:M5L5L5L5Hµ.¤ZR­ ©Ö•TëJªu%Õº‘jÝHµn¤Z7S=nœ˺lNg´¶%¢/q1p«WÅiWýO?þéͧן޼w>«wû϶eÙ§ñ#öû«1÷*±µe)K»x>›Ô,Ÿ”ï?T(¯–Ê÷*”Ë»åAù0ÕaªÃT§©NS¦¦¦¦¤šk®('Õ\s%ùJª¹æŠrRÍ5W”“j®¹¢ÜT‹©S-¦ZMµšj5ÕfªÍT[ªÖ˜cÄMyPÞ7Ë›å“ò±Z^-”ÏÅòb¹©NS S S RÍ5W”“j®¹’|%Õ\sE9©æš+É7RÍ5W”›j1ÕbªÅT«©VS­¦ZMµ™j3ÕfªÝT»©vS¦:Lu˜ê0ÕiªÓT§©†©†©©æš+ÊI5×\QNª¹æŠrRÍ5W’o¤šk®(7Õbªy†ªGD[7:”g¨j¯½Ô‹ûþËóá) ϲÿz—!Ž=øÿñÃûŸ>¼~ûöþÃÿñññWß¾~÷ËëÓúûwö>òNÊïú8útF§Ü-±îGüu»w>Ô-ÊóIï’7Ë'åù¤wÉ«åƒò|Ò»ä¦:Mušj˜j˜jj®G¢œTsE’ä+©æš$ÊI5W%I¾‘j®K¢ÜT‹©S-¦ZMµšj5ÕjªÍT›©6Sí¦ÚMµ›ê0ÕaªÃT‡©NS¦:M5L5L5H5—(QNª¹D‰rRÍ%J”“j.Q’|#Õ\¢D¹©S-¦ZLµ˜j5ÕjªÕT›©6Sm¦ÚMµ›j7ÕnªÃT‡©S¦:Mušj˜j˜j˜jj.Q¢œTs‰’ä+©æ%ÊI5—(QNª¹D‰rSÝg=–eÙj•S)yþg]zDíåbÜV_n?¶‡'U>Ëö_ÈÁ~õíïï¼ÿpÿîO÷¿ôÃëO¯ÿøúãÓ_¹ÿøæ§w³è¶ÖeûŸ?Êãè‹éôÜößD›íbÜÕtšòjù |ŸNS^,ï–åûtšòf¹©S-¦ZLµšj5ÕjªÕT›©6Sm¦ÚMµ›j7ÕaªÃT‡©S¦:Mušj˜j˜jjN§)'ÕœNSNª9¦œTs:-ùFª9¦ÜT‹©S-¦ZLµšj5ÕjªÍT›©6Sí¦ÚMµ›j7ÕaªÃT‡©NS¦:M5L5L5L5H5§Ó”“jN§%_I5§Ó”“jN§)'ÕœNSnªûì`/÷¤U™‰Öœ&ÄþOŸWóä­^ì ]·—;Ýä#VT,ù1¾ûóýã‹}"ýóÓ—ß¿½ÿôúå|x?«kî"½Ž‹·}šGç—O¶K»÷òi=Ë ’oÇaäÅònyP~–AÞ,Ÿ”o¤ºm¤ºm¦ZLµ˜j1ÕbªÕT«©VSm¦ÚLµ™j7ÕnªÝT»©S¦:Lušê4ÕiªaªaªaªAªe!Õ²jYHµ¬¤ZVR-+©–TËFªe#Õ²™j1ÕbªÅT«©VS­¦ÚLµ™j3ÕfªÝT»©vS¦:Lu˜ê4ÕiªÓT§©†©†©©Ö…TëBªu!Õº’j]Iµ®¤ZWR­©ÖTëfªyÑ{ì³ô:iž›½—˺,ëŸëYz}¹{Çþç¼=\ö޼°þy–þðâ·Yúç—߻Ҟ&ÄËÝòe¿Ûóû??+wµˆ­µ‹qçyw·<$ÏÍ (o–OÊ÷-Ê«åƒòý@‹rRÍÍ (7ÕbªÅT‹©VS­¦ZMµ™j3Õ–ªsYÆ\oʃò¾YÞ,Ÿ”Õòjù |.–ËMušj˜j˜jjnN@9©ææ’¯¤š›PNª¹9ä©ææ”›j1ÕbªÅT«©VS­¦ZMµ™j3ÕfªÝT»©vS¦:Lu˜ê0ÕiªÓT§©†©†©©ææ”“jnN@9©ææ”“jnN ùFª¹9å¦ZLõ˜¦ïsíý[±Ìsizï{ºÌ‹q×Óôör ƒ¼ÿ0MŸ“ôùtŠž/¾ý˧?¿ÿpš ïŒ=3Ö‹·þ2ú4jÜÍ{*œG縋åÅònyPžº%o–OÊóB·äÕrS-¦ZLµ˜j1ÕjªÕT«©6Sm¦ÚLµ›j7ÕnªÝT‡©S¦:Mušê4Õ0Õ0Õ0Õ ÕãB·ä¤z\è†|%ÕãB·ä¤z\è–œT Ý’›j1ÕbªÅT«©VS­¦ÚLµ™j3ÕfªÝT»©vS¦:Lu˜ê4ÕiªÓT§©†©†©©º%'ÕãB7ä+©º%'ÕãB7䩺%7ÕœA·²¬m½Ê¿2=æÏ{9£] ÚÚÅÃ'jyxžä~˜>×'kÑ^Î^³×‡—ßÿåþÛ÷?¼ùÓiŸú\…¼úŸ7I;}Ç÷8M·»¥í¿÷WŸÜyÎØ,Ÿ”çf§’WËå¹Ù©äÅònyP^Mµšj5ÕfªÍT›©vSí¦ÚMµ›ê0ÕaªÃT§©NS¦¦¦¦¤šWG)'Õ¼:*ùJªyu”rRÍ«£”“j^¥ÜT‹©S-¦ZMµšj5ÕfªÍT›©6Sí¦ÚMµ›ê0ÕaªÃT§©NS¦:M5L5L5H5¯ŽRNªyuTò•Tóê(多WG%ßH5¯ŽRnªÅTso¯è1ë¼Ê¿:›;f¤Ûy%óbÜõŒt^ìíÕ¿<-m{ÜÛëxñ¸·×ÃËïß½ÿtÿâMó±WÛ–óéØ.Þþqôi\ÜõýɲԸ÷ò)ŸEy³|JžvS^-”ïm)/–wËI5/3SNªy™YòbªÅT‹©VS­¦ZMµšj3ÕfªÍT»©vSí¦:Lu˜ê0ÕaªÓT§©NS S S RÍËÌ”“j^f¦œTó23多—™%ßH5/3SnªÅT‹©S-¦ZMµšj5ÕfªÍT›©vSí¦ÚMµ›ê0ÕaªÃT§©NS¦¦¦¦¤š—™)'Õ¼Ì,ùJªy™™rRÍËÌ”“j^f¦ÜTsv0ë>-nW³î¯N‹5Ò¿ 8ÛZ9OêÛr±Øø2©¯O'õõù¤þ¸ÌüËÇûÓ}Æyð6ö㚺¶‹·}1©_æX–Ö·‹qW“zÊ›åSòã¡Ö’WËåy.Nòby·œT‡ZKNªÇC­!/¦ZLµ˜j5ÕjªÕT«©6Sm¦ÚLµ›j7ÕnªÃT‡©S¦:Mušê4Õ0Õ0Õ Õã¡Ö’“êñPkÉIõx¨µä¤z<ÔòT‡ZKnªÅT‹©S-¦ZMµšj5ÕfªÍT›©vSí¦ÚMµ›ê0ÕaªÃT§©NS¦¦¦¦¤z<ÔZrR=j ùJªÇC­%'Õã¡Ö’“êñPkÉMõ˜Ôe]ÇUþÕiñÃC­÷öã®'õûÏðý§Õ²Ž%~›ÔÏ/“úùtR?ŸOêíÃ~~óîŸO“ó'Ï;¿ýãèÓ¸ý«mÙÿŒy1ì<ë^©®T¨s3© Õê:Þ nT‹å±Dj±<èß^²,dYȲe%ËJ–•,Y6²ldÙɲ“e'ËN–ƒ,Y²œd9Ér’eeeeˆå±j±hÿQt1ê<1m–OÊ÷CÊ«åƒòýè†òby·<(/¦ZLµ˜j5ÕjªÕT›©6Sm¦ÚLµ›j7ÕnªÃT‡©S¦:Mušê4Õ0Õ0Õ Õ|ú多O¿’|%Õ|ú多O¿’|#Õ|úå¦ZLµ˜j1ÕjªÕT«©VSm¦ÚLµ™j7ÕnªÝT‡©S¦:Lušê4ÕiªaªaªAªùô+ÊI5Ÿ~E9©æÓ¯('Õ|ú•䩿ӝ(7ÕbªÇ}«ÛÃ~i7O,›Íc?žXë¸u=!.ýFDŸåbÜy~”ïG”7Ë'åûåÕòAù~„@y±ÜT«©6Sm¦ÚLµ›j7ÕnªÃT‡©S¦:Mušê4Õ0Õ0Õ Õý?ZNª¹ê™rRÍUÏ”“j®z–|#Õ\õL¹©S-¦ZLµ˜j5ÕjªÕT›©6Sm¦ÚMµ›j7ÕnªÃT‡©S¦:Mušj˜j˜j˜jj®z¦œTsÕ³ä+©æªgÊI5W=SNª¹ê™rSÍýÉFßç[³É|+§Œs®û”ñr.x=eÜ¿Ÿ§ŒëÔqܵÇ)ãñâqÊøðòû_¯nfŽv×ÚX–>ëÅx~·½•íkãNGZËjyµ|P¾O³)/–w˃òœIKÞ,7ÕbªÅT‹©VS­¦ZMµšj3ÕfªÍT»©vSí¦:Lu˜ê0ÕaªÓT§©NS S S R=fÒ’“ê1“–œT™´ä¤z̤!ßHõ˜IKnªÅT‹©S-¦ZMµšj5ÕfªÍT›©vSí¦ÚMµ›ê0ÕaªÃT§©NS¦¦¦¦¤z̤%'Õc& ùJªÇLZrR=fÒ’“ê1“–ÜTóÒk˺lMf¢Ç¦`[ùÚ¸ë™ôþ=í<“޾̤ËÓ™ty>“>üëÕ^ßù¼µuÙÿ//Ÿ>ÀãðÓ¸¸«óh¯Æçº›åÍòIùþÅOyµ|P¾ñS^,ï–›j1ÕbªÅT«©VS­¦ÚLµ™j3ÕfªÝT»©vS¦:Lu˜ê4ÕiªÓT§©†©†©©æ"fÊI51K¾’j.b¦œTs³ä©æ"fÊMµ˜j1ÕbªÕT«©VS­¦ÚLµ™j3ÕnªÝT»©S¦:Lu˜ê4ÕiªÓTÃTÃTƒTs3多‹˜)'Õ\ÄL9©æ"fÉ7RÍEÌ”›j1Õc&Ý"ú^ÀLô˜I¯±¬[mã¶Ö.fÒãb'®ýçúçOgÒñ|&ÇLúj/®ü+ÒgD]ëÅx~7îfË’†§º Õ…êNuH½ÿ5‘ºQ=¥ÞÿŽH]©&ËB–…, Y²¬dYɲ’e#ËF–--GÄþû–¼/–Ë»åAùØ,o–OÊçjyµÜTÃTÃTÃTƒTsC,ÊI5·Ä’|%ÕÜ‹rRÍm±('ÕÜ‹rS-¦ZLµ˜j5ÕjªÕT›©6Sm¦ÚLµ›j7ÕnªÃT‡©S¦:Mušê4Õ0Õ0Õ ÕÜ1‹rRÍ=³$_I5wÍ¢œTsß,É7Rͳ(7Õœ5·}V8—«iíWgǬ¹¬ËÒæÕ¸ó¬9™çi7¬‡GR劒ߦÌ/~ÿãßýíãË^ïsèן?Ü|óÓ»Óœ2÷Xß7Ë(îqôi\»Û¿k-ËvõYžg®SêýÈEêJõz?l‘ºPÝ©©÷C©É²e%ËJ–•,Y6²ldÙȲ“e'ËN–ƒ,Y²œd9Ér’å$Ë Ë Ë˼,µXæÕ`¨W±ÌkÁR‹e^ †z˼,5Y²,dYȲ’e%ËJ–•,Y6²ldÙɲ“e'ËA–ƒ,Y²œd9Ér’eeeˆe^î•Z,ób¯Ôb™—z¥˼Рõ&–y™Wj²,d™÷÷íóÓ–nŸß÷·/O[:ÛÚx1 ¯ñÆi«ªq÷pÛñhOn;~xñÛ%ÞÏ/¿ÿŸïùðîõÏßçnU¯&KK‹ˆqõqßæbÚÔúþ‡U{½w5o¢¼Y>)ß§N”WËåûì‰òby·ÜT»©vSí¦:Lu˜ê0ÕiªÓT§©NS S S RÍé多*ÉWRÍ)多“*É7RÍiå¦ZLµ˜j1ÕjªÕT«©VSm¦ÚLµ™j7ÕnªÝT‡©S¦:Lušê4ÕiªaªaªAª9ߢœTsÆE9©æœ‹rRÍY—䩿¼‹rS-¦š?ö#¬µ­WùWç,9õs?‰v1ìræÕ—ÓŽOãîómªÛÝ“çæ/×/ÿ¯¿ÿîßýÿùw/€ö÷\ç\–ÒêÅxÿrܺ“­ûß€ÑÆÅ¸ÓÖZ-”o‹åÅònyPž“QÉ›å“òjªÕT«©6Sm¦ÚLµ™j7ÕnªÝT‡©S¦:Mušê4ÕiªaªaªAªÇdTrR=&£¯¤zLF%'Õc2 ùFªÇdTrS-¦ZLµ˜j5ÕjªÕT«©6Sm¦ÚLµ›j7ÕnªÃT‡©S¦:Mušê4Õ0Õ0Õ Õc2*9©“QÉIõ˜ŒJNªÇdòTɨä¦ZL5ìSʈe“ÙÜñÈš­Æ#.Æ]ÏF·Ó®Iãîó­žëÝxœ/g£ÇËßÿî?]ÎFs•P¬ûÄøâ<Ž?+wcÉßw/ãÎÓËnyPžÀ“¼Y>)ÏàI^-”çð$7ÕjªÕT›©6SÍà-±¬u^}áŸ'€«åÕòAy>Oòby·<(ÏàIÞ,7Õ0Õ0Õ Õ²jnÊK9©æ¦¼’¯¤š›òRNª¹)/多›òJ^Lµ˜j1ÕbªÕT«©VSm¦ÚLµ™j7ÕnªÝT»©S¦:Lušê4ÕiªaªaªaªAª¹)/多›òJ¾’jnÊK9©æ¦¼”“jnÊK¹©æôòᘶÊôì˜^.cY÷C–‹q×ÓËrÚJhÜÕ‡e¦ýn}\fz¼x\fz¼üÃïþñ?þþ?~÷¿ÿÃiöTïúhËR–vñ!ßá4.w^î…ÏãÎó¢Åòby·<(?ö¾‡¼Y>)?ö¾‡¼ZnªÝT»©vSí¦:Lu˜ê0ÕiªÓT§©†©†©†©©–…TËBªe!Õ²’jYIµ¬¤Z6R-©–TËfªÅT‹©S­¦ZMµšj3ÕfªÍT›©vSí¦ÚMu˜ê0ÕaªÓT§©NS¦¦¦¤ZR­ ©Ö…TëJªu%Õº’j]Iµn¤Z7R­›©æ¬«ìðÞ¦ÌYŽ¦Ñ–µÔr1îzÖU/¶¢iõÊÝöxQïxñxQïxùÿð‡¿ÿîïÿáÿ}yL“׎ˈ¨e^|€Çñ§qq7û>Ûlëv1îtè”;¡JÞ,Ÿ”çf¨’WË幪äÅòn¹©VS­¦ZMµ™j3ÕfªÝT»©vSí¦:Lu˜ê0ÕiªÓT§©†©†©†©©£JNªÇƨ¯¤zlŒ*9©£JNªÇƨ’›j1ÕbªÅT«©VS­¦ÚLµ™j3ÕfªÝT»©vS¦:Lu˜ê4ÕiªÓT§©†©†©©£JNªÇƨ¯¤zlŒ*9©£B¾‘ê±1ªä¦š£.û¬r‰ÙÜq °Œ‡-jÎãγÑÌÚi«™yÌEóhóÕ·¿ÿû?<¾xýî‡ÇÞ|üõñÕï?¼}ýéñõÇ¿ÜÿéÍoþôúÓ›÷ïÎ{ÐŒ»µŽeÙÄ_|ïr1É*µíívõ‰_M²(ï–åû$‹òfù¤|ŸdQ^-”wSí¦ÚMµ›ê0ÕaªÃT§©NS¦¦¦¦¤š“,ÊI5'Y’¯¤š“,ÊI5'Y”“jN²(7ÕbªÅT‹©VS­¦ZMµ™j3ÕfªÍT»©vSí¦:Lu˜ê0ÕiªÓT§©NS S S RÍI多“,ÉWRÍI多“,É7RÍIå¦ZL5Ÿø››…Î"S–œ’õËÒK»·µùb@^ ì§=hæçÝ?óÑo^üö´ŠÏ/?OØŽoÞþåçû·÷ï>Ó°Óaú>]o}YöãÆ‹ùø.³å·û%Oã®f’ï³Ê‹åÝò |Ÿ PÞ,Ÿ”ï³ÊMušj˜j˜j˜jjÎ('Õœ H¾’jÎ('Õœ PNª9 ÜT‹©S-¦ZMµšj5ÕfªÍT›©6Sí¦ÚMµ›ê0ÕaªÃT§©NS¦:M5L5L5H5g”“jÎ$_I5g”“jÎ$ßH5g”›j1Õœ ”åa}8vÎé@›3flWã®§ó´ Èü¼%eÔ'[R>¼ørYæáÕß}÷w/ÞpÝ¿mÔýï_´rõÖC_ŽËK¶³FÔ¶^Œ{ù´æ%[É»åAy^²•¼Y>%ßò’­äÕòAùJª¹ 多{ÀH¾‘jîC¹©S-¦ZLµšj5ÕjªÕT›©6Sm©Ú–%Ƹ%ï«åÕòAùX,/–w˃ò¹YÞ,7Õ0Õ0Õ Õý?ZNª¹ 多{ÀPNª¹Œä©æ0”›j1ÕbªÅT‹©VS­¦ZMµ™j3ÕfªÝT»©vSí¦:Lu˜ê0ÕiªÓT§©†©†©†©©æ0”“jî#ùJª¹ 多{ÀPNª¹ 妚;DîsÜØÿˆd޾ÏëïÖ¾˜Ù®ÆÏ.äúÏ8í;À”üÿåã›w?=¾üíbãÃË7ïÿý_ßÿòáñÕ_>¼ÿéÃë·§•Ÿ¹+èl­Î‹ý8þ4[î–ýÿ=¬=;OÞŠåÝò <¯4HÞ,Ÿ”ç•É«åƒòfªÍT›©6Sí¦ÚMµ›ê0ÕaªÃT§©NS¦:M5L5L5H5Ÿ>A9©æÓ'$_I5Ÿ>A9©æÓ'$ßH5Ÿ>A¹©S-¦ZLµšj5ÕjªÕT›©6Sm¦ÚMµ›j7ÕaªÃT‡©S¦:Mušj˜j˜jj>}‚rRͧOPNªùô ÊI5Ÿ>!ùFªùô ÊMµ˜jnT³Ä²l=dulTSëç;Oãöƒß‡¿ûî›ÚÿùÿY<˜] endstream endobj 3043 0 obj [ 3042 0 R 3044 0 R 3045 0 R 3046 0 R 3047 0 R 3048 0 R 3049 0 R 3050 0 R 3051 0 R 3052 0 R 3053 0 R 3054 0 R 3055 0 R 3056 0 R 3057 0 R 3058 0 R 3059 0 R 3060 0 R 3061 0 R 3062 0 R 3063 0 R 3064 0 R 3065 0 R 3066 0 R 3067 0 R 3068 0 R 3069 0 R 3070 0 R 3071 0 R 3072 0 R 3073 0 R 3074 0 R 3075 0 R 3076 0 R 3077 0 R 3078 0 R 3079 0 R 3080 0 R 3081 0 R 3082 0 R 3083 0 R 3084 0 R 3085 0 R 3086 0 R 3087 0 R 3088 0 R 3089 0 R 3090 0 R 3091 0 R 3092 0 R 3093 0 R 3094 0 R 3095 0 R 3096 0 R 3097 0 R 3098 0 R 3099 0 R 3100 0 R 3101 0 R 3102 0 R 3103 0 R 3104 0 R 3105 0 R 3106 0 R 3107 0 R 3108 0 R 3109 0 R 3110 0 R 3112 0 R 3113 0 R 3115 0 R 3116 0 R 3117 0 R 3118 0 R 3119 0 R 3120 0 R 3121 0 R 3122 0 R 3124 0 R 3125 0 R 3126 0 R 3127 0 R 3128 0 R 3129 0 R 3130 0 R 3131 0 R 3133 0 R 3134 0 R 3136 0 R 3137 0 R 3139 0 R 3140 0 R 3142 0 R 3143 0 R 3145 0 R 3146 0 R 3148 0 R 3149 0 R 3151 0 R 3152 0 R 3153 0 R 3154 0 R 3155 0 R 3156 0 R 3157 0 R 3158 0 R 3159 0 R 3160 0 R 3162 0 R 3163 0 R 3165 0 R 3166 0 R 3168 0 R 3169 0 R 3171 0 R 3172 0 R ] endobj 3041 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 3043 0 R /Contents 3173 0 R >> endobj 3174 0 obj 16045 endobj 3176 0 obj << /Type /Annot /Subtype /Link /Rect [ 227.135 649.77 250.455 658.77 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1713 0 R /H /I >> endobj 3178 0 obj << /Length 3179 0 R /Filter /FlateDecode >> stream xœÍWM“Û6 ½ûWpriÒÙeHÉ’¬3mÚôÔmÜétÒh›’ØÕ‡CRëî¿/$H"%ËÉu³™Hx Ò_7œ0ø»ï>»-§»]JŽÕæë ç$ HªˆÑm1¾¥AD*2WE¤ìÖxB0Jð™Í\¿6õ†‘_6Ÿ¿Àœa°î²a7Œ÷¦>m¼Ø† ¿¤øÉ7ï÷›·"ÂÙg.Å< <æiš&dGà íþd_‘ϯÿ4ªÎÉ2ûé=Q5ynZMκɵ¨Ì›/dÿÛæçýŒ{Èݽ4곡t’$¡lYR½™u A‹ÝÐ,%D/3 2ÀïÍÙUÄÌøºš^Lp· )Nh¡’4…!º›•RóoUÌ‹¡w],A×mÖÛÝÕ±ù'"$;ÍŠ®gýÚ\ä“ÔwÄRKR‰gr¤nȱT²¶¤T-ô3É'/OðQV’RÔy+r‰N:F1¸Ñ9Ä’€Ñš£##a Ê]šB7Eï<¥!%{u6DÔ'bµ:>šÑ^~ƒhÑ€‰d»E+ûBÿ­ÖsùLÑ"?ˆœ4ƒöaˆJMmÔIjJ>ZrQ%ìNs–Y[–=骫ۣmµ<aÁN)¬ÔĪJRÇ3bcÊìc|A6 iÇ0&YNÉï"ïZÓÚsk¿G–ƒùt 9K"´ò1#oÈ}C¥¾† q@·µǦª £ÆiJõ(Z"ÊÃmšn#~í2—VËl¹$ÙÑm…ËwáõçÉÇ -ç!AêÝÔÆc#a¿k²ÌHûe\|ý~ƒ•ÅãÁæcÇ_sËÄÆ!KÓ8¹åÿ¶Ûø[kw, ”]ßP·Õajž€›ÌÉ]ùiiãbÙß9k„K/þî~/aÊh÷€L#¾–R܈› ÙÂ=òÕ73²rDvË[ÇåjÇ\®P† ºkˆGiœ³…²yTg‡°$‡Y˜( '»†ÃMn_øÓ•¹óì€YlS§Ãi=‚é8­¸u·ß­´ëF¢wœ]§*`Ë‹§Ýu«ºíúÝÐÚaôò`õy=¼2†±Â™ÒÆ[Û>É~¢f¨DFúèz2ç¾KÝ´yá FÔárIÕÌøWÝÀÊ›&VrÇ—×PÙ4}©¤t7æ§áI¦•ÄGŽNöiõ tÛ‹9p:»,Û^Œ&©­­*'T;¯ãÃoÝ‹ðÅ“P¥8”øœéUŸæwW¯s—ÆiVr,o§s¾:ã°~V&AñºBùš ]ú_UÓ¼IúÚÊþ•ˆß(O_„ecµ>s(ŽWû`ØÍÁk~˜ÔÔ?Ø 8ý¾¢xh»Ç”)då¹?¹gêýj~Øü›Žg“ endstream endobj 3177 0 obj [ 3176 0 R ] endobj 3175 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 3177 0 R /Contents 3178 0 R >> endobj 3179 0 obj 1407 endobj 3181 0 obj << /Type /Annot /Subtype /Link /Rect [ 252.906 85.492 278.446 94.492 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2180 0 R /H /I >> endobj 3183 0 obj << /Type /Annot /Subtype /Link /Rect [ 299.296 85.492 324.836 94.492 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2194 0 R /H /I >> endobj 3184 0 obj << /Length 3185 0 R /Filter /FlateDecode >> stream xœÍÛnÛ6ôÝ_A}H„&©{‡زuØÐ íj Ú¢`d:Ö¢‹#Êõò²oßáE"%Ën÷°xŽÈs¿Ñ Š|¯Õ# )NÓ åÕâÁâ)J b‹ŠYDH€hˆY„*4FE¨Tg¼ëWðíx‹Þ/êA¿,>|‚=kDàÜaANפÞ-Þz²Ù °~Jòù„àôé øvìà$I0™:^“ 0†¢z5d .#ŒÑÀ6{TüÑ[þŧä–k! _Œ®1ÆòÍ¥óÜ>î¸ÔjÓÇÚ>R8Ð3‹AXÉ ph­¢4ŠŒˆñÎAk.ïÊGï=/ï=¨‰á€ÁÖ–hÁ¤Ø!Vþf)v¼åðùð/¼(• ’@H”–RcÍìF«ýâ…y*Bi Iq©ãq€LD:¸¨v¥¨z{œUÄÆšK£€‡nªj_9IS;t-r!%o=j[·{o//ËcÝR6ÑM1JÔl6¢…à¾}DJÀÔûyÓ6â&ïŒ;qŸq×&©uFœ@û§3¥Ç)UµÌ2„m£_k ž.µz_Ë_D˜ªÊ˜’ÈÐx]Ü› ŽtÈõY¨¡ª‘ƒzïôï”wä•Ãô¹¯MS–Í¡¨ïÊšÇ!¤xØ‹:±/=…Qì‡9ql¤ôC6ôÏéÐh†]BϪ£©(FAaBåzÛžþhºÁ–Çsœˆ¡~“”¤¯qAã¬Ô¶¶i:qWRBá‘Чª™*GKu£OwÈD]GLvÉÿQð‚4Ãq½~†‚Ç0ºúRH¤¨»¢E›}«ò'¿:¿ÐÓ$ÌÒ$É&õâÌ«xJŒ}çU<éë‘Nt6ÿ¬ƒ éÖÍíßи¯›VkìÞ¬¶þ>)ò¾ƒY"u×]hcÇÁåDÑ^XŠ3üÐ8 ·ötoí`a ~VÒ€ö½ÛèQ¹¯›ƒƒŠÚ­›vmúññ¡CÓÞ{Pß}¬žÀÆ€Ø!V)¼|L½oA!þájˆ¸š±WLìû8ÌjùVä÷:ªmlÁìg‚W‡îQfRc¢†ñ4™£Ú Ùá]y6N)Œ‘gHØÉõ#´¶šÐÚhF¹(ÁŒ&„öÎŒt”éÐäÚWС0@6 P8ü^ê °›šaÉs5R9P÷n³î‡ÌžMé;Ç,2»™4ÃÃË•“åNt3†ˆ³±! Ê¶sW(oLµ0›Õâ`ª¯LT…‘¢ÓÖ‘j ®\¦ä‹sE:„ÆÒŒÚ·/°šÑá»™ËÔªñÙê=³¦{©ýFBBcB–Êõ÷ Ü缩ë¢Þ4//(_zq….²$Õ³âíý^ª•ºË¨g+6ë[É3™…S•Ñìçb¹m*±4Ô—%\uà^±o…b°ÜËvY6àú¥ÜÂåo©9.s)Í çFèOŸÏ©Ó!N¶:}uƒ&Á¢ ’¤Fªøå¼Fw â[Á×6$àg˜ö!T|ØkG©úI…ûl\ĸ%,K#˜ŒKäèÁmä%¼£uý\²[ß‚wæU!L&¤Ö¼ã>È…Ï ÷ñržôŠ1…¯M1ø˜4KYȾm’ˆÕMÅp3Nlêý N©û•m1Pæ¨Á…¹køno*Œm0€_F,j¸3Ú60sj¨E=ÜûuÀØ,Pó²¹kö¾Ó”¾êv8Ò×2MÈ”‰Álš½¹ÐôO³œ°¢)Á‰ ‰Ò9¦:‚øä #1à fÎ8^Ü—hJJËc6GD3Χg"†Ó§Qx–±½/c‡y'Ä ƒ'¸lÛk¤AíøðLËo›}7:-§U(eáD¾ÛÁ•½Qãe ‡Z¤ªd[™`ˆöAù{,¾]ü›£u endstream endobj 3182 0 obj [ 3181 0 R 3183 0 R ] endobj 3180 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 3182 0 R /Contents 3184 0 R >> endobj 3185 0 obj 1788 endobj 222 0 obj << /Type /Action /S /GoTo /D [3186 0 R /XYZ 72.0 257.477 null] >> endobj 3187 0 obj << /Type /Annot /Subtype /Link /Rect [ 146.221 306.977 220.752 315.977 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 124 0 R /H /I >> endobj 3189 0 obj << /Type /Annot /Subtype /Link /Rect [ 227.472 306.977 371.612 315.977 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 124 0 R /H /I >> endobj 3190 0 obj << /Type /Action /S /GoTo /D [3180 0 R /XYZ 72.0 769.889 null] >> endobj 3191 0 obj << /Type /Annot /Subtype /Link /Rect [ 337.377 270.977 366.807 279.977 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3190 0 R /H /I >> endobj 3192 0 obj << /Type /Annot /Subtype /Link /Rect [ 183.959 133.492 207.299 142.492 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 73 0 R /H /I >> endobj 3193 0 obj << /Type /Annot /Subtype /Link /Rect [ 214.448 133.492 326.108 142.492 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 73 0 R /H /I >> endobj 3194 0 obj << /Type /Annot /Subtype /Link /Rect [ 315.549 121.492 348.329 130.492 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 32 0 R /H /I >> endobj 3195 0 obj << /Type /Annot /Subtype /Link /Rect [ 355.9 121.492 448.13 130.492 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 32 0 R /H /I >> endobj 3196 0 obj << /Type /Annot /Subtype /Link /Rect [ 474.383 121.492 523.273 130.492 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 36 0 R /H /I >> endobj 3197 0 obj << /Type /Annot /Subtype /Link /Rect [ 141.33 109.492 246.33 118.492 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 36 0 R /H /I >> endobj 3198 0 obj << /Length 3199 0 R /Filter /FlateDecode >> stream xœÍË’Û8îî¯Ð-IU‡MQÔ«o›ìd6[™©ô¶§2[I²LÛÚÈ’#Éíî¿_ðMS´“c’C ô÷Eaøÿšÿ)hŒŠ¢Œêý⻢ÇQN¢$S¤#JRŒ“(¦ˆ¤Ñ>:'¥QËe€hþœñ¾‹>-ºŽ~_|þ <ëƒÜi/(ª÷ŽmŠà_É>mo–‹Ûwiãh¹±!N'q ÿò¨@ áPI¢å>úüòáyœØ>Ø÷c3°=ë¦ñÕ×hùïÅoË3ŸŒQñ«¹|f"¤Lžçû©$Ô$’©‘:3ÄGå*géü{Ñd<³»ϳè—1îråÀCåe ŸPq–A1¾–0¿Œwó\!Ü.Œ2A.ùN‹Ù™auLxÐ o–E¤DEF1,®˜¿’JVÎÛ’=Mwwïë¾{Œ¾¼|ûñ~yå‰ö4F ß…¢ˆ¯iŸ± l³^½>°¡Ý÷ke¸uÜõ5'¨µ‚¸¢ãp »[RD³ Ü Wݱ½½ÿpÅÍ8ήi3Ÿßþþþš–$Gi’”e–WÕÍøþþãÃÝݧ¡™ØpMZ"œA˜“˜;ã³Ûa{¦¸€ÍÁãôªZëç÷˜`lXæÊ‚1#Ùp!µI‚² R£ˆó«¹=㻾ۄ¦ˆ`ˆ?ͯ:<绾ÿ$ËPžgÚÍ zg|?·ÿ¤(Éa’ÄcÆ÷¯åòãÝ݃ˆ5ümö‡–]Y(ÁP-pÊï韛6çûA¢%  h™%ôªâ_ Ùn߉ÛÜ­|‰4C)Á ŠUpÿì'¦%fÕ–Kä%l3lG®«×rÇ¢WÍá&y©%s_²HPšç¼ÄPW7Íö8\^9&ÅÒÚ‡¹¼Y¬‡æ0tbã4lÓö‹c4{j ËêjKé7AFÕ†­ á#DØ êcËFdï­–çþh×eS§Ñ¶ª¿Ý/cÏ˱ßs[^'XY( i û.£1Þh¬xѶÛ²Iƒ•NÕÐ5ÝÖH¬ŽSXxœ‹¬ŒÕª5ðÔkh_}³ÝÚ%Ïý¦8ñünºqªÄj4C$’Ù úßþhàºê ì‹©°Ú+ƒW“ ÔV¼ÂñfoåOÍ´ë“cÒêØ´kÝ%+ß[êîÙ1xd7 Ä©µÍ9*ÁúfåR 7ÞHü¤öF }×>¤ÚlX=ÔUªrY"PóúÁòmšB!IT^¸ëà ë~°ÈæØÕSÓwUÛLÖœ~päžë&’)åBËØ-‰4Â(o ø,rBÂë¾{aÔ1¸´XÂ*qÏtîªGGao 28_Ëî™Äd¨–”(§p?ÑÄmx cÈ’6µ{= ýc³–é HºrhôxÐÛ«(²4jL§‚U¸ªý29dY÷5ö¶ùç›·m#ªC•^Þ\6¶z¬š–W€ãöûþº°yÆAÿ>„”Äкgy@ƒ —¿þ§Nƒ@«­oEÌcŸÆâÖ™+Ó‚Ÿ}©4E”w8&±Ý4înoG¸jß2Ô±éVY3Þ =•0à ŒÏxeT~õØh!K—E†Cq¼Ñ–‹ÖF¼*hŠÞz×m5ŽÌ|’õœCk8@õÔ>ö ”óµê~¿?vM µÄãXÖN W×HaË]3*NMÒˆXXHòžOÁõqœú½FDÞ~Y „žºf£¥3w]¯«©ZUÒO!".(A»ð° ž‡*ãæÜ—§]ß:è¬ìI²‰»¼«±³° Œ",ÝEôø@ÅÐñâö]é·L$…ä•YHBfCo„­&BOS_Sa-2}—ÆwÍáà:§6]ag!“5ÂâÛæ‘ùý|™ùå€OÞAÁö5µF ô™»þ¤AY–9¤³H †Õä“ÄDB!>0+ ëWj{ÃÔ6¾6öP¡ß) •sËë]u˜ô çr 4ÉYABÆ‚•ì<” â̤¶5qèfÚRþ"âûW;êŽU‹t’ȉU¤[s*ÌeÙY¾à(M PfœT 9QýöîÂ)ˆªÃ¡åÅÎÄx5õ¸9EYIüÉ<:Uc÷[³í ÃDbq7”rpzßÀ%`Û÷ë³£ .~<~Õ‚\zLHãñ–ìpýÈWpšgž!K®`£’!¨ÍdáAþŒï; Wܰ“E˜‘åtM7ÔÓ®©wU½‡Âd–ðʡþóiðÙ1Wö&LISEF×ó mf 02ŸÇ£… Da-øá—µ[b2û$ìy$‰Ú!Å28쫱ovK’3â(žÎªÍùéµTŸ,5¤H„Ïks¿3(‡¾ß1(?¦u»ð¨“}I„~y¸ÿé»'’;ÑëŸèÈÔ4œÍ¦áÆvñ’§l®öõò ]æH5$ ªOÁ¨_:üg¦,¡žˆmG!v¥¸6Gõ›£¨i!^+ÊÚfµ^5¾LÓ0•i™dœÅf­…òCù[+N’ª“‹"¯#ó«3ôé1ŸKâ<¨ò[0’æˆ&yY¤¸nsåF«r`“ÎçÕ8 •h)j[=³ÁÁeÐ"ºÒH¼ùÔ•ñqô̳ա«†’ ³T ’d7_âõqàæ”•F‹ÉqctH~°h‚Rª7xfÊÏs› Ôä„”Zý8 â¬åç)Äó¯„Kn.¨Rât:¡ýóø½EÐÀúÝ5,Ck„iQ4Ìšñ¼D”Ö˜†âìXªÞFÂ1¢ÐÓ'ü·4 9ü®±íÀ› à9·“¬D ÷(.’·“ƒ\†ΉÚÀð+jüÀÄyŽøÏ8 Ú‰g"ùb2:ˆ{Q*’›«š«Û6|Ó¤7½ìA/ ©w(ñs°ÞEª@ ùOqgNœ Õgú¯Çjh˜š$E>ä)䯮yzíà:!œ¯móÍUȯu¸ãäc¢É÷ÅÑÕã"'&_‡BßlYätRp“#‡ô Jäxnb …¯`bì÷‡¦•CAθj:ŽÑ*ý`Dœ‡dH¢  ºŒcë(sD'¶p7[Œï­ªœ‡c†žn j·HÀÁÒ/è°>\¬ÜÚâÙ9¿ºÞ/þŸGÉ endstream endobj 3188 0 obj [ 3187 0 R 3189 0 R 3191 0 R 3192 0 R 3193 0 R 3194 0 R 3195 0 R 3196 0 R 3197 0 R ] endobj 3186 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 3188 0 R /Contents 3198 0 R >> endobj 3199 0 obj 2386 endobj 3201 0 obj << /Length 3202 0 R /Filter /FlateDecode >> stream xœÍWKoÛF¾óWÌ¡çí¾CÒ¤hN±- ‡8(qe± H…¤cøßwHJ!—¤$6'Û0H­æñÍ7ßή¿G (þ¾nV2b­ƒõ.ú~Xg`8}XR”H®(À$á v.)ÈŸÁ ?¾á#°ÅÏ[ø;Ê# F_¾¢Mýž"z"xê.º`;àûKÂGá!z·Š~ÿ¨€QXmzй#Š3ç2j‰à®ùá°ÚÁ—«ÕÖÃg_f°ÎRŸ×°+’ÇÌ¿ú «OчUP¶ ”Ø—VõMUcŒ!t¬¦6ŒèÖp¥‹Ø|ì²+]Ýó$d:AL‡€§Bz1àNkHbjÈ8‡_ˆˆkqN1/¦¼©XxƒëtÕÒÎm˜ÒCŒõ¶ô¶>Ûû·O\U¾ºîx”0ƒLP!»÷œ«‘™š1»õ›?Þ½owåõõmZ%qþ,~¤‰¯ †*Ýí3i^ûr¯O·ÝAc7E¡8¡L9gíY³[ÿ±GqצÌÒª†´‚ÇÊ']ú<βçiN#°ûŽRÆô¹œ³ òyú°‹açI†u×8¯öHõSQ&àóuù¼¯Ó"ê #—ØNœ†p‹œ² «Ø|Ê Së4ö a” aæXïƒËAh‰ŸFQ±‡Ü`:ÉMãæþé¦ñw3JcJ)$¥ÊÈG§3€~ú2ÔæÔùþêþÕ›Îr^Ù̪fR:§’{_ú¸nÅÕf>h®øö¯_×KIà8\sÚ’À `øäŸ2­.1Á…Dd ÕÙo ’×oÃ=bÎçþêX=£ã$Lʹ,›ôxöÍcfÎg@ò4MS‹RÈÊÝ–d1s.p¶‘<#9êN¸Î>+â¤ú9 `S;ljŸ—Ýúcƒ@o ·“z‚µiWhŒŒ÷q½…b3ÌsQ.B"™vd¹¾^¢¡q×[Ú\oT –À >ãrq·Ç Ô)Ö¹”¾~,ó g²ÿ‘Uö ï8Ã1¼x*a ‰ÂÓÆ:5 ‚†R?„—r,¥%ZZŠS/ ¼l.Iƒ÷sÆq>~b.1õWO 7õ¿H¶¢8Í´ÁñLÚZ£ipùÌïÃÿ¤Z FŒÎ:¤DŒ¸îŸ¥<+åˆ5Žr+xtÏÊ ‚[˜r¼dàyˆ§´Õ3¾9ÖXF­©ÙLJƒ÷×øÕ’çd³Y†TÈ¿Ýs)¿…Äh3{… ‚.ãW;ü¿Ágµ=¥ã!ž€ß©ï€ßöÖ{ýle_ endstream endobj 3200 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 3201 0 R >> endobj 3202 0 obj 970 endobj 3204 0 obj << /Length 3205 0 R /Filter /FlateDecode >> stream xœÍWÉnãF½ë+êƒ Œ{zc/C‚L$Ñ Æ&[Šôp‰1Ÿ¢H‰»¨ ÛRdÕ{¯««ª‹ŸW (þßU#1ÆBpX}nž3Єjy”HîQ*€IÂ=8@ÿ‘qåÓ¹á§;¼ôlñ÷þX%+ ?¬>~B›(ú½¬è øêýê¡£­1ÀûפÂnõízõöŒÂzÛ†˜[âqf­Åˆ"¸­þ8¬ðñf½wpﲂ8rI‡4,cwû Ö?¯¾_÷–-(%æµ­ú¡'³FkMè0›Ž0¢~†OjÄêUOÈðgÍÒ{R¯ ¾ÎJ¦#Å´+xœH¯FÜ|)M4ÃÒÖâ+bzIÄ•¼”1¯fyãdá•®ùUK̉8”jU/6Èœ_¸|HÜ |W—‹Ý¯u*²bÓUöP)H¬ ÏXkk"ˆ* ¦5Ü› M’(Ù¦'¸ ÇNhS¦öþª.Þ»oÆÎgs¦åÙþñ¦~ùöb`™¡-nî²\¶‰žOö#\¶æoàî¸T‚h¸ÀÀµ"J(lG’µTÏiVlü0Ì\žÏ² OŽ]¯¤–®…5Êð–¶Ä%&þÁÍRJéÝÞÌÓà¶`›5ùyþ’fá,8£ül˘ßì‘gÔÐ/ü'?Ÿ—Ì”¹Z­áv“¥i1¿ÓB^…Š;Ñ¢y¾)³xÔ^*h´ˆ.-ç•b–œo¿¾¸W¸„q,o®½«“žÑ)GX`Â>0`º*çW¾Kd\ É3½JƱß‘0¤:¬ÇøÉú±ßvôÑr!TD#¿%"ÅG+Zª#ÑÈo‰HË!ÑR¹X5áµDcÔf©€*š‘WK3uLrjg˜8J7GžE98^FITD>N˜x0¹ ˆÒžý 3±pYéOÒæMŸþBƒæÔ#ê‡hGP"p® Ìˆéz­ŽËvlQØøÀã§{hŠÒ öi^TuQ)©äÖpxë•I™Û†OáeUJ§Æ9›­í‘0<ûN÷ès–†ô/û(Ø7üGyá’ü²kˆ§«aEðɲj8Ëõ>4ö°ÅØœ* N5 ~‰1JŠ(ð«¼(FN”­z‰”“­a$Ç¢¾Ãý‰öÿ‹QŠŠù¬=5Ù>Fb´8üÖIÜ—¹$p0@™f—8Ûjdæí¼Óë)CvÉøÀáÞ/ögvôƒ0ʰXÒì˱„⸚Aƒ"K“(À'Ûç,JŠËÙ"…G¨Ä)Tk;Õ€F¢¤Øøý—¦€ý<ðÃ(ÙÁûâKìò½«ªÅu=ÞüùxûãúW´.‹çòr‰Ke ÜdBŠ©†5’eØÀ~]›cçÁjƶb5m±Û4åC^ø¨¬Ó"lUþß.0}9%ÒâïQ£!ŽñL÷¦xA`‡ƒ8’e§ö§gxš®>¬¨ óCŒÎ|ÇÇnÝQgªC{j˜R™+Ê,©›tR\†…Ÿú__ýb(Œ%T`í2©z±ÝXlùnñ›3_âW¦¡r> -Pg˜U¾‹QQ£žÓJ/pÀ¶ìïܵ1Q·ÈZʽ˜xuLªÎ± ‹…7ž0zÑh!Ú8xt«‡ã7úÃê_^ŠÕ endstream endobj 3203 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 3204 0 R >> endobj 3205 0 obj 1226 endobj 3207 0 obj << /Length 3208 0 R /Filter /FlateDecode >> stream xœÍX]kãF}ׯ¸}H ™ïúPh ¥…†¶°YE–m-%’LÈ¿ïÉZ[ÒHÖB’Á5k ˆ{èDð&Ô?ÑÃ…¶Ó¼Oú(l£_Vчß0 «Í9ÅÜÅ™s3j‰àÎÿpXàóÍj—Âßi¹‡dŸ¥y ‡b}ܧ·_`õGô몷mA)±ïm×=‰èc ¡C75aDû Ÿ´ýW=!Ã-KïI»ƒö:)™ŽÓKÁc#½qÓÒ††2ÎáWÄöLĵšsÌ»ÙÞØ,ÜëšÞµ´À,ܵ³¶Ýl™ÖÇ2¯ Æ“³ŽëŠMs(ªÊ4ñ§()‡8_·Iñ¢$Æ+·HѸWöH(H‰ÉE±”©SBQ4‘Dئõ×êˆÑÊ·.šãJµ%\H Âtå§öLßÿ< ò Æt÷xóxû±]8‘¬«òõ·ÒŒ“rbúò¸&ÆJ¹Ò½Ä‚7맯ñz]Õo]ÚÎ÷ƒ ^³&'蜫ØÇ›.;È4 cx(lMpo—9RÉUxQ‰1—ߘáDQ»˜‰Ñæ+îÐÆŸzª¸OÄdu\gEþá){ÚgŶŒŸwoÐh€ºøvHžâª«ÑM\¬ú%gšXWŒ‡7â‹{nG8·Ä¿ýÙžÈ2}.Ó «›åÛFÂXÜR r¥UhAmeÏ‚ö‚Ç*-¯9l$Fa1fÊç8¤è¬Ѳ²Ãiï±ænáž-ˆBŸ"-°B²s¿þvAÝ\€…2„t„ᬶ<$#O_}~Ÿãªz-Êõ¤)Õ\œ»ÙãÈòzÒ<>LoŸQÀ];ø‚qb:™ JlB¸ÂÁåãj1ýnƸkDB‰––‹I€_ã“vÈ·¨LcÜ|Û†'®§ö¢mâÞÀóUßÕ"…„ù9-µU|Ø%UƒÅ~-TÏi’m²¤éÙ°)‹¼î²dרð’ î¾ß¯éÚ‹KŠ> endobj 3208 0 obj 1121 endobj 3210 0 obj << /Length 3211 0 R /Filter /FlateDecode >> stream xœÍ—Koã6€ïúsØÃ.°aø‰ÅöP )ÐSƒèa»(‹v X’W’7È¿ïÐ’”hÉzHr°LÏ“óÍú‘0 øç?ŒdÄ Ë"ùѯ3H9Ý/)J$W” `’p„K ¶^çâŸð#ÅïÏðwR&~O¾}G™(ê½$ôŠñƒ©¿’Ç‹Øz|~OñQX'¿.’ûŒÂbuÞbn‰âÌZ‹;jˆàÖÿqXðíãâÙÁŸ®ÞÂr»qe E•ï·îÓwXü‘ü¶Ò”óÞ²~ BDjÒ4%tHÓÁŒèÖp¥³è ~í¼+]ÝçÕé(bzð¤wÜu†tJR† ¥ÖâOÄq­§ˆy7éaá>.Jôa©¾–¼4£¾ù°o\]fEß*~ãÎ{¥Ó¼…j-ö›Wý Yãrh+Èö¸\¶›eÖ:ÈÚƒPžµÙSÖ8påzSžÜ`Z]¤÷‡FA ¤"è“RªL_ÌŸH‚5ƒÚ­ò§³<©êü÷ýƒ$¬ ±F£!ªûŒ» q÷KÄÌI‘:Öüçc'uÿ€nž˜ÑWÞrsTEÇ98ùôåºÌÇb••±V7fƉ‘c8¹ˆ!Â'‚âÞ3«:yÜ£wËý }ðçËíË[d›òTã¾g ³B›"ÊšrÇ|ý/…›]¶twÛe5•ÃvÓ´žÃÀÆT,eD ˆd!UìHUî¶®u·€Å¬Dc·5íóiöE‘Õ¯ðŒ ž Ðrlg 3žÒˆãi¢5v2ƒg!È¥Q·r6Ö™‹”X™b‘¹èäkWT?݈µU]o¤+K´¿+(ÆçqãŒ@úáÛ”pÃ)ãV†¼ñ#o˪\ù\çh^3õƒÂšè si¬;9ÉpÔǼUw™_f’ÆÍ`†ˆXóLÜèÈêˆÖ4hB ¢ð4a´ç²q%b•ß´Íz%ÞT%ôž£í€`=I™0Šp­(“ZÅÂr&<¼wtô»««?Q«'Ûn_aUm·Õ ò÷ô Y Y½ÞXô›OQΉřqåGÅ ÀÚyÀŸæ”~"s,,vIÀÀPàXwÀˆ·üé|M‰ñ'dDë3LÌR‹ìƒ+—U¾)×ó”Æ2š!]âÍSYa­dò¶Œ,(ÁŒ—Ô½ÌæÃ(èMw"L¸?Iqbvò]ù}S•îå¶­ãÙ°l] C͹¶Txs)/Ž›c[Êð2ß–šáD–2qº ÄîѶëεeÄÛq·§›¯-o3-£^Žñeͤâ-Î×cÕiœµÆ÷.…áº?¸ºmó8¿,m8áÜPžŠ[ Ö…@üêÐãá­ô1ù_¿?õ endstream endobj 3209 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 3210 0 R >> endobj 3211 0 obj 1086 endobj 3213 0 obj << /Length 3214 0 R /Filter /FlateDecode >> stream xœÍ—KÛ6ÇïúsÈ!îðM¢@ºrÊ¢zHƒ@¶´^~$’¶I¾}‡–eëA=rÛ݃,šÿy¿ÒßHÿïÂÃ)Μó°9$ß.ã¬i.C™QWLh8@wHÃ>hZDó‰¹ôþ'Çá}òé3ÍÉI÷=ÁãgS%­Ø.èóKŠa›ü±Jîî5p„Õãm‰…gZpï=­¨cRøð'`u€O¯WO9|Ì‹=lö»üXÁá”=ïó7Ÿaõ!ùsÕI["2÷Ò²~è„HÔXköi:›‘õÔÃW@ú¯µ—ÎHAý c;à!H/&¸q†Œe–CÖ{úйDÂØ)b^LzCXDˆ+¨ —äÏ„©Nú4_0É=" uIš 3ŸfPäÙúK–ïó*/«ŸMý„Õ¼»÷ý¥TŽZC)¹®m½ª«ïÝï#–n¥Œj þçu=éîžõKŸÞÎΆé!ÿRäÛüÇ×F>ˆTr1ôöæ·qw”šv´ðÒR~ÕmÚPWw&É›Cf¡m漞~Y:Øìª´ÚŽwëÝz¿;m‹ôëÓO8‡R^v‡™³!Úõ¶EŽ’që(a5ØÜ[uàBGG“Ÿ÷i¤(ò²¤X ËËM±[ïŽ[¨¨ï›%œÏ/uhP`CEÖxºâ9Æ& ZœÚöà4 œÛ¼ZD&7š +ŠÚ(›]C·½s&¢B“S÷ˆx»®ö(&BÇ„s\rg™1*ìYìŠcL8$•CAL¢w U±Ëÿ£ÝM§¸„ô2¡®ü6“¨ I{ÌmèÃ#«×‡T(ÕS„¹—2',•ž÷ȹ]ælÃÜ~WVÙzŽ8á銎©x”¸¶™ÛÎéCå$oc¾²õ’Ö$LÔÝ s’êÏ#u³+Ý˼q)†Úiê¤ôLMÓÅ%¸°l%ÒjóN–Vé:-gºŸ4œm½óz<â>UÒÊ®h¾õ5ÑÔ=p)sT„tùV)6̹6sÏe^ÌQG‡ ³Z%nF©»êô¹¡v®ÏE¼Õë:œTÕ[˜8êU,²W!‡Eg½Š…9G¸R†q¥ ¥—%æ1"‚/t+èyYšÉ"òéZRt«Ðh¨µy­¥à¼Cn¼˜4 æ¼CŽb2ì~=iB¿«›/¨AH³Å¤éÒ ¬»5˜¦–|»–¾ŸŠl®–´QŒND%ýh-Ý uji¨«¥ˆ·`{I8›½ÍZ&ôV\[øg\`D:MAϬÒÞrã¢Ôý{z&vöç]†Å4}†n\Ò…U{fé3tGèêæé †>C×͉rî»×z´ð[tg5t0 úqæ•‘£üE/­„ÓP< `ÔÝò_Tˆ1 …çßÏÉÿ¾|ˆ endstream endobj 3212 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 3213 0 R >> endobj 3214 0 obj 1052 endobj 3216 0 obj << /Length 3217 0 R /Filter /FlateDecode >> stream xœÍXKoÛF¾ëWÌ!€m YïƒûBZÔE{ª=ÄA@Q+‰°DÚ$eÅÿ¾³¤‰äŠTn¶¢Ö;óÍ|ó¤_f (þ~ò&bÄ Évör8g 9u8’”D\R*€E„KØB÷HÂÆËœ<ðö ?:wñûþ›e3 ξ|Å;  (·ŸÑ3ÊkUŸg÷'¶.àó{²ÂjöÛÃìöN£ð°" 24Ú~¸ ÉŒ¢Ø(„2=‚¤Ž bàC¾«F]Šhhj)ÊñT[ÿöza„p< ¥&Z·Â¬îÁL‡¡ÈW}Œ‹ÆÃPn H˜>ÐTp> endobj 3217 0 obj 1263 endobj 3219 0 obj << /Length 3220 0 R /Filter /FlateDecode >> stream xœÍXËnã6Ýë+¸(àH¾(ÐEѦ˜®š]LÅ’ÇdÉ#ɘäï{©‡mI”d´]ÄA šº—ç<÷‘|("ðsïFPlŒE›}ð½§H3ÄU;% L˜I´Gý)‰Rçs1`Ý=[ø¾CY@ÐÁç/`!~?2±x½Ô§àé‚[kã÷Ä oÁ¯ëàáQ"JÐz{>bf±dÔZ 'j0gÖ}ZïÑç›õ.FÅEŠ6igÚçÑ1o¿ õŸÁïëÞ¶9!ؼ·]?õ(‚j´Ö˜ ÕT/Û9˜iVt¯zD†_”ÞL³ƒæ9I™Œ“KÂc!½rÓRk ÒÖÂ+lz"bÊÎ)æÝlo,æx¬ê©bjóÂŒâæ§êíІ‰;´ó9)ÄÈÀ6 «9û;´?–z‰QžÁï­Š¤\¡¼¨¯«v½3K‚cb!Të–Bœmò(ɾùiH9°ßìÂ"ÜTq:GG¡‚d‡c…jšÏ7y–¾¡-púøáS=÷|;Ë âÍHãphË+?VÓ§cìÀ¬OèþC*7EÖœÒë®Ú§Ý1ÁÍŠ†ÎÃcDïÒàŠ©ÂŠRÕ Ä€]öÀ¨ˆ·ÑË×ãpcŸÉ>hÄè!È5*¢Œx\—°¬b-)Å*× £t3«ísYÂ`|ˆq• Æ~g _5chÔÂDcߤ¯Ò¥EHbÙ†IVw/aϦ ¶.­kãÕ¨B2°ÎÂ}ÜU#Xƪ¸CÉEɶfU¡m‘ïÑæXÔ_Žå ÀÏŠŽ5t¾F5¥Â!7  ïã¸T9ZU+Ç¥.Žf· œTË}X%y†Ê]˜¦®v5çÍÓã ±Ëï„ µä$Ü5×Ôôì˪pe|“gU˜dnè˜î]¬5AAs×-µ4ÜÈ“ÙÿÔ̓ $I¢åu팀ÚÝwøÏýÌb! L´RÖB»Ûo T×@Dq_Õ@ízaЕÕþb°R¯;/5¸$J“²šî ñá,Ta9ôX IÍéu8–xœæÓ•„FŽC]ÕR¶÷ÐV/]Õ©áê„%¹ÅäD¹ÒÞãfšÌÛÐ+ñ&Ù¾u¡÷á·²á5È% çèZñI×X+MˆàñéN|aey/IO é–¦¸öJ¯·ÎYF†x\g…)Ӷй2æq‚nmº_…^×óêö0[ö™õ9.I\1ûBuå‚]µ#h˜Æ> •_q5YÞ%>ÇùXRúh’)cmìÁí—ÈaÕB½:‚”a˜Q¹‚©å’¯ 7ï[ׯ]°8x_©wïÆå¾þ7ÃSð ´®G endstream endobj 3218 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 3219 0 R >> endobj 3220 0 obj 1180 endobj 3222 0 obj << /Length 3223 0 R /Filter /FlateDecode >> stream xœÍXMoã6½ëWðP``—á÷ ôP´)Z´@ƒè›E Øt¢V–²’ÒÝý÷JVlJ´${ˆs°Lqæ½¾’ù”PDàïÿ2‚bc,Zï’OûqŠ4C\í‡$Á‚IB8¢3‰v(’(÷6G¬‚¯`.ü~D'EBÐ/ɇ0gƒØ}NÈ ç­«¿’›#nû ðüšøôü¸J®®%¢­¶‡3‹%£ÖZȨÁœYÿahµC.Vý骭óÌ Ú•›çÜ]~D«ß’ŸWAØœl^[Ô7EPÖ“¡šZ7¼ƒ‘ΣþìP‚‘.‚îû$e2bLŽ …ôjÈÖÒXSж^aˆˆi2¥˜WÞX,Ìó"XµCÕ©à…ÕÍw_вq›´I»È}æÉRˆ‘Áû?~G~:ªŸÜ:Û~ÍŠÔ@ñy7½ àÜѸºnU. ‰5Ö¦ö‰‡à0TƒÁ¨rÛÍýÝó`¸cŸÞ™¤ 6>œÈ}D]x÷CÜÓ‹-µãÛ‹nÖÕ5 Û´òsáªÞhD 2¶y‹&@$‹€dõÝ“«ê²Hó“PœEèMAqh£c¨b@6bw{ùýi$X& :‚š³š-Kœc4 A b,Ée$b:‡å{Aˆ5Ÿ8Jb†¤X½R.±õÈ”éæw‚®}¡¸ÊkxÌŠ¶=ø}Z÷%sèC©±$àPH:^‰aùSe³Ûɨܾý[”mÑ&Û¶l´­Ê]ûný\µÏõ‹óŒ,õ;µŠ‹Së6nK|`S»5%zÓ¼ñ|Ê"ÿÚ²èÝ@޶eµK›¬,Pý˜æ9ºw¨Ëåf’c+P†ê…=“«Å·hšL1̸%”+vMÛwÍËݲ®ÉŒÄTB…Š·Í¡« mŽ­çúf/ÛäYÝLtNÙi3œ(¬4&ÊØ2K"FÓ5ÉaŸb°¾£›ße«n׳>”À¢‚äÂÂáÐ0j‹+ή›Ê«i ¬_Bÿ¥ù39ªÔÚ¨¾c»Y*> endobj 3223 0 obj 1120 endobj 3225 0 obj << /Length 3226 0 R /Filter /FlateDecode >> stream xœå˜[kãFÇßõ)æ¡° l&s¿´Ð‡BS(-4ÔЇ4%ÛJliW’›î·ï‘dÙºŒ,¥`$y°5žÿ¹Í™ßŒý5 ˆÀÿUùbÅÆXô´ ¾îÇ)Ò qµ’ & ሠÌ$Ú¢îD›RÓzÚwðÒ™ ÏkôWýÜÝÜнdÄxeêÏà¶Û~¼Oñ´ ~Z×7Q‚Ëc‰™Å’Qk-TÔ`ÎlùÇÐb‹î.k‡þpÙ=mb—h›F»»¼G‹_ƒŸ´9!ؼ·¬o;!B×h­1éwSe†×c0R[,?êÒ¬½tFê ê×ÑÉ bÒxØHï&¸ñRk =¤­…°é4ÓôTǼ›ô†ÍÂʸƳf°a2Wd±ûÇåhOë8Y¡ÜÁHŽÂ]±N³¼®Áª2’­:Ö8Á\ qíÍ}·‰·qñƒÑdµ—¢–F)$h¸µÀÉZó[)ÉÑ%ºRktQÀ><¢:ŒDaæ®Èñqè÷]^Ÿ[ò8±»L³íñéSöÝ÷ér ¦ï?}>~ôºvYKWMlÙ‹;Ùm]v|N—u5Ú•¢W XŒ]–¸59~Fa¡:*TÚß›M—‡)¨HQþÁ'J+Ì­!„©f¡’pë2·rÿ~ñ¯“1= LÞm "sy§ Š\þ”ÅåúTÑÍ* X‚¦±¢Æ:tp×õMÅ<ÑiMèàrŒØ“C½Ž¡Fƒµeôø°rE¸;F{}c=N9ìm­ )­ÙçZW?¬tTù„_ÔÓ®oÀMÏÕÂçjØÿž(™d-4ݨ7¦¼Þ‹èqÆá˜ô¤vùø·²ŠÒb‹aµToI2åÑ¢ gšöÍÉŒ2â‘}ùøG-dž¦“\pú•ØØz>úÓ]͇Eã¶[‰ó¡©ò>N­1’ÏeÓ¼§93üàLÆ–8 ´éÂO´àw´7?Î8fÕ>×z ~•ü†Â)øy\͆ßP;?·¹ðó¤6?.$fî5ŠË·Âo¨€—ºïl.ü†ÒÓðãÚÂ|Øu‚ÊQø¹(.¦à'…c™AM5ŸM?AyOôañwù^)ÎÇ?!4\3%œœÎ埀¼«93ÿ„‚ õºË?ÙâßËëÿ$š ¸·"Æø×Xéðo(œâŸÇÕlþ µSüóx{qß^Ó,šD ô©§(á«Ö†PIß”]‰À¡v¾öœÍLŽrŸú4¥X—‡;ã_‚÷þOcP—Iiµ AiMGòa¨ÊŸ]Z…8gp×,¿!H{¢»ú+¥„èɦØtÍÿÅ ÒP G´4¢‹AÕÂàór ƒÊ ̘!pÅàsQJ …Sô¸Šó‡p³ UÕI2oJ³€ÄÉ[½qêõöœB†›)" â­bƒÛê'ÅÛà?\?Äk endstream endobj 3224 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 3225 0 R >> endobj 3226 0 obj 1104 endobj 3228 0 obj << /Length 3229 0 R /Filter /FlateDecode >> stream xœåXKkäF¾ëWÔaÁ6¬Ûýnu9â@H &9ØÆÌCck£‡WÒìfÿýVKóRK²4‡ÃÚ‡µú«¯ªºª>i> (þ_»P2†–iðy»ÎÀpz»¤(‘\Q*€I¤Ð^R8ÌѾû†­½xýÿY@á÷àþ÷¬€"îk@Œ×¦þ îŽ|ÛnÀïïÉ? ÏÁ¯³àæV£0[RÌ-QœYk1£!ܺ?³î/g/ü ,“8Ê*HóÕ&‰®aöGðÛ¬¶ ”„ï-ê»–‹X5ÆBýjªÍˆf W‹îVËÿ²ai­44Ÿƒ.ÓŽÇôØán!½ç†kHbÖ±o‘°UDÜð·*æÝ„×-îüÚG1{aËÐuŒr±jÝû!.ŸæIÒ|sk}ˆ¥ü¼ÛÝËÀ)šâŸf[Š$NãꩬŠ8{$b\w¡#T‚ûTŸòM‘Í“§"zŽþ&=àY§^K)B§”©fwa<Ñ—¨„t^-_04xŠ8_ÅËyRÂÃåz“$ÍÓ¨|¸j S¢kƒÅsË2¶¸-³¾3qÇy¨[yÖÛ]FT9\T¯qP~Ëòì[šoJØæ£ñÊw{:ëÑêM¿ãDº£7tø$}÷—èO‡)á ®uH \V8£÷ûÜíWVójŽ!•ä°ôצ¬W‹#xœ Ø]çEz¸º¨ý¾ÿ)_¯ÑôãÅÇí¯/Qq„«7Ùò;Û¤‹¨8\çë&­T©À“Zîk¦N;ì‚üól[à¶vóõ~‹;Ûò¿ø•¼}VÊ,j¬fi·g厼Õ£2ÌÃàîM2/!ET–qžÁ**—E¼pGTûW׺ÔQÝ»*ÂÙ$ÏnnkY“­Â¶Gmh­4Û&†Ç#´¶^-žž£êS~p·§uÝ„áøˆ¥°·V>4jýKÇÆ¡áuöp9<\˜‘]š‘Qɱ#} VÚ ç=¡Lš•‚žÆ$XÓÄQ)iOæ®F$@âs’Â!EɹC™é‚Æ„Fi*}²ÐøÐ1*ìò6Õ BÓ¿-4Ü2¹¦ÌÚ¸Ôl[òár¾XÑ—­L˱ç->KŒ‹àÊÛ~6µ2$Z¸a†“Õ§«úaÕFî¥â|j#¬"Â= Q#¦ª¤ÆÃœYm¤„rAåžÚ„ÇjÃÆÔFªP©,ê–ÔÖ£7]à˜âôPMМ.jLuzx&ëÎiln†õ° ==YQRb¤ÁyÊÉêÓH‚´Üg™,?]왢Ò';A€ºè‘WnˆÄ·c|-f§(Ð'gžB#DÀF¤HáK-ã8P`&H‘ÒÜÛ~6)Â4ásª°F¾ñ ÛñÏjôÃJ‘¦¡—ŠóI‘Œ(îÞãm8UŠ´æÌR¤ *Óî禰-EöXŠø˜i+ æÕZÔµA)â=RÔŽIQÕ)ê¢Æ¤¨‡g²Ææ¤¨‡í)êÉâNŠêŸ ï‚ï«.¶Ì endstream endobj 3227 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 3228 0 R >> endobj 3229 0 obj 1150 endobj 3231 0 obj << /Length 3232 0 R /Filter /FlateDecode >> stream xœåX]këF}÷¯Ø‡B¸Ùì÷J-ô¡ÐJ 5ô! A–W±zeÉ‘ä{ëg%˶´úJ¡¨ó`kµgϙٙټ-("ðwk¿‹"XúùêÓùÕ×É/pÕÄ‹õ‡t§ûíÊäçç,ªÝÑrW4nG‘ŸP®Q- Y‚ãºYtšb÷¶øïðø^I( 2V°&Çí–·RÂÙ*åw00{Ÿ9HnŠ"ÎR´6E˜Ç+»E•¾*Ž@RDU.4QÇ”¨•ÝÝWN´Ò rÙ—˜qbW³rŸa˜H0¬­W/¯°¦‰Îz{ÒØž6œ.x–­Kÿíî*çô×Â>]Ÿ5Ô#=LåagF{ U´1­¸ ”a:&|¬¸‚GÐ^ÑÁäÊ9Yd¦®9†zè{Êc=JŠ,ŸÔ!„YâÓx-á¤Ã˜ÄEi#oøh'Ì…µÃ{ ›ËcÒNò±z¥zäòØê±gFmdò\L÷q½íM~˜ ›>·?ÝLÔ|ɰϠq­ç$‡îƒLõJÀ#Ä'ïKÊYxŠ Jq‡mN°SFz S\PÈ;\óÂÜÁMõKÐÁvˆ¦ãˆ\Üe®E3›@;Ù:1+Ò+2;ÞraïcPȉæÝ6ê 4ihŠÑú G2f¶ÖRF\éfîÑÎäÂ$&,Q¶/wûÕ0Ê'ÇîÐŽÑá¼é *;¨bgÂ8: `½ŽKè •Œb“¬‡z€5\CU‚£…)(¯-U9¼Ä4Z,Ôö#ŸÍaœUSìQ{ØPÕ›a¥Ç;€“ùÈ"«îÇ6Ù¶*L‡7ž³4ŠmoÚ 1¬š)¸•ãN¡R-6*]…ÁrBÅIz;g»Ò%”Ø6Àj 7A„%4” ÚÆN%ÿJ¶ËW½õ¤¯e³/Žù6è{ PƒÚ®øï.ÒSØö~¾<í•{&:{å{•Pá@LP67ÛöËKEÿæ àì•‚wØö€6w€0Û§snJ@Ì ík®ú¯í….z2Õƒ½ ø¬m²^3ÑÇ4ÚÃÉ^»fÕQÎßËÆû½8«ÚKc'zF¥a·9…;ç|/ÚfÄÅMôpïp‰f6#.vŠÌ]²Ù͈‹mȪÿD>,¾âä¶X endstream endobj 3230 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 3231 0 R >> endobj 3232 0 obj 1361 endobj 3234 0 obj << /Length 3235 0 R /Filter /FlateDecode >> stream xœíXKoÜ6¾ï¯à!@À¦ùE¶@}¸HÑ5º@iÈ+®-d%môHàß¡´+‰WR‚|¨}X‘â7óq8ó‘Ô§ Eþoì+¥Ñ.Ý|:õS2Äå©+ X°€ލÀ,@)r»t°˜Á;?Á3ÚOèïM¶!è×Í»÷0&Fp_6ä‚ñÆÔ_›û·Óx~IüzÜü¸ÝÜÞˆ´Ý÷!fŒj­!¢ s¦íCÛ½»Ú>ô§)hwHLV¡4ëƒyómÛü²u¦Í Áê¥ÍúÞ¡Y†!&ãljÌð¶zZ‹ö•CdÜl½8=í Úß‹”É„1ž&Ò‹!w9‡dˆC 9j ¯°r’ˆ…b.c^Ìô¦ÉÂ,¯Ë³jR0?åuV•(ªÝS’=¢ÂìMa²)Û,tñè˜Ô­A)[;¯IYeQzª5Ë¡¶D ‰îøòhvÉþEÈ‘E¢d*¨ßÒDÅî %%ªrô`Ð.ÏöIfbÛŒÐ1*ªdW¢MQæYtèI7Æf‰KŽƒPB9툧Iõ¡¬ ˜¾Ÿ|†C²-äw‹(Ñt#Ñ•%Ý5ºHv=qTE¥©JÜwýQÜ»ÖÞdìîó"í[¯Öï¾Ë÷{0ýþõuÿêËÄ¢o6ö/ñÎêôÁ};ß·ÁB…n SÕ…]™ó¯Q”Ũ%Õ¬åÉj¾ï†ØU,?&G<»L”hLu CO¾^}ªMñ<»N”ÑÈRhp@&ªPlÊ]‘<˜²á6dÔ¤T‚‰Ï¦¡àZZ·wD §’¬K¬HHˆTâ$Pš2l2~øpLvá©'{{§=%I¥Æçˆ¾j÷­›<: UÄýsÕ¸½ã#ûTI×A÷5âáØKë¢m&\# ðY×ÂeþæûËæmh4Å<Ý„­ã¯‰47 ƒ>ñe”a-A}DpÅq9Ð\›Š65ë¤í›ôq8¡(¨OÄÆ%à ‹Ýá­0'§yû3újhå­8»\¡llŠvUs( #ŠPÑU»Sd8K•­Ê«f³èZ@¬{v†uáëzš­f08ª.@³ìúʧ¼>Ä}ûa0–Ñ ^U9îo~ÉÐb£e}{øÎ¤ÇêùÚ¡7Õc¦Ù(N±ÙGõ¡êS§™2†ŒŠQ’••‰âëµÇiˆÕ„6Ò8~Ö¸¸N+4Ž ‚C •Âõ*cÇQº)tIï<ÎV¨Þµ¤}?«Ð3£ä’a®@8˜Ô«up ZÒA›U:8ÅÍë WëPÚC˜:Ÿ$Òü³q¤p_äé7I  p^³'{ª×H €$w‡­ÚÜ]@Á5f ‰2ÿ3aÐà ôI €½§ÿV…RXqb?6®г>š*Ë+³$¥8„Ó³’Šy%бãHàº$gÕóqF–¨ÓŸÙÃ…`F †%—­žy<Û«Kä^±<8—sVVrá!äÃèáRæÅ"!‚9׳R0>ö U”Çs­öNq³jM…ÏÓô.ëó¦¿Ö#^oÓ™/³”ÏÛÒ†Àp{•“D¯ÉßÐA >‚pìc]¦RÎ<à%opíy[“‹”tÉ—¢c_ërp‚[r¤ùØÑºdÒƒ]p&É$'Ve u6ÅΟP$“X«ÐRÂî[G‘÷Œ2ÿ¥I( ÞàfŃI ·{ [œ;¸4³«P^WǺBmbÎûSpàö2*ùåtž8Öb„ê¾ÌÅqR%Í g¡C|>휾‘Þoþ¼Ú endstream endobj 3233 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 3234 0 R >> endobj 3235 0 obj 1378 endobj 3237 0 obj << /Length 3238 0 R /Filter /FlateDecode >> stream xœåXËnã6Ýë+î¢ÀL€ ÇD‰-ÐE‹¦@Ñ j ‹LÈ #KŽ$7ã¿ï¥dY/Zò, èÌÂ&Ís_<÷Á¼: (þ¿5ËH(ˆvÎëiŸÏAÈÓ–G‰Ë=J0—pv0Üò 5˜ÞÞ~ÃÁY\oáo's(üê<>á™(âÞzAx-ê/ç¡gÛé~OöQxq~Z9w÷0 «Mb®ˆÇ™R #Á•ùÇaµƒÇ«­†?u‘B”&:«`—LJTß<Áê7ç—ÕÀmA) ޛב5¾ï:fS-F4{¸ÓH4? /-ƒÆƒæó¢Étb1í<%Ò»1î2‡¤O|†ò•ŸH0 ÷½9Ƽ÷¦dáÆ.Jd½U\rÞ &yó]™ÕsYIöÒønb×…K§#H¹×Q²9‚A" ¾èã Ùéï«t9Q>§”²V§Î¢<¾¨ÐsGç+ÌíhaTéZ0lòÌOù¡Ú*ˆÃ*œµJ2¡Öé“i²KæÔó»”p·2 >Ô¶»°Š¶Æ´óŽ1ªÔUIº­?eÕ­Ö=x’]‹žîºÕ‡ÚìÇïóÍE?}øÔýô¶ÕEWìÉ¿dwvØ­1²çu¾i¢Ñ£lŠBW‡"Ó1´N~‚0‹¡1«¾™“Ü|s>Uå—dOfoŠqS=¥¤º©×ƒ.޳7Å„bŒ5 M ‘ºŒŠd­ËÚ²¾=xèJ‘ètÜÊÆ¬k̺»¯ë´;È#Ì:ɱ×KlEm40M8ÁƒAi›xý凬ÊòJwöÞÝ+KJ²@buA¾Ë–—M»ýÑ*è e˜ìçÍ©»{T4ÒÅ”MYš”Uît‹›˜È=‹$ÝE=\ºV=ãd³èî7êžM×”.¶Ð [ün~¸¬ /‹SE\…ÕÉêÚ2Ê-8XPÄÙTÑd\Z°KÊ„+»*„µ² ¶Sfë@Ü“„Q[š:ÅügCðÎÕS­tca1¤/g+÷±`¹’Rέ·1ifŠÏ·Í,ƒ„dS׈R‡E´…¤-QžmSïpÂ>ÄîÒ°€½.Ê< S“øX³H×Âf LÈ<÷òõŽ­Üþ·íHŠÿ® I 5#PàW÷#áóè[R]ó¯oGBDJlÑÔw‡íH¶í¨Ô©Žªx½Ô\ΉäØçùyD¶£¡ ®Ò‚oGܦ-^Ïw#áÚô,”mû2—80ήӣ¨4_Ù\|\>¾,¨ßV—:V%‹–“Œæ¦×x×67ŠÂ¼XÛýùY뗇ϗ@Q›“QšòÑñºÀåMëÊÕH÷"ß<|Š3aö©`È7¿åÛÛ6‰¶Ëtó+Yv‡Qp¾²H…"†c‹™ÛnW¿X°¶ Mò—"ÜoÈc³FZ@Ãg0´Å6˜šVÓÛÌ&_{ÏåúοùŠñƒ endstream endobj 3236 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 3237 0 R >> endobj 3238 0 obj 1257 endobj 3240 0 obj << /Length 3241 0 R /Filter /FlateDecode >> stream xœÍVKkÛ@¾ëWÌ¡‡šõ>´Z-… u ´ÐC I²´Ž¶äHJ[ÿûŽ$ËÖcecèÁöA«õ|ó}óØY¿9 (~oʇï2âûµó¶Ûg 8o·%)q¹¤Ts —°†î–„U‰i-x³ÂGÇß—ðà$…[çñm" ˆûãÐç•«{箥mg€ëKÒGáÕù2s&S ŒÂlqH1×Dr¦µÆŒúDp]~8ÌÖðx5[øi²„«Ø$¬Óè}e®ŸaöÍù:ë„-(%þ¥E}בˆ]£”"´ßM•QïáNí±ü©#¤ÿZ³tvêêç¨d:PLÛ‚‡t1âÆ{ÈSD1ì!¥5þDüNqå똋 oØ,¼ÔE‰WmecÁ»þàÜ|È‹msNʬå§=ãY¬ ¤ (×a\Eœ&“y<_Åékl–[h{<(j‹p9˜SÊ|±SžÌK]‰t{€_?¾Ci‘ÉÃ,žÇÉk¥(3 “™$4yãóW ˜L«çv2‚Sƒd}swטh‚vš”Þ¢ùK„ÑdM¦Ú’VFñD™*¡›ªAtó¹ïdc·àž®j³ÉYzD̳2Ûi@qLÛ0aœ…W[–VY-4ÜõÎ¥‘Ö`°xi„åeÌ–¶cLKk+P·çlT¾ øtýiœ«ì.Ϫ²Aà‡PçÕ§Œd€9E‚gàÜê0Ê-¸SD;¿8ŒÚ€&ÛôÃùA<†‡z¬¶ÏL‘Åæ·É!H§ÊäþGKgžÍƒÜD&ûq·Šóâ/´¦•}Êq*{d­>ÌZ¦zÆ¥m3h;zÒ÷bó^§ºO}lÎKÖ³þCž+Ì5ÕÚ—BZ»g ×=@¸ ² ,L ²Uçàt U}'®¼ zˆý]“oL/¶cwMõ§áÎùQx·. endstream endobj 3239 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 3240 0 R >> endobj 3241 0 obj 706 endobj 3243 0 obj << /Length 3244 0 R /Filter /FlateDecode >> stream xœÍXK“Û6¾ëWà–q•†Áwny¬w½§u¢­T*N¹ QC‘4AŽ2ÙÚÿ¾A¢4vÕlÔÝýÂ×ù´ó†ÿò' }/M3”ŸwŸŒÜG AAlDöBa ?ôH„Îh)ŠP-÷8™(øY¬¾B¿îšFßýþ¬)†}—¾¡\©úe÷Þ±Í,úk²Ïµ0ÀØK¿>ß/œ$‰‡×‰Wj-‰Ö(?- Y³ú”…D{ ošŒ¯,ÆÛrþÕ‡Ñi÷Ãa÷í[° £C9ߨ8ñßϲ$Ëà“—’Lþ#èpF¿?$yó:üs÷·ÃVÅ|5î] ‘vÉ]q† H{ã€Hø!½\„#â{$M0Æq¬ÿ±¢ÝÀzùý[ðæ„†Š¡#ÍŸXS ïÿõ ­ŽŽ£%ò=?Œd}­…Ÿ»šY3 †]P;Ý8 ²íÏtz·ÌÍFbÂ%©‡CHL™|üZñš¡7ð9ôôöôËÅL7íPI“­ æOÎR:“ýØ üÌ»z<ñf–ŸY^ц‹³s^ëh( ç4pÍ2ÆGËg÷ »gægVþôÃÌæmÁVQ…Hdx íkâ¥èAŒeÉs!®_¬ðÜcM{þ+¬L›¯?S -¯fÚ¦‹¼m¬¸--I-e¼V´vrcQIyïØÅ¨˜™Š'Ïr¿µ£¥‹¶ùf¸ƒÉ*}–ÆûpK´Šêh/fqeÉO#ë_&¦gb¬1±ïY!ÜO‚£J¢"_”iŠÌi]Oô¥§]7İåØä2jV%oÄÀháMü¡âö­…5·¢bÃØ†ç•àC™,C@‹g ù:©$†™J-:š“u|bbè2Ÿ–:û :Ð#®„ ~r–‹ª½ÌÜØÍtÛè4_Ñ6ŽÂ®¦¹ÃÒ¦pm+iשׂ™p>ÉËìžvD2P$^êØ3ú´±eµ oCK(1(Å8ô#ƒAÒ*hÔ~®JAÑ%ïÅ01¦(M'¢nÛ'+´Kuø)ÕJç$ÁMçÉ¿}›­Ñ’àÌK’:×–ÍÆ_/¿‹¸$@´€ÇJ&ƒº¾}æPÞ$8T¬±1aßÌAù¢8´Â®…ë;5‡E.b¼2 ªLýÉÅ Ñ^‚'RÁk‘!€B^r`auÛp_ANóœu¢ª+Mᙢ#ÃŒu ¡_b/ázÙ,ýÌ÷ÂHvË$0£4>–òµGüØË Ý21M÷Œ¤Ÿxz8±†õ´Þ[ÁEO‡L¼.MO ²j)mÐfýDÀ!ÅfØð±lÛÞL*®Ë'Ê@Eœ¥’k Öè–fϵôteh¼>%ü }û8 7Ž#oăÄaœ"ܱ7›!ÿùÝ/–Ë¡¨r…žä@r]¸„¤«³Ûö T`†K‹ yTAQ È[‚*˜š†—2 ýWF§gCÏÙ3­‘í5ßm3âò8l1ÞXuЭP@z¨°qæíÑb–u£ºë†kõУX82giÙ·ç™Ü“ÎT7 ó‰Ýc?< {VÇoœ“ʪÜþ¥%>T3G]ÿšS½Î• KLÖ%eBdëßh$ W;ÈV¸¯V™pû©+Ús׎ºjÉ2àZ¦PÍrCÕ3GÅ\³ìû™¼}õáÞ¦1\ý0È6ÌìLMâõëÉ=5³!íq€Œ;^ÑÆ¡ûž¾8kË™îZ!øq3gÙú.ëòS³%7šŽƒ¢n†pÁ  Å`Ù×?ý„>¼~Bo¨°6˜Ôêû¡$fDÒtoÉsÛ;òÒ’Pôbþ0ß5Åš‘JÑ¹Ž­¢óŽQ°y Ÿ—PKA—îæãÚ+Ó¯“à+Ó“@ '´9!šË t{+0ƒ¢oçƽ L²q^^3Ú|4õz¿U÷ôX;J¸_bÓB°½ðWQÔ’3ƒd½Ìþ8_h-XÜg£åªYÈ8’5.«lA Œ6&Ý—Šç’C² L ù¶\Í?0óHLUPºGêåKG˜°zh$=zb/˜ƒ¶¦Ý \ƒŸ©ÐLC«;Ò,œîhhàX¸;Ü7Ñ$˧ ¯¸ãbùŒ¡mÅó™“pya“0Î’ ‡¦Y¯º;›~vOÉÞ±Š. ÿyïðã"Ü ƒ|J5·|=é‰Ö¨j'_Ø%êÕªý³äóÂæ“¦7Ð’`ã £öQä}óÚ3'  .W”Æšö_jñ‰cf’úw,ë¹xͰ Á ¨Qô1 ÞOŠÛ†ÇÀŲ Å÷49–™jû3Cx$!r’Ü1s£Üâu;òãÀþ|Å™,ÞØùo« K½ €½qÚ·ñÐ?Ú‹DAX¿z¹¾¨¿¤½öä ¡ÎSÔG1í'Vrh¿Z¡·=<(;h‰¤¼|„Ÿæ‘ÕB"-`¾Ò÷pb^€¶æ÷±ä5óÐYŸäCòÔ3!þëüýøýîË> u endstream endobj 3242 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 3243 0 R >> endobj 3244 0 obj 1894 endobj 3246 0 obj << /URI (http://refdb.sourceforge.net/citationlistx/index.html) /S /URI >> endobj 3247 0 obj << /Type /Annot /Subtype /Link /Rect [ 475.485 569.191 523.275 578.191 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3246 0 R /H /I >> endobj 3249 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 557.191 165.27 566.191 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3246 0 R /H /I >> endobj 3250 0 obj << /Type /Annot /Subtype /Link /Rect [ 171.1 557.191 376.37 566.191 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3246 0 R /H /I >> endobj 3251 0 obj << /Type /Annot /Subtype /Link /Rect [ 223.302 437.027 308.438 446.027 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 983 0 R /H /I >> endobj 3252 0 obj << /Type /Annot /Subtype /Link /Rect [ 314.336 437.027 510.706 446.027 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 983 0 R /H /I >> endobj 3253 0 obj << /Type /Annot /Subtype /Link /Rect [ 299.369 425.027 364.101 434.027 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 983 0 R /H /I >> endobj 3254 0 obj << /Type /Annot /Subtype /Link /Rect [ 369.963 425.027 523.273 434.027 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 983 0 R /H /I >> endobj 3255 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 413.027 163.06 422.027 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 983 0 R /H /I >> endobj 3256 0 obj << /URI (http://refdb.sourceforge.net/xnote/xnote.html) /S /URI >> endobj 3257 0 obj << /Type /Annot /Subtype /Link /Rect [ 436.612 328.863 488.823 337.863 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3256 0 R /H /I >> endobj 3258 0 obj << /Type /Annot /Subtype /Link /Rect [ 499.374 328.863 523.274 337.863 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3256 0 R /H /I >> endobj 3259 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 316.863 276.36 325.863 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3256 0 R /H /I >> endobj 3260 0 obj << /Type /Action /S /GoTo /D [1131 0 R /XYZ 72.0 202.456 null] >> endobj 3261 0 obj << /Type /Annot /Subtype /Link /Rect [ 154.94 73.501 172.15 82.501 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3260 0 R /H /I >> endobj 3262 0 obj << /Length 3263 0 R /Filter /FlateDecode >> stream xœÍËrÜ6ò>_£]åPà›Ü£#oÊ)'»Ž¦*ª²| 8ˆ5‡¤IŽ%åë·Æ‹ț㪨» 4úÝ Ìç]L(üûEü©²8ªªš´ÇÝgEI™´P¤œFY’Sš’8‹’œÉ–”“^ìq€DCðg³ðŽü½v”ü¶ûðÖ…};ú sÉêj÷Þ‘M-øg’Ï•0¥4ª~>ßo\–eD}ÇK6)Ò€‚ŧ >Чl(¨þ}Vdz&1 [Tûü§Ž’ûÝëýîâß %û;›QE•q\×e]ç¨Jjñ_BöGòáERV/?’ýï»7ûPÄü4êK"今š&@•þ)I2¨BË(Iâ(©JJiQ ò¿vÍ´²™$IDö#±»Ë×äê·?Þ]\ÿñíâìÏã(Îra¼÷óa:­¤d<­¼çc³.¸Sx$àŽ¬"e%92ƒ_’_Š<*ȋӋ(¹ã½ûm-̆v<0ç[ç |@Ùø8Xbs r?³afŸO|f—rÇf8Ä=˜:ì,xËo{>ÞÏÍÔ=Ež!Áuì`/ÎÕ9Ë©_ùpo(7Þª²¹FÛf°,7°åÁ ÍbA»š=B Mo ÃÊ×'ƒr‡ñ¸vAÇhvö@¹Û×ãøéÜ1M=#hßf4*É‹åÄ\ƒ"ª¬صëÜ ‹p·Ô\ÑF6ƒåê°Ù`JpõÉÒ¯òú4Ù“¸4"ˉ¯Ímo¿.ë(Ô1¶.7/QÇy –u>µë ¢€Œwä[AË<ð¾' çíÌÙ]ÿDØãÔ7|-ÁCkÇÒbBG:¡8`ee„‚b[⬄:—Õu^¦ª"&QŒå@¨)޹#þ7Ù73=.¡‰&PyëªòR=NEá3¹®Ð›ÿ™Øpóò÷SÙU¦)\yJ£‡±=!jÁÎu³C†ŠF®¯ÞítšGÈêe³Þ?ñú;\Ç€“«Â³¤ÛÜ´"q㋆øÛóE“Àí85Q§É½ƒþaÂgÍi¼ç­ÌfÜÔ˪·t|Òûn^LãÂU->X> Ò¾Rø©×Ç9 h]yŠE›ä&*°O "e1ÔáåÔv'ß‹ˆÖˆ2"‹¾e"5Ѽ ˆÎCX+f¥eoÀ‚‹$Y-ØYù}¥¡‚eUVWyšÔÿUiûD?7W£Èv½òré-­¡J°ª(²ÀòÁ_^GTtè*+Ë»uþuqt¸–ñ4· T¿gÑÀÖ íaêÇ >ØcÔ­ÇÞ;!¥0 ‰ò8 ññl9Œ_0sÄI–ÿ@©J²4ŠÓXåµ)UÉw–ªölšIŠ*¢q ‚eªúb½þVIKê F.pwA+·yg•àxÕ½‘Ä,é*ð‘¸L¬åw²›#T¥ç„¦h°¨%)ãXö?ð$öoÄ`‡é ¾ĉ~%Ýá–Ép8ᔞ)š«6­£ÌMNMჃ4ìÈ¥I›¼ÔDø4Ò¹§A¾±+áB‡¦«6b]‘ƒîÇdíÌš…=Ë<¶QEVigiÀ/@Y ‰™€*š8{ýÀÍDÒ”i]CävªÈ=Ì,§ÞÒpt? Ùñÿ¡ MähHÅ SàéGm£¡ÈpšdY`ù„mVÁ$^¤uU'… Û,"ÿÅ‹ð$\–Y«¯"rWýàuþÎE«(Í ˜¡+ÅM=bMÿÆ÷—o4Ü "Õ›Rw\,pj[6aiD²BmfK¸¼ººzg×ö˵Cwž ﯊‹R@ã·OüS$ó`п›~éìy–Ýëû}uÔ‘΃+ÏJÏ[iã¨ÖÂJpÿæ­¥˜ºb0¬\ * 5ÝúF°HbSƒ¶ðû¯Ï—),¡ìØ›-êÒ+@ÕÓðõKRð2î-sã  p^{ oç·"}W]îMñA*N•if>žœjÎw(ªç"bn Kd‰v®’(\E>8ô &‘žùsÒè'sp@ñ2öWܓحµ–"Ó-¼œ¦ ‡ õÍåä>ΪåêÕLÞ‚Í_YêíÉ€»Â4Ÿ\aÚLµGþÏö¸í¡yÚK}J1b€hƒEðe=uKdšÇIÞöµqš„%lœ‹››öSso¿B[µ³%aÁ„C}+A]cS1%ák‡þuåk¿Ì­]#3±/'x!EÄÍKIPÉ_à{‹´ "ÓižF¼ ”2Hãðä"o͘©¾[F‡™aöýÒ:Þòtj±& žs ê×¹·²vdxŸåÝ1¯fx37 ªa>™=6í*sñeáLÝòí~¸©¾ ~‘OÈéš/V¤Õž³>¿{rDgGƒ ©×ÌWæœù` ,"E|VçQp÷-°I }ÛE† ÞÿQ/Û×oàWoáv:a 8ƒÊÈ?_e~OÑŸ‹èDCìž ò2dOÜA¸&¡ëU‘úuréÆSûê-õåÓÍyÔ‰9(ζ?r¤È˨* š”•âú'ÌizÇùÏ¢°£J¢$®h\ææ)KÚ<¯D—[X«?ðŠ"¾×#͇°1GsF»Ð=Cô£ûn…|ÀTSœG ÊŸs¤ïõ©g!›Ó=Û á®´ÕùŠÛu`—:Sƒéùñºæ?APŹxæžïgC Û™OÒ¨øÛìKÓ‹®(Äg½D@AåŸ9´+¦ý.£~¿û?ü;> endstream endobj 3248 0 obj [ 3247 0 R 3249 0 R 3250 0 R 3251 0 R 3252 0 R 3253 0 R 3254 0 R 3255 0 R 3257 0 R 3258 0 R 3259 0 R 3261 0 R ] endobj 3245 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 3248 0 R /Contents 3262 0 R >> endobj 3263 0 obj 2511 endobj 3265 0 obj << /Length 3266 0 R /Filter /FlateDecode >> stream xœÍ]oÜ8î=¿Â-¸¶ü}oW´]ô°ûÐm€= éƒgF“1êØSÛ“4ÿþ(“’h[vroÝb’?DQ$%ÍϫРàßú“Ç¡Ÿç…·¸úIôÐË„¥DJ?IDžˆ}‘xÞ””x5ðp@hþLÆ~òþ¹j®ï«oßaÌÁ €ïé*X>Šúzõ…ÙFþì ¼û«÷·Wï>%^x·Gëbåaÿe^îGBA…ðn¼oonOÒû[?¼÷¾þñןïþûןo¿{·ÿả_)0$…'‚wÕœ/ƒW6¯½ <¶ÝC9ô(ããíÄmQøùïæµ/!ê²,óƒy4ÂÿàC¤%ªOCæ(j™PpøwÕä`aqÀ ^âocÜz ¦™Ÿ…ƒYQÀ'?Ÿ„‘ÈŠ­ˆùm¦· ¡ìZŸuœ;7Ü[/LýÔ{s/Ù•µÁÏ]Õì«smG´GŒw¬ÆvÕ®®Úû®<Ÿž ±ê Ø]YÝŸØœOewø—ùð±ÜŸ ²¯†r¨Ú†),ƒ<·?•ý0´Ö9Ë0ýEÊ:YòL7Iä‡Þ›²g°õ eÖ¥‘òÀXG;>•Ò)í{÷©X¤H‘ùqAœˆ¥Í][Kͺ̮I¸ÁÊ̆®Ú]fÙS5œØ NìÓcY_äÜp£3i€–8Zê¼"úûã§ïˆçœ…ð3Aî`ô­B ™÷—ë ?‚m„ o”qǪ‘jaâÜjÚ¬eÙ[¬m¤W×%„\]ÄäGñRׯNW×%Ñë¬Fµ¬åƒlßpƒ"¬W,>p8½Âx‘¿È”V!–ÔUóC6‡õ¸*â næ_V4£fߨ p[?xi6üy©:yX.uÏlïË´q (UcaŠgDåPîÊžQîÞTG‹a~!Dmm‹5½[O/)‹Îtõ×Ü˜Š±Oö"’ö%Y•Š÷²®Ÿ—ŽHÒ™#ú³ÜWG•{ãÂx³°†Ü½õ‰¢³š‚/=.Ra¬S`Õ`…¹nüØ€åbÐÒKúû¡Ý¿oÛ„­FcÃV’"Ï’d9^CVC2“ d€ÞPK¿¥ùŒã–úX€¶ʪ±\yݳÁÀAö å©Q±+{ª.D¡Øñ ö7†¡‘\I¦´³ßêr'ëšIÓùzDÖ æI”-çüùê{#ØñëŒÖD¼ÖjUª—þ΃™+ôV —´Èêt (o²È!q;C¸¬³¾Buæp2„.L„ñRÀK 4LAzEœ„[ê§þD懛ùk¬„ê2‰Ø¸»oô6=Ø“L‰$ÒˆÚ²©­Zõ ¬l᪄c¸®{#K6Pç»YAÊÓ©§†Ø©­Çf 1ôÁàö¡´HÅZî,ë¡êÏuù<:J›áÔqnûŠ"ÆÚµ·o»Nöç¶9TÍý–ÿÂ`^Ë6Úü%‡G‰®wdºPÌ“#¥º(ö3ò ‚Pa,y0àPþv&<„{˜Úx@ þæ`àKSý¼ØOºiË iðÇDˆe3D°Cx½¡•¨ ¨SÙbŽ›>Œ`/oðåäUƒŸe÷²aQZ@y!R‡ðiûê,lÙÿÜ8Ç‚Gót s“¦èÝú™c’!ûý¥3¹iék/÷§ö2p ³¢ï[¬Kˆ=\ê‘ =#W„÷åÃøÁ )U3at8#™'[J7™ÀÂ~°·)&n-éîÍCÛ±!g‹‘?Ù8âÁwu‘Æ©ÃÄÍàqºÅkµëœ`)¿/AzÉì(¢Ð¥àÅŽ±Å¿0ðî-[È5ܵ`˜ý¥c}ÓyÙAêWèPÕ–Ô•óy ýÚŽ‘goxƒ¨QºI48K ^HéTÕuÎ;ÀD8ÉÀT2^u½edÁNF Ïè•÷ÓU㯫cF¹Úá•bžm°$Àþï÷—]¯šÚqrHâÛ)£‘¢nâÅ}Œ³Ù7Ä[6Z;bªÄ*«®:€9 ËZI•diB¹k-¦dºÎ–"˜çOhˆJˆ£±ÅðNR>Ãÿ=úIcǶ®Û'\rÃÁ3 Ñ0íBy0ø.³¦ê³)¡%ÿfŒ¸qN€Î:¸g—ØLHqlñ¾F}¾È æ¥¹pˆ€ÎzÝú°hbžg¦w\ÙxÇE}$¡ç¶¢ôˆ8]ÛeÖ—O\‰´õÔÞÈÇ7ŠP8¬Â³íC/‡õŸnJ°6ØöÄ=¿ŠÍa¸t ãç[ú~b~Ò%réçµêòÞ5Ó7¡º«±eÄ&¹DÍññ–¶bënἚgp^M…â—"H$é;³`VD;á½1aÃÄb³‘5w©ZÜ:ç+wËÿ}™§–lqf§%íåyðÆã“2¨–àú†éº‡iæ«-Ò"qˆS×¾_W¾a.ü0R|Qá`óî”C nm|@wù¾<ŸaJPŒÊ(c®£¶ Èðê.9O“Œ¿sÜ„A„Õ›r"¢ô·»š臲ü@sׂ(o‰4 ]$NÕšžB°3àrË牙ºÉ0–Nä¡öÇéh‡o²|æ›i]Ê"sDÖÈN2¤o»A®…hÂ0åh1'κ§WBÉVÂàæò ;*醗5þÚ’á¹æòª!Ú“ˆqO3ù®ŸäpWÌÝž’ûËPá«Nä³Ò>RÐ#¸³ã&iq¤”–¥+›{iÑ»7Ò¿÷ ºx‡lœÂþaá0Rí¾oÉMöݱE™Ψy98B(ƒ,­¥¸\.[`ûPùƒ PoN+¶\§×Nk"UëºÅu0¿µ.д#B Œ† ýúÞöQ f’U’ÄKøÄOÔ* OR6–  F¤jÕcu¸ÐÅþH›,:’h+8L_'HæÊØÙ êKÃmZAüÐî/+wÞ‘z¼žxÁvD÷ãû(#è‘Y‡9×ïOáÄ•@7Daæ°ä5}Q¼)Á#¢èë‹zD'ùœfN«ë3šy!@ôܵ²w½CÎ ­4ىΡ§°A„Ž‹ü»îÆÃkMÂÐ"úÒZxÇôMÒŽÑÂ%²ÁÜH™¸IŸ¦ìkF<µÝ‹=·‡«¢y=¢÷rÝw†ú:á1ç-ùV;¦ <* ÇˆS‡¶í7ƒ<ÙâEÍ6ÖÆ¼íå ‰$ð…zYÎÍ!õå§XìdÌ`Ý(Þ¤òƒój«]Š?ë0¿éàoœŽõJæ)š¢7‰ÇÃ7ÍŸÐõwÕ¬§ø œ¥È—šuµM³¾d·úÙoÄé$³—Df'¼mãE”øXKàrÈk2Y±)ÁÚÀ~@„ÈînlÌ)‰êò¡ŸÌÔ±é¼"ò|ç[ :á9I1šD7axÛLD©ÚxºAÒDü‰Ë”½zûg#m¥ lªô-áóqEÔœ³rEv6/(üí,ö ‹°ú}Ô‚¯ ….ÖAýO¢ I›çØ$ ƒ Nc‡MÛ7à 6xr›²ïOí¥¶³ÜI>a¬F¾!Q’¤¦¿t²wÎz|Û;Þ'¢|^'w¤¡¹F í> g¡yÒëâkÂg3Ê„~¹§K]ól­áqiäô|–nQ¯ˆmèî˜*–»ÚµíŠyÂÆ-%òé‰q bDÖKœ÷ ˜@AQép¡`»Ä‰l‹×jç Ú8nªrûÖ®Lbúû¤Ùîº~ö-Yg:ĨáGd'97'1íPH»=çI—8‚Õ†HÌ¢Ž(ãÑóÚâ;Ì-Þã¥ÙÛº‚4sò ñí ïÔUH«š•ÁóCC$lxÑÿ$«û—àJ„±˜WÈîåá±l†ò^ß·Œ?Žýrõ?!a n endstream endobj 3264 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 3265 0 R >> endobj 3266 0 obj 2958 endobj 3268 0 obj << /Type /Annot /Subtype /Link /Rect [ 295.532 585.085 317.762 594.085 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1753 0 R /H /I >> endobj 3270 0 obj << /Type /Action /S /GoTo /D [1706 0 R /XYZ 72.0 530.561 null] >> endobj 3271 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.995 383.037 222.995 392.037 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3270 0 R /H /I >> endobj 3272 0 obj << /Type /Action /S /GoTo /D [1706 0 R /XYZ 120.0 438.769 null] >> endobj 3273 0 obj << /Type /Annot /Subtype /Link /Rect [ 228.552 383.037 246.882 392.037 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3272 0 R /H /I >> endobj 3274 0 obj << /Type /Action /S /GoTo /D [1706 0 R /XYZ 120.0 403.681 null] >> endobj 3275 0 obj << /Type /Annot /Subtype /Link /Rect [ 252.439 383.037 272.439 392.037 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3274 0 R /H /I >> endobj 3276 0 obj << /Type /Action /S /GoTo /D [1706 0 R /XYZ 120.0 368.593 null] >> endobj 3277 0 obj << /Type /Annot /Subtype /Link /Rect [ 295.494 383.037 315.494 392.037 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3276 0 R /H /I >> endobj 3278 0 obj << /Type /Annot /Subtype /Link /Rect [ 244.795 336.845 270.335 345.845 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1692 0 R /H /I >> endobj 3279 0 obj << /Type /Annot /Subtype /Link /Rect [ 275.976 336.845 313.736 345.845 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1796 0 R /H /I >> endobj 3280 0 obj << /Type /Action /S /GoTo /D [1691 0 R /XYZ 72.0 688.323 null] >> endobj 3281 0 obj << /Type /Annot /Subtype /Link /Rect [ 336.958 336.845 371.378 345.845 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3280 0 R /H /I >> endobj 3282 0 obj << /Type /Annot /Subtype /Link /Rect [ 156.05 188.077 179.37 197.077 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1713 0 R /H /I >> endobj 3283 0 obj << /Type /Annot /Subtype /Link /Rect [ 156.022 153.885 187.122 162.885 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1394 0 R /H /I >> endobj 3284 0 obj << /Type /Annot /Subtype /Link /Rect [ 219.685 119.693 245.225 128.693 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1692 0 R /H /I >> endobj 3285 0 obj << /Length 3286 0 R /Filter /FlateDecode >> stream xœÍÙnÜFò]_ÑÈËÚ€Ôéƒç¾9ŽíÍ" b[†„€3Ó£aÌ!'µb‡ªí„š¶÷cÍàÇ÷¢m¸  FIš&±aõ{Õ K0ôE))—²ƒ¾ÐÖÒJq 64ý²¬úeó˜·ÛCîAK»6ªË kQƒ§Æ–áÓÌIÐÁ¡×ï~ÿåÃoozð(¶‡¬Ì›£O³æùxà›mV`»ã$„•*tÀS1f l5ÙOPš`‚¿¢01ùÍ1ãÏb[•Òåà«QûGÃàÔ‰RÍåTî*¡8¶V`Ÿ×*§ Ø´âä j¿@Õhed Õ»úxÒ–»%m䉘×:Á Y5vˆŽFLß°ÏjO|SLüc+Â@f¸³~®:|+UM1¨t©ެvPsE š?Ä©7@]u÷‡bðTüÝåYaüh$W#-0p¢‘¬âñdçØí!S"8í­–Ëöù$ìÚ ?ôè·v¡÷»Á®Å~·ÙYè”Õ*ÐSúÖtodŠº„rþl1ð—{ÑV§Þ‚"ßÔYý|é±|Wf„ÖÙËÉÛaîeÙÐAo?Diß[`àƒ²MÞç÷LÊ–<ƒä¡ÊªEǬme+*Y—0eÕ B5‡ê±A°‰èT5M.«‡Ý($#Áè×O³iôà2ÔaH ã£ú±8@¥ÄC¤ 2‰e+xs•ÝÀ7Èrž¶”3LäPc¡G@^þ #8dQ/šDk Æ:mÎÒ‰Q‚©¼ I`jœ³”g<=UbÐ Ñ„6Ù‹*íÎS Ž[âÓ$‰cK{l,ªÄ9Y£«ôî,•xâ0N •£æœ%dPµƒ¸]T) |~¬Ò‡³T XŠÓ€Â¾_ˆùôë²6A¼Fz7Oe΢ÉK7WÿQj¦'kjF1æTŽèqêár¨šåhOééÝ@üÍÕ·1XŽÁßÏR•FPÉ#ŸÀ"?æíÍ¿«ý¾íÝrBÀ!ºÂe¬Xu–b f ª8&¾­Ð ×r:@û´B=Vè4ÿƒõüt–ö\¾@Õ hà‘ÚÁ¸_-GAÀÃ5ò±FžÈåÉ„Bwãà”pMë…Ð AmóðÐuúO}r/—k¬1¹(rsõù,µh˜ÂfFÀ2L}¶Uõ‹Z1®±kÕž¥ƒ‚Bx cyXÂúÒÉÆ‰ä¥Iü²§º³tâœb 57ICÇ®‘òʹÆãt…|¬Ð—³ Hˆà—2yRÎX®j#‹ý íXÇ !äw…qfM#;éåBy¨îÐÍÕW´© (dÙ!œzÈaÞ•{ðç‹Â…L”×è0SøÔ°"EÃÍÈØ&÷„%f¢¹ÊÜì2¼0çI0yS_ü\ÁÉïÆüÆa&¥*,†•¦!efЙÿUMIÂU’ËeYPœÂÞ¥28½²öS’F;ù“&+‘Û.¹ÏIRÞU’,3ËyË[› …‰—ó¹lvg³Fáéo9hù`Sû/ öiåÖµ•ô¨n´W—˜ø«êÔèÝ#ú; Þ¾‚Q¦n§—¨2òÒh¢ê¾+ŠK$Óe›M-è¥vvûÆý¦•ßà``«J˜råd'ï;9/‚æPoÁ‰Åëg¼š)M0_]at¦¼YÉîˆbèodVÒÉ$³pO ¿kAÖŒIMÖEVÖ§®u ìü¤%Œ`ÌŸáX¦ZBcÐl·ƒ3jJ“&˜CÁ!QL=4—‹Â4ûiÊ/ÍÌCØÀ1—ÇŠcJ—òuyöêË+°i]sœø´†ÁyûÍ#;M1c¨«±OeìĽíê&x}©¢QMw:Ah‹RYÑéè7׃]ý¡Î›æylº-`§|ùé‡b7 1‰ £IC»›•Ø…‰5‘“ìÊæ¤ã‰w%tå¯4F”ŸOb›ïs°[æœä!S3C'Q7ò" ßaßåm‹ò‚M°# ú4Œ¨±iw®M3ÒñȼlSHé„òZ–G}É‚`ì›&×ýU3œ©=ê«’|¸ÕÁbï#×-9”oÙ,3f-~·f1Œ¿ò*$‰¸‡t<‘¯X„J¯ÅÛCVg[ùeÊ2F²ÜüsaŽFX’X?œYeç¤ýˆ¿bt±c"U_ǹG% eŸFBœ´žÚí:×?ÈòÑôÐ]£²Áy¢Dv|Ês ¿N·Ÿ?£¦}.Ds¢•ïÈÇú—`ëþŒ…¸ç) ˆæC¿¼–8ËŸsRw±ìЈò •>°˜›G~e²å‚3gNgŽ<Ï§Ž¥0œI"…"+É]„+°ÓQÔÚ44j]Ùßdè'•]A\»×{õ¥ý*µ-umW¿üaWê¤lœ€½‡jSf27bÀC¼'ÀwP\Ij÷õ›¿o‚dòæµq@¬>¸Ø†Nƒ­( ÷Ðè¬ÖÓ}€‰ú18ÃCŸ ÃsÌä/¶ xÎIzIƒ½ÓZTýò¾•QïÕ°ìŽBý¦Çüòs¿Ô1£‘ÕY1‹P«æï} û%`ÅK»Ì`0 ±ýyÍUyæÙ4'U}ò)Û¾x8A*«Ö½:5âöUv:ù@Õ°{$þï·_çQ”Ë«®…Îøöõà7‹/þÜ\ endstream endobj 3269 0 obj [ 3268 0 R 3271 0 R 3273 0 R 3275 0 R 3277 0 R 3278 0 R 3279 0 R 3281 0 R 3282 0 R 3283 0 R 3284 0 R ] endobj 3267 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 3269 0 R /Contents 3285 0 R >> endobj 3286 0 obj 3024 endobj 3288 0 obj << /Type /Annot /Subtype /Link /Rect [ 156.486 747.389 179.806 756.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1713 0 R /H /I >> endobj 3290 0 obj << /Type /Annot /Subtype /Link /Rect [ 156.05 296.429 187.15 305.429 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1394 0 R /H /I >> endobj 3291 0 obj << /Length 3292 0 R /Filter /FlateDecode >> stream xœíZÝ“Û6÷_ÁéÓæ&ËÔwÛ»ÜÜ=tú±>¤™ŒlÓ¶&²¤Ht¶ûß )‹¢lÙI“ëγI– ?AÚœ0ø¹Ç_iÈišfdµ_|°|NA‚ز"FC1R‘=³"R‚ŒÛ} ~ƽ#¿-ª#ÿ^¼y cÖ„Üã‚™\OõËâ'G7;ÚÏI?F¶‹ï¯^G„3ò°L,bÊ¢8Ë2ÁIJ‘áAöäÍÝÃN’ŸåæŸß‘UYÈJ½êdûQ¶/Þ’‡ÿŽfài ̛bUï÷‡ªX媨+Ò´µªWuifø×ÃÈrc4}n†ûi¤"^’$”ù ÿBpÌŒØ5RÄ'Í*#ŽA`~ŸU™M4f®ÂÓX|6ÊÃ8¡ çY–dtÑtD" æ"æÙÀ›‹@½5«=>L'[ïþb ¿z ƒ}cqÊB=8œ–žPo¾­7›Nª·f4û)›ÇÓýŠ[þ¹ÐùÎÛèiHÃ4†ÎNn¥j寓à,¡)‹`TrBdX³D^­Ƙ(˨ÕN¶ Ëþc2O7pƒGí §«ntNzë¡­­è :³´yµuÈz3´×¹ÊÁìg0t háÊxðz5ȹw­T‡¶¢–:ïtÎBšhÊôÄtZá^xâi€lã£0›Êڥײª•ì,e c«:ì—ÚäHh´FíleµÆ€^ZÊxrZGHœ¤Œe°Ÿ&ê™P>‹-ˆÅŒ°]»èŽêô@´÷órrê·0œhCèº{_4$W ¶”Û¢ªŠjKíÆv¾»Ùãˆf& `³Ûë™Ý¥4íU˜HºzŸßæpfÅp'Ø -Ø%kE*’“Õ¡Sõžt*o`!66u‹MÙ+²,–eQoÛ¼Ù²›G›e6lÜ´Í ¯«%çÜù`7¬ã kh·O#8R…Ú ”ݽ†È×kðŸCWŽÜ¡,Gý}J¡ë?N7Xìå@äz9Òä.wöndÛaN£Ž‹À³DQmjRWåÓ¼­yQ†µXôÉgŒ%ÞH€¥­¨‡63)X ¼ÔË»Á_TzXh´]§HYÀûR“äú‚âIJc<Ó‚ÌêÝžÑ;cã6F8àP~µ;’N CØø°2jZ í"†¡3›m”#‘Ío ¬¾9R5˜$·±j©œIòA¬•ûú£9ìN=•’:ŒïwrõÞ&¯/ S+?`7O³“ˆ3Ïý…=N7…,×ÇÜðÇNíKRTs¸äÚŒÓ _…qd]ûËœk3`‚Ä40íêöZÇ,ð„±®ò½ìvd~mt _Èl“l‰ñ`Ãl[*Kld°j,”G\×Ýü„(xü‰å‹XƒØ“E¬Æ;ÄLуvÒ<$ð¶€9=p›a_(¨e ÍÒ$éÓüáÊÊg* æoÑOQ'Ì“DÔ½´ëKÌJÀW)|°^¬ë—PÙYA'/€Ìå¨v˜¦ä¯W^æ¦¢× áf0–òCÁZ hêUè¬;s»¼½PVÀU—&¸ãa—XHWBšŠb®{¬ÛõEXAâI"¬^úËû-„œ" °4 -Èßæ@Tà^b ÝT´’hôwWƒM¸7ƒ¾‰O.à,Â2žE' ã’þœG”£‚BÇãZŸÊ=ØÍu@¹6·áàtHõö$Æ¢-‚ ðžŸñ #ƒê#ŒÍû¦i—’ïaupø0_B¾ÎW ÒME$0MUûo 0—H(á”êëÔiôBé=4ž1;ø<Š@-ƒIC1*'ï㘠¨wy£Ì{ƒa`*túÍiÚò¦Ì‹Êé4§¸i¤ß‘Ý+:pÌ{‚iÛ—;á…Œ¬Ê§ÕšŽ:sõ1,ó^;Ù¼ì¡Ç¡ýÐámïvšÚV7z¿ÒóŽa>î ]tc»ÛÕ‡rm‰¥´M^´Zq$dÞõMm?l Ÿ—WOÇUu}®¶xï÷ƒªe^mùV:ÑÑ6Ä#TÖ"Å à‡$$[fLaèÄ$§äuÑÂî¿[y|wÞõ"ýâ38KaNýîx/eßÀWì’À•&ÔyЧ̋!0xdHß‹ùÇG3¯Yc2™ùÂc»ãxL“ñªÀ9¥Æ™Õ¯˜Ú×ÁðµAðÚŽ˜“•-ã<ð£üùuÇ£´±†%­G?9ö4šU€M Œž´?½0ý­öÙ¶S²9ù’ Ç7DÓ…¨_+¬Ä-®>!®þB¹®üì 2'ÉÉ0œS¸“Ý¢èES‘óQ®Ex0ò[2º…Ñå0ÚË®ƒ2‰¨§Fž ¦ 4M®¥8úz±ÔÏ})–Æ:Ä‘Y_>ÖnvÅ©gnŠ'cÌVäø¡ÉÉû»ÓRzš0>7+Ù‰\Ÿi–-€m÷ps˜)íØë]é¬}þ{lúm>_ß¼8öâßì­ø÷ßÙñïlÑysÜ×vÜÉ"íföÿ¥ÙûræùY}\Þ ŒÁêÿo~ù¤Ð‚﹃kSWÔú N–“O¦ Âá“+³¼l÷E•Û§Ú”#¾;÷JG8Œ=áÚ~á$Ò«—Rõô}<õäy¬%X,4ô]Žº€‚NDæ‰ößä.ö¸«K—vèSþøI2 endstream endobj 3289 0 obj [ 3288 0 R 3290 0 R ] endobj 3287 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 3289 0 R /Contents 3291 0 R >> endobj 3292 0 obj 2189 endobj 3294 0 obj << /Length 3295 0 R /Filter /FlateDecode >> stream xœÍVËnÜ6ÝÏWp™ Ã÷côvQÀÍ]YÈ=#d$Ž%ާùû^Žž”-9íÊ"©Ã{.îƒ;Šü>ćcQ^íûuŠ4C\õK’`Á$!1™DJ—$:Ážù€ #x$X˜Ñß»zGÐo»/_S û®;²büfêóînæ[€ñ[ò ÃîÓ~÷ñW‰(Aû‡Ib¦0‘ÊZË(2˜3ÿÚWèË»ýÑ¡¿ÜÃÏŸP~*]>¶®yrÍû¯hÿGbMa1²0‘ûªºÔež…Ò×èÜøàsê,ü²O”ã„`óÖ„»K\„ÀÓZc² Hø˜wk°ÒYŒ¯G–ÓŽ%YéNÐ=W]&Ï<&s‡ŸÇâ›qn= •ÆšRkµµð ›$ˆ8e[ófŽ÷Ls_¸iv=–ùqœeÍ´­ºœBy>Ͱþa‚s/nª}˜ÖÛÖçe\1±•aF6ŽÊf ^%<.ü^·ÁeÅO‹Òç†tNÏÝ•ºèòM±€ÃýåTLóÆ…¦tOnZ ÇùÄ5UY÷>&`G}˜Íaše°'±ÖÎì boýÜ“¬Xñ¢ø^g”ÝÓéûó3»8óÁÕ®¹¹<(×ÇV·m·ã~a… Õ,F/ë3ÆSDΩ±€úoÛ¶|0e@ 1ئ+¶¥Z@]ÓøfÛ<|o+¥µ\Én]udJ¡O¾,6­3J±Ô‚Iù`}Åy‰BË:÷Mãò€Ú¼Éªû“C]ÜlS H\ S.J¶B)!Ö-µF‘$ÖQV¨kíc‡nQáQLÅ* ùqÛm°!P°´Tƒ|ÅKв~ÊNeÑ_0Pã/® ›|Ð  öBñ´dY¼ÌÇ¡•§Ð(r%)¸2ÞP@€mJ·$!­Ë2%r…Rš´*Û6fÿáÓ+ÁAÅ(©Zá³t}™ùs¼‚mÒ Ê¡+1ÈU;Æ’~™šßz©¿ÕþZÿZP7Êeù(®Yaqd~+Í1N¡HYs†¶qõͶÄÂ@S¦’ëÕ®°Z¶€†²rþ´>à‹eøµ4•ÐØ)‡°P|ZºRwd¼P'ДîÚ”áU:÷))3œ t+…*ܺ@Ys¸T°°Ml(æ±àÛáâAéJ9’–/ C9º÷MìE?’) t½åa½Xl­ž+Ð5…¾ZÏ•0XmãÕt°¾"£Rd­²²FE²û úy w·N×mFÃ0c ª95ãŠ~ÊŠtÊv5J˜] ïvÿ@™Ë endstream endobj 3293 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 3294 0 R >> endobj 3295 0 obj 1046 endobj 3297 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 730.013 243.597 739.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3111 0 R /H /I >> endobj 3299 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.957 730.013 524.957 739.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3111 0 R /H /I >> endobj 3300 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 718.013 236.493 727.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3114 0 R /H /I >> endobj 3301 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.127 718.013 525.127 727.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3114 0 R /H /I >> endobj 3302 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 706.013 238.135 715.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2972 0 R /H /I >> endobj 3303 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.115 706.013 525.115 715.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2972 0 R /H /I >> endobj 3304 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 694.013 242.537 703.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2969 0 R /H /I >> endobj 3305 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.083 694.013 525.083 703.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2969 0 R /H /I >> endobj 3306 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 682.013 251.875 691.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2976 0 R /H /I >> endobj 3307 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.013 682.013 525.013 691.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2976 0 R /H /I >> endobj 3308 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 670.013 256.821 679.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3123 0 R /H /I >> endobj 3309 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.977 670.013 524.977 679.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3123 0 R /H /I >> endobj 3310 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 658.013 234.297 667.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2990 0 R /H /I >> endobj 3311 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.143 658.013 525.143 667.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2990 0 R /H /I >> endobj 3312 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 646.013 233.743 655.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2981 0 R /H /I >> endobj 3313 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.147 646.013 525.147 655.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2981 0 R /H /I >> endobj 3314 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 634.013 232.655 643.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2994 0 R /H /I >> endobj 3315 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.155 634.013 525.155 643.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2994 0 R /H /I >> endobj 3316 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 622.013 247.483 631.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3132 0 R /H /I >> endobj 3317 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.047 622.013 525.047 631.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3132 0 R /H /I >> endobj 3318 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 610.013 261.767 619.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3135 0 R /H /I >> endobj 3319 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.941 610.013 524.941 619.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3135 0 R /H /I >> endobj 3320 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 598.013 243.635 607.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3138 0 R /H /I >> endobj 3321 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.075 598.013 525.075 607.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3138 0 R /H /I >> endobj 3322 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 586.013 244.189 595.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3141 0 R /H /I >> endobj 3323 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.071 586.013 525.071 595.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3141 0 R /H /I >> endobj 3324 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 574.013 242.547 583.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3144 0 R /H /I >> endobj 3325 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.083 574.013 525.083 583.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3144 0 R /H /I >> endobj 3326 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 562.013 250.201 571.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3147 0 R /H /I >> endobj 3327 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.913 562.013 524.913 571.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3147 0 R /H /I >> endobj 3328 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 550.013 274.408 559.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3150 0 R /H /I >> endobj 3329 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.849 550.013 524.849 559.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3150 0 R /H /I >> endobj 3330 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 538.013 256.277 547.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3011 0 R /H /I >> endobj 3331 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.983 538.013 524.983 547.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3011 0 R /H /I >> endobj 3332 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 526.013 258.482 535.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3004 0 R /H /I >> endobj 3333 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.967 526.013 524.967 535.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3004 0 R /H /I >> endobj 3334 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 514.013 272.776 523.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3005 0 R /H /I >> endobj 3335 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.863 514.013 524.863 523.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3005 0 R /H /I >> endobj 3336 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 502.013 254.625 511.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3006 0 R /H /I >> endobj 3337 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.993 502.013 524.993 511.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3006 0 R /H /I >> endobj 3338 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 490.013 275.324 499.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3161 0 R /H /I >> endobj 3339 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.741 490.013 524.741 499.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3161 0 R /H /I >> endobj 3340 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 478.013 299.019 487.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3164 0 R /H /I >> endobj 3341 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.671 478.013 524.671 487.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3164 0 R /H /I >> endobj 3342 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 466.013 225.503 475.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3167 0 R /H /I >> endobj 3343 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.207 466.013 525.207 475.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3167 0 R /H /I >> endobj 3344 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 454.013 264.951 463.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3170 0 R /H /I >> endobj 3345 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.813 454.013 524.813 463.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3170 0 R /H /I >> endobj 3346 0 obj << /Type /Action /S /GoTo /D [3029 0 R /XYZ 72.0 710.171 null] >> endobj 3347 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 442.013 236.951 451.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3346 0 R /H /I >> endobj 3348 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.123 442.013 525.123 451.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3346 0 R /H /I >> endobj 3349 0 obj << /Type /Action /S /GoTo /D [3029 0 R /XYZ 72.0 408.064 null] >> endobj 3350 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 430.013 206.954 439.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3349 0 R /H /I >> endobj 3351 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.341 430.013 525.341 439.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3349 0 R /H /I >> endobj 3352 0 obj << /Type /Action /S /GoTo /D [3029 0 R /XYZ 72.0 352.569 null] >> endobj 3353 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 418.013 350.186 427.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3352 0 R /H /I >> endobj 3354 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.375 418.013 524.375 427.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3352 0 R /H /I >> endobj 3356 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 406.013 290.296 415.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3355 0 R /H /I >> endobj 3357 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.843 406.013 524.843 415.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3355 0 R /H /I >> endobj 3358 0 obj << /Type /Action /S /GoTo /D [3175 0 R /XYZ 72.0 757.889 null] >> endobj 3359 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 394.013 228.807 403.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3358 0 R /H /I >> endobj 3360 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.183 394.013 525.183 403.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3358 0 R /H /I >> endobj 3361 0 obj << /Type /Action /S /GoTo /D [3175 0 R /XYZ 72.0 701.006 null] >> endobj 3362 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 382.013 255.684 391.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3361 0 R /H /I >> endobj 3363 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.117 382.013 525.117 391.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3361 0 R /H /I >> endobj 3364 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 370.013 229.937 379.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3190 0 R /H /I >> endobj 3365 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.051 370.013 525.051 379.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3190 0 R /H /I >> endobj 3366 0 obj << /Type /Action /S /GoTo /D [3180 0 R /XYZ 72.0 683.988 null] >> endobj 3367 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 358.013 212.514 367.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3366 0 R /H /I >> endobj 3368 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.301 358.013 525.301 367.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3366 0 R /H /I >> endobj 3369 0 obj << /Type /Action /S /GoTo /D [3180 0 R /XYZ 72.0 406.011 null] >> endobj 3370 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 346.013 277.108 355.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3369 0 R /H /I >> endobj 3371 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.829 346.013 524.829 355.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3369 0 R /H /I >> endobj 3372 0 obj << /Type /Action /S /GoTo /D [3200 0 R /XYZ 72.0 692.36 null] >> endobj 3373 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 334.013 287.138 343.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3372 0 R /H /I >> endobj 3374 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.869 334.013 524.869 343.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3372 0 R /H /I >> endobj 3375 0 obj << /Type /Action /S /GoTo /D [3200 0 R /XYZ 72.0 373.982 null] >> endobj 3376 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 322.013 297.667 331.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3375 0 R /H /I >> endobj 3377 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.787 322.013 524.787 331.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3375 0 R /H /I >> endobj 3378 0 obj << /Type /Action /S /GoTo /D [3200 0 R /XYZ 72.0 262.751 null] >> endobj 3379 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 310.013 288.244 319.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3378 0 R /H /I >> endobj 3380 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.861 310.013 524.861 319.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3378 0 R /H /I >> endobj 3381 0 obj << /Type /Action /S /GoTo /D [3200 0 R /XYZ 72.0 151.52 null] >> endobj 3382 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 298.013 281.61 307.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3381 0 R /H /I >> endobj 3383 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.913 298.013 524.913 307.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3381 0 R /H /I >> endobj 3384 0 obj << /Type /Action /S /GoTo /D [3242 0 R /XYZ 72.0 769.889 null] >> endobj 3385 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 286.013 367.655 295.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3384 0 R /H /I >> endobj 3386 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.113 286.013 524.113 295.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3384 0 R /H /I >> endobj 3387 0 obj << /Type /Action /S /GoTo /D [3242 0 R /XYZ 72.0 606.171 null] >> endobj 3388 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 274.013 239.233 283.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3387 0 R /H /I >> endobj 3389 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.105 274.013 525.105 283.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3387 0 R /H /I >> endobj 3390 0 obj << /Type /Action /S /GoTo /D [3242 0 R /XYZ 72.0 399.288 null] >> endobj 3391 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 262.013 336.265 271.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3390 0 R /H /I >> endobj 3392 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.401 262.013 524.401 271.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3390 0 R /H /I >> endobj 3393 0 obj << /Type /Action /S /GoTo /D [3245 0 R /XYZ 72.0 769.889 null] >> endobj 3394 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 250.013 341.341 259.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3393 0 R /H /I >> endobj 3395 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.291 250.013 524.291 259.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3393 0 R /H /I >> endobj 3396 0 obj << /Type /Action /S /GoTo /D [3245 0 R /XYZ 72.0 650.972 null] >> endobj 3397 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 238.013 336.256 247.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3396 0 R /H /I >> endobj 3398 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.399 238.013 524.399 247.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3396 0 R /H /I >> endobj 3399 0 obj << /Type /Action /S /GoTo /D [3245 0 R /XYZ 72.0 555.691 null] >> endobj 3400 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 226.013 357.665 235.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3399 0 R /H /I >> endobj 3401 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.245 226.013 524.245 235.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3399 0 R /H /I >> endobj 3402 0 obj << /Type /Action /S /GoTo /D [3245 0 R /XYZ 72.0 411.527 null] >> endobj 3403 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 214.013 339.235 223.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3402 0 R /H /I >> endobj 3404 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.379 214.013 524.379 223.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3402 0 R /H /I >> endobj 3405 0 obj << /Type /Action /S /GoTo /D [3245 0 R /XYZ 72.0 315.363 null] >> endobj 3406 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 202.013 445.852 211.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3405 0 R /H /I >> endobj 3407 0 obj << /Type /Annot /Subtype /Link /Rect [ 508.603 202.013 523.603 211.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3405 0 R /H /I >> endobj 3409 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 190.013 336.493 199.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3408 0 R /H /I >> endobj 3410 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.323 190.013 524.323 199.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3408 0 R /H /I >> endobj 3412 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 178.013 219.15 187.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3411 0 R /H /I >> endobj 3413 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.253 178.013 525.253 187.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3411 0 R /H /I >> endobj 3415 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 166.013 232.543 175.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3414 0 R /H /I >> endobj 3416 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.155 166.013 525.155 175.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3414 0 R /H /I >> endobj 3418 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 154.013 263.929 163.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3417 0 R /H /I >> endobj 3419 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.051 154.013 525.051 163.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3417 0 R /H /I >> endobj 3421 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 142.013 241.346 151.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3420 0 R /H /I >> endobj 3422 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.229 142.013 525.229 151.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3420 0 R /H /I >> endobj 3423 0 obj << /Type /Action /S /GoTo /D [3267 0 R /XYZ 72.0 696.705 null] >> endobj 3424 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 130.013 252.36 139.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3423 0 R /H /I >> endobj 3425 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.143 130.013 525.143 139.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3423 0 R /H /I >> endobj 3426 0 obj << /Type /Action /S /GoTo /D [3287 0 R /XYZ 72.0 294.929 null] >> endobj 3427 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 118.013 423.184 127.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3426 0 R /H /I >> endobj 3428 0 obj << /Type /Annot /Subtype /Link /Rect [ 508.766 118.013 523.766 127.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3426 0 R /H /I >> endobj 3429 0 obj << /Type /Action /S /GoTo /D [3287 0 R /XYZ 72.0 202.003 null] >> endobj 3430 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 106.013 241.346 115.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3429 0 R /H /I >> endobj 3431 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.229 106.013 525.229 115.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3429 0 R /H /I >> endobj 3433 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 94.013 252.36 103.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3432 0 R /H /I >> endobj 3434 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.143 94.013 525.143 103.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3432 0 R /H /I >> endobj 3435 0 obj << /Type /Action /S /GoTo /D [3293 0 R /XYZ 72.0 769.889 null] >> endobj 3436 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 82.013 264.495 91.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3435 0 R /H /I >> endobj 3437 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.047 82.013 525.047 91.013 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3435 0 R /H /I >> endobj 3438 0 obj << /Length 3439 0 R /Filter /FlateDecode >> stream xœÍÝ]sGr á{ý \Ò>®ªÌ¬ÌôçÃÞÙ°×cIŽÝ ‡CQ„’hGóï·³à!ÐÍÐy÷j<zûä#]uª«ÿë‹~Õ–ÿýmý#´Ÿ"òêíû/þëéãýÊǕ̧Y;é°ÖäªëiØÕû«—²«wuÎ'¿Ï¿Zþñ¢]޼úŸ_|ø¢]ýÓÿñŸKóÝU[Îûóí3/¾¾ÔW_üÛ'_ÛS°üú¯éëûô+”ÖNñ×÷þÛK`w?µ×ðëËÈö±å#Û+Ö¿zñ…¼>Ü>Ë‹l¿ƒíŸŸý’Ûî+nÇ¢Ïæ5_\»úá‹ß|ýÅßýãò5µ«¯¿?ÿš~òÞ3=sùW§Yÿ7®¾~õo†Î¿ùÏ«¯ÿû¿ÿú还¿šßÞþ?–Q_×ÇßõòŸ–ŸF´Öú‹ß¼Fýüé7½ýž¿¾þöÝÍÕÝ÷W¿½ûðxóáñaû8ø£[ΖåO¯ÍåeGlg÷yºú›«¿å¿ä«7_Þ|sóáíÍùCß]?^{ýðéGnnø°}’/ݽŸ,½¾à±ÿ$ç“w§é)%2mùv¸;í´«ÔÑP-¨ž¨NRç@µ¡:@=ZG5±XŽN,G'–£ËщåÄr b9²d)ÈR¥"KE–Š,Y²4diÈr"ˉ,'²tdéÈÒ‘¥#Ë@–,Y&²Ld™Ä²®‘HM,¥KiÄR:±”N,¥KÄR±”,Y ²d)ÈR‘¥"KE–†, Y²œÈr"ˉ,'²tdéÈÒ‘e Ë@–,Y&²Ld™ÄR±ÔF,µKíÄR;±ÔN,uKÄR±Ô,—kûÙ5³ Cu­‹|«¾œ64^õ>®–ËëÝdC_§–!®_½ùúÇ›óÁã:q>üæýÍãõëáër)«92ç8xõóɻӖ/½gftߟ¶Ÿeh¨TOT'©ëšÔ†ê u]Ó‚ZQM,G#–£ËшåhÄrtb9:±XŽA,Ç –c KA–‚,Y ²Td©ÈR‘¥!KC–uM»üuë¢rA]×´ TOT'©ëšÔ†ê u]Ó‚ZQ,Y&²Ld™ÄR±”F,¥KéÄR:±”N,eKÄR±”,Y ²d©ÈR‘¥"KC–†, Y²œÈr"ˉ,Y:²tdÈ2e Ë@–‰,Y&±ÔF,µKmÄR;±ÔN,µKíÄR±ÔA,u KÑÓ¶Ô`t0  Ë7ò>¼õåOiÚá ÆìûŒñ<ƒÑ?Áè/g0êð›û›ï¿ûv71OËï2S­ï_þ|öî´<™Ùr5îsÚ~â` ÚP¤^.SI­¨vR/—©¤TOTËшåhÄr4b9:±XŽN,Ç –cË1ˆåÈR¥ KA–Š,Y*²4diÈÒ¥!ˉ,'²œÈÒ‘¥#KG–,Y² d™È2‘eKiÄR±”F,¥KéÄR:±”N,eKÄR²d)ÈR¥"KE–Š,Y²4diÈr"ˉ,'²tdéÈÒ‘¥#Ë@–,Y&²Ld™ÄR±ÔF,µKmÄR;±ÔN,µKÄR±Ô,YÖ"Œ\üÛP0 °Na<¯ÝØv8…±|ØMaÈ6…Q·ª|œÂXÎSÛá7×??þxw¿›Xþíò}¨-××û×?Ÿ¾;MN©Û,Ïþ´ý<ÃDu’º–J€ÚP¤®¥ VT;¨×¥ &–ëR PËu©¨‰åºTâòzËu©¨‘¥ KA–‚,Y*²Td©ÈÒ¥!ËZ*¡=c¶¸ ®¥ TOT'©k©¨ ÕAêZ*jE5²Ld™È2‘eËu©¨‰åºTâòºËu©¨‰åºTÔÄr]*jd)ÈR¥ KE–Š,Y²4diÈÒåD–YNdéÈÒ‘¥#Ë@–,Y²Ld™È2‰åºTÔÄr]*qy݉åºTÔÄr]*qy=ˆåºTÔȲæÜö¯ú|ânÔ-§¡šiýàKÙÑ'ª“ÔËßcRªÔµ}©ÕNêåï1©‰emß@jbYÛ7šXÖö  d)ÈR¥"KE–Š,Y²4diÈr"ˉ,'²tdéÈÒ‘¥#Ë@–,Y&²Ld™Ä²¶o 5±¬íHM,kûRËÚ¾ÔƒXÖö ¤F–‚,Y ²d©ÈR‘¥"KC–†, YNd9‘åD–Y:²tdéÈ2e Ë@–‰,Y&²LbYÛ7šXÖö  îIJ¶o 5±¬íHM,kûR#ËÑëòÓÞÄ/¯ãù¾œÔ4÷'Žçó`§HÛÆóVÛC<è׃ó˜~;üæ§›ûÛ»ïnß^¿Û ¦õ£ef·ýç8¿Äî´8u_~ztÚ~œÜQ­¨vP×»ê¤TOT'©—«2Rª‰e½«NjbY廙Z¥ KA–‚,Y*²TdiÈÒ¥!ˉ,'²œÈr"KG–Ž,Y² dÈ2‘e"ËD–I,ë]uRËzWÔXÖ»ê¤&–õ®:©‰e½«Njd)ÈR¥ KE–Š,Y²4diÈÒåD–YNdéÈÒ‘¥#Ë@–,Y²Ld™È2‰e½«NjbY廙ºËzWÔIJÞUõ –õ®:©‘¥ ˱2Ú]÷Zô™‘~pÚáp½·ƒÍ·g;Ô­ìçuþòrÿvøÍ‡»Ç›×ÝåÛàrù“éÍ^þ|öî<;¹ôLrpÞn<½|G$ùò-åÊrGùò]åÂòÉòDyí‘Ar¦šHµ–* ©Öb’w¤ZËPŽTkÁÉR­% (gªÂT…© SU¦ªLU™ª2UcªÆT©N¦:™êdªÎT©:Su¦L5˜j0ÕdªÉT©ÖZ”#ÕZÍ€r¤ZëPŽTkEÉR­5 (gªÂT…© S¦ªLU™ª2UcªÆT©N¦:™êdª“©:Su¦êL5˜j0Õ`ªÉT“©&SM¤Z«PŽTk½É;R­(GªµæåHµV= œ©®›>ÆvK˜ŽX·Lx^/±?o˜L¦Œƒ}ýy2Å?Lñ—“)ë- ??Üì¶L¨‹f}zrÅþåÏgL¦t¯œÎ88ïh2…äëü2È•åŽòuŠäÂòÉòDù:Í r¦šHu4¤:R ©ŽŽTGGª£#ÕÑ‘êHu ¤:S¦*LU˜ª2UeªÊT•©S5¦jLu2ÕÉT'Su¦êLÕ™ª3Õ`ªÁTƒ©&SM¦šHUR•†T¥!UiHU:R•ŽT¥#UHUR•ÁT…© S¦*LU™ª2UeªÆT©SLu2ÕÉT'Su¦êLÕ™j0Õ`ªÁT“©&SM¦šHURÕ†Tµ!UíHU;RÕŽTu UHURÕÁT×É”º C'™ŽØ&S¼5é~pÞñdJÍã7Ë”i'Sb›LÑO¢¡/¢±~óîößv³í4M3ÃãàåÏgïÎÓSËJ›œ·ŸLq”/WÏ(–O–'Ê—«g”ËåËÕ3Ê™j"ÕºåHµnáA9R­›xPŽTë6’¤Z7ò œ© S¦*LU˜ª2UeªÊT©SµR]~„\RφjAõDu’Úª ÕAêè¨VT#ËD–‰,Y&±¬{zHM,ëžPwbY÷ôšXÖ==¤&–uO©‘¥ KA–‚,Y*²TdiÈÒ¥!KC–YNd9‘¥#KG–Ž,Y² dÈ2‘e"Ë$–uO©‰eÝÓêN,ëžR˺§ÔƒXÖ==¤F–‚,k¥/ÿµä˜d b@ùüÔÅr}|0R‹ _O ä¶G|²e;8oű~óËgžáa'­>»÷ƒÏp~ÝyqŠ™Ûf%ûóöCÿÎre¹£|¹¨D¹°|²j=/åLU˜ª0UaªÊT•©*SU¦jLÕ˜ª1ÕÉT'SLÕ™ª3UgªÎTƒ©S ¦šL5™j"Õz(Ê‘j=JåHµ&Šr¤Z%ù@ªõ@Q”3UaªµÏÈl­ÉœdH¿nªÏ}ìÎ;ž“¨›_ÏI,—ë'‘“ž'%Öƒó¤ÄvøÍ/ŸyìGía1—/%F|Žó+ Õ{kËo!¾¶£¡:Ê“ä5TG¹±}wžœÒ–ß¶…œ·Ÿ…˜,O”/ß‘Pn,”/ß”P®,w’׿‘(Gªµy$Ê‘jm‰r¤Z›G’| ÕÚ<åLU˜ª0UaªÂT•©*SU¦jLÕ˜ª1ÕÉT'SLu2UgªÎT©S ¦L5™j2Õdª‰Tk/I”#ÕÚM’ä©Ö~’(Gªµ£$Ê‘jí)‰r¦*LU˜ª0UeªÊT•©S5¦jLÕ˜êdª“©N¦êLÕ™ª3Õ`ªÁTƒ©SM¦šL5‘jm6‰r¤ZÛM’¼#ÕÚpåHµ¶œ$ù@ªµé$Ê™ê:­e2°N`ÔþëãPwçíg04Öw¹_Í`l5q^B±üòË›ï÷›çƒï®¯¿½~øø/¿»y¸ýáÃnÆ N£õÖtù]ì?Í󹻡}?Ù2,ÍÙòà¬ýL€²ÜQ^Ì$–O–'É×Õ$7–Ê;R]W;©®«HŽT×Õ$gªÂT…© SU¦ªLU™ª1UcªÆT©N¦:™êdªÎT©:S ¦L5˜j0ÕdªÉT©®‹HŽT×å ïHu]Ar¤º.ù@ªë"’3UaªÂT…©*SU¦ªLU™ª1UcªÆT'SLu2UgªÎT©:S ¦L5˜j2Õdª‰T×Õ$Gªëú’#Õu…É‘êºFä©®«$HÎT…©Öƒ\.$¼ÍËGèë~}dªM óW'øXGh»Y†m»‰zvÄÇ™†íàã2‰§ÃoþÏÝÏ÷®ß}S»C>ŒsµEkêóàóœ_æ`À;ë±sÙí༣/É—/Ê•åŽòeÀ‹raùdy¢|𢜩 SU¦ªLU™ª1UcªVªs] uI¤žÕ†ê uíYjEµ“:ªÕÈ2e"ËD–I,k„KjbYã[PwbY£[RËÛ‚zËÙ’Y ²d)ÈR‘¥"KE–Š, Y²4d9‘åD–Y:²tdéÈÒ‘e Ë@–,Y&²LbYXR˾’šXÖà•ÔIJ†® IJ®¤F–‚,kÔ:ë}åy”vÀWãÖÐX.€ÛÑ€ôxÜ:vû$úéi“ûdyÿvpÞd`=üí¾þêëÿýÏ¿õ²õ–õð™9âàõϧïN[þHe´&~tÞë?¥zëåÂòÉò$y éQn,”×HžäÊr¤ºŽäIŽTב<É™ª0UaªÂT•©*SU¦jLÕ˜jä—@„ÉEy¢¼Æò$7–Ê×-hA®,w”׈žäÂr¦L5™j2ÕDªëÀžäHuÚƒ¼#ÕupOr¤ºïA>ê:À'9S¦*LU˜ª2UeªÊT•©S5¦jLu2ÕÉT'Su¦êLÕ™ª3Õ`ªÁTƒ©&SM¦šHuù“©®c’#ÕuôOr¤ºŽÿA>ê:@r¦*Lµ~ _Æò‡£ôÏŽ¢×7¯k‰|÷~pÞñ$€î¶ôÓvÿ2”÷ó$ÀzpžX¿üý?OÌ“Fßö°ÿçówçå)–‹¹T·ƒóöïÁrcy|Ôó©I®,w”×ó©I.,Ÿ,Gªc Õ1êLU˜ª0UaªÊT•©*SU¦jLÕ˜j=ŸzdÝÓ/ÉëùÔ$W–;ÊëùÔ$–O–'ÊëùÔ$7–3ÕdªÉT©JCªÒª4¤* ©JGªÒ‘ªt¤*©Ê@ª2˜ª0UaªÂT…©*SU¦ªLÕ˜ª1Ucª“©N¦:™êdªÎT©:S ¦L5˜j2ÕdªÉT©jCªÚª6¤ª©jGªÚ‘ª¤ª©ê@ª:˜j ë—QqZ?wvX¼ë§/ŸæèZøxTo»­ûü¤Û’ôüä­ýíà¼$}=üê÷ü‡/ÿáëýò«Ý(´Ügk-ãàSœ_á`°Û¼=­ÎÝw4Ø%y=‰äÂòÉòDy=‰äÆò@y=‰äLU˜ª2UeªÊT•©S5¦j矸;ÁN¶ ng?8ëõŸÌºK;Èk—v’+Ëäë.í$–O–'Êk—v’#Õu—v¤ºîÒNr¦*LU˜ª0UaªÊT•©*S5¦jLµvi]ΣïNû1vc¹°|²Xn,”×c%H®,gªÉT“©&SM¤ZC[”#ÕÚ’¼#ÕÚ¢©ÖÐåHµ†¶(gªÂT…© SU¦ªLU™ª1UcªÆT©N¦:™êdªÎT©:S ¦L5˜j0ÕdªÉT©ÖÐåHµ†¶$ïHµ†¶(Gª5´%ù@ª5´E9S­÷´Û|ºûòÁ_ n][¦K?8oX¼:¡ÞÓŽÝkñ´5ø\ŸÒþô®övðñ1dO‡ÛÐw;¸}ÿÓ»›÷7×íÁpªõX¾´žŸóü*ãªe\ØÚ£¯õh\…òÉòDù2®B¹±-S¯û1®ÞüÓ͇›ûëwç<þx÷ó?>î†Ëõ6ÒÇáòîUÏçï΋“ÔÎâÞâà¼Ý€y¹šE¹²ÜQ¾\Т\X>Yž(_4Pn,Gªµ¼åHµ–¼#ÕZ^€r¤ZË H>j-/@9S¦*LU˜ª2UeªÊT•©S5¦jLu2ÕÉT'Su¦êLÕ™ª3Õ`ªÁTƒ©&SM¦šHµ– ©Öò”#ÕZ^€r¤ZË H>j-/@9S¦*LU˜ª0UeªÊT•©S5¦jLu2ÕÉT'SLÕ™ª3UgªÁTƒ©SM¦šL5™j"ÕZ^€r¤ZË HÞ‘j-/@9R­å(Gªµ¼åLµ¶¥ËÚª™_¨å}Œ =8ïxRDvÓåÓM#½­üáÃãÍý÷×oovÓ µFÚd{|ñþu>y‰Ý‰qÒˆmßüý‰»¶v–+ËåÖX.,Ÿ,O”ÏÁrc9Su¦êLÕ™j0Õ`ªÁTƒ©&SM¦šHµf·PŽTkv‹ä©ÖìÊ‘jÍn‘| ÕšÝB9S¦*LU˜ª2UeªÊT•©S5¦jLu2ÕÉT'Su¦êLÕ™ª3Õ`ªÁTƒ©&SM¦šHµf·PŽTkv åHµf·PŽTkv‹ä©ÖìÊ™ª0UaªÂT…©*SU¦ªLÕ˜ª1Ucª“©N¦:™êdªÎT©:S ¦L5˜j2ÕdªÉT©ÖìÊ‘jÍn‘¼#ÕšÝB9R­Ù-”#ÕšÝB9S]FQ7ÁÌš¥ÓF5½%Ú[[¾‡œ¸ŸÞʹ®²<˜ÞÚVý,W×ýêÍo¯ß½;=n{¤<ý«ó/ß¾»½ùðøpþÀ÷÷wïÏGÏ7ÙlGO·Ùì®*ãÔc¶¦S¾°óé» À~Ë7ÄLëçí¯•åŽòÚ äÂòÉò$ùºAÉåòŽT× úHŽT× úHŽT× úHÎT…© S¦ªLU™ª2UcªÆT©SLu2ÕÉT©:Su¦L5˜j0Õ`ªÉT“©&R]7è#9R]7èyGªë}$Gªë} HuÝ äLU˜j­Ä|~H¸(ÓuI¦œr|:w{óÕuèöFk=çêÍïnïoÞ>¾ûËù#×ïþôÉÑÝù×÷7ß÷íw¯¯†ê~\®/mØÁ'<Ÿ½{3 Ÿ,Ú–îÏÛ¿w ,w”×C°H.,Ÿ,O”×C°Hn,”S5¦jLu2ÕÉT'SLÕ™ª3UgªÁTƒ©SM¦šL5™j"Õõ!X$GªëC°@Þ‘êú,’#Õõ!X$GªëC°HÎT…© S¦ªLU™ª2UcªÆT©SLu2ÕÉT©:Su¦L5˜j0Õ`ªÉT“©&R]‚Er¤º> ä©®Á"9R]‚òTׇ`‘œ©Ê'Ï*#¢õîbÛ&ïûó–«ÙW'ÔBZ?اK¶»‹­>Ç×·?=œžò¼<Þß¾ýÓnyíò=õü>ÉîÕÏg¿>¯Œ4û’j?8ïõŸQ¯#‘|²Ù±Þòò4ó;où ^PïÅÇÁ>prÞ n\½ùãõO«oÇw??þôóãn/§µtÀõàEÏgŒü{›­èçüQ.,Ÿ,O’×ÈåÆò@ù2òG¹²©ÖÈåHµFþ(gªÂT…© SU¦ªLU™ª1UcªVª–áfå‰ò9Xn,”{g¹²ÜQåÂr¦L5™j2ÕDª5òG9R­‘?É;R­‘?Ê‘jüI>jüQÎT…© S¦ªLU™ª2UeªÆT©SLu2ÕÉT©:Su¦êL5˜j0Õ`ªÉT“©&R­‘?Ê‘jüQŽTkär¤Z#’¤Z#”3UaªëfgVDd½Žü»·¦’çíGþõ,µÜÝ4ÚÖQ=ŸöêÍ×Û½ŸÛÁoîß¶Û?ÏÇïï¾ûùÝÍëÁq=­²n=˜:>×ùì×çÕ6Ãc>í'¿;o7¯m†Iî(¯m†I.,Ÿ,O”×6Ã$7–Ê“©&SM¤:R ©Ž†TGCª£#ÕÑ‘jÝ5CòTëf”3UaªÂT…© SU¦ªLU™ª1UcªµÍðX~"†û%ym3Lraùdy¢¼¶&¹±ò(Gªµ<É;R­}äQŽTky”#ÕÚGåLµnйN@‘yuùö4u0µt85v{À´çÍ;ýWo~ûîúááæáü§ý]¶ƒÇonïχßÿüámÍT½Þñe»ý%ZëÞ>åùvç-¿£ÚX¾[œ·Av–+ËåõÉ…å“å‰òzäÆr¦ªLU™ª2UcªÆTë ´°Œ)rQž(¯7ÐHn,”×h$W–;Êë 4’ Ë™j0ÕdªÉT©Ö}0(Gªu É;R­û`PŽTë>’¤Z÷Á œ© S¦*LU™ª2UeªÊT©S5¦:™êdª“©:Su¦êLÕ™j0Õ`ªÁT“©&SM¤Z÷Á ©Ö}0(Gªu Ê‘jÝCòTë>”3Uaªë^¥ÏÃÒËë^¥#[_®žÆ©»álÎåœÝFíãSÑ–¿ÕËgùòæûßýæ·ë]/ÿ÷_Þ>|wýx½é-ÃUY†«Móà%ϯµ;/N*OÏAÛŸ·”u–+ËåõèS’ Ë'ËåõèS’Ë™ª1UcªÆT'SLu2ÕÉT©:Su¦L5˜j0ÕdªÉT“©&R­÷(Gªµâžä©ÖŠ{”#ÕZqr¤Z+îQÎT…© S¦ªLU™ª2UcªÆT©SLu2ÕÉT©:Su¦L5˜j0Õ`ªÉT“©&R­÷(Gªµâžä©ÖŠ{”#ÕZqOòTkÅ=Ê™ª0Õ!zo]êÏ·Ö⌌hGç-³DÝí§ÐÎ+\þÝ«âW·ïzwóîöáõ‰µžtNoÍÕ^õür»óâ”Ëø&-ýà¼ýH¨³\Yî(ׯraùdy¢ÜË奺|3ëC.Égg¹²ÜQîåÂòÉòDy –Ë™j2Õdª‰Tka)Ê‘j-,E9R­…¥(Gªµ°”ä©ÖÂR”3UaªÂT…© SU¦ªLU™ª1UcªÆT'SLu2ÕÉT©:Su¦L5˜j0ÕdªÉT“©&R­…¥(Gªµ°”ä©ÖÂR”#ÕZXŠr¤Z KQÎTkœ5êf)2f©ÖÇ©ûÔá8Ë6¤O \®ñôÕ8ë÷nx¿nž†jkõ>ãîϯ´;-O&ž©çí.¬êÁŽ$7–Ê—ñÊ•åŽòºÃœäÂòÉr¦jLÕ˜ª1ÕÉT'SLÕ™ª3UgªÎTƒ©S ¦šL5™j"Õï¡©ÖxåHµÆ{(Gª5Þ#ù@ª5ÞC9S¦*LU˜ª0UeªÊT•©S5¦jLu2ÕÉT'SLÕ™ª3UgªÁTƒ©SM¦šL5™j"Õï¡©Öxä©ÖxåHµÆ{(Gª5ÞC9S­ÑÁ\Æm³åŸ@mo¬µ\†–G¯ãß<ØÊjœtÛ…|¼îmÿ|}ų\5ÌÞ–ÿ›ýàõž_h7Ú«©ŠeP;fœµ»¬Z'‹A(_'‹A®,w”¯“Å –O–'Ê•©*SU¦jLÕ˜ª1ÕÉT'SLu2UgªÎT©S ¦L5™j2Õdª‰T¥!UiHUR•ŽT¥#UéHUR•Te ULU˜ª0UaªÊT•©*S5¦jLÕ˜ª1ÕÉT'SLÕ™ª3UgªÁTƒ©S ¦šL5™j"ÕZÒ‰r¤ZK:IÞ‘j-éD9R­%$Hµ–t¢œ©ÖXréÃÛÑ`ï3ƒ³IfOÖýq7’Ô%‹Ý­~Ûý{º¼þ¿?<=¾º·ÇZÕ/¿½~û§›mgš:ü‡?þáct÷ü«u)çû§§]Õ>Üüùù—Ûs°Ÿ¾¿»ý¸ÛÅfùk3MŸÞ>Ý}•Ï'ïΊ“¹µ¾Œ ÎÚ_ît–+ËåËß” Ë'Ëåõ¶.ÉåLU˜ª0UaªÊT•©*SU¦jLÕ˜ª1ÕÉT'SLÕ™ª3UgªÎTƒ©S ¦šL5™j"ÕÚAåHµvP@9R­PŽTk’¤Z;( œ© S­K×µÚòóò ºöê]Z›µ÷Øþ¢ÊýÕ µ`îî¢éO»',+æÇ'‰nŸ\tmX.»^½f=£sˆ<íü·{õó©¯Ï[¾›MÍÖF½u±;ïõŸP=¬å“å‰òå»Êåòúã%¹²ÜI^ëD9R­‡u¢©ÖûL(Gªõ>ÉR­÷™PÎT…© S¦*LU™ª2UeªÆT©Z©FÆŒ£oô»|6– Ë'Ëå>Xn,”Gg¹²œ©&SM¦šL5‘j½Ï„r¤Zï3‘¼#ÕzŸ åHµÞgB9R­÷™PÎT…© S¦ªLU™ª2UcªÆT©SLu2ÕÉT©:Su¦L5˜j0Õ`ªÉT“©&R­÷™PŽTë}&’w¤Zï3¡©ÖûL$HµÞgB9S¦ZëŒÈ4™d~¡ž•ЛµÞ2f=Ž&G¬ín}ëO;‡Ô6LWoþÛÝŸÏÛûNÛ¯o?<ÜÜ?ž¯Ï¿|zj;ødBåùÄO_f]B¹»2ÖÓ˜ËoD—/jÿžOÞW£}Ú]sÞþš·±\X>Yž(¯ýyIn,”×þ¼$W–#ÕºiåHµnB9R­›†PŽTë¦!’¤Z7 ¡œ© S¦*LU˜ª2UeªÊT©S5¦:™êdª“©N¦êLÕ™ª3Õ`ªÁTƒ©&SM¦šL5‘jÝ4„r¤Z7 ‘¼#ÕºiåHµnB9R­›†PÎTëéâ­Ù<ºäýìe½Ý¨õIZÆÑ¥òîŠZ—¬ïî-zºžn§üøfãv°^üž¿ú§ùç¿û_ÿòÏçÜ~xZÁµ>=§l;8/ïÚŽ?³À«¾«-#¹¶ü:øÚΧL7‹m÷-íO;šm&uº¾·ZQí¤®ol TOT'¨k’™ÔIJ¦˜A݉eM0“šXÖô2©‰eM.“Y ²d)ÈR‘¥"KE–†, Y²4d9‘åD–Y:²tdéÈ2e Ë@–,Y&²LbYsȤ&–5ƒ êN,kþ˜ÔIJfA=ˆeÍ“Y.®#Fë#•\½Õ…ërµ’aýèÓ,`SÁcw+ÃóS†ê{àùÒu=x¾L]Η©ëáv%úâø|ðíí·ïnï~¸¿þéÇÛ›ýÕêòûµÙzÏyð_åhæ·çòÇ:ôà¼Ã™_’ Ë'Ëå5óKrcy ¼f~I®,GªëÌ/É‘ê:óKr¤ºÎü’©®3¿ Huù%9S¦*LU˜ª0UeªÊT•©S5¦jLu2ÕÉT'SLÕ™ª3UgªÁTƒ©SM¦šL5™j"Õuæ—äHuùyGªëÌ/É‘ê:óKr¤ºÎü’œ©®3¿Kv”ö‚². —a×¶dãàÊøðZw÷£Yž(_¿[‚ÜX(_¿[‚\YŽT×§ë‘©®O×#9R]Ÿ®Gr¤º>]ä©®O×#9S¦*LU˜ª0UeªÊT•©S5¦jLu2ÕÉT'SLÕ™ª3UgªÁTƒ©SM¦šL5™j"Õõéz$GªëÓõ@Þ‘êút=’#Õõéz$GªëÓõHÎTë}²\òe|A.(×É€±\©¶[þ+ÿÌY¯ÿ(zm=FòÉòDym=Frcy ¼¶#¹²ÜQL5˜j0Õ`ªÉT“©&R ©Ž†TGCª£#ÕÑ‘êèHut¤:R©ŽÁT…© S¦ªLU™ª2UeªÆT©Zm(מv<ûõ|v–+Ëåë¶ö –O–'Ê×míAn,gªÉT“©&R]WQ“©®«¨IŽT×UÔ$Gªë*j¤º®¢&9S¦*LU˜ª0UeªÊT•©S5¦jLu2ÕÉT'SLÕ™ª3UgªÁTƒ©SM¦šL5™j"Õu5ɑ꺊ä©®«¨IŽT×UÔ$Gªë*j’3Õetàs¹2h æ]j[âåê9³OúÍ Í¶[j-O·Ò-W=ýêÍo®¶›ß¶ÃŸîo?¼½ýi\¯‰s] ê¯z~…ÝyrÊXþ«“ƒóö3(“å‰òzÄ<ÉåòzÄ<É•åŽòzÄ<É™j2ÕDª£!ÕÑêhHut¤::R©ŽTÇ@ªc Õ1˜ª0UaªÂT•©*SU¦jLÕ˜j=b>–ŸeáyQž(¯GÌ“ÜX(¯GÌ“\Yî(¯GÌ“\XÎTƒ©&SM¦šHµ’r¤ZÉ&yGªõl”#ÕzH6ÉR­‡d£œ© S¦*LU™ª2UeªÊT©S5¦:™êdª“©:Su¦êLÕ™j0Õ`ªÁT“©&SM¤ZkÙQŽTk-;Ê‘j­eG9R­µì$HµÖ²£œ© S­ —^ûIf/Ö'A™f†ÇÑ\ÊnÊ%——ï»{xjÊe[S‘®ÞüËÍÃÃõ7çl7¨ï†ÁËø¨šÂ^õ|öî¼ÚQËs}"øþ¼ýh;H^ËP®,w”ׯ¸$–O–'Êk7’#ÕZÞ@raªÂT…©*SU¦ªLU™ª1UcªÆT'SLu2UgªÎT©:S ¦L5˜j2Õdª‰T·½‚AŽT·½‚AŽT·½‚AŽT·½‚/ÏRÝö 9S¦*LU˜ª0UeªÊT•©S5¦jLu2ÕÉT'SLÕ™ª3UgªÁTƒ©SM¦šL5™j"Õm¯`#Õm¯àËóŽT·½‚AŽT·½‚AŽT·½‚AÎTkñó\Æ•.dÜZƒíf-SÃFчƒí±»¿¼ÛO+üWoþñöþáñ|øð¸Œ¼_×g»Õ«4=xÉóɯÏ[¾)Å2ZiÖåà¼ÝH{ù¦„ò@ùòM åÊrGùòM åÂòÉò$y­'@9R­õ$ïHµÖ ©Öz”#ÕZO€r¦*LU˜ª0UeªÊT•©S5¦jLÕ˜êdª“©N¦êLÕ™ª3Õ`ªÁTƒ©SM¦šL5‘j­'@9R­õ$ïHµÖ ©Öz’¤Zë PÎT…© S¦ªLU™ª2UeªÆT©SLu2ÕÉT©:Su¦êL5˜j0Õ`ªÉT“©&R­õ(GªµžåHµÖ ©Öz’¤Zë PÎT…©Öz‚Ú5ß[ ƒõŽzKùOúhî"úÁ‡ì÷¼~ídsõæ«›·wÛí·ãÃ9ŽzðlÛS÷¯y>ywžœž?róÓýÍÃ’}Ü8ûøÝ÷ç_?=&d;Øí¿¿}ø3í×O^7#7ƒ¯ø|þî¼zAËLŸçíL–'Êë&f’Ëåu3É•åŽòº‰™äL5˜j0ÕdªÉT©jCªÚª6¤ª©jGªÚ‘ªv¤ª©ê@ª:˜êòã õl}¨‘ï~õHŸKÚG?ú>r0m<vþù¸/ôÿßʸÝK^¸2nwÞnæõÅʸ ò@ù‹•qäÊrGù‹•qäÂòÉò$ùË•qäHõåʸ_Ï;R}¹2î‚©¾\wAŽT_®Œ» gªÂT…© SU¦ªLU™ª1UcªÆT©N¦:™êdªÎT©:S ¦L5˜j0ÕdªÉT©¾\wAŽT_®Œûõ¼#Õ—+ã.È‘êË•q¿ž¤úreÜ9S¦*LU˜ª2UeªÊT•©S5¦jLu2ÕÉT'Su¦êLÕ™ª3Õ`ªÁTƒ©&SM¦šHõåʸ r¤úreÜ9R}¹2î‚©¾\÷ëù@ª/WÆ]3Uaª/VÆ]>aðreÜ~îâpŠÃvÚù¸½ñÿçʸÝk^¸2nwÞ~ž`²êË•qäLU˜ª0UaªÂT•©*SU¦jLÕ˜ª1ÕÉT'SLu2UgªÎT©S ¦L5™j2Õdª‰T_®Œ» Gª/WÆýzÞ‘êË•qäHõåʸ r¤úreÜ9S}±2îòA÷Ë•qû €Ðƒy‚8Ø$èym\]W]½ùêñúñç‡óñûm‡ÞÝS–Q¶Ö¥¸õqð²çó†Û£5©}„wç ·A^Ãm”+Ëåõ> É…å“å‰òz†äHµ†Û$¦*LU˜ª2UeªÊT•©S5¦ZïÃÄò76êñ:¿ž×û0$W–;Êë}’ Ë'Ëåõ> ÉåL5™j2ÕDª5ÜF9R­á6Ê‘j ·QŽTk¸MòTk¸r¦*LU˜ª0UaªÊT•©*S5¦jLÕ˜êdª“©N¦:™ª3UgªÎTƒ©S ¦šL5™j2ÕDª5ÜF9R­á6É;R­á6Ê‘j ·QŽTk¸r¦ºnÉÛ–‹Úy4þìÀuÝ“Wg¦7?8oùq½ðû¯¿ø·åÿ½ás endstream endobj 3298 0 obj [ 3297 0 R 3299 0 R 3300 0 R 3301 0 R 3302 0 R 3303 0 R 3304 0 R 3305 0 R 3306 0 R 3307 0 R 3308 0 R 3309 0 R 3310 0 R 3311 0 R 3312 0 R 3313 0 R 3314 0 R 3315 0 R 3316 0 R 3317 0 R 3318 0 R 3319 0 R 3320 0 R 3321 0 R 3322 0 R 3323 0 R 3324 0 R 3325 0 R 3326 0 R 3327 0 R 3328 0 R 3329 0 R 3330 0 R 3331 0 R 3332 0 R 3333 0 R 3334 0 R 3335 0 R 3336 0 R 3337 0 R 3338 0 R 3339 0 R 3340 0 R 3341 0 R 3342 0 R 3343 0 R 3344 0 R 3345 0 R 3347 0 R 3348 0 R 3350 0 R 3351 0 R 3353 0 R 3354 0 R 3356 0 R 3357 0 R 3359 0 R 3360 0 R 3362 0 R 3363 0 R 3364 0 R 3365 0 R 3367 0 R 3368 0 R 3370 0 R 3371 0 R 3373 0 R 3374 0 R 3376 0 R 3377 0 R 3379 0 R 3380 0 R 3382 0 R 3383 0 R 3385 0 R 3386 0 R 3388 0 R 3389 0 R 3391 0 R 3392 0 R 3394 0 R 3395 0 R 3397 0 R 3398 0 R 3400 0 R 3401 0 R 3403 0 R 3404 0 R 3406 0 R 3407 0 R 3409 0 R 3410 0 R 3412 0 R 3413 0 R 3415 0 R 3416 0 R 3418 0 R 3419 0 R 3421 0 R 3422 0 R 3424 0 R 3425 0 R 3427 0 R 3428 0 R 3430 0 R 3431 0 R 3433 0 R 3434 0 R 3436 0 R 3437 0 R ] endobj 3296 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 3298 0 R /Contents 3438 0 R >> endobj 3439 0 obj 15304 endobj 3408 0 obj << /Type /Action /S /GoTo /D [3440 0 R /XYZ 72.0 769.889 null] >> endobj 3411 0 obj << /Type /Action /S /GoTo /D [3440 0 R /XYZ 72.0 584.708 null] >> endobj 3414 0 obj << /Type /Action /S /GoTo /D [3440 0 R /XYZ 72.0 495.383 null] >> endobj 3417 0 obj << /Type /Action /S /GoTo /D [3440 0 R /XYZ 72.0 349.837 null] >> endobj 3441 0 obj << /Type /Annot /Subtype /Link /Rect [ 295.77 209.938 361.6 218.938 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3435 0 R /H /I >> endobj 3443 0 obj << /Length 3444 0 R /Filter /FlateDecode >> stream xœÍË’Û6ò>_ÁÊÅã*›æ›ÔÞ'»5›r%^O*‡L IØ¡H$­Q¾~èÆƒÇS{sR©énF¿›Ê—›8ˆàß·êO•ÅaUm‚úxó…èqP&AZ)Â,É£( â,LòàÌIyЪ3þÌö~þ¸én¢à_7þ{š ‚sç›èæšÕç›Ožl´àïI>_Â4ŠÂêûðÓÜÀeY†ÑÒðšMŠ4  Gµ4d‰â-3 ¾ÿ>+rt%q´®QcóïF¸(ØßüxóîŸ SÜï\DeXÆñfSn6°VÉFý“÷ÇàÏÛ¤Š^ÿÜÿûæçû5ùnžwí,‰’K*6QTIïOƒ$ƒü¡^9SC$q˜TeEEÿp`§‘Ë IÃàþÀƒÿðÝO?u+x7¾¸üÊ%*Çc’ÇaœåJƒ12©ûãqêDÍFÑwÁIöc_÷-žSFY±HVe&EF‰7Èæþ †àuð¶þÁmM’YBÇZŠ-÷öŒ ±;0“Â’8þ)6>ßïXj=x²®qªÇáÓàq{fí£¿²Ð(袪ºà¬>¨#In‚Û„”¡ÃéúsË›=÷¶ì<’"ó€„ÞMÞÚ®—³£{ÉŽG.½çCï!¬½‹ý)FO¾zÆþèp­ékEÄtsM ðõ”Û{´"³×i ½NÃ`Ÿ¼7Þrçà^6h@DI| ³¶íÏõ<Ö;'z°Ωãû~lô„>¸²¨·ÿÀ/Þe¬[ÑLœ,4vÛ‰6Ю¢=äÕð§¯GF´U‰Ÿ&hiúz:³€ISAâÕ*‹@m›eÑ"ˆÓ"„ÿ6›4£Ø¿'sà:í¼ ó¬ç6ʵ"€¾ñâ Qõ¿ þŒðU4òHaüËÖah!‡ûfj½«ÐîĤi„ÉHAƒìKøayƒ'Ëp§úÎb<,,§tPl:Àâ4Lœ ;±ú‘íÝ*(à„¡øO“[Ó2è1ÄñÔŠZŒKÒÉáz')‘–uû ®~ãmÕ¡„ˆU'¢Þ ³Ð¾ï›•çWñâù’ý$k¨dãç•ZtF§©WpíFï`Aíæöˆèö{M½rˆµPÂ(,¡k^VAUÁ@¢"+©HÃ8 ~“\ò/“ s /•¯$…›B¬òŒj©MqY 2øþ‚L­þ¢Ã[±•L îm‡4à-w°U ú½Í¬»8Ä×–»ŽÔæ(¦*®Ü]Kéë:%%Y±PŽÎRµ3·¿wâÉaC_?òÑáußuéƒHÃ$cÛB‹8å^³Ø5ï$¯¹øêÙ^ƃ/ïjT®¹@öÓþðÜZÜÐÞÏŽ®é"¯º%놗­ç! ™E˜ä漪DÛ^,íÔ24ªÆFþ4¾qØÁ;Û5‚:‡Á’°¸Ú -Òi¢¦ EpGμm×èþy.';Ö®<T3¾ä'ˆsxöc ‘~üx9ñ+Ô&&GQO-[é@iH€[þ²ÂÿáªwÏŠ:è,±ž„Ál5Ü%ºZ@ ½ä)4ÒqGqTÚgíš-†]ƒu/âR™·9Rߣ‰HM@' %" )“.—}MG™‰ÑC1–èÖºæ'﬋=ïÀNRêÂãk.žªâ?S†×›e©êmïvdúÊZÑXlùHRI—£ÅµNlø›yóÆRж‰Q¥SO˜{o§Õ ÑöVy®ÈùfE ©¹6´ØjªQ/bÍÅbÚfa8õ:}]-í&IM¡Ùªµ¢„|ÂõA´Ž ¹wŒþ^SkfŒ-Î|y¸„„lï8A³ÚY¤f:\QFnSÅ›ªÊÓY›§e˜¬ÌfDßòñ̹Oççl•$¥þÕÍ®LcÓœôÙ´œ 3¶>Ósÿv©6ôz¤»ç¥Þ 9Œ+Jª¢…’ô5:©§1…CtØ`GÌê+[šw&j‚68·æ¹kýŠ¡Ñà[Ü,´Æ™ ÃF®Íl’…f ZËËÉxKZ9sÜ =S5¡£Ýy{ÍÅ:FÝ“Tˆ;µ_oV®ÊüÝØ‚¯‹ÁŸx=QºGÊìèŒ1„þÔŽÞaªÿFÆnÅe²([(f vf6É—ö"¢/„½w+N mûÝ=»¾bà0=k ]±d®l”Æ!Ý­ï\j®2ª5· :{Ð ÞøŒ•‡ÇÅâᦂî@îá;ö“ꮩ±ðšƒÜ| Ó3,DdÁð±è2HíQ®¾b•…×!Àð¥VÃÉ‘/uY‘‡È&'>ï±*©Ý{cÓ`—Ö‡ÊY†+óÙUf!Ӟͩ¦iµÙïížwÊJè’¥s;+y]I>wÍÓ¶%u¡AþXi ²²\¼ÿÀ ×lÄ0B‡ãÔ!0yºnΩÃùiY÷uÚt³+6eXV0®å]ñšÊi°Çü¹36ëÇT¢ÎÔ\ãû'RLK®‘©³Õ°qTý„·f¾@Úl¾@Òù ð ¢°Ú7Üçâ!^•ËÜœhXÛ¢†¸~ò«ç&ñâ¹÷øQ)ÍCáŸÔ¸¤¥A|öLÚNªyc)Ûit|Î8*"ÌÚ¡wÈéÄ™ôÖTï`QLL†Ÿr {ÓÛ:&Ý óD~Z¦K¥ƒ4]è`1…@Gc%.©÷Ó°5í’t&¢h‹ÿîÃUŽÆ3,áÈE?XìÁdD…Ö·á‚:!L±_½ºáýçww+ªÈò…*ꓬ¦é/)Â,¸…ರÕM%H%?E¤{1:ôÕß\ö¯^{xף툀_þõ;ýá½[ÌŽ@Ÿ¶¯ål<#>Ï3mäËe® ¶úÁòñpèÏL3Ì9%P#JõóI–”+<)¿|\#©6!L¤QTÄ+gÃo¦À¼¬Â(J¢ê"·‹ÙÒà&ZýØëÖ0N¬r¤Oƒ¦´`J¯!¸¶q7ˆb„° D'œQˆ¯ŸwdÞZ }ñÄýª°Ãt:õr%Q²x;ùR¬sÔEa9’æ1¢I§Ïþqè-Z¥qÔØÏ£Ôµ>ËRx !`Â<ÞÀ¹õîzõð½ú&WæqÝ*Ó+*‚²2W¾J.UÛŽ‰af!/±!©Äo“´ôœƒj’ñóÒÌcèÊ÷ˆ=̪éïédAô)Y¾Ìë ±­ëiùó¦R d“¹JPµ)ŽÚLŽ£‘LÃ3BÒï0óRÝOil'» ¯CG¾óX ï²­™âÜÇD÷¸.‡™:P(¯ÇAŠÿ˜-¸«¼8m?x’½_ÑOºLFöÇ=ýc¹—4zÐ7"Œ6CÐD¿¥à,„=¹¯OÜ—_4 =ŒkR†íå#cF¢[^’lÀ–æú2•Wô‘/3¬n¬õ¤뉖RýÞ¡P›( {oÿv(Ê(„ê%If²¸Q˜žÉ×b' “¶¼Û›_¡–µ ¨’=3gûÁNC;~¶pÍì¥Îcã~wç‡ÇauŸë6ö—qéç½¶ÓnçÁ~m±§ærÄQ…îs')šá³ÐÃm›¶¨ó±½¬s“-Td«‚ÈmÑ ô…ôÝMÇ-,‚„:Ñè]a„¶þ«úW’½ÿÙäÓÍÿ*—P’ endstream endobj 3442 0 obj [ 3441 0 R ] endobj 3440 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 3442 0 R /Contents 3443 0 R >> endobj 3444 0 obj 2817 endobj 3446 0 obj << /Length 3447 0 R /Filter /FlateDecode >> stream xœÍ–MÛ6†ïú<¶‡2~ó4 Û¶r‚B‘é]¡–襥¤ù÷­-É¢MW¹í Iôëyæ‹#>@~þ.VµÖ‘ª)žÏë@ 'BŸ—£’+Æá’rE²\Rd¿¹¼áã^Z|~"ŸŠ¶`äCñù j¶„áï¾,cüÅÔßÅÃ…ogÞ¿&ÿy,ÞnŠ7ïF6»9Å\S¦´sޱTp7üq²iÈçß6Ožüåw¾%Õ¾öm÷æèã7ÿB6ÀÆ7„³ÄDš¦oëªìêÐ’C ]¨ÂþdáÝf‘9Áµ¯-q ±ñŒ1”¥ ‰ÿ’ŠÓ®œ,_-IO”ÅÊ)‚Ó5ë2»ò˜]:|Ý‹¯Æ¹|jC €sÆ9üŠÚE ÷:æÕ„wÝ,|ð‹Qý²sÁK{µõ8;‡<¤lÎ’¾ÞaMY·d[vå×òèI}$]$ì·$DR…ûCw¶4»qI–œ²!PbDËÛh%ezä´¡#áà[ýÎGßV~rç.Ø(j8Ž àSÌê6ØšD9ƒ«Ð¶¾ê0è9—S*Ãæ¨Ä"26'\߆‡DºÌ8¢ŽÃlÃÌûÃ!ÄÎoïó¥ h“iù&ÃW*‘^D}ÙyLü±ßwdC3ûõÜûøã¾FSË$v’¶£6ㄵ‰tv"ú.Öþ›¿QÒø®îúÁaØ]g\¦í957Âÿ¥¾ãRRpXP#ÆÚËP•N¤+à+ƒÆ÷ˆuØÓR±d¼°.‘žÙÝ?ŠìÊzÿ?ý&¨²X?´1Òømšà"‘N4ŒuûuN*Êq”;kÆÎ‚Ì<Ê$Ò Wöݱ513K*›H'&6®_E³ …X£¦~ÉÌ'éx"h=Nâ54‚…E‘vj—Ì R\%Ò‰ößú~QÒP©^^(SÃdR.‘ÎÀ_heÚÁi2–g†Žr"‘ÎĵÕx&²äÚŽõã™é¢ñü¾”θµí¢¥¥JHgÈ—/Z³Dz5R_‚|Œ¡?܇ZN9…ð½dFhfÈh'é }ŒeÛ˜¸#›ú8¼Íç͇â'<È_F endstream endobj 3445 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 3446 0 R >> endobj 3447 0 obj 880 endobj 3449 0 obj << /Length 3450 0 R /Filter /FlateDecode >> stream xœÍWËŽÛ8¼ë+xLËðý¸y{›]99(2=FQšÙùûmI–mѦbä46 ÉT¹«›],Ò¿2мÿ.FPlŒEEý:ŽS¤âê8$ L˜IT£åDüæò†ÍwpY`áû}ËšŒ ¯Ù÷€Ù"¿{ÉH"øêßìá"·#îßR~=f7Ù‡/Q‚6»ó3…‰TÖZF‘ÁœÙáÅЦFßßmöýãvŸ>¢¢*]Ó}®}víûhó÷"5šÂ4b$ Qøºî›²È»Ò7èÐúξš"|Þ,fŽ‚Í[›¸‡EŠ <­5&± á#0ŸÆ`dŠ8u›Ëè9ÇG[ïÂXžû¯ Ý*% è!çùÔ·ù(£ô§{,Ôµyòb´­]^V¿™L*8¦¢EgF“`”2‚y3ÔUùâ A±• ë\ZaC(@™™Ë&¸Œ‰ S-¨ó¨uµvèɽ¾øv½:FýOTœ$„ÉØŒ¹âÈûnïÛu !0µÐÍç–qš`’*‚^\[ú-l;Õ:)˜¹± 6¡N屩±ôLÚ@¤Õ9è¦u;׺¦pãÂXeç”bi 9sfç·Ù9ã´l`3îÊæ1b¼G¬\HÌÀi­Ñ³€xÂn¸Ô4¸ÊÝ]4Ú`«åÅ’à ƒá–,‘§EúÑÞv}U½¢¢uùo]2¬à4B¹˜m'¬FÀF¿„æ!ôµb^í}“ h¸®3 …¹‚ÞvbL˜&‚>‚Ít¨‡^š­ËÀpÂEÙëÔ†Àé º£åIA ×–EÐÖ=û'÷ÇÜ’r¬%ôL˜“ˆ.$™Œ …ï«íhæ‰,Ö©…ÆBŽ{Ĭ,‘p%)m /eWì§…{×Þ% Åb€åÌý g’–GгI÷éнVwxƒ‚Cp¦Vfî¬H8“‚ø:­Ô¹Žyû:m*÷,Y% –\X G®™6aIJ‘ºgøCZÃ0ìa¶*=Ó& IYAËþdFê[æ;ž²ÿëJ endstream endobj 3448 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 3449 0 R >> endobj 3450 0 obj 917 endobj 3452 0 obj << /Length 3453 0 R /Filter /FlateDecode >> stream xœÍ–É’Ó:†÷~ -/ „¦£aK1T±knªXPÔ-ã(´ÁC°.¼=DZØräîÞuºÒv”?útýÖÏ„†/û‹UœZëHV&?ÇqNŒ RCÀ¨À˜$BQ¤$Ë! þf~#¦;¼,´øùž|Jª„‘÷Éç/¨Ù†¿û?a‘ÉÏSý›ÜÍÖ6 ðþ9­‘oÉë]òêÎÈîpM±Ð”vÎ N,•Âõ/Av%ùüÏîÞ“þðæ5ÉŠÜWÝ«Ö7¿|óâ Ù}XÌÀ­aŒ C ¦Èê²Ñ]„HWô÷5mý6Òhj™ÂæÐvD‹ ­ ¤Y}*ö}'dŸ_ò­©OÇM¨àýîi<Ò¶BLš)Òž²Ì·íáTFä~¤åkdäTNè@zôM[WiAòªÃ ¶)rü—·Ä—ÇîÏ6Mß:lE¥/Êغ@:¯d—f÷çJ¶¾#‡¦.îaÉ9‹uÂ'¶ºÍ–BRLñ,Ã=WòD¾*Ж5—–Šx“H¯±§Ý"vy˜l,ufÛ"%[*çqäYÜa+.¨ÆC —j²Gˆø”ÂóÂRš5>ÅíÓý×›0r°MSšJ…câB‹ø”H/´ßÆY†‡>¬“KKEŒI9H×.üࣸ¤°<ÊN-¤#®é•w:îû@¿×§¦ßÇUZúv›« Up~‚L¤#þàé•;&8Ë»áûÃo»XN9N†þ3USGl œ ¤+ìÅ·z»Úäj<Y…çpm§²êˆKi<´/¥ 3Ðû§°•¥ •3’«‰q)­Y ]=ëžÀµ‚ <á“ÌL܈;i§é­Ð-öùØy—ü2a´ endstream endobj 3451 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 3452 0 R >> endobj 3453 0 obj 884 endobj 3455 0 obj << /Length 3456 0 R /Filter /FlateDecode >> stream xœÍVÉŽÛF½ó+ê˜Òî}¹Žä6‰€ àÉÖ a²)s™ñü}Š’¨[jj| ÉÖc½Z^W׌ÅïÓÅJF¬uP4Ùã:ÃAèã’¢DrE©. WÐÀrIAïœßðù/ ,>?ÀYÈ(|Ê>AL ß{ÊhÂøÞÔ¿ÙÝ™oGÞ¿%ÿ(Ügï7Ù» …Íö%Å\ª´sŽ3°Dp7}8løüÛæÁÃ?~ûá=uåÃð®÷Ý£ï~ÿ›¿˜5”Rn€ÓÈDÑ6ͪ"ª6À®k‡¶h냅?7‹Ì J‰}k‰»[¸ˆÂ3Æ ’ˆÃ®,N-‰,‹•C‡kÒezá1=wøR‹oƹ´ µ!†1çŒsø±  ¦×óf» Ÿü¢Dï—ºTðÒ^l=®!O){É’¾Üa;ßõmÈk¨«~€ÐÐ>_·g(Æ®Ãm c?oÚ3WÎÙ%'tІ)1Ó›ëôJFÈ%}Ùú~ïƒÿ‰«œFñk0~ Ù^ç´&BÏÃ×Á7»¯?ËqÛ¼ª}¹JȨ# GéK’ÝuFÆYí‡çÚï#Û¶c¸A$a _¦šLi‚H©úØV7¬M,•Xmgë,aÝÚÚT}_…{È»û±Ai¬2q6©þHÁrä|ÆŒá{@éA;»qÊS×ä7¤$Ìaš8¦Y¦ŕޠ7űS[‡²‘ZÍÖ‰âÖEÐÐBÓvÊ|È!Duåßj¿Ê'#Êb¶ÑÊÌ—Èšà"‚n«Põ¸m‡.ýÖwÝT¦‰}S*±g:kìÌ)œÊDÐâKyY"m?…ïûíX×ÏëŒÆgÔ‹`%• BG—ÈtŒ½_Šdœh1˜bfU×Y%žÞKè‰#}5¡ÔDh,å'ÂDC–ÊFТãÎw¿žKi)_X£NŠIô]éxíüû:&³…‡²§®ü«bSL£°.Òž4“輊«z$øUÕ(iˆTû~’M¢÷*å"hÀVÕáYCUBup_®ï|eahÆ\=–è+ʉº` mØŸd·Z¥ÆÄbóÂF;W’%zÆyy =×Ëë¥%JHg“3c¢ÛhM#è_ %,ˆGÃ:©å„ãô‡Š™IíF;AgéŒ;¼»*žýxw—ýCk,) endstream endobj 3454 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 3455 0 R >> endobj 3456 0 obj 899 endobj 3458 0 obj << /Length 3459 0 R /Filter /FlateDecode >> stream xœÍ—KsÛ6Çïü{lEð~\3I;íÍ­fzÈäÀ’…  Ûu?}—¢h‰A;7Ûã!ý¹¿]ìƒð÷‚Åß_¦‹•ŒXë j‹ï§u†ƒÐ§%E‰äŠR\® …õ’‚Ÿ¹¼áË^VZü|€¿‹® ð[ñå+jj øÜcA3Ʀþ*n.|; ðþ=ùGá¶ø¸+>üª€QØíÏ[Ì5¡J;ç8KwÓ‡] _~Ú<üé÷Ÿ>BÕßÅ£üðóWØý±²À¬¡”rœ&&ª¾mï»P•1ôÜ }쫾™-|Þ­vNPJì{Û¸›•‹XxÆBÓ‚Ä?Iļ†+³Åé«•#éÇ™²Z™#˜¯Y—é•ÇôÒáëZ|7ÎåËPbsÎ8‡_»*"ÁÌVż›ð®‹…O~Q¢KC.xi¯ZO29‡Â¾¿ïêm”„1|œj¶ l¥T"=FS6ƒ/ë'ðÿ†1ŽÛ0£‰¥ó­ís˜µ‰t‰kðmÿ€U2ÞW•Çý}Ó> endobj 3459 0 obj 916 endobj 3461 0 obj << /Length 3462 0 R /Filter /FlateDecode >> stream xœÍ–MsÚH†ïúsÜ­ÊNæûãhb²KÖ±ck©dÙª’" oòïÓ„­ÁC°O†¢$F¯úééï E¾u#(6Æ¢y•|ßS¤âj7$ L˜IT¡áD%¼óô†õwpháÿ=ú/Y&ý|ýš"ðÞÿ ‰ߘš%×O|Û àþ-ùGÐ]2J“÷%¢¥ùcˆ™ÂD*k-£È`Îl÷a(­Ð×?Ò{‡¦.?¡yY¸eû¾qõƒ«ÿü†ÒO ÔhBÓˆ‘ÀÄÜWÕzY̳¶ðK´ª}ëç¾ÜZ§ƒÈqB°yk»¸…§µÆ$,Hø Ì·c0²µØ=8þÝR#Ûl¯Q—ÉÇä©Ã‡µøfœ‹—¡ÒXSj­¶a3("NͱŠy3Ó;,ÖùE°Ú Õ±É s°ô4ÙM¹ Ùc”Ôá ËV«²__Ûõ‰šÖ¯P³¾­Š¶u‹G'žr䛕¼ÛçÁRÊÆµ=pòåDœ–X3Ø*(ëçIÉó8£e‡k‹Êùu{"Œ‹dŠ}T)}žF ¤®ôwyQºSq‚cJÁQ´Ç±NÊ@ºÃ-\sòì´Â†¨ezàŒ ¤;\é\y"Ñn lÞ6$’4ÆX¯yðÅoì ©…kÎz³‘ì0©iW>G•«|ýó8ökc¡Ž„Ú{É 36æ¤ZÁÊh~W ÖU«2k]s”Ê)ÅÒ@ÄÁVO$‡3H»ž™-h•Õm‘•åÏ®oÎ]Ó¸Å;”ÝúR…²¼……·^Önîa f·P§®®}}Ü/!1ƒ=Ömz¿DÄ/©i³ÎóâZy_"÷ã>[7¿«® ¶Z>–¹!2B³d¨œŽ?^Þ|§(÷u•µm±¼CÛ|ßÐ(à N#” Þ3ÕóL~(=»Iÿ¹š^LféK©Ba® ‰„í©:B•&ŽÏ'é먆Àá R¤å¾Ê"mCXHg¯ÆJʱ–+aöEkLÒ/7£ó³tüR¤ÐXÈM7è+)Ö8¤´t‡œ?¼”j(¦` öž>«±"-¤é$½xé4eŒ€“´2}Bc-DÁ±{(]]ýû*¨0Xra5§¢‡Fö*¥H §“ñìUXÃ0ƒ“ l@ºÇF¶"eE ýtu3½<»¸<ûÅnΊ×É/1T?× endstream endobj 3460 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 3461 0 R >> endobj 3462 0 obj 898 endobj 3432 0 obj << /Type /Action /S /GoTo /D [3463 0 R /XYZ 72.0 380.389 null] >> endobj 3464 0 obj << /Type /Action /S /GoTo /D [3293 0 R /XYZ 72.0 667.499 null] >> endobj 3465 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 630.139 298.56 639.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3467 0 obj << /Type /Action /S /GoTo /D [3293 0 R /XYZ 72.0 533.027 null] >> endobj 3468 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 513.139 298.56 522.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3467 0 R /H /I >> endobj 3469 0 obj << /Type /Action /S /GoTo /D [3293 0 R /XYZ 72.0 499.409 null] >> endobj 3470 0 obj << /Type /Annot /Subtype /Link /Rect [ 306.168 513.139 321.168 522.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3469 0 R /H /I >> endobj 3471 0 obj << /Type /Action /S /GoTo /D [3293 0 R /XYZ 72.0 465.791 null] >> endobj 3472 0 obj << /Type /Annot /Subtype /Link /Rect [ 328.776 513.139 343.776 522.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3471 0 R /H /I >> endobj 3473 0 obj << /Type /Action /S /GoTo /D [3460 0 R /XYZ 72.0 534.024 null] >> endobj 3474 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 501.139 298.56 510.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3473 0 R /H /I >> endobj 3475 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 472.639 217.905 481.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3476 0 obj << /Type /Action /S /GoTo /D [3293 0 R /XYZ 72.0 196.847 null] >> endobj 3477 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 408.139 217.905 417.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3476 0 R /H /I >> endobj 3478 0 obj << /Type /Annot /Subtype /Link /Rect [ 328.05 255.597 388.87 264.597 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1849 0 R /H /I >> endobj 3479 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 214.501 217.905 223.501 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3480 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 150.001 298.56 159.001 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3481 0 obj << /Type /Action /S /GoTo /D [3460 0 R /XYZ 72.0 466.634 null] >> endobj 3482 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 85.501 298.56 94.501 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3481 0 R /H /I >> endobj 3483 0 obj << /Length 3484 0 R /Filter /FlateDecode >> stream xœí]KsÛ8¾ûWàèTE ¾À­©©šìÏI?6Wo®>üÁÍú8Ä8 `œdY† Aˆ3þ ƒ›ø|}sGÁ¿éúÇ`¹-hÙ~hhý_Z¿ûnþÙá€H !Ä)ÀÐb±¬v»û²XæmQ•`_Wmµ¬¶’ÃO7‘ ! ÈÜî·ŽŠ xišÐ$û¡¤1ŠäÈ¿ê(b¥”Eö@þTö4†¦Â},ÎF¹a&i"”ei–±¯Ò&ÑbfÓ½>Xp'±¨¼ÿŠ/˜TLY!Ц$ˆ`Äúo—¤(F@±"ðòk-ùJ=frö²Èf=”iW*£¸Ô>µ­ƒ¤‹áèUµX7{’a¸ã‡öÃr»µÄ`E*‹v2Æû¨Ñ¨°×•γÚÏO€è`É' iéÞù Å¾¨°GÕPõ ø1MùlÉW¸D¡ N<†<†NMC†ÿgc(c¬‘Ÿˆ<ˆNhG›&ßPÐ>î©Û­Kq@ÒiHJâË!Ió>…¤®IlãêüHó0›ð¾c‘çÐ Oúጵ`/>%±¾ØHAð\“’fÞƒ‹üâ0îº7ZOº¦ŒCFs”nÕ“¾÷Qp`@hOSéÊTÁåJ{XÌ7¾r½íߢí•ëêÿ¯œÍÙÙ¾ë|~¥Ëàcx™b­M?Û-xaÈ®o©QXV% —[º²2&çIºlÚŠ·c.á óÒ,eK7½´ !Cn!D$”Lxź̷ÛÇ@´OqÊúËÓ8½¶Qdµ]Þ×5s—E; aën¶Æh'VcÖˆçwXcã ×ÕÚ(ˆRKBlõ9v1o“Ÿ™+¿/¶tÑ»~O´{R•M›Ë®(wÅòÎ(MMf抮‹’®x«(ɤŒ‚dÀlj'Po^2/¬ÿâ )éKhê凞ö,S•%]¶Á 6.d²°§ß4‹~°ˆ¬f4å)BÙ³Yi2Ó¬m$]ϺëgO²"Œö\s’Û­%œ£È 1Ï:“›)~lnë'ÞFsA³AЀ⊎¼Á_±ÁŸ43°·Œõêâ”]ë‡_üøÓâç_}[uÿñëï¿ÃßуǡǡBMõu,…0?  …ur<–^KíUaW*B˜¯f‰…í}?lèMc*»õ^`<ŽZWÛmõàˆCÛ_¿}äÍbæ_±C©£Ju^®ªÝö±ÉÙÁ؆–´Î]QglG\´\Ö{±5¯ië¢ÜŒÅ šÙ‰"ð³+6ÆgzP4k[I×€ÓµX?{’a´çšÛÜn-"ENˆ¦èÐy‚LñNÇßCa.P¸°Åµãï þV ®]loñWlñ'¹E´®+÷ž/íeÏ+C^¶§‚skkª“¨UU(+£àžùbi.ûx¢4â•:ª4ôÚìåöuµ§µ<ÈABÞô¥Fé–2eNoñY³€eEÛ¼Ø6c§ˆÌ,(~ùˆ×  íÎëOß ?/AqPãüÙ äxOëØÀƒc 8ðùÐñÿ¸P‚û´ˆòî=†Þ&†\~¿ÇÂÛÄÂy×ñ燢Áu|Ô‰.‰241S¡KBÌJ`ÌbÊ3'ò´öaq_•§F Ëj%|$7ņÁ.ÊAÌOÇ ò~>`Ã^ÜH ÙððÆ¢g!@i€ oku0â7¡Æ(#y€3 Âà]Vå °.mèè1∀(dÏŒ ô=Àï@&÷d FºÄù邨È%>µÇú»ª>VàÇÓiÓÊ¡¤}^·ú³82n·×gÐßkB~R´}Éjo™øü` –*;´Yë5 ´ì\7¹‚Å’„'®e<¨ ­hÜòePnë‚®·…þo¿Í ³NÛá[”%­òCUeRƒ$×;[ÝÓ¤\Xì â]õÐùÒ,Ü6m/[Ç`$ØŒšî™5fåÝÎL%®ˆ6X a&È‹ãñ!¿ª7²AKÜ”ea„: EÈW+ö }=…رÚC˜ar4”¾ üð¯_ Y9nCq$|Ò 3¿Ž"%ól"Þ:ÉbGs&¾–»™]øUÖî8 øTMÒÔ%¼¦ëÕíòoÝÑ8næ@I@øÞ¬¡£ñ1è·CþÇ!Ä_D<Û+ôþš‹ˆÏw ñ(¢ð¥ õ-ÿÛÃÔ7 Ç4å³tú b  Ñ)èôÄBBcšzýðDù ˆ=Èžsùpá tÂ륧£·—°þ+·ìMϧŒ»Ú>³ÏK¢dÚ^=÷Êc-ós%ni¾ˆuPÂT½æ Íž.O/a~uOomàÜ‚ ø2ug û«»Ó‹÷&Í&?Ó¾À¢Äo œ'T’$U×5 *"<ýv”A¹%î*>yO ºÒYi£K´Þ¥óʮ޻S½ÊEnË vö¶ŠÌÛHH’Àd âõs®IN^ìá3ø\ÚK“~¹·ø«¶ø™ƒÐïVy›?ù’_.®ÓÀ Qâ#€yéÜ€Ø$¨ýÿ#å¶E¯û†±Øòý4ó.Þ±X`Y•m^”zZ&ãÖñß½ôb½ª¦Íýv,O‘¤hn!¶"`;‹Ô#<÷áQŒL ’òÌÕדsüÔt“!Ûéd{stÍqÙa׎®õKúäiœ@÷E¿ÑÛj6¶âÛ»‹\üÿh(NÄÛ©¹_.ÙÛöýéwm~[Õ굈ã»×ùºØý£ÝÁùÈ<ÿÍÂCyd˜ Îù U¾„S&PÃÿ «æ£ endstream endobj 3466 0 obj [ 3465 0 R 3468 0 R 3470 0 R 3472 0 R 3474 0 R 3475 0 R 3477 0 R 3478 0 R 3479 0 R 3480 0 R 3482 0 R ] endobj 3463 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 3466 0 R /Contents 3483 0 R >> endobj 3484 0 obj 2584 endobj 3486 0 obj << /Type /Action /S /GoTo /D [3445 0 R /XYZ 72.0 736.194 null] >> endobj 3487 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 702.139 298.56 711.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3486 0 R /H /I >> endobj 3489 0 obj << /Type /Action /S /GoTo /D [3457 0 R /XYZ 72.0 668.804 null] >> endobj 3490 0 obj << /Type /Annot /Subtype /Link /Rect [ 306.168 702.139 321.168 711.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3489 0 R /H /I >> endobj 3491 0 obj << /Type /Action /S /GoTo /D [3448 0 R /XYZ 72.0 466.634 null] >> endobj 3492 0 obj << /Type /Annot /Subtype /Link /Rect [ 328.776 702.139 343.776 711.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3491 0 R /H /I >> endobj 3493 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 690.139 298.56 699.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3473 0 R /H /I >> endobj 3494 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 649.639 217.905 658.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3495 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 621.139 298.56 630.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3496 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 544.639 217.905 553.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3497 0 obj << /Type /Annot /Subtype /Link /Rect [ 329.7 468.007 392.18 477.007 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1781 0 R /H /I >> endobj 3498 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 424.501 217.905 433.501 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3499 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 360.001 298.56 369.001 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3500 0 obj << /Type /Action /S /GoTo /D [3457 0 R /XYZ 72.0 298.159 null] >> endobj 3501 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 331.501 298.56 340.501 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3500 0 R /H /I >> endobj 3502 0 obj << /Type /Action /S /GoTo /D [3293 0 R /XYZ 72.0 95.993 null] >> endobj 3503 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 303.001 298.56 312.001 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3502 0 R /H /I >> endobj 3504 0 obj << /Type /Annot /Subtype /Link /Rect [ 303.56 303.001 318.56 312.001 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3486 0 R /H /I >> endobj 3505 0 obj << /Type /Annot /Subtype /Link /Rect [ 334.39 303.001 349.39 312.001 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3473 0 R /H /I >> endobj 3506 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 250.501 217.905 259.501 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3507 0 obj << /Type /Action /S /GoTo /D [3454 0 R /XYZ 72.0 466.634 null] >> endobj 3508 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 162.001 217.905 171.001 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3507 0 R /H /I >> endobj 3509 0 obj << /Type /Action /S /GoTo /D [3454 0 R /XYZ 72.0 399.244 null] >> endobj 3510 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 97.501 217.905 106.501 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3509 0 R /H /I >> endobj 3511 0 obj << /Length 3512 0 R /Filter /FlateDecode >> stream xœíÝs£¶ÀßýWè1i¨$wît¦~LûÔÌ܇í>›l<µ!Åd3ùï+°… {q¬ëhwÛ˜¡#éü€sàpüÏÈÿÞŠ,Bc XnÿH9ƒ0–"ƒC€£°]¾ú·ŸøN[¾ýþ·Èü¼øð‘·YÈ÷{YÀÎë®þ\ü®ŒM6àŸ]Ÿßß-¾ù‰ÁÝÃa‰q@'I‚`Aˆñƒ»-øps÷˜?²‡¾ËÍ:Ë«ovYù9+¿úî~íô€…b 0ÔºXÛís¾^¦ÕºÈÁSYTŲØ4=üx×Y¹€¹¶p¿w†ÈÁ£”P’ÿa#ã’¦Gñ«Î@ôÍFKGÒÌ ù98dØ1TÜgÑ™Á cÓ€"”$4Iø¯Ö32FŒ3Ó뻜ºñmýÿú·X|”ò R”² ‚Ÿ¿¾Õ¨âD¤@lßâñQ7ý6:z5g/M¬¶Cq@»Z¹Ä4Œí]ëchäõ‚ze+>Ížf)žø~ÿa½ÝVõbTJ‹(vRÖû0¢ÑÀÞT:ÇÕXõIÔ»*{2(„AG™Âç‚ {ªŽ ê øQMy2BÍ%ÜF( ±gÈ34uRü?¡„wü‰ÈC4Ñ6ÛíÒO¨^Ÿ2³[GqÀ¨I19ImßS$uÇ«ùIó˜Y\ïxä9tÁküpÞµ°KŸ’B¦ƒÂ%óœ’Ú®õ14òvÍÛV|ž=ÍR0:ó¶·!½ÝVµ“}P(Ü @d3†Dªz“÷ìIp…„3\zºÞÞïÅÞÒ+õ¿bƒßU„€i·Ÿó2[<ˆIï7™v#ŠÛ×ÝæYYæxG:©ÎÕuZ…4ÏÞeØKÁWà–°ƒ›*+·ë<­²ÕA¶«ÊuþišÉe‘Wé:çmž(Áü’Æ{|ìãrDC!báÁ'Nó(³ÝófÌ5&‘˜¢CXKÁ:³ÏÄlÛµ>†FÞÚ¾mÅçÙÓ,£3o{ÒÛmU{Õ®±Í:0«êM®±'ÁÎlpé{{_±½Ç®Vý§®0Ò®(‘Ö[}-.B8æbp£'à †”7eýÝ"DµÖ!å­¿XQt”–ˆŸ7 SC­5ïb°µª¤Ð³ ˜N·=ƒhôV¸?”ü¡dF8‡ÊP¡°ãiºMÜÕ¯ÏT ‰°¡fKÙ–W¦O_»*­žwÍ9/ E ñò¸^>ö£ˆH‹"öÁË® @( @¢XÛuÇ·.ò±›ò:QKî…Ëx®p„˸ºâC¸ÜÓŒ-bXÜ —±!\Vtª*-B›1tlG÷€p4Æä A—…ŸzÆ^<)×LŠñ9€·ø[ü¨sCñ÷è}}ç@òÈrwº~¤'r´ÀÍC±Ù/MÂM#¹¾×}ZÎNï¾·}Îïל³#öCI"öSÓw”])Ôï¶?ó]Ëב˜#ìX˜+ÔºÎtе]ëchä–¨õðÛO¼«vw¾½!ESKBLZ`ÿ`l[u”O“úõC´îúèãÓü6vex¦l˜ÂóA…O j.~à‰§ø‰;óž¡÷É)Èð,¼Of ?ÜCh(ü¨mø6ˆ¡q¾Ô“¯˜ü?ð5sHò€ïšå+H1‹_IVëtS|Rxei"Þ²” EIœH›¦$`¢ÐAûìÈ ø² ]­ò¢’ªÅº%büŒœaI¬TˆZç<2ÊÓ øî·_À>Z©»2¼©‹HÄÂâabè¯3à Pˆ¯Œ‘ao®½ä±ÑS‘¯v *€žJh êT!ŒM{—ÙÃê~ùŸîbÒS1 Hfűi!‚½9ô+D|Ýóõ~œ}SýmêýÌWëg”(ì‹l¸ÀÔУšò$€¦+ýx‚!k:K^š•ë­|R1€µ«ö)^æ#‰"ØKŸsßß‹@oùʲ}!•ñÃãã >g Ää—{‹_³Å¿<®uæ='ž“igÞ=Jü«Ên‚ô&¯)G˜¸\¾[ØÞÒ6ù¶žwXxßÖ[üª-n}©¡µ1='žÁÉKZæC·×¤ƒë *ÞÁu“¦}eÌX¤ŸtásjÛd¥iç–„®[Rðþʰ^º2¾gÁÎlòÖ¹õ¿f‹QÛUÆ×Þ?²*²»*J½7¢T{èí0UšÞ“ìI¶*Lï (¾4½›,]uYzcׂP)`½“Ía²“u¢=vˆ0{š™EØÇz&3D˜ŠNU¥…ão3†ýì”Ðs¼&½ÇÇ|.I‰eÆûW~ûvú\i› îñ»jüL¾7ùU›|¦ä)rïl> endobj 3512 0 obj 2459 endobj 3514 0 obj << /Type /Action /S /GoTo /D [3454 0 R /XYZ 72.0 500.329 null] >> endobj 3515 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 714.139 217.905 723.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3514 0 R /H /I >> endobj 3517 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 637.639 298.56 646.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3473 0 R /H /I >> endobj 3518 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 609.139 298.56 618.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3473 0 R /H /I >> endobj 3519 0 obj << /Type /Action /S /GoTo /D [3454 0 R /XYZ 72.0 432.939 null] >> endobj 3520 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 528.139 298.56 537.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3519 0 R /H /I >> endobj 3521 0 obj << /Type /Action /S /GoTo /D [3454 0 R /XYZ 72.0 534.024 null] >> endobj 3522 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 475.639 298.56 484.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3521 0 R /H /I >> endobj 3523 0 obj << /Type /Action /S /GoTo /D [3454 0 R /XYZ 72.0 264.464 null] >> endobj 3524 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 387.139 298.56 396.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3523 0 R /H /I >> endobj 3525 0 obj << /Type /Action /S /GoTo /D [3454 0 R /XYZ 72.0 95.989 null] >> endobj 3526 0 obj << /Type /Annot /Subtype /Link /Rect [ 311.89 387.139 326.89 396.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3525 0 R /H /I >> endobj 3527 0 obj << /Type /Action /S /GoTo /D [3457 0 R /XYZ 72.0 264.464 null] >> endobj 3528 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 334.639 298.56 343.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3527 0 R /H /I >> endobj 3529 0 obj << /Type /Annot /Subtype /Link /Rect [ 303.56 334.639 318.56 343.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3473 0 R /H /I >> endobj 3530 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 217.639 217.905 226.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3507 0 R /H /I >> endobj 3531 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 153.139 217.905 162.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3509 0 R /H /I >> endobj 3532 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 88.639 298.56 97.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3519 0 R /H /I >> endobj 3533 0 obj << /Length 3534 0 R /Filter /FlateDecode >> stream xœí]›8†ïó+|¹•:Ô˜iÕ‹j?¤½ëîH{Ñö‚I<3Q ¤@ZÍ¿_ƒíÁ` Î,i¬ŒÛîNìs ç^Û'æÛÊý½i~Ð÷IÀz·ú&ê}€bQA/D„@¡‡"°ýªdlõ’ŸØÞ¶¬üþ]å+þ\}ú¶ÙÈöû±‚Æ[Sÿ¬>*m°Ï6µ‚‡Õ‡ÛÕ»?"àCp{ßb{0Š“$A> ^€’æ·;ðé—ÛG þ¦÷¿}ëlKóú]EËï´|óÜþÕ³à !D 80±.v»C¾]§õ¶ÈÁ¾,êb]dÜÂï·½3@èÛNÜÇ^xcdÿ…^ÀëX ·Øüª×a‘{éÕð#à?'› µCµÁ:‹Ö4nÃ{Ø÷“' û•Gz!ÏcÍáé° >'Q»ñMûÿö7¨ù(Œ²BÔ6/„!;þa‰»b~$*šò šo5·Ë}hÆøÝkP­nçÇî{e5c͘ðn`zØ^ßž†^±;Lͳ¨˜>ðçý§ýö·jOVçRDD‰“r¾»Í6j‡Ò»ððZ€íÐ`ò+ ªé~ôðè%p–)t.¨£êªþ?j(_Œ„B„|ß‹bÇcèØmHÑC†fÚw7"Ñ1ˆv´ªÒ ê§=—uy›‘Gç#IÚ>FR¿ q4äjyÒfÏ;ÖóœzàqÎLvé[Ò@AKÝ’Ð+¨7Ô±¢yFD+h„ŧêÒS¸™€È¤ =ˆT÷cêÙ‘` g¸Pº.Þ¯%ÞB•º€¿’€ íh]¼ûZ²«PpH,‡Äô@3d0ºü˜Và û•ú¿ÜQš«åêYD*6Ðpˆš©Í}Fkš=ÍÎ5-´ˆJQ5äðRÈá äp/ü¸CNóŒ 8Àrx9ŧêÒ@pš´¡Ç"ž¸=IÁéH°…„3|îæ£Ím…П“u \1(cJÕüŠ~Ò–e1>Ö.D®u¨L‰\…GÓ…hª)WµA#jå|WSÕi}¨t¡‹vªôi›?4;F5;ÖiÝ+Ò’jf‚Ð#„Ð'7óƒ‹n’´;U>ïËâ.£;ÍDL”4݈¦„~â! Q”¶ùþ +÷ˆ ÌlÒ:}Ûì#Üø§¹´**˜UÍ †+;¡Û"ŸmnZeÕå*{gDëp’¥:œd¢ÃIzNÒu8‡žEÅ|‡“hN¢_‹ŠOÕ¥Ép³Aú=Qò‹4œÍñpYCÐ@¦v¿â€Ÿtg`ÏšÙ´ ‡ŠCE R|ë4ØÊäÐxGŽcéB, E£VÛ_•‚èBô”žÅ¸2±eYQÂ!o!\ˆ7izØ^/ã&·bÇ©y Ž\Z›òÛߪÃKelÒ†ˆªûQ‰ëP°…3G\J\ð+øIÏ25"%®CÅ¡b84n+S*WÇát!œ„ÊEÄoÆ[¸”ò‰B·KßKccÉÚØ¸ÁX2!–uâ^-»?S1Ÿu4?–ì²… Kƒòk3ö~. ÅÁrͰŒjmñ+Žø’ÃÉÖâ„¶½,É$”„©á¨Iõ ß·Å¡’IÓsâ:Íóâ¯é†à{ç‡Ý¶͈œ.îAó„wO5†F|”Ü"”EE„†œFh!N¥éax½Œ·ÜЧæYT̹´6å·¿U«£;—¢Ú¤ =€U÷'<¾ÕŽ k:(#ÂØüš~b0;zíPq¨)jû@™RÔ 9Ž¥ ±$uq—¡!K¦9Ý÷|¼;€ä9[|®ë5­ªûC6¢Ñ5¥]—i^í¶uݪô›ëôõã!ÿz<[Èô9ÞŒÇ[ueˆ ¢å%‘¥ò’ÈD^éå‘./IóL ’…ˆ–—DFò’ŸªKnÒ†Þõ ºUÚ[P8sÄ¥Òv¿â€Ÿ¨´áàiÒ Xk³bÚöýñÇßçÏðùß¼†w: 3PìceJÆ+ð8œ.„“̳öû(¢,KL„|–?¸úöaDšïžÔRj âi¹Ûæ)ñâk‘ˆç+Þ—ñ4§e*z~DÍÞÊÕ2÷UÌ©LýÛ–{ºÞÞË/¢ú Æ—±ä‚»N_¸¼“ĉeÝïWÛ·þ™³c ‡‚5(œ9⢓á~Í?±“A : yLÞ†¢¼DE·êÏO8€F“öâ& ìei©µ_64/j!ºI·ý>A`”…ó È#r™þY¦=W¤›Á\A û ëe€t]ϧʇYÖµìKO8¬AáÌ^<Ñüz~Ò#Cd çßjjþßSuÔ9êÌ—p´7K`/Nn–À–Y‚ȇ–õ¿EÅë["ÉÚÅñìwAÖtiP*JAó‚W018Ì;3˜kf¬#á"~Í_p6À>PÜšŽö²TÒ=K¶3-ÂÔ~V{¥xÈëmv¼Aó 8ž³¶-7**âpÈ«Y†;izØ^/ã'·bÇ©y³G.­MùíoÕjãÎ¥P6iCHÕý¨âu(Ø‚Â"~bvš•ºŽ”+&eT꺈_qÄ—”ºÖ2%urKbiù—¡„!sÍKi–u…NÏž?¦ßùP~оªH¾sT›WŽêãøÚ ºò¦¢$«K*¥FÖM/¾Ó4GÐ4¼¢õÜ 91 ,ëg¾Ú+ëÒbÞ¡` —¾É²VΉyGÊ5“2&æ]į9â Šyû@qbÞ^––óÍGQ§æŸ‹k´¯eÉTzëG±TþL@×íüݧ¾¶kÂKñ/Ëú?®Û×ÅnŸÑšÊuyÆ{lÛê¬rŠdøÎ]­âÅ“>ÜPo’¹"±g,šÑ©/çU|Ÿöæ“ÙLÄ~—Ö˜ju'ýÌ'ýe«+ίùRÒêé7Oí ׆1^ùÅá`Gd¥uÁšL‡xÖ«ç"‹VÛ‡<Í29"Ê4¡"íDQÍThþþ<Öɪ endstream endobj 3516 0 obj [ 3515 0 R 3517 0 R 3518 0 R 3520 0 R 3522 0 R 3524 0 R 3526 0 R 3528 0 R 3529 0 R 3530 0 R 3531 0 R 3532 0 R ] endobj 3513 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 3516 0 R /Contents 3533 0 R >> endobj 3534 0 obj 2303 endobj 3536 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 654.139 217.905 663.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3538 0 obj << /Type /Annot /Subtype /Link /Rect [ 139.003 579.227 164.543 588.227 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1692 0 R /H /I >> endobj 3539 0 obj << /Type /Annot /Subtype /Link /Rect [ 185.89 579.227 223.65 588.227 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1796 0 R /H /I >> endobj 3540 0 obj << /Type /Annot /Subtype /Link /Rect [ 344.411 567.227 378.831 576.227 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3280 0 R /H /I >> endobj 3541 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 491.249 217.905 500.249 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3542 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 426.749 298.56 435.749 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3543 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 398.249 298.56 407.249 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3500 0 R /H /I >> endobj 3544 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 369.749 298.56 378.749 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3502 0 R /H /I >> endobj 3545 0 obj << /Type /Annot /Subtype /Link /Rect [ 303.56 369.749 318.56 378.749 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3514 0 R /H /I >> endobj 3546 0 obj << /Type /Annot /Subtype /Link /Rect [ 334.39 369.749 349.39 378.749 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3473 0 R /H /I >> endobj 3547 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 317.249 217.905 326.249 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3548 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 228.749 217.905 237.749 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3507 0 R /H /I >> endobj 3549 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 164.249 217.905 173.249 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3514 0 R /H /I >> endobj 3550 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 87.749 298.56 96.749 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3473 0 R /H /I >> endobj 3551 0 obj << /Length 3552 0 R /Filter /FlateDecode >> stream xœí]Ýoä(Ï_ÁcVJ¼aé´«ûÐîv7Ò”§Û¶Æm÷Úî‰rýa6ü‘Äx;ÌL&Pª‚ú™®2ùãÊü½­¿a×¶0Áæpõ£Û @ÀñɃ–‹<€\ yàú$¤¤X@¼D¾õÚ’úü÷*»‚àW÷_I›-€¤ßÓ`Þ°úíêA7Ö€”פW?ß]ýøwØÜíº)F¾=? Cdl9(¬ÿ pw÷×wûüïþú3ؤIœU?–qñ=.~ø îþÕã`ãBˆ€ Äb“§,ÙDU’gàXäU¾ÉSÊáow½™s ´ðÚ&î—žŠxAXP$ùr-‡Ò…r¬ÔSD®R)= ý>¨2T4†¢Â*W£Ü0 ýÀ l; ƒ0$?²pDcˆYÍðT° >N¼¦ñmóóƒ[TSRñEl¹Ð%ã—kT!Ø#Ôõ[4®5åKe(Ìèê%‘Åv¶o}©„¢Sc@ú Ö²”ÞLH^ÖŠ S‘ÌÃoûËí·j&«É,"ØI˜ïN£Q 2”Þ³ÈÏlž€f€žKŸ€²ŠÚGÀv ÂQL¡s T½UoÀhÊWCˆ~„kA„lÛò|ƒ!ƒ¡©eHðÿd …„µm"¢)ⲌcP=c½[ óä{çCç=…¤¾¾'ãjy¤˜Íø¼#‘çÐõà k-À>zI PðRKÀ îÙ wXQ$ãÄ V°+‚LQ¤%àfDstèH¯óž Ö‚„3œyºÆÞŸÅÞÌ+5ÿ$g¾ãêìÝ÷%;‚‰å 1ü¢,½]ÞìOÙ7ð¸ g!p½J¡öÇ™´áëmŽ>h»·J3‡`ÑÚØañói³!ÑÏÏ7Jsוšïò4ÍŸâm­Žï‡:ÏB¥ÚÇ Ï—˜TqqH²¨bl\Ìßµv#K‹¸<¥UÝÑö`Ó“EoªöÊÚ'YRî“ì‘tÇ6Ó·-o“(ÍǼsˆj{®èfʨ z@9kYJïµ´¹³ÌK„ïN&@QÉÞ"ÐHêƒË[õ„Oûì“òåǹa=õ,+[Eáè[rƒ©9˜BË ½UKáÎû8P DÖ°±·äCŸCÚ°Â`áSbáEëIþmì-÷ú 4ª46|ˆÙãø:'¾|ïÏ€/êUß h*ÌYWã$ñ(«¨:•7uWÙu×8ÛR×tÁ†#G,ŠW_g̸¤eÁäÔÙ:®<$Ÿ„hãz6Ëøq,ÇBä Ȫˆw7àtÜ’¦)nöñæ)Q1õ\i&ÊÅÀÆ¥´H§ )Ó·m• )¶&‘»7£nk»¼k´=Ó:4.­–v'류¶Tž1Zv|’ÝNhP¦Éã¾JŸ[B°m§¨aÈ•&ƒ/¡õ2÷|lËùŽ—øl5-Š(+‰ E¼µ8í×þ¦kq¯×!©¢öY,v*ãªíוÚþÉ!¾á•§=YØk*RýòŸH× Þñ¥Á—áu jû6ïÂJ@m¼K2B.“ÿÅV»¤Ë¯iZ¶k²W»ÿ>ÙŒËe2Ž ™ ¢5@ê àMù*üL§1-@Ó9ŒAA#š›À8F&ƒÑ`ì5Ù‹È÷,_‡®^Œ|WF‰ï.´qÖ²”Î'œ·"ãT$3ÂèÈ9·!¹ýVW݉´Ð hŽ=‰âg¿´Ç½lƒžµ ç#AÒîu /ÕV_¾ñŽçàú¶*ERN¿_¾Ïõàòëï¿ÃöߨoðyÁøÔ:ÝÆâlñ…vK×’¡ÝR5G€£…wEm„k×®MÉœÞ ¥™šÄ]æc[kS2ÕP9}“n<6=~`uûBjâ§œ»YVI6–`éWPž~ô‚‹°ü Ê2 g-ë@ép¼§"™FGι Éí·jb†NäŒb޽'H?û B£„AÏjÐsh÷»W‡“!¿[ŽÒ@©õ»›‹¨` õ¾Vnzúns÷iŸlöÓ™!mú=ÔM^‡î|½’ Rå~¦Uëó»N¸²ð“°[â¥bK<[â^œ‡»ØR‘Œg|X‰-±&¶dŠ"gøüstè¿&ètF³: zVƒžɼ´ð¿<<“5ì§é•rnÒ·Aß%£OçÜ‹_²ÅÊYHoóUÞ¨½'ŽV’ôí‡AIDBù%)ßeU°«·¼ V}gyÕ£h/þ•ó¿³Óá^”ãyMÚ9½Î†UšÏn…I _â[íé]46Ä“,VÅÛ6X¾øø)ʪT9à×àŒD0Â+ äáóàxσ­ºpÄ@a5P8ƒÅg/ë.ÔŸE`aƒAÉ%£D6‹_²Å ÖsVt8âN­í‘‚@mFC‡è™¹é(¤¯ô©óLkQšv•úžÆépb}§òßE"TKâzk~‹ˆNt7ùú¡/øð¬–æùq:˜ÈëK9ë°›*ÇÒŽ<²J¯+^g„@¹¿(Xꚬ`à £ wPÐ]a¤HfÜ+(Wš+Œ™¢Èüz›(^ëÀ(¬ g°ø øæÀ”\0J´¼±ø[|¹¤žõádȇ€c ôPZÞ‡÷ ¢Þ2uâÛj¬\«®ñÜŸèíì8l~wF$”EþƇi¿½ˆ#v(Ü"ÃjIv<©¯ÞϽvØ›Ý ý_ìÁºÍe`:ñ¨¾n]á6#|à¡rœ—ÐO»¼îpm«ÆT(ðò#0ዽÂÑT$ƒ§9xBË ­ãø”&>0PøœPXìR  7ì$¬>ƒGzÃ^rNx…ãØ:'¶¤³Ì+ÄÖY®°©ÿþ½…H* endstream endobj 3537 0 obj [ 3536 0 R 3538 0 R 3539 0 R 3540 0 R 3541 0 R 3542 0 R 3543 0 R 3544 0 R 3545 0 R 3546 0 R 3547 0 R 3548 0 R 3549 0 R 3550 0 R ] endobj 3535 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 3537 0 R /Contents 3551 0 R >> endobj 3552 0 obj 2701 endobj 3554 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 740.639 298.56 749.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3473 0 R /H /I >> endobj 3556 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 659.639 298.56 668.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3519 0 R /H /I >> endobj 3557 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 607.139 298.56 616.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3521 0 R /H /I >> endobj 3558 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 518.639 298.56 527.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3523 0 R /H /I >> endobj 3559 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 494.639 298.56 503.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3525 0 R /H /I >> endobj 3560 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 430.139 298.56 439.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3527 0 R /H /I >> endobj 3561 0 obj << /Type /Annot /Subtype /Link /Rect [ 303.56 430.139 318.56 439.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3473 0 R /H /I >> endobj 3562 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 313.139 217.905 322.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3507 0 R /H /I >> endobj 3563 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 248.639 298.56 257.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3519 0 R /H /I >> endobj 3564 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 124.139 217.905 133.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3565 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 95.639 298.56 104.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3566 0 obj << /Length 3567 0 R /Filter /FlateDecode >> stream xœí]KoÛ8¾ûWð˜JRo`ÑC±`oÝ °‡¶Õf£¶äZrŠüû%EÒ"EI¦S»&6m#Ž)ÎPóQú†Ñßg@úsË~e ²,óõì»#b&Bà Â1„!ÀQ€c°º(+zŽz€åý¥Õ¥åGð߬œAð×ìÓZg =ïÇ Ž4Þ6õïì£b›¨@]²‚‡Ù‡»Ù»?c€ ¸»ï.1N'yžc² Ä9ûƒÁÝ|º¹{$àrÿû0_-IÙ¼«Éö‰lß|wk- ,…â`Økb^­×»r9/šeU‚Ͷjªyµâ-üq§]¹ síÂ}ÔL¤ÀKÓ4€}@ÒQr•ðÙGš!ý"×¢IxøïQ“¡a1T 6±èŒqã0LÒ E(ÏÓ<§™"œeSˆq¦{&X°Ž“¸­|Ûþß~p‹Ù¡h”âÖÐ4 "Ñþ÷K\ XXùO[ÍÛå:ŒÆøÝ«'Vë¡$Hu­T2dƈv‹¦û6py{AzE-ÚMC³Œw|þ¸^½V{±:•Â#ŠŸ”ëÝY4i4º¢…´?`;ÚÆuC6ƒC…0Èá$¦ð¹@…=ªŽ@ÕOàGuå‹!ÄრÂqâ1ä1tè6¤ð¿>†rÚ4ò7"¢C Z“º.hž7d˜Ö¥8ÈR;$%ñù$Û>„$݆$îãêôHó0³xÞÑÈsìÇy8mz`—¾%E°”žè–$›îÛÀåòšËZ´Ÿ†æÈ¢ç²µ1½z­–dw*7# ²±A‘ª~ˆ={$¸‚„3;\0]ïï+ö÷ø$4§–2ˆ&é¬GŠG G Ùn«áÐGðUç ¢ó×N `Ç£éBhj xCÉP€Ç–R!Ro¡Œ{ÍÔMÑìê·ìÔ£ ¥M•‹eù ¨&£0 ²Bˆ²Pöu½¬Ê ²·<Ü!t¿ZèþJ²|¦ãÉj Wtiœü¶(šâýÔL´ÇÊceˆf{‡_±Ãº9Tߦ8¶s8ñÛ]( ŽrJ„cp³Ù’§eµ«WχyuQ–Õ®œ“m€Ÿ]îÖ_Ô§&]Ýöx_ŸROð髥‚œízY”Ä· , #xâ“ÛÃ4þ”d[ˆÅaÌÎVF‹r.µH?w,¿&…ý¼˜ ™/ïŸEF ÊÓ”iJ©ÉpïÔñ˃ fޅߝvP^:ÈðPp ¿&Èð¿f‡ddç 2Ú ¶3«ož‹Æ9B¡iŒQkÜã!mñøáG„Õ¢…{@ñᎻX’«(d‹ òÍãNb»p± eÕˆ( K’6Pá+VAoŽƒ sø±LGÚ ŠÅÂbñ¢ ×¢¤ ×v› €A1gÛ,™ñ›©ñ[’ä]ø& CŽÍwÛ-)z Ý"póT¬vd_j»Í­â%¶&S“Ì«]ÙŒl2À#§»–øjÇ÷¥#'g ðk"'ïðkvøQÏöb‹Èé-èoWø‚·€=ê<êl×cÜÊPÜ…“_qe=&B±c B€A‰O5(ñÈ ÄÚÁÝ 44c‹‘‚A‰¥¢SUiUØØ VübÊ1ùF†G3º4PjBÛ³Œdêó`Ææš3Hx_³ÇO¸ÌáPÆ¢9KÂÒ–lHÁ&âocÊE(Û_UÕF)îÊf¹:Er¿E¡c®$QwIt"Üɦû6p¹ôŸ¬Eûih‚ÉžËÖÆôêµZnÜ©´ Ê66h€TÕ2^W p™Ç‚'©®GÊ#eêz_±ÇOIuÊÕUã±t!,*£§.ä,2Îù2'мT¬V]¡ãÃS³çÅŸÊy: !¥R¬IÙ˜óøÆ$z·{g’'b÷N¥ÄhýáÙôê‰lëH©™Ú†(†®¥Ó ÂÆÐBøTckßxß ñÁþËp7¼LíR2yö-ŽjïÕk™¼¢Ø‚×[¢ ?Í„ã6ÌžÞäÓÃÉ=84ß;ÿµ8ÿeÛM¿áÐn ký¾€ÇšÇÚñ»‡:š±HCE‘–À:ÉöGõò¡¤¼\2|°à.ðE‹H£Ýç¨-pÌNy,j¥ÄÃF±Xóu#”P·e2Ã#=GMCÊ ’…$ …i™‘§SmØ; …¹\‘ç+µ*s;õÅ–^_ãdûW`^•M±,e* åxKêݪ1[B“ÙKƒQVbǦ8^íR³¹Eùd`åä ‚. G¨1 h˜rìÙ©÷¢æÅÓ{kˆèù‹~æ‹þ2Z~Êinïc§||€^9ç¬QzµwÖ«vçéNûÂ$û` ¿Š™ð)P5ìçRÒÚ endstream endobj 3555 0 obj [ 3554 0 R 3556 0 R 3557 0 R 3558 0 R 3559 0 R 3560 0 R 3561 0 R 3562 0 R 3563 0 R 3564 0 R 3565 0 R ] endobj 3553 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 3555 0 R /Contents 3566 0 R >> endobj 3567 0 obj 2178 endobj 3569 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 690.139 217.905 699.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3571 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 596.251 217.905 605.251 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3572 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 531.751 298.56 540.751 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3573 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 503.251 298.56 512.251 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3500 0 R /H /I >> endobj 3574 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 474.751 298.56 483.751 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3502 0 R /H /I >> endobj 3575 0 obj << /Type /Annot /Subtype /Link /Rect [ 303.56 474.751 318.56 483.751 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3486 0 R /H /I >> endobj 3576 0 obj << /Type /Annot /Subtype /Link /Rect [ 334.39 474.751 349.39 483.751 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3473 0 R /H /I >> endobj 3577 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 422.251 217.905 431.251 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3578 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 333.751 217.905 342.751 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3507 0 R /H /I >> endobj 3579 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 269.251 217.905 278.251 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3509 0 R /H /I >> endobj 3580 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 204.751 217.905 213.751 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3514 0 R /H /I >> endobj 3581 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 128.251 298.56 137.251 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3473 0 R /H /I >> endobj 3582 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 99.751 298.56 108.751 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3473 0 R /H /I >> endobj 3583 0 obj << /Length 3584 0 R /Filter /FlateDecode >> stream xœí]s£6†ïý+t¹ÙP!>$:δәÞm›™^l÷‚Iì© Y ›æßWBÂ$@Ip¬ÚÚÝ6–"tè¿GÄ—• ý{Å~Ð÷IÀÍ~õEÔû#Ä¢*‚^ˆ"€BE`úUØÑmä¨ýDôÚÒòüµÊWü¶úø‰¶YH·{\Á‘Λ®þ\}| èg›üƒànõÓõêÛ_#àCp}Ûb{0Š“$A> ^€öë=øøîz“?²ÛŸ7»m–×ßVYù5+¿ù®ïõà !D 8èâ¦ØïòíMZo‹Ü—E]Ü;ÞÃ/×½#@èÛ܇ž‹<Œ±‡@ÒÿB/àu´†÷È~ÕsdXäVz5|øÏQ—¡â1”VY´Æ¹q cìaßOœ$ôWéA„H2EŒ5»§Â‚úœDMã«æÿÍ/®û(:¥…¨q/„!Ýÿa‰›¢~$*Xù M{Íûå6”ÎøÕkP-·óc÷­Ò#Ö ºúÀë›Âè­èn*–EŸ޶·ÛoլΤiœ¤ãÝy4éTv¥w.àá¹›3 ÙÁ(äg@Ug÷ÚSÀ —ÀI¦Ð± BŽªgPõ ~ä¡|1Bü+\ ò}/ŠCŽ¡¹Ë¤ÿ† %´kß]ˆDsí³ªJï2P?ÝgzY‡‘G°Iqt<’Ú¾çHêûGC®–'Íafð}G#ϱ/<®Ãi×ZÀN}I¢Þ @‰àB—¤¶ë¡¼¾=æm+ºŸŠåÈ`ÏÛÞÆìö[5"»3éIÜŒ@dâC"Ù¼N=;l!áÈ.”®ïKo¡JÝ€_È€ íhÝx÷µdW!àX‰ñ‰fÈ`v9߀«ˆx¼«³r¿ÍÓ:[wuU]nó»Á=ÈîtÁ޼N·9m˶õD¿ih›LÙ4 ˆBŸTMóÆ&›gÛ•Yõ°«•MÃp°iõ@7-Ÿ&TnÜh‹NQ*œ‡KqŽp*d†~«9ÛO´«°;—Âù™v ÿaÇ$¹1'}gíÏŠ¦ë¹SB¹ãâû“³ÍŽ)¦ÐrP¡Pµ?†WU!z•ššlv]$B:qîP¸Hžu5)þ™š*¶Ž 1¹ß áÛæOã%;tL¼âèÿ€•éL}ãyPؤ‚¸]¡hÐGU§õCõžmPñO7ÍòµD…6Júõ6Ýwîã{à£Ø‹Ã I°Ÿðí¤‘D^<¶OÕn{·©wO`½½½ÍÊ,¯9Xà¶(A¹­þë´N¿;ØSfÉiÌáÄå«X{§åmòU–ËU™$ ¹›Ä60õ zä¡|@ó™*Ž GÐ+óTB¡%²T 9ry*²—å¨@/ÖâuêËQ1‰Ã….Gm×Cx}{ÄÛVt?Ë¢brÏÛÞÆìö[5Òº3i0UoâC!Ù¼ùLý´ÔvøXƒÏ))9LÆ1 4l•®×evËæ+B?aóW•T`só³ ‹{ö¨Wõéï¿ááߤ–wˆž3¢úl7äg<ä Mê[HÉØ´¾„é -<}ï#ÂÞ»Ûb·+³õüœýç§f–ò,"îM[:ä©Ù<ñ ›î ˜Ä˜y 2ƒ”-#2̪IJÚ8¡h$L=õ%‘á™Bk–9SÚ®‡>ðú–¸¶ÝOŲ¨˜Üó¶·1»ýVMèЙ4ˆ#L|èB²yãSMÆ{ð9%YîFü¬Güõi\BË;N'óZÞBJÆ´¼„é -§å§äpØ[^,lo)‡µÚÖ±` o¤m݈ŸóˆÕ`¨¿{vжŽÇ åä1-ó±éµVàÚ‡Š¸vÒ$."1Ë1éÃ5%jÛŒ¤yqKmÁ–¨`2¾o6B Öv­<ÛŒäAo[±ç‹‡–EÅô³ÍhZßn¿U£g;“âÖć²y­¸u,Xч¼·nÄÏyÄÍoè@dòó WsÖvZÚ®ŠrØýB:ܧT6 sòÛ‘ìH¦œdeYè“ù[ñm(£ë½tä8–NÀÒA|û,7£!K*?s‚¹Ù2ƒFÆo¶7›ùD‘C6HÅW‰ÁMš‡î¹P%9¤¢Îm‹|BøÔœeA¨¨ J„I–Š0ÉH„IzÑé"LÅ21ûˆaM„)Ù”Mzô“—„žÁd’‡ÃÇ|NI‰Y²ø÷ŸŸèUì‡ùk¥i"¸Ãï¬ñÓ)|7äg=ä %XHɘ¼—°q $KÁã³p"•>?' œ/9Ù,A‰™ëë,/ê^.`PrÂó‡ýç¬ o"¾”eq+š¯o¥ ‡Ë&­›CI$,ËEy­©2\âò1Íë Ô¨Ë4¯öÛ©g^CØ΋ŠË{ªã-ŸyÕÅ$Ž{X8Â_ØC¨@AÄ“³ÆD;¸!?ë!_(v°÷© µÊÖ¤pAª‘ón&ã‡ôIhu”ðÉ}® y)Ýíº[yq>¦Ø¤_yT$pϲ\*VT¿Ÿ)ºµ(ã$–„¼(íŠâ~>¢(¾Òx‚ís¼Êê©,¤`Û¢ö‹=­N®â Ö°pZNªx‡É9c¢UñnÈÏyÈ—RñöQâT¼ -¯âIâóU]¸Œ? –r¿y(›5×™yÅ­ä§Êy^°oRž"ä‡ÍÒñ­êoË•nÚ]ì7Åþ~—ÕÙnê QQd]úœ¨ÀÊR¤x©%oñÈj¤¸·2(îV#U,cƒ%B±²)Ö¬F*Ù”M(uzç”l^§Ô ö°p„!†RÉÍæJÝar֘蔺ò³òå²ñ-eL¬Kä8–NÀÒòb=‚ˆOns±~(f¥\ä’›)|,²wÄçû²ø¼Ëöóª½ÌÒvž-›Ü­)JÛüþÁ@·³(¡É@Šî¿IJTèÂ%wgþ‰ÛkQqyϤ[¹,¤~¾öðX‡5øðw#~Ö#¾Ø²ŽljÁ{[í£Ä­šc'Ho²,daÛBWQaÕ»¨—{Wð ÞDInÌiäç¿@¸}k²Ví::Lè@g÷¦rv,\& Æ_Xs«Û8‚A¯œi·¡1ùÜŒáÛ æOó%;tL¾âÈv¾] §™­ߟ­FÉ2êl5ûû$Ï‹Û endstream endobj 3570 0 obj [ 3569 0 R 3571 0 R 3572 0 R 3573 0 R 3574 0 R 3575 0 R 3576 0 R 3577 0 R 3578 0 R 3579 0 R 3580 0 R 3581 0 R 3582 0 R ] endobj 3568 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 3570 0 R /Contents 3583 0 R >> endobj 3584 0 obj 2387 endobj 3586 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 700.139 298.56 709.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3519 0 R /H /I >> endobj 3588 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 647.639 298.56 656.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3521 0 R /H /I >> endobj 3589 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 559.139 298.56 568.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3523 0 R /H /I >> endobj 3590 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 535.139 298.56 544.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3525 0 R /H /I >> endobj 3591 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 470.639 298.56 479.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3527 0 R /H /I >> endobj 3592 0 obj << /Type /Annot /Subtype /Link /Rect [ 303.56 470.639 318.56 479.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3473 0 R /H /I >> endobj 3593 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 353.639 217.905 362.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3507 0 R /H /I >> endobj 3594 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 289.139 298.56 298.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3519 0 R /H /I >> endobj 3595 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 164.639 217.905 173.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3596 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 136.139 298.56 145.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3597 0 obj << /Length 3598 0 R /Filter /FlateDecode >> stream xœíÍ›8Àïù+|œJj̇AZõP퇴·îŽ´‡¶šxf¢&™Õü÷kc; Ä™’Æ›q§íÄ/¶ß3þÞ³ |_øÒŸ[ö+ }/IR°Ü.¾ ¹0A,DôBAz([ÐE`C˨üDuòÒô#øg‘/ øcñé ͳ–ûwG*oªú{ñQ±Md Ÿm²‚‡Å‡»Å»ß#àCpwßb{0ŠÓ4E>H¼¥ìw[ðéæî‘€¿Èý¯Àr³&yý®"å)ß|wvjð !D Ø«bYl·û|½Ìêu‘ƒ]YÔŲØð~»ë¹B/±íÀ}ì˜HÁÃ{°$ýz—Q ¯‘}Õ1¤ŸäZ:Þþ{Ôd¨Y Uƒu­1nÃ{Ø÷Ó§)ýÊK:¡NcMótXP—“¨É|Ûüß|q‹ØGQ)MD¡8ñBÒö÷S\ø‘°ô-š¶š×Ëuh•ñ³WO¬æócwµRÉ#Ú ªîÛÀåÍaôŠ\´™šf!oø¡ü¸Þn®æ`µ*E(ý¤ïÖ¢I Ö”ÎXÀý±›Ð40 ù¨j²~½N2…ÎrT@Õð£vå‹â—ðAˆï{Qìr ; )þ_Ÿ¡”Ví»‘ƒèD[RUÙõóŽ »uy 6#)ŽÎG’¬ûI]â¨ÏÕü¤9Ì ®w4ò»àq?œV=Ø¥OI!샙NI²ê¾ \.¹ÌEÛ©i Z.kÓÛÍÕ8Ù­JOáf":©êÇcP¨GžÑ¤Óí² KsòË*«³÷SεcåŠYr„]‡_q‡Ÿtr(¾M¹¹ÖqÒu{[ŽCéB(Õ¼¡ß¥ˆ^TÀÍ®$Oëb_mž{k2 Ô+šåy±Ï—dE+à¥óýö«¶šAzI!ô“@ð{Øå |}®I5áOG«nÉB¡>¦š SYuß.—Ý-sÑvjš…`²å²¶1½Ý\ ݪ4ð§Mlèð«ª?‰ßxÒŸvÙÐ8ð‰]_qŸt^a09«ìHq¤˜8ÓÖq2æL+à8”.„’t¦ˆ= (Yjªª³z_w«ï‹’ `ÂJeÊçj¿\’ªºßoÜsÍÉ®Ë,¯¶ëºnôÛ»èËÇ}þM+ÆÃúÔ\7L- 3… IúØSÉ<ØËªû6p¹ÄGæ¢íÔ4 ÁdËemcz»¹¼Uiàœ›ØÐªúÁYk‡‚-(œ¹ÇåÔ³ëð+îðýlØ»š°™jm5C,Ñ¿?~ùûüþNzðB¡`†”e1¼‰HN‰[Çʘ¯ÀãpºNÂÇôb‡‡KIs?þ­‰#¿ÙÿrïÛ‡Q }VS™OÊí:Ϩÿ–•Œ™ƒ'vÍÝwãHNÊLD~D¬´2Z”²Ô¢nYqÊÖ2bØËXíÈr}ÿ¼ÎøJÆL =ˆZÑõŠŽ\d¤Ø²ðûÕÊ‹[PøIA†ëð+îðƒŒä|AF3Á"fõÍÀuQ»"‡~ £å7F»H›G¯Gî›â‘JlÛøjÇ÷¥#'‡‚5(üœÈÉuø5wøI×v ‘AäôôŸÀ2PUýÉèÄQç¨3]± Ø‹“[±e=&À¡e B€´A‰æ”hdP¢ÎAí Ô4#ƒ‘‚´A‰¥¢SUiU˜ØÐ­èÅ.ÇäŽ kº4(!€=† ŒìÔçÁŒæš $\_sϸÌa(cQ„BŽcéB,•dG26Q_„zû›¢Ø)É}^¯7Ç£’¯Àñ»#BXà Aö¹‹Ã™¸“U÷màrÙ2m§¦Y&[.kÓÛÍÕøÆ­JGÙĆªú!ס` gèñ÷± )Wבrͤ ¹º®Ç¯¹ÇgtuíeÌÕUÈq,]ˆ¥¹vôT™œEF)ŸCæ4Oe›M›hýá©ÙóÇì‰Oå|; !¹’¬H^ëóøÚ$:õÀ…Uq³æˆæŠsëϦO¤¬bKÍÔcˆÂضítBà#mhùh®±u¨¼o†øâðç“^­Åí&²—%yO{V¬ uDbl£¾ê(!Ñ g#hY,.X{óžë‡xäåsX{]ÆÒO•ŸhU¸}+f>öª¸hHËÀKépûRºH1㘻|TŸÎ¦ê“Ñô‡= é,;¨L BóQ…^€Õ\)Z¼a‡ÂëDáeÕœKŽ> endobj 3598 0 obj 2198 endobj 3600 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 740.639 217.905 749.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3602 0 obj << /Type /Annot /Subtype /Link /Rect [ 330.81 661.109 394.96 670.109 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1496 0 R /H /I >> endobj 3603 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 610.359 217.905 619.359 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3604 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 545.859 298.56 554.859 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3605 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 517.359 298.56 526.359 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3471 0 R /H /I >> endobj 3606 0 obj << /Type /Action /S /GoTo /D [3293 0 R /XYZ 72.0 432.173 null] >> endobj 3607 0 obj << /Type /Annot /Subtype /Link /Rect [ 303.112 517.359 318.112 526.359 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3606 0 R /H /I >> endobj 3608 0 obj << /Type /Action /S /GoTo /D [3293 0 R /XYZ 72.0 398.555 null] >> endobj 3609 0 obj << /Type /Annot /Subtype /Link /Rect [ 322.664 517.359 337.664 526.359 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3608 0 R /H /I >> endobj 3610 0 obj << /Type /Action /S /GoTo /D [3293 0 R /XYZ 72.0 364.937 null] >> endobj 3611 0 obj << /Type /Annot /Subtype /Link /Rect [ 342.216 517.359 357.216 526.359 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3610 0 R /H /I >> endobj 3612 0 obj << /Type /Action /S /GoTo /D [3293 0 R /XYZ 72.0 331.319 null] >> endobj 3613 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 505.359 298.56 514.359 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3612 0 R /H /I >> endobj 3614 0 obj << /Type /Annot /Subtype /Link /Rect [ 303.112 505.359 318.112 514.359 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3502 0 R /H /I >> endobj 3615 0 obj << /Type /Action /S /GoTo /D [3445 0 R /XYZ 72.0 769.889 null] >> endobj 3616 0 obj << /Type /Annot /Subtype /Link /Rect [ 322.664 505.359 337.664 514.359 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3615 0 R /H /I >> endobj 3617 0 obj << /Type /Annot /Subtype /Link /Rect [ 342.216 505.359 357.216 514.359 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3486 0 R /H /I >> endobj 3618 0 obj << /Type /Action /S /GoTo /D [3445 0 R /XYZ 72.0 668.804 null] >> endobj 3619 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 493.359 298.56 502.359 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3618 0 R /H /I >> endobj 3620 0 obj << /Type /Annot /Subtype /Link /Rect [ 314.39 493.359 329.39 502.359 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3473 0 R /H /I >> endobj 3621 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 464.859 217.905 473.859 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3622 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 376.359 217.905 385.359 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3507 0 R /H /I >> endobj 3623 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 311.859 217.905 320.859 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3509 0 R /H /I >> endobj 3624 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 247.359 217.905 256.359 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3514 0 R /H /I >> endobj 3625 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 142.359 298.56 151.359 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3473 0 R /H /I >> endobj 3626 0 obj << /Length 3627 0 R /Filter /FlateDecode >> stream xœíÑs£6ÇßóWèq;³¡’@HÜt:s»vÚ§ë]fîa»Ä&‰çlpl&ÿýI€l( ŽUG»ÛÆ(’~?¤ðýIBþó Èÿ^‹,Bc Xí®þìÒ „q—D`aap`v ŸDÀ–—Q?`ù‰ÿèååÇà¿Wù¿\}ùÊó¬äåž®àHåMUÿ¹ú]ñ­ËÀ?»ä÷W?Ý\}ÿ3‚›»cã8€$N’#À‚'â7;ðåÓÍCþÝýã'°Ún²¼þ¾ÊÊoYùÝWpó[¯Ä(„S€á ŠU±Û=æ›UZoŠìË¢.VŶ­áŸ7½– ! ˜k ÷{ÏE¥4€C ùQ¶i<¥­QüªçÈð°µÒKiÏ ý9ê2Ô<†ªÃ:‹Î87ŽaLŠP’Ð$á¿ X"œ )bœ9=Üç„4™¯›ÿ7¿¸ÆâcW)? £”ŒøùZS<‘.A_ãi¯Ûz[ZeíÝk¬æCq@ûVyŠÉëU}hÓ›ôv¹øij–»„ñ?”·ÛÏÕ4ÖÑd×#J?)í}ôhÒ¨JïZ Ãk6W@s‚$j¯€ªÎöÆK…0Hà$SøTPaOÕ ¨z?jW¾¡ön„#Ø3äš» )úoÈP«FþFä!šƒh—UUzŸúyŸ™eÅ£v$Åät$ɺçHêû“!WË“æ1³xÞñÈsì×êp^µ°sß’"8%‚ Ý’dÕCÚô^N$õ¯üÄ«’Åyh.Eó1ˆÁ Ô’¹zƘFÈšµ?$«©z:*…z,ŠÌ¡¨Ôáž) ¦ðrPáWPµ?Ðpg²AB8%Ã=B!“˜ö(|H^t7)þ7%¢#¨/ª M¾ah/Õ¡Sâ“¿^õC¾×”à€›rÐrƒé 0ÔQÕiýX}ECŒDÑ,_oò{%›Ñê £€…üa‰XØÖ³Þ¤Ûâ^Á]ŒÇG˜îì§»Í6ËÓÅàÏÀÿI…ïá½`xŠÜ÷ø÷øR!ÎA26¢Pã9:G Ïx Ìpó¤+¶Ûâ)[Ï?énŸ›‰È ¤7ò(+w›<­ Õp¾ûÕȳ(Θp¡›£ÐŠŠÉ^ѪÞä÷á…xÔƒ×sßq1^)˜-t¥Èª‡>´é’8™‹Ÿ§f¹K˜ô TÍe­GÁNÜãRÖú¿à·ŸKƒ‘Å4‰ Š¢€OÃÌ"‚ÅzJC)Ép-fij£$a(zN*wS1l¯`<ÈN¢‰ì£Fˆ>„»†C“:ÈNÉìŸçŸÍ2½Ýµ\Ví®•ÂO´»½µÝ F‰v·7¢¶»ÁÈNµÝu#óÓXÃ…·»–ë3(Êá*äPée­ƒæIéCtèï¶þnûåSV–…yž ãd,@TÀñ(¥.@Ä ‰©•,åø…1bS2ŽB1Ïòô°Y=ÌßH“9Ma”P* ›Þ„Ñæv*îܦȧS~Ûtkœ¤K`Ú [j„ ‚°Þ€;‚h–™ÅÈÓA˜aD±©š´Lm|èÁÏ^3:NOÑxz\¡çœØ­ûáö™ßÃ~œ¿SÚ.áòô]2}Fqï{ü‚{|©©ç Sö 5ž£3päÈ®8¡"’H•Ï/YÀUÕe÷’<¡Âõu–u/Å+h‹¹òÇÝmÖD6„4‹ÈŠ;å yvk•P8ŒUÒºi ÈHgY=T_¼T_½ÇƒjžÒ¼nÞO¯Ë4¯v›©wXB ä?ìrÌ÷|‡ÅŽxœAá=n}[ yaa6xJ.™SØà{ü’{|¡°Á=Hü›nr$E- •HAIQWƒM†és'ÓqÒé·â¹=J·ÛãÁ:­Óùpâ!ýÖ4aÒhö,˕ÊKo}ÞV 'Ž{nÅI¬høîh[ûù`¢øÆC qÂñ*«§ÖÆEq,^ÿ°WÕ¹¼GÁÎ+à£)ï)¹dJLÞ÷ø%÷øBÞ=H¼€w“£å_TÛRŒ¶Slª&-Dº½KJ5oégP8A¿@¤,ÄnEº§ä’)1‰tßã—ÜãË­¼w“1®€ãQ:JËëtq;¤ÝêôÃaVZ(õ§Vm qO»å:Ýç}YÜn³Ý¼`/³TŽ®G(Q6nêŽ6ùþÑB²‹¡YrcÚÿžŒ.Áyh‹uæß ,v,¤î>Þ Nnàd¦= žWè9$&Íï;ü‚;|± œ<&“ÙÑ|÷ ñ8¹ÉÑ»là£È± µK8ãwl¶ž¿û7iª&-”ðbß¶*e­GÁNÜã¬õ~Énýœ™ÛyÆcâ1±ÿv“Ñ/[>‚ãQ:J‹î<óöïUž/މkK°ÎÏ­’‚¤f]ê›Â_§žn,/ÑK'“#Èž'žðr@ýÕî?ˆ™°§Ö¡x„>&BF…îYø,,4$í>£Â½›jGÓl©’­AÄâ [r1KÂ7KF²o›â±’«®§|šçÅc¾ÊÖ¼‚¶t»Y˼d/îš70²}Köøû2^%] endstream endobj 3601 0 obj [ 3600 0 R 3602 0 R 3603 0 R 3604 0 R 3605 0 R 3607 0 R 3609 0 R 3611 0 R 3613 0 R 3614 0 R 3616 0 R 3617 0 R 3619 0 R 3620 0 R 3621 0 R 3622 0 R 3623 0 R 3624 0 R 3625 0 R ] endobj 3599 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 3601 0 R /Contents 3626 0 R >> endobj 3627 0 obj 2455 endobj 3629 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 740.639 298.56 749.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3519 0 R /H /I >> endobj 3631 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 688.139 298.56 697.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3521 0 R /H /I >> endobj 3632 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 571.139 217.905 580.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3507 0 R /H /I >> endobj 3633 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 506.639 217.905 515.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3509 0 R /H /I >> endobj 3634 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 442.139 298.56 451.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3519 0 R /H /I >> endobj 3635 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 329.639 217.905 338.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3636 0 obj << /Type /Annot /Subtype /Link /Rect [ 329.7 251.651 391.62 260.651 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1394 0 R /H /I >> endobj 3637 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 204.752 217.905 213.752 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3638 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 140.252 298.56 149.252 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3639 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 111.752 298.56 120.752 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3502 0 R /H /I >> endobj 3640 0 obj << /Type /Action /S /GoTo /D [3448 0 R /XYZ 72.0 769.889 null] >> endobj 3641 0 obj << /Type /Annot /Subtype /Link /Rect [ 298.56 111.752 313.56 120.752 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3640 0 R /H /I >> endobj 3642 0 obj << /Type /Annot /Subtype /Link /Rect [ 326.89 111.752 341.89 120.752 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3473 0 R /H /I >> endobj 3643 0 obj << /Length 3644 0 R /Filter /FlateDecode >> stream xœí[Û6†ïý+x™…¤Î‹¢À»-v¯z`/Ò\¨¶flÔ–\IN_R$eФž‘c®‡™$cÒ<|JïG‘â_+ ùy ¿’yI’‚õaõG ÆÀxT½‡úÁô£B°'yäX|"¿ziIx þ·*Vü´úð‘¤ÙHò}^ÁÂÛ¢~[ý"ÙÆÏ6ÙÁóê‡ÇÕûC€ x|:Ÿby0ŒÒ4Å$žSúƒÇøðîq›ƒ_ó§ýÖû]^4ïë¼ú”Wß|ÿí•€’Bˆc€¡Rĺ<NÅn5»²ÇªlÊu¹g%üû±wæ|½Ä¶÷KÏD^ÇT$ÿÏgq$†•H¿ê¢Y-½vì÷ ÉP³Êë,ZcÜ0†QìÅ¥iœ¦ä+/éA„SôR8ʾTØQuU¯àGnÊ#ÄnáFˆ0B^9†CS—!Iÿ© ¥¤hä.D¢)ˆy]gÏ9h¾s³¬‹±—ÄóHŠÂë‘$Êž"©oCª\-OšÃlÆýŽxžC7<¦ÃIÑFÀn}I ± Jˆº$‰¢UX¼8ç"9N­f1z䢴¡zû©Z‘}®Ò“¸€hŽ =ˆäê‡}P¨{žÑ¨èvÙÐ81d×ÞwÜÞ]èª`GŠ#…‘Rþ9¦q­ã¤¯yÏ8¥¡Ôlsð ù·±B–ª›¬9ÕÊ£0V y*+šÍ‡ Í•IŸëÓzM\³§Ó~ÿE+Ǽć¢ÄçÆTYQvM“oh&wHðn½=j™ƒHÉ\>MÖd#Ú¡"VœcæÎz©31ŠŒS6†Ì4 eûý9pÖÃc£çÛìÊ÷Óvô=Ï )XçE£ãkƒèDs«¢4¢‡Ã—‡¨¬ŸM/?å G@ ¯ó¦ó˜ý²¨ó½Ùžuk1ïP°…[_d‰•cbÞ‘rϤ˜Ä¼kñ{nñż} 81o/KË‹ù$m'Î5ßõ "š€_ŸªŠ¨ô¶ú8Œ„ò'zZ·o³š™ j·ÿ"\wËNÇtûº<÷y“‹ÉöFÁî£À2o™G ¤-ÿ QËôŸ®pmI3ê­ÆèÒÑ…ÅZí"f|Y3ÒV(µ+éZµ.UÖàsJ ºÜµø]·øë§³‰}'Ž“I1o!%îõ¨v‚´œ˜“ÃAh›sÉ#n¸'Ÿã q*>áWnÖ÷²…;3¦4òå;øùéÓ©]GÇ:ðrx`;ör4é`ÇÂÛda¾ç,^¤;úã@wi( ”•:·3ð=_ õèæ§|:wô:z_¹;š} îpì÷tû5óÇù’ º&_ÊÖÎòÅå> endobj 3644 0 obj 2409 endobj 3646 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 740.639 217.905 749.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3648 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 676.139 347.06 685.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3649 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 664.139 314.68 673.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3650 0 obj << /Type /Action /S /GoTo /D [3445 0 R /XYZ 72.0 702.499 null] >> endobj 3651 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 647.639 217.905 656.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3650 0 R /H /I >> endobj 3652 0 obj << /Type /Annot /Subtype /Link /Rect [ 220.405 647.639 235.405 656.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3473 0 R /H /I >> endobj 3653 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 595.139 217.905 604.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3654 0 obj << /Type /Annot /Subtype /Link /Rect [ 345.164 515.651 411.552 524.651 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1478 0 R /H /I >> endobj 3655 0 obj << /Type /Action /S /GoTo /D [1477 0 R /XYZ 72.0 757.889 null] >> endobj 3656 0 obj << /Type /Annot /Subtype /Link /Rect [ 447.446 515.651 523.274 524.651 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3655 0 R /H /I >> endobj 3657 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 453.002 217.905 462.002 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3658 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 388.502 298.56 397.502 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3659 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 360.002 298.56 369.002 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3502 0 R /H /I >> endobj 3660 0 obj << /Type /Annot /Subtype /Link /Rect [ 314.39 360.002 329.39 369.002 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3473 0 R /H /I >> endobj 3661 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 307.502 217.905 316.502 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3662 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 243.002 217.905 252.002 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3476 0 R /H /I >> endobj 3663 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 190.502 298.56 199.502 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3664 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 126.002 217.905 135.002 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3665 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 97.502 298.56 106.502 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3666 0 obj << /Length 3667 0 R /Filter /FlateDecode >> stream xœíÝoÛ6ÀßýWðq–¤$JŠ+öíiÝì¡íƒb+±1ÛJ%eAþû‘¢d}QN䘕¯iëB‘GÝÒÝ™[PDÄוüæÙ{ž–»Å·\N‘ËÅs‘C°ÍB,ÄlÌ´Cu‘ƒ¶âœê V¼ßjmÅñý³Ø/úmñù«h³BDœ÷¸ g]ý½øTÑ-o ^›¤Aw‹×‹w¿:ˆt}[^bÆ1q¸ïûŒ"[Ì—ºÞ¡Ï?\¯CôWxûóG´ÜnÂ}ú. ãÿÂøÍWtýG­깄æ"F],£Ýîa¿Yé&Ú£û8J£e´U=ür]»r!Ø3íÂ}ª©(Às]“&âŸ-%Õ£üQM‘æ¡¥&Q3Pß;U&-IUá6‹Æ(×!w±K©ï»¾/~„½DÌ·úˆ1fzmXX'k|•ýŸýàŠÉ—y§âÀÉu=l[Ì¿y¤†êäy|ÅúµVýª1Z©»WC\mG9vë£ ‰NŽÑGtÝÔAɳ "éÍ[‰i¶FÎÝ?œß=n½Uv±Ê!s‹TìT¹Þ¥F½ ÖTjkÁm®’­€l‚Ž­V@’†÷Ú%@-‚}ÒË;T ¨:‚ªðS5å³Rp-DŒRìp`º Uü¿&C¾èšÂ ‚h&Ip¢ôé>Ô»u.Þ;Ž$¤¢ï!’ê:p§ÉÕô¤f#žw"òìzà)?\t­ìÜ·$n7AáöD·¤¢ë¦J^\󢕘gkä\Ð;ó¢·®që­2'»W¸é€hŒ5ˆªÃwÇ ¤yêãÎÂé€LèÜœBY1ê´[½ßâá÷¡Ñ’ Æ ¿|!‡¿};8cuÞ5|Æ?êŽýÛç;ÇIÝ—.p¥3¡”®Cô]¹Ã.`UòXmø‰•¤Aú¼•§JöзÑv=†«RróÔêÆ²±g‰g'õ,ÕM ›;žlž†ñn³RÕ…’%i¼Ùßµº±y£›e´OƒÍ^´•çÚ.öêZ½Ün’´<Šn[ŠÑêfîžPÂ#òÚ´Þróš‹IH¦YLE×M”¼€²h%æÙ9ôμè­kÜz«,z(‡JŒÑ¡¶ÊªÃµÊìÞP2 p¢ñÜÁÞ3¶÷±¡ãûäa· â§I"Ã;çò¤ òú>Žn¶áîípr=ܯ¤*rf‰˜Ï&Ú÷†Å—¹À&Í¥`“‰–BÑuS%¯µ¤…k]¼]§‹ ÐRɺ$ŽnÒ^"E«ÚàÃþàøÍ…“u}ôªq¶ÝSÃL±é bÏ j*~È3o¼‡9];g€¡KdH¿©X¸D&ÝocB]AAfÃ×AŒöóUUè”|qç{àkâM8£òÔÜW/b˜á(aµ ¶Ñ]…wY÷j‹–q>!KÖÜÚ)1& ß#Ä÷T•³³°…æ«Õc¯T—òºh.Ší!&&L¸ëûåe ºŒr²:›}Æû`[J~úó÷ò@îøö«R †Ó” ÈåêsFˆÃ™fК¶ºšyB°EÄÿÔw4§— ¬…:Û0)7Qº.ÒêäšUõ®…)·Å6׌‡·«›àÇòôšÎ‡^,ËÇŽ3BÓÚuëÓËrlÛ\¨eQknÃ4Ôh&­ÍíÆéªFå†LðÁfXÉ<[â¾ EÔ¦–ÿ¼NõtÔ½D1¨\4©ÐS5å³.Ÿ‚€ OB€Ð¥Ó#9‚âi€ì9…Ó±°§ÅëÜ·£Ë+zÍÒéÑÉ ýöšÂÕ|ÌÁ眔Œ+šÖ'64Ù¯Ïѽü%ƒÉ×±ÕÓÀá¬9Ô9Ø`òY›|¢ws ¤ê§ÍiêÚiæI/îP==ü^ÍÍSöîQ5ÓJ›âèPA=¼©+ÊŠ³]¹eºx/e¸2:IÙúX{¡è¹ï¸—W>ôšµÑã7ö÷Ç €1øœ€WŸ³Å_¾¯påàdØ•7(p6¤W)n¶|nZh™ .¯6èÜÕÍÀ‚9,œØä…o Ÿ³Å(fg#Þùx‹¢¸YÐnU¯k/\fÀðSãl (Päl&K¹×Ì<*SÎY•ã#çìLn[2ý¸Þ,×ÃùïC’;;™ú*}­+sh弇«—mÛ7-z¼ØwyŒÜèÒÿù€9øœ“’‘Ÿ° ÒàÃØÍ+ÀÖ¬ÙÒ¹ï`òY›|¢Œ·”Àæ3A2dó ÷]+•×Çl]Q Oö¸ƒ³½+ÅoÿÞ¾"/A¶ñE~&@O$àPã¶„]l¸{î¼=°` çL}Pªß»”{è€É¬1Ñyè`òY›|º» @‚ÝL–f`w87-X½ØHÔÈ{ÿ§f>æàsJtN5X|Î?Ó[*…ûp\ƒ v)»™ Íý“u©ÏhW4ÐJµ¿ž3“‡m_®ËMŽf-°\pyF–Œö<àc>ç¤dà“Yc¢óïÁä³6ùDþ½”@ɨ™ ½JÉ(wŒÛЕ ¬¦[‚ç²–wT5y&Ê}ÒüÇ£\RëX*c÷{¤`Áº§·”ÎÁƒ«~ê«~Þt-ظTæYªË¥*-u±¶ü>³–yòëf{›. endstream endobj 3647 0 obj [ 3646 0 R 3648 0 R 3649 0 R 3651 0 R 3652 0 R 3653 0 R 3654 0 R 3656 0 R 3657 0 R 3658 0 R 3659 0 R 3660 0 R 3661 0 R 3662 0 R 3663 0 R 3664 0 R 3665 0 R ] endobj 3645 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 3647 0 R /Contents 3666 0 R >> endobj 3667 0 obj 2168 endobj 3669 0 obj << /Type /Action /S /GoTo /D [3293 0 R /XYZ 72.0 230.465 null] >> endobj 3670 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 714.139 298.56 723.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3669 0 R /H /I >> endobj 3672 0 obj << /Type /Annot /Subtype /Link /Rect [ 314.39 714.139 329.39 723.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3473 0 R /H /I >> endobj 3673 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 661.639 217.905 670.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3674 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 633.139 298.56 642.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3675 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 556.639 217.905 565.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3676 0 obj << /Type /Annot /Subtype /Link /Rect [ 331.36 480.037 396.06 489.037 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1755 0 R /H /I >> endobj 3677 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 436.605 217.905 445.605 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3678 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 372.105 298.56 381.105 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3679 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 307.605 298.56 316.605 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3502 0 R /H /I >> endobj 3680 0 obj << /Type /Annot /Subtype /Link /Rect [ 314.39 307.605 329.39 316.605 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3473 0 R /H /I >> endobj 3681 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 255.105 217.905 264.105 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3682 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 226.605 298.56 235.605 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3683 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 150.105 217.905 159.105 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3684 0 obj << /Type /Annot /Subtype /Link /Rect [ 338.57 73.503 410.49 82.503 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2296 0 R /H /I >> endobj 3685 0 obj << /Length 3686 0 R /Filter /FlateDecode >> stream xœíœÝoÛ6ÀßýWð±–¢D‘*†+öíiÝì¡íƒc+‰1[JmeEþûQeQõWŽYûÚ¦¶’wâý$Ý‘Ô}™yˆÈ¿Wù‡<,D„›ÙUî!N‘ª"Fp@!>¢¦ mP³ˆ¡µl£¡Õ7ùѨ+ïÑ?³dFÐo³Ÿe%"²Ý×éè¼èêïÙM7UA~wI?‚îfï¯goeÈ#èú¶bbÂÂ(Ѝ‡öi”ÿ¡èzƒ>¾º¾Ñ_ñíÏïÑb½Š“ìí.Þþo_F×4zð'„PŽ(1ºX¤›Íc²Z̳Uš ‡mš¥‹t]öðËucä|B°pmà>4T”àqÎ11”?öË2YRö˜ÿª¡ˆyXJi””gP~vªLZ]á6‹Î(×aÈ1÷¼(âQ$…E"±>bœ9½6,´É +*_ÿ¿¸¢ùWÕ©<`…¢\à€òüÍ£R”,ð˜*ȯh¿Öe¿¥ŒVgåÝË(Öëy!æM©²Ä¦F‡ô]›:”åÅ€äôªZò4[’UA÷‰ïÛwËmÖ*«©,¢ÙIïZ£^HëT×7¯R\Å ² ¼vYü`½<Ÿàˆô2EªžAÕ7ð£›ò`„ÊG¸"êy˜…À04tÒü?“¡HvíÁ ‚hïvó»eO±Ý­ã >ޤ¤ªï!’š:„ÌäjzÒ³Ï;yv=ðJ?\vmìÔ·$Ú…NuK¢¬Ð†ÝhÍJK2a@Úb…ZXÑdê"±ÆMDcth@¤‹·yÏ@‚+$ÙàÊÓ{_н•W ¿ƒ+ßÑ9{7}ɺ@˜‰î‰f‚„1»¼H“l¾JVÉz-kDT>"Ыì>6Ö9H¾ºa6ÝlæÉmãÝãºÏÕ h®›C<ªFMضªkS‡²¼2ZUKžgK²*è=óª·.¹ÍZ…wY‹ájŽÑ¡A¡.Þæj ®pdƒ+Wì}Æöî{Ì´V1=Ï3ž(¹cjÖzƒÒ-2êùZ¥VA¼Þ Y,I‰·ÛÔ>y¯¼fçPéòš5v€¦Ñ$äÜ_¦ÂÕliÇj’¿íBS£›]6ÏwEË0ðsÏûëýjqßjèXø„OøJ~¼Ý¬’yïJ·ó.·=¦;©Ü*Mzüõˆ9?V‘”h‡bªàPt‡¢Š:84%«‚þàP´‚CÑÆ\“©‹35h Ê7/Ñ¢ëg_Ÿö׫(˜Ã*zUSñC¼ÅLËC—É-È.“… Ã÷ê ? ¾ b^?_ºBÇä+dß_‡$¾ dÓ8Yª@Ø"‚VL²\Í×éÆ{ž%5·ê„ü<'K`œ },#‘£]æuñ±)Ž0ZÆëXÆ57eŸùÀXF%ˆ ŽC!¯¦PuŽ¢U"C£d¾F?ýù;Ú‡+EW–wE=á07¹YúkjbÑ‹˜4¡l0ÏÒ^ÊßÊðè!M–;”¥æVN*…û²µ`>³´ÞÆ·Ë›ù;c<ê 4À$—Ís¥ÕïMb†Y>ñ1—Õ éŒ«¯K¿LÒ™éÎôE!Óƒ L}=º)h8Ý }c²@š"ÕÌHŽ Ù @vH¢ŸÊ+^§¾…‰ILt;ªº6u(Ë«¯jÉólIV½g^õÖ%·Y«p­k‘#4ÆèÐ@H?þÕÀ~WðqŸSR2nMÇÔe:ècúgeÞ}Þn£>ò'ô$9D?ÀoTQ÷@¢n²tÖùCñ\ ‡UÁååæzÉ ¢e|ÜÁç”” ¼¤ ˜œ5&6OL~Ö&Ÿh6ÞAJ {¨› ½HæP&ýÇÂBUpy¹µ^2uèDiCwð9%6Ï,~Î?펀 àáC»G ¤ u$ØÑòRéBCºت§r±]@¾Ð‰r…PšÜoª9xèB²EÃ…Â0QÌá ?'Ô”ã.\ߎÐPƾçÒ7Ós„ÊsUI1“4‹‡Ò„†Q ïÇ!!~@§HÚîÏÔÅ¢%G<J-= % eèš·æ¾­u‘(tñ®5&õ~O_^+BªO¨oi5Ë|˜ýµ/Ñd endstream endobj 3671 0 obj [ 3670 0 R 3672 0 R 3673 0 R 3674 0 R 3675 0 R 3676 0 R 3677 0 R 3678 0 R 3679 0 R 3680 0 R 3681 0 R 3682 0 R 3683 0 R 3684 0 R ] endobj 3668 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 3671 0 R /Contents 3685 0 R >> endobj 3686 0 obj 2087 endobj 3688 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 740.639 217.905 749.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3690 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 640.139 298.56 649.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3691 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 611.639 298.56 620.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3669 0 R /H /I >> endobj 3692 0 obj << /Type /Annot /Subtype /Link /Rect [ 301.06 611.639 316.06 620.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3473 0 R /H /I >> endobj 3693 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 559.139 217.905 568.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3694 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 494.639 357.62 503.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3695 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 442.139 298.56 451.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3486 0 R /H /I >> endobj 3696 0 obj << /Type /Action /S /GoTo /D [3454 0 R /XYZ 72.0 129.684 null] >> endobj 3697 0 obj << /Type /Annot /Subtype /Link /Rect [ 303.56 442.139 318.56 451.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3696 0 R /H /I >> endobj 3698 0 obj << /Type /Annot /Subtype /Link /Rect [ 323.56 442.139 338.56 451.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3473 0 R /H /I >> endobj 3699 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 389.639 217.905 398.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3700 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 361.139 347.06 370.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3701 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 349.139 314.68 358.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3702 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 308.639 217.905 317.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3703 0 obj << /Type /Annot /Subtype /Link /Rect [ 332.45 231.935 398.25 240.935 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1801 0 R /H /I >> endobj 3704 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 188.25 217.905 197.25 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3705 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 87.75 298.56 96.75 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3706 0 obj << /Length 3707 0 R /Filter /FlateDecode >> stream xœí[oÛ6€ßý+ø˜JR¤.CQ`E¶!{Ú%ÀÚ>(±’³¥TRäßÔÅ¢HêâDŽY›MÛHǼ’Ÿ¤sèCñûÈ~Îù¯€ 'Bp³Y|¯åø¸^-¢Ð!˜BèLLÁtE¬Yñ7GìW'-;¿ÿ,’¿-¾|ci–²|O ØSxYÔß‹?ÝêìØ$ý ¸[|¾Z|ø•ÁÕmÛÅØs õÂ0ÄŽ‹Cþƒ« ørvuƒ¿âÛ‹Ïàf½Š“âCgÿÅÙ»oàê÷N (ð!„ØJEܤ›Íc²º‰ŠUš€‡,-Ò›t]•ðËU§ç\À´Žû³£"Ï÷}Ê@²Äq+“T%ò:ŠÈ§U-IÕ‚êw¯ÊPÑŠ «,£\?†žïø…¡†ì#'è@„Coˆcš§Â‚»œÐ2ñyùùÁ9æ‡u¡ì„–ŠúC aí—Ϫª˜ÑZÀÏÏñ°ÖU¹UJaÕÝK‹éçøÝZ™D§FO튖u¨äe‡pzëT¬™J͵ ¿áÛüýõvS•ÕVYˆ0NB· *•¦t®_¾`y” ¤¤ºò"~Ð^È…N™Âû‚ [ªv êüˆCùb„ªG¸"ŒC=Ëehì6$Ø2C!+Ù‘…h ¢MœçÑ] Šç‡XoÖùØ üi$yt$5e‘ÔÕÁ£2Wó“f1›ð¼cžg߯²ÃYÑZÀ~KbnL „sÝ”šÂ\ª¶ýޤユÔÞH†‘iJì­]JWÙÞmÅŽ€POSé%ªÐïBÕ Eƒ¸¥É<šÏ „Pš.CTMµŒ×q'iK‰!ÀXJû%}àsiù7ðœSD™Îg¯Ÿ‹8ÿ¤dv‰¸L¸Uæ¯_áöï+`a>˜u&¼üüîdé¿CƺqÌtwÁ. ²\ÀUqó'™O±ãF™pR{ŠãÏļˆŠÇü=ÏŠpÀíÆ³Ût½NŸâåø3ñú™çsaà`ÐhÓœÅÙf•D…¦âIÅDËåcgenþ¥%jVHYób•ܕʣ Ï™Ñ*aR%³¥ÌµÆlÊ>K7ו$½U a]$÷³x&B|Þð,þþ¸Ê⥠*R¥˜PîʼH3æØ3./Àz•ÎûU¹vÝ3jäÛ“Ìs7hŠ–u¨äÍÅÔ¤bíTj®ƒ-oJë«·›ªô³Ú*'8]StèÜÄêwº9àa—Ëd A{Eç–Ø?â™cÝó=„EÅ¢2Ís1”>×E Dzt –æóV†,cB ó¦koh·ZŠgâ­)ZÖ¡’7ãÖ¤bíTj®ƒ-oJë«·›ª4†Û*'XÆStè€(V¯5q- ¦ °çoL\;àG<à»}߈ЄœÆw4©¨ÿörk.[ì,v*q–¥ú¯Æb6Ž•>‹Y€Çât œj‹ˆÏ"—p ç;ÍeN¸|zýé~us?>½¿Ã/3£Ðç÷G®Õø”~Δ[¥É¥ú†9µÀ#2癉ó¦hY‡JÞðÒ¤bíTj®ƒ-oJë«·›ª4ÎÛ*'XêStè\bõ;]îð¶%È‚ Ê´X¡—çü«55ÚG¹gNŽö± 1ƒZsߎøøœ³ãÆÒgë äX–ÄÒܱ<wšHžVrý{µ3`á±ðLrÌÅNü›Ë’iÎ ùÚã³,~H³BD×é£x>é«jňnʵxƼ‹ˆaôÉ^‡Žå±(ƒÂÛXåvÀyÀw[ÈÉ„ïvÞËÁùòèÀ×ÌÞ€‹ÏZ‡¥´]|»â,WÑ:½xgIÂRfuƒ\¾í.‘šDÙ“5„„4ðê¸G×qì09¨B泸^$Ë»FÓ/$Ôe>tà†¡Gƒv#êUÂ2'ÑüüÇ%¨Ý“:ÆQ³!¢¡ãñAwCMy’*5øZ€€²ñ&?«?Ëâü!M–9(R%jÓc}Å2#Œu¹Y½Ë뛟äiÃ9q¹™†š±}›¾ìcQ† rC»©°±Ûá½Í¦Âóm(> endobj 3707 0 obj 2243 endobj 3709 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 740.639 298.56 749.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3473 0 R /H /I >> endobj 3711 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 688.139 217.905 697.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3712 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 623.639 357.62 632.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3713 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 571.139 298.56 580.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3486 0 R /H /I >> endobj 3714 0 obj << /Type /Annot /Subtype /Link /Rect [ 303.56 571.139 318.56 580.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3696 0 R /H /I >> endobj 3715 0 obj << /Type /Annot /Subtype /Link /Rect [ 323.56 571.139 338.56 580.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3473 0 R /H /I >> endobj 3716 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 518.639 217.905 527.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3717 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 490.139 347.06 499.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3718 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 478.139 314.68 487.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3719 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 437.639 217.905 446.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3720 0 obj << /Type /Annot /Subtype /Link /Rect [ 339.68 361.579 413.27 370.579 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1505 0 R /H /I >> endobj 3721 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 319.502 217.905 328.502 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3722 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 255.002 298.56 264.002 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3723 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 190.502 298.56 199.502 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3502 0 R /H /I >> endobj 3724 0 obj << /Type /Action /S /GoTo /D [3448 0 R /XYZ 72.0 432.939 null] >> endobj 3725 0 obj << /Type /Annot /Subtype /Link /Rect [ 303.56 190.502 318.56 199.502 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3724 0 R /H /I >> endobj 3726 0 obj << /Type /Annot /Subtype /Link /Rect [ 334.39 190.502 349.39 199.502 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3473 0 R /H /I >> endobj 3727 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 138.002 217.905 147.002 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3728 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 109.502 298.56 118.502 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3729 0 obj << /Length 3730 0 R /Filter /FlateDecode >> stream xœíÝoÛ6ÀßýWð±–¤¨¯¡(°¢ÛÐ=í#ÀÚ>(¶’³­TRÖÃþ÷‘eKõaWŽ9ûÚn±.ÔñÈûIº£éó—EDü½’?Nq„h¾ž}QrŠ|†O‰\‚9s q㘹hš"­Ä9õ¬z%~4ÚŠã{ôÇl3#è§ÙÇÏ¢ÍqÞ×éP^¨ú}ökÍ6Õ@¼¶É>‚îfï®g¯t%èúv7ÅÌÃÄõÂ0dØa¡üÃÐõ}|q}£ßâÛ÷ïÐ|µŒ7ùë,NÿŠÓ—ŸÑõÏ 4ð !ÌGŒh*æÉzý¸YΣ|™lÐCšäÉ…wGÉmK¡è­©0oã4ÞÌcôá}Ö·Zï8–å×›áо} tí5r€¥±4ÝŠ~_dìy–å‘›$Z»ûÅëŒ [:(¦~Æß{÷Kö¸^GéÓ$‘¨j P[ ¬‚ÛËÒÔ[dX Mßn’^÷¾y’çž³]öV¯eM™hÓÖÐþŒly³í èZ–c*':ïœLÄ{¥Z·¡”7ZÒ*¼®^ UÕébZ&ñ¡)qM½öuPµjt>åö¯_…ê½/ sÔ*ĦÆ0ŦƒŠ@ÕTüï®ËâÀÐe2dŠï…ËdaÂÈß>„º"ÿ‡σíç«nÐ1ùòÜÿ_g£òTµ-e'0íoo%‹e´Jîj¼Ë‚ð\´LÕ€YŒžkCrdþpByª}v0ÔaTn™Ïò§•ê_NŽafx ¦ÐÔ s¸çî¾ a¹Éãt­Ð÷¿|@*AQ» …2©bOºÝ úZƘ¾0‚pL5+m„4³‡d³ÈPž´¶nz>ö|éÏ4 4¾]ÜDßµge·«“S̼0 BB ðÖ9zÂÅ™ KÜ‘ î¾­cŸ§îþt5÷{‰bÇBê[â¦Ëcêè©»ò €†+îA@Pï-h¸Þ> õ!4¶ÚþHŽ Þ>@vH­}îøØ1âuêÛÑåÅz΢ £Ó|óGî¶¡6àc >§¤d\9ÐîÕÃÚÐ?i|ÿýðïØÂ €âY£hŒ±Áåçìò‰Þê°( j'H–ìprHY´´¦:Ú[ïÇü mú¬Þ›Èòm¡QcªàÚ‘‰ÂÝRùîYoªøØƒÏ±ã³2"ŸµÇ§þ®ˆýÊ€\×pìo!%ûÛ ’m@§þJ2Š; †væiœ=®úÞ?p=϶äZ .ïóA§® ,ØÃ‘]^EøàñsöøõBõ"Ÿ× eŽ^zÔ\/4Iumâ´}ˆí];H’GµøÌ´,÷w ÓÀ¶ÌZ .¯ÒÖsÖꛄkð9%%ŸzLÎS$.?k—Oõm¿öQµ@íéYê€zܺMfU‚Dô> endobj 3730 0 obj 2161 endobj 3732 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 714.139 217.905 723.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3734 0 obj << /Type /Action /S /GoTo /D [1703 0 R /XYZ 72.0 699.917 null] >> endobj 3735 0 obj << /Type /Annot /Subtype /Link /Rect [ 381.951 639.757 433.943 648.757 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3734 0 R /H /I >> endobj 3736 0 obj << /Type /Action /S /GoTo /D [1703 0 R /XYZ 120.0 612.589 null] >> endobj 3737 0 obj << /Type /Annot /Subtype /Link /Rect [ 438.455 639.757 490.447 648.757 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3736 0 R /H /I >> endobj 3738 0 obj << /Type /Action /S /GoTo /D [1703 0 R /XYZ 120.0 578.617 null] >> endobj 3739 0 obj << /Type /Annot /Subtype /Link /Rect [ 494.959 639.757 523.279 648.757 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3738 0 R /H /I >> endobj 3740 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 627.757 140.55 636.757 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3738 0 R /H /I >> endobj 3741 0 obj << /Type /Action /S /GoTo /D [1709 0 R /XYZ 72.0 382.334 null] >> endobj 3742 0 obj << /Type /Annot /Subtype /Link /Rect [ 145.55 627.757 200.81 636.757 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3741 0 R /H /I >> endobj 3743 0 obj << /Type /Annot /Subtype /Link /Rect [ 205.81 627.757 256.63 636.757 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3270 0 R /H /I >> endobj 3744 0 obj << /Type /Annot /Subtype /Link /Rect [ 261.63 627.757 310.78 636.757 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3272 0 R /H /I >> endobj 3745 0 obj << /Type /Annot /Subtype /Link /Rect [ 315.78 627.757 366.6 636.757 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3274 0 R /H /I >> endobj 3746 0 obj << /Type /Annot /Subtype /Link /Rect [ 371.6 627.757 422.42 636.757 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3276 0 R /H /I >> endobj 3747 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 588.443 217.905 597.443 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3748 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 535.943 298.56 544.943 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3749 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 471.443 298.56 480.443 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3486 0 R /H /I >> endobj 3750 0 obj << /Type /Action /S /GoTo /D [3445 0 R /XYZ 72.0 601.414 null] >> endobj 3751 0 obj << /Type /Annot /Subtype /Link /Rect [ 306.168 471.443 321.168 480.443 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3750 0 R /H /I >> endobj 3752 0 obj << /Type /Annot /Subtype /Link /Rect [ 328.776 471.443 343.776 480.443 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3724 0 R /H /I >> endobj 3753 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 459.443 298.56 468.443 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3473 0 R /H /I >> endobj 3754 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 418.943 217.905 427.943 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3755 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 390.443 298.56 399.443 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3756 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 313.943 217.905 322.943 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3757 0 obj << /Type /Annot /Subtype /Link /Rect [ 324.595 239.561 353.475 248.561 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2388 0 R /H /I >> endobj 3758 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 188.247 217.905 197.247 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3759 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 123.747 298.56 132.747 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3760 0 obj << /Length 3761 0 R /Filter /FlateDecode >> stream xœí[oÜ6€ßý+ôè‰Ê«H- ´èn±‹èÅÀHò0¶e{’™‘;’køß—©EQÛš 3ÃÜ$ÑÏ!ùI:G<:ùó F@ü~'7œÀ˜ó4ºZŸý©ËaÄP„]DALGˆÄˆFë¨]D£•8ÇÜAõžØ´êŠã»èÿg›3ýtöᓨsqÞãèi¼jê³ß Ýt±ï“~ º=ûáâì»ÿЂèâ¦b”Ä€&iš"ñ£TþBÑÅ:úp~q—E¿g7?þ]­–Ù¦ü®È¶eÛ7Ÿ¢‹ÿµZ€œ‹°š¸Ê×ë‡ÍòjQ.óMt¿ÍËü*_©þ}Ñ9 @Ì}¸ßZ* ðc1°IŒU™(Q-ʵ±•”V‰êÚöª :Sá.‹Þ(×aÂbaš²4?Šy "”ò!b¼é^Ôæ„V•ßUÿV?x‡ä®nTÐJQÆcˆè¿}¤D‰Hu<~‡†µVí*ÆÔÝË*6ëÁ$fm©¢Ä¥Fô MÛ:¨òj@$½º–èfG².èïøîü~¹íZÕ`5"õŒódŒw£Ñ  Ó•ÖµÀìkTW@ÕAJÔP”Ù½ó€Ä)d í *¨zU¯àÇœÊ#¤áNˆ„1MC¡±ÛaÿÙ ¥¢inD¢1ˆÖYQ,n³¨|ºÏÜfC1gÓHJèþHªÛ#©­CBm®æ'-`6áy'<Ͼž²ÃEÓNÀ}KBPÐ\·$Ôà jÍjXéHF&uXAV ™¦ÈØà¦¢):´ 2Å»¬ç@‚/$ìyµ¥æûTæ[[¥aÂOdµíèÝ|·mɦÀ 1ý/šAÄ­·ËÒP\l®£7âÇ0MEóçÛ¬xX•Ö:«íS‹qêöiÀÆ$H*刺€›2f¢¬nÚÖA•·jÂÚâ«÷äˆ~•Èø{n‡Ð¥¯®Õ>nxŽÊ·™¬š²³ÞA_õ¤& …æc ½ª¹ðÓni‚CozB'‰Ë2(œ$ Ϻ›ä_†ÞÓzGPŸ­]Má×! ãe*´O¼ú-àUÞeÒøfT€ ØŒ½Vеđm‰—‹ò¡x+OÅÊS³Íõrsk1v0‰9Kȱjçz¹Xå·î2䃈š[Ý!,ÃMH§K4F„Ê(ªCVpŒcCG·Y¹xx+7ÙuµYÕæËcµùœ«ÍÚ@µAJ9ŽŽA$<‚ˆÅi¢#fêh­B$Nt¾Ü”Ùv³Xí ¾ÿõ¿»}íòFÁVø<÷yå©¢2ovïšvÕ2rKÖcÆ))çŒ9tÞf7×—WÿØ]•ÝDã”ˆÙÆ0q4ñ¶Wt’ÄD\<¡Eg×VŠ«—$i RW½¢‰à3¥)€„§ý¢í“Ĥb1Z €&šë «bÂc*XX¾¹îœ!”jWgx¨z= Ö™‰Îq‘1ùÎt\Äx¨¾!êsnŸÊIœÈ+‘p×0tEñt¨¾)êÆŽWÄ}üvÍõ@á1Sè§ S~ÄS>Ó ‡”ô- ØÒÌK€q©öùM¾ZåeǺßåSµRxŒêõ®ÝQ¶]/7‹îêˆHb5SÇårs;`ø#züÊCß@bsŸ™¸¯›¶uPå5?u-ÑÏŽd]0Øóºµ>¹íZ•­ßˆœ`øOÑ¡uA˜â'_hÐðøøƒÏ(qÙaÆzÆgvõþy½(ÿwà´9à p›óRÒgÎØÒÜæ|"íðÚ˜oJ.ŸÆ û…¬N-C¾)+ÊíÎR6ì7åb¹Ñ…0EPú®BÑ®Û'0?*r;œúæ/Ÿ¬3ü5Wœ~`Áö<åµ…fü˜g|ºçÈ ¿z.¢8‚Å“4U¼ª«qnGŽ2Q›‹ÇƒÏ’B¨tDÕÄ!Û]MôÖ6…ävrQ‡aÀ{UtçÍ„ )\H‚“l»ÍÝQbµCã(a}ÂO–´Cƒ8”NCE–qüLŸFÝï–ÄãÝòên܋ٹ.…r?ës?:žK!”[替‹g€g޽.@܆\”ÌyÝt'7«kÉ|¶d]0œ ƒÛ·å¶kU®F#r‚ß1E‡ý¦øÉôãÁň€?ø’’‘œ“£ÆÄe‰‡)?ê)Ÿi]ÁCJz³u5ØÒ|ë Cæ°ünÜ/uë|»ÁæúFˆõ|¾ÁZŸR°æóŽd6á› Öù|ƒ9>ß0dš"'˜ÃSthQÈìï:¦PH†Íá€7øì—efü˜gü°±9®×Ú?Júlh›Ò@ ±9ŽØœñÜ¿ ØïÕÇsÿä›c« ¼J®xÙçÊü€š:ºl³åý &@.Ï"Àp¢0Ì•÷×?~Bæ_[Ž¿p}ûY)ñc€”îUÖ_Reý½\^Žeñ¥HN0ãÿ\—#¬$¾ºDeñÕ†÷¢ ”8Gv"˜WæKÅ”8„šÊ:•ÉVÆ*H´{¶¡oÑì?™¡™ú¾Zí—fíàUÏ•R! !‡¨*j­is‡1a´Ê›:¤^™ç+ó¨ÙßfÂ×ÌþÊ̱Ϳ˜øã§_~nŽZ£þþ—Ÿ»©|©¸(Úz½WËüv»¸¿[fEJVJ%A(¤dõ6©Ø·–’u(´/¤^cžS¯ ÇœÊ=¥d ‚oAã)YB¡!„¦¦dÈQHÉ {IJVšˆ™râuèÛÑé¥0ð23ÓpJÖ€?ø’’É)Y»o3æÈÉ0Þ9ÿxþùa}?îY”yD>¾1.=ùûoÍ þü endstream endobj 3733 0 obj [ 3732 0 R 3735 0 R 3737 0 R 3739 0 R 3740 0 R 3742 0 R 3743 0 R 3744 0 R 3745 0 R 3746 0 R 3747 0 R 3748 0 R 3749 0 R 3751 0 R 3752 0 R 3753 0 R 3754 0 R 3755 0 R 3756 0 R 3757 0 R 3758 0 R 3759 0 R ] endobj 3731 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 3733 0 R /Contents 3760 0 R >> endobj 3761 0 obj 2531 endobj 3763 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 740.639 298.56 749.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3507 0 R /H /I >> endobj 3765 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 688.139 298.56 697.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3502 0 R /H /I >> endobj 3766 0 obj << /Type /Annot /Subtype /Link /Rect [ 303.112 688.139 318.112 697.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3486 0 R /H /I >> endobj 3767 0 obj << /Type /Action /S /GoTo /D [3448 0 R /XYZ 72.0 197.074 null] >> endobj 3768 0 obj << /Type /Annot /Subtype /Link /Rect [ 322.664 688.139 337.664 697.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3767 0 R /H /I >> endobj 3769 0 obj << /Type /Annot /Subtype /Link /Rect [ 342.216 688.139 357.216 697.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3500 0 R /H /I >> endobj 3770 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 676.139 298.56 685.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3473 0 R /H /I >> endobj 3771 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 647.639 217.905 656.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3772 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 619.139 298.56 628.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3773 0 obj << /Type /Action /S /GoTo /D [3448 0 R /XYZ 72.0 163.379 null] >> endobj 3774 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 590.639 298.56 599.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3773 0 R /H /I >> endobj 3775 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 550.139 217.905 559.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3776 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 461.639 217.905 470.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3507 0 R /H /I >> endobj 3777 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 397.139 217.905 406.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3509 0 R /H /I >> endobj 3778 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 332.639 217.905 341.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3514 0 R /H /I >> endobj 3779 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 256.139 298.56 265.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3473 0 R /H /I >> endobj 3780 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 227.639 298.56 236.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3473 0 R /H /I >> endobj 3781 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 146.639 298.56 155.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3519 0 R /H /I >> endobj 3782 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 94.139 298.56 103.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3521 0 R /H /I >> endobj 3783 0 obj << /Length 3784 0 R /Filter /FlateDecode >> stream xœí]s£6†ïý+t™iX!‚™½ØéÇLïÚf¦í^‡$žÚàœLþ}’l‰oñZCÎî¶±ùÁy0ïƒüïÂG˜ÿ½­Ä¡ïÅq‚–›Å¿²ßGŒ  ’]{!¡ˆ„¡hƒÌ.ŠÖü=ú ¢^ñÆXÞ~F.òF¿,þúÊÇ< Ìß÷ºÀÆS,~Óæ&ð×.Í£§Å—»ÅÇŸ)ò1º{<îby˜FI’Å^@’úAwô×ÍÝs†~Ïü‚–ëU–WËl÷’í>|Ew¿ü˜aŒ C·L,‹ÍfŸ¯–iµ*r´ÝU±,ÖÂÂOwÆž 0öb×vÜoÆ9xŒ1·äÿ…^ úx°XÿʘH»)¼=b ÄÏÁ)ãÎŒ±>á.‹ÎLnÈyÌ÷“„% ÿ•ñ†g6¯ 19¡ÍàÛæÿÍ/nIýRå ÚL”Å^ˆC¾ýí–pÅ;|*;êö-±ÏZØ>:ÆÄ§W«[çG3½òž¾i xaº=Ñßìš^9ŠofdzìÞðÃû‡ýš£šut)#¢ÅIÛßÇY'€;›b ¬},àæh6†â(«lÛ{øöleŠ\ *TAÕÿàGå7#$Ná½ß÷h C§>†4ý×f(á¦}ø ˆNA´ÉÊ2}ÊPõ¶Íúe#^ÌÆ‘ÑË‘¤lŸ"ÉœCDÛ\MO`6â|Ç3Ï¡žÐáÜt/`×þH¢¤ %}$)Óí9ˆ~µÏÕ(¾ϲúåÊÚ_sT#².=›ˆÆÌÁ€Hwß§žWH¸pÀ¥Ò…xÏ8ÞÙp÷ÒRˆ‰UÎ)@Š ¥øÇ&VãÄ¯Ç @éJ(UÏú€nYmq°´†LŽZ·X0"¤e£¬Òj_þÀß$©ß˜æ«üéÐæ>:F‚ЋŒ±ÊÈÛº™ ÏG7å6[jÍ×Õz­5ï»èe±Ú¥y¹YUUö`QÞQ\ï9‡ŽÙâö¡â‰eº=ѯR£øvv<‡#¶\YòkŽjÄöÑåå=fÆ1¢»ïSÞ@‚+$\8àRyC¼gï³N‚D)ïàZn·GÕ'¸Ÿ¶ÐM{pâQJø©÷¼‹à°5œŸú(õ“$öÃ3œðS©ÃÚIß]éÐo §¡eø Zk3ʧF‚î»n;aeø§…C¬,d¶¢ eΤôÞR€ˆÏ8âSÞSp”!}­‘,]‰¥én*Ø”qÀKùÞ-oÎ*ãЮŒ Wº´Þ‘>ã€O“ )e ¨*£”±s €2v—¥ï£Œ#×*ÀÞíŽk×´ ΠpáˆÊÉ!àó øyU-á©zr@PW^á+P_á.NÓ×Wøõ{)ºy\å«òyºò ‚#Dz7ÙwR³xªÔ,HÍb#MŠ©YÇs<"_Š;©YÜ“ši>u—#¤ò˜94Çßš³QëEd È‚® ÊᚢµŒøÓý[••ŸOüýý7>ü³•ms&°O¹CÄçñ /N»Êl×È–®ÄҴς֚4š½X¯‹Wõ¦M²ß¿Õï‹V§ ©öZÕU÷é<öYV;ñðé-eõÔ²¼¨Œž¾çQiÜ2“ï7÷Y“¶Pþ;>‡âQk4çðކ;9HZ5»ÇTzÖ›ú:hš¾ÛL3¯i^•¨*z¤Õ–Ñ$Ô±L]vDaûxŽÂ‰Žgeº=Ñ¯Ž 5Šogdzì°n¹²6ä×Õ$1G—#2š1s0tÝ}oj(¸‚Â">ÍÚ"2…RfLJo ŸqħL!œe(…ÐÈ–®Ä’¸~ e Z^»bM#Ò7)ÙIRçJH‹V*ׂii•žN-žÓ‘܈%iî³,ך%—áÝçÕ;©E–?ÈYEI¤éyÙZÅötbQ¼ð´¢Þ‚zâeVÙ*yš8–¿¿Û#ëÚbPp…kȆ¸ÿ¹)æ”9“Ò'æ!âsŽø„bÞ=P@Ì»ËÒôb>N|± ¤Pó‡æˆõ!—ûÝŽ«ôÆ=£‘Rþ\@ŸÖíÏi)¦úõ¼•øWí²ï"|G·/‹ÍvUÙúÍ"ØCñ…]`²ƒuVügS}·XôŸ ð³ã¢ÿÏlÄJü¬³è?ëYô_ó©»!ØÇÌÁ8¬t÷}‚Pp… DüLÁ>°Îì@ÊœIéìñ9G|ÚÒ{÷XÒì<€Ó•pš^³SLÄ¥n¡ÙÍl7Bµ¿ å] }&Kzäëí®¸_g›Óâ}—¥êª{è«õäµÖ*ßîGÈ÷:YhÊ’"Òi×òÉ`UP§ §ä;tUä– €bìXŠ-;ÞßÃÞÎ.KYŸ(‚œ!è ôèøœ>é²4€  2êJ¿{ À²4î²ô]–¥¡Äµ5DeÇû{@üÚËÒ Î páˆ+‰ ŸqÀÏ:לúÒ@P{mÜ=V`Ywqš~Yš€øæµdÙ1îOO_KŽ\+×z·ì~OÅ|ÔÌ~-r… kƒò©¾öÙV‡°Ì–^­ Ÿqħ¼œì( ´ÝeI¡$¤Y´q»Ë^VžT•Ó6qæy±Ï—Ù7 Þ-b9-§‹Çæ‰J¤-ÍÒ+ª#;–3ÊŽúz»é–’‰8U¦Ûsý*ÞjßÎŽgÙaÝremȯ9ªÑÑG—#Dõ˜9ëîÏ»FeÕ@3]”a ŸsÀÏ,åïÿ¶ÝÃWÖ*€ÊEí(CŠZ#XºKJQ˜+4TklM÷£¸ÞàøPŒ-_—ûå2+ËÇýºG£wWV—«VJ¿ …N_>ïóN—sK™nèq,×TE<í':ßJ½4dTÕ]ªŒ9òF‹drï^± Ñ0¢qÙ½®'ìô ïô3Eߨ…ÝåÄI–vWr@p „“ îÅk°ìö¯wQUùê›5²-oõ‘Vbk±º³Z#Zo銧þûL ,6 endstream endobj 3764 0 obj [ 3763 0 R 3765 0 R 3766 0 R 3768 0 R 3769 0 R 3770 0 R 3771 0 R 3772 0 R 3774 0 R 3775 0 R 3776 0 R 3777 0 R 3778 0 R 3779 0 R 3780 0 R 3781 0 R 3782 0 R ] endobj 3762 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 3764 0 R /Contents 3783 0 R >> endobj 3784 0 obj 2390 endobj 3786 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 678.139 217.905 687.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3788 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 649.639 298.56 658.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3509 0 R /H /I >> endobj 3789 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 597.139 298.56 606.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3507 0 R /H /I >> endobj 3790 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 568.639 217.905 577.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3791 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 540.139 298.56 549.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3792 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 475.639 217.905 484.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3793 0 obj << /Type /Annot /Subtype /Link /Rect [ 326.35 403.727 386.61 412.727 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1824 0 R /H /I >> endobj 3794 0 obj << /Type /Action /S /GoTo /D [2254 0 R /XYZ 72.0 564.101 null] >> endobj 3795 0 obj << /Type /Annot /Subtype /Link /Rect [ 406.05 403.727 476.31 412.727 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3794 0 R /H /I >> endobj 3796 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 367.499 217.905 376.499 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3797 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 254.999 298.56 263.999 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3798 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 226.499 298.56 235.499 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3473 0 R /H /I >> endobj 3799 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 173.999 217.905 182.999 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3800 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 109.499 298.56 118.499 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3509 0 R /H /I >> endobj 3801 0 obj << /Length 3802 0 R /Filter /FlateDecode >> stream xœíKoã¶Ç÷þ\¶ÀD%%Q¢(Т½íª½7@ÓYx91jKIî ß¾|ÚI=œ‘cÖæÌ´‘’‡äùIþŠ¢?-€äïý‘Å(Ȳ¬v‹O"4Q"’0 âC0B v ›„Á–”QByD~tò’ó'ðÇ¢\@ðßÅû$Ï€¤Üç쩜UõÿÅïJÛDrìRû x\üx¿øæ? î×Ç!“â$Ïó,ˆÂœþ Áý¼ÿêþ©ÿ+Ö?ýVÛMQ¶ß4EýwQýÜÿÚ©e)„0LAµ*VÕn·/7«e»©Jð\Wmµª¶¼†Ÿï;#Ad® Üï&ðÒ4  $ù/"žFRxôW†è§ÜJ'…÷€ÿìm24Z Õ›,:Ó¸~ “4HÊó4Ïɯ‚¬!cˆgºgÂv9Á,óû?ûÅ]HE¥ä³†¦YØô_?ã¦HÂ"žß…íæõrFeüî¥%«ùP¤]«$ÅÖŒëªÖÛÀÓÙ€PzE.ÒMòHèïø¡|¿Ýn.6XG“Â#ŠŸ”ñ>¶h°ÐèJçZHõk²+€uÇü hÚâÙz  9d*<T¡§êª¾€Õ•¯Fˆ„[!  pâò ݆ý§3”“ª‘¿yˆÆ ÚM³|,@ûò\Øe]Y:¤Ÿ$Y÷IÝ6$Xçj~ÒïHäÙ÷Çu8©Ú Ø¥oII¨ƒ’„3Ý’dÕzxºs™‹ôÓ°,{.kë³ÛÍÅDöÑd pÓÑ”6t RÍÛÔ³'ÁÎìp¡t½¿oÅßB•z‡ßˆÃ…vtÎß]-yLPðḢDÿD3™6»ÜõnS.ÛâáøÜ1»"Ò½Óu@ú€£[ú±(‹š¦eŽ0-]Ôu¥?& "hFB”EHÈÈÇZÆæ¹XmÖ/›ò‘YÉÓ”ZiŸÌ¢8ÑŠ*M±Š`â¥Ô©+E$„™~”y.YµÞž.q’¹H? Ë"a°ç²¶>»Ý\L÷MNÁSÚй>TóCׇñø%œyö¹Ð¥9=é„èö \1(6Ñí~Å?éÎPý54Ñë'}b]Ç£t!”ˆè¥8ÅDí–rÒ'§ÃP«£i—í¾š†©cñ£HÀFpˆç qOpˆ;>‡†e§rv¯œÝeéM–o„ü¥A‡ I¬ó–Ä3ñ&«6ÖöǪïe.º¾^·,†×öÇ:o]»Ý\L MNÆSÚÐQ5š4¶OIiìr¡3bQ¸Þá×ìð×ÅB‡Ll͆–ë»f¿Û-ë—ïÇ?°þüþ NW{=„“D·{ ô¾àx$dzt!–æÝì IfìÉuµÝVŸ‹‡ñÅ _ä:’ÈÖȳÃÛ—ãËBè–ËÒ̈3ý}I~kM[oÊÇ`(TÈcÑ«Hˆ¡~•Äp¦«DV­·§wr")Üå©J'`4)l³Í«GæêFíë׫úôà!aI9iÁÃf¹­Òé–Ü1É]‹®Dt;ðXëLñˆH]yšòºÂ(ˆ‚8,E[Vmñ¬ª}Éyõtt,Cg J¢€ô Â8Ê;åoJË”Ë-øá·_€U¯Ê²c!]p–P¿“*ÌúD›di£(gn4 Ãu]4ÏUùЀ¶ú^ý8"L"A–Âu±~ø¸út¬ÊFd`˜çެ–Ý=!>¤—U–¦¶^J{ÚÀ‡’Ö‹yJ‘Yü×éQ»éå~‹ug7}›-ÖçÛ^}¨ð\D}‰2»=¤¾Õ•¯âg|ouhè4¾±º'È4@ÐÔ]Õ§aä·U÷Œ½fKõ(˃ÈF×ÅoFÈx&Ít;B=/¤‹__I7­Ë”a^ñVºf]ËÇÅöÑð„‡(“Ò¥ImÂô§(Ã’Û£äJ—fÚÂûì…e6ê}õL¿•°ù@ç£0b;÷~÷ñ¥-sM15¾¦Gñ`líÞû7âý™žÓ¸Lßs• Õ…¡º–^ä³».Ö¬ \ tÇ Ék¾Z¹=>ʉÛhɲ]nJÛ£¥Z-1£Y¹ß},j5¥Z•dúvþL:°ÍŽâ”v¼.>í7µØÿˆ'µ•QMnlößV5kM%ÊhгOû¢6·_BPI¾ôm TÃÙ'.ýÑt{/e½åûã“o)ÃïÇxzœ¡ç Xâïðkvø—¯ZÇÄc2三eÜMŽÞäuqL4[1·H¸½-tßr·«¬õ(¸‚™=.e­wø;|òçLí#²Öcâ1ú2M©lãÄoØï&JBÙ²÷rÄÆ*ç'Š[V2‰#:aþùi³zšð2…œ•oƾRÖ˜¤oHã6U9¤¨³žEf—¾]ÞÞÞo¹Ódø‡_Ÿöô8CÏ%!™¸ { vÇwͲ <„W ¡Uã{_±Ç皺v¿ñ’›9²$'ÉÙ“¥r|Ê‚þ¹ÊÖŸ$lìÀªcIe½Š5THâÔ±ˆYÆŽPAõ„WGü`'(¥Ir\vo‚\ÇÓG@1t"Éö/³”jÝ;°ëÀùeQ§~ÐÏ=è§Ùëp˜B¿ÍåûÉzÿ:ãßa=螣z'|ŽºYWÎ'Éø’Þ„–|(ÊJ.=IËqq¶ªvÏÛ¢eíIR¦ìè¢)Úwã¢Lj@¾@³UÖ\íÉ3õ‹£èß¼ñi› endstream endobj 3787 0 obj [ 3786 0 R 3788 0 R 3789 0 R 3790 0 R 3791 0 R 3792 0 R 3793 0 R 3795 0 R 3796 0 R 3797 0 R 3798 0 R 3799 0 R 3800 0 R ] endobj 3785 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 3787 0 R /Contents 3801 0 R >> endobj 3802 0 obj 2434 endobj 3804 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 702.139 298.56 711.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3507 0 R /H /I >> endobj 3806 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 601.639 298.56 610.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3486 0 R /H /I >> endobj 3807 0 obj << /Type /Annot /Subtype /Link /Rect [ 306.168 601.639 321.168 610.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3724 0 R /H /I >> endobj 3808 0 obj << /Type /Annot /Subtype /Link /Rect [ 328.776 601.639 343.776 610.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3500 0 R /H /I >> endobj 3809 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 589.639 298.56 598.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3473 0 R /H /I >> endobj 3810 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 549.139 217.905 558.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3811 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 520.639 298.56 529.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3507 0 R /H /I >> endobj 3812 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 444.139 298.56 453.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3813 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 367.639 298.56 376.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3527 0 R /H /I >> endobj 3814 0 obj << /Type /Annot /Subtype /Link /Rect [ 314.39 367.639 329.39 376.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3473 0 R /H /I >> endobj 3815 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 315.139 217.905 324.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3816 0 obj << /Type /Annot /Subtype /Link /Rect [ 320.23 238.721 374.37 247.721 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1713 0 R /H /I >> endobj 3817 0 obj << /Type /Annot /Subtype /Link /Rect [ 393.81 238.721 457.95 247.721 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2244 0 R /H /I >> endobj 3818 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 195.751 217.905 204.751 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3819 0 obj << /Length 3820 0 R /Filter /FlateDecode >> stream xœí[oÜ6€ßçW}²X%)R¤Å[l[´(ŠÍ®‹>ÄyÏÈö cÉ‘4 üï—¥ER;šXµ'ñˆCòñ|’ÎáEü´BŠŸ ù‹pƒÍýêSŽÃ Œê$ ‚)„!À$À܃n{QFÿ€›OâW'¯8¾¬Ò?­>|y¶ŠrŸW°§òªªÿ­ÞkºÕÄç%éÁíêûËÕ·?R€ ¸¼i›G¤QÇ„8–0¸¼Î.ïðßäæß߃Í~—¤å·E’ÿ•äçÁå/gB̆F›ìþþî6ër—¥à!ÏÊl“íU ?\vZ.„0àKk¸÷xŒ±š@Š$UšHQ5ʯ:Š˜‡JJ'EúÝ«2´4†ºÂ6‹‹Q®È ¡8fq,¾ x¢¢!bsz6,¸Ë ­2_TÿW_\`ù±®TÐJQƉ8óH‰ ˆÖ òøk­êU2¬ÊÔÝËHÖó¡(`]©"Å¥Fô U›:¨ôªA$½u.qš–ä:¡ÿÄåûåvsUÕŠ¬-¢ÙIkïV£A u*k™×¬®€ê)QW@Q&ÎK…0ˆá SøTPaOÕ¨ú~tS>!õwB„ häò ݆4ÿÏd(U##òAtŸÅú6åãCâvë8›FRDOGRS÷I]"jr5?i³ Ï;yö=ð”.ªvöÒ·¤› ˆ”ynIMÕ¦*½ió&—8OKr0xæMm}r»¹*'»hÜô@4E‡Dºx—÷ìIX '6xíéz{¿{×^©7ø1xí;.ÎÞ]_²MÐðḢDG3Üè].“ü~—®Ëd ÎÁGRÀYQæ»ôÖé€r|ƒãi¹Þ¥"¯,ŒbŒdéò.±Š†ÌBˆx¨Šn×åºH†TJä-ˆâÆó‡Ð e œ+jn*·âõÅ10hòɨ’ޤ Ç4M½Ò|ªs¸<ÁW¤H7âÑUpy«‹åaqrãמ«·ý±ýÐÌ %Ïéóš¹¾“Oœ^]ÁãßÁž\šG͆(ûs¨ÏvqÌôùÝ:Dž«p%\féA3ŠeÚA=``;ãØ¨£(×å¡%)“·Iš•µk®RœŽ91óýº(+oc" mîéŸzBvcUB"‡w_Å1’E®ÎÅa½ß?jik«ÊZ¾¹É2Ÿ|suþNÄ¡Œ.n²ý>ûœl­â ů+qQÌ,ÄiŸÛ˜Çª„›qŠ …*½#*å·1U86ÛRšU6ÅP7<¥ ÖëI_W,Å3ÝšªMTzs55¹ÄyZ’ë„Á3ojë“ÛÍU…3­È ±Í:·]¼³Þ£°Nlñ¦#ÞüüI†dB £ƒ‘HgæwZ#dzôB,ùÉG`Âä# ew‘$úÑñÅ$Cóð@”"¼°À÷Í^†‹2Ø`”á Z A_'ÊðÍހ˜Q†çËó5)ÊX(>ÊX.KóE•?.׸·‹Ú”ëÇñ(£Š„ÃßY Цõ¬~¶âŒé«Ÿ­àB¾žg*µQËryRöåx4QDÑüq(¦àñ¢ÿ7;wí¥—xƒÂ‰-ÞÞà¯ØàOë6˜4ñÈ鬯ê-“U`l"¾'Ð8u"þòXññ—‹Ó«žˆOZX0]'ë½ÎÄ9éy+±–ðÔ¸ÐÍ'ÙdíË,•ÈX“P—Ç{Hûšª©1æÉÊ7¯Šªê'_|phÀ35…)<TøTÍÅÏs_=12iß3ô6r¹öž…·ÉÂŒcËC¨Ïã¯løuCÃ|é ’¯ˆþøšy!ÄÕ„ $ÝÖýøu¤éJÛÝzŸÝj¼Ë-²ˆÈ™×'Êí¹ˆqJÒG²"7/hÂ( ÀmRæÉÍ;°É©ü¤*—-ähÂE4Źq§œ´ûÖíR¬¤ë=ø×~ÇÁ†ª*ÇþˆÆA$mÆŽú”FMaKÄI N†»´Òó<)²t[€23»š0á–¶¡,t”‚·×›]­› ¡Ü¼"ì’Üžs[D—CQ„É·IöŠë6~[šÓ ¦Âþ#Géà‚ý*[ÙFÜïz¶Øý:¾Î®góíx6H>R_⣽=¦¾€Ý”Ïh|¿3O'hð4¾Û™GÈ#4„ÐÔ½Î&räw;ó9žt£;Ñȉ׋ߎB›“p¶RØKhÛ7dë{ü( j$YŠ5)C!ˆS– ¦°¥‰êêŒ ´Œ+aQVU~dlJŸƒ{ÆÃÑ÷|Mæ Ï ~aó¡dޱ曵¯º<À9PÃ̲‡r—¥ÅÇñÞ­ï®ˤ˜0á¿<¾_÷€Gãñ”;ÛÈöË£©wƒŒÊ’_ 76ÂZG«“³Ñ¿ks¯'Á\º›ýÛKXƒ?j{‰ªu$J›æ¨ƒ kjØñ9 ¯V‚Ôã5ã«HŠf…=B±àfpo kI­1‚°j³ôpäzŠc©½µ;FåiÈB„T;käɧÃ.W‹iê¤2ß'£(³¼Ò†‡‘ÖšõѧC’Û«z´&ٷꈫeMgWg»t³?l]íÙšJ¨"¨6àþ˜ðÛï¿þj×Ú[Žˆö¸:×î‚òçÿU~Ôž endstream endobj 3805 0 obj [ 3804 0 R 3806 0 R 3807 0 R 3808 0 R 3809 0 R 3810 0 R 3811 0 R 3812 0 R 3813 0 R 3814 0 R 3815 0 R 3816 0 R 3817 0 R 3818 0 R ] endobj 3803 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 3805 0 R /Contents 3819 0 R >> endobj 3820 0 obj 2358 endobj 3822 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 740.639 298.56 749.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3824 0 obj << /Type /Action /S /GoTo /D [3454 0 R /XYZ 72.0 601.414 null] >> endobj 3825 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 712.139 298.56 721.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3824 0 R /H /I >> endobj 3826 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 659.639 298.56 668.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3473 0 R /H /I >> endobj 3827 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 607.139 217.905 616.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3828 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 542.639 298.56 551.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3509 0 R /H /I >> endobj 3829 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 454.139 298.56 463.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3507 0 R /H /I >> endobj 3830 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 353.639 298.56 362.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3486 0 R /H /I >> endobj 3831 0 obj << /Type /Annot /Subtype /Link /Rect [ 306.168 353.639 321.168 362.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3724 0 R /H /I >> endobj 3832 0 obj << /Type /Annot /Subtype /Link /Rect [ 328.776 353.639 343.776 362.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3500 0 R /H /I >> endobj 3833 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 341.639 298.56 350.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3473 0 R /H /I >> endobj 3834 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 301.139 217.905 310.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3835 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 272.639 298.56 281.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3507 0 R /H /I >> endobj 3836 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 196.139 298.56 205.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3837 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 119.639 298.56 128.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3527 0 R /H /I >> endobj 3838 0 obj << /Type /Annot /Subtype /Link /Rect [ 314.39 119.639 329.39 128.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3473 0 R /H /I >> endobj 3839 0 obj << /Length 3840 0 R /Filter /FlateDecode >> stream xœíMoÛ8†ïþDO)ШõA XôPì°·îØCÓƒ×Q£¶•Úòù÷KŠ”MŠ’L%rM(Óv7Ö„ä ÅGÒ¼)}Ÿ…ó¿×â‹Ã€± -Ö³ïÊ"JP”*S‚ƒ˜$GˆÄIЙ¦­xý©?ñFY¾ý€þ™mfý1ûü…—¹C˜×û1ÃWMý=û¤Å¦ ðÏ>ŇÑ×ÙÇ›ÙûßbtsÜÅ$ p’fYFBÄ‚ˆdâA7kôùêæ!Gå÷¿~D‹Õ2ß”ïwùö¿|ûö ºùÓh!dcL("¸ÑÄ¢X¯÷›åb^.‹ zÜe±(V²…ßnŒ=a0ßvÜ'#D¥4ÀM ùqI·ÈůŒ@š›Ò‹a‘=?;CÆVÄXØfÑ›àº1Li@Ã0Ëh–ñ_Ì€(¤oºgÃBLN’ªðuõÿê×D|Tò¤ ”² Æ1ïsKºâ†0Q±}Mú£–íJVcòìÕ0ëåÂ4 ¦Wni £Ã»CÓͤ½Ú!‚^UŠwÓò¬ Ý?Ôïök–ªvÖÑ¥mœ´ý}Œ¨7luÅ8hóXÀÕPu0‰å°+óÇÖC Œpá^¦È¹ "@Õª^À>”ÏFH^Â[!"a$)0 : iù_“¡Œ7‰ :Ñ:ßíæ_sT>=æíi%£n$¥ÉùHªÛ>E’Cš4¹Ÿ4ÀÌázÇ•g×Oæá¼éVÀ.}J"¬ ·ŒsJª›nÆ íõ>¯Kñ~Zž•¡·çuk]~ÍRU’}thÜt@䃑î¾[ƒb[y¶ëÎ:é€|è œ´$È0ÞïAçŒqo ¤)’”â[_Žë'fÎ{4hàJB©|ÈÑ[tMPÄÁÒ6”¦jÜ™ÁˆF»r^îw=Iq‹è<"RD?M·  ·ºéf Ò^[]Š÷Óò¬ ½=¯[ëòk–ªòà£K‡¤Ø%ƒCÝ}[v $øB™\e·0ÞïAš‡½Ù-¤HRòí¶h¿ \ïPéJp5v€¦ Ѥ\€ É–¶=0Ç­j¦qÄ£¼úñ°\áñÖ‰ À@ýeéç<”ù6±P¨õ:Ö«:hÇ;¨ñ>z|‡‚å™:¼Ø€ZïP -ïPÐ|ê.2c— iÛË\@Lû3c È‚ÎJ[‚ >á¿ü¬$à ørK§½¥+ÖÈ–.ÄL>B“_÷ïò\ß:¼´oRûÛ“¤ÊHRì™ð}µ‡¡·*ƒöª È‚~ŽÊ€Ÿò€Ÿã1]ÃTð|9© ÿ@•á/Kc?‹) ¸±:•« O«ŒJÈeÒæhiëXmé ÷%Ж¸oåodØa–‰zÛ|·_•§ÕÄnÏ«ö>Î)|{(òåç®i–¨ÎðëOä…“Úž·ÔàÆ)¡1|¦[Ô’<ÖràpƒŒGñcÊc‹^' þ|pº‘ñ‰I±5Z¡Á¯€6Í—Oô÷¢Î‰þ‘!OÎIYÔ˜Ð9k¬pð±IMþÿ•@… endstream endobj 3823 0 obj [ 3822 0 R 3825 0 R 3826 0 R 3827 0 R 3828 0 R 3829 0 R 3830 0 R 3831 0 R 3832 0 R 3833 0 R 3834 0 R 3835 0 R 3836 0 R 3837 0 R 3838 0 R ] endobj 3821 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 3823 0 R /Contents 3839 0 R >> endobj 3840 0 obj 2023 endobj 3842 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 740.639 217.905 749.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3844 0 obj << /Type /Annot /Subtype /Link /Rect [ 333.856 661.109 362.736 670.109 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2388 0 R /H /I >> endobj 3845 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 598.359 217.905 607.359 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3846 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 533.859 298.56 542.859 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3847 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 505.359 298.56 514.359 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3486 0 R /H /I >> endobj 3848 0 obj << /Type /Annot /Subtype /Link /Rect [ 303.56 505.359 318.56 514.359 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3500 0 R /H /I >> endobj 3849 0 obj << /Type /Annot /Subtype /Link /Rect [ 323.56 505.359 338.56 514.359 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3473 0 R /H /I >> endobj 3850 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 464.859 217.905 473.859 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3851 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 376.359 217.905 385.359 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3507 0 R /H /I >> endobj 3852 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 311.859 217.905 320.859 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3509 0 R /H /I >> endobj 3853 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 247.359 217.905 256.359 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3514 0 R /H /I >> endobj 3854 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 170.859 298.56 179.859 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3473 0 R /H /I >> endobj 3855 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 142.359 298.56 151.359 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3473 0 R /H /I >> endobj 3856 0 obj << /Length 3857 0 R /Filter /FlateDecode >> stream xœí]oã6†ïý+x9&*I‰"¶ØÝb-Ð]`:JÌ$ÂÚ’+)“æß—%›”¨$rÌÚœÌLLš"ÅGò{È#úPü\U¿X€<Æ"p»]ýÑä#@1ðÃ&‹@/ÀBàÀÃlžEÀF£¾Àí+ñK++Òà·Uº‚àûÕ§Ï¢Ì@qÜÓ T^WõëêgŶ¦€xm“}ܯ¾»^}ýo×w‡SŒC’0Š"Œó|U0¸Þ‚O®8ø…ßýó;p»IxZ~]ðü Ï¿ú ®ÿ«Õ€…b 0ìTq›m·ir—I–‚]ž•Ùm¶‘5üëZ;s>„³íÄý¬™(À£”z° ¤øx¾Ì9²Æê-ÍnR¶¢åÈÈ߃&ÞÅP5¸Ï¢5Æ cR"E4ŠÄ[Ó ò¡?FŒ5ÝëÂuNH]øªþ¿~ã W/›JE‚Ô†Ræ0ýï¦dS"‘&£J_áq«e½²^eòîÕÉVˡУz«"ÇdÆ@ë3ªîÚ óëRÑÛ”ÝìµÜd w|üp»z©údšlFD'å|,5öº¢] ´{-Àú ¨;Hy%ß/äC/‚£LácA…U/ ê ü¨Cùj„äG¸"ŒGBÇchê6¤è¿.C‘¨¹‘ƒh ¢-/ŠøžƒòyÇͲŽbÑy$…äx$µuO‘¤Û’.WË“æ0›ñy'<Ï¡<©ÃEÕFÀN}K `”.tKj«îÚ óµ’¨Õ¿í+QU{¸8=“‚iÄÐ ì3Ô–ÒW` k²ý.YuÕã^)ìû¢lT†;¤f …—c ¿ª¥ð†Ó‚ „c*Ü!t‘™´´Cá"QxÑÝ$ûÿ˜†¶Ž ]S2ê!|ÂÐ8^ªAÇÄ+$¼Ê¾W”`›’hü¸Îjwê(ʸ|,>V‡úU‡òt¤÷J†h¦WxÌ–ˆù²žuo²{÷j:>%ó¦C~µtºÄ磨Zžjì{¾‡=D=pÏËœßý)«¬Î‹á¤Lä„^ˆD0D‡•1a=ò™IZò<7JÖ?~ú’ª|‘8]+9²Iƒ'ƒBâaHÅÉ#Äаf±ÁZ1¡/ü þáªÑ…’x,¸jÝͳ’(µ¾öÿð»HĨÑ\aëú&¹é }"úøãF–Y¶Ñ’J"§"á_TãòøIIýúý?(I}þ÷㫪F¬c‹0~“d÷y¼{Hxáíáëù’ö ïu¬ŽxŸEåtÆ€ÂÇ"ê-¢ðò: ׂ«9 ÐÛ–rAŽ Öqæaärc¯ZÄ!Ì#&ºN}3 ƒ.%a°Ðͨ­ºkƒÌoOx[Jô³×r“1Úó¶¶¡võRµª>49cÁfŽ Ajó³'0иÊvôØBÏ)!Ù/ÉæQH¿”6÷26áõ)ÛUáÎÅç߇û¿£ZÝaxƵµñ3ñ¥Vo¬ƒdhùF¡ÆqtŽ^¦A˜U îÃ]¶ÙdO|=½6#W |È<¼_1hS<ß&i\ª ÂN5â#ö&¹©Ž0ª,hVNzGŠ+C?²(ó$½÷F<Œ}³zê[.fÝKEä,s©´Uwmù-rm)ÑÏ^ËMÆhÏÛÚ†ÚÕKÕÎÁ¡ÉžÂ´kHm~ö5„G=G5ôƒ&w~Îþöh½FÈ;L&“BÞ>H†„¼Bãè-'äÇ”0A–ù•ZÞIK¥åï>ª69C /b¼—µ[P8òˆ·²Ö øø|g3V<>‚n䦡* Q§”?§ªÀôp4/×íŶƒ×ÁûéÏó̺Ôêmë8|îáŽCé(5z3TMU×`)é×Ìc\EÆìg½“ô~zö¼²¢÷tCOµGqT§¾ù±ž‡È–òÙ€‡È4o<Ä^Ël†ÛÆz"3xˆJ›j“3Tû4”Ùk\GóY{¡ïè±…žSB2/Òå››ç’ßNß÷æ¸8úΙ>£Tw#~Æ#¾Ô¼¸u ét…ÇÑ 8²$À%ŒhåÄÊë—„·È •ê`B+Ó×<ÍJ-Çô t/Ö%}ÜÞðÚO!¤±Éî”DýÙÝ«„žÏ—õ©€Œ4-«Iõ3õijÜ©æ)NË”(ó8-¶ÉX¬¾Ï enùÅ«½g¬¾Éq(XƒÂF|öm=€æ¨«Æmp”œ3%&·Áø9øBnƒ}¸¸x;9jE-òOAÉQCeF]‡ø¹‘é8ªg÷ñ,SñfsH¬ã2žv'b¹q õ£Z³sž*ÉBHïÓîÄa¥0  ߤ6Y¶›v&²/•¨zP^ðr,p(ˆeþúÅ^U§ðkP8­€Æ¼£äœ)1 x7âç<â xû qÞNŽ–ð,BòU©à÷ÉÞ>æ¹Pæuó”„­Ú¢yZ«?Är¿MÔž¶‚¿M¦ÉöžV¿Í¶» /ùæyD¤Yæ7´·o]j{.:°uÕ¶1¢‡­“z-ÓûÑÞÖIÔ°u’Ò¦Úä ‘>Çí’R›7‰t‡‚5(aÄ_ Òª¥Hw”œ3%&‘îFüœG|¹8zû8Òé 8¥ ´¼N'Ë)m©Ó÷IžÏPêORmWâž6á:Íë]žÝløvZ°ç> endobj 3857 0 obj 2332 endobj 3859 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 740.639 298.56 749.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3519 0 R /H /I >> endobj 3861 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 688.139 298.56 697.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3521 0 R /H /I >> endobj 3862 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 599.639 217.905 608.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3863 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 571.139 298.56 580.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3509 0 R /H /I >> endobj 3864 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 518.639 298.56 527.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3507 0 R /H /I >> endobj 3865 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 490.139 298.56 499.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3724 0 R /H /I >> endobj 3866 0 obj << /Type /Annot /Subtype /Link /Rect [ 303.56 490.139 318.56 499.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3473 0 R /H /I >> endobj 3867 0 obj << /Type /Annot /Subtype /Link /Rect [ 323.56 490.139 338.56 499.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3527 0 R /H /I >> endobj 3868 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 461.639 217.905 470.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3869 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 433.139 298.56 442.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3870 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 368.639 217.905 377.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3871 0 obj << /Type /Annot /Subtype /Link /Rect [ 327.46 289.793 389.39 298.793 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1502 0 R /H /I >> endobj 3872 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 240.751 217.905 249.751 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3873 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 176.251 298.56 185.251 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3874 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 111.751 298.56 120.751 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3502 0 R /H /I >> endobj 3875 0 obj << /Type /Annot /Subtype /Link /Rect [ 314.39 111.751 329.39 120.751 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3473 0 R /H /I >> endobj 3876 0 obj << /Length 3877 0 R /Filter /FlateDecode >> stream xœí[s›8Çßý)ôØÎ4TˆûÎNg¶³—Ù}ÚKfö!ÍupÂÔ†ÈvóíW É!@vp¬µOÓ6 ër$ýÿ²ôua#L®ê_¡k[a¡åfñ•‡Û( Èñy‡-—x;ˆ¸ñÐuƒ<´¦iÚDÑ_¸ôüý½Èý²¸¹¥qî¦é¾-ð@æMV-þhÙÆ#Ðc“ìÃè~ññzñþgÙ]¯vML| {~EÄF¡å¨þCÐõݼ¹~HПÉêÇh¹N“¬z_&Å?Iñö]ÿÖÉÁŒ1 ÁRË|³yÊÒe\¥y†‹¼Ê—ùšåðÓu§åŒ­Ð´†û£c"/ Ë@Ò®å°0Âr¬?ê"Ÿ²R:!¬ì÷ É¸g1nÜgÑã†1ô+°í( ¢ˆ~d…ˆìŽcLõú°.'^ùªù¿ùàŠÔ‡cEÑÛãõù·šåËÊèeÆ®^Rp;ží[A·T¢2c t¬eXxÓ 5½<­f¯d0\ñmúár»±šÆÚÉ{¤ÕO­öÞY4jîU¥3y,àf4ô\6Ê*yTÛÁV„G™"Ç‚ŠU{Põ~Ú]y0B쮄ˆØ¶åùÀ04ujé?™¡ˆfmÃ… š‚h“”e|Ÿ êù1Q˺€Xa G’ï$‘÷I]|Oæj~Ò3ûõ<‡nxL‡Ó¬•€ú’äÌtIYË6°pÑæ"­g¯d0Zs‘ÛP¹ÝXÈÞiµ¸€HdžDíâ‡}PÜ÷<ýQÑ ™Ð8Qdèï3îï½® .vFU0¤0Rò/c×8NºšwÐP:JÕC‚ÞÒÏX¢dµÏÊ*®žJéÕ F„H™¬ò¢Næà°N·ŽË§å’ºf«§õú¹—ãZ¡ƒ1¶C‡SÄY¹I«*¹«óp ½C¢7ˇ§ìK/±ëK‰óº‹«xD›ûaÝH †2õ4dêEÖ² ,\Ð#bÑzöJæ£5¹ •ÛÕÈñ]‘Ú\džÎph¯Ù@‚)$¹Ã¹È†þ>ãþÞSdcéVR+k9Ö÷üyâ‡é{ß§OxûwT¾ƒÀ C&)Š\ýƒ+xãPRð-v€¦ÑÄ|@ït1¶ZçL¿ÓÑðëuþ o{aøósû,ÖðI±I³˜ê÷wuJ¿wüßÕ´‚¿O²¤ˆ¹ø·=Ç«S·K+-µ¨›–_°{,E,“eºzN³û¦”(êRh#ö’†DJ:ß y†9Œ‹œ±s§£Ñ"@1”‰¹Ó@Ê9“¢ÔÇÐãgÜãs>·6Çæ²ô*s§âæ¯ñß•yóÝ™xYË6°pÑo"­g¯d0Zs‘ÛP¹ÝXÞ©¡Œulè€Ø.~/mµÞÒ2¡#¢P¸ÐáçÜá‡ùBã ž”O›M\<Ϲà @j‰nó@Ý-r€¥±4ŸènÖ(±IجR"Ö?™žŠÍVE©gq$¬gÛõO¦'e×k‰ÇY?boi~iFeU¤Ù½5æ*„¦Íºâ.–G‰‹g%"kÙÞ‰i á.ŽhV"9m€žIîT“xªRpôˆX§ý‡Éòå1Õd½¿ó`;•Td>ªÈXÍ>ð¢<ñĺL†”n°p‘,Ìé0‡ÐÃÐôáë fóÕ6è˜|ùÞÿ¯ùˆæû˜«4K˪Ò5¾ÐI-¸Kãu~ß"½Þ Ô¥± ^§Þ‡Ô•*ãR;£ÀˆÖOZ´‹Xvh¡û¤*«ç57¿nEƒ¸!rƒÀŠˆE.OÛyÓŒz0Y¼F?üþ+â ŸŸ¨Ø Éö"˯{Û‰ùu-QXaG¶ú´M°o+ÒÓò‹")óì®DUÞ›qéy–[§öUê"YÝ}Ž¿“Úc7Ó,'¢Ýáúž"õÎÉ’],Z]ËwBØiÕØ=Â^g§ÕùvY%Š ©—¥Ëcêô´»ò €¦÷X‚€ ÑKÐô«€ 4†îþªšÁ«Ù!»«z4_[‰×©/G—÷ð5'Cé¿Ë•Ú€9øœ’½91O‚nòÇ*ͳòvú±ÏM‘Ü'ÿ>ÞNÏ¢aÚ=kdUZºü¬»|¦w R³¦Ìé\fL‰r“Ü®ÛhITÕö­ŒÚ³ñ€ã ]ð,êwlãžàc >Ç–i\˜CŸsÏýýŠzõ¹Ú_¸. À<ˆ»ˆ(¼`áBYÐ~ –ðõÞ¡¼gº:­HËŒx&€ùÂC DhpÛ,§ãc1gœ¯¶AÇäKÚ/Ì@¾f]A´Ié»N­õ¿=¤Ë/Z'£dŽB 9 =£¤Æ¥yÖõÏOªÍ endstream endobj 3860 0 obj [ 3859 0 R 3861 0 R 3862 0 R 3863 0 R 3864 0 R 3865 0 R 3866 0 R 3867 0 R 3868 0 R 3869 0 R 3870 0 R 3871 0 R 3872 0 R 3873 0 R 3874 0 R 3875 0 R ] endobj 3858 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 3860 0 R /Contents 3876 0 R >> endobj 3877 0 obj 2273 endobj 3879 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 740.639 298.56 749.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3507 0 R /H /I >> endobj 3881 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 664.139 217.905 673.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3882 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 635.639 298.56 644.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3883 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 559.139 298.56 568.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3527 0 R /H /I >> endobj 3884 0 obj << /Type /Annot /Subtype /Link /Rect [ 314.39 559.139 329.39 568.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3473 0 R /H /I >> endobj 3885 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 506.639 217.905 515.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3886 0 obj << /Type /Annot /Subtype /Link /Rect [ 319.15 429.935 372.2 438.935 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1753 0 R /H /I >> endobj 3887 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 386.25 217.905 395.25 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3888 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 321.75 298.56 330.75 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3889 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 257.25 298.56 266.25 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3502 0 R /H /I >> endobj 3890 0 obj << /Type /Action /S /GoTo /D [3448 0 R /XYZ 72.0 736.194 null] >> endobj 3891 0 obj << /Type /Annot /Subtype /Link /Rect [ 303.112 257.25 318.112 266.25 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3890 0 R /H /I >> endobj 3892 0 obj << /Type /Action /S /GoTo /D [3448 0 R /XYZ 72.0 702.499 null] >> endobj 3893 0 obj << /Type /Annot /Subtype /Link /Rect [ 322.664 257.25 337.664 266.25 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3892 0 R /H /I >> endobj 3894 0 obj << /Type /Action /S /GoTo /D [3460 0 R /XYZ 72.0 500.329 null] >> endobj 3895 0 obj << /Type /Annot /Subtype /Link /Rect [ 342.216 257.25 357.216 266.25 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3894 0 R /H /I >> endobj 3896 0 obj << /Type /Annot /Subtype /Link /Rect [ 294.39 245.25 309.39 254.25 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3894 0 R /H /I >> endobj 3897 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 204.75 217.905 213.75 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3898 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 176.25 298.56 185.25 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3899 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 99.75 217.905 108.75 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3900 0 obj << /Length 3901 0 R /Filter /FlateDecode >> stream xœíKsÛ6€ïú˜œì™˜Áƒ ÈN§3Íô1í©i=ÓCœƒ,Ѷ&2éˆtSÿû|H >ìP*mœDâØ]¨]€¾ÌÂòçB½„>ñÂ0B‹ûÙ—JN ˆ•ˆcϧc†¨ïQŽîQSÄÑZÖÑßÐú|i”•ÇwèïY2Ãè×ÙÇO²ÌaYïë w(/Tý5û ùVï]ò£ÛÙûËÙ»_8"]Þ욘æAE” Ðc4R(º¼GÏ.ïbôg|óÓ{´X¯â$—Å›âÍù'tù{C Ƙ D±¡b‘Þß?&«Å<_¥ zؤyºH×¥†Ÿ/-Ç0öB×îCÃE žÂÃ&òŸï±R&%¥Fõ«†#æai¥!)Ï |ít·<ƺÃmq®Ã@x‚(Q$å… ˆúˆqæôÚ°Ð&'¼(|Qü_ü₪·•RyÀ GEèùØ—ço•¦¤€ðJ Ž/h¿×¥ÞÒFKYyõ2Äz9x¢iUJlntX¡Úô¡” ¢è­JÉÓlY®Ý'¾­ßm·Yªh¬ÉªG´~ÒÚ{çQ¯¸u*± ̱€‹Pœ ÷Ëåñƒu†½÷2E÷ªžAÕ7ð£wå‹*?­QB<CÀÐÐeH‹ÿL†"©šÀ… ‚è>βùmŒò§‡ØÖ ê…bIßIµî!’š>ÜäjzÒ³Ÿw2óìúÀ+ãp©Ú Ø¡/I¢Š˜ê’$:X~;VZ–ň-V„…ͦnÒÓ¸é€hŒ ˆ„ ¢VŠÛ™§=ffinÈ€öÀ‰%@†þ>âþ~ÖuÁÇÔ˜%¼]êûå<Ÿÿpu…·{CgÀ ð*ÁI?÷ÆÎqÒ ”w @é@(åw1:G‚SO –vP%bÆ… #J Y>Ï3U“ Uq'i¾Jnwi¥¥†ù^È0Æ$d¥šõ<ËUB©¯*-î“Ϻ ½i)ñC‰º¤ª:aDT•«³Çìq¾^?i²yK  -onÒ47o®ÎßªŠ”ÊÆFgYëGÛ9WM“À†&¿'Á×uáÔ@­44G¡”L3 kÕ¦¥¼¦¹.%ϳe¹ôžy­­Ën³T‘SìLŽH0ÆøÐžºùg OÑ›`@®thNä%§oê@9bPl¹tøwø„¹‚sœtå 8€ÒPš.Wè›u§Ä±ôõdsSg§ÝÃþiw È‚öŠmÞ:üˆ;üeyФïÀð5jæÝ9P`êÝ]–¦ §‹IjuÛݤëuú5^î$×OÃSïÅ”9Uñ<Þܯ’y^ª(eY¾Y%·Ã“ï‹4É竤šú'‘Ü>ùßšqWãÌ“ÒmEªÞ&Î×ùð{ö(«nžúrŠH8–æVNÍAÇéDƒ®VmúPÊkxëRò<[–+Aï™×Úºì6KiÄÎ䈜bŒѨ›·&€‚+(ì¹Çëä:üˆ;üy7ÓF=•ó¥d”cZ¡öl&ý閨ěMj_QgαҕAhðNÂ©Ê hHT”^À¥¿àùøL…Þ_ïV‹»á´a›+de¼/DW¼ßJ2éÜ*Mz‚vZ¾84*MÎ}<çµjÓ‡RÞ(Iêº~'UÕÕe´\ò‡š„Û¬à6ÿu©†ñáH~о9* ÕÏQï­`j St:¨è ¨šŠü«êÀ³4ÀÐi2d í…ÓdaÂ{î!Ôñ}ø:ˆ‘~¾t‡öÉWÀÿ|M|Ñâ)ù8YVóø•`Ô3üËÕ|Þj¼«-q|YrSSÛñøÆ)1Âdx`ÌàÔC™Ç<Ù,ØCëU–/¯K•ª],⇈1™8‡,Šîv§Z%2EIækôã¿¡í-†B•e•0ᑨg‘EŸî‡ÅÙç²-˜Œ3Ûµ¥õÍ&ÎÒd™¡<5'˜¨/<Òizß,¯ß5šB››’©> ”XêzÛÎ0,Æ}°vrvüëì44Ý.C½DQØÞæ¾½+_ÐðC@ô; B€Ðû ävÈ^²»Ø ¬xúrø&&?Ñå¨VmúPÊë¯KÉólY®½g^kë²Û,U„Ö;“#neŒñ¡n~tZo¨`j>ÎàsHJÆ=ðn8°L}ÜÄ·ñ¿Ÿ†¯Âu ð˜)´†×ÐåÇÜåÝÕp’®Û6Ò@šz U ·]1|ÏâºØˆárùCéM}´] 1üDSùû.‹×ñÂöaÛ¹ä!Ë·‹+¬™‚ÏxG" W\ÈÔͲÞLðqŸ}ÇheT=~Ô=~ØÅÐÀ5ÿ;H Äÿn‚Ë -9¾öÙžD‘k v%8½e@‡^Ó ,¸Ãž»¼Žð¡Ç¹ÇÇgþ#W4Ÿ#_~Ö¡3³päq®žÅ–Z”róISpE!ñŸa„EÁ¾2bùêNJ£¸zꢳx§®Â9.]£Ì¶@Ûl%ÁzŠ¿Ž7Ú+Äu-­â[ºr*Î0œÇ,wXî&KG½6\~j¹6½P NoWâ×üî„Ñô³Þ["€;ø’’•Þ€ÉQcb‹Ä¡ËºË'º»á %ð½ n‚ô*ß™ÀCçž¶«§·«ðk~iÂøï#í‡gðÙ%¶Èzü˜{ü°O\׈Ú=JàËÜ žz­/J¸p-±­Nmhw›®Žœ¼7µ Nt‡Ä©æà È–Y ' ÃD9‡ƒüÀf«¦wárz£Uõó¤" endstream endobj 3880 0 obj [ 3879 0 R 3881 0 R 3882 0 R 3883 0 R 3884 0 R 3885 0 R 3886 0 R 3887 0 R 3888 0 R 3889 0 R 3891 0 R 3893 0 R 3895 0 R 3896 0 R 3897 0 R 3898 0 R 3899 0 R ] endobj 3878 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 3880 0 R /Contents 3900 0 R >> endobj 3901 0 obj 2125 endobj 3903 0 obj << /Type /Action /S /GoTo /D [2365 0 R /XYZ 72.0 137.977 null] >> endobj 3904 0 obj << /Type /Annot /Subtype /Link /Rect [ 327.47 732.974 389.41 741.974 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3903 0 R /H /I >> endobj 3906 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 694.386 217.905 703.386 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3907 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 629.886 298.56 638.886 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3908 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 565.386 298.56 574.386 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3502 0 R /H /I >> endobj 3909 0 obj << /Type /Annot /Subtype /Link /Rect [ 314.39 565.386 329.39 574.386 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3473 0 R /H /I >> endobj 3910 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 512.886 217.905 521.886 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3911 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 484.386 298.56 493.386 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3912 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 407.886 217.905 416.886 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3913 0 obj << /Type /Action /S /GoTo /D [2329 0 R /XYZ 72.0 769.889 null] >> endobj 3914 0 obj << /Type /Annot /Subtype /Link /Rect [ 326.36 334.086 386.07 343.086 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3913 0 R /H /I >> endobj 3915 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 295.498 217.905 304.498 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3916 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 230.998 298.56 239.998 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3917 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 166.498 298.56 175.498 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3486 0 R /H /I >> endobj 3918 0 obj << /Type /Action /S /GoTo /D [3445 0 R /XYZ 72.0 635.109 null] >> endobj 3919 0 obj << /Type /Annot /Subtype /Link /Rect [ 303.56 166.498 318.56 175.498 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3918 0 R /H /I >> endobj 3920 0 obj << /Type /Annot /Subtype /Link /Rect [ 334.39 166.498 349.39 175.498 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3473 0 R /H /I >> endobj 3921 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 113.998 217.905 122.998 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3922 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 85.498 298.56 94.498 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3923 0 obj << /Length 3924 0 R /Filter /FlateDecode >> stream xœíÝoÛ6ÀßýWð±–¤HQ*†+¶ÛÓºØCš×VcŽ•Jʺü÷#õaKõ‘D®Y嚉.ü8ò~¢îdòúeAQ_gú[À)‚­n_J9E’!Ï/E‚`Î!b3nQS$ÐVÕ©ÿÀªŸÔ·FYu}ƒþ^ìýº¸¸TeÖˆ¨z_¤£ñ¼©¿kº•ÔÏ.éGÐõâýùâí(AçW‡)f>&ÂÃQ`…úCç·èâÕùM„þŒ®~~VÛM´ËÞ¦Qòo”¼¾Dç¿7Z $„0‰1šXÅ··÷»Íj™mâºKâ,^ÅÛ¢…_Î3ç‚×&îcCEž”Hõc¯)IÑ¢þUCó²è¥!)FP|ïT™´4&u…Û,:£\7†¾Ä’Ò0”a¨~…ƒD‘}Ä83¼6,Lë¥kq%JÊÁ{ZcÞ¾*ϰGC}ñbÐÌÃf˜QŒ¶›4K³‡mTÌ‚žEËòyKÎÃ0½Ã¼ÙeQ²[nÑOü†ôý¸Ü­QÑÒÛÒl…Šûª‰Ð ÛÍŠX” ¡Z¯õr"(k×WÝ'I”ÞÅ»uв™+‰˜ë•„2Kå$ºZ^½3gc_Û£sªj{¾ß®÷,$rÛqµ’ 3¦%¥‘Õ…ÈÁ‘æDωyU˜^ ¨(úúŒõST´[ôÑj¬xšâz9êcÙìUIljtô>¢iS‡BžOˆ^MÊRj˜­žKA÷À÷õ»ûm–Ê'ëÐei‘šjó}ШWÒŠî8¿5[·ÉW£|p¢¼1Ó,º³.GÔ#8$ý@±cÅ©G õ xê¦|?…/e%ˆQŠ…@½ PÍ 7 µÇKÔKÐm”¦Ëëew‘ݳ– r$F¾8FUÛC5uð… Õô˜c9it=ç ÇÛWÞœ•®S/F>7)ñùD‹QÕ´©C!¯&¼*¥ÆÙê¹ô޼j­«ßf©Ü«>t‰kÐt4F‡Aõîí/H;ì§½^6Ðã =§„DÅûÆ{*Ú¥ºÞĘQô"¾Óï*ÓËVQãÀÓo'‚òÂE]GÿÝ]~úDöûüz@vÎÈÚüp°øœ->z‘Šÿéó²Ýƒ¤éu5j€£p”ÝDè5:“‚a‰Uµ‹2¤~¾¥Ù2»Oß誔ÚÛ{uo·ñ×h=üÄûü ëy$À UÚTWQr»Ù-3K3*Œl6³õC­DùÉD«²ŒÊi¶Ù]÷„”ÉŽ¨]ˆ+ô'k½qàã>ÇöÒ ·,>k‹OJþ°^fˇC¾2¸®áÀAJ p¤©c_;ïUp|~Ž–º¸0¼ÿƒ,Í’½§Þ ¬â]¶ÜìTÙ¼ûQ¨qÇÕv¦$Jï·}Ÿ5è}IŽÙ¥@›®Ù­`Ý=UÓ¦…¼¢°*¥ÆÙê¹ô޼j­«ßf©<8t9"(£C㶪woõðgX8²É+,>g‹ü áá¿AqbnMõj…Zbÿ¨r~€Ÿâ$J’ؾo« Ü¥+ ¨‘,€¥2 `Õ®vNVíú‘‘@^Óçžö»¿ÞlV7þÿÞáO §]Ê.§½åï§J¹M¼ëñÖç®…Ã¥€&äJ2 äUÓ¦…¼‚¥*¥ÆÙê¹ô޼j­«ßf©ÜA?t9Â[£Cƒþz÷£é÷z_á>îàsJJö/tíÛq“YcbóÄÁä³6ùDoã¤¤Ë ¯a ¤éÞÆ÷¹ÃÒ¹b¥@¶ÎSÈ©ŽíÈŽ#²q¼AŽT´z–#Î9ÈÖ‘ i9RQë³ÞåwxŒ ¥yÖb …¼ß|œÁç”Ø<[°øœ-~Ú-À5‡v’.º† €t`G‹eG‹®GÃ|g|}sK­ª$æ{õ{U5yè $<ºØ–NÌ;Ž“‰î¸ªiS‡BÞ(I+·¾úI5UUWÐR‰M‰°õBÚwbUªÑùpt1Ø¿yæM?êæ½¡5 (6Qì HMyŽ j½P€l‘ÀðBa˜(æpŸ®˜#7à·á‹öÃUWè˜pùÂu¸&ŽC<åõ«ªÑn]Æ¥À´‘õf¹ë§\G%åê¡ÊˆÎ )½fQVd½O«ÄaÝID¹ça_gñ>"‹h»½¦&Ö,¢Ú~ª:ÔR0(Çž¯&ø¶ÚyÑå;c>;=Õ¼–SÈ,µ{òˆreÄB"QgÓa}w‰DûˆbÇBê9~ÒËcêôÔMy¬L¢@Ô·H% B=Î%:Ž#H& =%™(÷)ö¬xz9zyÇãÌúÓŸMðqŸSR2>¨åÕA_6Ñü]âåG¬Š´¡Ã/Ææxg ¯Õ+“ÏÙä} â %VÈMæ”ZT?šóM[^®Ãd™E!,,ºc f|ÜÁçØnZᘃÅgmñӞø®áÀAJ p$8‡ñ”Ì¢"$®ÅØ¥àå%ä:ufQ`ÁŽlòÊËÏÙâÈ,ÊGe5·ªZ›’æ–Ô‘IJEíD࣓”É@ò¨$¥‚IJÝdiÖIJ}Î\‹¬KÁËKö&)|ÜÁç”” Lf‰Í“ÏÚäSý¯ÁîQIJÝé›$)õ¥s{Í*˘Ç#Z‚'³V4Ô0¹U>©Ç»¤=GQë{¢<¡`AÂÓ[ÊæàÁ¬{ÖO»O ìŽ\*÷,ÕéRí-õbmù·+äÈè¯ÿôH¶7 endstream endobj 3905 0 obj [ 3904 0 R 3906 0 R 3907 0 R 3908 0 R 3909 0 R 3910 0 R 3911 0 R 3912 0 R 3914 0 R 3915 0 R 3916 0 R 3917 0 R 3919 0 R 3920 0 R 3921 0 R 3922 0 R ] endobj 3902 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 3905 0 R /Contents 3923 0 R >> endobj 3924 0 obj 2107 endobj 3926 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 690.139 217.905 699.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3928 0 obj << /Type /Annot /Subtype /Link /Rect [ 330.25 612.991 393.85 621.991 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1510 0 R /H /I >> endobj 3929 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 568.195 217.905 577.195 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3930 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 503.695 298.56 512.695 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3931 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 439.195 298.56 448.195 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3486 0 R /H /I >> endobj 3932 0 obj << /Type /Annot /Subtype /Link /Rect [ 303.56 439.195 318.56 448.195 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3918 0 R /H /I >> endobj 3933 0 obj << /Type /Annot /Subtype /Link /Rect [ 334.39 439.195 349.39 448.195 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3473 0 R /H /I >> endobj 3934 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 386.695 217.905 395.695 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3935 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 358.195 298.56 367.195 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3936 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 281.695 217.905 290.695 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3937 0 obj << /Type /Annot /Subtype /Link /Rect [ 383.02 204.547 442.16 213.547 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1763 0 R /H /I >> endobj 3938 0 obj << /Type /Annot /Subtype /Link /Rect [ 461.6 204.547 495.48 213.547 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1736 0 R /H /I >> endobj 3939 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 159.751 217.905 168.751 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3940 0 obj << /Length 3941 0 R /Filter /FlateDecode >> stream xœí_oÛ6Àßý)ø˜JQ¤(E݆îiÝì¡íƒc+‰Q[r%eY¾ýH‰²(’úG®›MÛØ ywäý$ß‘ócæȾ.ù·»N„`±™ýå. x¾("ÐÁˆ@è„DÀ4‹X³6ò T½bßuÙû;ðÏ,žAðûìË7Vg k÷0ƒ- QÏ>K¶‰ ìõ”ìƒàvöájöæ7\®nê!F¾‰†!rAàx(ä¸Ú€/Wwø+ºùø,Ö«(ÎßdQúo”¾ú®þhHp !D ¨ˆX$›Í}¼ZÌóUƒmšäÉ"Y—~½jŒœ¡Lmà>7LdàQJ¨ÉþaÇ+ËXI)‘ÿ¨aˆú¶ÔÒ(){P~o5jCÙ`ÅÉ׎¡OêºaHÃýÈ y0è"f2ÝÓaAMNHQù²ø¿øÁ%â/…Pö††ÒÀÁ³þ«ïJU¬À%¢€¿¿DÝV—rKš°òî¥Ëõ\ß¡M­¬ÄdF‹ö¢UÊòb@8½¢릦Y´w|×¾]o³V1XµJáÉOÒx×uµ®4®ª^ °¸Š\^Ym—€ëA'„L¡CA…,UO êüȮܡò#Ür]‡ø–!ËPßmHŠÿT†B&Úµ7" QD›(Ëæ·È·‘9¬£È è0’|r8’*Ù}$5mð‰ÊÕø¤YÌ|ޱ̳í¯ŒÃ™h#`Ǿ%1ëPé–T‰Vm(Ë«1¯j±~jšÉ€žWÒÚô6kAv­Ò‘¸ihˆ ˆdõ¦èÙ’0ìpéZŸ‹¿ETj~&±ãäüÝŒ%ë ‹ÄxH´O4C(³Ësð \’ÀAà"ÒÍ*žçѲ.Ëòtß*k¯tÊJGœÏW1«ËÛº!bŸ4Lâ]¤5õ¢„Ð ¼:TÇ…N>ÎÛ¥Qv¿Îµ¦+M³{Ö4}ìˆrý"€žÐ¥ °Æ9‹sÜÂ9ÖÈÄnsV¯˜(\_šI¸¦Ý ÅÀ?®ù'’}¡o¯~õª(D÷]ÚŠ éœl¶H @ ÇÚª±ðxSÕb7©®¹f‹ÐY"dŠÍ- g‰Â“î&É÷®™âÉÔí.ü9„¹ÝxÉ/Ÿ¼¼X”΃oJCƒMz#V+ôø)2²|žßg¯ySÅþ¬i/E6 ŒÉ€Ñ/Wóur+áÎ7`V3òø†¬v‰…f> $aPÊAžã9lX<¬WYþ¤ËR(ðà0;Ñ0ô+cø°UÌÒ¢x¾¿üù ìR•B”a&Þ%¡ãsŸ{¡A^Óƒnˆ;š3õ)ËŒ¶I¼Ì@žu'ÏØˆ¡]Ý,¯ço•صãî s‚ï;;_h ìöà ¶[y&»õs¶òŒ·§“(d×ϧÀÔ3è‘]¹@ý›x,A– gná±Y„ÆØÀ3#»…ÇB¶×ö€yʈױoG>V1ññH·£J´jCY^xU‹õSÓ, :{^IkÓÛ¬U„ֵʫClh $«œÕ»Ý¡¶Åg2ø“’ÝB…4…¡×j™90Ì¥ÑmôßöëW¸ûÛ®[ O™Bcxm]~Ê.iMc‚”´­jHØXŽÒÈ«. x wq“¬×ÉC¤äiK×Å",÷P•ÖTïv;ªô½L¾"¦úŒ-ŒÀ·A,7hmI îƒÊw›´ŒÉ"^K.joº6YàËeÉ‚Åg:ø:L+sëñ“öøÈéá»å<Ÿ¿ïOúD `á²põ§¤Ä¦ÓiìÀç±{•Ô%×ýÉÀ~ShÉÀðÇ)´\ Ú£$?CaL <—N-ÇÜuMµtõT¢µ‡€LrU‹?ˆ£jÝ!õêiêmÖ*ò€Z値`ˆ ËJVoŠð- ÓaáÀ.¾õøI{|xæñ€ÿµ¶ÙÔ(Šª[K¢’T•Æ>vbZƒš—2«tÂ’lIæœDiš˜·v‰Œb‚ ´>]“cY:K"£@Ë£ö‚,éý“Š¢¥_Né?Ü­wýiÄ.wÈÊøŸÒ¶ø_K2fÜ*‰» §–Y‹¨³’q ¯D«6”å,U-ÖOM³(èìy%­Mo³Vë×*þClhÐ/«L¿×¹`ñ™>Ǥ¤çg‹ÉIcbŒÄ­ËOÙå#MìO’¶0\ÂÆ‚tÆ›Øï ‡ÃÉí5T{à‚Žõ`myæ‚6ž õ3šf:àAª=sA Ï\H:e•Âá!64(¤êÃC(ÄÝá°Åg2ø€Sdk=~Ê?îæ —…k@ ==JÚbh  Ò@²›cö:k”Â'Ÿ5Š)™Zb+ &u˜Ûœ6:ÒI£¨3=p¬9x ЙdÊ,, g ÃH9Çù±'ªz¦ ×Ë?e”x¡)‚ÈÅÊ)£ØÛÕâ{Ýô2J|Ïq)ÿU¿ŽqȨ.¯aˆñŒQ¾üÆþø!14wL÷:Ê÷Wyà^eQ¦nÛôX”Yã „®ATqîèâmshêÆ|Ðg^ñ|ßdG=u“€u–'•ê-–÷›­®3á€ù†¦Ñj?Þ”Ðñ½Ào:Ùº^Úñ¦D¡C!õœÀìü˜z=²+t¼©%ÈÔy ê?ÞÔ"dêBhèñ¦9²Ç›ZÈö9Þ”„ÔqxývµÙ^4Ò ¶ÌW‰4ëîV2v/¹C`=« V•t¥ F]†‰…]½¦ ý +ýFh”Á'/­tŸjùÎ0´aã¡ô¬…–ν>æ™ÃDÖ—d›¯’8ûV¬~»„{ñîú1²÷ý³WCOWµŒ[Æ[Ö‚,ñV†&HSÛÊPéÉŸ†›iuHö~ꃳ擗ÀÚ©è*‚r[±Õìi繊MjŒ myëߨ&,fƒ_ŒY|¿¹ŽR¹$Ñ”@ý¥ÜE,ÂaLyÇÓèÇý*-w뉢<ÑÄ„Ú/èΓ4*–’>},~ÿœ#ÝGø×ÿ>}® endstream endobj 3927 0 obj [ 3926 0 R 3928 0 R 3929 0 R 3930 0 R 3931 0 R 3932 0 R 3933 0 R 3934 0 R 3935 0 R 3936 0 R 3937 0 R 3938 0 R 3939 0 R ] endobj 3925 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 3927 0 R /Contents 3940 0 R >> endobj 3941 0 obj 2289 endobj 3943 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 740.639 298.56 749.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3945 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 712.139 298.56 721.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3669 0 R /H /I >> endobj 3946 0 obj << /Type /Annot /Subtype /Link /Rect [ 301.06 712.139 316.06 721.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3473 0 R /H /I >> endobj 3947 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 659.639 217.905 668.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3948 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 595.139 357.62 604.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3949 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 530.639 298.56 539.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3486 0 R /H /I >> endobj 3950 0 obj << /Type /Annot /Subtype /Link /Rect [ 303.56 530.639 318.56 539.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3696 0 R /H /I >> endobj 3951 0 obj << /Type /Annot /Subtype /Link /Rect [ 323.56 530.639 338.56 539.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3473 0 R /H /I >> endobj 3952 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 478.139 217.905 487.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3953 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 449.639 347.06 458.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3954 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 437.639 314.68 446.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3955 0 obj << /Type /Action /S /GoTo /D [3448 0 R /XYZ 72.0 668.804 null] >> endobj 3956 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 397.139 298.56 406.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3955 0 R /H /I >> endobj 3957 0 obj << /Type /Action /S /GoTo /D [3448 0 R /XYZ 72.0 635.109 null] >> endobj 3958 0 obj << /Type /Annot /Subtype /Link /Rect [ 303.56 397.139 318.56 406.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3957 0 R /H /I >> endobj 3959 0 obj << /Type /Annot /Subtype /Link /Rect [ 323.56 397.139 338.56 406.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3957 0 R /H /I >> endobj 3960 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 356.639 217.905 365.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3961 0 obj << /Type /Action /S /GoTo /D [1516 0 R /XYZ 72.0 559.661 null] >> endobj 3962 0 obj << /Type /Annot /Subtype /Link /Rect [ 326.92 281.281 387.73 290.281 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3961 0 R /H /I >> endobj 3963 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 240.748 217.905 249.748 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3964 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 176.248 298.56 185.248 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3965 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 111.748 298.56 120.748 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3486 0 R /H /I >> endobj 3966 0 obj << /Type /Annot /Subtype /Link /Rect [ 303.56 111.748 318.56 120.748 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3750 0 R /H /I >> endobj 3967 0 obj << /Type /Annot /Subtype /Link /Rect [ 334.39 111.748 349.39 120.748 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3473 0 R /H /I >> endobj 3968 0 obj << /Length 3969 0 R /Filter /FlateDecode >> stream xœí[s›8Çßý)ôØÎ4T@°ÓéÌvº»Ó}ÚKfö¡í±Ií© )ÍäÛ¯æNp¬µÏ¶Ý˜!¡Ÿá„.?añçJþðlbyž–»Åe'ˆSÄ\er°eSc†¨mQíPÝä ­8§úêOâG-­8^£Ñ£ßŸ¿Š4+„Åy Ü“yžÕß‹?+¾©â³IþaômñázñöWŒ®o÷—˜ºv\ß÷)AžÅ¨/ÿ£èz‡>¿º^‡è¯ðöã´ÜnÂ({›†É¿aòú+ºþ½–ñ8ƘrDq#‹e¼ÛÝG›emâÝ%q/ãm‘Ã/×µ+Ç0¶<Ó.ÜŸ5xœs 7ÿl‹6a)r”¿ª9Ò<,J©YŠ?{]Æ-qÕá6‹Æ8סË-Nˆïsß¿²¼D ûCÄS½6,´Î‰“'¾ÊÿŸÿâŠÊ*SqàäŽrϲ±-êß<*Šâ(ƒ<¾¢Ã^ùe´2+î^ s5q-^/UXºÜè)}BÖM {~A$½*•¨f«deè¯xy~¹õTùÅÚ©Z¤ÒN•ë½÷hÐܪJí»À›ßœò :vñ H³ð®ó+@¶|<È=T¨:€ªgðSmÊ'#T<Â;!¢„XŽ Cc·¡Šþk2䋬 ܈¢1ˆvašßB”=ޅݲŽSËãÓHr㑤ó#©îƒë4¹šŸ4ÀlÂóNDž}¼B‡‹¬;;õ-‰zMP„ež[’κéCa××\§õl•¬ ƒ5×¹õ•[O•‹ì}‘V…›ˆ¦øPƒ¨Z| ŠÛ‘'Ý)“ í}Æí}Ð}c<¨‚ ¥ %þ>¤q㤮y÷† 8€Ò‰PÊÖ!z®¸C-ŽX•S5ÞÌ`Di#4 ²ût@Û¶ôÎ "•AÖ³^¬CgÂMgÝô¡°ëfÓ©D=[%+Ã`Íun}åÖSå:x_äQ<҇Õâ»Ô-` Gnp¥n¡½Ï¸½zÐBO)i›©P3 ·:Ry˜ *e ¨+H “$î~· Ä²q¨ô‰å ;@Ó‰hRb™zÄ¢¨`«r| ^ÎÏtm&¼|õ°Þ,×­™my cL<¦Ê“Ý& ²0?™ø\Þ¥W­Sm·qj*œÛÄÑ€H÷¹aa£2¸vsמ suӇ®qÑ©D=[%+Ã`Íun}åÖSåº|_ä‘>ŇÿÕâ⟠ö\@¦tjNÊžÌA­÷îÓÇ«í&ÍÞß1¿|Áåß¡Ñ&€à#Ø¥ô¡ÁϸÁgì7Ž“>™_P:Jóõ‰¿Éuº+£ƒÛx»ÂÕÞró8®ø™ÜñdòRü¯ö¶4K6Ñ·qõ¿Œ£,ØD"­<׿–‡Š¬‹ò)¼?Šo[ŠÒêFq¢O‡:ý‰K ­/ö el@a …‚ !èØrN…?ß?4„|· ²àýxèWxžIãcL‚sY2- X¨#QxÞÅIVµ7ñ}6 è—[½ºÛ,¿WÕ â`u¿»‚¥œ†= PjÚˆ´‹}ƒvêñ?€‚1(¹Å•¤‡?ç?lÞ ¶'¼zÓD»ú m¤bS²²;²KÀS™Ç Œ&2'%Ä a•`¢b©«Œ.‚GÕ±ïà<.ÉÖAV; “vÒŠ.‚|TwÝ<˜¨|¾Kâ›m¸{3[„ÑJº"k6>àˆrϰ8\.oбseÁ@1”ÞÉ“* RΘ”NÝ-~Æ->ãëó@ù²æ²ô"óe6m¸Úʼn/Ùa~ˆî 2‚Œ!è t\hðsnðƒ‡Î¤÷»]<Î2µB j ›$¨ÍzÁÍeiîñ5Ô“®—#lÆû½oåyžËÊnoõY.öDíÚsk‹›í w|ÃbLe°q“wÏĻκéCa×ÜèT¢ž­’í 5×¹õ•[O•kø}‘ýj_„jñÊP0…#·¸VæÐàgÜà‡€¡|®0”zs€¡¬{N)ü`xâóXéÓþx§ᤵ?©¯§£Ž•ª—ÿzf¬C–‡]ëâ´ÔÿjlãoCkWblX4{z\+¢…´þô\ŽŸ&éK7æ×óä)dóÁÞy`j St>¨þ7Ç‘-ÀÐe2ԥЅËdaÆN{óêîäÅT;æ«êÐ1ùjD,†ò5sG>£DžªF”ï OSõr“U[¤LT…˜ÜàÕnTÉv™E™Èˆp¢»F,a—ÅBé2ˆ¾?YÊëÒqQlOüu-›qßó¨·ßïx‰% ¶èç?>!õZAõÌtì;ED íÊg~G~U?:| >±ׂ3Úq¶(=IÂô.ŽV)ÊâVO“c[>E{„wœ„·«›à§ÚµØ÷?Çâòâa¿Ëo«lV„åËúØ¼ÖØm×^fóÚù6®$Š ©ç¥ËcêôT›òIo[ Aƒ· ñMk!@h¡©[ÖNä6­Èž²a­#ò%xúvtyk]½ä:Ó7î”Ú€9øœ’’iKþùc˜å;Ÿ\µÇW¶z…ò… o‚4Œ‚]ØÒÞêý™º[°{Öìv‰rhò³nò™^†H ,j&H†L_`¸Ø# ðF•;L˜ÃP>™mš{Ð7û¡µþgš•[tî‰_á– †|É6`>Æàsl‘¦d9´ø9·øÜ»È¶KÀpMÌ£3A2m€¹7 #>%VÏlŠV, Ç6%az¿zëàÚŽi¶2œp€Š…i‰®?Ñg. ð´¥J7Æ"…Ã× `Pk~ ct><¨+GtDÀÂ…²pŠ}(ž6«ZÎS¬§µòQxðÀ80þ̉×"Ի꫅+ÇDŒ óUuè˜|5–›2/½)˜WŸ‰­Ž dò3];¿ÿ°Þ,×ã¡K¯¤EÌÁy_ÌÑ~sÑÚh@þù ;PÉ endstream endobj 3944 0 obj [ 3943 0 R 3945 0 R 3946 0 R 3947 0 R 3948 0 R 3949 0 R 3950 0 R 3951 0 R 3952 0 R 3953 0 R 3954 0 R 3956 0 R 3958 0 R 3959 0 R 3960 0 R 3962 0 R 3963 0 R 3964 0 R 3965 0 R 3966 0 R 3967 0 R ] endobj 3942 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 3944 0 R /Contents 3968 0 R >> endobj 3969 0 obj 2296 endobj 3971 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 740.639 217.905 749.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3973 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 712.139 298.56 721.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3974 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 635.639 217.905 644.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3975 0 obj << /Type /Annot /Subtype /Link /Rect [ 329.69 561.701 393.28 570.701 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1770 0 R /H /I >> endobj 3976 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 522.942 217.905 531.942 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3977 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 458.442 298.56 467.442 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3978 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 393.942 298.56 402.942 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3502 0 R /H /I >> endobj 3979 0 obj << /Type /Annot /Subtype /Link /Rect [ 303.112 393.942 318.112 402.942 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3890 0 R /H /I >> endobj 3980 0 obj << /Type /Annot /Subtype /Link /Rect [ 322.664 393.942 337.664 402.942 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3892 0 R /H /I >> endobj 3981 0 obj << /Type /Annot /Subtype /Link /Rect [ 342.216 393.942 357.216 402.942 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3894 0 R /H /I >> endobj 3982 0 obj << /Type /Annot /Subtype /Link /Rect [ 294.39 381.942 309.39 390.942 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3894 0 R /H /I >> endobj 3983 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 341.442 217.905 350.442 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3984 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 312.942 298.56 321.942 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3985 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 236.442 217.905 245.442 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3986 0 obj << /Type /Action /S /GoTo /D [1638 0 R /XYZ 72.0 675.489 null] >> endobj 3987 0 obj << /Type /Annot /Subtype /Link /Rect [ 330.24 162.504 394.39 171.504 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3986 0 R /H /I >> endobj 3988 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 123.745 217.905 132.745 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3989 0 obj << /Length 3990 0 R /Filter /FlateDecode >> stream xœíœÝoÛ6ÀßýWð±–¢HQ*†+öíiöÐöÁ±•Ę-¥–Ò ÿýH}ØEJJ"ÇŒ}m·Xòî(þ$ÝÉä}yˆÈ¿êGÈ<†Zlf_+¹‡E~P‰8ÁŒrB|D¦mP[ÄÑZöi~ õ'ù£ÕVߢgÉŒ ßfŸ¾È6KDd¿‡±(/Tý3û«á[Õ@~vÉ?‚nf/gïåÈ#èòzŠi€ ¢(¢ ±O#õ‡¢Ë úôæò6FÇ×?D‹õ*Nò÷Y¼ýoß~A—´4x¡ „P(ÑT,ÒÍæ>Y-æù*MÐÝ6ÍÓEº.5ürÙ:s>!8tíÄýÕrQ‚'„ÀDRþǰ_ʤ¤Ô¨~ÕrD?,­´$åÊŸV—IÇcÒt¸Ë¢3ÎÙ1 žE"Šä¯pØ‚È÷H1Î ¯ ms‹ÆÅÿ‹_\Põ±R*xá¨1#LŽ_?*MIÇ+:¾ ý^—zKeåÝK7Ûym«RbrÃb}„j݇R^œEoÕJ³c¹Ø¾ëo·ÛnUœ¬½ÉjFóÔ8ß{z ¡´®¡_ ¤¸ŠrV^Yß/Ï'8"½LÑCAEªGPõ ~šSùd„ÊG¸"êy˜À04tjÄ:C‘TíÁ ‚hgÙü&Fù÷»ØÖ ŠC1ޤ€ޤZ÷Im®s5=i€ÙˆçÌÏﳞ ˜1åCDVÑÉžÄTyº°$P¢•̈}Õ±,Fd5¢“@ CÕ°Ù49"(ãC‹CaʬÆpÈzƒbÈ€À‰!¶…ù>áù~Z´k¤"a½ÕËy>ÿñóg²û×û>ð¼ÆDÒÎqb‹¤àJGBiºHúꪲ8ôæ:]¯Ó‡x¹—\}ï¨ñ}y£ôB¿T3WÍy¨šçñv³Jæy©¢”eùv•ÜtÔ°@S³H“|¾JdÛÂ|D峩qvºJ½z×Ífž”n{Q¤úmãì~wº ¢uÍîe×í÷¾wìÒ·2ÜJÀˆ~Ñ12ÑEW«Ö}(å­–^ÝןTFvWcÇ%6¼ÐÇ`…t/ƺUËøp’1h_¿D Õ¾>yÿkw`jSt:¨è¨šŠòÄ[üÐy`è,2¾¬Î’…)ßã;‡-ý(æðeóúùj:tH¾þøš8%ñ%²kœ,«” ˜2‚NN²\Í×éMƒwµîÉ–Ûj@¾ZsÏô!…>æT:ÄK-ÔÇ>–'%À(‹×ñ"_^•*Õy1œ"J,Ý „ûb¿e•ÈÌ(™¯ÑOþŽvÙJ¡Ê°ÈãÔŒû‘A_Ûƒ^ÄÔþŽ( |fè/íoevt—&Ë å)Ò÷ÂpƒHí…a¦ÞÛøzyµø ]o5GTHÛ¡0 ¼›=Ë¢žÀŒ ØSàìj¸—ÙS0Ý~‚^¢(,äu©gÐÓœÊ'4¼›‚ž¹—„¦ØI0’#ØK=eõ}ñ:öí(`:&›èvT«Ö}(åõ¯[Éqv,W‚Þ‘×ÚlvÛ­ŠÐzorÄ÷c|h!Ô4?:·÷úCmÀÇ|ŽIɸå3–W†·AË«d¾‰‡ÚTá:PxÊÃk˜òSžò‰¾ÚpÛw l¤#€4õ²*ªn·°jø‹‹«ïÅW¤\NUzSíW /¦Z¯2ù„}o}ÔZ—Peùn±–9SˆBK" w\ÈÔwfý™àã >‡ŽÑª¨fü”gü¸[+.€kDüï%ÿ» l«0äͽƤÀ¨k v%PS×6ËéDWO­Z÷¡”×Ö­ä8;–+AïÈkm6»íVE°79")ãCë²jš7EøÀ‚;,xÊ«fü¤g||æOèˆ_=™|Ö¡7zãsNåó‡zQÊõ•¦2à^…{„?Âaʈ¡H7¥Öœ³žæV#\…s\ºFýn¯°s–„ßÓüÝp¼‘nõ5¼M-æ;,9\Îp9+Nâí65/n«Ò*A±¥U r€¥#°T¥U4ôTêRÕ8~dfUô ˜¯ò˜‡ÛÕâv8—Ú%PY™ aK‚:ùS&[¥I_½)»öz¡œ_³—,Ã:Q VÀÇ|ŽIÉÀvoÀä¤11Ž‚)?å)Ÿªl”{”@ V7Az¡ò«Î­¶«çW¥ì% °NV|ðqŸPbŠlaÆOyÆ]|ฆK¯:G _u$X!ôR…W9%®%¶•À©ªvgPyu¢ª«Ô™–Iœê<t¦™2 €áLa˜(çp¨¸ªÛq®×_m•‡Ò[™5"ÚåVFßVñƒòn¨Üj@¸º„ÁåV»úÚžXÊ­~dë?XnUæjª7¡¾¡wQnuþA;ûå¬rJýHÎ ¸¡·½Üj ³Ì€1(·êlÁ°×Vnµ—(z(¤ž&SÏ §9•*· A½· ár«€ Ô‡ÐØr«#9‚r«ÙSÊ­¾=#^Ǿ±Ú@C²‹zëOô™ežV\i|×(Y¸z|m‚G§ûýX¨Q@Ñ鈢¯¬°Å¸Å5–× †WGŸÒ»|•&Ù—±ÕYÑ3EÔ§ ç ÃDß8ȵ¢S;?$_p5:$\Z)+á:•*¯õãZuÕ’zAÖðÊ-½Î«úû?²ì‚ó endstream endobj 3972 0 obj [ 3971 0 R 3973 0 R 3974 0 R 3975 0 R 3976 0 R 3977 0 R 3978 0 R 3979 0 R 3980 0 R 3981 0 R 3982 0 R 3983 0 R 3984 0 R 3985 0 R 3987 0 R 3988 0 R ] endobj 3970 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 3972 0 R /Contents 3989 0 R >> endobj 3990 0 obj 2176 endobj 3992 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 740.639 298.56 749.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3994 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 676.139 298.56 685.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3486 0 R /H /I >> endobj 3995 0 obj << /Type /Annot /Subtype /Link /Rect [ 303.56 676.139 318.56 685.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3750 0 R /H /I >> endobj 3996 0 obj << /Type /Annot /Subtype /Link /Rect [ 334.39 676.139 349.39 685.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3473 0 R /H /I >> endobj 3997 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 623.639 217.905 632.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3998 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 595.139 298.56 604.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 3999 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 518.639 217.905 527.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 4000 0 obj << /Type /Action /S /GoTo /D [1856 0 R /XYZ 72.0 567.083 null] >> endobj 4001 0 obj << /Type /Annot /Subtype /Link /Rect [ 331.93 439.109 397.19 448.109 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 4000 0 R /H /I >> endobj 4002 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 388.359 217.905 397.359 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 4003 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 323.859 298.56 332.859 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 4004 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 259.359 298.56 268.359 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3486 0 R /H /I >> endobj 4005 0 obj << /Type /Annot /Subtype /Link /Rect [ 303.56 259.359 318.56 268.359 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3918 0 R /H /I >> endobj 4006 0 obj << /Type /Annot /Subtype /Link /Rect [ 334.39 259.359 349.39 268.359 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3473 0 R /H /I >> endobj 4007 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 206.859 217.905 215.859 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 4008 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 178.359 298.56 187.359 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 4009 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 101.859 217.905 110.859 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 4010 0 obj << /Length 4011 0 R /Filter /FlateDecode >> stream xœíœÝoÛ6ÀßýWðq•"EQ†+öíiÝì¡íƒc+‰1[JmeEþûQ"e‹õ‘TŽ8ùš¶¶.äñëGéN:Ýç…°ø¹*>¢À÷¢(F«Ýâ³’ûˆDC%bØ Ø"x„¡ÒE mEúR}ZYq|þ^¤ Œ~]|ø$ʬõ¾,p‹òRÕ_‹÷µ¾©â»KýÃènñîzñö†|Œ®oOSLB³0Žcâ£È£$.þt½C¾¹¾OПÉíOïÐj»IÒüí!Ùÿ›ìß|B׿küˆcŒ G*VÙn÷˜nVË|“¥èaŸåÙ*ÛJ ?_k3G1ö"×&î½ÖEçÜÃ&â_àQ)©±ø•ÖóP¶¢Iäägk—q£Ç¸Þá&‹Ît®Ã{Ü÷ã˜Ç±ø•iQßï"Æ™á5a!:'¬,|Uþ_þâŠ_•RqÀÊŽòÈ p Æoɦ„ÀgJP_‘î^K½²†2yö2Äõr~èq½U!±u£¥õªÍ>Hy9!½ª”f£e%hø±~{»z©r²NMª©­Sm¾O=êìn EÛ ÜÜ ¸ÜåY wÀ!O¬[À§Ø‹q'Sä\P êT}?õ¥|1Bòn…ˆø¾ÇB`ê; Õì?“¡X¨öáDõA´K‡å]‚ò§‡ÄnÖqâE|I!;I•î>’ô>„Ìäj|Ò³×;áy¶]ð¤.T[›ú”&(a0Ò)©RmöAÊ«9¯J‰q6ZV‚ΑWÚÚÚÕK•Fö©I¯ÆM DCú ATo¾ÝÅMÏ“tÝ+‹ ë=ãõ~ÖyclÜõY³Ô÷ëe¾üáãG|üÛi:^€—'û§Ë0vŽÝP> jàJ¡”ß'è ºâŒx °jÊ3Ndbè8äËüñðmQµ`}s›m·Ù—d}’Ü<5ÔÐÀ‹¨8Qú•j–EqÅód¿Û¤Ë\ª²C¾ß¤w 5Ah¨Yei¾Ü¤¢lÙ|LĵãlTzͪ»Ý2]£}rxÜv¹.¦Û¡-¦ÅÂéÍ22Òþ©T›}òŠÃª”g£e%èy¥­­]½Té œšà 郶±êÍÛl| ÁμàÊÆ‡õžñz?Ï÷ÇÁ_\p«ªÈ(E­ª²½©M\ŽŽ—°F…ÛŸ‹W° ,KR’ý>³?·Q>…s¨´ù5v€¦‰hR>‰üÂn/Ùª?Ó­(k†-Œø/÷›Õ}¿#qôÒà¼Íh8ѹM–v= Ô1÷Z Hdr.$ãp^©6û å/U)1ÎFËJÐ9òJ[[»z©ÒÜ?59ÀöÒmԛ֠݀ Wš”ã}b{Ä 2gR¬÷øaÅg¼âcÞäw”6‹¼F°4KãÝåñs•€7"«øX1|¼%¸ŠkNü\Õh™ˆxâà*n ®ªµYor€e<¤ˆÜu5Ä '`r„ 3€b˜Ÿï‚»2|_ƒbf\¥Íœ®‘,MÄÍX‚fŠz~õêñ3µª›wÛEÕýS‡OAh䘛«67]€GÚt•j³R®•ô+ ¿ú&TUÕÅ4ºôM ³µ‚››±*¥5Þïhô¶onÑRõ³÷'ëô2€©!L‘ñ "/ j,~ð Oñ=wæ¡ËdÈæd —Ɉî‡{µ¹å¾b~7_õ“¯ýøÙ%¡ÂU“t­\%°y Ÿd½Yn³»ïE^œ@”Ü«Ñ"'O` ‰bêQ?.E©Wt‰xbZ"•‘?멳˜ˬ¢¢lˆã8b”rTmRá¥Ë-úñßÐÑ])UYÞöYì…Å’ÓØ¢O눥~z´šfuÑü^xGYº> ¹]߬¾Ógã3J˜§æ/°TöŽ b:YTp‚)drö]ù×É84^¶¡. dùp©¯€§¾”/â§?Õu€úó A@PAC“ ò c/É0DÃÈc6º¦>]Þ{ø¯™bh°So}ïhe=®Ð3%$Ãgì· ,7úck”‰ô͘>«I +>ãéI†{@ö!79;ˆŠD…áv £êLqóT>ØÀ2xJö¦::†Rõ‡N©+«¨Mʨ ýS‡üšeõJí¾'œoÁ;èM> ô8CϹí3iÂÏyÁ§}ضzM÷ ÓßMŽàý‰—$ bî˜k­——akꬣ€‚3(œyÅ+ã|Æ >MÎQ>EÎQ@’pÔ=N 㨛(Í:Û(nùÔJpy9¼^3ÛèH™Fgè™’žw™’9Sb3ÂaÅç¼â#ÝÎwÈ0ê&G¯’]”q×Ë”àòÒo½fvÑ‘2‹=ÎÐsHlF-,øŒ|Úh` Øê7Ÿƒ2ŠºÉDüV6Ñ1Ç\Z%p*SÛd)“(ð4„'2»ÌcÝy~.“›S,\& #¹îáDÍvÜeËéì¡ÅÏmäÊ endstream endobj 3993 0 obj [ 3992 0 R 3994 0 R 3995 0 R 3996 0 R 3997 0 R 3998 0 R 3999 0 R 4001 0 R 4002 0 R 4003 0 R 4004 0 R 4005 0 R 4006 0 R 4007 0 R 4008 0 R 4009 0 R ] endobj 3991 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 3993 0 R /Contents 4010 0 R >> endobj 4011 0 obj 1959 endobj 4013 0 obj << /Length 4014 0 R /Filter /FlateDecode >> stream xœÍ–MsÚ0†ïþ:¶‡ª«Õ÷‚“Ò’6Á¦=drÈH˜á£¡´ýû]ƒ X ÎèF˜Œx­gµûj­·L0 Ï‡êâ”àÎy6^doõ¸`™4õ®PH†Š£f ÖÒlNÏß`sG—––¾¿²Ù2v“=<’æ™=÷7ƒÈäÛ©Šìþ(¶Z@÷—°—¬[f¯5ÀÊé!Åh8hã½GÁ—è«?då‚=¼+_'l8™öºl<ŸM–›¿&ë?“õûGV~nÍ œ´ !˜b¼Z,~/gã§Ílµd?׫Íj¼šïfÈËVæ$w—–¸ûVˆdÍæ“çúñû§C¾Ð²á™ó<­e¿(F©8«¹Eê÷˳çqÎÊ»ÎM^$âx®¨D‡tºó<"Þºƒ~ñ)¦B•äBÐD`Dõ¨Ö” wƒÎUj^…5Ü"/W3"Lçi‘ûA"Eµj”ˆX±Ñtz½a^¤Ö•âÂSQ¬lê‡aiHGÃä5QKwž<§Ì~i2‚s>Ž(½üZ$2¥\;*ÍÔ0Õy¦DHk&¦2•æH Ö;»wK¤ËHmiÍ”©L븷úhS`¤ÑHmeMT©­M 7tR5½ #ÍFÑ›¾-­™:•© —†J¸gFŽÒ.Þö‹«Tû(tl£úX½·O¤Ù(´¦zG É­¦ê(×xGF:FH+`ªq´²\éí‹ qŽŒô­} ô¿~IM©v‚ š†ºISCi:ÚË@ZSSjèÜâ›kj(#mÇл-­€©)5Êq-•·R¨é9Æ@ ­€©[Ñ8äH‡zïØi8Æ«@Úéå°sUƘ۳à}ö»§,Ü endstream endobj 4012 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 4013 0 R >> endobj 4014 0 obj 776 endobj 4016 0 obj << /Length 4017 0 R /Filter /FlateDecode >> stream xœÍVÁŽÚ0½ç+æØ0cljíK¥]ªöP DÚÃjQKÔ$Þ5¡hÿ¾A‚ÚDÈÎd¿@ò£JˆLC/D¦«jWYÚº†7£éÒE˜$æBD"ï¸y'E+"²#¢á-ÅÜMy}±°6/$ñÁd†Šç²·õd»’[ÊÎ,Åýös–L–°Ö¦J›¦¨_ae¾:®>C_¢qFBKRžàÄu¸ˆ{žËɯ‡ÅC2[ü'¤ˆ{ò:¤”ž§É+Ý䮪¢.¶qgÉ?`R«$T]¥Ì§$Ûåjôå-5öäƒî9ÖbïL~œûÔIŽà‘OÎôût{Sزsc´¹$|Æl×@R>#»úw­÷õ¡À´¾Í'£=Ýp6 SæWïÞ4J®`Û|”· dÜgÅŠ~-rûGÆ‘p®Û-Ç|œÜ„OÃv ûýp¹mÊZÒ0>†`!á­Ëm«uhl7t}päúàµv6þû.êà endstream endobj 4015 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Contents 4016 0 R >> endobj 4017 0 obj 572 endobj 4019 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 759.389 260.903 768.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3346 0 R /H /I >> endobj 4021 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.075 759.389 525.075 768.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3346 0 R /H /I >> endobj 4022 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 747.389 230.938 756.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3349 0 R /H /I >> endobj 4023 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.309 747.389 525.309 756.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3349 0 R /H /I >> endobj 4024 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 735.389 373.8 744.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3352 0 R /H /I >> endobj 4025 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.265 735.389 524.265 744.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3352 0 R /H /I >> endobj 4026 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 723.389 314.149 732.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3355 0 R /H /I >> endobj 4027 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.771 723.389 524.771 732.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3355 0 R /H /I >> endobj 4028 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 711.389 252.741 720.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3358 0 R /H /I >> endobj 4029 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.139 711.389 525.139 720.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3358 0 R /H /I >> endobj 4030 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 699.389 279.63 708.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3361 0 R /H /I >> endobj 4031 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.061 699.389 525.061 708.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3361 0 R /H /I >> endobj 4032 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 687.389 253.837 696.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3190 0 R /H /I >> endobj 4033 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.999 687.389 524.999 696.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3190 0 R /H /I >> endobj 4034 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 675.389 236.496 684.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3366 0 R /H /I >> endobj 4035 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.265 675.389 525.265 684.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3366 0 R /H /I >> endobj 4036 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 663.389 300.969 672.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3369 0 R /H /I >> endobj 4037 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.761 663.389 524.761 672.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3369 0 R /H /I >> endobj 4038 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 651.389 311.102 660.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3372 0 R /H /I >> endobj 4039 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.797 651.389 524.797 660.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3372 0 R /H /I >> endobj 4040 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 639.389 321.627 648.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3375 0 R /H /I >> endobj 4041 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.707 639.389 524.707 648.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3375 0 R /H /I >> endobj 4042 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 627.389 312.207 636.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3378 0 R /H /I >> endobj 4043 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.787 627.389 524.787 636.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3378 0 R /H /I >> endobj 4044 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 615.389 305.575 624.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3381 0 R /H /I >> endobj 4045 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.843 615.389 524.843 624.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3381 0 R /H /I >> endobj 4046 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 603.389 391.15 612.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3384 0 R /H /I >> endobj 4047 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.001 603.389 524.001 612.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3384 0 R /H /I >> endobj 4048 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 591.389 263.158 600.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3387 0 R /H /I >> endobj 4049 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.057 591.389 525.057 600.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3387 0 R /H /I >> endobj 4050 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 579.389 359.865 588.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3390 0 R /H /I >> endobj 4051 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.301 579.389 524.301 588.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3390 0 R /H /I >> endobj 4052 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 567.389 364.987 576.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3393 0 R /H /I >> endobj 4053 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.19 567.389 524.19 576.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3393 0 R /H /I >> endobj 4054 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 555.389 359.953 564.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3396 0 R /H /I >> endobj 4055 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.299 555.389 524.299 564.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3396 0 R /H /I >> endobj 4056 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 543.389 381.274 552.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3399 0 R /H /I >> endobj 4057 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.133 543.389 524.133 552.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3399 0 R /H /I >> endobj 4058 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 531.389 362.878 540.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3402 0 R /H /I >> endobj 4059 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.277 531.389 524.277 540.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3402 0 R /H /I >> endobj 4060 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 519.389 469.22 528.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3405 0 R /H /I >> endobj 4061 0 obj << /Type /Annot /Subtype /Link /Rect [ 508.444 519.389 523.444 528.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3405 0 R /H /I >> endobj 4062 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 507.389 360.244 516.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3408 0 R /H /I >> endobj 4063 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.225 507.389 524.225 516.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3408 0 R /H /I >> endobj 4064 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 495.389 243.131 504.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3411 0 R /H /I >> endobj 4065 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.215 495.389 525.215 504.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3411 0 R /H /I >> endobj 4066 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 483.389 256.497 492.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3414 0 R /H /I >> endobj 4067 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.109 483.389 525.109 492.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3414 0 R /H /I >> endobj 4068 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 471.389 287.871 480.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3417 0 R /H /I >> endobj 4069 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.992 471.389 524.992 480.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3417 0 R /H /I >> endobj 4070 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 459.389 265.302 468.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3420 0 R /H /I >> endobj 4071 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.182 459.389 525.182 468.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3420 0 R /H /I >> endobj 4072 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 447.389 276.309 456.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3423 0 R /H /I >> endobj 4073 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.09 447.389 525.09 456.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3423 0 R /H /I >> endobj 4074 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 435.389 446.672 444.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3426 0 R /H /I >> endobj 4075 0 obj << /Type /Annot /Subtype /Link /Rect [ 508.621 435.389 523.621 444.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3426 0 R /H /I >> endobj 4076 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 423.389 265.302 432.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3429 0 R /H /I >> endobj 4077 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.182 423.389 525.182 432.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3429 0 R /H /I >> endobj 4078 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 411.389 276.309 420.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3432 0 R /H /I >> endobj 4079 0 obj << /Type /Annot /Subtype /Link /Rect [ 510.09 411.389 525.09 420.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3432 0 R /H /I >> endobj 4080 0 obj << /Type /Annot /Subtype /Link /Rect [ 192.0 399.389 288.436 408.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3435 0 R /H /I >> endobj 4081 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.986 399.389 524.986 408.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3435 0 R /H /I >> endobj 4082 0 obj << /Type /Action /S /GoTo /D [4015 0 R /XYZ 72.0 507.889 null] >> endobj 4083 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 387.389 333.557 396.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 4082 0 R /H /I >> endobj 4084 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.505 387.389 524.505 396.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 4082 0 R /H /I >> endobj 4085 0 obj << /Length 4086 0 R /Filter /FlateDecode >> stream xœÍÝËrÇ•€á=Ÿ¢—ðÂíÌ<'/Ç»‘d{”Ã^SAvQ÷)ïnw§Ê»?æÕÒóŸúNÚþøÇÝÿ¼¹{vxó׿õæÝ.ôãþù&|æÉÇS}ÿæ»W¯í)èþ%½¾°ûðæ«·o~óû¼‹a÷öýü)Ö°µ˜Y)»¶—dþi÷öv÷׋¿ÞóÕîÇË»w?Üßÿô«¿íÞþכ߽=ùçJûöKû×~wòûWK­uÎ¿ŠÆÓÈô±þ‘éý:y!ç§¿åä#Ó¿`úïg_rX¼âðú/¿€~1/îó_;Åö&Ñ¿^úËî_'_<ÿ¸¾þÿ¾b~1ÿ¼åKò×õùµ-¿Q¢íã~÷«Ý¯-ìãî⇻ÃÃåÍüã÷Ÿ>üx|œ>!/Ï[Û[ðgjmñœóÑçGYÚKÐBÿ4žµ_Ä™Äm{œB$±’¸‚¸áXH\Hl N@0% ˜"(DPˆ A%‚J•f"˜‰`vA±–—?fm‰ UÐÖím  ÐÐÚö¶%ÐfÐ7nÜl»›ÿÞÞnw“°ÝMÂv7‰ÛÝ$nw“¸ÝMÒv7IÛÝ$7nܸ pSà¦ÀM[n¸eàV€[n¸àV[n¸5àÖ€[nÜ ¸p³ín¶»iØî¦a»›Æín·»iÜî¦i»›¦ínš¶»in}|]ª†“lŸ ª´}¨9ÄÔ§àçG¥lgyŸºú§å|îšÆÜ5ö ]Û]üñîxxxyuXÌVûÈÔ¤õésÖåÓ¼z†óãJÚkÎfRòò¸Å´dT7R׈jEu%u ¨TT© Y²4béˤ&–¾êH,} ‚ÔÄÒ!@ˆ¥/CY ²d)ÈR‘¥"KE–Š,3²ÌÈ2#Ë‚, ²,Ȳ"ËŠ,+²¬È²!ˆ,²4diÈÒˆ¥¯VšXúŠ©‰¥¯ZšXúʨ±ôÕ R#KA–‚,Y ²Td©ÈR‘eF–YfdYeA–YdY‘eE–Y6dÙeC–†, Y²4bé+¤&–¾êêH,}åƒÔÄÒW?HM,}„ÔȲí«k9F²Æàë šYж«%µ º ÚHÝgµ¤Î¨n¤–ˆjd)ÈR‘¥"KE–Š,3²ÌÈ2#Ë‚, ²,Ȳ"ËŠ,+²¬È²!ˆ,²4diÈÒˆ¥b©Xj –ˆ¥Fb©‘Xj$–šˆ¥&b© Y ²ì?íS±“fð _ûýTrˆZV[樮 s¦S>U÷¶»øæúápu¼ùyþÈñòæ§Wîç??Þ¿ûáÝb­²›ÔBH¡-ÿ¾ùàÅayß¿aÌòò århÛÞúéþÍ­‚¶ö¶…Ò–ÚOøƒZP]Pm¤öÿ Î¨n¤öÓÿ VT#KC–†, Y±”@,%K ÄR"±”H,%KIÄR±”D,%!KA–‚,Y*²Td©È2#ËŒ,3²ÌȲ Ë‚, ²¬È²"ËŠ,²lȲ!ˆ, Y²4b©Xj –ˆ¥Fb©‘Xj$–‰¥&b©‰XjB–‚,ût"§BÿUà>¨5˜•`ËÃúö¬·²óŠç³ ™ÞúÔwo¯?>Î.ïÞÍŽ×W?-ßÕ§M}öiUâòÉ烇é>VéÃv«ËÃÎ?=±ö@í;í@-¨.¨6P§>Ø#uFu#u쑚X¦H,û÷ª‰eJÄ2%d)ÈR¥ KE–Š,Yfd™‘ev˧ݷj#uI¨Î¨n¤®ÕŠêJêP-¨F– Y²4diÄÒO’šXú™BPGbég IM,ýL!¨±ô3…¤F–‚,Y ²Td©ÈR‘¥"ËŒ,3²ÌȲ Ë‚, ²¬È²"ËŠ,+²lȲ!ˆ, Y²4bég IM,ýL!©‰¥Ÿ)$5±ô3… NÄÒÏ’Y ²ô}!áiÿÔö ²oˆŠb!Ô¼2üM%žO5SØùÂárn?mˆòw í.¾½üp}÷a~|ÿéøñÓq1W¬ûâÏ£­-Ÿs>xeÒ’N'‡­MI]IÝ'¤TT©û¤‘ÔÕÔŠ,Y*²ÌÈ2#Ëì–b­´´¥6R—„êŒêFêQ­¨®¤nÕ‚jdÙ¥!KC–F,}ÒHjbé“FPGbé“FRKŸ4‚:KŸ4’Y ²d)ÈR‘¥"KE–Š,3²ÌÈ2#Ë‚, ²,Ȳ"ËŠ,+²¬È²!ˆ,²4diÈÒˆ¥OIM,}ÒHjbé“FRKŸ4‚:KŸ4’Y ²ô‹‰”b–¢)ظšH‰}æVtyØrÒXÓÎ7mœVaš/–q6xzËÌôàÛÃÃÍühz×Ìüøöþݧ›Ãù¬´Å}ë?’B.+Õ|ðâ°¼÷Ë’Z±¼<ìü“åWᵯ ZQ]A|MÔ‚ê‚j#µ¯ šX¦H,S"–)Ë”¥ KA–‚,Y*²Td©È2#ËŒ,sÝ'ÆU–¾X—€jAuAµ‘º&TgT7R÷û¤VT#KC–†, Y±ôߤ&–¾ñÔ‘XúÆoRKßøMjbé¿I,Y ²d©ÈR‘¥"ËŒ,3²ÌÈ2#Ë‚, ²,Ȳ"ËŠ,+²lȲ!ˆ,²4diÈÒˆ¥oü&5±ôß ŽÄÒ7~“šXúÆoP'bé¿I,YúD¿ÿjEL}ã·ù[U“­MáK:ë­ìlñnÓð|Ï‹ñNÕ?Þ=/on.×÷wçÓZ¿È›•RZ>Íü ‹£ü5öO…Š-[Lk@µ º ÚHݪ3ª©-¢ZQM,}aƒÔÄÒ6HM,}aƒÔÄÒ6@ˆ¥/lY ²d)ÈR¥"KE–Š,3²ÌÈ2#Ë‚, ²,Ȳ ËŠ,+²¬È²!ˆ,²4diÈÒ¥K_Ø 5±ô… PGbé ¤&–¾°Ajbé ¤F–‚,Y ²Td©ÈR‘eF–Yfd™‘eA–YdY‘eE–Y6dÙeC– Y²4diÄÒ6HM,}aÔ‘Xú©‰¥/l€:K_Ø 5²ôìÏ—¼Ú¾ à{^.yµ\„X[ªˆañVö0_ðJw_ß\>>ç<½O}zpüñpý0?|ÿéîÊ5Îß¹î·8°ÒÌ4êÊ_9?Áb’ö}¦hVuí¸å´%³¼¡ÜWôI®,¯(÷E}’ ËKÏ¥ýÕMµ‘Ú—õAQÝHíËú VTWRû²>¨ÕȲ!KC–†,XúnmRKß­ êH,}·6©‰¥ïÖu"–¾[›ÔÈR¥ KA–Š,Y*²Td™‘eF–YdYeA–YVdY‘eE– Y6dÙ¥!KC–F,}·6©‰¥ïÖ&5±ôÝÚ¤&–¾[Ô‰XúnmR#KA–~õ®XÌZ22“—ï*a:ù»2éYÌüM¾1.Þ ^n{àßò»‹¿ÞóÕ×cöoû—ëÇw—ÇËÅ4Ãö1ô©_^yÂù™ó>+Òÿ¡WŽ[N2ËÊý*Á$W–מkˆýú–Ü/Lraya¹¡Ü/LòÌò†r¿f0É•åLÕ˜ª1Ucª†TÇ¥ƒIŽTÇŃA‘ê¸|0ɑ글0ɑ긄0É™ª0UaªÂT•©*SU¦š™jfª™©f¦Z˜jaª…©V¦Z™jeª©6¦Ú˜jcªÆT©R×&9RWyDªãúÂ$Gªã à OHu\c˜äLU˜ªOTúÊ ¥qÿ˜¨XŸàÔ°ö×ôÑìÚD%-Þ€æ—Ä}=›¨|}ûñæpsý¸¸‘ßJ%ùôÊVžt~¶Å>í›ÊÓùÅqËfyCy‰,W–W”×Àraya¹¡¼1ÕÆTS5¦jLÕjÿYŽTý&Ë(Gª~›e”#U¿Ñ2ÉRõ[-£œ© S¦*LU˜ª2UeªÊT3SÍL53ÕÂT S-Lµ0ÕÊT+S­Lµ1ÕÆTS5¦jLÕ˜ª!U¿ 3Ê‘ªß†™ä©ú˜QŽTýVÌ(Gª~3f”3Õ>àW¿£aHBÆÎcÀjoëÚqŸðëʵdÒÓÝEúOóÿïî®?Ü.NLøÙí—¿yñŒóS-Ž“½ö™PМVŽ[žk(,7”÷©Ê3Ë[ÏûüßRÙ’÷©Ê•åå}êraya¹¡¼%–g–3UcªÆT ©úÔåHÕ§(Gª>õ@9Rõ©ÉRõ©Ê™ª0UaªÂT…©*SU¦ªL53ÕÌT3S-Lµ0ÕÂT S­Lµ2ÕÊTSmLµ1UcªÆT©Rõ©Ê‘ªO=H‘ªO=PŽT}êr¤êS”3ÕqKÃ>õhµ‘ü˜z´Ò[ÿfæ‘W.nÑ¿¨¦™GÛç³™Çôßó1Oÿý•«N—”[>ãüT‹ãú ®ô4”¸rÜbhåkh ÷54’g–7”ûÉ•å}^žûL–5€åÌ#°\X^Xn(÷54’g–7”ûÉ•åLÕ˜ª1Ucª†T}ËÊ‘ªo¹"yDª¾å åHÕ·\¡©ú–+”3UaªÂT…©*SU¦ªL53ÕÌT3SÍLµ0ÕÂT S­Lµ2ÕÊTSmLµ1ÕÆT©S5¤ê[®PŽT}ËÉ#Rõ-W(Gª¾åŠä ©ú–+”3UŸ×äbÿZ#ӟ״>‡j5”µ ËbbSÓ¸ðÞY6½ÏÃ×Îvÿýøt3·éáqºXÿôà‡Ë«ŸÓ»â§üÇ·|•ÞÏÛ®nŸ®å?}èîðÏùÁt¸ùñûû‡ÛËãù»éÇ­[ûäÉÄV^ö|ôâwqÚ‡>Í·¹[·üÕYÞPîwä!¹²¼¢ÜoÊCraya¹¡<3ÕÌT3S-Lµ0ÕÂT+S­Lµ2ÕÊTSmLµ1UcªÆT ©Žõ©Ž[õ©Ž›õ©ŽÛõ€ÐÇ竨~Wœ>ª Zמ}>tqœ†z*þNÒÅqçŸ#¿Ž,ÈýB²(––Êû÷Ê3ËÊû—Ê‘ª_Q–äÂT…© S¦ªLU™ª2ÕÌT3SÍ]UýüMµ-y ,––ÊkbyfyCy‹,W–3UcªÆT©Rõåx”#U_Ž'yDª¾r¤êËñ(Gª¾r¦*LU˜ª0UeªÊT•©f¦š™jfª™©¦Z˜jaª•©V¦Z™jcª©6¦Ú˜ª1Ucª†T}9åHÕ—ãI‘ª/Ç£©úr<ÉRõåx”3Uaªãƺ}ܲ’yn®!”¶vÜú$½-Þ7ŸÞþìBwÿyÿÏùÁ´$?ýùúîñðpœ_Î|ZšŸ¼šØ?øúiÆž§•ñ_+úôŽÅ+œ^¶ÚÌ|7×â°µq © ª ÔcO¨3ª©}C¨Õ•Ô‰XŽÍ &–c+ÆöZ¥ KA–Š,Y*²ÌÈ2#ËŒ,3²,Ȳ Ë‚,+²¬È²"ˆ,²lȲ!KC–†,XŽ- &–cÃÅö:˱ÝÔÄrl¶Ø^'b9¶Z€Yú5”Ÿ7‚o¨øé”^ši«kC°ÅH­¦qžá,›Æi~[°—“)Óƒ1¨š~ÿ‡?ÿé7ÿûç?͹¾{Ú.1=|º5Áô`ÞK1=^ßKáW0·þ/7ËqåµÍ‡/ŽëÕ¢êÊaËqTµ_˜ԊêJj¿“¨ÕÕFj¿“¨‰¥otµ KA–‚,Y*²Td©È2#ËŒ,3²,Ȳ Ë‚,+²¬È²"ËŠ,²lȲ!KC–†,Xú†RKßÎBjbé›YHM,}+ ¨±ô,¤F–‚,}Ô%¡ºr&cvEëiZýkRmË2ß"±vÅç2yxMžYÓƒ—AÖôpG<žüpýÃÍõý‡‡Ë?^c-¿ëfî/"™¬¼ ùYVÖì”DÓÊqk b(/,7’{p’<³¼¡ÜoÃIreyEyBªãVœ$Gªãfœ ¦*LU˜ª2UeªÊT3SÍL53ÕÌT S-Lµ0ÕÊT+S­Lµ1ÕÆTSmLÕ˜ª1UCªã&$Gªã6 Huܨ“äHuܪä ©Ž›u’œ©NËg!†ªd`ã¹>ž1¦µÑú@.-v-?_èYçaœÎƒ8}=„Ó“œÎÃ7=¼]=ðñøóÍb$ç×}Jµí—–V^Ñó±‹B¥A}ÿu\9j9žÈ,o(÷Ä$W–W”û=H.,/,7”+SU¦ªL53ÕÌT3S-Lµ0ÕÂT S­Lµ2ÕÊTSmLµ1UcªÆT©RõË?¡©úåŸH‘ª_þ åHÕ/ÿ„r¤ê—B9SõáGx^WÙúÛx¬"õy¯å²ö—¬>d±ëù¢³~?êyi®Ž—Çëû»Ç—>ÇÆŸŸ.v3þü²%k<úæþê«ûûŸ^¿ZAúùåƒÓF¬Å÷Eÿ·%)­¼è—ƒWæ;-d3«kÿÖµùÊ3ËÊ}tEreyE¹®H.,/,gª~ã%¿€B¬|í¨_B5øyóµï“Å·“O+ü^Ó}HßJ®OÙ4Ý飞2¯¶Ö“oéáÕ¸ðíoÿ8<¼úðýíí§»ë«ñý6øãÃýñþêþæ|6Ñú”Zû/‘tåÅÌÇ/f!ñÕ·×â¸å¤EY^IÞ?Í,––Ê}Íšä™å å ©Ž5k’3UaªÂT…© SU¦ªLU™jfª™©f¦Z˜jaª…©¦Z™jeª•©6¦Ú˜jcªÆT©S5¤:Ö¬IŽTÇš5È#RkÖ$GªcÍšäHu¬Y“œ©ú”Èo—–l-ÿìÀf̉R—¹_œµ°2%ê?c¸iëcÇDŸÿtýx½\dîCÌ}ìc+u剿çX¦ûú§#¯uþ¹ˆµ‚¸ ‰ ‰ Ä–HœIܶÇ)DÁ€`Š@0E ˜"L¦û÷'‰‰ A!‚B•*T"¨D0ÁL³ öïD«›òY®,¯(¯åÂòÂrCyK,Ï,gªÆT©Rõ”#U_p@9Rõ”#U_p yBª¾à€r¦*LU˜ª0UaªÊT•©*SÍL53ÕÌT S-Lµ0ÕÂT+S­Lµ2ÕÆTSmLÕ˜ª1Ucª†T}ÁåHÕH‘ª/8 ©ú‚Ê‘ª/8 œ©öÙ@}9“²}&ïW#K~·"kÇ­¯8ôï­ÅŠÃ´G¿“Úîâ«ËÇi‡ýôðãÃõÝÕõÇå>ûè72µbÖ¿&Wžu~†Åquoþ¢{¿rÜrX.,/,7’'ƒ%É3ËÊý –$W–#Õ”jJH5%¤šS¦*LU˜ª2UeªÊT3SÍLÕß`Ÿ®Ù¸%7”û,IžYÞPîo°$¹²¼¢Üß`Ira9SmLÕ˜ª1UCªãÚI$GªãêI Hu\?‰äHu\A ä ©Žk(‘œ© S¦*LU™ª2UeªÊT3SÍL53ÕÂT S-Lµ2ÕÊT+S­Lµ1ÕÆTS5¦jLÕ길ɑ긼É‘ê¸ÀÉ‘ê¸ÄÈRY"9S¦ê'-†`Í¢}êƒõ¿¦®—Sÿ˜Âx»ØÊÜÿé†aewñçÃããå‡ÃóÃép‹™ž_볿bßK±xÂçCÙ>‰ÔâÊQËYbyfyCyÿreyEyÿraya9SÍL53ÕÜ^]±ìËy‰,W–W”×Àraya¹¡¼%–g–3UcªÆT ©Ž½å$Gªco9É‘êØ[Nr¤:ö–ƒB!¹°¼°ÜPî#’g–3UcªÆT ©ú©a”#U?5Œr¤ê§†QŽTýÔ0ÉRõSÃ(gªÂT…© S¦ªLU™ª2ÕÌT3SÍLµ0ÕÂT S-Lµ2ÕÊT+SmLµ1ÕÆT©S5¦jHÕO £©ú©a’G¤ê§†QŽTýÔ0Ê‘ªŸF9SõSÃ-LWš“?Ÿ°†fÓ»€W&¢-`eÜ`1_f«ý®»‹¯ïoowÇé>Ó‡.x<>\^ç<>>{örÁØéã÷ïç??] yz°¸îìôáÏ\`Ö¯ _jìŸPW^ñ|ü⸺-!4Y9lùs# ZP]Pm¤¶„êŒêj¿0<©ÕÄÒ¯ Ojbéׄ'5±ô+“šXúõàA-ãÞfÁÐ÷œ_Àº¤é]+?\š¬-šéÊ¥^.øïmPY<åÆ *‹ãÎ?1§T¾˜ŸnPÙg–7”ŸlPÙ+Ë+ÊO6¨lÈ…åHõtƒÊ—saªÂT…©*SU¦ªL53ÕÌTO6¨lÈ å'T6ä™å å'T6äÊòŠò“ *ra9SmLÕ˜ª1UCª§T6äHõtƒÊ—óˆTO7¨lÈ‘êé•/ç ©žnPÙ3UaªÂT…©*SU¦ªLU™jfª™©f¦Z˜jaª…©V¦Z™jeª•©6¦Ú˜jcªÆT©R=Ý ²!Gª§T6äHõtƒÊ†©žnPùržêé• 9S¦z²AeûÄõtƒÊr½>×Î+oý¹ðß¿¹Aeñœ7¨,Ž[N)Ë…å…å†ò“ *òÌò†ò“ *re9SU¦ªLU™ª2ÕÌT3S=Ù òåüdƒÊ†\Y^Q~²AeC.,/,7”ŸlPÙg–3UcªÆT ©žnPÙ#ÕÓ *r¤zºAeCŽTO7¨|9OHõtƒÊ†œ© S¦*LU˜ª2UeªÊT3SÍL53ÕÂT S-Lµ0ÕÊT+S­Lµ1ÕÆTS5¦jLÕ˜ª!ÕÓ *r¤zºAåËyDª§T6äHõtƒÊ†©žnPÙ3Õ“ *Û'§T–ѦkÖ²rõ‚ç=*>ëÖãåñÓãüøvºzÝù…ê}º§ýgdТ+O;¿6ï³ÞZª+Ç­ÎûHžYÞPîó>’+Ë+Ê}ÞGraya9SÍL53ÕÌT S-Lµ0ÕÊT+S­Lµ2ÕÆTSmLÕ˜ª1UCªcÞGr¤:æ}$GªcÞGr¤:æ} OHuÌûHÎT…© S¦*LU™ª2Ueª™©f¦š™jaª…©¦Z˜jeª•©V¦Ú˜jcª©S5¦jLÕê˜÷‘©ŽyÈ#Ró>’#Õ1ï#9Ró>’3UŸ÷¥>ó½zÛçOã¢u-÷¿Deå¸þÛúì_B[y½Ž9Ÿßšwwñöþþæq~øþþa~ðôVƒéÁôVƒ_Ïo5˜>ü™·øÈ:û~ÄqNuñ"æãW†Ø¥öA“ƼrÜÚ›ä~`’ Ë Ë å~`’g–7”û€IÎT ©Ž;“©Ž;“©Ž;“©Ž;ƒÆÎ!÷¿¦µ•ã$=]úwoß|×ÿÿÿ¥× endstream endobj 4020 0 obj [ 4019 0 R 4021 0 R 4022 0 R 4023 0 R 4024 0 R 4025 0 R 4026 0 R 4027 0 R 4028 0 R 4029 0 R 4030 0 R 4031 0 R 4032 0 R 4033 0 R 4034 0 R 4035 0 R 4036 0 R 4037 0 R 4038 0 R 4039 0 R 4040 0 R 4041 0 R 4042 0 R 4043 0 R 4044 0 R 4045 0 R 4046 0 R 4047 0 R 4048 0 R 4049 0 R 4050 0 R 4051 0 R 4052 0 R 4053 0 R 4054 0 R 4055 0 R 4056 0 R 4057 0 R 4058 0 R 4059 0 R 4060 0 R 4061 0 R 4062 0 R 4063 0 R 4064 0 R 4065 0 R 4066 0 R 4067 0 R 4068 0 R 4069 0 R 4070 0 R 4071 0 R 4072 0 R 4073 0 R 4074 0 R 4075 0 R 4076 0 R 4077 0 R 4078 0 R 4079 0 R 4080 0 R 4081 0 R 4083 0 R 4084 0 R ] endobj 4018 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 4020 0 R /Contents 4085 0 R >> endobj 4086 0 obj 8083 endobj 4088 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 759.389 309.773 768.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 4082 0 R /H /I >> endobj 4090 0 obj << /Type /Annot /Subtype /Link /Rect [ 509.593 759.389 524.593 768.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 4082 0 R /H /I >> endobj 4091 0 obj << /Length 4092 0 R /Filter /FlateDecode >> stream xœÍ—=oÛ0†wþ nM³Ç»£H®ÚjT@‡ ƒá*IËjd·ýû¥b;µ,(À»ÙćäQÏI ž·Tþ‹á’Ô»”²]·æùØîmd+Õ±)SDb½:¶µã¦`7سŸJå2bKýÉ~7[Cö³¹»/ÌKeÜ_C3“¿LõÍ,Ïb;¥|Mñ‘}4jóþS°žlýðÿ‹wJLD*69á<üØÖ­½»ùÚwýªm›þÝζ«íïÕæöÞÖ_ÌÇz´g!réÚ¶¼…XR&Æèè2•^¦‘C[i9Ì8t¹¬Vµvp¸Î†L“ˆé<ài]Mpó TE½Ï9æ\º\ek|+c®f{Ódá!®ù]—þ˧…Å©³·vQUö¦îºÍîTyèúSqÿÔœŠëÍÏf»_ìšþOóÚÿ«ïöݺ;>g¯Ë±”»Ëra²ìiäå%—2•ÎË1n Wœ80Nò’§â&påX8p$®8pbŒ̈ÁŒÌ€Áá-À€A!À `P<`P<`P<`P0( F bPƒ‚Ä "1¨ˆÁ€ ˆÁ€¬ƒb°B VˆÁˆŒˆÁˆLˆÁ„LˆÁŒ̈ÁŒÌ€ÁòI…À€A%À zÀ zÀ zÀ 2`P0¨ TF Š:ƒgÎÜZNé!sN‘¦GRa:ûZšfÏlf endstream endobj 4089 0 obj [ 4088 0 R 4090 0 R ] endobj 4087 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 4089 0 R /Contents 4091 0 R >> endobj 4092 0 obj 548 endobj 4094 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 702.139 217.905 711.139 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 4096 0 obj << /Type /Annot /Subtype /Link /Rect [ 331.35 623.599 396.6 632.599 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1429 0 R /H /I >> endobj 4097 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 575.321 217.905 584.321 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 4098 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 510.821 298.56 519.821 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 4099 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 446.321 298.56 455.321 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3502 0 R /H /I >> endobj 4100 0 obj << /Type /Annot /Subtype /Link /Rect [ 303.112 446.321 318.112 455.321 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3824 0 R /H /I >> endobj 4101 0 obj << /Type /Annot /Subtype /Link /Rect [ 322.664 446.321 337.664 455.321 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3473 0 R /H /I >> endobj 4102 0 obj << /Type /Action /S /GoTo /D [4015 0 R /XYZ 72.0 667.889 null] >> endobj 4103 0 obj << /Type /Annot /Subtype /Link /Rect [ 342.216 446.321 357.216 455.321 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 4102 0 R /H /I >> endobj 4104 0 obj << /Type /Action /S /GoTo /D [4015 0 R /XYZ 72.0 633.889 null] >> endobj 4105 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 434.321 298.56 443.321 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 4104 0 R /H /I >> endobj 4106 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 393.821 217.905 402.821 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 4107 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 365.321 298.56 374.321 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 4108 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 288.821 217.905 297.821 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 4109 0 obj << /Type /Annot /Subtype /Link /Rect [ 332.46 210.281 397.15 219.281 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1445 0 R /H /I >> endobj 4110 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 162.003 217.905 171.003 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 4111 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 97.503 298.56 106.503 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 4112 0 obj << /Length 4113 0 R /Filter /FlateDecode >> stream xœíYsÛ6€ßõ+ð˜ÌÄ‚G§Ó™fzLûÔÃ3}pü K´­©D9ÝŒÿ}”@ k[‡²¼˜E¯®%‡Ù¬ Ú¾kß.·^«˜¬½HmÃNÆ|ï5êT€4†R;"ûX ÅP På°ÍÓç!@9Á édŠ *T=ƒªWðcšòÅ•—p'DŒR,B`ê; þŸÍP"»¦p"ˆú Z¥Ûíô.EùÓCêvë"†ãhI¡8IUß}$Õu…ÍÕø¤f®w2òl»à•~¸ìÚ Ø±OI<¶A‘%㜒ª®mÊòjΫZrœ ɺ säUomrëµ '{/Ü´@4D‡D¦x—÷ $øB ®=]°÷¹Ø[{¥`ð31¸ö½³wÝ—Üã!ѾÐLPl­.ÏÖY>]d‹ì½—5&/è]~ŸZ÷9ˆº»a7]­¦Ù¼hG“DµÛ¤ÛÇeÞhÊ%–œBc®CéGÙtóÔដ@Ç#†uA@l@2 U×¶ey­&­œÅê•ìªj.' ¡RпDîBšàVµjÂû}Ö^ù6ÎE×},7n•D«Ä€Ô¤ØxL±@5>dØÙ°AÒí)i»b` ¤‘otP+‡ïÝíz¹\M\önžŠû!$Æ UÚTïÒÍj‘MsG7AhuS]eórŸUÛuWÄö†©|‘ÝuÄLÊr‡­pÊ…¸BÝXëŒ+ð9´“Vºå`ñ“¶øÈ‘ä÷ói>ý¡?äÓÀpõR€Ÿ „Ês¯Üÿ}ÉÍS(0UÕ…åúï˶ùfç©÷„Ÿ»hÄÕv&óa gPÀå°à 6¹öðÁâ'mñá‘?a<|u] äµ½³+'X¦6š:ZqBím©Ò4IbkAC2J€5²0GÖC¦)r@83D‡ý¦øÁôóÎ{€?ø“’žG¼““ÆÄ鉃ÉOÙä#Ý®ð’67ÜÀ@:HãÝ®èr‡ïöÏ邨ñÄI4Ö“MQËC'QíhÿÐICr4àI¨ñÐIäxèÄiŠàÑ¡Fad?2„B÷×FìÜaÀÇ|@‰Ë³‹Ÿ²Å»åà¸øÐþQÒæCØHG ¶ü8¶üô§ZȳS­aì[`« ¼ÊewÉVœ¢3´ Î49âXkðЙäŠ,†3…a¤˜ÃC~ Ѫ-Ç_¸Þ~’UÁFXÓZ–Õ£Ù&UÁÌM_–U!"ð(‰c‘eµÙ_]g–UPUO›íûr­†r¦„NƒÐÑz—lµ¦Å~*˜¶ªÞžlUHÄyB²UoÓ…½µd«D±C!õ/éü˜z=¦)”l‚:OAýÉV!@¨ ¡¡ÉVrÉV²—$[‰  œxûtt~Ù¼LŠÔlðñŸcR20Ùª{åÀ±tµ~Èël{=¿É¦«Ë>CS­°' ¬Ó“Ÿ²ÉÇú¦9ÿ(LK~‚t2©Võå¸h®fn¼\«¡úÚ6¿Ž&]Ðöå¯?RtG&°E‘öíõǃ\û—|µù³1îNw ´,8¾¥î)ÌúÁgý¸Ï€ý1p·Cè¡¥Ú½¥ÎÖ–os+|Ažúùê ¶Ç endstream endobj 4095 0 obj [ 4094 0 R 4096 0 R 4097 0 R 4098 0 R 4099 0 R 4100 0 R 4101 0 R 4103 0 R 4105 0 R 4106 0 R 4107 0 R 4108 0 R 4109 0 R 4110 0 R 4111 0 R ] endobj 4093 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 4095 0 R /Contents 4112 0 R >> endobj 4113 0 obj 2211 endobj 4115 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 740.639 217.905 749.639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 4117 0 obj << /Type /Annot /Subtype /Link /Rect [ 330.81 664.793 359.69 673.793 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2388 0 R /H /I >> endobj 4118 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 623.251 217.905 632.251 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 4119 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 486.751 298.56 495.751 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 4120 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 458.251 298.56 467.251 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3473 0 R /H /I >> endobj 4121 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 417.751 217.905 426.751 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 4122 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 329.251 298.56 338.251 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3509 0 R /H /I >> endobj 4123 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 240.751 298.56 249.751 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3507 0 R /H /I >> endobj 4124 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 140.251 298.56 149.251 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3486 0 R /H /I >> endobj 4125 0 obj << /Type /Annot /Subtype /Link /Rect [ 303.112 140.251 318.112 149.251 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3724 0 R /H /I >> endobj 4126 0 obj << /Type /Action /S /GoTo /D [3454 0 R /XYZ 72.0 668.804 null] >> endobj 4127 0 obj << /Type /Annot /Subtype /Link /Rect [ 322.664 140.251 337.664 149.251 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 4126 0 R /H /I >> endobj 4128 0 obj << /Type /Annot /Subtype /Link /Rect [ 342.216 140.251 357.216 149.251 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3500 0 R /H /I >> endobj 4129 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.56 128.251 298.56 137.251 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3473 0 R /H /I >> endobj 4130 0 obj << /Type /Action /S /GoTo /D [4015 0 R /XYZ 72.0 565.889 null] >> endobj 4131 0 obj << /Type /Annot /Subtype /Link /Rect [ 314.39 128.251 329.39 137.251 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 4130 0 R /H /I >> endobj 4132 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.905 87.751 217.905 96.751 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3464 0 R /H /I >> endobj 4133 0 obj << /Length 4134 0 R /Filter /FlateDecode >> stream xœí]sÛ¸†ïõ+0{åÌDXüfvv¦Û´´7ÝÖ3½HrAK´ÄY™ô’TR÷×I H ¶©ˆka³‰I88‚xyæ÷ˆÿZŠÔÇRV‹ß›t "¼°I ôI€ˆI@7);^F= íÿÑÉËÏ·à?‹lÀߟ¾ðÔé²A½M.~™FÍMÂð…Ê×ÛÍ%ëXeÓ#J?)í}ôhÔd\Jç^ˆô{É;@^`à×w@Y%½·ödh”)r.¨ˆ£êT½‚µ+_ŒPýï…ˆ` ƒÐ1ä:5 )ó?!ÆMc79ˆNAô”e¼I@õô˜ôOë"idGRœ¤Öö)’º>„ÎÕô¤9Ì,žw\y=ðêy87Ý Ø¥‡$é øh¢!©5­ûP§wrâvþÛqSmqÞ†Kþi ÒS 2jsu*W` ëdý:YÒô¸*E=Zttî²@ŠLÇyTSáƒz&‚Bc³p‡ÐU"Ô7—v(\% ÏMò߯æÐ³#¨;§>&È.ü>„áq¼T‡Î‰Wü𪶠x–Q@`8lÊI£ã´h„h6Ê*®öå{QÔ#XM²ušm”^aÇó!õøÃS¯¶³Nã]¾Qp¯ã}ž³h.È¡_»¤ˆA? ‹å)2"ÄÛòK³*)²xþôÏ@È8[ƒÚRDÁƒ¡èr™æ4GzœÀŒ‰¸c¡ç›åAZ‚}™¬ÁÝ]¦…è )â…#1ÁÐ ÉýúPõ± `ÈDXÏï«°ÊóÿIU¤É×p üÄ]šoŠøq›&%<ô–!¾p1€ÿ>aéB £D‘s!õšyÔõ1u†—B@AŽ W†?B¡)‚–¹ð‡ƒìE¡σa/^Ž<“o²É‚ÅëÒâ)¸µ·)ãÀx&1^2JÍŠ-BVŽtqòtžl^àñy·ci†,]–˜CŒCyýaæÒÞzŒ½Cú”?ŠÄåñÒˆ áîÍ:®âe™þÏâÕÑçÏèðÿ¨p,_ ˽³w×ý×ÒýSXæGÌPˆEEÈQuaª&Ž«`BÅ„ñæ>ßíòoÉúôñîI†_…´Þ´gIñfqÕcÆ53Ãprèd=DHÀ’2Ox[VEšm Q4BZÑÛÚ?ù²µ²Ý“ršåÙÒ0Á›£k¢ž?ˆbA$JÅÅf/DÒ1%- +Loµ¦¡¿ë1÷ŸÏ=Þ+çi¦œÜ=UIùÞ0‰‘Þ„ù=/Evùúøã‡Ã¡˜èóä‡Ã;Œõf/ùE6ŒD¢wÓlµÛ·á·&­/ü&¦÷ÚÅ7\ä‘–„÷^ÿ›‹K?C Õ;ž2ÍXךÖ}¨ÓÛ¡¢ÍůӨ¹I½òÖÚP½Ý\RB«´Ð“6>tÆ>µz롌ªI‡Ï|ð9%=šËõø›îñׯ‹lÄ™ãÄqrZÍ’!A¦`ã@ºHÓi°±é0£s{AÐYóx‘U¼µçß}­®Z¥Åtx²õ܇¹­ca6,œ¹ËÛ¹­ëñ·ÜãÖŠúc¨‡¹­ãÄqÂ9IŠ"ï_`ÖNoçÊà–Ž#9Ž¥ °Ô¾«¦X¼â•d)ç/‰2æ tó8Í6§ã  cã†>Iö<67ÑÖ$PC‘Ñ©Pd´£ŽèQ‘5S ™D EF{™R§Z¥Å$ÙÆ‡Ëô%Rm|×µÃg>ø\’»UGéz)j¶K‚\o®¾Ù¸ëò7Ýå½iž!%CSqÒ@z+«}äš”%æ .\ߥeÕ„ÛmÏcPZÊ˧H.ÃQŽ¿mÓ*)ã•ÙÆŠ 2yŒ á4/‰å6™öX®¨‘G?X¬ *ÀŸÿ¾Æ»½º_Ù)>‰æ&½¯öfž¥HñGEŠÃg>øœ{Y+×ãoºÇíÇä[ÈÒŸ„(ýù´*m4ŠƒËÁuZ£Ì§Qæ ÒtE”ô¹và%×I–WÍZó&)>­VVùÃã.©¤?a$¥Žˤ2×Ó¥ER˜ @jœZþ´g¦†F9Š"¹]‹¦n¶+œÖ&«<«â4k—Ø3‚aпÆÞÐ"Íeލ‡s{ëÐ$`d„÷0š*¾w0nl&BhÛ!ŸØËcÔÞ¦Œo&BF”O«]Ë'%ˆR±… ±r¤sOw\èÓŒ9‚qöîo´†ëý«éýgè2½îp 9О§AfHÌài!GÕ…©šVÔ{|U=R§X}yvËàÂ"«í>ûMMÈïO “fï’2ùÉÛÏ7ûrïê­ÌMš…2ùá>Ϲ:ùáó»fçñh ÈÐ&µ ™Üö+Ç#a C¥ÔBHú¢þ£â±ÛB-šbDã„|ĘÙ[‹&Aà×­6 ­i݇:½½•Ú\ü:š›„Ñ+o­ ÕÛÍ%µÌ±J acãCglP«ï“5Ž…ù°pæ.o¤Œëñ7Ýãöß ° ›ˆ§ ÏŸ1àFÏÌ`þäA=¥ˆ§ÛæÏü ÀŒQì?£±ù¢’ž¶–„LËø#Ù+ Äü4à®Ï,µ;KÙ#o$»ùÕ˜3Qâؠ¢çzÄrr­5”ÚL³~ÿ‡Zaén{wÛ[m™!(CzR!DZt–&Ý#K†¾\ß¶éjk±ù¥Ue Š¢¡H¡Kî\šgc*)œÝúÓ&႟1PRX«YÚ#òÊï¼ìL7NI§çô€=÷~FW¨9 ¬€"ÓEþ`_Ì8ñO:€® Þù¼ƒá:a˜(l4C~?äÄ:süsòÅÆáR:'\Ú¬f×Y>î$~ýï M endstream endobj 4116 0 obj [ 4115 0 R 4117 0 R 4118 0 R 4119 0 R 4120 0 R 4121 0 R 4122 0 R 4123 0 R 4124 0 R 4125 0 R 4127 0 R 4128 0 R 4129 0 R 4131 0 R 4132 0 R ] endobj 4114 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 4116 0 R /Contents 4133 0 R >> endobj 4134 0 obj 2428 endobj 4136 0 obj << /Type /Annot /Subtype /Link /Rect [ 165.82 374.197 191.93 383.077 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1270 0 R /H /I >> endobj 4138 0 obj << /Type /Annot /Subtype /Link /Rect [ 215.07 330.077 402.55 339.077 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1273 0 R /H /I >> endobj 4139 0 obj << /Type /Annot /Subtype /Link /Rect [ 203.13 308.077 315.33 317.077 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1275 0 R /H /I >> endobj 4140 0 obj << /Length 4141 0 R /Filter /FlateDecode >> stream xœÍXYoÛ8~÷¯àc Ä4IÝ‹"Øé´›6v¦²LÛB%Ñ¥¨ºþ÷;uP‡Ý>¦AaÎxÎ3CÒ?ø[êÐ¥8 #”ä‹ Ÿ¢€!ÇoXÁ.óqs1óPކ,e c/X»‚,Ð{ôï¢XôvñõÈl½ã‚œ1^›º_|¶bk`ý”â#h·xù°X½ñ%èaÛCÌ|Lêb5$6¦b £¥½¼è×¥ÚˆJážñâ¢áSÀhX©¥]ž /”„KZvÝsO¢ê‰ÄT¦!šk]·sy€E°¨Tš¥ê„ '“9:d1ì¤â¿êgA\¢#Ï2ý ’^KöíÝ â©OFÆS©Ù87˜€`XȦ§Ö§~mЖ2`™õ†Ëô§­¶•Â2©l—·ŸÞ¿ýøb&ÜóîyRI ̬·,ÍS5²R=QîE•Ít#£ãqµÖQ1ªë·¬¶Û4ÑêcmëñbÖ&³>Tò ʺ‚ Cl»eÜ­`Rs xõzy\@Ëå¶‹RlÕ1–u_Î]ÆãÒ ‹óÙÌE²\ÅYG>jµ™üÙx­y&Žp’èL·•¬oZèag&ñš i¿fŽ/ÍK§{°à?=W™E¸)Ñædþ§‚íÝûµ¬íÍZÃ(; Š*mN†F¦O=°ÒTŽ!Öqò½'N½ÉÁÁð6ÕÀ޲BÛ¦²T–Cs&*ƒRߦŠ(AÑUK=#ØkmOlx!Ú¡f÷i²·IγžÜ [6-šã`NSÝ“ú†h‡š<‡©Ûž&ªt—*ËQ3žmýiò<ÒFÉ7›Z"€Sû¬³)¡ÍŽ®Uµ—¢ÚíÃ3ÝàÏtƒã°±—Ñ=÷\:î¸ÊuÖGÎrpäè0‹îõR쮪¿=Ÿ‡‚p"5‚<œ òà1ãÐæõt³.ÎJa'1›~ä`ß…$àEhݳϿhÜþm1ÕEõýüº› Ñ½ø¦ê¦ßÎ?lh„#xƒw:ïŸõ ÙºÔ›Ë53ÿñ*pCA‰8œtË_za5Yx36ÑÝ—Û7ïÿ[•{8V‘¬êÄ–Ï¡ÇK(ß›†6^Wi±á¿ð^åÙÅÐàrèG¾¾³/ýêgþœ1ô|Ô€õ{$¨Ï76#¿Wêð×Ê$‚KQÉ„ÃQ·ã¸àju&±Î¶ãÀ3ÝkAÍØ¾¹ˆƒÍ⣾ž|}ÆpAèÏšbPª Î ç_Ä`ü &ÀéhS4tfLÝüi§»!TLFè¿9Z+µòwïi„°ýú×/X?àõeî† æ|cù½*Ñ;Á‹4ù£çyÍø;ß7¼á7Øú¡ìóâõ…Ö endstream endobj 4137 0 obj [ 4136 0 R 4138 0 R 4139 0 R ] endobj 4135 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 4137 0 R /Contents 4140 0 R >> endobj 4141 0 obj 1689 endobj 3355 0 obj << /Type /Action /S /GoTo /D [4142 0 R /XYZ 72.0 654.077 null] >> endobj 4143 0 obj << /URI (http://www.cpan.org/scripts/process-handling/STDIN.STDOUT.connection.pipe) /S /URI >> endobj 4144 0 obj << /Type /Annot /Subtype /Link /Rect [ 130.0 713.483 189.99 722.483 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 4143 0 R /H /I >> endobj 4146 0 obj << /Type /Annot /Subtype /Link /Rect [ 196.925 713.483 519.945 722.483 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 4143 0 R /H /I >> endobj 4147 0 obj << /Type /Annot /Subtype /Link /Rect [ 216.699 591.029 233.909 600.029 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3408 0 R /H /I >> endobj 4148 0 obj << /Type /Action /S /GoTo /D [4135 0 R /XYZ 72.0 769.889 null] >> endobj 4149 0 obj << /Type /Annot /Subtype /Link /Rect [ 291.75 567.029 310.07 576.029 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 4148 0 R /H /I >> endobj 4150 0 obj << /Type /Annot /Subtype /Link /Rect [ 243.379 543.029 316.883 552.029 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 3190 0 R /H /I >> endobj 4151 0 obj << /Length 4152 0 R /Filter /FlateDecode >> stream xœÍYëoÛ8ÿž¿‚HØHhIÖ³‡»ÛÞz8l¯­‹CS²DÛÚèá%¥¸þïoÈ!)ZR²û±éÜ19œùq^dþ¸ò‰îåGú4M3R4Wh¾O’€¬cÍŠ<‘ç­‰Ò " ¹dE¤–kœA`Fðq1èùíª½òÈ¿®>9%ñ`ÝéÊ{F¸õéꃣ›žãïI?ì¯~Ú\­~Žˆï‘Ín„بûY–%$¥ë “?Ù4äóͯ¢j÷ä#Û½ý‰T-9w'GÞíyÞˆÛ/dóï«n.l_{M¿7Ó?\¨®“$ õ¦.¥Ä¬‘”(¿ºPdJâ.´?ŸUÙ›iì¹ Ï½é»QîyGŠšøàHI–ÁW4½p¥ ö^ò˜ïƼ¹³R¯ç­ŽÒYØô¹%qF}r#Ø1çyÏ,£úãÐ[rǻƌóŽ[ªaBä{&¨å¼ÛÙ!„¢·Œ•–Øvýa¶{}¾[\Yä­sVVœý²¤“ð8]oÄ®ª™ y[’þÀZÂY^Ê<„`D}yG¶€F¨¿¹ õPîÏrTõDtC[ :Ù)LIÐ`{ðãNAÍšM{/íMBš¼è-!΢g°4‚„céGg&kKK(T4¿3s>~WµxÎHåÎ*ƒ!´<#Äz‹–2ÃqYÞŒD_9Äè»pPQ8ÁEÀ-|ëË ¹ù/ãµCŠ‚WÇ~"Æ÷š¥²l¤ñ\ ³úótaÒLÅÍúþøzµ:N´8æ-íø~…û‹”ž‚âþ(ÕP™VŸ6oßýBáÿ÷¿nhѵ-øoÕµôX§V‡!¨®É:˜ïúeŽQO5ëNhUBcã!†Â@2”諺vè¼8Tì‰9‰÷Ã-u8{ ·îÚ¢âÅÐ<±¶Wao眂UàÜaœxÕËZîªà 5Þjè2ïswrçš3+I'`Éà–K¢@ºÀƒ‰6McGaÉ¢k8RápÐ|$t¼hÊh†”CÉ”òp;2T:ÕcÈÈ?ö×€ Kã„…ciÏÊÑ-¿Ü|¤žª˜2o“IºÒiçYΗ­YJéKin>ï?9À-3kÛõ¤f@ÝÉî¨R‡yÈÁ¥ÅoHQWàJn[È>u ßçuÀœÀ…°ãëN­éú´’ªÄz(À÷P¡ÝJh‚YþEi”-•œèCÔy)jæg’2%o•Ýõ™À¦R%Îvå¶4ò÷K¥VB‡4Î`§ Q  œ   œ3ÎÇ¡èv:¨ô©9MÇ™3µÙB|tƒ»ú6CäÞ9,çkÿH(8-…Á¢õiŽ5k`çëƒ3Ñi(­Õí^\¶Zp™$žà#ÂTBŸ¾\ÁùîšÉôºÅ\‚¬iÂ%æ 4ò× @¢™&[¸OÐ :ì,Ž–T¢ãV´ mÕŸiŒgŒã|ë¼jï{ö­wx¼ë»¢«GÎéP‡eY»¼âõy¤!lªïÐNÓ‰içÚd!G¿Âróm7ŒD{6Ã:o÷4}Ô0 >2—µµ×óªx´”qµŸ°sÆ¥Ç\ˆSÇKC³¶àç£Ì:w†µõéu „˜ˆçfг_š­ ”lÿd,´¥r&$;`ŽRã1·(²®¶<ç'ìtyTþÔ3µŽ3mÔ( 4|ªJfi]¬Uaü?—ÞeÙ˜È"§ïXÒÐø±^²€@0ÍþZZê$Å1}(®IÔr6ΚiâJ|ºNRÙÔ.lfÚâô2s§XOÊ¡žæAXISyŽbAž«£TX"ª†ÝVzÃ}Ç+Ûñá”Bö–Ģ£†XI-©ÎnËõ4-cIƒŠ˜ ǃ`v\lÕ¼ Y†l0Ç! %Û-$•º8|lUcäBè‰&Sêe‡Q•éq[Eìq#g³P ¤ýá,wôÉÉà ÊJ¹1?«ûëiCÛ@éá+¡Õœ8<àóqØžš¹ V(ƒæ/]ëÆE\3 æ÷6HéÞ tÃf]Gò0´p¬¯( R W ¨‘ïL².4f õv`8]÷è,uæê@Db×ÕuwÒí5²Lì žå·”Òà%ÌàgVÌXòž“Α, !ÍAï¼,åõ`j¡¦u§ÏÉÇwŸÔá9ÉÇB.´ýÒtu×—êåÕuaÃlŽŸB¤VBiá7_yS°dhq½j!¶´À³A ˆòáVê÷P#GŸ—_‚p..™«ã°mXI»ì€QOä½"²v<êUÒúª²£ªŒ”¨²z„™ Bõ´ë¸âÂ^q:ÛKû+TGLÊ—ï¨BGÀƹ¬ŒÊ%Í"ý¼°SêÍvú«že3„Í~Ö; ãåàe0x¸à~²»³g*3M¥λOïïÓ4Êîýeüc/œîvÅŸFBLaÅŒeªÕÒ“G,Oá¥ÜSóäu¢|Ê¡éØë÷õ²z‚Aýê.×ÇCt)'ñdiÁ-^/h˜tí‡^¥éKoNóy²ùjO–ÃÍrÚ¹ªL¸Ë‹'ˆ³òWG^òâ¦Ói¿t JõŒVö—-ßÒ_B}¸ú?7µ‘• endstream endobj 4145 0 obj [ 4144 0 R 4146 0 R 4147 0 R 4149 0 R 4150 0 R ] endobj 4142 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 4145 0 R /Contents 4151 0 R >> endobj 4152 0 obj 2420 endobj 3420 0 obj << /Type /Action /S /GoTo /D [4153 0 R /XYZ 72.0 769.889 null] >> endobj 4154 0 obj << /Type /Annot /Subtype /Link /Rect [ 420.119 142.534 438.439 151.534 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 4148 0 R /H /I >> endobj 4156 0 obj << /Length 4157 0 R /Filter /FlateDecode >> stream xœÍËnÜHî6ÚŠJoí-/g¼À.f6ä0™CY]Ý-XRõ¨$;½‡ýöeë%µÚÉ11“TÉ"Y|HþëŠüÜÈ_eJ²¬‚º»úKÓIPÄA’kR…iœEQÄigAÌIYЈ ¿fk?_®ú«(øtõÇŸ°fD°ïù*ºÀ\±ú|õ›§›^ðϤ_ì¯ÞÝ_½¹Í÷;gâ8£,¯ª*&A&q%ÿÅÁ}üñêþÀ‚ÿ°Ý‡wAÝ6¬ß6<±áõŸÁý?gHYDQA-XԼ릾©éØð>8|ä5o‘ÃÇû™å’( ËŸÍp¿ÍT„À+Š"Œ– ÿÓ0AP£|4Sd‰¢”O€¿/ªiù ŸÇâO£Üå0Ì‹° ¤ªŠª‚Ga9 ¢¸$/EÌOs¼ó`‰¥^ŠiqÐÇOR„q w†Ì¬ â¨Ð‡×gOÂ~‚Ûfc Fºgh iËC¦e”!‰*àMrw_7©¼+¯ŽÓpäÂ#ðƒGåN‰´¨’íÐFxÛ¸ƒë«ú|`Àt¸ óŠÃö×Ä|¡}dž Áz_uê­¤m»ñ°~ë©êPð¯÷"—õÀ³së5}36tdÔœ}«´;€Õ$~¤B<óa°¾NG•åš~LJNe¼Ðø Âý¯œŸ6÷{‘…$ªª,Ó™ßI|¦ À)':²¡k„B”™¿ U¦E \Ó¹þÞ·L({’" sivë¡\úê¹lã¶Û>ø«h]³ãè³á}{òЖ״õðš÷=«¥ADè‘ïv¾&f‡ «„ M#ë|vï|%Ï] ~]ØÊÓq1<Ë ÒÈ«çf<8Œ:pÛìvlÐJ!éîWoåv;hÓ"a„8ñ1æs©°Øã;L½ÇÍ¿¹È˘Ößam…„F¬#& c€ I0éè, 4ŸF‹ÓþdáÝ4èk­Ÿà£[«2‚iû¸JWÇ@ÝZü}yi¡EE³eëë|³˜ã´­·±;¶§«$ X{NÐ(cÓÁeŸ@·û¤¼ë©ß  Â¶=]ì@Ÿ> AI¢kþ ©J*14âQ&ˆu|”9ãØòfኸ òB%Ú êN2¬Ìy¶çFT%_!ïñgå5½‹»Mh„%Ø›¬—ÂIÄÚÆQ·Šº2ýô ÝC<ú½Eõ¼¤hñÙ1½Ó ¿CåùÂPXÊ",¥êÜ!âÀ‡Ñ¡|¸°®åJqûÈÁ;Â]6Wë;§ÓÆ:J?uÌô|hêÃ…Ý.µ!îDLGYœ·ëzJ:®+†*Ê…¡æ‚Ì«,±•˜  Ð‡“¤dô3> X≪´:‚aŽƒª•fßHÇɲï AB\÷%j!í,Ìëzì&,Þ$»tÞ*Zœ×zFU*u©Öv‡Óö:)iéA†2œR>ÆÙæ‡ vL²0ƒ<%Q6«ØÐ«ýzÞ|¯RÇ ¸´LaˆÊ+¿iƒ*^áf0<ˆ°xGO†„ä¶©ØÑà@{Ñ5£#xì·t¤T8ÁУG€í¶å1„¦· Õ58“O'Ør\qbœV‹ÓëSÉœ µ±ˆ©Ï•Ë0{‡@‚v¨Åïz 55nAúÄ›­ÇÁFý™8Ï zk=p¬ÿgk{6ÂÒG·Ô-;¶´éW ’“¥AØ7•ÈoªÒë¢q¡ Rq‡é(dI_ áq´)kE€ë iZ‡o™’ài@÷p®Ðá|ïh­öM¿ E²8º—0ÙÍ´ÍÃ@uéÒ¤ILPOŽÍHË=ŽÓ åϽC:F{—θÈM7ããÞfwúÙjO:x{ÅìH²n®˜º·¹)´#@E©ˆ y´åJ‘DyXÅL3•ÎR6•äêb Rý{G›AÙQ"ªIbñ¯}n-#gM¹5ЦbÄ–+ÎMé•P­j¥à³4 ÃȨ¢*·„øÀŒ\QÍq\9©ìf'}l¶[$r³¼ÏÜCšÑ®„4AFølõß}Nzˆ=’)fˆyã Çd®LÇžuÛ¯Iß²–ùjÐ4>΄|…ÔûõõŽv|Zið“$ZXäã¿ï>ýë-0ȪP™õ›2b¦õÇG' ê®ÉÔ-ÙO'·Y•¿|¹» -v?Û-šÚmÙ2êáÉS6AÄ&De^s+ÝvÛ…j|U{Ì#+†Jã…¡l.ŒÕ°ÎÏGÐn@äë+¨­[ÞaúAÚžõlò×׎(û’Á¡Bva}íqÒ/-øjÔÄìH;»n›Íj:@qZê­pßZf€Éc~hÀrò›TÄuªÐ˜‘˜÷¾Ã[ÂŒöó·{ˆÉ+¡#Í4qµFkF=).c¼ÄÚ?Æêt‘äË4‰¡vzõ¢Ýá¿Ý T¬B"qAÎBÀz~ÍæÐ·WòM9‰ã™ÍIÏDãÏ káQt ÑØ[iY´&¾íOæ½GAÂLVÒÓŒ¥/¨‘Iø²Ç™æ¶}¿¨¸4½‡èÎXµÛ\SÕrWg-r\„ÐTe^Æ+vCýfÅÞUµX·kZ&Û°~±!'ÑÚfù @ÖZ0¹Ì6:éH‹Ic`T×oß½¿ùðñæöÓÍ/w×›S ÌA2sÁš˜óæJœÖ×8I‘¤¦ºâ;§ª{]ž)Dô|é½Éj6»Ù6{,s’d“¤Â¶ ¦ æ­gvŸ—Jó~x±úÖâË<‰‚–sÆ· c@ÉkùhÉÑÆ@d³p¨®ßÎ,Š+1þˆš M-ѸºaÄMå 4aC숭 ¥¦†£Ð@o-ƒgno½Þ9²½ªŸ …»M-W|ã‡s» ƒð–ë—Ø(Íç¨M6_~îÈŒ¤òs”È/ÄÊU2Œóß³QæË´‡¬'1Ýò€nŸ¨ÌQ™-Ìâe×e ¤Žª‡D:ß~ºàº´X¬ü,«Èýðq(…}‰W˜X´ Áür¦µzðÞ~XP´_ÙÐZæÑ©UUñ;ÇçÄ' CMë¹c¡^t>Só†™2ùµ+ï;r˜[æçÁx‘ûI~fÑðŽ>Ö¨.CŽß´ë°¿Q¤–öû‰îÕ‡ÌROƒÝ€-!]ò¶ÒØ·Q¾m ºP=Iáž“²*Ë(]9ƒ ¸ÜGš@ŽÉ’|e‡UȪ)ç;+w–nÚQ ræŠI!^æ¼·L´RðÂCŠò¾W vdƒìf…% „]6y3Ëø ÂfZ?ç ÚÔŽî·àÞö,IE¢¨Êâ•#Šq˧ñÅ{””åKB«Ðï©Ý8•Ûæ‘yGk„îë×FðB!ÿJ¤w›ÏŠAœÊóeÿûÛr™äVÆ—¸½¹%äìOkò•2&ƒ›£ÛŸe’®ìó§›Ë"I¹&ó%aU¼²ÁÌï/š¶J×Ũ¿úíêÿC”µ> endstream endobj 4155 0 obj [ 4154 0 R ] endobj 4153 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 4155 0 R /Contents 4156 0 R >> endobj 4157 0 obj 3002 endobj 4159 0 obj << /URI (http://www.gnu.org/software/emacs) /S /URI >> endobj 4160 0 obj << /Type /Annot /Subtype /Link /Rect [ 220.427 719.53 274.656 728.53 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 4159 0 R /H /I >> endobj 4162 0 obj << /Type /Annot /Subtype /Link /Rect [ 283.895 719.53 427.765 728.53 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 4159 0 R /H /I >> endobj 4163 0 obj << /URI (http://www.freebsd.org) /S /URI >> endobj 4164 0 obj << /Type /Annot /Subtype /Link /Rect [ 452.913 719.53 490.133 728.53 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 4163 0 R /H /I >> endobj 4165 0 obj << /Type /Annot /Subtype /Link /Rect [ 499.372 719.53 523.272 728.53 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 4163 0 R /H /I >> endobj 4166 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 707.53 141.42 716.53 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 4163 0 R /H /I >> endobj 4167 0 obj << /URI (http://xml.coverpages.org/xml.html) /S /URI >> endobj 4168 0 obj << /Type /Annot /Subtype /Link /Rect [ 174.578 707.53 196.798 716.53 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 4167 0 R /H /I >> endobj 4169 0 obj << /Type /Annot /Subtype /Link /Rect [ 206.017 707.53 347.967 716.53 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 4167 0 R /H /I >> endobj 4170 0 obj << /URI (http://www.docbook.org/xml/4.2/index.html) /S /URI >> endobj 4171 0 obj << /Type /Annot /Subtype /Link /Rect [ 430.394 707.53 523.272 716.53 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 4170 0 R /H /I >> endobj 4172 0 obj << /Type /Annot /Subtype /Link /Rect [ 75.33 695.53 253.12 704.53 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 4170 0 R /H /I >> endobj 4173 0 obj << /URI (http://www.inkscape.org/) /S /URI >> endobj 4174 0 obj << /Type /Annot /Subtype /Link /Rect [ 454.987 695.53 490.527 704.53 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 4173 0 R /H /I >> endobj 4175 0 obj << /Type /Annot /Subtype /Link /Rect [ 499.374 695.53 523.274 704.53 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 4173 0 R /H /I >> endobj 4176 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 683.53 149.76 692.53 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 4173 0 R /H /I >> endobj 4177 0 obj << /URI (http://www.w3.org/Graphics/PNG/) /S /URI >> endobj 4178 0 obj << /Type /Annot /Subtype /Link /Rect [ 317.238 683.53 337.238 692.53 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 4177 0 R /H /I >> endobj 4179 0 obj << /Type /Annot /Subtype /Link /Rect [ 342.584 683.53 483.134 692.53 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 4177 0 R /H /I >> endobj 4180 0 obj << /URI (http://www.adobe.com/products/acrobat/adobepdf.html) /S /URI >> endobj 4181 0 obj << /Type /Annot /Subtype /Link /Rect [ 504.936 683.53 523.276 692.53 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 4180 0 R /H /I >> endobj 4182 0 obj << /Type /Annot /Subtype /Link /Rect [ 75.33 671.53 297.25 680.53 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 4180 0 R /H /I >> endobj 4183 0 obj << /URI (http://java.sun.com/) /S /URI >> endobj 4184 0 obj << /Type /Annot /Subtype /Link /Rect [ 343.047 671.53 360.817 680.53 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 4183 0 R /H /I >> endobj 4185 0 obj << /Type /Annot /Subtype /Link /Rect [ 367.006 671.53 446.456 680.53 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 4183 0 R /H /I >> endobj 4186 0 obj << /URI (http://xml.apache.org/batik/) /S /URI >> endobj 4187 0 obj << /Type /Annot /Subtype /Link /Rect [ 499.944 671.53 523.274 680.53 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 4186 0 R /H /I >> endobj 4188 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 659.53 109.2 668.53 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 4186 0 R /H /I >> endobj 4189 0 obj << /Type /Annot /Subtype /Link /Rect [ 115.03 659.53 226.14 668.53 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 4186 0 R /H /I >> endobj 4190 0 obj << /URI (http://www.w3.org/MarkUp/) /S /URI >> endobj 4191 0 obj << /Type /Annot /Subtype /Link /Rect [ 296.72 637.53 325.05 646.53 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 4190 0 R /H /I >> endobj 4192 0 obj << /Type /Annot /Subtype /Link /Rect [ 335.015 637.53 450.565 646.53 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 4190 0 R /H /I >> endobj 4193 0 obj << /Type /Annot /Subtype /Link /Rect [ 97.579 625.53 129.799 634.53 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2015 0 R /H /I >> endobj 4194 0 obj << /Type /Annot /Subtype /Link /Rect [ 137.038 625.53 235.108 634.53 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2015 0 R /H /I >> endobj 4195 0 obj << /Type /Annot /Subtype /Link /Rect [ 244.847 625.53 263.187 634.53 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2021 0 R /H /I >> endobj 4196 0 obj << /Type /Annot /Subtype /Link /Rect [ 270.426 625.53 417.926 634.53 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 2021 0 R /H /I >> endobj 4197 0 obj << /URI (http://wiki.docbook.org/topic/DocBookXslStylesheets) /S /URI >> endobj 4198 0 obj << /Type /Annot /Subtype /Link /Rect [ 462.144 625.53 523.273 634.53 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 4197 0 R /H /I >> endobj 4199 0 obj << /Type /Annot /Subtype /Link /Rect [ 72.0 613.53 115.33 622.53 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 4197 0 R /H /I >> endobj 4200 0 obj << /Type /Annot /Subtype /Link /Rect [ 121.625 613.53 338.855 622.53 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 4197 0 R /H /I >> endobj 4201 0 obj << /URI (http://www.w3.org/Style/CSS/) /S /URI >> endobj 4202 0 obj << /Type /Annot /Subtype /Link /Rect [ 373.253 601.53 391.043 610.53 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 4201 0 R /H /I >> endobj 4203 0 obj << /Type /Annot /Subtype /Link /Rect [ 397.144 601.53 519.944 610.53 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 4201 0 R /H /I >> endobj 4204 0 obj << /Length 4205 0 R /Filter /FlateDecode >> stream xœÍXKsÛ8 ¾ûWèØÎli¾{lÓd·ÓçÄÝíL§E–cmlI•äºí¯_P›&iO{Kr°$ˆÇG@_g$ÁðÿÌþhNÖ&ɶ³¯#Ÿ$Š&LŽ,§c–ލH¶É)K$«ã<Ðé ~Nd^'ÿÎÊNnfŸ¿€Ì2Á ·Ÿá3‹÷KÝÎ>8¶ðü˜ìs-d#ýø üp`¥Â~àûeØÀΰ¢}ubˆO»œp† ¿gMÆÅ8îÑ)æÆ8œÜÏž/fók° '‹Õ±¢¤BŠc”1ð ijìMÛäóFéÓ/ÉâÕìå"–1æxa²Pk×áÔ,¡PÞíäð8¡Q­0ÆRG~Qmªz]•ù#à ׈Cô ³Xmò4yÆ8F&y²¬²Ý6/;‡µO]}St]^ºœ¢[;ä°ùaK;r V#ÂÝoÞ~tT_nÓ¬õô)¦H ‰±Ð2Ôw”?ûŠÀÖ€·a÷PqÝuõŸóù~¿G÷åUÍý¼­VÝ>mòy1ƒ ”˜p9Æ—@Ú l÷&”^4º*Ï{Žiàˆ;g:\äºÉóç·Wž' Ç@GHò[Þ'!¦(ƆF6½åéàDbOÐús–ݵKëSOAÄ¡\&*Tõ}¨(R"Cý!˜¶‡X¬s‡òG(15,\æÓ›×¾<”™²P" å}|ׯ&ŽEM¨8ºîûvƒ²ê[ÞÔé}ÞöùfYën»ñóV d¤ÂGNï;‰*ƒ¨½ޏÔ1º­vM–·g׺Îë.¹’ ˜áÍ5Fc  *Ê#Ѥe»ªšmœ‘WýÊäQ€p,… ­zÿöÆ———ä»·œ‚&CCirQs*eÏz?ß4i½.²vøNçpc˜¾Œ¬å{CÅ%3ÚPyÁà´\žsg¹ ÂÌe$pﯮƒ<2ò×a#uœ‘.«»ðx;¯›j¹ËºvžfMu—vóþU½\E¡™ Û·+¨L¡º ”˜hJ÷Õ%.Êû#9a°ˆ@0Uä|ú`ÉWé·ÔWÐi¸•´Äú’ AB 1¥<ëÃÿ`?ÔîÊÞ…~ä…"û ®b¶ÒÁF‚¿dfZ×›"K» hc>²Ød8·°Y ‚[<< RŠ`í 6iÛåMñ3o[4Hð§dD-  ’!ûÖh¥#âN_Öi¶`°7Ò÷(PÌf53‘•‚‹K(ÄíX`›ÏP….`ã•.˜œ†‚>9a0ÁœÌ#kœ FêÜÊ%NV„Úv¨"&*¨%hËètšÀÒ¿A#G8zoÌ ƒ 5œ­‚Ü— IÆ&?Ô ÑôMÚ<|¬Ã €ò‡YÒG– J@ÛA…brÙÞj×Õ;7 ÖçiçÏ*öÃõV9@ ‰ÎlBA–`®"ÊßÛM@™yJgÊØ‹W™ˆ’³™ïg¸ê°½ê¨=p x¬ ;‘õ~þtûzág9Ä ’òBÅ ŠBJÄížLðˆøç]C ËÑc=E4¯ß½÷ \£¶!“\þž_ˆ±³2@'×±0Ä!cUÕç[^]ˆ9¿bŠÆ 1‚ÿe/E;RcyÇ=È ä4LJpUg~õ!ÜaJ[<Ñk»и­ó<(@^ÆÆë7ÔëëGÆêN/í—¯@eªüâ¡89ºª.²ùx€Oíæö¬IòO €l¿U„s…˜>”Э›jw¿>2²]ÛUÛâçáªØ›ôŒ)GzM £•#È@ÔiÓ…þ—Ò3¢ZY¸sÉ!þ1Ýö8‚¢#gájY$?RG¨èá#Õð¼Ú5°_sdäå:-³áò8w?ŽÏéñÑOL˜q¨€›+9à‹Û[_èÂì¥NUDá¸QЗÀK P o–>“æ`AФs§É Wò §´'cä|ý0ûÐ;t³ endstream endobj 4161 0 obj [ 4160 0 R 4162 0 R 4164 0 R 4165 0 R 4166 0 R 4168 0 R 4169 0 R 4171 0 R 4172 0 R 4174 0 R 4175 0 R 4176 0 R 4178 0 R 4179 0 R 4181 0 R 4182 0 R 4184 0 R 4185 0 R 4187 0 R 4188 0 R 4189 0 R 4191 0 R 4192 0 R 4193 0 R 4194 0 R 4195 0 R 4196 0 R 4198 0 R 4199 0 R 4200 0 R 4202 0 R 4203 0 R ] endobj 4158 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 4161 0 R /Contents 4204 0 R >> endobj 4205 0 obj 1682 endobj 916 0 obj << /Type /Action /S /GoTo /D [4206 0 R /XYZ 72.0 500.681 null] >> endobj 4207 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 759.389 152.22 768.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1930 0 R /H /I >> endobj 4209 0 obj << /Type /Action /S /GoTo /D [1979 0 R /XYZ 72.0 769.889 null] >> endobj 4210 0 obj << /Type /Annot /Subtype /Link /Rect [ 498.845 747.389 523.275 756.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 4209 0 R /H /I >> endobj 4211 0 obj << /Type /Annot /Subtype /Link /Rect [ 138.0 735.389 170.22 744.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 4209 0 R /H /I >> endobj 4212 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 714.521 144.44 723.521 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1938 0 R /H /I >> endobj 4213 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 681.653 147.78 690.653 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1935 0 R /H /I >> endobj 4214 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 648.785 145.0 657.785 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1950 0 R /H /I >> endobj 4215 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 615.917 154.99 624.917 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1940 0 R /H /I >> endobj 4216 0 obj << /Type /Annot /Subtype /Link /Rect [ 274.189 559.049 304.199 568.049 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1791 0 R /H /I >> endobj 4217 0 obj << /Type /Annot /Subtype /Link /Rect [ 309.536 559.049 523.276 568.049 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1791 0 R /H /I >> endobj 4218 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 547.049 170.85 556.049 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 1791 0 R /H /I >> endobj 4219 0 obj << /Type /Annot /Subtype /Link /Rect [ 230.428 447.562 268.725 456.562 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 52 0 R /H /I >> endobj 4220 0 obj << /Type /Annot /Subtype /Link /Rect [ 274.802 447.562 447.842 456.562 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 52 0 R /H /I >> endobj 4221 0 obj << /Type /Annot /Subtype /Link /Rect [ 258.88 378.694 335.82 387.694 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 52 0 R /H /I >> endobj 4222 0 obj << /Type /Annot /Subtype /Link /Rect [ 341.65 378.694 514.69 387.694 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 52 0 R /H /I >> endobj 4223 0 obj << /Length 4224 0 R /Filter /FlateDecode >> stream xœÍkoä¶ñ»…pý;À–õ~M‹»s.pq×<¼EÄùÀ•¸^ÖZi£‡×Šþö9¤HI\õŠ~¹äƒgf‡ÃápžÔýqá;üÅÿd‘ïfY?$ÝwÒÀ IŠ=7 bÏ ?rƒØ98SRìT| ‚?^À÷ÎÏõ…ç|wñÛïÀS:¬;]xg„ Qw?ºI€¿$ý<çáâÝæâúCìøž³ÙiÇÀžçÅ™“¹aóÿgsp~{}Czâ°ú8ôo~w6»øv39jèynö¥ôljŠà)išºÞ܃„˜i@A‰ü§‰"sw™Pðø÷¬ÊÞBcÏTxé<_Œrçý&.ßÏó4Ïá'7›8N®9Ìsº¥¯\/ÏM©=wöh*Z-ëðØÜj#s’87ã~ë¼qâÐÍœ×}ÓT2‚ES?Ѷñ†-l1¢%L…°z·M¿×âöTÃäáÁXOêÒÊö˧#¼kÚémÊýt{çŽÈ¯Í0Âò2ÂC§Å¢Y´ý‚ÄÍ"¸ ?–Æié®Ü^Í–€ÃÀ Áƒ’â‘<ˆ DÂiÏ„Ç#Æj¸Xé¤ÝH5{ú¬×¼ÿþ‡·ï5ªŠ‰Âï_ÿÄ3Õý›5Ȩ&ÃíÝí¥Åbp›Óƒ@ýDK±Î!õ¾þôýÍb£!ȉáÑåjôƒˆa‰Ðgr8Vԃ݄D0Ò$²kªª9aÄKRÑ“EðJ˜xdNžj8wc~öhžºár ÏÓÝÍ»¯‘ýúCni¨ÿqõ?ôe³ð'Gñûþ|AâY<*^ªœCSvÂn@ø—è“ çê½CÊUȰBý»þÀCÎM!^Í`ƒQË”LD;¬Þ’D+ª“2Õó”[&˧–çc-Ì á{w{vì.a̤ ¸óÄ:pS‘gÙ ¦ºŒ·Qf‰IZ^“;Ob|‚á“pËåÎ"ç%¹›ðþ8ÜÿGÆ‹"h ÿµf!xžñ¢&YHxYîùKn‹F^îf9 ùq(«ò[¼0qs•©. B×,þWÕ1eOƒtbýþ,?¸4Lc=C"«»¾„ówæÖبˆV\‘D3þÙªô/GK‹f˜'*Ò ŸA‡|õ'òH5Ö ­a„0«‹j(Í÷RìAr“œ$ÁÜ”ÒRÄ΀{î4\²˜žŸwms8³mIwd¨ Þû×ÿØ|¸Êîߨ|FÌ©E6²aô0â圫pu€Î ™œ¢ámIDÕ:…Ë,1®œŸ\”ۻﯲ,ί|“ªºT¹êîêíÝûÛ[× MUÇ*ó$i1@Ï p`{‘djÈB¤\íW£º¦Ü˳X=æüù¯Ðo:0ƒtàRß¼ò]ï•£ŒöÍ«¡ß]e¯þú%ÓÖ%FYê& ifÞH |ïxUÑ'ZI\æX‰‰ìÌ"ÿÊäÏAì‚i°ÊÏ„,õ¤Á‘³gRÚD&»,Yj:>YN|++å¾÷ÁèÓ‚‘]F]äèüœÇ_Uy»£,Ò®^^žO•«´/gZVpÿ ` г(bEÓ¶´;6uÙ4‘8$#Äó!ê/Pyw$È»ðùK‰7ϨÁRÅÕ;I½ó Ç} /ø¾©Œcá „Û<4íghfþÿz ‘oY2×µ³¤:Q[\]ñ9}EEˆp˜D ØGñR„.3Msoe¥Þ™ô}ËßR eº#-ØŽaÿ‡¤ÞT–o«1ìÊ,l㣫«iÞÛ›·ôÌâŽf;ÚÆNq‹é_þÌO-7„`„Ü ²P~¿Ø™Ý§*êX3ðý‘ùóRì&~Äm™Xdn~5D’‡y§üüeNtJËÅFg¼1Õ9ë~”ºáyy¬<ë~œ¯­œôÍŸ£ À|üϳÔféÃGz>¬hV–Ú(w5çá¯/ÖA¢†jÓŠ9Lno4|o¼á ‰™cESW†Ð­q0BZ†‰8Œçö±ýzª¾Hd8B®¥×(DõTiz‰h¬IÔh„°í¥)›„?%T/®&K—BÙ"Þ훡2¶Û¼rØRªi[Îø}vL‹e¢tn™º§p:¨J|ç±g|£<Ÿƒõtk˨IæFyêyy ³Ú·D\&L»éZJ=aŒÎSs–2ÖÓ¾ºvÜ[×,Ä‹&?˜6FÂpAQ˜Ü1ñ!‘nتrr©™÷ÔàÆSýÒRý›HÊ*GLZ œ¼\Xìy³ó²¿•HWôƒŒ§_Ø<Ä5(ê@¢%~÷X·Ç0–tu…‹^ÓdÀR#‘ù;‹¢J™:HßPèùÎ̃äãñÆ©o9òéÂÕÅÆþ™¿p çÁl…Jm¼Íb%Ú°‚x"sÐ>_/å$~è†ü‰À äçôû ˆg|±O5%™þ¬d±Qš¸ÿ—ÿd¾q„¹ý|Ùñ¼µµzsB’0mj%Ça ›º“šT/=+H¥ijv‘¨l\¼p&$Ï} ©êõl¢¨ÅºA<;ÙXñŽlüéÏw¤áGK’:5í£!?’ dO´è-¥ZÎq€óA¸•Z\g‘|Ä'—•½… b´¥A‘¯ÅR-Âb 0èŸÍÐÖâÊRñVXQ‰‰;“ÊBÈÿB’a0ØølÄ)¢3YŠ=9b•³JØ6Í£+áÍ^m´2}B'y–Å¡EùU¿!­¬¬•[›uC>‰‰$׉·X,Ë?ÕN6€žxÀ·K2ôû¦íÞ\p¼g}¥’ŠÃÏpé€oœ(Ô|øûÔTP€/Öuüዎä:fdXÿ7gå©ïç« hÁ‡×™3XË?±D<Ëú †‡žÏB‘¿"aT@_âÓ„4‘$hè~hj# MäwDeÔ b€´ë`S&¯i"¦$g]2(áà{fÁì,Ðw‹—:Þ«ŒÉBbª#†­DvLvžÎئªH(Õ–pɹÓ0Ñ`Ŷ-ie‡*)ÔÊÊCÒ×Z™dšp5ecªµ2ïƒã¤øL½4Õç8·qÍ*7#ÔÌä‹À»ÆÏ`gß—jvÅ¿Éüñâ?׉Ìõ endstream endobj 4208 0 obj [ 4207 0 R 4210 0 R 4211 0 R 4212 0 R 4213 0 R 4214 0 R 4215 0 R 4216 0 R 4217 0 R 4218 0 R 4219 0 R 4220 0 R 4221 0 R 4222 0 R ] endobj 4206 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595.275 841.889] /CropBox [0 0 595.275 841.889] /BleedBox [0 0 595.275 841.889] /TrimBox [0 0 595.275 841.889] /Parent 1 0 R /Annots 4208 0 R /Contents 4223 0 R >> endobj 4224 0 obj 3296 endobj 4225 0 obj << /Type /Action /S /GoTo /D [8 0 R /XYZ 72.0 769.889 null] >> endobj 4226 0 obj << /Type /Action /S /GoTo /D [245 0 R /XYZ 72.0 422.585 null] >> endobj 4227 0 obj << /Type /Action /S /GoTo /D [245 0 R /XYZ 72.0 148.723 null] >> endobj 4228 0 obj << /Type /Action /S /GoTo /D [2625 0 R /XYZ 72.0 311.97 null] >> endobj 4229 0 obj << /Type /Action /S /GoTo /D [251 0 R /XYZ 72.0 710.509 null] >> endobj 4230 0 obj << /Type /Action /S /GoTo /D [251 0 R /XYZ 72.0 552.329 null] >> endobj 4231 0 obj << /Type /Action /S /GoTo /D [2641 0 R /XYZ 72.0 769.889 null] >> endobj 4232 0 obj << /Type /Action /S /GoTo /D [254 0 R /XYZ 72.0 517.149 null] >> endobj 4233 0 obj << /Type /Action /S /GoTo /D [307 0 R /XYZ 72.0 745.889 null] >> endobj 4234 0 obj << /Type /Action /S /GoTo /D [310 0 R /XYZ 72.0 446.813 null] >> endobj 4235 0 obj << /Type /Action /S /GoTo /D [310 0 R /XYZ 72.0 360.405 null] >> endobj 4236 0 obj << /Type /Action /S /GoTo /D [329 0 R /XYZ 72.0 643.185 null] >> endobj 4237 0 obj << /Type /Action /S /GoTo /D [329 0 R /XYZ 72.0 281.729 null] >> endobj 4238 0 obj << /Type /Action /S /GoTo /D [329 0 R /XYZ 72.0 233.745 null] >> endobj 4239 0 obj << /Type /Action /S /GoTo /D [338 0 R /XYZ 72.0 733.889 null] >> endobj 4240 0 obj << /Type /Action /S /GoTo /D [338 0 R /XYZ 72.0 561.041 null] >> endobj 4241 0 obj << /Type /Action /S /GoTo /D [338 0 R /XYZ 72.0 298.409 null] >> endobj 4242 0 obj << /Type /Action /S /GoTo /D [338 0 R /XYZ 72.0 239.345 null] >> endobj 4243 0 obj << /Type /Action /S /GoTo /D [364 0 R /XYZ 72.0 745.889 null] >> endobj 4244 0 obj << /Type /Action /S /GoTo /D [364 0 R /XYZ 72.0 347.955 null] >> endobj 4245 0 obj << /Type /Action /S /GoTo /D [411 0 R /XYZ 72.0 668.435 null] >> endobj 4246 0 obj << /Type /Action /S /GoTo /D [411 0 R /XYZ 72.0 500.078 null] >> endobj 4247 0 obj << /Type /Action /S /GoTo /D [411 0 R /XYZ 72.0 438.08 null] >> endobj 4248 0 obj << /Type /Action /S /GoTo /D [411 0 R /XYZ 72.0 272.603 null] >> endobj 4249 0 obj << /Type /Action /S /GoTo /D [411 0 R /XYZ 72.0 189.485 null] >> endobj 4250 0 obj << /Type /Action /S /GoTo /D [398 0 R /XYZ 72.0 769.889 null] >> endobj 4251 0 obj << /Type /Action /S /GoTo /D [398 0 R /XYZ 72.0 695.753 null] >> endobj 4252 0 obj << /Type /Action /S /GoTo /D [401 0 R /XYZ 72.0 675.621 null] >> endobj 4253 0 obj << /Type /Action /S /GoTo /D [408 0 R /XYZ 72.0 654.399 null] >> endobj 4254 0 obj << /Type /Action /S /GoTo /D [408 0 R /XYZ 72.0 169.779 null] >> endobj 4255 0 obj << /Type /Action /S /GoTo /D [599 0 R /XYZ 72.0 158.992 null] >> endobj 4256 0 obj << /Type /Action /S /GoTo /D [427 0 R /XYZ 72.0 481.955 null] >> endobj 4257 0 obj << /Type /Action /S /GoTo /D [1391 0 R /XYZ 72.0 582.503 null] >> endobj 4258 0 obj << /Type /Action /S /GoTo /D [1391 0 R /XYZ 72.0 449.837 null] >> endobj 4259 0 obj << /Type /Action /S /GoTo /D [1406 0 R /XYZ 72.0 435.635 null] >> endobj 4260 0 obj << /Type /Action /S /GoTo /D [1406 0 R /XYZ 72.0 265.81 null] >> endobj 4261 0 obj << /Type /Action /S /GoTo /D [1411 0 R /XYZ 72.0 723.237 null] >> endobj 4262 0 obj << /Type /Action /S /GoTo /D [1411 0 R /XYZ 72.0 496.697 null] >> endobj 4263 0 obj << /Type /Action /S /GoTo /D [1509 0 R /XYZ 72.0 393.695 null] >> endobj 4264 0 obj << /Type /Action /S /GoTo /D [1509 0 R /XYZ 72.0 272.091 null] >> endobj 4265 0 obj << /Type /Action /S /GoTo /D [2439 0 R /XYZ 72.0 154.846 null] >> endobj 4266 0 obj << /Type /Action /S /GoTo /D [1128 0 R /XYZ 72.0 769.889 null] >> endobj 4267 0 obj << /Type /Action /S /GoTo /D [2740 0 R /XYZ 72.0 126.437 null] >> endobj 4268 0 obj << /Type /Action /S /GoTo /D [2491 0 R /XYZ 72.0 745.889 null] >> endobj 4269 0 obj << /Type /Action /S /GoTo /D [2491 0 R /XYZ 72.0 606.887 null] >> endobj 4270 0 obj << /Type /Action /S /GoTo /D [2491 0 R /XYZ 72.0 522.539 null] >> endobj 4271 0 obj << /Type /Action /S /GoTo /D [1143 0 R /XYZ 72.0 700.016 null] >> endobj 4272 0 obj << /Type /Action /S /GoTo /D [2665 0 R /XYZ 72.0 210.158 null] >> endobj 4273 0 obj << /Type /Action /S /GoTo /D [1191 0 R /XYZ 72.0 435.769 null] >> endobj 4274 0 obj << /Type /Action /S /GoTo /D [1191 0 R /XYZ 72.0 373.143 null] >> endobj 4275 0 obj << /Type /Action /S /GoTo /D [1176 0 R /XYZ 72.0 769.889 null] >> endobj 4276 0 obj << /Type /Action /S /GoTo /D [1176 0 R /XYZ 72.0 664.361 null] >> endobj 4277 0 obj << /Type /Action /S /GoTo /D [1334 0 R /XYZ 72.0 621.389 null] >> endobj 4278 0 obj << /Type /Action /S /GoTo /D [1334 0 R /XYZ 72.0 454.081 null] >> endobj 4279 0 obj << /Type /Action /S /GoTo /D [3200 0 R /XYZ 72.0 661.781 null] >> endobj 4280 0 obj << /Type /Action /S /GoTo /D [3200 0 R /XYZ 72.0 581.129 null] >> endobj 4281 0 obj << /Type /Action /S /GoTo /D [3200 0 R /XYZ 72.0 454.634 null] >> endobj 4282 0 obj << /Type /Action /S /GoTo /D [3200 0 R /XYZ 72.0 343.403 null] >> endobj 4283 0 obj << /Type /Action /S /GoTo /D [3200 0 R /XYZ 72.0 232.172 null] >> endobj 4284 0 obj << /Type /Action /S /GoTo /D [3200 0 R /XYZ 72.0 120.941 null] >> endobj 4285 0 obj << /Type /Action /S /GoTo /D [3203 0 R /XYZ 72.0 747.769 null] >> endobj 4286 0 obj << /Type /Action /S /GoTo /D [3203 0 R /XYZ 72.0 285.049 null] >> endobj 4287 0 obj << /Type /Action /S /GoTo /D [3203 0 R /XYZ 72.0 203.289 null] >> endobj 4288 0 obj << /Type /Action /S /GoTo /D [3203 0 R /XYZ 72.0 121.529 null] >> endobj 4289 0 obj << /Type /Action /S /GoTo /D [3206 0 R /XYZ 72.0 747.691 null] >> endobj 4290 0 obj << /Type /Action /S /GoTo /D [3206 0 R /XYZ 72.0 665.619 null] >> endobj 4291 0 obj << /Type /Action /S /GoTo /D [3206 0 R /XYZ 72.0 537.349 null] >> endobj 4292 0 obj << /Type /Action /S /GoTo /D [3206 0 R /XYZ 72.0 258.485 null] >> endobj 4293 0 obj << /Type /Action /S /GoTo /D [3209 0 R /XYZ 72.0 745.889 null] >> endobj 4294 0 obj << /Type /Action /S /GoTo /D [3209 0 R /XYZ 72.0 620.244 null] >> endobj 4295 0 obj << /Type /Action /S /GoTo /D [3209 0 R /XYZ 72.0 494.599 null] >> endobj 4296 0 obj << /Type /Action /S /GoTo /D [3209 0 R /XYZ 72.0 368.954 null] >> endobj 4297 0 obj << /Type /Action /S /GoTo /D [3209 0 R /XYZ 72.0 197.636 null] >> endobj 4298 0 obj << /Type /Action /S /GoTo /D [3212 0 R /XYZ 72.0 769.889 null] >> endobj 4299 0 obj << /Type /Action /S /GoTo /D [3212 0 R /XYZ 72.0 651.041 null] >> endobj 4300 0 obj << /Type /Action /S /GoTo /D [3212 0 R /XYZ 72.0 521.801 null] >> endobj 4301 0 obj << /Type /Action /S /GoTo /D [3212 0 R /XYZ 72.0 392.561 null] >> endobj 4302 0 obj << /Type /Action /S /GoTo /D [3212 0 R /XYZ 72.0 251.321 null] >> endobj 4303 0 obj << /Type /Action /S /GoTo /D [3212 0 R /XYZ 72.0 122.081 null] >> endobj 4304 0 obj << /Type /Action /S /GoTo /D [3215 0 R /XYZ 72.0 702.491 null] >> endobj 4305 0 obj << /Type /Action /S /GoTo /D [3215 0 R /XYZ 72.0 622.415 null] >> endobj 4306 0 obj << /Type /Action /S /GoTo /D [3215 0 R /XYZ 72.0 496.64 null] >> endobj 4307 0 obj << /Type /Action /S /GoTo /D [3215 0 R /XYZ 72.0 233.768 null] >> endobj 4308 0 obj << /Type /Action /S /GoTo /D [3218 0 R /XYZ 72.0 676.361 null] >> endobj 4309 0 obj << /Type /Action /S /GoTo /D [3218 0 R /XYZ 72.0 346.205 null] >> endobj 4310 0 obj << /Type /Action /S /GoTo /D [3218 0 R /XYZ 72.0 215.105 null] >> endobj 4311 0 obj << /Type /Action /S /GoTo /D [3221 0 R /XYZ 72.0 745.889 null] >> endobj 4312 0 obj << /Type /Action /S /GoTo /D [3221 0 R /XYZ 72.0 529.549 null] >> endobj 4313 0 obj << /Type /Action /S /GoTo /D [3221 0 R /XYZ 72.0 404.369 null] >> endobj 4314 0 obj << /Type /Action /S /GoTo /D [3221 0 R /XYZ 72.0 279.189 null] >> endobj 4315 0 obj << /Type /Action /S /GoTo /D [3221 0 R /XYZ 72.0 154.009 null] >> endobj 4316 0 obj << /Type /Action /S /GoTo /D [3224 0 R /XYZ 72.0 677.821 null] >> endobj 4317 0 obj << /Type /Action /S /GoTo /D [3224 0 R /XYZ 72.0 492.337 null] >> endobj 4318 0 obj << /Type /Action /S /GoTo /D [3224 0 R /XYZ 72.0 306.853 null] >> endobj 4319 0 obj << /Type /Action /S /GoTo /D [3224 0 R /XYZ 72.0 121.369 null] >> endobj 4320 0 obj << /Type /Action /S /GoTo /D [3227 0 R /XYZ 72.0 595.081 null] >> endobj 4321 0 obj << /Type /Action /S /GoTo /D [3227 0 R /XYZ 72.0 358.887 null] >> endobj 4322 0 obj << /Type /Action /S /GoTo /D [3227 0 R /XYZ 72.0 122.693 null] >> endobj 4323 0 obj << /Type /Action /S /GoTo /D [3230 0 R /XYZ 72.0 597.153 null] >> endobj 4324 0 obj << /Type /Action /S /GoTo /D [3230 0 R /XYZ 72.0 167.849 null] >> endobj 4325 0 obj << /Type /Action /S /GoTo /D [3233 0 R /XYZ 72.0 645.023 null] >> endobj 4326 0 obj << /Type /Action /S /GoTo /D [3233 0 R /XYZ 72.0 474.011 null] >> endobj 4327 0 obj << /Type /Action /S /GoTo /D [3233 0 R /XYZ 72.0 302.999 null] >> endobj 4328 0 obj << /Type /Action /S /GoTo /D [3236 0 R /XYZ 72.0 629.963 null] >> endobj 4329 0 obj << /Type /Action /S /GoTo /D [3236 0 R /XYZ 72.0 394.189 null] >> endobj 4330 0 obj << /Type /Action /S /GoTo /D [3236 0 R /XYZ 72.0 263.699 null] >> endobj 4331 0 obj << /Type /Action /S /GoTo /D [3236 0 R /XYZ 72.0 179.851 null] >> endobj 4332 0 obj << /Type /Action /S /GoTo /D [3239 0 R /XYZ 72.0 711.889 null] >> endobj 4333 0 obj << /Type /Action /S /GoTo /D [4153 0 R /XYZ 72.0 716.11 null] >> endobj 4334 0 obj << /Type /Action /S /GoTo /D [4153 0 R /XYZ 72.0 575.701 null] >> endobj 4335 0 obj << /Type /Action /S /GoTo /D [3267 0 R /XYZ 72.0 547.585 null] >> endobj 4336 0 obj << /Type /Action /S /GoTo /D [3463 0 R /XYZ 72.0 303.515 null] >> endobj 4337 0 obj << /Type /Action /S /GoTo /D [3485 0 R /XYZ 72.0 516.889 null] >> endobj 4338 0 obj << /Type /Action /S /GoTo /D [3535 0 R /XYZ 72.0 626.389 null] >> endobj 4339 0 obj << /Type /Action /S /GoTo /D [3599 0 R /XYZ 72.0 712.889 null] >> endobj 4340 0 obj << /Type /Action /S /GoTo /D [3628 0 R /XYZ 72.0 301.889 null] >> endobj 4341 0 obj << /Type /Action /S /GoTo /D [3645 0 R /XYZ 72.0 567.389 null] >> endobj 4342 0 obj << /Type /Action /S /GoTo /D [4093 0 R /XYZ 72.0 674.389 null] >> endobj 4343 0 obj << /Type /Action /S /GoTo /D [4093 0 R /XYZ 72.0 261.071 null] >> endobj 4344 0 obj << /Type /Action /S /GoTo /D [3668 0 R /XYZ 72.0 528.889 null] >> endobj 4345 0 obj << /Type /Action /S /GoTo /D [3668 0 R /XYZ 72.0 122.355 null] >> endobj 4346 0 obj << /Type /Action /S /GoTo /D [3687 0 R /XYZ 72.0 280.889 null] >> endobj 4347 0 obj << /Type /Action /S /GoTo /D [3708 0 R /XYZ 72.0 409.889 null] >> endobj 4348 0 obj << /Type /Action /S /GoTo /D [3731 0 R /XYZ 72.0 686.389 null] >> endobj 4349 0 obj << /Type /Action /S /GoTo /D [3731 0 R /XYZ 72.0 286.193 null] >> endobj 4350 0 obj << /Type /Action /S /GoTo /D [3785 0 R /XYZ 72.0 447.889 null] >> endobj 4351 0 obj << /Type /Action /S /GoTo /D [3803 0 R /XYZ 72.0 287.389 null] >> endobj 4352 0 obj << /Type /Action /S /GoTo /D [3841 0 R /XYZ 72.0 712.889 null] >> endobj 4353 0 obj << /Type /Action /S /GoTo /D [3858 0 R /XYZ 72.0 340.889 null] >> endobj 4354 0 obj << /Type /Action /S /GoTo /D [4114 0 R /XYZ 72.0 712.889 null] >> endobj 4355 0 obj << /Type /Action /S /GoTo /D [3878 0 R /XYZ 72.0 478.889 null] >> endobj 4356 0 obj << /Type /Action /S /GoTo /D [3902 0 R /XYZ 72.0 769.889 null] >> endobj 4357 0 obj << /Type /Action /S /GoTo /D [3902 0 R /XYZ 72.0 380.136 null] >> endobj 4358 0 obj << /Type /Action /S /GoTo /D [3925 0 R /XYZ 72.0 662.389 null] >> endobj 4359 0 obj << /Type /Action /S /GoTo /D [3925 0 R /XYZ 72.0 253.945 null] >> endobj 4360 0 obj << /Type /Action /S /GoTo /D [3942 0 R /XYZ 72.0 328.889 null] >> endobj 4361 0 obj << /Type /Action /S /GoTo /D [3970 0 R /XYZ 72.0 607.889 null] >> endobj 4362 0 obj << /Type /Action /S /GoTo /D [3970 0 R /XYZ 72.0 208.692 null] >> endobj 4363 0 obj << /Type /Action /S /GoTo /D [3991 0 R /XYZ 72.0 490.889 null] >> endobj 4365 0 obj << /Title (RefDB handbook) /Parent 4364 0 R /Next 4367 0 R /A 4225 0 R >> endobj 4366 0 obj << /Type /Action /S /GoTo /D [430 0 R /XYZ 72.0 769.889 null] >> endobj 4367 0 obj << /Title (Table of Contents) /Parent 4364 0 R /Prev 4365 0 R /Next 4368 0 R /A 4366 0 R >> endobj 4368 0 obj << /Title (Preface) /Parent 4364 0 R /Prev 4367 0 R /Next 4372 0 R /First 4369 0 R /Last 4371 0 R /Count -3 /A 431 0 R >> endobj 4369 0 obj << /Title /Parent 4368 0 R /Next 4370 0 R /A 435 0 R >> endobj 4370 0 obj << /Title /Parent 4368 0 R /Prev 4369 0 R /Next 4371 0 R /A 438 0 R >> endobj 4371 0 obj << /Title /Parent 4368 0 R /Prev 4370 0 R /A 441 0 R >> endobj 4372 0 obj << /Title /Parent 4364 0 R /Prev 4368 0 R /Next 4394 0 R /First 4373 0 R /Last 4391 0 R /Count -21 /A 444 0 R >> endobj 4373 0 obj << /Title /Parent 4372 0 R /Next 4383 0 R /First 4374 0 R /Last 4382 0 R /Count -9 /A 174 0 R >> endobj 4374 0 obj << /Title /Parent 4373 0 R /Next 4375 0 R /A 178 0 R >> endobj 4375 0 obj << /Title /Parent 4373 0 R /Prev 4374 0 R /Next 4376 0 R /A 181 0 R >> endobj 4376 0 obj << /Title /Parent 4373 0 R /Prev 4375 0 R /Next 4377 0 R /A 184 0 R >> endobj 4377 0 obj << /Title /Parent 4373 0 R /Prev 4376 0 R /Next 4378 0 R /A 187 0 R >> endobj 4378 0 obj << /Title /Parent 4373 0 R /Prev 4377 0 R /Next 4379 0 R /A 190 0 R >> endobj 4379 0 obj << /Title /Parent 4373 0 R /Prev 4378 0 R /Next 4382 0 R /First 4380 0 R /Last 4381 0 R /Count -2 /A 193 0 R >> endobj 4380 0 obj << /Title /Parent 4379 0 R /Next 4381 0 R /A 196 0 R >> endobj 4381 0 obj << /Title /Parent 4379 0 R /Prev 4380 0 R /A 199 0 R >> endobj 4382 0 obj << /Title /Parent 4373 0 R /Prev 4379 0 R /A 202 0 R >> endobj 4383 0 obj << /Title /Parent 4372 0 R /Prev 4373 0 R /Next 4391 0 R /First 4384 0 R /Last 4390 0 R /Count -7 /A 205 0 R >> endobj 4384 0 obj << /Title /Parent 4383 0 R /Next 4385 0 R /A 168 0 R >> endobj 4385 0 obj << /Title /Parent 4383 0 R /Prev 4384 0 R /Next 4388 0 R /First 4386 0 R /Last 4387 0 R /Count -2 /A 210 0 R >> endobj 4386 0 obj << /Title /Parent 4385 0 R /Next 4387 0 R /A 213 0 R >> endobj 4387 0 obj << /Title /Parent 4385 0 R /Prev 4386 0 R /A 216 0 R >> endobj 4388 0 obj << /Title /Parent 4383 0 R /Prev 4385 0 R /Next 4389 0 R /A 219 0 R >> endobj 4389 0 obj << /Title /Parent 4383 0 R /Prev 4388 0 R /Next 4390 0 R /A 222 0 R >> endobj 4390 0 obj << /Title /Parent 4383 0 R /Prev 4389 0 R /A 225 0 R >> endobj 4391 0 obj << /Title /Parent 4372 0 R /Prev 4383 0 R /First 4392 0 R /Last 4393 0 R /Count -2 /A 228 0 R >> endobj 4392 0 obj << /Title /Parent 4391 0 R /Next 4393 0 R /A 231 0 R >> endobj 4393 0 obj << /Title /Parent 4391 0 R /Prev 4392 0 R /A 234 0 R >> endobj 4394 0 obj << /Title /Parent 4364 0 R /Prev 4372 0 R /Next 4488 0 R /First 4395 0 R /Last 4462 0 R /Count -93 /A 489 0 R >> endobj 4395 0 obj << /Title /Parent 4394 0 R /Next 4462 0 R /First 4396 0 R /Last 4458 0 R /Count -66 /A 492 0 R >> endobj 4396 0 obj << /Title /Parent 4395 0 R /Next 4397 0 R /A 495 0 R >> endobj 4397 0 obj << /Title /Parent 4395 0 R /Prev 4396 0 R /Next 4401 0 R /First 4398 0 R /Last 4400 0 R /Count -3 /A 498 0 R >> endobj 4398 0 obj << /Title /Parent 4397 0 R /Next 4399 0 R /A 501 0 R >> endobj 4399 0 obj << /Title /Parent 4397 0 R /Prev 4398 0 R /Next 4400 0 R /A 504 0 R >> endobj 4400 0 obj << /Title /Parent 4397 0 R /Prev 4399 0 R /A 507 0 R >> endobj 4401 0 obj << /Title /Parent 4395 0 R /Prev 4397 0 R /Next 4413 0 R /First 4402 0 R /Last 4412 0 R /Count -11 /A 510 0 R >> endobj 4402 0 obj << /Title /Parent 4401 0 R /Next 4403 0 R /A 513 0 R >> endobj 4403 0 obj << /Title /Parent 4401 0 R /Prev 4402 0 R /Next 4406 0 R /First 4404 0 R /Last 4405 0 R /Count -2 /A 516 0 R >> endobj 4404 0 obj << /Title /Parent 4403 0 R /Next 4405 0 R /A 4226 0 R >> endobj 4405 0 obj << /Title /Parent 4403 0 R /Prev 4404 0 R /A 4227 0 R >> endobj 4406 0 obj << /Title /Parent 4401 0 R /Prev 4403 0 R /Next 4411 0 R /First 4407 0 R /Last 4410 0 R /Count -4 /A 417 0 R >> endobj 4407 0 obj << /Title /Parent 4406 0 R /Next 4408 0 R /A 4228 0 R >> endobj 4408 0 obj << /Title /Parent 4406 0 R /Prev 4407 0 R /Next 4409 0 R /A 4229 0 R >> endobj 4409 0 obj << /Title /Parent 4406 0 R /Prev 4408 0 R /Next 4410 0 R /A 4230 0 R >> endobj 4410 0 obj << /Title /Parent 4406 0 R /Prev 4409 0 R /A 4231 0 R >> endobj 4411 0 obj << /Title /Parent 4401 0 R /Prev 4406 0 R /Next 4412 0 R /A 521 0 R >> endobj 4412 0 obj << /Title /Parent 4401 0 R /Prev 4411 0 R /A 524 0 R >> endobj 4413 0 obj << /Title /Parent 4395 0 R /Prev 4401 0 R /Next 4428 0 R /First 4414 0 R /Last 4421 0 R /Count -14 /A 527 0 R >> endobj 4414 0 obj << /Title /Parent 4413 0 R /Next 4421 0 R /First 4415 0 R /Last 4418 0 R /Count -6 /A 330 0 R >> endobj 4415 0 obj << /Title /Parent 4414 0 R /Next 4416 0 R /A 4232 0 R >> endobj 4416 0 obj << /Title /Parent 4414 0 R /Prev 4415 0 R /Next 4417 0 R /A 321 0 R >> endobj 4417 0 obj << /Title /Parent 4414 0 R /Prev 4416 0 R /Next 4418 0 R /A 4233 0 R >> endobj 4418 0 obj << /Title /Parent 4414 0 R /Prev 4417 0 R /First 4419 0 R /Last 4420 0 R /Count -2 /A 4234 0 R >> endobj 4419 0 obj << /Title /Parent 4418 0 R /Next 4420 0 R /A 4235 0 R >> endobj 4420 0 obj << /Title /Parent 4418 0 R /Prev 4419 0 R /A 4236 0 R >> endobj 4421 0 obj << /Title /Parent 4413 0 R /Prev 4414 0 R /First 4422 0 R /Last 4427 0 R /Count -6 /A 532 0 R >> endobj 4422 0 obj << /Title /Parent 4421 0 R /Next 4424 0 R /First 4423 0 R /Last 4423 0 R /Count -1 /A 4237 0 R >> endobj 4423 0 obj << /Title /Parent 4422 0 R /A 4238 0 R >> endobj 4424 0 obj << /Title /Parent 4421 0 R /Prev 4422 0 R /Next 4425 0 R /A 4239 0 R >> endobj 4425 0 obj << /Title /Parent 4421 0 R /Prev 4424 0 R /Next 4426 0 R /A 4240 0 R >> endobj 4426 0 obj << /Title /Parent 4421 0 R /Prev 4425 0 R /Next 4427 0 R /A 4241 0 R >> endobj 4427 0 obj << /Title /Parent 4421 0 R /Prev 4426 0 R /A 4242 0 R >> endobj 4428 0 obj << /Title /Parent 4395 0 R /Prev 4413 0 R /Next 4434 0 R /First 4429 0 R /Last 4433 0 R /Count -5 /A 535 0 R >> endobj 4429 0 obj << /Title /Parent 4428 0 R /Next 4432 0 R /First 4430 0 R /Last 4431 0 R /Count -2 /A 538 0 R >> endobj 4430 0 obj << /Title /Parent 4429 0 R /Next 4431 0 R /A 4243 0 R >> endobj 4431 0 obj << /Title /Parent 4429 0 R /Prev 4430 0 R /A 4244 0 R >> endobj 4432 0 obj << /Title /Parent 4428 0 R /Prev 4429 0 R /Next 4433 0 R /A 541 0 R >> endobj 4433 0 obj << /Title /Parent 4428 0 R /Prev 4432 0 R /A 365 0 R >> endobj 4434 0 obj << /Title /Parent 4395 0 R /Prev 4428 0 R /Next 4435 0 R /A 546 0 R >> endobj 4435 0 obj << /Title /Parent 4395 0 R /Prev 4434 0 R /Next 4436 0 R /A 549 0 R >> endobj 4436 0 obj << /Title /Parent 4395 0 R /Prev 4435 0 R /Next 4450 0 R /First 4437 0 R /Last 4438 0 R /Count -13 /A 552 0 R >> endobj 4437 0 obj << /Title /Parent 4436 0 R /Next 4438 0 R /A 555 0 R >> endobj 4438 0 obj << /Title /Parent 4436 0 R /Prev 4437 0 R /First 4439 0 R /Last 4449 0 R /Count -11 /A 412 0 R >> endobj 4439 0 obj << /Title /Parent 4438 0 R /Next 4440 0 R /A 4245 0 R >> endobj 4440 0 obj << /Title /Parent 4438 0 R /Prev 4439 0 R /Next 4444 0 R /First 4441 0 R /Last 4443 0 R /Count -3 /A 4246 0 R >> endobj 4441 0 obj << /Title /Parent 4440 0 R /Next 4442 0 R /A 4247 0 R >> endobj 4442 0 obj << /Title /Parent 4440 0 R /Prev 4441 0 R /Next 4443 0 R /A 4248 0 R >> endobj 4443 0 obj << /Title /Parent 4440 0 R /Prev 4442 0 R /A 4249 0 R >> endobj 4444 0 obj << /Title /Parent 4438 0 R /Prev 4440 0 R /Next 4448 0 R /First 4445 0 R /Last 4447 0 R /Count -3 /A 4250 0 R >> endobj 4445 0 obj << /Title /Parent 4444 0 R /Next 4446 0 R /A 4251 0 R >> endobj 4446 0 obj << /Title /Parent 4444 0 R /Prev 4445 0 R /Next 4447 0 R /A 4252 0 R >> endobj 4447 0 obj << /Title /Parent 4444 0 R /Prev 4446 0 R /A 4253 0 R >> endobj 4448 0 obj << /Title /Parent 4438 0 R /Prev 4444 0 R /Next 4449 0 R /A 415 0 R >> endobj 4449 0 obj << /Title /Parent 4438 0 R /Prev 4448 0 R /A 4254 0 R >> endobj 4450 0 obj << /Title /Parent 4395 0 R /Prev 4436 0 R /Next 4451 0 R /A 560 0 R >> endobj 4451 0 obj << /Title /Parent 4395 0 R /Prev 4450 0 R /Next 4458 0 R /First 4452 0 R /Last 4457 0 R /Count -6 /A 563 0 R >> endobj 4452 0 obj << /Title /Parent 4451 0 R /Next 4457 0 R /First 4453 0 R /Last 4456 0 R /Count -4 /A 566 0 R >> endobj 4453 0 obj << /Title /Parent 4452 0 R /Next 4454 0 R /A 4255 0 R >> endobj 4454 0 obj << /Title /Parent 4452 0 R /Prev 4453 0 R /Next 4455 0 R /A 4256 0 R >> endobj 4455 0 obj << /Title /Parent 4452 0 R /Prev 4454 0 R /Next 4456 0 R /A 4257 0 R >> endobj 4456 0 obj << /Title /Parent 4452 0 R /Prev 4455 0 R /A 4258 0 R >> endobj 4457 0 obj << /Title /Parent 4451 0 R /Prev 4452 0 R /A 569 0 R >> endobj 4458 0 obj << /Title /Parent 4395 0 R /Prev 4451 0 R /First 4459 0 R /Last 4461 0 R /Count -3 /A 679 0 R >> endobj 4459 0 obj << /Title /Parent 4458 0 R /Next 4460 0 R /A 682 0 R >> endobj 4460 0 obj << /Title /Parent 4458 0 R /Prev 4459 0 R /Next 4461 0 R /A 685 0 R >> endobj 4461 0 obj << /Title /Parent 4458 0 R /Prev 4460 0 R /A 688 0 R >> endobj 4462 0 obj << /Title /Parent 4394 0 R /Prev 4395 0 R /First 4463 0 R /Last 4485 0 R /Count -25 /A 691 0 R >> endobj 4463 0 obj << /Title /Parent 4462 0 R /Next 4464 0 R /A 694 0 R >> endobj 4464 0 obj << /Title /Parent 4462 0 R /Prev 4463 0 R /Next 4465 0 R /A 697 0 R >> endobj 4465 0 obj << /Title /Parent 4462 0 R /Prev 4464 0 R /Next 4470 0 R /First 4466 0 R /Last 4469 0 R /Count -4 /A 700 0 R >> endobj 4466 0 obj << /Title /Parent 4465 0 R /Next 4469 0 R /First 4467 0 R /Last 4468 0 R /Count -2 /A 703 0 R >> endobj 4467 0 obj << /Title /Parent 4466 0 R /Next 4468 0 R /A 4259 0 R >> endobj 4468 0 obj << /Title /Parent 4466 0 R /Prev 4467 0 R /A 4260 0 R >> endobj 4469 0 obj << /Title /Parent 4465 0 R /Prev 4466 0 R /A 706 0 R >> endobj 4470 0 obj << /Title /Parent 4462 0 R /Prev 4465 0 R /Next 4473 0 R /First 4471 0 R /Last 4472 0 R /Count -2 /A 709 0 R >> endobj 4471 0 obj << /Title /Parent 4470 0 R /Next 4472 0 R /A 712 0 R >> endobj 4472 0 obj << /Title /Parent 4470 0 R /Prev 4471 0 R /A 715 0 R >> endobj 4473 0 obj << /Title /Parent 4462 0 R /Prev 4470 0 R /Next 4474 0 R /A 718 0 R >> endobj 4474 0 obj << /Title /Parent 4462 0 R /Prev 4473 0 R /Next 4479 0 R /First 4475 0 R /Last 4478 0 R /Count -4 /A 721 0 R >> endobj 4475 0 obj << /Title /Parent 4474 0 R /Next 4476 0 R /A 724 0 R >> endobj 4476 0 obj << /Title /Parent 4474 0 R /Prev 4475 0 R /Next 4477 0 R /A 727 0 R >> endobj 4477 0 obj << /Title /Parent 4474 0 R /Prev 4476 0 R /Next 4478 0 R /A 588 0 R >> endobj 4478 0 obj << /Title /Parent 4474 0 R /Prev 4477 0 R /A 732 0 R >> endobj 4479 0 obj << /Title /Parent 4462 0 R /Prev 4474 0 R /Next 4484 0 R /First 4480 0 R /Last 4481 0 R /Count -4 /A 735 0 R >> endobj 4480 0 obj << /Title /Parent 4479 0 R /Next 4481 0 R /A 738 0 R >> endobj 4481 0 obj << /Title /Parent 4479 0 R /Prev 4480 0 R /First 4482 0 R /Last 4483 0 R /Count -2 /A 600 0 R >> endobj 4482 0 obj << /Title /Parent 4481 0 R /Next 4483 0 R /A 4261 0 R >> endobj 4483 0 obj << /Title /Parent 4481 0 R /Prev 4482 0 R /A 4262 0 R >> endobj 4484 0 obj << /Title /Parent 4462 0 R /Prev 4479 0 R /Next 4485 0 R /A 743 0 R >> endobj 4485 0 obj << /Title /Parent 4462 0 R /Prev 4484 0 R /First 4486 0 R /Last 4487 0 R /Count -2 /A 746 0 R >> endobj 4486 0 obj << /Title /Parent 4485 0 R /Next 4487 0 R /A 749 0 R >> endobj 4487 0 obj << /Title /Parent 4485 0 R /Prev 4486 0 R /A 752 0 R >> endobj 4488 0 obj << /Title /Parent 4364 0 R /Prev 4394 0 R /Next 4581 0 R /First 4489 0 R /Last 4568 0 R /Count -92 /A 871 0 R >> endobj 4489 0 obj << /Title /Parent 4488 0 R /Next 4495 0 R /First 4490 0 R /Last 4494 0 R /Count -5 /A 874 0 R >> endobj 4490 0 obj << /Title /Parent 4489 0 R /Next 4491 0 R /A 877 0 R >> endobj 4491 0 obj << /Title /Parent 4489 0 R /Prev 4490 0 R /Next 4492 0 R /A 880 0 R >> endobj 4492 0 obj << /Title /Parent 4489 0 R /Prev 4491 0 R /Next 4493 0 R /A 883 0 R >> endobj 4493 0 obj << /Title /Parent 4489 0 R /Prev 4492 0 R /Next 4494 0 R /A 886 0 R >> endobj 4494 0 obj << /Title /Parent 4489 0 R /Prev 4493 0 R /A 889 0 R >> endobj 4495 0 obj << /Title /Parent 4488 0 R /Prev 4489 0 R /Next 4510 0 R /First 4496 0 R /Last 4505 0 R /Count -14 /A 892 0 R >> endobj 4496 0 obj << /Title /Parent 4495 0 R /Next 4501 0 R /First 4497 0 R /Last 4500 0 R /Count -4 /A 895 0 R >> endobj 4497 0 obj << /Title /Parent 4496 0 R /Next 4498 0 R /A 898 0 R >> endobj 4498 0 obj << /Title /Parent 4496 0 R /Prev 4497 0 R /Next 4499 0 R /A 901 0 R >> endobj 4499 0 obj << /Title /Parent 4496 0 R /Prev 4498 0 R /Next 4500 0 R /A 904 0 R >> endobj 4500 0 obj << /Title /Parent 4496 0 R /Prev 4499 0 R /A 907 0 R >> endobj 4501 0 obj << /Title /Parent 4495 0 R /Prev 4496 0 R /Next 4502 0 R /A 910 0 R >> endobj 4502 0 obj << /Title /Parent 4495 0 R /Prev 4501 0 R /Next 4503 0 R /A 913 0 R >> endobj 4503 0 obj << /Title /Parent 4495 0 R /Prev 4502 0 R /Next 4504 0 R /A 916 0 R >> endobj 4504 0 obj << /Title /Parent 4495 0 R /Prev 4503 0 R /Next 4505 0 R /A 919 0 R >> endobj 4505 0 obj << /Title /Parent 4495 0 R /Prev 4504 0 R /First 4506 0 R /Last 4507 0 R /Count -4 /A 922 0 R >> endobj 4506 0 obj << /Title /Parent 4505 0 R /Next 4507 0 R /A 925 0 R >> endobj 4507 0 obj << /Title /Parent 4505 0 R /Prev 4506 0 R /First 4508 0 R /Last 4509 0 R /Count -2 /A 928 0 R >> endobj 4508 0 obj << /Title /Parent 4507 0 R /Next 4509 0 R /A 4263 0 R >> endobj 4509 0 obj << /Title /Parent 4507 0 R /Prev 4508 0 R /A 4264 0 R >> endobj 4510 0 obj << /Title /Parent 4488 0 R /Prev 4495 0 R /Next 4532 0 R /First 4511 0 R /Last 4529 0 R /Count -21 /A 931 0 R >> endobj 4511 0 obj << /Title /Parent 4510 0 R /Next 4514 0 R /First 4512 0 R /Last 4513 0 R /Count -2 /A 808 0 R >> endobj 4512 0 obj << /Title /Parent 4511 0 R /Next 4513 0 R /A 936 0 R >> endobj 4513 0 obj << /Title /Parent 4511 0 R /Prev 4512 0 R /A 939 0 R >> endobj 4514 0 obj << /Title /Parent 4510 0 R /Prev 4511 0 R /Next 4515 0 R /A 942 0 R >> endobj 4515 0 obj << /Title /Parent 4510 0 R /Prev 4514 0 R /Next 4516 0 R /A 945 0 R >> endobj 4516 0 obj << /Title /Parent 4510 0 R /Prev 4515 0 R /Next 4517 0 R /A 948 0 R >> endobj 4517 0 obj << /Title /Parent 4510 0 R /Prev 4516 0 R /Next 4518 0 R /A 951 0 R >> endobj 4518 0 obj << /Title /Parent 4510 0 R /Prev 4517 0 R /Next 4522 0 R /First 4519 0 R /Last 4521 0 R /Count -3 /A 954 0 R >> endobj 4519 0 obj << /Title /Parent 4518 0 R /Next 4520 0 R /A 957 0 R >> endobj 4520 0 obj << /Title /Parent 4518 0 R /Prev 4519 0 R /Next 4521 0 R /A 960 0 R >> endobj 4521 0 obj << /Title /Parent 4518 0 R /Prev 4520 0 R /A 963 0 R >> endobj 4522 0 obj << /Title /Parent 4510 0 R /Prev 4518 0 R /Next 4523 0 R /A 1055 0 R >> endobj 4523 0 obj << /Title /Parent 4510 0 R /Prev 4522 0 R /Next 4524 0 R /A 1058 0 R >> endobj 4524 0 obj << /Title /Parent 4510 0 R /Prev 4523 0 R /Next 4528 0 R /First 4525 0 R /Last 4527 0 R /Count -3 /A 1061 0 R >> endobj 4525 0 obj << /Title /Parent 4524 0 R /Next 4526 0 R /A 1064 0 R >> endobj 4526 0 obj << /Title /Parent 4524 0 R /Prev 4525 0 R /Next 4527 0 R /A 1067 0 R >> endobj 4527 0 obj << /Title /Parent 4524 0 R /Prev 4526 0 R /A 1070 0 R >> endobj 4528 0 obj << /Title /Parent 4510 0 R /Prev 4524 0 R /Next 4529 0 R /A 969 0 R >> endobj 4529 0 obj << /Title /Parent 4510 0 R /Prev 4528 0 R /First 4530 0 R /Last 4531 0 R /Count -2 /A 1075 0 R >> endobj 4530 0 obj << /Title /Parent 4529 0 R /Next 4531 0 R /A 1078 0 R >> endobj 4531 0 obj << /Title /Parent 4529 0 R /Prev 4530 0 R /A 1081 0 R >> endobj 4532 0 obj << /Title /Parent 4488 0 R /Prev 4510 0 R /Next 4542 0 R /First 4533 0 R /Last 4538 0 R /Count -9 /A 1084 0 R >> endobj 4533 0 obj << /Title /Parent 4532 0 R /Next 4534 0 R /A 1087 0 R >> endobj 4534 0 obj << /Title /Parent 4532 0 R /Prev 4533 0 R /Next 4535 0 R /A 1090 0 R >> endobj 4535 0 obj << /Title /Parent 4532 0 R /Prev 4534 0 R /Next 4536 0 R /A 1093 0 R >> endobj 4536 0 obj << /Title /Parent 4532 0 R /Prev 4535 0 R /Next 4537 0 R /A 1096 0 R >> endobj 4537 0 obj << /Title /Parent 4532 0 R /Prev 4536 0 R /Next 4538 0 R /A 1099 0 R >> endobj 4538 0 obj << /Title /Parent 4532 0 R /Prev 4537 0 R /First 4539 0 R /Last 4541 0 R /Count -3 /A 1102 0 R >> endobj 4539 0 obj << /Title /Parent 4538 0 R /Next 4540 0 R /A 1105 0 R >> endobj 4540 0 obj << /Title /Parent 4538 0 R /Prev 4539 0 R /Next 4541 0 R /A 1108 0 R >> endobj 4541 0 obj << /Title /Parent 4538 0 R /Prev 4540 0 R /A 1111 0 R >> endobj 4542 0 obj << /Title /Parent 4488 0 R /Prev 4532 0 R /Next 4568 0 R /First 4543 0 R /Last 4567 0 R /Count -25 /A 1114 0 R >> endobj 4543 0 obj << /Title /Parent 4542 0 R /Next 4544 0 R /A 1117 0 R >> endobj 4544 0 obj << /Title /Parent 4542 0 R /Prev 4543 0 R /Next 4546 0 R /First 4545 0 R /Last 4545 0 R /Count -1 /A 1120 0 R >> endobj 4545 0 obj << /Title /Parent 4544 0 R /A 1123 0 R >> endobj 4546 0 obj << /Title /Parent 4542 0 R /Prev 4544 0 R /Next 4562 0 R /First 4547 0 R /Last 4561 0 R /Count -15 /A 1202 0 R >> endobj 4547 0 obj << /Title /Parent 4546 0 R /Next 4551 0 R /First 4548 0 R /Last 4550 0 R /Count -3 /A 1206 0 R >> endobj 4548 0 obj << /Title /Parent 4547 0 R /Next 4549 0 R /A 4265 0 R >> endobj 4549 0 obj << /Title /Parent 4547 0 R /Prev 4548 0 R /Next 4550 0 R /A 2452 0 R >> endobj 4550 0 obj << /Title /Parent 4547 0 R /Prev 4549 0 R /A 4266 0 R >> endobj 4551 0 obj << /Title /Parent 4546 0 R /Prev 4547 0 R /Next 4561 0 R /First 4552 0 R /Last 4560 0 R /Count -9 /A 1209 0 R >> endobj 4552 0 obj << /Title /Parent 4551 0 R /Next 4553 0 R /A 1584 0 R >> endobj 4553 0 obj << /Title /Parent 4551 0 R /Prev 4552 0 R /Next 4557 0 R /First 4554 0 R /Last 4556 0 R /Count -3 /A 3260 0 R >> endobj 4554 0 obj << /Title /Parent 4553 0 R /Next 4555 0 R /A 1586 0 R >> endobj 4555 0 obj << /Title /Parent 4553 0 R /Prev 4554 0 R /Next 4556 0 R /A 4267 0 R >> endobj 4556 0 obj << /Title /Parent 4553 0 R /Prev 4555 0 R /A 4268 0 R >> endobj 4557 0 obj << /Title /Parent 4551 0 R /Prev 4553 0 R /Next 4560 0 R /First 4558 0 R /Last 4559 0 R /Count -2 /A 4269 0 R >> endobj 4558 0 obj << /Title /Parent 4557 0 R /Next 4559 0 R /A 4270 0 R >> endobj 4559 0 obj << /Title /Parent 4557 0 R /Prev 4558 0 R /A 4271 0 R >> endobj 4560 0 obj << /Title /Parent 4551 0 R /Prev 4557 0 R /A 4272 0 R >> endobj 4561 0 obj << /Title /Parent 4546 0 R /Prev 4551 0 R /A 1212 0 R >> endobj 4562 0 obj << /Title /Parent 4542 0 R /Prev 4546 0 R /Next 4563 0 R /A 1215 0 R >> endobj 4563 0 obj << /Title /Parent 4542 0 R /Prev 4562 0 R /Next 4567 0 R /First 4564 0 R /Last 4566 0 R /Count -3 /A 1218 0 R >> endobj 4564 0 obj << /Title /Parent 4563 0 R /Next 4565 0 R /A 1221 0 R >> endobj 4565 0 obj << /Title /Parent 4563 0 R /Prev 4564 0 R /Next 4566 0 R /A 1224 0 R >> endobj 4566 0 obj << /Title /Parent 4563 0 R /Prev 4565 0 R /A 1227 0 R >> endobj 4567 0 obj << /Title /Parent 4542 0 R /Prev 4563 0 R /A 1230 0 R >> endobj 4568 0 obj << /Title /Parent 4488 0 R /Prev 4542 0 R /First 4569 0 R /Last 4570 0 R /Count -12 /A 1171 0 R >> endobj 4569 0 obj << /Title /Parent 4568 0 R /Next 4570 0 R /A 1235 0 R >> endobj 4570 0 obj << /Title /Parent 4568 0 R /Prev 4569 0 R /First 4571 0 R /Last 4580 0 R /Count -10 /A 1238 0 R >> endobj 4571 0 obj << /Title /Parent 4570 0 R /Next 4572 0 R /A 1241 0 R >> endobj 4572 0 obj << /Title /Parent 4570 0 R /Prev 4571 0 R /Next 4580 0 R /First 4573 0 R /Last 4579 0 R /Count -7 /A 1244 0 R >> endobj 4573 0 obj << /Title /Parent 4572 0 R /Next 4578 0 R /First 4574 0 R /Last 4577 0 R /Count -4 /A 4273 0 R >> endobj 4574 0 obj << /Title /Parent 4573 0 R /Next 4575 0 R /A 4274 0 R >> endobj 4575 0 obj << /Title /Parent 4573 0 R /Prev 4574 0 R /Next 4576 0 R /A 4275 0 R >> endobj 4576 0 obj << /Title /Parent 4573 0 R /Prev 4575 0 R /Next 4577 0 R /A 4276 0 R >> endobj 4577 0 obj << /Title /Parent 4573 0 R /Prev 4576 0 R /A 1192 0 R >> endobj 4578 0 obj << /Title /Parent 4572 0 R /Prev 4573 0 R /Next 4579 0 R /A 4277 0 R >> endobj 4579 0 obj << /Title /Parent 4572 0 R /Prev 4578 0 R /A 4278 0 R >> endobj 4580 0 obj << /Title /Parent 4570 0 R /Prev 4572 0 R /A 1247 0 R >> endobj 4581 0 obj << /Title /Parent 4364 0 R /Prev 4488 0 R /Next 4641 0 R /First 4582 0 R /Last 4630 0 R /Count -59 /A 2165 0 R >> endobj 4582 0 obj << /Title /Parent 4581 0 R /Next 4588 0 R /First 4583 0 R /Last 4587 0 R /Count -5 /A 1259 0 R >> endobj 4583 0 obj << /Title (refdbctl) /Parent 4582 0 R /Next 4584 0 R /A 1291 0 R >> endobj 4584 0 obj << /Title (refdbd) /Parent 4582 0 R /Prev 4583 0 R /Next 4585 0 R /A 1270 0 R >> endobj 4585 0 obj << /Title (refdb) /Parent 4582 0 R /Prev 4584 0 R /Next 4586 0 R /A 1628 0 R >> endobj 4586 0 obj << /Title (refdbsru) /Parent 4582 0 R /Prev 4585 0 R /Next 4587 0 R /A 1319 0 R >> endobj 4587 0 obj << /Title (refdb-sruserver) /Parent 4582 0 R /Prev 4586 0 R /A 1402 0 R >> endobj 4588 0 obj << /Title /Parent 4581 0 R /Prev 4582 0 R /Next 4594 0 R /First 4589 0 R /Last 4593 0 R /Count -5 /A 2180 0 R >> endobj 4589 0 obj << /Title (refdba) /Parent 4588 0 R /Next 4590 0 R /A 1530 0 R >> endobj 4590 0 obj << /Title (refdb-backup) /Parent 4588 0 R /Prev 4589 0 R /Next 4591 0 R /A 1642 0 R >> endobj 4591 0 obj << /Title (refdb-restore) /Parent 4588 0 R /Prev 4590 0 R /Next 4592 0 R /A 1644 0 R >> endobj 4592 0 obj << /Title (refdb-init) /Parent 4588 0 R /Prev 4591 0 R /Next 4593 0 R /A 1546 0 R >> endobj 4593 0 obj << /Title (refdb-bug) /Parent 4588 0 R /Prev 4592 0 R /A 2191 0 R >> endobj 4594 0 obj << /Title /Parent 4581 0 R /Prev 4588 0 R /Next 4630 0 R /First 4595 0 R /Last 4627 0 R /Count -35 /A 2194 0 R >> endobj 4595 0 obj << /Title /Parent 4594 0 R /Next 4605 0 R /First 4596 0 R /Last 4604 0 R /Count -9 /A 2197 0 R >> endobj 4596 0 obj << /Title (refdbc) /Parent 4595 0 R /Next 4597 0 R /A 1632 0 R >> endobj 4597 0 obj << /Title (bib2ris) /Parent 4595 0 R /Prev 4596 0 R /Next 4598 0 R /A 1935 0 R >> endobj 4598 0 obj << /Title (db2ris) /Parent 4595 0 R /Prev 4597 0 R /Next 4599 0 R /A 1950 0 R >> endobj 4599 0 obj << /Title (en2ris) /Parent 4595 0 R /Prev 4598 0 R /Next 4600 0 R /A 1938 0 R >> endobj 4600 0 obj << /Title (marc2ris) /Parent 4595 0 R /Prev 4599 0 R /Next 4601 0 R /A 1940 0 R >> endobj 4601 0 obj << /Title (med2ris) /Parent 4595 0 R /Prev 4600 0 R /Next 4602 0 R /A 1930 0 R >> endobj 4602 0 obj << /Title (refdb-pubmed) /Parent 4595 0 R /Prev 4601 0 R /Next 4603 0 R /A 4209 0 R >> endobj 4603 0 obj << /Title (refdb_dos2unix) /Parent 4595 0 R /Prev 4602 0 R /Next 4604 0 R /A 2036 0 R >> endobj 4604 0 obj << /Title (refdb_latex2utf8txt) /Parent 4595 0 R /Prev 4603 0 R /A 2063 0 R >> endobj 4605 0 obj << /Title /Parent 4594 0 R /Prev 4595 0 R /Next 4618 0 R /First 4606 0 R /Last 4617 0 R /Count -12 /A 2200 0 R >> endobj 4606 0 obj << /Title /Parent 4605 0 R /Next 4607 0 R /A 2203 0 R >> endobj 4607 0 obj << /Title /Parent 4605 0 R /Prev 4606 0 R /Next 4608 0 R /A 2206 0 R >> endobj 4608 0 obj << /Title /Parent 4605 0 R /Prev 4607 0 R /Next 4609 0 R /A 2817 0 R >> endobj 4609 0 obj << /Title /Parent 4605 0 R /Prev 4608 0 R /Next 4610 0 R /A 2820 0 R >> endobj 4610 0 obj << /Title /Parent 4605 0 R /Prev 4609 0 R /Next 4611 0 R /A 2823 0 R >> endobj 4611 0 obj << /Title /Parent 4605 0 R /Prev 4610 0 R /Next 4612 0 R /A 2826 0 R >> endobj 4612 0 obj << /Title /Parent 4605 0 R /Prev 4611 0 R /Next 4613 0 R /A 2829 0 R >> endobj 4613 0 obj << /Title /Parent 4605 0 R /Prev 4612 0 R /Next 4614 0 R /A 2832 0 R >> endobj 4614 0 obj << /Title /Parent 4605 0 R /Prev 4613 0 R /Next 4615 0 R /A 2835 0 R >> endobj 4615 0 obj << /Title /Parent 4605 0 R /Prev 4614 0 R /Next 4616 0 R /A 2838 0 R >> endobj 4616 0 obj << /Title /Parent 4605 0 R /Prev 4615 0 R /Next 4617 0 R /A 2841 0 R >> endobj 4617 0 obj << /Title /Parent 4605 0 R /Prev 4616 0 R /A 2844 0 R >> endobj 4618 0 obj << /Title /Parent 4594 0 R /Prev 4605 0 R /Next 4623 0 R /First 4619 0 R /Last 4622 0 R /Count -4 /A 2847 0 R >> endobj 4619 0 obj << /Title /Parent 4618 0 R /Next 4620 0 R /A 2850 0 R >> endobj 4620 0 obj << /Title /Parent 4618 0 R /Prev 4619 0 R /Next 4621 0 R /A 2853 0 R >> endobj 4621 0 obj << /Title /Parent 4618 0 R /Prev 4620 0 R /Next 4622 0 R /A 2856 0 R >> endobj 4622 0 obj << /Title /Parent 4618 0 R /Prev 4621 0 R /A 2859 0 R >> endobj 4623 0 obj << /Title /Parent 4594 0 R /Prev 4618 0 R /Next 4627 0 R /First 4624 0 R /Last 4626 0 R /Count -3 /A 2235 0 R >> endobj 4624 0 obj << /Title /Parent 4623 0 R /Next 4625 0 R /A 2864 0 R >> endobj 4625 0 obj << /Title /Parent 4623 0 R /Prev 4624 0 R /Next 4626 0 R /A 2292 0 R >> endobj 4626 0 obj << /Title /Parent 4623 0 R /Prev 4625 0 R /A 2304 0 R >> endobj 4627 0 obj << /Title /Parent 4594 0 R /Prev 4623 0 R /First 4628 0 R /Last 4629 0 R /Count -2 /A 2337 0 R >> endobj 4628 0 obj << /Title /Parent 4627 0 R /Next 4629 0 R /A 2330 0 R >> endobj 4629 0 obj << /Title /Parent 4627 0 R /Prev 4628 0 R /A 2358 0 R >> endobj 4630 0 obj << /Title /Parent 4581 0 R /Prev 4594 0 R /First 4631 0 R /Last 4640 0 R /Count -10 /A 2388 0 R >> endobj 4631 0 obj << /Title (refdbib) /Parent 4630 0 R /Next 4632 0 R /A 2418 0 R >> endobj 4632 0 obj << /Title (refdbnd) /Parent 4630 0 R /Prev 4631 0 R /Next 4633 0 R /A 2446 0 R >> endobj 4633 0 obj << /Title (runbib) /Parent 4630 0 R /Prev 4632 0 R /Next 4634 0 R /A 2485 0 R >> endobj 4634 0 obj << /Title (runbib-missing) /Parent 4630 0 R /Prev 4633 0 R /Next 4635 0 R /A 2885 0 R >> endobj 4635 0 obj << /Title (refdbjade) /Parent 4630 0 R /Prev 4634 0 R /Next 4636 0 R /A 2668 0 R >> endobj 4636 0 obj << /Title (refdbxml) /Parent 4630 0 R /Prev 4635 0 R /Next 4637 0 R /A 2670 0 R >> endobj 4637 0 obj << /Title (refdbrtf) /Parent 4630 0 R /Prev 4636 0 R /Next 4638 0 R /A 2730 0 R >> endobj 4638 0 obj << /Title (refdbxp) /Parent 4630 0 R /Prev 4637 0 R /Next 4639 0 R /A 2741 0 R >> endobj 4639 0 obj << /Title (refdb-ms) /Parent 4630 0 R /Prev 4638 0 R /Next 4640 0 R /A 2896 0 R >> endobj 4640 0 obj << /Title (rtfcitations) /Parent 4630 0 R /Prev 4639 0 R /A 2899 0 R >> endobj 4641 0 obj << /Title /Parent 4364 0 R /Prev 4581 0 R /First 4642 0 R /Last 4741 0 R /Count -142 /A 2920 0 R >> endobj 4642 0 obj << /Title /Parent 4641 0 R /Next 4656 0 R /First 4643 0 R /Last 4655 0 R /Count -13 /A 3111 0 R >> endobj 4643 0 obj << /Title /Parent 4642 0 R /Next 4644 0 R /A 3114 0 R >> endobj 4644 0 obj << /Title /Parent 4642 0 R /Prev 4643 0 R /Next 4645 0 R /A 2972 0 R >> endobj 4645 0 obj << /Title /Parent 4642 0 R /Prev 4644 0 R /Next 4646 0 R /A 2969 0 R >> endobj 4646 0 obj << /Title /Parent 4642 0 R /Prev 4645 0 R /Next 4647 0 R /A 2976 0 R >> endobj 4647 0 obj << /Title /Parent 4642 0 R /Prev 4646 0 R /Next 4648 0 R /A 3123 0 R >> endobj 4648 0 obj << /Title /Parent 4642 0 R /Prev 4647 0 R /Next 4649 0 R /A 2990 0 R >> endobj 4649 0 obj << /Title /Parent 4642 0 R /Prev 4648 0 R /Next 4650 0 R /A 2981 0 R >> endobj 4650 0 obj << /Title /Parent 4642 0 R /Prev 4649 0 R /Next 4651 0 R /A 2994 0 R >> endobj 4651 0 obj << /Title /Parent 4642 0 R /Prev 4650 0 R /Next 4652 0 R /A 3132 0 R >> endobj 4652 0 obj << /Title /Parent 4642 0 R /Prev 4651 0 R /Next 4653 0 R /A 3135 0 R >> endobj 4653 0 obj << /Title /Parent 4642 0 R /Prev 4652 0 R /Next 4654 0 R /A 3138 0 R >> endobj 4654 0 obj << /Title /Parent 4642 0 R /Prev 4653 0 R /Next 4655 0 R /A 3141 0 R >> endobj 4655 0 obj << /Title /Parent 4642 0 R /Prev 4654 0 R /A 3144 0 R >> endobj 4656 0 obj << /Title /Parent 4641 0 R /Prev 4642 0 R /Next 4662 0 R /First 4657 0 R /Last 4661 0 R /Count -5 /A 3147 0 R >> endobj 4657 0 obj << /Title /Parent 4656 0 R /Next 4658 0 R /A 3150 0 R >> endobj 4658 0 obj << /Title /Parent 4656 0 R /Prev 4657 0 R /Next 4659 0 R /A 3011 0 R >> endobj 4659 0 obj << /Title /Parent 4656 0 R /Prev 4658 0 R /Next 4660 0 R /A 3004 0 R >> endobj 4660 0 obj << /Title /Parent 4656 0 R /Prev 4659 0 R /Next 4661 0 R /A 3005 0 R >> endobj 4661 0 obj << /Title /Parent 4656 0 R /Prev 4660 0 R /A 3006 0 R >> endobj 4662 0 obj << /Title /Parent 4641 0 R /Prev 4656 0 R /Next 4665 0 R /First 4663 0 R /Last 4664 0 R /Count -2 /A 3161 0 R >> endobj 4663 0 obj << /Title /Parent 4662 0 R /Next 4664 0 R /A 3164 0 R >> endobj 4664 0 obj << /Title /Parent 4662 0 R /Prev 4663 0 R /A 3167 0 R >> endobj 4665 0 obj << /Title /Parent 4641 0 R /Prev 4662 0 R /Next 4672 0 R /First 4666 0 R /Last 4670 0 R /Count -6 /A 3170 0 R >> endobj 4666 0 obj << /Title /Parent 4665 0 R /Next 4667 0 R /A 3346 0 R >> endobj 4667 0 obj << /Title /Parent 4665 0 R /Prev 4666 0 R /Next 4670 0 R /First 4668 0 R /Last 4669 0 R /Count -2 /A 3349 0 R >> endobj 4668 0 obj << /Title /Parent 4667 0 R /Next 4669 0 R /A 3352 0 R >> endobj 4669 0 obj << /Title /Parent 4667 0 R /Prev 4668 0 R /A 3355 0 R >> endobj 4670 0 obj << /Title /Parent 4665 0 R /Prev 4667 0 R /First 4671 0 R /Last 4671 0 R /Count -1 /A 3358 0 R >> endobj 4671 0 obj << /Title /Parent 4670 0 R /A 3361 0 R >> endobj 4672 0 obj << /Title /Parent 4641 0 R /Prev 4665 0 R /Next 4733 0 R /First 4673 0 R /Last 4674 0 R /Count -60 /A 3190 0 R >> endobj 4673 0 obj << /Title /Parent 4672 0 R /Next 4674 0 R /A 3366 0 R >> endobj 4674 0 obj << /Title /Parent 4672 0 R /Prev 4673 0 R /First 4675 0 R /Last 4683 0 R /Count -58 /A 3369 0 R >> endobj 4675 0 obj << /Title /Parent 4674 0 R /Next 4679 0 R /First 4676 0 R /Last 4678 0 R /Count -3 /A 3372 0 R >> endobj 4676 0 obj << /Title /Parent 4675 0 R /Next 4677 0 R /A 4279 0 R >> endobj 4677 0 obj << /Title /Parent 4675 0 R /Prev 4676 0 R /Next 4678 0 R /A 4280 0 R >> endobj 4678 0 obj << /Title /Parent 4675 0 R /Prev 4677 0 R /A 4281 0 R >> endobj 4679 0 obj << /Title /Parent 4674 0 R /Prev 4675 0 R /Next 4681 0 R /First 4680 0 R /Last 4680 0 R /Count -1 /A 3375 0 R >> endobj 4680 0 obj << /Title /Parent 4679 0 R /A 4282 0 R >> endobj 4681 0 obj << /Title /Parent 4674 0 R /Prev 4679 0 R /Next 4683 0 R /First 4682 0 R /Last 4682 0 R /Count -1 /A 3378 0 R >> endobj 4682 0 obj << /Title /Parent 4681 0 R /A 4283 0 R >> endobj 4683 0 obj << /Title /Parent 4674 0 R /Prev 4681 0 R /First 4684 0 R /Last 4732 0 R /Count -49 /A 3381 0 R >> endobj 4684 0 obj << /Title /Parent 4683 0 R /Next 4685 0 R /A 4284 0 R >> endobj 4685 0 obj << /Title /Parent 4683 0 R /Prev 4684 0 R /Next 4686 0 R /A 4285 0 R >> endobj 4686 0 obj << /Title /Parent 4683 0 R /Prev 4685 0 R /Next 4687 0 R /A 4286 0 R >> endobj 4687 0 obj << /Title /Parent 4683 0 R /Prev 4686 0 R /Next 4688 0 R /A 4287 0 R >> endobj 4688 0 obj << /Title /Parent 4683 0 R /Prev 4687 0 R /Next 4689 0 R /A 4288 0 R >> endobj 4689 0 obj << /Title /Parent 4683 0 R /Prev 4688 0 R /Next 4690 0 R /A 4289 0 R >> endobj 4690 0 obj << /Title /Parent 4683 0 R /Prev 4689 0 R /Next 4691 0 R /A 4290 0 R >> endobj 4691 0 obj << /Title /Parent 4683 0 R /Prev 4690 0 R /Next 4692 0 R /A 4291 0 R >> endobj 4692 0 obj << /Title /Parent 4683 0 R /Prev 4691 0 R /Next 4693 0 R /A 4292 0 R >> endobj 4693 0 obj << /Title /Parent 4683 0 R /Prev 4692 0 R /Next 4694 0 R /A 4293 0 R >> endobj 4694 0 obj << /Title /Parent 4683 0 R /Prev 4693 0 R /Next 4695 0 R /A 4294 0 R >> endobj 4695 0 obj << /Title /Parent 4683 0 R /Prev 4694 0 R /Next 4696 0 R /A 4295 0 R >> endobj 4696 0 obj << /Title /Parent 4683 0 R /Prev 4695 0 R /Next 4697 0 R /A 4296 0 R >> endobj 4697 0 obj << /Title /Parent 4683 0 R /Prev 4696 0 R /Next 4698 0 R /A 4297 0 R >> endobj 4698 0 obj << /Title /Parent 4683 0 R /Prev 4697 0 R /Next 4699 0 R /A 4298 0 R >> endobj 4699 0 obj << /Title /Parent 4683 0 R /Prev 4698 0 R /Next 4700 0 R /A 4299 0 R >> endobj 4700 0 obj << /Title /Parent 4683 0 R /Prev 4699 0 R /Next 4701 0 R /A 4300 0 R >> endobj 4701 0 obj << /Title /Parent 4683 0 R /Prev 4700 0 R /Next 4702 0 R /A 4301 0 R >> endobj 4702 0 obj << /Title /Parent 4683 0 R /Prev 4701 0 R /Next 4703 0 R /A 4302 0 R >> endobj 4703 0 obj << /Title /Parent 4683 0 R /Prev 4702 0 R /Next 4704 0 R /A 4303 0 R >> endobj 4704 0 obj << /Title /Parent 4683 0 R /Prev 4703 0 R /Next 4705 0 R /A 4304 0 R >> endobj 4705 0 obj << /Title /Parent 4683 0 R /Prev 4704 0 R /Next 4706 0 R /A 4305 0 R >> endobj 4706 0 obj << /Title /Parent 4683 0 R /Prev 4705 0 R /Next 4707 0 R /A 4306 0 R >> endobj 4707 0 obj << /Title /Parent 4683 0 R /Prev 4706 0 R /Next 4708 0 R /A 4307 0 R >> endobj 4708 0 obj << /Title /Parent 4683 0 R /Prev 4707 0 R /Next 4709 0 R /A 4308 0 R >> endobj 4709 0 obj << /Title /Parent 4683 0 R /Prev 4708 0 R /Next 4710 0 R /A 4309 0 R >> endobj 4710 0 obj << /Title /Parent 4683 0 R /Prev 4709 0 R /Next 4711 0 R /A 4310 0 R >> endobj 4711 0 obj << /Title /Parent 4683 0 R /Prev 4710 0 R /Next 4712 0 R /A 4311 0 R >> endobj 4712 0 obj << /Title /Parent 4683 0 R /Prev 4711 0 R /Next 4713 0 R /A 4312 0 R >> endobj 4713 0 obj << /Title /Parent 4683 0 R /Prev 4712 0 R /Next 4714 0 R /A 4313 0 R >> endobj 4714 0 obj << /Title /Parent 4683 0 R /Prev 4713 0 R /Next 4715 0 R /A 4314 0 R >> endobj 4715 0 obj << /Title /Parent 4683 0 R /Prev 4714 0 R /Next 4716 0 R /A 4315 0 R >> endobj 4716 0 obj << /Title /Parent 4683 0 R /Prev 4715 0 R /Next 4717 0 R /A 4316 0 R >> endobj 4717 0 obj << /Title /Parent 4683 0 R /Prev 4716 0 R /Next 4718 0 R /A 4317 0 R >> endobj 4718 0 obj << /Title /Parent 4683 0 R /Prev 4717 0 R /Next 4719 0 R /A 4318 0 R >> endobj 4719 0 obj << /Title /Parent 4683 0 R /Prev 4718 0 R /Next 4720 0 R /A 4319 0 R >> endobj 4720 0 obj << /Title /Parent 4683 0 R /Prev 4719 0 R /Next 4721 0 R /A 4320 0 R >> endobj 4721 0 obj << /Title /Parent 4683 0 R /Prev 4720 0 R /Next 4722 0 R /A 4321 0 R >> endobj 4722 0 obj << /Title /Parent 4683 0 R /Prev 4721 0 R /Next 4723 0 R /A 4322 0 R >> endobj 4723 0 obj << /Title /Parent 4683 0 R /Prev 4722 0 R /Next 4724 0 R /A 4323 0 R >> endobj 4724 0 obj << /Title /Parent 4683 0 R /Prev 4723 0 R /Next 4725 0 R /A 4324 0 R >> endobj 4725 0 obj << /Title /Parent 4683 0 R /Prev 4724 0 R /Next 4726 0 R /A 4325 0 R >> endobj 4726 0 obj << /Title /Parent 4683 0 R /Prev 4725 0 R /Next 4727 0 R /A 4326 0 R >> endobj 4727 0 obj << /Title /Parent 4683 0 R /Prev 4726 0 R /Next 4728 0 R /A 4327 0 R >> endobj 4728 0 obj << /Title /Parent 4683 0 R /Prev 4727 0 R /Next 4729 0 R /A 4328 0 R >> endobj 4729 0 obj << /Title /Parent 4683 0 R /Prev 4728 0 R /Next 4730 0 R /A 4329 0 R >> endobj 4730 0 obj << /Title /Parent 4683 0 R /Prev 4729 0 R /Next 4731 0 R /A 4330 0 R >> endobj 4731 0 obj << /Title /Parent 4683 0 R /Prev 4730 0 R /Next 4732 0 R /A 4331 0 R >> endobj 4732 0 obj << /Title /Parent 4683 0 R /Prev 4731 0 R /A 4332 0 R >> endobj 4733 0 obj << /Title /Parent 4641 0 R /Prev 4672 0 R /Next 4736 0 R /First 4734 0 R /Last 4735 0 R /Count -2 /A 3384 0 R >> endobj 4734 0 obj << /Title /Parent 4733 0 R /Next 4735 0 R /A 3387 0 R >> endobj 4735 0 obj << /Title /Parent 4733 0 R /Prev 4734 0 R /A 3390 0 R >> endobj 4736 0 obj << /Title /Parent 4641 0 R /Prev 4733 0 R /Next 4741 0 R /First 4737 0 R /Last 4740 0 R /Count -4 /A 3393 0 R >> endobj 4737 0 obj << /Title /Parent 4736 0 R /Next 4738 0 R /A 3396 0 R >> endobj 4738 0 obj << /Title /Parent 4736 0 R /Prev 4737 0 R /Next 4739 0 R /A 3399 0 R >> endobj 4739 0 obj << /Title /Parent 4736 0 R /Prev 4738 0 R /Next 4740 0 R /A 3402 0 R >> endobj 4740 0 obj << /Title /Parent 4736 0 R /Prev 4739 0 R /A 3405 0 R >> endobj 4741 0 obj << /Title /Parent 4641 0 R /Prev 4736 0 R /First 4742 0 R /Last 4782 0 R /Count -42 /A 3408 0 R >> endobj 4742 0 obj << /Title /Parent 4741 0 R /Next 4743 0 R /A 3411 0 R >> endobj 4743 0 obj << /Title /Parent 4741 0 R /Prev 4742 0 R /Next 4750 0 R /First 4744 0 R /Last 4748 0 R /Count -6 /A 3414 0 R >> endobj 4744 0 obj << /Title /Parent 4743 0 R /Next 4745 0 R /A 3417 0 R >> endobj 4745 0 obj << /Title /Parent 4743 0 R /Prev 4744 0 R /Next 4748 0 R /First 4746 0 R /Last 4747 0 R /Count -2 /A 3420 0 R >> endobj 4746 0 obj << /Title /Parent 4745 0 R /Next 4747 0 R /A 4333 0 R >> endobj 4747 0 obj << /Title /Parent 4745 0 R /Prev 4746 0 R /A 4334 0 R >> endobj 4748 0 obj << /Title /Parent 4743 0 R /Prev 4745 0 R /First 4749 0 R /Last 4749 0 R /Count -1 /A 3423 0 R >> endobj 4749 0 obj << /Title /Parent 4748 0 R /A 4335 0 R >> endobj 4750 0 obj << /Title /Parent 4741 0 R /Prev 4743 0 R /Next 4782 0 R /First 4751 0 R /Last 4781 0 R /Count -31 /A 3426 0 R >> endobj 4751 0 obj << /Title /Parent 4750 0 R /Next 4752 0 R /A 3429 0 R >> endobj 4752 0 obj << /Title /Parent 4750 0 R /Prev 4751 0 R /Next 4781 0 R /First 4753 0 R /Last 4780 0 R /Count -28 /A 3432 0 R >> endobj 4753 0 obj << /Title /Parent 4752 0 R /Next 4754 0 R /A 4336 0 R >> endobj 4754 0 obj << /Title /Parent 4752 0 R /Prev 4753 0 R /Next 4755 0 R /A 4337 0 R >> endobj 4755 0 obj << /Title /Parent 4752 0 R /Prev 4754 0 R /Next 4756 0 R /A 4338 0 R >> endobj 4756 0 obj << /Title /Parent 4752 0 R /Prev 4755 0 R /Next 4757 0 R /A 4339 0 R >> endobj 4757 0 obj << /Title /Parent 4752 0 R /Prev 4756 0 R /Next 4758 0 R /A 4340 0 R >> endobj 4758 0 obj << /Title /Parent 4752 0 R /Prev 4757 0 R /Next 4759 0 R /A 4341 0 R >> endobj 4759 0 obj << /Title /Parent 4752 0 R /Prev 4758 0 R /Next 4760 0 R /A 4342 0 R >> endobj 4760 0 obj << /Title /Parent 4752 0 R /Prev 4759 0 R /Next 4761 0 R /A 4343 0 R >> endobj 4761 0 obj << /Title /Parent 4752 0 R /Prev 4760 0 R /Next 4762 0 R /A 4344 0 R >> endobj 4762 0 obj << /Title /Parent 4752 0 R /Prev 4761 0 R /Next 4763 0 R /A 4345 0 R >> endobj 4763 0 obj << /Title /Parent 4752 0 R /Prev 4762 0 R /Next 4764 0 R /A 4346 0 R >> endobj 4764 0 obj << /Title /Parent 4752 0 R /Prev 4763 0 R /Next 4765 0 R /A 4347 0 R >> endobj 4765 0 obj << /Title /Parent 4752 0 R /Prev 4764 0 R /Next 4766 0 R /A 4348 0 R >> endobj 4766 0 obj << /Title /Parent 4752 0 R /Prev 4765 0 R /Next 4767 0 R /A 4349 0 R >> endobj 4767 0 obj << /Title /Parent 4752 0 R /Prev 4766 0 R /Next 4768 0 R /A 4350 0 R >> endobj 4768 0 obj << /Title /Parent 4752 0 R /Prev 4767 0 R /Next 4769 0 R /A 4351 0 R >> endobj 4769 0 obj << /Title /Parent 4752 0 R /Prev 4768 0 R /Next 4770 0 R /A 4352 0 R >> endobj 4770 0 obj << /Title /Parent 4752 0 R /Prev 4769 0 R /Next 4771 0 R /A 4353 0 R >> endobj 4771 0 obj << /Title /Parent 4752 0 R /Prev 4770 0 R /Next 4772 0 R /A 4354 0 R >> endobj 4772 0 obj << /Title /Parent 4752 0 R /Prev 4771 0 R /Next 4773 0 R /A 4355 0 R >> endobj 4773 0 obj << /Title /Parent 4752 0 R /Prev 4772 0 R /Next 4774 0 R /A 4356 0 R >> endobj 4774 0 obj << /Title /Parent 4752 0 R /Prev 4773 0 R /Next 4775 0 R /A 4357 0 R >> endobj 4775 0 obj << /Title /Parent 4752 0 R /Prev 4774 0 R /Next 4776 0 R /A 4358 0 R >> endobj 4776 0 obj << /Title /Parent 4752 0 R /Prev 4775 0 R /Next 4777 0 R /A 4359 0 R >> endobj 4777 0 obj << /Title /Parent 4752 0 R /Prev 4776 0 R /Next 4778 0 R /A 4360 0 R >> endobj 4778 0 obj << /Title /Parent 4752 0 R /Prev 4777 0 R /Next 4779 0 R /A 4361 0 R >> endobj 4779 0 obj << /Title /Parent 4752 0 R /Prev 4778 0 R /Next 4780 0 R /A 4362 0 R >> endobj 4780 0 obj << /Title /Parent 4752 0 R /Prev 4779 0 R /A 4363 0 R >> endobj 4781 0 obj << /Title /Parent 4750 0 R /Prev 4752 0 R /A 3435 0 R >> endobj 4782 0 obj << /Title /Parent 4741 0 R /Prev 4750 0 R /First 4783 0 R /Last 4783 0 R /Count -1 /A 4082 0 R >> endobj 4783 0 obj << /Title (eenc) /Parent 4782 0 R /A 4148 0 R >> endobj 4784 0 obj << /Type /Font /Subtype /Type1 /BaseFont /Courier-Bold /Encoding /WinAnsiEncoding >> endobj 4785 0 obj << /Type /Font /Subtype /Type1 /BaseFont /Helvetica /Encoding /WinAnsiEncoding >> endobj 4786 0 obj << /Type /Font /Subtype /Type1 /BaseFont /Courier-BoldOblique /Encoding /WinAnsiEncoding >> endobj 4787 0 obj << /Type /Font /Subtype /Type1 /BaseFont /Courier-Oblique /Encoding /WinAnsiEncoding >> endobj 4788 0 obj << /Type /Font /Subtype /Type1 /BaseFont /Times-Roman /Encoding /WinAnsiEncoding >> endobj 4789 0 obj << /Type /Font /Subtype /Type1 /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding >> endobj 4790 0 obj << /Type /Font /Subtype /Type1 /BaseFont /Courier /Encoding /WinAnsiEncoding >> endobj 4791 0 obj << /Type /Font /Subtype /Type1 /BaseFont /Times-Italic /Encoding /WinAnsiEncoding >> endobj 4792 0 obj << /Type /Font /Subtype /Type1 /BaseFont /Times-Bold /Encoding /WinAnsiEncoding >> endobj 4793 0 obj << /Type /Font /Subtype /Type1 /BaseFont /ZapfDingbats /ToUnicode 4794 0 R >> endobj 4794 0 obj << /Length 5214 0 R /Filter /FlateDecode >> stream xœ]”ÝŠÛ0…ïóºÜ^,ÎÈŽeÁ() ¹èMû²$g mç"o_ÍÈM $þ2–4gΠ)Ç/Ç¡_Tñcý).ªë‡0Çëx›}Tm<÷Æ´ ½_Öòë/nÚióé~]âå8t£*óªp›Ö•J?\—ù®^>‡±ŸTˆÇ¿Ï!ÎýpV/¿§Gôt›¦?ñ‡Em%‡ ÏâðÕMßÜ%ªBÎy=†´¨_î¯iûsůû•–ÿ”5ø1Äëä|œÝpŽ›·ív¯ÞÞß÷|òïŒÎ[Úθy]Ú¥Ï>1kà¸Þ×À¸¶À¸öÀ8wO&ÐO Ÿ@?~ýú ôè'ÐO Ÿ@?~ýú ôè׬»MĬGשÔÄN8¸ÍÌñªÉkv‰kÎ¥wžÏ©9—6U`Žw|¦)…[Í\eöÌ»¼·f®eïNØH<fÐÙ€þâü·à¿ÿ-øoÁ þ[ðß‚ÿü·à¿ÿ-øoÁ þ[ÐoA¿ý.{[—Ì63{âr/jöÜå^Ôìmɲ·œÓ=ÏOp½iTþ»xë%Õì–––˜tóR@Ú`s€ój®¥29ÀM«øe- LZ˜:Í™ŒÎ­çÔ†K01÷³á^±®FŒh¤©ŽÓº|hÍigi¥”JÊjYGÈ ë0¹ØŠœ%v²Âr–N:ŸÓ¶´–ëäÄcô1ÛümžÓX“)*óŒ'Y?ÄÇ8žÆ‰wÉ÷/²î‹ˆ endstream endobj 4795 0 obj << /Limits [(chapter-backend-api) (chapter-backend-api)] /Names [(chapter-backend-api) 3384 0 R] >> endobj 4796 0 obj << /Limits [(chapter-bibliographies) (chapter-bibliographies)] /Names [(chapter-bibliographies) 1114 0 R] >> endobj 4797 0 obj << /Limits [(chapter-cs-protocol) (chapter-cs-protocol)] /Names [(chapter-cs-protocol) 3408 0 R] >> endobj 4798 0 obj << /Limits [(chapter-data-input) (chapter-data-input)] /Names [(chapter-data-input) 892 0 R] >> endobj 4799 0 obj << /Limits [(chapter-inout-formats) (chapter-inout-formats)] /Names [(chapter-inout-formats) 3393 0 R] >> endobj 4800 0 obj << /Limits [(chapter-installation) (chapter-installation)] /Names [(chapter-installation) 492 0 R] >> endobj 4801 0 obj << /Limits [(chapter-introduction) (chapter-introduction)] /Names [(chapter-introduction) 174 0 R] >> endobj 4802 0 obj << /Limits [(chapter-limitations) (chapter-limitations)] /Names [(chapter-limitations) 228 0 R] >> endobj 4803 0 obj << /Limits [(chapter-managing-notes) (chapter-managing-notes)] /Names [(chapter-managing-notes) 1084 0 R] >> endobj 4804 0 obj << /Limits [(chapter-managing-references) (chapter-managing-references)] /Names [(chapter-managing-references) 931 0 R] >> endobj 4805 0 obj << /Limits [(chapter-overview-clients) (chapter-overview-clients)] /Names [(chapter-overview-clients) 874 0 R] >> endobj 4806 0 obj << /Limits [(chapter-perl-client-module) (chapter-perl-client-module)] /Names [(chapter-perl-client-module) 3190 0 R] >> endobj 4807 0 obj << /Limits [(chapter-programming) (chapter-programming)] /Names [(chapter-programming) 3170 0 R] >> endobj 4808 0 obj << /Limits [(chapter-refdb-database-design) (chapter-refdb-database-design)] /Names [(chapter-refdb-database-design) 3147 0 R] >> endobj 4809 0 obj << /Limits [(chapter-refdba) (chapter-refdba)] /Names [(chapter-refdba) 2180 0 R] >> endobj 4810 0 obj << /Limits [(chapter-refdbc) (chapter-refdbc)] /Names [(chapter-refdbc) 2194 0 R] >> endobj 4811 0 obj << /Limits [(chapter-refdbd) (chapter-refdbd)] /Names [(chapter-refdbd) 1259 0 R] >> endobj 4812 0 obj << /Limits [(chapter-refdbd-administration) (chapter-refdbd-administration)] /Names [(chapter-refdbd-administration) 691 0 R] >> endobj 4813 0 obj << /Limits [(chapter-refdbib) (chapter-refdbib)] /Names [(chapter-refdbib) 2388 0 R] >> endobj 4814 0 obj << /Limits [(chapter-reference-database-design) (chapter-reference-database-design)] /Names [(chapter-reference-database-design) 3111 0 R] >> endobj 4815 0 obj << /Limits [(chapter-ris-risx-format) (chapter-ris-risx-format)] /Names [(chapter-ris-risx-format) 3161 0 R] >> endobj 4816 0 obj << /Limits [(chapter-sru) (chapter-sru)] /Names [(chapter-sru) 1171 0 R] >> endobj 4817 0 obj << /Limits [(chapter-system-requirements) (chapter-system-requirements)] /Names [(chapter-system-requirements) 205 0 R] >> endobj 4818 0 obj << /Limits [(idp63096784) (idp63096784)] /Names [(idp63096784) 4225 0 R] >> endobj 4819 0 obj << /Limits [(idp63192656) (idp63192656)] /Names [(idp63192656) 431 0 R] >> endobj 4820 0 obj << /Limits [(idp63194192) (idp63194192)] /Names [(idp63194192) 435 0 R] >> endobj 4821 0 obj << /Limits [(idp63200592) (idp63200592)] /Names [(idp63200592) 438 0 R] >> endobj 4822 0 obj << /Limits [(idp63215952) (idp63215952)] /Names [(idp63215952) 441 0 R] >> endobj 4823 0 obj << /Limits [(idp63429200) (idp63429200)] /Names [(idp63429200) 231 0 R] >> endobj 4824 0 obj << /Limits [(idp63451600) (idp63451600)] /Names [(idp63451600) 234 0 R] >> endobj 4825 0 obj << /Limits [(idp63652432) (idp63652432)] /Names [(idp63652432) 178 0 R] >> endobj 4826 0 obj << /Limits [(idp63666768) (idp63666768)] /Names [(idp63666768) 181 0 R] >> endobj 4827 0 obj << /Limits [(idp63682128) (idp63682128)] /Names [(idp63682128) 184 0 R] >> endobj 4828 0 obj << /Limits [(idp63734480) (idp63734480)] /Names [(idp63734480) 187 0 R] >> endobj 4829 0 obj << /Limits [(idp63754192) (idp63754192)] /Names [(idp63754192) 190 0 R] >> endobj 4830 0 obj << /Limits [(idp63806800) (idp63806800)] /Names [(idp63806800) 193 0 R] >> endobj 4831 0 obj << /Limits [(idp63809488) (idp63809488)] /Names [(idp63809488) 196 0 R] >> endobj 4832 0 obj << /Limits [(idp63830480) (idp63830480)] /Names [(idp63830480) 199 0 R] >> endobj 4833 0 obj << /Limits [(idp63856208) (idp63856208)] /Names [(idp63856208) 202 0 R] >> endobj 4834 0 obj << /Limits [(idp64085328) (idp64085328)] /Names [(idp64085328) 213 0 R] >> endobj 4835 0 obj << /Limits [(idp64108496) (idp64108496)] /Names [(idp64108496) 216 0 R] >> endobj 4836 0 obj << /Limits [(idp64138320) (idp64138320)] /Names [(idp64138320) 219 0 R] >> endobj 4837 0 obj << /Limits [(idp64238032) (idp64238032)] /Names [(idp64238032) 222 0 R] >> endobj 4838 0 obj << /Limits [(idp64338256) (idp64338256)] /Names [(idp64338256) 225 0 R] >> endobj 4839 0 obj << /Limits [(idp64429008) (idp64429008)] /Names [(idp64429008) 877 0 R] >> endobj 4840 0 obj << /Limits [(idp64495824) (idp64495824)] /Names [(idp64495824) 880 0 R] >> endobj 4841 0 obj << /Limits [(idp64542416) (idp64542416)] /Names [(idp64542416) 883 0 R] >> endobj 4842 0 obj << /Limits [(idp64574288) (idp64574288)] /Names [(idp64574288) 886 0 R] >> endobj 4843 0 obj << /Limits [(idp67609040) (idp67609040)] /Names [(idp67609040) 4259 0 R] >> endobj 4844 0 obj << /Limits [(idp67630160) (idp67630160)] /Names [(idp67630160) 4261 0 R] >> endobj 4845 0 obj << /Limits [(idp67636176) (idp67636176)] /Names [(idp67636176) 4262 0 R] >> endobj 4846 0 obj << /Limits [(idp67644880) (idp67644880)] /Names [(idp67644880) 743 0 R] >> endobj 4847 0 obj << /Limits [(idp67661264) (idp67661264)] /Names [(idp67661264) 749 0 R] >> endobj 4848 0 obj << /Limits [(idp67665232) (idp67665232)] /Names [(idp67665232) 752 0 R] >> endobj 4849 0 obj << /Limits [(idp68064720) (idp68064720)] /Names [(idp68064720) 4260 0 R] >> endobj 4850 0 obj << /Limits [(idp68071760) (idp68071760)] /Names [(idp68071760) 706 0 R] >> endobj 4851 0 obj << /Limits [(idp68076624) (idp68076624)] /Names [(idp68076624) 709 0 R] >> endobj 4852 0 obj << /Limits [(idp68153680) (idp68153680)] /Names [(idp68153680) 898 0 R] >> endobj 4853 0 obj << /Limits [(idp68173776) (idp68173776)] /Names [(idp68173776) 901 0 R] >> endobj 4854 0 obj << /Limits [(idp68175824) (idp68175824)] /Names [(idp68175824) 904 0 R] >> endobj 4855 0 obj << /Limits [(idp68229328) (idp68229328)] /Names [(idp68229328) 712 0 R] >> endobj 4856 0 obj << /Limits [(idp68231504) (idp68231504)] /Names [(idp68231504) 715 0 R] >> endobj 4857 0 obj << /Limits [(idp68257360) (idp68257360)] /Names [(idp68257360) 721 0 R] >> endobj 4858 0 obj << /Limits [(idp68258384) (idp68258384)] /Names [(idp68258384) 724 0 R] >> endobj 4859 0 obj << /Limits [(idp68262864) (idp68262864)] /Names [(idp68262864) 727 0 R] >> endobj 4860 0 obj << /Limits [(idp68318800) (idp68318800)] /Names [(idp68318800) 495 0 R] >> endobj 4861 0 obj << /Limits [(idp68329808) (idp68329808)] /Names [(idp68329808) 498 0 R] >> endobj 4862 0 obj << /Limits [(idp68332624) (idp68332624)] /Names [(idp68332624) 501 0 R] >> endobj 4863 0 obj << /Limits [(idp68336208) (idp68336208)] /Names [(idp68336208) 504 0 R] >> endobj 4864 0 obj << /Limits [(idp68338128) (idp68338128)] /Names [(idp68338128) 507 0 R] >> endobj 4865 0 obj << /Limits [(idp68340176) (idp68340176)] /Names [(idp68340176) 510 0 R] >> endobj 4866 0 obj << /Limits [(idp68340816) (idp68340816)] /Names [(idp68340816) 513 0 R] >> endobj 4867 0 obj << /Limits [(idp68349392) (idp68349392)] /Names [(idp68349392) 516 0 R] >> endobj 4868 0 obj << /Limits [(idp68354768) (idp68354768)] /Names [(idp68354768) 4226 0 R] >> endobj 4869 0 obj << /Limits [(idp68384464) (idp68384464)] /Names [(idp68384464) 4227 0 R] >> endobj 4870 0 obj << /Limits [(idp68391632) (idp68391632)] /Names [(idp68391632) 4228 0 R] >> endobj 4871 0 obj << /Limits [(idp68408272) (idp68408272)] /Names [(idp68408272) 4229 0 R] >> endobj 4872 0 obj << /Limits [(idp68412112) (idp68412112)] /Names [(idp68412112) 4230 0 R] >> endobj 4873 0 obj << /Limits [(idp68422352) (idp68422352)] /Names [(idp68422352) 4231 0 R] >> endobj 4874 0 obj << /Limits [(idp68428752) (idp68428752)] /Names [(idp68428752) 521 0 R] >> endobj 4875 0 obj << /Limits [(idp68441040) (idp68441040)] /Names [(idp68441040) 524 0 R] >> endobj 4876 0 obj << /Limits [(idp68466640) (idp68466640)] /Names [(idp68466640) 4232 0 R] >> endobj 4877 0 obj << /Limits [(idp68512592) (idp68512592)] /Names [(idp68512592) 732 0 R] >> endobj 4878 0 obj << /Limits [(idp68525008) (idp68525008)] /Names [(idp68525008) 735 0 R] >> endobj 4879 0 obj << /Limits [(idp68527824) (idp68527824)] /Names [(idp68527824) 738 0 R] >> endobj 4880 0 obj << /Limits [(idp68553040) (idp68553040)] /Names [(idp68553040) 1105 0 R] >> endobj 4881 0 obj << /Limits [(idp68566352) (idp68566352)] /Names [(idp68566352) 1108 0 R] >> endobj 4882 0 obj << /Limits [(idp68617552) (idp68617552)] /Names [(idp68617552) 942 0 R] >> endobj 4883 0 obj << /Limits [(idp68634448) (idp68634448)] /Names [(idp68634448) 945 0 R] >> endobj 4884 0 obj << /Limits [(idp68645712) (idp68645712)] /Names [(idp68645712) 948 0 R] >> endobj 4885 0 obj << /Limits [(idp68749904) (idp68749904)] /Names [(idp68749904) 4233 0 R] >> endobj 4886 0 obj << /Limits [(idp68804176) (idp68804176)] /Names [(idp68804176) 4234 0 R] >> endobj 4887 0 obj << /Limits [(idp68805200) (idp68805200)] /Names [(idp68805200) 4235 0 R] >> endobj 4888 0 obj << /Limits [(idp68824016) (idp68824016)] /Names [(idp68824016) 4236 0 R] >> endobj 4889 0 obj << /Limits [(idp68835152) (idp68835152)] /Names [(idp68835152) 532 0 R] >> endobj 4890 0 obj << /Limits [(idp68836176) (idp68836176)] /Names [(idp68836176) 4237 0 R] >> endobj 4891 0 obj << /Limits [(idp68837712) (idp68837712)] /Names [(idp68837712) 4238 0 R] >> endobj 4892 0 obj << /Limits [(idp68842704) (idp68842704)] /Names [(idp68842704) 4239 0 R] >> endobj 4893 0 obj << /Limits [(idp68847696) (idp68847696)] /Names [(idp68847696) 4240 0 R] >> endobj 4894 0 obj << /Limits [(idp68860368) (idp68860368)] /Names [(idp68860368) 4241 0 R] >> endobj 4895 0 obj << /Limits [(idp68861520) (idp68861520)] /Names [(idp68861520) 4242 0 R] >> endobj 4896 0 obj << /Limits [(idp68865872) (idp68865872)] /Names [(idp68865872) 538 0 R] >> endobj 4897 0 obj << /Limits [(idp68867408) (idp68867408)] /Names [(idp68867408) 4243 0 R] >> endobj 4898 0 obj << /Limits [(idp68875600) (idp68875600)] /Names [(idp68875600) 4244 0 R] >> endobj 4899 0 obj << /Limits [(idp68880592) (idp68880592)] /Names [(idp68880592) 541 0 R] >> endobj 4900 0 obj << /Limits [(idp68980816) (idp68980816)] /Names [(idp68980816) 546 0 R] >> endobj 4901 0 obj << /Limits [(idp68981968) (idp68981968)] /Names [(idp68981968) 549 0 R] >> endobj 4902 0 obj << /Limits [(idp68984912) (idp68984912)] /Names [(idp68984912) 555 0 R] >> endobj 4903 0 obj << /Limits [(idp68997200) (idp68997200)] /Names [(idp68997200) 4245 0 R] >> endobj 4904 0 obj << /Limits [(idp69001808) (idp69001808)] /Names [(idp69001808) 4246 0 R] >> endobj 4905 0 obj << /Limits [(idp69007056) (idp69007056)] /Names [(idp69007056) 4247 0 R] >> endobj 4906 0 obj << /Limits [(idp69010512) (idp69010512)] /Names [(idp69010512) 4248 0 R] >> endobj 4907 0 obj << /Limits [(idp69012560) (idp69012560)] /Names [(idp69012560) 4249 0 R] >> endobj 4908 0 obj << /Limits [(idp69014224) (idp69014224)] /Names [(idp69014224) 4250 0 R] >> endobj 4909 0 obj << /Limits [(idp69015760) (idp69015760)] /Names [(idp69015760) 4251 0 R] >> endobj 4910 0 obj << /Limits [(idp69035344) (idp69035344)] /Names [(idp69035344) 4252 0 R] >> endobj 4911 0 obj << /Limits [(idp69063248) (idp69063248)] /Names [(idp69063248) 4253 0 R] >> endobj 4912 0 obj << /Limits [(idp69085392) (idp69085392)] /Names [(idp69085392) 4254 0 R] >> endobj 4913 0 obj << /Limits [(idp69090128) (idp69090128)] /Names [(idp69090128) 560 0 R] >> endobj 4914 0 obj << /Limits [(idp69341136) (idp69341136)] /Names [(idp69341136) 907 0 R] >> endobj 4915 0 obj << /Limits [(idp69344336) (idp69344336)] /Names [(idp69344336) 910 0 R] >> endobj 4916 0 obj << /Limits [(idp69371472) (idp69371472)] /Names [(idp69371472) 913 0 R] >> endobj 4917 0 obj << /Limits [(idp69455056) (idp69455056)] /Names [(idp69455056) 922 0 R] >> endobj 4918 0 obj << /Limits [(idp69456080) (idp69456080)] /Names [(idp69456080) 925 0 R] >> endobj 4919 0 obj << /Limits [(idp69460944) (idp69460944)] /Names [(idp69460944) 928 0 R] >> endobj 4920 0 obj << /Limits [(idp69466448) (idp69466448)] /Names [(idp69466448) 4263 0 R] >> endobj 4921 0 obj << /Limits [(idp69468624) (idp69468624)] /Names [(idp69468624) 4264 0 R] >> endobj 4922 0 obj << /Limits [(idp69483984) (idp69483984)] /Names [(idp69483984) 1111 0 R] >> endobj 4923 0 obj << /Limits [(idp69488976) (idp69488976)] /Names [(idp69488976) 951 0 R] >> endobj 4924 0 obj << /Limits [(idp69496144) (idp69496144)] /Names [(idp69496144) 954 0 R] >> endobj 4925 0 obj << /Limits [(idp69499472) (idp69499472)] /Names [(idp69499472) 957 0 R] >> endobj 4926 0 obj << /Limits [(idp69515472) (idp69515472)] /Names [(idp69515472) 960 0 R] >> endobj 4927 0 obj << /Limits [(idp69518160) (idp69518160)] /Names [(idp69518160) 963 0 R] >> endobj 4928 0 obj << /Limits [(idp69524560) (idp69524560)] /Names [(idp69524560) 1055 0 R] >> endobj 4929 0 obj << /Limits [(idp69535184) (idp69535184)] /Names [(idp69535184) 1058 0 R] >> endobj 4930 0 obj << /Limits [(idp69538000) (idp69538000)] /Names [(idp69538000) 1064 0 R] >> endobj 4931 0 obj << /Limits [(idp69547216) (idp69547216)] /Names [(idp69547216) 1067 0 R] >> endobj 4932 0 obj << /Limits [(idp69556176) (idp69556176)] /Names [(idp69556176) 1070 0 R] >> endobj 4933 0 obj << /Limits [(idp69578704) (idp69578704)] /Names [(idp69578704) 1075 0 R] >> endobj 4934 0 obj << /Limits [(idp69579728) (idp69579728)] /Names [(idp69579728) 1078 0 R] >> endobj 4935 0 obj << /Limits [(idp69587664) (idp69587664)] /Names [(idp69587664) 1081 0 R] >> endobj 4936 0 obj << /Limits [(idp69628368) (idp69628368)] /Names [(idp69628368) 1123 0 R] >> endobj 4937 0 obj << /Limits [(idp69976656) (idp69976656)] /Names [(idp69976656) 3164 0 R] >> endobj 4938 0 obj << /Limits [(idp69978448) (idp69978448)] /Names [(idp69978448) 3150 0 R] >> endobj 4939 0 obj << /Limits [(idp70103248) (idp70103248)] /Names [(idp70103248) 3167 0 R] >> endobj 4940 0 obj << /Limits [(idp70233296) (idp70233296)] /Names [(idp70233296) 3387 0 R] >> endobj 4941 0 obj << /Limits [(idp70465360) (idp70465360)] /Names [(idp70465360) 3390 0 R] >> endobj 4942 0 obj << /Limits [(idp70800848) (idp70800848)] /Names [(idp70800848) 3346 0 R] >> endobj 4943 0 obj << /Limits [(idp70854864) (idp70854864)] /Names [(idp70854864) 3349 0 R] >> endobj 4944 0 obj << /Limits [(idp70855888) (idp70855888)] /Names [(idp70855888) 3352 0 R] >> endobj 4945 0 obj << /Limits [(idp70870352) (idp70870352)] /Names [(idp70870352) 3355 0 R] >> endobj 4946 0 obj << /Limits [(idp70873424) (idp70873424)] /Names [(idp70873424) 2197 0 R] >> endobj 4947 0 obj << /Limits [(idp71162320) (idp71162320)] /Names [(idp71162320) 3358 0 R] >> endobj 4948 0 obj << /Limits [(idp71163344) (idp71163344)] /Names [(idp71163344) 3361 0 R] >> endobj 4949 0 obj << /Limits [(idp71290064) (idp71290064)] /Names [(idp71290064) 3396 0 R] >> endobj 4950 0 obj << /Limits [(idp71367376) (idp71367376)] /Names [(idp71367376) 3366 0 R] >> endobj 4951 0 obj << /Limits [(idp71373904) (idp71373904)] /Names [(idp71373904) 3369 0 R] >> endobj 4952 0 obj << /Limits [(idp71392848) (idp71392848)] /Names [(idp71392848) 3399 0 R] >> endobj 4953 0 obj << /Limits [(idp71398736) (idp71398736)] /Names [(idp71398736) 3402 0 R] >> endobj 4954 0 obj << /Limits [(idp71924176) (idp71924176)] /Names [(idp71924176) 3405 0 R] >> endobj 4955 0 obj << /Limits [(idp73588688) (idp73588688)] /Names [(idp73588688) 3423 0 R] >> endobj 4956 0 obj << /Limits [(idp73590224) (idp73590224)] /Names [(idp73590224) 4335 0 R] >> endobj 4957 0 obj << /Limits [(idp73665488) (idp73665488)] /Names [(idp73665488) 3426 0 R] >> endobj 4958 0 obj << /Limits [(idp73666512) (idp73666512)] /Names [(idp73666512) 3429 0 R] >> endobj 4959 0 obj << /Limits [(idp73687504) (idp73687504)] /Names [(idp73687504) 3432 0 R] >> endobj 4960 0 obj << /Limits [(idp73688528) (idp73688528)] /Names [(idp73688528) 4336 0 R] >> endobj 4961 0 obj << /Limits [(idp75429840) (idp75429840)] /Names [(idp75429840) 2203 0 R] >> endobj 4962 0 obj << /Limits [(idp75449936) (idp75449936)] /Names [(idp75449936) 2817 0 R] >> endobj 4963 0 obj << /Limits [(idp75451600) (idp75451600)] /Names [(idp75451600) 2820 0 R] >> endobj 4964 0 obj << /Limits [(idp75452752) (idp75452752)] /Names [(idp75452752) 2823 0 R] >> endobj 4965 0 obj << /Limits [(idp75454800) (idp75454800)] /Names [(idp75454800) 2826 0 R] >> endobj 4966 0 obj << /Limits [(idp75456848) (idp75456848)] /Names [(idp75456848) 2829 0 R] >> endobj 4967 0 obj << /Limits [(idp75460048) (idp75460048)] /Names [(idp75460048) 2832 0 R] >> endobj 4968 0 obj << /Limits [(idp75462352) (idp75462352)] /Names [(idp75462352) 2835 0 R] >> endobj 4969 0 obj << /Limits [(idp75463888) (idp75463888)] /Names [(idp75463888) 2838 0 R] >> endobj 4970 0 obj << /Limits [(idp75465424) (idp75465424)] /Names [(idp75465424) 2841 0 R] >> endobj 4971 0 obj << /Limits [(idp75467472) (idp75467472)] /Names [(idp75467472) 2844 0 R] >> endobj 4972 0 obj << /Limits [(idp75471440) (idp75471440)] /Names [(idp75471440) 2850 0 R] >> endobj 4973 0 obj << /Limits [(idp75473360) (idp75473360)] /Names [(idp75473360) 2853 0 R] >> endobj 4974 0 obj << /Limits [(idp75483344) (idp75483344)] /Names [(idp75483344) 2856 0 R] >> endobj 4975 0 obj << /Limits [(idp75485136) (idp75485136)] /Names [(idp75485136) 2859 0 R] >> endobj 4976 0 obj << /Limits [(idp76482256) (idp76482256)] /Names [(idp76482256) 3411 0 R] >> endobj 4977 0 obj << /Limits [(idp76483408) (idp76483408)] /Names [(idp76483408) 3414 0 R] >> endobj 4978 0 obj << /Limits [(idp76484816) (idp76484816)] /Names [(idp76484816) 3417 0 R] >> endobj 4979 0 obj << /Limits [(idp76741456) (idp76741456)] /Names [(idp76741456) 4337 0 R] >> endobj 4980 0 obj << /Limits [(idp76800720) (idp76800720)] /Names [(idp76800720) 4338 0 R] >> endobj 4981 0 obj << /Limits [(idp77005904) (idp77005904)] /Names [(idp77005904) 3420 0 R] >> endobj 4982 0 obj << /Limits [(idp77006928) (idp77006928)] /Names [(idp77006928) 4333 0 R] >> endobj 4983 0 obj << /Limits [(idp77030096) (idp77030096)] /Names [(idp77030096) 4334 0 R] >> endobj 4984 0 obj << /Limits [(idp77085648) (idp77085648)] /Names [(idp77085648) 4339 0 R] >> endobj 4985 0 obj << /Limits [(idp77147984) (idp77147984)] /Names [(idp77147984) 4340 0 R] >> endobj 4986 0 obj << /Limits [(idp77178064) (idp77178064)] /Names [(idp77178064) 4341 0 R] >> endobj 4987 0 obj << /Limits [(idp77208912) (idp77208912)] /Names [(idp77208912) 4342 0 R] >> endobj 4988 0 obj << /Limits [(idp77232848) (idp77232848)] /Names [(idp77232848) 4343 0 R] >> endobj 4989 0 obj << /Limits [(idp77259216) (idp77259216)] /Names [(idp77259216) 4344 0 R] >> endobj 4990 0 obj << /Limits [(idp77281616) (idp77281616)] /Names [(idp77281616) 4345 0 R] >> endobj 4991 0 obj << /Limits [(idp77321424) (idp77321424)] /Names [(idp77321424) 4346 0 R] >> endobj 4992 0 obj << /Limits [(idp77356624) (idp77356624)] /Names [(idp77356624) 4347 0 R] >> endobj 4993 0 obj << /Limits [(idp77379536) (idp77379536)] /Names [(idp77379536) 4348 0 R] >> endobj 4994 0 obj << /Limits [(idp77406032) (idp77406032)] /Names [(idp77406032) 4349 0 R] >> endobj 4995 0 obj << /Limits [(idp77484368) (idp77484368)] /Names [(idp77484368) 4350 0 R] >> endobj 4996 0 obj << /Limits [(idp77528400) (idp77528400)] /Names [(idp77528400) 4351 0 R] >> endobj 4997 0 obj << /Limits [(idp77579088) (idp77579088)] /Names [(idp77579088) 4352 0 R] >> endobj 4998 0 obj << /Limits [(idp77641168) (idp77641168)] /Names [(idp77641168) 4353 0 R] >> endobj 4999 0 obj << /Limits [(idp77662288) (idp77662288)] /Names [(idp77662288) 4354 0 R] >> endobj 5000 0 obj << /Limits [(idp77709648) (idp77709648)] /Names [(idp77709648) 4355 0 R] >> endobj 5001 0 obj << /Limits [(idp77733584) (idp77733584)] /Names [(idp77733584) 4356 0 R] >> endobj 5002 0 obj << /Limits [(idp77755984) (idp77755984)] /Names [(idp77755984) 4357 0 R] >> endobj 5003 0 obj << /Limits [(idp77787088) (idp77787088)] /Names [(idp77787088) 4358 0 R] >> endobj 5004 0 obj << /Limits [(idp77810000) (idp77810000)] /Names [(idp77810000) 4359 0 R] >> endobj 5005 0 obj << /Limits [(idp77861840) (idp77861840)] /Names [(idp77861840) 4360 0 R] >> endobj 5006 0 obj << /Limits [(idp77888848) (idp77888848)] /Names [(idp77888848) 4361 0 R] >> endobj 5007 0 obj << /Limits [(idp77912784) (idp77912784)] /Names [(idp77912784) 4362 0 R] >> endobj 5008 0 obj << /Limits [(idp77935568) (idp77935568)] /Names [(idp77935568) 4363 0 R] >> endobj 5009 0 obj << /Limits [(idp78295504) (idp78295504)] /Names [(idp78295504) 4082 0 R] >> endobj 5010 0 obj << /Limits [(part-administrator-manual) (part-administrator-manual)] /Names [(part-administrator-manual) 489 0 R] >> endobj 5011 0 obj << /Limits [(part-overview) (part-overview)] /Names [(part-overview) 444 0 R] >> endobj 5012 0 obj << /Limits [(part-programmer-manual) (part-programmer-manual)] /Names [(part-programmer-manual) 2920 0 R] >> endobj 5013 0 obj << /Limits [(part-reference-manual) (part-reference-manual)] /Names [(part-reference-manual) 2165 0 R] >> endobj 5014 0 obj << /Limits [(part-user-manual) (part-user-manual)] /Names [(part-user-manual) 871 0 R] >> endobj 5015 0 obj << /Limits [(refdbclient-client-get-data) (refdbclient-client-get-data)] /Names [(refdbclient-client-get-data) 4288 0 R] >> endobj 5016 0 obj << /Limits [(refdbclient-client-get-status) (refdbclient-client-get-status)] /Names [(refdbclient-client-get-status) 4286 0 R] >> endobj 5017 0 obj << /Limits [(refdbclient-client-get-status-msg) (refdbclient-client-get-status-msg)] /Names [(refdbclient-client-get-status-msg) 4287 0 R] >> endobj 5018 0 obj << /Limits [(refdbclient-client-get-summary) (refdbclient-client-get-summary)] /Names [(refdbclient-client-get-summary) 4289 0 R] >> endobj 5019 0 obj << /Limits [(refdbclient-client-new) (refdbclient-client-new)] /Names [(refdbclient-client-new) 4284 0 R] >> endobj 5020 0 obj << /Limits [(refdbclient-client-refdb-addlink) (refdbclient-client-refdb-addlink)] /Names [(refdbclient-client-refdb-addlink) 4313 0 R] >> endobj 5021 0 obj << /Limits [(refdbclient-client-refdb-addnote) (refdbclient-client-refdb-addnote)] /Names [(refdbclient-client-refdb-addnote) 4310 0 R] >> endobj 5022 0 obj << /Limits [(refdbclient-client-refdb-addref) (refdbclient-client-refdb-addref)] /Names [(refdbclient-client-refdb-addref) 4306 0 R] >> endobj 5023 0 obj << /Limits [(refdbclient-client-refdb-addstyle) (refdbclient-client-refdb-addstyle)] /Names [(refdbclient-client-refdb-addstyle) 4290 0 R] >> endobj 5024 0 obj << /Limits [(refdbclient-client-refdb-adduser) (refdbclient-client-refdb-adduser)] /Names [(refdbclient-client-refdb-adduser) 4291 0 R] >> endobj 5025 0 obj << /Limits [(refdbclient-client-refdb-addword) (refdbclient-client-refdb-addword)] /Names [(refdbclient-client-refdb-addword) 4293 0 R] >> endobj 5026 0 obj << /Limits [(refdbclient-client-refdb-checkref) (refdbclient-client-refdb-checkref)] /Names [(refdbclient-client-refdb-checkref) 4307 0 R] >> endobj 5027 0 obj << /Limits [(refdbclient-client-refdb-confserv) (refdbclient-client-refdb-confserv)] /Names [(refdbclient-client-refdb-confserv) 4295 0 R] >> endobj 5028 0 obj << /Limits [(refdbclient-client-refdb-countnote) (refdbclient-client-refdb-countnote)] /Names [(refdbclient-client-refdb-countnote) 4328 0 R] >> endobj 5029 0 obj << /Limits [(refdbclient-client-refdb-countref) (refdbclient-client-refdb-countref)] /Names [(refdbclient-client-refdb-countref) 4324 0 R] >> endobj 5030 0 obj << /Limits [(refdbclient-client-refdb-createdb) (refdbclient-client-refdb-createdb)] /Names [(refdbclient-client-refdb-createdb) 4296 0 R] >> endobj 5031 0 obj << /Limits [(refdbclient-client-refdb-dbib) (refdbclient-client-refdb-dbib)] /Names [(refdbclient-client-refdb-dbib) 4332 0 R] >> endobj 5032 0 obj << /Limits [(refdbclient-client-refdb-deletedb) (refdbclient-client-refdb-deletedb)] /Names [(refdbclient-client-refdb-deletedb) 4297 0 R] >> endobj 5033 0 obj << /Limits [(refdbclient-client-refdb-deletelink) (refdbclient-client-refdb-deletelink)] /Names [(refdbclient-client-refdb-deletelink) 4314 0 R] >> endobj 5034 0 obj << /Limits [(refdbclient-client-refdb-deletenote) (refdbclient-client-refdb-deletenote)] /Names [(refdbclient-client-refdb-deletenote) 4312 0 R] >> endobj 5035 0 obj << /Limits [(refdbclient-client-refdb-deleteref) (refdbclient-client-refdb-deleteref)] /Names [(refdbclient-client-refdb-deleteref) 4309 0 R] >> endobj 5036 0 obj << /Limits [(refdbclient-client-refdb-deletestyle) (refdbclient-client-refdb-deletestyle)] /Names [(refdbclient-client-refdb-deletestyle) 4298 0 R] >> endobj 5037 0 obj << /Limits [(refdbclient-client-refdb-deleteuser) (refdbclient-client-refdb-deleteuser)] /Names [(refdbclient-client-refdb-deleteuser) 4292 0 R] >> endobj 5038 0 obj << /Limits [(refdbclient-client-refdb-deleteword) (refdbclient-client-refdb-deleteword)] /Names [(refdbclient-client-refdb-deleteword) 4294 0 R] >> endobj 5039 0 obj << /Limits [(refdbclient-client-refdb-dumpref) (refdbclient-client-refdb-dumpref)] /Names [(refdbclient-client-refdb-dumpref) 4326 0 R] >> endobj 5040 0 obj << /Limits [(refdbclient-client-refdb-getas) (refdbclient-client-refdb-getas)] /Names [(refdbclient-client-refdb-getas) 4315 0 R] >> endobj 5041 0 obj << /Limits [(refdbclient-client-refdb-getau) (refdbclient-client-refdb-getau)] /Names [(refdbclient-client-refdb-getau) 4316 0 R] >> endobj 5042 0 obj << /Limits [(refdbclient-client-refdb-geted) (refdbclient-client-refdb-geted)] /Names [(refdbclient-client-refdb-geted) 4317 0 R] >> endobj 5043 0 obj << /Limits [(refdbclient-client-refdb-getj1) (refdbclient-client-refdb-getj1)] /Names [(refdbclient-client-refdb-getj1) 4321 0 R] >> endobj 5044 0 obj << /Limits [(refdbclient-client-refdb-getj2) (refdbclient-client-refdb-getj2)] /Names [(refdbclient-client-refdb-getj2) 4322 0 R] >> endobj 5045 0 obj << /Limits [(refdbclient-client-refdb-getjf) (refdbclient-client-refdb-getjf)] /Names [(refdbclient-client-refdb-getjf) 4319 0 R] >> endobj 5046 0 obj << /Limits [(refdbclient-client-refdb-getjo) (refdbclient-client-refdb-getjo)] /Names [(refdbclient-client-refdb-getjo) 4320 0 R] >> endobj 5047 0 obj << /Limits [(refdbclient-client-refdb-getkw) (refdbclient-client-refdb-getkw)] /Names [(refdbclient-client-refdb-getkw) 4318 0 R] >> endobj 5048 0 obj << /Limits [(refdbclient-client-refdb-getnote) (refdbclient-client-refdb-getnote)] /Names [(refdbclient-client-refdb-getnote) 4327 0 R] >> endobj 5049 0 obj << /Limits [(refdbclient-client-refdb-getref) (refdbclient-client-refdb-getref)] /Names [(refdbclient-client-refdb-getref) 4323 0 R] >> endobj 5050 0 obj << /Limits [(refdbclient-client-refdb-getstyle) (refdbclient-client-refdb-getstyle)] /Names [(refdbclient-client-refdb-getstyle) 4299 0 R] >> endobj 5051 0 obj << /Limits [(refdbclient-client-refdb-listdb) (refdbclient-client-refdb-listdb)] /Names [(refdbclient-client-refdb-listdb) 4300 0 R] >> endobj 5052 0 obj << /Limits [(refdbclient-client-refdb-liststyle) (refdbclient-client-refdb-liststyle)] /Names [(refdbclient-client-refdb-liststyle) 4303 0 R] >> endobj 5053 0 obj << /Limits [(refdbclient-client-refdb-listuser) (refdbclient-client-refdb-listuser)] /Names [(refdbclient-client-refdb-listuser) 4301 0 R] >> endobj 5054 0 obj << /Limits [(refdbclient-client-refdb-listword) (refdbclient-client-refdb-listword)] /Names [(refdbclient-client-refdb-listword) 4302 0 R] >> endobj 5055 0 obj << /Limits [(refdbclient-client-refdb-pickref) (refdbclient-client-refdb-pickref)] /Names [(refdbclient-client-refdb-pickref) 4325 0 R] >> endobj 5056 0 obj << /Limits [(refdbclient-client-refdb-scankw) (refdbclient-client-refdb-scankw)] /Names [(refdbclient-client-refdb-scankw) 4305 0 R] >> endobj 5057 0 obj << /Limits [(refdbclient-client-refdb-selectdb) (refdbclient-client-refdb-selectdb)] /Names [(refdbclient-client-refdb-selectdb) 4329 0 R] >> endobj 5058 0 obj << /Limits [(refdbclient-client-refdb-texbib) (refdbclient-client-refdb-texbib)] /Names [(refdbclient-client-refdb-texbib) 4331 0 R] >> endobj 5059 0 obj << /Limits [(refdbclient-client-refdb-updatenote) (refdbclient-client-refdb-updatenote)] /Names [(refdbclient-client-refdb-updatenote) 4311 0 R] >> endobj 5060 0 obj << /Limits [(refdbclient-client-refdb-updateref) (refdbclient-client-refdb-updateref)] /Names [(refdbclient-client-refdb-updateref) 4308 0 R] >> endobj 5061 0 obj << /Limits [(refdbclient-client-refdb-viewstat) (refdbclient-client-refdb-viewstat)] /Names [(refdbclient-client-refdb-viewstat) 4304 0 R] >> endobj 5062 0 obj << /Limits [(refdbclient-client-refdb-whichdb) (refdbclient-client-refdb-whichdb)] /Names [(refdbclient-client-refdb-whichdb) 4330 0 R] >> endobj 5063 0 obj << /Limits [(refdbclient-client-set-conninfo) (refdbclient-client-set-conninfo)] /Names [(refdbclient-client-set-conninfo) 4285 0 R] >> endobj 5064 0 obj << /Limits [(refdbclient-enigma-new) (refdbclient-enigma-new)] /Names [(refdbclient-enigma-new) 4283 0 R] >> endobj 5065 0 obj << /Limits [(refdbclient-risdata-get-ris) (refdbclient-risdata-get-ris)] /Names [(refdbclient-risdata-get-ris) 4281 0 R] >> endobj 5066 0 obj << /Limits [(refdbclient-risdata-new) (refdbclient-risdata-new)] /Names [(refdbclient-risdata-new) 4279 0 R] >> endobj 5067 0 obj << /Limits [(refdbclient-risdata-read-ris) (refdbclient-risdata-read-ris)] /Names [(refdbclient-risdata-read-ris) 4280 0 R] >> endobj 5068 0 obj << /Limits [(refdbclient-simplelist-new) (refdbclient-simplelist-new)] /Names [(refdbclient-simplelist-new) 4282 0 R] >> endobj 5069 0 obj << /Limits [(refentry-bib2ris) (refentry-bib2ris)] /Names [(refentry-bib2ris) 1935 0 R] >> endobj 5070 0 obj << /Limits [(refentry-db2ris) (refentry-db2ris)] /Names [(refentry-db2ris) 1950 0 R] >> endobj 5071 0 obj << /Limits [(refentry-dos2unix) (refentry-dos2unix)] /Names [(refentry-dos2unix) 2036 0 R] >> endobj 5072 0 obj << /Limits [(refentry-eenc) (refentry-eenc)] /Names [(refentry-eenc) 4148 0 R] >> endobj 5073 0 obj << /Limits [(refentry-en2ris) (refentry-en2ris)] /Names [(refentry-en2ris) 1938 0 R] >> endobj 5074 0 obj << /Limits [(refentry-latex2utf8txt) (refentry-latex2utf8txt)] /Names [(refentry-latex2utf8txt) 2063 0 R] >> endobj 5075 0 obj << /Limits [(refentry-marc2ris) (refentry-marc2ris)] /Names [(refentry-marc2ris) 1940 0 R] >> endobj 5076 0 obj << /Limits [(refentry-med2ris) (refentry-med2ris)] /Names [(refentry-med2ris) 1930 0 R] >> endobj 5077 0 obj << /Limits [(refentry-refdb-bug) (refentry-refdb-bug)] /Names [(refentry-refdb-bug) 2191 0 R] >> endobj 5078 0 obj << /Limits [(refentry-refdb-init) (refentry-refdb-init)] /Names [(refentry-refdb-init) 1546 0 R] >> endobj 5079 0 obj << /Limits [(refentry-refdb-pubmed) (refentry-refdb-pubmed)] /Names [(refentry-refdb-pubmed) 4209 0 R] >> endobj 5080 0 obj << /Limits [(refentry-refdb-sruserver) (refentry-refdb-sruserver)] /Names [(refentry-refdb-sruserver) 1402 0 R] >> endobj 5081 0 obj << /Limits [(refentry-refdb8) (refentry-refdb8)] /Names [(refentry-refdb8) 1628 0 R] >> endobj 5082 0 obj << /Limits [(refentry-refdba) (refentry-refdba)] /Names [(refentry-refdba) 1530 0 R] >> endobj 5083 0 obj << /Limits [(refentry-refdbbackup) (refentry-refdbbackup)] /Names [(refentry-refdbbackup) 1642 0 R] >> endobj 5084 0 obj << /Limits [(refentry-refdbc) (refentry-refdbc)] /Names [(refentry-refdbc) 1632 0 R] >> endobj 5085 0 obj << /Limits [(refentry-refdbctl) (refentry-refdbctl)] /Names [(refentry-refdbctl) 1291 0 R] >> endobj 5086 0 obj << /Limits [(refentry-refdbd) (refentry-refdbd)] /Names [(refentry-refdbd) 1270 0 R] >> endobj 5087 0 obj << /Limits [(refentry-refdbib) (refentry-refdbib)] /Names [(refentry-refdbib) 2418 0 R] >> endobj 5088 0 obj << /Limits [(refentry-refdbjade) (refentry-refdbjade)] /Names [(refentry-refdbjade) 2668 0 R] >> endobj 5089 0 obj << /Limits [(refentry-refdbms) (refentry-refdbms)] /Names [(refentry-refdbms) 2896 0 R] >> endobj 5090 0 obj << /Limits [(refentry-refdbnd) (refentry-refdbnd)] /Names [(refentry-refdbnd) 2446 0 R] >> endobj 5091 0 obj << /Limits [(refentry-refdbrestore) (refentry-refdbrestore)] /Names [(refentry-refdbrestore) 1644 0 R] >> endobj 5092 0 obj << /Limits [(refentry-refdbrtf) (refentry-refdbrtf)] /Names [(refentry-refdbrtf) 2730 0 R] >> endobj 5093 0 obj << /Limits [(refentry-refdbsru) (refentry-refdbsru)] /Names [(refentry-refdbsru) 1319 0 R] >> endobj 5094 0 obj << /Limits [(refentry-refdbxml) (refentry-refdbxml)] /Names [(refentry-refdbxml) 2670 0 R] >> endobj 5095 0 obj << /Limits [(refentry-refdbxp) (refentry-refdbxp)] /Names [(refentry-refdbxp) 2741 0 R] >> endobj 5096 0 obj << /Limits [(refentry-rtfcitations) (refentry-rtfcitations)] /Names [(refentry-rtfcitations) 2899 0 R] >> endobj 5097 0 obj << /Limits [(refentry-runbib) (refentry-runbib)] /Names [(refentry-runbib) 2485 0 R] >> endobj 5098 0 obj << /Limits [(refentry-runbib-missing) (refentry-runbib-missing)] /Names [(refentry-runbib-missing) 2885 0 R] >> endobj 5099 0 obj << /Limits [(sect-add-extended-notes) (sect-add-extended-notes)] /Names [(sect-add-extended-notes) 1087 0 R] >> endobj 5100 0 obj << /Limits [(sect-add-ris-datasets) (sect-add-ris-datasets)] /Names [(sect-add-ris-datasets) 936 0 R] >> endobj 5101 0 obj << /Limits [(sect-add-risx-datasets) (sect-add-risx-datasets)] /Names [(sect-add-risx-datasets) 939 0 R] >> endobj 5102 0 obj << /Limits [(sect-biblio-quickstart) (sect-biblio-quickstart)] /Names [(sect-biblio-quickstart) 1117 0 R] >> endobj 5103 0 obj << /Limits [(sect-cite-rtf) (sect-cite-rtf)] /Names [(sect-cite-rtf) 1224 0 R] >> endobj 5104 0 obj << /Limits [(sect-client) (sect-client)] /Names [(sect-client) 3381 0 R] >> endobj 5105 0 obj << /Limits [(sect-configure-apache) (sect-configure-apache)] /Names [(sect-configure-apache) 4255 0 R] >> endobj 5106 0 obj << /Limits [(sect-create-latex-bib) (sect-create-latex-bib)] /Names [(sect-create-latex-bib) 1215 0 R] >> endobj 5107 0 obj << /Limits [(sect-create-rtf) (sect-create-rtf)] /Names [(sect-create-rtf) 1221 0 R] >> endobj 5108 0 obj << /Limits [(sect-create-rtf-bib) (sect-create-rtf-bib)] /Names [(sect-create-rtf-bib) 1218 0 R] >> endobj 5109 0 obj << /Limits [(sect-create-xml-bibliographies) (sect-create-xml-bibliographies)] /Names [(sect-create-xml-bibliographies) 1202 0 R] >> endobj 5110 0 obj << /Limits [(sect-database-server-access-control) (sect-database-server-access-control)] /Names [(sect-database-server-access-control) 600 0 R] >> endobj 5111 0 obj << /Limits [(sect-delete-extended-notes) (sect-delete-extended-notes)] /Names [(sect-delete-extended-notes) 1093 0 R] >> endobj 5112 0 obj << /Limits [(sect-description-notes-query-language) (sect-description-notes-query-language)] /Names [(sect-description-notes-query-language) 2292 0 R] >> endobj 5113 0 obj << /Limits [(sect-description-reference-query-language) (sect-description-reference-query-language)] /Names [(sect-description-reference-query-language) 2864 0 R] >> endobj 5114 0 obj << /Limits [(sect-edit-extended-notes) (sect-edit-extended-notes)] /Names [(sect-edit-extended-notes) 1096 0 R] >> endobj 5115 0 obj << /Limits [(sect-edit-refdbnd-project) (sect-edit-refdbnd-project)] /Names [(sect-edit-refdbnd-project) 2452 0 R] >> endobj 5116 0 obj << /Limits [(sect-enigma) (sect-enigma)] /Names [(sect-enigma) 3378 0 R] >> endobj 5117 0 obj << /Limits [(sect-full-notation) (sect-full-notation)] /Names [(sect-full-notation) 4267 0 R] >> endobj 5118 0 obj << /Limits [(sect-generate-xml-bibliography) (sect-generate-xml-bibliography)] /Names [(sect-generate-xml-bibliography) 4269 0 R] >> endobj 5119 0 obj << /Limits [(sect-getref-output-html) (sect-getref-output-html)] /Names [(sect-getref-output-html) 2206 0 R] >> endobj 5120 0 obj << /Limits [(sect-install-cgi-script) (sect-install-cgi-script)] /Names [(sect-install-cgi-script) 4256 0 R] >> endobj 5121 0 obj << /Limits [(sect-install-from-sources-unix) (sect-install-from-sources-unix)] /Names [(sect-install-from-sources-unix) 321 0 R] >> endobj 5122 0 obj << /Limits [(sect-install-php) (sect-install-php)] /Names [(sect-install-php) 679 0 R] >> endobj 5123 0 obj << /Limits [(sect-install-sru) (sect-install-sru)] /Names [(sect-install-sru) 563 0 R] >> endobj 5124 0 obj << /Limits [(sect-link-extended-notes) (sect-link-extended-notes)] /Names [(sect-link-extended-notes) 1099 0 R] >> endobj 5125 0 obj << /Limits [(sect-low-level-bibliographies) (sect-low-level-bibliographies)] /Names [(sect-low-level-bibliographies) 1209 0 R] >> endobj 5126 0 obj << /Limits [(sect-manage-bibstyles) (sect-manage-bibstyles)] /Names [(sect-manage-bibstyles) 1120 0 R] >> endobj 5127 0 obj << /Limits [(sect-notes-output-formats) (sect-notes-output-formats)] /Names [(sect-notes-output-formats) 2847 0 R] >> endobj 5128 0 obj << /Limits [(sect-output-formats) (sect-output-formats)] /Names [(sect-output-formats) 2200 0 R] >> endobj 5129 0 obj << /Limits [(sect-php-apacheconfig) (sect-php-apacheconfig)] /Names [(sect-php-apacheconfig) 685 0 R] >> endobj 5130 0 obj << /Limits [(sect-php-prerequisites) (sect-php-prerequisites)] /Names [(sect-php-prerequisites) 682 0 R] >> endobj 5131 0 obj << /Limits [(sect-php-test) (sect-php-test)] /Names [(sect-php-test) 688 0 R] >> endobj 5132 0 obj << /Limits [(sect-prepare-doc) (sect-prepare-doc)] /Names [(sect-prepare-doc) 1584 0 R] >> endobj 5133 0 obj << /Limits [(sect-process-rtf) (sect-process-rtf)] /Names [(sect-process-rtf) 1227 0 R] >> endobj 5134 0 obj << /Limits [(sect-raw-notation) (sect-raw-notation)] /Names [(sect-raw-notation) 4268 0 R] >> endobj 5135 0 obj << /Limits [(sect-refdbnd-shortcut) (sect-refdbnd-shortcut)] /Names [(sect-refdbnd-shortcut) 1206 0 R] >> endobj 5136 0 obj << /Limits [(sect-risdata) (sect-risdata)] /Names [(sect-risdata) 3372 0 R] >> endobj 5137 0 obj << /Limits [(sect-setup-refdbnd-project) (sect-setup-refdbnd-project)] /Names [(sect-setup-refdbnd-project) 4265 0 R] >> endobj 5138 0 obj << /Limits [(sect-share-extended-notes) (sect-share-extended-notes)] /Names [(sect-share-extended-notes) 1102 0 R] >> endobj 5139 0 obj << /Limits [(sect-short-notation) (sect-short-notation)] /Names [(sect-short-notation) 1586 0 R] >> endobj 5140 0 obj << /Limits [(sect-simplelist) (sect-simplelist)] /Names [(sect-simplelist) 3375 0 R] >> endobj 5141 0 obj << /Limits [(sect-sru-explain) (sect-sru-explain)] /Names [(sect-sru-explain) 1241 0 R] >> endobj 5142 0 obj << /Limits [(sect-sru-intro) (sect-sru-intro)] /Names [(sect-sru-intro) 1235 0 R] >> endobj 5143 0 obj << /Limits [(sect-sru-operations) (sect-sru-operations)] /Names [(sect-sru-operations) 1238 0 R] >> endobj 5144 0 obj << /Limits [(sect-sru-scan) (sect-sru-scan)] /Names [(sect-sru-scan) 1247 0 R] >> endobj 5145 0 obj << /Limits [(sect-sru-searchretrieve) (sect-sru-searchretrieve)] /Names [(sect-sru-searchretrieve) 1244 0 R] >> endobj 5146 0 obj << /Limits [(sect-sru-searchretrieve-query) (sect-sru-searchretrieve-query)] /Names [(sect-sru-searchretrieve-query) 4273 0 R] >> endobj 5147 0 obj << /Limits [(sect-sru-searchretrieve-query-conformance) (sect-sru-searchretrieve-query-conformance)] /Names [(sect-sru-searchretrieve-query-conformance) 4274 0 R] >> endobj 5148 0 obj << /Limits [(sect-sru-searchretrieve-query-contextset) (sect-sru-searchretrieve-query-contextset)] /Names [(sect-sru-searchretrieve-query-contextset) 4276 0 R] >> endobj 5149 0 obj << /Limits [(sect-sru-searchretrieve-query-defaults) (sect-sru-searchretrieve-query-defaults)] /Names [(sect-sru-searchretrieve-query-defaults) 4275 0 R] >> endobj 5150 0 obj << /Limits [(sect-sru-searchretrieve-query-encoding) (sect-sru-searchretrieve-query-encoding)] /Names [(sect-sru-searchretrieve-query-encoding) 1192 0 R] >> endobj 5151 0 obj << /Limits [(sect-sru-searchretrieve-query-schemas) (sect-sru-searchretrieve-query-schemas)] /Names [(sect-sru-searchretrieve-query-schemas) 4277 0 R] >> endobj 5152 0 obj << /Limits [(sect-sru-select-database) (sect-sru-select-database)] /Names [(sect-sru-select-database) 4278 0 R] >> endobj 5153 0 obj << /Limits [(sect-srucgi) (sect-srucgi)] /Names [(sect-srucgi) 566 0 R] >> endobj 5154 0 obj << /Limits [(sect-srustandalone) (sect-srustandalone)] /Names [(sect-srustandalone) 569 0 R] >> endobj 5155 0 obj << /Limits [(sect-statusmessages) (sect-statusmessages)] /Names [(sect-statusmessages) 3435 0 R] >> endobj 5156 0 obj << /Limits [(sect-table-t-meta) (sect-table-t-meta)] /Names [(sect-table-t-meta) 3114 0 R] >> endobj 5157 0 obj << /Limits [(sect-test-cgi-script) (sect-test-cgi-script)] /Names [(sect-test-cgi-script) 4258 0 R] >> endobj 5158 0 obj << /Limits [(sect-transform-doc) (sect-transform-doc)] /Names [(sect-transform-doc) 4272 0 R] >> endobj 5159 0 obj << /Limits [(sect-transform-refdbnd-project) (sect-transform-refdbnd-project)] /Names [(sect-transform-refdbnd-project) 4266 0 R] >> endobj 5160 0 obj << /Limits [(sect-tune-cgi-script) (sect-tune-cgi-script)] /Names [(sect-tune-cgi-script) 4257 0 R] >> endobj 5161 0 obj << /Limits [(sect-use-custom-stylesheets) (sect-use-custom-stylesheets)] /Names [(sect-use-custom-stylesheets) 1230 0 R] >> endobj 5162 0 obj << /Limits [(sect-view-extended-notes) (sect-view-extended-notes)] /Names [(sect-view-extended-notes) 1090 0 R] >> endobj 5163 0 obj << /Limits [(sect-xml-bibliography-with-runbib) (sect-xml-bibliography-with-runbib)] /Names [(sect-xml-bibliography-with-runbib) 4270 0 R] >> endobj 5164 0 obj << /Limits [(sect-xml-bibliography-without-runbib) (sect-xml-bibliography-without-runbib)] /Names [(sect-xml-bibliography-without-runbib) 4271 0 R] >> endobj 5165 0 obj << /Limits [(sect1-add-bibstyles) (sect1-add-bibstyles)] /Names [(sect1-add-bibstyles) 718 0 R] >> endobj 5166 0 obj << /Limits [(sect1-add-references) (sect1-add-references)] /Names [(sect1-add-references) 808 0 R] >> endobj 5167 0 obj << /Limits [(sect1-add-user) (sect1-add-user)] /Names [(sect1-add-user) 700 0 R] >> endobj 5168 0 obj << /Limits [(sect1-backup-data) (sect1-backup-data)] /Names [(sect1-backup-data) 746 0 R] >> endobj 5169 0 obj << /Limits [(sect1-character-encoding) (sect1-character-encoding)] /Names [(sect1-character-encoding) 1061 0 R] >> endobj 5170 0 obj << /Limits [(sect1-common-command-line-options) (sect1-common-command-line-options)] /Names [(sect1-common-command-line-options) 889 0 R] >> endobj 5171 0 obj << /Limits [(sect1-create-database) (sect1-create-database)] /Names [(sect1-create-database) 694 0 R] >> endobj 5172 0 obj << /Limits [(sect1-delete-database) (sect1-delete-database)] /Names [(sect1-delete-database) 697 0 R] >> endobj 5173 0 obj << /Limits [(sect1-installation-linux) (sect1-installation-linux)] /Names [(sect1-installation-linux) 527 0 R] >> endobj 5174 0 obj << /Limits [(sect1-installation-windows) (sect1-installation-windows)] /Names [(sect1-installation-windows) 535 0 R] >> endobj 5175 0 obj << /Limits [(sect1-libraries) (sect1-libraries)] /Names [(sect1-libraries) 210 0 R] >> endobj 5176 0 obj << /Limits [(sect1-mystery-init-files) (sect1-mystery-init-files)] /Names [(sect1-mystery-init-files) 417 0 R] >> endobj 5177 0 obj << /Limits [(sect1-pdfroot) (sect1-pdfroot)] /Names [(sect1-pdfroot) 969 0 R] >> endobj 5178 0 obj << /Limits [(sect1-query-language) (sect1-query-language)] /Names [(sect1-query-language) 2235 0 R] >> endobj 5179 0 obj << /Limits [(sect1-regular-expressions) (sect1-regular-expressions)] /Names [(sect1-regular-expressions) 2337 0 R] >> endobj 5180 0 obj << /Limits [(sect1-ris-format) (sect1-ris-format)] /Names [(sect1-ris-format) 895 0 R] >> endobj 5181 0 obj << /Limits [(sect1-set-up-database) (sect1-set-up-database)] /Names [(sect1-set-up-database) 552 0 R] >> endobj 5182 0 obj << /Limits [(sect1-sysreq-os) (sect1-sysreq-os)] /Names [(sect1-sysreq-os) 168 0 R] >> endobj 5183 0 obj << /Limits [(sect1-tablecitstyle) (sect1-tablecitstyle)] /Names [(sect1-tablecitstyle) 3011 0 R] >> endobj 5184 0 obj << /Limits [(sect1-tableposition) (sect1-tableposition)] /Names [(sect1-tableposition) 3006 0 R] >> endobj 5185 0 obj << /Limits [(sect1-tablerefstyle) (sect1-tablerefstyle)] /Names [(sect1-tablerefstyle) 3004 0 R] >> endobj 5186 0 obj << /Limits [(sect1-tableseparators) (sect1-tableseparators)] /Names [(sect1-tableseparators) 3005 0 R] >> endobj 5187 0 obj << /Limits [(sect1-write-extended-notes) (sect1-write-extended-notes)] /Names [(sect1-write-extended-notes) 919 0 R] >> endobj 5188 0 obj << /Limits [(sect1-writing-risx) (sect1-writing-risx)] /Names [(sect1-writing-risx) 916 0 R] >> endobj 5189 0 obj << /Limits [(sect2-add-users-to-db) (sect2-add-users-to-db)] /Names [(sect2-add-users-to-db) 703 0 R] >> endobj 5190 0 obj << /Limits [(sect2-generic-instructions) (sect2-generic-instructions)] /Names [(sect2-generic-instructions) 330 0 R] >> endobj 5191 0 obj << /Limits [(sect2-install-cygwin-bin) (sect2-install-cygwin-bin)] /Names [(sect2-install-cygwin-bin) 365 0 R] >> endobj 5192 0 obj << /Limits [(sect2-log-level) (sect2-log-level)] /Names [(sect2-log-level) 588 0 R] >> endobj 5193 0 obj << /Limits [(sect2-manual-setup) (sect2-manual-setup)] /Names [(sect2-manual-setup) 412 0 R] >> endobj 5194 0 obj << /Limits [(sect2-query-examples) (sect2-query-examples)] /Names [(sect2-query-examples) 2304 0 R] >> endobj 5195 0 obj << /Limits [(sect2-regular-expressions-sql) (sect2-regular-expressions-sql)] /Names [(sect2-regular-expressions-sql) 2358 0 R] >> endobj 5196 0 obj << /Limits [(sect2-regular-expressions-unix) (sect2-regular-expressions-unix)] /Names [(sect2-regular-expressions-unix) 2330 0 R] >> endobj 5197 0 obj << /Limits [(sect3-catalog-files) (sect3-catalog-files)] /Names [(sect3-catalog-files) 415 0 R] >> endobj 5198 0 obj << /Limits [(sect3-create-citations) (sect3-create-citations)] /Names [(sect3-create-citations) 3260 0 R] >> endobj 5199 0 obj << /Limits [(sect3-customize-bib) (sect3-customize-bib)] /Names [(sect3-customize-bib) 1212 0 R] >> endobj 5200 0 obj << /Limits [(t-author) (t-author)] /Names [(t-author) 2969 0 R] >> endobj 5201 0 obj << /Limits [(t-keyword) (t-keyword)] /Names [(t-keyword) 2976 0 R] >> endobj 5202 0 obj << /Limits [(t-link) (t-link)] /Names [(t-link) 2994 0 R] >> endobj 5203 0 obj << /Limits [(t-note) (t-note)] /Names [(t-note) 2990 0 R] >> endobj 5204 0 obj << /Limits [(t-periodical) (t-periodical)] /Names [(t-periodical) 3123 0 R] >> endobj 5205 0 obj << /Limits [(t-refdb) (t-refdb)] /Names [(t-refdb) 2972 0 R] >> endobj 5206 0 obj << /Limits [(t-user) (t-user)] /Names [(t-user) 2981 0 R] >> endobj 5207 0 obj << /Limits [(t-xauthor) (t-xauthor)] /Names [(t-xauthor) 3132 0 R] >> endobj 5208 0 obj << /Limits [(t-xkeyword) (t-xkeyword)] /Names [(t-xkeyword) 3135 0 R] >> endobj 5209 0 obj << /Limits [(t-xlink) (t-xlink)] /Names [(t-xlink) 3144 0 R] >> endobj 5210 0 obj << /Limits [(t-xnote) (t-xnote)] /Names [(t-xnote) 3141 0 R] >> endobj 5211 0 obj << /Limits [(t-xuser) (t-xuser)] /Names [(t-xuser) 3138 0 R] >> endobj 5212 0 obj << /Limits [(chapter-backend-api) (t-xuser)] /Kids [4795 0 R 4796 0 R 4797 0 R 4798 0 R 4799 0 R 4800 0 R 4801 0 R 4802 0 R 4803 0 R 4804 0 R 4805 0 R 4806 0 R 4807 0 R 4808 0 R 4809 0 R 4810 0 R 4811 0 R 4812 0 R 4813 0 R 4814 0 R 4815 0 R 4816 0 R 4817 0 R 4818 0 R 4819 0 R 4820 0 R 4821 0 R 4822 0 R 4823 0 R 4824 0 R 4825 0 R 4826 0 R 4827 0 R 4828 0 R 4829 0 R 4830 0 R 4831 0 R 4832 0 R 4833 0 R 4834 0 R 4835 0 R 4836 0 R 4837 0 R 4838 0 R 4839 0 R 4840 0 R 4841 0 R 4842 0 R 4843 0 R 4844 0 R 4845 0 R 4846 0 R 4847 0 R 4848 0 R 4849 0 R 4850 0 R 4851 0 R 4852 0 R 4853 0 R 4854 0 R 4855 0 R 4856 0 R 4857 0 R 4858 0 R 4859 0 R 4860 0 R 4861 0 R 4862 0 R 4863 0 R 4864 0 R 4865 0 R 4866 0 R 4867 0 R 4868 0 R 4869 0 R 4870 0 R 4871 0 R 4872 0 R 4873 0 R 4874 0 R 4875 0 R 4876 0 R 4877 0 R 4878 0 R 4879 0 R 4880 0 R 4881 0 R 4882 0 R 4883 0 R 4884 0 R 4885 0 R 4886 0 R 4887 0 R 4888 0 R 4889 0 R 4890 0 R 4891 0 R 4892 0 R 4893 0 R 4894 0 R 4895 0 R 4896 0 R 4897 0 R 4898 0 R 4899 0 R 4900 0 R 4901 0 R 4902 0 R 4903 0 R 4904 0 R 4905 0 R 4906 0 R 4907 0 R 4908 0 R 4909 0 R 4910 0 R 4911 0 R 4912 0 R 4913 0 R 4914 0 R 4915 0 R 4916 0 R 4917 0 R 4918 0 R 4919 0 R 4920 0 R 4921 0 R 4922 0 R 4923 0 R 4924 0 R 4925 0 R 4926 0 R 4927 0 R 4928 0 R 4929 0 R 4930 0 R 4931 0 R 4932 0 R 4933 0 R 4934 0 R 4935 0 R 4936 0 R 4937 0 R 4938 0 R 4939 0 R 4940 0 R 4941 0 R 4942 0 R 4943 0 R 4944 0 R 4945 0 R 4946 0 R 4947 0 R 4948 0 R 4949 0 R 4950 0 R 4951 0 R 4952 0 R 4953 0 R 4954 0 R 4955 0 R 4956 0 R 4957 0 R 4958 0 R 4959 0 R 4960 0 R 4961 0 R 4962 0 R 4963 0 R 4964 0 R 4965 0 R 4966 0 R 4967 0 R 4968 0 R 4969 0 R 4970 0 R 4971 0 R 4972 0 R 4973 0 R 4974 0 R 4975 0 R 4976 0 R 4977 0 R 4978 0 R 4979 0 R 4980 0 R 4981 0 R 4982 0 R 4983 0 R 4984 0 R 4985 0 R 4986 0 R 4987 0 R 4988 0 R 4989 0 R 4990 0 R 4991 0 R 4992 0 R 4993 0 R 4994 0 R 4995 0 R 4996 0 R 4997 0 R 4998 0 R 4999 0 R 5000 0 R 5001 0 R 5002 0 R 5003 0 R 5004 0 R 5005 0 R 5006 0 R 5007 0 R 5008 0 R 5009 0 R 5010 0 R 5011 0 R 5012 0 R 5013 0 R 5014 0 R 5015 0 R 5016 0 R 5017 0 R 5018 0 R 5019 0 R 5020 0 R 5021 0 R 5022 0 R 5023 0 R 5024 0 R 5025 0 R 5026 0 R 5027 0 R 5028 0 R 5029 0 R 5030 0 R 5031 0 R 5032 0 R 5033 0 R 5034 0 R 5035 0 R 5036 0 R 5037 0 R 5038 0 R 5039 0 R 5040 0 R 5041 0 R 5042 0 R 5043 0 R 5044 0 R 5045 0 R 5046 0 R 5047 0 R 5048 0 R 5049 0 R 5050 0 R 5051 0 R 5052 0 R 5053 0 R 5054 0 R 5055 0 R 5056 0 R 5057 0 R 5058 0 R 5059 0 R 5060 0 R 5061 0 R 5062 0 R 5063 0 R 5064 0 R 5065 0 R 5066 0 R 5067 0 R 5068 0 R 5069 0 R 5070 0 R 5071 0 R 5072 0 R 5073 0 R 5074 0 R 5075 0 R 5076 0 R 5077 0 R 5078 0 R 5079 0 R 5080 0 R 5081 0 R 5082 0 R 5083 0 R 5084 0 R 5085 0 R 5086 0 R 5087 0 R 5088 0 R 5089 0 R 5090 0 R 5091 0 R 5092 0 R 5093 0 R 5094 0 R 5095 0 R 5096 0 R 5097 0 R 5098 0 R 5099 0 R 5100 0 R 5101 0 R 5102 0 R 5103 0 R 5104 0 R 5105 0 R 5106 0 R 5107 0 R 5108 0 R 5109 0 R 5110 0 R 5111 0 R 5112 0 R 5113 0 R 5114 0 R 5115 0 R 5116 0 R 5117 0 R 5118 0 R 5119 0 R 5120 0 R 5121 0 R 5122 0 R 5123 0 R 5124 0 R 5125 0 R 5126 0 R 5127 0 R 5128 0 R 5129 0 R 5130 0 R 5131 0 R 5132 0 R 5133 0 R 5134 0 R 5135 0 R 5136 0 R 5137 0 R 5138 0 R 5139 0 R 5140 0 R 5141 0 R 5142 0 R 5143 0 R 5144 0 R 5145 0 R 5146 0 R 5147 0 R 5148 0 R 5149 0 R 5150 0 R 5151 0 R 5152 0 R 5153 0 R 5154 0 R 5155 0 R 5156 0 R 5157 0 R 5158 0 R 5159 0 R 5160 0 R 5161 0 R 5162 0 R 5163 0 R 5164 0 R 5165 0 R 5166 0 R 5167 0 R 5168 0 R 5169 0 R 5170 0 R 5171 0 R 5172 0 R 5173 0 R 5174 0 R 5175 0 R 5176 0 R 5177 0 R 5178 0 R 5179 0 R 5180 0 R 5181 0 R 5182 0 R 5183 0 R 5184 0 R 5185 0 R 5186 0 R 5187 0 R 5188 0 R 5189 0 R 5190 0 R 5191 0 R 5192 0 R 5193 0 R 5194 0 R 5195 0 R 5196 0 R 5197 0 R 5198 0 R 5199 0 R 5200 0 R 5201 0 R 5202 0 R 5203 0 R 5204 0 R 5205 0 R 5206 0 R 5207 0 R 5208 0 R 5209 0 R 5210 0 R 5211 0 R] >> endobj 5214 0 obj 566 endobj 1 0 obj << /Type /Pages /Count 333 /Kids [8 0 R 14 0 R 430 0 R 817 0 R 2083 0 R 3041 0 R 4018 0 R 1146 0 R 2566 0 R 2907 0 R 17 0 R 24 0 R 173 0 R 1170 0 R 27 0 R 46 0 R 1760 0 R 62 0 R 99 0 R 108 0 R 3186 0 R 1995 0 R 129 0 R 167 0 R 239 0 R 621 0 R 1537 0 R 242 0 R 245 0 R 2625 0 R 251 0 R 2641 0 R 254 0 R 286 0 R 289 0 R 1550 0 R 307 0 R 310 0 R 329 0 R 338 0 R 364 0 R 345 0 R 348 0 R 1560 0 R 1570 0 R 411 0 R 398 0 R 401 0 R 408 0 R 421 0 R 424 0 R 599 0 R 427 0 R 1391 0 R 574 0 R 584 0 R 1748 0 R 1406 0 R 1461 0 R 1495 0 R 587 0 R 593 0 R 1428 0 R 1411 0 R 615 0 R 618 0 R 757 0 R 991 0 R 1201 0 R 2384 0 R 1612 0 R 2480 0 R 760 0 R 765 0 R 807 0 R 1712 0 R 768 0 R 771 0 R 774 0 R 968 0 R 777 0 R 780 0 R 2048 0 R 4206 0 R 792 0 R 801 0 R 1509 0 R 804 0 R 1921 0 R 1787 0 R 2300 0 R 1800 0 R 1812 0 R 1830 0 R 2399 0 R 1718 0 R 2282 0 R 1845 0 R 1258 0 R 1580 0 R 981 0 R 2439 0 R 2451 0 R 1128 0 R 1131 0 R 2740 0 R 2749 0 R 1134 0 R 1140 0 R 2491 0 R 1143 0 R 2665 0 R 2674 0 R 2458 0 R 1164 0 R 1167 0 R 2727 0 R 2499 0 R 1300 0 R 1191 0 R 1176 0 R 1334 0 R 1252 0 R 1255 0 R 2781 0 R 1434 0 R 1269 0 R 1266 0 R 1279 0 R 1282 0 R 1285 0 R 1444 0 R 1624 0 R 1288 0 R 1297 0 R 1343 0 R 1348 0 R 1355 0 R 1358 0 R 1361 0 R 1366 0 R 1373 0 R 1376 0 R 1379 0 R 1382 0 R 1385 0 R 1388 0 R 1419 0 R 1422 0 R 1486 0 R 1450 0 R 1453 0 R 1456 0 R 1477 0 R 1483 0 R 2355 0 R 2329 0 R 1516 0 R 1524 0 R 1638 0 R 1651 0 R 1660 0 R 1527 0 R 1594 0 R 1597 0 R 1602 0 R 1609 0 R 1670 0 R 1767 0 R 1677 0 R 1682 0 R 1685 0 R 1688 0 R 1691 0 R 1697 0 R 1700 0 R 1735 0 R 1743 0 R 1703 0 R 1706 0 R 1709 0 R 2234 0 R 2240 0 R 2248 0 R 2365 0 R 2370 0 R 2254 0 R 2261 0 R 1774 0 R 1777 0 R 1780 0 R 1853 0 R 1856 0 R 1861 0 R 2414 0 R 1869 0 R 1872 0 R 1875 0 R 2062 0 R 1881 0 R 1884 0 R 1934 0 R 1887 0 R 1947 0 R 1890 0 R 1896 0 R 1911 0 R 1956 0 R 1914 0 R 1966 0 R 1969 0 R 1979 0 R 1990 0 R 2053 0 R 2074 0 R 2211 0 R 2222 0 R 2268 0 R 2273 0 R 2336 0 R 2313 0 R 2343 0 R 2319 0 R 2326 0 R 2349 0 R 2378 0 R 2381 0 R 2411 0 R 2422 0 R 2425 0 R 2428 0 R 2433 0 R 2505 0 R 2436 0 R 2466 0 R 2469 0 R 2475 0 R 2517 0 R 2520 0 R 2523 0 R 2534 0 R 2547 0 R 2685 0 R 2691 0 R 2553 0 R 2558 0 R 2700 0 R 2708 0 R 2717 0 R 2737 0 R 2754 0 R 2757 0 R 2764 0 R 2767 0 R 2773 0 R 2904 0 R 3296 0 R 4087 0 R 2950 0 R 2953 0 R 2956 0 R 2959 0 R 2962 0 R 2965 0 R 2968 0 R 2987 0 R 3000 0 R 3003 0 R 3018 0 R 3029 0 R 4142 0 R 3175 0 R 3180 0 R 3200 0 R 3203 0 R 3206 0 R 3209 0 R 3212 0 R 3215 0 R 3218 0 R 3221 0 R 3224 0 R 3227 0 R 3230 0 R 3233 0 R 3236 0 R 3239 0 R 3242 0 R 3245 0 R 3264 0 R 3440 0 R 4153 0 R 3267 0 R 3287 0 R 3463 0 R 3485 0 R 3513 0 R 3535 0 R 3553 0 R 3568 0 R 3585 0 R 3599 0 R 3628 0 R 3645 0 R 4093 0 R 3668 0 R 3687 0 R 3708 0 R 3731 0 R 3762 0 R 3785 0 R 3803 0 R 3821 0 R 3841 0 R 3858 0 R 4114 0 R 3878 0 R 3902 0 R 3925 0 R 3942 0 R 3970 0 R 3991 0 R 3293 0 R 3445 0 R 3448 0 R 3451 0 R 3454 0 R 3457 0 R 3460 0 R 4012 0 R 4015 0 R 4135 0 R 4158 0 R ] >> endobj 2 0 obj << /Type /Catalog /Pages 1 0 R /Lang (en) /Metadata 7 0 R /PageLabels 9 0 R /Outlines 4364 0 R /PageMode /UseOutlines /Names 5213 0 R >> endobj 3 0 obj << /Font << /F11 4784 0 R /F1 4785 0 R /F12 4786 0 R /F10 4787 0 R /F5 4788 0 R /F3 4789 0 R /F9 4790 0 R /F6 4791 0 R /F7 4792 0 R /F14 4793 0 R >> /ProcSet [/PDF /ImageB /ImageC /Text] /ColorSpace << /DefaultRGB 6 0 R >> >> endobj 9 0 obj << /Nums [0 << /P (1) >> 1 << /P (2) >> 2 << /P (iii) >> 3 << /P (iv) >> 4 << /P (v) >> 5 << /P (vi) >> 6 << /P (vii) >> 7 << /P (viii) >> 8 << /P (ix) >> 9 << /P (x) >> 10 << /P (xi) >> 11 << /P (1) >> 12 << /P (2) >> 13 << /P (3) >> 14 << /P (4) >> 15 << /P (5) >> 16 << /P (6) >> 17 << /P (7) >> 18 << /P (8) >> 19 << /P (9) >> 20 << /P (10) >> 21 << /P (11) >> 22 << /P (12) >> 23 << /P (13) >> 24 << /P (14) >> 25 << /P (15) >> 26 << /P (16) >> 27 << /P (17) >> 28 << /P (18) >> 29 << /P (19) >> 30 << /P (20) >> 31 << /P (21) >> 32 << /P (22) >> 33 << /P (23) >> 34 << /P (24) >> 35 << /P (25) >> 36 << /P (26) >> 37 << /P (27) >> 38 << /P (28) >> 39 << /P (29) >> 40 << /P (30) >> 41 << /P (31) >> 42 << /P (32) >> 43 << /P (33) >> 44 << /P (34) >> 45 << /P (35) >> 46 << /P (36) >> 47 << /P (37) >> 48 << /P (38) >> 49 << /P (39) >> 50 << /P (40) >> 51 << /P (41) >> 52 << /P (42) >> 53 << /P (43) >> 54 << /P (44) >> 55 << /P (45) >> 56 << /P (46) >> 57 << /P (47) >> 58 << /P (48) >> 59 << /P (49) >> 60 << /P (50) >> 61 << /P (51) >> 62 << /P (52) >> 63 << /P (53) >> 64 << /P (54) >> 65 << /P (55) >> 66 << /P (56) >> 67 << /P (57) >> 68 << /P (58) >> 69 << /P (59) >> 70 << /P (60) >> 71 << /P (61) >> 72 << /P (62) >> 73 << /P (63) >> 74 << /P (64) >> 75 << /P (65) >> 76 << /P (66) >> 77 << /P (67) >> 78 << /P (68) >> 79 << /P (69) >> 80 << /P (70) >> 81 << /P (71) >> 82 << /P (72) >> 83 << /P (73) >> 84 << /P (74) >> 85 << /P (75) >> 86 << /P (76) >> 87 << /P (77) >> 88 << /P (78) >> 89 << /P (79) >> 90 << /P (80) >> 91 << /P (81) >> 92 << /P (82) >> 93 << /P (83) >> 94 << /P (84) >> 95 << /P (85) >> 96 << /P (86) >> 97 << /P (87) >> 98 << /P (88) >> 99 << /P (89) >> 100 << /P (90) >> 101 << /P (91) >> 102 << /P (92) >> 103 << /P (93) >> 104 << /P (94) >> 105 << /P (95) >> 106 << /P (96) >> 107 << /P (97) >> 108 << /P (98) >> 109 << /P (99) >> 110 << /P (100) >> 111 << /P (101) >> 112 << /P (102) >> 113 << /P (103) >> 114 << /P (104) >> 115 << /P (105) >> 116 << /P (106) >> 117 << /P (107) >> 118 << /P (108) >> 119 << /P (109) >> 120 << /P (110) >> 121 << /P (111) >> 122 << /P (112) >> 123 << /P (113) >> 124 << /P (114) >> 125 << /P (115) >> 126 << /P (116) >> 127 << /P (117) >> 128 << /P (118) >> 129 << /P (119) >> 130 << /P (120) >> 131 << /P (121) >> 132 << /P (122) >> 133 << /P (123) >> 134 << /P (124) >> 135 << /P (125) >> 136 << /P (126) >> 137 << /P (127) >> 138 << /P (128) >> 139 << /P (129) >> 140 << /P (130) >> 141 << /P (131) >> 142 << /P (132) >> 143 << /P (133) >> 144 << /P (134) >> 145 << /P (135) >> 146 << /P (136) >> 147 << /P (137) >> 148 << /P (138) >> 149 << /P (139) >> 150 << /P (140) >> 151 << /P (141) >> 152 << /P (142) >> 153 << /P (143) >> 154 << /P (144) >> 155 << /P (145) >> 156 << /P (146) >> 157 << /P (147) >> 158 << /P (148) >> 159 << /P (149) >> 160 << /P (150) >> 161 << /P (151) >> 162 << /P (152) >> 163 << /P (153) >> 164 << /P (154) >> 165 << /P (155) >> 166 << /P (156) >> 167 << /P (157) >> 168 << /P (158) >> 169 << /P (159) >> 170 << /P (160) >> 171 << /P (161) >> 172 << /P (162) >> 173 << /P (163) >> 174 << /P (164) >> 175 << /P (165) >> 176 << /P (166) >> 177 << /P (167) >> 178 << /P (168) >> 179 << /P (169) >> 180 << /P (170) >> 181 << /P (171) >> 182 << /P (172) >> 183 << /P (173) >> 184 << /P (174) >> 185 << /P (175) >> 186 << /P (176) >> 187 << /P (177) >> 188 << /P (178) >> 189 << /P (179) >> 190 << /P (180) >> 191 << /P (181) >> 192 << /P (182) >> 193 << /P (183) >> 194 << /P (184) >> 195 << /P (185) >> 196 << /P (186) >> 197 << /P (187) >> 198 << /P (188) >> 199 << /P (189) >> 200 << /P (190) >> 201 << /P (191) >> 202 << /P (192) >> 203 << /P (193) >> 204 << /P (194) >> 205 << /P (195) >> 206 << /P (196) >> 207 << /P (197) >> 208 << /P (198) >> 209 << /P (199) >> 210 << /P (200) >> 211 << /P (201) >> 212 << /P (202) >> 213 << /P (203) >> 214 << /P (204) >> 215 << /P (205) >> 216 << /P (206) >> 217 << /P (207) >> 218 << /P (208) >> 219 << /P (209) >> 220 << /P (210) >> 221 << /P (211) >> 222 << /P (212) >> 223 << /P (213) >> 224 << /P (214) >> 225 << /P (215) >> 226 << /P (216) >> 227 << /P (217) >> 228 << /P (218) >> 229 << /P (219) >> 230 << /P (220) >> 231 << /P (221) >> 232 << /P (222) >> 233 << /P (223) >> 234 << /P (224) >> 235 << /P (225) >> 236 << /P (226) >> 237 << /P (227) >> 238 << /P (228) >> 239 << /P (229) >> 240 << /P (230) >> 241 << /P (231) >> 242 << /P (232) >> 243 << /P (233) >> 244 << /P (234) >> 245 << /P (235) >> 246 << /P (236) >> 247 << /P (237) >> 248 << /P (238) >> 249 << /P (239) >> 250 << /P (240) >> 251 << /P (241) >> 252 << /P (242) >> 253 << /P (243) >> 254 << /P (244) >> 255 << /P (245) >> 256 << /P (246) >> 257 << /P (247) >> 258 << /P (248) >> 259 << /P (249) >> 260 << /P (250) >> 261 << /P (251) >> 262 << /P (252) >> 263 << /P (253) >> 264 << /P (254) >> 265 << /P (255) >> 266 << /P (256) >> 267 << /P (257) >> 268 << /P (258) >> 269 << /P (259) >> 270 << /P (260) >> 271 << /P (261) >> 272 << /P (262) >> 273 << /P (263) >> 274 << /P (264) >> 275 << /P (265) >> 276 << /P (266) >> 277 << /P (267) >> 278 << /P (268) >> 279 << /P (269) >> 280 << /P (270) >> 281 << /P (271) >> 282 << /P (272) >> 283 << /P (273) >> 284 << /P (274) >> 285 << /P (275) >> 286 << /P (276) >> 287 << /P (277) >> 288 << /P (278) >> 289 << /P (279) >> 290 << /P (280) >> 291 << /P (281) >> 292 << /P (282) >> 293 << /P (283) >> 294 << /P (284) >> 295 << /P (285) >> 296 << /P (286) >> 297 << /P (287) >> 298 << /P (288) >> 299 << /P (289) >> 300 << /P (290) >> 301 << /P (291) >> 302 << /P (292) >> 303 << /P (293) >> 304 << /P (294) >> 305 << /P (295) >> 306 << /P (296) >> 307 << /P (297) >> 308 << /P (298) >> 309 << /P (299) >> 310 << /P (300) >> 311 << /P (301) >> 312 << /P (302) >> 313 << /P (303) >> 314 << /P (304) >> 315 << /P (305) >> 316 << /P (306) >> 317 << /P (307) >> 318 << /P (308) >> 319 << /P (309) >> 320 << /P (310) >> 321 << /P (311) >> 322 << /P (312) >> 323 << /P (313) >> 324 << /P (314) >> 325 << /P (315) >> 326 << /P (316) >> 327 << /P (317) >> 328 << /P (318) >> 329 << /P (319) >> 330 << /P (320) >> 331 << /P (321) >> 332 << /P (322) >> ] >> endobj 4364 0 obj << /First 4365 0 R /Last 4641 0 R >> endobj 5213 0 obj << /Dests 5212 0 R >> endobj xref 0 5215 0000000000 65535 f 0001717951 00000 n 0001720935 00000 n 0001721104 00000 n 0000000015 00000 n 0000000235 00000 n 0000002917 00000 n 0000002950 00000 n 0000004314 00000 n 0001721374 00000 n 0000004019 00000 n 0000004538 00000 n 0000004559 00000 n 0000004579 00000 n 0000004954 00000 n 0000004599 00000 n 0000005179 00000 n 0000006376 00000 n 0000005199 00000 n 0000005275 00000 n 0000006342 00000 n 0000005413 00000 n 0000005551 00000 n 0000006618 00000 n 0000006967 00000 n 0000006638 00000 n 0000007192 00000 n 0000017651 00000 n 0000007212 00000 n 0000007292 00000 n 0000007371 00000 n 0000017561 00000 n 0000007511 00000 n 0000007569 00000 n 0000007709 00000 n 0000007849 00000 n 0000007986 00000 n 0000008049 00000 n 0000008189 00000 n 0000008329 00000 n 0000008388 00000 n 0000008528 00000 n 0000008666 00000 n 0000008804 00000 n 0000008939 00000 n 0000017893 00000 n 0000023020 00000 n 0000017914 00000 n 0000017985 00000 n 0000022937 00000 n 0000018123 00000 n 0000018261 00000 n 0000018396 00000 n 0000018478 00000 n 0000018616 00000 n 0000018756 00000 n 0000018893 00000 n 0000018976 00000 n 0000019116 00000 n 0000019256 00000 n 0000019393 00000 n 0000023262 00000 n 0000029370 00000 n 0000023283 00000 n 0000023379 00000 n 0000029182 00000 n 0000023516 00000 n 0000023654 00000 n 0000023720 00000 n 0000023857 00000 n 0000023995 00000 n 0000024051 00000 n 0000024187 00000 n 0000024325 00000 n 0000024392 00000 n 0000024529 00000 n 0000024667 00000 n 0000024742 00000 n 0000024879 00000 n 0000025017 00000 n 0000025074 00000 n 0000025211 00000 n 0000025349 00000 n 0000025486 00000 n 0000025624 00000 n 0000025689 00000 n 0000025826 00000 n 0000025964 00000 n 0000026101 00000 n 0000026239 00000 n 0000026307 00000 n 0000026444 00000 n 0000026581 00000 n 0000026718 00000 n 0000026856 00000 n 0000026936 00000 n 0000027073 00000 n 0000027211 00000 n 0000029612 00000 n 0000032498 00000 n 0000029633 00000 n 0000029693 00000 n 0000032445 00000 n 0000029835 00000 n 0000029977 00000 n 0000030115 00000 n 0000030254 00000 n 0000032742 00000 n 0000037954 00000 n 0000032764 00000 n 0000037813 00000 n 0000032902 00000 n 0000033043 00000 n 0000033184 00000 n 0000033325 00000 n 0000033463 00000 n 0000033601 00000 n 0000033742 00000 n 0000033880 00000 n 0000034019 00000 n 0000034157 00000 n 0000034298 00000 n 0000034356 00000 n 0000034493 00000 n 0000034630 00000 n 0000034706 00000 n 0000034844 00000 n 0000034982 00000 n 0000038199 00000 n 0000046261 00000 n 0000038221 00000 n 0000038281 00000 n 0000046048 00000 n 0000038423 00000 n 0000038565 00000 n 0000038641 00000 n 0000038780 00000 n 0000038920 00000 n 0000038997 00000 n 0000039139 00000 n 0000039281 00000 n 0000039359 00000 n 0000039501 00000 n 0000039643 00000 n 0000039782 00000 n 0000039921 00000 n 0000039988 00000 n 0000040130 00000 n 0000040272 00000 n 0000040339 00000 n 0000040481 00000 n 0000040621 00000 n 0000040694 00000 n 0000040834 00000 n 0000040974 00000 n 0000041114 00000 n 0000041254 00000 n 0000041311 00000 n 0000041451 00000 n 0000041590 00000 n 0000041648 00000 n 0000041790 00000 n 0000041932 00000 n 0000041995 00000 n 0000042135 00000 n 0000042275 00000 n 0000046506 00000 n 0000049494 00000 n 0000046528 00000 n 0000046608 00000 n 0000049465 00000 n 0000046748 00000 n 0000049739 00000 n 0000063818 00000 n 0000403747 00000 n 0000049761 00000 n 0000063461 00000 n 0000049901 00000 n 0000403830 00000 n 0000050043 00000 n 0000050183 00000 n 0000403912 00000 n 0000050325 00000 n 0000050465 00000 n 0000050607 00000 n 0000050688 00000 n 0000050827 00000 n 0000050969 00000 n 0000051050 00000 n 0000051190 00000 n 0000051332 00000 n 0000051413 00000 n 0000051553 00000 n 0000663544 00000 n 0000051695 00000 n 0000051835 00000 n 0000663627 00000 n 0000051977 00000 n 0000052117 00000 n 0000663710 00000 n 0000052259 00000 n 0000052399 00000 n 0000052541 00000 n 0000052622 00000 n 0000052762 00000 n 0000052904 00000 n 0000052985 00000 n 0000053123 00000 n 0000053265 00000 n 0000053405 00000 n 0000053547 00000 n 0000053628 00000 n 0000053768 00000 n 0000053910 00000 n 0000053991 00000 n 0000054131 00000 n 0000054273 00000 n 0000054355 00000 n 0000054495 00000 n 0000054637 00000 n 0000054719 00000 n 0000054859 00000 n 0001288411 00000 n 0000055001 00000 n 0000055141 00000 n 0000055283 00000 n 0000055365 00000 n 0000055505 00000 n 0000055647 00000 n 0000055729 00000 n 0000055869 00000 n 0000056011 00000 n 0000056093 00000 n 0000056233 00000 n 0000056375 00000 n 0000056457 00000 n 0000056597 00000 n 0000056739 00000 n 0000064063 00000 n 0000064426 00000 n 0000064085 00000 n 0000064653 00000 n 0000067573 00000 n 0000064674 00000 n 0000067800 00000 n 0000115599 00000 n 0000067822 00000 n 0000067904 00000 n 0000115570 00000 n 0000068046 00000 n 0000115844 00000 n 0000118510 00000 n 0000115867 00000 n 0000118737 00000 n 0000125738 00000 n 0000118759 00000 n 0000125525 00000 n 0000118895 00000 n 0000119034 00000 n 0000119170 00000 n 0000119309 00000 n 0000119448 00000 n 0000119587 00000 n 0000119725 00000 n 0000119791 00000 n 0000119932 00000 n 0000120074 00000 n 0000120151 00000 n 0000120293 00000 n 0000120435 00000 n 0000120520 00000 n 0000120662 00000 n 0000120802 00000 n 0000120878 00000 n 0000121020 00000 n 0000121162 00000 n 0000121300 00000 n 0000121438 00000 n 0000121577 00000 n 0000121716 00000 n 0000121858 00000 n 0000121997 00000 n 0000122139 00000 n 0000122281 00000 n 0000122420 00000 n 0000125983 00000 n 0000128707 00000 n 0000126005 00000 n 0000128934 00000 n 0000133361 00000 n 0000128956 00000 n 0000129015 00000 n 0000133244 00000 n 0000129157 00000 n 0000129296 00000 n 0000129438 00000 n 0000129555 00000 n 0000129697 00000 n 0000129839 00000 n 0000129978 00000 n 0000130120 00000 n 0000130259 00000 n 0000130401 00000 n 0000130543 00000 n 0000130685 00000 n 0000130824 00000 n 0000133606 00000 n 0000136136 00000 n 0000133628 00000 n 0000136363 00000 n 0000141697 00000 n 0000136385 00000 n 0000136470 00000 n 0000141596 00000 n 0000136610 00000 n 0000136752 00000 n 0000136822 00000 n 0000136961 00000 n 0000137103 00000 n 0000137190 00000 n 0000137329 00000 n 0000137471 00000 n 0000137553 00000 n 0000137693 00000 n 0000137774 00000 n 0000137916 00000 n 0000138058 00000 n 0000138197 00000 n 0000141942 00000 n 0000145507 00000 n 0000141964 00000 n 0000142046 00000 n 0000145462 00000 n 0000142186 00000 n 0000142246 00000 n 0000142385 00000 n 0000142527 00000 n 0000145752 00000 n 0000148293 00000 n 0000145774 00000 n 0000145840 00000 n 0000148256 00000 n 0000145982 00000 n 0000146124 00000 n 0000148538 00000 n 0000151062 00000 n 0000148560 00000 n 0000151289 00000 n 0000155681 00000 n 0000151311 00000 n 0000155564 00000 n 0000151453 00000 n 0000151592 00000 n 0000151734 00000 n 0000151876 00000 n 0000152018 00000 n 0000152157 00000 n 0000152299 00000 n 0000152438 00000 n 0000152580 00000 n 0000152722 00000 n 0000152864 00000 n 0000153003 00000 n 0000155926 00000 n 0000163815 00000 n 0000576437 00000 n 0000155948 00000 n 0000163578 00000 n 0000156090 00000 n 0000156230 00000 n 0000156372 00000 n 0000156513 00000 n 0000156654 00000 n 0000156795 00000 n 0000156936 00000 n 0000157077 00000 n 0000157215 00000 n 0000157356 00000 n 0000157462 00000 n 0000157602 00000 n 0000157744 00000 n 0000157883 00000 n 0000158025 00000 n 0000158167 00000 n 0000158307 00000 n 0000158447 00000 n 0000158589 00000 n 0000158731 00000 n 0000158873 00000 n 0000159012 00000 n 0000159154 00000 n 0000159233 00000 n 0000159373 00000 n 0000159512 00000 n 0000159653 00000 n 0000159794 00000 n 0000159932 00000 n 0000164060 00000 n 0000166436 00000 n 0000164082 00000 n 0000166663 00000 n 0000169783 00000 n 0000166685 00000 n 0000169738 00000 n 0000166826 00000 n 0000166964 00000 n 0000167105 00000 n 0000170028 00000 n 0000172545 00000 n 0000170050 00000 n 0000172772 00000 n 0000176420 00000 n 0000172794 00000 n 0000172875 00000 n 0000176375 00000 n 0000173015 00000 n 0000173097 00000 n 0001000331 00000 n 0000173235 00000 n 0000173377 00000 n 0000176665 00000 n 0000179831 00000 n 0000176687 00000 n 0000180058 00000 n 0000182700 00000 n 0000180080 00000 n 0000182927 00000 n 0000185192 00000 n 0000182949 00000 n 0000185419 00000 n 0000217988 00000 n 0001207177 00000 n 0000185441 00000 n 0000217087 00000 n 0000185580 00000 n 0001207260 00000 n 0000185722 00000 n 0000185862 00000 n 0001207342 00000 n 0000186004 00000 n 0000186144 00000 n 0001207425 00000 n 0000186286 00000 n 0000186426 00000 n 0000186568 00000 n 0000186649 00000 n 0000186788 00000 n 0000186930 00000 n 0000187070 00000 n 0000187212 00000 n 0000187352 00000 n 0000187494 00000 n 0000187634 00000 n 0000187776 00000 n 0000187916 00000 n 0000188058 00000 n 0000188198 00000 n 0000188340 00000 n 0000188480 00000 n 0000188622 00000 n 0000188762 00000 n 0000188904 00000 n 0000189044 00000 n 0000189186 00000 n 0000189326 00000 n 0000189468 00000 n 0000189608 00000 n 0000189750 00000 n 0000189890 00000 n 0000190032 00000 n 0000190172 00000 n 0000190314 00000 n 0000190454 00000 n 0000190596 00000 n 0000190736 00000 n 0000190878 00000 n 0000191018 00000 n 0000191160 00000 n 0000191300 00000 n 0000191442 00000 n 0000191582 00000 n 0000191724 00000 n 0000191864 00000 n 0000192006 00000 n 0000192146 00000 n 0000192288 00000 n 0000192428 00000 n 0000192570 00000 n 0000192710 00000 n 0000192852 00000 n 0000192934 00000 n 0000193074 00000 n 0000563514 00000 n 0000193216 00000 n 0000193356 00000 n 0000563597 00000 n 0000193498 00000 n 0000193638 00000 n 0000563679 00000 n 0000193780 00000 n 0000193920 00000 n 0000563762 00000 n 0000194062 00000 n 0000194202 00000 n 0000563845 00000 n 0000194344 00000 n 0000194484 00000 n 0000194626 00000 n 0000194708 00000 n 0000194848 00000 n 0000194990 00000 n 0000195072 00000 n 0000195212 00000 n 0000195354 00000 n 0000195435 00000 n 0000195575 00000 n 0000195717 00000 n 0000195799 00000 n 0000195939 00000 n 0000196081 00000 n 0000196221 00000 n 0001117826 00000 n 0000196363 00000 n 0000196503 00000 n 0001117909 00000 n 0000196645 00000 n 0000196785 00000 n 0000196927 00000 n 0000197008 00000 n 0000197148 00000 n 0000197290 00000 n 0000197430 00000 n 0000197572 00000 n 0000197654 00000 n 0000197794 00000 n 0000197936 00000 n 0000198018 00000 n 0000198158 00000 n 0000198300 00000 n 0000198382 00000 n 0000198522 00000 n 0000198664 00000 n 0000198746 00000 n 0000198886 00000 n 0000199028 00000 n 0000199168 00000 n 0000576520 00000 n 0000199310 00000 n 0000199449 00000 n 0000576603 00000 n 0000199591 00000 n 0000199731 00000 n 0000576686 00000 n 0000199873 00000 n 0000200013 00000 n 0000576769 00000 n 0000200155 00000 n 0000200295 00000 n 0000200437 00000 n 0000200577 00000 n 0000200717 00000 n 0000200799 00000 n 0000200939 00000 n 0000230189 00000 n 0000201081 00000 n 0000201221 00000 n 0000230271 00000 n 0000201363 00000 n 0000201502 00000 n 0000496312 00000 n 0000201643 00000 n 0000201781 00000 n 0000201919 00000 n 0000218233 00000 n 0000221363 00000 n 0000218256 00000 n 0000218318 00000 n 0000221310 00000 n 0000218457 00000 n 0000218596 00000 n 0000218653 00000 n 0000218793 00000 n 0000218933 00000 n 0000221608 00000 n 0000222598 00000 n 0000221630 00000 n 0000222825 00000 n 0000226717 00000 n 0000222846 00000 n 0000222928 00000 n 0000226688 00000 n 0000223070 00000 n 0000226962 00000 n 0000229922 00000 n 0000226984 00000 n 0000227066 00000 n 0000229893 00000 n 0000227206 00000 n 0000230167 00000 n 0000235200 00000 n 0000515039 00000 n 0000230353 00000 n 0000235107 00000 n 0000230493 00000 n 0000230634 00000 n 0000230775 00000 n 0000230846 00000 n 0000230988 00000 n 0000231130 00000 n 0000231268 00000 n 0000231331 00000 n 0000231473 00000 n 0000231615 00000 n 0000231754 00000 n 0000235445 00000 n 0000238712 00000 n 0000235467 00000 n 0000238939 00000 n 0000240402 00000 n 0000238961 00000 n 0000240629 00000 n 0000272743 00000 n 0000240651 00000 n 0000271858 00000 n 0000240791 00000 n 0000240933 00000 n 0000241072 00000 n 0000241214 00000 n 0000241354 00000 n 0000241496 00000 n 0000241636 00000 n 0000241778 00000 n 0000241918 00000 n 0000242060 00000 n 0000242200 00000 n 0000242342 00000 n 0000242482 00000 n 0000242624 00000 n 0000242764 00000 n 0000242906 00000 n 0000243046 00000 n 0000243188 00000 n 0000243328 00000 n 0000243470 00000 n 0000243609 00000 n 0000243751 00000 n 0000243891 00000 n 0000244033 00000 n 0000244173 00000 n 0000244315 00000 n 0000244455 00000 n 0000244597 00000 n 0000244737 00000 n 0000244879 00000 n 0000245019 00000 n 0000245159 00000 n 0000245298 00000 n 0000245440 00000 n 0000245580 00000 n 0000245722 00000 n 0000245862 00000 n 0000246004 00000 n 0000246144 00000 n 0000246284 00000 n 0000246424 00000 n 0000246566 00000 n 0000246706 00000 n 0000246848 00000 n 0000246988 00000 n 0000247130 00000 n 0000247270 00000 n 0000247412 00000 n 0000247551 00000 n 0000247693 00000 n 0000247833 00000 n 0000247975 00000 n 0000248114 00000 n 0000248256 00000 n 0000248394 00000 n 0000248536 00000 n 0000248618 00000 n 0000248758 00000 n 0000248900 00000 n 0000248982 00000 n 0000249121 00000 n 0000249263 00000 n 0000249345 00000 n 0000249485 00000 n 0000249627 00000 n 0000249709 00000 n 0000249849 00000 n 0000659461 00000 n 0000249991 00000 n 0000250131 00000 n 0000659544 00000 n 0000250273 00000 n 0000250413 00000 n 0000659627 00000 n 0000250555 00000 n 0000250695 00000 n 0000659710 00000 n 0000250837 00000 n 0000250977 00000 n 0000659793 00000 n 0000251119 00000 n 0000251259 00000 n 0000533328 00000 n 0000251401 00000 n 0000251541 00000 n 0000533411 00000 n 0000251683 00000 n 0000251823 00000 n 0000533494 00000 n 0000251965 00000 n 0000252104 00000 n 0000533576 00000 n 0000252246 00000 n 0000252386 00000 n 0000546946 00000 n 0000252528 00000 n 0000252668 00000 n 0000547029 00000 n 0000252810 00000 n 0000252950 00000 n 0000547112 00000 n 0000253092 00000 n 0000253232 00000 n 0000253374 00000 n 0000253456 00000 n 0000253596 00000 n 0000253738 00000 n 0000253878 00000 n 0000254020 00000 n 0000254102 00000 n 0000254242 00000 n 0000254384 00000 n 0000254466 00000 n 0000254606 00000 n 0000514956 00000 n 0000254748 00000 n 0000254888 00000 n 0000255030 00000 n 0000255170 00000 n 0000255312 00000 n 0000255394 00000 n 0000255534 00000 n 0000255676 00000 n 0000255758 00000 n 0000255898 00000 n 0000256040 00000 n 0000256122 00000 n 0000256262 00000 n 0000256402 00000 n 0000256484 00000 n 0000256623 00000 n 0000256762 00000 n 0000272988 00000 n 0000273345 00000 n 0000273011 00000 n 0000273572 00000 n 0000276910 00000 n 0000273593 00000 n 0000276881 00000 n 0000273735 00000 n 0000277155 00000 n 0000278713 00000 n 0000277177 00000 n 0000278940 00000 n 0000281159 00000 n 0000278962 00000 n 0000281386 00000 n 0000283618 00000 n 0000281408 00000 n 0000283845 00000 n 0000285427 00000 n 0000283867 00000 n 0000285654 00000 n 0000287195 00000 n 0000285676 00000 n 0000287422 00000 n 0000290500 00000 n 0000287444 00000 n 0000287522 00000 n 0000290431 00000 n 0000287664 00000 n 0000287806 00000 n 0000287945 00000 n 0000288033 00000 n 0000288175 00000 n 0000288317 00000 n 0000288456 00000 n 0000290745 00000 n 0000294719 00000 n 0000290767 00000 n 0000294658 00000 n 0000290908 00000 n 0000291049 00000 n 0000291190 00000 n 0000291331 00000 n 0000291469 00000 n 0000294964 00000 n 0000297998 00000 n 0000294986 00000 n 0000298225 00000 n 0000298721 00000 n 0000298247 00000 n 0000298948 00000 n 0000302136 00000 n 0000742479 00000 n 0000298969 00000 n 0000302083 00000 n 0000299111 00000 n 0000299217 00000 n 0000299359 00000 n 0000299501 00000 n 0000299639 00000 n 0000302381 00000 n 0000335639 00000 n 0000302403 00000 n 0000334690 00000 n 0000302543 00000 n 0000302685 00000 n 0000302825 00000 n 0000302967 00000 n 0000303107 00000 n 0000303249 00000 n 0000303389 00000 n 0000303531 00000 n 0000303671 00000 n 0000303813 00000 n 0000303953 00000 n 0000304095 00000 n 0000304235 00000 n 0000304377 00000 n 0000304517 00000 n 0000304659 00000 n 0000304799 00000 n 0000304941 00000 n 0000305080 00000 n 0000305220 00000 n 0000305360 00000 n 0000305500 00000 n 0000305640 00000 n 0000305782 00000 n 0000305922 00000 n 0000306064 00000 n 0000306204 00000 n 0000306346 00000 n 0000306486 00000 n 0000306628 00000 n 0000306767 00000 n 0000306909 00000 n 0000307049 00000 n 0000307191 00000 n 0000307331 00000 n 0000307473 00000 n 0000307613 00000 n 0000307755 00000 n 0000307894 00000 n 0000308036 00000 n 0000308176 00000 n 0000308318 00000 n 0000308457 00000 n 0000308599 00000 n 0000308739 00000 n 0000308881 00000 n 0000309021 00000 n 0000309163 00000 n 0000309303 00000 n 0000309445 00000 n 0000309585 00000 n 0000309727 00000 n 0000309809 00000 n 0000309949 00000 n 0000897516 00000 n 0000310091 00000 n 0000310231 00000 n 0000897599 00000 n 0000310373 00000 n 0000310513 00000 n 0000595605 00000 n 0000310655 00000 n 0000310795 00000 n 0000954478 00000 n 0000310937 00000 n 0000311077 00000 n 0000954561 00000 n 0000311219 00000 n 0000311359 00000 n 0000954644 00000 n 0000311501 00000 n 0000311641 00000 n 0000311783 00000 n 0000311865 00000 n 0000312004 00000 n 0000312146 00000 n 0000312228 00000 n 0000312368 00000 n 0000312510 00000 n 0000312592 00000 n 0000312731 00000 n 0000645562 00000 n 0000312873 00000 n 0000313013 00000 n 0000645645 00000 n 0000313155 00000 n 0000313295 00000 n 0000313437 00000 n 0000313519 00000 n 0000313658 00000 n 0000313800 00000 n 0000313882 00000 n 0000314022 00000 n 0000779531 00000 n 0000314164 00000 n 0000314304 00000 n 0001561745 00000 n 0000314446 00000 n 0000314586 00000 n 0000314728 00000 n 0000314810 00000 n 0000314950 00000 n 0000315092 00000 n 0000315174 00000 n 0000315314 00000 n 0000315456 00000 n 0000315538 00000 n 0000315678 00000 n 0000551200 00000 n 0000315820 00000 n 0000315960 00000 n 0000742396 00000 n 0000316102 00000 n 0000316242 00000 n 0000316384 00000 n 0000316524 00000 n 0000742562 00000 n 0000316666 00000 n 0000316806 00000 n 0000678869 00000 n 0000316948 00000 n 0000317087 00000 n 0000863044 00000 n 0000317229 00000 n 0000317369 00000 n 0000863127 00000 n 0000317509 00000 n 0000317649 00000 n 0000683405 00000 n 0000317791 00000 n 0000317931 00000 n 0000683488 00000 n 0000318073 00000 n 0000318213 00000 n 0000683571 00000 n 0000318355 00000 n 0000318495 00000 n 0000687656 00000 n 0000318637 00000 n 0000318776 00000 n 0000687739 00000 n 0000318917 00000 n 0000319055 00000 n 0000687822 00000 n 0000319193 00000 n 0000319331 00000 n 0000319471 00000 n 0000335884 00000 n 0000339630 00000 n 0000902531 00000 n 0000335907 00000 n 0000339553 00000 n 0000336047 00000 n 0000336104 00000 n 0000336246 00000 n 0000336386 00000 n 0000336528 00000 n 0000336670 00000 n 0000336812 00000 n 0000336951 00000 n 0000339875 00000 n 0000345401 00000 n 0000339897 00000 n 0000339979 00000 n 0000340068 00000 n 0000345348 00000 n 0000340207 00000 n 0000340347 00000 n 0000340489 00000 n 0000340629 00000 n 0000345646 00000 n 0000377803 00000 n 0000345668 00000 n 0000376799 00000 n 0000345808 00000 n 0000345950 00000 n 0000346089 00000 n 0000346231 00000 n 0000346371 00000 n 0000346513 00000 n 0000346653 00000 n 0000346796 00000 n 0000346937 00000 n 0000347080 00000 n 0000347221 00000 n 0000347364 00000 n 0000347505 00000 n 0000347648 00000 n 0000347789 00000 n 0000347932 00000 n 0000348073 00000 n 0000348216 00000 n 0000348357 00000 n 0000348500 00000 n 0000348640 00000 n 0000348783 00000 n 0000348924 00000 n 0000349067 00000 n 0000349208 00000 n 0000349351 00000 n 0000349491 00000 n 0000349634 00000 n 0000349775 00000 n 0000349918 00000 n 0000350059 00000 n 0000350202 00000 n 0000350343 00000 n 0000350486 00000 n 0000350627 00000 n 0000350770 00000 n 0000350910 00000 n 0000351053 00000 n 0000351194 00000 n 0000351337 00000 n 0000351477 00000 n 0000351620 00000 n 0000351761 00000 n 0000351904 00000 n 0000352045 00000 n 0000352188 00000 n 0000352329 00000 n 0000352472 00000 n 0000352613 00000 n 0000352756 00000 n 0000352897 00000 n 0000353040 00000 n 0000353181 00000 n 0000353324 00000 n 0000353465 00000 n 0000353608 00000 n 0000353747 00000 n 0000353890 00000 n 0000354031 00000 n 0000354174 00000 n 0000354315 00000 n 0000687905 00000 n 0000354458 00000 n 0000354600 00000 n 0000693468 00000 n 0000354744 00000 n 0000354885 00000 n 0000693552 00000 n 0000355029 00000 n 0000355171 00000 n 0000693635 00000 n 0000355315 00000 n 0000355457 00000 n 0000902363 00000 n 0000355601 00000 n 0000355743 00000 n 0000902447 00000 n 0000355887 00000 n 0000356029 00000 n 0000356173 00000 n 0000356313 00000 n 0000648286 00000 n 0000356456 00000 n 0000356598 00000 n 0000648370 00000 n 0000356742 00000 n 0000356884 00000 n 0000648454 00000 n 0000357024 00000 n 0000357166 00000 n 0000858178 00000 n 0000357310 00000 n 0000357452 00000 n 0000858262 00000 n 0000357596 00000 n 0000357738 00000 n 0000858346 00000 n 0000357882 00000 n 0000358023 00000 n 0000858430 00000 n 0000358167 00000 n 0000358309 00000 n 0000698338 00000 n 0000358453 00000 n 0000358595 00000 n 0000698422 00000 n 0000358739 00000 n 0000358881 00000 n 0000698506 00000 n 0000359021 00000 n 0000359163 00000 n 0000698590 00000 n 0000359307 00000 n 0000359449 00000 n 0000427429 00000 n 0000359593 00000 n 0000359734 00000 n 0000427513 00000 n 0000359878 00000 n 0000360020 00000 n 0000581303 00000 n 0000360164 00000 n 0000360306 00000 n 0000581387 00000 n 0000360450 00000 n 0000360592 00000 n 0000581471 00000 n 0000360736 00000 n 0000360877 00000 n 0000361020 00000 n 0000361103 00000 n 0000361243 00000 n 0000361385 00000 n 0000378049 00000 n 0000381149 00000 n 0000378073 00000 n 0000381378 00000 n 0000383547 00000 n 0000381401 00000 n 0000383776 00000 n 0000387289 00000 n 0000383799 00000 n 0000383883 00000 n 0000387258 00000 n 0000384024 00000 n 0000387537 00000 n 0000390479 00000 n 0000387560 00000 n 0000390708 00000 n 0000393877 00000 n 0000390731 00000 n 0000394106 00000 n 0000398053 00000 n 0000394129 00000 n 0000397923 00000 n 0000394269 00000 n 0000394409 00000 n 0000394549 00000 n 0000394691 00000 n 0000394832 00000 n 0001000247 00000 n 0000394975 00000 n 0000395117 00000 n 0000395261 00000 n 0000395401 00000 n 0000940680 00000 n 0000395544 00000 n 0000395686 00000 n 0000395830 00000 n 0000398301 00000 n 0000400888 00000 n 0000398324 00000 n 0000401117 00000 n 0000403495 00000 n 0000401140 00000 n 0000403724 00000 n 0000407363 00000 n 0000451900 00000 n 0000403995 00000 n 0000407332 00000 n 0000404139 00000 n 0000407611 00000 n 0000412508 00000 n 0000407634 00000 n 0000407730 00000 n 0000412414 00000 n 0000407873 00000 n 0000408017 00000 n 0000408158 00000 n 0000408263 00000 n 0000408407 00000 n 0000408551 00000 n 0000408692 00000 n 0000408765 00000 n 0000408909 00000 n 0000409053 00000 n 0000412756 00000 n 0000416240 00000 n 0000412779 00000 n 0000412863 00000 n 0000416182 00000 n 0000413005 00000 n 0000413104 00000 n 0000413248 00000 n 0000413392 00000 n 0000413533 00000 n 0000416488 00000 n 0000425928 00000 n 0000931760 00000 n 0000416511 00000 n 0000425618 00000 n 0000416653 00000 n 0000931844 00000 n 0000416793 00000 n 0000416935 00000 n 0000417075 00000 n 0000417159 00000 n 0000417301 00000 n 0001126811 00000 n 0000417443 00000 n 0000417585 00000 n 0000940764 00000 n 0000417729 00000 n 0000417870 00000 n 0000418014 00000 n 0000418098 00000 n 0000418240 00000 n 0001147248 00000 n 0000418384 00000 n 0000418526 00000 n 0001147332 00000 n 0000418670 00000 n 0000418812 00000 n 0001147416 00000 n 0000418956 00000 n 0000419098 00000 n 0001147499 00000 n 0000419242 00000 n 0000419384 00000 n 0000419528 00000 n 0000419670 00000 n 0000451984 00000 n 0000419814 00000 n 0000419956 00000 n 0000452067 00000 n 0000420100 00000 n 0000420242 00000 n 0000452151 00000 n 0000420386 00000 n 0000420528 00000 n 0000420672 00000 n 0000420756 00000 n 0000420898 00000 n 0000459571 00000 n 0000421042 00000 n 0000421183 00000 n 0000421327 00000 n 0000426176 00000 n 0000426589 00000 n 0000426199 00000 n 0000426818 00000 n 0000427178 00000 n 0000426840 00000 n 0000427407 00000 n 0000430426 00000 n 0000518924 00000 n 0000427597 00000 n 0000430377 00000 n 0000427741 00000 n 0000427883 00000 n 0000428023 00000 n 0000430674 00000 n 0000434819 00000 n 0000430697 00000 n 0000435048 00000 n 0000437306 00000 n 0000435071 00000 n 0000435155 00000 n 0000437257 00000 n 0000435297 00000 n 0000435383 00000 n 0000435525 00000 n 0000435594 00000 n 0000435736 00000 n 0000437554 00000 n 0000440894 00000 n 0000437577 00000 n 0000441123 00000 n 0000443511 00000 n 0000441146 00000 n 0000443740 00000 n 0000446493 00000 n 0000443763 00000 n 0000446722 00000 n 0000448735 00000 n 0000446745 00000 n 0000448677 00000 n 0000446887 00000 n 0000446971 00000 n 0000447112 00000 n 0000447254 00000 n 0000447396 00000 n 0000448983 00000 n 0000451648 00000 n 0000449006 00000 n 0000451877 00000 n 0000459300 00000 n 0000452235 00000 n 0000459089 00000 n 0000452374 00000 n 0000452516 00000 n 0000452574 00000 n 0000452718 00000 n 0000452862 00000 n 0000452945 00000 n 0000453089 00000 n 0000453233 00000 n 0000453306 00000 n 0000453450 00000 n 0000453594 00000 n 0000453661 00000 n 0000453805 00000 n 0000453949 00000 n 0000454029 00000 n 0000454171 00000 n 0000454313 00000 n 0000454397 00000 n 0000454540 00000 n 0000454683 00000 n 0000454826 00000 n 0000454907 00000 n 0000455049 00000 n 0000455191 00000 n 0000455277 00000 n 0000455419 00000 n 0000455558 00000 n 0000455646 00000 n 0000455788 00000 n 0000455930 00000 n 0000459548 00000 n 0000462996 00000 n 0000459655 00000 n 0000459729 00000 n 0000462938 00000 n 0000459870 00000 n 0000460014 00000 n 0000460158 00000 n 0000460302 00000 n 0000463244 00000 n 0000466082 00000 n 0000463267 00000 n 0000466051 00000 n 0000463410 00000 n 0000466330 00000 n 0000469303 00000 n 0000466353 00000 n 0000469254 00000 n 0000466495 00000 n 0000466636 00000 n 0000466774 00000 n 0000469551 00000 n 0000470011 00000 n 0000469574 00000 n 0000470240 00000 n 0000473098 00000 n 0000470262 00000 n 0000473327 00000 n 0000476220 00000 n 0000473350 00000 n 0000476189 00000 n 0000473493 00000 n 0000476468 00000 n 0000479319 00000 n 0000476491 00000 n 0000479270 00000 n 0000476633 00000 n 0000476775 00000 n 0000476915 00000 n 0000479567 00000 n 0000480458 00000 n 0000479590 00000 n 0000480687 00000 n 0000484384 00000 n 0000480709 00000 n 0000484613 00000 n 0000487275 00000 n 0000484636 00000 n 0000487504 00000 n 0000490223 00000 n 0000487527 00000 n 0000490452 00000 n 0000493086 00000 n 0000490475 00000 n 0000493315 00000 n 0000496060 00000 n 0000493338 00000 n 0000496289 00000 n 0000501064 00000 n 0000496395 00000 n 0000500970 00000 n 0000496537 00000 n 0000496621 00000 n 0000496761 00000 n 0000496848 00000 n 0000496992 00000 n 0000497136 00000 n 0000497277 00000 n 0000497419 00000 n 0000497559 00000 n 0000497643 00000 n 0000497784 00000 n 0000501312 00000 n 0000504802 00000 n 0000501335 00000 n 0000504771 00000 n 0000501479 00000 n 0000505050 00000 n 0000508516 00000 n 0000505073 00000 n 0000508458 00000 n 0000505215 00000 n 0000505357 00000 n 0000505501 00000 n 0000505645 00000 n 0000508764 00000 n 0000511904 00000 n 0000508787 00000 n 0000512133 00000 n 0000514685 00000 n 0000512156 00000 n 0000514645 00000 n 0000512298 00000 n 0000512437 00000 n 0000514933 00000 n 0000518653 00000 n 0000515122 00000 n 0000515206 00000 n 0000518622 00000 n 0000515349 00000 n 0000518901 00000 n 0000522936 00000 n 0000519008 00000 n 0000522869 00000 n 0000533659 00000 n 0000519146 00000 n 0000519288 00000 n 0000519427 00000 n 0000519568 00000 n 0000519707 00000 n 0000523184 00000 n 0000526157 00000 n 0000543196 00000 n 0000523207 00000 n 0000526126 00000 n 0000523348 00000 n 0000526405 00000 n 0000528776 00000 n 0000526428 00000 n 0000529005 00000 n 0000530520 00000 n 0000529028 00000 n 0000530749 00000 n 0000533057 00000 n 0000530772 00000 n 0000533026 00000 n 0000530914 00000 n 0000533305 00000 n 0000538390 00000 n 0000533743 00000 n 0000533827 00000 n 0000538278 00000 n 0000533971 00000 n 0000534112 00000 n 0000534253 00000 n 0000534397 00000 n 0000534538 00000 n 0000534681 00000 n 0000534825 00000 n 0000534911 00000 n 0000535055 00000 n 0000535199 00000 n 0000535343 00000 n 0000538638 00000 n 0000540947 00000 n 0000538661 00000 n 0000538745 00000 n 0000540916 00000 n 0000538889 00000 n 0000541195 00000 n 0000542944 00000 n 0000541218 00000 n 0000543173 00000 n 0000546675 00000 n 0000543280 00000 n 0000543339 00000 n 0000546626 00000 n 0000543483 00000 n 0000543627 00000 n 0000543711 00000 n 0000543848 00000 n 0000546923 00000 n 0000550929 00000 n 0000547195 00000 n 0000547279 00000 n 0000550853 00000 n 0000887787 00000 n 0000547423 00000 n 0000547567 00000 n 0000547711 00000 n 0000547795 00000 n 0000547937 00000 n 0000548081 00000 n 0000548165 00000 n 0000548306 00000 n 0000551177 00000 n 0000554830 00000 n 0000876815 00000 n 0000551283 00000 n 0000554790 00000 n 0000551427 00000 n 0000551571 00000 n 0000555078 00000 n 0000557906 00000 n 0000555101 00000 n 0000557857 00000 n 0000555243 00000 n 0000555387 00000 n 0000555471 00000 n 0000555615 00000 n 0000558154 00000 n 0000560091 00000 n 0000558177 00000 n 0000560320 00000 n 0000563243 00000 n 0000560343 00000 n 0000563176 00000 n 0000560487 00000 n 0000560571 00000 n 0000560715 00000 n 0000560857 00000 n 0000560998 00000 n 0000561138 00000 n 0000563491 00000 n 0000567774 00000 n 0000563928 00000 n 0000567680 00000 n 0000564069 00000 n 0000564210 00000 n 0000564350 00000 n 0000564491 00000 n 0000564630 00000 n 0000564770 00000 n 0000564910 00000 n 0000564994 00000 n 0000565138 00000 n 0000568022 00000 n 0000572063 00000 n 0000568045 00000 n 0000571987 00000 n 0000568186 00000 n 0000568329 00000 n 0000568472 00000 n 0000568612 00000 n 0000568754 00000 n 0000568892 00000 n 0000572311 00000 n 0000576166 00000 n 0000572334 00000 n 0000576090 00000 n 0000572475 00000 n 0000572618 00000 n 0000572761 00000 n 0000572901 00000 n 0000573044 00000 n 0000573184 00000 n 0000576414 00000 n 0000581032 00000 n 0000576851 00000 n 0000580965 00000 n 0000576994 00000 n 0000577137 00000 n 0000577277 00000 n 0000577361 00000 n 0000577503 00000 n 0000577645 00000 n 0000581280 00000 n 0000585769 00000 n 0000581555 00000 n 0000585675 00000 n 0000581697 00000 n 0000581839 00000 n 0000581923 00000 n 0001154470 00000 n 0000582067 00000 n 0000582211 00000 n 0000582355 00000 n 0000582496 00000 n 0000582638 00000 n 0000582780 00000 n 0000586017 00000 n 0000586477 00000 n 0000586040 00000 n 0000586706 00000 n 0000588147 00000 n 0000586728 00000 n 0000588116 00000 n 0000586870 00000 n 0000588395 00000 n 0000590955 00000 n 0000588418 00000 n 0000588509 00000 n 0000590915 00000 n 0000588653 00000 n 0000588797 00000 n 0000591203 00000 n 0000595353 00000 n 0000591226 00000 n 0000595582 00000 n 0000600329 00000 n 0000595688 00000 n 0000595765 00000 n 0000600262 00000 n 0000595909 00000 n 0000596053 00000 n 0000596194 00000 n 0000596278 00000 n 0000596422 00000 n 0000596506 00000 n 0000596648 00000 n 0000600577 00000 n 0000604225 00000 n 0000600600 00000 n 0000604131 00000 n 0000600744 00000 n 0000600885 00000 n 0000600969 00000 n 0000601111 00000 n 0000601252 00000 n 0000601394 00000 n 0000601478 00000 n 0000601620 00000 n 0000601762 00000 n 0000601904 00000 n 0000604473 00000 n 0000607130 00000 n 0000604496 00000 n 0000607045 00000 n 0000604638 00000 n 0000607401 00000 n 0000604780 00000 n 0000610380 00000 n 0000604922 00000 n 0000605064 00000 n 0000605205 00000 n 0000605347 00000 n 0000605489 00000 n 0000607378 00000 n 0000610109 00000 n 0000607485 00000 n 0000610042 00000 n 0000607627 00000 n 0000607769 00000 n 0000607911 00000 n 0000608053 00000 n 0000608195 00000 n 0000610357 00000 n 0000613062 00000 n 0000610464 00000 n 0000612986 00000 n 0000610606 00000 n 0000610748 00000 n 0000610889 00000 n 0000611031 00000 n 0000611173 00000 n 0000611315 00000 n 0000613310 00000 n 0000616831 00000 n 0000613333 00000 n 0000613404 00000 n 0000616791 00000 n 0000613548 00000 n 0000613688 00000 n 0000617079 00000 n 0000619916 00000 n 0000617102 00000 n 0000619885 00000 n 0000617245 00000 n 0000620164 00000 n 0000623076 00000 n 0000620187 00000 n 0000623305 00000 n 0000625171 00000 n 0000623328 00000 n 0000625400 00000 n 0000627822 00000 n 0000625423 00000 n 0000628051 00000 n 0000631652 00000 n 0000628074 00000 n 0000628158 00000 n 0000631621 00000 n 0000628302 00000 n 0000631900 00000 n 0000634680 00000 n 0000631923 00000 n 0000634909 00000 n 0000636845 00000 n 0000634932 00000 n 0000637074 00000 n 0000639977 00000 n 0000637097 00000 n 0000640206 00000 n 0000642635 00000 n 0000640229 00000 n 0000642864 00000 n 0000645310 00000 n 0000642887 00000 n 0000645539 00000 n 0000648015 00000 n 0000840151 00000 n 0000645728 00000 n 0000647984 00000 n 0000645869 00000 n 0000648263 00000 n 0000653269 00000 n 0000648537 00000 n 0000653139 00000 n 0000648678 00000 n 0000648819 00000 n 0000648896 00000 n 0000649038 00000 n 0000649180 00000 n 0000649318 00000 n 0000649460 00000 n 0000649601 00000 n 0000649742 00000 n 0000649884 00000 n 0000650026 00000 n 0000650164 00000 n 0000650308 00000 n 0000653517 00000 n 0000656581 00000 n 0000656852 00000 n 0000653540 00000 n 0000656532 00000 n 0000653682 00000 n 0000653821 00000 n 0000653962 00000 n 0000656829 00000 n 0000659190 00000 n 0000656936 00000 n 0000659159 00000 n 0000657077 00000 n 0000659438 00000 n 0000663273 00000 n 0000659876 00000 n 0000663197 00000 n 0000660020 00000 n 0000660164 00000 n 0000890713 00000 n 0000660304 00000 n 0000660446 00000 n 0000660530 00000 n 0000660672 00000 n 0000660813 00000 n 0000663521 00000 n 0000667312 00000 n 0000663793 00000 n 0000667272 00000 n 0000892859 00000 n 0000663937 00000 n 0000664081 00000 n 0000667560 00000 n 0000670885 00000 n 0000667583 00000 n 0000670845 00000 n 0000850685 00000 n 0000667727 00000 n 0000667869 00000 n 0000671133 00000 n 0000673263 00000 n 0000671156 00000 n 0000673492 00000 n 0000675518 00000 n 0000673515 00000 n 0000675747 00000 n 0000678598 00000 n 0000675770 00000 n 0000675854 00000 n 0000678558 00000 n 0000675998 00000 n 0000676140 00000 n 0000678846 00000 n 0000683134 00000 n 0000678952 00000 n 0000683049 00000 n 0000679096 00000 n 0000679238 00000 n 0000679342 00000 n 0000679486 00000 n 0000679630 00000 n 0000679771 00000 n 0000679915 00000 n 0000679999 00000 n 0000680143 00000 n 0000683382 00000 n 0000687385 00000 n 0000683654 00000 n 0000683738 00000 n 0000687300 00000 n 0000683882 00000 n 0000684025 00000 n 0000684168 00000 n 0000684312 00000 n 0000684454 00000 n 0000684598 00000 n 0000684740 00000 n 0000687633 00000 n 0000693197 00000 n 0000687989 00000 n 0000693067 00000 n 0000688132 00000 n 0000688276 00000 n 0000688420 00000 n 0000688561 00000 n 0000688705 00000 n 0000688849 00000 n 0000688993 00000 n 0000689137 00000 n 0000689281 00000 n 0000836933 00000 n 0000689423 00000 n 0000689565 00000 n 0000689649 00000 n 0000689793 00000 n 0000693445 00000 n 0000698067 00000 n 0000693719 00000 n 0000697964 00000 n 0000693860 00000 n 0000694002 00000 n 0000694146 00000 n 0000694288 00000 n 0000694372 00000 n 0000694514 00000 n 0000694574 00000 n 0000694718 00000 n 0000694862 00000 n 0000695002 00000 n 0000695140 00000 n 0000698315 00000 n 0000701546 00000 n 0000698674 00000 n 0000701497 00000 n 0000698816 00000 n 0000698958 00000 n 0000699042 00000 n 0000699186 00000 n 0000701794 00000 n 0000704263 00000 n 0000701817 00000 n 0000704492 00000 n 0000706137 00000 n 0000704515 00000 n 0000706106 00000 n 0000704659 00000 n 0000706385 00000 n 0000707850 00000 n 0000706408 00000 n 0000707792 00000 n 0000706550 00000 n 0000706691 00000 n 0000706833 00000 n 0000706975 00000 n 0000708098 00000 n 0000711003 00000 n 0000708120 00000 n 0000711232 00000 n 0000713913 00000 n 0000711255 00000 n 0000714142 00000 n 0000717713 00000 n 0000714165 00000 n 0000714249 00000 n 0000717682 00000 n 0000714393 00000 n 0000717961 00000 n 0000720754 00000 n 0000717984 00000 n 0000720983 00000 n 0000724608 00000 n 0000721006 00000 n 0000724837 00000 n 0000728187 00000 n 0000724860 00000 n 0000728416 00000 n 0000729378 00000 n 0000728439 00000 n 0000729338 00000 n 0000728581 00000 n 0000728723 00000 n 0000729626 00000 n 0000734727 00000 n 0000729648 00000 n 0000729712 00000 n 0000734642 00000 n 0000729853 00000 n 0000729995 00000 n 0000730079 00000 n 0000730223 00000 n 0000730365 00000 n 0000730459 00000 n 0000730534 00000 n 0000730678 00000 n 0000730822 00000 n 0000730963 00000 n 0000734975 00000 n 0000737984 00000 n 0000734998 00000 n 0000738213 00000 n 0000742125 00000 n 0000738236 00000 n 0000738338 00000 n 0000742085 00000 n 0000738482 00000 n 0000738626 00000 n 0000742373 00000 n 0000747163 00000 n 0000742645 00000 n 0000747078 00000 n 0000742789 00000 n 0000742929 00000 n 0000743073 00000 n 0000743215 00000 n 0000743282 00000 n 0000743426 00000 n 0000743570 00000 n 0000743654 00000 n 0000743796 00000 n 0000747411 00000 n 0000749545 00000 n 0000911926 00000 n 0000747434 00000 n 0000749469 00000 n 0000747576 00000 n 0000747660 00000 n 0000747802 00000 n 0000747886 00000 n 0000748028 00000 n 0000748170 00000 n 0000748312 00000 n 0000748454 00000 n 0000749793 00000 n 0000753349 00000 n 0000749815 00000 n 0000753291 00000 n 0000749956 00000 n 0000750040 00000 n 0000750181 00000 n 0000750322 00000 n 0000750463 00000 n 0000753597 00000 n 0000757086 00000 n 0000753620 00000 n 0000757010 00000 n 0000753762 00000 n 0000753904 00000 n 0000754046 00000 n 0000754187 00000 n 0000754329 00000 n 0000754471 00000 n 0000757334 00000 n 0000760426 00000 n 0000757357 00000 n 0000760655 00000 n 0000762809 00000 n 0000760678 00000 n 0000762733 00000 n 0000760820 00000 n 0000760962 00000 n 0000761104 00000 n 0000761245 00000 n 0000761387 00000 n 0000761529 00000 n 0000763057 00000 n 0000766153 00000 n 0000763080 00000 n 0000763192 00000 n 0000766077 00000 n 0000763336 00000 n 0000763480 00000 n 0000763621 00000 n 0000763763 00000 n 0000763905 00000 n 0000764047 00000 n 0000766401 00000 n 0000768193 00000 n 0000766424 00000 n 0000768162 00000 n 0000766566 00000 n 0000768441 00000 n 0000779260 00000 n 0000768464 00000 n 0000778914 00000 n 0000768604 00000 n 0000768746 00000 n 0000768885 00000 n 0000769026 00000 n 0000769087 00000 n 0000769231 00000 n 0000769375 00000 n 0000769460 00000 n 0000769604 00000 n 0000769748 00000 n 0000769889 00000 n 0000769950 00000 n 0000770094 00000 n 0000770238 00000 n 0000770379 00000 n 0000770447 00000 n 0000770591 00000 n 0000770735 00000 n 0000770798 00000 n 0000770942 00000 n 0000771086 00000 n 0000771145 00000 n 0000771288 00000 n 0000771432 00000 n 0000771508 00000 n 0000771652 00000 n 0000771796 00000 n 0000771936 00000 n 0000772015 00000 n 0000772159 00000 n 0000772303 00000 n 0000772444 00000 n 0000772517 00000 n 0000772661 00000 n 0000772805 00000 n 0000772863 00000 n 0000773007 00000 n 0000773148 00000 n 0000773292 00000 n 0000773376 00000 n 0000773518 00000 n 0000773661 00000 n 0000773804 00000 n 0000773888 00000 n 0000774031 00000 n 0000774171 00000 n 0000774253 00000 n 0000774395 00000 n 0000774535 00000 n 0000779508 00000 n 0000783554 00000 n 0000779613 00000 n 0000783523 00000 n 0000779754 00000 n 0000783802 00000 n 0000787169 00000 n 0000783825 00000 n 0000787102 00000 n 0000783967 00000 n 0000784109 00000 n 0000784251 00000 n 0000784393 00000 n 0000784537 00000 n 0000787417 00000 n 0000790848 00000 n 0000787440 00000 n 0000787524 00000 n 0000790763 00000 n 0000787666 00000 n 0000787808 00000 n 0000787950 00000 n 0000788092 00000 n 0000788234 00000 n 0000788376 00000 n 0000788518 00000 n 0000791096 00000 n 0000794234 00000 n 0000791119 00000 n 0000791214 00000 n 0000794176 00000 n 0000791358 00000 n 0000791499 00000 n 0000791641 00000 n 0000791782 00000 n 0000794482 00000 n 0000828205 00000 n 0000794505 00000 n 0000827139 00000 n 0000794647 00000 n 0000794791 00000 n 0000794933 00000 n 0000795077 00000 n 0000795219 00000 n 0000795363 00000 n 0000795505 00000 n 0000795649 00000 n 0000795791 00000 n 0000795935 00000 n 0000796077 00000 n 0000796221 00000 n 0000796362 00000 n 0000796505 00000 n 0000796647 00000 n 0000796791 00000 n 0000796932 00000 n 0000797076 00000 n 0000797218 00000 n 0000797362 00000 n 0000797504 00000 n 0000797648 00000 n 0000797790 00000 n 0000797934 00000 n 0000798076 00000 n 0000798220 00000 n 0000798362 00000 n 0000798506 00000 n 0000798648 00000 n 0000798792 00000 n 0000798934 00000 n 0000799078 00000 n 0000799220 00000 n 0000799364 00000 n 0000799506 00000 n 0000799650 00000 n 0000799792 00000 n 0000799936 00000 n 0000800078 00000 n 0000800222 00000 n 0000800364 00000 n 0000800508 00000 n 0000800650 00000 n 0000800794 00000 n 0000800936 00000 n 0000801080 00000 n 0000801222 00000 n 0000801366 00000 n 0000801506 00000 n 0000801650 00000 n 0000801792 00000 n 0000801936 00000 n 0000802078 00000 n 0000802222 00000 n 0000802364 00000 n 0000802508 00000 n 0000802649 00000 n 0000802793 00000 n 0000802935 00000 n 0000803079 00000 n 0000803221 00000 n 0000803365 00000 n 0000803506 00000 n 0000803650 00000 n 0000803792 00000 n 0000803936 00000 n 0000804078 00000 n 0000804222 00000 n 0000804364 00000 n 0000804508 00000 n 0000804650 00000 n 0000804794 00000 n 0000804936 00000 n 0000805080 00000 n 0000805222 00000 n 0000805366 00000 n 0000805507 00000 n 0000805651 00000 n 0000805793 00000 n 0000805937 00000 n 0000806021 00000 n 0000806163 00000 n 0000806307 00000 n 0000806449 00000 n 0000806593 00000 n 0000806733 00000 n 0000806877 00000 n 0000807017 00000 n 0000807161 00000 n 0000807301 00000 n 0000807445 00000 n 0000807586 00000 n 0000807730 00000 n 0000807871 00000 n 0000808015 00000 n 0000808099 00000 n 0000808241 00000 n 0000808385 00000 n 0000808526 00000 n 0000808670 00000 n 0000808811 00000 n 0000808955 00000 n 0000809096 00000 n 0000809240 00000 n 0000809381 00000 n 0000809525 00000 n 0000809609 00000 n 0000809750 00000 n 0000809894 00000 n 0000809978 00000 n 0000810120 00000 n 0000810264 00000 n 0000810348 00000 n 0000810490 00000 n 0000810634 00000 n 0000810718 00000 n 0000810859 00000 n 0000811002 00000 n 0000811086 00000 n 0000811226 00000 n 0000811368 00000 n 0000811452 00000 n 0000811592 00000 n 0000811734 00000 n 0000828453 00000 n 0000832400 00000 n 0000828477 00000 n 0000828550 00000 n 0000832324 00000 n 0000828694 00000 n 0000828838 00000 n 0000828979 00000 n 0000829120 00000 n 0000829262 00000 n 0000829402 00000 n 0000832648 00000 n 0000836662 00000 n 0000832671 00000 n 0000836568 00000 n 0000832813 00000 n 0000832955 00000 n 0000833099 00000 n 0000833240 00000 n 0000833382 00000 n 0000833524 00000 n 0000833668 00000 n 0000833812 00000 n 0000836910 00000 n 0000839880 00000 n 0000837017 00000 n 0000837101 00000 n 0000839849 00000 n 0000837243 00000 n 0000840128 00000 n 0000843649 00000 n 0000840235 00000 n 0000843600 00000 n 0000840377 00000 n 0000850601 00000 n 0000840518 00000 n 0000840659 00000 n 0000843897 00000 n 0000847078 00000 n 0000843920 00000 n 0000847038 00000 n 0000844064 00000 n 0000844206 00000 n 0000847326 00000 n 0000850330 00000 n 0000847349 00000 n 0000850281 00000 n 0000847493 00000 n 0000847635 00000 n 0000847775 00000 n 0000850578 00000 n 0000853699 00000 n 0000850769 00000 n 0000853650 00000 n 0000850911 00000 n 0000851053 00000 n 0000851195 00000 n 0000853947 00000 n 0000855571 00000 n 0000853970 00000 n 0000855540 00000 n 0000854110 00000 n 0000855819 00000 n 0000857907 00000 n 0000855842 00000 n 0000857849 00000 n 0000855985 00000 n 0000856125 00000 n 0000856194 00000 n 0000856335 00000 n 0000856477 00000 n 0000858155 00000 n 0000862773 00000 n 0000858514 00000 n 0000862643 00000 n 0000858657 00000 n 0000858799 00000 n 0000858941 00000 n 0000859080 00000 n 0000859224 00000 n 0000859366 00000 n 0000859508 00000 n 0000868215 00000 n 0000859652 00000 n 0000859793 00000 n 0000859937 00000 n 0000860079 00000 n 0000860163 00000 n 0000860305 00000 n 0000863021 00000 n 0000867944 00000 n 0000863210 00000 n 0000867850 00000 n 0000863354 00000 n 0000882195 00000 n 0000863497 00000 n 0000863641 00000 n 0000863785 00000 n 0000863929 00000 n 0000864073 00000 n 0000864217 00000 n 0000864361 00000 n 0000868192 00000 n 0000870457 00000 n 0000868299 00000 n 0000870417 00000 n 0000868441 00000 n 0000868585 00000 n 0000870705 00000 n 0000873374 00000 n 0000870728 00000 n 0000870791 00000 n 0000873334 00000 n 0000870933 00000 n 0000871075 00000 n 0000873622 00000 n 0000876563 00000 n 0000873645 00000 n 0000876792 00000 n 0000879017 00000 n 0000876899 00000 n 0000876983 00000 n 0000878977 00000 n 0000877125 00000 n 0000877265 00000 n 0000879265 00000 n 0000881924 00000 n 0000879288 00000 n 0000879372 00000 n 0000881884 00000 n 0000879514 00000 n 0000879655 00000 n 0000882172 00000 n 0000884816 00000 n 0000882279 00000 n 0000884776 00000 n 0000882423 00000 n 0000882567 00000 n 0000885064 00000 n 0000887516 00000 n 0000885087 00000 n 0000887476 00000 n 0000885229 00000 n 0000885369 00000 n 0000887764 00000 n 0000890442 00000 n 0000887871 00000 n 0000890375 00000 n 0000888013 00000 n 0000888097 00000 n 0000888239 00000 n 0000888381 00000 n 0000888524 00000 n 0000888665 00000 n 0000890690 00000 n 0000892588 00000 n 0000890797 00000 n 0000892557 00000 n 0000890939 00000 n 0000892836 00000 n 0000895634 00000 n 0000892943 00000 n 0000895576 00000 n 0000893085 00000 n 0000893228 00000 n 0000893369 00000 n 0000893510 00000 n 0000895882 00000 n 0000896465 00000 n 0000895905 00000 n 0000896694 00000 n 0000897265 00000 n 0000896716 00000 n 0000897494 00000 n 0000902092 00000 n 0000897682 00000 n 0000901980 00000 n 0000897824 00000 n 0000897965 00000 n 0000898049 00000 n 0000898191 00000 n 0000898334 00000 n 0000898475 00000 n 0000898616 00000 n 0000898757 00000 n 0000898898 00000 n 0000899038 00000 n 0000899176 00000 n 0000902340 00000 n 0000907584 00000 n 0000902614 00000 n 0000907490 00000 n 0000902758 00000 n 0000902902 00000 n 0000903044 00000 n 0000903186 00000 n 0000903328 00000 n 0000903472 00000 n 0000903616 00000 n 0000903760 00000 n 0000907832 00000 n 0000911674 00000 n 0000907855 00000 n 0000911903 00000 n 0000915787 00000 n 0000912010 00000 n 0000915738 00000 n 0000912154 00000 n 0000912296 00000 n 0000912380 00000 n 0000912524 00000 n 0000916035 00000 n 0000919628 00000 n 0000916058 00000 n 0000919857 00000 n 0000922479 00000 n 0000919880 00000 n 0000922708 00000 n 0000925735 00000 n 0000922731 00000 n 0000925704 00000 n 0000922875 00000 n 0000925983 00000 n 0000928764 00000 n 0000926006 00000 n 0000928993 00000 n 0000931508 00000 n 0000929016 00000 n 0000931737 00000 n 0000936781 00000 n 0000931927 00000 n 0000936705 00000 n 0000932070 00000 n 0000932148 00000 n 0000932292 00000 n 0000932436 00000 n 0000932577 00000 n 0000932661 00000 n 0000932801 00000 n 0000932941 00000 n 0000937029 00000 n 0000940409 00000 n 0000937052 00000 n 0000937136 00000 n 0000940369 00000 n 0000937280 00000 n 0000937424 00000 n 0000940657 00000 n 0000947366 00000 n 0000940848 00000 n 0000947308 00000 n 0000940992 00000 n 0000941134 00000 n 0000941275 00000 n 0000941419 00000 n 0000947614 00000 n 0000949294 00000 n 0000947637 00000 n 0000949523 00000 n 0000950985 00000 n 0000949546 00000 n 0000950945 00000 n 0000949688 00000 n 0000949830 00000 n 0000951233 00000 n 0000954207 00000 n 0000951256 00000 n 0000954176 00000 n 0000951400 00000 n 0000954455 00000 n 0000958600 00000 n 0000954727 00000 n 0000958533 00000 n 0000954871 00000 n 0000954955 00000 n 0000955097 00000 n 0000955181 00000 n 0000955325 00000 n 0000955466 00000 n 0000955605 00000 n 0000958848 00000 n 0000962622 00000 n 0000958871 00000 n 0000962564 00000 n 0000959015 00000 n 0000959159 00000 n 0000959303 00000 n 0000959447 00000 n 0000962870 00000 n 0000964571 00000 n 0000962893 00000 n 0000964531 00000 n 0000963033 00000 n 0000963177 00000 n 0000964819 00000 n 0000967632 00000 n 0000964842 00000 n 0000967538 00000 n 0000964984 00000 n 0000965126 00000 n 0000965268 00000 n 0000965410 00000 n 0000965551 00000 n 0000965693 00000 n 0000965835 00000 n 0000965977 00000 n 0000967880 00000 n 0000970868 00000 n 0000967903 00000 n 0000971097 00000 n 0000973437 00000 n 0000971120 00000 n 0000973666 00000 n 0000976505 00000 n 0000973689 00000 n 0000976420 00000 n 0000973831 00000 n 0000973973 00000 n 0000974115 00000 n 0000974257 00000 n 0000974399 00000 n 0000974541 00000 n 0000974683 00000 n 0000976753 00000 n 0000980325 00000 n 0000976776 00000 n 0000980222 00000 n 0000976917 00000 n 0000977061 00000 n 0000977205 00000 n 0000977347 00000 n 0000977491 00000 n 0000977635 00000 n 0000977776 00000 n 0000977917 00000 n 0000978058 00000 n 0000980573 00000 n 0000981520 00000 n 0000980596 00000 n 0000981480 00000 n 0000980738 00000 n 0000980880 00000 n 0000981768 00000 n 0000982493 00000 n 0000981790 00000 n 0000982462 00000 n 0000981932 00000 n 0000982741 00000 n 0000986193 00000 n 0000982763 00000 n 0000982837 00000 n 0000986144 00000 n 0000982981 00000 n 0000983125 00000 n 0000983266 00000 n 0000986441 00000 n 0000999976 00000 n 0000986464 00000 n 0000999612 00000 n 0000986605 00000 n 0000986748 00000 n 0000986832 00000 n 0000986974 00000 n 0000987118 00000 n 0000987260 00000 n 0000987404 00000 n 0000987488 00000 n 0000987630 00000 n 0000987774 00000 n 0000987858 00000 n 0000988000 00000 n 0000988144 00000 n 0000988228 00000 n 0000988370 00000 n 0000988514 00000 n 0000988598 00000 n 0000988740 00000 n 0000988884 00000 n 0000988968 00000 n 0000989110 00000 n 0000989254 00000 n 0000989338 00000 n 0000989480 00000 n 0000989624 00000 n 0000989708 00000 n 0000989850 00000 n 0000989994 00000 n 0000990078 00000 n 0000990220 00000 n 0000990364 00000 n 0000990448 00000 n 0000990590 00000 n 0000990734 00000 n 0000990818 00000 n 0000990960 00000 n 0000991104 00000 n 0000991188 00000 n 0000991330 00000 n 0000991474 00000 n 0000991558 00000 n 0000991700 00000 n 0000991844 00000 n 0000991928 00000 n 0000992070 00000 n 0000992214 00000 n 0000992298 00000 n 0000992440 00000 n 0001135127 00000 n 0000992584 00000 n 0000992726 00000 n 0000992870 00000 n 0000992954 00000 n 0000993096 00000 n 0000993240 00000 n 0001000224 00000 n 0001117553 00000 n 0001000414 00000 n 0001117432 00000 n 0001000558 00000 n 0001000702 00000 n 0001000843 00000 n 0001000987 00000 n 0001001131 00000 n 0001001215 00000 n 0001001359 00000 n 0001001503 00000 n 0001001647 00000 n 0001001789 00000 n 0001001930 00000 n 0001002074 00000 n 0001117801 00000 n 0001123071 00000 n 0001117992 00000 n 0001118076 00000 n 0001122932 00000 n 0001118220 00000 n 0001118304 00000 n 0001118448 00000 n 0001118532 00000 n 0001118676 00000 n 0001118816 00000 n 0001118957 00000 n 0001119099 00000 n 0001119183 00000 n 0001119325 00000 n 0001119409 00000 n 0001119551 00000 n 0001119635 00000 n 0001119777 00000 n 0001119861 00000 n 0001120003 00000 n 0001120146 00000 n 0001120286 00000 n 0001120428 00000 n 0001123319 00000 n 0001126540 00000 n 0001123342 00000 n 0001126491 00000 n 0001131366 00000 n 0001123486 00000 n 0001123628 00000 n 0001123712 00000 n 0001123854 00000 n 0001126788 00000 n 0001131095 00000 n 0001126895 00000 n 0001131019 00000 n 0001127037 00000 n 0001127181 00000 n 0001127323 00000 n 0001127408 00000 n 0001127552 00000 n 0001127696 00000 n 0001127837 00000 n 0001131343 00000 n 0001134856 00000 n 0001131450 00000 n 0001134816 00000 n 0001131594 00000 n 0001131736 00000 n 0001135104 00000 n 0001138579 00000 n 0001135211 00000 n 0001138512 00000 n 0001135355 00000 n 0001135497 00000 n 0001135639 00000 n 0001135780 00000 n 0001135918 00000 n 0001138827 00000 n 0001142029 00000 n 0001138850 00000 n 0001138940 00000 n 0001141980 00000 n 0001139084 00000 n 0001139228 00000 n 0001139369 00000 n 0001142277 00000 n 0001144116 00000 n 0001142300 00000 n 0001144049 00000 n 0001142442 00000 n 0001142584 00000 n 0001142725 00000 n 0001142867 00000 n 0001143009 00000 n 0001144364 00000 n 0001146977 00000 n 0001144386 00000 n 0001146901 00000 n 0001144530 00000 n 0001144674 00000 n 0001144816 00000 n 0001144958 00000 n 0001145100 00000 n 0001145242 00000 n 0001147225 00000 n 0001151535 00000 n 0001147583 00000 n 0001151468 00000 n 0001147727 00000 n 0001147811 00000 n 0001147955 00000 n 0001148098 00000 n 0001148238 00000 n 0001148382 00000 n 0001151783 00000 n 0001154218 00000 n 0001151806 00000 n 0001154447 00000 n 0001158617 00000 n 0001154554 00000 n 0001154638 00000 n 0001158559 00000 n 0001154780 00000 n 0001154922 00000 n 0001155066 00000 n 0001155210 00000 n 0001158865 00000 n 0001162094 00000 n 0001158888 00000 n 0001162063 00000 n 0001159032 00000 n 0001162342 00000 n 0001165148 00000 n 0001162365 00000 n 0001165377 00000 n 0001166600 00000 n 0001165400 00000 n 0001166551 00000 n 0001165542 00000 n 0001165684 00000 n 0001165826 00000 n 0001166848 00000 n 0001169514 00000 n 0001166870 00000 n 0001169743 00000 n 0001171026 00000 n 0001169766 00000 n 0001170986 00000 n 0001169908 00000 n 0001170050 00000 n 0001171274 00000 n 0001173677 00000 n 0001171296 00000 n 0001173619 00000 n 0001171440 00000 n 0001171582 00000 n 0001171724 00000 n 0001171866 00000 n 0001173925 00000 n 0001206314 00000 n 0001173948 00000 n 0001205392 00000 n 0001174090 00000 n 0001174234 00000 n 0001174374 00000 n 0001174518 00000 n 0001174658 00000 n 0001174802 00000 n 0001174942 00000 n 0001175086 00000 n 0001175227 00000 n 0001175371 00000 n 0001175512 00000 n 0001175656 00000 n 0001175798 00000 n 0001175942 00000 n 0001176083 00000 n 0001176227 00000 n 0001176368 00000 n 0001176512 00000 n 0001176653 00000 n 0001176797 00000 n 0001176938 00000 n 0001177082 00000 n 0001177223 00000 n 0001177367 00000 n 0001177509 00000 n 0001177653 00000 n 0001177795 00000 n 0001177939 00000 n 0001178081 00000 n 0001178225 00000 n 0001178367 00000 n 0001178511 00000 n 0001178653 00000 n 0001178797 00000 n 0001178881 00000 n 0001179023 00000 n 0001179167 00000 n 0001179251 00000 n 0001179393 00000 n 0001179537 00000 n 0001179621 00000 n 0001179763 00000 n 0001179907 00000 n 0001179991 00000 n 0001180133 00000 n 0001180277 00000 n 0001180361 00000 n 0001180503 00000 n 0001180647 00000 n 0001180731 00000 n 0001180873 00000 n 0001181017 00000 n 0001181101 00000 n 0001181243 00000 n 0001181387 00000 n 0001181471 00000 n 0001181613 00000 n 0001181757 00000 n 0001181841 00000 n 0001181983 00000 n 0001182127 00000 n 0001182211 00000 n 0001182353 00000 n 0001182497 00000 n 0001182581 00000 n 0001182723 00000 n 0001182867 00000 n 0001182951 00000 n 0001183093 00000 n 0001183237 00000 n 0001183321 00000 n 0001183463 00000 n 0001183607 00000 n 0001183691 00000 n 0001183833 00000 n 0001183977 00000 n 0001184061 00000 n 0001184203 00000 n 0001184347 00000 n 0001184489 00000 n 0001184633 00000 n 0001184717 00000 n 0001184859 00000 n 0001185003 00000 n 0001185145 00000 n 0001185289 00000 n 0001185431 00000 n 0001185575 00000 n 0001185717 00000 n 0001185861 00000 n 0001186003 00000 n 0001186147 00000 n 0001186289 00000 n 0001186433 00000 n 0001186575 00000 n 0001186719 00000 n 0001186860 00000 n 0001187002 00000 n 0001187142 00000 n 0001187286 00000 n 0001187427 00000 n 0001187571 00000 n 0001187655 00000 n 0001187796 00000 n 0001187940 00000 n 0001188081 00000 n 0001188225 00000 n 0001188366 00000 n 0001188510 00000 n 0001188651 00000 n 0001188795 00000 n 0001188935 00000 n 0001189079 00000 n 0001189163 00000 n 0001189303 00000 n 0001189447 00000 n 0001189531 00000 n 0001189672 00000 n 0001189816 00000 n 0001206562 00000 n 0001206926 00000 n 0001206586 00000 n 0001207155 00000 n 0001216050 00000 n 0001207508 00000 n 0001207569 00000 n 0001215767 00000 n 0001207713 00000 n 0001207857 00000 n 0001207997 00000 n 0001208059 00000 n 0001208203 00000 n 0001208345 00000 n 0001208485 00000 n 0001208626 00000 n 0001208765 00000 n 0001208906 00000 n 0001208990 00000 n 0001209132 00000 n 0001209224 00000 n 0001209368 00000 n 0001209512 00000 n 0001209653 00000 n 0001209796 00000 n 0001209939 00000 n 0001210019 00000 n 0001210163 00000 n 0001210307 00000 n 0001210402 00000 n 0001210546 00000 n 0001210688 00000 n 0001210832 00000 n 0001210912 00000 n 0001211056 00000 n 0001211200 00000 n 0001211295 00000 n 0001211439 00000 n 0001211583 00000 n 0001211661 00000 n 0001211805 00000 n 0001211949 00000 n 0001212042 00000 n 0001212185 00000 n 0001212329 00000 n 0001212470 00000 n 0001216298 00000 n 0001217978 00000 n 0001216321 00000 n 0001218207 00000 n 0001219465 00000 n 0001218230 00000 n 0001219694 00000 n 0001221668 00000 n 0001219717 00000 n 0001221897 00000 n 0001223633 00000 n 0001221920 00000 n 0001223862 00000 n 0001225691 00000 n 0001223885 00000 n 0001225920 00000 n 0001227792 00000 n 0001225943 00000 n 0001228021 00000 n 0001231808 00000 n 0001228044 00000 n 0001228128 00000 n 0001231687 00000 n 0001228270 00000 n 0001228354 00000 n 0001228495 00000 n 0001228639 00000 n 0001228783 00000 n 0001228865 00000 n 0001229004 00000 n 0001229144 00000 n 0001229286 00000 n 0001229428 00000 n 0001229512 00000 n 0001229654 00000 n 0001229796 00000 n 0001229936 00000 n 0001232056 00000 n 0001235200 00000 n 0001232079 00000 n 0001235115 00000 n 0001232223 00000 n 0001232307 00000 n 0001232449 00000 n 0001232591 00000 n 0001232731 00000 n 0001232815 00000 n 0001232957 00000 n 0001233099 00000 n 0001233241 00000 n 0001235448 00000 n 0001235962 00000 n 0001235471 00000 n 0001236191 00000 n 0001239680 00000 n 0001236213 00000 n 0001236297 00000 n 0001236381 00000 n 0001236465 00000 n 0001239595 00000 n 0001236609 00000 n 0001236751 00000 n 0001236895 00000 n 0001236979 00000 n 0001237123 00000 n 0001237267 00000 n 0001237409 00000 n 0001237553 00000 n 0001239928 00000 n 0001243797 00000 n 0001239951 00000 n 0001240012 00000 n 0001243721 00000 n 0001240156 00000 n 0001240297 00000 n 0001240441 00000 n 0001240585 00000 n 0001240724 00000 n 0001240864 00000 n 0001244045 00000 n 0001248550 00000 n 0001244068 00000 n 0001248456 00000 n 0001244212 00000 n 0001244354 00000 n 0001244492 00000 n 0001244633 00000 n 0001244775 00000 n 0001244917 00000 n 0001245058 00000 n 0001245201 00000 n 0001248798 00000 n 0001283745 00000 n 0001248821 00000 n 0001282679 00000 n 0001248963 00000 n 0001249107 00000 n 0001249249 00000 n 0001249393 00000 n 0001249535 00000 n 0001249679 00000 n 0001249821 00000 n 0001249965 00000 n 0001250107 00000 n 0001250251 00000 n 0001250392 00000 n 0001250536 00000 n 0001250678 00000 n 0001250822 00000 n 0001250964 00000 n 0001251108 00000 n 0001251249 00000 n 0001251393 00000 n 0001251535 00000 n 0001251679 00000 n 0001251821 00000 n 0001251965 00000 n 0001252107 00000 n 0001252251 00000 n 0001252393 00000 n 0001252537 00000 n 0001252679 00000 n 0001252823 00000 n 0001252965 00000 n 0001253109 00000 n 0001253251 00000 n 0001253395 00000 n 0001253536 00000 n 0001253680 00000 n 0001253822 00000 n 0001253966 00000 n 0001254108 00000 n 0001254252 00000 n 0001254394 00000 n 0001254538 00000 n 0001254680 00000 n 0001254824 00000 n 0001254966 00000 n 0001255110 00000 n 0001255252 00000 n 0001255396 00000 n 0001255537 00000 n 0001255681 00000 n 0001255821 00000 n 0001255965 00000 n 0001256106 00000 n 0001256250 00000 n 0001256391 00000 n 0001256535 00000 n 0001256676 00000 n 0001256820 00000 n 0001256961 00000 n 0001257105 00000 n 0001257246 00000 n 0001257390 00000 n 0001257530 00000 n 0001257674 00000 n 0001257814 00000 n 0001257958 00000 n 0001258099 00000 n 0001258243 00000 n 0001258385 00000 n 0001258529 00000 n 0001258613 00000 n 0001258755 00000 n 0001258899 00000 n 0001258983 00000 n 0001259124 00000 n 0001259268 00000 n 0001259410 00000 n 0001259554 00000 n 0001259695 00000 n 0001259839 00000 n 0001259980 00000 n 0001260124 00000 n 0001260208 00000 n 0001260350 00000 n 0001260494 00000 n 0001260636 00000 n 0001260780 00000 n 0001260922 00000 n 0001261066 00000 n 0001261208 00000 n 0001261352 00000 n 0001261436 00000 n 0001261578 00000 n 0001261722 00000 n 0001261806 00000 n 0001261948 00000 n 0001262092 00000 n 0001262175 00000 n 0001262317 00000 n 0001262461 00000 n 0001262545 00000 n 0001262686 00000 n 0001262830 00000 n 0001262914 00000 n 0001263056 00000 n 0001263200 00000 n 0001263284 00000 n 0001263426 00000 n 0001263570 00000 n 0001263654 00000 n 0001263796 00000 n 0001263940 00000 n 0001264082 00000 n 0001264226 00000 n 0001264368 00000 n 0001264512 00000 n 0001264654 00000 n 0001264798 00000 n 0001264940 00000 n 0001265084 00000 n 0001265168 00000 n 0001265310 00000 n 0001265454 00000 n 0001265538 00000 n 0001265679 00000 n 0001265822 00000 n 0001265906 00000 n 0001266046 00000 n 0001266188 00000 n 0001266272 00000 n 0001266412 00000 n 0001266554 00000 n 0001283993 00000 n 0001285677 00000 n 0001284017 00000 n 0001285646 00000 n 0001284159 00000 n 0001285925 00000 n 0001288140 00000 n 0001285948 00000 n 0001288100 00000 n 0001286090 00000 n 0001286232 00000 n 0001288388 00000 n 0001292424 00000 n 0001288494 00000 n 0001292321 00000 n 0001288637 00000 n 0001288780 00000 n 0001288864 00000 n 0001289008 00000 n 0001289150 00000 n 0001289292 00000 n 0001289434 00000 n 0001289573 00000 n 0001289715 00000 n 0001289855 00000 n 0001292672 00000 n 0001293745 00000 n 0001292695 00000 n 0001293974 00000 n 0001295302 00000 n 0001293996 00000 n 0001295531 00000 n 0001296755 00000 n 0001295554 00000 n 0001296984 00000 n 0001298173 00000 n 0001297007 00000 n 0001298402 00000 n 0001299557 00000 n 0001298425 00000 n 0001299786 00000 n 0001301152 00000 n 0001299809 00000 n 0001301381 00000 n 0001302664 00000 n 0001301404 00000 n 0001302893 00000 n 0001304116 00000 n 0001302916 00000 n 0001304345 00000 n 0001305552 00000 n 0001304368 00000 n 0001305781 00000 n 0001307034 00000 n 0001305804 00000 n 0001307263 00000 n 0001308727 00000 n 0001307286 00000 n 0001308956 00000 n 0001310437 00000 n 0001308979 00000 n 0001310666 00000 n 0001312026 00000 n 0001310689 00000 n 0001312255 00000 n 0001313064 00000 n 0001312278 00000 n 0001313293 00000 n 0001315289 00000 n 0001313315 00000 n 0001315518 00000 n 0001320231 00000 n 0001315541 00000 n 0001315634 00000 n 0001320101 00000 n 0001315778 00000 n 0001315919 00000 n 0001316060 00000 n 0001316203 00000 n 0001316346 00000 n 0001316489 00000 n 0001316632 00000 n 0001316772 00000 n 0001316857 00000 n 0001317001 00000 n 0001317145 00000 n 0001317286 00000 n 0001317370 00000 n 0001317510 00000 n 0001320479 00000 n 0001323540 00000 n 0001320502 00000 n 0001323769 00000 n 0001329022 00000 n 0001323792 00000 n 0001328901 00000 n 0001323936 00000 n 0001324020 00000 n 0001324164 00000 n 0001324249 00000 n 0001324393 00000 n 0001324478 00000 n 0001324622 00000 n 0001324707 00000 n 0001324851 00000 n 0001324995 00000 n 0001325139 00000 n 0001325223 00000 n 0001325367 00000 n 0001325509 00000 n 0001325653 00000 n 0001325797 00000 n 0001329270 00000 n 0001331888 00000 n 0001329293 00000 n 0001331848 00000 n 0001329437 00000 n 0001329579 00000 n 0001332136 00000 n 0001333285 00000 n 0001332159 00000 n 0001333514 00000 n 0001367583 00000 n 0001333537 00000 n 0001366571 00000 n 0001333679 00000 n 0001333823 00000 n 0001333965 00000 n 0001334109 00000 n 0001334251 00000 n 0001334395 00000 n 0001334537 00000 n 0001334681 00000 n 0001334823 00000 n 0001334967 00000 n 0001335109 00000 n 0001335253 00000 n 0001335395 00000 n 0001335539 00000 n 0001335681 00000 n 0001335825 00000 n 0001335967 00000 n 0001336111 00000 n 0001336253 00000 n 0001336397 00000 n 0001336539 00000 n 0001336683 00000 n 0001336825 00000 n 0001336969 00000 n 0001337111 00000 n 0001337255 00000 n 0001337397 00000 n 0001337541 00000 n 0001337683 00000 n 0001337827 00000 n 0001337969 00000 n 0001338113 00000 n 0001338255 00000 n 0001338399 00000 n 0001338541 00000 n 0001338685 00000 n 0001338827 00000 n 0001338971 00000 n 0001339113 00000 n 0001339257 00000 n 0001339399 00000 n 0001339543 00000 n 0001339685 00000 n 0001339829 00000 n 0001339971 00000 n 0001340115 00000 n 0001340257 00000 n 0001340401 00000 n 0001340485 00000 n 0001340627 00000 n 0001340771 00000 n 0001340855 00000 n 0001340997 00000 n 0001341141 00000 n 0001341225 00000 n 0001341367 00000 n 0001546572 00000 n 0001341511 00000 n 0001341653 00000 n 0001341797 00000 n 0001341881 00000 n 0001342023 00000 n 0001342167 00000 n 0001342251 00000 n 0001342393 00000 n 0001342537 00000 n 0001342679 00000 n 0001342823 00000 n 0001342907 00000 n 0001343049 00000 n 0001343193 00000 n 0001343277 00000 n 0001343419 00000 n 0001343563 00000 n 0001343646 00000 n 0001343788 00000 n 0001343932 00000 n 0001344016 00000 n 0001344158 00000 n 0001344302 00000 n 0001344386 00000 n 0001344528 00000 n 0001344672 00000 n 0001344755 00000 n 0001344896 00000 n 0001345040 00000 n 0001345124 00000 n 0001345266 00000 n 0001345410 00000 n 0001345494 00000 n 0001345636 00000 n 0001345780 00000 n 0001345864 00000 n 0001346006 00000 n 0001346150 00000 n 0001346234 00000 n 0001346376 00000 n 0001346520 00000 n 0001346604 00000 n 0001346746 00000 n 0001346890 00000 n 0001346974 00000 n 0001347116 00000 n 0001347260 00000 n 0001347344 00000 n 0001347486 00000 n 0001347630 00000 n 0001347714 00000 n 0001347856 00000 n 0001367855 00000 n 0001348000 00000 n 0001348142 00000 n 0001367939 00000 n 0001348286 00000 n 0001348427 00000 n 0001368023 00000 n 0001348571 00000 n 0001348713 00000 n 0001368107 00000 n 0001348857 00000 n 0001348999 00000 n 0001550406 00000 n 0001349143 00000 n 0001349285 00000 n 0001349429 00000 n 0001349513 00000 n 0001349654 00000 n 0001349798 00000 n 0001349882 00000 n 0001350024 00000 n 0001350168 00000 n 0001350252 00000 n 0001350394 00000 n 0001378911 00000 n 0001350538 00000 n 0001350678 00000 n 0001350821 00000 n 0001350905 00000 n 0001351045 00000 n 0001351187 00000 n 0001367831 00000 n 0001371260 00000 n 0001368191 00000 n 0001371229 00000 n 0001368332 00000 n 0001371508 00000 n 0001372491 00000 n 0001371531 00000 n 0001372720 00000 n 0001373739 00000 n 0001372742 00000 n 0001373968 00000 n 0001374954 00000 n 0001373990 00000 n 0001375183 00000 n 0001376184 00000 n 0001375205 00000 n 0001376413 00000 n 0001377431 00000 n 0001376435 00000 n 0001377660 00000 n 0001378660 00000 n 0001377682 00000 n 0001378889 00000 n 0001383938 00000 n 0001378995 00000 n 0001379079 00000 n 0001383817 00000 n 0001379221 00000 n 0001379305 00000 n 0001379447 00000 n 0001379531 00000 n 0001379675 00000 n 0001379759 00000 n 0001379903 00000 n 0001379987 00000 n 0001380129 00000 n 0001380273 00000 n 0001380357 00000 n 0001380501 00000 n 0001380643 00000 n 0001380787 00000 n 0001380929 00000 n 0001381013 00000 n 0001381153 00000 n 0001384186 00000 n 0001389938 00000 n 0001384209 00000 n 0001384293 00000 n 0001389763 00000 n 0001384435 00000 n 0001384519 00000 n 0001384663 00000 n 0001384747 00000 n 0001384891 00000 n 0001385033 00000 n 0001385177 00000 n 0001385319 00000 n 0001385463 00000 n 0001385604 00000 n 0001385748 00000 n 0001385890 00000 n 0001385974 00000 n 0001386116 00000 n 0001386199 00000 n 0001386341 00000 n 0001386483 00000 n 0001386625 00000 n 0001386769 00000 n 0001386853 00000 n 0001386997 00000 n 0001387081 00000 n 0001387224 00000 n 0001390186 00000 n 0001394933 00000 n 0001390209 00000 n 0001390293 00000 n 0001394803 00000 n 0001390437 00000 n 0001390579 00000 n 0001390721 00000 n 0001390805 00000 n 0001390947 00000 n 0001391031 00000 n 0001391173 00000 n 0001391257 00000 n 0001391399 00000 n 0001391482 00000 n 0001391624 00000 n 0001391708 00000 n 0001391850 00000 n 0001391992 00000 n 0001392136 00000 n 0001392280 00000 n 0001392420 00000 n 0001395181 00000 n 0001400133 00000 n 0001395204 00000 n 0001399985 00000 n 0001395348 00000 n 0001395492 00000 n 0001395634 00000 n 0001395778 00000 n 0001395922 00000 n 0001396064 00000 n 0001396206 00000 n 0001396348 00000 n 0001396490 00000 n 0001396632 00000 n 0001396776 00000 n 0001396920 00000 n 0001397064 00000 n 0001397204 00000 n 0001400381 00000 n 0001404348 00000 n 0001400404 00000 n 0001404227 00000 n 0001400546 00000 n 0001400688 00000 n 0001400830 00000 n 0001400972 00000 n 0001401114 00000 n 0001401256 00000 n 0001401398 00000 n 0001401542 00000 n 0001401684 00000 n 0001401828 00000 n 0001401969 00000 n 0001404596 00000 n 0001409082 00000 n 0001404619 00000 n 0001408943 00000 n 0001404763 00000 n 0001404907 00000 n 0001405049 00000 n 0001405191 00000 n 0001405333 00000 n 0001405475 00000 n 0001405617 00000 n 0001405761 00000 n 0001405905 00000 n 0001406049 00000 n 0001406193 00000 n 0001406335 00000 n 0001406476 00000 n 0001409330 00000 n 0001413167 00000 n 0001409353 00000 n 0001413055 00000 n 0001409495 00000 n 0001409637 00000 n 0001409779 00000 n 0001409921 00000 n 0001410063 00000 n 0001410205 00000 n 0001410349 00000 n 0001410491 00000 n 0001410635 00000 n 0001410777 00000 n 0001413415 00000 n 0001419392 00000 n 0001413438 00000 n 0001419199 00000 n 0001413582 00000 n 0001413724 00000 n 0001413868 00000 n 0001414010 00000 n 0001414152 00000 n 0001414236 00000 n 0001414380 00000 n 0001414464 00000 n 0001414608 00000 n 0001414692 00000 n 0001414836 00000 n 0001414920 00000 n 0001415062 00000 n 0001415206 00000 n 0001415290 00000 n 0001415434 00000 n 0001415578 00000 n 0001415662 00000 n 0001415804 00000 n 0001415946 00000 n 0001416090 00000 n 0001416234 00000 n 0001416378 00000 n 0001416522 00000 n 0001416664 00000 n 0001419640 00000 n 0001424077 00000 n 0001419663 00000 n 0001423947 00000 n 0001419805 00000 n 0001419947 00000 n 0001420091 00000 n 0001420235 00000 n 0001420377 00000 n 0001420521 00000 n 0001420662 00000 n 0001420806 00000 n 0001420948 00000 n 0001421090 00000 n 0001421174 00000 n 0001421316 00000 n 0001421458 00000 n 0001424325 00000 n 0001429372 00000 n 0001424348 00000 n 0001429197 00000 n 0001424492 00000 n 0001424634 00000 n 0001424776 00000 n 0001424860 00000 n 0001425004 00000 n 0001425148 00000 n 0001425292 00000 n 0001425436 00000 n 0001425520 00000 n 0001425664 00000 n 0001425808 00000 n 0001425950 00000 n 0001426092 00000 n 0001426234 00000 n 0001426378 00000 n 0001426522 00000 n 0001426664 00000 n 0001426808 00000 n 0001426949 00000 n 0001429620 00000 n 0001434038 00000 n 0001429643 00000 n 0001429727 00000 n 0001433890 00000 n 0001429869 00000 n 0001430011 00000 n 0001430155 00000 n 0001430297 00000 n 0001430441 00000 n 0001430583 00000 n 0001430727 00000 n 0001430869 00000 n 0001431011 00000 n 0001431153 00000 n 0001431297 00000 n 0001431439 00000 n 0001431583 00000 n 0001431723 00000 n 0001434286 00000 n 0001439158 00000 n 0001434309 00000 n 0001438992 00000 n 0001434453 00000 n 0001434595 00000 n 0001434737 00000 n 0001434879 00000 n 0001435023 00000 n 0001435165 00000 n 0001435307 00000 n 0001435391 00000 n 0001435533 00000 n 0001435675 00000 n 0001435819 00000 n 0001435961 00000 n 0001436103 00000 n 0001436247 00000 n 0001436389 00000 n 0001436531 00000 n 0001436669 00000 n 0001439406 00000 n 0001444504 00000 n 0001439429 00000 n 0001444320 00000 n 0001439571 00000 n 0001439715 00000 n 0001439857 00000 n 0001439999 00000 n 0001440141 00000 n 0001440283 00000 n 0001440427 00000 n 0001440569 00000 n 0001440711 00000 n 0001440855 00000 n 0001440997 00000 n 0001441141 00000 n 0001441283 00000 n 0001441425 00000 n 0001441509 00000 n 0001441651 00000 n 0001441793 00000 n 0001441937 00000 n 0001442079 00000 n 0001444752 00000 n 0001451171 00000 n 0001444775 00000 n 0001450951 00000 n 0001444919 00000 n 0001445003 00000 n 0001445147 00000 n 0001445232 00000 n 0001445376 00000 n 0001445461 00000 n 0001445605 00000 n 0001445746 00000 n 0001445830 00000 n 0001445972 00000 n 0001446114 00000 n 0001446256 00000 n 0001446397 00000 n 0001446538 00000 n 0001446682 00000 n 0001446824 00000 n 0001446966 00000 n 0001447050 00000 n 0001447194 00000 n 0001447338 00000 n 0001447480 00000 n 0001447624 00000 n 0001447766 00000 n 0001447910 00000 n 0001448054 00000 n 0001448198 00000 n 0001448340 00000 n 0001451419 00000 n 0001456684 00000 n 0001451442 00000 n 0001456509 00000 n 0001451584 00000 n 0001451726 00000 n 0001451870 00000 n 0001451954 00000 n 0001452098 00000 n 0001452242 00000 n 0001452384 00000 n 0001452528 00000 n 0001452670 00000 n 0001452754 00000 n 0001452896 00000 n 0001453040 00000 n 0001453184 00000 n 0001453328 00000 n 0001453472 00000 n 0001453614 00000 n 0001453756 00000 n 0001453898 00000 n 0001454039 00000 n 0001456932 00000 n 0001461548 00000 n 0001456955 00000 n 0001461409 00000 n 0001457099 00000 n 0001457241 00000 n 0001457383 00000 n 0001457527 00000 n 0001457669 00000 n 0001457813 00000 n 0001457955 00000 n 0001458039 00000 n 0001458181 00000 n 0001458325 00000 n 0001458467 00000 n 0001458609 00000 n 0001458753 00000 n 0001458895 00000 n 0001461796 00000 n 0001466403 00000 n 0001461819 00000 n 0001466255 00000 n 0001461961 00000 n 0001462103 00000 n 0001462247 00000 n 0001462391 00000 n 0001462533 00000 n 0001462677 00000 n 0001462819 00000 n 0001462961 00000 n 0001463103 00000 n 0001463245 00000 n 0001463389 00000 n 0001463531 00000 n 0001463673 00000 n 0001463817 00000 n 0001466651 00000 n 0001471156 00000 n 0001466674 00000 n 0001470999 00000 n 0001466816 00000 n 0001466900 00000 n 0001467042 00000 n 0001467184 00000 n 0001467328 00000 n 0001467470 00000 n 0001467612 00000 n 0001467754 00000 n 0001467898 00000 n 0001468042 00000 n 0001468184 00000 n 0001468328 00000 n 0001468470 00000 n 0001468612 00000 n 0001468754 00000 n 0001468896 00000 n 0001471404 00000 n 0001475838 00000 n 0001471427 00000 n 0001475699 00000 n 0001471571 00000 n 0001471715 00000 n 0001471859 00000 n 0001472001 00000 n 0001472143 00000 n 0001472285 00000 n 0001472427 00000 n 0001472571 00000 n 0001472715 00000 n 0001472859 00000 n 0001473003 00000 n 0001473145 00000 n 0001473287 00000 n 0001476086 00000 n 0001480908 00000 n 0001476109 00000 n 0001480742 00000 n 0001476251 00000 n 0001476393 00000 n 0001476537 00000 n 0001476679 00000 n 0001476821 00000 n 0001476963 00000 n 0001477105 00000 n 0001477247 00000 n 0001477391 00000 n 0001477533 00000 n 0001477677 00000 n 0001477819 00000 n 0001477963 00000 n 0001478105 00000 n 0001478247 00000 n 0001478389 00000 n 0001481156 00000 n 0001486219 00000 n 0001481179 00000 n 0001486044 00000 n 0001481321 00000 n 0001481465 00000 n 0001481607 00000 n 0001481749 00000 n 0001481891 00000 n 0001482035 00000 n 0001482176 00000 n 0001482318 00000 n 0001482458 00000 n 0001482598 00000 n 0001482682 00000 n 0001482824 00000 n 0001482908 00000 n 0001483050 00000 n 0001483134 00000 n 0001483276 00000 n 0001483416 00000 n 0001483558 00000 n 0001483698 00000 n 0001483839 00000 n 0001486467 00000 n 0001491375 00000 n 0001486490 00000 n 0001486574 00000 n 0001491209 00000 n 0001486716 00000 n 0001486860 00000 n 0001487002 00000 n 0001487144 00000 n 0001487286 00000 n 0001487430 00000 n 0001487572 00000 n 0001487716 00000 n 0001487800 00000 n 0001487942 00000 n 0001488086 00000 n 0001488228 00000 n 0001488370 00000 n 0001488454 00000 n 0001488596 00000 n 0001488738 00000 n 0001488882 00000 n 0001489022 00000 n 0001491623 00000 n 0001496009 00000 n 0001491646 00000 n 0001495870 00000 n 0001491790 00000 n 0001491932 00000 n 0001492076 00000 n 0001492218 00000 n 0001492360 00000 n 0001492502 00000 n 0001492644 00000 n 0001492788 00000 n 0001492930 00000 n 0001493074 00000 n 0001493216 00000 n 0001493357 00000 n 0001493501 00000 n 0001496257 00000 n 0001502109 00000 n 0001496280 00000 n 0001501898 00000 n 0001496422 00000 n 0001496564 00000 n 0001496706 00000 n 0001496850 00000 n 0001496992 00000 n 0001497134 00000 n 0001497276 00000 n 0001497418 00000 n 0001497562 00000 n 0001497704 00000 n 0001497846 00000 n 0001497930 00000 n 0001498072 00000 n 0001498156 00000 n 0001498298 00000 n 0001498440 00000 n 0001498584 00000 n 0001498668 00000 n 0001498810 00000 n 0001498954 00000 n 0001499096 00000 n 0001499238 00000 n 0001499380 00000 n 0001499522 00000 n 0001502357 00000 n 0001507176 00000 n 0001502380 00000 n 0001507010 00000 n 0001502524 00000 n 0001502666 00000 n 0001502810 00000 n 0001502952 00000 n 0001503096 00000 n 0001503238 00000 n 0001503380 00000 n 0001503524 00000 n 0001503668 00000 n 0001503812 00000 n 0001503954 00000 n 0001504098 00000 n 0001504240 00000 n 0001504384 00000 n 0001504468 00000 n 0001504610 00000 n 0001504754 00000 n 0001507424 00000 n 0001512018 00000 n 0001507447 00000 n 0001511852 00000 n 0001507589 00000 n 0001507731 00000 n 0001507873 00000 n 0001508015 00000 n 0001508159 00000 n 0001508301 00000 n 0001508445 00000 n 0001508529 00000 n 0001508671 00000 n 0001508815 00000 n 0001508957 00000 n 0001509099 00000 n 0001509241 00000 n 0001509383 00000 n 0001509527 00000 n 0001509669 00000 n 0001509813 00000 n 0001512266 00000 n 0001513145 00000 n 0001512289 00000 n 0001513374 00000 n 0001514048 00000 n 0001513396 00000 n 0001514277 00000 n 0001532285 00000 n 0001514299 00000 n 0001531687 00000 n 0001514441 00000 n 0001514585 00000 n 0001514727 00000 n 0001514871 00000 n 0001515011 00000 n 0001515155 00000 n 0001515297 00000 n 0001515441 00000 n 0001515583 00000 n 0001515727 00000 n 0001515868 00000 n 0001516012 00000 n 0001516154 00000 n 0001516298 00000 n 0001516440 00000 n 0001516584 00000 n 0001516726 00000 n 0001516870 00000 n 0001517012 00000 n 0001517156 00000 n 0001517298 00000 n 0001517442 00000 n 0001517584 00000 n 0001517728 00000 n 0001517870 00000 n 0001518014 00000 n 0001518155 00000 n 0001518299 00000 n 0001518441 00000 n 0001518585 00000 n 0001518727 00000 n 0001518871 00000 n 0001519013 00000 n 0001519155 00000 n 0001519297 00000 n 0001519441 00000 n 0001519583 00000 n 0001519727 00000 n 0001519869 00000 n 0001520013 00000 n 0001520154 00000 n 0001520298 00000 n 0001520440 00000 n 0001520584 00000 n 0001520726 00000 n 0001520870 00000 n 0001521012 00000 n 0001521156 00000 n 0001521298 00000 n 0001521442 00000 n 0001521584 00000 n 0001521728 00000 n 0001521870 00000 n 0001522012 00000 n 0001522154 00000 n 0001522298 00000 n 0001522440 00000 n 0001522584 00000 n 0001522726 00000 n 0001522868 00000 n 0001523010 00000 n 0001523154 00000 n 0001523238 00000 n 0001523380 00000 n 0001523524 00000 n 0001532533 00000 n 0001533510 00000 n 0001532556 00000 n 0001533470 00000 n 0001532698 00000 n 0001532842 00000 n 0001533758 00000 n 0001538540 00000 n 0001533780 00000 n 0001538383 00000 n 0001533924 00000 n 0001534065 00000 n 0001534209 00000 n 0001534351 00000 n 0001534493 00000 n 0001534637 00000 n 0001534781 00000 n 0001534865 00000 n 0001535009 00000 n 0001535093 00000 n 0001535235 00000 n 0001535379 00000 n 0001535521 00000 n 0001535665 00000 n 0001535807 00000 n 0001535951 00000 n 0001536092 00000 n 0001538788 00000 n 0001543786 00000 n 0001538811 00000 n 0001543629 00000 n 0001538955 00000 n 0001539097 00000 n 0001539241 00000 n 0001539383 00000 n 0001539525 00000 n 0001539669 00000 n 0001539811 00000 n 0001539953 00000 n 0001540095 00000 n 0001540239 00000 n 0001540323 00000 n 0001540467 00000 n 0001540611 00000 n 0001540753 00000 n 0001540837 00000 n 0001540979 00000 n 0001541121 00000 n 0001544034 00000 n 0001546301 00000 n 0001544057 00000 n 0001546252 00000 n 0001544199 00000 n 0001544341 00000 n 0001544483 00000 n 0001546549 00000 n 0001550135 00000 n 0001546656 00000 n 0001546769 00000 n 0001550068 00000 n 0001546910 00000 n 0001547054 00000 n 0001547198 00000 n 0001547282 00000 n 0001547424 00000 n 0001547568 00000 n 0001550383 00000 n 0001553747 00000 n 0001550490 00000 n 0001553716 00000 n 0001550634 00000 n 0001553995 00000 n 0001561474 00000 n 0001554018 00000 n 0001554091 00000 n 0001561164 00000 n 0001554233 00000 n 0001554375 00000 n 0001554437 00000 n 0001554579 00000 n 0001554721 00000 n 0001554859 00000 n 0001554933 00000 n 0001555075 00000 n 0001555217 00000 n 0001555298 00000 n 0001555440 00000 n 0001555579 00000 n 0001555643 00000 n 0001555785 00000 n 0001555927 00000 n 0001556065 00000 n 0001556136 00000 n 0001556278 00000 n 0001556420 00000 n 0001556511 00000 n 0001556653 00000 n 0001556792 00000 n 0001556852 00000 n 0001556994 00000 n 0001557136 00000 n 0001557204 00000 n 0001557346 00000 n 0001557483 00000 n 0001557623 00000 n 0001557688 00000 n 0001557828 00000 n 0001557970 00000 n 0001558111 00000 n 0001558253 00000 n 0001558395 00000 n 0001558537 00000 n 0001558628 00000 n 0001558770 00000 n 0001558908 00000 n 0001559050 00000 n 0001559118 00000 n 0001559260 00000 n 0001559402 00000 n 0001561722 00000 n 0001567418 00000 n 0001561828 00000 n 0001567270 00000 n 0001561969 00000 n 0001562053 00000 n 0001562197 00000 n 0001562338 00000 n 0001562479 00000 n 0001562620 00000 n 0001562760 00000 n 0001562901 00000 n 0001563045 00000 n 0001563189 00000 n 0001563330 00000 n 0001563472 00000 n 0001563614 00000 n 0001563754 00000 n 0001563894 00000 n 0001567666 00000 n 0001567689 00000 n 0001567770 00000 n 0001567853 00000 n 0001567936 00000 n 0001568019 00000 n 0001568102 00000 n 0001568185 00000 n 0001568269 00000 n 0001568352 00000 n 0001568435 00000 n 0001568518 00000 n 0001568601 00000 n 0001568684 00000 n 0001568767 00000 n 0001568850 00000 n 0001568933 00000 n 0001569016 00000 n 0001569099 00000 n 0001569182 00000 n 0001569265 00000 n 0001569348 00000 n 0001569431 00000 n 0001569514 00000 n 0001569596 00000 n 0001569679 00000 n 0001569762 00000 n 0001569845 00000 n 0001569928 00000 n 0001570011 00000 n 0001570094 00000 n 0001570177 00000 n 0001570260 00000 n 0001570343 00000 n 0001570427 00000 n 0001570511 00000 n 0001570595 00000 n 0001570678 00000 n 0001570762 00000 n 0001570846 00000 n 0001570930 00000 n 0001571014 00000 n 0001571098 00000 n 0001571182 00000 n 0001571266 00000 n 0001571350 00000 n 0001571434 00000 n 0001571518 00000 n 0001571602 00000 n 0001571686 00000 n 0001571770 00000 n 0001571854 00000 n 0001571938 00000 n 0001572022 00000 n 0001572106 00000 n 0001572190 00000 n 0001572274 00000 n 0001572358 00000 n 0001572442 00000 n 0001572526 00000 n 0001572610 00000 n 0001572694 00000 n 0001572778 00000 n 0001572862 00000 n 0001572946 00000 n 0001573030 00000 n 0001573114 00000 n 0001573198 00000 n 0001573282 00000 n 0001573366 00000 n 0001573450 00000 n 0001573534 00000 n 0001573618 00000 n 0001573702 00000 n 0001573786 00000 n 0001573870 00000 n 0001573954 00000 n 0001574038 00000 n 0001574122 00000 n 0001574206 00000 n 0001574290 00000 n 0001574374 00000 n 0001574458 00000 n 0001574541 00000 n 0001574625 00000 n 0001574709 00000 n 0001574793 00000 n 0001574877 00000 n 0001574961 00000 n 0001575045 00000 n 0001575129 00000 n 0001575213 00000 n 0001575297 00000 n 0001575381 00000 n 0001575465 00000 n 0001575549 00000 n 0001575633 00000 n 0001575717 00000 n 0001575801 00000 n 0001575885 00000 n 0001575969 00000 n 0001576053 00000 n 0001576137 00000 n 0001576221 00000 n 0001576305 00000 n 0001576389 00000 n 0001576473 00000 n 0001576557 00000 n 0001576641 00000 n 0001576725 00000 n 0001576808 00000 n 0001576892 00000 n 0001576976 00000 n 0001577060 00000 n 0001577144 00000 n 0001577228 00000 n 0001577312 00000 n 0001577396 00000 n 0001577480 00000 n 0001577564 00000 n 0001577648 00000 n 0001577732 00000 n 0001577816 00000 n 0001577900 00000 n 0001577984 00000 n 0001578068 00000 n 0001578152 00000 n 0001578236 00000 n 0001578320 00000 n 0001578404 00000 n 0001578488 00000 n 0001578572 00000 n 0001578656 00000 n 0001578740 00000 n 0001578824 00000 n 0001578908 00000 n 0001578992 00000 n 0001579076 00000 n 0001579160 00000 n 0001579244 00000 n 0001727835 00000 n 0001579328 00000 n 0001579423 00000 n 0001579506 00000 n 0001579620 00000 n 0001579767 00000 n 0001579939 00000 n 0001580159 00000 n 0001580331 00000 n 0001580540 00000 n 0001580760 00000 n 0001580920 00000 n 0001581124 00000 n 0001581308 00000 n 0001581468 00000 n 0001581704 00000 n 0001581972 00000 n 0001582132 00000 n 0001582264 00000 n 0001582396 00000 n 0001582660 00000 n 0001582828 00000 n 0001583160 00000 n 0001583336 00000 n 0001583508 00000 n 0001583676 00000 n 0001583880 00000 n 0001584048 00000 n 0001584376 00000 n 0001584524 00000 n 0001584688 00000 n 0001584949 00000 n 0001585170 00000 n 0001585338 00000 n 0001585626 00000 n 0001585758 00000 n 0001585906 00000 n 0001586038 00000 n 0001586327 00000 n 0001586527 00000 n 0001586807 00000 n 0001587088 00000 n 0001587309 00000 n 0001587633 00000 n 0001587866 00000 n 0001588103 00000 n 0001588332 00000 n 0001588565 00000 n 0001588777 00000 n 0001589001 00000 n 0001589346 00000 n 0001589582 00000 n 0001589755 00000 n 0001590007 00000 n 0001590356 00000 n 0001590657 00000 n 0001590826 00000 n 0001590991 00000 n 0001591215 00000 n 0001591400 00000 n 0001591577 00000 n 0001591742 00000 n 0001591903 00000 n 0001592068 00000 n 0001592201 00000 n 0001592501 00000 n 0001592709 00000 n 0001592914 00000 n 0001593071 00000 n 0001593315 00000 n 0001593559 00000 n 0001593807 00000 n 0001594019 00000 n 0001594312 00000 n 0001594560 00000 n 0001594765 00000 n 0001594962 00000 n 0001595271 00000 n 0001595420 00000 n 0001595605 00000 n 0001595758 00000 n 0001596027 00000 n 0001596176 00000 n 0001596361 00000 n 0001596514 00000 n 0001596754 00000 n 0001596943 00000 n 0001597163 00000 n 0001597375 00000 n 0001597691 00000 n 0001597916 00000 n 0001598161 00000 n 0001598394 00000 n 0001598611 00000 n 0001598935 00000 n 0001599187 00000 n 0001599355 00000 n 0001599583 00000 n 0001599791 00000 n 0001600048 00000 n 0001600220 00000 n 0001600408 00000 n 0001600652 00000 n 0001600844 00000 n 0001600985 00000 n 0001601146 00000 n 0001601306 00000 n 0001601598 00000 n 0001601806 00000 n 0001602070 00000 n 0001602350 00000 n 0001602562 00000 n 0001602718 00000 n 0001602894 00000 n 0001603062 00000 n 0001603302 00000 n 0001603526 00000 n 0001603674 00000 n 0001603950 00000 n 0001604091 00000 n 0001604252 00000 n 0001604508 00000 n 0001604720 00000 n 0001604912 00000 n 0001605100 00000 n 0001605329 00000 n 0001605669 00000 n 0001605837 00000 n 0001606121 00000 n 0001606421 00000 n 0001606681 00000 n 0001606957 00000 n 0001607186 00000 n 0001607414 00000 n 0001607558 00000 n 0001607762 00000 n 0001607922 00000 n 0001608066 00000 n 0001608254 00000 n 0001608426 00000 n 0001608630 00000 n 0001608838 00000 n 0001609062 00000 n 0001609334 00000 n 0001609610 00000 n 0001609795 00000 n 0001609964 00000 n 0001610233 00000 n 0001610437 00000 n 0001610597 00000 n 0001610761 00000 n 0001610977 00000 n 0001611165 00000 n 0001611345 00000 n 0001611529 00000 n 0001611825 00000 n 0001612121 00000 n 0001612441 00000 n 0001612713 00000 n 0001612922 00000 n 0001613147 00000 n 0001613412 00000 n 0001613653 00000 n 0001613926 00000 n 0001614183 00000 n 0001614351 00000 n 0001614656 00000 n 0001614797 00000 n 0001614938 00000 n 0001615191 00000 n 0001615368 00000 n 0001615601 00000 n 0001615806 00000 n 0001616003 00000 n 0001616332 00000 n 0001616637 00000 n 0001616822 00000 n 0001617115 00000 n 0001617276 00000 n 0001617526 00000 n 0001617699 00000 n 0001617972 00000 n 0001618237 00000 n 0001618543 00000 n 0001618824 00000 n 0001619029 00000 n 0001619254 00000 n 0001619483 00000 n 0001619772 00000 n 0001619977 00000 n 0001620226 00000 n 0001620415 00000 n 0001620616 00000 n 0001620885 00000 n 0001621170 00000 n 0001621343 00000 n 0001621596 00000 n 0001621809 00000 n 0001622042 00000 n 0001622303 00000 n 0001622572 00000 n 0001622849 00000 n 0001623158 00000 n 0001623359 00000 n 0001623728 00000 n 0001623982 00000 n 0001624175 00000 n 0001624385 00000 n 0001624586 00000 n 0001624875 00000 n 0001625120 00000 n 0001625297 00000 n 0001625478 00000 n 0001625675 00000 n 0001625840 00000 n 0001626009 00000 n 0001626170 00000 n 0001626359 00000 n 0001626605 00000 n 0001626870 00000 n 0001626959 00000 n 0001627062 00000 n 0001627164 00000 n 0001627269 00000 n 0001627365 00000 n 0001627638 00000 n 0001627725 00000 n 0001627834 00000 n 0001627944 00000 n 0001628051 00000 n 0001628141 00000 n 0001628495 00000 n 0001628668 00000 n 0001628755 00000 n 0001628859 00000 n 0001628962 00000 n 0001629065 00000 n 0001629170 00000 n 0001629274 00000 n 0001629383 00000 n 0001629494 00000 n 0001629594 00000 n 0001629880 00000 n 0001630013 00000 n 0001630162 00000 n 0001630315 00000 n 0001630460 00000 n 0001630609 00000 n 0001630758 00000 n 0001630915 00000 n 0001631064 00000 n 0001631217 00000 n 0001631374 00000 n 0001631527 00000 n 0001631668 00000 n 0001631953 00000 n 0001632086 00000 n 0001632235 00000 n 0001632388 00000 n 0001632525 00000 n 0001632766 00000 n 0001632995 00000 n 0001633224 00000 n 0001633421 00000 n 0001633650 00000 n 0001633887 00000 n 0001634096 00000 n 0001634370 00000 n 0001634458 00000 n 0001634562 00000 n 0001634665 00000 n 0001634776 00000 n 0001634882 00000 n 0001634987 00000 n 0001635092 00000 n 0001635196 00000 n 0001635301 00000 n 0001635394 00000 n 0001635633 00000 n 0001635911 00000 n 0001636084 00000 n 0001636277 00000 n 0001636474 00000 n 0001636675 00000 n 0001636888 00000 n 0001637077 00000 n 0001637266 00000 n 0001637455 00000 n 0001637656 00000 n 0001637865 00000 n 0001638062 00000 n 0001638259 00000 n 0001638440 00000 n 0001638733 00000 n 0001638942 00000 n 0001639139 00000 n 0001639336 00000 n 0001639541 00000 n 0001639722 00000 n 0001640051 00000 n 0001640272 00000 n 0001640429 00000 n 0001640734 00000 n 0001640907 00000 n 0001641116 00000 n 0001641377 00000 n 0001641586 00000 n 0001641799 00000 n 0001641952 00000 n 0001642234 00000 n 0001642391 00000 n 0001642653 00000 n 0001642894 00000 n 0001643031 00000 n 0001643204 00000 n 0001643357 00000 n 0001643626 00000 n 0001643747 00000 n 0001644000 00000 n 0001644121 00000 n 0001644359 00000 n 0001644496 00000 n 0001644685 00000 n 0001644866 00000 n 0001645063 00000 n 0001645236 00000 n 0001645421 00000 n 0001645618 00000 n 0001645811 00000 n 0001646016 00000 n 0001646213 00000 n 0001646422 00000 n 0001646623 00000 n 0001646824 00000 n 0001647025 00000 n 0001647238 00000 n 0001647439 00000 n 0001647632 00000 n 0001647833 00000 n 0001648034 00000 n 0001648239 00000 n 0001648440 00000 n 0001648633 00000 n 0001648826 00000 n 0001649027 00000 n 0001649232 00000 n 0001649437 00000 n 0001649634 00000 n 0001649843 00000 n 0001650052 00000 n 0001650249 00000 n 0001650458 00000 n 0001650647 00000 n 0001650836 00000 n 0001651025 00000 n 0001651214 00000 n 0001651403 00000 n 0001651592 00000 n 0001651781 00000 n 0001651970 00000 n 0001652163 00000 n 0001652364 00000 n 0001652561 00000 n 0001652758 00000 n 0001652955 00000 n 0001653160 00000 n 0001653361 00000 n 0001653558 00000 n 0001653751 00000 n 0001653920 00000 n 0001654325 00000 n 0001654494 00000 n 0001654755 00000 n 0001655120 00000 n 0001655385 00000 n 0001655690 00000 n 0001655971 00000 n 0001656340 00000 n 0001656702 00000 n 0001656863 00000 n 0001657096 00000 n 0001657269 00000 n 0001657490 00000 n 0001657723 00000 n 0001657924 00000 n 0001658133 00000 n 0001658298 00000 n 0001658720 00000 n 0001658881 00000 n 0001659107 00000 n 0001659260 00000 n 0001659429 00000 n 0001659678 00000 n 0001659851 00000 n 0001660020 00000 n 0001660189 00000 n 0001660362 00000 n 0001660535 00000 n 0001660708 00000 n 0001660893 00000 n 0001661074 00000 n 0001661263 00000 n 0001661624 00000 n 0001661793 00000 n 0001662010 00000 n 0001662219 00000 n 0001662392 00000 n 0001662569 00000 n 0001662750 00000 n 0001662919 00000 n 0001663100 00000 n 0001663277 00000 n 0001663454 00000 n 0001663627 00000 n 0001663796 00000 n 0001663973 00000 n 0001664150 00000 n 0001664307 00000 n 0001664484 00000 n 0001664781 00000 n 0001664850 00000 n 0001664962 00000 n 0001665071 00000 n 0001665190 00000 n 0001665305 00000 n 0001665416 00000 n 0001665530 00000 n 0001665637 00000 n 0001665749 00000 n 0001665859 00000 n 0001665964 00000 n 0001666610 00000 n 0001666729 00000 n 0001666857 00000 n 0001666976 00000 n 0001667091 00000 n 0001667216 00000 n 0001667337 00000 n 0001667458 00000 n 0001667576 00000 n 0001667704 00000 n 0001667846 00000 n 0001667979 00000 n 0001668119 00000 n 0001668238 00000 n 0001668387 00000 n 0001668491 00000 n 0001668595 00000 n 0001668699 00000 n 0001668847 00000 n 0001668954 00000 n 0001669115 00000 n 0001669246 00000 n 0001669341 00000 n 0001669483 00000 n 0001669578 00000 n 0001669672 00000 n 0001669766 00000 n 0001669860 00000 n 0001669954 00000 n 0001670048 00000 n 0001670142 00000 n 0001670236 00000 n 0001670330 00000 n 0001670424 00000 n 0001670518 00000 n 0001670612 00000 n 0001670706 00000 n 0001670800 00000 n 0001670894 00000 n 0001670988 00000 n 0001671082 00000 n 0001671176 00000 n 0001671270 00000 n 0001671364 00000 n 0001671458 00000 n 0001671552 00000 n 0001671646 00000 n 0001671740 00000 n 0001671834 00000 n 0001671929 00000 n 0001672024 00000 n 0001672119 00000 n 0001672213 00000 n 0001672307 00000 n 0001672401 00000 n 0001672496 00000 n 0001672590 00000 n 0001672684 00000 n 0001672778 00000 n 0001672872 00000 n 0001672966 00000 n 0001673060 00000 n 0001673154 00000 n 0001673248 00000 n 0001673342 00000 n 0001673436 00000 n 0001673530 00000 n 0001673624 00000 n 0001673718 00000 n 0001673812 00000 n 0001673906 00000 n 0001674000 00000 n 0001674094 00000 n 0001674188 00000 n 0001674283 00000 n 0001674378 00000 n 0001674473 00000 n 0001674568 00000 n 0001674663 00000 n 0001674758 00000 n 0001674852 00000 n 0001674946 00000 n 0001675041 00000 n 0001675135 00000 n 0001675229 00000 n 0001675323 00000 n 0001675418 00000 n 0001675513 00000 n 0001675607 00000 n 0001675701 00000 n 0001675795 00000 n 0001675890 00000 n 0001675985 00000 n 0001676080 00000 n 0001676175 00000 n 0001676269 00000 n 0001676364 00000 n 0001676459 00000 n 0001676554 00000 n 0001676649 00000 n 0001676744 00000 n 0001676839 00000 n 0001676933 00000 n 0001677028 00000 n 0001677123 00000 n 0001677217 00000 n 0001677311 00000 n 0001677405 00000 n 0001677499 00000 n 0001677594 00000 n 0001677689 00000 n 0001677784 00000 n 0001677879 00000 n 0001677974 00000 n 0001678069 00000 n 0001678164 00000 n 0001678259 00000 n 0001678354 00000 n 0001678449 00000 n 0001678543 00000 n 0001678637 00000 n 0001678731 00000 n 0001678825 00000 n 0001678919 00000 n 0001679013 00000 n 0001679107 00000 n 0001679202 00000 n 0001679297 00000 n 0001679392 00000 n 0001679486 00000 n 0001679580 00000 n 0001679674 00000 n 0001679768 00000 n 0001679862 00000 n 0001679957 00000 n 0001680052 00000 n 0001680147 00000 n 0001680242 00000 n 0001680337 00000 n 0001680432 00000 n 0001680527 00000 n 0001680622 00000 n 0001680717 00000 n 0001680812 00000 n 0001680907 00000 n 0001681002 00000 n 0001681097 00000 n 0001681192 00000 n 0001681287 00000 n 0001681382 00000 n 0001681477 00000 n 0001681572 00000 n 0001681667 00000 n 0001681762 00000 n 0001681857 00000 n 0001681952 00000 n 0001682047 00000 n 0001682142 00000 n 0001682237 00000 n 0001682332 00000 n 0001682427 00000 n 0001682522 00000 n 0001682617 00000 n 0001682712 00000 n 0001682807 00000 n 0001682902 00000 n 0001682997 00000 n 0001683092 00000 n 0001683187 00000 n 0001683282 00000 n 0001683377 00000 n 0001683472 00000 n 0001683567 00000 n 0001683662 00000 n 0001683757 00000 n 0001683852 00000 n 0001683947 00000 n 0001684042 00000 n 0001684137 00000 n 0001684232 00000 n 0001684327 00000 n 0001684422 00000 n 0001684517 00000 n 0001684612 00000 n 0001684707 00000 n 0001684802 00000 n 0001684897 00000 n 0001684992 00000 n 0001685087 00000 n 0001685182 00000 n 0001685277 00000 n 0001685372 00000 n 0001685467 00000 n 0001685562 00000 n 0001685657 00000 n 0001685752 00000 n 0001685847 00000 n 0001685942 00000 n 0001686037 00000 n 0001686132 00000 n 0001686227 00000 n 0001686322 00000 n 0001686417 00000 n 0001686512 00000 n 0001686607 00000 n 0001686702 00000 n 0001686797 00000 n 0001686892 00000 n 0001686987 00000 n 0001687082 00000 n 0001687177 00000 n 0001687272 00000 n 0001687367 00000 n 0001687462 00000 n 0001687557 00000 n 0001687652 00000 n 0001687788 00000 n 0001687888 00000 n 0001688016 00000 n 0001688141 00000 n 0001688250 00000 n 0001688393 00000 n 0001688542 00000 n 0001688703 00000 n 0001688855 00000 n 0001688983 00000 n 0001689141 00000 n 0001689299 00000 n 0001689454 00000 n 0001689615 00000 n 0001689773 00000 n 0001689931 00000 n 0001690092 00000 n 0001690253 00000 n 0001690417 00000 n 0001690578 00000 n 0001690739 00000 n 0001690888 00000 n 0001691049 00000 n 0001691216 00000 n 0001691383 00000 n 0001691547 00000 n 0001691717 00000 n 0001691884 00000 n 0001692051 00000 n 0001692209 00000 n 0001692361 00000 n 0001692513 00000 n 0001692665 00000 n 0001692817 00000 n 0001692969 00000 n 0001693121 00000 n 0001693273 00000 n 0001693425 00000 n 0001693583 00000 n 0001693738 00000 n 0001693899 00000 n 0001694054 00000 n 0001694218 00000 n 0001694379 00000 n 0001694540 00000 n 0001694698 00000 n 0001694853 00000 n 0001695014 00000 n 0001695169 00000 n 0001695336 00000 n 0001695500 00000 n 0001695661 00000 n 0001695819 00000 n 0001695974 00000 n 0001696102 00000 n 0001696245 00000 n 0001696376 00000 n 0001696522 00000 n 0001696662 00000 n 0001696772 00000 n 0001696879 00000 n 0001696992 00000 n 0001697093 00000 n 0001697200 00000 n 0001697328 00000 n 0001697441 00000 n 0001697551 00000 n 0001697667 00000 n 0001697786 00000 n 0001697911 00000 n 0001698045 00000 n 0001698152 00000 n 0001698259 00000 n 0001698381 00000 n 0001698488 00000 n 0001698601 00000 n 0001698708 00000 n 0001698818 00000 n 0001698934 00000 n 0001699044 00000 n 0001699154 00000 n 0001699279 00000 n 0001699392 00000 n 0001699505 00000 n 0001699618 00000 n 0001699728 00000 n 0001699853 00000 n 0001699960 00000 n 0001700091 00000 n 0001700222 00000 n 0001700346 00000 n 0001700473 00000 n 0001700601 00000 n 0001700702 00000 n 0001700797 00000 n 0001700922 00000 n 0001701047 00000 n 0001701154 00000 n 0001701273 00000 n 0001701425 00000 n 0001701591 00000 n 0001701731 00000 n 0001701904 00000 n 0001702089 00000 n 0001702223 00000 n 0001702360 00000 n 0001702455 00000 n 0001702571 00000 n 0001702723 00000 n 0001702854 00000 n 0001702985 00000 n 0001703136 00000 n 0001703245 00000 n 0001703354 00000 n 0001703488 00000 n 0001703637 00000 n 0001703762 00000 n 0001703899 00000 n 0001704018 00000 n 0001704142 00000 n 0001704269 00000 n 0001704369 00000 n 0001704479 00000 n 0001704589 00000 n 0001704702 00000 n 0001704827 00000 n 0001704925 00000 n 0001705065 00000 n 0001705202 00000 n 0001705321 00000 n 0001705428 00000 n 0001705538 00000 n 0001705642 00000 n 0001705761 00000 n 0001705862 00000 n 0001705993 00000 n 0001706142 00000 n 0001706327 00000 n 0001706509 00000 n 0001706685 00000 n 0001706861 00000 n 0001707034 00000 n 0001707168 00000 n 0001707262 00000 n 0001707377 00000 n 0001707496 00000 n 0001707609 00000 n 0001707731 00000 n 0001707847 00000 n 0001707999 00000 n 0001708121 00000 n 0001708264 00000 n 0001708398 00000 n 0001708559 00000 n 0001708729 00000 n 0001708847 00000 n 0001708968 00000 n 0001709071 00000 n 0001709183 00000 n 0001709317 00000 n 0001709477 00000 n 0001709601 00000 n 0001709725 00000 n 0001709858 00000 n 0001709997 00000 n 0001710103 00000 n 0001710236 00000 n 0001710336 00000 n 0001710458 00000 n 0001710595 00000 n 0001710704 00000 n 0001710828 00000 n 0001710934 00000 n 0001711053 00000 n 0001711172 00000 n 0001711291 00000 n 0001711416 00000 n 0001711555 00000 n 0001711670 00000 n 0001711794 00000 n 0001711933 00000 n 0001712066 00000 n 0001712172 00000 n 0001712287 00000 n 0001712409 00000 n 0001712558 00000 n 0001712710 00000 n 0001712828 00000 n 0001712956 00000 n 0001713075 00000 n 0001713161 00000 n 0001713250 00000 n 0001713330 00000 n 0001713410 00000 n 0001713508 00000 n 0001713591 00000 n 0001713671 00000 n 0001713760 00000 n 0001713852 00000 n 0001713935 00000 n 0001714018 00000 n 0001714101 00000 n 0001727891 00000 n 0001717929 00000 n trailer << /Root 2 0 R /Info 4 0 R /ID [<8CB9F830139AECA93960790F9FF72ACF> <8CB9F830139AECA93960790F9FF72ACF>] /Size 5215 >> startxref 1727932 %%EOF refdb-1.0.2/doc/refdb-manual.xml000644 001750 001750 00000032504 11512721663 017276 0ustar00markusmarkus000000 000000 <application moreinfo="none">RefDB</application> handbook covers version 0.9.9 Markus Hoenicka

mhoenicka@users.sourceforge.net
1.23 2007-11-03 1.22 2006-12-06 1.21 2006-05-27 1.20 2005-11-14 1.19 2004-12-12 1.18 2004-02-18 1.17 2003-12-20 1.16 2003-08-15 1.15 2003-02-16 1.14 2002-11-29 1.13 2002-11-11 1.12 2002-9-1 1.11 2002-7-23 1.10 2002-5-13 1.9 2002-3-2 1.8 2002-1-1 1.7 2001-11-22 1.6 2001-10-1 1.5 2001-8-9 1.4 2001-8-5 1.3 2001-7-21 1.2 2001-6-25 1.1 2001-6-18 1.0 2001-5-22 Preface RefDB in a nutshell RefDB is a free and portable reference and notes database toolkit as well as a bibliography application that serves a similar purpose for SGML, XML, and LaTeX documents like Reference Manager or EndNote do for word processor documents. The bibliography part is something like bibtex for markup languages. RefDB consists of an application server which interacts with a relational database on the server side and a variety of clients on the workstation side. There is a choice of command line clients, web interfaces, editor interfaces, and language bindings that allow you to work with your reference data any way you want. Organization of this manual Part 1 provides a general overview. Part 2 of this manual explains the installation of the components and the administration of RefDB. These tasks should be performed by a system administrator, as you'll need certain privileges that a regular user should not have. Part 3 explains the general use of RefDB for the regular user. This is the place to look if you just need to add or retrieve references or if you want to generate bibliographies. Part 4 contains all the nasty details of the applications that RefDB ships with: All these confusing command-line switches, interactive commands, and configuration file variables that your brain refuses to memorize. Part 5 is meant for programmers who want to modify or extend the behaviour of RefDB. You'll find a few internals which are of no interest for the regular user but might be of interest for casual hackers or notorious code fiddlers. Further information This document is complemented by the RefDB tutorial which explains the tasks a regular user will face in plain English. Please visit the RefDB homepage for additional information and new versions. The refdb-users mailing list is intended to discuss the use of the RefDB package. This covers all topics from installation to running queries. Visit the refdb-users list page to subscribe and to browse the list archives. The refdb-devel mailing list is intended to discuss the development of RefDB. Use this list to send patches and discuss the further development of this project. Visit the refdb-devel list page to subscribe and to browse the list archives. The refdb-cvs mailing list receives (in spite of its name) the subversion checkin messages. Subscribe to this read-only list to be informed about the ongoing development of this project. Visit the refdb-cvs list page to subscribe and for further information. Please send general bug reports to the users list (it might be a configuration or usage problem, and would thus be of interest to other users). However, if you have investigated the source code and either have a good idea what might cause the bug or even have a patch, please send the report to the devel list. In both cases you may wish to include the output of the refdb-bug script. This will create a file refdb-bug.txt in the present working directory which contains all sorts of information about your RefDB setup. RefDB is maintained by Markus Hoenicka. Overview chapter-introduction.xml appears to be missing chapter-system-requirements.xml appears to be missing chapter-limitations.xml appears to be missing Administrator manual chapter-installation.xml appears to be missing chapter-refdbd-administration.xml appears to be missing User manual chapter-overview-clients.xml appears to be missing chapter-data-input.xml appears to be missing chapter-managing-references.xml appears to be missing chapter-managing-notes.xml appears to be missing chapter-bibliographies.xml appears to be missing chapter-sru.xml appears to be missing Reference manual chapter-refdbd.xml appears to be missing chapter-refdba.xml appears to be missing chapter-refdbc.xml appears to be missing chapter-refdbib.xml appears to be missing Programmer's manual chapter-reference-database-design.xml appears to be missing chapter-refdb-database-design.xml appears to be missing chapter-ris-risx-format.xml appears to be missing chapter-programming.xml appears to be missing chapter-perl-client-module.xml appears to be missing chapter-backend-api.xml appears to be missing chapter-inout-formats.xml appears to be missing chapter-cs-protocol.xml appears to be missing This document was written with GNU Emacs on FreeBSD. The XML sources use the DocBook XML DTD version 4.2. The images were created with Inkscape. The SVG files were then transformed to PNG and PDF using the Java application batik-rasterizer. The document was transformed to the PDF and HTML output formats using xsltproc, FOP, and the DocBook XSL stylesheets through customization layers which are part of the documentation sources. The HTML output is further enhanced by a CSS file. refdb-1.0.2/doc/chapter-backend-api.xml000644 001750 001750 00000004655 11512721663 020531 0ustar00markusmarkus000000 000000 Using the backend API to implement new output formats While there is nothing like a runtime-plugin mechanism to add new output formats, the RefDB code is sufficiently modularized to make the implementation of a new format a fairly easy task. You don't have to parse the query results directly, but you call wrapper functions instead. This also has the nice advantage that changes in the database design show up only in one place and thus are less likely to break the backend implementations. We will first have a look at the API that backend.c provides. Then we'll have a look at those parts in the existing code that need to be modified in order to accept a new backend. The backend API In general, the backend API provides a get_foo() for every tag foo in the RIS specification. There are, however, two fundamentally different types of tag retrieval functions: The simple retrievals pull out values from the main table (t_refdb) of the database with a single function call. The compound retrievals need three functions: A request_foo() obtains an array of possible values. A get_foo() retrieves one or more of these values and can be used in a loop to retrieve all values. Finally, the clean_request() frees the allocated memory. Compound retrievals are used to get at values which are stored outside the main table, like authors or keywords. The prototypes of these functions can be found in backend.h, and their use is shown in the existing backends backend-scrn.c, backend-ris.c, backend-db31.c, and backend-bibtex.c. How to insert a new backend into RefDB Define a new type, expand the if-then-else statement, include include-file. {work in progress} refdb-1.0.2/doc/chapter-bibliographies.xml000644 001750 001750 00000220406 12023722222 021336 0ustar00markusmarkus000000 000000 Bibliographies The bibliography is the really hard part of writing a scientific manuscript or a thesis, much harder than generating the data in the first place. This is why RefDB tries to help you with this task as much as possible. RefDB's job is to provide two kinds of information: the bibliographic data styling information according to a bibliography and citation style If the default rendering of citations and bibliographies in the DocBook or TEI stylesheets is appropriate for your purposes, you can get away with using RefDB as a source for raw bibliographies. However, if your output is supposed to match the requirements of a particular journal or publisher, you'll need the styling information as well. There are literally thousands of possible combinations for the formatting of authors, titles, journal names, page and date informations, and almost each of these possiblilities has been adopted by at least one journal or publisher as the one and only citation and bibliography style. The format of the RefDB bibliography styles is described in the first section. The next section will then explain how you generate bibliographies and format your documents. Quickstart guide These are the essential steps to publish documents with formatted citations and a formatted bibliography: Load one or more bibliography styles into your RefDB database, using the addstyle command (this is usually done automatically during post-installation setup, see refdb-init). The bibliography will eventually be available as a separate file (see below). SGML and XML documents have to include this file, either as an external entity or via xinclude. LaTeX or RTF documents need no special care at this point. Insert citations into your document, preferrably using the short notation for SGML/XML documents. LaTeX documents use the regular bibtex commands, whereas RTF uses a plain-text citation format. Run the appropriate commands to create the bibliography and to transform the document. For SGML, XML, and RTF documents this may be as easy as running make pdf, whereas LaTeX users have to run one extra command in addition to the usual bibtex procedure. Manage bibliography styles Bibliography styles are defined as XML documents. Each document contains one or more bibliography styles for a particular journal or publisher. The bibliography styles need to be added to the RefDB database before they can be applied to your documents. The bibliography style controls, among others, characteristics like: Numerical vs. author/year vs. citation key citation style Bibliography sorting order (as it appears in the text vs. alphabetical or sorted by ascending or descending publication dates) Formatting of author names: First and middle initial with or without periods, with or without spaces, before or after the surname Appearance of name, volume, and issue number of journals (bold, underlined, italics) Formatting of the bibliographic listing: indentation, font sizes. The extensive formatting specifications of the RefDB bibliography styles are almost wasted on BibTeX bibliographies currently. You still need one of the native BibTeX styles to do the actual formatting until RefDB bibliography styles can be exported as BibTeX styles. The current implementation uses only the formatting information of the journal name to allow either the full name or one of the abbreviations to appear in the bibliography. So for the current implementation you can get away with just two simple styles that define only the journal name formatting for the GEN publication type. These can be found as bibtex-abbrev.xml and bibtex-full.xml in the style directory of the source distribution. It is admittedly no easy task to write correct bibliography styles from scratch. It may be easier to pick a similar style (if there is one) and modify it to your needs. In this section you will find a brief overview how a bibliograpy style is put together. For more detailed information, please peruse the separate documentation of the CiteStyle XML DTD. Write or modify a bibliography style file It is recommended to use a validating XML editor like Emacs/nXML to write bibliography styles using the CiteStyle XML DTD. This ensures that you end up with a valid style that won't confuse RefDB. If you edit styles with a simpler editor, please run the resulting file through a validating parser like onsgmls or xmllint before adding it to your main database. The CITESTYLE element defines a bibliography style for one particular journal or publisher. You can group several styles in one file with the STYLESET wrapper element. Each CITESTYLE element contains exactly four top-level elements (). The STYLENAME defines the name of this style. For the sake of simplicity this could be identical with the name of the journal or publisher whose bibliography style it defines, e.g. J.Biol.Chem. or Elsevier. The REFSTYLE element contains the style definitions for the various publication types that can appear in a bibliography, like books, journals, or personal communications. A special case is the type GEN which defines a default bibliography style that is applied whenever no specific definition is available for the requested type. Although the DTD does not enforce this, it is strongly recommended to define a GEN definition for each bibliography style. The CITSTYLE element defines the citation style, i.e. the appearance of the citations in the main text. Finally, the BIBSTYLE element defines the properties of the bibliographic listing.
Schematic representation of a <sgmltag>CITESTYLE</sgmltag> element
Each definition for a publication type in turn is basically an ordered list of the elements that make up the rendered bibliographic entry, like authorlists, publication dates, titles, and so on. You can arrange them in any order you like. All available elements can hold a PRECEEDING and a FOLLOWING element which define strings that are inserted before and after the corresponding element, respectively. This can be used to place punctuation characters or brackets wherever such a non-empty element occurs. A special element is SEPARATOR which usually also contains punctuation characters. This element is always inserted even if the preceeding or following element is empty. The styles also reflect the three-level representation of the bibliographic data themselves. For a discussion of this representation see the description of the risx format. When you write a bibliographic style, you have to make sure to pick the correct level, as indicated with the role attribute, for the author lists and the titles. E.g. a chapter entry would typically have AUTHORLIST and TITLE elements with the role attribute set to "PART" to display the chapter author and title, respectively, and additionally AUTHORLIST and TITLE elements with the role attribute set to "PUB" to render the editor and the title of the whole book, respectively. The CITSTYLE element can define three different styles for citations: INTEXTDEF for regular citations as well as AUTHORONLY and YEARONLY for citations that keep the authors in the flow of the text. These elements are equivalent to the definition of a publication type in the REFSTYLE element. Please peruse the separate documentation for the CiteStyle XML DTD for the details about the individual elements, and feel free to consult the styles shipped with RefDB for further guidance. The RefDB project also provides a tool to create citation styles interactively. The refdb-ms Perl script is part of the RefDB sources.
Create SGML and XML bibliographies Although SGML documents are usually processed with a DSSSL toolchain and XML documents with a XML toolchain, the procedures to generate documents with bibliographies are similar enough to treat them in a single section. If you use the high-level tools provided by RefDB, you won't even notice a difference. RefDB can create two types of bibliographies, cooked and raw. Cooked bibliographies are already preformatted using the information of a particular bibliography and citation style. Documents using cooked bibliographies have to be processed using the appropriate stylesheet driver files provided by RefDB. Raw bibliographies (currently supported only for XML documents) contain no particular formatting and should therefore be processed using the regular DocBook or TEI stylesheets. RefDB provides both high-level tools which attempt to hide the entire complexity of the bibliography business, and low-level tools which allow experienced users to integrate RefDB into their own toolchains. We'll first describe the high-level approach which should always be the first choice. The subsequent sections give all the details about the low-level tools which you normally don't even want to know about. Keeping it simple with refdbnd refdbnd provides the simplest approach to create, maintain, and transform documents with RefDB bibliographies. Once set up, all you'll have to do is to run something as simple as make pdf. The following subsections cover how to set up a refdbnd-managed project, how to cite, and how to process the document. Setting up a project refdbnd is an interactive script which creates a skeleton document and a custom-tailored Makefile. Start the script in a clean subdirectory by typing refdbnd. You'll be asked a couple of questions, each of which supplies sufficient background information for novice users. The script will then create three files (we'll assume that the basename that you provided was "foo"): foo.short.[sgml|xml] The ".short" reminds you that you're supposed to use the short notation for citations in this file. This is simpler, usually more convenient, and should always be your first choice. foo.[sgml|xml] This file is just a dummy in a fresh project. If you edit the file foo.short.xml, the file foo.xml will automatically be updated and fed to the subsequent processing steps next time you run make. Unless you know what you do, you don't want to touch this file. Makefile This is a customized Makefile that contains all the information that you provided to refdbnd. Simply run commands like make pdf or make html to create printable or HTML output with formatted citations and bibliographies from your document. Editing your document The foo.short[sgml|xml] skeleton document contains the required markup to start a book or an article. You'll now want to open this file in your favourite text editor to write the contents and to add your citations. In DocBook SGML and XML documents, citations are encoded as citation elements. To distinguish these from citation elements that are not meant to be processed by RefDB, set the role attribute to REFDB in all caps. Each citation element contains one or more references, separated by semicolons. The trailing semicolon after the last reference is optional, so the following citations are absolutely equivalent: <citation role="REFDB">2;5;9</citation> <citation role="REFDB">2;5;9;</citation> The values identifiy the bibliographic entries in your database. Use either numerical IDs as in the examples above, or alphanumeric citation keys as shown in the following example: <citation role="REFDB">Miller1999;Jones2001</citation> The corresponding syntax for TEI XML documents is quite similar, except that we abuse the general-purpose seg element and tag it for use with RefDB by setting the type to REFDBCITATION in all caps: <seg type="REFDBCITATION">2;5;9</seg> Again, you can use citation keys instead of the numerical IDs shown in the example above. The examples shown above will be rendered as "regular" citations. In addition to this you can request author-only or year-only citations. These come in handy if you want to write something like: Jones et al. reported recently (2001)... Both the authors (Jones et al.) and the year (2001) need to be encoded as individual citations as shown in the following example: <para><citation role="REFDB">A:Jones2001</citation> reported recently <citation role="REFDB">Y:Jones2001</citation> ...</para> You may have guessed that the prefix "A:" tags a citation as an author-only citation and that the prefix "Y:" means year-only. These prefixes tag the whole citation, not a particular reference in the citation. Therefore the prefix must be the first thing right after the start tag. Multiple citations using the author-only or year-only style would make no sense anyway. Transforming your document The Makefiles created by refdbnd offer the following targets: pdf This target generates a PDF file from your source document. PDF is a widely accepted document format with free viewers for essentially all current operating systems. Be aware that not all FO processors (used in transforming XML documents) offer PDF output. html This runs all required commands to create HTML output, viewable with any web browser. Depending on your local setup, the output will be chunked into a collection of HTML files. rtf This target generates a Rich Text Format (RTF) file. This plain text format is sort of a word processor interchange format understood by most current word processors, including MS Word, WordPerfect, and OpenOffice/StarOffice. Not all FO processors offer RTF output though. ps This target is only available for SGML documents. It will create a Postscript document from your source. Postscript is the universal document format on Unix systems and can be printed directly on Postscript printers. Viewers are available for all current operating systems. The Makefile also offers a few more targets. For each of the above targets there is a corresponding '<target>dist' target which creates a .tar.gz archive of the output document, along with its associated CSS stylesheet if applicable. The target 'all', which is also the default if you don't specify a target to make, builds all available output formats. Accordingly, the target 'dist' creates all archives. And finally, the target 'clean' removes all intermediate files and returns your directory to the original state. The refdbnd-generated Makefiles should be sufficient for the average document. However, feel free to modify them in order to adapt them to specific needs. For example you can specify a different style in order to switch your output to a different citation and bibliography style. make also allows you to override variable settings on the command line. E.g. if you want to output your document using a different bibliography style without making it the permanent default, invoke make like this: ~$ make clean && make pdf stylename="Eur.J.Pharmacol." make clean removes intermediate files to let the change of the bibliography style take effect. Bibliographies, the hard way If the simple approach outlined above does not suit your needs, you can turn to the low-level bibliography tools provided by RefDB. Needless to say, you can always start with a refdbnd-created project and use the low-level tools whenever you run into any limitations. However, this section describes the manual creation and transformation of documents from the ground up. Prepare the document RefDB's bibliography output is a bibliography element that contains all required references. You can redirect the output into a file and include this file at the spot where your bibliography should appear. To achieve this you need two modifications in your document: When using DTD-based documents (i.e. DocBook 4.x or TEI P4), extend the document type declaration at the beginning of your document to declare the external entity. The first example is from a DocBook SGML document: <!DOCTYPE BOOK PUBLIC "-//OASIS//DTD DocBook V3.1//EN" [ <!ENTITY bibliography "foo.bib.sgml"> ]> ... The second example shows a TEI XML document: <?xml version="1.0"?> <!DOCTYPE TEI.2 PUBLIC "-//TEI P4//DTD Main Document Type//EN" "http://www.tei-c.org/P4X/DTD/tei2.dtd" [ <!ENTITY % TEI.general 'INCLUDE'> <!ENTITY % TEI.names.dates 'INCLUDE'> <!ENTITY % TEI.linking 'INCLUDE'> <!ENTITY % TEI.XML 'INCLUDE'> <!ENTITY bibliography SYSTEM "refdbtest.bib.xml"> ]> ... The name of the entity is of course yours to choose, but using bibliography as in this example is pretty descriptive. When using schema-based documents (i.e. DocBook 5.x or TEI P5), there is no need to declare the bibliography at the beginning of the document. Include the bibliography at the desired spot as an external entity for DTD-based documents: ... &bibliography; ... Alternatively, use xinclude to include the bibliography in schema-based documents: ... <xi:include href="refdbtest.bib.xml" xmlns:xi="http://www.w3.org/2001/XInclude"> <xi:fallback>refdbtest.bib.xml appears to be missing</xi:fallback> </xi:include> Some XSLT processors require a command-line switch or additional libraries to support xincludes. If your transformed document should lack the bibliographic listing, consult the documentation of your XSLT processor. You need to make sure that the included chunk of text is valid at the point where you want to include it. DocBook SGML and XML bibliographies are generated as bibliography elements, TEI XML bibliographies are wrapped in div elements. Create citations Creating citations and bibliographies in SGML or XML documents with RefDB is very similar to what you would do if you had to manually code the bibliographies - but without the sweat. First you create the citations. Each citation consists of one or more bibliographic references in the text, each of which points to one particular entry in the bibliography. Then you create a bibliography for all cited publications (and possibly some more). For an increased benefit you would certainly also want to create functional links from the citations to the corresponding bibliography entries, which would act as hyperlinks in suitable output formats like HTML or PDF. In real life, you would probably jump back and forth, adding a bibliography entry whenever you add a new citation, and invent suitable ID values for your bibliographic link targets as needed. The distinction made here between a citation and a bibliographical reference may sound like nitpicking, but it will be important when we deal with citations that contain more than one bibliographical reference. RefDB requires a slightly more formalized approach. You have to stick to a particular syntax when you create the citations, but the good news is that RefDB does almost all of the rest. You will usually also create the citations first and let RefDB create the bibliography just before you are ready to transform the first draft. RefDB uses three different notations for references: Short notation The short notation is, as the name implies, a lot faster to type and thus more convenient, but it requires an additional preprocessing step that adds some small restrictions to the way you write your documents (please see the section about refdbxp for details about these restrictions). The preprocessing of documents using the short notation also automates the issue of first and subsequent citations of a bibliographic entry and it automatically creates the ID values used in multiple citations. Using multiple databases per document is not supported by the short notation currently. The short notation is fully valid SGML or XML code, without any extensions of the original DTDs. You can use all sorts of SGML or XML processing tools on such documents. Full notation The full notation offers full control but requires a lot more typing and thinking. It does not require a preprocessing step before the transformation, though. You need to take care of the issue of first and subsequent citations of a reference, and you have to manually generate ID values for use in multiple citations. You can include references taken from several databases. Just like the short notation, the full notation is also fully valid SGML or XML code, without any extensions of the original DTDs. ID notation for raw bibliographies If you want to process your document with the default Docbook or TEI stylesheets using a raw bibliography, you just use the citation key as te value of the linkend attribute of the xref or biblioref elements to refer to the appropriate reference entry in the bibliography. RefDB will generate the bibliography using the citation key as the id or xml:id (for DocBook 5.x and TEI P5) attribute. First we'll have a look at the short notation, before we get into the gruesome details of the full notation. Keep in mind that the refdbxp application interconverts the short and the full notation. You can convert your document back and forth as often as you wish, so you're not limited to the notation that you initially choose. In fact, you can mix both notations in a single document. Finally, we'll also show examples of the ID notation for raw bibliographies. Short notation The short notation has been described above as this is the notation which you use in refdbnd-maintained projects. The only thing you must not forget when not using refdbnd is that you must preprocess documents that contain citations in short notation with refdbxp before you transform the document to one of the output formats. Full notation The full notation is a lot more complex than the simple notation described above. So unless you have specific reasons to write citations in full notation from scratch, it is more advisable to use the short notation and preprocess your documents with refdbxp. The output created by this utility is the full notation described in this section. The particular syntax of citations and bibliographic references is necessary for two reasons: first we have to tell RefDB which bibliographic database entry (and probably, from which database) we want to reference. Second, we need to encode which type of citation or reference we want. The exact markup depends on the DTD that your document uses, but the basics are the same. In both DocBook and TEI documents, these two bits of information are encoded in attributes of elements that create a link from the reference to the bibliographic entry. In order to handle multiple citations correctly, these link elements need to be inside a wrapper element. For a DocBook document, basic citations therefore look like this: <citation role="REFDB"> <xref linkend="ID1-X"> </citation> <citation role="REFDB"> <xref linkend="LITIBP-ID2-X"> </citation> The citation element is a wrapper for one or more bibliographic references. The role attribute is set to REFDB to distinguish this citation from other citation elements that RefDB should leave alone. Each citation element can contain one or more xref elements. Each xref element specifies one bibliographic reference. The value of the linkend attribute encodes which bibliographic item is referenced (in this case, the database entry with the ID 1) and how the reference should be rendered (see below). It consists of the string "ID" followed by the numerical database entry ID, and a trailing one-letter type specifier ("X" in this case), separated from the rest by a dash. This simple form does not encode the database from which the reference is to be pulled. When generating the bibliography, you will specify a default database from which all references without an explicit database label will be taken from. This form is most convenient if all your bibliographic items are stored in one database. This xref element shows the syntax when an explicit database (LITIBP in this case) is specified. The attribute value consists of the database name, a dash, the string "ID", the numerical database entry ID, and the trailing type specifier. This form is mandatory only if you reference bibliographic entries from different databases in the same document (again, one database can be set as the default database in subsequent processing steps, so you could use the simple form for all references to entries in that particular database). This and the following DocBook examples are given in SGML notation. Keep in mind two things when working with XML documents: The empty xref elements need a closing slash as in <xref linkend="ID2-X"/>. All attribute values relevant to RefDB must be in uppercase. This restriction is imposed by the way citations are currently extracted from the document. It may be dropped in later versions though. The corresponding syntax in a TEI XML document looks like this: <seg type="REFDBCITATION"> <ptr targOrder="U" target="ID1-X" TEIform="ptr"/> </seg> <seg type="REFDBCITATION"> <ptr targOrder="U" target="LITIBP-ID2-X" TEIform="ptr"/> </seg> The general-purpose seg element with the type attribute set to REFDBCITATION is the citation wrapper for one or more bibliographic references. Each bibliographic reference is specified by a ptr element whose target attribute encodes the bibliographic entry that is referenced. As explained in the DocBook example, this is the simple form that does not specify the database. This is the corresponding bibliographic reference with the database specified. You don't have to worry about the attributes in the example which are not mentioned in the explanations. These are TEI default attributes which do not have anything to do with RefDB (your XML editor will most likely create them automatically for you). There are several ways to render citations and bibliographic references in the text. You select what you need by a trailing capital letter after the database ID (the "X" in the above examples). RefDB will create several preformatted strings in the bibliography file which can be linked to by selecting the proper postfix. These preformatted strings have several purposes, as shown in the following table: Bibliographic reference types Postfix Purpose X The most common case. This is the first occurrence of a reference which is to be displayed outside the flow of the text. In numerical citation schemes this will be something like "(2)", in author-year citation schemes this may be rendered as "(Miller et al., 1992)". S This is the same as X, but for a subsequent occurrence of the same reference. This distinction is important for some author-year citation schemes that print the full (or at least a longer) author list at the first occurrence and an abbreviated one at all subsequent occurrences of the same reference. A This is the first occurrence of a reference that displays the authorlist inside the flow of the text, like in "Miller et al. reported recently (2001)...". Q This is the same as A, but for subsequent occurrences of the same reference. Y This type complements the author-only references mentioned above. In numerical citation schemes this is usually rendered like a normal reference, e.g. as "(2)", but in author-year citation schemes usually only the publication date is rendered, as in "(2001)".
The exact formatting of these references, e.g. which citation style is used or which brackets surround the reference, is controlled by the style specification for a particular publication or publisher. This takes effect when you generate the bibliography and transform the final document. An additional twist comes into play if you have multiple citations, i.e. a citation that contains more than one bibliographic reference. In most cases, all references are displayed inside of one pair of brackets. Some numerical citation styles require that bibliographic references with consecutive numbers be formatted as ranges within the same citation. Formatting consecutive numbers as ranges kills the links from the reference to the bibliographic item for each reference that make up a range. Any generated hyperlinks will therefore point to one common target for all members of a multiple citation. If this is not desired (e.g. to keep the links alive in a HTML presenation of a scientific document), you may override this behaviour during the transformation of the final document. In order to format these cases properly, you need to include a dummy element whose sole purpose is to provide a link to an element that contains the combined, preformatted citation string. This is shown for a DocBook document in the following example. <citation role="REFDB"> <xref endterm="IMTHEFIRST" linkend="ID1" role="MULTIXREF"> <xref linkend="ID1-X"> <xref linkend="ID14-X"> <xref linkend="ID7-X"> </citation> This is the additional xref element which is mandatory in multiple citations. The linkend specifies the target of a link, which by convention could be the first of the following references. Note that the attribute value does not have a trailing type specifier. The element must have a role attribute with the value MULTIXREF. You also have to provide an unique value for the endterm attribute. This specifies the ID value that will be used in the corresponding element in the RefDB-generated bibliography that contains the preformatted string for the multiple citation. The ID value has to start with the letters "IM" as a sort of sanity check. This and the following xref elements define the actual references that comprise the multiple citation. The sequence of the xref elements that encode the actual references may be important. Depending on the bibliography style used for the document transformation, the references may be displayed in the sequence as they were entered, or they may be rearranged according to the sequence of the bibliographic entries in the finished bibliography. Keep also in mind that all attribute values must be in uppercase for the same reasons as stated above. The corresponding TEI citation is a little bit simpler: <seg type="REFDBCITATION"> <ptr type="MULTIXREF" targOrder="U" target="IMTHEFIRST" TEIform="ptr"/> <ptr targOrder="U" target="ID1-X" TEIform="ptr"/> <ptr targOrder="U" target="LITIBP-ID21-X" TEIform="ptr"/> <ptr targOrder="U" target="ID5-X" TEIform="ptr"/> </seg> This is the additional ptr element which is mandatory in multiple citations. The element must have a type attribute with the value MULTIXREF. You also have to provide an unique value for the target attribute. This specifies the ID value that will be used in the corresponding element in the RefDB-generated bibliography. The ID string has to start with "IM". In contrast to DocBook elements, there is no way to specify where a link should point to. The RefDB XSL stylesheets will use the first bibliographic entry referenced in a multiple citation as the link target. This and the following xref elements define the actual references that comprise the multiple citation.
ID notation for raw bibliographies This notation is similar to what you'd do in a document which does not use RefDB bibliographies at all, except that you have to declare which citation elements should be processed by RefDB (it may very well be that RefDB is supposed to process all of these elements, but in order to support cases where it shouldn't, there is a mechanism to allow just this). Just set the role attribute of the citation element to REFDB to include it in the list of citations that runbib extracts from your document, like this: <citation role="REFDB"><xref linkend="Bellamy2002"/></citation>
Generate the bibliography Unless you have good reasons not to do so, you should use the runbib shell script to generate the bibliography. This script greatly simplifies this task and offers a common interface for all supported document types. The following subsection will explain the use of this script. If you like to do it the hard way (or if you want to peek under the hood) you'll find a few explanations further down how to do this. Use runbib Lets assume you have a DocBook SGML document mypaper.sgml and want to submit it to the "Journal of Irreproducible Results". We further assume that the bibliography style for this famous periodical is stored in your database under the name "J.Irrep.Res." (see Manage bibliography styles to learn how it gets there). All your bibliography entries (at least those referenced without an explicit database name) are stored in the database mybib. Start the script from the directory that contains your document with the following command: ~$ runbib -d mybib -S "J.Irrep.Res." -t db31 foo.sgml For a similar TEI XML document bar.xml you would run: ~$ runbib -d mybib -S "J.Irrep.Res." -t teix bar.xml In both cases you will end up with a bibliography file (foo.bib.sgml and bar.bib.xml, respectively) as well as with a stylesheet (J.Irrep.Res.dsl) or a set of stylesheets (J.Irrep.Res.fo.xsl and J.Irrep.Res.html.xsl), respectively. Don't worry if you are greeted by a list of (Open)Jade errors complaining about missing elements when you first run this script on a particular document. Your document contains a number of crosslinks that point to elements that do not exist yet - you use runbib precisely to create these elements (you thus face a classic bootstrapping problem). As soon as the bibliography is created, these error messages should go away. Later you will only get an error message for each bibliographic entry that was added since the last time you ran runbib. To tell runbib that you want to create a raw instead of a cooked bibliography, use the command line switch. As there is no style information involved, you don't need the option in this case: ~$ runbib -d mybib -r -t db50x bar.xml This will create a raw bibliography from the DocBook 5.0 document bar.xml, using the reference entries in the database mybib. Do it the hardest possible way The following steps trace back exactly what the runbib script does. The only benefit of the hard way is that you have a chance to fiddle with the intermediate XML file which contains the list of bibliographic entries that should go into the bibliography. You can add further entries to extend the bibliography if you want to include uncited publications. The following procedure was written with a DocBook SGML document in mind, but transferring the commands to XML documents is straightforward. However, when working with XML documents there are additional steps required as outlined below. Extract the list of bibliographic references Use Jade or OpenJade with the citations.dsl stylesheet to create a list of the reference IDs from SGML files (provide full paths as needed): #~ openjade -t sgml -d citations.dsl /usr/lib/sgml/declaration/docbook-3.1.dcl foo.sgml > foo.id.xml Be prepared for a long list of "missing ID" error messages. This is due to the fact that the elements with the IDs that the xref elements in the citations point to do not yet exist, they will be generated in the RefDB bibliography output. If you process documents with more than 200 citations, you'll have to increase the maximum error limit of Jade in order to obtain all IDs the first time. After the first complete pass (including the steps outlined below), Jade will only complain about any additional citations that you have inserted since the last run. XML files are processed using your favourite XSL processor. There are two different stylesheets available for raw and for cooked bibliographies. Both work all the same for DTD-based (DocBook 4.x, TEI P4) and schema-based (DocBook 5.x, TEI P5) documents: #~ xsltproc --catalogs --xinclude /usr/local/share/refdb/xsl/citations.xsl foo.xml > foo.id.xml #~ xsltproc --catalogs --xinclude /usr/local/share/refdb/xsl/citationsraw.xsl foo.xml > foo.id.xml In all cases the output is a simple XML file that contains the information about all citation and xref elements with their relevant attributes. It is absolutely legal to extend this file with additional citation elements to specify references which are not cited but nonetheless should appear in the bibliography. Unfortunately, both Jade and OpenJade don't get that Doctype line quite correct. Both forget to insert a space between the public and the system identifier, thus leaving you with a not well-formed document. Fire up your favourite editor and fix this line manually (insert a space between the two consecutive quotation marks on line 2). If you edit this intermediate XML file (that is, if you do more than just fixing the Doctype line), you should make sure that the result is still valid according to the CitationList XML DTD. RefDB uses a non-validating parser to read this file so deviations from the DTD may slip through undetected and may have undesired consequences. The intermediate XML file carries the SYSTEM identifier of the CitationList XML DTD in the document type declaration. You may have to adapt the stylesheet citations.dsl to use the correct path for your local system. The following command lines can be used to validate the document with (o)nsgmls or xmllint (change the paths as necessary): ~$ onsgmls -wxml -s /usr/lib/sgml/declaration/xml.dcl foo.id.xml ~$ xmllint --noout --nonet --dtdvalid file:///usr/local/share/refdb/dtd/citationlistx.dtd foo.id.xml Create the bibliography file ~$ refdbib -d mybib -S "J.Irrep.Res." -t db31 foo.id.xml > foo.bib.sgml This assumes that your reference database is called "mybib" and that you try to publish your paper in a journal that accepts the style with the name "J.Irrep.Res.". In addition to the bibliography file, refdbib will also create a DSSSL script containing the style specification. This file is a customized driver file for the RefDB-DocBook driver files and provides a couple of variable values specific for the given bibliography style. If you want to generate a raw bibliography, use a command like this: ~$ refdbib -d mybib -r -t db50x foo.id.xml > foo.bib.xml Post-processing This step is only required for XML documents. First we have to bring the stylesheets into shape, and if it is a TEI document, we'll also have to transform the bibliography file itself. refdbib creates a general-purpose XSL stylesheet which we need to turn into one FO and one HTML stylesheet. Create two copies of the file. If the stylesheet was e.g. J.Biol.Chem.xsl, you need one copy named J.Biol.Chem.fo.xsl and one copy named J.Biol.Chem.html.xsl. Scan the files for an import statement whose href attribute is surrounded with two "<!-- REFDBSTYLESHEET -->" comments. The value of this attribute must be set to the full path of the corresponding original stylesheet (DocBook FO or HTML, or TEI FO or HTML). If you're working on a TEI P4 XML document, you'll have to transform the bibliography file itself. This is a DocBook SGML document and can be transformed easily with Jade/OpenJade and the bibdb2tei.dsl stylesheet. TEI P5 bibliographies are exported directly by refdbd and do not require further processing. Transform the document Finally you can transform the document to create printable or HTML output. If you use cooked bibliographies you have to use the RefDB driver files for the DocBook or TEI stylesheets. In addition to the general modifications of these driver files we'll have to apply modifications specific for the particular reference style. Therefore you have to specify the DSSSL or XSL style specification file that was created in the previous step. For your convenience it is recommended to use the supplied refdbjade and refdbxml scripts for DSSSL and XSL transformations, respectively, which were designed for this task: ~$ refdbjade -t html -s J.Irrep.Res.dsl foo.sgml ~$ refdbxml -t pdf -s J.Irrep.Res.fo.xsl bar.xml If you want to change the bibliography style of your document, all you need to do is to rerun runbib and refdbjade or refdbxml with the new parameters. No changes to your DocBook source are necessary. Processing your document with a raw bibliography does not differ from processing any other DocBook or TEI document. However, you can still use the refdbxml script to avoid having to type the full command line of your XSL processor. Use something like this to process a Docbook 5.0 document with a raw bibliography: ~$ refdbxml -t pdf -s db5 bar.xml The option tells the script to use the stock DocBook stylesheets for version 5. Other values are "db", "tei", and "tei5" for the DocBook stylesheet for version 4.x, the TEI P4 stylesheets, and the TEI P5 stylesheets, respectively If you want to create a bibliography for each part of a book or for each chapter, the procedure is not much different. The simplest approach is to keep the parts or chapters in individual files and process these individually as described above for the whole document. You'll get several bibliography files that you can include into the corresponding document source files.
How to use custom stylesheets We have assumed in the previous instructions that the stock DocBook or TEI stylesheets suit your needs when processing your documents. However, if you need a particular formatting of the parts of your document which are not under the control of RefDB (things like fonts, colours, font sizes and so on), you'll have to create a driver file with your personal modifications, and somehow make sure this driver file is used whenever your document is processed. This section discusses the available mechanisms to use particular XSL driver files as a per-user or a per-document option. Currently no such mechanism is available for the DSSSL stylesheets. A driver file is essentially a stylesheet which imports the stock stylesheets and adds a few modifications. XSL is designed such that any definition of a template in the driver file overrides the definition in the imported file. RefDB uses this mechanism extensively to provide the formatting of citations and bibliographic listings. Whenever you run refdbib (or runbib which calls the former), a driver file is created which imports a general RefDB driver file. This general driver file in turn includes the stock stylesheets (imports can be nested). If the stock stylesheets don't suit your needs, you'll have to provide two driver files: a driver file for the stock stylesheets which contains your modifications of those parts which are not under RefDB's control. Obviously, this driver file must import the stock stylesheets. You can put this driver file into any convenient subdirectory in your home directory. For further information about how to set up a driver file, please see Bob Stayton's DocBook XSL Guide (the general approach is applicable to TEI and any other XSL stylesheets just as well) a modified general RefDB driver file which imports your driver file instead of the stock stylesheets. To this end, copy the relevant general RefDB driver file (there are driver files for fo, html, and xhtml output, and they are available both for DocBook and for TEI) to a convenient subdirectory in your home directory and modify the import statements to suit your needs. There are two options to have the modified general RefDB driver file used instead of the default ones: if you want to apply your modifications as a default to all documents which you process, consider adding the paths to your personal copy of the runbibrc configuration file. if you want to apply the modifications to a particular refdbnd-created project, just specify the paths of the modified general RefDB driver files when setting up the project. This way, each project can use a different set of modifications. visualizes how a document containing a RefDB bibliography is processed with a focus on the stylesheets involved. The example shows the transformation of a DocBook XML document to fo (which might then be processed to e.g. PDF). However, the same principles are applicable to other output formats and other document types. The left hand side shows the default processing using the stylesheets installed by RefDB. refdbib (which may be invoked by runbib, or by running a refdbnd-created Makefile) creates an intermediate stylesheet containing the style-specific information. This stylesheet is converted to output-type-specific driver files for fo, html, and sometimes xhtml output. The figure shows only the fo driver file to keep it simple. This driver file imports the general RefDB fo driver file, which in turn imports the appropriate official DocBook fo stylesheet. The right hand side shows how to process the same document with a DocBook driver file which may alter the general formatting of the document (page size, borders, fonts and the like). As you can see, you have to provide both the DocBook driver file and an equivalent of the general RefDB fo driver file, which has to import your driver file instead of the stock DocBook stylesheet. You can of course add all your general modifications to myrefdbdriver.xsl and have that import the stock DocBook stylesheet. However, doing it in two steps as shown will allow you to use mydocbookdriver.xsl for non-RefDB projects as well.
Stylesheets involved in processing RefDB documents
Create LaTeX/BibTeX bibliographies RefDB integrates quite nicely with the LaTeX/BibTeX system. If you previously used a flat text file to store your BibTeX references, you will notice that there is only one additional command to run when you process your source document. Instead of keeping all of your references in a text file, refdbib will retrieve only the required references from the SQL database and store them in an intermediate text file. Prepare the document Use the LaTeX commands cite and nocite to include the references as usual. The extended commands from the natbib package should work as well. All these commands take an identifier for the reference as an argument. These reference definitions can come in two flavours just like in DocBook documents: Either you use the same database for all references in the text. Then you just specify the citation key of the reference and tell the processing application which database to use. Or you specify the database name with each citation. In this case, you can pull the references from different databases in the same document. The two versions look like this: \cite{Miller1999} \cite{litibp:Myers2001} The first version cites the reference with the citation key Miller1999 in the database passed to the processing application as an argument. The second form cites the reference with the citation key Myers2001 in the database litibp. Please note that, in contrast to SGML/XML citations, the database part is separated by a colon from the citation key. The LaTeX \bibliography command takes as an argument the name of the intermediate bibliography file without the extension. A simple choice would be the basename of your LaTeX document. Keep in mind that even if you pull references from different RefDB databases, you still need to specify only one reference database in your LaTeX document as RefDB consolidates all cited references into one bibliography file. Create the auxiliary file Run the latex interpreter with the basename of your document (foo.tex) as an argument: #~ latex foo latex will create, among other files, foo.aux. latex stores all sorts of information in these auxiliary files for later use in subsequent runs. The interesting part for us is the list of citations. Create the intermediate bibliography file Now RefDB enters the stage. We process the auxiliary file to create a BibTeX bibliography tailored to our document. Either we do it manually: #~ sort foo.aux | uniq | refdbib -d mybib -S name -t bibtex > foo.bib The .aux file should be preprocessed through sort and uniq as shown here to avoid duplicate entries in your bibliography. Or we use the runbib shell script: #~ runbib -d mybib -S name -t bibtex foo Remember that the basename of the file that receives the bibliographic information (foo.bib in our example) must match the name given in the bibliography command in the LaTeX document. The resulting bibliography file will contain all references that were requested from the LaTeX document. If you add more citations to this document, you have to run refdbib again to update the intermediate bibliography file (it won't hurt if you remove citations from your LaTeX document, though). For the sake of consistency with bibtex, it is possible (though not necessary) to specify the auxiliary file without the .aux extension (foo in the above example). Run bibtex From here, everything runs as you are used to from LaTeX/BibTeX: #~ bibtex foo Run latex Run latex on your LaTeX document at least twice to get all references right: #~ latex foo && latex foo Create RTF bibliographies Rich Text Format (RTF) is a plain-text format understood by most word processors. While RefDB does not integrate into the menu bar of M$ Word or OpenOffice, it still allows you to add bibliographies to word processor documents saved as RTF files. This is a one-way process which leaves your original document untouched. You can edit the compound document and save it to native word processor formats like .doc or .odt, but you'll have to start over with the RTF document as soon as you add, change, or remove citations. Therefore the following sequence (which will be familiar to the SGML/XML and LaTeX folks) is recommended when using RefDB to create bibliographies for word processor documents: Author your document Write the contents of your document until you're really done. Use the citation format described further down. It does not matter which file format you use at this stage, as long as you can export it to RTF in the end. Save your document in RTF format Now save your document as a RTF file. There may be an extra menu entry called Export but usually you can just select the file format in the Save as... dialog. Create and insert the bibliography The exact procedure will be described below. The runbib command creates a bibliography file, and the refdbrtf tool combines the source document and the bibliography file to a new compound RTF document. Note that neither your word processor document nor the RTF copy are altered by this procedure. Import and finalize your document You can now open the compound RTF document using your word processor and add final touches (like adding images which you don't need during the authoring step). You can save the document in a word processor format, print it, or export it as a PDF file. As with SGML and XML documents, RTF documents can be maintained in a simple fashion using a refdbnd-created Makefile. The more complex way of running the involved tools manually essentially parallels the way used for SGML and XML documents and will not be elaborated here. Create a RTF document for use with RefDB In contrast to SGML and XML documents, there is nothing special about RTF documents that you can use with RefDB. You should still run refdbnd and select "rtf" as a document type. This will generate a suitable Makefile and a skeleton RTF document. You can open that with your favourite word processor, or copy an existing RTF document and save it under the same name. Create citations in word processor documents RefDB recognizes a simple plain-text citation format in RTF documents. Citations are enclosed in square brackets. Inside a citation, each reference is again enclosed in square brackets. References are identified by their citation keys, followed by one of "-X", "-A", and "-Y" to denote regular citations, author-only citations, or year-only citations, respectively (the RefDB low-level tools handle the first vs. subsequent occurrence issue silently for you, therefore there is no need for "-S" and "-Q" although these are valid too). The following text snippet shows some citations: ...was shown[[Miller1999-X]]. This was confirmed by other groups as well [[Doe2000-X][Jones2000-X]]. However, [[Nerd2002-A]] challenged this view in a recent work[[Nerd2002-Y]]... Process RTF documents As word processor documents lack the separation between content and formatting, there is usually no transformation required to read or print a document. However, as the processing requirements from RefDB's point of view are not any different between RTF and XML documents, RefDB still has to transform your RTF document - to yet another RTF document. While doing so, it massages your in-text citations into appropriately formatted links to the bibliographic entries, and appends a formatted bibliographic listing. All you need to do is to run make. This will create the output file foo.refdb.rtf from your project file foo.rtf. Using custom stylesheets to process documents with bibliographies The RefDB stylesheets handle the oddities of formatting your bibliographies. The stock DocBook or TEI stylesheets handle the remainder of your documents. What if the formatting of the latter is not to your liking? To this end, the recommended way is to use stylesheet driver files which override those parameters, or entire sections, of the stylesheets which you need modified. Now, processing documents containing RefDB bibliographies with regular DocBook or TEI driver files won't do you any good as you'll lose the journal-specific citation and bibliography support. However, you can easily design driver files which accomplish the task at hand. refdbnd-created Makefiles contain hooks to use custom driver files; if you prefer to run the transformations manually, these Makefiles will also tell you how. The relevant Makefile section looks like this: # options to use customized RefDB driver files, if any fodriveropt = -a custom-fo.xsl htmldriveropt = -b custom-html.xsl xhtmldriveropt = -c custom-xhtml.xsl As shown here, you can pass options to runbib which specify custom driver files. You can keep those in the same directory as the document itself, or specify a relative or full path. Your custom driver files must include the appropriate RefDB stylesheets, not the stock DocBook or TEI stylesheets, like this (shown for the fo driver file): <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:import href="/usr/local/share/refdb/xsl/docbk-refdb-xsl/docbk-fo/docbk-refdb-fo.xsl"/> <!-- your customizations here --> </xsl:stylesheet>
refdb-1.0.2/doc/chapter-cs-protocol.xml000644 001750 001750 00000316425 11512721663 020640 0ustar00markusmarkus000000 000000 The RefDB client/server communication protocol This chapter describes the communication protocol that the RefDB clients and server use to talk to each other. Knowledge of this protocol is useful for programmers who want to write custom RefDB clients. The protocol is versioned in order to allow clients and servers to negotiate whether they can fulfil each other's expectations. The protocol described in this document is version 5. The RefDB project provides a Perl client module in addition to the C clients shipped with the RefDB package proper. Due to the simplicity of the Perl language, this module is a good resource for programmers who want to implement clients in other programming languages. Prerequisites Custom clients or client libraries can be implemented in any programming language that can create a Unix socket connection to the server and send/receive byte sequences through the socket. As the transferred data are essentially plain text, the endianness of the computer as well as the internal representation of data types in the particular programming language are irrelevant. Basic principles refdbd is implemented as a forking server. The parent process waits to accept connections from the clients. If a valid connection request is detected, the server forks. The parent closes the connection and is ready to respond to further requests. The child processes the client request and terminates when done. The communication between the client and the server is at least a two-stage process. In the first stage, the validity of the client request is checked, the protocol version is checked and the password encryption is initiated. In the second stage, the command proper is executed and the results are sent back to the client. The second stage may use several iterations of client/server messages in order to transfer larger amounts of data. Message format All data, that is client commands as well as the server-generated results, are sent as plain text. We have to distinguish between three types of messages: Status messages Status messages are unterminated three-byte sequences which encode the client or server status. They may precede terminated messages, but they can also appear alone. The three bytes are a text representation of the client or server status. E.g. the sequence "000" (that is, three times the ASCII character 48 representing the digit 'zero') denotes an OK status. A listing of the status messages used by RefDB is shown in the section Status Messages. Terminated messages Most of the data transfer between client and server uses terminated messages. Due to the support of multibyte character sets the string termination character is not a single '\0' character as in a C string, but a sequence of four consecutive '\0' bytes (sequences of up to three '\0' bytes may occur as part of multibyte Unicode characters). It is best to think of the messages as binary strings. A custom client has to terminate its messages to the server appropriately, and it has to scan the data sent back by the server for the terminating sequence. Messages of a specified length In a few cases, the client asks the server to provide a buffer of a certain size, and will subsequently transfer exactly the requested number of bytes. These messages are unterminated. First stage The purpose of the first stage is to check whether the client request makes sense at all, and if so, to initiate the exchange of the password encryption information. Sanity and permission check Unless told otherwise, refdbd accepts only local connections. If the client request stems from a computer with a different IP address than the computer that runs refdbd, the connection request is refused without any further attempt to talk to the client. From the client side the connection will simply time out. This "unfriendly" behaviour minimizes the risk of remote exploits. If the client is allowed to connect, refdbd tries to read a terminated string from the client. If this string is too short or too long to represent the protocol number which the client is supposed to send, the connection request is refused by sending back an appropriate status message. The same occurs if the protocol version of the client is not supported by the server. Password encryption The RefDB clients may have to transmit the database username and password in order to authenticate the user with the database server. In order to avoid sending the password across the network as plain text, the clients send encrypted versions, which the refdbd server decrypts again. Database engine client libraries usually employ their own means to encrypt the passwords when they are sent from refdbd to the database engine. RefDB uses a fairly simple password encryption. It is still too cumbersome to decrypt for bored script kiddies so it should serve it's purpose. The encryption is somewhat modeled after the (in)famous ENIGMA boxes used by the bad guys in WWII. The basic idea is that refdbd sends a string to the client which encodes the (randomly generated) rotor sequence and positions for this particular connection. The client uses this information to encode the password. The server can decrypt the password using the sequence and position information that it previously generated. The rotor wirings are hardcoded. Any client or library has to use the same wirings as in src/filename.c. The encoding string has the format "ABC-DE-FG-HI", which stands for: ABC This three-digit string denotes the sequence of the wheels. ABC denote the wheels in slots 0, 1, and 2, respectively. The wheels are also numbered 0 through 2, and each wheel can be used only once. That is, all valid combinations are "012", "021", "102", "120", "210", "201". For example, the string "120" means that wheel 1 is inserted in slot 0, wheel 2 in slot 1, and wheel 0 in slot 2. DE The position of the wheel in slot 0. A two-digit integer equal to or larger than 0 and smaller than 94. For example, the string "05" means the wheel in slot 0 has to advance 5 positions. FG Same as DE, but for slot 1. HI Same as DE, but for slot 2. The encryption and decryption itself is described in sufficient detail in the source file src/enigma.c or in the Client.pm file of the RefDBClient Perl module. If you cannot implement this mechanism in your favourite programming language, there is also an external program eenc as part of the RefDB distribution which performs the encryption/decryption and sends the result to stdout. Use it like this: ~$ eenc -p ABC-DE-FG-HI password Most programming languages allow to read the results from stdout into a variable and use it as the encrypted or decrypted string. There is no switch for encryption or decryption as the ENIGMA mechanism is symmetrical. Second stage As the first step of the second stage the client sends the command string proper. These strings are commands as you know them from your shell. They are roughly equivalent to the command strings that you type into the C clients. refdbd parses the command string internally with the getopt library, just as your shell does. After the command string is parsed, refdbd executes the command. The result is returned in at least two steps. With one exception, refdbd first sends back the command result, followed by a command summary. For example, the listdb command first sends back a newline-separated list of database names (the command result proper), followed by the number of available databases (the command summary). These steps are explained in more detail in the following sections. First we'll have a look at the internal command syntax. Command syntax Each command consists of the command word proper, optionally followed by switches, options, and arguments. As the string is parsed by the getopt library, the sequence of options, commands, and arguments does not matter. The following synopsis shows all possible switches and options. command -a -A in_format -b listname -d database -E encoding -G URL -H host -k -n -N limit[:offset] -o number -p -P -r -R pdfroot -s format_string -S sort_string -t ref_format -u username -U name -w password -W newuser_password -a The commands getjo, getjf, getj1, and getj2 use this switch to request all journal names (short, full, user abbrev1, and user abbrev2) instead of only the one used to match the query. -A in_format The input data format for addref, updateref, and checkref. Currently supported values are "ris" and "risx". -b listname Specifies the name of a personal reference list. -d database This option sets the name of the database to be used with the current command. -E encoding This option sets the character encoding for the current command. -G URL The getref command uses this option to pass the URL of a CSS stylesheet to the server. -H host The adduser command uses this option to set the hostname or IP address of the user to be added. -k This switch tells the addref command to preserve the numerical ID of the datasets in the U5 field. -n namespace This option passes a namespace prefix to the getref and getnote commands (applies only to XML output) -N limit[:offset] The getref command and all other get* commands use this option to limit the range of datasets to return. limit denotes the number of references to return, and offset is an optional number of references to skip at the beginning. -o number This option is used to set a custom starting number for numeric bibliographies. -p This option is used with the addref and updateref commands. If set, refdbd will update personal info only. -P If used with the getref command, only references in the personal interest list will be returned. -r This switch is used with several commands to turn an "add" operation into a "remove" operation. -R pdfroot This option tells the getref command the variant part of the link to an electronic offprint. -s format_string getbib uses this option to pass the bibliography style. Checkref uses this option to request additional fields in the xhtml output. -S sort_string The name of the bibliography style to be used with the getbib command. -t ref_format The output format of the references retrieved with the getref and getbib commands. -u username The username to be used to authenticate with the database engine. -U name The name of the user to be associated with a query. -w password The password to be used to authenticate with the database engine. -W newuser_password The adduser command uses this option to set the password of the new user. Commented abstract representation of the client/server protocol This chapter tries to explain the client/server protocol of all currently supported RefDB commands using an abstract representation which should be fairly easy to port to any real programming language. First stage step client server message type comment 1 6\0\0\0\0 the current protocol version, a terminated string of up to 16 characters. The whole string will be converted to an integer internally. The current protocol version of RefDB is a compile-time constant which is defined in src/connect.h. 2 000ABC-DE-FG-HI\0\0\0\0 ok the ok status message, followed by the randomly generated encryption string error there is no server response in case of a refused remote connection 102, 103, 104, or 801 error an error status message, ending the dialog 3 000command\0\0\0\0 ok the ok status message, followed by the command proper. See below for details. 112 error the error status code signalling a client error Second stage The second stage is the more interesting part of the protocol, as it is here where the commands differ. The following section briefly explain the inner workings of the commands and show an abstract representation of the protocol. addlink The internal API command addlink corresponds to refdbc: addlink. step client server message type comment 1 000addlink [options] link-spec [link-spec...]\0\0\0\0 ok the ok message status, followed by the terminated addlink command sting 2 000<data>\0\0\0\0 ok the ok message status, followed by a terminated string containing the command result 803 partial success, aborted after unrecoverable error the error message status, followed by a terminated string containing the command result 204, 417, 233, or 801 error the error message status which terminates the session 3 000 ok the ok message status 4 000<data>\0\0\0\0 ok the ok message status, followed by a terminated string containing the command result summary 5 000 ok the ok message status, ending the dialog addnote The internal API command addnote corresponds to refdbc: addnote. step client server message type comment 1 000addnote [options] filename\0\0\0\0 ok the ok message status, followed by the terminated addnote command sting 2 000 ok the ok message status 701 warning the warning message status 202, 204, or 801 error the error message status which terminates the session 3 000<bytes>\0\0\0\0 ok the ok message status, followed by a terminated string denoting the number of bytes that the client wants to transmit 402 ok the message status saying that all data have been sent, ending the loop over all datasets 404 ok the message status saying that the current dataset has been sent completely 401 error the message status saying that there was a problem reading the input data, ending the session 4 000 ok the ok message status 801 error the error message status, ending the session 5 <data> ok the previously announced number of data bytes 6 403 ok the ok status for a successfully transmitted chunk of data 400<message>\0\0\0\0 error the error status, followed by a terminated, server-generated error message specifying the error 408 or 413 ok the message status denoting success of the previous add or update action 702, 801 error the error status, followed by a terminated, server-generated error message specifying the error 7 see step 3 ok repeat loop until end of data 402 ok the message status saying that all data have been sent, ending the loop over all datasets 404 ok the message status saying that the current dataset has been sent completely 8 403<result message>\0\0\0\0 ok the ok status signalling that a chunk has been added successfully, followed by the terminated server result message, finishing the dialog 9 000 ok the ok message status, ending the dialog addref, updateref, checkref The addref and updateref commands send bibliographic data in various formats to the database in order to add or update them, respectively. The related checkref command also sends bibliographic data to the server in order to check for duplicates. The client/server protocols differ slightly based on the type of data transferred. RIS data are transmitted one dataset at a time, whereas XML data are streamed in chunks of a defined size. step client server message type comment 1 000XXref -s ris [options]\0\0\0\0 ok the ok message status, followed by the terminated addref command sting 2 000 ok the ok message status 701 warning the warning message status 202, 401, or 801 error the error message status which terminates the session 3 000<bytes>\0\0\0\0 ok the ok message status, followed by a terminated string denoting the number of bytes that the client wants to transmit 402 ok the message status saying that all data have been sent, ending the loop over all datasets 401 error the message status saying that there was a problem reading the input data, ending the session 4 000 ok the ok message status 801 error the error message status, ending the session 5 <data> ok the previously announced number of data bytes 6 403 ok the ok status for a successfully transmitted chunk of data 400<message>\0\0\0\0 error the error status, followed by a terminated, server-generated error message specifying the error 408<message>\0\0\0\0 or 413<message>\0\0\0\0 ok the message status denoting success of the previous add or update action, followed by the current value of the dataset counter 702, 801 error the error status, followed by a terminated, server-generated error message specifying the error 7 see step 3 ok repeat loop until end of data 402 ok the message status saying that all data have been sent, ending the loop over all datasets 8 403<data>\0\0\0\0 ok the ok status signalling that a chunk has been added successfully, followed by an optional terminated string containing a result message 9 000 ok the ok message status 10 000<data>\0\0\0\0 ok the ok message status, followed by a terminated string containing the command result summary 11 000 ok the ok message status, ending the dialog And now the slightly different protocol for risx data: step client server message type comment 1 000addref -s risx [options]\0\0\0\0 ok the ok message status, followed by the terminated addref command sting 2 000 ok the ok message status 701 warning the warning message status 202, 204, or 801 error the error message status which terminates the session 3 000<bytes>\0\0\0\0 ok the ok message status, followed by a terminated string denoting the number of bytes that the client wants to transmit 402 ok the message status saying that all data have been sent, ending the loop over all datasets 404 ok the message status saying that the current dataset has been sent completely 401 error the message status saying that there was a problem reading the input data, ending the session 4 000 ok the ok message status 801 error the error message status, ending the session 5 <data> ok the previously announced number of data bytes 6 403 ok the ok status for a successfully transmitted chunk of data 400<message>\0\0\0\0 error the error status, followed by a terminated, server-generated error message specifying the error 408<message>\0\0\0\0 or 413<message>\0\0\0\0 ok the message status denoting success of the previous add or update action, followed by the current value of the dataset counter 702, 801 error the error status, followed by a terminated, server-generated error message specifying the error 7 see step 3 ok repeat loop until end of data 402 ok the message status saying that all data have been sent, ending the loop over all datasets 8 403<data>\0\0\0\0 ok the ok status signalling that a chunk has been added successfully, followed by an optional terminated string containing the result message 9 000 ok the ok message status 10 000<data>\0\0\0\0 ok the ok message status, followed by a terminated string containing the command result summary 11 000 ok the ok message status, ending the dialog addstyle The internal API command addstyle corresponds to refdba: addstyle. step client server message type comment 1 000addstyle [options] filename\0\0\0\0 ok the ok message status, followed by the terminated addstyle command sting 2 000 ok the ok message status 104, 105, 106, 107, 108, 202, 203, 204, 206, or 801 error the error message status which terminates the session 3 000<bytes>\0\0\0\0 ok the ok message status, followed by a terminated string denoting the number of bytes that the client wants to transmit 402 ok the message status saying that all data have been sent, ending the loop over all datasets 404 ok the message status saying that the current dataset has been sent completely 401 error the message status saying that there was a problem reading the input data, ending the session 4 000 ok the ok message status 801 error the error message status, ending the session 5 <data> ok the previously announced number of data bytes 6 403 ok the ok status for a successfully transmitted chunk of data 400<message>\0\0\0\0 error the error status, followed by a terminated, server-generated error message specifying the error 7 see step 3 ok repeat loop until end of data 402 ok the message status saying that all data have been sent, ending the loop over all datasets 404 ok the message status saying that the current dataset has been sent completely 8 403<result message>\0\0\0\0 ok the ok status signalling that a chunk has been added successfully, followed by the terminated server result message, finishing the dialog 9 000 ok the ok message status, ending the dialog adduser The internal API command adduser corresponds to refdba: adduser. step client server message type comment 1 000adduser [options]\0\0\0\0 ok the ok message status, followed by the terminated adduser command sting 2 000 ok the ok message status 202224 or 801 error the error message status which terminates the session 3 000<names>\0\0\0\0 ok the ok message status, followed by a terminated string containing a list of names 4 000<summary>\0\0\0\0 ok the ok message status 205 801 error the message status saying that there was a problem, ending the session 5 000 ok the ok message status, ending the dialog addword The internal API command addword handles both the refdba: addword and the refdba: deleteword client commands. step client server message type comment 1 000addword [options]\0\0\0\0 ok the ok message status, followed by the terminated addword command sting 2 000 ok the ok message status 202, or 801 error the error message status which terminates the session 3 000<data>\0\0\0\0 ok the ok message status, followed by a terminated string containing the word list 112 error the error message status which terminates the session 4 000<data>\0\0\0\0 ok the ok message status, followed by a terminated string containing the command result 5 000 ok the ok message status 6 000<data>\0\0\0\0 ok the ok message status, followed by a terminated string containing the command result summary 7 000 ok the ok message status, ending the dialog confserv The internal API command confserv corresponds to refdba: confserv. step client server message type comment 1 000confserv command [argument]\0\0\0\0 ok the ok message status, followed by the terminated confserv command sting 2 000<data>\0\0\0\0 ok the ok message status, followed by a terminated string containing the command result 202, 301, 801, 839, 840 error the error message status which terminates the session 3 000 ok the ok message status 4 000<data>\0\0\0\0 ok the ok message status, followed by a terminated string containing the command result summary 5 000 ok the ok message status, ending the dialog createdb The internal API command createdb corresponds to refdba: createdb. step client server message type comment 1 000createdb [options]dbname\0\0\0\0 ok the ok message status, followed by the terminated createdb command sting 2 000<data>\0\0\0\0 ok the ok message status, followed by a terminated string containing the command result 111, or 801 error the error message status which terminates the session 3 000 ok the ok message status 4 000<data>\0\0\0\0 ok the ok message status, followed by a terminated string containing the command result summary 5 000 ok the ok message status, ending the dialog deletedb The internal API command deletedb corresponds to refdba: deletedb. step client server message type comment 1 000deletedb [options]\0\0\0\0 ok the ok message status, followed by the terminated deletedb command sting 2 000<data>\0\0\0\0 ok the ok message status, followed by a terminated string containing the command result 202, or 801 error the error message status which terminates the session 3 000 ok the ok message status 4 000<data>\0\0\0\0 ok the ok message status, followed by a terminated string containing the command result summary 5 000 ok the ok message status, ending the dialog deletenote The internal API command deletenote corresponds to refdbc: deletenote. step client server message type comment 1 000deletenote [options] <bytes>\0\0\0\0 ok the ok message status, followed by the terminated adduser command sting containing the number of bytes required to store the ID list. 2 000 ok the ok message status 111 801 error the error message status which terminates the session 3 000<ID-list>\0\0\0\0 ok the ok message status, followed by a terminated string containing a list of note IDs 4 000<data>\0\0\0\0 ok the ok message status, followed by a report about the delete actions 204, 412, 801 error the message status saying that there was a problem, ending the session 5 000 ok the ok message status 6 000<summary>\0\0\0\0 ok the ok message status, followed by a command summary 7 000 ok the ok message status, ending the dialog deleteref The internal API command deleteref corresponds to refdbc: deleteref. step client server message type comment 1 000deleteref [options] <bytes>\0\0\0\0 ok the ok message status, followed by the terminated adduser command sting containing the number of bytes required to store the ID list. 2 000 ok the ok message status 801 error the error message status which terminates the session 3 000<ID-list>\0\0\0\0 ok the ok message status, followed by a terminated string containing a list of reference IDs 4 000<data>\0\0\0\0 ok the ok message status, followed by a report about the delete actions 204, 412, 801 error the message status saying that there was a problem, ending the session 5 000 ok the ok message status 6 000<summary>\0\0\0\0 ok the ok message status, followed by a command summary 7 000 ok the ok message status, ending the dialog deletestyle The internal API command deletestyle corresponds to refdba: deletestyle. step client server message type comment 1 000deletestyle {regexp}\0\0\0\0 ok the ok message status, followed by the terminated deletestyle command sting 2 000<data>\0\0\0\0 ok the ok message status, followed by a terminated string containing the command result 202, 234, or 801 error the error message status which terminates the session 3 000 ok the ok message status 4 000<data>\0\0\0\0 ok the ok message status, followed by a terminated string containing the command result summary 5 000 ok the ok message status, ending the dialog getau, geted, getas, getkw, getjo, getjf, getj1, getj2 These internal API commands correspond to the client commands refdbc: getau, refdbc: geted, refdbc: getas, refdbc: getkw, refdbc: getjo, refdbc: getjf, refdbc: getj1, refdbc: getj2. step client server message type comment 1 000getXX [options]\0\0\0\0 ok the ok message status, followed by the terminated command sting 2 000<data>\0\0\0\0 ok the ok message status, followed by a terminated string containing the command result 204, 208, 234, or 801 error the error message status which terminates the session 3 000 ok the ok message status 4 000<data>\0\0\0\0 ok the ok message status, followed by a terminated string containing the command result summary 5 000 ok the ok message status, ending the dialog getbib The internal API command getbib is used by the refdbib tool to retrieve cooked SGML and XML bibliographies. step client server message type comment 1 000getbib [options]\0\0\0\0 ok the ok message status, followed by the terminated getbib command string. 2 000 ok the ok message status, meaning no style spec will be transmitted (jump to 4) 402 ok the ok message status, meaning the style spec will be transmitted 202, 204, 241, 701, 801 error the error message status, terminating the dialog 3 000 ok the ok message status 4 000 ok the ok message status 242 error the error message status, finishing the dialog 5 000<bytes>\0\0\0\0 ok the ok message status, followed by a terminated string denoting the number of bytes that the client wants to transmit 402 ok the message status saying that all data have been sent, ending the loop over all datasets 404 ok the message status saying that the current dataset has been sent completely 401 error the message status saying that there was a problem reading the input data, ending the session 6 000 ok the ok message status 801 error the error message status, ending the session 7 <data> ok the previously announced number of data bytes 8 403 ok the ok status for a successfully transmitted chunk of data 400<message>\0\0\0\0 error the error status, followed by a terminated, server-generated error message specifying the error 9 000 ok the ok message status 10 404 ok the ok status for a successfully transmitted chunk of data 402 ok the ok status for the last chunk of data 11 000 ok the ok message status 12 000<summary>\0\0\0\0 ok the ok message status, followed by the terminated command summary string. 13 000 ok the ok message status, finishing the dialog getnote, countnote The internal API command getnote corresponds to refdbc: getnote and refdbc: countnote. step client server message type comment 1 000getnote [options] <bytes>\0\0\0\0 ok the ok message status, followed by the terminated getref command sting containing the number of bytes required to store the query string 2 000 ok the ok message status 801 error the error message status which terminates the session 3 000<query-string>\0\0\0\0 ok the ok message status, followed by a terminated string containing the query 4 404<data>\0\0\0\0 ok the ok message status denoting a complete dataset, followed by a terminated string containing the dataset 402<data>\0\0\0\0 ok the ok message status denoting the last chunk of data (usually a "footer"), followed by a terminated string containing the data 204, 234, 701, or 801 error the error message status which terminates the session 5 000 ok the ok message status 6 402<data>\0\0\0\0 ok the ok message status denoting the last chunk of data (usually a "footer"), see step 2 7 000<data>\0\0\0\0 ok the ok message status, followed by a terminated string containing the command result summary 702, or 801 error the error message status which terminates the session 8 000 ok the ok message status, ending the dialog getref, countref The internal API command getref corresponds to refdbc: getref and refdbc: countref. step client server message type comment 1 000getref [options] <bytes>\0\0\0\0 ok the ok message status, followed by the terminated getref command sting containing the number of bytes required to store the query string (including the terminal NULL bytes) 2 000 ok the ok message status 301 error the error message status which terminates the session 801 error the error message status which terminates the session 3 000<query-string>\0\0\0\0 ok the ok message status, followed by a terminated string containing the query 4 404<data>\0\0\0\0 ok the ok message status denoting a complete dataset, followed by a terminated string containing the dataset 402<data>\0\0\0\0 ok the ok message status denoting the last chunk of data (usually a "footer"), followed by a terminated string containing the data 204, 234, 701, or 801 error the error message status which terminates the session 5 000 ok the ok message status 6 402<data>\0\0\0\0 ok the ok message status denoting the last chunk of data (usually a "footer"), see step 2 7 000<data>\0\0\0\0 ok the ok message status, followed by a terminated string containing the command result summary 702, or 801 error the error message status which terminates the session 8 000 ok the ok message status, ending the dialog getrefx The internal API command getrefx is used by the refdbib tool to retrieve raw SGML and XML bibliographies. step client server message type comment 1 000getrefx [options]\0\0\0\0 ok the ok message status, followed by the terminated getbib command string. 2 000 ok the ok message status 204, 701, 801 error the error message status, terminating the dialog 3 000<bytes>\0\0\0\0 ok the ok message status, followed by a terminated string denoting the number of bytes that the client wants to transmit 402 ok the message status saying that all data have been sent, ending the loop over all datasets 404 ok the message status saying that the current dataset has been sent completely 401 error the message status saying that there was a problem reading the input data, ending the session 4 000 ok the ok message status 801 error the error message status, ending the session 5 <data> ok the previously announced number of data bytes 6 403 ok the ok status for a successfully transmitted chunk of data 400<message>\0\0\0\0 error the error status, followed by a terminated, server-generated error message specifying the error 7 000 ok the ok message status 8 404 ok the ok status for a successfully transmitted chunk of data 402 ok the ok status for the last chunk of data 234, 801, 702 error the error message status 9 000 ok the ok message status 10 000<summary>\0\0\0\0 ok the ok message status, followed by the terminated command summary string. 11 000 ok the ok message status, finishing the dialog getstyle The internal API command getstyle corresponds to refdba: getstyle. step client server message type comment 1 000getstyle [options][regexp]\0\0\0\0 ok the ok message status, followed by the terminated getstyle command sting 2 000<data>\0\0\0\0 ok the ok message status, followed by a terminated string containing the command result 202, or 801 error the error message status which terminates the session 3 000 ok the ok message status, ending the dialog gettexbib The internal API command gettexbib is used by the refdbib tool to retrieve bibtex bibliographies. step client server message type comment 1 000gettexbib [options] data-size\0\0\0\0 ok the ok message status, followed by the terminated gettexbib command string. The only non-option argument is the size, in bytes, of the ID data to be sent, including the terminator. 2 000 ok the ok message status 801 error the error message status, terminating the dialog 3 000id-data\0\0\0\0 ok the ok message status, followed by the terminated ID list. This is a whitespace separated list of ID or CK values. 4 404<data>\0\0\0\0 ok the ok message status denoting a complete dataset, followed by a terminated string containing the dataset 402<data>\0\0\0\0 ok the ok message status denoting the last chunk of data (usually a "footer"), followed by a terminated string containing the data 204, 234, 269, 701, 801, or 842 error the error message status which terminates the session 5 000 ok the ok message status 6 402<data>\0\0\0\0 ok the ok message status denoting the last chunk of data (usually a "footer"), see step 4 7 000 ok the ok message status 8 000<data>\0\0\0\0 ok the ok message status, followed by a terminated string containing the command result summary 702, or 801 error the error message status which terminates the session 9 000 ok the ok message status, ending the dialog listdb The internal API command listdb corresponds to refdbc: listdb. step client server message type comment 1 000listdb [regexp]\0\0\0\0 ok the ok message status, followed by the terminated listdb/selectdb command sting 2 000<data>\0\0\0\0 ok the ok message status, followed by a terminated string containing the command result 202, 225, 226, 802, or 802 error the error message status which terminates the session 3 000 ok the ok message status 4 000<data>\0\0\0\0 ok the ok message status, followed by a terminated string containing the command result summary 5 000 ok the ok message status, ending the dialog liststyle The internal API command liststyle corresponds to refdbc: liststyle. step client server message type comment 1 000liststyle [options][regexp]\0\0\0\0 ok the ok message status, followed by the terminated liststyle command sting 2 000<data>\0\0\0\0 ok the ok message status, followed by a terminated string containing the command result 202, or 801 error the error message status which terminates the session 3 000 ok the ok message status 4 000<data>\0\0\0\0 ok the ok message status, followed by a terminated string containing the command result summary 5 000 ok the ok message status, ending the dialog listuser The internal API command listuser corresponds to refdba: listuser. step client server message type comment 1 000listuser [options] regexp\0\0\0\0 ok the ok message status, followed by the terminated listuser command sting 2 000<data>\0\0\0\0 ok the ok message status, followed by a terminated string containing the command result 204, 207, or 801 error the error message status which terminates the session 3 000 ok the ok message status 4 000<data>\0\0\0\0 ok the ok message status, followed by a terminated string containing the command result summary 5 000 ok the ok message status, ending the dialog listword The internal API command listword corresponds to refdba: listword. step client server message type comment 1 000listword regexp\0\0\0\0 ok the ok message status, followed by the terminated listword command sting 2 000<data>\0\0\0\0 ok the ok message status, followed by a terminated string containing the command result 204, 207, or 801 error the error message status which terminates the session 3 000 ok the ok message status 4 000<data>\0\0\0\0 ok the ok message status, followed by a terminated string containing the command result summary 5 000 ok the ok message status, ending the dialog pickref The internal API command pickref handles the client commands refdbc: pickref and dumpref. step client server message type comment 1 000pickref [options] <bytes>\0\0\0\0 ok the ok message status, followed by the terminated pickref command sting containing the number of bytes required to store the ID list. 2 000 ok the ok message status 111 801 error the error message status which terminates the session 3 000<ID-list>\0\0\0\0 ok the ok message status, followed by a terminated string containing a list of note IDs 4 000<data>\0\0\0\0 ok the ok message status, followed by a report about the pick or dump actions 204, 412, 801 error the message status saying that there was a problem, ending the session 5 000 ok the ok message status 6 000<summary>\0\0\0\0 ok the ok message status, followed by a command summary 227, 228, 234 error the error status, terminating the dialog 7 000 ok the ok message status, ending the dialog scankw The internal API command scankw corresponds to refdba: scankw. step client server message type comment 1 000scankw -d <databasename>\0\0\0\0 ok the ok message status, followed by the terminated scankw command sting 2 000<data>\0\0\0\0 ok the ok message status, followed by a terminated string containing the command result 204, 208, or 801 error the error message status which terminates the session 3 000 ok the ok message status 4 000<data>\0\0\0\0 ok the ok message status, followed by a terminated string containing the command result summary 5 000 ok the ok message status, ending the dialog selectdb The internal API command selectdb corresponds to refdbc: selectdb. step client server message type comment 1 000selectdb dbname\0\0\0\0 ok the ok message status, followed by the terminated listdb/selectdb command sting 2 000<data>\0\0\0\0 ok the ok message status, followed by a terminated string containing the command result 202, 225, 226, 802, or 802 error the error message status which terminates the session 3 000 ok the ok message status 4 000<data>\0\0\0\0 ok the ok message status, followed by a terminated string containing the command result summary 5 000 ok the ok message status, ending the dialog viewstat The internal API command viewstat corresponds to refdba: viewstat. step client server message type comment 1 000viewstat [options]\0\0\0\0 ok the ok message status, followed by the terminated viewstat command sting 2 000<data>\0\0\0\0 ok the ok message status, followed by a terminated string containing the command result 204, 208, or 801 error the error message status which terminates the session 3 000 ok the ok message status 4 000<data>\0\0\0\0 ok the ok message status, followed by a terminated string containing the command result summary 5 000 ok the ok message status, ending the dialog whichdb The internal API command whichdb corresponds to refdbc: whichdb. step client server message type comment 1 000whichdb\0\0\0\0 ok the ok message status, followed by the terminated whichdb command sting 2 000<data>\0\0\0\0 ok the ok message status, followed by a terminated string containing the command result 204, 207, or 801 error the error message status which terminates the session 3 000 ok the ok message status 4 000<data>\0\0\0\0 ok the ok message status, followed by a terminated string containing the command result summary 5 000 ok the ok message status, ending the dialog Status messages The status codes which are multiples of 100 are not associated with a fixed message. Instead, clients should retrieve the terminated string sent after these codes to read the dynamically generated message. refdb-manual-statustable.xml appears to be missing Tools for the client-server protocol eenc.1.xml appears to be missing refdb-1.0.2/doc/chapter-data-input.xml000644 001750 001750 00000136745 11512721663 020447 0ustar00markusmarkus000000 000000 Data input This chapter explains the ways how you can generate reference and extended note data suitable for RefDB databases. We'll cover manual generation of RIS files and automatic conversion of other bibliographic data with the help of input filters. You'll learn about writing risx documents, a new XML data format designed to simplify funneling XML or SGML bibliographic data into RefDB. risx is the preferable format to fully utilize RefDB's capabilities. Finally we'll cover writing extended notes that allow to append additional information to objects in your database or to categorize references in a very flexible way. To actually import the resulting RIS datasets into the RefDB database, use the addref command of the refdbc command line client, as explained in the next chapter. Writing RIS datasets Overview The Reference Manager Manual contains sort of a specification of the RIS data format. This format is a tagged file format with the following general rules: A file can hold one or more references Each reference starts with a newline. This also means that every RIS file starts with an empty line. There can be only one tag per line. The tag must be at the very beginning of the line. The tags consist of two capital letters denoting the type, followed by two spaces, a dash, and another space. The first tag of each reference is the Type tag (TY - ) The last tag of each reference is the End tag (ER - ) The sequence of all other elements is arbitrary. There is one exception: In the case of multiple authors, editors, or series editors, the sequence of these authors is significant. E.g. the first AU tag will be used as the first author, the last one as the last author. Therefore a minimal RIS file may look like this: TY - BOOK AU - Hoenicka,M. TI - The RefDB manual PY - 2001 ER - This is the empty line generated by a linefeed character (0x0A) that precedes every RIS citation, even at the start of a RIS file. This is the mandatory first tag, the type specifier. In this case, we're looking at a BOOK entry. This and the following lines are the contents proper of the citation. All additional tags would go here as well This is the mandatory last tag which closes the citation. Although invisible here, this tag also has a trailing space like all others. Character encodings The RIS specification has no built-in means to specify the character encoding of the data. Commercial applications usually expect the data to be supplied in a particular encoding (e.g. Reference Manager uses the Windows ANSI character set). RefDB does not have this limitation, you are free to use any encoding available on your platform (except UTF-16 and UTF-32). However, you should be aware that this may cause an interchange issue if you plan to use these data in a commercial reference management program. In any case, as the datasets do not specify their encoding, you have to use option of the getref command if your input data use an encoding different from the default (UTF-8). RIS tags The following list shows all available tags and their use. Please keep in mind that a full tag consists of the letters mentioned below followed by two spaces, a dash, and another space. E.g. the first tag below would be written as TY - in a RIS file. TY This tag specifies the type of the reference and must be the first tag of each RIS dataset, preceeded by a newline. Format: This can be any of the following strings: ABST (abstract reference) ADVS (audiovisual material) ART (art work) BILL (bill/resolution) BOOK (whole book reference) CASE (case) CHAP (book chapter reference) COMP (computer program) CONF (conference proceeding) CTLG (catalog) DATA (data file) ELEC (electronic citation) GEN (generic) HEAR (hearing) ICOMM (internet communication) INPR (in press reference) JFULL (journal/periodical - full) JOUR (journal/periodical reference) MAP (map) MGZN (magazine article) MPCT (motion picture) MUSIC (music score) NEWS (newspaper) PAMP (pamphlet) PAT (patent) PCOMM (personal communication) RPRT (report) SER (serial - book, monograph) SLIDE (slide) SOUND (sound recording) STAT (statute) THES (thesis/dissertation) UNBILL (unenacted bill/resolution) UNPB (unpublished work reference) VIDEO (video recording) ER This empty tag denotes the end of the reference. It must be the last tag of each RIS dataset. ID This tag is used to uniquely identify the reference in the database. The value is either the unique ID that RefDB generates when a reference is imported into a database, or a unique citation key. The latter can be supplied by the user. If no citation key is specified when adding a reference, RefDB will automatically generate a unique citation key, based on the name of the first author and the publication year. RefDB will create an unique ID value for internal use regardless of whether a citation key is provided or not. ID values are always numerical (e.g. "11"), whereas citation keys are alphanumerical (e.g. "Miller1999"). While you are free to choose any reasonable citation key (as long as it is unique within the database), you should not attempt to create a ID value manually. It is ignored when adding the dataset, but it may overwrite an existing entry if you update a reference. Along the same line, you should leave the ID tag alone if you retrieve a dataset from the database and plan to update it. The citation key in the retrieved data set is essential to match the modified data with the copy in the database. ID Format: Integer >0. Citation key Format: A string with up to 255 characters. You should use 7-bit ASCII characters only to avoid character encoding issues. If you want to work with SGML documents, the citation keys should be all uppercase. TI This is the title of a publication. For BOOK and UNPB references this is the same as the BT tag. Format: A string with unlimited length. T2 This is the secondary title of a publication, e.g. the book title for a CHAP reference. Format: A string with unlimited length. T3 This is the tertiary title of a publication, e.g. the series title for a CHAP reference. Format: A string with unlimited length. AU Synonym: A1. This is the name of one author of the reference. If a reference has multiple authors, each author is specified with an AU tag on a separate line. The number of authors per RIS dataset is not limited. The sequence of the authors in the authorlist will be determined from the sequence as they appear in the RIS dataset. Format: A string with up to 255 characters in the form: Lastname[,(F.|First)[(M.|Middle)...][,Suffix]]. First and middle names can either be abbreviated or spelled out. Use periods to separate initials, and spaces to separate spelled-out first or middle names. Lastname can be a corporate name. Some examples for valid entries: King,B.B. Benberg,Steven C. Mellencamp,John Cougar,Jr. Van Zandt,Steven A2 Synonym: ED. This is the name of an editor of the reference, e.g. an editor of the book in which a CHAP reference was published. The same formatting requirements as for AU apply. A3 This is the name of a series editor of the reference, e.g. an editor of a series of books in one of which a CHAP reference was published. The same formatting requirements as for AU apply. PY Synonym: Y1. This is the primary publication date. Format: A string with the format YYYY/MM/DD/otherinfo, where YYYY denotes the four-digit year, MM and DD denote the two-digit month and day, respectively, and otherinfo denotes any other information with up to 255 characters. If any of these parts is not available, it can be left out, but the slashes must be present. E.g. 1999///Christmas edition is a valid string. Y2 This is the secondary publication date. Format: A string with the format YYYY/MM/DD/otherinfo, where YYYY denotes the four-digit year, MM and DD denote the two-digit month and day, respectively, and otherinfo denotes any other information with up to 255 characters. If any of these parts is not available, it can be left out, but the slashes must be present. E.g. 1999///Christmas edition is a valid string. N1 Synonym: AB (this is not logical as it sounds like ABstract, but I'm sure there is a reason in RIS' crooked history). The notes. This can be any form of additional information, like pointers to corrections or editorials, or just personal notes about the contents of the reference. Format: A string with unlimited length N2 The abstract of a reference. Format: A string with unlimited length KW A keyword. If a publication has multiple keywords, each goes on a separate line preceeded with this tag. Keywords are crucial to find references in larger databases. Format: A string with up to 255 characters RP The reprint status of a reference. This can be any of the following strings: IN FILE NOT IN FILE ON REQUEST MM/DD/YY AV The availability information. This is a hint where you can find a physical copy or offprint of the reference. Format: A string with up to 255 characters. This can either be a plain-text description like "methods folder, second drawer from top in the green cabinet on the yellow hallway", or a call number. SP The start page of the reference Format: A string with up to 255 characters EP The end page of the reference Format: A string with up to 255 characters JO The abbreviated name of a journal or periodical. Format: A string with up to 255 characters. The components should be separated by a single space without a period after abbreviated words. If you use periods, these should not be followed by spaces. JF The full name of a journal or periodical. Format: A string with up to 255 characters J1 The abbreviated name of a journal or periodical (user abbreviation 1). Format: A string with up to 255 characters J2 The abbreviated name of a journal or periodical (user abbreviation 2). Format: A string with up to 255 characters VL The volume of the journal/periodical. Format: A string with up to 255 characters IS The issue of the journal/periodical Format: A string with up to 255 characters CY City of publication of a book. Format: A string with up to 255 characters PB Name of the publisher or the publishing company. Format: A string with up to 255 characters SN The ISBN or ISSN number. Format: A string with up to 255 characters AD The contact address, usually the any combination of postal or email address and the phone or fax number of the corresponding author. Format: A string of unlimited length UR The URL of an online version of the reference. Format: A string with up to 255 characters L1 through L4 These fields hold the URLs of an offprint (e.g. a PDF or Postscript copy), of the fulltext (often available as HTML in addition to PDF), of a related resource, and of an image, respectively. Multiple entries of each type per reference are allowed. In contrast to the UR field above, these fields hold information which is stored for each user separately. The L1 field is meant to store the location of local offprints. It is most common to use the "file://" protocol and specify a full path (starting with another slash on Unix systems) or a relative path. In the latter case the path is expanded with the pdfroot setting before it is displayed to the user. Using this feature requires some thought and is therefore explained in a separate section. Format: A string with up to 255 characters U1 through U5 The user-defined fields 1 through 5. These fields are not intended to be filled with random bits of information. Each database should have a set of rules what information is to be stored in these fields. A possible use for these fields is some relevance indicator (e.g. # means low, ##### means high relevance). You may also use one of these fields to create the equivalents of folders that some other reference databases praise as the panacea to organize your references. Just assign the same value to one of these fields for all references that belong to the same folder. Retrieve them by specifying this value in addition to your other search criteria. Format: A string with up to 255 characters M1 through M3 The miscellaneous fields 1 through 3. These fields are used by various reference types to deal with additional information that doesn't fit anywhere else, and the usage differs from one type to another. An important information among the data contained here is the digital object identifier. Please refer to the Reference Manager Manual for the nasty details of these fields. Format: A string with up to 255 characters Examples The following listing shows a few examples of valid RIS datasets. See also the example RIS file in the /usr/local/share/refdb/examples directory. Long entries like abstracts were divided into several lines using slashes. This is to make it more human-readable for this manual and should not be used in real data.   TY - JOUR T1 - T-lymphocytes from normal human peritoneum are phenotypically / different from their counterparts in peripheral blood and CD3- lymphocyte / subsets contain mRNA for the recombination activating gene RAG-1 A1 - Hartmann,J. A1 - Maassen,V. A1 - Rieber,P. A1 - Fricke,H. Y1 - 1995/// KW - Peritoneum KW - T cell KW - T lymphocyte KW - lymphocyte KW - immunology KW - CD3 KW - human KW - Adult KW - blood RP - IN FILE SP - 2626 EP - 2631 JF - European Journal of Immunology JA - Eur.J.Immunol. VL - 25 N2 - These findings are compatible with the hypothesis that the adult / human peritoneum provides a microenvirinment capable of supporting a / thymus-independent differentiation of T lymphocytes. ER - TY - BOOK T1 - Porphyrins and metalloporphyrins A1 - Smith,K.M. Y1 - 1975/// KW - Porphyrins KW - Metalloporphyrins KW - Spectrophotometry [methods] KW - spectroscopy RP - NOT IN FILE CY - Amsterdam PB - Elsevier Scientific Publishing Company ER - TY - CHAP T1 - Physiological studies of the natriuretic peptide family A1 - Lewicki,J.A. A1 - Protter,A.A. Y1 - 1995/// N1 - Atrial Natriuretic Peptide Cardiac synthesis and secretion of / ANP Regulation of ANP Gene Expression Regulation of ANP Release / ANP Receptors Biologic Actions of ANP Brain Natriuretic Peptide (BNP) / BNP Structure Biosynthesis of BNP Biological Actions of BNP C-Type / Natriuretic Peptide (CNP) Biologic Actions of CNP Modulators of / Natriuretic Peptide Clearance Effects of Clearance Receptor Blockers / Effects of Neutral Endopeptidase Inhibitors Role of the Natriuretic / Peitedes in Physiology and Disease Hypertension Congestive Heart / Failure Supraventricular Tachyarrhythmias Acute Renal Dysfunction KW - natriuretic KW - ANF KW - ANP KW - receptors KW - BNP KW - CNP KW - hypertension KW - congestive heart failure KW - review KW - cardiac KW - regulation KW - gene expression KW - expression KW - brain KW - structure KW - biosynthesis KW - receptor KW - inhibitor KW - physiology KW - renal KW - study KW - Peptides KW - atrial natriuretic peptide KW - MODULATOR KW - secretion KW - Gene Expression Regulation RP - IN FILE SP - 1029 EP - 1053 VL - 2 T2 - Hypertension: Pathophysiology, Diagnosis, and Management A2 - Laragh,J.H. A2 - Brenner,B.M. IS - 61 CY - New York PB - Raven Press, Ltd. ER - The Emacs helpers If your editor of choice should be Emacs or XEmacs, the separately available refdb-elisp package will come in handy. Please see the installation instructions contained in the source archive. The package consists of a major mode (ris-mode) to edit RIS datasets, and a minor mode (refdb-mode) which provides a general front-end to RefDB. refdb-mode is too powerful to be discussed here in a few lines, please see the separately available manual. The ris major mode can do the following things for you: Font-locking will help you to spot syntax errors in the tags. Especially the end tag (ER - ) is prone to lack the trailing space if you're not careful. The ris-mode displays regular tags in blue and the special type (TY - ) and end (ER - ) tags in red. Tags will be displayed in the default foreground color if anything is wrong with them, like invalid specifiers, lowercase specifiers, missing or additional spaces. ris-mode provides three commands to insert datasets ("references") and individual tags as described shortly. All of these commands have in common that they always start a new line after the current line if the cursor is not at the start of a line. Thus you can run these commands from any position of the current line and still get something that makes sense as a RIS dataset. Run the command insert-set (Cc Cs) to insert a new skeleton dataset (a "reference"). The function will prompt you to enter the publication type. You can use either the auto-completion feature of the minibuffer to enter a valid type or the history feature to select a previously entered type. The function will create a newline, a type tag with the type you selected, and an end tag. You can insert a new tag at the beginning of a line with the command insert-tag which is bound to Cc Ct. Use either the auto-completion feature of the minibuffer to enter a valid tag or the history feature to select a previously entered tag. Once you have created an empty tag, you can use commands provided by the refdb-mode to enter values from existing entries in the database. This is convenient to avoid spelling errors in author names, or to select keywords which are already used by other references. These commands use minibuffer completion for added convenience. You can insert a new line below the current line with the same tag as the current line with the command duplicate-tag. This is bound to MRET. This command is convenient if you add multiple keywords or authors, each of which have to go on separate tag lines. You can move between RIS datasets with the commands backward-set (Cx[) and forward-set (Cx]). You can narrow the buffer to the current RIS set with the command narrow-to-set (Cxns). To widen to the full buffer contents again use Cxnwas usual. ris-mode does not attempt to validate the buffer contents. You can create invalid tags, leave out the essential type or end tags, forget about the newline preceeding each dataset and ris-mode will not complain. However, you can spot most errors by looking at the font colors: If the first and the last line of a dataset are not displayed in red, you have a problem (you might be using a monochrome display but that's not what I mean). If any tag (except TY and ER) is displayed in the default foreground color (usually black on X displays), you have a problem as well. Input filters RefDB gets all reference data from text files (or from equivalent data read from stdin). These text files can be from various sources: you can enter them manually, you download files from search engines in the web, or you have data exported from a different database application. In almost any case, some kind of filtering has to be applied to those files in order to be valid input for RefDB. The input filters currently shipped with RefDB are listed below. Please follow the links to the individual filters for further information. refdb_dos2unix A simple (maybe too simple) shell script to convert text files like RIS documents from DOS-style line endings to Unix-style line endings. Most RefDB tools need their input files with Unix-style line endings. This is a valuable tool to import reference databases from Windows reference managers. med2ris A tool to convert Pubmed data in both the tagged and the XML format to RIS. You may use refdb-pubmed to retrieve Pubmed data in the first place. en2ris A tool to convert EndNote "RIS" exported data to RIS bib2ris A tool to convert BibTeX data to RIS db2ris A tool to convert reference data in DocBook SGML/XML documents to RIS marc2ris A tool to convert references in MARC format to RIS. If you need other formats than those listed above, you'll either have to provide your own input filter or search the web for existing filters that convert your data to one of the supported formats. A decent set of filters is supplied by Chris Putnam's bibutils package, which interconverts bibtex, COPAC, EndNote (Refer), EndNote (XML), ISI, PubMed, MODS, and RIS data. For example, use the following command to import MODS datasets into RefDB: # xml2ris modsdata.xml|refdbc -C addref Writing risx datasets XML documents using the risx DTD are an alternative way to add datasets to RefDB databases. You can use your favourite SGML/XML editor to edit these datasets. You can also use DSSSL or XSLT scripts to transform bibliographic data available as SGML or XML documents to risx. This section provides a quick outline of risx datasets. For a description of all available elements and their relationships, please visit the risx documentation. As usual, start the document with the processing instructions, followed by the document type declaration. Make sure to include the character encoding if it is different from the default (UTF-8). The other encodings supported by RefDB are UTF-16, ISO-8859-1, and US-ASCII. The first line might then read: <?xml version="1.0" encoding="utf-8"?> The top-level element of a risx XML document is either ris (if the file provides multiple datasets) or entry, which corresponds to a single dataset. The ris element holds one or more entry elements. The type attribute specifies the type of the reference. These are the same types as described above for the RIS TY tag. The id and citekey attributes specify a numeric ID (which will only be used if you update references) and a citation key, respectively. The latter should be all uppercase if you intend to use the references with SGML documents. Each entry element contains up to five subelements, the first three of which provide the bibliographic information proper. risx distinguishes three levels of bibliographic information. Each entry can specify one or more of these levels: The part element corresponds to the analytical level of bibliographic information. This element specifies the information of a work that has been published as a part of a publication. This can be a journal article in a periodical, or a chapter in a book. The part element usually contains information about the authors and the title of the part, as well as volume, issue, and page information. The publication element corresponds to the monographic level. This is essentially an individual item that you can find on the shelves of a library, like a book or a journal. The publication element contains information about the authors/editors and the title of the items. The set element corresponds to the series level. This provides information about individual items that have been published as a part of a series, like a book about cats within a series of books about mammals. This element usually adds the information about the title of the series and the series editors. Please refer to the risx documentation for further details about the structure of these elements. The libinfo element contains the local "housekeeping" information of a particular user. Each dataset may contain libinfo elements of one or more users who are specified with the user attribute. Use this element to specify the notes, the reprint status, and the availability information. The contents element specifies, you've guessed right, the contents of the reference, i.e. an abstract and an unlimited number of keywords for indexing purposes. Writing extended notes Both the RIS and the risx formats allow to keep user-supplied notes of unlimited length with each dataset. This is a great way to keep additional explanatory information along with the hard bibliographic data, but this approach is still somewhat limited. Extended notes are kept separately from the reference data, but there is a mechanism to link each note to an unlimited number of references, author names, keywords, or periodical names. Possible applications of this feature include: Write a note about a topic and link it to all references relevant to this topic Keep biographic data or alternative (mis)spellings with author/editor names Store the impact factor, the official web page, or your personal access information to the restricted part of that web page along with a journal name Explain alternative spellings or synonyms of keywords Searching for notes is similar to searching for references. Notes may have keywords, keys, and a title attached to them to easily find them. In addition, you can search for notes that link to a particular reference, author, keyword, or periodical. The inverse works as well: you can search for references that are linked to particular notes. Extended notes are XML documents according to the xnote DTD. The structure of these documents is simple enough to do without a separate documentation. As usual, start the document with the processing instructions, followed by the document type declaration. Make sure to include the character encoding if it is different from the default (UTF-8). The other encodings supported by RefDB are UTF-16, ISO-8859-1, and US-ASCII. The first line might then read: <?xml version="1.0" encoding="utf-8"?> If you want to write several extended notes in a file, start with an xnoteset element. Each individual extended note is kept in an xnote element. This element carries up to four optional attributes: id An unique identifier supplied by the database engine. This attribute is ignored if you add a new note, but it is respected if you update an existing note. citekey This is a unique short title or tag which identifies a note unambiguously but is more convenient to remember than the id. If you do not supply a citekey, refdbd will create one based on the username and the date. user This is the name of the user that owns the note. If you do not supply a name, refdbd will use the name of the current user, which is most likely what you need anyway. date This is a timestamp (YYYY-MM-DD). refdbd will insert the current date if you do not supply this attribute. An extended note consists of an optional title, the contents proper encoded in a content element, zero or more keyword elements, and zero or more link elements. The title is a short description of the note. The keywords serve the same purpose as in references. The content element contains the note proper. The contents of the content element is stored by refdbd as is. It may be plain text or markup. The element uses the following optional attributes: type This description of the content type may be used by processing applications to render the contents properly. Store e.g. the MIME type or the name of a DTD/Schema in this attribute. xml:lang This attribute specifies the language of the contents. The link element is used to link the note to one or more references, keywords, author names, or periodicals. The empty element uses two attributes: type The type of the link target. This may be one of reference, refid, author, keyword, journalfull, journalabbrev, journalcustabbrev1, journalcustabbrev2. target This attribute specifies the database object that the note should be linked to. In the case of a reference, use the ID (type refid) or citation key (type reference). In all other cases, use the name of the author, keyword, or periodical, respectively. An example set of extended notes is installed into /usr/local/share/refdb/examples. Input data mangling Input data are not stored as a literal chunk of text by RefDB. If you import a dataset, and later retrieve it using the same format, the dataset is not guaranteed to be the same character by character. Instead, the data are sliced up, sometimes slightly modified, and sometimes RefDB creates additional information. This section tries to explain what happens to your data behind the scenes, and why this is good for you. Information that RefDB generates for you In a few cases RefDB fills in some default values if the datasets do not specify them. This happens in the following cases: Each reference and extended note will be assigned a unique numeric identifier. This is mainly used internally, but you can also retrieve references and extended notes by their ID. The ID is always created by the database server, there is no way to enforce specific IDs for your datasets. Both references and extended notes require a unique alphanumeric key. With a few limitations this is an arbitrary string consisting of letters (at least one) and optional digits. If you do not specify a citation key, RefDB will create one automatically. In the case of references, the publication year is appended to the last name of the first author. If this string is not unique, a sequential suffix starting at "a" through "z", then "aa" and so forth, is tested until a unique string is found. The same algorithm is used for extended note keys, but instead of an author name the user name serves as the base. If no reprint status is specified, RefDB inserts "NOT IN FILE" as the default value. If your extended notes do not specify a date, RefDB will use the current date and insert that instead. Information that RefDB mangles Citation keys are supposed to work as ID values in SGML and XML documents. To avoid any character encoding hassles, only the first 127 characters of the US-ASCII character set are permitted. These characters work in most character encodings. Some special characters which are not allowed as part of an XML attribute value are stripped. Non-ASCII characters are converted to a reasonable ASCII equivalent, or they are dropped if no replacement is possible. Periodical names and author/editor names receive some special treatment in order to make them usable for RefDB. Both periodical names and person names should be provided in a particular format. However, if you retrieve your data from an electronic source instead of writing them from scratch, the names may not conform to the rules. In order to make best use of these data, RefDB attempts to normalize the incoming periodical and person names until they conform to the rules. There is a good reason for this normalization. Consider a periodical name like "The Journal of Biological Chemistry" . Different electronic sources may abbreviate this as one of: J.Biol.Chem. J. Biol. Chem. J Biol Chem Although a human reader does not have a hard time to guess that we're looking at the same journal in all three cases, a database is too stupid to understand this. If you add the periodical abbreviations as they are, you'll end up having three different journal entries. As a consequence, a query like getref :JO:='J.Biol.Chem.' will miss two out of three papers published in that journal. This is not a good thing. Periodical names RefDB normalizes abbreviated periodical names like this: First, the name is tokenized. Separators are periods and spaces. If a token has a trailing period, it is assumed to be an abbreviated word and used as such. If a token has no trailing period, the token is compared to an internal list of unabbreviated words (see the listword and addword commands for further information about this list). If a match is found, no period is added. If no match is found, the token is assumed to be an abbreviation of something else and a period is added. Spaces after periods will be removed as one separator is sufficient. If we consider the three versions of the journal name above, all versions would be normalized to the first one. Person names The names of authors and editors are normalized like this: Everything to the left of the first comma is assumed to be the last name and remains untouched. The next item (separated by either a space, a period, or both) is assumed to be the firstname. If it consists of one capital letter, a period is added and any trailing spaces are removed. If the firstname is spelled out, it is used as such. All following name parts to the left of the second comma, if any, are assumed to be middle names. Each part receives the same treatment as a firstname. Finally, everything to the right of the second comma, if any, is assumed to be a honorific or lineage part and used as such. All spaces following either a period or a comma are removed. A few examples should make this procedure clear: "Miller, John S" -> "Miller,John S." "Chun, H-K" -> "Chun,H.-K." "Delorie, DJ" -> "Delorie,DJ" "Doe, J S" -> "Doe,J.S." "Random,Jane,Jr." -> "Random,Jane,Jr." The last example shows that your data will not be modified as long as they stick to the input format. refdb-1.0.2/doc/chapter-inout-formats.xml000644 001750 001750 00000016013 11512721663 021171 0ustar00markusmarkus000000 000000 The RefDB SGML/XML input and output formats RefDB uses XML files to encode the information about the required references for a bibliography. The resulting bibliographic output can be used as an external entity in both XML and SGML DocBook files (the bibliography can be transformed to any other SGML or XML type with suitable stylesheets). The structures of these files will be briefly explained in this chapter. The XML input format for bibliographies RefDB uses (Open)Jade (for SGML documents) or an XSLT processor (for XML documents) to extract a list of required references and their logical relationships (position in the document, single or multiple citations and such). This list is encoded in an XML document conforming to the CitationList XML DTD. The XML input format for bibliographic styles The formatting instructions specific to a publisher or a journal where your document is to be published are encoded in a document conforming to the CiteStyle XML DTD. To increase the speed of the bibliography creation the formatting information has to be imported into RefDB and is stored in the RefDB database. The CiteStyle XML DTD is moderately complex and is documented in a separate manual. The XML input format for extended notes Extended notes are encoded in XML documents conforming to the Xnote DTD. Processing expectations for the RefDB DocBook bibliography output The accepted standard DSSSL and XSL stylesheets for DocBook by Norman Walsh as well as the XSL stylesheets for TEI by Sebastian Rahtz are not designed to handle the complexity of the bibliography formatting requirements of various journals and publishers. RefDB strains the limits of SGML and the document types to supply the required structural information, but it takes customized stylesheets to turn this into proper formatting. The RefDB package contains sets of DSSSL and XSL stylesheets that were designed for this purpose. They are implemented as driver files for the standard stylesheets. If those stylesheets do not do exactly what you need, you will have to modify them or write new ones from scratch. This chapter briefly explains the design of the output that RefDB generates and how this should be processed in your stylesheets. This section discusses the DocBook output. It is straightforward to transfer this to TEI output. See here for a description of the equivalent TEI elements and attributes. The general principle of the RefDB bibliography is straightforward: Each citation that you want to be treated as a RefDB citation needs to have a role attribute with the value REFDB. Each citation defines at least one xref element. The value of the linkend attribute encodes the ID of the required reference in the database (if you need references in several databases, this attribute can additionally specify the database). RefDB uses this information to generate a DocBook bibliography element. This contains an entry for each requested reference. These entries are labelled with ID attributes that match the xref linkend attributes in the text. Each RefDB-generated reference entry defines a xreflabel attribute which holds the text that is to be displayed at the position of the corresponding xref elements. This is all it takes for single and unique citations, i.e. with one xref element per citation element and only one occurrence throughout the text. Both multiple occurrences of the same citation in the text and multiple citations (more than one xref elements per citation element) make things a bit more difficult. Some output formats require a different formatting for the first citation of a publication in the text and all subsequent citations of the same publication. The first citation is identical with the above mentioned default case. All following citations of the same publication need an additional xref endterm attribute which points to an additional bibliomset element which in turn contains the text to be displayed for subsequent citations. The endterm attribute has the same value as the linkend attribute except that the letter S (as in subsequent) is appended to the attribute. The real trouble starts with multiple citations. The output format may require the sequence of the citations to be sorted, and in the case of a numerical citation style it may require sequences of consecutive citations to be displayed as ranges (e.g. [5-7] instead of [5,6,7]). This may break the links between the individual citations and the reference in the bibliography in the output document. RefDB will create an additional bibliomset element for each multiple citation. This provides the sorted and formatted text that is to be displayed for the multiple citation. For this to work you have to define an additional xref element whose linkend attribute points to one of the references and whose endterm points to the additional bibliomset element. This arrangement allows the multiple citation to be displayed differently depending on the desired output format. If the output is generated for printout, only the additional xref element should be formatted. This ensures the correct formatting of the citation in the printout. In output formats that allow hyperlinks it may be preferable to format the xref elements that link to the references individually. This may be incorrect in terms of the citation style, but the functional links to the references in the bibliography may outweigh this disadvantage. refdb-1.0.2/doc/chapter-installation.xml000644 001750 001750 00000337015 11610642216 021066 0ustar00markusmarkus000000 000000 Installation This chapter tries to explain the process of the installation. There are some things you should consider before you actually install the software. These will be discussed in the second section. The technical details of the installation on various platforms can be found in the following sections of this chapter. The final sections deal with the setup of optional web-based frontends. But first we start with a brief overview of installing and running RefDB for those who never read manuals. Quickstart guide These are the essential steps to get your reference database up and running: Follow the installation instructions for either Unix/Linux or Windows. Finish the installation by creating and filling the internal database. Start the application server refdbd, either manually or as a daemon, as explained in the OS-specific installation sections. Create one or more reference databases. Add one or more users that are permitted to work with this database (not required if you use the SQLite database engine as it lacks access control). Add bibliography styles. Some of the above steps are simplified by the shell script refdb-init which you should have a thorough look at. Then it is up to the users to populate the database with references, run their queries, create bibliographies, and whatever they may desire. Upgrading from an older version If you already run an older version of RefDB and want to upgrade to the latest version, you may have to change a few things in your local setup in order to reuse existing databases and existing configuration files. This section lists all backwards-incompatible changes of the past few versions (the complete list since the days of yore can be found in the file README). The file UPGRADING contains instructions how to avoid losing your data in the case of non-trivial changes in the new version. 0.9.9 Major changes in both the reference databases and the main database require to upgrade both. Before re-importing your reference data, you may have to migrate the contents of some AV fields to L1 Before re-importing custom citation styles, you may have to fix a few elements. The styles shipped with RefDB do not require these fixes, you can just add them again. 0.9.8 The implementation of personal reference lists has changed, most notably in that each user can have more than one of these lists. Although there was no need to alter the database schema, one of the tables is now used to record the ownership of a reference instead of the membership of a reference in a personal list. The results may be a bit unexpected if you upgrade to 0.9.8 without migrating the data. 0.9.7 The main database needs to be re-created if you use MySQL as a database engine. Things to know before you start Which database server? RefDB currently supports MySQL and PostgreSQL as external database servers as well as SQLite as an embedded database engine. This section tries to help you decide which one to pick. The first issue is whether you want to run an external database server or not. External database servers scale better if many users share databases and they provide access control. The external database servers also use more fine-grained locking mechanisms which allow concurrent read and write accesses, whereas the SQLite engine will lock the entire database for write accesses. However, the latter does not provide access control and thus doesn't require any sort of user administration. Rule #1 If you don't intend to share databases, or if running a database server scares you in any way, then you may better off with SQLite. Another issue is the way how the database engines store their data. SQLite is unique in that it uses a single architecture-independent file per database which makes transferring the data to a different box a breeze. The external database engines use more sophisticated ways to organize their data, but you need some basic administrative skills in order to replicate the data. Rule #2 If you cannot rely on remote access to your databases (something which RefDB is well suited for) but have to take your data physically with you while travelling, SQLite is a better choice. Now some words about the external database servers. As with many other fundamental schisms in the Unix world (vi vs. Emacs, KDE vs. Gnome, to name a few), both database servers supported by RefDB have followers who are semi-religious about their choice. Both MySQL and PostgreSQL are robust and well-proven. This leads us to: Rule #3 If you already use one of the servers, then by all means use it also for RefDB. Being familiar with the server and having it happily running usually outweighs any advantages that the other server might have. But what if you do not yet run a suitable database server? You can browse the web and read for hours about the differences between MySQL and PostgreSQL, but for the purpose of managing RefDB reference databases it boils down to one essential difference: MySQL is faster. This leads us to: Rule #4 If you cherish speed over anything else, use MySQL. There's a few more differences that you should be aware of: PostgreSQL has transaction support by default. MySQL supports transactions only if you use InnoDB tables. If you want this additional peace of mind from MySQL, make sure InnoDB is the default table type. SQLite does not support Unix-style regular expressions. If you'd like to use these more versatile expressions instead of the simpler SQL regular expressions supported by SQLite, choose MySQL or PostgreSQL. Where do the components go? As RefDB is a three-tiered client-server application, you have considerable freedom to distribute the components among your computers. Although RefDB shines in a network environment, there is absolutely no problem to run all components on a single standalone workstation. Please keep in mind that there's one tier less if you choose the SQLite embedded database engine. The databases will always be on the filesystem of the machine that runs refdbd (this doesn't exclude putting the files on an NFS share if you have a good reason to do so). The basic idea of the client-server model has several implications: Many workstations can access a single server running the database server. Thus many people can access the same databases without the pain of duplicating the data and the database engine on every single machine. A considerable part of the computing effort is done outside of the workstations. Therefore even rather lame workstations may be sufficient to access and manipulate the data. The database server should run on a decent machine, though (better not that dusty 486 that has doubled as a paperweight since 1990). Updates of the software will mainly affect the database server and the application server. This considerably reduces your workload, as the workstations need to be updated less frequently. The most common scenarios for using RefDB will be on a department or institute network and on a standalone workstation. Let's see how these scenarios differ: Installation on a standalone workstation This is obviously the simplest case. The clients, the application server, the database server, and the databases reside on the same physical machine (see ). The only requirement for the workstation is that a TCP/IP network is installed. This is necessary as the three layers of RefDB always communicate via TCP/IP sockets. The IP address 127.0.0.1 has to be specified in the configuration files of the clients and of the application server.
RefDB on a standalone workstation
Installation in a network In a network you can take advantage of the client-server model and distribute the workload between your computers. Although the three layers can well be distributed between three physical machines, it may be more useful to install the application server on the same machine as the database server and the databases (see ). A dedicated or general-purpose server may be most suitable to hold these components, as a workstation may get sluggish if it has to answer a lot of database requests. The clients as well as scripts and support files have to be installed on all workstations that will be used to access the databases. The client for administrative tasks, refdba, can be restricted to the workstations of system administrators or otherwise experienced staff.
RefDB on a network
The mystery of the configuration files Like with most Unix-style software packages, the behaviour of the RefDB applications can be tweaked by configuration files. Wherever it makes sense, there is one global config file with useful admin-picked defaults, and another user config file for the individual user to play with. The purpose of the configuration files is to set some reasonable default values for the command-line switches of the RefDB programs. Once you have set these, you will never have to specify these values on the command line again, unless you want to temporarily override them. Types of configuration files All RefDB applications and scripts that use configuration files (these are the server refdbd, the clients refdbc, refdbib, refdba, the script refdbxml, as well as the conversion filters bib2ris, db2ris, med2ris.pl, marc2ris, and en2ris) can use two configuration files each. One global configuration file is supplied by the system administrator and can be used to set values that are common for all users on that box, like the IP address of the application server. Another file can be used by every user to supply the values that were not set in the global file or to override settings in this file. The users' copies can have a leading dot to hide the files (the refdb programs will first try to read a hidden configuration file, and only if that cannot be found they try to read a non-hidden file). bib2ris, marc2ris, and med2ris use a second global configuration file if they are run as a CGI applications. A local configuration file does not make sense in this case. The default location for the global configuration files is /usr/local/etc/refdb. There are two ways to change this. If you compile RefDB from the sources you can specify a different directory with the or options of ./configure. E.g. if you specify , then the configuration files will be installed in /etc/refdb (the refdb part is automatically appended by the RefDB install routines). If you use precompiled binaries, use the command line option to specify the directory. In this case you have to specify the full path, i.e. /etc/refdb to read the configuration files installed by the previous example. The user copies of the client configuration files are expected to be in the users' home directories as specified by the environment variable HOME. Configuration file syntax All configuration files share a common syntax. There are just three essential things to know: All information is stored as pairs of whitespace-separated items, one pair on each line. The first item on the line specifies the variable name, the second item specifies the variable value. Whitespace means one or more spaces or tabs in any combination. Everything to the right of a hash sign (#) is a comment. The rest of the line is ignored. The line endings are Unix-style (0x10, not DOS-style 0x13 0x10), regardless of the operating system. A configuration example The whole configuration stuff may sound a bit confusing, so let us now look at a simple configuration example that illustrates the principles laid out above. The following is a listing of /usr/local/etc/refdb/refdbcrc, our global refdbc configuration file in this example: # This is the global configuration file for refdbc serverip 127.0.0.1 port 9734 pager more timeout 180 # end of refdbcrc This is the corresponding copy that one of the users of the system created as /home/joe/.refdbcrc: # This is the user configuration file for refdbc pager less username joesixpack passwd * timeout 30 # end of .refdbcrc As you can see our hypothetical system administrator configured the IP address (serverip) and the port where refdbd listens to the client requests. This value is most likely the same for all users on the system, so this is nothing to worry about for the users. more is defined as the default pager, and the timeout is set to 3 minutes. Joe Sixpack, our reckless user, does not like more as a pager and prefers to use less instead. He also thinks that half a minute as a timeout should be enough. Both of these settings override the corresponding values in the global file. serverip and port are not redefined in the user's copy, so the values of the global file take effect. Joe also defined username (which happens to be different from his login name "joe") and passwd so the correct values will be used for the database access (the asterisk in the passwd field will cause refdbc to ask for the password interactively for security reasons). Configuration file variables For a listing of available configuration file variables please see the tables for refdba, refdbc, refdbib, refdbd, refdbxml, bib2ris, db2ris, med2ris, marc2ris, and en2ris. Environment variables refdb uses the following environment variables to locate the files and directories it needs to run properly. HOME This variable should be set for all users anyway. It is used to locate the personal configuration files for the RefDB clients. SGML_CATALOG_FILES If you process SGML files, this variable will be consulted to locate the catalog files required for resolving public identifiers to their local filename equivalents. On some systems, the package system maintains a master catalog whose path is hard-coded into the SGML applications. In this case, the variable is not required. XML_CATALOG_FILES If you process XML files, this variable may be consulted to locate XML catalogs. If this variable is not set, many tools look into the default location /etc/xml/catalog instead. Remember that some XSLT processors need access to additional Java classes to provide XML catalog support at all. Some notes on the filesystem The default installation procedure will install the RefDB files in locations compatible with the filesystem hierarchy standard. You will learn in the following sections how to change where the RefDB files will be installed if you want to adapt the installation to specific needs of your system. To get a better idea of what you have to take care of if you don't like the defaults, here is a list of the directories used by RefDB: /usr/local/bin This directory will receive all binary files and shell scripts. /usr/local/etc/refdb All global RefDB configuration files end up in this directory. /usr/local/share/refdb This directory contains shareable, operating system independent files. The files are organized in a couple of subdirectories: css contains a cascading stylesheet suitable for the HTML output of the getref command. declarations contains the default SGML declarations. dsssl contains DSSSL stylesheets. dtd contains the document type definitions used by RefDB. examples contains a few example reference data files as well as SGML and XML test documents using RefDB citations. sql contains SQL scripts used to initialize databases. sru contains the XSLT and CSS stylesheets required to set up the SRU service styles contains some XML files containing bibliography styles. xsl contains XSLT stylesheets. /usr/local/var/lib/refdb/db holds the database files of embedded database engines and a version file for use by package installation scripts
Installation on Linux and other Unix variants RefDB was designed with portability in mind. Thanks to the GNU autotools installation on many Unix variants is straightforward, others need only a little tweaking. The following instructions provide a guideline for all Unix-like systems. Please see also the hints for specific operating systems at the end of this section. Generic instructions Prerequisites These instructions assume that the following software is installed and functional on your computer or on your network before you start: A SQL database engine. For an external database server, choose between MySQL (version 3.23 or later) or PostgreSQL (version 7.1 or later). The database server does not have to physically run on the box(es) where you plan to install RefDB, it is sufficient if it is accessible through the network. If you prefer an embedded database engine, please use SQLite instead. As far as non-standard libraries and header files are concerned, you'll need the readline library and headers (available at the GNU FTP site). Database access requires the libdbi library and headers as well as the libdbi-drivers package. Furthermore, you`ll need the expat library. If you need the BibTeX import filter, you'll also want to have the btparse library. Some operating systems/distributions use separate packages for the run-time libraries (ususally .so files) and for the development libraries (usually .a files). In order to build and run RefDB, you need both packages for each library. If you want to import Pubmed or MARC datasets, please get the refdb-perlmod package. This collection of Perl modules is required to run the Pubmed and MARC import filters shipped with RefDB. These Perl modules in turn depend on MARC::Record, MARC::Charset, XML::Parser, and Text::Iconv, available at CPAN. Installation from the sources The installation steps proper (as opposed to the build steps) should be run with root privileges. Unpack the archive in a convenient directory: tar -xzf refdb-x.y.z.tar.gz (the actual filename depends on the version). If you do not want to build in the source directory, create an empty build directory. cd into the new refdb-x.y.z source directory or into your separate build directory Use ./configure --help to see a list of things you can customize. If you use a separate build directory, use the relative path to configure in the source directory. Some important options are: All paths and URLs in the following options should be entered without a trailing slash. --prefix=PREFIX By default, all files will be installed in the /usr/local tree. Use this option to use a different install root, e.g. /usr or /opt. --datadir=DIR The data files will be installed in /usr/local/share/refdb unless you use this option. The data will be installed in the directory DIR/refdb. That is, specifying "--datadir=/usr/local/share" is equivalent to the default behaviour. The configuration variable refdblib (which will be automatically generated in the example configuration files) must point to the RefDB data directory. --sysconfdir=DIR The global configuration files will be installed in /usr/local/etc/refdb unless you specify a different directory here. --with-libdbi-lib=DIR Use this option to specify the directory that contains the libdbi library if it is not in the default library path. --with-expat-lib=DIR Use this option to specify the directory that contains the expat library if it is not in the default library path. --with-btparse-lib=DIR Use this option to specify the directory that contains the btparse library if it is not in the default library path. --with-sgml-declaration=PATH Specify the full path to a suitable SGML declaration for your SGML files. If this option is not used, RefDB will use its own copy of docbook.dcl stolen from the DocBook DTD distribution. This SGML declaration also works for a variety of other DTDs. --with-xml-declaration=PATH Specify the full path to xml.dcl which is the SGML declaration for XML files. If this option is not used, RefDB will use its own copy of xml.dcl which should work just fine. --with-docbook-xsl=PATH Specify the full path to the root directory of the DocBook XSL stylesheets. This option is required only on systems that do not maintain XML catalogs. If your system is set up properly to resolve public identifiers like those in the XSL stylesheets by XML catalogs, leave out this option. configure checks whether the required stylesheets are accessible, so watch out for error messages. If the stylesheets can't be found, either install them, fix your catalogs, or use this option to hardcode the path. --with-docbook-xsl-ns=PATH Specify the full path to the root directory of the DocBook XSL-NS (for DocBook V5.0 and later) stylesheets. This option is required only on systems that do not maintain XML catalogs. If your system is set up properly to resolve public identifiers like those in the XSL stylesheets by XML catalogs, leave out this option. configure checks whether the required stylesheets are accessible, so watch out for error messages. If the stylesheets can't be found, either install them, fix your catalogs, or use this option to hardcode the path. --with-tei-xsl=PATH Specify the full path to the root directory of the TEI XSL stylesheets for P4. As mentioned above for the DocBook stylesheets, use this option only if your catalogs cannot resolve the public identifiers properly. The TEI Consortium ships tei-xsl-5.2.9.zip which contains the stylesheets for both p4 and p5. The root directory which you want to specify here is the directory which contains the p4 and p5 subdirectories, e.g. /usr/local/share/xsl/tei-xsl-5.2.9. --with-tei-xsl-ns=PATH Specify the full path to the root directory of the TEI XSL stylesheets for P5. As mentioned above for the DocBook stylesheets, use this option only if your catalogs cannot resolve the public identifiers properly. The TEI Consortium ships tei-xsl-5.2.9.zip which contains the stylesheets for both p4 and p5. The root directory which you want to specify here is the directory which contains the p4 and p5 subdirectories, e.g. /usr/local/share/xsl/tei-xsl-5.2.9. --with-classpath-root=PATH The refdbxml script assumes that all Java classes for the Java parsers and xslt engines are stored in a class repository, i.e. all in the same directory. Specify this directory with this option. If you keep the relevant Java classes in different directories, either create symlinks or customize refdbxml manually. --with-var-dir=PATH Use this option to specify a directory where refdbd can write its PID file (a file containing the process ID). By default, /var/run will be used. --with-log-dir=PATH Use this option to specify a directory where RefDB programs can write log files to, if logging is directed to a custom file. By default, /var/log will be used. --with-main-db=dbname RefDB uses one main database to store citation styles and other stuff. There is exactly one such database per installation with the default name refdb. You may have to change this name if you want to run two different versions of RefDB in parallel, or if you're not free to choose your database name. Although the main database name is configurable at runtime, you should use this option to initialize your refdbdrc configuration file, as it allows the refdb-init script to use the proper database name. --with-db-dir Selects the directory which holds SQLite/SQLite3 databases. --with-trang-jar Specifies the full path to the jar file of the trang tool. You need this tool if you build RefDB from SVN sources, but not if you build from a tarball. --disable-docs RefDB ships with prebuilt docs. However, if you build a SVN version, or if the documentation is otherwise screwed up, you may have to build them. Building the docs from the sources requires a couple of extra tools. You can use this configure switch to build the rest of RefDB without having to install these tools. --disable-clients Use this switch if you want to build and install only the application server refdbd. This is mainly targeted at package builders. --disable-server Use this switch if you want to build and install only the clients but not the application server. This is mainly targeted at package builders. Some of these options are used to customize the shell scripts, XSL stylesheets, example configuration files, and HTML files which are part of RefDB. If you do not specify these options now, you can still build and install the package, but you will have to customize the scripts and stylesheets manually in order to make them work. Doing it now is much easier. You've been warned. Start the configuration with the command ./configure, specifying any additional options as you may need. Use the relative path to configure in the source directory if you build in a separate directory. If your system keeps non-system header files in odd places, it may be necessary to set the CFLAGS environment variable before you run configure. E.g. if headers like expat.h are stored in /usr/local/include, you should run CFLAGS="-I/usr/local/include" ./configure instead, specifying additional options as necessary. make The autotools-generated Makefiles apparently prefer (or require?) GNU make. If make results in spurious error messages about the Makefile syntax, try to run gmake instead as your regular make is apparently not the GNU version. make install This will install the binaries and scripts in /usr/local/bin and the data in /usr/local/share/refdb unless you chose different directories in the configure step. Again, run gmake install instead if your regular make is not the GNU version. To finish the installation, please follow the instructions in the section Finishing the RefDB installation below. If this procedure results in strange error messages, you probably use a platform that is not supported yet. The author appreciates a porting effort or a description of the problem (in this particular order). Living on the bleeding edge: installing a SVN version While the official release versions of RefDB are your best bet to get a stable installation, you may be interested to test the latest developments "in statu nascendi". The SVN version is guaranteed to compile on the author's development platform (currently FreeBSD 6.1), but may fail on other platforms. Known bugs may have been fixed, but new ones may have crept in as well. New features may be implemented, but might not be without problems. You've been warned. If you still want to go ahead, this is what you need to do: Change into a suitable directory. SVN will create a subdirectory called refdb during the following steps Run the following command (adapt this accordingly if you use some graphical CVS frontend instead of the command line tool): $~/build svn co https://svn.sourceforge.net/svnroot/refdb/refdb/trunk refdb Other interesting modules to check out are perlmod (the Perl modules and the Perl client library) and elisp (the Emacs support files). If you are interested in a particular repository version, release, or branch, use commands along these lines: $~/build svn co --revision 324 https://svn.sourceforge.net/svnroot/refdb/refdb/trunk refdb-324 svn co https://svn.sourceforge.net/svnroot/refdb/refdb/tags/Release-0.9.7 refdb-0.9.7 svn co https://svn.sourceforge.net/svnroot/refdb/refdb/branches/back-to-a-1-branch refdb-a1-branch If you want to keep track of the latest developments, you'll have to update your SVN working copy once in a while. Run this command from within the top-level source directory: $~/build/refdb svn update Consider subscribing to the refdb-cvs mailing list as you'll be notified about each SVN checkin. The SVN version lacks all autotool-generated files. You'll have to create them with your local autotools. RefDB contains a small script called autogen.sh in its top-level directory which performs all necessary steps. $~/build/refdb ./autogen.sh The autotools can cause severe headaches at times. If the above command causes errors, read autogen.sh and run the commands manually, substituting different versions as appropriate. E.g. substitute automake with automake-1.8 if this gives better results. The native autotools shipped with FreeBSD 5.4 and later are unusable for our purposes, you have to install the gnu-autotools package instead. You have to modify your PATH to pick up the latter, and fiddle with the m4 macro paths in order to see the light. The SVN version also lacks a few other things which are included in the source tarballs. In order to create the missing stuff, you'll need the following additional tools: Batik SVG Rasterizer: an image converter used to create the images from the SVG sources. The Makefile calls a script in your path called batik-rasterizer which is supposed to run this Java application appropriately. dtdparse: a Perl script (which in turn depends on a few Perl modules, see the installation instuctions) which generates the DTD documentation. trang: a tool required to turn the RefDB DTDs into RelaxNG schemas. To work around problems, you may want to use the following ./configure switches: --with-trang-jar=PATH --disable-docs Finally you're ready to build RefDB like you would with a released version. There is also a neat shell script available on the RefDB download page which helps you to keep a SVN version up to date with a minimum number of keystrokes. Installation of refdbd as a daemon This is all it takes to run RefDB from the command line. If you want to start refdbd as a daemon at system startup, a few more steps are necessary. The exact procedure varies greatly between operating systems and distributions. First we'll look at SysV-style systems (most Linux distributions), then at BSD-style systems (BSD-derived Unices and the Slackware Linux distribution). SysV-style The following procedure describes the setup on a Debian GNU/Linux system. With a little help of your system handbook you should be able to adapt this to your system. On many systems /etc/init.d/README contains just what you need to know or at least it points you to the correct resources. Review the parameters in the script refdb in the scripts directory of the source distribution (this file is not automatically installed). If necessary, change the paths and names to your needs and adapt the following steps. Make sure the BSDSTYLE variable is set to "NO" (this is the default value). Copy the script refdb to /etc/init.d/ and make sure it is executable: chmod 755 /etc/init.d/refdb. Create symbolic links from every runlevel directory that should start refdbd to /etc/init.d/refdb, e.g. ln -s /etc/init.d/refdb /etc/rc2.d/S93refdb. The numbers in the link names are a convenient and simple way to determine the sequence of daemon starts. As most likely no other daemons rely on RefDB, you can choose as high a number as you want (the daemons are started in lexicographical order). In analogy to the previous step, generate symbolic links in every runlevel directory that should stop the daemon. Usually these are the runlevels 0 (system halt) and 6 (reboot): ln -s /etc/init.d/refdb /etc/rc0.d/K20refdb ln -s /etc/init.d/refdb /etc/rc6.d/K20refdb Review the settings in the script refdbctl which by default is installed in /usr/local/bin/. Most likely the script was properly customized for your system in the build step so you don't have to change anything. When you boot, halt, or reboot the system you should see messages on the screen telling you that the daemon has been started or stopped successfully. If you don't, please check again all paths in the scripts, the file permissions, and the runlevels you're looking at. Try to run the control script from the command line, e.g. refdbctl start, to distinguish between general setup problems and init-related setup problems. BSD-style The following procedure describes the installation on a FreeBSD system. Other systems might differ somewhat, but you should get the idea. Review the parameters in the script refdb in the scripts directory of the source distribution (this file is not automatically installed). Set the value of the script variable BSDSTYLE to "YES" (the sole purpose of this variable is to make the boot message blend in seamlessly, if you happen to care for aesthetics). If necessary, change the paths and names to your needs and adapt the following steps. Copy the script refdb to /usr/local/etc/rc.d/refdb.sh and make sure it is executable: chmod 755 /usr/local/etc/rc.d/refdb.sh. The suffix .sh is mandatory on BSD-style systems. Review the settings in the script refdbctl which by default is installed in /usr/local/bin/. Most likely the script was properly customized for your system in the build step so you don't have to change anything. When you boot, halt, or reboot the system you should see messages on the screen telling you that the daemon has been started or stopped. If you don't, please check again all paths in the scripts and the file permissions. Try to run the control script from the command line, e.g. refdbctl start, to distinguish between general setup problems and system-related setup problems. OS-specific hints This section contains a few hints about the installation on some popular Unix-like operating systems. Linux The generic instructions should work out of the box for most if not all Linux distributions. Debian GNU/Linux Debian keeps all configuration files in /etc and subdirectories thereof which makes backing up the configuration of the whole box a breeze. To support this nice feature, you want to add to your configure options. The configuration files will then be in /etc/refdb. The following is an example of a complete configure call that works on Debian 3.0 (the line was split into several lines for the sake of clarity; type everything on one line and skip the backslashes): #~ ./configure --sysconfdir=/etc \ --with-docbook-xsl=/usr/share/sgml/docbook/stylesheet/xsl/nwalsh \ --with-tei-xsl=/usr/local/lib/sgml/stylesheet/xsl FreeBSD The BSD version of make cannot handle the autotools-generated Makefiles correctly. Use gmake instead, and set CFLAGS=-I/usr/local/include during the configuration step. The full configure command, using the default installation paths for the accessory files and programs, looks like this: #~ CFLAGS=-I/usr/local/include ./configure --with-expat-lib=/usr/local/lib \ --with-classpath-root=/usr/local/share/java/classes The shared data end up in /usr/local/share/refdb, the configuration files will be in /usr/local/etc/refdb. NetBSD The BSD version of make cannot handle the autotools-generated Makefiles correctly. Use gmake instead, and set the following environment variables before running ./configure: #~ setenv CFLAGS "-I/usr/pkg/include -I/usr/local/include -L/usr/pkg/lib" #~ setenv LDFLAGS "-L/usr/pkg/lib -R/usr/pkg/lib -R/usr/pkg/lib/mysql" #~ ./configure --with-mysqlclient-lib=/usr/pkg/lib/mysql --with-btparse-lib=/usr/local/lib --prefix=/usr/pkg Use additional options as needed. The shared data will end up in /usr/pkg/share/refdb, the configuration files go to /usr/pkg/etc/refdb. Solaris Both the standard C compiler and the standard make program will not give the desired results when building RefDB. Use gcc and gmake instead. OSX Use fink to conveniently install all the additional software needed. Then help configure find the fink-installed packages in /sw by setting the following environment variables: CFLAGS="-I/sw/include" LDFLAGS="-L/sw/lib" ./configure [your_options]. Installation on Windows NT/2000/XP Prerequisites In order to run RefDB you'll need a few external apps. The most important thing are the Cygwin tools which provide a Unix-like environment on the otherwise incompatible Windows platform. Additionally you'll have to build or obtain prebuilt versions of a few libraries which are not part of the standard Cygwin distribution (unless you use prebuilt binaries that contain all non-standard libraries). External applications Cygwin toolkit, DLL version 1.5.0 or later (the current version as of this writing, 1.5.12, has serious problems with PostgreSQL, though). The Cygwin distribution uses individual packages for the various parts. In addition to what is installed automatically (the base distribution), please make sure to select the following packages: libxml2, libxslt, expat, Perl, and a full TeX installation if you wish to create Postscript or PDF files. A SQL database engine. Currently you can choose between MySQL (version 3.23 or later), PostgreSQL (version 7.1 or later), and SQLite/SQLite3 (versions 2.8.x or later; 3.0.x or later). The database server does not have to physically run on the box(es) where you plan to install RefDB, it is sufficient if it is accessible through the network. Cygwin offers a prepackaged version of PostgreSQL (7.3.3 as of this writing) which used to be the most convenient way to run a database server on your Cygwin box, but as stated above it may be broke when you try. Please follow the instructions in the readme shipped with the package to install and initialize the database server. It is crucial that you install and run the separately available cygipc package, available only here. SQLite does build on Cygwin, but all filename/path handling code uses the Windows conventions. You will have to use the Windows-style path when setting the database directory. If you want to import Pubmed or MARC datasets, please make sure to install the Perl interpreter available for Cygwin and get the refdb-perlmod package. This collection of Perl modules is required to run the Pubmed and MARC import filters shipped with RefDB. These Perl modules in turn depend on MARC::Record, MARC::Charset, XML::Parser, available at CPAN. The mentioned websites offer plenty of support as web documents or with mailing lists, so it should be possible to figure out how to do a basic install for these suites. Libraries The libdbi library and headers, along with the libdbi-drivers package. Please follow the Cygwin-specific instructions that accompany both packages to build and install the software. Prebuilt binaries for both libdbi and libdbi-drivers are available here. If you need the BibTeX import filter, you'll also want to have the btparse library. This builds out of the tarball on Cygwin. Installation from the sources Depending on the permission settings, you may have to run the installation steps proper (as opposed to the build steps) as an administrator. Unpack the sources in a convenient directory: tar -xzf refdb-x.y.z.tar.gz (the exact filename depends on the version). If you do not want to build in the source directory, create an empty build directory. Change into the new refdb-x.y.z source directory or into your separate build directory. ./configure --help This command will display a list of things you can customize. If you build in a separate directory, use the relative path to configure in the source directory. Some important options are: All paths and URLs in the following options should be entered without a trailing slash. --prefix=PREFIX By default, all files will be installed in the /usr/local tree. Use this option to use a different install root, e.g. /usr or /opt. --datadir=DIR The data files will be installed in /usr/local/share/refdb unless you use this option. The data will be installed in the directory DIR/refdb. That is, specifying "--datadir=/usr/local/share" is equivalent to the default behaviour. The configuration variable refdblib (which will be automatically generated in the example configuration files) must point to the RefDB data directory. --sysconfdir=DIR The global configuration files will be installed in /usr/local/etc/refdb unless you specify a different directory here. --with-libdbi-lib=DIR Use this option to specify the directory that contains the libdbi library if it is not in the default library path. --with-expat-lib=DIR Use this option to specify the directory that contains the expat library if it is not in the default library path. --with-btparse-lib=DIR Use this option to specify the directory that contains the btparse library if it is not in the default library path. --with-sgml-declaration=PATH Specify the full path to a suitable SGML declaration for your SGML files. If this option is not used, RefDB will use its own copy of docbook.dcl stolen from the DocBook DTD distribution. This SGML declaration also works for a variety of other DTDs. --with-xml-declaration=PATH Specify the full path to xml.dcl which is the SGML declaration for XML files. If this option is not used, RefDB will use its own copy of xml.dcl which should work just fine. --with-docbook-xsl=PATH Specify the full path to the root directory of the DocBook XSL stylesheets. This option is required only on systems that do not maintain XML catalogs. If your system is set up properly to resolve public identifiers like those in the XSL stylesheets by XML catalogs, leave out this option. configure checks whether the required stylesheets are accessible, so watch out for error messages. If the stylesheets can't be found, either install them, fix your catalogs, or use this option to hardcode the path. --with-docbook-xsl-ns=PATH Specify the full path to the root directory of the DocBook XSL-NS (for DocBook V5.0 and later) stylesheets. This option is required only on systems that do not maintain XML catalogs. If your system is set up properly to resolve public identifiers like those in the XSL stylesheets by XML catalogs, leave out this option. configure checks whether the required stylesheets are accessible, so watch out for error messages. If the stylesheets can't be found, either install them, fix your catalogs, or use this option to hardcode the path. --with-tei-xsl=PATH Specify the full path to the root directory of the TEI XSL stylesheets for P4. As mentioned above for the DocBook stylesheets, use this option only if your catalogs cannot resolve the public identifiers properly. The TEI Consortium ships tei-xsl-5.2.9.zip which contains the stylesheets for both p4 and p5. The root directory which you want to specify here is the directory which contains the p4 and p5 subdirectories, e.g. /usr/local/share/xsl/tei-xsl-5.2.9. --with-tei-xsl-ns=PATH Specify the full path to the root directory of the TEI XSL stylesheets for P5. As mentioned above for the DocBook stylesheets, use this option only if your catalogs cannot resolve the public identifiers properly. The TEI Consortium ships tei-xsl-5.2.9.zip which contains the stylesheets for both p4 and p5. The root directory which you want to specify here is the directory which contains the p4 and p5 subdirectories, e.g. /usr/local/share/xsl/tei-xsl-5.2.9. --with-classpath-root=PATH The refdbxml script assumes that all Java classes for the Java parsers and xslt engines are stored in a class repository, i.e. all in the same directory. Specify this directory with this option. If you keep the relevant Java classes in different directories, either create symlinks or customize refdbxml manually. --with-var-dir=PATH Use this option to specify a directory where refdbd can write its PID file (a file containing the process ID). By default, /var/run will be used. --with-log-dir=PATH Use this option to specify a directory where RefDB programs can write log files to, if logging is directed to a custom file. By default, /var/log will be used. --with-main-db=dbname RefDB uses one main database to store citation styles and other stuff. There is exactly one such database per installation with the default name refdb. You may have to change this name if you want to run two different versions of RefDB in parallel, or if you're not free to choose your database name. Although the main database name is configurable at runtime, you should use this option to initialize your refdbdrc configuration file, as it allows the refdb-init script to use the proper database name. --with-db-dir Selects the directory which holds SQLite/SQLite3 databases --with-trang-jar Specifies the full path to the jar file of the trang tool. You need this tool if you build RefDB from SVN sources, but not if you build from a tarball. --disable-docs RefDB ships with prebuilt docs. However, if you build a SVN version, or if the documentation is otherwise screwed up, you may have to build them. Building the docs from the sources requires a couple of extra tools. You can use this configure switch to build the rest of RefDB without having to install these tools. --disable-clients Use this switch if you want to build and install only the application server refdbd. This is mainly targeted at package builders. --disable-server Use this switch if you want to build and install only the clients but not the application server. This is mainly targeted at package builders. Finally, run ./configure with any options that you need. If you build in a separate directory, use the relative path to configure in the source directory. A complete set of options might look like this if you use PostgreSQL: $~ ./configure --with-refdb-url=http://yourbox.com/refdb --with-db-server=pgsql --with-var-dir=/var/run \ --with-log-dir=/var/log --with-libdbi-dir=/uar/local/lib --with-docbook-xsl=/usr/local/share/sgml/stylesheets/docbook \ --with-tei-xsl=/usr/local/share/xsl/tei Run make. This will create the executables and adapt scripts and other files to your local installation. make install will copy the application server and the clients to /usr/local/bin and the data files to /usr/local/share/refdb unless you chose different directories in the configure step. To finish the installation, please follow the instructions in the section Finishing the RefDB installation below. Now you have everything in place to use the RefDB clients and the application server from the command line. To install the application server as a service, the following additional steps are necessary: Install the service with the command cygrunsrv -I refdbd -p /usr/local/bin/refdbd -a '-s' (adapt the paths to your local installation if necessary). Start the service with the command cygrunsrv -S refdbd. To stop the service, use the command cygrunsrv -E refdbd. If you prefer, you can also start and stop the service with Windows' own tools: Either use the system control panel or use the commands net start refdbd and net stop refdbd. With this setup, the service will be automatically started at system startup. See cygrunsrv --help for additional options. Installation of prebuilt binaries If you decide to grab the prebuilt binaries, the installation will be a little bit faster. The binaries are accompanied by a copy of libexpat. Please make sure to read the aptly named Readme files as they may have newer or additional information. Unpack the archive in the root directory (/) with the command tar -xzf refdb-cygwin-bin-x.y.z.tar.gz (the exact archive name depends on the version you use). This will extract the files into the /usr/local hierarchy. The binaries and scripts go to /usr/local/bin, the Document Type Definitions, stylesheets, styles and example configuration files go to /usr/local/share/refdb and its subdirectories. Unpack the prebuilt binaries for both libdbi and libdbi-drivers, available here, in the very same way. Add /usr/local/share/refdb/refdb.cat to your SGML_CATALOG_FILES environment variable. Create the configuration files in /usr/local/etc. Sample configuration files with a .example extension are created in the same directory during the installation. Provide personalized copies for the user's home directories as needed. To install refdbd as a service, follow the instructions above. Installation on Windows 95/98/ME Most of the things said for Windows NT/2000/XP are applicable as well for Windows 95/98/ME. The main difference is that the latter operating systems do not support the idea of a daemon or service. The closest thing you can do to running a service is to put a shortcut to refdbd into the startup folder. This is not much of a problem if you run the RefDB clients on the same computer as refdbd. However, Windows 95/98/ME are not suitable to handle RefDB requests from other computers because refdbd will not run if nobody is logged in. Other operating systems RefDB has not been ported to other operating systems yet. As no esoteric features of the C language are used, you may just try to run ./configure [options] && make and see what happens. Chances are that it either works or can be convinced to work with just a few modifications. If you manage to run RefDB on a platform not described here, a short notice with the porting instructions would be greatly appreciated. Finishing the RefDB installation This step is necessary for all platforms. You have to create some databases for RefDB to start with and you should make the RefDB SGML/XML support files known to your system. In most cases you will prefer to use a script provided with RefDB which performs all things required for a first-time installation. If you need more precise control, you'll also find instructions below how to set up RefDB manually. Using the interactive setup script The interactive script refdb-init must be run with root permission as it tries to fiddle with a couple of files that a regular user should not have write permission for. After starting the script, it will collect a few answers from you about your intended setup. It will also perform a couple of sanity checks. After this stage is completed, you will be asked to positively confirm whether or not your system should be modified. Therefore it is safe to dry-run this script in order to decide whether you prefer the script over the manual installation. The script creates the main database, the refdbd and refdba configuration files, loads the available styles, creates a reference database and a database user account. All that is left to do manually is to take care of the SGML catalog file. Manual setup Configuration files Now is the time to create the global configuration files described in the configuration file section. Create these files in /usr/local/etc/refdb (or whatever you chose during configuration). It is recommended to copy and modify the commented example configuration files in the same directory. These files are installed with the suffix ".example" to avoid overwriting existing configuration files. All required paths are automatically configured during the installation, so these files are a good starting point for your local modifications. The refdbdrc configuration file can be copied from one of the templates refdbdrc.mysql.example, refdbdrc.pgsql.example, refdbdrc.sqlite.example, or refdbdrc.sqlite3.example according to your choice of the database engine. Configuring your database server The default installation of all supported database engines should be just fine for running RefDB. However, in some cases a little extra work is needed. MySQL The MySQL engine earlier than version 4.1 supports only one character encoding per server instance. The default encoding is ISO-8859-1, aka Latin-1. If you prefer a different encoding, you have to configure the server at startup. Either use the mysqld command-line option , or add a "default-character-set=charset" entry to a suitable MySQL configuration file. A list of available encodings is usually installed as /usr/local/share/mysql/charsets/Index. In MySQL versions 4.1 and later each database (in fact, each table) may have one of various character encodings. For security reasons many default installation allow only local connections. If refdbd has to connect to the database server from a different box, make sure to remove the option from the MySQL start script or from the appropriate MySQL configuration file. PostgreSQL Most default installations of this database server allow only local Unix sockets connections due to security concerns. However, the refdbd application server will always talk to the database server via a TCP/IP connection. Please make sure to start postmaster with the command line option to switch on TCP/IP support. SQLite The embedded database engine SQLite (versions 2.x) supports two character encodings as a compile-time option: ISO-8859-1 (Latin-1) and UTF-8. The former is the default if you don't use any configure options and if you use prebuilt binaries. If you need Unicode support, you'll have to recompile SQLite using the proper configure switch. SQLite version 3.0 and higher uses UTF-8 as the default encoding which is just fine for the purposes of RefDB. Creating the databases The RefDB database contains common information that is shared by all reference databases. The following sections explain the database engine-specific steps. In all cases you have two options: The recommended way is to let refdbd handle the installation, but for special needs there is also a description how to set up the databases using the database engine clients. MySQL As mentioned above, the recommended way to create or update the main database is to run the following command from your root account: ~$ refdbd -a -u username -w password Specify the username and password of your database administrator account. If the default setup described above does not suit your needs, please use the following procedure instead to set up the main database. If mysqld (the MySQL database server) is installed on a remote box or if the security settings require it, you may have to use the and/or the / options to run the mysql client as shown below (most fresh MySQL installations use "root" with no password as the default database administrator). mysqld needs to be up and running and you need the appropriate permissions, of course. See the MySQL documentation for further details. Instead of using refdbd, you can also use the hard way and create the main database using your database engine client: In a command line window, run the following command to create the database "refdb": ~$ mysql -u root -e "CREATE DATABASE refdb" Then create the tables and fill in the data. For MySQL older than 4.1, run: ~$ mysql -u root refdb < /usr/local/share/refdb/sql/refdb.dump.mysql For MySQL 4.1 and later, run this instead: ~$ mysql -u root refdb < /usr/local/share/refdb/sql/refdb.dump.mysql41 Adapt the path to the script accordingly if you configured RefDB to put the data directory somewhere else. The above command will create the tables using the MyISAM engine. This is the fastest of the supported engines, but it does not support transactions. If you prefer to use the InnoDB engine instead, use this command: ~$ sed 's/MyISAM/InnoDB/' < /usr/local/share/refdb/sql/refdb.X.dump.mysql41|mysql -u root refdb Use the highest dump file number 'X' shipped with your current RefDB version. See the MySQL documentation for further information about the table engines available with MySQL. PostgreSQL You must run the following command either from your root account, or from a special database administrator account (depending on your local PostgreSQL installation). Run this command to let refdbd create the main database: ~$ refdbd -a -u username -w password Specify the username and password of your database administrator account. If the default setup described above does not suit your needs, please use the following procedure instead to set up the main database. Your PostgreSQL administrator accound may not have the privileges to write to the PID file. In that case, add something like to the command line mentioned above. If postmaster (the PostgreSQL database server) is installed on a remote box or if the security settings require it, you may have to use the and/or the options to run the psql client as shown below (most fresh PostgreSQL installations on Unix-style systems use "pgsql" with no password as the default database administrator. The Cygwin port of PostgreSQL uses the name of whoever installed the package, usually "Administrator". On Debian you need to be logged in as user "postgres": first su root, then su postgres). postmaster needs to be up and running and you need the appropriate permissions, of course. See the PostgreSQL documentation for further details. Instead of using refdbd, you can also create the main database using your database engine client: In a command line window, run the command: ~$ createdb -U pgsql -E UNICODE refdb The data that you will import in the following steps are UTF-8 data. If you wish to use a different encoding, convert the dump file and adapt the above command accordingly. Then run this command: ~$ psql -U pgsql refdb < /usr/local/share/refdb/sql/refdb.X.dump.pgsql Use the highest dump file number 'X' shipped with your current RefDB version. Adapt the path to the script accordingly if you configured RefDB to put the data directory somewhere else. This SQL script will generate the necessary table definitions and fill in a few values. PostgreSQL will notice you that it is going to truncate a few identifier names. It is safe to ignore these messages. Access control works through user groups. To be able to access the main database, create a RefDB user group like this: ~$ psql -U pgsql refdb -c "CREATE GROUP refdbuser" ~$ psql -U pgsql refdb -c "GRANT SELECT ON CITSTYLE, POSITIONS, REFSTYLE, SEPARATORS, t_journal_words, t_meta TO GROUP refdbuser" SQLite Run the following command from your root account to let refdbd create the main database: ~$ refdbd -a If the default setup described above does not suit your needs, please use the following procedure instead to set up the main database. The default database directory is /usr/local/var/lib/refdb/db. RefDB will look here unless you selected a different data directory when configuring the application. If you want to keep your databases somewhere else, use the dbpath variable in refdbdrc and modify the following instructions accordingly. ~$ cd /usr/local/var/lib/refdb/db Run the following command to create the database and load the data: ~$ sqlite refdb < /usr/local/share/refdb/sql/refdb.X.dump.sqlite Use the highest dump file number 'X' shipped with your current RefDB version. The SGML/XML support files The RefDB package comes with a few additional scripts and stylesheets for the creation of bibliographies. These files are installed in the package data directory (usually /usr/local/share/refdb) and its subdirectories, but you should spend a little time to integrate them into your SGML system. To this end, add the catalog file /usr/local/share/refdb/refdb.cat to your SGML_CATALOG_FILES environment variable. This is a master catalog with CATALOG directives for all catalog files supplied by RefDB. The shell scripts The RefDB shell scripts and Perl scripts were installed in /usr/local/bin unless you chose a different install root during configure. As RefDB attempts to insert the correct settings during the build process, it should not be necessary to manually customize these scripts. If you still want to fiddle with the settings, the variables are clearly marked within a user-customizable section at the top of each script. If you want to use a Java XSL processor with the refdbxml script, you'll have to check the value of CLASSPATH in the script. The value must match the actual location of your .jar files and the current versions you've installed. Testing your installation Now that you got this far, you surely want to see whether your setup actually works. To this end, you may want to run the following tests and see what happens. For your convenience you should perform this test in a graphical environment running at least two console windows. For our first tests it is desirable to have debug information directly available. Therefore you should start refdbd from the root account with some special parameters. Before going ahead you should make sure that you do not have a refdbd process already running, e.g. because you've setup your system to start that daemon at system startup. The following command will kill any refdbd processes. It will do no harm if no such process is running. #~ refdbctl stop If you see an error message saying refdbctl: command not found then your installation failed or your PATH environment variable is not set properly. Now that we know that there is no other refdbd process around, we'll start a fresh one with special properties: We'll run it in a separate xterm as a standalone application and have it write debug information to stderr. This way, RefDB will be slow, but we directly see what's going on. #~ refdbd -s -e 0 -l 7 If you try to access refdbd from a different box, you should also use the switch to allow remote connections. refdbd should print some diagnostic information about its startup process and then wait for clients to connect. You may experience problems at this point if the access rights do not allow refdbd to create its PID file. This is why we run the test process as root, but if you plan to set up RefDB for use with a different account, this is a good time to check and try out these access rights. You may use the option to provide the path to a PID file that you have write access to in order to run refdbd from an unprivileged account. refdbd checks the availability of libdbi database drivers during the startup procedure. The following messages indicate a problem with libdbi: error while loading shared libraries: libdbi.so.0: cannot open shared object file: no such file or directory This is a common problem if you build your system from packages, but have to build some libraries (like libdbi, as shown here) from the sources. libdbi and most other autotools-based programs are installed into /usr/local by default. On some systems (like Debian, Ubuntu) the linker does not peek into /usr/local/lib for shared objects. To fix this, please add /usr/local/lib to /etc/ld.so.conf and run ldconfig(8), or configure the libraries to install into /usr/lib instead. See ./configure --help for further instructions. Unable to initialize libdbi! Make sure you specified a valid driver directory You should see a few lines before this message which libdbi driver directory refdbd attempted to use. Either the default directory is not where the drivers are, or you specified an incorrect driver directory. Initialized libdbi, but no drivers were found! The libdbi library was not able to locate or properly load at least one database driver. Please check the libdbi installation and make sure you've installed at least one database driver. Remember that on most systems the libdbi-drivers package is distributed separately from the libdbi package which contains only the framework, but no drivers. This error also occurs if you install driver versions which are too old for the libdbi framework. If refdbd successfully loads libdbi, it will list the available database drivers. Make sure the driver for the database engine you use is listed. Now switch to a different xterm and start the refdba client. The client can basically run from any user account, but the username and password settings have to be those of a database administrator. We're talking about that username and password that you would provide to the command line client of your database server (mysql or psql for MySQL and PostgeSQL, respectively) for administrative tasks. The username and password settings are either provided by the corresponding configuration file ~/.refdbarc, or by using the command line options . In the first case, that is if you set up your configuration file properly, you can just say: #~ refdba In the second case you have to use this instead: #~ refdba -u <dbadmin> -w <dbadmin-passwd> In both cases the client should start up and wait for your commands with a friendly prompt. At first you might try and see whether the RefDB programs read their configuration files properly. To this end, first run the following refdba command: refdba: set This will list the current settings of all configuration variables. Make sure these values are what you want. The most important variables are: username and passwd (you won't see the value of the latter for security reasons, though), as well as the host name or IP address of the box that runs refdbd. As we currently run both the server and the client on the same box, please make sure that the value of serverip is "127.0.0.1". Now try to send a command to the server. We use a command that does not require database access, but it will tell us whether we can connect to the server properly: refdba: viewstat Several things can happen. If you get several lines of output, telling you about the database server used and about a few refdbd variables, you're fine. This output may look like the following: You are served by: RefDB 0.9.4 Client IP: 127.0.0.1 Connected via pgsql driver (dbd_pgsql v0.7.1) to: PostgreSQL 7.2.1 on i386-portbld-freebsd4.3, compiled by GCC 2.95.3 serverip: localhost timeout: 180 dbs_port: 5432 logfile: /home/markus/prog/refdb/pseudotest/log/refdbd.log logdest: 0 loglevel: 7 remoteadmin: off pidfile: /home/markus/refdbd.pid If you get the following message instead: could not establish server connection, check that refdbd is still running and that the serverip setting in refdba is correct. If you try to access refdbd from a remote box, make sure the server was started with the option. The error may also result from the fact that you failed to create the common database refdb or that you did not use the appropriate database server administrator username and password when starting refdba. Finally, your system may lack the runtime client library of the database server. The error message failed to connect to database server shows that your client can talk to refdbd, but that in turn can't talk to the database server. This may be due to incorrect username/password settings or incorrect permissions with the database servers that support user authentication. If you use SQLite as the database engine, you may have specified an incorrect database directory. A third possible outcome of this test is the message "main database too old or corrupt". Sometimes this is just what it says, e.g. if you upgraded to a newer version without re-creating the main database although the UPGRADING file told you to do so. However, the most likely reason is an incorrect setting in the refdbdrc config file. Please check that the dbserver variable matches the database engine that you created the main database for. The default is sqlite. This is all it takes to test the basic functionality of your setup. Everything beyond this is either site-specific setup or mere usage of the tools. Please peruse the manual, especially the hints about getting your database access rights correct. SRU support In addition to its native clients, RefDB also supports optional read access through a web-based search protocol called SRU (Search and Retrieve via URL). There are two options to enable SRU access. We'll first describe a CGI script which is the preferred way but requires a running web server on your system. The subsequent section describes a simpler standalone server for testing purposes and for single-user access. Setting up SRU support as a CGI program In order to provide SRU services at your site, you need to add a CGI script to your web server. The following instructions assume that you use Apache as your web server. However, the CGI script will work just fine with any other web server that provides CGI support. Configure your web server If your web server is already set up to run CGI scripts, you might be all set to run the SRU CGI script as well. If you're not sure, follow the instructions below and check whether the your configuration file already has the relevant entries. The Apache web server uses a configuration file called httpd.conf. On many systems this file is located in /usr/local/etc/apache. Locate the section starting with "<IfModule mod_alias.c>" and make sure it declares a CGI directory: ScriptAlias /cgi-bin/ "/usr/local/www/cgi-bin/" You can choose a different directory, but the directory listed here must exist and be accessible from the account the web server runs in (often "www" or "nobody"). Now you have to allow the execution of CGI scripts in that directory: <Directory "/usr/local/www/cgi-bin"> AllowOverride None Options ExecCGI Order allow,deny Allow from all </Directory> Finally, you have to restart your web browser to let these changes take effect: ~# apachectl restart Install the SRU CGI script First you need to make sure the /cgi-bin/ directory configured above exists and has the proper permissions. Local habits may vary, but you should see something like this: ~# ls -ld /usr/local/www/cgi-bin drwxr-xr-x 2 root wheel 512 Mar 13 14:56 cgi-bin In the Apache default installation /usr/local/www/cgi-bin is a symbolic link to an example CGI directory. Remove the symlink and create a real directory with the appropriate ownership and permissions instead. Now copy the scripts/refdbsru CGI script into that directory and make it executable for all: ~# cp refdbsru /usr/local/www/cgi-bin ~# chmod a+x /usr/local/www/cgi-bin/refdbsru All SRU replies are XML files. This is just fine if the requesting agent is a program that intends to further process the data, or to store them somewhere. If the requesting agent is a web browser with a human being in front of it, the plain XML output is a bit hard on the eyes though. It is recommended to provide XSLT stylesheets which can render the XML output in a human-readable HTML format (most current web browsers support XSLT these days). These stylesheets are used by default, unless a user provides the URL of a stylesheet of his own. Unless you already have a designated folder for system-wide stylesheets, just create one, and make sure it is readable: ~# mkdir -p /usr/local/www/data/styles ~# chmod a+r /usr/local/www/data/styles Now copy the example stylesheets shipped with RefDB (installed in /usr/local/share/refdb/sru) into that directory: ~# cp refdbsru.xsl mods.xsl risx.xsl refdbsru.css /usr/local/www/data/styles Needless to say, you can tweak all these stylesheets to your heart's content. Finally you should provide a configuration file called refdbsrurc which usually goes into /usr/local/etc/refdb/. You'll find a preconfigured example file in the same directory which you can copy and edit. Make sure the xslurl variable points to the refdbsru.xsl file that you've just installed. The value of this variable is an absolute or relative URL in the filesystem of the web server. If your setup is as described above, /styles/refdbsru.xsl will work just fine. It is recommended to set the variables starting with zeerex_ to meaningful values. These values determine part of the output of the explain SRU command and are supposed to provide the users of your site with useful information about your SRU service. Tune the SRU CGI script From refdbd's point of view, the refdbsru CGI script is just another client. The script therefore requires a similar configuration file like the other clients, and it needs a database account to work with. For the configuration of the script, see the refdbsru reference. As SRU provides only read access to your databases, it is recommended to create a separate database account for SRU accesses which all SRU users share. If you specify these values in the configuration files, the SRU users will not have to provide any login information. You may want to restrict that account to read access only using the appropriate switch of the adduser command. Test the SRU CGI script Open your favourite web browser and enter the following URL: localhost/cgi-bin/refdbsru You should now receive an XML document that describes the RefDB SRU service. If you receive a web server error instead, retrace your steps above and make sure you have restarted the web server before testing. If nothing else helps, please peruse the documentation of your web server. The appropriate document for Apache is the CGI HowTo. Finally, you should advertize the new service on your web site. Provide a link to "<hostname>/cgi-bin/refdbsru" along with some instructions how to use SRU, as explained in the user manual. Setting up SRU support using a standalone web server RefDB also provides a standalone web server to run the SRU service. All you need to do in terms of "installation" is to create or edit the SRU configuration file that the standalone server shares with the CGI application. See also the refdb-sruserver reference. Then start the SRU server like this: ~# [perl] refdb-sruserver The server will run in the foreground until you kill it with Ctrlc. Now point your web browser to: localhost:8080 As you can see, the SRU server uses the non-standard port 8080 so it does not interfere with any regular web server. This also means that the standalone SRU server is usually not accessible from a remote computer unless you configure your firewall appropriately. However, as long as you connect locally you should receive the output of the SRU explain command. Install the PHP interface If you want to provide interactive access to your RefDB databases through the web, consider installing the PHP web interface. This web frontend provides a convenient way to perform the most common user tasks, like running queries or adding datasets. Prerequisites Please check the following prerequisites on your computer before attempting to install the PHP interface Web server Any web server that is capable of running PHP scripts. If you don't run a web server anyway, Apache is always a good choice to start with. Both versions 1.3.x and 2.x will work just fine. PHP interpreter You need PHP5, the older PHP4 won't do. When building PHP, make sure to configure the software appropriately so the php5 Apache module gets built. If you install a prebuilt package, you may have to select an extra package that contains the appropriate module for your web server. With the exception of session support, the RefDB PHP interface relies solely on core features of PHP5. You may therefore have to install PHP5 session support separately. However, on some systems like FreeBSD, "core" does not mean "it's there". If the PHP5 core is split into several packages, you may also have to install DOM, XML, and XSL support separately. Web server configuration The following instructions assume that you use Apache as your web server. The configuration file is usually /etc/apache/httpd.conf or /usr/local/etc/apache/httpd.conf. Locate the section "Dynamic Shared Object (DSO) Support". Check if the php5 module is loaded anyway. If not, add a line like the following: LoadModule php5_module libexec/apache/libphp5.so The subsequent section in the config file needs to be updated too if you had to add the php5 module: AddModule mod_php5.c Further down there should be a section containing Aliases. Create a new one within this section like this: Alias /refdb/ "/usr/local/share/refdb/www/" <Directory "/usr/local/share/refdb/www"> AllowOverride None Order allow,deny Allow from all AddType application/x-httpd-php .php .phtml </Directory> The paths point to the files that RefDB installs with all other shared files. If you intend to customize or modify the interface, you can copy the files to a directory in your home folder and change the directories in the config file accordingly. Finally you'll have to let the Apache server re-read it's configuration file: ~# apachectl restart Test your PHP interface To see the PHP interface in action, first make sure that the RefDB application server is running: ~# refdbctl start Now start your web browser and point it to: localhost/refdb/ Please note the trailing slash! Now you should be greeted by the login screen.
refdb-1.0.2/doc/chapter-introduction.xml000644 001750 001750 00000043374 11512721663 021115 0ustar00markusmarkus000000 000000 Introduction What is RefDB? RefDB is a reference and note database. Use it to manage your collection of offprints of scientific publications, or basically any other collection of printed or electronic documents along with your personal notes. RefDB is also a bibliography tool for markup languages. The bibliography tool allows to create printable or online documents with formatted citations and bibliographies from DocBook SGML/XML, TEI XML, and LaTeX sources. RefDB can also serve as a data source for other applications. You can either use the SRU interface, or use the Perl and PHP libraries to integrate RefDB functionality directly into your own projects. Who should use RefDB? RefDB was designed with the needs of a scientist in mind. At least one third of a scientist's work hours are spent reading and evaluating other scientist's publications. In no time you have a pile of offprints or PDF files that you would like to archive in a way that keeps the information accessible. RefDB helps you to keep track of those papers by creating a database with the essential bibliographic information, keywords for easy retrieval, your personal comments, the reprint status, a hint where you can find the offprint (or a link to the electronic version), and additional information for your personal categorization. Extended notes help you organize your references according to topics and allow you to associate additional information with references, keywords, authors, or periodicals. This goes far beyond the one-note per reference approach of commercial tools, although this is of course still supported. Extended notes are associated to the user that created them, but they are visible to all users unless you restrict the display accordingly. Scientists rarely work alone on a subject. More commonly they are members of a group with similar research interests. It would be a waste of time and effort if each member of the group hunts offprints individually, resulting in duplicate copies, and if each member keeps his personal reference database, making it hard to consolidate an information pool of the group. Instead of selling a complete database engine to each scientist and "allowing" the users to peek at each other's databases, RefDB uses the inverse approach: designed as a client/server application from the ground up, it allows a group to maintain a common reference database, but still allows each individual to view only those references that she added or explicitly selected. At the same time, each group member can find out in an instant which offprints are available in the whole group. However, there is no problem if you want to use RefDB as an individual user. Eventually you'll want to publish your own data. You'll have to cite dozens of papers that you've already read. Your RefDB database will make it a breeze to retrieve those papers by author, by keyword, or by any other field or combination of fields. If you write your document using one of the supported SGML or XML DTDs or as a LaTeX document, RefDB can create the bibliography based on the citations in your document. It will also help you to format the citations and the bibliography according to the instructions of your publisher. Your paper got rejected and you want to submit it to a different journal? Fear not, RefDB can easily re-transform your document and format it for a different publisher. Of course it is also feasible to manage your personal library of contemporary literature. Or your favourite cookie recipes. RefDB wasn't precisely designed for these purposes, but it's up to you to make the best use of the package. General features RefDB uses a three-tier architecture (see ), consisting of clients on the workstation side, and an application server as well as the SQL database server on the server side.
RefDB three-tier architecture
Optionally you may use an internal database engine instead of the external SQL server, resulting in a simpler two-tier setup.
The data storage proper is done by a SQL database engine. Currently MySQL and PostgreSQL are supported as external database engines. Additionally, an internal SQL engine based on SQLite is available, which allows data storage in a single, operating-system and architecture-independent file without any administration overhead. By default, incoming data are converted to UTF-8 and stored as such (see ). Outgoing data can be converted to other character encodings if needed. However, RefDB can be set up in a very flexible manner to accommodate other character encoding requirements as long as they are supported by your operating system.
RefDB character encoding support
The server can run as a daemon in a non-privileged account if security concerns require this. Besides, users can start it as a standalone application on demand. As just about everything is configurable, a thoughtful setup will allow to run several copies of the server on the same box in parallel.
Interfaces The RefDB command-line clients are no fat applications, but rather a collection of small, portable tools implemented in ANSI C to perform all necessary client-side tasks on any platform with a decent C compiler. The RefDB command-line clients can be run in an interactive mode or in a batch mode. The latter is useful for scripting purpose or for use as backends of graphical user interfaces. A PHP interface allows to perform most RefDB operations through a web interface. RefDB also provides clients which allow to access RefDB databases through a SRU (Search and Retrieve via URL) interface. A simple standalone client for personal use and a CGI program for shared use through a web server are available. Separately available packages integrate RefDB functionality into Emacs and vim, turning these editors into integrated authoring environments for DocBook and TEI documents with easy access to your reference data. The adepts of the Perl programming language might be delighted to know that the RefDBClient module allows Perl programs to directly communicate with a refdbd server without using the C clients. This allows the rapid development of custom programs that access RefDB databases. Reference management features Reference data are imported from text files or from stdin and exported to text files or to stdout. The data model is fairly close to the RIS specification that most Windows-based reference managers understand. RefDB natively understands both the tagged RIS format used by other reference management software and an XML format according to the risx.dtd similar to RIS. Input filters can be used to convert references from various sources to the RIS format. Currently RefDB ships with Medline, BibTeX, MARC, and DocBook filters. You are free to use or write any other input filter that you may need. These filters must either create an output file or write the results to stdout for further plumbing. This way, input filters can be written in almost any programming language and it should be easy to extend the list of reference information formats that RefDB can import. In addition, SGML- or XML-based data formats can be easily transformed to risx using DSSSL or XSLT stylesheets. Extended notes are supplied as XML files according to the xnote.dtd. The query language is fairly simple yet powerful. You can search in all fields in the database. You can use the Boolean operators AND, OR, NOT to combine search expressions. You can use brackets () to group search expressions. You can use either literal matches or regular expressions in all alphanumeric fields (i.e. most except e.g. the publication year). This gives you enormous flexibility in your search strategies. The readline library reads the user input in all interactive clients. You can recall any previous search strings with a few keystrokes and re-run them or modify them as needed. The query results can be displayed in a variety of formats. The standard backends create screen, HTML, XHTML, BiBTeX, DocBook (SGML and XML), TEI (XML), MODS (XML), RIS, and risx formats. All output can either be viewed on stdout or with a pager, or the output can be redirected into a file or into a pipe for further manipulation. RefDB provides a simple API to implement custom backends if you need other output formats. In addition, Perl programmers can use the risx output and the RefDBClient module to easily create any output format they desire. RefDB supports all character encodings available on your platform. While the available encodings in the database may be limited by the database engine, RefDB can convert incoming data as well as exported data with only few limitations. RefDB handles the L1 field of the RIS input files (denoting a local PDF or Postscript copy) in a very flexible way. You can specify a path to the file on your harddrive or on the web. The local path can be split into a variable and a static part. The variable part can be specified on the command line e.g. if you access your data remotely via a NFS-mounted share. RefDB knows the concept of personal reference lists. This feature is useful if a database is shared among several users in a workgroup. In this case, all users benefit from the larger stock of references available in the database. RefDB keeps track of the user who added a reference to the database. You can use a switch in the getref command to restrict your search on those references that are associated with your username. On the other hand, if you find out that even your colleagues have one or two interesting papers, you can use the pickref command to add these references to your personal reference list. The personal part of the reference information (the reprint status, the availability, and the notes) are saved for each user individually. In addition to this default list, each user can create an unlimited number of additional lists. In a similar fashion, the display of extended notes can be limited to the notes of the current user, or all available extended notes are used. Bibliography tool features Bibliography support is currently implemented for DocBook SGML and XML documents, TEI and TEILite XML documents, and for LaTeX documents. SGML and XML RefDB scans your input document for citations and generates a bibliography which contains the cited references. You can include this bibliography into your document and process it with RefDB's tools to obtain formatted citations and bibliographies. RefDB creates bibliographies for DocBook (SGML, DTD-based XML, and schema-based XML), TEI (DTD-based XML and schema-based XML), and bibtex. The implementation of the SGML/XML citations and bibliographies is "non-destructive", i.e. switching from one bibliographic output format to a different one is limited to re-creating the bibliography and transforming your document again. Alternatively you may use a short notation for your citations that makes do with a minimum of markup. The short notation needs an additional (but fully reversible) preprocessing step before bibliographies and formatted output can be created. RefDB uses cooked bibliography output to provide full control over the formatting. This somewhat blurs the distinction between structure and formatting but it is the most efficient way to handle the task of formatting bibliographies and citations. The TEI bibliography output is even worse as it heavily abuses the all-purpose seg element as a wrapper where the elements intended for a particular purpose do not allow a cooked use. Alternatively you can request raw bibliography output. In this case you can either rely on the default bibliography formatting provided by the stock DocBook or TEI stylesheet, or you resort to other bibliography formatting tools. LaTeX The BibTeX output integrates seamlessly with the LaTeX/BibTeX tools, so there is only one additional command to run on your way from the LaTeX source to the finished document. RefDB creates a BibTeX bibliography file based on the information in a .aux file. The latter is created by latex from the LaTeX source document. This intermediate bibliography file serves as the input file for bibtex. So instead of keeping all your references in a flat text file, RefDB will create a short bibliography file with the references that your particular document requires. RefDB performs only a very limited amount of formatting for those items which are not well supported in BibTeX (e.g. with BibTeX you need two separate bibliography files if you switch from a format that uses abbreviated journal names to a format that requires the full names). All other formatting is left to the LaTeX/BibTeX system. Credits Throughout the creation of this software the author borrowed code and solutions to particular problems from other software packages in a shameless way. But this is one of the purposes of free software, after all. The following is a hopefully complete list of all programs and libraries that in one way or another helped to get RefDB on its way. btparse expat getopt libdbi libdbi-drivers libslack MySQL ncftp PostgreSQL readline SQLite wget
refdb-1.0.2/doc/chapter-limitations.xml000644 001750 001750 00000007024 11512721663 020720 0ustar00markusmarkus000000 000000 Current limitations and platform issues This chapter briefly lists features which are either not yet implemented or which don't work as they should or which work differently on different platforms. These things may be implemented or fixed in future releases, respectively. Limitations The clients do not use a dynamic buffer to read the data from the application server. This may result in timeouts if you view the results with a pager that can't buffer large amounts of data in the background. To avoid these problems, it's prudent to redirect queries that return large amounts of data into a file. The query results can only be sorted by ID (default) and publication year. Support for different character encodings depends on the database server. PostgreSQL offers a variety of different character encodings, including Unicode, which are selectable per database. MySQL versions 4.1 and later support character encodings as well, including Unicode. SQLite offers Unicode support as a compile-time option. SQLite3 uses Unicode by default. Export of bibliography styles to BibTeX .bst files would be really cool but is not implemented yet. Platform issues Cygwin currently does not support named pipes/FIFOs. refdbd uses these to implement a child->parent messaging after the application server has forked. On Cygwin, this messaging is emulated with a temporary file. This is a bit slower (and a lot kludgier and error-prone) than a named pipe and almost certainly is a security hole. As of this writing, support for named pipes appears to be implemented as an experimental feature in Cygwin. It does not work as expected yet, so RefDB still emulates named pipes on Cygwin. Cygwin currently does not implement the detection of pending data on stdin. Therefore, data that you send to stdin of a client will not be read unless you use the command line option. The Cygwin port of SQLite has a problem working with absolute paths. The safest way is to start refdbd from the root directory (the start script refdbctl does this by default) and use a relative path to the database directory (i.e. leave away the leading slash). As the Cygwin library has to translate all calls to Unix system functions to native Windows function calls, there is a small performance penalty in comparison to native Windows or Linux/Unix applications. My general impression however is that this does not affect the overall performance as most time seems to be spent inside the database server. You may gain some milliseconds by running the application server on a Linux/Unix box, though. Of course a major problem is the lack of support for more platforms. RefDB may work on a variety of platforms besides those mentioned above, but unless you tell me so, I'll never know! refdb-1.0.2/doc/chapter-managing-notes.xml000644 001750 001750 00000022631 11512721663 021274 0ustar00markusmarkus000000 000000 Notes management Managing notes is very similar to managing references. The commands have analogous names and functionality. If you've familiarized yourself with managing references, the notes part should not be too hard either. Add extended notes Extended notes must be supplied as datasets according to the xnote DTD. Add them to the database using the addnote command. Each file supplied to this command may either contain a single xnote element or several of these wrapped into a xnoteset element. The id attribute, if any, will be ignored when you add extended notes. The database engine will assign each note a new, unique identifier. The citekey attribute will be honored unless there is a clash with an existing note. In this case refdbd will refuse to add the note. If you want to overwrite or update an existing note, use the updatenote command instead. Example Assume the file foo.xml contains a couple of extended notes. The following command will add them to the database "bar" (use the full path to foo.xml if necessary): refdbc: addnote -d bar foo.xml Find and view extended notes Just as you'd use the getref command to locate references, you can use the getnote command to view notes. The query language is explained in a separate section. The notes can be retrieved for screen display, as HTML or XHTML documents, or as xnote documents. Accessibility of notes is affected by the default note sharing setting of refdbd and by the properties of the individual notes. See below for further details. Delete extended notes Use the deletenote command to remove extended notes from the database. The argument to this command is a space-separated list of ID values. Example The following command removes the notes with the IDs 4 and 132 from the database "bar": refdbc: deletenote -d bar 4 132 Edit extended notes Use the same strategy as you would for references: First retrieve the notes you want to edit with the getnote command and write the output to a file: refdbc: getnote -d bar -o foo.xml -t xnote :NID:=4 OR :NCK:=biochemistry1999 Now use your favourite XML editor to edit the notes. Keep the citekey and id elements alone, as at least one of them is required to match the dataset with the existing copy in the database. Finally use the updatenote command to update the reference in the database: refdbc: updatenote -d bar foo.xml Link existing notes to other objects in the database If you want to link an existing extended notes to other objects in your database without modifying the contents of the note, the addlink command comes in handy. The command requires at least two arguments. The first argument specifies an existing note by its ID or citation key. The second argument specifies an object in the database, either a reference by ID or citation key, or an author name, a keyword, or a periodical by their names. Removing links works just the same except that you need to provide the switch. Example The following command links the existing note with the ID 5 to two references which are specified by their citation keys: refdbc: addlink -d bar :NID:=5 :CK:=Miller1999 :CK:=Doe2000 To share or not to share extended notes RefDB was written with facilitating the cooperation of users in mind. Therefore extended notes are visible to all users of the system by default. However, situations may arise where you don't want to share any notes or where you want to protect only individual notes from your colleague's prying eyes. RefDB supports all these variants. Accessibility of notes is controlled by two filters: the default server setting and the settings in the individual notes. The refdbd default The refdbd server can be configured to either treat all extended notes as public or as private by default. Use the command line option or the share_default config file option to set the default mode. See the chapter about refdbd administration for further details. As the names imply, public will make all notes available to every user by default. Similarly, private will restrict access to the user who added the note by default. Use the server setting to define a default policy for your installation. A warning for all admins: switching your server from "private" to "public" without prior announcement will alienate your users. Don't even think about it. The <sgmltag class="attribute">share</sgmltag> attribute of the extended notes The xnote.dtd defines an optional share attribute which offers the same choice of values as the server setting above. If the attribute is set, the extended note will be public or private regardless of the server setting. The server setting only kicks in if a note does not set the share attribute. Each user can decide for each note whether or not she wants to share it with the world. The following table summarizes the settings. Sharing extended notes share attribute "public" share attribute "private" share attribute not set share_default "public" public private public share_default "private" public private private
Data privacy The above settings control only the access to the extended notes through the RefDB interface. You should be aware that anyone who can access the database directly with an SQL client will be able to read and change the notes of every user, regardless of the settings mentioned above. The simplest way to secure the data is to run refdbd on a server that no user has shell access to. If the database engine access control is set in a way that users can only connect from the box that runs RefDB, they won't be able to connect from a SQL client running on their workstations.
refdb-1.0.2/doc/chapter-managing-references.xml000644 001750 001750 00000103372 11512721663 022267 0ustar00markusmarkus000000 000000 Reference management You can manage your references with the refdbc command line client. We will demonstrate the interactive use of refdbc, but feel free to use the non-interactive batch mode instead if you prefer. We'll also use a conservative, least error-prone approach whenever there are several ways to achieve the same goal. E.g. we'll use intermediate files instead of piping so we can verify what we got at every stage. Once you're sure about what you're doing, you can still speed up things. Add references RIS datasets Adding references boils down to running addref with proper input files. The input files have to be valid RIS files. They may contain one or more RIS datasets. You can set some fields to default values with the option of the addref. This will add the tags given in the defaultfile to the end of every dataset before they are added to the database. This means that these values override any values given in the datasets. This option may be convenient e.g. to set the reprint status of all datasets that you add in one fell swoop instead of editing them individually. Please be aware that any numerical values of the ID tag are ignored when you add references with the addref command. RefDB assigns an automatically generated ID to every new reference, so you can't enforce arbitrary IDs. You can however use the ID tag to provide an alphanumeric citation key, such as "Miller1999". The citation key should consist only of letters and numbers within the 7-bit ASCII range and has to be unique in the database. Remember that the citation key has to be all uppercase if you want to create bibliographies for SGML documents. If you do not specify a citation key, RefDB will generate a unique citation key based on the last name of the first author and the publication year. If you want to overwrite an existing reference with a given numerical ID or a given citation key, use the updateref command instead. Example 1 Let's assume we just downloaded a bunch of references from PubMed (the largest database for biomedical publications). We saved them in the "Medline" format, ending up with several small files containing one or more references each. How do we get them into the database? First we convert all references in the files (we prudently named them pm001.txt, pm002.txt and so on) to the RIS format and write the result into an intermediate file, using the med2ris.pl input filter: ~# med2ris.pl -o foo.ris pm* We could now open foo.ris in our favourite text editor and make a few changes. We could enter additional keywords, provide personal notes (e.g. why we currently find the article worth the paper it is printed on, something that may not be apparent a few months later), or specify the reprint status and availability. Then we switch to (or start) the refdbc command line client and type the following command at the prompt to add the references to the database bar (use the full path to foo.ris if necessary): refdbc: addref -d bar foo.ris Example 2 You feel the urge to import MODS data, an XML data format developed by the Library of Congress. RefDB does not support this format natively or via converters at this time, so you'll have to resort to an external tool. Chris Putnam's bibutils package comes to the rescue, as it provides a set of command-line tools to interconvert a number of bibliography data formats. Both RIS and MODS are supported, so we have all it takes. The following command imports the MODS data into your default database in a single step, although you may first want to check the output of the converter before going ahead: # xml2ris modsdata.xml|refdbc -C addref risx datasets If you prefer the XML data format instead, use the addref with the switch. As the data are imported using a non-validating XML parser you should make sure the documents are valid, either by using some nifty feature of your XML editor or by running the document through a suitable tool like xmllint. Each entry in a risx document can specify a numerical ID value and an alphanumeric citation key. The ID is ignored by the import routines. If you want to update or replace an entry by ID, you have to use the updateref command instead. The citation key should only use letters and numbers within the 7-bit ASCII range. Remember that the citation key has to be all uppercase if you want to create bibliographies for SGML documents. If you do not specify a citation key, RefDB will automatically assign a citation key based on the first author and the publication year. Example You've written a risx dataset from scratch and want to import it into your RefDB database. This is what you need to do: First you need to make sure that your document is valid against the risx DTD. Unless your XML editor validates your document anyway, you'll have to use an external validator like onsgmls, which is a part of the OpenSP suite of SGML tools, or xmllint, which is shipped with libxml2. ~# onsgmls -s /usr/local/share/refdb/declarations/xml.dcl foo.xml ~# xmllint --noout --dtdvalid "http://refdb.sourceforge.net/risx/index.html" foo.xml No news is good news in both cases: If your document is valid, the validator will not output anything. If you do get some error messages, go back to your editor and fix the problems. Now switch to refdbc and run the following command to add the references in foo.xml to the reference database bar: refdbc: addref -A risx -d bar foo.xml Find and view references The refdbc command getref is your friend to find and display references. The query language that is used to retrieve specific references from the database is explained in detail elsewhere. This section offers a few additional hints. The general idea of the getref command is that you specify what you want and you get back a chunk of text. You can select the format of this chunk (e.g. screen, HTML, or DocBook output) and you can specify what you want to do with this chunk. A suitable strategy for most searches works as follows: Run your initial query, send the screen output to a pager, and see whether the result is what you need. We use the screen output because it generates the least verbose output and thus is the fastest. If necessary, refine your search as discussed shortly until you arrive at the desired list of publications. Re-run the previous query, but use the output format and output destination that you need to work with the data. For example, if you want to edit the selected references, you would use the RIS format and write the result to a file with the option. refdbc has a uniquely simple way to rerun and modify queries. Many reference database allow you to modify previous queries only by adding new restrictions to the end or removing restrictions from the end of a previous query. refdbc is more flexible. In the interactive mode, refdbc keeps its own history of commands. You can use the up key or the Ctrlp combo to recall the previous query. You can press these keys repeatedly to go further back in the history. Use Ctrlr to incrementally search for a previous query by entering a short string. Adding more characters will make the search more specific. Pressing Ctrlr repeatedly after entering some search string will display other matches further back in the history. In the batch-mode, you can use the history feature of your shell. In either case you can modify, extend, or restrict any previous query as you see fit. Delete references The deleteref command accepts one or more reference IDs as its argument to specify the references you want to get rid of. This is quite straightforward if you want to delete one or two references. But what if you have a disjoint list of 17 references, e.g. all publications of an author who was convicted to be fraudulent? A useful strategy to delete such references is to save a query with the getref command to a file and use it as a list of ID values for a subsequent run of deleteref. This way you can verify by inspecting the file that you will delete the correct references. Use the option to request minimal datasets containing the ID value instead of the citation key in the ID field. Example To stick with the example of the fraudulent author, we assume his name is, as in so many examples, John Doe (apologies to all RefDB users with that name). First we select all his publications from the database bar, request only the ID, and save the result in an intermediate file: refdbc: getref -t ris -s ID -o tobekilled.ris -d bar ":AU:=Doe,J." The result is, once again, a file with plain text that we can check and edit to our needs. E.g. if you want to keep one or two publications in the list, just delete their entries in the intermediate file. Then we use the deleteref command to actually delete the references associated with our list of IDs: refdbc: deleteref -f tobekilled.ris -d bar Edit references RefDB has no built-in reference editor (but see the Emacs and vim support files which allow you to add and update references from within your editor). The general strategy to edit an existing reference is as follows: Save the reference(s) that you wish to edit to a file using a command like getref -o foo.ris -t ris -d bar ":ID:=1717 OR :AU:=^Miller". This would retrieve the reference with the ID 1717 as well as all references with a Mr. or Mrs. Miller on the author list. If you prefer, use the risx output format instead. Use your favourite text editor to edit the references in the file foo.ris. Make sure you don't touch the ID field as this is crucial to match this reference in the next step with the existing copy in the database. Use the command updateref -d bar foo.ris to update the reference(s) in the database. Print references There are two ways to print references: Send the output of the getref command to a printer: refdbc: getref -c lpr :ID:>0 You should probably be a bit more selective about the references than shown above unless you want to empty the paper tray of your printer. In any case, this command will print a list of your references in the screen output format. You can use some additional plumbing along these lines to obtain a more beautiful printer output: refdbc: getref :ID:>0 -c 'pr -f | fmt -w 70 | lpr' The second option is to write the HTML output to a file and use your browser's print capabilities. Managing personal reference lists Personal reference lists mainly serve two purposes: If you share your reference database with other users, your default personal reference list records which datasets you've added. Coincidentally, the name of this list is identical to your database username. In addition to your default list, you can maintain as many additional lists as you see fit. Use these lists to select references for particular purposes, e.g. when preparing a presentation or if you need to keep track of papers that you still have to read. So personal reference list are essentially a tool to have your own personal information for a dataset and to create personal, selective views of the database. Creating and deleting personal reference lists Actually there are no commands to create or delete personal reference lists. These lists are created automatically as soon as you add references to them. Now the question is, how does a reference get into your personal reference list? There are three ways to accomplish this: If you add a new reference to the database with the addref command, the reference will be automatically added to your default personal reference list. Add an existing reference to your personal reference list with the pickref command. This command will not add personal data to the reference. To add a reference to a list other than your default list, use the switch. If you use the updateref command to modify the information in an existing reference, this reference will also appear in your default personal reference list. If you use the switch with this command, the data of this reference common to all users will remain untouched, but your personal information (reprint status, availability, notes) will be added. Remember that one user can act on behalf of a different user with the switch, that commands like addref support. Of course there are also ways to get rid of the references that you once found useful. If you share the database with other users, the first choice should always be the dumpref command. This just removes your personal information and your association with the reference, while it leaves the common information untouched for other users of the database. Only if you know that no one else is interested in a reference, you should think about using the deleteref command. In both cases personal reference lists will be automatically removed if they are empty. Accessing references in personal reference lists You can limit your database search with the switch of the getref command to those references that you added to that particular personal reference list. If you want to access references in your default list, you have to pass your username as an argument to the switch. Advanced use of personal reference lists The pickref and dumpref commands mentioned above are actually only simplified interfaces to the extended notes feature. Each personal reference list corresponds to one extended note with these particular features: The note is initially almost empty. Only the title, the username and the key are set. The title and the key are initially identical and have the format <username>-<listname>. The username prefix is used to create a separate namespace for each user. However, you can treat these notes just like any other note. In particular, you can retrieve the note with the getnote command, edit it by entering a description as the contents or a couple of keywords, and finally update it with the updatenote command. Just keep in mind that this information will be lost if you remove all references from this list, as this will cause the note representing the list to be purged automatically. Global edit references RefDB has no special command for a global edit of all references or a group of references. You can get pretty far though with a default file when updating references and with Unix plumbing. To change existing text: Run a search on the references that you wish to change and pipe the output through sed into a file, like getref -t ris -d bar -c "sed 's/foo/faa/g' > refs.ris" "search-string". Use the command updateref refs.ris to update the reference(s) in the database. To add or change fields: Run a search on the references that you wish to change, like getref -t ris -o refs.ris "search-string" Create a defaultfile containing the field(s) that you want to change or add. Use the command updateref -g defaultfile refs.ris to update the reference(s) in the database. Create periodical synonyms Scientific journals are very often cited by standardized abbreviations which help to keep the space required for bibliography listings at a minimum. However, at times you need the full name instead. If you did not add both synonyms when adding the references that use a journal, you can use the updatejo command to add or edit these synonyms. Character encoding issues The 7-bit ASCII character set originally employed by PCs in the days of yore turned out to be insufficient for languages other than English. Reference data may require characters not included in the ASCII character set. The string sorting order may also follow different rules. RefDB supports national character sets as well as Unicode, which is sort of a superset of all national character sets. As a RefDB user and administrator you'll have to deal with character encoding issues at different levels. Character encodings of databases While it is possible to convert the data during import and export (see the following sections), it is still worthwile to spend a few thoughts about the character encoding used by your reference databases. If possible, use an encoding that ensures a suitable string sorting order for your data. Choosing a proper encoding also avoids unnecessary character encoding conversions when importing or exporting data. The available encodings are limited by your database engine: SQLite SQLite currently supports only ISO-8859-1 (the default) and UTF-8 as a compile-time option. If you install a binary package, it most likely uses ISO-8859-1. SQLite3 SQLite3 uses UTF-8 by default. UTF-16 is supported by the database engine, but not by the libdbi library which RefDB uses to access the engine. MySQL This database engine supports a fairly large number of encodings, but versions prior to 4.1 allow only one encoding per server instance. That is, all databases have to use the same character encoding. Please see the MySQL documentation for the growing list of supported encodings PostgreSQL This database engine supports a variety of encodings as a per-database option. That is, all reference databases may use different encodings. Please see the PostgreSQL documentation for a current list of supported encodings. Character encodings of imported data We'll have to distinguish two different sorts of data: RIS This plain-text format does not have a built-in way to declare the character encoding of the data. Instead you have to use the option of the addref and updateref commands to specify the encoding if it is different from the default (UTF-8). Please note that the import filters med2ris, en2ris, and to a limited extent also marc2ris support on-the-fly character encoding conversion. risx and xnote These are XML formats that can use the XML way of declaring the encoding. This is done in the processing instructions, which is the first line in a XML file. Due to a limitation of the parser used for importing XML data, only four encodings are accepted by RefDB: UTF-8, UTF-16, ISO-8859-1, US-ASCII. If your data use a different encoding, use the iconv command line utility (usually a part of the libiconv package) to convert your data to one of the accepted encodings. Character encodings of exported data By default, data are exported without a character conversion, i.e. the data will use whatever encoding the database uses. If you want the exported data in a different format, request the encoding with the option. This option is accepted by the getref and getnote commands of refdbc as well as by the refdbib client. You may request any encoding that your local libiconv installation supports. man 3 iconv or man iconv_open should give a clue which encodings are available. Use pdfroot The pdfroot variable allows you to store the paths to PDF or Postscript offprints of your references in a more efficient and more flexible way than a full path. The L1 field of a reference can hold the path to an electronic version of the document. This path will be converted into a link in the HTML output, and the neat plan is to open the document the link points to with a simple mouseclick. If you just store the full path of this document, something like file:///home/markus/literature/5503.pdf, you may run into problems fairly soon: If you have to reorganize the folder structure in your directory tree, all paths in the database would be incorrect. If you access the database from a different computer as the one that physically stores your offprints, you will be out of luck with these paths as well. The idea is to store the invariable part of the path in the reference entry and any variable part of the path in the pdfroot variable. The pdfroot variable can be set either in your configuration file or with a command line option. Consider e.g. the following situation: You decide for some obscure reason to store the offprints in subdirectories according to the publication year. The full paths will thus be something like /home/markus/literature/1999/2345.pdf and /home/markus/literature/2001/6213.ps. The partial paths in the L1 field of the reference entry could then be set to file://1999/2345.pdf and file://2001/6213.ps, whereas the correct value for the pdfroot would be /home/markus/literature/. Simple concatenation by RefDB will then result in the proper full path. If you now decide to rearrange your hard drive, all you need to do is to set pdfroot properly, as long as you don't change the directory structure below /literature (if you do that, you shoot yourself in the foot anyway). If you want to access your offprints from a different computer, you have several options: You can mount the directory tree that actually holds the data. If the computer that stores your offprints e.g. exports /home as an NFS share, you could mount that to /mnt on your local computer. Then you can set pdfroot to /mnt/markus/literature/ to access your offprints. You can store the offprints in a location that is accessible with an internet protocol like HTTP or FTP. In that case it is most practical to just store the full URL in the L1 field, as in http://some.machine/literature/Miller1999.pdf. Interaction with external applications RefDB has been designed to be as modular and as lightweight as possible. This means that you need some external applications for various purposes. This chapter briefly discusses how you can simplify your work with these external applications. Editor If you want to modify references in your database or write new entries from scratch, you need some suitable editor. Emacs and vim can directly interact with RefDB using special modes or support files. Any other editor will do as well as long as it creates the correct line endings: RefDB wants a plain Unix-style LF (0x0A), not a DOS-style CR LF (0x0D 0x0A). The prime contenders are vi and Emacs which are available on almost any Unix-style operating system as well as on Windows. For the Windows platform there are also a number of free- and shareware editors which let you select the line endings. Creating new references is straightforward: Type them in, save them, and use refdbc to upload them. If you want to edit existing references in your database, you download them with the getref command to a disk file. Open this file with your editor, edit the contents, and save the file again for uploading. If you want to edit several references in a row, you can simply reuse the filename for downloading, then refresh the buffer in your editor (e.g. C-x C-f RET in Emacs). After saving the changes, simply recall the last upload command in refdbc with the up key and press Enter. Some editors like Emacs and vim support RefDB by means of add-on packages. Viewer While a pager will do in many cases to view the query results, a web browser is a nice alternative. The RefDB command getref can generate HTML output at your request with the option. Save the output to a file and view this file with your favourite web browser. When you run the next query, reuse the filename and hit the reload button of your browser to display the new results. A web browser is also a convenient way to print references. refdb-1.0.2/doc/chapter-overview-clients.xml000644 001750 001750 00000045003 11512721663 021670 0ustar00markusmarkus000000 000000 Overview of the RefDB command-line clients There are several client applications, each one performing a self-contained subset of tasks. This chapter provides a short overview over common features of the clients. Please refer to the reference chapters about refdba, refdbc, and refdbib for the nitty gritty details. This manual covers only the clients shipped with RefDB. Please visit the RefDB website for other options. Currently there are tools for both Emacs and Vim which turn these editors into integrated authoring tools with bibliography support. The clients serve the following purposes: refdba The system administrator's tool to create or delete databases, set access rights, and view all kinds of statistics. refdbc The client for adding, editing, deleting, and searching reference entries. refdbib The tool to create bibliographies. refdbc and refdba can be run in an interactive mode where they provide their own command line, similar to a command-line FTP client for example. They use the GNU readline library with its powerful and convenient editing and history capabilities. In a nutshell, you can edit commands on this built-in command line as you can do in your bash or in the Emacs minibuffer. You can scroll through the history of your previous commands with the arrow keys, you can use the tab key to complete command names and filenames, and you can use Ctrlr to search the history with a regular expression. For further information you should consult the readline manual. refdba and refdbc can also be run in batch mode. You can specify one of the built-in commands as an argument to the option and pipe or redirect data into stdin. This is very useful if you want to automatize tasks using shell scripts. refdbib does not have an interactive mode and can be run only in batch mode. The result will be written to stdout. However, you'll hardly ever run refdbib directly, as RefDB ships with convenient scripts and Makefiles for this purpose. Quickstart guide These are the essential steps to get up and running as a RefDB user: Ask your RefDB administrator to grant access to an existing reference database or have him create one for you. If the application server refdbd is not installed to run as a daemon, start it now: refdbd -s & (see Starting refdbd for more options). Start the refdbc command line client to manage and retrieve references. Add references to the database. Retrieve references according to your search criteria. Create bibliographies with the references in your database. There is a tutorial for first-time users available at the RefDB documentation page. The interactive mode of refdba and refdbc For informations how to start these clients from the command line, please see the sections about refdba and refdbc. If you did not specify a password in the corresponding configuration file or with the command line switch (see later in this chapter), the clients will at first prompt you for a password. This is the password to access the database which may be different from your login password. To protect your password from prying eyes, it will not be echoed on the screen while you type it, so no one can even see the length of your password. If your database account was set up without password protection, just press enter now. If you run a client in batch mode and send data to stdin, the interactive password prompt will not work. Please use the configuration file or the option to specify the password in this case. Then you will be faced with a command prompt similar to the one in your shell. The client waits for you to enter commands. If it just escapes you which commands are available, use the help command (or ? for the lazy among us) to see a list. The general format of a command is: command -x option-argument argument Commands may thus have options and arguments. The options have the general style . They consist of a dash followed by one character. Options are case-sensitive. The option may be followed by an option-argument. This has to be enclosed in quotation marks if it contains spaces. The order of the options and arguments on the command line is arbitrary. Options without arguments can be combined, e.g. you may write instead of . The command line of the RefDB interactive clients uses the GNU readline library. This offers you a functionality similar to the bash command line or the Emacs minibuffer. By default the Emacs keybindings are active, allowing you to conveniently edit your command. You can scroll through a history of previous commands. You can use the Tab key to try a completion of a partially entered token. If it is the first token on the command line, the clients try to complete a command. If it is any other token, the clients try to complete a filename. When a command is sent to the application server, the client waits for the result of the command. This may take some time, depending on the load of the application server and of the database server. Network problems or a server crash may result in a timeout. The client will in this case return to the command prompt after a configurable time. If everything runs smooth, you will see the results of your command. Short results of only a few lines will simply be sent to stdout. Results that may cause the terminal to scroll parts of the result off the screen will be piped through a pager of your choice. Depending on the pager, you can jump back and forth in the results and perhaps save the result or part of the result in a file or pipe it to another program. It may be necessary to press some button (like q in less) to get back to the command prompt when you're done. Instead of a pager you can specify any other program that accepts data on stdin, so you can e.g. preprocess the output with grep before you display it with a pager ("plumbing", i.e. piping through several applications, is of course possible). Some commands have a switch to redirect the output into a file without displaying it on the screen. If you output large amounts of data through a pager, the pager may refuse to read on before you scroll through. In this case, a timeout would result and the data would be incomplete. The best way to deal with large amounts of data is to send them to a file and inspect them afterwards. You can use the command tail -f outfile to view the data in another console window while they arrive. The non-interactive mode of refdba and refdbc These are the main features of the non-interactive (or batch) mode: You have to specify a command name with the option. Specify all options that the command would take in an interactive session as additional options on the command line. The client will execute this command and exit. The clients accept the input for some commands on stdin. If input is available on stdin, be it through a pipe or from a redirected file, this input will be used and any input from a file with the option will be ignored. As mentioned previously, the automatic detection of data on stdin does not work on a few platforms like Windows/Cygwin. In this case, please use the option to make the client read from stdin. The main purpose of the batch mode is to run the clients from shell scripts (or Perl or PHP if you prefer). You can figure out scripts of arbitrary complexity to interact with your reference database. You will still be prompted for a password unless you specify one with the or in the configuration file. Both ways are considered less secure than typing it on the password prompt, but this is a tradeoff if you want unattended operation. Please keep also in mind that the password prompt will fail if you send data to stdin. Example The following command runs refdbc and uses the getref command to retrieve references by the author "Miller", using the database "refs" and requesting the RIS output format as well as the abstracts. ~$ refdbc -d refs -t ris -s AB -C getref :AU:=Miller The non-interactive mode of refdbib refdbib is a somewhat simpler "filter"-style application. It accepts data either at stdin or from a file whose name is specified on the command line. The output always goes to stdout and can be piped to other applications or redirected into a file as you need it. For an overview of the command-line options, please see the section about starting refdbib. Keep in mind that the runbib script offers a simpler and more versatile way to run refdbib. Common command-line options for all clients All clients share a common set of command-line options. The command-line options override the corresponding settings in the configuration files. Please see the chapters about the individual applications in the Reference manual for all application-specific options. All clients use the GNU getopt library to parse the command line. Switches can be combined ( is the same as ) and the sequence is arbitrary ( is the same as ). All options are case sensitive ( is not the same as ). -c command The command line of the pager that is to be used. Instead of a pager you can of course specify any valid command that accepts data on stdin. Use stdout to request data output to stdout. This is the default, but you may want to specify it on the command line if you need to temporarily override a default pager setting in your configuration file. -e logdest logdest can have the values 0, 1, or 2, or the equivalent strings "stderr", "syslog", or "file", respectively. This value specifies where the log information goes to. "0" (zero) means the messages are sent to stderr. They are immediately available on the screen but they may interfere with command output. "1" will send the output to the syslog facility. Keep in mind that syslog must be configured to accept log messages from user programs, see the syslog(8) man page for further information. Unix-like systems usually save these messages in /var/log/user.log. "2" will send the messages to a custom log file which can be specified with the option. -h Displays help and usage screen, then exits. -i IP-address Set the IP address of the box which is running the application server (refdbd). Instead of the IP address you can also specify the hostname as long as it can be properly resolved by your system. -l loglevel Specify the priority up to which events are logged. This is either a number between "0" and "7" or one of the strings "emerg", "alert", "crit", "err", "warning", "notice", "info", "debug", respectively (see also Log level definitions). "-1" disables logging completely. A low log level like "0" means that only the most critical messages are logged. A higher log level means that less critical events are logged as well. "7" will include debug messages. The latter can be verbose and abundant, so you want to avoid this log level unless you need to track down problems. -L logfile Specify the full path to a log file that will receive the log messages. Typically this would be /var/log/<appname>. -p port Set the port of the box which is running the application server -q Start without reading the configuration files. The client will use the compile-time defaults for all values that you do not set with command-line switches. -T time Set the timeout for client/application server dialogue in seconds. A connection with unsuccessful read or write attempts will be considered as dead and taken down after this amount of time has elapsed. -u name Set the username for the database access. This username need not be identical to the login name of the user. This is the username required to access the database server. -v Prints version and copyright information, then exits. -V Switches to verbose mode. -w password Set the password for the database access. This password need not be identical to the login password of the user. This is the password required to access the database server. If you pass the password as a command-line parameter, it will be visible in the process listing with the ps command (at least for a brief period of time, until the client overwrites the password string). To avoid sharing your password with the rest of the world, you should either keep your password in your configuration file or use "-w '*'" instead. This will cause the RefDB client to ask you for the password interactively (this is also the default if you don't use the switch at all and don't have an entry in the configuration file). You must protect the '*' with single quotation marks to prevent the shell from expanding it into a list of files in the current working directory. -y Specify the directory where the global configuration files are By default, all RefDB applications look for their configuration files in a directory that is specified during the configure step when building the package. That is, you don't need the option unless you use precompiled binaries in unusual locations, e.g. by relocating a rpm package. refdb-1.0.2/doc/chapter-perl-client-module.xml000644 001750 001750 00000133660 11512721663 022073 0ustar00markusmarkus000000 000000 The Perl client module While the C clients shipped with RefDB are quite versatile and scriptable, you may have a desire to bypass these clients and write scripts that directly talk to the RefDB server. The separately available RefDBClient::Client Perl module implements the client/server communication necessary to run all commands offered by the C clients from a Perl script. Installation Like with most Perl modules, the following command sequence will install the Perl module on your system ~$ perl Makefile.PL ~$ make ~$ make install You need root permissions to run the last command on most systems. Classes and their functions Like most Perl modules, the RefDBClient::Client module is object-oriented. This section introduces the two classes that you need to know in order to work with the module. To see a working example, please check the test.pl script shipped with the module. The main class that is used to access all RefDB client functions is called RefDBClient::Client. To get started, create a new instance and set the communication parameters: use RefDBClient::Client; my $client = new RefDBClient::Client; $client->set_conninfo("127.0.0.1", "9734", "markus", "pass", "refdbtest", "/home/markus/literature", "/usr/local/share/refdb/css/refdb.css", "360"); Then you can go ahead and send commands to the server like this: $summary = $client->refdb_listdb(""); $data = $client->get_data(); As you can easily guess the functions implementing the client commands are analogous to the commands found in the refdba and refdbc clients. See the reference pages about these apps for further information about the commands. There are three helper classes: RefDBClient::Risdata provides a simple interface to RIS data ReFDBClient::Simplelist is used internally RefDBClient::Enigma handles the password encryption RefDBClient::Risdata new new RefDBClient::Risdata Creates a new Risdata object read_ris $data->read_ris $file loads RIS data from a file $file path of file get_ris $data->get_ris returns previously loaded RIS data RefDBClient::Simplelist new new RefDBClient::Simplelist creates a new Simplelist element RefDBClient::Enigma new new RefDBClient::Enigma creates a new Enigma element RefDBClient::Client new new RefDBClient::Client creates a new Client element set_conninfo $client->set_conninfo $server_ip $port_address $username $password $database $pdf_root $css_url $timeout sets the initial connection parameters of a Client object $server_ip IP address or hostname of the server that runs refdbd $port_address Port address at which refdbd listens $username Username for database password authentication $password Password for database password authentication $database Name of the reference database $pdf_root Path of the root directory of all electronic offprints $css_url URL of a Cascading Stylesheets file for (X)HTML output $timeout Timeout in seconds after which a stale connection is taken down get_status $client->get_status returns the numerical server status get_status_msg $client->get_status_msg returns the server status message get_data $client->get_data returns the data of the most recent command get_summary $client->get_summary returns the summary of the most recent command refdb_addstyle $client->refdb_addstyle $styledata adds a citation/bibliography style to the database $styledata XML data representing the bibliography style refdb_adduser $client->refdb_adduser $host $database $newuserpassword $username adds new users to the database $host host specification from which the user is allowed to connect $database name of the reference database $newuserpassword password (required only for new users) $username name of the user, as used to authenticate at the database engine refdb_deleteuser $client->refdb_deleteuser $host $database $username deletes users from the database $host host specification from which the user is allowed to connect $database name of the reference database $username name of the user, as used to authenticate at the database engine refdb_addword $client->refdb_addword $words adds reserved words to the main database $words space-separated list of words refdb_deleteword $summary = $client->refdb_deleteword $words removes reserved words from the main database $words space-separated list of words refdb_confserv $client->refdb_confserv $command sends a configuration command to the server $command the command proper, optionally followed by an argument refdb_createdb $client->refdb_createdb $dbname $encoding creates a new database $dbname name of the reference database $encoding character encoding refdb_deletedb $client->refdb_deletedb $databasename deletes a reference database $dbname name of the database refdb_deletestyle $client->refdb_deletestyle $stylename_regexp deletes citation/bibliography styles $stylename_regexp regular expression describing the names of the styles to be deleted refdb_getstyle $client->refdb_getstyle $stylename retrieves a citation/bibliography style as a citestylex doc $stylename name of the style refdb_listdb $client->refdb_listdb $dbname_regexp lists matching databases $dbname_regexp regular expression describing the database names refdb_listuser $client->refdb_listuser $dbname $username_regexp lists matching user names $username_regexp regular expression describing the user names refdb_listword $client->refdb_listword $word_regexp lists matching journal name words $wordname_regexp regular expression describing the word names refdb_liststyle $client->refdb_liststyle $stylename_regexp lists matching citation/bibliography styles $stylename_regexp regular expression describing the style names refdb_viewstat $client->refdb_viewstat requests version/connection info from the server refdb_scankw $client->refdb_scankw $dbname runs a thorough keyword scan in the given database $dbname name of the reference database refdb_addref $client->refdb_addref $owner $refdata $type $encoding adds references to the database $owner name of the dataset owner, if different from current user $refdata string containing the reference data $type data type, must be one of 'ris' or 'risx' $encoding character encoding of the input data (only for RIS data) refdb_checkref $client->refdb_checkref $risdata $type $encoding $outtype Checks new references against the references in the database without adding them permanently $risdata string containing the reference data $type data type, must be one of 'ris' or 'risx' $encoding character encoding of the input data (only for RIS data) $outtype output data type, must be one of 'scrn' or 'xhtml' refdb_updateref $client->refdb_updateref $owner $is_personal $risdata $type $encoding updates references in the database $owner name of the dataset owner, if different from current user $is_personal set to 't' if only the personal information shall be updated $refdata string containing the reference data $type data type, must be one of 'ris' or 'risx' $encoding character encoding of the input data (only for RIS data) refdb_deleteref $client->refdb_deleteref $idlist deletes references from the database $idlist string specifying the IDs of the references to be deleted refdb_addnote $client->refdb_addnote $owner $xnotedata adds notes to the database $owner owner of the note, if different from the current user $xnotedata XML data specifying the note refdb_updatenote $client->refdb_updatenote $owner $is_personal $xnotedata updates references in the database $owner owner of the note, if different from the current user $is_personal set to 't' if only the personal information shall be updated $xnotedata XML data specifying the note refdb_deletenote $client->refdb_deletenote $idlist deletes notes from the database $idlist string specifying the ID values of the notes to be deleted refdb_addlink $client->refdb_addlink $linkspec links notes to database objects $linkspec string specifying the link(s) to be created refdb_deletelink $client->refdb_deletelink $linkspec unlinks notes from database objects $linkspec string specifying the link(s) to be deleted refdb_getas $client->refdb_getas $limit_string $name_regexp retrieves matching series authors $limit_string Limits the matching datasets. Must be in the form 'limit[:offset]', where limit is the number of returned datasets, and offset the number of datasets to skip. $name_regexp regular expression describing the names to be retrieved refdb_getau $client->refdb_getau $limit_string $name_regexp retrieves matching authors $limit_string Limits the matching datasets. Must be in the form 'limit[:offset]', where limit is the number of returned datasets, and offset the number of datasets to skip. $name_regexp regular expression describing the names to be retrieved refdb_geted $client->refdb_geted $limit_string $name_regexp retrieves matching editors $limit_string Limits the matching datasets. Must be in the form 'limit[:offset]', where limit is the number of returned datasets, and offset the number of datasets to skip. $name_regexp regular expression describing the names to be retrieved refdb_getkw $client->refdb_getkw $limit_string $keyword_regexp retrieves matching keywords $limit_string Limits the matching datasets. Must be in the form 'limit[:offset]', where limit is the number of returned datasets, and offset the number of datasets to skip. $keyword_regexp regular expression describing the keywords to be retrieved refdb_getjf $client->refdb_getjf $is_all $limit_string $journal_regexp retrieves matching periodicals (full names) $is_all set to 't' if all synonymous journal names shall be returned $limit_string Limits the matching datasets. Must be in the form 'limit[:offset]', where limit is the number of returned datasets, and offset the number of datasets to skip. $name_regexp regular expression describing the names to be retrieved refdb_getjo $client->refdb_getjo $is_all $limit_string $journal_regexp retrieves matching periodical names (abbrev) $is_all set to 't' if all synonymous journal names shall be returned $limit_string Limits the matching datasets. Must be in the form 'limit[:offset]', where limit is the number of returned datasets, and offset the number of datasets to skip. $name_regexp regular expression describing the names to be retrieved refdb_getj1 $client->refdb_getj1 $is_all $limit_string $journal_regexp retrieves matching periodical names (custom abbrev 1) $is_all set to 't' if all synonymous journal names shall be returned $limit_string Limits the matching datasets. Must be in the form 'limit[:offset]', where limit is the number of returned datasets, and offset the number of datasets to skip. $name_regexp regular expression describing the names to be retrieved refdb_getj2 $client->refdb_getj2 $is_all $limit_string $journal_regexp retrieves matching periodical names (custom abbrev 2) $is_all set to 't' if all synonymous journal names shall be returned $limit_string Limits the matching datasets. Must be in the form 'limit[:offset]', where limit is the number of returned datasets, and offset the number of datasets to skip. $name_regexp regular expression describing the names to be retrieved refdb_getref $client->refdb_getref $type $format_string $sort_string $listname $encoding $limit_string $query_string retrieves references $type select output format $format_string specify additional fields to be retrieved $sort_string specify sorting key $listname specify a list name if the search is to be confined to a particular personal reference list $encoding the character encoding for the output data $limit_string Limits the matching datasets. Must be in the form 'limit[:offset]', where limit is the number of returned datasets, and offset the number of datasets to skip. $query_string the query that describes the datasets to be retrieved refdb_countref $client->refdb_countref $listname $limit_string $query_string Counts matching references $listname specify a list name if the search is to be confined to a particular personal reference list $limit_string Limits the matching datasets. Must be in the form 'limit[:offset]', where limit is the number of returned datasets, and offset the number of datasets to skip. $query_string the query that describes the datasets to be counted refdb_pickref $client->refdb_pickref $idlist $listname adds references to the users personal reference list $idlist specifies the ID values of the references to be picked $listname the name of the personal list that the references should be added to. If this string is empty, the default personal list is used instead, refdb_dumpref $client->refdb_dumpref $idlist $listname removes references from personal reference list $idlist specifies the ID values of the references to be dumped $listname the name of the personal list that the references should be added to. If this string is empty, the default personal list is used instead, refdb_getnote $client->refdb_getnote $type $format_string $sort_string $encoding $limit_string $query_string retrieves references $type select output format $format_string specify additional fields to be retrieved $sort_string specify sorting key $encoding the character encoding for the output data $limit_string Limits the matching datasets. Must be in the form 'limit[:offset]', where limit is the number of returned datasets, and offset the number of datasets to skip. $query_string the query that describes the datasets to be retrieved refdb_countnote $client->refdb_countnote $listname $limit_string $query_string Counts matching extended notes $listname specify a list name if the search is to be confined to a particular personal reference list $limit_string Limits the matching datasets. Must be in the form 'limit[:offset]', where limit is the number of returned datasets, and offset the number of datasets to skip. $query_string the query that describes the datasets to be counted refdb_selectdb $client->refdb_selectdb $dbname selects an existing database as the current database $dbname name of the reference database refdb_whichdb $client->refdb_whichdb displays information about the current database refdb_texbib $client->refdb_texbib $style $cite_data retrieves a bibliography in bibtex format based on citationlistx data $style the name of the citation/bibliography style $cite_data XML data describing the references refdb_dbib $client->refdb_dbib $type $style $encoding $cite_data retrieves an XML/SGML bibliography based on citationlistx data $type type of the bibliography output $style name of the citation/bibliography style $encoding character encoding of the output data $cite_data XML data specifying the references refdb-1.0.2/doc/chapter-refdb-database-design.xml000644 001750 001750 00000005611 11512721663 022457 0ustar00markusmarkus000000 000000 The RefDB database design The RefDB database is a helper database for the RefDB reference databases. It holds data for the recognition of unabbreviated words in journal names as well as the bibliography style information. The table t_journal_words This table holds a list with unabbreviated journal words. These are words in the names of journals which are not an abbreviation of something else. Many online sources of bibliographic information provide the journal information without periods so it is not clear whether a word in a journal name is complete by itself or whether it is an abbreviation. Some bibliographic formats ask for periods after abbreviated words, so we have to get these periods from somewhere. RefDB adds the periods if necessary when a reference is added to the database. This way you have the additional information that the periods provide always at your hands. If you don't need it, it is trivial to strip the periods away. name An alphanumeric field (maximum length 255 characters) that holds a word in uppercase which is an unabbreviated word in a journal name. Examples: CELL, BIOCHEMISTRY, DRUGS The table CITSTYLE This table together with the REFSTYLE, POSITION, and SEPARATORS tables are used to store bibliography style sets. The CITSTYLE table contains one entry per bibliography style. It defines the appearance of the citations as well as the general appearance of the bibliography. The table REFSTYLE The REFSTYLE table contains zero or one entry for every publication type (such as book, journal, abstract) per bibliography style. Each entry is linked to one entry in the CITSTYLE table via the CITSTYLEID column. The table SEPARATORS The SEPARATORS table contains one entry per separator used in the POSITION table. Each entry is linked to an entry in the REFSTYLE table via the REFSTYLEID field. The table POSITION The SEPARATORS table contains one entry per separator used in the REFSTYLE table. Each entry is linked via the REFSTYLEID and POSITION fields. refdb-1.0.2/doc/chapter-refdba.xml000644 001750 001750 00000004016 11512721663 017605 0ustar00markusmarkus000000 000000 Administration tools The following tasks can be performed with the tools described in this chapter: Perform the initial system setup Create and delete databases. Add, remove, and retrieve bibliography styles. Add and remove users Add and remove reserved journal words View statistics and connection information. Configure the application server while running Create and restore database backups The first section explains the usage of the command-line client refdba in full detail. The following sections introduce two scripts which simplify the task of backing up and restoring the system and reference databases of your installation. refdba.1.xml appears to be missing refdb-backup.1.xml appears to be missing refdb-restore.1.xml appears to be missing refdb-init.8.xml appears to be missing refdb-bug.1.xml appears to be missing refdb-1.0.2/doc/chapter-refdbc.xml000644 001750 001750 00000126152 11512721663 017615 0ustar00markusmarkus000000 000000 Tools for reference and notes management The following tasks can be performed with the tools described in this chapter: Manually add, update, and delete reference entries Search for and display reference entries Search for and display authors and keywords Include existing references into personal reference list Convert reference data from various formats to RIS We'll first introduce the command-line client refdbc, RefDB's own multi-purpose reference and notes management client, along with the reference data converters that you can use along with it. The following sections explain the input and output data formats as well as the query language used by RefDB. Tools The first subsection explains the usage of the command-line client refdbc. Whenever you have an electronic source for reference data, you should use these instead of typing datasets from scratch. Reference data come in a variety of formats. Therefore RefDB ships with a few conversion utilities which are discussed in this chapter. These utilities create tagged RIS data from the input data. Please visit Chris Putnam's Bibutils project for another set of bibliographic data converters. These tools allow to convert a few additional formats like ISI and MODS to RIS which can then be imported by RefDB. Since version 0.9.3, RefDB supports risx as an additional native input format. You can employ the standard techniques of SGML and XML transformations, i.e. by running DSSSL or XSLT scripts with a suitable engine, to turn bibliographic data encoded as SGML or XML documents into risx. Remember that RefDB accepts only four character encodings for XML input data: UTF-8, UTF-16, ISO-8859-1, and US-ASCII. If your input data use a different character encoding, please use the command-line utility iconv (usually part of the libiconv package) to convert your data to one of the existing character encodings. Do not forget to specify the character encoding in the processing instructions of the input file, otherwise RefDB will assume the data are encoded as UTF-8. refdbc.1.xml appears to be missing bib2ris.1.xml appears to be missing db2ris.1.xml appears to be missing en2ris.1.xml appears to be missing db2ris.1.xml appears to be missing db2ris.1.xml appears to be missing refdb-pubmed.1.xml appears to be missing refdb_dos2unix.1.xml appears to be missing refdb_latex2utf8txt.1.xml appears to be missing Reference data output formats refdbd implements several standard backends for data output. You can select them with the option of the getref command in refdbc. Remember that all backends just send data. It is your decision what you want to do with the information. You can either view the data on the screen or pipe them to another application or write them to a disk file. scrn The screen backend provides a basic data output for viewing in a terminal, preferably through a pager. By default, the reference ID, the publication year, the authors, the title, and the source information are displayed. You can use the option to additionally display the abstract (AB or N2), the notes (N1), the reprint info (RP), the address (AD), the publisher (PB), the city (CY), the ISSN/ISBN (SN), the URL (UR), and the user (U1 through U5) and misc (M1 through M3) fields. In addition, the pseudo-field codes NX (all notes) and LX (all links, including UR and DOI) can be used. To specify several fields, simply concatenate the field codes, as in . will display all available fields. html The html backend works just like the scrn backend, but encodes this information in a HTML text. This comes in handy if you would like to view the results of your queries in a web browser rather than in a terminal window. This is also the easiest way to obtain fairly nice-looking printed output of your reference data. You simply use the switch to write the results of your queries to a file, reusing the same filename for each query. After each query you just have to hit the reload button of your browser to view the results of the most recent query. The visual appearance of the generated HTML files can be customized using CSS files. The URL of the CSS file must be specified with the refdbc command-line option or by setting the configuration variable cssurl. The global configuration file /usr/local/etc/refdb/refdbcrc is preconfigured with a cssurl entry pointing to the default CSS file installed in /usr/local/share/refdb/css. If you want a different appearance, it might be prudent to create a copy of this CSS file and customize it as you see fit. The following element classes can be customized. In most cases, the class name reflects the database field to be formatted: H1.h1 H2.id P.title P.authors P.abstract P.note P.address P.city P.publisher P.m1, P.m2, P.m3 P.u1, P.u2, P.u3, P.u4, P.u5 P.url EM.periodical EM.volume EM.issue EM.page xhtml This is a variant of the html output which creates valid XML output according to the XHTML V1.0 Transitional DTD. ris This is identical to the input format. Use it to export references to other reference management systems. risx Retrieves the data as an XML document using the risx DTD. Use it to edit references or to create backups of your databases. The default output includes a docline and an internal subset declaring some common entities. This format works ok for DTD-based processing systems. If you require namespaced output for further processing with schema-based tools, use the option to declare a namespace prefix. mods This backend retrieves the data as an XML document using the MODS schema. This is another useful exchange format for bibliographic data. Use the option to retrieve namespaced output with the given namespace prefix. bibtex This backend provides output formatted for use as a bibtex reference database. This can be used with the tex and bibtex applications to create bibliographies for documents written with Donald Knuth's famous TeX typesetting system. The option cannot be used with this backend and will be ignored. db31 The DocBook SGML backend formats the query result as a bibliography element in a SGML document using the DocBook DTD. RefDB outputs an appropriate doctype string at the beginning of the data. The string is commented out so the contents can be directly inserted into a larger document by some processing application. If you need the data as a standalone document, simply use a script to uncomment the first line. The option cannot be used with this backend and will be ignored. This option is called db31 to distinguish it from any later additions that may be necessary due to possible incompatibilities in new DocBook versions. It just means that the SGML that this backend creates should work with DocBook V.3.1 or later unless a new backend will be added. db31x The output is essentially the same as with the preceeding backend but you'll get a DocBook XML document instead. The default output works for DTD-based processing with DocBook XML versions 4.x. If you need namespaced output for schema-based processing, use the option to define a namespace prefix. db50x This backend outputs schema-based DocBook V5. The default output declares a default namespace. You can use the option to define a namespace prefix which will be used in all elements. teix The TEI XML backend formats the query results as a TEI P4 listBibl element. RefDB outputs an appropriate processing instruction and doctype string at the beginning of the data. The string is commented out so the contents can be directly inserted into a larger document by some processing application. If you need the data as a standalone document, simply use a script to uncomment the first line. The option cannot be used with this backend and will be ignored. tei5x This backend outputs schema-based TEI P5. The default output declares a default namespace. You can use the option to define a namespace prefix which will be used in all elements. Extended notes output formats RefDB implements a few backends to output extended notes. You can select them with the option of the getnote command. scrn The screen backend provides the output most suitable for viewing notes in a terminal. Send the output through a pager for best results. Use the or options to display all objects the note is linked to. html The information returned by this backend is encoded as a HTML document. Use this format to print nicely formatted notes from your web browser. Otherwise the same applies as said for the scrn backend. See above for some hints about formatting the output with a CSS file. xhtml The output is the same as for the html backend but the output is formatted as an XHTML document according to the XHTML V1.0 Transitional DTD. xnote This backend encodes the output in xnote documents, the same as the input format for extended notes. The query language The getref command is probably the most heavily used command. You use it to retrieve the references that you collected and saved in the database. To find a certain article or several related articles, all you have to do is to express your query in a language that RefDB understands. The first section describes how to formulate search strings for your queries. The getnote command used to locate extended notes is very similar. The specifics of this command will be described in the subsequent section. The reference query language The syntax for the search string follows these rules: You can search for any fields in the RefDB database. As a matter of fact, you have to specify at least one field for your query. Something like getref * will not work, but you may use getref ":ID:>0" instead to list all entries in the database (beware, this may be a lot). Every search item has the following general form: :XY:[=|~|!=|!~|<>|<|>|<=|>=]string The current implementation of RefDB is very picky about spaces. Please make sure that you do not insert spaces or other whitespace on either side of the operators ("=", "~" and so on). If your value happens to start with a space, include the value in quotation marks or protect the space with a backslash. The sequence ":XY:" denotes the reference data field to search in. The names are mostly taken from the RIS specification. Possible field names are: :TY: Type of the reference. :ID: The unique identifier of a reference. This is the numeric identifier that RefDB assigns to each new reference. :CK: The unique citation key of a reference. This is the alphanumeric string that was either supplied by the user or automatically generated by RefDB. :TI:, :T2:, :T3:, :TX: The title of the reference, of the secondary title, and of the series title, respectively. :TX: performs a search in all title levels. :AU:, :A2:, :A3:, :AX: The name of an author, of a secondary author/editor, and of a series author, respectively. :AX: performs a search in all author levels. :PY:, :Y2: The publication date and the secondary date, respectively. :N1: The notes that user can add to the reference. :KW: A keyword. :RP: The reprint status of the reference. :AV: The location of an offprint (physical, URL, or path) :SP: The start page. :EP: The end page. :JO:, :JF:, :J1:, :J2: The abbreviated name, the full name, the user abbreviation 1, and the user abbreviation 2 of a journal name, respectively. :VL: The volume number. :ED: The name of an editor. :IS: The issue (article) or chapter (book part) number. :CY: City of publication of a book. :PB: Name of the publishing company. :U1: through :U5: The user-defined fields 1 through 5. In certain cases, U5 contains the number of the paper copy of the reference (see the addref command). :N2: The abstract of the reference. :SN: The ISSN or ISBN number. :L1: through :L4: The link fields 1 through 4. :AD: The address of the contact person. :UR: The URL of a web page related to the reference. Some pseudo-fields help to retrieve the contents of the RIS fields M1 through M3. RefDB provides these pseudo-fields to better identify the contents of these fields. Please be aware that these pseudo-fields apply only to particular reference types. If in doubt, consult the Reference Manager manual which contains a list of how the M1-M3 fields are used by each reference type. :DO: The digital objects identifier. :TO: The type of work. :AR: The area of a map :OS: The operating system of a computer program :DG: The type of degree of a thesis. :RT: Running time of audiovisual data. :CI: International class code of a patent. :CU: US class code of a patent. :SE: The email address of the sender. :RE: The email address of the recipient. :MT: The type of media. :NV: The total number of volumes in a series :EI: The edition of a book. :CO: The type of computer used for a software or data. :CF: The location of a conference :RN: The registry number. :CL: The classification of an audiovisual material. :SC: The section of a magazine or newspaper :PN: The number of a pamphlet. :CN: The number of a chapter. In addition to the above field specifiers, there are a few that allow to retrieve references based on extended notes attached to them: :NID: The ID of an extended note. :NCK: The alphanumeric key of an extended note. References are matched according to these rules: The alphanumerical fields are matched by (non-)equality to a literal string or to a regular expression. For literal matches the operators "=" and "!=" are accepted, denoting equality and non-equality, respectively. The search-string is a plain-text string. Along the same lines, "~" and "!~" denote equality and non-equality for regular expression matches. The search-string can contain any legal characters and constructs as in standard Unix regular expressions. By default, the query matches if the search string is contained anywhere in the target string. If you need a left-match, a right-match, or a full match, use the regexp special characters "^" (match the beginning of a line) and "$" (match the end of a line) to your needs. For further information about regular expressions, see the section regular expressions Some database engines, like SQLite, do not support Unix-style regular expressions. Use SQL regular expressions instead. If you use regular expressions, be aware that you will have to escape characters with a special meaning if you want them to be matched literally. For further details, see the examples below. The numerical fields can be matched by equality, non-equality, or by greater-than/less-than comparisons. In these cases, use "!=", ">", and "<" instead of the "=", respectively. If the search-string contains spaces, the whole string must be enclosed by single quotation marks or the spaces must be escaped with a backslash "\". Several search items can be combined by the Boolean operators "AND", "OR", " AND NOT". They can be grouped by brackets "()". If you use the operator "AND NOT", the search item it refers to has to be enclosed in brackets. See the examples below. The author (:AU:) and keyword (:KW:) searches allow an abbreviated syntax if you search for several authors or keywords at a time. The construct: :AU:=name1 AND :AU:=name2 AND :AU:=name3 ... can be written as: :AU:='& name1 name2 name3 ...' To specify an "OR" search, use "|" instead of "&". If an item in the search contains spaces, they have to be escaped by backslashes, as in "Amino\ Acid\ Sequence". The notes query language The getnote command uses essentially the same query language as described above. However, there is a different set of field specifiers that you can use to locate extended notes: :NID: The unique id of an extended note. :NCK: The unique citation key of an extended note. :NPY: The date of an extended note. :NTI: The title of an extended note. :NKW: A keyword. This is a keyword attached to a note in order to categorize the latter, similar to a keyword in a reference. :KW: A keyword. This is a keyword that the note is linked to, i.e. a keyword that the note was attached to in order to supply additional information. :AU: The name of an author or editor. Use this field specifier to locate notes that are linked to a particular author. :JF:, :JO:, :J1:, :J2: The full, abbreviated, or user-abbreviated name of a periodical. Use this field specifier to locate notes that are linked to a periodical. :ID: The id of a reference. Use this field specifier to locate notes linked to a particular reference. :CK: The citation key of a reference. Use this field specifier to locate notes linked to a particular reference. Some example queries This section shows a few example queries to help you get familiar with the syntax. If you are not familiar with the regular expressions used here, please peruse the regular expressions section. We will not use any of the fancy switches of the getref command here, so the output will always be a simple listing on the screen. These examples assume that your database engine supports Unix regular expressions. This holds true for MySQL and PostgreSQL, wherease SQLite uses the simpler SQL regular expressions instead. We'll start with some easy queries. First we want to display a reference with a specific ID (25 in this example): refdbc: getref :ID:=25 Next we want to list all references by a specific author. We'll use only the last name here. If several authors share this last name, we have to specify the initials as well, as shown in the second example. In the first example we use a regular expression match, denoted by the tilde operator. This obviates the need to know the full name precisely. The second example uses a literal match instead. Note the use of the caret "^" in the first example which makes sure that the name actually starts with the capital M. Otherwise, a last name like "DeMillerette" would match as well. This trick is not required in the second example as the literal match always implies a full match. refdbc: getref :AU:~^Miller refdbc: getref :AU:=Miller,J.D. If Dr. Miller was a productive person, our previous query may have returned dozens of references. Now we try to filter out the paper or the papers that we really need. In the next example, we restrict the results to the years 1995 through 1999: refdbc: getref :AU:~^Miller AND :PY:>1994 AND :PY:<2000 If this did not bring us close enough, we may try to include a coauthor: refdbc: getref :AU:=~Miller AND :AU:~^Doe AND :PY:>1994 AND :PY:<2000 At this point we could narrow down the search by excluding other authors that often published with Dr. Miller, but are irrelevant here: refdbc: getref :AU:~^Miller AND :AU:~^Doe AND NOT (:AU:~^Jones) AND :PY:>1994 AND :PY:<2000 Unfortunately, this is still a venerable list of publications. Now we try to include a few keywords. This is now a pretty complex query. It will return all references by the authors Miller and Doe between 1995 and 1999 with either the keyword "blood" or the keyword "animal" or the keywords "guanyl" and "cyclase", the latter only if both are present. The truncated spelling of "guanyl" ensures that both "guanylyl" and "guanylate" (which are interchangeable) will match. The funny expressions with the angle brackets ensure that the keywords will match regardless of whether they start with a capital letter or not. refdbc: getref :AU:~^Miller AND :AU:~^Doe AND :PY:>1994 AND :PY:<2000 AND (:KW:~[bB]lood OR :KW:~[aA]nimal OR (:KW:~[gG]uanyl AND :KW:~[cC]yclase)) And now for something completely different. If you've added a couple extended notes to your database, you can retrieve references that are attached to a specific extended note, e.g. to the note with the citation key "biochemistry1999": refdbc: getref :NCK:=biochemistry1999 If you want to see all notes which are attached to a reference with the citation key "Miller1999", use the following command: refdbc: getnote :CK:=Miller1999 Regular expressions may have unwanted side effects at times. Consider the keyword "52-67-5 (Penicillamine)" (a chemical name as used by the Pubmed database). Doing a literal match is straightforward: refdbc: getref :KW:='52-67-5 (Penicillamine)' However, if we use the same argument for a regexp match, we won't get the desired results. The parentheses have a special meaning in regular expressions. Therefore we have to escape them if we want a literal match: refdbc: getref :KW:~'\(Penicillamine\)' Things are a little different again if you run a database engine that does not use Unix regular expressions, but SQL regular expressions instead. These know only '%' and '_' as special characters, and you have to escape them by doubling: refdbc: getref :KW:~'100%%' Remember that if you extend or modify a previous query, you don't have to retype everything: Just use the up arrow key to scroll through the previous commands, or use Ctrlr to search for a specific query in the history. Regular expressions This section provides a brief overview over regular expressions. In the context of RefDB, we have to deal with two flavors of regular expressions: Unix-style and SQL. The former are more important as we use them to write queries. The latter are used sparingly, e.g. to search the filenames of databases. Some database engines like SQLite do not support Unix-style regular expressions. You have to use SQL regular expressions in this case. The difference between a literal match and a regular expression match is that the latter allows some fuzziness in the search string. The former requires that the search string and the search result match character by character. In simple words, regular expressions allow to search for strings which are similar to some extent, and you can exactly specify to which extent. Unix-style regular expressions Regular expressions distinguish between regular characters and special characters (meta characters). The simplest regular expressions actually don't look like regular expressions, as the following example shows: foo This will search for the string "foo" at any position in the target elements. This would find strings like foobar, lifoo, or lifoobar. That is: if there are no meta characters, a simple string match is attempted, however at any position in the element. This is different from search strategies in some other databases where a full match or a left-match is attempted by default. We can now replace one o in the above sample with a meta character. We use the . (dot) which matches any single character, including a newline, at that position: f.o This will find strings like fao, fdo, but as well all strings of the previous example. Another very common meta character is the *, which matches zero or more instances of the previous character. Thus, fo* will now find things like fo, foooo, but also fbar and lifooobar. The meta character + is similar, but requires at least one instance of the previous character: fo+ This would retrieve all strings of the last example except fbar as this contains the o zero times. fo? The questionmark meta character will retrieve either zero or one instances of the previous character. This would match f and fo, but not foo. The meta characters ^ and $ are important to determine the relation of the search string to the line start or line end: ^foo This will match foo only if it is located at the line start. Similarly, foo$ will find foo only when it is located at the line end. If you combine these two like in the next example: ^foo$ foo will be found only if this is the complete element, starting and ending the line. The following list briefly explains some more terms which are helpful in regular expressions. () Use the round brackets to group characters to a sequence. This is particularly useful with the above mentioned metacharacters *, +, and ?. (foo)* This will match zero or more instances of the sequence foo. It will find e.g. foo and foofoo, but not fofo. [] matches any single character between the brackets. [0-9] This will match any digit. Continuous ranges of characters can be indicated with a dash, as seen here. [^] matches any single character except the ones between the brackets [^abc] This will match any character except a, b, and c. \ The backslash escapes the following meta character and treats it as a literal character. \. This will match only the dot instead of any single character. \{n,m\} This will find n to m repeats of the previous character. fo\{2,3\} This regular expression will find foo and fooo, but not fo or foooo. For further information about regular expressions, see the regex chapter in the MySQL documentation. SQL regular expressions SQL regular expressions are much simpler, as there are only two metacharacters: % matches any string _ (underscore) matches any single character In order to match a SQL regular expression special character literally, you have to escape it by doubling. refdb-1.0.2/doc/chapter-refdbd-administration.xml000644 001750 001750 00000114050 11512721663 022633 0ustar00markusmarkus000000 000000 refdbd administration This chapter will explain the usage of refdba for the administration of refdbd. Please refer to the reference chapter about refdba to learn about command-line switches and interactive commands of this application. Create a database Create new databases with the refdba command createdb foo. The new database will be empty initially. If you start adding datasets, the first dataset will have the ID 1. In order to access the new database, users need to have their access rights set accordingly. Due to restrictions of the database servers and of the way database names are encoded in refdb SGML/XML/LaTeX documents, the names of the databases should be treated as case-insensitive and should not contain colons (':'). Some database engines support different character encodings. In this case you can use the option to select an appropriate encoding. See the documentation of your database engine for available encodings. Your SQL database server may manage more databases than your refdb databases. In this case it may be prudent to use a common prefix for all refdb reference databases that you create. By providing a simple regular expression to the listdb command, the execution time may drop considerably. Delete a database Delete existing databases with the refdba command deletedb foo. The contents of the database as well as the database structure will be gone completely. This is different from deleting all datasets. The latter will leave the database structure intact so you can add references again. The former will force you to create a new database before you can add references again. Usually this command also removes any permissions to the given database that you have granted to users. If you re-create a database with the same name later, you will have to grant permissions again. Add or remove a user Add users Adding a user means to allow a user, identified by a database user name and optionally by a password, to read and to modify a particular refdb database. Both the database user name and the database password may be different from the login name and login password used to get access to the operating system. Some database engines like SQLite do not support access control. There is no need to add or remove users with these database engines. refdb uses the access control facilities of the database server. Therefore, the details of adding a user differ slightly between MySQL and PostgreSQL. In any case, refdb is designed to simplify user management as far as possible. This is mainly achieved by combining the information necessary to authenticate a user and the information necessary to grant access to specific database objects into a single command, the adduser command of refdba. This command also silently takes care of the fact that users need access to an internal refdb database in addition to the specified reference database. Database servers use the username, optionally a password, and the host a user tries to connect from to authenticate a user. From the database server's point of view, refdbd is the database client that actually connects to the server, not the refdb clients refdba, refdbc, and refdbib. Database servers usually distinguish between local connections (i.e. by users logged into the same computer) and remote connections (i.e. all connections via TCP/IP). If both refdbd and your database server run on the same computer, all connections will be local and the host-based access control is fairly simple, as both MySQL and PostgreSQL allow local connections by default. All you need to do is: refdba: adduser -d foo jack -W newpass This will allow the new user "jack" to connect to the database server and to access the contents of the database "foo". "jack" has to identify himself by providing the password "newpass" when starting a refdb client. If a user is already known to the database server, e.g. if he already has access to a different database, you don't have to specify the password again. If you do provide a password, the password of that particular user will be changed to the new one. Things get a tad more complicated if refdbd and your database server do not run on the same computer. As this is where MySQL and PostgreSQL differ, we'll look at these two cases separately. MySQL On many operating system distributions, MySQL is configured to accept only local connections. Either the mysqld process is started with the option, or the my.conf configuration file contains the corresponding option . In order to allow remote connections, please remove these options from your system. MySQL allows to alter the host-based component of access control through the SQL interface. The adduser command has an additional option to specify the host or the network where refdbd runs: refdba: adduser -d foo -H % jack -W newpass In this example, refdbd may run on any host. You can as well specify a subnet (-H 192.168.1.%) or one specific host (-H mono.mycomp.com). PostgreSQL By default, PostgreSQL will accept only local connections. To allow remote connections, the postmaster process must be started with the option. Change your start scripts accordingly. The host-based component of access control is not available through the SQL interface in this database server. The option of the adduser command is therefore ignored. Instead the database administrator has to edit the configuration file /home/pgsql/data/pg_hba.conf. The following entries would: Allow local access (i.e. refdbd and postmaster run on the same computer) to the databases refs and refdb. The latter is an internal refdb database that users must be able to access. Users must provide a password. Allow access to the databases refs and refdb through refdbd instances that run somewhere in the network "192.168.1.0". Users must provide a password. # host DBNAME IP_ADDRESS ADDRESS_MASK AUTH_TYPE [AUTH_ARGUMENT] local refdb crypt local refs crypt host refdb 192.168.1.0 255.255.255.0 crypt host refs 192.168.1.0 255.255.255.0 crypt The default pg_hba.conf file allows local access to all databases without password protection. This may not be what you want. The file contains a bunch of helpful comments, though. You may also want to peruse the PostgreSQL documentation for more information about host-based access control. Remove users This is done with the deleteuser command. The access rights will be revoked for the specified username and database. No other access rights will be modified. The following command will revoke the access rights of user "jack" on the database "foo". refdba: deleteuser -d foo jack Keep in mind that user "jack" still can access the refdb main database refdb and any other databases he was granted access to. If you use MySQL as your database server and refdbd runs on a different box than mysqld, you also have to specify the host or network with the option, just like when you added the user in the first place. See the Add users section for the specifics. Configure the application server There are several ways to configure the application server refdbd to your needs. Two of these ways will modify the behaviour at startup, while the remaining two ways will reconfigure the server only for the duration of the current run. Configuration at startup There are two ways to permanently change the refdbd configuration. First, you can edit the configuration file which holds the default values. Second, you can modify the command line parameters in the script that starts refdbd in the first place (e.g. an init.d script). Reconfiguring a running refdbd process Again there are two ways to reconfigure an already running refdbd server. The recommended way is to send a HANGUP signal to the server (kill -HUP pid) after editing the configuration file. You can send the signal either manually or use the refdbctl script instead. This of course requires that you have a shell on the machine running refdbd. This should not be a problem if you sit in front of that machine. If you don't, and you can't do a remote login (e.g. because it is not supported, as on Windows), this won't help. In that case you may use the second possibility. refdb supports remote administration via refdba if refdbd is started with the appropriate parameter. This allows you to use the refdba confserv command to reconfigure the server. The current implementation of the access control to use the confserv command requires the refdb administrator to be a database server administrator. This is different from being root on the machine. You can change the settings for the timeout and the settings for the logging facility. refdba: confserv timeout 60 This will set the timeout to 60 s, i.e. a client-server connection has to be stalled for 60 seconds before refdbd gives up. refdba: confserv loglevel 7 This will set the log level to 7. refdba: confserv logdest 1 This will set syslog as the log info destination. refdba: confserv logfile /var/log/mylog This will use /var/log/mylog as logfile if logdest is set appropriately. Add, edit, or delete bibliography styles This task is currently restricted to the system administrators in order to prevent users overwriting each others bibliography styles. A more appropriate solution will be implemented later to allow users uploading their own styles. Use the refdba command addstyle to add one or more bibliography style files to the database. Existing styles with the same name will be overwritten without a warning, so you should check with the liststyle command before you go ahead. The name of a bibliography style is encoded in the XML file. The filename of the bibliography style is irrelevant here. Use grep STYLENAME to see which bibliography styles are defined in a file and check with the liststyle command whether they're already defined in the database. refdb uses a non-validating parser to load bibliography styles into the database. It is your responsibility to validate the files before you add them. Adding invalid styles may have undesired and unpredictable results. The refdba command getstyle retrieves one or more bibliography styles as XML documents. In order to edit an existing bibliography style, simply retrieve the style with the getstyle command, edit the XML document as necessary, and add it again with the addstyle command. As stated above, this will overwrite the existing style definition. Use the refdba command deletestyle to remove one or more bibliography styles from the database. The argument for this command is a Unix regular expression. All styles whose name match the regular expression will be deleted. Logging data The refdb programs can spill out quite a lot of log messages to keep track of what is happening in your programs. This section explains the basics of setting up your message logging. What to log The application server refdbd as well as all command-line clients can generate log messages. Message logging is most important for two purposes: Keep track of non-interactive programs. This includes refdbd as well as all client-side tools if they are run from scripts. Track down bugs or user errors. A useful approach is to log all messages with a log level (explained below) of 6. This would give you a good overview over the usage of these programs but would not clutter the log files with debug information. Switch to log level 7 only if you suspect a bug or some user error and need the full debug information to understand the problem. For the interactive use of the clients logging is usually not necessary, so you'd use a log level of -1 to prevent logging altogether or a log level of maybe 3 or 4. In the latter case you'd get log messages only if something goes badly wrong. Again, if you encounter bugs or user errors you may switch on debug messages by using a log level of 7. Destinations There are three possible destinations the log messages can be sent to. Select the proper destination with either the logdest variable in the configuration file or the switch on the command line. In both cases the values in the following list are accepted. You may use either the numerical value or the case-insensitive string in brackets, e.g. and are equivalent. 0 (stderr) stderr is mostly useful for debugging purposes when refdbd is run as a standalone process and when clients are run interactively. stderr does not make much sense if you run refdbd as a daemon (daemons detach from the console at startup, so all output to stderr is lost). 1 (syslog) Sending the data to syslog integrates the log data with the rest of your system's log output. The log messages will be sent to the user facility, which usually is configured to write to /var/log/user.log. See the syslog(8) man page for information how to configure the syslog facility. If you run refdbd on Cygwin, the syslog messages are sent to the application message list in the NT message logging system. If you are used to going through your log output with tools like grep and awk, you may find it more useful to write to a custom log file instead. 2 (file) You can define the full path of a custom log file with either the logfile configuration file parameter or the command line option. By default, refdb applications write their log output to /var/log/<appname>.log. Make sure to set the appropriate access rights for these log files. Some libraries used by refdb, e.g. the PostgreSQL client library, send log messages to stderr. This is not controlled by the log settings of refdbd. The same PostgreSQL log messages show up in the PostgreSQL log which is usually sent to /var/log/pgsql. Log levels You can select how verbose the log output of refdbd will be. You can do this by either setting the loglevel configuration file variable or the command line option to an appropriate value. You may either use the numerical value or the case-insensitive string as explained in the table below. E.g. and are equivalent. Set the log level to -1 to disable logging completely. Use a value from 0 through 7 to generate increasingly verbose log output. The definitions of the log levels are taken from the include file syslog.h: Log level definitions level verbose explanation 0 emerg system is unusable 1 alert action must be taken immediately 2 crit the system is in a critical condition 3 err there is an error condition 4 warning there is a warning condition 5 notice a normal but significant condition 6 info a purely informational message 7 debug messages generated to debug the application
Setting the log level to a given value means that all messages with a priority level up to the given value will be logged. E.g. if you set the log level to 6 (which is a reasonable default value), all messages with a priority from 0 through 6 will be logged, whereas messages with a priority level of 7 will be ignored. Use log level 7 with caution. The amount of log messages is considerable and sufficient to slow down the application. You should not use this level in everyday use, only to track down bugs or user errors that you may encounter.
Interpreting the log information If the messages are sent to stderr, only the message proper will be printed. If the messages are sent to the syslog facility, the default format including the process name and process ID is used. A line in the custom log file looks like this: 6:pid=267:Sun Jul 22 18:39:52 2001:application server started You will easily recognize the following fields: message_priority:process_id:time:message message priority This is the priority assigned to the message by refdbd. The values are explained above. process ID This is the process ID (as seen in the ps ax listing) of the refdb process that generated the message. In the case of refdbd this may either be the parent process (the one that generated the above "application server started" message) or one of the children that are forked off to answer client requests. time This is the full time and date information when the message was generated. message This is the message text proper. The message entries are sufficiently structured to allow easy access to the information with the standard Unix tools like awk and grep.
Security issues This section briefly discusses some security-related issues that you might want to think about as an administrator. We'll look at the access control provided by the external database servers MySQL and PostgreSQL. The embedded database engine SQLite does not provide built-in access control. All you can do is use chown and chmod to restrict access to the database files. There is no way to restrict access through refdb. Passwords refdb tries to support the security features of the SQL database servers as far as possible. This includes the username/password-based access rights scheme (not much surprise here). Since version 0.6.0 the passwords are no longer transmitted as plain text between the clients and the server (but you can request the old behaviour using the command line options since version 1.0). This means that it now makes sense to keep the passwords secret. There are several ways to specify the password when starting a refdb client. These ways differ with respect to the security of the passwords and are listed here in the order of increasing security: Specify the password on the command line The password is stored nowhere on the filesystem and thus pretty secure from this point of view. But the full command line can be viewed with the ps command by any user on the system, so the unencrypted password is basically world-readable at least for a very brief period until the applications have a chance to hide the string. Store the password in the personal configuration file This way the password is protected from other users who habitually run the ps command just for the heck of it. But now it is stored unencrypted on the hard drive, and you must make sure that no one else can read the configuration file (no group or world read access). Specify the password interactively This is the default behaviour if the password is not specified either in the configuration file or on the command line. The refdb client will ask for the password. This is certainly the most secure way to provide a password, but this won't work if you run the clients unattended via scripts. Database server access control It is beyond the scope of this manual to reiterate the security models of the database servers, but you need to keep in mind a few aspects relevant to refdb. One component of the database server access control is based on the host from which you connect to the database server. This is partially circumvented by the refdb three-tier design. Keep in mind that only refdbd communicates with the database server. Therefore only the host where refdbd runs is relevant for the access control. There is currently no system in place for checking whether a client is allowed to connect to the refdbd application server from a particular host. Both MySQL and PostgreSQL distinguish between local and remote connections. Access needs to be granted separately if you want to use both local and remote connections On many operating systems the default installations of MySQL and PostreSQL do not allow remote connections for security reasons. You need to manually allow remote connections as described below. The refdba commands to remotely reconfigure a running application server are currently protected by a simple table access test. In any serious database server installation, only the database administators have read access to certain system tables. The current implementation of this check requires that you have access to this table if you want to run the confserv commands. You should be aware that if the access rights are set up improperly, you may also allow everyone and their grandma to stop or reconfigure the refdbd application server. If you cannot restrict read access to system tables for whatever reason, you should not enable refdbd remote administration (default is off) and use the kill command or the refdbctl script instead. Most of the refdba commands require database administrator rights. MySQL If you run MySQL as your database server, these things apply as well: When adding users with the adduser command the option has to specify the box where refdbd runs as the host, not the box from where the user will run the clients. If you do not specify a host, "localhost" is assumed. This works on some platforms (e.g. FreeBSD 5.4), but not on others (e.g. Fedora Core 4). In the latter case you may have to specify the hostname explicitly. To allow remote connections to the database server, the MySQL configuration file my.cnf must not contain the option "skip-networking", and the start script must not use the command-line option . Many operating systems use one of these methods in default installations to restrict access to local users for security reasons. If you install and run MySQL yourself, you should not use the default database administrator account. The name (root) is widely known and by default this account is not password-protected. To make your database server secure, please create a new database administrator account with a different name and specify a password. PostgreSQL If you run PostgreSQL as your database server, these hints are for you: The host-based part of the PostgreSQL access control is not accessible through the SQL interface. Therefore, the refdba command adduser cannot provide the host information (in other words, the is ignored). Instead, the host-based part of the access control is specified in the PostgreSQL configuration file, usually /home/pgsql/data/pg_hba.conf. On most operating systems, the default configuration allows unrestricted access for all users on the local system, but no remote access. Use something like the following entries to enforce usage of passwords for both local access and remote access from the network 192.168.1.0 to refdb and a reference database "refs": # host DBNAME IP_ADDRESS ADDRESS_MASK AUTH_TYPE [AUTH_ARGUMENT] local refdb crypt local refs crypt host refdb 192.168.1.0 255.255.255.0 crypt host refs 192.168.1.0 255.255.255.0 crypt As mentioned previously, only the host where refdbd runs is relevant for the host or network entries in the configuration file. Make sure to read the PostgreSQL documentation to get your access control right. Please keep in mind that postmaster (the PostgreSQL database server parent process) needs to be started with the option to accept remote connections at all. Most default installations do not use this switch to increase security. If you install and run PostgreSQL yourself, you should not use the default database administrator account. The name (pgsql) is widely known and by default this account is not password-protected. To make your database server secure, please create a new database administrator account with a different name and specify a password. How to run several refdb instances In all but a few cases, having one refdbd daemon per network is absolutely sufficient. However, there are a few cases where you may end up running more than one instance of refdbd on the same computer at the same time: You want to provide access to more than one database engine. The only good reason to do this may be to test-drive a different database engine. You want to test-drive a new refdb release without interrupting the access to your installed version You do not want to run refdbd as a daemon serving all users. Instead, each user should be able to run his own copy of refdbd You'll have to configure each refdbd process individually. If each user starts his own copy of the application server, private .refdbdrc configuration files in the users' $HOME directory allow a simple setup. If you want to run more than one daemon as non-user-processes, you cannot safely use the refdbctl script to control the instances. Instead you should start and stop the daemons manually and use the appropriate command-line options to configure each process individually. The options which need to be set differently whenever more than one refdbd instance runs on the same box are: , , and to set the database engine, IP address, and the port it listens on, respectively. Only required if you fiddle with two different database engines. and -L to use separate log files for the two instances. This may be easier to evaluate than using syslog, although the processes can be distinguished by means of their process ID. to use separate PID files to set the port each refdbd instance listens on. The ports must be different, otherwise clients can't select which instance to connect to. On the client side you'll need only set the port configuration variable or use the command line option to select the application server instance that you want to connect to. Backup your data If your database crashes for whatever reasons, the first question you'll hear is: "You've got a backup, don't you?". At this point in your life you shouldn't even think about not having a backup. There's basically two ways to create a backup of your reference data: Use a risx dump or use a SQL dump. The risx dump is slower but it would allow you to transfer the data to a refdb installation using a different database server. The SQL dump is faster but you're tied to the database server you're using. If you use SQLite as your database backend, you may simply grab copies of the database files. Each database is stored in one file. This file holds all required information and is platform-independent, so it is suitable for backup purposes. Backups are useful only if you create them regularly. You should work out a schedule based on how often the contents of the database change. Think about setting up a cron job for nightly or weekly snapshots. Creating a risx dump All you need to do is to retrieve all references and write them to a file in risx format. Use the getref command in refdbc for this purpose: refdbc: getref -t risx -s NOHOLES -o all.ris :ID:>0 The option will dump skeleton references for references that you deleted from the database. This simplifies re-creating the same ID values in a new database. Creating a SQL dump This is best done with the command line tools shipped with you database server. You should consult the manual of your database server, but the following commands should be all it takes: If you run MySQL as your database server, run: $ mysqldump -u root -p --opt dbname > dbname.dump This assumes that "root" is the name of your database administrator account and "dbname" is the name of your database. If you run PostgreSQL instead, use this command: $ pg_dump -u pgsql -C dbname > dbname.dump This assumes that "pgsql" is the name of your database administrator account and "dbname" is the name of your database. To restore a database from a dump, use the command line clients shipped with your database server. For MySQL, the required sequence is: $ mysql -u root -p -e "CREATE DATABASE dbname" $ mysql -u root -p dbname < dbname.dump whereas the following would do the trick with PostgreSQL: $ psql -u pgsql template1 < dbname.dump SQL dumps are also well suited to create backups of refdb, the common refdb database.
refdb-1.0.2/doc/chapter-refdbd.xml000644 001750 001750 00000011571 11512721663 017614 0ustar00markusmarkus000000 000000 The application server refdbd is the RefDB application server, i.e. a program that runs in the background and handles the requests from the RefDB clients. This is the program that directly interacts with the database server and does most of the serious work. refdbd can be configured at startup with the configuration file refdbdrc or by passing command-line options. The latter override the corresponding settings in the configuration files. While refdbd is running, most of the parameters can be changed remotely with refdba (see the refdba command confserv), but to make changes permanent you'll have to edit the configuration file or the script line that starts refdbd. In the current implementation, the remote administration via refdba uses a fairly indirect access control. If this is a concern, you should not enable remote administration (it is disabled by default). You can use the command refdbctl reload instead to cause refdbd to reread its configuration file while running. Then the usual access controls for editing the configuration file and for sending a signal to a process apply. You can run refdbd as a standalone application or as a daemon. The main difference between the standalone process and a daemon process is the fact that the daemon is no longer associated with a particular terminal. This means that no output to stdout or stderr will ever show up on a terminal and that the process will keep running even if the terminal that started the process terminates. This is good if you want it running unattended, similar to a web server or a ftp server. On the other hand it can be handy for debugging purposes to directly get log output (or additional printf() output) on a terminal and to use the standard ways of process control, e.g. to kill refdbd with Ctrl-C. The command line switch lets refdbd run as a normal application for exactly this purpose. The above holds true for almost any Unix-like operating system. On Windowsish operating systems the story is somewhat different. First of all, the Win95/98/ME family does not support daemons at all. WinNT/2000 do support daemons (they're called services here just for the sake of having a different name for the same thing). The simplest way to run refdbd as a NT service is to use a service installer as described in the Installation chapter. In this case you should run refdbd as a standalone application (i.e. include the switch), as the installer will take care of all the magic. Another possibility is to start refdbd from Cygwin inetd. In that case you'd run refdbd as a daemon again, but this is currently beyond the scope of this manual. You can run refdbd as a daemon either from the command line, i.e. start it manually when you need it, or you can start the daemon at the system start. For the latter, refer to the Installation chapter. This chapter explains how to control refdbd from the command line. The easiest and strongly recommended way is to use the provided control script that will be explained in the first section. If you need further control, you can use the command line of refdbd directly as explained in the second section. The third section describes the script which is usually run automatically by your system if you install refdbd as a daemon. The final sections describe the two applications which provide SRU access to RefDB databases. refdbctl.1.xml appears to be missing refdbd.1.xml appears to be missing refdb.8.xml appears to be missing refdbsru.1.xml appears to be missing refdb-sruserver.1.xml appears to be missing refdb-1.0.2/doc/chapter-refdbib.xml000644 001750 001750 00000004013 11535464306 017757 0ustar00markusmarkus000000 000000 Tools for bibliographies This chapter is a reference for refdbib, the RefDB bibliography client, and all associated tools which are required for the transformation of documents containing RefDB bibliographies. refdbib.1.xml appears to be missing refdbnd.1.xml appears to be missing runbib.1.xml appears to be missing runbib-missing.1.xml appears to be missing refdbjade.1.xml appears to be missing refdbxml.1.xml appears to be missing refdbrtf.1.xml appears to be missing refdbxp.1.xml appears to be missing refdb-ms.1.xml appears to be missing rtfcitations.1.xml appears to be missing refdb-1.0.2/doc/chapter-reference-database-design.xml000644 001750 001750 00000066227 11512721663 023345 0ustar00markusmarkus000000 000000 Reference database design This section gives an overview over the design of the reference database with MySQL as the database server. The same design is used with the other database engines, although the details may differ somewhat. This will be mentioned where appropriate. The requirements of the database necessitate some tables which hold the data proper and some tables which cross-reference these tables. The table t_meta The t_meta table contains the following meta-information about the database: meta_app This string contains the name of the application that created the database. meta_version This string contains the version number of the application that created the database. meta_type This string describes the type of the database. Currently only the type "risx" is supported. meta_create_date This timestamp is set by refdbd when the database is created. meta_modify_date This timestamp is updated by refdbd whenever the database is changed. The table t_refdb This table is the main table of the database and holds all fields which are unique to one reference entry and not different between users. This table contains the following columns: refdb_id This unique identifier for entries in t_refdb is automatically generated by refdb and is stored as a BIGINT value (INTEGER for SQLite). refdb_citekey This is a user-supplied unique identifier for entries in t_refdb. If not supplied by the user, RefDB will create a unique identifier when the entry is added. refdb_type This indicates the type of the document. This six-character string must be one of the following: ABST (abstract reference) ADVS (audiovisual material) ART (art work) BILL (bill/resolution) BOOK (whole book reference) CASE (case) CHAP (book chapter reference) COMP (computer program) CONF (conference proceeding) CTLG (catalog) DATA (data file) ELEC (electronic citation) GEN (generic) ICOMM (internet communication) INPR (in press reference) JFULL (journal - full) JOUR (journal reference) MAP (map) MGZN (magazine article) MPCT (motion picture) MUSIC (music score) NEWS (newspaper) PAMP (pamphlet) PAT (patent) PCOMM (personal communication) RPRT (report) SER (serial - book, monograph) SLIDE (slide) SOUND (sound recording) STAT (statute) THES (thesis/dissertation) UNBILL (unenacted bill/resolution) UNPB (unpublished work reference) VIDEO (video recording) refdb_pubyear This numerical value (SMALLINT) indicates the publication year. refdb_secyear This numerical value (SMALLINT) indicates the secondary year information. refdb_startpage This alphanumeric string (up to 255 characters) contains the start page information. refdb_endpage This alphanumeric string (up to 255 characters) contains the end page information. refdb_abstract This variable-length string contains the abstract or table of contents of the entry. refdb_title This alphanumeric field of variable length contains the title of the entry. refdb_volume This alphanumeric field (up to 255 characters) contains the volume number or identifier of the periodical. refdb_issue This alphanumeric field (up to 255 characters) contains the issue number or specifier. refdb_booktitle This alphanumeric field of variable length contains the book title (book chapter or whole book reference). refdb_city This alphanumeric field (up to 255 characters) contains the city where the periodical or book was published. refdb_publisher This alphanumeric field (up to 255 characters) contains the name of the publisher. refdb_title_series This alphanumerical field of variable length contains the title of a series of books or publications. refdb_address This alphanumeric field of variable length holds the address of the corresponding author and other contact information. refdb_url This alphanumeric field (up to 255 characters) holds a URL related to the entry, e.g. the homepage of an author or a link to an electronic reprint. refdb_issn This alphanumeric field with a maximum of 255 characters stores the ISSN or ISBN number of the publication. refdb_pyother_info This alphanumeric field with a maximum of 255 characters stores the additional information of a PY field after the publication year. The format is /MM/DD/otherinfo, with MM being the month and DD being the day of the publication. If either of these is missing, the corresponding slash / still has to be entered. The other information is free alphanumeric information. refdb_secother_info This alphanumeric field with a maximum of 255 characters provides the same additional information for the refdb_secyear field as the refdb_pyother_info field for refdb_pubyear. refdb_periodical_id This BIGINT (INTEGER for SQLite) variable points to the periodical_id in t_periodical which corresponds to the periodical the given article appeared in. refdb_user1 through refdb_user5 These alphanumeric fields with a maximum of 255 characters provide space for user-defined information. refdb_typeofwork This alphanumeric field with a maximum of 255 characters stores tye type of work of some reference types. refdb_area This alphanumeric field with a maximum of 255 characters stores the area information of MAP entries. refdb_ostype This alphanumeric field with a maximum of 255 characters stores the type of the operating system of a computer program. refdb_degree This alphanumeric field with a maximum of 255 characters stores the type of the degree of a THES reference.. refdb_runningtime This alphanumeric field with a maximum of 255 characters stores the running time of several multimedia reference types. refdb_classcodeintl This alphanumeric field with a maximum of 255 characters stores the international class code of PAT references. refdb_classcodeus This alphanumeric field with a maximum of 255 characters stores the US class code of PAT references. refdb_senderemail This alphanumeric field with a maximum of 255 characters stores the email address of the sender of an ICOMM reference. refdb_recipientemail This alphanumeric field with a maximum of 255 characters stores the email address of the recipient of an ICOMM reference. refdb_mediatype This alphanumeric field with a maximum of 255 characters stores the type of the medium of a reference. refdb_numvolumes This alphanumeric field with a maximum of 255 characters stores the total number of volumes of a monographic item which is part of a limited series. refdb_edition This alphanumeric field with a maximum of 255 characters stores the edition of a monographic item. refdb_computer This alphanumeric field with a maximum of 255 characters stores the type of computer of a COMP reference. refdb_conferencelocation This alphanumeric field with a maximum of 255 characters stores the location of a conference of a CONF entry. refdb_registrynum This alphanumeric field with a maximum of 255 characters stores the registry number of JFULL entries. refdb_classification This alphanumeric field with a maximum of 255 characters stores the classification of multimedia entries. refdb_section This alphanumeric field with a maximum of 255 characters stores the section of a NEWS entry. refdb_pamphletnum This alphanumeric field with a maximum of 255 characters stores the number of the pamphlet of a PAMP entry. refdb_chapternum This alphanumeric field with a maximum of 255 characters stores the number of the chapter of a CHAP entry. The table t_author This table is a list of all authors, editors, and series editors. author_id The unique identifier of each author is stored as a BIGINT value (INTEGER for SQLite). author_name The name of the author is stored in a alphanumerical field (maximum lenght 255 characters). The name has the format Lastname[,(F.|First)[(M.|Middle)[,Suffix]]]. The table t_keyword This table is a list of all keywords. keyword_id The unique identifier of each keyword is stored as a BIGINT value (INTEGER for SQLite). keyword_name This field holds the keyword (key phrase may be a better word as a keyword may consist of any alphanumeric string, including spaces). The maximum size is 255 characters. The table t_periodical This table is a list of all periodicals. periodical_id This is the unique identifier of each periodical and is stored as a BIGINT value (INTEGER for SQLite). periodical_name This is the full, unabbreviated name of the periodical. This is an alphanumeric field with a limit of 255 characters. Examples: Trends in Biochemical Sciences; Proceedings of the National Academy of Sciences of the United States of America periodical_abbrev This is the official abbreviation of the periodical as seen in the Index Medicus. Abbreviated words have a trailing period. All words are separated by a space. This is also an alphanumeric field with a maximum of 255 characters. Examples: Trends Biochem. Sci.; Proc. Natl. Acad. Sci. USA periodical_custabbrev1 This is a custom abbreviation, often shorter and more popular than the official abbreviation. This is again an alphanumeric field with a limit of 255 characters. Examples: TIBS; PNAS periodical_custabbrev2 This is another custom abbreviation, often shorter and more popular than the official abbreviation. This is again an alphanumeric field with a limit of 255 characters. The table t_note This table contains the extended notes. note_id This unique identifier for entries in t_note is automatically generated by RefDB and is stored as a BIGINT value (INTEGER for SQLite). note_key This is a user-supplied unique identifier for entries in t_note. If not supplied by the user, RefDB will create a unique identifier when the entry is added. note_title This alphanumeric field (up to 255 characters) contains the title of the entry. note_content This alphanumeric field of unlimited length contains the text of the note. note_content_type This alphanumeric field (up to 255 characters) contains the type of the data in the note_content field. note_content_xmllang This alphanumeric field (up to 255 characters) contains an identifier of the language of the data in the note_content field. note_user_id This BIGINT (INTEGER for SQLite) variable points to the user_id in t_user which corresponds to the user who created the note. note_date This DATETIME field stores the date the note was added, or any other user-supplied date. note_share This short integer field stores whether the note may be shared with others (value != zero) or not (value = zero). The table t_user This table contains the information about the users accessing the database. This information is used to track the person who added a specific article and the persons who are interested in a particular article. user_id The unique ID of each user is stored as a BIGINT value (INTEGER for SQLite). user_name This alphanumeric field holds the mySQL login name of the user (maximum length is 16 characters). The length limit is imposed by MySQL. The table t_link This table contains URLs. link_id The unique ID of each user is stored as a BIGINT value (INTEGER for SQLite). link_url This alphanumeric field of unlimited length contains the URL. The table t_xauthor This table cross-references the tables t_author and t_refdb. xauthor_id This is the unique ID of a t_xauthor entry, stored as a BIGINT value (INTEGER for SQLite). author_id This is the ID of the author in the t_author table, stored as a BIGINT value (INTEGER for SQLite). refdb_id This is the ID of the reference in the t_refdb table, stored as a BIGINT value (INTEGER for SQLite). xauthor_type This ENUM field has the three possible values primary, secondary, and tertiary which denote that the person is a regular author, an editor, or a series editor in the given reference, respectively. PostgreSQL implements this as a SMALLINT value, SQLite uses a TEXT field. xauthor_position This INT field stores the original position of the author in the paper. The sequence of authors is taken from the sequence they appear in the RIS file. The table t_xkeyword This table cross-references the tables t_keyword and t_refdb. xkeyword_id The unique ID of an t_xkeyword entry is stored as a BIGINT value (INTEGER for SQLite). keyword_id This BIGINT value (INTEGER for SQLite) points to the ID of the keyword in the table t_keyword. refdb_id This is the ID of the reference in the t_refdb table, stored as a BIGINT value (INTEGER for SQLite). The table t_xuser This table cross-references the tables t_user and t_refdb. xuser_id The unique ID of an t_xuser entry is stored as a BIGINT value (INTEGER for SQLite). user_id This BIGINT value (INTEGER for SQLite) points to the ID of the user in the table t_user. refdb_id This is the ID of the reference in the t_refdb table, stored as a BIGINT value (INTEGER for SQLite). xuser_reprint This alphanumeric string must contain one of the following: NOT IN FILE (this is the default if nothing is specified) ON REQUEST IN FILE xuser_date This DATE field holds the date when a reprint was requested. If xuser_reprint contains something else than ON REQUEST, this field is not relevant. xuser_avail This alphanumeric field with a maximum of 255 characters contains the information where a physical copy of the article is stored. This may be a room number, a contact person, a binder or folder name or anything else that helps to track that copy down. This field is irrelevant if the reprint status is not IN FILE. xuser_notes This alphanumeric field of variable length contains notes or comments added by the user. The table t_xnote This table cross-references the tables t_note and t_refdb. xnote_id The unique ID of an t_xnote entry is stored as a BIGINT value (INTEGER for SQLite). note_id This BIGINT value (INTEGER for SQLite) points to the ID of the extended note in the table t_note. xref_id This is the ID of the database item that the note is linked to, stored as a BIGINT value (INTEGER for SQLite). xnote_type This field stores which type of database item (reference, keyword, author, periodical) the note is attached to. The table t_xlink This table cross-references the tables t_link and t_refdb. xlink_id The unique ID of an t_xlink entry is stored as a BIGINT value (INTEGER for SQLite). link_id This BIGINT value (INTEGER for SQLite) points to the ID of the link in the table t_link. xref_id This is the ID of the database item that the note is linked to, stored as a BIGINT value (INTEGER for SQLite). xlink_type This field stores the type of the link (URL, PDF, fulltext, related, or image). xlink_source This field stores whether the link is used in a reference or in a note. refdb-1.0.2/doc/chapter-ris-risx-format.xml000644 001750 001750 00000006773 11512721663 021444 0ustar00markusmarkus000000 000000 RIS and risx format specifications In general, RefDB tries to stick as closely as possible to the RIS format specification of the Reference Manager software version 8 (this is the most recent version I was working with). This chapter briefly recalls the general syntax of RIS and risx files and the few differences in the implementation between Reference Manager and RefDB. The RefDB RIS implementation Import from Reference Manager and similar bibliographic databases as well as export should work in general, although it is not always loss-free due to the varying degree of support for the full RIS specification. This chapter briefly summarizes the differences between the Reference Manager RIS specification and what RefDB uses. In contrast to the mainly Windows-based bibliographic databases, RefDB expects the RIS files with UNIX line endings (LF = 0x0A). Most online sources allow to download the files in this format. The RefDB package also contains a refdb_dos2unix shell script which converts the line endings from DOS format to UNIX format (you may use your favourite perl or whatever program instead, of course). In Reference Manager, the number of authors/editors/series authors per reference is limited to 255. Although this may not have any practical consequences, RefDB does not have this restriction. The same holds true for keywords. In RefDB the number of keywords per reference is not limited. Some of the tags defined in the RIS format specification have synonyms. RefDB does not use these randomly upon output of RIS datasets, but uses a defined subset. This subset may be a different one than Reference Manager uses. This should have no practical consequences for the data integrity, although this means that after shuffling datasets between the two databases different synonymous tags may be used. The BT/T2 field is limited to 16KB in Reference Manager. It is limited to 64KB in RefDB. A couple of fields in a Reference Manager database have either no practical length limit or the length limit is not specified at all. As these field lengths are not exactly given in SI units, I can just list what the corresponding limits in RefDB are: PY/Y1, Y2 are limited to 255 characters starting from the first slash (i.e. excluding the year information), TI/T1/CT, IS/CP, BT/T2, T3, AD are limited to 64KB, AB and N1 are limited to 16MB. I assume that none of these poses a practical length limit. If you should plan to exceed these limits, you can of course recompile refdbd and use up to the maximum field length that the database server offers (e.g. 4GB in MySQL). The risx DTD The risx DTD allows to express RIS data in XML files. It has a few advantages over RIS, like full support for multiple-user notes, availability, and reprint information. The DTD is explained in a separate manual. refdb-1.0.2/doc/chapter-system-requirements.xml000644 001750 001750 00000047247 11512721663 022444 0ustar00markusmarkus000000 000000 System requirements Operating system refdb was designed to run on as many platforms as possible and has positively been seen running on the following operating systems: GNU/Linux FreeBSD NetBSD OSX Solaris/SunOS Windows/Cygwin Other Unix-like operating systems may work out of the box or with a minimum amount of tweaking. While this portability excludes fancy GUI bells and whistles, it makes it (most likely) possible to run refdb on the hardware and operating system that you happen to have. Both the clients and the application server should compile on all systems with a decent C compiler like gcc. There should be no problems to run refdb on heterogenous networks. For Windows users the free Cygwin tools are recommended. Cygwin is a POSIX layer on top of Win32 including a useful selection of the popular GNU tools. To simplify the task of porting refdb to other operating systems the package uses autoconf and automake. Libraries necessary to build and run refdb The following libraries are required on your system: The version numbers in this list do not indicate that it is impossible to build refdb with any lower version number, except where indicated. The numbers just indicate the versions that were used successfully. Lower version numbers may work, higher version numbers are assumed to work in all cases. Some operating systems/distributions use separate packages for the run-time libraries and the development libraries. In order to build refdb from the sources and run the resulting applications, you need both types of libraries. System libraries These libraries should be offered by all operating systems if they are required on that particular system. libreadline (version 4.1 or later) libz (version 1.1.3 or later; not required on systems using glibc) libnsl, a standard library on Solaris, may be required on this platform. libdl, required on all systems that do not include the dl* functions for dealing with dynamic libraries in the standard C library. libiconv, required on all systems that do not include the character encoding conversion functions in the standard C library. Other libraries libdbi (version 0.8.x) and libdbi-drivers (version 0.8.x): a database abstraction layer framework and a set of database-specific drivers. libdbi provides the framework for the separately available database drivers. refdb currently supports the MySQL, PostgreSQL, SQLite, and SQLite3 drivers. When configuring the libdbi-drivers source package, please make sure to understand that you have to request the drivers you want to build with the , , , or options (you can specify as many drivers as you see fit). SQLite (version 2.8.x or 3.x.y): an embedded SQL engine which you can use instead of the external database servers MySQL or PostgreSQL. libexpat (version 1.95.1): a XML parser library. btparse (version 0.34; only required if you want to build the BibTeX import filter): a bibtex parser library. Perl modules Some import filters and the SRU servers are implemented as Perl scripts or Perl modules. These require a couple of external Perl modules in order to run properly. Some of the modules are available at CPAN, the comprehensive Perl archive network, which allows you to search and download the modules by name. The refdb-specific modules are available as the refdb-perlmod and the refdb-perlsru packages on the refdb project page. If you're not familiar with Perl modules, here's how almost all of them can be installed: After unpacking the archive, change into the top-level directory of the extracted module. First run perl Makefile.PL which will create a system-specific Makefile. Then run make, optionally followed by make test to check the functionality. Finally, run make install as root. marc2ris MARC::Record (CPAN) MARC::Charset (CPAN) refdb-perlmod med2ris XML::Parser (CPAN) Text::Iconv (CPAN) refdb-perlmod en2ris Text::Iconv (CPAN) refdb-perlmod refdbsru CQL (CPAN) CGI (CPAN) XML::Writer (CPAN) refdb-perlsru refdb-perlmod refdb-sruserver CQL (CPAN) CGI (CPAN) XML::Writer (CPAN) HTTP::Server::Simple (CPAN) refdb-perlsru refdb-perlmod The configure script tests for the existence of the required Perl modules. If your system lacks some of the required scripts, you'll get a warning, but you'll still be able to make and make install refdb. You can install the modules at a later time without rebuilding refdb. In any case, the missing modules will only affect the Perl import filters, but not the core functionality of refdb. That is, if you don't require the Perl scripts, you don't have to install the modules either. refdb also provides some support for Perl programmers. The RefDBClient module, also available at the refdb project page, implements Perl classes to directly communicate with refdbd. This allows to write custom clients that access the refdb databases and use the whole functionality implemented in refdbd. The test.pl script shipped with the module gives a basic idea how to write a custom client. See also the chapter about this module in the programmer's manual. External applications refdb was designed with the fact in mind that good applications are out there for almost any purpose. Therefore it relies on a few external applications which have to be properly installed. The following list shows the applications which are absolutely required and some applications which will make your life easier. SQL database server (required for all purposes) refdb uses libdbi as a database abstraction layer to access SQL database servers. refdb currently supports MySQL and PostgreSQL as external database engines. Both database servers run on a wide variety of Unix- and Unix-like operating systems as well as on Windows. Sources and precompiled binaries are available. MySQL should be at least version 4.1.x, PostgreSQL should be 7.1 or later. If you prefer not to run an external SQL database server, choose the SQLite based internal database engine as explained in the libraries section above. Jade/OpenJade and SP/OSP-based tools (required for DocBook SGML bibliographies, import of DocBook bibliography data) Jade is a freely available and well-proven DSSSL engine which is based on the SP parser. The Jade package contains a few more SP-based tools, e.g. the nsgmls validator and the sgmlnorm normalizer. refdb uses Jade both to extract the IDs of the references which are cited in SGML documents and to transform SGML documents using DSSSL stylesheets. sgmlnorm is required to preprocess multipart documents using the short notation for refdb citations. The Jade/SP package is available on James Clarks homepage. Prebuilt binaries are available for some platforms, and it builds out of the box on quite a number of platforms. Jade has seen some further development by an independent group of programmers. These newer versions were released as OpenJade/OpenSP and are available at the OpenJade homepage. OpenJade has some advantages over Jade for our purposes. If it is possible to obtain or compile OpenJade on your platform, you should go for it. Both Jade and OpenJade can be installed on the same machine without conflicts. The configure script will look for both OpenJade and Jade and will use the former as the default DSSSL engine in the shell script customizations if it is available. XSLT and FO processors (required for DocBook and TEI XML documents) If you're working with XML documents and want to transform them using the XSL stylesheets, you'll need some sort of XSL processing machinery. Popular choices are Xalan, Saxon, and xsltproc. The latter is checked for in the configure script and will be used as the default processor if available. The Java-based tools among these need the Java Virtual Machine installed, of course. Generating printable output from FO seems to work best with FOP. Stylesheets (required for SGML or XML bibliographies) refdb ships with DSSSL stylesheet driver files for DocBook SGML documents, XSL stylesheet driver files for DocBook XML documents, and XSL stylesheet driver files for TEI XML documents. All of these rely on the respective stylesheets by Norm Walsh and Sebastian Rahtz. These must be installed on your system if you want to transform DocBook or TEI documents. TeX (required for LaTeX bibliographies and recommended for printable output from SGML and XML documents) Donald Knuth's famous typesetting system is available on almost any platform. You need a TeX system to generate LaTeX bibliographies. It is also convenient to generate nice-looking printable output from SGML and XML documents. Unix-style text editor (required for all purposes) This is nothing to worry about if you use some flavour of Unix or Linux: anything that lets you edit texts will do. However, if you have to use Windows, you should be aware that many run-of-the-mill Windows text editors are not suitable for use with refdb as they are not able to handle the Unix-style line endings (LF instead of CR/LF) properly. The standard Windows editors Notepad, WordPad, and MS Word will not work unless you use a DOS to Unix conversion filter like refdb_dos2unix. These line endings are important in almost all cases, especially when adding and editing references. Some freeware or shareware text-editors for programmers have an option to read and write Unix-style line endings. A few popular Unix text editors are available as Windows ports. Among them are vi clones like vim which is available as a native Windows application and as a Cygwin version, as well as Emacs. GNU Emacs is available as a native Windows application and also as a Cygwin package (even for the Cygwin XFree86 port if you wish). XEmacs can both be built as a native application and as a Cygwin program. SGML/XML editor (recommended, but not mandatory) If you plan to create bibliographies, you may need a SGML/XML editor for two reasons. First, the bibliography style specifications have to be written as XML documents (unless someone else has contributed such a file). Second, if you want to create bibliographies for DocBook documents, you want to use a SGML/XML editor anyway. But SGML is plain text after all, so SGML/XML editors make your life easier, but they are not strictly necessary to get something done. Emacs/XEmacs and the PSGML mode for DTD-based SGML and XML documents or the nxml mode for RELAX NG-based XML documents are an excellent choice. Web browser (recommended, but not mandatory) Most likely you will not have a hard time to find some kind of web browser on your system. A web browser may be more pleasant to view the query results than the standard output on stdout or a pager. If you use refdb to manage a collection of PDF or Postscript files, the paths to these files will be displayed in the HTML output and you can open the files with one mouseclick. A web browser is of course also required to use the PHP interface, and it is also useful to interactively retrieve references through the SRU interface. Perl (import of MARC datasets, import of Pubmed XML datasets, import of EndNote RIS datasets, post-processing BibTeX import files, SRU interfaces) The Perl interpreter is available for almost any platform. refdb currently uses Perl for two purposes: the first are the MARC and Pubmed XML import filters, the other is a non-mandatory post-processing step of bibliography data that you import from BibTeX .bib files. The MARC import filter requires at least Perl version 5.6.0 and the Perl modules MARC::Record and MARC::Charset. The Pubmed XML import filter requires the Perl modules XML::Parser and Text::Iconv. The latter is also required for the Endnote import filter. Both the standalone and the CGI version of the SRU services are also implemented in Perl. All things Perl are available at CPAN. Z39.50 client In order to retrieve datasets from one of the countless libraries offering their contents through the Z39.50 protocol you'll need a client. The free YAZ toolkit includes a sample client which should be sufficient for general use. The toolkit is available as source, RPM and Debian binaries, and as a Windows binary package. Related Software Please visit the RefDB web page for further information about the following tools which extend the capabilities of RefDB but are not included in the sources: ris-mode, an Emacs major mode for RIS datasets refdb-mode, an Emacs frontend for RefDB A package providing RefDB support for vim, the improved vi editor refdb-perlmod, a package containing several Perl support modules for the Perl scripts shipped with RefDB RefDB::Client, a Perl module implementing an object-oriented access to RefDB for Perl programmers RefDB::SRU and RefDB::SRUserver, the Perl modules that implement the SRU access to RefDB A Ruby client library (partially implemented and currently unmaintained!) refdb-1.0.2/doc/chapter-programming.xml000644 001750 001750 00000021036 11512721663 020705 0ustar00markusmarkus000000 000000 Using RefDB in your programs General thoughts RefDB provides command-line clients to access the application server refdbd. This makes it easy to automate tasks through shell scripts or Makefiles. RefDB uses both possibilities for its own purposes. The prime example for a shell script is runbib, which transform your XML documents by invoking, among others, the RefDB bibliography client. Makefiles are more appropriate in other contexts. The Makefile created by refdbnd is just one example. However, if you want more than that, you'll want to access refdbd from your own programs. Need RefDB support for your favourite editor? It is doable, as you can see from the RefDB integration in Emacs and in Vim. Want to access RefDB through the web? There is a PHP implementation of a web front-end in the RefDB sources with plenty of room for improvements, and there is also a SRU interface. Want to have a pointy-clicky frontend so you'll no longer have to envy the Mac and Windoze users of EndNote? Well, this is a challenge that no one has tried yet. Before you fire up your favourite IDE and start coding, please consider the following: Do not even think about fiddling with the SQL database! Most languages offer a simple way to access SQL databases, and the database engines often provide client libraries for a variety of languages. However, RefDB is more than just a thin layer on top of a SQL database. RefDB normalizes data. RefDB takes data apart and reassembles them when needed. RefDB takes care of character encoding conversions. Even worse, the SQL table schemas may change from one RefDB version to the next. Therefore you should never attempt to access RefDB data from your own programs on the SQL level. Instead, you should rely on the interfaces that RefDB offers. Interfaces There are two interfaces available which will be explained below. Call the C clients from your program Using system calls is fairly straightforward. Most programming languages provide constructs to run external programs and to send data to their standard input or to read data from their standard output (rarely, however, both at a time). The following commands give an example how to accomplish this in Perl: $output = `refdbc -d $dbname -C whichdb -u $user -w $pass 2>/dev/null`; $result = `refdbc -d $dbname -C addref -t $type -u $user -w $pass $infile 2>&1`; The first call discards the standard error of the command and writes only the standard output to the variable $output. The second call collects both standard error and standard output in a single variable. Your program would have to parse $result in order to separate both. In both cases Perl variables are used to supply database names, file names, or the reference type. This kind of access works from most programming languages. For an example written in Lisp, see the Emacs frontend for RefDB. Easy as it may be, running the C clients from your program does have some drawbacks: As shown in the examples above, the handling of standard output and standard error is less than perfect. You can retrieve either, or both in a single variable. Your program therefore needs the logic to separate output from error messages. If you need both separately, you can redirect both to separate files and then read in these files, but this is as kludgy as it sounds. On most systems you can't send to standard input and read from standard output at the same time (see this Perl script how you can still achieve this). This can be circumvented by either writing the input data to a file (most RefDB commands can read data from files) or by capturing the input data in a file via redirection. Last but not least, you need to have the C clients installed along with your own program. Directly talk to refdbd This is a somewhat more ambitious approach, as you have to implement the client part of the client/server dialog described here. The client/server dialog is a plain-text protocol which is fairly easy to implement in just about any language. The only tricky part is the password encryption, but that can be handed over to a little C program called eenc that is part of the RefDB sources. The RefDB project currently has client libraries for two languages which provide an implementation of the client part of the client/server protocol. The Perl client module provides an object-oriented access to refdbd which you can use in your programs without having to know anything about the client/server protocol. There is also a (rudimentary and currently unmaintained) implementation in Ruby. To give you an impression of how you can use a client library, look at the following Perl example which does approximately the same as the examples above: use RefDBClient::Client; # create a Client object. You can create as many as you need my $client = new RefDBClient::Client; # set the initial connection parameters $client->set_conninfo("127.0.0.1", "9734", "markus", "pass", "refdbtest", "/home/markus/literature", "/usr/local/share/refdb/css/refdb.css"); # run the whichdb command. We're not interested in the command summary, # but read only the data proper into $data $client->refdb_whichdb(); $data = $client->get_data(); # in order to add references from a RIS file, we first read the file contents # into a Risdata object my $risdata = new RefDBClient::Risdata; $risdata->read_ris("testdata/pubmed.ris"); # now we send the data to the server. This time we read both the command # summary (which the C clients send to stderr) into $summary and the # data proper into $data $summary = $clientc->refdb_addref(undef, $risdata, "ris", "ISO-8859-1"); $data = $clientc->get_data(); The advantages and disadvantages of using a client library are as follows: You get a clean, object-oriented interface No fiddling with standard error or standard output However, there may be no client library for your favourite language Tips and tricks This is currently a ragbag of things to consider. It will hopefully be more structured at a later time. Paging output If you run commands like getref that are likely to return more information than fits on a screen, you can either try to parse the result in your program and then display it chunk-wise. You may have to parse the data anyway for a different reason, so this option may come at no extra cost. However, if you just want to display the data, you can also use the server-side paging which is implemented in all "get*" commands. These commands take an optional limit argument. The general format is limit[:offset]. limit is the number of datasets to display, and the optional offset is the number of references to skip at the beginning. That is, asking refdbd to limit the result set to 5:10 will cause it to ignore the first 10 datasets and send datasets 11 through 15. You can use this in a loop to retrieve the datasets in groups of 5 until no more datasets are available. Server-side paging is preferable in all cases where a query may return lots of data, as you don't have to buffer them locally. refdb-1.0.2/doc/chapter-sru.xml000644 001750 001750 00000036745 11512721663 017211 0ustar00markusmarkus000000 000000 RefDB SRU interface What SRU is all about SRU (Search and Retrieve via URL) is a standard search protocol developed by the Library of Congress to allow web-based access to libraries. SRU uses a fairly simple query language called CQL (Contextual Query Language). Any program that can send a HTTP GET request to a remote site and receive the resulting XML document is basically suited as a SRU client. This is especially true for your web browser and for command-line utilities like wget, but a dedicated client like YAZ may be more convenient for all but the most simple queries. Also, some software packages read bibliographic data from databases via SRU (e.g. citeproc). RefDB implements SRU server capabilities through a CGI script that you can optionally install in your web server. This will allow anyone with access to your web server to search and retrieve bibliographic data in your RefDB databases. Alternatively, a standalone web server for single-user access is available too. This chapter explains how to use SRU access. See the installation chapter for the instructions how to set up SRU support in your RefDB installation. SRU Operations This section assumes that you run the SRU service using the CGI application. If you use the standalone server instead, please adapt the URLs by replacing "http://mybox.com/cgi-bin/" with "http://localhost:8080/". SRU defines three operations, all of which return XML documents: explain describes the available facilities in terms of record schemas, available indexes and so on. Sort of a cheat sheet. The original specification is here. searchRetrieve performs a database query and retrieves the matching datasets. The original specification is here. scan retrieves a list of matching search terms for later use in a searchRetrieve operation. The original specification is here. You are encouraged to peruse the linked specifications above to learn the general principles. The following sections build on this knowledge and describe the RefDB SRU interface with a focus on its peculiarities and limitations. We'll assume that your web server is set up to run the refdbsru CGI script using the following URL: http://mybox.com/cgi-bin/refdbsru/. The explain operation The explain operation is the simplest of all and a good start to introduce the syntax of the SRU interface. RefDB fully supports the explain operation. Any of the following URLs typed into your browser will run it: http://mybox.com/cgi-bin/refdbsru/ http://mybox.com/cgi-bin/refdbsru/? http://mybox.com/cgi-bin/refdbsru/?operation=explain&version=1.1 The URL part following the question mark ("?") in the third example is the search-part which consists of "parameter=value" pairs glued together with ampersands ("&"). Both parameters shown here are mandatory for all SRU operations as we'll see shortly. The query will return a XML document describing the capabilities of the RefDB SRU interface. The searchRetrieve operation The searchRetrieve operation is the one used to actually get hold of the reference data you're looking for. Your query is sent in the query parameter which is mandatory for this operation. A few examples: http://mybox.com/cgi-bin/refdbsru/?operation=searchRetrieve&version=1.1&recordSchema=mods&query=bib.name%3d%22Miller,Henry J.%22 http://mybox.com/cgi-bin/refdbsru/?operation=searchRetrieve&version=1.1&recordSchema=risx&query=dc.subject%3d%22circular dichroism%22+or+dc.subject%3d%22NMR%22 The first example requests the bibliographic data in MODS format. The query proper reads 'bib.name="Miller, Henry J."' and translates to a search for all references where a person with that name is listed as an author, editor, or series editor. The second example requests the data in risx format and searches all references with the keywords "circular dichroism" or "NMR". Both examples make use of percent encoding to make the URL string conform to the specs. This is further discussed below. The query parameter The query parameter describes the criteria of your database query and is a string using the Common Query Language. Conformance The RefDB SRU support conforms to CQL Level 2. The following general restrictions apply: RefDB does not support persistent result sets. Therefore, the resultSetTTL request parameter is meaningless, and it is not possible to reference a result set in a subsequent query. RefDB does not support XPath expressions to modify the results. Therefore the recordXPath request parameter is not honored. You can of course apply any XPath expressions on the client side using an appropriate processor. Sorting is currently not supported, and the sortKeys parameter is not applicable. Data will always be sorted by ID The recordPacking parameter is not supported. Records are always returned as XML. RefDB does not support relation modifiers and boolean modifiers in CQL queries. prox is not supported as a boolean operator. The relation encloses is not supported The support for regular expressions ("masking" in CQL) depends on the database backend. Most notably, anchoring is not supported by SQLite and SQLite3. Defaults If a query or a query part does not specify an index and a relation, RefDB looks for the term in the author, keyword, and title indexes: http://mybox.com/cgi-bin/refdbsru/?operation=searchRetrieve&version=1.1&query=cat This query will try to find references that contain the string "cat" in either the title, a keyword, or an author name. Context sets RefDB supports the context sets Dublin Core (dc) and the not yet officially released CQL Bibliographic Searching (bib). The following table lists the relationship of the indexes defined in these context sets with the RefDB fields. RefDB of course implicitly also supports the cql context set. Context sets dc index bib index RefDB field search/scan? description title title TX y/n item titles seriesTitle T3 y/n series title titleAbbrev JA y/y journal title, abbreviated creator, contributor name, namePersonal, nameCorporate AX y/y authors and editors subject, coverage subject KW y/y keywords date dateIssued PY y/n publication date volume VL y/n periodical volume issue IS y/n periodical issue startPage SP y/n start page endPage EP y/n end page publisher PB y/n publisher
Encoding As you may have noticed, it is necessary to percent-encode a few special characters in the parameter values. E.g. the equal sign ("=") assigns the values to the parameters and does not have to be encoded. However, equal signs within the CQL query string (which is the value of the query parameter) must be percent-encoded. If you use a dedicated client to run your queries, you should not have to care about these conversions. If you use a web-browser or a similar device, you may find the following conversion table useful: Percent-encoding special characters replace with replace with : %3a / %2f ? %3f # %23 [ %5B ] %5D @ %40 ! %21 $ %24 & %26 ' %27 ( %28 ) %29 * %2a + %2b , %2c ; %3b = %3d % %25 " %22
Schemas RefDB can return the datasets using two different XML schemas which you can request with the recordSchema parameter: MODS MODS is a schema for bibliographic data in library applications. Use 'mods' as the parameter value. The returned datasets will use 'mods' as the namespace prefix. MODS is the default if you do not specify a schema. risx This is RefDB's default XML input and output format. Use 'risx' as the parameter value to request risx. The datasets will use 'risx' as the namespace prefix. Databases SRU assumes that the base URL of the SRU service (the one you enter to get an explain response) corresponds to one database. Instead of using several copies of the CGI script to service more than one database, refdbsru allows to specify the name of a database in the additional path information of the URL. Compare the following (pseudo-)URLs: http://myserver.com/cgi-bin/refdbsru/?<query> http://myserver.com/cgi-bin/refdbsru/foo?<query> The first URL will use the default database. The second URL will use the database "foo" instead. The database name goes between the slash that follows the CGI script name and the question mark that opens the query string.
The scan operation The purpose of the scan operation is to provide a matching list of query terms, along with the number of references each term would retrieve. This is similar to browsing through a stack of library cards with subjects or author names on them. The RefDB SRU service allows to scan the following database fields: keywords (bib.subject) http://mybox.com/cgi-bin/refdbsru/?operation=scan&version=1.1&scanClause=bib.subject%3d%22dichroism%22 author names (bib.name) http://mybox.com/cgi-bin/refdbsru/?operation=scan&version=1.1&scanClause=bib.name%3d%22Henry J.%22 journal abbreviations (bib.titleAbbrev)
refdb-1.0.2/doc/RefDB.7.xml000644 001750 001750 00000022636 12255422336 016035 0ustar00markusmarkus000000 000000 2005/10/16 RefDB 7 2005/10/16 RefDB Manual RefDB a set of tools to manage bibliographic references, notes, and bibliographies for markup languages Description General Features RefDB is a reference/notes database and bibliography tool for SGML, XML, and LaTeX documents. RefDB is mainly implemented in C, with a few Perl scripts inbetween, as well as shell scripts as "glue". It can be compiled on all platforms with a decent C compiler (a small amount of porting may be required). It builds and runs out of the box on Linux, FreeBSD, NetBSD, Solaris, OSX, Darwin, and Windows/Cygwin. RefDB is modular and accessible. You can plug in a variety of database engines to store your data, and you can choose between a variety of interfaces for interactive work. You can use RefDB in your projects through shell scripts or from Perl programs. The RefDB handbook (more than 300 printed pages) helps you to get RefDB up and running quickly and explains how to use the software for both administrators and users in great detail. In addition there is a tutorial targeted at plain users. Application Design RefDB uses a SQL database engine to store the references, notes, and the bibliography styles. Choose either an external database server for optimum performance and flexibility, or an embedded database engine for convenience (see below for supported database engines). Both reference and bibliography style databases use the relational features of SQL databases extensively to consolidate information and to save storage space. RefDB employs a three-tier architecture with lots of flexibility: clients, an application server that can run as a daemon, and the database server. If you prefer the embedded SQL engine, there'll be a two-tier setup. In both cases, all tiers may run on a single workstation for individual use. The application server can generate log messages to monitor its operation. RefDB contains two standard interfaces: a command line interface for terminal addicts and for use in scripts, and a PHP-based web interface for a more visual approach. In addition, both Emacs and Vim users can access RefDB from the editing environment they're used to. Finally, there is also a Perl client module to integrate RefDB functionality into your own Perl programs. Reference and Notes Management The main input format for bibliographic data is RIS which can be generated and imported by all major reference databases on Windows (Reference Manager, EndNote and the like). An XML representation of RIS using the risx DTD is also supported as a native format. The latter is well suited as a means to import SGML or XML bibliographic data. Import filters are provided for Medline (tagged and XML), BibTeX, MARC, and DocBook. The data can be retrieved as simple text, formatted as HTML, formatted as a DocBook bibliography element (SGML or XML), formatted as a TEI listBibl element (XML), formatted as MODS (XML), formatted as BibTeX reference list, or formatted as RIS or risx files. All character encodings supported by your platform can be used both for data input and for data export. This includes European character sets like Latin-1 and of course Unicode. Extended notes can be linked to one or more references, authors, periodicals, or keywords to create topics or material collections. These are more powerful and flexible than folder systems and the like. The query language is fairly simple yet powerful. You can use booleans to combine queries on any combination of fields. You can use brackets to group queries. You can use Unix-style regular expressions to formulate advanced queries. Bibliographies Formatted bibliographies can be created automatically from DocBook SGML/XML and TEI XML documents. This does not require any changes or extensions to the DTDs. RefDB can also be integrated as a data source into the LaTeX/BibTeX workflow. RefDB is extensible in terms of the supported document types: support for new document types can be added without hacking the tool itself (you only need to hack stylesheets) Citation and reference styles can be defined in XML to match the weirdest requirements of journals and publishers. Sophisticated shell scripts and makefiles take care of the document transformations. The whole process is transparent to the user as all he needs to do is e.g. type make pdf to turn his document into a PDF file with formatted citations and bibliographies. Networking Capabilities Due to the client/server design, RefDB is very well suited as a shared reference database for a workgroup or a department. However, it runs just fine on a single standalone workstation. Users can share databases and still have their personal reference lists. They can share their notes or keep them private on a per-note base. Concurrent read and write access of several users is supported. There is no need to restrict access of other users to read-only. However, if your database engine supports access control (MySQL and PostgreSQL), you can restrict access of some users to read-only. A simple method to access electronic offprints (e.g. in PDF or PostScript format) is provided in the HTML output and in the web interface. This also works across networks using mounted shares. Supported Database Servers RefDB versions 0.9 and later employ the libdbi database abstraction library to provide support for different SQL database engines. Currently the following external SQL database servers are supported: MySQL PostgreSQL The following embedded database engines are supported: SQLite (versions 2.x and 3.x) See also refdbd (1), refdba (1), refdbc (1), refdbbib (1), bib2ris (1), db2ris (1), en2ris (1), marc2ris (1), med2ris (1), eenc (1), refdb-backup (1), refdb-ms (1), refdb-restore (1), refdbjade (1), refdbnd (1), refdbxml (1), refdbctl (1), refdb (8). RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html> RefDB on the web <http://refdb.sourceforge.net/> Author RefDB was originally written by Markus Hoenicka <markus@mhoenicka.de>. For a list of current authors, see the file AUTHORS. refdb-1.0.2/doc/bib2ris.1.xml000644 001750 001750 00000050364 12255415627 016445 0ustar00markusmarkus000000 000000 2005-10-16 bib2ris 1 2006-07-23 RefDB Manual bib2ris bib2ris-utf8 converts bibtex bibliographic data to the RIS format bib2ris -e log-destination -h -j -l log-level -L log-file -q -s separator -v -y confdir file bib2ris-utf8 -e log-destination -h -j -l log-level -L log-file -q -s separator -v -y confdir file Description bib2ris converts BibTeX bibliography files into RIS files. Latex commands, including non-ASCII characters written as commands, are preserved in the output. Importing the output of the bib2ris utility directly into RefDB is useful only if you use the data exclusively for LaTeX. bib2ris-utf8 is a variant which converts foreign characters to UTF-8 and strips all other LaTeX commands by means of the refdb_latex2utf8txt (1) tool. The output of bib2ris-utf8 is the preferred format for import into RefDB as it is suitable for both LaTeX and SGML/XML bibliographies. Unfortunately the concepts underlying BibTeX and RIS bibliographic data are quite different so that BibTeX data do not readily lend themselves to a clean conversion to the RIS format. This is not meant as an excuse to provide a bad filter but you should be aware that a few compile-time assumptions have to be made in order to get reasonable results. In any case, as the data models differ considerably, a loss-free round-trip conversion between the two data types is not possible: If you convert a BibTeX bibliography file to RIS and then back, the result will differ considerably from your input. The following considerations apply to the data import into RefDB and the data export from RefDB: BibTeX input data that are not written in UTF-8, that use formatting commands like font name, weight, or posture specifications, or that use LaTeX commands to write foreign and special characters should always be converted with bib2ris-utf8. BibTeX output data will have the LaTeX command characters properly escaped. The data will use the default encoding of your reference database unless you specifically request a different encoding with the getref command or with the refdbib tool. Keep in mind that recent LaTeX installations can work with UTF-8 data using the following incantation in the prolog, allowing the easiest support for all kinds of foreign characters: \usepackage[utf8]{inputenc} Options log-destination log-destination can have the values 0, 1, or 2, or the equivalent strings stderr, syslog, or file, respectively. This value specifies where the log information goes to. 0 (zero) means the messages are sent to stderr. They are immediately available on the screen but they may interfere with command output. 1 will send the output to the syslog facility. Keep in mind that syslog must be configured to accept log messages from user programs, see the syslog(8) man page for further information. Unix-like systems usually save these messages in /var/log/user.log. 2 will send the messages to a custom log file which can be specified with the option. Displays help and usage screen, then exits. Force bib2ris to use JO RIS fields in all cases. If this option is not used, bib2ris tries to infer whether a journal name is an abbreviation or not. If the string contains at least one period, JO will be used, otherwise JF will be used. log-level Specify the priority up to which events are logged. This is either a number between 0 and 7 or one of the strings emerg, alert, crit, err, warning, notice, info, debug, respectively (see also Log level definitions). disables logging completely. A low log level like 0 means that only the most critical messages are logged. A higher log level means that less critical events are logged as well. 7 will include debug messages. The latter can be verbose and abundant, so you want to avoid this log level unless you need to track down problems. log-file Specify the full path to a log file that will receive the log messages. Typically this would be /var/log/refdba. Start without reading the configuration files. The client will use the compile-time defaults for all values that you do not set with command-line switches. separator Specify the delimiter which separates individual keywords in a non-standard keyword field. Use the string spc for whitespace-separated lists (spaces and tabs). Prints version and copyright information, then exits. confdir Specify the directory where the global configuration files are Note: By default, all RefDB applications look for their configuration files in a directory that is specified during the configure step when building the package. That is, you don't need the option unless you use precompiled binaries in unusual locations, e.g. by relocating a rpm package. file If used, this parameter denotes the names of one or more bibtex files. If no file is specified, bib2ris tries to read the data from stdin. Output is always sent to stdout. Diagnostics The exit code of bib2ris indicates what went wrong in general (the details can be found in the log output). The code is the sum of the following error values: 1 general error; includes out of memory situations and invalid command-line options 2 incomplete entry (at least one essential field in an entry was missing) 4 unknown field name 8 unknown publication type 16 invalid BibTeX->RIS type mapping 32 parse error; includes file access errors Configuration bib2ris evaluates the file bib2risrc to initialize itself. bib2risrc Variable Default Comment logfile /var/log/bib2ris.log The full path of a custom log file. This is used only if logdest is set appropriately. logdest 1 The destination of the log information. 0 = print to stderr; 1 = use the syslog facility; 2 = use a custom logfile. The latter needs a proper setting of logfile. loglevel 6 The log level up to which messages will be sent. A low setting (0) allows only the most important messages, a high setting (7) allows all messages including debug messages. -1 means nothing will be logged. abbrevfirst t If this option is set to "t", the first names of all authors and editors will be abbreviated to the initials. If set to "f", the first names will be used as they are found in the BibTeX bibliography file. listsep ; This is the delimiter which separates individual keywords in a non-standard keyword field. Use the string "spc" for whitespace-separated lists (spaces and tabs). forcejabbrev f If this is set to "t", journal names will be wrapped in RIS "JO" entries. If it is set to "f", bib2ris will use "JO" entries only if the journal name contains at least one period, otherwise it will use "JF". maparticle JOUR map the BibTeX article publication type to a RIS type mapbook BOOK map the BibTeX book publication type to a RIS type mapbooklet PAMP map the BibTeX booklet publication type to a RIS type mapconference CHAP map the BibTeX conference publication type to a RIS type mapinbook CHAP map the BibTeX inbook publication type to a RIS type mapincollection CHAP map the BibTeX incollection publication type to a RIS type mapinproceedings CHAP map the BibTeX inproceedings publication type to a RIS type mapmanual BOOK map the BibTeX manual publication type to a RIS type mapmastersthesis THES map the BibTeX mastersthesis publication type to a RIS type mapmisc GEN map the BibTeX misc publication type to a RIS type mapphdthesis THES map the BibTeX phdthesis publication type to a RIS type mapproceedings CONF map the BibTeX proceedings publication type to a RIS type maptechreport RPRT map the BibTeX techreport publication type to a RIS type mapunpublished UNPB map the BibTeX unpublished publication type to a RIS type nsf_xyz (none) You can specify an unlimited number of these entries to map non-standard BibTeX fields to RIS tags. The BibTeX field name in this variable has to be in lowercase, regardless of the case in your input data (bib2ris treats field names as case-insensitive). The two-letter RIS tag has to be in uppercase. E.g. to map your BibTeX "Abstract" field to the RIS "N2" tag, the entry would read: "nsf_abstract N2".
Data Processing This section provides a few hints about the data conversion itself and the BibTeX format requirements. The parsing of the input data is done by the btparse library. All limitations of that library apply to bib2ris as well. This applies very specifically to two hardcoded settings in btparse which, simply put, limit the size and complexity (in terms of macros) of an input file that btparse can handle. If you run into this kind of problem (I had to pull a 2 MB BibTeX bibliography from the net in order to verify this limit) you should increase the values of NUM_MACROS and STRING_SIZE in the source file macros.c and recompile the btparse library. All entry names and field names in the BibTeX input file are treated as case-insensitive, i.e. "BoOk" is the same as "book" and "AUTHOR" is the same as "aUthoR". The entries are checked for completeness. An error is generated if an entry lacks fields which are considered essential for the particular publication type. Non-standard fields can be imported in addition to the predefined BibTeX fields. Create an entry for each non-standard BibTeX field name that your input data use in your bib2ris configuration file. The data are handled differently based on the type of RIS field they are imported to. If the data are imported to the RIS fields AD, N1, or N2, which basically have an unlimited size, all occurrences of these fields will be concatenated into a single AD, N1, or N2 tag line, respectively. If the data are mapped to the RIS KW field, the string will be tokenized based on the list separator specified in the listsep configuration variable. Each token will be written as a separate KW tag line. A special case is the RIS pseudo-field "PY.day". Data imported to this tag are integrated as the day part in the publication date tag line "PY" (year and month, but not day, are standard BibTeX fields and are recognized by default). All other fields will be printed with their requested RIS tag. It is at the discretion of any RIS importing application to decide what to do with duplicate tag lines. Multiples are allowed for author tags (AU, A2, A3) and the keyword tag (KW). refdb will use the last occurrence of a tag line that does not allow multiple occurrences. Abbreviated journal names are detected only if they use periods. E.g. J. Biol. Chem. will be mapped to a "JO" RIS element whereas J Biol Chem will be (incorrectly) mapped to a "JF" element (Journal of Biological Chemistry would correctly end up here too). Spaces after periods are optional. To capture J Biol Chem in a "JO" element, use the command line option or the "forcejabbrev" configuration file variable. The mapping of BibTeX publication types (book, inproceedings...) to RIS types as specified in the configuration file is checked for valid RIS types. If an invalid RIS type is specified, an error is generated and the compile-time default is used instead. By default the first names of authors and editors are not abbreviated. If you wish you can configure bib2ris to abbreviate first and middle names. Files PREFIX/etc/refdb/bib2risrc The global configuration file of bib2ris. $HOME/.bib2risrc The user configuration file of bib2ris. See also RefDB (7), refdb_latex2utf8txt (1), db2ris (1), en2ris (1), marc2ris (1), med2ris (1). RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html> RefDB on the web <http://refdb.sourceforge.net/> Author bib2ris was written by Markus Hoenicka <markus@mhoenicka.de>.
refdb-1.0.2/doc/db2ris.1.xml000644 001750 001750 00000025516 12255417327 016276 0ustar00markusmarkus000000 000000 2005-10-16 db2ris 1 2005-10-16 RefDB Manual db2ris converts DocBook bibliographic data to the RIS format db2ris -a -e log-destination -h -L log-file -o file -O file -r reftype file Description db2ris converts DocBook bibliographic data into RIS files. The design and purpose of the DocBook bibliography information is too different from the RIS format to warrant a simple and straightforward conversion, let alone a bi-directional one. The DocBook bibliography definition allows for a lot of freedom how to encode your information. To accommodate as wide a range of uses and abuses of the bibliographic elements as possible, this import filter is implemented as a DSSSL stylesheet rather than as a C application. This allows you to quickly change or extend the stylesheet to adapt it to your needs. db2ris is a wrapper script which invokes OpenJade to do the actual transformation. Options Use full first- and othernames if they are present in the DocBook source. By default, all first- and othernames will be abbreviated. log-destination log-destination can have the values 0, 1, or 2, or the equivalent strings stderr, syslog, or file, respectively. This value specifies where the log information goes to. 0 (zero) means the messages are sent to stderr. They are immediately available on the screen but they may interfere with command output. 1 will send the output to the syslog facility. Keep in mind that syslog must be configured to accept log messages from user programs, see the syslog(8) man page for further information. Unix-like systems usually save these messages in /var/log/user.log. 2 will send the messages to a custom log file which can be specified with the option. Displays help and usage screen, then exits. log-file Specify the full path to a log file that will receive the log messages. Typically this would be /var/log/refdba. file Send output to file instead of to stdout. If file exists, its contents will be overwritten. file Send output to file instead of to stdout. If file exists, the output will be appended. reftype Set the default RIS reference type. This type will be used if db2ris cannot infer the reference type from the BiblioEntry element. file The names of one or more DocBook files. Configuration db2ris evaluates the file db2risrc to initialize itself. db2risrc Variable Default Comment logfile /var/log/db2ris.log The full path of a custom log file. This is used only if logdest is set appropriately. logdest 0 The destination of the log information. 0 = print to stderr; 2 = use a custom logfile. The latter needs a proper setting of logfile. authorlong f Set this to t if full first- and othernames should be used if possible. defaultreftype GEN The default RIS reference type will be used if a BiblioEntry element does not specify the type.
Data Processing We have to make a bunch of assumptions to arrive at a suitable output: db2ris will handle only raw (as opposed to cooked) bibliographic data. This basically means that you must encode all bibliographic data in BiblioEntry elements, not in BiblioMixed elements. db2ris discards all publication date information from the PubDate except the first 4 characters of #PCDATA so these should better be a 4-digit year. By default, the publication type is neither explicitly encoded in a BiblioEntry element nor can it be easily inferred. Therefore db2ris assumes that the BiblioEntry carry a role attribute with the RIS publication type as the value. If the attribute is missing, a default type is used instead. This means that you should add these attributes before the conversion in order to get useful RIS datasets (or fix the TY entries in the RIS file afterwards). DocBook does not have a special element to encode the name of a journal or magazine that published an article. Instead the same Title element is used as for the article title, a book title, or a series title. To distinguish between a journal or magazine name and real titles, the Title element encoding the journal name is assumed to be nested in a BiblioSet whose relation attribute is set to journal, pub, abbrev, or full (this more or less arbitrary list can of course be extended or changed, see below). The values abbrev and full furthermore decide whether the RIS tag JO or JF will be used. Modifying db2ris As previously stated, db2ris is implemented as a DSSSL stylesheet that can be easily and quickly adapted to your needs. It may be prudent to create copies of the script and modify these in order to adapt them for particular abuses of the DocBook bibliographic elements in various documents or data sources. This section briefly lists the functions which you would most likely want to change. reftype-heuristic This function attempts to infer the correct RIS publication type. titletype-heuristic This function gives a hint whether a Title element is used as a journal/magazine name or as an article title or book title. process-date This function creates a valid string for the RIS PY tag from the PubDate element. Files PREFIX/etc/refdb/db2risrc The global configuration file of db2ris. $HOME/.db2risrc The user configuration file of db2ris. See also RefDB (7), bib2ris (1), en2ris (1), marc2ris (1), med2ris (1). RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html> RefDB on the web <http://refdb.sourceforge.net/> Author db2ris was written by Markus Hoenicka <markus@mhoenicka.de>.
refdb-1.0.2/doc/eenc.1.xml000644 001750 001750 00000006241 12255416727 016020 0ustar00markusmarkus000000 000000 2005-10-16 eenc 1 2005-10-16 RefDB Manual eenc perform password encryption for RefDB clients eenc -p ABC-DE-FG-HI password Description RefDB(7) clients send passwords to refdbd(1) in an encrypted form. Programmers that implement custom clients in languages other than C or Perl may use this program to perform the password encryption if implementing the algorithm in the target language is too cumbersome. The program writes the encoded password to stdout. As the encoding algorithm is symmetrical, you can use this utility to encode plain text passwords as well as to decode encrypted passwords. The algorithm used by eenc is derived from the ENIGMA algorithm. Security is limited but should be sufficient for the purposes of a reference management software. Please see the RefDB manual (see below) for further information about the client-server protocol. Options ABC-DE-FG-HI The slot and rotor position string sent back by refdbd(1) during the first stage of the client-server protocol. ABC denotes which wheel goes into which slot, and the remaining digits encode the positions of the wheels in slots 0 through 2. password The plain-text password when encrypting, or the encoded password when decrypting. See also RefDB (7), refdbd (1). RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html> RefDB on the web <http://refdb.sourceforge.net/> Author eenc was written by Markus Hoenicka <markus@mhoenicka.de>. refdb-1.0.2/doc/en2ris.1.xml000644 001750 001750 00000024002 12255417262 016276 0ustar00markusmarkus000000 000000 2005-10-16 en2ris 1 2005-10-16 RefDB Manual en2ris converts EndNote bibliographic data to the RIS format en2ris -e logdest -f from-encoding -h -l loglevel -L logfile -o file -O file -q -t to-encoding -y path Description en2ris fixes the markup errors encountered in EndNote "RIS" output and writes RIS output to stdout. Options log-destination log-destination can have the values 0, 1, or 2, or the equivalent strings stderr, syslog, or file, respectively. This value specifies where the log information goes to. 0 (zero) means the messages are sent to stderr. They are immediately available on the screen but they may interfere with command output. 1 will send the output to the syslog facility. Keep in mind that syslog must be configured to accept log messages from user programs, see the syslog(8) man page for further information. Unix-like systems usually save these messages in /var/log/user.log. 2 will send the messages to a custom log file which can be specified with the option. from-encoding Select the input character encoding. Supported encodings are platform-dependent and can usually be found in iconv_open(3). If no encodings are specified, ISO-8859-1 aka Latin-1 is assumed. Displays help and usage screen, then exits. log-level Specify the priority up to which events are logged. This is either a number between 0 and 7 or one of the strings emerg, alert, crit, err, warning, notice, info, debug, respectively (see also Log level definitions). disables logging completely. A low log level like 0 means that only the most critical messages are logged. A higher log level means that less critical events are logged as well. 7 will include debug messages. The latter can be verbose and abundant, so you want to avoid this log level unless you need to track down problems. log-file Specify the full path to a log file that will receive the log messages. Typically this would be /var/log/refdba. file Send output to file. If file exists, its contents will be overwritten. file Send output to file. If file exists, the output will be appended. Start without reading the configuration files. The client will use the compile-time defaults for all values that you do not set with command-line switches. to-encoding Select the output character encoding. Supported encodings are platform-dependent and can usually be found in iconv_open(3). If no encodings are specified, UTF-8 is assumed. confdir Specify the directory where the global configuration files are Note: By default, all RefDB applications look for their configuration files in a directory that is specified during the configure step when building the package. That is, you don't need the option unless you use precompiled binaries in unusual locations, e.g. by relocating a rpm package. Configuration en2ris evaluates the file en2risrc to initialize itself. en2risrc Variable Default Comment outfile (none) The default output file name. outappend t Determines whether output is appended (t) to an existing file or overwrites (f) an existing file. from_enc ISO-8859-1 The character encoding of the input data to_enc ISO-8859-1 The character encoding of the output data logfile /var/log/med2ris.log The full path of a custom log file. This is used only if logdest is set appropriately. logdest 1 The destination of the log information. 0 = print to stderr; 1 = use the syslog facility; 2 = use a custom logfile. The latter needs a proper setting of logfile. loglevel 6 The log level up to which messages will be sent. A low setting (0) allows only the most important messages, a high setting (7) allows all messages including debug messages. -1 means nothing will be logged.
Data Processing en2ris fixes a couple of problems found in RIS data exported from EndNote. The main issues are the incomplete date formats, the export of page ranges into a single "SP" tag line, and the export of keywords as a list into a single "KW" tag line. en2ris does not validate the input files. That is, the input files must stick to the rules of the data sources, otherwise the conversion results are not predictable. Files PREFIX/etc/refdb/en2risrc The global configuration file of en2ris. $HOME/.en2risrc The user configuration file of en2ris. See also RefDB (7), bib2ris (1), db2ris (1), marc2ris (1), med2ris (1). RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html> RefDB on the web <http://refdb.sourceforge.net/> Author en2ris was written by Markus Hoenicka <markus@mhoenicka.de>.
refdb-1.0.2/doc/marc2ris.1.xml000644 001750 001750 00000032741 12255417477 016637 0ustar00markusmarkus000000 000000 2005-10-16 marc2ris 1 2005-10-16 RefDB Manual marc2ris converts MARC bibliographic data to the RIS format marc2ris -e log-destination -h -l log-level -L log-file -m -o outfile -O outfile -t input_type -u t|f file Description marc2ris attempts to extract the information useful to RefDB from MARC datasets. MARC (Machine Readable Catalogue Format) is a standard originating from the 1960s and is widely used by libraries and bibliographic agencies. Most libraries that offer Z39.50 access can provide the records in at least one MARC format (like with most other "standards" there's a couple to choose from). Currently the following MARC dialects are supported: MARC21 This is an attempt to consolidate existing MARC variants (mainly USMARC and CANMARC) and will most likely be the format supported by all libraries in the near future. The format is described on the Library of Congress MARC pages. UNIMARC This is the European equivalent of a standardization attempt. The specification can be found here. UKMARC This format is fairly close to the USMARC variant and is mainly used by libraries in the United Kingdom and in Ireland. Libraries supporting this format may switch to MARC21 in the future. Unfortunately there is no online description of this format, but this PDF document describes the main differences between USMARC and UKMARC. Options By default the script reads USMARC data from stdin and sends RIS data to stdout. log-destination log-destination can have the values 0, 1, or 2, or the equivalent strings stderr, syslog, or file, respectively. This value specifies where the log information goes to. 0 (zero) means the messages are sent to stderr. They are immediately available on the screen but they may interfere with command output. 1 will send the output to the syslog facility. Keep in mind that syslog must be configured to accept log messages from user programs, see the syslog(8) man page for further information. Unix-like systems usually save these messages in /var/log/user.log. 2 will send the messages to a custom log file which can be specified with the option. Displays help and usage screen, then exits. log-level Specify the priority up to which events are logged. This is either a number between 0 and 7 or one of the strings emerg, alert, crit, err, warning, notice, info, debug, respectively (see also Log level definitions). disables logging completely. A low log level like 0 means that only the most critical messages are logged. A higher log level means that less critical events are logged as well. 7 will include debug messages. The latter can be verbose and abundant, so you want to avoid this log level unless you need to track down problems. log-file Specify the full path to a log file that will receive the log messages. Typically this would be /var/log/refdba. Switch on additional MARC output. The output data will be the RIS output interspersed with the source MARC data used to generate the output. This is useful to fix conversion errors manually. file Send output to file. If file exists, its contents will be overwritten. file Send output to file. If file exists, the output will be appended. input_type Specify the MARC input type. The default is MARC21. Other available types are UNIMARC and UKMARC. Request Unicode output if set to "t" (this is the default). marc2ris attempts to convert the input data into Unicode (unless the dataset explicitly states that it already uses Unicode). If the conversion does not seem to work, set this to "f" as some MARC variants do not state the character encoding explicitly. Configuration marc2ris evaluates the file marc2risrc to initialize itself. marc2risrc Variable Default Comment outfile (none) The default output file name. outappend t Determines whether output is appended (t) to an existing file or overwrites (f) an existing file. unmapped t If set to t, unknown tags in the input data will be output following a <unmapped> tag; the resulting data can be inspected and then be sent through sed to strip off these additional lines. If set to f, unknown tags will be gracefully ignored. logfile /var/log/med2ris.log The full path of a custom log file. This is used only if logdest is set appropriately. logdest 1 The destination of the log information. 0 = print to stderr; 1 = use the syslog facility; 2 = use a custom logfile. The latter needs a proper setting of logfile. loglevel 6 The log level up to which messages will be sent. A low setting (0) allows only the most important messages, a high setting (7) allows all messages including debug messages. -1 means nothing will be logged.
Data Processing The purpose of the MARC format is entirely different from the purpose of the RIS format, so you shouldn't be too surprised that the import of MARC data is somewhat rough at the edges. The filter apparently deals fine with quite a lot of datasets, but the following shortcomings are known (and more are likely to be discovered by the interested reader): Some fields, like 846, are currently ignored completely. This, of course, is bound to change. Author names specified in the natural order, i.e. something like First Middle Last, are not normalized due to the problems with multiple middle or last names. Author names in the inverse order, i.e. something like Last, First Middle, are normalized correctly in most cases. Handling of non-European names is a matter of trial and error. Character set handling is somewhat limited. Only the unaltered input character encoding or UTF-8 are available for the output data. That said, there is still some hope. The command line option switches on additional MARC output. That is, the generated output will contain interspersed lines that show the contents of the original MARC fields used to generate the following RIS line or lines. For example, the following output snippet shows how marc2ris generated the author lines from the MARC input: <marc>empty author field (100) <marc>:Author(Ind1): 1 <marc>:Author($a): Ershov, A. P. <marc>:Author($b): <marc>:Author($c): <marc>:Author(Ind1): 1 <marc>:Author($a): Knuth, Donald Ervin, <marc>:Author($b): <marc>:Author($c): AU - Ershov,A.P. AU - Knuth,Donald Ervin If you feel marc2ris does not translate your data appropriately, the easiest way might be to use the switch and redirect the output into a file. Then you can analyze the situation and fix the RIS lines as you see fit. Finally you can strip the MARC lines off with a command like: ~$ grep -v "<marc>" < withmarc.ris > womarc.ris Files PREFIX/etc/refdb/marc2risrc The global configuration file of marc2ris. $HOME/.marc2risrc The user configuration file of marc2ris. See also RefDB (7), bib2ris (1), db2ris (1), en2ris (1), med2ris (1). RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html> RefDB on the web <http://refdb.sourceforge.net/> Author marc2ris was written by Markus Hoenicka <markus@mhoenicka.de>.
refdb-1.0.2/doc/med2ris.1.xml000644 001750 001750 00000026573 12255417554 016464 0ustar00markusmarkus000000 000000 2005-10-16 med2ris 1 2005-10-16 RefDB Manual med2ris converts Medline/Pubmed bibliographic data to the RIS format med2ris -e logdest -f from-encoding -h -i -l loglevel -L logfile -o file -O file -q -t to-encoding -T type -y path Description med2ris converts Pubmed reference data into RIS data. The converter understands both the tagged Pubmed format (which superficially resembles RIS) and the XML format according to the PubMedArticle DTD. In most cases med2ris is able to automatically detect the input data type. Options log-destination log-destination can have the values 0, 1, or 2, or the equivalent strings stderr, syslog, or file, respectively. This value specifies where the log information goes to. 0 (zero) means the messages are sent to stderr. They are immediately available on the screen but they may interfere with command output. 1 will send the output to the syslog facility. Keep in mind that syslog must be configured to accept log messages from user programs, see the syslog(8) man page for further information. Unix-like systems usually save these messages in /var/log/user.log. 2 will send the messages to a custom log file which can be specified with the option. from-encoding Select the input character encoding. Supported encodings are platform-dependent and can usually be found in iconv_open(3). If no encodings are specified, ISO-8859-1 aka Latin-1 is assumed. Displays help and usage screen, then exits. Output additional information about unknown or unused tags. Mainly useful to debug the conversion if the input format has changed. log-level Specify the priority up to which events are logged. This is either a number between 0 and 7 or one of the strings emerg, alert, crit, err, warning, notice, info, debug, respectively (see also Log level definitions). disables logging completely. A low log level like 0 means that only the most critical messages are logged. A higher log level means that less critical events are logged as well. 7 will include debug messages. The latter can be verbose and abundant, so you want to avoid this log level unless you need to track down problems. log-file Specify the full path to a log file that will receive the log messages. Typically this would be /var/log/refdba. file Send output to file. If file exists, its contents will be overwritten. file Send output to file. If file exists, the output will be appended. Start without reading the configuration files. The client will use the compile-time defaults for all values that you do not set with command-line switches. to-encoding Select the output character encoding. Supported encodings are platform-dependent and can usually be found in iconv_open(3). If no encodings are specified, ISO-8859-1 aka Latin-1 is assumed. type Overrides the automatic type detection. Allowed values for type are "tag" and "xml" for the tagged Pubmed format and the XML Pubmed format, respectively. confdir Specify the directory where the global configuration files are Note: By default, all RefDB applications look for their configuration files in a directory that is specified during the configure step when building the package. That is, you don't need the option unless you use precompiled binaries in unusual locations, e.g. by relocating a rpm package. Configuration med2ris evaluates the file med2risrc to initialize itself. med2risrc Variable Default Comment outfile (none) The default output file name. outappend t Determines whether output is appended (t) to an existing file or overwrites (f) an existing file. unmapped t If set to t, unknown tags in the input data will be output following a <unmapped> tag; the resulting data can be inspected and then be sent through sed to strip off these additional lines. If set to f, unknown tags will be gracefully ignored. from_enc ISO-8859-1 The character encoding of the input data to_enc ISO-8859-1 The character encoding of the output data logfile /var/log/med2ris.log The full path of a custom log file. This is used only if logdest is set appropriately. logdest 1 The destination of the log information. 0 = print to stderr; 1 = use the syslog facility; 2 = use a custom logfile. The latter needs a proper setting of logfile. loglevel 6 The log level up to which messages will be sent. A low setting (0) allows only the most important messages, a high setting (7) allows all messages including debug messages. -1 means nothing will be logged.
Data Processing Keywords with multiple MeSH subheadings are split into multiple keywords with one MeSH subheading each. This simplifies searching for MeSH subheadings greatly. med2ris does not validate the input files. That is, the input files must stick to the rules of the data sources, otherwise the conversion results are not predictable. Files PREFIX/etc/refdb/med2risrc The global configuration file of med2ris. $HOME/.med2risrc The user configuration file of med2ris. See also RefDB (7), bib2ris (1), db2ris (1), en2ris (1), marc2ris (1). RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html> RefDB on the web <http://refdb.sourceforge.net/> Author med2ris was written by Markus Hoenicka <markus@mhoenicka.de>.
refdb-1.0.2/doc/refdb-backup.1.xml000644 001750 001750 00000007766 12255417633 017445 0ustar00markusmarkus000000 000000 refdb-backup 1 February 26, 2005 RefDB Manual refdb-backup RefDB tool: back up RefDB references, notes and styles refdb-backup user pwd format dir Description refdb-backup is a tool for backing up RefDB(7) references, notes and styles. A gzipped tarfile of the form 'refdb_backup_YYYYMMDD_HHMM.tar.gz' is created. While users can restore data from the backup archive manually, it is expressly designed to restored by the companion tool refdb-restore. Options dir directory in which to place backup file (default: current directory) format references storage format ('ris' (default)|'risx') print help and exit silent, no screen feedback user username for RefDB clients (refdba, refdbc) not required if clients are configured for automatic access pwd password for RefDB clients (refdba, refdbc) not required if clients are configured for automatic access See also RefDB (7), refdb-restore (1), refdba (1), refdbc (1). RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html> RefDB on the web <http://refdb.sourceforge.net/> Author refdb-backup was written by David Nebauer <david@nebauer.org> This manual page was written by David Nebauer <david@nebauer.org> for the Debian project (but may be used by others). refdb-1.0.2/doc/refdb-ms.1.xml000644 001750 001750 00000012246 12255420004 016566 0ustar00markusmarkus000000 000000 2005-07-17 refdb-ms 1 2005-07-17 RefDB Manual refdb-ms a console-based style generator for RefDB refdb-ms Description refdb-ms is a console-based style generator for RefDB. In short, this utility consists of a loop in which you are asked to: select an element from a list of elements allowed in that part of the style, enter or select appropriate values for mandatory attributes, select optional attributes for that element and enter their values, select an element from a list of elements ... This process ends when you have exhausted the DTD. Every time you are presented with a list of elements you have the option of selecting help. Doing so will present a screen with a summary of each element on the list. The same thing happens when you are presented with a list of attributes. When an attribute or element is required by the DTD this utility will select it automatically. For some objects you will not need to provide input and so this utility will create the object(s) automatically. This can be disconcerting at first. Please read the console feedback carefully. Whenever you are asked to enter or select a value for an attribute or element, you are given a brief prompt explaining the purpose of the element or attribute. After each element is added to the style you are presented with a "progress report" showing the (major) elements. It may take a little while to understand this feedback. As you add elements they will be appended to the report. When you complete a major element, such as a PUBTYPE or AUTHORLIST, however, its subsidiary elements are no longer displayed -- they are "folded". This saves space and makes it easier to quickly understand where in the style you are at that point in time. As you become more familiar with the structure of the style DTD this display will become increasingly useful. At certain times within PUBTYPE, AUTHORONLY, YEARONLY and INTEXTDEF elements you are able to delete the previous "major" element. "Major" elements are those corresponding to ris fields. These elements may contain other elements. For example, deleting an AUTHORLIST element will delete all the children elements of that author list style. You can view the complete element before deletion occurs. When you select some elements (in general, those corresponding to ris fields) you will be given an opportunity to copy the most recently entered element of that type. If you choose to copy, all attributes and sub-elements will be copied. This can save you a lot of time if, for example, your author lists will always have the same formatting. After you have created your style this utility will save it to a disk file. It will also generate a brief summary of it in html format. This summary can be of great help when entering references in your reference database. This utility will then offer to upload the style to RefDB. There is no foreseeable way in which this operation could damage your reference data, but you use it at your own risk. Files RefDB::Makestyle This module is required by refdb-ms. It is available as a tar.gz archive or a Debian package from the RefDB website <refdb.sourceforge.net>. See also RefDB::Makestyle (3). RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html> RefDB on the web <http://refdb.sourceforge.net/> Author refdb-ms was written by David Nebauer <david@nebauer.org>. This manual page was written by David Nebauer <david@nebauer.org> for the Debian project (but may be used by others). refdb-1.0.2/doc/refdb-restore.1.xml000644 001750 001750 00000006627 12255420140 017641 0ustar00markusmarkus000000 000000 refdb-restore 1 February 26, 2005 RefDB Manual refdb-restore RefDB tool: restore RefDB references, notes and styles refdb-restore -h -u user -w pwd backup-archive Description refdb-restore is a tool for restoring RefDB(7) references, notes and styles. The backup archive must have been created by the companion tool refdb-backup. Before performing the restore all reference databases must be removed (archived) from /var/lib/refdb/db/. The system database in that directory ('refdb') must be recreated from the sql dump (see Manual). Options print help and exit user username for RefDB clients (refdba, refdbc) not required if clients are configured for automatic access pwd password for RefDB clients (refdba, refdbc) not required if clients are configured for automatic access See also RefDB (7), refdb-backup (1), refdba (1), refdbc (1). RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html> RefDB on the web <http://refdb.sourceforge.net/> Author refdb-restore was written by David Nebauer <david@nebauer.org> This manual page was written by David Nebauer <david@nebauer.org> for the Debian project (but may be used by others). refdb-1.0.2/doc/refdb.8.xml000644 001750 001750 00000006024 12255422417 016167 0ustar00markusmarkus000000 000000 2005-10-15 refdb 8 2005-10-15 RefDB Manual refdb refdb.sh refdbd startup script refdb start stop restart force-reload Description refdb is a wrapper script for refdbd(1) to be used as a rc(8) or init(8) control script. The script is called refdb.sh on BSD-style systems. See the documentation of your system how to integrate refdb into the start process to run refdbd(1) automatically as a daemon. Options start Starts the refdbd(1) daemon stop Stops the refdbd(1) daemon restart Restarts the refdbd(1) daemon force-reload Causes the refdbd(1) daemon to read its configuration file See also RefDB (7), refdbd (1) refdbctl (1). RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html> RefDB on the web <http://refdb.sourceforge.net/> Author refdb was written by Markus Hoenicka <markus@mhoenicka.de>. refdb-1.0.2/doc/refdba.1.xml000644 001750 001750 00000213001 12255420667 016321 0ustar00markusmarkus000000 000000 2005-10-15 refdba 1 2005-10-15 RefDB Manual refdba the administration client of RefDB Interactive mode: refdba pager-command log-destination stdin IP-address log-level log-file port time name password confdir Non-Interactive mode: Batch mode: refdba command pager-command log-destination stdin IP-address log-level log-file port time name password confdir Description refdba is a command-line client providing the commands to administer RefDB(7) databases, users, and styles. refdba can be started in an interactive mode, providing a command prompt. Type ? or help to see a list of available commands. Alternatively you can start refdba in non-interactive mode. refdba will execute the requested command and return. In this mode refdba will accept input on stdin for a variety of commands, allowing Unix piping. Options pager-command The command line of the pager that is to be used. Instead of a pager you can of course specify any valid command that accepts data on stdin. Use "stdout" to request data output to stdout. This is the default, but you may want to specify it on the command line if you need to temporarily override a default pager setting in your configuration file. command The command to be run in non-interactive mode. You can supply all options and parameters that the command accepts on the refdba command line. log-destination log-destination can have the values 0, 1, or 2, or the equivalent strings stderr, syslog, or file, respectively. This value specifies where the log information goes to. 0 (zero) means the messages are sent to stderr. They are immediately available on the screen but they may interfere with command output. 1 will send the output to the syslog facility. Keep in mind that syslog must be configured to accept log messages from user programs, see the syslog(8) man page for further information. Unix-like systems usually save these messages in /var/log/user.log. 2 will send the messages to a custom log file which can be specified with the option. stdin Read data from stdin. refdbc usually knows when it should read from stdin. However, a few commands use data supplied in the command line but also allow to read from a file. Use this option to force refdbc to read from stdin in addition to values supplied on the command line. Displays help and usage screen, then exits. IP-address Set the IP address of the box which is running the application server refdbd(1). Instead of the IP address you can also specify the hostname as long as it can be properly resolved by your system. log-level Specify the priority up to which events are logged. This is either a number between 0 and 7 or one of the strings emerg, alert, crit, err, warning, notice, info, debug, respectively (see also Log level definitions). disables logging completely. A low log level like 0 means that only the most critical messages are logged. A higher log level means that less critical events are logged as well. 7 will include debug messages. The latter can be verbose and abundant, so you want to avoid this log level unless you need to track down problems. log-file Specify the full path to a log file that will receive the log messages. Typically this would be /var/log/refdba. port Set the port of the box which is running the application server. Start without reading the configuration files. The client will use the compile-time defaults for all values that you do not set with command-line switches. Useful for debugging config files. time Set the timeout for client/application server dialogue in seconds. A connection with unsuccessful read or write attempts will be considered as dead and taken down after this amount of time has elapsed. name Set the username for the database access. Note: This username need not be identical to the login name of the user. This is the username required to access the database server. Prints version and copyright information, then exits. Switches to verbose mode. password Set the password for the database access. Note: This password need not be identical to the login password of the user. This is the password required to access the database server. Send passwords unencrypted. confdir Specify the directory where the global configuration files are Note: By default, all RefDB applications look for their configuration files in a directory that is specified during the configure step when building the package. That is, you don't need the option unless you use precompiled binaries in unusual locations, e.g. by relocating a rpm package. Diagnostics The exit code is 0 if all went fine. It will be 1 if the command (when run in batch mode) or the last command (when run in interactive mode) returned an error, or if there was a general error condition during startup like a lack of available memory. Configuration refdba evaluates the refdbarc configuration file at startup to initialize itself. refdbarc Variable Default Comment logfile /var/log/refdba.log The full path of a custom log file. This is used only if logdest is set appropriately. If you start refdba from the command line as a regular user, you should specify a file that you have write access to (you may not be allowed to create /var/log/refdb.log or write to this file as a regular user). logdest 2 The destination of the log information. 0 = print to stderr (this is mainly intended for debugging, as it may visually interfere with command output); 1 = use the syslog facility; 2 = use a custom logfile. The latter needs a proper setting of logfile. loglevel 6 The log level up to which messages will be logged. A low setting (0) allows only the most important messages, a high setting (7) allows all messages including debug messages. -1 means nothing will be logged. pager stdout The command line of a pager that accepts the output of refdb on stdin to allow scrolling and other nifty things. stdout sends the data to stdout. passwd * The password which is used for authentication with the database server. It is potentially evil to store unencrypted passwords in disk files. At least make sure that the configuration file is not readable for anyone else. The default setting causes refdba to ask for your password interactively. port 9734 The port on which refdbd listens. Change this for all clients and the server if this value interferes with another program using this port. serverip 127.0.0.1 The IP address or hostname of the machine where refdbd runs. Use the default (localhost) address if the clients and refdbd run on the same machine. timeout 180 The timeout in seconds. After this time has elapsed, a stalled connection is taken down. Increase this value if you encounter frequent timeout errors due to high network traffic or refdbd overload. username login name The username which is used for authentication with the database server. This may be different from the login name of the user. verbose f Set this to t if you prefer verbose error messages. no_encrypt f If set to 't', passwords are transmitted unencrypted. The default is to encrypt passwords.
Commands All commands consist of a single word which specifies the command. This may be followed by arguments and/or switches. The general syntax rules of the getopts library apply. addstyle Synopsis addstyle command filename filename style-file Description Adds one or more bibliography style specifications from the input file(s). Options command Specifies a command that will receive the output instead of the default pager. This may be a different pager, any command that takes input on stdin, or the string stdout to send the data to stdout without using a pager. Displays the online help about the addstyle command. filename Write the output to filename instead of to stdout. filename Append the output to filename instead of writing it to stdout. style-file All other arguments are interpreted as the names of files containing style specifications. Example refdba: addstyle j.biol.chem.xml pharmacol.rev.xml This will add the style specifications contained in the files j.biol.chem.xml and pharmacol.rev.xml to the bibliography style database. adduser Synopsis adduser database host-IP password file username Description Grants access rights to a refdb database to the given users. Specify the database with the option. If a user is not yet known to the database server, refdb will create an account with the default access rights (=none). If you do not specify a password for the new user with the option (see below), the user will have access to the database server with the default password "refdb". In most cases this is not a good thing. A new user will automatically get access to the internal refdb database refdb. Some database engines like SQLite do not support access control. The adduser command is not supported with these engines and will just return an explanatory message. database Specifies the reference database for which the access rights should apply. file Reads a whitespace-separated list of usernames from file. Displays the online help about the adduser command. hostname hostname specifies the host the refdb application server runs on. If it runs on the same machine as the database server, you may specify localhost as hostname. Use % as hostname to allow access from all addresses except localhost. Otherwise, the hostname argument can be either a hostname, an IP address, or a subnet that specifies one or more computers to allow access from. You can add the same user several times with different hostnames. This option is only supported by MySQL. It is ignored if you use PostgreSQL as your database server. Please see the PostgreSQL documentation for help on how to manipulate host-based access control with the pg_hba.conf file. Use this option to grant read-only access for the user. By default, users are granted read/write access. Users with read-only access can basically only retrieve references and notes. password Set the password for a new user. The password is encrypted before transferring it to the application server. If the user already exists, his password will be changed accordingly. username All other arguments are interpreted as usernames. If neither a username argument nor an input file is specified, refdba attempts to read a whitespace-separated list of names from stdin. To force refdba to read from stdin in addition to explicitly named users, use the option. Examples refdba: adduser db1 newpassjim This will grant access to the database db1 for the new user jim. refdbd runs on the same computer as the database server (if you leave out the option, localhost is assumed). "jim" will have to provide "newpass" as a password when starting one of the refdb clients. refdba: adduser db1 mono.mycomp.com jim jane This will grant access to the database db1 for the users jim and jane. refdbd runs on the computer with the name "mono.mycomp.com". If "jim" and "jane" are already known to the database server, they will keep their existing passwords. If not, they will have to use the default password "refdb". Alternatives on sites with restricted database server access If you as the refdb administrator do not have GRANT permission on your database server, the adduser command is bound to fail. As a security-minded person your database administrator might refuse to run refdba regardless of how often you ensure him it doesn't contain malicious code. He'll want to do it the hard way, and this is what he needs to do: If you use MySQL as your database server, each new user needs at least entries in the mysql.user and mysql.db tables. Your database administrator might have set up his own rules, but in general the mysql.user table should grant no privileges to the user, whereas the mysql.db table should grant INSERT, SELECT, UPDATE, DELETE permissions to each user for the refdb database and SELECT, INSERT, UPDATE, DELETE, CREATE, DROP privileges for each reference database the user should have access to. Make sure to mention that the Host field in mysql.user must contain the name or address of the box that runs refdbd, which is not necessarily identical with the workstation of the user. If you prefer PostgreSQL instead, things are a little simpler. When you create a refdb database, a new group will be created to manage access to this database. All your database administrator needs to do is to add the new user to the groups refdbuser (granting access to the common refdb database) and <dbname>user, where <dbname> is the name of the reference database the user should be allowed to access. addword Synopsis addword file word Description Most bibliography styles use standardized abbreviations of the journal names. Most data sources specify these abbreviations without dots, as in "Mol Cell Biol". If the words are to be abbreviated with dots (as in "Mol. Cell Biol.") in the bibliography, refdb needs to know which tokens in the abbreviated name are indeed abbreviated (e.g. "Mol."), and which are full words (e.g. "Cell"). To this end, refdb keeps a list of reserved words which are known not to be abbreviations of something else. refdb ships with a fairly complete list of such words, but if you detect errors or omissions, the addword command comes in handy. Options file Read a whitespace-separated list of journal title words from file. Displays the online help about the addword command. word All other arguments are interpreted as reserved words. If neither a word list nor an input file is specified, refdba attempts to read a whitespace-separated list of words from stdin. To force refdba to read from stdin in addition to explicitly listed words, use the option. refdb will convert all reserved words to uppercase internally, so it does not matter which case you provide these words in. Example refdba: addword -f wordlist FOO BAR This will add all reserved words in the file wordlist as well as the words "FOO" and "BAR" to the list of reserved words. confserv Synopsis confserv command value Description Configures the application server while it is running and does some tricks with the refdb helper databases as well. Some of the commands modify variables that can be set as command line arguments or with the init file. See Running the refdbd daemon for more information about these variables. This command will only reconfigure refdbd transiently. All changes are lost when the application server is restarted. To make permantent changes to the configuration, edit the init-file or change the command-line parameters in the script that starts refdbd. Please note also that remote administration must be enabled for this command to work. The following commands are available: stop Stops the application server. This command affects only the refdbd parent process. Any children that may be currently serving clients will continue to do so until they are done. ping Checks whether the application server is still alive and well. If this is the case, it will report the process IDs of the child that handles your query and of the parent. If not, the connection will time out with no response. serverip value Sets the database server IP address to value. timeout value Sets the timeout in seconds to value. logdest value Sets the destination of log output to value. Possible values are 0 (stderr), 1 (the system syslog facility), 2 (a private log file as defined by logfile). logfile value Sets the filename of the log file to value. loglevel value Sets the maximum level of messages to be logged to value. 0 means that only critical errors will be logged, 7 means that all messages including the extremely verbose debug messages will be logged. -1 disables logging completely. Example refdba: confserv loglevel 7 This will set the log level to 7. This temporary change will only be effective until refdbd is restarted. createdb Synopsis createdb encoding dbname Description Creates a new database with the name dbname. Several databases may be specified in a single call of this command. Options encoding Select a character encoding for the new database. This is currently only supported by MySQL and PostgreSQL. If you use a different engine, this option is ignored. Please see the documentation of your database engine installation for available encodings. The value passed with the option should be the IANA encoding name. If you do not use this option, the new database will use the default encoding of the database server unless your refdbdrc configuration file sets a default with a "db_encoding" entry. Displays the online help about the createdb command. name The name of the reference database. The name must not contain a colon (':') or a dash ('-') due to the citation formats in documents using RefDB. The allowed characters may be further restricted by the database engine you use. The database name should also be considered case-insensitive, i.e. don't try to create a database "mybase" if you already have one called "MYBASE". Also, avoid using names which are SQL reserved words as this is doomed to fail. Unfortunately, this includes the all too convenient name "references". Try "refs" or "biblio" instead. Prepend a constant string like rd to all refdb database names. This speeds up retrieving refdb databases with the listdb command if your database engine manages additional, non-RefDB databases. Use a simple regular expression like rd% to restrict your search to RefDB databases. Example refdba: createdb db1 UTF-8 db2 This will create the databases db1 and db2 with the character encoding UTF-8. Using SQL scripts to create databases refdb contains two plain-text SQL scripts (installed in /usr/local/share/refdb/sql) to create database tables just like the createdb command does. These scripts are preferable to the command in these cases: You do not have database administrator permissions and have to ask your admin to create the databases for you. Your admin might prefer to run the script as he can easily find out what it is going to do. You want to integrate refdb with an existing or a custom database system. In that case you want the refdb-specific tables in an existing database in addition to non-refdb tables. The following procedures are equivalent to running the createdb command. If you want to add the tables to an existing database, please adapt the scripts and/or the procedures accordingly. If you're running MySQL, use the following commands (provide additional options like username and password as required): #~ mysql -e "CREATE DATABASE dbname" #~ mysql dbname < empty.mysql.dump If you're using PostgreSQL, the following sequence should work (again, provide additional options like username and password as required): #~ sed 's/refdbtest/dbname/g' < empty.pgsql.dump.in > empty.pgsql.dump #~ psql template1 < empty.pgsql.dump The empty.pgsql.dump.in script contains the commands to create a database and to set appropriate access rights for a new group of database users. Therefore it is a good idea to replace the string "refdbtest" with the intended name of your new database. The sed command in the first line does just this. You may also edit a few more things, like the encoding. The second command actually creates the database, a new group, grants privileges to this group, and creates all necessary tables and sequences. template1 is a PostgreSQL system database. The psql command requires the name of an existing database as an argument, but in this case you could use any other existing database just as well. deletedb Synopsis deletedb dbname Description Deletes the database with the name dbname. Several databases may be specified in a single call of this command. The database structure and the data will be gone, really gone, so be careful with this command. Think twice and, if in doubt, at least make a backup first to avoid extensive hairpulling. Options Displays a brief usage message and returns to the prompt. dbname The name of the database to be deleted. Example refdba: deletedb db1 db2 This will delete the databases db1 and db2. deletestyle Synopsis deletestyle unix-regexp Description Deletes the bibliography styles whose names match the Unix regular expression unix-regexp. Some database engines, like SQLite, do not support Unix-style regular expressions. Use SQL regular expressions instead. Options Displays a brief usage message and returns to the prompt. unix-regexp The remaining arguments are interpreted as a regular expression which specifies the style or styles to be deleted. Example refdba: deletestyle J\..* This will delete all bibliography styles that start with J.. deleteuser Synopsis deleteuser database host-IP file username Description Revokes access rights to a refdb database from the given users. Some database engines like SQLite do not support access control. The adduser command is not supported with these engines and will just return an explanatory message. refdb will only revoke the access rights to the specified database. It will revoke neither access rights to the internal database refdb, nor will it revoke database server access. You can revoke access to the internal database by specifying "refdb" with the option. To revoke access to the database server, please use the command line utilities of your database server. Options database Specify the name of the database. filename Read the usernames from filename Displays the online help about the deleteuser command. hostname Specify the hostname or IP address for which to modify the access rights. This must be the same name that you used for a previous call to adduser. This option is only supported by MySQL. It is ignored if you useother database engines. Revokes read-only access. username All other arguments are interpreted as usernames. If neither a username argument nor an input file is specified, refdba attempts to read a whitespace-separated list of names from stdin. To force refdba to read from stdin in addition to explicitly named users, use the option. Examples refdba: deleteuser % db1jim This will revoke the access to the database db1 for the user jim for all but local connections. deleteword Synopsis deleteword file word Description This command performs the reverse operation of addword. The specified reserved words will be removed from the list. Options Read a whitespace-separated list of words from file. Displays the online help about the addword command. word All other arguments are interpreted as reserved words. If neither a word list nor an input file is specified, refdba attempts to read a whitespace-separated list of words from stdin. To force refdba to read from stdin in addition to explicitly listed words, use the option. refdb will convert all reserved words to uppercase internally, so it does not matter in which case you provide these words. Example refdba: deleteword -f wordlist FOO BAR This will delete all reserved words in the file wordlist as well as the words "FOO" and "BAR" from the list of reserved words. getstyle Synopsis getstyle style Description Retrieves one or more bibliography style specifications from the database and formats them as an XML file. Options command Specify a command that will receive the output instead of the default pager. This may be a different pager, any command that takes input on stdin, or the string stdout to send the data to stdout without using a pager. Displays the online help about the getstyle command. Write the output to a file instead of to stdout. Append the output to a file instead of writing it to stdout Be careful with the append () option. refdb will output the processing instructions, the doctype line, and one CITESTYLE element for each individually requested style. If you concatenate the results of several getstyle calls, the resulting XML file will not be well-formed without further processing. In order to write several styles into a single XML file, use a single getstyle call and list all required styles as arguments. This will output the styles wrapped in a STYLESET element, resulting in a valid XML file. style All other arguments are interpreted as the names of bibliography styles. Example refdba: getstyle -o j.biol.chem.xml J.Biol.Chem. This will write the style specification stored under the style name "J.Biol.Chem." to the file j.biol.chem.xml. help Synopsis help ? Description Displays a brief summary of the available commands. Example refdba: help listdb Synopsis listdb database-regexp Description Lists all available databases if no argument is specified. If database-regexp is specified, only the databases matching this expression will be listed. In order to tell refdb reference databases apart from other databases maintained by your database server, refdbd has to peek into each database returned by the database server. Depending on the number of available databases this may take some time. Therefore it may be a good idea to use a common prefix for all refdb databases as explained in the section about the createdb command. Options Displays a help message explaining the listdb command. database-regexp A valid SQL regular expression which limits the output to matching database names. Example refdba: listdb db% This will list all databases with names that start with the string db. liststyle Synopsis liststyle style-regexp Description Lists all available bibliography styles that match style-regexp. If no argument is given, all available styles will be listed. This may or may not be what you want. Options Displays a help message explaining the listdb command. style-regexp A valid Unix regular expression which limits the output to matching style names. Some database engines, like SQLite, do not support Unix-style regular expressions. Use SQL regular expressions instead. Example refdba: liststyle ^J.* This will list all bibliography styles that start with a capital J. listuser Synopsis listuser -d database name-regexp Description Lists all available users of the specified database that match name-regexp. If no argument is given, all available users will be listed. This may or may not be what you want. Options database Specify the database name. Displays a help message explaining the listdb command. name-regexp A valid Unix regular expression which limits the output to matching database user names. Some database engines, like SQLite, do not support Unix-style regular expressions. Use SQL regular expressions instead. Example refdba: listuser refs ^mo.* This will list all users of the database "refs" whose names start with mo. listword Synopsis listword word-regexp Description Lists all available reserved journal words that match unix-regexp. If no argument is given, all available words will be listed. This may or may not be what you want. Keep in mind that the journal words are uppercased internally. You should write your unix-regexp using all caps accordingly. Options Displays a help message explaining the listdb command. word-regexp A valid Unix regular expression which limits the output to matching journal title words. Some database engines, like SQLite, do not support Unix-style regular expressions. Use SQL regular expressions instead. For a brief description of the purpose of reserved words, see the addword command. Example refdba: listword ^BIO.* This will list all reserved journal words that start with BIO. scankw Synopsis scankw database Description This command schedules a full keyword scan in the database specified with the option. The abstract field as well as all title fields of all references found in the database are scanned for the presence of all keywords available in the database. If a match is found and the keyword is not yet associated with that reference, the keyword is added to that reference. As the time required to perform this operation increases with both the number of references and the number of keywords, the keyword scan is performed in the background and the command returns immediately on the client side. See the server log for the results. As this command will cause a huge number of database accesses it is best scheduled to run automatically as a cron job at a time of low use, either nightly or on weekends. Please note the difference between the full keyword scan and the automatic keyword scan which can be requested by the refdbd command line switch or the corresponding configuration variable keyword_scan. The full keyword scan is "retrospective", i.e. it will add keywords that were added later to previously existing references. The automatic keyword scan will only add existing keywords to newly added references, thus causing less impact on the database performance while users are likely to access the database. Options database Specify the database name. Displays a help message explaining the listdb command. set Synopsis set varname varvalue Description The set command displays or modifies the values of configuration variables. If you call set without any arguments, it will display a list of all configuration variables with their current values. If you call set with one argument, it will display the current value of this particular variable. If you call set with two arguments, it will set the variable (first argument) to the new value (second argument) for the current session. To specify an empty value, use two quotation marks like this:"". For obvious reasons, set will never display the current password although you can certainly change the password with this command. To make sure no one else sees the new password that you enter, run the command set passwd *. You will then be asked to enter a password which will not be echoed on the screen. This command is not available in batch mode, use the command line switches instead. In the interactive mode, the changes to the configuration variables are limited to the current session. If you want to change the values permanently, you should rather edit one of the configuration files. Options Displays a help message explaining the listdb command. varname The name of the variable whose value should be displayed or set. varvalue The new value of the variable to be set. Example refdba: set timeout 90 This command will set the timeout to 90 seconds for the current session. verbose Synopsis verbose Description Toggles the verbose mode on or off. If the verbose mode is on, the error messages and warnings may be some more comprehensible. Options Displays a help message explaining the listdb command. Example refdba: verbose Depending on the previous setting, this will toggle the verbose mode on or off. viewstat Synopsis viewstat Description Shows the version numbers of the libdbi driver used to connect to your database server as well as the version information of that server. It also shows the current values of the variables that can be modified with confserv. Options Displays a help message explaining the listdb command. Example refdba: viewstat This will print some connection statistics and informations on the screen. Files PREFIX/etc/refdb/refdbarc The global configuration file of refdba. $HOME/.refdbarc The user configuration file of refdba. See also RefDB (7), refdbd (1), refdb-backup (1), refdb-restore (1), refdbc (1). RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html> RefDB on the web <http://refdb.sourceforge.net/> Author refdba was written by Markus Hoenicka <markus@mhoenicka.de>.
refdb-1.0.2/doc/refdbc.1.xml000644 001750 001750 00000374436 12255420745 016344 0ustar00markusmarkus000000 000000 2005-10-15 refdbc 1 2005-10-15 RefDB Manual refdbc the reference and note management client of RefDB Interactive mode: refdbc pager-command database log-destination stdin fields deffile CSS-file IP-address log-level log-file port pdfroot time name password confdir Batch mode: refdbc command pager-command database log-destination stdin fields deffile CSS-file IP-address log-level L log-file port pdfroot time name password confdir Description refdbc is a command-line client providing the commands to manage references and notes with RefDB(7). refdbc can be started in an interactive mode, providing a command prompt. Type ? or help to see a list of available commands. Alternatively you can start refdbc in non-interactive mode. refdbc will execute the requested command and return. In this mode refdbc will accept input on stdin for a variety of commands, allowing Unix piping. Options pager-command The command line of the pager that is to be used. Instead of a pager you can of course specify any valid command that accepts data on stdin. Use "stdout" to request data output to stdout. This is the default, but you may want to specify it on the command line if you need to temporarily override a default pager setting in your configuration file. command The command to be run in non-interactive mode. You can supply all options and parameters that the command accepts on the refdba command line. database The name of the default database. You can change the database anytime during an interactive session. log-destination log-destination can have the values 0, 1, or 2, or the equivalent strings stderr, syslog, or file, respectively. This value specifies where the log information goes to. 0 (zero) means the messages are sent to stderr. They are immediately available on the screen but they may interfere with command output. 1 will send the output to the syslog facility. Keep in mind that syslog must be configured to accept log messages from user programs, see the syslog(8) man page for further information. Unix-like systems usually save these messages in /var/log/user.log. 2 will send the messages to a custom log file which can be specified with the option. stdin Read data from stdin. refdbc usually knows when it should read from stdin. However, a few commands use data supplied in the command line but also allow to read from a file. Use this option to force refdbc to read from stdin in addition to values supplied on the command line. fields Specify the default fields that are to be displayed in a getref query. deffile This option can be used to add some default fields to all RIS references that are added or updated. The argument deffile is the filename of a RIS file containing these additional fields. refdbc first tries the filename as is, so it should be a valid relative or absolute path. If the file is not found, refdb looks for the file in $HOME. The command aborts if the file cannot be found. CSS-file Specify the URL of a Cascading Style Sheets (CSS) file. This file will be used to customize the HTML output of the getref command. The URL can be either a local path (e.g. refdb.css, /home/myname/custom.css) or the web address of a file on a web server (e.g. http://www.mycomp.com/refdb.css). Displays help and usage screen, then exits. IP-address Set the IP address of the box which is running the application server refdbd(1). Instead of the IP address you can also specify the hostname as long as it can be properly resolved by your system. log-level Specify the priority up to which events are logged. This is either a number between 0 and 7 or one of the strings emerg, alert, crit, err, warning, notice, info, debug, respectively (see also Log level definitions). disables logging completely. A low log level like 0 means that only the most critical messages are logged. A higher log level means that less critical events are logged as well. 7 will include debug messages. The latter can be verbose and abundant, so you want to avoid this log level unless you need to track down problems. log-file Specify the full path to a log file that will receive the log messages. Typically this would be /var/log/refdba. port Set the port of the box which is running the application server. Start without reading the configuration files. The client will use the compile-time defaults for all values that you do not set with command-line switches. Useful for debugging configuration files. pdfroot Specify the root path of your collection of electronic offprints. time Set the timeout for client/application server dialogue in seconds. A connection with unsuccessful read or write attempts will be considered as dead and taken down after this amount of time has elapsed. name Set the username for the database access. Note: This username need not be identical to the login name of the user. This is the username required to access the database server. Prints version and copyright information, then exits. Switches to verbose mode. password Set the password for the database access. Note: This password need not be identical to the login password of the user. This is the password required to access the database server. Send passwords unencrypted. confdir Specify the directory where the global configuration files are Note: By default, all RefDB applications look for their configuration files in a directory that is specified during the configure step when building the package. That is, you don't need the option unless you use precompiled binaries in unusual locations, e.g. by relocating a rpm package. Diagnostics The exit code is 0 if all went fine. It will be 1 if the command (when run in batch mode) or the last command (when run in interactive mode) returned an error, or if there was a general error condition during startup like a lack of available memory. Configuration refdbc evaluates the refdbcrc configuration file at startup to initialize itself. refdbcrc Variable Default Comment cssurl (none) The URL of a Cascading Style Sheet (CSS) file. This file, if specified, is used to customize the visual appearance of the HTML output of the getref command. defaultdb (none) The default database. refdbc will try to use this database unless you select a different one with the selectdb command. defaultris (none) The path of a RIS file with entries that should be added to all new or updated references. This is typically used to set some default value for the RP field or to specify additional keywords. fields (none) A list of additional fields which should be displayed by default in the reference output. The list is a simple concatenation of the field names. Possible fields are N1, N2, NX, AB, AD, RP, SN, PB, CY, UR, U1 through U5, M1 through M3. Use the string "ALL" to request all available fields. fromencoding ISO-8859-1 The default encoding of RIS input data. You can use any encoding that your local libiconv implementation supports. logdest file Where the log output should be written to. Use either stderr, syslog, or file. For the latter to work, the logfile variable must be set appropriately logfile /var/log/refdbc.log The full path of a custom log file. loglevel info Set the level of log information that you would receive. Possible values, in order of increasing verbosity, are: emerg, alert, crit, err, warning, notice, info, debug pager stdout The command line of a pager that accepts the output of refdb on stdin to allow scrolling and other nifty things. stdout sends the data to stdout. passwd * The password which is used for authentication with the database server. It is potentially evil to store unencrypted passwords in disk files. At least make sure that the configuration file is not readable for anyone else. The default setting causes refdbc to ask for your password interactively. pdfroot (none) This value will be used as the root of the paths to PDF or Postscript offprints that can be specified with the AV field in a RIS dataset. The path should not rely on shell expansion, e.g. use /home/me/literature/ instead of ~/literature/. The pdfroot allows you to shorten the paths that you enter for each dataset and to maintain a certain portability if you have to move the offprints to a different directory or want to access them remotely. The html output routine will concatenate the relative path of each dataset with the pdfroot to construct the link to the offprint. Instead of a local path name you can specify an URL starting with http:// or ftp:// if your offprints are accessible through a web server or ftp server. port 9734 The port on which refdbd listens. Change this for all clients and the server if this value interferes with another program using this port. serverip 127.0.0.1 The IP address or hostname of the machine where refdbd runs. Use the default (localhost) address if the clients and refdbs run on the same machine. timeout 180 The timeout in seconds. After this time has elapsed, a stalled connection is taken down. Increase this value if you encounter frequent timeout errors due to high network traffic or refdbd overload. toencoding (none) The default encoding of output data. You can use any encoding that your local libiconv implementation supports. If this value is not set, the encoding of the database will be used without conversion. username login name The username which is used for authentication with the database server. This may be different from the login name of the user. verbose f Set this to t if you prefer verbose error messages. no_encrypt f If set to 't', passwords are transmitted unencrypted. The default is to encrypt passwords.
Commands All commands consist of a single word which specifies the command. This may be followed by arguments and/or switches. The general syntax rules of the getopts library apply. addlink Synopsis addlink database command outfile outfile note-specifier link-target Description The addlink command links an extended note to one or more link targets. You have to specify exactly one note on the command line, either by using the :NID: field selector to specify the note ID, or by using the :NCK: field selector to specify the note key. Then you need at least one link target. This can be one of :ID: (reference by ID), :CK: (reference by citation key), :AU: (author by name), :KW: (keyword by name), or one of :JF:, :JO:, :J1:, :J2: (periodical by full name, abbreviated name, or user abbreviations 1 and 2). Options command Pipe the output through command. database Specify the database. Display a help message explaining the command. filename Write the output to filename instead of to stdout. filename Append the output to filename instead of sending it to stdout. note-specifier Specify one note by either its :NID: or its :NCK: value. link-target Specify one or more link targets by means of their :ID:, :CK:, :AU:, :KW:, :JF:, :JO:, :J1:, or :J2: values. Example refdbc: addlink :NID:=12 :CK:=Miller1999 :KW:=biochemistry This command will link the note carrying the ID 12 with a reference specified by its citation key "Miller1999" and with the keyword "biochemistry". addnote Synopsis addnote database encoding command outfile outfile file Description Adds the extended notes in file to the current database. You can specify several files in one run. Any ID fields in the notes are ignored. Options command Pipe the output through command. database Specify the database. encoding Select the character encoding for the input data if it is different from the default UTF-8. Display a help message explaining the command. filename Write the output to filename instead of to stdout. filename Append the output to filename instead of sending it to stdout. Example refdbc: addnote foo.xml This command will add the extended notes in foo.ris to the currently selected database. If the notes do not specify a date, refdbd will insert a timestamp automatically. addref Synopsis addref database encoding command outfile outfile type username file Description Adds the references in file to the current database. You can specify several files in one run. Any ID fields in the references are ignored unless you specify the option. Options command Pipe the output through command. database Specify the database. encoding Select the character encoding for the input data if it is different from the default setting. RIS datasets can use any encoding that your local libiconv supports (see man iconv_open for a list of available encodings), except UTF-16 and UTF-32. RISX datasets carry the encoding in the processing instructions, therefore this option is not needed and ignored. Display a help message explaining the command. filename Write the output to filename instead of to stdout. filename Append the output to filename instead of sending it to stdout. type Select the input data type. Possible values are "ris" (default) and "risx". Other data types have to be converted to one of these types before adding them to the database. username Provide a different username than that of the current user, so e.g. some technician or administrative staff can add references in behalf of a researcher. file All other command-line arguments will be interpreted as filenames to read references from. If no filenames are specified, the data will be read from stdin. Example refdbc: addref -U doe -g .refdbdefault.ris -E ISO-8859-1 foo.ris $ refdbc -C addref -U doe -g .refdbdefault.ris -d db1 < foo.ris These commands will add the references in foo.ris. The references will be associated with the user doe. Every reference will use the specified values in .refdbdefault.ris in the appropriate fields. In the first (interactive) command, the active database will be used, and the encoding is set to ISO-8859-1, aka Latin-1. In the second (non-interactive) command, the database has to be specified explicitly with the option, and the default encoding (UTF-8) is assumed. checkref Synopsis checkref output-type database encoding command outfile outfile field-list field-list input-type username file Description Adds the references in file to temporary tables in the current database. The command is similar to the addref command, except that it does not add the references permanently to your database. Instead, the import is "simulated" in temporary tables, and the resulting datasets are analyzed in terms of similarities to existing permanent entries. If a reference is similar to an existing one in terms of the location (periodical, volume, issue, startpage), of the titles, or of the citekey, you may want to check these references manually as they are probably duplicates. If an abbreviated periodical name is reported to match an existing full name, you may want to add both names to the new reference to make refdb aware that it is dealing with the same journal. If an author name using abbreviated first or middle names is reported to be a possible duplicate of an existing author or vice versa, you may want to check if these authors are indeed identical, and change the abbreviated one to the full version. In addition, keywords are checked for similar existing keywords (often there are singular and plural forms of the same keyword). You should prefer to use existing keywords if possible to make your database more consistent and easier to search. Options outtype Select the output type of the report. Currently supported values are "scrn" for a terse screen output, and "xhtml" for a voluptuous xhtml report, bells and whistles included. command Pipe the output through command. database Specify the database. encoding Select the character encoding for the input data if it is different from the default setting. RIS datasets can use any encoding that your local libiconv supports (see man iconv_open for a list of available encodings), except UTF-16 and UTF-32. RISX datasets carry the encoding in the processing instructions, therefore this option is not needed and ignored. cssfile Select the CSS stylesheet that is to be used for the xhtml output. Display a help message explaining the command. filename Write the output to filename instead of to stdout. filename Append the output to filename instead of sending it to stdout. fieldlist Select fields to check. If this option is not used, all available checks are performed. This may result in a more comprehensive report than you want. You can instead check for particular fields, or a subset of the available fields. fieldlist is a concatenation of the two-letter (pseudo) field codes: TX (all titles), PY (pubdate, volume, issue, pages), AX (all authors), JO (all journal names), CK, and KW. fieldlist Select additional fields to display with the default xhtml output. fieldlist is a concatenation of the two-letter field codes of those fields which are not printed by default: N1, N2, NX, AB, AD, PB, CY, RP, SN, LX, U1-U5, and M1-M3. input-type Select the input data type. Possible values are "ris" (default) and "risx". Other data types have to be converted to one of these types before adding them to the database. username Provide a different username than that of the current user, so e.g. some technician or administrative staff can add references in behalf of a researcher. file All other command-line arguments will be interpreted as filenames to read references from. If no filenames are specified, the data will be read from stdin. Example refdbc: checkref -A xhtml -G /usr/local/share/refdb/css/refdb-frequency.css -E ISO-8859-1 -s KW foo.ris This command adds the data in foo.ris to temporary tables in the current database, using the ISO-8859-1 encoding. The result of the duplicate checks is requested in xhtml format using a stylesheet that displays frequency information graphically. In addition to the default fields the keywords will be listed as well. deletelink Synopsis deletelink database command outfile outfile note-specifier link-target Description The deletelink command removes links from an extended note to one or more link targets. You have to specify exactly one note on the command line, either by using the :NID: field selector to specify the note ID, or by using the :NCK: field selector to specify the note key. Then you need at least one link target. This can be one of :ID: (reference by ID), :CK: (reference by citation key), :AU: (author by name), :KW: (keyword by name), or one of :JF:, :JO:, :J1:, :J2: (periodical by full name, abbreviated name, or user abbreviations 1 and 2). Options command Pipe the output through command. database Specify the database. Display a help message explaining the command. filename Write the output to filename instead of to stdout. filename Append the output to filename instead of sending it to stdout. note-specifier Specify one note by either its :NID: or its :NCK: value. link-target Specify one or more link targets by means of their :ID:, :CK:, :AU:, :KW:, :JF:, :JO:, :J1:, or :J2: values. Example refdbc: deletelink :NID:=12 :CK:=Miller1999 :KW:=biochemistry This command will delete the links from the note carrying the ID 12 to a reference specified by its citation key "Miller1999" and to the keyword "biochemistry". deletenote Synopsis deletenote database command outfile outfile ID infile Description Deletes the extended note with the identifier ID from the current database. Several extended notes may be specified in a single call of this command. Notes with consecutive ID values may be specified as ranges. It is not possible to delete a note if it belongs to a different user. Options command Pipe the output through command. database Specify the database. infile Read a list of NID values in the RIS format from infile. Display a help message explaining the command. filename Write the output to filename instead of to stdout. filename Append the output to filename instead of sending it to stdout. NID All other arguments are interpreted as a list of noteID values. Ranges may be used to specify consecutive NIDs. If neither NIDs nor an infile are provided, refdbc attempts to read the NIDs from stdin. You can ask refdbc to read NID values from stdin in addition to other NIDs by using the option. Example refdbc: deletenote 3 5-10 26 This command will delete the extended notes with the ID values 3, 5 through 10, and 26. deleteref Synopsis deleteref database command outfile outfile ID infile Description Deletes the reference with the identifier ID from the current database. Several references may be specified in a single call of this command. References with consecutive ID values may be specified as ranges. It is not possible to delete a reference if it belongs to the personal reference list of more than one user. If you're the only user of this reference and go ahead and delete it, all data saved in the specified references will be gone, so be careful with this command. Make sure you understand the difference between the deleteref command and the dumpref command. The former deletes the data, the latter deletes only your personal data associated with the specified references (the notes, availability, and reprint data) and removes your association with this reference. In other words, deleteref removes the reference from the database, whereas dumpref removes the reference from your personal reference list, leaving the remaining data for the other users of the database. Options command Pipe the output through command. database Specify the database. infile Read a list of ID values in the RIS format from infile. This list may be the result of a previous getref command. Display a help message explaining the command. filename Write the output to filename instead of to stdout. filename Append the output to filename instead of sending it to stdout. ID All other arguments are interpreted as a list of ID values. Ranges may be used to specify consecutive IDs. If neither IDs nor an infile are provided, refdbc attempts to read the IDs from stdin. You can ask refdbc to read ID values from stdin in addition to other IDs by using the option. Example refdbc: deleteref 3 5-10 26 This command will delete the references with the ID values 3, 5 through 10, and 26. dumpref Synopsis dumpref listname database command outfile outfile ID file Description Removes references from the specified personal reference list in the current database. If no personal reference list is specified, the default list (carrying the same name as your database username) will be used instead. Options listname Use the personal reference list named listname. command Pipe the output through command. database Specify the database. infile Read a list of ID values in the RIS format from infile. This list may be the result of a previous getref command. Display a help message explaining the command. filename Write the output to filename instead of to stdout. filename Append the output to filename instead of sending it to stdout. ID All other arguments are interpreted as a list of ID values. Ranges may be used to specify consecutive IDs. If neither IDs nor an infile are provided, refdbc attempts to read the IDs from stdin. You can ask refdbc to read ID values from stdin in addition to other IDs by using the option. Example refdbc: dumpref -f foo.ris 3 5-10 26 This command will remove the references 3, 5 through 10, and 26 as well as those listed in the file foo.ris from your personal reference list. getau, geted, getas, getax Synopsis getau database command outfile outfile limit[:offset] format unix-regexp geted database command outfile outfile limit[:offset] format unix-regexp getas database command outfile outfile limit[:offset] format regexp getas database command outfile outfile limit[:offset] format regexp Description Retrieve all author names that match the regular expression regexp in the current database. If no regexp argument is given, all author names will be listed, which may or may not be what you want. getau retrieves the primary authors which is the most common case if you want to locate a publication. geted and getas retrieve book or periodical editors and series authors, respectively. getax retrieves authors from any level. Options command Pipe the output through command. database Specify the database. Display a help message explaining the command. limit[:offset] Limit the number of returned datasets. If limit is used all by itself, the first limit author names are returned. If the optional offset argument is used as well, the first offset author names will be skipped, and the next limit author names will be returned. filename Write the output to filename instead of to stdout. filename Append the output to filename instead of sending it to stdout. format Request additional frequency information. "freq" provides the absolute number of references that contain the given author. "relfreq" reports a relative frequency indicator as an integer between 0 and 10. regexp All other arguments are interpreted as a unix regular expression which limits the results to matching author names. Some database engines, like SQLite, do not support Unix-style regular expressions. Use SQL regular expressions instead. Example refdbc: getau -o authors.txt '^Simpson' This command will write a list of all authors starting with Simpson to the file authors.txt. refdbc: getau -N 5:10 This command prints the author names 11 through 15. getjo, getjf, getj1, getj2 Synopsis getjo database command outfile outfile limit[:offset] format regexp getjf database command outfile outfile limit[:offset] format regexp getj1 database command outfile outfile limit[:offset] format regexp getj2 database command outfile outfile limit[:offset] format regexp Description Retrieve all journal names that match the regular expression regexp in the current database. The regexp will be matched to the journal abbreviation, the full name, the custom abbreviation 1, and the custom abbreviation 2, respectively. If no regexp argument is given, all available journal names will be listed. Options Return all synonymous journal names, i.e. full name, abbreviation, custom abbreviation 1, and custom abbreviation 2. If the option is absent, only the name that you search for will be returned, e.g. only the full name in the case of getjf. command Pipe the output through command. database Specify the database. Display a help message explaining the command. limit[:offset] Limit the number of returned datasets. If limit is used all by itself, the first limit journal names are returned. If the optional offset argument is used as well, the first offset journal names will be skipped, and the next limit journal names will be returned. filename Write the output to filename instead of to stdout. filename Append the output to filename instead of sending it to stdout. format Request additional frequency information. "freq" provides the absolute number of references that contain the given journal name. "relfreq" reports a relative frequency indicator as an integer between 0 and 10. regexp All other arguments are interpreted as a unix regular expression which limits the results to matching journal names. Some database engines, like SQLite, do not support Unix-style regular expressions. Use SQL regular expressions instead. Example refdbc: getjo -a -o journals.txt '^J' This command will list all synonyms of the journals whose abbreviations start with a capital J. The output will be redirected into the file journals.txt. getkw Synopsis getkw database command outfile outfile limit[:offset] format regexp Description Retrieve all keywords that match the regular expression regexp in the current database. If no regexp argument is specified, all keywords in the database will be listed. Options command Pipe the output through command. database Specify the database. Display a help message explaining the command. limit[:offset] Limit the number of returned datasets. If limit is used all by itself, the first limit keywords are returned. If the optional offset argument is used as well, the first offset keywords will be skipped, and the next limit keywords will be returned. filename Write the output to filename instead of to stdout. filename Append the output to filename instead of sending it to stdout. format Request additional frequency information. "freq" provides the absolute number of references that contain the given keyword. "relfreq" reports a relative frequency indicator as an integer between 0 and 10. regexp All other arguments are interpreted as a unix regular expression which limits the results to matching keywords. Some database engines, like SQLite, do not support Unix-style regular expressions. Use SQL regular expressions instead. Examples refdbc: getkw -o keywords.txt '^An.*l$' This command will request a list of all keywords that start with An and end with the letter l, like Animal, and write the result to the file keywords.txt. ~# refdbc -C getkw -s freq -c "sort -r|cut -d ':' -f 2"|less Here we run the getkw command from the shell. The result list contains the frequency of each returned keyword. The data are sorted in descending order according to the frequency, and the frequency information itself is stripped off. Of course there is more than one way to arrive here. E.g. you could use the option to send the data to stdout and pipe them through the argument of the option in the example shown above. getnote Synopsis getnote database encoding command outfile outfile limit[:offset] sort-string output-type search-string file Description Displays all extended notes which match the search-string in the current database. Refer to the section The query language for a description of the syntax of a search string. Options command Pipe the output through command. database Specify the database. encoding Select the character encoding for the output data if it is different from the database encoding. You can request any encoding that your local libiconv supports (see man iconv_open for a list of available encodings). infile Read the search string from infile. This is a simple way to re-run saved queries. Display a help message explaining the command. limit[:offset] Limit the number of returned datasets. If limit is used all by itself, the first limit extended notes are returned. If the optional offset argument is used as well, the first offset notes will be skipped, and the next limit notes will be returned. filename Write the output to filename instead of to stdout. filename Append the output to filename instead of sending it to stdout. Limit the search to the notes which were added by the current user. If this switch is absent, the whole database will be searched. sort-string Sort the output. Currently you can sort only by ID (the default) or by PY (publication year). output-type Select the type of output. Available are "scrn", "html", "xhtml", and "xnote" for a compact format suitable for terminal browsing, HTML, XHTML, or the native XML format, respectively. search-string The remainder of the arguments is interpreted as a search string. The syntax of the queries is described in the section query language. Example refdbc: getnote -t xnote :CK:=Miller1999 This command retrieves notes which are attached to the reference with the citation key "Miller1999" and displays them in the xnote format. getref Synopsis getref listname database encoding command outfile outfile limit[:offset] format-string sort-string output-format search-string file Description Displays all datasets which match the search-string in the current database. Refer to the section The query language for a description of the syntax of a search string. See the countref command if you want to know how many references match your current query without actually retrieving a possibly large amount of reference data. Options listname Limit the search to the personal reference list named listname. command Pipe the output through command. database Specify the database. encoding Select the character encoding for the output data if it is different from the database encoding. You can request any encoding that your local libiconv supports (see man iconv_open for a list of available encodings). infile Read the search string from infile. This is a simple way to re-run saved queries. Display a help message explaining the command. limit[:offset] Limit the number of returned datasets. If limit is used all by itself, the first limit matching references are returned. If the optional offset argument is used as well, the first offset matching references will be skipped, and the next limit matching references will be returned. filename Write the output to filename instead of to stdout. filename Append the output to filename instead of sending it to stdout. format-string Specify additional fields and pseudo-fields (N1, N2/AB, NX, RP, SN, AD, CY, PB, LX, U1 through U5, M1 through M3) that are not displayed by default, except for the RIS and risx output formats. Use "ALL" as an argument to display all available fields. If several fields are specified, the argument has to be enclosed by single quotation marks. If applied to RIS output, you can specify ID as format-string to get only a list of ID values in RIS format for all references that match the search. This is a convenient way to generate ID lists for later operations like deleteref. sort-string Sort the output. Currently you can sort only by ID (the default) or by PY (publication year). output-type Select the type of output. Available are "scrn", "ris", "risx", "html", "xhtml", "db31", "db31x", "db50x, "teix", "tei5x", "mods", and "bibtex" for a compact format suitable for terminal browsing, the native RIS and risx (XML) formats, HTML, XHTML, DocBook SGML, DocBook XML (DTD-based), DocBook XML (schema-based), TEI P4 XML, TEI P5 XML, MODS, or BibTeX format, respectively. search-string The remainder of the arguments is interpreted as a search string. The syntax of the queries is described in the section query language. Example refdbc: getref -t ris -o temp.sgml -E ISO-8859-15 ":AU:='& ^Doe ^Jones' AND :KW:=circular\ dichroism" This command retrieves articles with both an author starting with Doe and an author starting with Jones that have the keyword circular dichroism. The output will be saved in RIS format to the file temp.sgml using the character encoding ISO-8859-15. help, ? Synopsis help ? Description Displays a brief summary of the available commands. This command is not available in the batch mode (use the option instead to review the command line usage). Example refdbc: help This will list the available commands. listdb Synopsis listdb database-regexp Description Lists all available databases if no argument is specified. If database-regexp is specified, only the databases matching this expression will be listed. Options Displays a help message explaining the listdb command. database-regexp A valid SQL regular expression which limits the output to matching database names. Example refdbc: listdb db% This command will list all available databases that start with db. liststyle Synopsis liststyle style-regexp Description Lists all available bibliography styles that match style-regexp.If no argument is specified, all available styles will be listed. Options Displays a help message explaining the listdb command. style-regexp A valid Unix regular expression which limits the output to matching style names. Some database engines, like SQLite, do not support Unix-style regular expressions. Use SQL regular expressions instead. Example refdbc: liststyle ^J.* This will list all bibliography styles that start with a capital J. pickref Synopsis pickref listname database command outfile outfile ID file Description Adds references to the specified personal reference list in the current database. If no personal reference list is specified, the default list (carrying the same name as your database username) will be used instead. Options listname Use the personal reference list named listname. command Pipe the output through command. database Specify the database. infile Read a list of ID values in the RIS format from infile. This list may be the result of a previous getref command. Display a help message explaining the command. filename Write the output to filename instead of to stdout. filename Append the output to filename instead of sending it to stdout. ID All other arguments are interpreted as a list of ID values. Ranges may be used to specify consecutive IDs. If neither IDs nor an infile are provided, refdbc attempts to read the IDs from stdin. You can ask refdbc to read ID values from stdin in addition to other IDs by using the option. Example refdbc: pickref -f foo.ris 3 5-10 26 This command will add the references 3, 5 through 10, and 26 as well as those listed in the file foo.ris to your personal reference list. countnote Synopsis countnote listname command database limit[:offset] search-string file Description Counts all extended notes which match the search-string in the current database. Refer to the section The query language for a description of the syntax of a search string. This command is equivalent to the getnote command except that it does not return the matching notes. It just counts them. Options listname Limit the search to the personal reference list named listname. command Pipe the output through command. database Specify the database. infile Read the search string from infile. This is a simple way to re-run saved queries. Display a help message explaining the command. limit[:offset] Limit the number of returned datasets. If limit is used all by itself, the first limit matching references are returned. If the optional offset argument is used as well, the first offset matching references will be skipped, and the next limit matching references will be returned. search-string The remainder of the arguments is interpreted as a search string. The syntax of the queries is described in the section query language. Example refdbc: countnote :KW:~[rR]eview This command looks for extended notes that are linked to references which contain keywords like "review" or "Review". The command will return the number of matching notes in the result summary. countref Synopsis countref listname command database limit[:offset] search-string file Description Counts all datasets which match the search-string in the current database. Refer to the section The query language for a description of the syntax of a search string. This command is equivalent to the getref command except that it does not return the matching references. It just counts them. Options listname Limit the search to the personal reference list named listname. command Pipe the output through command. database Specify the database. infile Read the search string from infile. This is a simple way to re-run saved queries. Display a help message explaining the command. limit[:offset] Limit the number of returned datasets. If limit is used all by itself, the first limit matching references are returned. If the optional offset argument is used as well, the first offset matching references will be skipped, and the next limit matching references will be returned. search-string The remainder of the arguments is interpreted as a search string. The syntax of the queries is described in the section query language. Example refdbc: countref ":AU:='& ^Doe ^Jones' AND :KW:=circular\ dichroism" This command looks for articles with both an author starting with Doe and an author starting with Jones that have the keyword circular dichroism. The command will return the number of matching references in the result summary. selectdb Synopsis selectdb database Description Select database as the current database. This current database will be used in all queries unless you specify a different database with the option of the query commands. This command is not available in the batch mode. Use the command line option instead. Options Display a help message explaining the command. database The name of the database to be selected. Example refdbc: selectdb db1 This command will make the database db1 the active database. All further queries and operations will affect this database. set Synopsis set varname varvalue Description The set command displays or modifies the values of configuration variables. If you call set without any arguments, it will display a list of all configuration variables with their current values. If you call set with one argument, it will display the value of this particular variable. If you call set with two arguments, it will set the variable (first argument) to the new value (second argument). To specify an empty value, use two quotation marks like this:"". For obvious reasons, set will never display the current password although you can certainly change the password with this command. To make sure no one else sees the new password that you enter, run the command set passwd *. You will then be asked to enter a password which will not be echoed on the screen. This command is not available in batch mode, use the command line switches instead. In the interactive mode, the changes to the configuration variables are limited to the current session. If you want to change the values permanently, you should rather edit one of the configuration files. Options Displays a help message explaining the set command. varname The name of the variable whose value should be displayed or set. varvalue The new value of the variable to be set. Example refdbc: set timeout 90 This command will set the timeout to 90 seconds for the current session. updatejo Synopsis updatejo database command outfile outfile :XY:=name :XY:=name Description Updates the list of synonyms of a particular periodical. Each periodical can have up to four synonymous names. The full name and an official abbreviation (e.g. according to the Index Medicus for biomedical publications) should always be supplied if available. In addition, refdb can store up to two user-defined abbreviations which may serve as shorthands when adding datasets. Options command Pipe the output through command. database Specify the database. Display a help message explaining the command. filename Write the output to filename instead of to stdout. filename Append the output to filename instead of sending it to stdout. :XY:=name XY stands for one of JF, JO, J1, or J2 which denote the full name, the abbreviated name, and the user abbreviations 1 and 2, respectively. You have to supply at least two of these items. The first one selects the periodical by one of its existing names in the database. All other items update or add the names as provided. Example refdbc: updatejo :JO:="J.Biol.Chem." :JF:="The Journal of Biological Chemistry" Adds (or changes) the full name of the periodical known by its official abbreviation as "J.Biol.Chem." to read "The Journal of Biological Chemistry". updatenote Synopsis updatenote database encoding command outfile outfile file Description Updates the extended notes in file in the current database. This command is essentially the same as addnote, but it uses the citekey or id attributes (in this order) to update an existing note in the database. If the specified note does not exist in the database, a new one will be created. Options command Pipe the output through command. database Specify the database. encoding Select the character encoding for the input data if it is different from the default UTF-8. Display a help message explaining the command. filename Write the output to filename instead of to stdout. filename Append the output to filename instead of sending it to stdout. Example refdbc: updatenote foo.xml This command will update the extended notes in foo.ris in the currently selected database. If the notes do not specify a date, refdbd will insert a timestamp automatically. updateref Synopsis updateref database encoding command outfile outfile type username file Description Updates the references in RIS format in file in the current database. This command is essentially the same as addref, but it uses the ID fields in the input data to update existing references with the same ID. If the ID of a reference is not existent in the database, a new entry is created, ignoring the ID specified in the RIS or risx file. Currently refdb does not check whether the new dataset has any similarity with the old one having the same ID. If you tell refdb to update a reference, it uses whatever you send to this end. Options command Pipe the output through command. database Specify the database. encoding Select the character encoding for the input data if it is different from the default setting. RIS datasets can use any encoding that your local libiconv supports (see man iconv_open for a list of available encodings), except UTF-16 and UTF-32. RISX datasets carry the encoding in the processing instructions, therefore this option is not needed and ignored. Display a help message explaining the command. filename Write the output to filename instead of to stdout. filename Append the output to filename instead of sending it to stdout. type Select the input data type. Possible values are "ris" (default) and "risx". Other data types have to be converted to one of these types before adding them to the database. Update only the personal information for this reference, i.e. the N1 (notes), RP (reprint status), and AV (availability) fields. This will automatically add the reference to your personal reference list. All other fields will be ignored. Combine this option with the option e.g. to quickly change the reprint status of existing references to IN FILE from NOT IN FILE or from ON REQUEST. username Provide a different username than that of the current user, so e.g. some technician or administrative staff can add references in behalf of a researcher. file All other command-line arguments will be interpreted as filenames to read references from. If no filenames are specified, the data will be read from stdin. Example refdbc: updateref -P foo.ris This command will update the references in foo.ris in the previously selected active database. Only the personal information (AV, N1, RP) will be added or modified for the current user. verbose Synopsis verbose Description Toggles the verbose mode on or off. If the verbose mode is on, the error messages and warnings may be some more comprehensible. Options Displays a help message explaining the verbose command. Example refdbc: verbose Depending on the previous value, this command will either turn the verbose mode on or off. whichdb Synopsis whichdb Description Displays a plethora of information about the currently selected database. Options Displays a help message explaining the whichdb command. Example refdbc: whichdb This will print the information about the active database. Refer to the selectdb command for information how to change the active database. The whichdb output looks like this: Current database: alltypes Number of references: 45 Highest reference ID: 45 Number of notes: 2 Highest note ID: 2 Encoding: ISO-8859-1 Database type: risx Server type: pgsql Created: 2003-12-24 22:27:43 UTC Using refdb version: 0.9.4-pre2 Last modified: 2003-12-24 22:29:05 UTC Files PREFIX/etc/refdb/refdbcrc The global configuration file of refdbc. $HOME/.refdbcrc The user configuration file of refdbc. See also RefDB (7), refdbd (1), refdba (1). RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html> RefDB on the web <http://refdb.sourceforge.net/> Author refdbc was written by Markus Hoenicka <markus@mhoenicka.de>.
refdb-1.0.2/doc/refdbctl.1.xml000644 001750 001750 00000006550 12255421125 016662 0ustar00markusmarkus000000 000000 2005-10-15 refdbctl 1 2005-10-15 RefDB Manual refdbctl refdbd startup script refdbctl start stop restart reload Description refdbctl is a wrapper script to be used as a manual control script for the refdbd(1) daemon. It is also used by the refdb(8) startup script. The script takes care of avoiding multiple copies of the daemon and allows you to stop the daemon without knowing its process ID. Options start Starts the refdbd(1) daemon unless it is already running stop Stops the refdbd(1) daemon restart Restarts the refdbd(1) daemon if it is already running. The existing process is stopped, and a new process is started. reload Asks the refdbd(1) daemon to reload its configuration file. Use this command to let changes to your configuration file take effect without stopping the process. Files /var/run/refdbd.pid The run file containing the process ID of the running refdbd process. See also RefDB (7), refdbd (1). RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html> RefDB on the web <http://refdb.sourceforge.net/> Author refdbctl was written by Markus Hoenicka <markus@mhoenicka.de>. refdb-1.0.2/doc/refdbd.1.xml000644 001750 001750 00000057733 12255417422 016341 0ustar00markusmarkus000000 000000 2005-10-13 refdbd 1 2005-10-13 RefDB Manual refdbd the application server of RefDB refdbd dbs-port default-database dbserver log-destination encoding IP-address log-level log-file port PID-file note-share-mode time confdir libdbidir refdbd dbs-port dbserver log-destination encoding IP-address log-level log-file port PID-file username password confdir libdbidir Description refdbd is the application server of RefDB(7). refdbd contains most of the application logic of RefDB and interacts with the database engine. refdbd must run somewhere in your network to do anything useful with the RefDB clients. refdbd usually runs as a daemon and responds to client requests, but it can be started as a regular process for debugging purposes. To start refdbd as a server, use the first command synopsis shown above. It is recommended to use a wrapper script to start and stop refdbd. If you want to start and stop refdbd manually, use refdbctl(1). If you want to run refdbd as a daemon, use refdb(8). Edit the configuration file (see below) to permanently configure refdbd. In addition to being run as a server, refdbd can also be invoked to check, install, or upgrade the main database. Refer to the second command synopsis shown above. Options Runs refdbd to install or upgrade the main database. refdbd will exit after performing the maintenance tasks. In order to perform the maintenance tasks you have to provide a database administrator username and password using the and options, respectively, if your database engine uses access control. Some database configurations (e.g. PostgreSQL on Debian) further require you to run the administrative tasks from a special privileged user account (often called pgsql or postgres). If you use one of the file-based engines (SQLite or SQLite3), you must run the tool from an account which has write permissions in the database folder. refdbd first checks whether a main database already exists. If not, it will attempt to install it. Otherwise, it will upgrade the database to the current version if required. refdbd will print an error message to stderr if the maintenance job fails, and exit with a non-zero exit code. dbs-port Set the port on which the database server listens for incoming connections. The default is 3306 for MySQL and 5432 for PostgreSQL. This option does not apply if you use SQLite as your database engine. Runs refdbd to check the main database version and the database engine connection. refdbd will exit after performing the maintenance tasks. In order to perform the maintenance tasks you have to provide a database administrator username and password using the and options, respectively, if your database engine uses access control. If you use one of the file-based engines (SQLite or SQLite3), you must run the tool from an account which has read permissions for the main database file. refdbd will print an error message to stderr if the check fails, and exit with a non-zero exit code. default-database Set a default database to be used for all client queries that do not specify a database. dbserver Select the database server. Currently the values mysql, pgsql, and sqlite are supported to select MySQL, PostgreSQL, and SQLite, respectively. log-destination This specifies the destination of the log information. If destination is 0 or "stderr", the log output is sent to stderr. This should only be used for debugging purposes when refdbd is not run as a daemon. If destination is 1 or "syslog", the syslog facility of the system is used. syslog has to be configured properly to accept refdb's log output. Consult the syslogd(8) man page how to achieve this. If destination is 2 or "file", a custom log file as defined by the -L switch is used instead. If this log file cannot be written to, refdbd falls back to using syslog. encoding Select the default character encoding for new reference databases. Specify the IANA name of the encoding. You can override this default by using the -E option of the createdb command. Displays help and usage screen, then exits. IP-address For external database servers, set the IP address of the box which is running the database server. Instead of the IP address you can also specify the hostname as long as it can be properly resolved by your system. If the database server runs on the same box as refdbd, use the string localhost. Note: If localhost does not seem to work, try specifying the real IP address of the box instead - some database client libraries refuse to use TCP/IP for local connections which may cause mayhem on particular systems. For embedded database engines, this option sets the directory which contains the database files. The default is /usr/local/share/refdb/db. Note: SQLite on Cygwin has a bug which prevents the use of absolute paths. Use a relative path instead by leaving out the leading slash. This assumes that refdbd is started from the root directory. The start script refdbctl does this automatically. Set this switch to allow remote connections to refdbd. Otherwise only connections from localhost (127.0.0.1) will be answered. refdb stores up to four names (full name, official abbreviation, and two user-defined abbreviations) of each periodical. These synonyms are shared by all references that use one of these periodical names. As it sometimes requires some effort to get at the synonyms (public reference data often contains only the official abbreviation), it is desirable to keep these synonyms even if you remove the last reference that uses a particular periodical name. If you use the -k option, the synonyms will not be removed from the database and will be available immediately if you add a new reference using that particular periodical name. If this option is used, refdbd will run an automatic keyword scan each time you add or update references. refdbd will scan the title fields and the abstract field of the modified references for any keywords already present in the database but not in the particular reference. This increases the usability of keywords in queries. There is no speed decrease for the user interaction as the keyword scan is performed in the background. See also the related refdba command scankw which performs a more thorough manual keyword scan. log-level Set the log level to a value between 0 and 7 or to a string value as described in log level definitions. 0 means that only critical log messages will be logged, while a value of 7 means that every log message will be logged. Set level to -1 to disable logging. log-file This switch specifies a custom log file (full path please). This will only be used if the -e switch is set accordingly. port Set the port on which refdbd listens for incoming connections. The default is 9734. PID-file Specify the full path of the file that refdbd writes its process ID to. This PID simplifies stopping and reconfiguring the application server from the command line. The default value is /var/log/refdbd.pid. Start without reading the configuration file. Useful for debugging purposes Enables remote administration via refdba. Starts as a standalone application, not as daemon. note-share-mode Set the default extended note share mode to either public or private. This setting affects the accessibility of extended notes if they do not explicitly carry a share attribute. See the section about notes sharing for more information. time Set the timeout for client/application server dialogue in seconds. name Set the username of the database administrator account. This switch causes refdbd to automatically uppercase all citation keys of newly added references. This makes it more convenient to work with SGML bibliographies. Prints version and copyright information, then exits. Switches to verbose mode. To be honest, currently this doesn't make much of a difference. password The password of the database administrator account. You can pass an asterisk to let refdbd ask for a password interactively. This keeps your password from showing up in the process list. Keep in mind that you have to protect the asterisk on the command line by surrounding it with single quotes. Assume incoming passwords are unencrypted. confdir Specify the directory where the global configuration files are Note: By default, all RefDB applications look for their configuration files in a directory that is specified during the configure step when building the package. That is, you don't need the option unless you use precompiled binaries in unusual locations, e.g. by relocating a rpm package. libdbidir Specify the directory where the libdbi drivers are Note: By default, libdbi (the database abstraction library used by refdbd) looks for its driver files in a directory that is specified during the configure step when building the package. That is, you don't need the option unless you use precompiled libdbi binaries in unusual locations, e.g. by relocating a rpm package. Configuration refdbdrc Variable Default Comment refdblib /usr/local/share/refdb The path of the directory containing shareable refdb files like DTDs, HTML templates etc. Actually, most of the files are in subdirectories of refdblib. dbsport 3306 The port on which the database server listens. Use either 3306 or 5432 for MySQL and PostgreSQL, respectively. This variable is ignored if you use SQLite as your database engine. dbserver sqlite The database server you want to connect to. Use one of mysql, pgsql, or sqlite to select MySQL, PostgreSQL, or SQLite as your database engine, respectively. dbpath /usr/local/var/lib/refdb/db The directory that contains the database files of an embedded database engine. Leave out the leading slash if you use SQLite on Cygwin. logdest 2 The destination of the log information. 0 = print to stderr (for debugging only, don't use when running as a daemon); 1 = use the syslog facility; 2 = use a custom logfile. The latter needs a proper setting of logfile. logfile /var/log/refdbd.log The full path of a custom log file. This is used only if logdest is set appropriately. If you start refdbd from the command line as a regular user, you should specify a file that you have write access to (you may not be allowed to create /var/log/refdbd.log or write to this file as a regular user). loglevel 6 The log level up to which messages will be sent. A low setting (0) will notify you only in case of a meltdown, whereas a high setting (7) allows all messages including debug messages (this is a lot). -1 means nothing will be logged. pidfile /var/log/refdb.pid The file refdbd writes its process ID to. If you start refdbd from the command line as a regular user, you should specify a file that you have write access to (you may not be allowed to create /var/log/refdbd.pid or write to this file as a regular user). port 9734 The port on which refdbd listens. The server and all clients that are supposed to connect to it must agree on the same port. Obviously, this option allows to run several instances of refdbd on the same box if there is a good reason to do so. In this case you should also use separate log and pid files. remoteadmin f Set this to 't' to allow remote administration via refdba. Be aware that this is a security risk. serverip localhost The IP address or hostname of the machine where the database server runs. Use the default (localhost) address if the database server and refdbd run on the same machine. timeout 180 The timeout in seconds. After this time has elapsed, a stalled connection is taken down. Increase this value if you encounter frequent timeout errors due to high network traffic. keep_pnames t Set this to 't' to keep periodical names and synonyms if you remove references. If set to 'f', the names will be removed from the database if the last reference using these names is deleted. db_encoding (none) Specify the default character encoding for new refdb reference databases. If the database server supports this feature (currently only PostgreSQL does), all new databases will use this encoding unless a different one is specified with the createdb command. in_encoding ISO-8859-1 Specify the default character encoding for RIS data being added to databases. dbi_driverdir (none) Specify the directory containing the libdbi driver files. As mentioned above, this is only necessary if you use precompiled libdbi binaries in funny locations. keyword_scan t Set this to 't' to allow an automatic keyword scan after references are added or updated. 'f' will switch off this feature. upper_citekey f Set this to 't' to uppercase all citation keys of newly added references (this makes sure they work with SGML bibliographies). share_default public Whether ("public") or not ("private") to share extended notes between users by default. See the section about notes sharing for more information. remoteconnect f Set this to 't' to allow remote connections to refdbd. By default, refdbd accepts only local connections due to security concerns. no_decrypt f If set to 't', incoming passwords are assumed to be unencrypted. The default is to expect encrypted passwords.
Files PREFIX/etc/refdb/refdbdrc The global configuration file of refdbd. See also RefDB (7), refdb (8), refdbctl (1), refdba (1), refdbc (1). RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html> RefDB on the web <http://refdb.sourceforge.net/> Author refdbd was written by Markus Hoenicka <markus@mhoenicka.de>.
refdb-1.0.2/doc/refdbib.1.xml000644 001750 001750 00000056417 12255421275 016507 0ustar00markusmarkus000000 000000 2005-10-15 refdbib 1 2005-10-15 RefDB Manual refdbib the bibliography client of RefDB refdbib database stylespec-directory log-destination encoding stdin IP-address log-level log-file number port style output-type time name password confdir filename Description refdbib is a command-line client to generate bibliographies with RefDB(7). refdbib reads the contents of filename, which contains a list of citations as an XML document according to citationlistx.dtd, and sends a bibliography in the requested format to stdout. If no input file is specified, refdbib tries to read the data from stdin. Unless suppressed, it also writes a style specification file (either a DSSSL or an XSLT stylesheet) and a CSS stylesheet for HTML output to your disk. refdbib is a low-level tool. It is advisable to use one of the wrappers shipped with RefDB. runbib(1) is a shell script which creates the list of citations, runs refdbib on this list, and transforms the document. refdbnd(1) is a Makefile-based system that encapsulates the bibliography generation and document transformation conveniently. This man page describes only the startup options of refdbib. Please consult the RefDB manual (see below) for a description of the input and output formats, as well as for post-processing instructions that are required for some output types. Options database The name of the default database. You can change the database anytime during an interactive session. stylespec-directory Specify either a full path or . to use the current working directory for the output of the style specification and CSS files. The latter case is what you usually want if you run refdbib from the directory where your LaTeX or SMGL/XML document is stored. This is also the default if you do not specify a directory at all. log-destination log-destination can have the values 0, 1, or 2, or the equivalent strings stderr, syslog, or file, respectively. This value specifies where the log information goes to. 0 (zero) means the messages are sent to stderr. They are immediately available on the screen but they may interfere with command output. 1 will send the output to the syslog facility. Keep in mind that syslog must be configured to accept log messages from user programs, see the syslog(8) man page for further information. Unix-like systems usually save these messages in /var/log/user.log. 2 will send the messages to a custom log file which can be specified with the option. encoding Select an output character encoding. If this option is not used, the bibliography data will use the character encoding of the database. See iconv_open(3) for a list of available encodings. stdin This is a crutch to make reading data from stdin possible on platforms that do not allow automatic detection of data on stdin, like Windows/Cygwin. On other platforms, refdbib automatically reads data from stdin if data are available. Displays help and usage screen, then exits. IP-address Set the IP address of the box which is running the application server refdbd(1). Instead of the IP address you can also specify the hostname as long as it can be properly resolved by your system. log-level Specify the priority up to which events are logged. This is either a number between 0 and 7 or one of the strings emerg, alert, crit, err, warning, notice, info, debug, respectively (see also Log level definitions). disables logging completely. A low log level like 0 means that only the most critical messages are logged. A higher log level means that less critical events are logged as well. 7 will include debug messages. The latter can be verbose and abundant, so you want to avoid this log level unless you need to track down problems. log-file Specify the full path to a log file that will receive the log messages. Typically this would be /var/log/refdba. This switch turns errors caused by missing references (i.e. cited but not available in the database) into warnings, causing refdbib to return 0 instead of an error code. number Use this option to specify where the numbering of the references is supposed to start. The default is 1. This option comes in handy if you need to cobble together composite bibliographies or per-chapter bibliographies that still need to be numbered consecutively. port Set the port of the box which is running the application server. Start without reading the configuration files. The client will use the compile-time defaults for all values that you do not set with command-line switches. Use this option to request a raw instead of a cooked bibliography. Raw bibliographies are not formatted in any way and are processed with the standard DocBook or TEI stylesheets instead of with the RefDB driver files. style Specifies the bibliography style. This controls the formatting of the bibliography and the in-text citations when the document is processed. output-type Select the output type. Use db31 to generate DocBook SGML bibliographies, db31x for DocBook XML bibliographies (DTD-based, up to 4.3), db50x for Docbook V5 XML bibliographies (schema-based), teix for TEI P4 XML bibliographies, tei5x for TEI P5 XML bibliographies, bibtex for BibTeX bibliographies, and rtf for RTF bibliographies. The type of output also determines the type of style specification file, if any, that will be generated in addition to the bibliography for formatting purposes. This is only a matter of concern if you want to process a DocBook XML document with the DSSSL stylesheets: In this case you should use db31 with this option. The SGML bibliography element is also a valid XML element, but you will get a DSSSL driver file instead of a XSL driver file when you use db31x. Note: In the current implementation, the teix option will also return a DocBook bibliography which needs to be transformed to a TEI bibliography with the bibdb2tei.xsl stylesheet. The tei5x option creates a directly usable TEI bibliography. time Set the timeout for client/application server dialogue in seconds. A connection with unsuccessful read or write attempts will be considered as dead and taken down after this amount of time has elapsed. name Set the username for the database access. Note: This username need not be identical to the login name of the user. This is the username required to access the database server. Prints version and copyright information, then exits. Switches to verbose mode. password Set the password for the database access. Note: This password need not be identical to the login password of the user. This is the password required to access the database server. Send passwords unencrypted. confdir Specify the directory where the global configuration files are Note: By default, all RefDB applications look for their configuration files in a directory that is specified during the configure step when building the package. That is, you don't need the option unless you use precompiled binaries in unusual locations, e.g. by relocating a rpm package. Diagnostics The exit code is 0 if all went fine. It will be 1 if the command returned an error, or if there was a general error condition during startup like a lack of available memory. Configuration refdbib evaluates the refdbibrc configuration file at startup to initialize itself. refdbibrc Variable Default Comment refdblib (none) The path of a directory containing shareable files like DTDs, HTML templates etc. defaultdb (none) The default database. refdbib will use this database unless you specify the databases in the citation elements of your documents. pager stdout The command line of a pager that accepts the output of refdb on stdin to allow scrolling and other nifty things. stdout sends the data to stdout. passwd * The password which is used for authentication with the database server. It is potentially evil to store unencrypted passwords in disk files. At least make sure that the init file is not readable for anyone else. The default setting causes refdbib to ask for your password interactively. port 9734 The port on which refdbd listens. Change this for all clients and the server if this value interferes with another program using this port. serverip 127.0.0.1 The IP address or hostname of the machine where refdbd runs. Use the default (localhost) address if the clients and refdbd run on the same machine. timeout 180 The timeout in seconds. After this time has elapsed, a stalled connection is taken down. Increase this value if you encounter frequent timeout errors due to high network traffic or refdbs overload. username login name The username which is used for authentication with the database server. This may be different from the login name of the user. verbose f Set this to t if you prefer verbose error messages. logfile /var/log/refdbib.log The full path of a custom log file. This is used only if logdest is set appropriately. logdest 1 The destination of the log information. 0 = print to stderr; 1 = use the syslog facility; 2 = use a custom logfile. The latter needs a proper setting of logfile. loglevel 6 The log level up to which messages will be sent. A low setting (0) allows only the most important messages, a high setting (7) allows all messages including debug messages. -1 means nothing will be logged. outtype db31 The type of output generated. Use db31 for DocBook SGML bibliographies, db31x for DocBook XML bibliographies, teix for TEI XML bibliographies, and bibtex for BibTeX bibliographies. outformat (none) The bibliographic style to be used for the output. This is the name of a style as it was previously added to the database. stylespecdir . A path to a directory (including the trailing directory separator) that will receive the stylesheet driver files. The default setting will direct the driver files to the current working directory that most likely contains the input files. It should rarely be necessary to use a different setting. startnumber 1 The number where the reference numbering starts at. This option is mostly useful for compiling advanced bibliographies or for C boneheads who insist that counting starts at zero. toencoding (the database encoding) The character encoding for the bibliography output. If this is not specified, the data will use the same encoding as the database. ignore_missing f If this is set to "f", missing references (i.e. cited but not in the database) will throw an error. If set to "t", you'll get a warning but missing references will not cause refdbib to return an error. no_encrypt f If set to 't', passwords are transmitted unencrypted. The default is to encrypt passwords.
Examples The first example shows how to create a DocBook SGML bibliography file. $~ refdbib -d myrefs -S "Br.J.Pharmacol." -t db31 -D "." mypaper.id.xml > mypaper.bib.sgml This command will use the database myrefs to retrieve the references defined in mypaper.id.xml. They will be formatted according to the bibliography style called Br.J.Pharmacol. and will be redirected into the bibliography file mypaper.bib.sgml. The DSSSL driver file (it will be automatically named after the bibliography style, that is Br.J.Pharmacol.dsl) will be stored in the current working directory. The second example shows how to create the BibTeX bibliography from your LaTeX document (it is assumed that you ran latex at least once before this command. $~ refdbib -d myrefs -S "name" -t bibtex mypaper.aux > mypaper.bib This command will use the database myrefs to retrieve the references defined in mypaper.aux. The intermediate bibliography database will be stored in mypaper.bib and will serve as an input file for bibtex. For the sake of consistency with bibtex, it is possible to specify the auxiliary file without the .aux extension (mypaper in the above example). If you are working on a long document that cites the same references over and over again, it may be prudent to preprocess the .aux file in order to eliminate duplicates (duplicates do not confuse bibtex but they waste space): $~ sort mypaper.aux | uniq | refdbib -d myrefs -S "name" -t bibtex > mypaper.bib The runbib script does exactly this kind of preprocessing automatically. Files PREFIX/etc/refdb/refdbibrc The global configuration file of refdbib. $HOME/.refdbibrc The user configuration file of refdbib. See also RefDB (7), refdbd (1), runbib (1), refdbnd (1), refdba (1), refdbc (1). RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html> RefDB on the web <http://refdb.sourceforge.net/> Author refdbib was written by Markus Hoenicka <markus@mhoenicka.de>.
refdb-1.0.2/doc/refdbjade.1.xml000644 001750 001750 00000021631 12255421354 017004 0ustar00markusmarkus000000 000000 2005-10-17 refdbjade 1 2005-10-17 RefDB Manual refdbjade transform SGML and XML documents containing RefDB bibliographies refdbjade name jade-args prefix stylesheet format variable[=name] file Description refdbjade uses the stylesheet driver file that you created with runbib(1) and feeds it to Jade/OpenJade to transform your DocBook SGML or XML document to one of the supported output formats. Note: If you prefer to transform your DocBook XML document with the XSL stylesheets as most people do these days, please use refdbxml(1) instead. Options Prints a command synopsis on the screen and exits name Change the value of an entity declaration to include marked sections. Multiple entries are possible. These are passed as options to Jade/OpenJade. jade-args Set additional command line options for Jade/OpenJade prefix This determines a prefix that is added to all filenames that Jade/OpenJade create. This can be useful to avoid filename conflicts if you transform or use several DocBook documents in the same folder. stylesheet This selects the stylesheet driver file. This file is generated by refdbib(1) (which in turn is called by runbib(1)) and contains additional formatting information. format Select an output format with this option. Possible values are html, rtf, dvi, pdf, ps, tex, to generate HTML, RTF, DVI, PDF, PostScript, or JadeTeX output, respectively. Use tps and tpdf to create PostScript or PDF output, respectively, from the intermediate JadeTeX output generated by any of the switches dvi, pdf, ps, or tex. This is useful if you have to edit the intermediate JadeTeX file, e.g. to manually shift pagebreaks. If your DSSSL engine of choice is OpenJade, you can use htmlr to generate raw HTML output (the same as HTML but without these funny linefeeds in the end tags). variable[=value] Change the value of a variable in the stylesheet. Multiple entries are possible. These are passed as such to Jade/OpenJade. The syntax "variable" causes "variable" to be set to "#t". The extended syntax "variable[=value]" sets the variable to the given value. file The names of one or more SGML or XML files. Each document will be processed separately. Configuration Instead of using the command-line switches, refdbjade can also be configured by means of the refdbjaderc configuration file. As with all refdb configuration files, you may maintain a global copy in /usr/local/etc/refdb/ and one copy per user in $HOME. refdbjaderc Variable Default Comment jade_includearg none Change the value of an entity declaration to include marked sections. Multiple entries are possible. These are passed as options to Jade/OpenJade. jade_variable none Change the value of a variable in the stylesheet. Multiple entries are possible. These are passed as options to Jade/OpenJade. The syntax "variable" causes "variable" to be set to "#t". The extended syntax "variable[=value]" sets the variable to the given value. jadeargs none Set additional command line options for Jade/OpenJade. Use e.g. "-E 0" to disable the maximum error limit outformat tex Set the default output format. Supported values are tex, html, rtf, dvi, pdf, ps, tps, and tpdf
Environment SGML_CATALOG_FILES This environment variable is consulted to resolve public identifiers in the SGML source documents. It is advisable to keep local copies of the DTD files and add OVERRIDE YES to the top of your catalog files. This ensures that the local copies are used and avoids unnecessary network traffic. Example Here we'll use the files generated in the last example above (see runbib) and generate a nicely formatted PDF file: ~$ refdbjade -d J.Biol.Chem.dsl -t pdf mypaper.sgml To obtain HTML output, you just change the output type switch: ~$ refdbjade -d J.Biol.Chem.dsl -t html mypaper.sgml See also RefDB (7), refdbib (1), runbib (1), refdbxml (1). RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html> RefDB on the web <http://refdb.sourceforge.net/> Author refdbjade was written by Markus Hoenicka <markus@mhoenicka.de>.
refdb-1.0.2/doc/refdbnd.1.xml000644 001750 001750 00000024712 12255421472 016506 0ustar00markusmarkus000000 000000 2005-10-16 refdbnd 1 2005-10-16 RefDB Manual refdbnd creates a skeleton document and a Makefile for RefDB Interactive mode: refdbnd Non-interactive mode: refdbnd basename doctype pubtype database style encoding css-file fo-driver html-driver xhtml-driver Description This script should be the first choice for novices for creating new SGML,XML, or RTF documents for use with RefDB(7). If called without arguments, the script runs in a novice-friendly interactive mode and collects a few answers about the new document. Based on these answers it will create a skeleton document as well as a custom-tailored Makefile that performs all necessary steps to create formatted output from the document. Alternatively you can call this script from a directory that contains an existing SGML, XML, or RTF file. Pass the full name to the script when it asks for a filename, and the script will try to guess some of the settings from the existing file. The script can create the following document types: DocBook SGML Versions 3.1, 4.0, 4.1 DocBook XML Versions 4.1.2, 4.2, 4.3, 5.0 TEI XML Versions P4, P5 Rich Text Format (RTF) Version 1.9 (M$ Word 2007 and earlier, OpenOffice, AbiWord, and most other contemporary word processors) The skeleton documents created by the script contain the appropriate prolog for the selected document type. If required (SGML, DTD-based XML), an external entity is declared in the internal subset in order to include the bibliography. Options basename The basename of the document, i.e. sans extension. If you want to end up with foo.pdf, use foo doctype Available options are db31, db40, and db41 for DocBook SGML; db41x, db42x, and db43x for DocBook XML; teix for TEI XML; rtf for RTF pubtype This is one of set, book, or article for DocBook, and TEI.2 for TEI. This argument is ignored by the other document types, but must be present nonetheless (pass "foo" or "bar", depending on your mood). database The name of the database that contains your references. style The name of the bibliography style. encoding The character encoding of the document. css-file The name of a CSS file for the HTML output. This option is meaningless for RTF documents and can be left out. fo-driver A custom driver file for fo output. Please consult the manual for the requirements of such a driver. This option is meaningless for RTF documents and can be left out. html-driver A custom driver file for html output. Please consult the manual for the requirements of such a driver. This option is meaningless for RTF documents and can be left out. xhtml-driver A custom driver file for xhtml output. Please consult the manual for the requirements of such a driver. This option is meaningless for RTF documents and can be left out. Makefile Targets The Makefile is set up to process your document properly depending on its type. The following targets are available for SGML and XML documents: html Creates a set of HTML files. pdf Creates a PDF file. ps Creates a Postscript file (SGML documents only). rtf Creates a RTF file. The Rich Text Format can be edited by most Word Processors. Not all FO processors offer RTF output, so this target may not work for XML documents with your setup. all This is the default if you call make without specifying a target. It will build all of the above targets. htmldist Creates a .tar.gz archive of the HTML files. pdfdist Creates a .tar.gz archive of the PDF file. ps Creates a .tar.gz archive of the Postscript file (SGML documents only). rtf Creates a .tar.gz archive of the RTF file. dist This will build all of the above archives. clean This will remove all built files, except for the source document using the full citation format. shortclean This will remove all built files, including the source document using the full citation format. For RTF output there is only a default target which you can invoke by running make without an argument, and the "clean" target which removes generated files. Files PREFIX/share/refdb/db/examples/Makefile.template PREFIX/share/refdb/db/examples/Makefile.rtf.template The templates used to create the Makefile. See also RefDB (7). RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html> RefDB on the web <http://refdb.sourceforge.net/> Author refdbnd was written by Markus Hoenicka <markus@mhoenicka.de>. refdb-1.0.2/doc/refdbxml.1.xml000644 001750 001750 00000022551 12255421735 016706 0ustar00markusmarkus000000 000000 2005-10-17 refdbxml 1 2005-10-17 RefDB Manual refdbxml transform XML documents containing RefDB bibliographies refdbxml fop_config_file fo_processor xslt-processor stylesheet format file Description refdbxml uses the stylesheet driver file that you created with runbib(1) and feeds it to an XSLT processor to transform your DocBook or TEI XML document to one of the supported output formats. If printable output is requested, the intermediate FO output will be further processed by a FO processor. Options fop_config_file The path to a custom configuration file for the FO processor FOP. fo_processor The name of the FO processor used to transform FO files into printable output. Supported values are fop (default), passivetex, xep, and xfor. Prints a command synopsis on the screen and exits variable Define a variable that is passed to Jade/OpenJade. Multiple entries are possible. This can be used to conditionally include or exclude parts of the document according to which variable is set. xslt-processor This determines the XSL processor that is to be used. refdbxml currently knows to handle Xalan, XT, Saxon, and xsltproc. stylesheet This selects the stylesheet driver file. This file is generated by refdbib(1) (which in turn is called by runbib(1)) and contains additional formatting information. format Select an output format with this option. Possible values are html\fr, rtf, and pdf. file The names of one or more XML files. Each document will be processed separately. Configuration Instead of using the command-line switches, refdbxml can also be configured by means of the refdbxmlrc configuration file. As with all refdb configuration files, you may maintain a global copy in /usr/local/etc/refdb/ and one copy per user in $HOME. refdbxmlrc Variable Default Comment xslt_processor xsltproc The name of the XSLT processor used to transform XML documents to html or fo files. Supported values are xsltproc (default), xalan, xt, saxon, saxon-xerces (using the xerces parser instead of the built-in parser) xslt_classpath /usr/share/java Specify the directory which contains the Java classes for Java-based XSLT processors. This variable is not required if you use a non-Java processor (xsltproc). fo_processor fop The name of the FO processor used to transform FO files into printable output. Supported values are fop (default), passivetex, xep, and xfor. fo_classpath /usr/share/java Specify the directory which contains the Java classes for Java-based FO processors. This variable is not required if you use a non-Java processor (passivetex). fop_config_file (none) The path to a custom configuration file for FOP. outformat html Set the default output format. Supported values are html, xhtml, pdf, and rtf. Be aware that pdf and rtf are not supported by all FO processors.
Resolving Public Identifiers Public identifiers can be resolved to local files if you have a working XML catalog on your system and if your XSLT processor supports XML catalogs. xalan and saxon require additional Java classes to support XML catalogs. For further information, please consult Bob Stayton's book about XSLT. Files /usr/local/etc/refdb/refdbxmlrc The global configuration file of refdbxml $HOME/.refdbxmlrc The user configuration file of refdbxml. /etc/xml/catalog The global XML catalog file, used to resolve public identifiers. Please note that the location of this file is system-dependent. Also, some XSLT processors do not support catalogs, and others require additional classes or plugins to do so. Example We'll transform our document (which is either a DocBook or TEI XML document) to a nice-looking PDF file with the following command: ~$ refdbxml -d J.Biol.Chem.fo.xsl -t pdf mypaper.xml Note that we used the FO stylesheet for this purpose. If we want HTML output, we need to change the output type switch and use the corresponding HTML stylesheet: ~$ refdbxml -d J.Biol.Chem.html.xsl -t html mypaper.xml See also RefDB (7), refdbib (1), runbib (1), refdbjade (1). RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html> RefDB on the web <http://refdb.sourceforge.net/> Author refdbxml was written by Markus Hoenicka <markus@mhoenicka.de>.
refdb-1.0.2/doc/refdbxp.1.xml000644 001750 001750 00000021466 12255421773 016543 0ustar00markusmarkus000000 000000 2005-10-17 refdbxp 1 2005-10-17 RefDB Manual refdbxp converts short and full citation formats in SGML and XML documents containing RefDB citations. refdbxp input-format refdbxp Description refdbxp allows the interconversion of the short and full notation of citations in the supported SGML and XML documents of RefDB(7). See the RefDB manual (see below) for information about the two notations. The conversion is round-trip safe, and it supports mixing short and full notation in the same source document. Full-notation citations will use the correct encoding for first and subsequent citations of the same reference. You should be aware that refdbxp is not a SGML or XML-aware tool. It is a simple text replacement tool with some restrictions: If you comment out citation elements, they still count as if they were present when the first/subsequent citation issue is resolved (refdbxp simply doesn't know about the concept of a comment). In the following example, the citation in the last line will be the only one transformed, but it will be formatted as a subsequent citation of reference 9, not as the first citation: <!-- <citation role="REFDB">9;</citation> first occurrence --> <!-- other stuff inbetween --> <citation role="REFDB">9;</citation><!-- second occurrence --> If you use SGML/XML tags within a comment and nest this comment ingeniously between the start tag and the end tag of an element relevant for refdbxp, you shoot yourself in the foot. You do not want to use code like this (why would you, anyways?): <citation role="REFDB"><!-- </citation> -->2;5;9;</citation> refdbxp does not include external entities. The whole document refdbxp is supposed to convert needs to be in one chunk. refdbxp currently does not support multiple databases per document. One way to work around the problem with comments is to create a copy of your master source and use a small script to remove comments just before you process and transform your text. To work around the fact that refdbxp does not treat external entities correctly, use a tool like sgmlnorm (shipped with the Jade/OpenJade packages) to preprocess the document. To work around the missing support of multiple databases, well... just wait. Options Prints a command synopsis on the screen and exits. Create citations using the short notation. The default is to use the full notation. input-format Select the type of input. Currently supported values are db31 (DocBook SGML version 3.1 or later), db31x (DocBook XML, all versions), and teix (TEI XML). Example Lets first try the most common usage of refdbxp. The following command expands all citations, regardless of whether they are written in short or full notation, to the full notation and writes the result to a new file foo.full.sgml. The input from foo.sgml is assumed to be DocBook SGML: ~$ refdbxp -t db31 < foo.sgml > foo.full.sgml The following command goes the other way. This time we convert all citations of a TEI XML document, regardless of whether they are written in short or full notation, to the short notation and write the result to a new file: ~$ refdbxp -t teix -s < bar.xml > bar.short.xml The last example shows how to treat documents that consist of several files. The DocBook SGML master file foo_master.sgml includes several other subdocuments as external entities. Treating those files individually with refdbxp would screw up things as the first/subsequent citation issue would not be treated correctly and collisions of automatically created element IDs would result. The following command comes to the rescue and expands all citations in the document correctly: ~$ osgmlnorm -dn /usr/local/share/sgml/docbook/4.1/docbook.dcl foo_master.sgml | refdbxp -t db31 > foo.full.sgml You may have realized that there's two small problems with this procedure. First, using (o)sgmlnorm will also include the external entity that contains (or will contain once it's created) the bibliography element created by refdb. One way around this is to use a mock file that just contains the entity reference in a comment. Lets assume your document foo.sgml wants to include the bibliography by using the entity declaration bibliography at the proper location. The entity is declared in the declaration subset at the top of your sourcefile as the external file foo.bib.sgml. Then you should create a file foo.bib.sgml with the following contents: <!--&bibliography;--> We have to outcomment the entity reference as these may be nested, i.e. the parser would try to replace this entity again and fail because the entity is already opened. After the conversion you just need to uncomment the parameter entity. If you like long commands, you could do this on the fly like this: ~$ osgmlnorm -dn /usr/local/share/sgml/docbook/4.1/docbook.dcl foo_master.sgml | refdbxp -t db31 | sed 's%<!--\&bibliography;-->%\&bibliography;%' > foo.full.sgml Second, (o)nsgmlnorm will not output the internal declaration subset that we need at least to declare the parameter entity for the bibliography. You could fix this with a sed command along the lines of the command shown above or add it back manually. See also RefDB (7), refdbnd (1). RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html> RefDB on the web <http://refdb.sourceforge.net/> Author refdbxp was written by Markus Hoenicka <markus@mhoenicka.de>. refdb-1.0.2/doc/runbib.1.xml000644 001750 001750 00000041657 12255422145 016370 0ustar00markusmarkus000000 000000 2005-10-16 runbib 1 2005-10-16 RefDB Manual runbib creates RefDB bibliographies runbib fo-driver html-driver xhtml-driver database encoding css-file IP-address name jade-args number style output-type name password filename Description This shell script is a wrapper for the bibliography client refdbib(1) to simplify the creation of bibliographies. For SGML and XML documents, runbib first runs openjade or xsltproc(1), respectively, to retrieve a list of citations from your source document. Then it runs refdbib(1) to generate the bibliography as an external entity based on the extracted citation information. It will also create stylesheet driver files with the formatting information for subsequent document transformations. For BibTeX documents, runbib uses the information in the .aux file to retrieve a bibliography file that you can use as an input file for bibtex(1). Options fo-driver The full path of a custom XSL driver file for printed output. This file has to import the appropriate RefDB fo driver file. html-driver The full path of a custom XSL driver file for HTML output. This file has to import the appropriate RefDB html driver file. xhtml-driver The full path of a custom XSL driver file for XHTML output. This file has to import the appropriate RefDB xhtml driver file. database The name of the default database. encoding Select an output character encoding. If this option is not used, the bibliography data will use the character encoding of the database. See iconv_open(3) for a list of available encodings. CSS-file Set the path or the URL of a CSS file to be used by the (x)html output Displays help and usage screen, then exits. IP-address Set the IP address of the box which is running the application server refdbd(1). Instead of the IP address you can also specify the hostname as long as it can be properly resolved by your system. name Change the value of an entity declaration to include marked sections. Multiple entries are possible. These are passed as options to Jade/OpenJade. jade-args Set additional command line options for Jade/OpenJade number Use this option to specify where the numbering of the references is supposed to start. The default is 1. This option comes in handy if you need to cobble together composite bibliographies or per-chapter bibliographies that still need to be numbered consecutively. Use this option to request a raw instead of a cooked bibliography. Raw bibliographies are not formatted in any way and are processed with the standard DocBook or TEI stylesheets instead of with the RefDB driver files. Skip the ID extraction step of runbib. You have to provide an aptly named XML file containing the requested IDs. style Specifies the bibliography style. This controls the formatting of the bibliography and the in-text citations when the document is processed. output-type Select the output type. Use db31 to generate DocBook SGML bibliographies, db31x for DocBook XML bibliographies, teix for TEI XML bibliographies, bibtex for BibTeX bibliographies, and rtf for RTF bibliographies. name Set the username for the database access. Note: This username need not be identical to the login name of the user. This is the username required to access the database server. password Set the password for the database access. Note: This password need not be identical to the login password of the user. This is the password required to access the database server. Configuration Instead of using the command-line switches, runbib can also be configured by means of the runbib configuration file. As with all refdb configuration files, you may maintain a global copy in /usr/local/etc/refdb/ and one copy per user in $HOME. Keep in mind that the runbib configuration file covers only those options which are not passed to refdbib(1) as that tool has its own configuration file. refdbjaderc Variable Default Comment jade_includearg none Change the value of an entity declaration to include marked sections. Multiple entries are possible. These are passed as options to Jade/OpenJade. jadeargs none Set additional command line options for Jade/OpenJade. Use e.g. "-E 0" to disable the maximum error limit outformat db31 Set the default output format. Supported values are db31 (DocBook SGML 3.1 and later), db31x (DocBook XML 3.1 and later), db50x (DocBook XML 5.0 and later), teix (TEI P4), bibtex, and rtf.
SGML Output refdbib generates two output files in addition to the ID listing created by Jade/OpenJade. runbib creates another output file from these. Assuming you have a source file foo.sgml and use the bibliography style J.Biol.Chem. you will get: J.Biol.Chem.dsl This is the DSSSL driver file file that encodes some additional formatting information specific for the chosen bibliography style for use in subsequent document transformations. This file will be written to the present working directory. The driver file is a dual-purpose stylesheet for HTML and printable output. foo.id.xml This is the intermediate XML file that encodes the citations in foo.sgml. foo.bib.sgml This is the file that holds the DocBook bibliography element. You have to include this file as an external entity into your source document to integrate the bibliography into your text. J.Biol.Chem.css This is a CSS file which contains formatting information used by the html output. XML Output refdbib again generates two output files as for the DocBook SGML output above, and we also count the ID listing created by xsltproc. However, runbib does a little post-processing, so you'll get two additional files in the end. Assuming you have a source file foo.xml and use the bibliography style J.Biol.Chem. you will get: J.Biol.Chem.fo.xsl This is the XSL driver file used for printable output, containing additional formatting information specific for the chosen bibliography style. This file will be written to the present working directory. J.Biol.Chem.html.xsl This is the XSL driver file used for HTML output, containing additional formatting information specific for the chosen bibliography style. This file will be written to the present working directory. foo.id.xml This is the intermediate XML file that encodes the citations in foo.xml. foo.bib.xml This is the file that holds the DocBook or TEI bibliography. You have to include this file as an external entity into your source document to integrate the bibliography into your text. J.Biol.Chem.css This is a CSS file which contains formatting information used by the html or xhtml output. Bibtex Output refdbib creates one output file with the reference information. If your document is named foo.tex, latex will create a file foo.aux which refdbib uses as an input file. The refdbib output file will then be named foo.bib and can be used by bibtex as an input file. RTF Output refdbib creates one output file with the reference information. If your document is named foo.rtf, rtfcitations extracts the citations and writes them into foo.id.xml which refdbib uses as an input file. The refdbib output file will then be named foo.bib.rtf and can be used by refdbrtf as an input file. Example You should run this script from the directory where your document files are stored, as all output will be written to the present working directory by default. The following command will create a DocBook SGML bibliography file together with a DSSSL stylesheet driver file for the DocBook SGML document mypaper.sgml. The output files are tweaked to match the citation and bibliography style of the "Journal of Biological Chemistry", which was added to the database with the name "J.Biol.Chem." previously. All references which do not contain a hard-coded database name are assumed to be in the database bar. ~$ runbib -d bar -S "J.Biol.Chem." -t db31 mypaper.sgml Files PREFIX/etc/refdb/refdbibrc The global configuration file of refdbib(1), which does most of the work of runbib. $HOME/.refdbibrc The user configuration file of refdbib. See also RefDB (7), refdbd (1), refdbib (1), refdbnd (1), refdba (1), refdbc (1). RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html> RefDB on the web <http://refdb.sourceforge.net/> Author runbib was written by Markus Hoenicka <markus@mhoenicka.de>.
refdb-1.0.2/doc/runbib-missing.1.xml000644 001750 001750 00000011466 12255422247 020035 0ustar00markusmarkus000000 000000 2011-03-08 runbib-missing 1 2011-03-08 RefDB Manual runbib-missing displays references not found by runbib(1) runbib-missing basename runbib-missing basename.bib.xml basename.id.xml runbib-missing Description runbib(1) may report that it was unable to locate some or all of the references cited in the document, but it will not tell you which ones were missing. runbib-missing collects a list of the ID values which caused these failures and sends them to stdout. Options basename The basename, optionally including a path, of your document. runbib-missing assumes that the ID file is called basename.id.xml, and the bibliography file is called basename.bib.xml. This is always the case if you use tools like runbib(1) and refdbnd(1) to create your bibliographies. Using this option is the simplest and recommended way to run the script. basename.bib.xml The relative or full path of the bibliography file created by runbib(1). Displays help and usage screen, then exits. basename.id.xml The relative or full path of the ID file created by runbib(1). Optionally you can pipe the data into stdin instead of specifying the file as a parameter. Configuration runbib-missing does not use any configuration files. Example For the least amount of typing, you should run this script from the directory where your document files are stored. Then the following command will diplay the IDs, if any, of all RefDB citations which were not found in the database during the most recent runbib(1) invocation on your document thesis.xml. ~$ runbib-missing -b thesis See also RefDB (7), refdbib (1), refdbnd (1), runbib (1). RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html> RefDB on the web <http://refdb.sourceforge.net/> Author runbib-missing was written by Markus Hoenicka <markus@mhoenicka.de>. refdb-1.0.2/doc/refdb-init.8.xml000644 001750 001750 00000010100 12255422531 017113 0ustar00markusmarkus000000 000000 2005-10-15 refdb-init 8 2006-06-09 RefDB Manual refdb-init RefDB setup script refdb-init Description refdb-init is an interactive shell script that guides the system administrator through the initial setup of RefDB(7). refdb-init asks all necessary questions and performs all necessary checks before any changes are committed. Your confirmation is required before your system will be touched. As many of the operations performed by this script require root permission, you have to run this script from a privileged account. While refdb-init does check for an existing installation of RefDB and offers to back up existing configuration files, it is not yet designed to upgrade an installation appropriately. If used to upgrade an existing installation, the administrator is responsible to back up and restore data that may be overwritten during the setup. refdb-init performs the following tasks (you can interactively skip some of the tasks): Creates the main database refdb for the selected database engine. If a copy of the main database already exists, it asks for permission to delete this database before proceeding. Creates a configuration file for refdbd(1), the RefDB application server. If the file already exists, it will keep a copy of this version. Creates a configuration file for refdba(1), the RefDB administrative client, in the current login account. If the file already exists, it will keep a copy of this version. Starts refdbd, the RefDB application server Loads the bibliography and citation styles shipped with RefDB Creates a reference database Creates a database user with permissions to work with the reference database Files PREFIX/etc/refdb/refdbdrc The configuration file for refdbd /root/.refdba The configuration file for refdba for the root account See also RefDB (7), refdbd (1). RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html> RefDB on the web <http://refdb.sourceforge.net/> Author refdb-init was written by Markus Hoenicka <markus@mhoenicka.de>. refdb-1.0.2/doc/refdb-bug.1.xml000644 001750 001750 00000003657 12255417734 016752 0ustar00markusmarkus000000 000000 refdb-bug 1 February 26, 2005 RefDB Manual refdb-bug RefDB tool: writes text file containing summary of RefDB's configuration refdb-bug Description RefDB is a free and portable reference and notes database as well as a bibliography application that serves a similar purpose for SGML, XML, and LaTeX documents as Reference Manager or EndNote do for word processor documents. This script creates a text file (./refdb-bug.txt) containing useful information about RefDB's configuration. This file can be attached to bug reports to aid in debugging. See also RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html> Author RefDB was written by Markus Hoenicka <mhoenicka@users.sourceforge.net>. This manual page was written by David Nebauer <david@nebauer.org> for the Debian project (but may be used by others). refdb-1.0.2/doc/refdb_dos2unix.1.xml000644 001750 001750 00000004644 12255420440 020013 0ustar00markusmarkus000000 000000 refdb_dos2unix 1 February 26, 2005 RefDB Manual refdb_dos2unix RefDB tool: convert file formats from DOS to Unix refdb_dos2unix -h file1 file2 Description RefDB is a free and portable reference and notes database as well as a bibliography application that serves a similar purpose for SGML, XML, and LaTeX documents as Reference Manager or EndNote do for word processor documents. The bibliography part is something like bibtex for markup languages. RefDB consists of an application server which interacts with a relational database on the server side and a variety of clients (including refdba and refdbc) on the workstation side. These clients perform the common tasks of a reference database, like adding and searching entries, as well as generating bibliographies. refdb_dos2unix is a helper utility that converts a file from DOS format (newline = \r\n) to Unix format (newline = \n). See also RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html> Author RefDB was written by Markus Hoenicka <mhoenicka@users.sourceforge.net>. This manual page was written by David Nebauer <david@nebauer.org> for the Debian project (but may be used by others). refdb-1.0.2/doc/refdb_latex2utf8txt.1.xml000644 001750 001750 00000005304 12255420536 021006 0ustar00markusmarkus000000 000000 2006-08-11 refdb_latex2utf8txt 1 2006-08-11 RefDB Manual refdb_latex2utf8txt converts bibtex bibliographic data to UTF-8 plain text refdb_latex2utf8txt Description refdb_latex2utf8txt is a helper tool which is used by bib2ris-utf8 to clean up the output of bib2ris. It is implemented as a filter which reads from stdin and writes to stdout, without any command-line options. Diagnostics The exit code of refdb_latex2utf8txt is always 0 (zero). Data Processing The conversion that this tool performs was designed to facilitate the import of reference data from bibtex, through bib2ris (1), to RefDB. Foreign and special characters which are encoded as LaTeX commands are converted to their UTF-8 counterparts. All other LaTeX command are stripped off. See also RefDB (7), bib2ris (1). RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html> RefDB on the web <http://refdb.sourceforge.net/> Author refdb_latex2utf8txt was written by Markus Hoenicka <markus@mhoenicka.de> based on a similar script by Peter Csizmadia. refdb-1.0.2/doc/refdbsru.1.xml000644 001750 001750 00000021331 12255421700 016702 0ustar00markusmarkus000000 000000 2005-10-16 refdbsru 1 2007-03-16 RefDB Manual refdbsru CGI script providing SRU access to RefDB databases refdbsru Description refdbsru is a CGI script which turns your web server into a proxy RefDB server providing SRU (Search and Retrieve via URL) access. Anyone with a web browser or some other tool capable of sending HTTP requests can query your RefDB databases. This script is not intended to be run by users. It is invoked by your web server. The output of the script is a XML document as described in the SRU standard. Configuration refdbsru evaluates the file refdbsrurc to initialize itself. The parameters starting with "zeerex_" do not actually influence how the script operates. They provide some of the site-specific information which appears in the SRU explain output. refdbsrurc Variable Default Comment logfile /var/log/refdbsru.log The full path of a custom log file. This is used only if logdest is set appropriately. logdest 1 The destination of the log information. 0 = print to stderr; 1 = use the syslog facility; 2 = use a custom logfile. The latter needs a proper setting of logfile. loglevel 6 The log level up to which messages will be sent. A low setting (0) allows only the most important messages, a high setting (7) allows all messages including debug messages. -1 means nothing will be logged. serverip 127.0.0.1 The IP address or hostname of the machine where refdbd runs. Use the default (localhost) address if the clients and refdbs run on the same machine. port 9734 The port on which refdbd listens. Change this for all clients and the server if this value interferes with another program using this port. timeout 180 The timeout in seconds. After this time has elapsed, a stalled connection is taken down. Increase this value if you encounter frequent timeout errors due to high network traffic or refdbd overload. username login name The username which is used for authentication with the database server. passwd The password which is used for authentication with the database server. pdfroot (none) This value will be used as the root of the paths to PDF or Postscript offprints that can be specified with the AV field in a RIS dataset. The path should not rely on shell expansion, e.g. use /home/me/literature/ instead of ~/literature/. The pdfroot allows you to shorten the paths that you enter for each dataset and to maintain a certain portability if you have to move the offprints to a different directory or want to access them remotely. The html output routine will concatenate the relative path of each dataset with the pdfroot to construct the link to the offprint. Instead of a local path name you can specify an URL starting with http:// or ftp:// if your offprints are accessible through a web server or ftp server. cssurl (none) In spite of the parameter name, this may be the URL either of a Cascading Style Sheet (CSS) file, or of a XSLT file. This file, if specified, is used to format the SRU output in the web browser. dbserver (none) This is the name of the database engine that refdbd uses (currently either mysql, pgsql, sqlite, or sqlite3). refdbsru can obtain this value at runtime, but it has to send one additional query per searchRetrieve or scan operation. If you provide the value here instead, response times will be faster. zeerex_host www.change.me The hostname of the computer that runs your web server and refdbsru zeerex_port 80 The port that your web server listens to. zeerex_database cgi-bin/refdbsru The path section of the URL which provides SRU access to your database, without the leading slash. zeerex_host, a slash, and this option combined make up the URL which a user has to type into his web browser to access your SRU service. zeerex_databaseInfo_title Reference Database A public name of your database. zeerex_databaseInfo_description A reference database A brief description of your database. zeerex_databaseInfo_author Your Name The name of the person who is in charge of running the database. zeerex_databaseInfo_contact your@email How to contact the database maintainer. Usually the email address.
Environment As a CGI script, refdbsru evaluates a variety of environment variables that the web server provides. These are: REQUEST_METHOD Either GET or POST QUERY_STRING The query string proper in a GET request. PATH_INFO This value, if present, is used as the name of a database (other than the preconfigured default database). Files PREFIX/etc/refdb/refdbsrurc The global configuration file of refdbsru. See also RefDB (7) refdb-sruserver (1) RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html> RefDB on the web <http://refdb.sourceforge.net/> SRU (Search and Retrieve via URL) <http://www.loc.gov/standards/sru/> Author refdbsru was written by Markus Hoenicka <markus@mhoenicka.de>.
refdb-1.0.2/doc/refdb-sruserver.1.xml000644 001750 001750 00000021031 12255420345 020207 0ustar00markusmarkus000000 000000 2007-08-11 refdb-sruserver 1 2007-08-11 RefDB Manual refdb-sruserver Simple SRU server for RefDB databases refdb-sruserver Description refdb-sruserver is a simple standalone web server which povides a SRU service for RefDB databases. It is intended solely for local single-user access. For anything more ambitious, please see the CGI version of the SRU service, refdbsru(1). Before starting the SRU service, make sure to set up the refdbsrurc configuration file which it shares with the CGI variant. The RefDB application server refdbd(1) must also be up and running. Now start the script which will run in the foreground until you kill it with Ctrl-c. The SRU service is available at the URL http://localhost:8080. Pointing your web browser to this address should return the output of the SRU explain command in a nicely formatted page. To run real queries, append the SRU query strings to the above URL. Configuration refdb-sruserver evaluates the file refdbsrurc to initialize itself. It shares this configuration file with refdbsru(1), the CGI variant of the SRU service. The parameters starting with "zeerex_" do not actually influence how the script operates. They provide some of the site-specific information which appears in the SRU explain output. refdb-sruserverrc Variable Default Comment logfile /var/log/refdb-sruserver.log The full path of a custom log file. This is used only if logdest is set appropriately. logdest 1 The destination of the log information. 0 = print to stderr; 1 = use the syslog facility; 2 = use a custom logfile. The latter needs a proper setting of logfile. loglevel 6 The log level up to which messages will be sent. A low setting (0) allows only the most important messages, a high setting (7) allows all messages including debug messages. -1 means nothing will be logged. serverip 127.0.0.1 The IP address or hostname of the machine where refdbd runs. Use the default (localhost) address if the clients and refdbs run on the same machine. port 9734 The port on which refdbd listens. Change this for all clients and the server if this value interferes with another program using this port. timeout 180 The timeout in seconds. After this time has elapsed, a stalled connection is taken down. Increase this value if you encounter frequent timeout errors due to high network traffic or refdbd overload. username login name The username which is used for authentication with the database server. passwd The password which is used for authentication with the database server. pdfroot (none) This value will be used as the root of the paths to PDF or Postscript offprints that can be specified with the AV field in a RIS dataset. The path should not rely on shell expansion, e.g. use /home/me/literature/ instead of ~/literature/. The pdfroot allows you to shorten the paths that you enter for each dataset and to maintain a certain portability if you have to move the offprints to a different directory or want to access them remotely. The html output routine will concatenate the relative path of each dataset with the pdfroot to construct the link to the offprint. Instead of a local path name you can specify an URL starting with http:// or ftp:// if your offprints are accessible through a web server or ftp server. cssurl (none) In spite of the parameter name, this may be the URL either of a Cascading Style Sheet (CSS) file, or of a XSLT file. This file, if specified, is used to format the SRU output in the web browser. dbserver (none) This is the name of the database engine that refdbd uses (currently either mysql, pgsql, sqlite, or sqlite3). refdb-sruserver can obtain this value at runtime, but it has to send one additional query per searchRetrieve or scan operation. If you provide the value here instead, response times will be faster. zeerex_host www.change.me The hostname of the computer that runs your web server and refdb-sruserver zeerex_port 80 The port that your web server listens to. zeerex_database cgi-bin/refdb-sruserver The path section of the URL which provides SRU access to your database, without the leading slash. zeerex_host, a slash, and this option combined make up the URL which a user has to type into his web browser to access your SRU service. zeerex_databaseInfo_title Reference Database A public name of your database. zeerex_databaseInfo_description A reference database A brief description of your database. zeerex_databaseInfo_author Your Name The name of the person who is in charge of running the database. zeerex_databaseInfo_contact your@email How to contact the database maintainer. Usually the email address.
Files PREFIX/etc/refdb/refdbsrurc The global configuration file of refdb-sruserver. See also RefDB (7) refdbsru (1) RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html> RefDB on the web <http://refdb.sourceforge.net/> SRU (Search and Retrieve via URL) <http://www.loc.gov/standards/sru/> Author refdb-sruserver was written by Markus Hoenicka <markus@mhoenicka.de>.
refdb-1.0.2/doc/rtfcitations.1.xml000644 001750 001750 00000006715 12255422072 017613 0ustar00markusmarkus000000 000000 2005-10-17 rtfcitations 1 2008-01-31 RefDB Manual rtfcitations Extracts RefDB citations from a text file and writes them into an XML file using the citationlistx.dtd. rtfcitations Description rtfcitations reads a plain text document (such as the word processor format RTF, hence its name) from stdin and scans it for particular character sequences which denote RefDB citations. The citations are converted to an XML document following the citationlistx.dtd and sent to stdout. The input document may be any structured or non-structured text which sticks to the following conventions: Simple citations Enclose the RefDB citation key in double square brackets, as in "[[Miller1999]]". Multi-head citations Enclose each RefDB citation key in square brackets, and surround the entire multi-head citation with another pair of square brackets, as in "[[Miller1999][Doe2001]]". The resulting XML file can be fed to refdbib to generate a bibliography file containing the cited works. Options Prints a command synopsis on the screen and exits. Example The following command extracts all citations from foo.rtf and writes them to foo.id.xml: ~$ rtfcitations < foo.rtf > foo.id.xml See also RefDB (7), refdbib (1). RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html> RefDB on the web <http://refdb.sourceforge.net/> Author rtfcitations was written by Markus Hoenicka <markus@mhoenicka.de>. refdb-1.0.2/doc/refdbrtf.1.xml000644 001750 001750 00000006375 12255421562 016705 0ustar00markusmarkus000000 000000 2005-10-17 refdbrtf 1 2005-10-17 RefDB Manual refdbrtf build RTF documents with RefDB bibliographies refdbrtf bibfile Description refdbrtf takes a RTF bibliography file (such as created with refdbib) and inserts the citations and the bibliographic listing into the file the bibliography was created from. The source RTF document is read from stdin, and the compound RTF document is sent to stdout. Options bibfile The path to the RTF bibliography file. Prints a command synopsis on the screen and exits Example We have authored a source document called mypaper.rtf which contains a variety of citations. Then we invoked runbib which provided a matching bibliography file called mypaper.bib.rtf. The following command will combine the two RTF files to a new compound document with resolved references and a bibliographic listing: ~$ refdbrtf -b mypaper.bib.rtf < mypaper.rtf > mypaper.refdb.rtf See also RefDB (7), refdbib (1), runbib (1). RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html> RefDB on the web <http://refdb.sourceforge.net/> Author refdbrtf was written by Markus Hoenicka <markus@mhoenicka.de>. refdb-1.0.2/doc/refdb-pubmed.1.xml000644 001750 001750 00000007437 12255420100 017426 0ustar00markusmarkus000000 000000 2009-10-28 refdb-pubmed 1 2009-10-28 RefDB Manual refdb-pubmed retrieves an XML representation of Pubmed (http://pubmed.org) entries by their Pubmed IDs refdb-pubmed -d database -h -m mode -t type PMID Description refdb-pubmed retrieves datasets from the Pubmed database using the efetch utility. refdb-pubmed reads Pubmed IDs (PMIDs) either as parameters from the command line, or on stdin. Input data should contain PMIDs separated by non-digits (spaces, tabs, newlines, commas,...). All results are written to stdout. Options database Specify the Pubmed database to query. Allowed values are pubmed, pmc, journals, or omim. Default is pubmed. Displays help and usage screen, then exits. mode Specify the retrieval mode. Allowed values are xml, html, text, and asn.1. Default is xml. type Select the retrieval type. Allowed values are uilist, abstract, citation, medline, or full. Default is full. See also RefDB (7), med2ris (1). RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html> RefDB on the web <http://refdb.sourceforge.net/> Author refdb-pubmed was written by Markus Hoenicka <markus@mhoenicka.de>. refdb-1.0.2/doc/manual.css000644 001750 001750 00000002647 11512721663 016213 0ustar00markusmarkus000000 000000 h1 {font-family: Verdana, Arial, Helvetica, sans-serif; color: #00B000} h1.sect1 {font-family: Verdana, Arial, Helvetica, sans-serif; color: #009900} h2 {font-family: Verdana, Arial, Helvetica, sans-serif; color: green} h3 {font-family: Verdana, Arial, Helvetica, sans-serif; color: #006600} code.filename, code.option {color: #660099; font-size: 110%; font-weight: bold;} code.sgmltag, code.envar {color: #009966; font-size: 110%; font-weight: bold;} b.command {color: #990000;} div.variablelist dt {color: #990000; font-weight: bold;} table th {color: #990000; font-weight: bold;} div.warning, div.warning h3.title {color: red;} pre.screen, pre.programlisting { background-color: #E0E0E0; } span.guimenu, span.guimenuitem, span.guisubmenu { font-family: sans-serif; } /* give keycaps a '3D' shaded look */ strong.keycap, b.KEYCAP { padding-left: .2em; padding-right: .2em; border-style: solid; border-top-width: 2px; border-left-width: 3px; border-right-width: 3px; border-bottom-width: 4px; border-top-color: #eeeecc; border-left-color: #eeeecc; border-right-color: #999977; border-bottom-color: #999977; background-color: #ddddbb; /* All these borders may interfere with text on the line bellow. Make the text a little smaller to try and 'pull up' the bottom edge, */ font-size: smaller; } refdb-1.0.2/doc/refdbmanualfig1.png000644 001750 001750 00000016141 12247746334 017763 0ustar00markusmarkus000000 000000 ‰PNG  IHDRƒ…¹J”» cHRMz&€„ú€èu0ê`:˜pœºQ<gAMA±Ž|ûQ“sRGB®ÎébKGDÿÿÿ ½§“ pHYsÄÄ•+¸IDATxÚí ˜MåÞÆoB*•G*ŠâRÉAQGQÅ‹päô!D—z‘‘ºäEq"zãP*}pä¢Pd ¥×G”“:¦R™PR½û^«5³öžµÖþ˜½÷ì½öý»®}ÍÌÞkí½g}<÷óüŸÿÿ~ÊüB!2–2NÒaB!1B!1B!1B!1B!1B!1B!1B!1B!1B!1B!1B!1B!1BDV"Þ´I«¶8PpÂwëı ¹µ;F ½[WŽBbŽ_ªÖDÞÀgüw´¶­Aþµºj„¾Ca"!„!„!„!„é)K²Ë›W?¿l&0ïà‡ýÀ€z:³BYiõmæü'6µ/ÓÙB_‰{óC¯2øsë}Æß~<| ðÍgæßt=ÃÜ~Æ`r.°çß@NWàçc@³òÌ×û Øð/`ê@àæ‘ÀM÷}֯׀ÿ|ý)P¯ðàKÀiUu%!2šÔ }µ è2,Ðxßgþ½0³˜ý1°u pà+àÅ}@Í‹M! ³†w> L\ ¼ý¢í½> ˆÈ€æŸm1~C$~¦ßŒzxá[àäŠÀªê*Bhd2ßä´³€úÍ‹þþx=pF5ó÷K¯6­šw,zý×_€/w Z˜ÿ¹gÑkO:Þº²@?ÿ‹u€2í›ÿEÑvWdßçë*BH R曜zVÑïGò¶íË=wëCÁÛ= ”µ}ý3ÿü¶HX(¤\yàÇEÛ1üô¯éÀ#†7îÒU „¤Ì7)ckø+TΫ<õQð6œ[(ìýW6ç ,Ù^cH‰ÂPålàx`›*ÕŠ^Ýè:hÒ> ï^/ˆéënß¾*T@:ut !$ †‹šš!œ¬rÀ£=Í äKZmÞÿ Þj5ÞzhÕÝ|í—Àü1Àm“]›€~Íç)¦×GoÌ-Ú'JjÖ¬‰ºuë¢C‡¸ûî»qùå—ëj¢زe zÜ1Ô—ÿ[ù“€­¹oe°^cqÏw­{šóöpüx`›N¦0\Õ©èùs.ÿø[àç=œ}žù|¹“¾9ÀßgTþÔ6æ¯W¥J >£FÂܹsÑ©S'Œ9Íš5ÓÝ)D9xð v^ÕhÛÇwÿ[õéý2ldÀÔÎ9;CŽBm`êïíªÕþ±¥øûYÛ\Õ¹økað8"˜:u*öî݋ŋV­Zá@›6mt— !Ò†,‚ØáœG÷ÜsOáskÖ¬1 ;;vÔB¤<ò&*!ƒ B­ZµŠ=Ï8&CGœW˜7oNœ8¡ƒ%„øytÀ€Ÿ~ú)úöí‹ÚµkcÚ´i(((ÐABH üHÏž=æ˜îٳǼ¼<0!„ÄÀdeeyެm^zé%Ô«'GU!ÒË ™„sDÞ¹ß%}Û±D¼éá}{•óüwaìÙ Ô©à::xì±ÇŒ¹'˜u¤ #!| ís(_!1°óÈ]pøðaÿðKë¡aÆ®/stÀIãPX“Ð¥KÝ0B¤E§ÏÅ ™89"³€•ËôCãè@bPD¦6|L#mÒ¤ 6mÚTøç8‰Üºuk¼õÖ[¨^½ºn6!RË ùçÃZ×ÝZôšÝyÚ Óùìó™y¦µhÎ ÎLš4)HÖ¯_o„ˆvî܉–-[?…)ŠÝ ™¼Ý ™XŽÈå+9"Ó2ç”ÓÓþ_—ÄV óQ¹re,]ºU«V-¬T¶F!¢ƒ–,æœ1c†‘¢°º'7d;^ŽÈiNBÂDc›†/öôåE٣ݵøKëVÞÿÿ˜18vìXPæÂÀš+d¤Ì"!‚a#ÏÎÒŽ;Œd ºó'S³ ìm3;/!x¹!/Gd‰Aq^Y»Û»Môß•ºs#ª¬^V 82p‚G,RëÞ½»« Ðçˆ7]Q…ð3¼Ö·nÝZØàó'…À­0Óm;UüÇ/Vâá†LÜ‘%.ozrÓDÎoäçz % ñprýùçŸwf`Ýpà ¸ä’KðÌ3Ϩµ¾æúë¯wMÅ.Ö¦F¼o˜ ‘pÜ܉›#²МA)` Âþýû A`ȸ62‘,X`Ì/ágÂjÚ™9s&²³³“óÅ,7äéúä˜Ï[®ÉtC~v}{ð~œtæºí« 4oÞ·Ýv›!„a¢qãÆé _ÃTìHæÍh ß¿0‰ÿáøñã˜={vÐk†H‡ÐB¤+Æ ó|½W¯^?~¼”ÄÀÿ\xá…([¶¬ãk?ó / ''Çõõë®»Nsgƒ0,yÈ.l^ü¼e*ÎP*E`6'Œ=êø:WN³W3 ‘·ç’%FM€¼¦Y€É$Šüü|G &Q¼ú꫉K!ÅH¿#}ø 07Ðà?h$k_–¶žóݺu+ÌŸvcĈFÆ‘éÀ† ŒÐN‹-Š¥X³óóàƒk†óú§°bŸµçž{®ñ:áß+W®4RI#†&’ÛÖøîx?°7ÃÄ€=ù¡W™û¹õ>ão¿0ÍŸ¾ùÌüÛZ·¸ëæÏC€É¹î¦RN†RÛ×™ï}VÀÏ7€SÏLú¿Ìu "éõXËhºÕ.‘*0®sçÎFŠôŠ+Œ9/.ÿʺV ?òÈ#F%1ÓC§L™b†…µ|,€B‡ëî¡›ð¡µþë­·i–#ƒ¯vÃçÎì%æß sÌ4-–†Ïø;pe‡@ã}ðâ>àÞ¦7S)'C©¿/@óT@î›o†™–Ï6Å"Éзˆ=~™'L˜`„„Ü`ojݺujmDʬ8†<­Þ=áœ+î‡nxŽ úôéSl.K øùóç!¢h LÉ£“à1 çGýæEÓüŒßK½/½Ø´h’^f7•"vS)ËPŠ…#–¡ÅàÄÏÀ¾/ËÛ˜$Àžo;¼1XÌ^c£¬5˜ßô ´§9êâe*åf(Uæ$Ó§|G '³a©9y\‚9 BãÆÑ£G x©íÛ·/¼x™}ѨQ#,\¸0h’˜ 3-¬‘ËñY‰É›Óšxædø3‹±¿I'ßÝ•Þ[Œe矟òbÀÐÈO/ÆOWøïTÝ´×^{­«ÐNš/ØIâœX"ëxú>Ÿ[.ö§¯ž“áb@zÆu>ß´ˆAs—‰›©”—¡ÔÀIf6QÕšÀ„%þªlÄïdª¨Ûp9´Ç;pàÀ žMÛ¶ml‹ÐŠL.™IKì‘#GbÖ¬YX½zµ±¿Eå‹.Çþ¶}|w”ÿ./}¾kËñ“ÏAåÜÏç°˜ý œc§&’PQÌP|x*þ{M†…‰,(;ÕkS7„ßÖ2• ÅÚ†¦RNγ_Åõ_`–ÙA6s!/ `øµ‡ö ˜uÁì"ZS„öÆ8ÁÆ5„(m¬Z‚HB£œ £ÿ;< áã‘A:̬,#šslðÓ…jŸ|ò‰ë{Ыˆó ‹-Òâ7"å°×„Ž`YSÀ aÆÆOvb„Ä cá$oƒ Œ°Qhº³‡8áæUW@1hÚ´©1¼V‘H¬Zfý°`ŒiÑVïŘ$Âcxüþûï£_¿~AÙmÚ´Áí·ßvö¼èÙÂL%º6Ê£E¤ÂÈ—scêíû¹–&ÆýîaÆo$†8Rp ¹ÁIe®i¦R\ gH"5´ï“Ï^¶l™gÊ!SwÃyC•˜Ò4OŒóg2Ðr…™D^0S®T®íhÏ_¸ã¹~ Ð÷à¦Ó™÷¤e{¥îf`†c©Œ·Æ’ͰCN,ÕOèú¯AC“ô4d=ƼyóŒÃ,Ö³g_Ùá„=G^Ìã„h¸œú´Ã)1#Ñ—M £Ãz˹”™Dn0#‰çvÕ< ‹¦Ý9øíWàwã—gÖü+ð^à÷+²ÓêßHˆT+S€zãZû²a¯7°oLû1<Ä+6NŒ»:e %<¯>RSÀH ›ÁÅÐkŸ8ÂÞý³Ï>k4@֢ь V­Ze<¾ëÚµ«Ñ(ñ\Åš‹Å<ÑŽÓùày»³©™>½r®™E7i-Pé4óóêç¾oÃVæs\ª‘ûÐÇërÝ÷uû¼(!;9<þœ s[ÐÞkÛñÁ{‚áQz±Æ¡T£Ñ^ë¬]šÿEÑ6×vvo“‹j8àG¥N$¦€‘ïçb èµOz Ìu§ñòxÀFŒ kŠBÏž=£_„=óD;Nç£ÜÉ@~`¿óÏçn^™ô<5 èû0P§‘ûqvÛ×íóh á(Œpñ õð¼Z瀓Ҵ¹æ9Hê}˵ôO|oÃ*L$R?|) ½ÈÏË8™²NÄkŸ`ríÚµ†°ÉÜ ãÖ^ ­¸ÁëEø`Š/…• a³fb1O Åí|ð¼µ`>ߤ}àKî1Cì…Z—îå~ÎC÷õú¼výã6 ‹åø[ŸÅù6>˜a‰sB3—b¹Öíçûç}ôüo‰H¢5ô2´šPSÀpûDÉÓO?mÄÿ£ð¥pðQ8éO+>8¿@k×¹›X̃ö÷8§Uuþ<Ž ?¯ºóq>ÍÅ.BSH÷Áƒãµ×^‹úøµn]ò1…‡ó;|tèÐÁðïJÈüY,׺W§]†¿G&‹+£¦ ¼“6‰›("1üÁfúçeHœLÃí%ýû÷7< ¢ K°ñv[ˆâ)ÌcÏ”5$žîš±˜'Ú‰ä|ØaÜÿ¸í^‹Vp#4…doœþY¡“Ñàuœ£9¬mà\'™æp˵nñáZsN¡ÁÕiÙ,$D z½ûë·òœØ›‡Û×Âäñ±/¤Ao!§Þ-o¶²eˆ½!ã^Òïf x‰ÍôËË8™†Û'¬ WøE.¢ÐÛ)–†ˆÇš1k†‡">'F{>B©ÛØœÔdØ‚Ÿç*Šæü_UÜx“»e>¢ ¹ÿHπᡤtÂb¹ÖIîËÀÖ·€!ÓÓ¶}KˆT>§>½Å‡+m[ƒ_cXZ£$®úÄêcŽšnˆÙ3KN¦€¡Ã_7C@âf èµOI.Ú¬¬Âì,k"™'’£±w‚=Nf±ñ±/˱˜'F{>‚†MZÕŽfh¢q;Ó¦½¤ç? ì˜Ð<‘N$S8b‹GÝÏ5qÌYÒ‰öZ§@Lé9,an×c´™Ñ•éb ŠàÍA/Ð1i¥Ñˆ>öž¼rµ£"RSÀH íÛ…šºíÏŽG ·ÊFƒ†Ž¬0wÄ‘’  [qö@y~J\a‹yb´ç#ÛVÅ^óbó5Ö†0Å´e×âû¸íëöy1ŒØØÙáˆÇŸU÷ÑWò˜³ÃÃP\vvvéVÜG{­S„_>˜öm•Ä 0®j_瀹ØlÔÙ«Š¤ÅŠOö¶ÜЦDH›V½ºáìÊ'}Ù[õÊ8𵋄$†’§%Ø´+t~À NT>÷Üs†)½X,³f|•ñV'xóÉÆZ”6œ_aE°µä%¯K¦–òa·jçhÁ.¼®SŠE¤°$Ë8-t4©iX8͸ÁôG†’hÆe‰oθåQs"”ÛÒµ4t$ñ뻋QkÛß]˜?ÿxnKý‰s6z§l\Œ*ùïüè€ee·¥à½eá¯q¦œòÁì¢DÎ ðÔxc:ÊçÎõÝ98QÂbÍô$Ã8­r•ÏŒÐ4̯ù×ÎáÃxçwŒô9ÂL f^8ÍПi¨¼¡œVFc¦ÌçÛ7«KSŠ0~ÏŽÌ;,ü£ „Ë"^Uàñ:_m{_£/Ä Æi×t ¿MbÉü€lØé­Âa5‡ÝN!'©Y%ÿjkùK‘jp¤Ê°h8kŠXŠ,E¦ŠA2ŒÓœ(Ü6°WÎe- oˆh¼˜¬ì‹P!à€": àâB¤\ã‘•…¥K—¢e˖Ƶëk?®¾új,‰A„$Ã8-”H¶‰’.HÔ=.ènâF¡Ùs999FŠ*3¢5 {{x“VÔ3%uèСFçÅ8ê¥ë)=¸èþøãÂ0逰qãÆ m8ŸFA`HUH |c©Na >Çá³~…£vˆvíÚ…5j8nCòn¸Á·KèJ „ÓI¹P8³ˆ5jô3/Jš®*DºÜ_ýµëë¹¹¹èÝ»w‰W°‹4ËÌ.l^ü<Í2çý^\Çd•égÔ'1(8f‡?9™ööÛofO°Ç¤QÈ}ôѰÛpŽaĈ¥ÿeíf™¥´€PBGk‰xÓwïLjJT²8~`/²Ú”lMV Gs¢ÍÊ©^´h‘ñ<'Ù´ ÈÜ<·œà½ÂIç„Ø»'Ë,3ÅàÓÖëJwêX>Œnݺ =[È*܉fÝX!Òý~`ïz|Ù Öœ - Ùxq'f™5R»“§ÒÖàTIÉ ŸùÓŒòpJu³°Â04j/.£°èlëÖ­†@päÀ¿í$ΧU«V-þ.¨É0Ë”d,(ãÄ/Z^ìœüêׯ_¡°$_ xr²»¦çÑŽ; a @péÍÙ³gÇw5µÒ0Ë”øV[•”œ$¦Œ;Ö˜ã’ôBDGÌ|Xk€$„Ò0ËÌ1hÒª-œðÝEyâX†ÜÚ£†ºW³ªÒ‚3W^y%Ž9bÁÂ… e:'Dª“,³ÌLƒ_ªÖDÞÀgüw‘l[ƒük]_æ$XèB‚Š+"!!"MH„Yf&ŠA¦B;j'Ž=jØK0[ÈiyK!D)’,³ÌGEgq‚Ù^9Óœ;`ZiÊTR !„Ä þDRI¹bŠáQ!R …‰â«Š,X๠Óå˜IÔ¤I0!„Ä m8ñ³™Iá¨À-üC{ Zõ¶iÓFÇT‘²¤W˜(œ ýõ’8ÆtˆhS¦Î™3§Øóô¢ ÝæÍ›%B J § H9~Èÿ<¢M§M›T.O!™õïß_©¤B$‰Jï-Fùïò|÷۵ŧbÀÞ:žZt–<Ü|Ðãwp'—ÀP7ÁÎ!Å^Û×™ûœU#ðó çÏ¢ 8½·µÍMÍá•sÍT±IkßëæëÃl¦TNˆ‚Ìœ9Óø«’ÑH‹®ŠZ·XˆäÁP첇|ºDì­×úxd@wÀSN7ÝüÆÞ\ÝÅ,ývr ,wr°› ½ü›ä„Ó{{ÁðÕ9u17Wê*Bøž2¿ýƘM|iÔµ¶8YXÛÓ=Ó‘mkpÏ¡µ˜’3FWŽÂ?B@FuB!’!„!„©IB²‰ïÛ ¬œç¿£µg'PG¾CB‰AD…ŠÛ˜ž7IEND®B`‚refdb-1.0.2/doc/refdbmanualfig2.png000644 001750 001750 00000022522 12247746340 017761 0ustar00markusmarkus000000 000000 ‰PNG  IHDR®®¯ 6î cHRMz&€„ú€èu0ê`:˜pœºQ<gAMA±Ž|ûQ“sRGB®ÎébKGDÿÿÿ ½§“ pHYsÄÄ•+ IDATxÚí tTÕýÇÉd_ I€B‘EQ¡ŠXE–ªˆâJëÑÚŶzjmm]ºjw«mµíßÚÖÖ..uáTiµ. .ˆ »¬DBØ [HB {òŸÏîäÍdÖ$“y“Üï9sf{ïÍ›{¿÷wÛýݸ6'ÄÀ ÆošÀÀ×À ‡Ë7___/‡’Ý»wˉ'äèÑ£ŸƒææfÙ¿‡s9öøñã¯ÏyœßÝÈËË“ŒŒ ÏŽHH!C†tì ?Ÿûõ×^+ãÇ7Ä& ÍæÍ›eÏž=ê¹´´T‘T“‚Æ"¸÷Háù矗íÛ·âF .”AƒÉK/½äþ¬  @=ŠŠŠÂ¾^aa¡8ÁíI{´¥¥Å-ý}¡¼¼¼ÃFâFÁj¸¦ËjKGµ:õ¿Ö¨ß»ËkðhP¯Aȃ`ÈéRpÚͲ§¬ÝØÊ0È­ëúCoÏ‹iUÁêÏ|ðÔö/o¬ÄíÍa_[« T‡ñkõ™Öæà†üEo>ÖDÃθUòûÕ©¥2‘œáÉ>tì­ª˜‡•´û÷ï :æ$®–½{-:k\bH¿Ù› µ˜Ôqé¶=bh²,YðpÒžp›$'ÇÉâ¿ï”äœpþu!Ö„K%1çj÷2¢`¤2d¨”íï"|þNYûáb1è^…PA‚µKõ˜ê!-ÓuuM‹ÚñtØj’sÐðëeËú¿†tü'§Þ,ª†JKc³[W­Úÿ²_Ò²ŠwÐð«åPeœ Ϋ–•¼lXÚ[$.Ðѳ†º£~ÕŒ*«Û kþÜ)wÉ¡#Ò\³°ƒw!TÉ™ê8âW'¶w×¾£EÎÁáÒÃs³êeɳÔ‘ .¾ÁIÚ åY(ÙôRHz~O¹†¸A¨”¿ˆ~Ú¢¼}²hÞƒ$íE3î“{TäkÛGËú— §}^jZΓäÄxY¾ø™€Ç2@¦ÏºßíîҤݻí9exùÃy§ÊžòbqÄ·IÃÑy-(( ÙÈ5ªB#iƒ„mkªk^‘-^Ò<€ãnq’¶NF7É{óË|}ꊻ¥d/Ѫ6ÉË:"[êmŸ¸øÙ¾».,ÒŽ}¦T6¯H›“¸T6ìØðžFéý›ðõj·¥Å9£"Œ¯©Ÿª0'ÛΑ}딡¶ø­ÿ ùÚHÎ)3¿/%»Û%÷ŠÅÏ4ÚFs›ìÚi1ÆYWJks›d:> ëVvº=z{:cÌ7==]=Ÿ<^%YYÙïEÚ¢â3dä¸ÙNÉéUÞ¬·¡øú.#Î*9Õ@ñãb9z¢¤æ]¡ˆ{:Ï­•­ëžs’©Öïïäôï/‡])Éñ¥²eã{RB!Þ‘.õ ­}N¯âÚöˆ:¸M-Nýõ§’äpeD5·åÈÞõ§HëZ¡pxçK!'Õh¯ö¹z衟¼¶C £­.~’TkO{,Ì­‘Íkþ©jøÃÚ¥O„Õ.mâðK\£*Ø¡TcimuéÁ®Å„º’xeº“Ô¶u²uÏG!»»òŠ®÷›bXQ7Úiùß(.Y ráÔ/É®CÙnw:à°¬Zò\H:z ¢«èÍáߘ×qU‘´e†ª–÷ßžÒµü-NTÀi4 Ϋ”¸¶Z9\]$cîUŸ—–¹d ›´¹%²|Ñ+öh›^œ“kkâVvQ±øñý¡­R /iZï•›èl¡Âœ=²móBY¾©Üí„«<Ž#Ÿ€Ðìò%=åjhl‘¾ [·+ëªðçnZft«¥ÙCÂåpLóe×FÏT²m‹ 9ó*ÏAUÙ«²ÖšOA4µ¤É‰“Í}Ö0몂?$·® )ºÕ¾ì¼ÍÃpx÷|YºÉ7 ÛS ‹TÊÆU/„d„u'jŽáEñ\u¬Hˆ!n„ÑÕº®§sÈ¢yÁõÚöÀ‚ $jç$­——,ô{IìƒO›-•µ­Ò?i¬X´¨ÇÛ§¹5Q6ox_¦MgT;¢3Û×SlnÊ'ƒ“vÖw¥dw¼ÅP![7¾,¥Aôê “nrNÕÍrâàó²óT~lO£®!QöU쓾Œ^§*ô?*%k…LZ¤lzÛRY¾(x´Š\‚Æ“{äÃU £úkO&H¦ˆ!noY ¬7i òšdÿö¥ô€gä‘#GIiiI‡s·—lˆºoÔª_ƒq‡ÅˆW!?ë¨ßWÞ¤u¹‘Hæ.ÝôŒG`ÌØq’7xš´ÔíðI\;8ô (’êÖf‘VC\Û¢¢"¼Ê4›Ö¿î—´_þÙ¾»ÝêN—ݤ2¤HN;c–ì(Ë–¦Ê89\²Ô¶m’ѯXk*¤0¿cZ£.Ò³‰ä¾¤_‚#Ñ/iK÷xºŠÊö—ªç /¾J’|N‘VMÅ9“b¢ r*O ‘†ã%2zôh£ãÚRô4q³²Û“mFOø‚}ûWî 0­X%­ÆØñ×Èè3k¥ô ;÷´ûp›ëüï¯6tè0U8$1)Uêëj¤¹¹INž¨Q;á=z¤K«å<ãΚ(’:INÔ5ɲÅ/˃?»Ó×®%”™•嶺ξè~Éɨ•Öæ:ihØ!-Q£d/¶ãJ]v ècö\4Zâó¤¦>WZS“%9)M’ãæXMƒÓÐk'?Ënâ,ƒ!5©QâãZ3B½óóSÊiëqç5]¯ë;ê¢IÉYçH‘–¶~r´&S*’_!k?*·ßþÕ°jªâÚÓ¦M“’í{$!kº4Y+iË+PxÔ©ÝÐU}±¶Zik>. õU*ùœ<ÞææF©©®”'Aš])‰¯*÷»—ØÖ­[;ÌÞƒ«¨¨X=¨ÈÊv­ÔÍÈì'IN)š–- ‰)N‰)ñWà#ÎÑOiÜ Sç¤ÑÖZ#-Mår²æìݳU¶}¼Y~ô£É—¿üeéë°=q ¥ú*¹tÏ=÷ÈìÙ³¯ž”üÓîpé§ýˆ£õ°dg¥É‰ã’–š(ÙÙÙ’••%ƒ»öÆEš2õ²Ø2))©[ï•:GŽQ¯© êÀC¯ÓeîÕs«+À‚ª½'ºÞµÑxpïC‡U뮹C¦L™ÒéòS†¸= \:¾: â-Y²D%{­j¼œdU:4ª™ …….k_?UÁ·Áä$k´ kÐó°½;,ØÞµíðöjZÞo$n„8|øð>MÈW_}U–/_®j¦yæ™r饗ú,CåMÔÞ¼u¼Ø7nt~åN#혬Xñª,[ö^HçõæÄòC û×ߘ15röÙmÒÖ'UUJ(9ã½¹ZcLxú:pƒ¹TÀÇY·Ñƒ 2ªB´Ð×÷ó è¿VŒ3ÆHÜžA‚n¸A9è/ºè¢˜jPï -,}_ª ¬TUUùœÞ<èq¾¿¬/½B„ëã}!PÑÆ5ˆ2D^ÝwÆß'&&ª@ÇàÁƒ%??ß·«`ʻꪫ”´]¶lYHºœµ³½Áw¾ô=¢\¾,oÈRVVT…±›£#ogŸ}¶|ï{ßSCàó¨­­U‘^Î8ã Ù¶m›ê ö2(--UîÈÒÛ·´ïR‡:%îµ×^´þT² 6ÈÎ;eܸq%® qÃÀyç§þyq÷@dRyæ½N…ô–ˆH\_„ç$ò¨Q£Â¾G:7”|¦dò6mÚ¤²ÌfΜéþ®µµUÝ'Ÿƒþýû«\  +Lÿ&çq¾þœ÷ÄïulŠˆÏÃÙ®¹1ëCãÑ@ò‰'*Ò~éK_Šø=3H^{í5ùÕ¯~¥\\ÔA@êliPtÚHÙ U oĈg¼ vÁ7¿ùMùøã;X㑉AHþÏ~ö³JZb\Ù¹ž-Òü£>’÷ßß§!i$n”ðÌ3Ϩç±cÇöÈï!ÙÑA‘fÏ>û¬œvÚiÝz}Œ­P«Ù nàYufbf ôN[aƒâ:±páBÙ¼y³[oÕÖ±¯Dí®Â—7àÛßþvÄÿ£žÖuPàw¿û]Àéi§õ^«ÑÊ9x<ºcíÚµKJJJ”DEe îà õ¯E´·¨—Æ¿í¶ÛT§žuÖYªq0,pÍ`paé38&œÕÀ:I;@âùËÈêLU¥¨¼uû`ÿÉ×uøŒë@à›o¾Y&L˜Òþq“+V(½ý7ZÒ7!š¤E×Ãsð…/|Á–n¥ÔÔT5ˆì05F ÌüOf¼ñãCÛ³cÇø8÷ÜsÃv½Å4qï¸ã%%¬¤}ã7”ó_mR׉8{WW0 £ÇeffvÉ¥¤êÊ”ŽJYº’®ˆ^Kd’¶×D%Mò•W^ ™¸Öûf KåGŽÙ£ž‡¨÷…^>ø@Õ Í3Îptß›nº©ÃùDz0˜Þ´*Ah| þ ×{YIÊ#i ùtµ«ð5­C½jwåÊ•rÁ¨×|ƱH­›ëi_¯uÍ={ö¨ Í%—\ânÃwß}W.¿ürõþÉ'Ÿ”ÏþóJ•áØÿøÇª4qÿñ¨ïÂH_<3¨kô‡w¢O¯!.RèÎ;ï”§žzÊC3gŽÌ˜1ýcäøCùÙÏ~¦t_oK‘£JXS\ëׯ—éÓ§wø=$ƒÕq|$*„ýë_ÿ*·ß~»{0}îsŸsŸg%Ó(ß+øç?ÿ)·Ür‹û^ ŒNhñ¾Ž?XIb½ÞÃ?,ßÿþ÷Õk/×GÂ`å~õqà±Ç“OúÓêõš5kù~ñ‹_¸¿ÿ÷¿ÿí¾g’Ñ!µÖcÿûßÿº›5k–ú|éÒ¥ò™Ï|¦SýÊF3‹/–O|âî>ìUÄEE¸ì²ËdÒ¤Iîϰn‰Öè- 0¸ˆ2555ɺuëT'óÉ º“ˆDñ¬IÆh×ï!5V2Ák‚‚€\ ’1Ýr¼–¢ ,ð˜ÖéØë®sm4DÑR I‡^\\ì–~[¶lq×Wþ¿é=½Cp@Ä}p=ý[HGî]{X¸>×€ˆV©Ï}ðŸ¸o®ñ¬Kב¸úwØ F¼(úúŒÿÁçÏŸ¯VNwV§'ÑGøH“·G‰Ë¨‡ 4°UzâOýÓŸþ¤¦L’>îºë.õÂAjHdlýñ”¿üå/î÷<''GuÆþó%¡è`<zJEo¦“Q=x½jÕ*“ׄáxýZ[îV2¡ÿéB!ZRj n "ø*ÔùxÖ3dÕÞ>gPèó!?F¿áxæD…z:¦™™¬³ÄäÉ“Ýê÷…ôfPÑ.܇výñPÅn¼ñFõžA Ñqy¡¯vÚpë5Äeäß}÷ÝJϲf Aæ+¯¼R½FG%…ïõ4?‚鼦~üˆH¬aš¤:LûG!¶¾ö­·Þê&šž.ÁÚµkÕ©;é­·ÞrO«€ŽÖï!93„–°L§¥| èÿbçéiŸ¥_”@Âêë[ïKmD¡b@tMÚ rêûäw!'Ä%:ñ5q‘öH}M\Úî½÷Þëq¯J@1K܇zHI–¯}íkFÉ¢E‹”ôÄ¥þ󟻉øŽEƘzþùç•'B“ãßø†{ê´ZÆV=ÉhõSÒÁºƒTÖï¸O«äD‡õç'õÙú3ntPE²òÓ5î]{ œXêú5Õ¿…ž«÷ùøã»‰Êÿ@jò¿´d¥} /Ò›c˜]¸j…n¤?Ç3#"\:“\Ãu¸ï®n…`âB ßþö·rõÕW{H[T„/~ñ‹*©º®®NIÝt$S=º u_$ÐW\áîL$—~ ©!ä×ßé€Ït´þŽi–×B@N=•s¬~èÁ±>ú¨{XÁ ÓÄÓz´¯NÕ::°F‘˜HqÔ^ëó‘’`êÔ©ný™sô{î—{×ïyM;ëY…YªbALÚ„Ù ò2‹aPéã1Ìhof£‹/¾8,÷I ©Wyp½hU?Æô.K:!ddú¿þõ¯•'AK1¤ÒÖjŒ ‹1ŦA¼•ëÿþ÷¿—¿ÿýïn¢ÐQLZ…@wÖFÄùéOꞎ!£¾.é÷ 8MZ}mk§¸¥ n!mé÷Áƒ{çm y{ø--Á (ÄÒï™æ‘šd›H{iÝ™kòZ«xW ¥V« ê¿þõ/7q¹oj“¡R#.÷ŽóßQ z:{,âÄE’!Yi,½èüò—¿TDÒS;Dzâ‰'Ü:Ò…†×ÄÓwu*Ò„¡C‘.ú;tTÝ!ú>¬–¿Õ:ç;-µô{ë’!oƒË*q½õ×P³½¸W}]ôZ¼¾ÀÿÑ3÷ŒÊ¢%µžâõ{¾gÀ!UµÞKH]KpÚÒz¼GPXýA[bkX:“߯oÌ2ì‘hF#NÜûî»Ouôw¾ó÷g‡Æ´ê£tâܹs=ÜE4ºUÝ Ñ­”•˜\ËûzV½Ôß§ƒ­þPõ{:Ôªÿz[ÈVÏ„·qúâ‹/z$»£ê ÿO«|oõI3¬Ðꎾë{–<¡÷Zaõâx@þ'3—·ºÀÀ'íSƒl2Tîˆ(vâÚ¼Sº4þUE€Àj¨Ì›7O‘ËÛh±HšLZ·£ÓñxµD «%°¼µ4¤sq‡a±‡ê=éŽ[´À aí Hd´ J<:v@D%.z%À`ðžþ´'Àî€ü¡’6˜4Ž 0ÚP7 _ýõîïÈp#+ÌE¥#J\¦Bü¨Ö)ÝÎðáÒ?ØŠ^9²þÖºyÏ.ɯ w¥±Ž’yC§7jwââ¿¶—ɯ‰/¿t¯!.ú—Ñ‹ÑEÇRæÃÉW ¥Ã0"|e\A>÷å$'ŒÌÃGûJâÁª”ÇŠu)Ð{"¾¯hwÚõüóÏWÿ ¥7ÈIð6ÜzqñâzÁ˜ºæškÄÀ>…t¨þV†G‚`è)Ÿm« Dż#V±¤¿]Ñù<AøM_e©BÉa‡lÚÏî dëal3SDkõoÄYqëà%b¤Ì:cÈèÒ?LÃ:;,xW±!CIïÃ`ýÌ» ’¯%?þ<}蹟>Ðõ"Xø*3*É@Ñ oĈËTCà)€ñáÏð‰†—@»È06tGÂѺÀÓ©ž)øŒÇ’…f×´¿á`ò}Aonbº··-@öäðUß+Ü6Õ…C¬×æÑ 0=‘TÓcÄÅ2ݾ}{éÈgZÚiéÈ{ˆá«#}IXŽ% DKn>ã<’tø 2qm^óÀЈ Ë:jèÌÎAþÔŸpÁ`êÌ,i{׸W*-›>óÇ#5ZQM jwu’ ”óGB#,G˧ۣÄÅ5quÂ8$£Ù Ä>@˜èYJÛ!ºdjî?;”cêQâ"ùãþ¦/Œ€Þ¦U‡P+³tÔ‡®è~ÁtìP§wŽ ä‘Aöç%ðw.Ÿ{Õƒœ±¶ß6~*tV³k¢A¨0»îââââââô!tÙë«r¶µfTˆË¦]‰n±¼ç'?ù‰ZÁ  ø‡¿hkÕø-uAê„hÎ՜߮ mç}@ J©’ûQïm–¯³¬‡N`S>Óv1¡ãê­G;³A^_G_n»n“¸¾Ö1é©‹2?”F¢>‰åã Ø‡µ––Þ•FŸC‚˃>¨ÊÛcKŸKÒ6%šxàD–§Ÿ~Z•ãDßb¥«Ž©àâoadOîmÎub–¸TB¡L’&ÅsÏ=§j´Ò(ì3‰¨Ù…Ag]-ê­kýùÏVFm,Χú¶µ&®t&Ó¦>†ßæ½Éêo¾ù¦Ê¥ õµø}jÙ vk»p®óªÂ~ðIFumpï½÷ªQM‘:¬M ÚåŠeI9ïë_ÿºßc©rn=楗^òøžF?çœs”4¢Nù¥o¿ý¶í¦?»µ]8׉y‰K†¼z¢µàÖÏy#ôH½Î 딩^¯ óõ›ú$¬Þ½‡2Pì«À’jë¦Í¼¶[¹$»µ]8׉yâz½Œ©lõêÕamMÂ9ÇjR1²FÍ_ƒÑØèjú–édi¤¿O,t[¦YÊéDu;#ÚmÎu|•.ªøð[Ù¬G¼ _ýêWÕ3ºdXI•]ÐÙn¸áõL¶¢Gßòô.ë1Öcô©á WIDAT*VÚ²Âék‰ mÎu|{fÿmÛ¶ÙWâ~å+_Qå…(O\HÃÚ3þ@+0 XŸF¹KŒ’@ 3ô0ÊÀ[KšRr“ººì8ÓÕýo{Ñn»p®ÓÓèr™Q¦H® 3ˆ]àùðÞ„Ñ ÊsY jÛJU00ˆ w˜!®A´Œ³`0Ùa1I\“Öž«ÀvMÖÍ 9Ú¢g/ ¬ÿ`À …0 >n,9~`ÂÝÖÍG0žØæ€r°x¨Tƒ÷Ï‚uO ; ˆ¨ß…Ék¾Í{î¹GH.Ù}(\â&7ƒÐ0¥BKJJÔÞÈV¤e£CüÜøÃT­[¢Œ¸ÀØ…‡ ©‡Þû%®³ÃpÉà EÅ .û«Yw\´ ­’ø‘Ò—¢rD P‘hö=F‚²Gÿ—Oé{$*EÁ²eËÔ3ù´•3 "Xñ›ßüFEÄØoN×ÁeS>|ÞßúÖ·Ôf‰´YŸQì–á¤S™QG Ä€)ÑIž¦íº¶ìƉ´ä~‘€ìwÞQÛ¿’ôÂ.´åÌ™3Ý×!JˆŠpÙe—©ÄæìÁAÙ¸›äø‰'ºaWJT‰uëÖ©]%Èô*ƒ0@P0ʬ*GâÛeɨgÑÎp¢SЭ¹‡±cÇÚž¼¨=Z5ÐI6¾T f.½õ)Ó»wéP0y <ÈA@ßÕå[ùŽp+Ò˜ ÀÉãÐ@ ѤO© Þˆv†“þ}ôj¤/ƒÄ®ù觸½vîÜéwï3 4ëžÁ¼·böìÙJ÷eÐ3Ý#у1¾ôrq\^ÌPalí…ˆûŒ~âë>¾}RâF;ÉßAÝ``ˆh¯‚uÜP¡ÕŒNÚÐ[ ƒü¨—Jû£"X—31‹-X°@m¢ˆ1ȱ¨W–¾òµ{¤·º(Xi˜ì°ú+;¥#mƒº¡€>œ5k–Ò™™‘ºÃ]h²Ã :èôHO¼3ÝåfBåbFB]رcGßV ºXüãÇWn=µ¨_ÝvN·;a qcøXm"ÝgÚ!Ú7éì0ïcLF™!n·Àd‡Ä$q#f¦UCÜ€°kv˜?Õ XF™A“¸v¬Ö]çØ}¢vXwcЋ%®Ý²Ã‚Ýg8çô!ã,ÚÙaþЙs z±ªàhg‡uç9}HâF;;¬;Ï1°Lv˜AÄ`²Ã q q q q q q q ú.º9#úhmýÊ•+Uƒ¾êÙ–¸,gÖéS|ÍÀÀ¨ †¸¦ q q q q ¢ˆ¯€˜1c†I47ð ëf*¶#n,”¯70ª‚!®!®A¯Âÿq¶ÀóžºAIEND®B`‚refdb-1.0.2/doc/refdbmanualfig3.png000644 001750 001750 00000052201 12247746344 017763 0ustar00markusmarkus000000 000000 ‰PNG  IHDR&&ÏÄ=Ú cHRMz&€„ú€èu0ê`:˜pœºQ<gAMA±Ž|ûQ“sRGB®ÎébKGDÿÿÿ ½§“ pHYsÄÄ•+ IDATxÚí½xeÚÿ§'@:„ª€(¨¨(»î®kYuÝW]õe]ÔÕK÷]+öW]ËÚËßÞVѵꢀtŽH¯"Ò -’üÎç Ïar2§%çä”Üßë˜Ì™>ó|çîwJUUÕQ(Š8Bºg¤·A¡PÄ1%V®\ö6¿þú«”––\§mÛ¶’íú[Ë–-¥Y³fú–(ÉFL;wî”… Êúõë Qüüóφd¶mÛf&À²½{÷šyˆ„õâÍ›77SЛž.wÞy§\~ùåú–)±&&ÈfË–-òÐCÉüùó 1µhÑÂuÝüü|3ÅüF›É‰]»vÉæÍ›½[Ò´„ ,Ð7L¡ˆbš={¶äææÊ°aÃÍMüå—_\—Ï;Wß0…"^T¹ªªªFuÛ·oïº|Ô¨Qú†)u@j¤wXQQ¡wÕ¡*Š8 & ÙŠj`ðW(q@LŠšÕP®P(¢LLÄÿ(T‚T(ꊨ¿333C^·¼¼\6mÚäú[^^^Ä7lØ`b¥ÊÊʼ!H3„€uëÖygÝ`hÚ´©Jë֭墋.ò»ž¿kS( HL¡DhCFo½õ–¼÷Þ{²hÑ¢ö A…+‰A ÄQ…b®š4i&mÛIvviÒ4_š4+´´LÉÊi))©Y")9²«B¤xc¾¬-Î’Ó¶ï‘æy®ûS;“BÄ,T`Íš5rñÅ#:ºOŸ¾Ò¾èÉi’ïô©²{çÖëïÞU,¥¥»½ïÚ¹]vìØð hÕºƒdddJn^u€'ÇHÏÈ6côØô|©’4Ù[•ë9ï4)ݓ㺿Ê}ÓŽ>NÇò½•²|Õ&9¢O;×mƒ¥Ä(ŠªÒUW]eHéÔÓϓŽ¿‘Òò¦ÕÛ훲}¸!»UÏ r±#µI¦.Ȫ˜$Ó&þè!¦k]çô…"^Ñ ^¹O>ùD~üñG9îø“¤I›K¼¤¯èØ.Gzvéжv’oZZŠtm»Qvn[a¤@W•T(Q˜HÏÀ¨ì–èúñÇ›ÿ»|ì(sß¾ ?[òó²¤INðSÛ´¥TZV“FfFšäåeJ¥GçZ¼l«lØ´«Î×Цe¶ìÝ9E&þڻ씳o—E+«çós3%¥d‚ŒÿvŒ‰ú¶ ÈnP¯œBÄÄ Ý½{·+1!-åç7÷RMýì î-äôAEÒµ¨‰dfÖ_ˆ«¨è$O½º@–­ /†)¨[û]òýÿéÙÇž¿ýŒõºYZµÈ•?¾%ë]±o›4Y½zµòT¯œB{b ¤Ò Iõ;úøËŸØY~f‘lÜR.³KñŽòjÉÉ#ý¤g¤JsÏÿÍóÒ¥YÓtI÷G¨ƒÔÚ·É‘-kGȘ¯¦»“‡p»tØ#F?)åe%Þålj)))ªÊ)ñLLÛ·×ö¤µmÝT~sZyç“2iú/A÷‘—›å‘Xr¤ y¶‡¬²$·Y†Q«ÒÓS$×C\u®¬¼BfÍß,3ç†î¦ÇŽ4ö«kII¾ønÄc.ÒY` ºF~+qLLn8áèöòý”!‘’!·efв³Ó¥yæùvħ!¨‡{ü,¯ô›¬‹Z«Ä¤P„ˆ{屩téØL~˜³!&ŽêV¶éSùaò§ußGQwévÈe~‰iíÚµªÊ)ñ 1…3‰–^óËö¿èî]ÒdÚØ'e×®º—%é}ØIRžqœü¼aoĈZ¡PÄH•«¨(ßOb»özþn¸¢r„thñ«Œñÿ×k?Göÿïé#¥%Õ¤Dty0²Ö¦ E U¹`ظ!2ª$Ó³kª4OŸ&%Þ•ËŒÍÈ šgIFùXÿmýHé¤3n”õ;zIié~I)XÁN•šŠ8—˜œ(ޱǸöÑšXÿÀŽU2}Â˲|öþ¿yãÇ2è´ëdéÚ¼ZÛ¹½tîkžuê옙•#Çþ›,YYÛ^PØÊtXí±Ó|9…"$¦­[·†&=m.•V-š„¼ßV-²¥IÕDùvÄ£²½x“ ÔöØaOš5áÿêEJ-ZÉ‘nw%%Ð,×½Æo ùr EHL%%%~Û¾}¿ÁyåÏ;¤°y¶üº!xúH§9²hÖ« &3§Tר–¬º´Ý*cF¼T¯k9°g?iÚê,Y³Îÿ55kV¨o’B‘ˆªœí$R\¼?®gÖ¼õ!©qÒœ‰Á½h[¶c„.5¶¦¼´Ù2î›õ:ç>}KIê1²yk`U,+'/àïZ“I¡ˆ±*ŽÚ )‘á )õ<ø¸}ªa¶T”™ÓêGJNù³l¯8ª†‘ÛÒÒ³ýö–jcR(b,1ErB2‹ç¼Zƒ”š6Í÷AF-SQײ»,Ǭ_{RZZ† <ýFY¼ŠŠ”¡åÓ34@¡ˆk‰)dg”_Ç£Žÿòy ’Á}ô€ÿ©EJyù-=’*s'?YoRpúûHI¤së_%uLJ’]þ¹´oQ;´ ·L:äÍö\»QÜ–<Ñp…"ˆÉz£|QTT]ò6%%xéHlD˗ΪAJ=û^- fYkÝüæ­å»×+’» °­sÊ?déªêÐŽ?ÊÄ1oÊêÕ+eé’Ÿdö”×$·É~µ®E^©ü¼ø-™:ùkIOs—m&MKQ(âXb¢Æw(èÞqw êÛ}®–òs¼uœX³jA½Î«s·C¥[Ÿ!²zmµ$WÔ|žLžP“i ›S]{<3£R6¯ùT¶nÙbþÎÈl¢o’B‘èª\ZŠÿ =ºTʘ¯þUƒ”;þfi–³+¬„[È/ÈyË*f’‚ÜÝ2ˇtúøƒ—÷0yiÝ;•ʘQÁÝ–È–¯®ö¨æ§ÊOeµã¤èuÔµ†ðB!¥‚ÂBiÙù÷’“¹]–/øRÖ¯_§o‹B‘ÈÄ´nݺÀÄäÁ®Ò&¦àZyÙnÉoÞAÊSºzT7H£\èœ%cF>ô8;,­»\X#Ávû®*£®9mRxèZv<Ï€»¿YÕ8)Mó»ï6m:ÈŠù¯‡¤––—W蛤PÄ;1³©ìݳSÖþŠg®—ù{«©WM4›üa\pYÿYgxÝü[·•É 3o•éã_1^¹ÃŽ<]öfí] ÉŠí_ÉÜE?ÜÿŸæ…|½»Kæ5WN¡ˆcU΢b¯g ºT£¥ûî¦5Ÿà&ö7¿íAg‘Y!m›¯—’]iRÐùjé“!›wzÖ)­^hm#:Ië1)q@L»vÕ­=w^ÆùaùÜ€ë{ôëö¥Â‘õ”Ÿù“Ì5V–Î>ö¤kd͆ýu’:´,–…³ßËc**«RõMR(â˜6oÞö6=º¤ÊwAú»{´ò×o¹” ÏÙ·o¾T¦Oþ¤Œ8‘ZEݧjbêÜj¹LÿIÐæ”uEIymñ/Ô*ž …"ƪ\ëÖ­]—·(È–©cÛ•ö×ó®òJ@«—|!çÔNnÒ¤‰l+)’¼f{Dv~'ÇÎŽêue¦l•¥K—ʸŸ¬JJböP­M+;;[ßp…S0dee¹.Ï–Ú•là$hšS!Mª¦ÈÔq\×MKK“CþIMÙ!?Îü(*ª[-"(‹¯Ž»Ò7Þ(ýû÷—?þñú–+ Zöd‹K€bçiiÂÇ!‘RÇÖ[ä×%¯È¬ü®ÄQƒ¤tû\™4æÕ!%ââ·ß~»üå/‘~ýúÉØ±cõMW(1ù³å¸Å‹×””h,йÅB™<æ/ÙdffJ‡¢Žµ¶ùqÞd¿A“Ñ@aAuë¦x’˜µ¯yäùá‡䤓N’óÎ;Ϩ› E£$¦¶mÛ†¼.MæÏãúÛ)çüÝ+)®‰ßæ%¤cO8Cz÷¿Ivï®Mt»÷yå -[w©*‘æÍ›ÇÝÃ2dˆ 4ÈÌÿç?ÿ‘^½zO+j*1aß5n'+m«_IiÑŠê6LMrReÖ´/Ìü¡‡õ“>ýÿ*k¶&9é[ýæ®5è Ìî$»¶¯ð–tqC,+X¾òÊ+^#8¯Ï>û¬tïÞ]}ôQ üT4.UÎß o;‰¤¦U×ÔÞ[UàW}³ÈÌL‘V­ZË€“Η-{O–õ›««”ïZó›wd¿òë¦æ²jùléÚµ«ßõb)¡à)|àj,Cí¼ãŽ;Œõî»ïê(PÄÔ+gSU2² ¤Ì3»bM‰ <ënÙ±i†É™kUt¼‡”j¦wl+®´ü‹eņšK¶nqÏÇ;~Ðd[I{))K—œ¬½’šR%9™Õ33Òj^Õn©ª¬>ŸŠ=»¥¢¢Üäו쮮 P\¼Y*+*kì›VàÙ9ͤi^)ÙÛN6gIÙæÏåì³Î¨uñds:t¨|ðÁÆÞäÄÊ•+å²Ë.“§žzJ{ì1¯Ú§P$-1!%´lY³´íQGeŠª•Vu÷.[¶ Òè]=˜=¤D•ŒTêSU.UÛ¤bïnÙ[²[Jvl’ÊÊ ¹y–Wî‘”¼éØ±ÚøM‰74}Ru&†v–·lÕFRRR½Â!í¼33÷W›lÒ¬@ÒÓ³%3»Ú»–šÓYªªR¤¹G…Ü[U³ø[JJ‰”yΫdÓFÙ¹}¡Ìž1FÎ=÷¹úê«k]]£ß£òÓÓJ‡‡Î-ÑÈ÷»ß‚rÆc)IEL¾‘Øàª«®’ÉS®‘lY$;åiU˜*…9+¥IiT–Kv–H^^ž‡ÐZ™˜'ì6üÏÀòœQÚs¢3.žC&k£"BYY™GÝ\f° A.Î(ö6mÚ˜*œØhN8æh¹ëoðvŽw~øárçwʽ÷Þëw ä_~ù¥\{íµrÏ=÷Ôú°(I©Êá¹úø£dã–j‚(ÌÏ´´cäØÎA–(diÛ„J·pá€ê6òwÞyÇØ¦n¸á%ŠGÔ²O奵*Ì4ñIІÞ¹×_=¤6ZHŒ]ºtÑ›¦H.bB]JV âad ¥žw<Å ‘¦‚ªPŒö’ÕÙgŸ­#D‘üª\²`ÅŠr饗Èá‡÷ðÎy≧kŒé7ñÖ‰÷á‡6¶$¼rnÀKwþùçëƒV$1E«ÄH<à€›oþ£Üv[uËó;НàO^9_4kÖL^|ñE9ãŒÚa©©©ÚÕE‘¼Ä”ÌUQu.»ìo².@‚BGro¨­Ñ§Ÿ~º\qÅòÆox—ÝtÓMr '˜å¨Ÿ÷ß¿ŽEr“„š[&+°=Y{RçνË>úh×âyH'ÔŽòW&ÚxòÉ'嫯¾2H‰¿agžy¦QAí2…"¡‰‰8™Áƒˉ'ž±Aî ªC*ÄÆ@óU%7nÜè7U†@Lg‰” 6¸®K9ßý¢öê´ A]tÑE2i’ÿŠ$&·k×Ψˆ Iè„o€¡›ÀJ ¤¦ÿþ÷¿¦"÷òí·ßŽK©O‘¼H©ò ’;ä Ì‹Î`]µjU@{iñV.$Ò`À÷ìÙ3´‡‘’bÊ•tÐA Z}’gäF<Ä;QANZS‘°Ää&½àýAÚ@5`žÿ‘†J¬-Š¿}½Wu%.Œ»…apCJ!ò›èh n‹%ÕÜÜ\3:ž,ço"ØIìíÖ­[ØçЇôÔ£G3Kð¼PëP5j”¹6…"á‰)Røì³Ïä‚ .çž{.âû&å¯ý«‰v¦-µ©S§ÆÜ³aöéÓGZµjÓóàãä9}ôÑGaÕÜR(ê‚„è;ÄÀÀStØa‡EeÿFM!—*Ë–-‹ w?ç0eÊ™5k–ìÙ³'fçMŸ>ÝÌCPÚ'O‘p“¯úeÕ6'lªC¨ªƒâ½÷Þ“cŽ9¦†·+’˜9s¦!%Ԏᦲ`$·¨¬¬ ¸¿;v„D&xìX£z µ ù¡‡jŒä±Ïƒ8öÃO?ýÔØÂЏ#&<]O<ñ„Ð3fÌðI¬ð2ú!ÔÈSO=5èú¬ AAT±v·K.¹D&L˜ cÆŒQrRDuöã±!öåÿþïÿ¼™ûN¿­V Øwê“K†' U,ÖîlŽß¡C¿¿s|¥0ÔGÔ$œØnP“‚]Fzb¢b%=q~ï¿ÿ¾\sÍ52`À#9áµS(bNLÉŸþô'yá…Ì€ã+ºfÍ(HÀ ñ1Ñ.-±rrrÌ9ÅBrð¿äô6:ïÛØ¦”%t õ[ÅÜ‚ÅÝ:uê$‡rHƒ“2Ç£JÁÍ7ßlT_¼uJNŠ˜¤tÝu×yÉÛÈ#¼¿9RÎ:ë,W)‹‚o¸òùòûÆ8ñ»ăýÅR–oõ»¯P©›c „ë\ $H€ê›–tl<ÄDÜÀVÆ>ù›}@L½{WWæ´Û×E7kcðMeI¶!o°PˆÉbõêÕFzbß„'44ˆ çš‘ôˆ]KÖÄ_ž'µÑyÆÜ«@ ¼àˆ¿xþþö·¿™åÎy?ÉU’ÔûÕà7–ïwª¨d—_~yß! ?üáfž}ò;ÄÄÀGà?þxs\ÔY$…ã@rŽ%^Öçº £o¿ýÖüÆu!a@D bî©=ˆ‰»M]"¾Ù_¬ÊsϪ«.\fÈØäd‘š¬tJÛy<¦$B3&°ºÕ«çý±Ï"cß|(ùÈð^ò±s¾"dç¦Â{…´^—,ƒxEÈo?_|T6ç×ðÍ7ß”K/½ÔÜ|¾ß}÷WÍù÷¿ÿm˜}°Â"]ƒ‡ôåLq~©¬qØ™ªâ$ÎÚ{ k_ò÷õ EEâåà¸Lö…´Äh`kfC‚HŠöEC³)8lqî\÷èÑ£Íz¼@Vâd+‰Ô!Rw–/_öƒ$e&Ö¢<’üq£Ê& x'|½C•dý†ôƒ •]Ÿã9«Qئþbç°5® Tƒ'Y%&ÒDz?^8¾ H+ü4dK¶2QIøzÎ9ç‘–‹4Áýœ‡€tcmA¶£-ƒ›å T$HЪrvé2bb]Ä–- ñõæ|øÝÚlîž[‚1¤aÖÎcA,¬ÏþØRä…‚°­ªÈ1¬] ÒáüN9åC¼\'Ûs¿¸~ l^¨s¬‡ÚÉyCð¡’ ^PHžëŽu^½¼t^x¡¹/÷½2ïm$«2^Pñµ³‡´¬$¨’à]Žef@̈ õƒÁôÚk¯™—,--Í,Ã.D™V– HwW2’jÎÖÆöÄ€†°¬>Œ­ÕüøãÞAÍ—‰ÁÌ`C"ÂΠµ6æ-0 -q bYb´Äd% öa¥ž@EöÙ§U­fì¨ØO1KØÐž ï²-þÇG–É:g"Ò‚¬‰Doû6*bBJb€Q#Ú׸³ß˜ýÚ[£/U,0Ûu! l,v b0µó‡€ÆøB°¿aÏá8̳ÌyÎZAlãÖ¬ÑßWU‰ÍÚÃôxЬß}÷Õ°©YB´Þ?ȱê°ßzë­ÞyöÅË Û{a%:È“//ƒ™{É~ 8ŠíYâ…?øàƒê傌­ä„½r '"^€ª„¤‚Ǫt šƒ “ dD MYÉŠ“3aœß ; +%Y0OÅ €m—ß“1©:=˜´„:—ÛéÂF"°.{ƒÊ—±ìv@bfò^V&;ؘ¨|þÀzV ²pÖ§v3¦[Bq*¤U#cþ@ö©s¨¾<ñIÖÀ‰t‹@Êú‰ɉ¯ü±Çkˆ*˦ í9mBHDu18[ »`]Iõ;UAA$+*Ò ùPNøªGN‚H¸¥ †HŠânƒ×)ñ!qBL°%&<6 ,[5Ø"sHMHOHN‰ ˆ´ä¬.Zˆ˜XŸÉ©Zûl}`¥+>ÌHWä‰6:bb ¢ŠÍ£®75"p+b¸Ë¹øzm:ɳ¾çf“ƒýÅõ@Á °ñeŠV nŒ¥þj>ñÛÉ'Ÿ\ëØx‡P±Å9ÒÆp’­2ž1§»žwÑzuYÎ; q±ž?oϳ¾×Ì;Ï1¬ºï¶Æ¨Fo²ÞÝÄxÜõùºÆª¤G¼Á­Z'êö¦XuV©¯šŠ‡Ž`[$'Þ­xOþEšå£éëŽG³4 >bn圭äÄ:õ%ûä s V,imLØÜ’3­]¨¡Á—Âù`Šü¥àæuŠßÑ€¯±ø,}¿š¡Þ7R!|U7ŽÇrпŢªB$ȉ¸¶D©L€dÍ;æ«2‘jJiŸH’…U }ãïüÙN“–˜¿I7aâ…²7€Áe!ùß©r0ïür8c;œ°nTç€óň·.*\¿Ó³çŒì­kžšýâqñ²ð7ª)/¡[…«Òᡌƒ}]@ešPÂ#â½2±D¨Þ–xF6êߟtÃ3tÚ˜ ¨úØ„ì¾|¥·dl­ðŠèañÛavÞÚwð¹‰os#Q0±Œ 2ãA“ëÃÇöƒªb.@!í‚k_^öc¿"Η€å tß—´@et¿ÙW $Íx@2¸ˆ X…œÈ(ˆ÷²)H§¼—|hù :ƒ!y¯øø"ó~¹™8Øž=FÿºJPN›V²# 1Ù@H‹%K–x“ íͱ‰‡Ñ°7E¾¶™D9oûr3qïiï” °‰Ú¡)ñ\™€{o?l¿m Ëm~e´ïöƒH¦ÌÄ=1¹‰³x`n7ƒ ":6¤O¤J$J$Gî{2µ`'úŸk„œøÐÙ ñg„5Òv}»M×ÅÞ…´å|öV«Oyê„'&Ô-g]k_ëÂDrrÆúð{0òâÆòQÜjV(ˆ†´Ãƒ·ã¬¿œ6û2ù© mðýêñ·ñƒC2z-Qã!À ŽšŠ *Þà–3×འxؾOŒhKi AL¾ÀǤÝY‘€­L@~9åbãŰËGÓí#KŒ„å+±P}£®²¿&8IU`=ì£2ŽI¡ˆ9Mž<ÙÄ9áH‰—ʾÒ9Cœƒ¿@YßNþ*8HÁзo_yþùçÍq¶„ê IDAT“ѧĤˆ[Z‡ä„jGJT¬¥r_i Òüä“OætFKC}ó%¥d«.ªÃ@¯äDp/!*S¬½Nñ 2ù#%lTbRÄ-ˆƒCr¢&ÅÑbY™À­&“…MÖµÿ3á¹¶!5öﺒ‘ Ê$ŽºßÄ~%kò®“"aÈÉY™€ù@H£¼Î¥±'A8äR‹ÀJÔºPÓƒ|Á¼áÇM–86%&EÂûMh´jk:Å¢2!H*¤Ù"‚¶je$á$)BKÈb@r –’”ÄÄQ‘ø`à$Z1¹P@\:ÈÉÖtŠE® ãÄJ<Ñ*?cmHlJ‚˜ŒŒdnØ7ß|cºÊâ…ôܲ°íCµ¿ùþHhl׳—u_Ù*Xµ®!+Ø\¸ú#>ûq6 ŠýÚØ'[« bb\: Û…mïC7)KU9?  $%@¹iB™ìhl×kŽz‡Ý‰Ê QA•p_Ïà?ÿùOSò†;dã[ òá½°„‰´È™ª¦Hní4…÷R‰)ìÃh,ƒ´±]o<€ïVzðW™€¦Êë£ Y2!ºÛ7?‘ÎAZÚçïŒöÆElQ°ÚÞÑmzçIt7j+dG¢0„ÈÿØšœª#Æx¤)·"Ž‚˜|õh«zðàå c £äC=d¸©/<4šfRä,P‡R¶ÁÃA„ëK/½T#7ϹO¾˜½zõ2*ëFá^+^ç6‘¼^DùGyDFŽiDyö¡j_MP‰€÷€–WH ÎÊÜ34I ®O»r+%¹•!Œ£|¤l]ä@ éXï_ ØüÒdSãÂ’˜{ì1ÓÜ‚‡¾OK#X±š¯‡³&µs Ý}÷Ý2sæLÆÏ õ×öÆù;ÛÐ>Ê,–-[fjGßrË-F…Š$B½VZ,Eëz!\šŠÞxã¦GŸ–vÇUW]å­éÄå^!å`ƒ¢{äŽ=&^,>>¡’^7Î=œzK¼;r¢5wˆ1!2;c5€mr lÏ47ÿh|è!:Ÿ4iRßhÇýàƒšºP6w‰ùH£¾×‰ë¥U9 wž’R` Æq¿hB¹bÅ ™3gŽ!%€„Kq¢È£áÝâ£T_‰Å’[]ªµÚ&®á¥…o™;pçÍ›ñ8 ߨNËÔÔ8ô÷hTó‹Åµº]¯"tPÔðË/¿4ÿû0Òš5ÙÙ µ¾à@J”øHÚ&ÎJû·ìz¡4•€¸,yñ‘¢2+ÒÛí5%ÅaøCÕ “…½‚Ý`ŠêãVGúÞïüý¸ãŽ«ñ›M¤$VÕª¡îµFâzí1Qõp‡*5ñ‚2@ý›L¼××® è´Íöw¯ï¸ãSq2QãA<ð€ùøm:`IÄ툠œû’™s6%Ž1AP‰Ø"ªÄ„ „óùçŸËË/¿ì•\üh‡ f\«×_}@Ƀ±5;Ûs ÎwÝu—)`ß÷Z#q½ï v¬gžy&dã7"½mµî†DlÑ P×>þøc¿¿cľæškŒ±:ظ%¶Gm‚|¸‡”3ÁÆ |û6l ñdEŠç…¯‚±}[)W ‰‰AÏuµë$Jg„:;m…Á€ÃãŠ+®0–Aƒ™exÍb)At¿%&H IûZ²@Ëž(%`¸é¦›êŒë,¨ˆ¾ÒR²… (1)ÔÁF¢AR €ç «®@Vk£ h{ÙWR×Éù­Ä¤H`ÜÆsŠ ±š„´BØ@]¤'ˆ†êœ•z )_ ÎöŽCƒŒHv’–Ó›©%KAB%ñº©oÁ’~ @¢-ügŸ}&·Þz«©<®½öZc— w@C¶¾w¸ÛA>¨e”åuSŬɦªpæ!36&òì 1YÄKo}×W4nP» #91ì £þýï—ýë_aíÒpöŒ ا°¡Ž¹‘’­îFV¶¬/Ä£Æoâ!‰7ë+¾r¼xÌ“F xß °$…„4ÆÛºU´õÃíºh%±nK÷ÄI¼‘^_Ѹá4“—H<i@N¸—!‹pŒÎŒ-2‡”…—-ÛS}Ëø6 bòE,’x#±¾Bá‹¢¢"¿qO¾‹n%vý7ª›’¿vâVÕcœGØm!&Ì#]HóCQb „X$ñFb}… ¼t¼CÄ}¥%7„Z3 ;š„äFJ¶” ’RìMì‹É­ÂD²6¾ JLþˆ†›Ù0…²M§NL¥pão PÔx°ˆc"¾ ](‰½K(é(N¿Uý‚‘¤ƒñÛ—li"l‡šh뾸˜ŠD9ê3Y釮+ÁrÔòC1DÛèlkƒ…m¹@`HThNã˜N"´5˜ìvz:=ƒ‘è¢ĤP40æÏŸoj2QÑÒ‚FzÓY);O°HoK؇… %A>–Œ°+aô¶QÝØNQålA8´âô0Ž;%¥F©Ê)‰Èû#ysNo6%¼rÁT>Ì i8É’ dB]ƒ”œy|HD;wxH‰É"Ùª (1)ˆô&øÖmßyçÆ#W_ø’êW 8'5j®-¿Ë1œ¤äK˜á|*1) "º1nÿç?ÿqý:Z=ÕÎ%Ù`ÄäyöGH„ 2BB¨sL¨yÎ}QVÚŸ÷°.]V⚘Ð_­QÍ è¹ ,з=L/g]€ñÄO˜F¼T?þxHáT84Q¿, úTÀpŽ4ÅxãÎâc9ó/”sNb²‰…^öqãÆé¨WÄ5è;HLFî@’µßý•W^i àÖÖ4jÔ(Sî™e4µSo8¨¯MÇ78¢C««½*™ÒSÒC}™Ãé÷®P4$ˆð=zt 8ï,ätá…͇« ˆWªOë$')±¯HÄ@%S+' P$<)ц õÍ×+gÉ©®pk”iQ»%%[J%™¼iJL %%)T ù ¨ hŠéþ⌂#78H¯®=霰=“ jüV$<)ª§)Øê’7"ùøº÷ƒIJlG0&ñHÉêêW‰IÑ(ñôÓO7()7uËæ³a¬Æp¨R%¤DŽÞ¶HcZ8C ´‚¥BCR¢ŽRC’R0b@ò DJ†ípÝÿ‹BˆÄgsÎ9FJtvs±U‘§ªr EÝLh Ð¤Š— RB- D\Ø“ê“Ô²E¡! üD®[`Ø'©8Y»òªÄ¤H(RúàƒL›ï†@°¸ Pê/±N]±¶iÓF^½&Wµž-³‹{ÊØ]m ¡:ë@)1)1U-)…ZG©!@ìQ}#¿Æå/4ó‡ç/’CŽ¿@RZµªS»“BA >\®¾úê¸#¥HÖ_ò‡†Ý+ÍZý"»Ë·HfÅIïs‹¤xH ÍÆQÕUSbR(êAJ¤“à‹)9Cœ¯HÖ_ „º÷”íÒ³ÚûçQß !ìMÚ-!-_¾Ü»~ÒÕüV(â•”¨Í«t(§—Ë9©úKÁ€=‰2-dâÕƒx| òο•˜Š(bĈ^R:th\[¤ê/ƒ³’%¶¬Æ–¶¢Ä¤ˆ+ØjñHJ ¾õ—~ùå—£–ùÆ@Ù®»v,g„xûöíÍd‘¬ÑãJLЏ"%J•Ü{ï½qAJÎ\9lL¾õ—P7§M›&«W¯ö.#wÍ’RŽ[46êá6µ…˜¤víÚÛ`ŽÍ:üîlå[ÓItØhŽê×­[·ZÍ1•˜Š:’¸H4¢ŒœÕ _/ÜGa$g¥þö%K,ÁÚ1±-d‚T ÖÔkÖ¬‘^½z‚JÄ L%&E\‘R]Z+5‚|c–Þ~ûm¹ûî»#²*Y"!aÕµ®’“H‘žhR»~ýzC ‰Ö(SSR1ÅÂ… å¼ó΋kR²Ý $¨—^z)"û¶RÒN¸¤äL‡„|AÈÍj×­[§Ä¤P„JJ't’\vÙeqMJnˆD+)áå«ëþBñÖjðÃ?ÈìÙ³£©®ªœ"iH‰Z܉@J¾eoñŒ93ýëT7[,‰ŒØ(æ}'§…a;Ü:PØÊ9äž=%¦}z0‡•+Wš¿W­Zåe~7%Ô"ë˜Õ5ÈŒ¾dnz¸õ BQQ‘kþÒé§Ÿnö«p'%*`§IPG‰ê“ÎàJl7¾ï¶•HxoízÌ3a$gëÔ§f8Fm·$ÞPìHœãŒ3Ìø£¬J ¶çIGLÜp‚䏸ùóç›ÿ!þTG9Ù€Ýä•W^Q&r€’%¥÷ß?¡R‘V˜ &ZBùJ@6 õ )Èé±CÊñGüF'^¿6—}¿s ë~*°=Mš4ɨ’HPõ•þ➘ÐeqO"uíÚÕLNÀо=×ýÈ×hy8?7½7­¯Ô…$ç[|££['¢²%ßx(d¦¤8.•(ؾ­°xïmXÒU"€1@#Z“~øá!Í„#&<Œ0žÁ9F»ÇÚ‡~¨läCJô'LRrž£ó]¡CnCäÊ5´ªŠ÷nàÀqANê•‹"’©s$H ©ã£>JI Û¡›™"Y[vs]ÎjI%1K‘¬Ý^Ã…o^Tc%gKJÔéNôw5{O´$&kbpæÐ‘æi Õ8M`ñâÅÞyRZê‹`Žž„%¦Æd܆dêŒZ×AFðd¢’^+ œ8tõ…hëS.àìÇ>#Q= ®¹qT0àÙ`޹Å%1Ù UTO$v•ÆHJ¤™€D•”ú÷ï//¾ø¢,]ºTî¹çs 8Fð0C,6ìifÙ²eÆq‚ý ‰Ç:VX/R¨Î;{µ+àÂתU+CœuÁa‡wa-Q!¦xs=†Ädk?ðmnèÜÆx^‚%f6Fb²¤„$0f̘„V߆ RKÕaêÝ»·ùï,^­c=6$ :”ä\TÅhÜ3ö‰§›@K$>¼ˆHIñkqb Õà |þùçFDvËñD¸22¯¹©áÀéÒÇÞc‰Ç/Tº5å)2³¥m»"Ϫ‰4iZ}N¹ùm$/¯@î¹óZIOsÏàŽv]èx'¥d0åĆŠ £?qCÑÄÆ91ñµøòÛÁl$:ÆV¼:"¢.ì«ñÏþSž{î¹"n§N¥´¬T6ø!©z_¨ç´k×ÁÌC0 {ϾžÙL²rò$5-C22ó%%­©ç— Ù+ùRY•!e{ü»N‰ñÝìy—¬Ø%½lV/¢NðÚ·É‘ŠÝ3eƸÏk,?ùìÛdñÊÚ\Û$']š¥Î–1_¨×¹ŸpÒå²fs;©ØY³•ͽKFXR"8ö·¿ýmÒ^ç7ß|#÷Þ{¯¬^½Ú84ÜŠüÙ”û›ïßAßÛ0×WbŠ0Bµ lÙV&- sdó–ÐDu1‹Zn‰cÞt5*Ý…4Ö¡&i´Î‘õËÿ-‹MdÝ€‘{à7í#½*ݹ‰ëv¶X¢–>y÷Ýw½¤tþùç'õ@øÇ?þaž1YÎq K\ÇsŒ|úé§Þå|Hõ ‡ÔæÍ›'·ß~»iN’o§NLÌ™Ôø¦§ßܹsMhKŸ>}äoû› 0 ædU.Po·²òýjϪŸwzÔ±&!í3?7S2ÊÇÊ÷£_u%%CMkVß; s–ü4íÉ}‘ÛuCÓ¦ùrüiw•Ä,šåúµÄ;üyQ‡nÚO5Rr~DbEJNL:Õ €4,)…†Î»±fýúõ«EJüãý“ù±cÇGƒM/j4ªœ-ç,k2kÞúIiç†ÏdÕò¹×ÛU ÉU_NeòÝÈGë÷+ê.í¸T–¯lCjš¸0^ \ºX‚ðšk®©U Rºøâ‹.ÑHÉ7Ãß~é!`*[|ýõׯ[Ja·‡zÈ”’unã”(¨vÝu×ɬY³–Òe$޾}ûÊK/½$:TKí¡nï‹£Ž:ÊÜ{Êñ?“oqî¹çš¦•Ï>û¬üþ÷¿7×DjSÒ¢¢fµ4Ÿm*y<üðÃ5ŽÁ¾QYï¾ûn騱£YÆ<ûã·XÛ#.1ù“–ÜÊíîÚ½ÇL‘ %Hdí¯¥&>©CÁ2ùnÔSõºŽÞ‡$E×0rûCJJjÀ0‰ºvŽ6ˆI²]qm ¨%¥Ç\.¿üò„•€{ì±uµ)K×_–ÓV‹Á|ÓM7ÕRS˜·3PgΜ)Ï?ÿ¼!xá…LóKÖe‹P·÷Å 7Ü`fÑ¢EòÙgŸ™¿àc(´hícà¯ý«wH Ð šºëœƒÓÄ‚ª(ç}ç÷UåDJK:‰)’ƒ’)ÛúU-RÊËo)Û‹kAÏ>gɆ­™R¹k¬L1¾^Ç=æ„ dãÎR¾£<4ÛWva­ÞöñŽ×^{Íû†œ°+`OúË_þbHièС ­š]pÁFб€ˆ€“lQ™Èî@ówºÛ†»½/N;í4#ÅüéO2u¾ùÛ‰³Ï>ÛTq@ýBÿöÛo}ÈÙËÉ 29r¤¹N&$ä÷Þ{Ï磚âò¡M‰Ê3ÁÖ¨l5R»U¥c\“•Q°2$À½Ÿ—6[f.šîX–!_#ãG×l»™•#UÍeÓÊ·dý¯+êun'9T–¬&¬BÚî””ò…’ž‘#Û÷t—â5¥¾ ÏÝkW¸^v»­³RT¼UàãAL’xCí¸ãŽ;ž”Ì;æÓ´Ñ6$…hVo¬O÷ç¹ò,°=ñĵˆ‚ŠW]u•Üwß}òÈ#˜ê>ø`u蘂ñ› Bºè¢‹j1Ò¦Ÿ~úɍЀ2×¾RT¤‰ Ôèl‰)*ÆoùaÖΔš²'è>º¶Û.3§¨AJ'žq»ü¼rz-ãwQǃdÆø§êEJìÿä³ÿ¾”D:µÞ,³&½(Ó§~+“'|)¿,yS23öPÓœ ©*þX&yC2Ó܉ÇR¼‹{ôÑG]Ÿƒêõ×_7T²áŒ3Î0ÿSÒ9Ô†•tI±Ò¥þàüý¸ãŽ {{7`„F¥ä7\z饦¹À[o½%Ý»w—³Î:«ÆïH†Í‘äm`c¯^½j¨ñv7T^bíxà³ ©9éT9àÏÅ evï’!cF<_SR:ý©Ü³A–.ªí¡X¾tV½ÎÏÛn–Å+Kö‘Òz™úýÛ5®cë–-Ò½÷Nùesž¤¥VIZÉhÏ`Ù>‰­i P$#Tµ@T‚d+eBŒ…ù±Ë¼üòËÞÐÜàÆ 3ÒÈõ×_PBº±Æo¤˜p·¯ ˆpL¼ù曆H|¥*Þ]:¼P¸ø‰'žhHÈ«xž1³Ä©ñÑõHb÷©§žZëxþœ ELÁHbêÖ1[¾ÿê¡Ë”*«RdÜ7/…|Œ­Š¤t÷Ž QÞ6½dÅšjRêÜj•LóAm;Rf¦ì(©mh—7_¦Lœ”/e°ÄbÈ ÷26kMø0t (˜BÝŽØl4á+ÔíÃÙŸïo4=@-">ã¶/  f 9Y»Ä aûÆ Æ*´ASRl+¦Ô*÷ÌNrŒJæTÕˆæÞ¶#MfM|>äãt;°¯vÔAIéÀžý¤e—ýé%†”Æ~àºn¿ãΓ»Ó45ebí—¯q¼•âË/¿ º­~žzê©„#¥Æ>,¨oHCx#‘‡ù¿ÿû¿FÕ³ÑïI©Êùë¥f‰É Cþ0îÉdròY·ÊÏë3¥l˧µ¼pþpÄÑgKIÊòã¬w‚®·½âp)Þçy DJ½û)«6v‘–ÍKeöÔ»¬‘˜â¡&/³uÂe—]f¢±iicDiIï^Ü\c4v “‡ òØZçþ,ãF¾Yc9’Ò²5iÒ"{¶,^Z\ʼnƒ¯–UZÊKå§©+‚®WQ±7()µkßAJÓO’̪JY¿âc×t›ôŒ&µÊ98Ã⡊%îã@FmìIÄã 4HG¾"9‰)(ªvš¶HY•óä—5óeñK¶€|9zвxå9 ÃV÷Mh‰·HW‹W¥y"M~˜ðªÿõ¼‰¾ÕÆÈŽ?zHÉ]½)(,”Ö/%)’^2RÖý²Öu½œfµÛÅ“'Žsñ °€P À­j­…"©ˆÉöc¯ªÜ+­ öÈ·_~Zã÷^}H““eÉÊRÓ>é»ÁÝÙQ‡zH©ÚܦEº,±Éÿz+÷»Š‹šÏ“ÉÜ“ty9°÷%RQY%);>—ÅË%ìC¾ë®»\_llZWÑ(ˆiãÆ®Ë ÷'»–ïÍ’ÎÝ•=å%Ò¶}Éky„,]U.;6•#ø¸¯ zó& øœÙºüö¿‘Õk«×#H2WÆËÓ¦ÜÿÜ9ÓB¾Þ;Ÿk,ë~ßxã5ŽOÅòÅð¼%P/[·ößé˜Èe›+¦ˆo„Z0eÀIDATØÚજEÅÞRY./aunÜæ+>B69-Ï©•`‹$Ô®Å6Ùµ;Uzu‡‡„ReóÖRCV ·É^Ù³m¤ÌYòSƒ^o¬*X’K>ÀõÿÊ+¯x£‘øç÷]òH«;vìÐQ¯Sd™Ñ‰Ö¹«‚6 ´mIê1^7? g­}Á*Y0÷Y5¯Ú#ØàùyÓ~© uA‰¬^ø¾lÚ´1â×[Y•w©•¤\$bSÈ»Jôºã %¦zÁ_;£@ IÀØ‘cÈúÿuûRQ¾×+!ul¹N~œ3BVÌ©¢&À«‰©Këµ2ùû÷£V¸­¤¼¶øë¯8ÉŸHI¤–$bõL…SƒÁ_V7¡3ƒDvï=ªvó·)Ø%ÛÖýW&Œ©í-ã¶³¼H²3+¤YÊ$Ï:“¢z])ÛeÅŠÒµk׸ &lJdŒS.V¡Pb à ÍÒ—ŒìxÚY¶é§ÊMaÖ™6á¿~×ïÛÿ²go¹¬]òž,‚êæ¦ºRgÆIL1}¨•@ …SªÜöíµÛ|wl—#“G¿çw_ƒN¿^–þœkæ;´,–e?H6ýúŸ"å»–›r% ‚ÂB}‹ŠD &Æo·Ú×;7û/|n£´)×±p™Lÿ‰×NDnOË–­äŸhìŸæO“;NÊÏ+ˆ¹ê¦P(1Á{¡¦cH9é›ÑI ®– c?2ó¸Žû㑊Ò—µ‹ÞªMt;– Z·í&;JKL}EÃã€HèÚäŠý°™!Q!&vnKtCVÚÖ ¤Ô$'UfMû™ïÝçÉ.$?oÎÎm¶zTÆØgí§åt‘]fH‹'ú]'ÞJë&ÛËì|¡*1ù…¿Èo[ª®"€:ÝH©ZeK‘V­ZKÇ.}d妃EöÕ2ß³{iÌoÞ‘ýʯ›šËÏ«æ4|Ç[i]…¢Q“?ØÔˆÌœ–B(Òò5¥2ð¬»eÛú©RZ²CÚw=ÙTpb[q…¤å_ì!¥š¥I·lvÏô?aÐ…R\ÚÁ³ÿtIO«ôÔJÉÊ(÷a•g~úJUÅ~CüÞòRY¹×s~ežó¨–nJKvIIIÍ'ùÍ ¥IÓ|išÛNJ*:Ȧâ,Ù³u„œqzíR¤ñÚ²I¡hÔÄ„”à[lŒØš’Ò )­êî]¶ÌT8Ü#F‰,ñT2RwJª”HåÞb)/Ý"U啲§d»”—W ÌåéU¦Å Fgg¤i“>óΓ ’–ž!­Z¶òì¿úR322%7¯Å>i,G²ròªç³ò%%µ©¤dw3çä¤KFUÍZÞiR,eU{¤dó6)ÞòµÌš1NÎ=÷“æ Åò E ‰É­Ï-gfÍš-Ù²HvÊ!ÒºEªd¯”&MR%Û£²••n÷¨m­ ¡Ñ~‡DSbŸòòò"bG 0ùĶQ£Fyë(ùCug“Úƒ—žpÀ`<ðÀ·¬®^+__}×ç·U«Vù]UÌÜpR× à¹ÃàβÃ?\¦L™"ƒ z.¨•HO:Ò“¿~} E£!&ì!^x¡<úè£ÞâmÖåo«V¾ñÆ2dÈ󷳕F\"j1;…ó €t#¡={ö Ïñݤ –31Ø{¨é! çj¥ÃN8Á{­öTÀöÕ¹sgCJüOó .ô6>|¸œþù5æ!¤ÍW^yÅܳ3Î8C^~ùåˆÉ‚Da¤§C=Ô„&(–˜îºë.óuçKmÕ#FÈ•W^iþ~õÕWå–[n‘#Ž8ÂØœ¬DÃzcÆŒ‘?ýéOæï¯¾úÊ F€Êg¿úH hH{†höüñÇBprˆu89™ìÀ;v¬wž}öïßß,ƒ`©}–l؆´T0HŠcBÄ~ø¡üá0ëâÁ³­ƒØ7¶"$9ÎéwÞ1ª.˜8q¢Ù'Ûýõ×Þób=Óoû[¹õÖ[ÍßÎt–`€´‰*ÇÎG”¹ªvŠFGL D¤¡o¿ÝßåöÓO?5îóÏ?7öï¾ûÎÄÝ0PgΜiH,Y²Äxµž{î9cO"NÇs™ïÞ½»!H{ ÿ31H9.„aIƶ‡²^@ÈRb}«2ñ7R „æôŽAÖÞÃrˆÆ©ªYbB2²çþFmˆ‘í!U+IYi‘m™ @¶ã<‘,¹7œ'ÛCH,'|èСæÞp/‘Ì 4&Îß_8X¾|¹ùpŠFEL7Þx£\sÍ5^;‰©HEãg?ðÀòÈ#˜Á á|ðÁ&oà뭷̶ӧO—c=Öä…¡Î 6Ì J§4òÒK/™yȵñöÛo7ËŸxâ  >0³-’Ô‘GiH±öš@)1¨u¾Ío»í6¹çž{Ì>Þ|óM£’bSƒ0¨YþÙgŸÉ!‡bŽyóÍ7›e Çy÷Ýw½ 䃄‘òûe] ã5Ö‹/¾hÖ\pùé¬.ÆühyCІFÈ– ,ØW\á]ÆÀe`c3B Ú¸q£!%)!1` '`BâkNŠÓ&«"u0È}”am9Nƒ²sðaDZØI@þâ¨BQ‘Ø?Rû€Ø/˸v«.¢Z"²¢bžå!óLHJ%Ë!!†pØa‡™ßëpmV¢#–Šc‡Ú0Ô÷ÚTZR4*‰‰ÁƒýãÏþ³×àD€ñBBuA’A`ÐaðæwkŸùøã¥]»vòÞ{ïy·e0ZË}÷Ýg–3 !k³±`Þ®Ã<„…´ƒJÅ<ÒŒ%$`¥:öÏ9@¬¾$†jé[••  i†míº–¤¬j Á@¨ÌC(œë[5I‰ka¹UK9¶që!ùacbžã’mUà@Àž„Ñ›cjUE£#&H‡/9ª Fjb‡°)2€}ˆÎÀµ*$‚z Fª¸óÎ;eòäÉfС®=ùä“f bkyÿý÷Írl-lÃ@f@#e Ê1Ïï¨L lÉ’¿YU iÅ.wzÎ +æÙŸ%™@1EH6—ã0o Õó\Çe"fÞ’¶)ë̓¬ØÞž†~ª-œrÊ)æ\¬‘›cáP€˜¬:÷ÔSO›Ù@F&䲞¡P$-1!Q0P06é„zK Dkë!—ÍÚwV¬JÇo_|±w[¼•\Î9çïrŽc1^¦cŽ9Æ+ñ`;²’Ž3Øéúwöƒ˜¬zh]þ¡Úh :« B2VrcŸ¨®–1â[¯ •æØ{˜=6ëÙߨdŽá¾X°j}‰û{îTÕ¨8@8K…"™‘RE´^üýï7íY³fy% Ó|ùmé'°'AN¨:€ …B€Vý²î}_X5‰³RpΑÞÜìVVmó òäxœw-ÖvCº’¬OĹ3hµçq_ñ€Úp é¸ãŽÓ7V¡ƒƒ¯7*›Óæš‚t9XÛŠ5à’hêÄ 7Üð|ƒ躮s¹ï6N»)¹’$èF„ц?• óñÇ7©V•$‘7Ü'…")‰ »Äsÿý÷×’B` @áþ~#”!kßP¯êgñ»P‰Øª¢–8*­3œDi¼šZ\Ѩ‰ ïF_Šx%ŒÞnƒÈm·ÚØ¡¢iÓ¦&ÿË_žDá{l+5átSÁ0 »Ð†PÊÖ²_røÜŽ pÏüÆmÔçeË–ÕXn =zôÐ7WÑx‰ erCm, ˆp,à­ó¥f MÈK¡h”Ä0*ŸuÖYÞ¿1ÂZu¤G‰ w­ ŠoB0ð×ñ°.O¢ ŽíïøHsþê}sC©àvþH–DΓjƒ¤©P4:b–„Ž)BõPE³œ5Æ;±›šçPYßmÆi¢h“%Ÿp‹¶qýVm… ~XÆ>!-Îæ6LÂt‰‰:ùä“õ V4>búè£ÌàÂ!ÙFJ3ˆ¬Dªa€Ù/{ ÂÁæcí5Öfd=LdÈ3±ý`æw+1¡¶°®3—AK-&Àrtc÷L¡h”Äd‰)ÏÁ–ÂmKT_8 ÂAb¡VÇL&@Ú2¤D"±BÑ(‰É´º¦È>TII‰‘–P+˜×/xx zÛ7‚éÔYOɶGÝÞÄÇ@£¾JL.R 6&¶ÛöŠ´ŠªÚQúƒUÃ…% €PÜâ“Ø&Ôª™ …¢Ätgû²èÖ¡V(u…†+ %&…B¡PbR(JL …B¡Ä¤P(”˜ …"Ú0¾}"©5@29@<•a*’‚˜Z¬O=%EüÀÁ* OL‘Æ7ß|#÷Þ{¯Iô…ô|Ëš›áoóý;QИ®U¡Hhb¢-åkÇŒS«x²¡1]«BÑPˆŠñ› Ã@mLתPÄÄä[T õƒª4( 7‰µÇ{¬<ôÐC¦æ’s}§Ê²fÍÓà’6P:F± ܾ}ûšuÎöIv”ÿèÕ«—Q¡X/Rp»Vàïz…Ü"}­Ô¾¢î7]yéŽÂ~TõS(1ùà±Ç“K/½ÔÌßsÏ=¦ƒ. )Åqæ™gšúH”áeð¸ÙPî¾ûn™9s¦¼ð ¦ 2Ýàüm^{íµZDA‘~êßrË-F…Š4œ×èz£y­.mÍo¼ñFÓáØYJ¡PbÚºÂÚZA¶‹¬mÏ (õ´§Ÿ~z@)Âù;}Õ,(R÷àƒÊ’%K¼E☜×Z—ë­ïµºöúò)))”˜üÀ6 vÐΛ7/ª®iç :t¨¬[·Î¨6¨q]»vZI]çµ6Ôõiˆ2¨‰¨¯õ¡Â­Q®PÄ-19qÆg5ƒöß·ß~{­ì:ÝâZGúðí€â„ówgKlJð jUC"Üë­ïµ:‰ºwóÍ7‡,5ÑìáË/¿ôû;e’!y…"éˆ û• ?ÿüsyùå—½’K ãì°aÃLӂ믿> t€ÑØ„ï»ï>ïrŒÍôY;õÔSü&…{½õ½V{L*_b·{æ™gÔø­hTHñ¼ðU|µ£ÝƒMÑ0€¼TbR$:4‰W¡P(1) …“B¡H8$L¯&Â*JLõ‚&¶*Џ#¦h$¶ªd¤P(1ÕR¡œ‹$^ª[ DX…B‘˜ÙøMb«•„Hj}ûí·Í2!¨›nº©q0oÿ¶‰­Ï?ÿ¼<ûì³~C¤ó¿þõ/³.ÛC¸ë+Š$RåbÄ©õ ES¬“x£±¾B¡HpUÎ LI­eee!mCb«•¶Fåw=çノ­‘X_¡P$‘ÄäD,’x#µ¾B¡ˆho’A“xV•S( %&…B¡Ä¤P(JL …B¡Ä¤P(â&\€Î%É>|¸Þ­@¨qe EÜq@ºp@\šÝ¯P(T•S(JL …B¡Ä¤P(JL …B‰I¡P(”˜ E² ¤²'Íš5«Q­R‘À<=]o‚"9ˆ‰—¹K—.z· …ªr …B‰I¡P(”˜ …B‰I¡P(1) E]ðÿôw†]t•sáIEND®B`‚refdb-1.0.2/doc/refdbmanualfig4.png000644 001750 001750 00000033430 12247746347 017772 0ustar00markusmarkus000000 000000 ‰PNG  IHDRÂñX·ò cHRMz&€„ú€èu0ê`:˜pœºQ<gAMA±Ž|ûQ“sRGB®ÎébKGDÿÿÿ ½§“ pHYsÄÄ•+ IDATxÚí \”Õ÷Æw4LL3Ë5Ã¥ÜSË#w Ü2wý å‚¥iB*(¦¦©¹‡¦¸¤æ‚ JVŠæ‚e¥2s+-MÍ\HQqÿ¿çâà° Ì ¼Ï—˜wÞmî{æ>w9÷œ<><B!$—’_û-Çb „’[ÉË" „B!$„B(„„B…B¡B!BB!„BH!„P !„ !!„B!$„B(„„B…B¡B!BB!„BH!„P !„ !!„B!$„B(„„B…B¡B!BB!„BH!„P !„ !!„B!$„B(„„B…B¡B!BB!„BH!„P !„ !!„’™ägŒrôèQ\¸p¡SJ•*777»»o±©Áƒ£oß¾(\¸0¤)W®œú¥’\/‚ƒÞ…š^þ, r}CÌøÈ®îùÞ½{èÔ©NþqÏzø"/Ç®ôÉ×a˜:q,…änlÖ¬œŸx븳@tÊáßwÙÝ=ûùùáôéÓhÛ¡+Üêyð!ê”ã§wåˆÏÁv± ¶êС5j„–í}X ÄfÌœ9«V­ÂæÍ›áèäÌ!B¢O”ž Ì=­\¹y9nElĶmÛ0|øp,_¾5kÖd !ѱ±±J]]]U‹=~Ž®Û Cí]»vE`` <==Y „BHôG\\Ú·o¯D022Îζ"¶k`ÉP{«V­0vìX¡}Š`ëÖ­qéÒ%„‡‡S‰ÍÑnݺÁÁÁ¡¡¡,’åp\‹˜UQIk]D0**Jõí‰CQáý  îß»«^(è€A3"àöòcoÄuó˜<~Á÷é¼ ÚôHò¾l7ìC,gĈˆ‰‰ÁlÒÀJþ,‹ R­Æè5fŠ/eö37õ¾%ö`Ê6’oŸÐ½6š¿õê·îžbßï·.Ç7+>AàŠƒ©>§¢¨TãUt>O=÷¼Ù¶lNQ 1j­‹+ûîÝ»•ƒŒ½‰àç¾…­F­f*–Ș7¼ƒÃçk7IQI¤Å7˦jçéˆB…h6 ,, ³gÏV¶U¦L›×øYÆß¼Ží_ÌÀêiþ0q•ÉýÒ;OfÚÙc‡°}å ¼Ø¨-‹¸$n¿yí*¶-‚¿Oþ’ê}=|ð7ãb±mÉd,Õ ~c¶-›[F¹’tEpÏž=Ê1ÆÞDPž`ßñËEPVw·Qs°â#_‹Ï׸ã@D.žHã°bWýû÷ÇÂ… Ñ AƒL»Žôv<ÞôÇὑ6?·-í¡F“7´FÚò¤½Aíu¦¦‡òäÍ §¢O¢ýÀq¸|î´.ËÈîz„Òêkà0”}nËzäÏc1X¾`z–…4’ðVRYÉp¨=†èd8ÔX‹á[¨óz'‹Ï×Ä{ &÷nˆF^ýáZº<ÒJΞ=«"Çøûû£W¯^™~½<ÚO¾|¶³¥=ÔmÑŸêŒf=n,lXˆ~V`ë¢ ©óðáCÜŠû;V}Š6}tYFv'„‹M¼P«U/~SuÈ¡¯Â²ìZÆ Sk¹dÞÆ^E0Í/}ž-§!„á7#øøOÅúY£Tkš˜OPP¾ýöÛL_‚#Ïwþ÷ñ¿I_¢xéòèüît5–Y˜²Ç"Åp÷ö­$ÛîÄßDa#‡˜$Bؼ3l[…ëWÿUëµè’îȆ8×¼Ò¾þ=sR×eD!$v#‚ÞjíÚµ9Fóå/ Îýq$ɶóÚë²nuR?Ï3Pªœ–‡ü®e* dÙ̺þí[qpz¢¸®ËˆBHôßSZ°@‰ ;nÙ²eŽù\²lB–O‹¡ñ’ŠŒÐºÏhìZ;Æc²N°wïÞ˜:u*<<²6›„{§·Õò€ÔD¶$5{hÝw4¾œæó§~ÃÝ;ñ8{ü'µD¡EÏ&Ï#ã1;7˜MN\ì%å,S·EÝ—‘^á!Q-uñÞôööÎQŸMÃlÿv¨Ö°% :8ZýÌÓ"5{¨T³‘™9ÃÚãê?gP¬ä³h7` ª6haZ›wƺ™#Ô_Sî[†F]\ñrëîðz;$CŸËTåò<”ÙÖGÈò‰É+vYå5ãÂçŒÆ¡ëqã¿Ëx²ÔshØ®Zõù~/›Ö[Ùîç¡ÈØ$ œOü ƒ1lî·‰×Ôƒ´ud_ölQF!‹®e‘«1æF0çž,A¼FGvojÓå"‚RA͘1ï¼óŽUç22Õ;3>¤^9üe>œ=ÏGÖ¢JvA–áXêCÛÒ7Ç×11¯1KÇ÷GÙ*u0nÍ88Á­ë±ØúùDlœ˜¤Ò7%fžZkfíŒáxÑžÄmæ¨Ihs±edïÖ/À«žýÔ˜r!´$ „žComß¾]‰  WY+‚„¤Å€ÔšÁèèhf*!ºÅfs„?{§w”0ÈÚ™¸mÙsön\dÖñ^l§¢ÅTOLµb÷EÂQ{-“ͶĜHW/žÅ_G¢ÛÈÙêoìÅ¿SìcM=! å½¼¼0iÒ¤l®"9›iÓ¦)Ç{JD(„Sâ™ j‹±û°oúÍE³Ïñ†ßxlš?FÅÏ“¿ž¾ãmþ%Äoû¿Á¥s§L‹Ä†…x¹Õ›jÁµŒ½Ëëä¨õ>ɶËëz˜°ÎJ”LÞê½÷Þã·€ØI°;jÔ(”¡zõê,¢kl6V!Q $<о͋Që5oµÈT\Ë<ÿ’Ùçx¶rM<õl%,Û%ÊTD™Ê5,º[D!ß»ñs ›—0/ùªg_L÷{múªc ˜–“ñ¶@’ŸŠã‚ˆàôéÓù ™bc>>>7nì’Ü%„2?8!üNi‚pìÀì\3Çÿo§rN©×¢«ù½Bß`ŒñvCðúc߃-"ƒÞ³®¥Ë)¡3ž¼–íÉÙBOs„RA‰ã‚TRA’ì¶k×,’»„PÅ™2×'¿²~ædÌ, xÓ"!4, 5Qf!N8¡tÅÈÅû’l'™‡v§èÉv~"¥6ïŒñÝj*G‰1zÙ]·ÒEe¡ü¼y\ûFlxˆJ m‰Ã»$W á»®˜ù7ò,”¸í9·ÚjY…I-Ä• áÌñÌÙŸäsÈBØ@¯J‰ë€Ïaeˆ¬FÖqI+]DpåÊ•6÷Þ«Z¹œrÑ'úDžOV v>l³»´-ýÓ¨~ÎÈTd³±FÓ7°õó4hÛS­!Œ»ú/¾ÿjEªkíô‚D‚˜Ü÷•Ä×2¼éÑuhÄiFR£Èûí&ýRÊð¨,ûðzGŸ9êD¥'(^{™!‚‚o?.(Ïí,Z´óçÏWkm™`—¶EìJ½‡LÁâ1=µzni½À".%”ǥϰi6½áÔœOL¥LIþ~rŒ#Aˆ“Œ¹$:Õ}%ŸˆfÛc’ a:Q ²ÓYFækD]]]• ;×q‘Ì@¼}}}3=Á.!™…Í"ËÌÇ’È2’óM–H’I"3#ý“Ü‹Ô 6TqD3;· !ºïý`ÁK—.a÷îÝ™.‚#‚pé&Ë]¯¸:‡ŒÍ;“¹gI°;~üxÚV.ä…g\0j¸ýä æ0ÄsO*'A™¯‘aÑÌæö= á[Œ©W2ËÙ¤G™ž`—¶¥o$ÖhN€i˜r˜vëÖM W‰2¬É,$ÁîÎ;ÕÜ3‡Ý …èJÅq±If²zõêÄ»•*Ub !уV"(=Á¬ÈþMr'’`WÂóIÚ®¬N°K…˜dذa*¸1Ed&Æ v™¶‹ä$RÌpÿòÝ\ûç4KF‡üy,èÞ4…Êú-Y"A$™…Á K†B¢äh!”õi{¶…³Tì„™3g&Š „O#)88E¥¯¢Ëð™xê¹ç·_>ÿ'ÖNGö|ù  ú«­Ñqȸ”(äxsö3•l:êËÙ¸{íþgÿ^’`Wz„ö’`WòšÎöo‡A3"R$Ö6õ¼ ÛMÁŒƒw¤ukl(‰Ý:A¥ZÑkÌ"•Î.­k¦öž„¶ Ÿ3Z ¹ñßeí«a»^hÕçø½œ?ÝÏ—ë{„Ä~Dpøðለˆ šø2K^Ë›q±Ø¶d2Œê„¿ˆQÛo\»‚sTj­¾–ãîíxœ8¸ ç¢ó»ÓU€uKöKœ$‚“'OVŽ1"‚öâ„%Áó_õì§b 'Bsí'=ñ1Kl(‰Ý¼Ží_ÌÀêiþ0q•Å×]:¾¿Ê4nÍ­1X·®Çbëçµ{ ´éçË)pŽÐ+ú ”®Zµ -[¶d˜@²¡8}íŽÃås§·o ›‚&Þ¾*ÿ¥Ä‘u,â‚M=Ñ#0û·,µx¿œ,‚’`700PÙš½$ؽzñ,þ:zÝFÎVc/þ}åg¥ IÐãMÞiÕuÞ÷Nï¨ëIU§'Š£eÏØ»q+†ôz„²{tÐdí!p]‰¿‡WêTƒ¿¿¿ª˜¼½½Y(i ÑoÅý‡«>E›¾F•ÄfU)¤hjÆÁëѬË`‹öË©"hœ`·mÛ¶vsßÿåVo*á‘xÇò:»ž‡56”ØÓ~òå³nЮÄ3ðÕ’IhP\†X§~s‘CzB(!“ò•ªŽêŒ5ªKv®˜¢\×eX”"hšäó-yòäAï °Ç ¾³ °ÖRN3ÇY¼Ÿ±þ¹#GÛ}JÀvñõòò²«»<ïÆÏ1lÞ·êõ«ž}1Ýïu54i„̲³Ô°Ô† ŸáÊù?–"ª¹ˆ½6ª3öm^ŒZ¯y«dä’6®Ìó/±‚HO‰¾y¢xIlÚ´ mÚ´aa¤Aâá£á÷‘ËUë¸A›e”7Swïî<¸ÏXAÍÛï‘^»üž}¡¾[7_ ‡Ù+†»...vç!zxÏV¸–.—˜Ø[þÊkÙni¥ÚË“Ç*;KS-°!ãc vBmt}–Uå óƒÂOàÔ¯?àØعf.ŽÿßNô ^jQ¢t !Ñ%U«Ve!˜‰Tl2GòJû>ÊkÏ€ ‰@ʼ‰1²MZÍ–î'üsú˜ª´îß»‹O·Â3ZË»âK¯Øe¹É’I°{èÐ!» Ÿ&N2'íN!Hâ”bBÇ"Åp÷ö-(T8ñý;ñ7MöÜ2‚%6$Â*^w¬CDh°r¦‘¹B«í?o^Tx±úmÝw4NÆìÁ€7)„B’¹}+.IETÓÝ ç~ÿÏ×n’d¿ó§Ž(GK÷ºŒøTý÷ø~!_(×ýw>Ù„'\Ÿ¶«²’»²$ÇcÕ^¹ðÎÁœ}ñI’kß½@¯J¸úÏ+ù,ÊW¯sQ½¦Äg*¯ÝêØüž,±!ƒxÕy½®_ýaÁ}á7Õºålïz¸bJäßIÊá9·ÚjYI ½FIŽ&.ö’r–©Û¢Kâ¶=G¨¹“³Ç½;·Õ¯ü/sK’¨ÙÒý ½OEŸ,‰nïÏV­o³$ˆ¶='ا®C“Tþ‚8Í4ëÆïÙ"’‚Ä|êÙJX<¶'J”©ˆ2•kXôùÌù „èüQE)š={6ì aV\Äœˆ #´U$…7|ƒ1ÆÛ ÁëYü9)xÄtJ’[Pì8B(„Yq[GL0…-")”,ûBÂßG!šÉIÄÇÇ3Á.!Ù!„‘²EÄS0’Böq+.»Â‚X:Åñ~lâÿ’`W²ÌØK‚]Ú–¾)S”Bh²õPÔz1¡V³6;¯!’Bƒ¶=ÕÂ8Mp¿ÿj#)d¡s¦³ìI°»aÃ%‚®®®´-B²Ks#&æÎ»eU$…´";ÐY†è•-[¶¨¼‚’iÞ^ì’Udzdb;ôY†èI°[¯^=Œ5Ê®r ’£{„$g1QŽ?Í‚Ð!·nÝÄÆÕav—`—¶e4ª_;zR ‘ŠŠñ õ‰$=~äg„††Ò¶ˆÍùa]PŽB¦a"$“7_~Ô¨Ó, B(„„B…B¡B!R8Ëœ;uNÿ·“%£CäÙMY„’YBXªT) {«%KE¯Tn‰wß}C† »»;Ëà ’'b¾|þO¬þŽìÿùò@õW[£ã)p)QÚä1¦¶'  ñs+ÕjŒ^c©`$çÙ’)ŒƒjÈÿ–ìkíµH& ¡x–±‚Õ7’C.((ˆÏÉ n\»‚sЦ úNXŽ»·ãqâà.lœ¨Áv~ÂâsWJñ7¯cû3°zš?L\ÅÏa$o¥%H–ìKÁË~8GhgŒ;û÷ïÇÆY²-l šxûª¼“ :À±ˆ j4õDÀPìß²4Ãç—¡Ç›þ8¼7’…Mˆ½öãââðÅêu`;DŸÈ`É›]¼áëë«âFzzz²P,àçݛѲ爔­Á¼ùppÇz4ë2ØÏ(òåcœ BìV%=Ëw¿]Bµ¦Þ,òë®uh¡=£‘#GbþüùªWH14ŸKgÿ@a­˜gŽÊй<¸+çÿDtD^jÒž…M2 ƒøg“ Eй¢xér,"ÏF§&ö ­é®iËÔ•Ƚ»wT(²Ç»å1qxž4+«B…PÛÃ]ߟŲ&†‚—BHìö -§Ä3p+î?8=Q<ÉvÙæª½gÀ±H1ܽ}  NÜv'þfª½I©¬>x€ƒ;Ö!"4X9ÝÈ\!!Ä~ ³Œ"½BI«ˆ{÷î±@1ªís¸y=6Q¼œ§Ð®éî…s¿ÿšâ˜ó§Ž(§å«×ǹ?Ž$ÝG{]Ö­Nê=żyQçõNhêㇰà¾|„PIV1tèPœ={+V¬`a<¢XÉ2صvžZÊ Iš+¼Ø ñ½=G`ßæÅ8{ü'Ü»s[ýÊÿ{7~Ž=†'î׺ïh|9Í_Èßp÷N¼ÚG–D´HÅÑÆ÷No«ëŠ çƒ ÄŽàШãââL˜0Ý»wGþü|œÝGÍS½²-¡Á(S¹ú?^!ë=ý&`íÌ8½ µŸj [ÁgèÇIÖVªÙH‰ÚœaíqõŸ3š¸>‹vÆ jƒé^¿GÀg˜íßN;oKtp¤‘’4IÍ!ÆxÁ}jpîÐö0C½‘Z†úØØX”/_3fÌ@¯^Ùó܆Œ bÎ8søË |:Ù>ŸmKß_„©íÿùdiâŸ?aÍô÷pâàwpr)Ž=F¨–wò’¹!Šâo\CøœÑ8´c=nüwO–z ÛõB«>¨µaæœcºŸ‡ÖÚ‹çk7I|Oî/ba0†ÍýV÷aØ+$„;Âk—/h¢ó:¼MDÿ‰+qõÂ, 膼ùò¡IÇi ‰)1Z:¾?ÊV©ƒqkŽÀÁ©n]ÅÖÏ'bãÜ@tô‘Yçð|;kg Çû‹ö$nÛ07>þSÍú\z¦¹BéÊ\avõ !Ä^É2g™¯–LR^u ÚôPîåOW¨Šî£(Gkùyw„Ö£|G…Ê’ ¸ÅKä½™}q¦p*Z ¿ìÙ¢^Þ GíµxÚ Ò+”5…òO«&„= ¡Ä_¬íáB„F-Ùoõ9e]˜¬Dõ0 Qÿ§~sÑ¢ó¼á7›æQëÁ䯧ïx»{T"¸`ÁZ5!„X@– ^ùç Š—.Ÿb»©(æÐ;( Ÿê¬\âk½æ ·z¯©…ÑežÉ¢óHæ§ž­„Åc{¢D™ŠÊÛÐlÒ‰g—d‘u…“&MR¢(¯ !„èHEðõÜlÌN?S¿þ€cv`çš¹8þ;•Ë|½]-ëúcŒ·‚׳è8=¹2‹ŠJ¯Pæ !„èH%~é¥s§ñtù*‰Û$òÇOßm²X´’lÞ¼jˆU~e!ôɘ=Xð¦Åç,Yö…„¿ÏU¶Û‡™]½ÂÛ·ãU„è ÷ÍÖp\6PE#²7h[$G ¡,Fމ O"„‡÷nEÔêÙV á»®˜ù7ò,”¸í9·ÚjYEnEPg¦o`ëç!hж§ZCwõ_|ÿÕ ÔoÝ=צôÅ{TÖÊR ñ(ÍlÜÜÜÔ/Ñ'¨W¯ €Å‹ÛÕ½Ó¶HŽBõûx½Z³·4¸\J”Vór5š¼aõ9½‡LÁâ1=ULÉ[Z/°ˆK ¼¬‰ Ï°i¶íeÙY$YX/ ìgΜ©2Ú“Ü ‰nÞ¼7FÍš59LH2bÍŽH-Äš)ÂÂÂT¯ðÔ©S™Þ+ÜùÝ;ñ;NyáùŠpoÒH¥ìòññQ=Ä–-[ÚŽӶôM½Z5P»vMö‰>ÉÊ^ášMÛP¦i?ºNY³i‘BÉ[)Ãæ"†°‹!GÚ–¾ùbm…èøÁæÏ¯rJ¯P†Â2³W˜/_~5ôMôÉù|¿æ8zô(Ú·oèèh¸ººêúÞi[úærùÌG˜Ã{…2Œ:mÚ4I$44T  x’2©3!Âß+”¡°©S§Ò$"žÅáááªgèççÇ!BAÎFæ…d.hòäÉ, ’ˆÁ“tÕªUŒOK(„,‚œô çÏŸÏ^!IBݺu±páB 4Û·og\Kgq¨(ró´Ê:LôG‘<òŒ<3Ô+œ>}: ’$Ò¥K5D*ž¤â<ÃÅë„B¨ á”.ÀΉÈR ©ìFŽi—1'-ÁTÁ8BjAŒ·§w å>g4íXÿ]VѶë…V}>Pù1íY^#bØ¡C%†YÈ–ÏÚø9^>ÿ'ÖNGö|ù  ú«­ÑqÈÀÃÔ1æ<{É¡Z©Vcô³H¥z3>F‚üKžÕ´îKœ§³ýÛaÐŒ¼Ø¨mºûÛúº×Fó·ÞK5òÖ÷[—㛟 pÅA³¿C9VIÎ¥mÛ¶hР>üðCå5˜“1þ¢¦UÁXz®ä,ß_e@·æœŠàÖõXlý|"6Î D‡AÙU™‰M4kÖLy’FFFÚ]LRáÆµ+ZÙ Mÿ@ô°woÇãÄÁ]Ø8/ߎÂÎOXýìão^Çö/f`õ4 ˜¸*É~ß,›ŠZÍ:¢Pa§4Ï÷ÝúxÕ³v¯ÿ,…H¥‡-®qæØ!l_9Cm—dæn^»ŠmK§àï“¿äxÁ3çsÒò_²d Nž<ɰ?{§wT¥"=@§'Š£eÏØ»q‘Ý}gggåIzøða 6Ì.ŸÇ¶°)hâí«ò‹(è žK¦žèŠý[–fèÜÒ#ôxÓ_%ON㎹xbšÇ_½x=¨b+Ëߨ‹[t}[]CBZ~¹.ìÙ°/·zS ´ÄC–×íþgþ4”­®Q·E•̼YçAIŽë7a¶.š@!4ðb/ÆÕ)kÔ½ÂæÍ›«#•*UÊÕå™ÖU¡í0xÖÍSÖ¦züÞŸcؼoÕëW=ûbºßëj×ܹd[]Cò­Š Ÿ>råªÖÃé_Àýû÷Pºbu‹l?Ç !ÉÙ°W˜ö:ù—?­/½ÌN?SZerìÀì\3W%‘džŒ$›În$"‘8ÏÈ|¡8ÏØMƒ)öì¦|^÷îÞÁƒû÷ŒvËcâð<&mAææj{ø ëû³R=VA;×ÌÁ±£ðBÝfIÞ;¼g«Ö‹+—˜ô[þÊkÙžš°šÂV×^ážðP%„Ò¬Û¼K®< !Idüøñjø‹½BÔ½yó¢Â‹ Ôoë¾£q2f¼i×Bh°™/”˜¤ [æõŽ UߊûOÍÕ#Û¤§nÀ±H1ܽ}  NÜv'þfŠÞ¤ÁÃppÇ:D„+‡™+4…ÿT„~Ð#ïK²]XNÚ¢‘%Î;–¡­®Q·ygŒïVžo‡àÀ¶U½ì@®ÿSs!Ò#l×®>øà¬Y³†b%ïz¸bJäßÈ_°Pâ¶çÜj«e9eË–©†Ò3”(4zð$Õö9ŒYõ³r„ñrp*šø^Mw/œûýW<_»I’cΟ:’Ĥ|õú8÷ÇÕ£OÜG^»ÕIµ¡SçõN¸~õ_„÷…ßÔp“÷&swU^öP›®\ø gŽÇ`ξø$vr÷N<½*áê?gP¬ä³f~[\C¥Ê¹ayÈÿT¢ô’e_ÈõßezæRd®píÚµˆ‰‰aaXI¦o`ëç!¸xæ¤~/½¨/g§ºNË1x’ŠH£I+Y»ÖÎSË$!·ôÄ ´è9BÍמ=þîݹ­~å™;kÑcxâ~Òsÿrš¿&¿)±}dYD‹Tm ¸wz[]óPTxš÷׺ÏhudèÑ£ëÐ$%ˆC‹8¬Èû–b‹kÈðhÌÎ &‡EÙ#$¹ñ ôòòBPPªìHê¤å0à=d é©*ä[Z/°ˆK å­ç3,çdûe5¡ôêÕ«£W¯ìu¤ë>jžê™m F™Ê5Ô|¬ôô›€µ3GàHô6<Ô~ª5lŸ¡'YCX©f#%ls†µOì-µ0U´HóÚ=>S‹Õ«5l‰‚Ž©îSÈÑY‰îâ±½”‹[¹$:Õ}›úøarßWÐV»¶)[Kmž.#×HÂæ±N+'ùkíç4²,C}ŠH NEQ©Æ«è2|&žzîùÄ}LFvHeÿô"{˜aºŸ‡ö%›d8åÄÁï±0Ãæ~›nćôÎoK,ÉPoÒÒ¯U«:¤„ÑZ†Œ BõÎŒH¤W„O'gìù„……¡ÿþˆŠŠRCëYmKßH8ΩíÿùdiÐ 2}3.Û–LÆ‚Qðá1VíŸ^ds"ŒÈ„ñÚÃñþ¢=‰Û6Ì P“Ò–|&ö INFz‚Æž¤¶jŒ¢²eŽP& Š>‰öÇáò¹ÓVïo‹È2ÇàT´˜ŠÑ§ZÏû"ᨽ– õÜÀG}„ˆˆüøãü64ORÉX!ž¤qqq,B!Ì2{Së½m[ú1Úô °zCd'7`Md7üÆcÓü1ªç)=}Ççlo½õFŒÁoIñ]¹r¥ú¿[·nÌnOrŽmgåÅ’Ï©ÉV‰Îaíþ¶Šì!± Ÿz¶í‰e*ªIxk?“{2•õ„UªTÁÎ;í*’Éz ž¤ 6TCêÒK$„Bh‰s~ZO¹J°WéÑ%O/bîþ¶Œìñ†o0Æx»!xý1«>“=#‹ê¥W(…˜c/âI*¡údDA"ÑbÏdϡֳ“y½WÚ÷Á¿gNfhCdYä?çk¼;ÖÍ|ßâ{2,*5„(ÊmH¯pÏž=ªWHHzHƒiþüùÊ“tÿþý,¡µÜ¾—"’%ûçôÈöÒ+¬Z¹œrÑ'úDžOf Ù)$ ›$ô•0l’½"3î¶¥_ÕÏ™Š²Mãb/aǪOU„k÷7Döhж§ZCwõ_|ÿÕŠÙ#«ÒòåËcÛ¶mhÙ²¥ÙÇùöc¶’ÜÊǬ–Uˆ'éîÝ»m“”¶ErœKd¨ÓÙÅUEáðz;Äêý³*²GZrRô…R¥JÁ××£F²HI.®@òçWó…õêÕC=¸•Ø%YY†d[G–I .¨^áªU«àééÉB'f!½Bñ$õ÷÷Wql aØ-†^á¸qãÌÂï ÃÍ|.,<âx?¡s¦gê5Ä{T‚¸·jÕJýߥ‹m‚9Ó¶ôM™¢Àä ±Fr #GŽT7n4K ;» ãAê–¬r6ñððÀìÙ³•'©d·—(4…¶¥o$ÖhN€i˜Hª½Bâ’^!!–0pà@å},Î32ÌN…Øu¯PæŒ%ë!–0kÖ,•²‰1I …Ø5...ªW8aÂÆ”$að$Å€X „BHì—¡C‡âÒ¥KX±b ƒXÜÚ¼y³Êl"AÑuã-yKîôÁoé4KF‡\øë$ò÷òÈ–^¡Ä“û Ä\ ž¤íÚµS¹/¹‡Ø…Jˆ¤ÈuËX*$I¯pÆŒªW(ÉYí…k—/¨”\‚©¤Ì$ó‘À S§NU4yFÑÞ¡må<84JÒíJ¤{›+ êò"žŽS]»vÍ1ž¤´- !É¥™xÿÍ™3ÇnîYbÓý0oÞ<Ø]tÇÇÇÛõg¡må<òãb1’27X @Lš4 ƒ J1Wùí.ÌÄkj×p­‚º{'ßo]ŽÙþíðñ¶ó4 ‘~†„¾"†ßVOж(„„˜DÖ˰ÖÌ™3³=ï\õFm°ë2¼êÙÿ·}-ª½Ò*ñ=©xŒ×{¥ÅKÚáüGPªœöE,AtDF~¾/Õ}Çu®†vÆ¢ökáôDqÜøï²îŸÙÁÃGÑç=뢻äÏ |04S=¡¡¡hÖ¬:uꄨ¨(]l m™Çž1º´- !É\ƒÑ*«ÀÀ@qF†G³Óˆ½ÞÁâ±½°aÎhTªÙ}Ç/O|¯–V™xVĬ=7Ò?Ï ‰ ê‹£¶£äs•Ñ7ØtP‰ž.Š|±(°»jÍ‹ƒ„ãÅÕÉZgçÂë¿ݰ·¼uןÛ)ÏÙ“TúJLÒÅ‹ëÆÎi[æq²HM|¯CÛ²”$ê 1YX_¥J-Dz…CF¡:sÆé– “‚p¦©õ•ÕÑMQ®\¹L»¿˜˜4nÜX;÷Þ{IÞ£mé›Ñ!A¸üš~mË\è5J¬îJè5É0@HF°kË—/WsÏÛ¶mc !±d®Pd®Œ"¹¥Gèã㣜h¡»èŠ©TŽ¿Ï!& ^^^Ê“TÒB!$vÑŠ—ø‘'Žsá/± âI*hÄ“” ¡ …Ø2œuêô)± ²VU°í8ÿ]À³LµC۲¶’Ûm‹BHˆEH"s02wsç†éÊ(Ýó¸ãN%T<©a”f'ñºCµ ênAìζ84J!$WC!$„B!$„B(„„B…B¡B!BB!$7Àõ$ÛiUˆ?e]ι=?Äà$t–Ïí·%@•Þ¦_۲ʸš§]Þº‹‹ ¼ž8{´-Ú…èy“­_ÛgHVYeÂíø+À7½€s»€gÜæa@¡bÀ¬G±÷Œ?|ü¿Se`×`àÎ5MùW圓×ßöÎlÊ4Óγ(ø(眜«ñ'ÀQm[×CÀïáÀW]j'«Mg¥™o.-! ý˜¶EÛJb ßžkô=Tð¢åœ3TPƒ“lº­Õ¬%TT_åœÛ¯§¾V™ ¸”k H–s.Ÿàù(ßœ×d&ðvþì…XÜË£³Û·N…Ë¥üß¹~š¶EÛÒ½mQ‰]3oZÆÖy•o„ÓÎÙ°Vìîà—^ÀÕ]@1wàÅ0 @1`›QØ«–^¿ôðÛ`àÞ5 Æj d‡ÇûȶÃ}€ËÛ'›içYª}«¥Ú‘cÝ>þÖ¶½rø'øéQªçj@•YÚµ39ÕN ÚmKÿ¶Å¡QB²ƒ“c€âÍ÷sZå㥽|\Aÿb£¦%TT?uIyžŠã€×.iC[à÷d©vò:u¥Ú‘c«ÌšÇkÇh×;Ì4N´-Ú…ìâß-@é@>g­²ê\L#ÕN%­2Êç˜ÐZx7é{7h-ð*@žüÀSžZË~¯dG`wE3Ï389Ø¡µÞÏ~T[hzßj‹€?´ý¿)œàÜPãQªcoBs^Ú–¹¶•Ü~tj[LÃDr5ÙæâNÒ'›Ó0Ѷrm±GH!$WC!$„B!$„B(„„B…B¡B!BB!$7Àk$WÓª7ˆ¡G*åÊõ¢m‘L·- !ÉÕÌ›ÉÏ„¶•ÛáÐ(!„ !!„B!$„B(„„B…B¡B!BB!„BH!„P !„ !!„B!$„B(„„B…B¡B!BB!„BH!„P !„ !!„B!$„Bì€ÿ‚ :({ÀNyIEND®B`‚refdb-1.0.2/doc/refdbmanualfig5.png000644 001750 001750 00000033625 12247746353 017776 0ustar00markusmarkus000000 000000 ‰PNG  IHDRhð-§þO cHRMz&€„ú€èu0ê`:˜pœºQ<gAMA±Ž|ûQ“sRGB®ÎébKGDÿÿÿ ½§“ pHYsÄÄ•+ IDATxÚíxU÷Æ_!„fè½™þF@¥I/RƒR$t¤÷ÐAÀ€é ŠŠ€€ M¤ƒÔ~ ]éMŠ ÿ=w™e“ì&ٴݼ¿ç™'³Óvrwæ3çž{@!„B!„B!„B!„B!„B!„B!„B!„B^2ÿP°DÙÉ®n™ò³Yˆ=yt/ïC÷Œ·ÙI#ߣ°¼Ý]Ù~Î㨧'Oþy}¦Ìg0_Q¬ÜÛ ;Ž]ìÃ&"ö`ô€ZáçÎðdK$lº‡™Û‹íçà´¹0Hh6!„è 4!„P  !„P  !„M!„M!hB!hB!hBq42° Iœ»|7Bî³!l䕹Q0ON 4!$õè7sr(,lŒDòÏ?!Èï‰E£ÚP  !©GÔ“hL›> ÅŠcc$’   ,Ÿ¦ßI4!„è 4!D—¼ôÒKé¾ èâ „ÄF™ (€ÆcúôéÈ–-[’ÄÕÅÅE¹Q¦L™‚V­Z¥èyîÛ·Æ éS§P¤H mÛ¶ˆˆˆÀ!C°~ýzõý£GFÿþýMç5qâDµLù±cÇâÙ³gjü¥@BtMtt4®_¿Ž¾}ûb̘1˜;w®ÍDZ“ãˆ~ðÁ).ÐíÛ·WÂߺuk\»vÍ$П|ò ®^½Š£GÂÃÓ&Mбߒ%K0|øp5¿råJZЄÇ£`Á‚˜1cêÖ­kè={ö sçÎj~Ù²ejÝÉ“'ѽ{w%ˆ‘‘‘­P///«û[ZfÎW_}…K—.)á5'kÖ¬¸yó¦ú^¬ZµJ-ÿöÛo±cÇ*TH}ž9sfŒýäøëÖ­SçÙ¨Q#œ={–moîý}_=¯Ÿ×HWW”,W.®|FýR¸paܾý¢ŠÖÀ¨æýýý•8øá‡h×®ŠrÈ”)S7GÆŒ±aëû[Z¦ñõ×_ãÌ™3˜6mZœsÛ¶mfÏž­ö9þ<æÏŸ6mÚàÆ(Z´hŒs0hˆõܱcGµnõêÕêh;óë÷ ñÏéŸPäùgoŽ9Š&ƒ>‡÷Õ©D·ˆ« _¾|¦Ïþù'êÕ«§OæÍ‚6gMe:pàºv튦M›ZÜßÒ2 ñ[<·’%Kâ‹/¾0ƒC:þüJ¤‹/nò-›SªT)å³ÿ´ü¥‹CëK.èÚ¥:uꤋó©R½–8ú¨D·ˆÈ‰µÙ¼yó¢¸wï^å[.Q¢„ZV®\9,Z´½zõŠ#ÒwïÞµº¿¥e"À:tP¸«á­ÓñA‹ßYDV:úùýÔ¢E Õñ'n™°°0‹ç³f͇ø ø~M±`У8š5kÃ÷+îqiâ/^ŒnݺaèСxòä‰É Eƒˆ›dÞ¼yV÷·´L£~ýú¸rå  §£R"Lš4i‚Ë—/+«XÎC?~< €W^yîîîÊMbËÿmþ`÷ßÁüCU߮ǜµª÷®%ãÑôíbº² «´€w…šTƒçHUïVõN2Þº‡ŸMdUïZ}¾ÀÒo¿çHBÐF.Û.U¿Gªz¯Û\Kæ9PÅÆ§*!„¤èD ·àuB’˃ˆGl€>èx¬f}´`ÁDEE™DZ‚ÞçÌ™ƒµ¬wïÞx÷Ýwáëë‹Í›7«øK ÷!D¯|¶z/nþs— Avl*V¬¨†fÈ𢙦Nªz–¥YŽ éå±–žìM›6±áˆ®ÅÙæZ”*’?ÙŒ\óÖ†[ß»wOõ÷ˆß¶V­ZX¾|9²gÏç8Ò)8bÄÓ½eÞY{ylW£f4I,³ÄRË`˜ï¾û¥K—¶zÎŽöFL޹Ðb‡öˆE-¢üå—_â‡~PÅàÁƒÕ褟þYå¢GVmÿU‰³àžÉ-EŽim¸µ Ï›7¯(B+ËåÍ36’3c÷îÝj^â˜5¶¶Ü’¸Ê@´"Œ5J‰´%,ÅDëú ã{zeÈ`Q´EˆE¸Åzxðàr{ìÚµK%`yôˆ¾=¢?6ì;ŠÎã–™>§”@›·–°ú9sæT¢iíÍRöÑІfÇ·ÜOŸ>5Yȇ¢‹#=£=«U«†:uê¨×;†*îñU‹ßZ\„èIœÛŒZ„'O£Í:eÞô¬ ·–áášÈJN[·nYÜ_¬j¹—y#Mh¹dÕË;·z‹•8ha„ ê^”Ï÷ï;W/ ´Ì_¥¬Í âêÐÄ+2¢~8x"Ž8çÈê ±\wIÅÚpkqoÈHD‰³–¬xæÃÅÍ}Á={öÄÁƒÕgÉx§ õ¶´\¶—0[·nUCËåø‚tÔË$CÊ>lñ{(ÐÄ&dXê¿¡·zãCk“G.x~ÓéÿÎ1Ü:yòèú¿€6Åg¡X~¯ûkí%ïÆäÉ“Uß§Ÿ~c¸¸¹`š[¼Ò±˜Ðr]Ký¯»ó’¿>-Ó¶Ú€§§'ÂÃÃcüMˆØ¢œ˜ØNBÒ’©ËwÀ߯ÜÝ↥}1´…š-hÝS¡BÔ£G¾óæ›oÚ|ŒÄÄv’V„Ü Çú=Gq~Ó6Ú±‘‘PÒ‘'¹4Ê–-‹¥K—&Ïr±ÛIHZ1omжd= ´C!¢üÛo¿%hÇ·Ìk±„¤ë¼lë![5†áà°k—'#pãOhY§‚Šw&hBˆNx…öcHûzl 4!DWÖó†h^ÓG ó&ŽOºñAgËUÃFŽÆÈ1ã’uœ/çÆ½;ÿ$û|rxåCö\x’”ãÙ3|±6ÛçöOpÓöãVàÀ±?áÊ,)ÎÓèhT(]ßMIþât#Е|»©‰gåßîdx×§”Êb—×ÿ¾©ls$e‘2_]üÞK‘cññIˆ“zí¶ÛˆN ØNšÄ2¾”ú0N!!/æ'N´ÿ¹íß·ÌîÑ¥‹åsšæv´¯©ã  I,’kÉ’ŸƒŸg„óñ±ÿ¹«HþÈ”¸§Ee’¤_’úôéª`RÄUr}ˆE*·jÕ*ÙÿæñãÇUÕKéâKl)+¥”æ’äÿRñE9r¤*<°zõjµ½Ák‚Ì;Öê±(Є؛5€É“¥ŒtÌåuêØ÷¼$ïK®\pGDtJRJWI-Á¾}ûb̘1ªH«­ˆˆÉqöíÛ§rÒ¤„@ïܹSÒÕê &%°†Ôõ1<\¥<— Â,%†‡ñðáÃÕüÊ•+iA¢kräÄ-€ù¨ÓÂ…ooûž×Š@Àò)zX©Æ=cÆ Ô­[×$Ð{öìAçÎÕü²eËÔ:©E(E\=ŠÈÈH‹âèååeuKËÌ‘ÒñöÉ'Ÿ`ÇŽš›EËSþð…  Û·o›>8ÐTÐßß_‰³ä±i×®‚‚‚)S¦8n)òºaëû[Z¦!µ Ïœ9ƒiÓ¦©L“GŽAíÚµíbIÈšn`ø=óäɃ 2Äy0ˆõ,uåXb]Ïž=;ý ôW#ßÕÓÁpI¡2ðŽB&÷,ðûøk)]ž¢çÈn{»7äÕ»mÛT;üÕ«W‘/ß‹ŽGñýJ• =ͬYÐæâ¬ £L@×®]•+ÁÒþ––iˆï7øùCH\%’iR Ä&ƽ’¶mÛ†ÐÐP“ûD[CŠàJµrñ£Ëßtéâx~‡Hwñ˜Uª×£ÿRðÙÍao÷ƹs€X·òÐHnܸ¡¬ÈæÍ››–•,Y{÷îU¾å%J¨eåÊ•S®‚^½zÅi»wïZÝßÒ2 ñ5wèÐAYàšÿ9¥¸sçz÷î­Ž-‚.>òcÇŽÅps¬Y³Æ®—]„$ÕÍao÷ÆÂ…’:1U­Eq4kÖLù~5ä5_«±)¾aAr©KöÆ¡C‡ªª#æÑ2‰›dÞ¼yV÷·´ì…©>®\¹‚Aƒ)Ö\%)áâèÓ§:ïŠ+ªÏâ‹–eâÎH)J²óU}»ë8vqšÆ ÍïW ß­^j Ú¼8-Cg4 ºJûxW¨IÁ{ÎèµÂCæÎðÔý‰Ji霳—}õ*0`°~=ðÜ=è= {øÙ¹½Õ~µú|¥ß~Ï‘„©€6’ðÇ/z'iÿÖ#­Û\Ëá-èøbSJ¸‰ƒiD’Úˆõ,¥ÑnÜHÝï‘×íÌ™ã.K³kW“8çÄá]©«Hqv\²,Ê\»w#s¶ÔÍæö,:/¥rµœÈˆÜ}õUÜõ÷¹B ¿þ Œ±=!ÿ“§Ñ8ùçu<ˆxÄ‹…úÄ«(…[ů¦üdÒ‹¼qãFåwßZB´üŸÔòåËU°¾Œ4²v\¢2Dmü!èÔ©“Ãÿ/¶æ÷ùçqWHÇU‡ ZÏšŸ¾‚ãg¯â—“áä…(VÀ ¹ŸÇ% tª_¬b¿~ýT€½„ ɰNÒQ£Fa…ø ˆð&DÆ • K&ЖŽKHš !aáV¾g ìýí ¶ü~9qQ‰²$ð7GòDÿ8~c¿¶û¿Û•h-÷F|C¸Í‘Æ#F¨y©ªuDÈ•›nµzÍĸMQºx~ÌX±K­šáß-jë/¥€´ä×0ÿkë=oþI;K› ’=ÏRJR 4!:%¾b¹Á%› k¶–ó×|M [·n­&ñš tìm¥ÓJ†-·oßÞ´MÍ2‚N’ùXŠ¾ØºU*|öÒ3[5Fùšï…=IJ-‡Ð¹i ô«£ËߣB… êÁÔ£GõV*y6’c¤Ý¿ß4OÑ‚&I%ìßû¸ù×)Ž$LC¬u‹u;kÖ,•›A:›-amíxrìø¶]°`cÉA,¯ß’~3ÑÍb=˃ÅìO!oq†ïAž<À¼yÈ=ý“Hƒ8«ÞCéís â«Euû{ÈK:òd YÙ²e±téÒdO‚Z®Ž©©£Nvrä¦þé»E¨Ñª#°ÖA,ýÒû/¹ŒkÖ4>03gÎŒ›7o"þüV·´ã™™¶´mÛ¶mÕkwõêÕUV6IÌ“èÎæíÛ·ß6 ±ð÷ߢnÀ… º`LÞd=‹³ ¢ü›yêÖx\Ö–™#î«nÝœ«0´®:­â$µ2:çÎSa{‚ø¯Ì'7Õ°aÃpêÔ)Πö‘×f‰¿ŽŠŠRƒY$·mbr|dËžáQaø}ÿf¼^×ê™Xë ·ƒ¤™4Ü"”¼½½•oT~?KÛA¤ù ã;žv-I'Vç)JÕÙ,ËÄz–ø~±¤ÅŠ—† ó6\ƒêíÜ8œq’ZÃC‡¡jÕªêÚ¼ùM'uÕÄßxíÚ5%ÐçÏŸW…‡FöìÙ1YòÛ@õ½°%pÊUk W¾Ì¤6Ö:ˆÅý “ðùó‘{Ò¹'S|ÛX»Ö»mb:›# ×Ä:?}èÛטZÂìâ‰ä ÎCºªêm-NRÊèˆÅ#½ü’x\&™7'«á†W^éø‘ã¬2Ü$ÒáôÙgŸ¡hѢȑ#‡ªú` y —B¾b¥ñëöU¼‰Eˆ0®;åæ”†74Š3-h‡ÅÖ8Ió2:Òi!;Úë°9RyA†‘KI±œçÏŸ¯ŠjJUàäЬ÷ÌÔo7lG+šÄ@JM=}ôèÒÅÁ‘‚äÌævmZÁÍ-£C´E©Åqᯋq®‘‘QÈîž2÷²®!-â$µ2:R÷l×®]1^¬åòåñ£RõA«$,%~ÄE"E5/^¼ˆ2eÊ$ù+º”O5ü¸vêø ¤*yóæÅK®®xf0ðÆ–Cì’ÈÂQ­þà±^r—u˜óõÌ’Éù:-â$5ÿ³¸4$+žtü ëׯWË4´ø¥ƒPZ:u¤t J¹Ím«›Cð5XÑSºTF5ß®ÈäáIe²ãÛ—Þ’÷dñöF˜ÔìÓGÚ/"9’I®ìžj"tq$™´ˆ“ÔÊèÈ@.ò*ù|üñǪ€ I“š4i‚Ë—/«HypˆßZ¢8*Uª¤JýŒIB~^!›W>¼Y¿ v¯œ‰&=xUê{'ïÉ\´(Â~ÿÝØA(ƒc$šƒUP(Ðz -â$/H,)¤“ütŒå"ÂR§áç秦ØÌœ9SMÖÎ#±ùt‰íÞ@m¿ðÈšƒW¦É{\$k¸ÐÜÝauƒQ¤)Ð$­Q®Ñ¢¶.Öƒg³AÈ-bíaœbÉ{Z´0¦a‘w‡„túøð @“´B¬ç€–eP¯ýäÌSˆ ’Æè6yŒ”¨")u%¢üå—FKZÄš"íÔ¸° ôCF7w¼Ûy$¾Ÿ?–a´Né‡&«SZíMÞ#V´›/î ±¦Ç—!®üáhA§â ¸eF«6í âä–æß?AܼyÝ.ÿwhè¸fŒû?K$ÇÞoæàï«TI;t¼Gª¨´kôîmÞ-"-WÄ’V¯_µm:Ügk÷cýÞãÈÀ¡âŠèèghT¥ Ft¬««ó²»@û}ü5? ·ËwÛ5)»á»½òÇMf#ƒUšö‡ Ÿ CïßñÎICt¼GFŠ«cÿþb,âT[±à³7ÑwèXD Ò7ŒÜ‹Ï¹ÔD^P±þرl .Ÿ:‚¢¯Vdƒ#’GdÑ¢˜Ö² ^‘:wÃî$zX ««‹ÊC]ŒÑ /Œ£—ôçñ¥Z§¼× Ö¬hBL”+'ã¿%±uÌå"Òóæ!,ô^†I_mc;9ÓCƒM O^«Ü@ý=ÄÆ /ÎÂÍ›ã.÷ð@áWK= :rƒf­±ê—±Ý†ÙéÙŠî÷)¾ù´7Æ|sŒ‘H¢ÜÝ0s&¦ˆ+ ÉU¤B®\IÕˆÀã×^‹¹PŠÆj…±:Ö_ruy¶}öø}´H‰ôô-ñÃÁh9|ÖOë߯'ê{“2ä]FÜJçª ócÇŽw¦ä`çwTÙ/-1ÙÈ‘#ÕH]ɯžÒç¡Ë"ÀhǦD¹Jð*P G÷m@ùÚ-Ø ‰àA«VxP«Vê‘$0zžg#UÉ™3ægé,¬\2¼YÕ¯÷†vuÁêÉÝ•H×ë3GN_“§Ñ¸«•Së“BBCÞ—,Y‚áÇ«ù•2¨&$łĆKÚ^­£³wZžš$ I¤8¢|jø2ib«Òlˆuª 1Í»v:ÞÞv¸(|Ï>³(КHK¡ØÚ½f!êÉS£Åzî*VmÿšTN•Sª[·®J6&¢Ù¨Q#Uo1>$ûàÁƒUé/©l®‰kÎØ¤T>§èýk?Ãñ½ëáJÑHY²{¡Iß©È]¨d¼Û(YVYÒ’Ô¿r“Nl8= ¡nOŸJABûô«¯ÆÎB Qg.ÝBÓAóLâ¬1ná|P¿"Ü‘:Þ"¶«µcÇŽj?±„%wº5Ìs°gÉ’yòäA† ”¸¦åy8µ@ß<Œ±Cû2Ž2‰ 2wo_MP …&Ý0³W-~'£ ‰1¼ž+ÄŠ_°=hÞX»V)Ϊ½¿±¸Ë¥¡Üp@Y׉ui$V$%¹˜¤â•*æò7>´ì"ÎR#44Ôäö ‘iuN-Ð.®®Œ£Lî™3'z[ñCûÔlŽ µóTžbGĽlœ¿z8wÎ>V´ŒP”Üåþþq: û¶®©\K6Ä”e;p+ô_Óº‰K¶¥š›C è&îùfÌÁ~çÎÃó­·J÷+B,îŽcÇŽ%ÛÍ‘Øópj&iK£GcrÇ7QÕ·+Ó‘êÁ½a2WíäæððjÖ4Zñ2 <ž™”¥Ü³Eu|»ëˆæ WÿFȽp|¶:íów˜[¿RHDY*§ËHËŠƒ±Ä-Ë´(ŽÔ<G‰èˆñÎ`¸ùu»8Qé±ÖNî‚1ý;®‘š¼i“Àí» põNð®øöÛºp¼Ñåá¤IýG¨2w†¾Ë|Ȱjóáà… ßÙiH¾dÇ“‚Ïs†xè~vn/«í·yÿï¡þAù¨×| ½†}Âû÷9—.]B—šáÇ/ûÙý\Z\´nOp-§± µ'cîܹU죔ÈÒ–Ë“R|^Æ S øÅ/%¥«Ú¶mëpÿ§¤#•¤þÕ[ôTUXˆÝöts”,ùB¨K&Ü—!qÐ2ŸÃ„e»ù{:N3’P„X:$Ø=6ROPjÞ½{W%NOVòt;"®:~þضd¯\=¸7ÌÝöBF®]kÓ.5+x£HþÜü=§òA‹HKÏpl²fÍŠ›7oª*ÝRkP‚㱞'¶}ƒéHí$Ì—Œr‰ÆÜÂó(» ±Ð’,i ~*Â[¨æ³tϦEñ] ´. é|+:6²Lâ!ýýýqþüyÌŸ?_‰uD´¤þÛ¿š„NKAÒóºfÍ€À@ûŸ“DpHüðŽa@YpK¢lNJߥ‹ÃÎDFFªªÛæ…^5D¸%»äúýé§Ÿ0HKrݰ.:‚«çŽS4‰1 é¦MNûï¥Dñ]ZÐö¶,3fTIWªT©¢‚ÝsäxŠ&>h锓'O"::Ú±Ÿª®мÏDU«ïì-¨ôŽŒEÈœÂÃÖàJ“â»hû’Ùp‘J¥d°úüóÏMË7n¬¬kÉ”%#¤îœ£óz _ìZ1C¥#µ%T8)-Zàþg33êáTt[|—mÌÜîÝ»ÇYîçç§&gC)mY8C)Ðéžš5ñ`\@†{a‘#«‡]OE+¾+á®É)¾«‘¢Åw)Ð$1<~ü—þøo²¬_Ù7c¦©ø}ÿfeQ“tŒ›²zåx²jûoe¨·=Ñuñ] 4I Q‘‘8²mÎ;€Vƒg'9dN’ú/×åª5f:ÒtNöü¹£lØowޝø®%wFšߥ@Ç­• Ì}QòÚ4fÌås–ð¹-ZÄØ6öoé’¼eË–¸páB’*7Äw%&nÓ3k6´6ÿ†ÞÆçªdH ?msžÂÞ>(Pª¬Õt¤ÿ;°ûVLA†Œnº¸à›f•$ÁˆvÏ]È=§*qU©\ 6ÚvlMRb)ý?þÀ¹sçTLjŸ&ÐÖŽoéZF­„ÎÓÚ%¥â6%…èë5}±{åL5Œ[bœ«ùvµÉ–t¤ó5Uáw±÷»ræ(º¶{?FÙ[Ò¬ÛéÖ¼7þD¦@[&þüjÄÞéÓ§Q§NlÞ¼Y化|7n܈!x2/QË—/W±¥aÚ–˜;w®ú+åË—OÒyjR[ã6eð‰d« ø»/FáÇo¿€ßðÏíŸ÷ˆlûãÚy¨ãwDY®\¹t“Ö–4«Äv|kø`èœõ*k]®žl tLD0% FÂÜDp?þøc,Z´Èª6lØPù—ÄÒL¬@kìäÉ“ã ÛΖ-›Jš$".áu–0¯èW5k:©q›9󇟬À_'~ÁºYƒÃðY|̉ñO7í€)]*+ë;“‡§ê8Ì[ô?¼ÂÓÛ íê‚6õßÄò­‡1¤}=«Û…?|¤ £ý’_„¨èG#_ Åª•ìq2¢Or¾®]»³fÍRË-!"*b§UU°ä/¶Ä€T±I±Í…òÉ“'غ»!¤àIDATu« ·‹Ýæ½ÅmJ‰«K+¿²ø§Ë×i‰FÄ럖ìvo7l5Óû#äÆ%ÝóÒ!=ߝކæÆ+ÐýÞ«¤²ÚáF(Ì€ÜY㻿›>,è:¨);#ÖñG}„MV†¢&Ôáf 9¶|Oìò8ÚñdTa|Äö?ë5nS|Êåë´PÙëÄ?ݸëå±äŸ–aß—OýÞiZvëÒxxÚžÜ?¡ô­ÚCÎR¸:#Å x¡Tá?eÊ´nÝ×®]£@ëŒ^-ª«úƒ5)Âhs .¬iHݨ¨(‹–¦µù„,j[¶µ´\Bë̉/nÓÖ!5â6¥.a·É«qáøA¬5y •Rþ錙Üq.x¿Åh“«g'Y µÿÓRúVÁ™R¸:# *¿ÿ™kU=Â|^ÙØ h’ˆåüÑ×ÿÅÏ›—¨JßîYñ8"\­×GôÓ'¦mÿ ½…¨ÈGI~s±–¾Up¦®Nyc»º }÷UgáˆN Ø Š ›À1‘â±F/Âõ 'LËDœÅ%bNø½$?¾ô­‚³¥puFº6¯ŠÅ›²!(ÐÄ|¿`lœeb1»gÉÊN ZúVñ3[êè´XÎÒßà )\‘Byr¢lÉØyø6Fzsq}çéê|Ãþ½˧âðÖåq×? ãÇ;FÃgt Oòs,Ù|£?ldZæžÉMUº×K  ÝÛxS§„@ýâ•¿˜è;·®âA˜¾œ»»gÆk•««,|±ùã¯ãO7iâÊ÷Þ{s=tjR•»LÁˆNÆØ|ñIGG?ãB&i…øš%ÿÆÿ~ÚŠ?íP…Y²¿ŒÌñŒ$´GšÕŒnnJœ-%‚ʘ=ÇSXI @’ޏ6^+Q@U?pô<®ý}•^ÿO¢¯ [× 41p÷ïk8ux'þ»s Îň–˜è÷ï WAÛÒN¦UšU’6ˆµ,„;ÄS3«9ÚF¥(Û†Ù9("ÆÓ»½ƒ¯'tÃéßöÄgm½”\IÅÖ4«$uyò4—lÃú½Gcˆ³ù$IîøœÐ‚&frÏ)ëTŠÑØâlޏ9R’ÔH³JRéævuÁº©=ñN·é¸põï˜ðgñÇ­wêÔ [¶lQá“ï¿ÿ~ Ú|}ìŠF²dsìܹ3ÂÂÂÔ62òTòÓøúúªñ’]FŸ’t.Ð’§BRoê wÏl¨Ò´‹Í%®Ì)ü”y»®ò9[#>´ÞÒ¬’”GüÏ[f÷Eå.S!¿MtTü´$Á’IÜV"Ðñ­×*™_ýúõS9Ù%¤*HÍ›7WÛH~xkÙ-I:èß6ÏGÕÿ+ŽÒ¥Kë꼦Θ…"ÿy#ÉU½e„àWc; [®|‘®‡Ó¿î¶Ù‚ÖkšU’²”.–ßÍèz}f+·‡² ˆâ>ùm/]º”¤õgÏžE³fÍÔS-°T0ª[·.~þùçS“t"Ðnî™UÞèš5kêê¼—,Kò¾’óyÕ§½Ð´Ç8•úÃ;Ô ¡g±^[Å:›Ã=§Y%)‹¤]<¶#:[–( zï޽꯵8éØëeÔ©d7”’wê¡`0ˆ&L˜ *&¹ººâÁƒ˜4ivíÚ¥®·íÛ·«Á$ ´3!¾fÉ }ú×=ðŸ·ÛT ëµÊïbÐü=¸r&›æÆ“(cº×Ü ”Êr„4«$åxhñEKÇaB¹SÖ¬Ycò1'f½¤ðööV®2¹Nä¬k×®Êç,ßÕ»woL›6 +VTé‡û÷ï¯\„mGŠ÷ ½q #[©Ñ›#–Žcÿ§b-u¾ÅËUµÞÇŽeSTÎhBÌ™ÐÛg.ÝÂÁß/ZÝ&¡‡³¥õ3fÌP“Æ[o½…'NX<~£FÔD†avDYoÙõ­Êý,%¯¤šŠ5·Å–…ãѬçxUÙ{ò–‹hÐyP‡¥áéA÷ÚIŒÅœV".IV}Ú?®ýÃÿ„×køZÝV‹TÑ:EÄ- §&ÄÓ# æe2"º8[â=µõæ"-ÉêÍã=¥Ò¸øÛ’ó) $J£Ü;M0$ðG‹…bc[ÏM{X\§…¾%ëBÉAULO.·n^GaÞwºS´GBŽƒ-ñž²>v̧Ôã3÷–Ïɉù<°1»WÌ@»Q Pú­: nùÔUöÊRÈÞë5}ñ{Ðfl8t)yŠ[&<‰|œìöÎëÓ0YiV‰ýß.™€f¤t¼§r/$1æóaØ=|óio< ¿‡KÃ3G®Dí·í«IÊ?m qsÐÕAì ÓP “„­ñž‚yÌgìxO!)1Ÿb/í‡ê-z¡^û!‰>IÐ/ñù§ Ik· ÓP S[ã=ó˜Ï_ý5F¼§\˜Ã† ³)æsçò©8¸i1ºMZ¢¯V´éü·Šï¹ç8^É$Ea ´ÝIJ¼§;æ3v¼ç—_~iš/æ3"ü>æh¨2ÎYu ™<æ1cƨœæáG —¸â\Š'ùœ·5 ¬DnB(ÐNáC‡PµjU%¨Ú¼Ð¾}{L™2EÅA_»vÍ$П~ú©ò;>|Ù³gÇäÉ“Óô|ÅzþëÄ/è0†Éf¡@;97nD÷îÝ•@˼&ÐY³fUátGURV­Z¥–¯X±BEv-ZT}–ˆ´D¬çw;Lpt!!„íðHµ‡Y³f©y±Ž5¤LÏìÙ³áïïóçÏ«áÚ2Zðúõë(^¼¸]ΕÖ3I ¤ä•¼¦)™õ1*ê  ô ‚ƒƒÕ€ó {±˜Ë—/’%KªÞláäÉ“jT¡tÁ‚qñâE”)S&ÍÏ—Ö3I Þ­T£õ†‹KòIâ¥ë·CS伊åÉŽÙ2ó¢@¿po¬[·-[¶TŸ×¯_¯–‰@‹ZüÎÒA(­%9ïСƒê”Á'š:-ÜRæêlp­g’lFuª§&BÖ½@wéò"ÔM|Íü1&NœˆÆ£I“&¸|ù²ŠòÐFJ‡L•*URÞ$Š#-ر|*êøùÓz&„>8}útŒÏ"ÄV'øùù©)6nnn˜9s¦šÌIÌ(ÄäXÏǃ6aüúÓ¼j I'0a¿ƒ YÏñ%„P I£YÏÕ[ôdcB&zb÷Ê™´ž I‡8½:úéSܺuËjÂ}[HÑxÏÈÈDm'Iüƒ÷®GÀš¼Z ¡@;…_­Œ 3æÁÕ50ÙÇòÊ[¡·¯§ÈyydË ¯DäâØ·ú3TiÒÙæT¤„ ´î©Ú¢·š±žm]¦rEBÒôAëÍzöÈšƒAšèÍz®í7Ašè‰Ÿ6Òz&„MôFTä#ìß°5[÷ecB&zâÀ†@øÔlϹ؄¤cÒ4ŠãÖå³ø7ä&[Ý€kF7í­8‰ÄzÞ»zF.=ÌF"„v¬ h ¯œÙØêBCïà½!óQâõ*­çl^ùØH„P ÓŽðûwpöD0[Ý@•êµðäI$­gBˆUèƒÖ‡·.§õL¡@ëè§O°÷›9¨×~ƒ¢pŠ¡Þ’ÄH* Œ=Z}–ù±cÇšI©*IÄ/üù矦úƒÚßܹs«}zôè¡>GFFªŠ)«W¯FTT”ª˜"%®R“_·¯B‰r•3O!^•„ç² —,Y¢ÄT¦•+WÆXwèÐ!T­ZUªTQóæˆˆKõî‘#Gš–Ieï'Nàðáêš·TñNmëyDz)høáh^‘„ç² …ºuëªâ¯"¸5ÂÙ³gMë¤î`÷îÝÕ:™±Ž-ÒY²d1}^±b¶lÙ‚¢E‹ªÏ©]V³žó.Å+’â|ôðáÃñÅ_àË/¿„¿¿ŒuüñªW¯Ž5j¨ùØî©;(V´†XÌÅ‹O“ó¦õLqz Z|ÌEŠ‹‹‹ú«Œ]»v™üÍÂÑ£GQ¾|y5/þæaÆ©B±åÊ•SË ,ˆ‹/¢L™2©~ÞÇ÷o¦õLqnÖ¬Yg™¸4ÄõѲeKõyýúõj™&Ð3fT>gñO7hÐ9rä@‡T§à¢E‹={vLž<9ÕÜÛOćVðJ$„8¯‹Ã"Æ>>>¦Ï2/ËÌÉœ93úôé£"?‰àkºR¥Jxå•W”E\øýgx(†%ËòJ$„8§m©N ¶ìôéÓ1–‹+Dܱ÷“ND 777Ìœ9SM©Éá-ËÐcê:^…„ôiAë•;¡!jÄ`ao6!Äy-hG$£ÁJ¯ò^w6!„tR0üHi²f͆—óa#BôoA‹šû„­‰£¶Mìõ±ýÐ_}õFŒ¡æ§NŠ?üÇWÑ.\à/O¡@'s1ޝ#ÐC† ÁîÝ»Õ|½zõ”@ïܹï¾û®M B¡@§0 0Í*dL@´cÇ ´iÓÆ$ÐBÅŠœ9sª¡çíÛ·çUFqlöôôT"jþ7±.Ø‚-Ë{öì©,]áƒ>ÀìÙ³ñæ›oš’"IÚQ]ÙVæ­Ñ¸qcuÜÐÐPÓ2IÄÔ¬Y3•Æ4¶/¼mÛ¶puuUV´ˆ¸ä‘„——¯6Bˆc t… ”»@r2‹e+bj+æ‚}ÿþ}Óü½{÷âøŸK–,‰½{÷*‘-Q¢„i¹Œ*¼yó&òçÏÇJ×(]º4&L˜ ¬kã š!ƒI¨åÁ IšöíÛ‡V­Zñj#„8¦@‹;@:ò$é~Ù²e±téÒdO"74A–ù)S¦`Æ ¦õbQË÷ ñ¡!C¾½½½•o y€tíÚ¾¾¾Jà-ù˜5a7K:ux¥Bl&†yXշ뱎c§ÚжñïÇõ+Ùê0­Ò>Þj²1ž3z@­ð¹3<ÙIÃ{@÷ð³s{±ýœÖ#­Û\Kæ9P…Bt šB(ЄBl!M; óõFÁ"ÅíþOçôÊ»¡ÿØõ<²æ@–l/ó $„èC {ÍÙÉ'„DB!„P  !„P  !„M!„M!hB!hB!hB¡@B¡@BšBšBšB(ЄB(ЄBvzV|É)¾ƒ¤+² €—*öÔå±(ÐÉ$ðÈ3^Ý„‡ÅÕüC‘Òå{½^£Y>g² ›ögšwqqÅ—ƒ}´vò+kïø…[Õ¤m#Ë=ŽBó¡ó±)è8ê¾]9³z$éXzcÝžàK§þº¹Üé-èØ<}…©Û®¡ÕàYøv¦Ì'U†Œ˜¶ã†çµ3üm²Ðå/­u3q"0r$pà€QLOœŽ1®“¿Ú¼ ÂüúëÀöí@Ù²ÀŒ1õ×_ÀªUÀÿûbÿ_Æ‹¹­ÌW® ìØa¸Ë,Üf²¾vm`Ï`Àã9:9"ÌU^/‰ëÛ§áí²Å1pÆ· îóìH é¯6¯‘1ƒ+n옦ÄÙÆÚd‹.ÐðÃÉÃoÔ~ÿ\û3ƺzí‡À=K6Ôï8ç ¨9Íš-YÅ+W€±c­o{ìб#% ЩpôhÌõ9oWJ˜Û´ªV5ZÇrlãnjǑãÅF¬sõ*UŒýçŸNÿ3ütì†w¬lYÜ1¢Ó»Øô\²Ž7¤}=u,9æcç²Í2¤§û4£›»ñ©äâŠgÑщÚç%ƒõýTíõ8‚bçˆøÞˆnÜöï,¶l&LHÚ±²f}1?~¼Ñ2¯T xò¨^=ñÇyöÌh¥çÎÍßGÝ“/á©ážt5Üo£ts,ZÐ:a÷Ê™xô0 »¾ž†WÞxq£å.XÇömÄãˆع|ZœýÄê¹q‘ ¨g&O6 h«VF±>tȸ\¬[nsÞxX¹xøX±(_Þúq?6ú¤åØóçÇ\'nq…hljXÝsç}Ñ·oýÑNÎ;o”ÂÌ•»öð¦¯Ø…å½MëJÌûŽáAÄcL[¾3Æ~b%_¼çxÚ±¦}½ Õßx%YÇ¢­sÄ?=¼A~ä/þ*ºOyák5hVM黣~Çaqö«×n0&øùàуé‡Ö+Ò'n„¿ÿ6vâi.Žví??c'žæ‡fø€o¾^}Õh%[cÐ `øpÃ]d¸Z´ˆõþ=Ä(º"ö¾¾ÆŽIsä{¦M3î'"/ççä|>¬ :,ÃìoöâÍW‹bùø.¦u³µBï)«Ð}â ëX?Æ~ƒÛÕƒßüûàQ ßqÔ“§Èß`8^-žßN鞬cé•A¼U}»ë8v±Oz»%ƒâjF¨2w†§SýSQ†Wìo ü  `ñâTý*ïÝÃÏÎíå™®‰Èp”Ž>[i=raк=ÁµhA’šHžDp”,iì$„.Û¡õLRóð=’¢8«õvBšBšB(ЄB(ЄB&„¢b„Ùݾ|ÖíÀÆÀ6 ±ÑwïfÆÆ¼þ’ÈÝ»á™7`û987þ¹—‘­@!„B!„B!„B!„B!„B!„B!„¤þ+°ñ”§t ¼IEND®B`‚refdb-1.0.2/doc/refdbmanualfig6.png000644 001750 001750 00000030630 12247746357 017774 0ustar00markusmarkus000000 000000 ‰PNG  IHDR’à)à„ cHRMz&€„ú€èu0ê`:˜pœºQ<gAMA±Ž|ûQ“sRGB®ÎébKGDÿÿÿ ½§“ pHYsÄÄ•+ IDATxÚí XǶÇ‚ˆ‚ BÔ¨y1Æø$æ%b÷0îQ”¸ÄqA\qW\"š¨ˆ¢Hp×(QMLÌ5×ÄHronbcr( ¨¬¯ª§gl†f˜ÿï|ÓTwUŸ:ÕU§«ª»ÚŒ¨&š·œigo¿¨a£Æa íÜûé?ÓîÿÞ–ƆLª‹66õ|.oñªK7CBÇü's$00:êÀàHÀ‘ É{w’¯óË¥ÂÇ:µ(ñ«‰Šî7t<àH¨bNÅ좨³ŸÂÀ‘P>23ÒÈ¡Yó*?/z”Om£„7Øn>þtáð~ ÜMû"C)7;[;¾k«ê˜„Ô{”’x¬[I.ÜJ¤ñÞ¢9t#å<ù.\F®žÞS¢i??O]KKÊÏË+q^õýý=ÆËžWî¸ìôÅ…3TXP JëKö¿4Ÿãƒq!ôH¨zõ£ƒ·~¦=áK(ýÏûô8ç%íÞ¡jx•¿ñ›×PhL¹yO*ß5Æ<œï/ë8%rûíÜJ6v'bnnQâ¼êû/&ÄÉžWSoSË6mizäfÕ1êù=*ˆsïþªíàèXÁ±Ô17¯RN¼¿–î=Lùy´b‚‡pþ'¹9dÕÀZv¿®é¬?™B×Ï%Sôâ ê;jLµç€Š€«TvŽÝ™³ô\‹Jí;òÞ&òœ9OØnñò+»z9í_F‰Û7 áÒý lliÛÂYÂü/ßßQíÏÏ{Jñ›VÓø ÅÔúµ×e“"·?íþ=:´aYÔ­K?~ûOêìêFÑK‚ÈcÆ\!Žú~ŽúyåŽ;¶s ýãòêê6”º zKc>¥\:zøÏô?ÿØ…+f0¨.^hÛnžÿ’ˆ x³]7ø›í?|}Ã–ÆæHÀ‘¨>0Ùª•»ß#èHAA>ê+€#@ÊÃûi§>>otz=øë/û¦M¿4:Gòôñ]\5P3ˆ ÐÌ‘€#GŽ GŽ 8€~Ìg’+^¬ö«‰b˜À‘`Úðˆü¯žqà< @E&¿éß5|!€ÒŒdrRCïÁAÜ·’Éh&1YÁ$Rt aâÿL.1iǤƒÆ÷µfË$ÉM1Íbúrû@€ZÆ9&Vâö{LZ2iȤ@­‡Á‹+“íjñ·‰á‘Ò×¶£ËÈ gÔþÆä,“BÂ|€#èÉ&QL’¨ô\ÇR&39¦>‹É(& 4¤©m?€¾G€`Ž 8p$àH8p$àHÀ‘ZÁ)(h$ džI+q›/Æø;Ì€fð-ô$Å’ð™LìÄßL’™øÀ< Gbªô… ôâ&]ÄíúLþf’;êÅ÷Lþ„Ð#µss‹üÛ½ú–Ђü¼:÷~úѦ°  ŽY:ÅŸÚ7iö–Ñô?ÿ¨›™žö.)>ÌÐ#µk;»'«œmKèNìêåtþÐ>jÜôy³-ç¯Z1gl«èÆ¡«žÜ½†0AðÔÆ-&»F49tïÑÁ À‘C2Ö©E¥¥•›MÛƒgW{ëÖ«G‹w"çÞ®ÏseÚSä½;É×ùeÏÇmÏË8PcIމ¦Ž}TI#«VíÚWi£_ç9³‹¢Î~ªszû¸ e 0Ú;dm\;}‚œ:uUýŸzϨô¬*}Ê:>df¤‘C³æ:§çÔ¹}vú$*(6a¶M§/.œ¡Â‚‚"o|Œp¥É¡‘”•‘. “¬ŒORó%‹³/2T qóñ§qÁª}„SVzº°mëà@akKK®qKûãÙ6n\Jþ;ÈË®ÿÜ'L¡ïo+±_N¾o_8¼_8ß ¯ t™Å¸ˆ~úîºqá, óŸFž³æËÆOIÿ¥«„»a.|[î\r86oÁœV†ì¾^L—ðC'èì=¥ôÔ¤K‡^ýèà­Ÿ…ío¢ÕGβ<œ3§’Ní{_cüøÍk(4&ܼ'•ÒåØÎ­Âd|~^]LˆÓY%šÒ–êÛßË.=L—ŽÄ ÛÚì.+ÕESoD.¬äð|sT € Ðõ'Sèú¹dŠ^D}G¡:ææô$7‡¬XSÏ¡£h®{o²oÒ”:»º•Š+4`<Ž”‚ü<Êf’¥U}**,$s Ùs©ÓcÈJýê:uw^j_[çNÂïÓÇ¹Š»‰žštqîÝ_µÝîMá·¸¨H•¯-/rðÑÒ½‡…|®˜à¡³>ÚêËxBÔZ*fSV¬Õjwi\]QO'õÆçB€ Ð Ÿ7^¢è%AÔÕm¨ð§~ƒh’‹“°ÍÇ×›¾ØŠÞšø™Õ)y™LØ ¼o1þÿ^,5Œ²{Eµíð&µ|ùÚ³r±Æs©3Ô:ݼ|Q'½¥zÊé¢rñÇÍ ¦ð‰cèÜÁ˜Ò½£á£)rÊxúâüéréSVÚJ¬Ú’sWêØg€°]–®åA.›WR„2 <àÍöZŒmc‡ì®}cSž¸|¬þ]WÚrþÕ³ªc­ˆ/$ÞlG¡Ñ¡µ0Ž'ÐæH€,ñ·…è‘@T€œÌL«÷‡¦×â¢b3³:fÅеúà«ÿ¢Ö™&˜l¯Ý´2<öfŸÃý“š²ô,œíE&“âcZjQy¤1Á§ àH0zš1ñ#ŧΑâ)¡šÖóâËÓ÷a2RÌÏe&G Ÿõp$T*}EB¢ó¸\Kòe!:•qLáT †¥‘è<ÜÄ–;Úü)W©Sáy¿Ê„¿ýø#.G€~ð¥€'3á/TîcrÞDíГÉÛLÚ0¹Î$N`Ì—sŸ¡àNc*“d&Ë™´D‘”r*›Eû, ®%Ã2ŸIn:W ßÕióJï‘c¸8;0á_Uâ Pña«QLVæÔáÃ\s™ cr…C~Ç™¬mˆk©âÌcò¿&˜ï ÷H€6*kø“?µ4–O-}Ï„/s{æÖË©\•8b>üµšÉW¤˜¨ÿ§ ]K†¤ “ßL0ßÂõ±Öö"˜ðOÞ…‹w÷Êðâ/¯0‰¤NJ÷‡1iMŠ mþuª›’8rûÊC;R ËL;þÑ>ÿñÅVnx/¤x'…;•…¢­ù‡Øÿ0е´Rr=h»ž y-ñx!¤xLúŒZxSñ¼|8j&“Lê‘âÁŒo˜Üf¿°Gi~¾#Å{<+$z›‰úñ°Ñ®íDg­Iw¹ãÔë _£ÿ'&/39Âd—˜‡Ñj:|,csÎN&þâÍW?&§˜frHRÇÃ$eS¥`h«örN¼ë×otø˜ûlµpþ BW&‘2qÊÚ§KïƒÃL+¾âÇOPT…;çeLÜÅÆn0)æT6‹å]×’¦ë©¼×R±d8ˆßtdˆÎaªÌ±‡DG± ÿJW&A¼I1ï±A&?ï‘b®¡èxÍÔz‘¢ŽÛµè®é8©ÝöˆŽ`²¸­D]M6Ÿ%:ë&â6Ç™É&“0´* å[ŽxÁ5PÛÿ™øk]‰:´+?¿S;ÁÄ Ž£JùQìñqÚˆÎßt–Ia%ÖA¥S‹ó6Mí89ΨÃóï(ö¼øHR>“×™x’bnq ¨L¶ˆ•-FÇãg‰½…zî“^So1ñ!År»È8ÇëáTˆÞˈ7²|ò¾ÀÀ×SE¯%N)†>Ëó“ßÄ|ók°Hf?^b’$6ðêsKÅ¡¦cZt×tœ”‡çðPŠÅ0ÞÛú\t(ï‰=›'¢CI¬î‹ ï‘CÑR¼¸ù0Ã)ñ k.ÕŒrãs*}E§rX§bìð?ŒÉ $ÿH/€#FƒŸ(: >ö{&S1¸Þ|¾h5ŠŽµaÑD Ý©ð›7ñ&ñ!&Ìq8P!úRí\4” Ÿäå¯oàT Ð S[4èæTÜD§r‘‹Jb> Ž€R`ÑD  IO…ò8 §Gj?üñÜ‚2o±aàKmðÉs¬wàT PÁ‡¨øKLóÔÂù²üÅA>lÁŸÛ?MµãñOP}N…¿K4€C£çD§’VFœVâM ®;8`ļÆä)&H_{&ÒEùK[wa&``ø2ƒÅ묑¤§¢îTøË|ÙôìaGŒð‘¿]ÎŒãK\\ïüø{GqªÑ©ðÞ/xã1Œ¯ S™¦#éKŠÏƒãÄO:P–÷_¤øþ‡©ÃŸ:Ú3T ÒO óï¼IŠõ»øêÅ|é‘=0‘é9’寺t kïÒ52~¸yƒîÜP¼l^Ÿ'ü֫߀\=½ÉÚÖÖdí’“•E—ŽÆ§=Îyôœ‘©6ØÚ®Q¤™™™É¬ÌÍÊàÅÂü|{U£dfVPÏÚú ‹ºÙ¨ÁÆKAÞÓÏŸäæÎPÞîD<Þ ‚u?½KiüN¿ýûúéηôÇþM-Û¼"8Såï{¿qGbŒª5{©]{§·gÌ­o*e±qöÊÉ΢Ö6d^·.Y5°¶xåõŽ/ëƒÊk¤Üýþ;:E”›Ku$Àxiö?­y­kO£`çèXÈzø&s“Ó¡wj×Ñ…^éБZµk  b”Ýç±N-t:.yïNòu~¹ÒΙ›MÛƒgWj*ƒŠØ¥2õ–Ó«¬óqÛó2µ·.ñœYë¶ÑÀq¾HuÕ%Ô£îHtåTÌ.Š:ûiåXL4uì; Æ5R»â‚6T¥Pê¥kzû¸ eP—jC=2T:úêUõ¨NuVEÈÌH#‡fÍ+MÇk§OS§®F×ãÐDBê½RvQ†"]C•—®é9uîFŸ>‰V¾ œ<êRå×#C¥£¯^UQªdŽdKÐtúâÂ*,(2®¼pø/ÿÁWšIYéB·MÊ—,Þ¾ÈP¡kææãOãƒK\|Ê4®&£ýkß½Ÿ¼œz-lLYéé¶­ƒ„­•ÕIŽ´?î‘mãÆ¥Ž—V9ýWÆ'iÕ¿,ÛôáA7RΓïÂe„¸\—%Ðuáô(ó¡Ji…Tê¦ü•;^IJâA¶o%¹ p+ŸŸëÂáý‚n­œ^#ïùK„}7¬¢µÇÎkÌŸ4î¡o)U^r@.[ûÆ”vÿùëÅP×!êRɺQYõˆ×þ¿®uéø®­eÖ#©^eÕ%Ï™ó*½UIäçÔÛÔ²M[š¹¹D#¢üåê§ìâåÎ0ÿ’Ÿ3Þ¾„Òÿ¼Ï¤¤Ý;Jyvåoìš0Z´s?GǪ*Çé*ÁƒsáÛšt’ñy vAg”:¾¢úóÂW^rz¸³ÂI øÍk4¦·!‚BÞ+u©ë¦DÓñ~~>7ïI%Â;ôêGoý,l÷÷ð¢KGÓ¥#ñ¶¶ò‘Æ-K¯²ÒÉzAÏ7‡÷ÐP— QP—äëFeÕ#}ë’¾õH.ª¨GUÒ#Y2…®ŸK¦èÅAÔwÔ…37§'¹9üQ?ê9tÍuïMöMšRgW·RñùÍ ÊãhÃ̬ä«1ü݉lfHK«úTTXHæuR§Ç”úÕuêî>¼ÔñÑ_z袇¾60νû«¶yOˆZKÅìoÊŠµZu“ÆÕõtRo|.”Ð\—*«¡.UN=Ò§.qYžz¤žÎggNVz=ªGâóÆKÂE×Õm¨*¬S¿A4Éʼnâoÿ*Œ÷5}± ëKfuJv’¦Fl XÖM[7c"kìÎù- £ÕS}UÛʻ޵mÛáMV òiÏÊÅ4-b£FÔê?b"– ¿úñÑ_›mÎÆí¥ϑςeÓðž·„"¼)'+S§qÒ²Ž7'˜Â'Ž!—îã[7´%ç>®ªm]ó§+réܼ’B“–FÀ{”q½ºÉÕ%åq»W„˜|]ªh=Ò§.•õtz »Òë‘ÁÞl÷œ9/¬¼/$ò1Íw]]hËùkTϪ潇uŽ]¬‰Û7ÒŽË_UXM•þB₌ñÍv¿oØ>{ÃS«G¨K5‡;_~NçüóÑÃΓQÜeuh-Œ+ÖÔ‹Ÿ)óñÜšª?¨%½•^P—j.FÑ#=’Š÷H0é Ð Ÿ„Sè‘Ì©om³æ4<ùyOÔµ¬÷˜mÆ¥°¨ðnÞãÇ­GR×Òòƒú6 Ÿ¢„ Xž>µ¨[¯¾»c òóÌ‹‹Š¾}œ“ÓÅŽTYL¦39S˜|HËf0(C˜ð·ñÍ$ÿ¶Ê?J†ÕœfLø¬ãH8“á‘(Àpð%=/6zO`Ã9ãf¨XF.0妋ø‹ ‰Iâ#–ï•´‚9(W¯¾!“ºLüa8Sƒ;¶·˜ ‡I(W¯ÞAÜ~æ€#15øšÛÖ’rò†IÐ/z6Ìdh“À‘˜Zàënç1)b—ﴂYÐ e¯ž×¡¦LÆÃ$p$¦Ä@&iLþÁä{±{Þf@¯^½=“ûL~g¿7;f#1ø!ÿ(s “˜x2ùwSèÅX&|­x¾”ñÇLŽ3y•C\ޤÖÃטæC[ÊwGr™t†YЋ—Åzóñ?&ûÅú@•Q]Ë’HßlŽ¡gþò;)¼D €vx=QN¬·ë‘’Õ\¿¨r'%u$€òc"7¡Õ‚9®/­à ñ—?ñ‘HŠa¦™L0©Ç䲸Ÿ?Ë$ÉMR<®{‘ÉRLö}+Ç'Íψ釉éfrˆI¸ø¿>9x…ÉCå†×£“FX¿k˜#Ñ~!tb²ÉR®BÙýØòq<ÝZz¸ZHC;F÷ö=jTèk/7–?žO8-df¤‘C³æÕ¿,®>ANº•½RïѲ½ t>>V/»ðxëN\ «Ö´'|I‰ðå±GèpÔšrébÈk@×ôœ:w£ÏNŸ„gГ¿³PKû¦M3wëgÕ–Ÿÿqz¶q®Qe ¯½z±ü%Þ¼Xeúéõ©Ý”ăt`ÝJrঠ»š|Œö¯Ut'/§žÃFÓåc ì¸pz”ùPUÉß[4‡n¤œ'ß…ËÈÕÓ[»sãsÚ4ƒÞžHƒ¼üJݵºùøÓ…Ãû)pS4í‹ †%xØñ][UÇðôåôÒtNé1ÿµn[)ý•|LYéé¶­ƒ„­eúN§/.œ¡Â‚ XÚ÷ȶqcaû#ÖpÚI]Ý蓤#ª8_²4ÔóÄmpåø‡ä>a yÍ]¤ñ8¥]}û‹*u--©¿Çxò_¶Jc/À¬Nš½á=U˜\ÚR»*±sp$¯  tëY*];{®iyrÛµrz¼ç+ÓÁ «hí±ó²: .Wšgé¯zYÈ¥ckߘÒîß«Õ>¿s è9šâ¾8MaC§Ò׿ý@Iß\¡Àþãié)Ôy/EyΧ´G„;Ö/~¾MÓ{{ÒîkÇ)só'tòÖeš4J™ÞÇ“Ö}«J÷½q‹(äÄ6þzŸç ˆ[IÉß|B«G΢I݇SÌgI²Çñ4”çÊ/, 7Z¶¥ˆá3„}K“vÐç ½[ux>¤q¹ž³Ö Žó\C{Ú6v¡¢ï âóô55¾¿=ø‹m©tR§ÜVOC}”È_îü×ÛŽ„Ý䤶Ӥ‹œ½¬íè·Œ¿Œ³G¿y …Æ$›÷$UXìš0Z´s?GǪä¸ ò~\‰ÊíÎ*3ËÓP²ivÍZ¿]åD”C&J:ôêGoý,Ü §ÿyŸç<¢¤Ý;Té*åô’;§2}i|9ý•ø/]%ÜõráÛœŸSoSË6mizäfvrlÞ‚²22w?[×Sè>æ|ýK£ž'á.‚9±ðC'èì=e§´ çØÎ­¬1oDùyyt1!N£N¼æöøâü)i«ÛUÛðTðÛƒiä;3uºNÔõîïáE—ަKGâ…í²ò«Wª£&]åÒÉzAÏ7§ÚÎØNéꂽ¬qÙNïôMÏÝE[/Å ûÆuL‡¿:/8î\8ƒ^íJ6]¶7Ò½‡ÿå|Ò¦‹qªÿ†&ï¤33·Ñ´Þ%ÎÇTÎ÷s4§~®‰Ý†Ñþë§(– ßV¢®ƒ\ÜMAô7s†\ø¶’[¿ÿ‹Ú5kE»¼—h´Ï ¬w•öè¡Æýêiè¢oè¹èr~MvÓ&EN9{§çd²^dãì‘”…™™™Þq,­¬èþÝŸèµ®=dçÞýUÛ¼¡çIsó ïè£A~e³ÆÇÒª>’¹…­?™B×Ï%Sôâ ê;jŒlZ=†Œ Ô¯®Sw÷áeê#Ío˜Û:wŸ>Î-ó8©]N¼¿–î=,èºb‚‡Æsqݽæ†Ð·ôÓí[Ôúµ7t¶kVF:%lY§*'¥-ï2§îçY¢·WR½yÏ/!j-³¿)+Öj̯\\]QO'•õ€yÙÔvº·V”mQqu}éÿ„íGO+œÌ›©Ã*/zÞΑ†½Þ[üj·ñ¾³ž5’ÝȼŽáG¾¥çâN-ìÔ.áE6e¢,¤qó ó)9ƒú–VTXTDuÅKåËEèØ×ÓÔƒäÛå-Y<;2Gûã×äÑqY[Öÿܼ'Ïz³2ihÓGépŸä—Š+wŽŠ Kù|ÊòÇói”ŽdÜœ` Ÿ8†\º«Âü…ÑꩾªmŽ÷¼%àM9Y™ªÆûlÜ^ºqñù,X¦Š»|ÿQZ5Ù‹r²3idÀLç±b#CiÝŒ‰T\\\Ê!Èé¥éœêÈé¯ìµì^Bm;¼Éé|Ú³r1M‹ØH>o¼$4Ê]݆jLs¨ÿtЉX*8’1³º9÷q§¦<éš÷Rc¡ÃGSä”ñÔg¤§NŽÛãÝ :´iµà|´ÙUi >´Õ¾KÃf<¼s°®c¼uºNÔ±nh+ØD¹­kYëŠ\:7¯¤Ð¤¥&=ßÁç:Z;¶¤)=FR³Ò Q´W-8E,ì& ú¹o›I#Þè[2Î'‰”të EŽœYæqêØÕ·!·öÝUۺ蠼ûçC@]˜“äen⊿XØgÔ‡9 í¬ùÆ#Ðu<Ù(8’wûŽ!רi%œŽzÚô‘"w~¹sÈÙMS˜¶ò‘³÷¹ï®±žÚ¼*»®„7Û 5ù 4s#廫_O’R`ŒZÄ‘÷6Qâöü¤ÒŸ'mhÕàï¿Ö]¬Ð ‰|ì¾]ØhúvÙ‡ÔÀÒ XMHçMÊ «nø{$ã÷„ÉÈÍö¬’¡- ~÷nmkGSW®‡1@µÒx^_ }ë8P}C[ | ÇŒ…쨫0‚ ×ó0¶Þˆ>`õ_ï‘l?ãLaœÙ¾æ2j¦0á¯cÿ S-W˜\®‚óðå0¹Q>ø‹«`†rñ'“ïa†šÝc,`² ¦ Üð´ s•æHŒ›®bSPn<%õ À‘˜|í>ßwS”›!b[çSÀ‘˜"®âoC&=aô†¯ÎØX­>8“¡åÚ!|ý˜€rõFÄm[±^8“/æ%]£L€Þð…ôê‰ÛŽb½p$&ƒX>üÛ°|Mz>¼Õš?ÔªãIDATf@/^%Å+üéǺèÙÑTÕõŸX“É7L’˜„3á_ÂÓ[èì×A¬G·˜üÎä5zöà ^PµÚIñ‰õ›¤˜‰aÒŠ‰·èTº±šIªX.1iÇ$“ªæÁ“rRæ¸Ö´^ +Ä_þÑêD&ü«SücH1özYÜßš ÿ.iºèxÃÏ?š¼€É}&ߊÇñ;¤3búabú‡™{ü'q›/‡1’oNJŠ!®ÿ XЉ¤˜#áõh"“LN0á_¤ºQõ»Ö¡-Ý9$v•70áßnåŸ ’ìßFŠÇ #Åÿù·xù—løäÞ&Éqç$\ùYFg&w˜(¿M{^¼øÕ9b@gVÈÔ#¾ÔÇžj®ßµ¼ä¦;W%ÎW¹Þ³M9º¸Ê»•B1>¿Ð_'ÅÛ·|kL €Ax¢G8ê7‰Q0‹É(±«Ë™+¹¨æÊÏç;ŠeÀ/ì|±k @ý&HeN¬)'Ûåç’‘ÖïZæH€Zz$To GŽ 8Ž 8p$=[²<øµËúõ¯ç=~ÜÍUlßÀ6ÒÌÌ 7}  °°¾…¹ùcX¢üäæçe?ÉÁ6ÿTßW¡EÛ:wz²òÐI+˜Ôdî|ù9mœ`ʼn1ª×l@;—¶“{Œ´AIêdêÁȖȶ÷Xý#ç?_Ðû•Ž0¨V¬ëÕÏÓ´¯J»ËcZTʱ†Œ«)~nv6mž]-¶0Æò1¦ò–Âˈ—ÐNƒÙÝ+åX}âV$ÝʲAÖãG4ùÀŠZW†Òãyþx> z$:’Mû¨Ò½‘cjߥ;ù…„‘Ãszŵ¶µ£±sÒàñMªœ:öqÊjìì…¸hk¸“ËÝúYµœ;êãCäÞ¾G­¶—ËÏgè[ïäü˜ÀÓ‘k§OS§®UÖ»HH½GëN\ «Ö´'|‰Þq—Ç¡ÃQkjTÆz8uîFŸ>‰ ¶†S]N„óá?.PÏ6εÚ^½Xþo^¬9=’”ăt`ÝJrঠ»š|Œö¯Ut'/§žÃFÓåc ì¸pz”ùPh9ï-šC7RΓïÂeäêé-O.ŒsçÆç´%h½=#yù a„SVzº°mëà@ak…í-AÓé‹ g¨° @unuÒþ¸G¶—:^Ú˜ñ¸ºæM“ŽRìÉ+(„Ýzêe7%6vöeÚ\=L›Neå{ÁWšIY锼w'­ŒORó%‹³/2Trróñ§qÁ²6ß¾˜®ÿÜ'L!¯¹‹d㩇ßµµ„¶ö)íþ=“¹kè9šâ¾8MaC§Ò׿ý@Iß\¡Àþãié)Ôy/EyΧ´G„»ÏKsß§˜Ï’(äÄ6þzU:‡¿:OÁÇv\;j6å±2áÇ<ÈÍ*Ñ@Ä­¤äo>¡Õ#gѤîÃKÅ×i°lçÓ¿¦ ûB)dð$ªknQJž—é½=i÷µã”¹ùáÿ7Z¶¥ˆá3„ýK“vÐç ÷ Û'o]¦ùG£„¡™é}¼ñ–ꤜ—à ½.ç—³µ¶pM¶áºÈ•yzN&µ´oRsIY˜™™,žz˜¥•Ý¿ûS‰± ?²YCciUŸŠ ÉÜB‘ýõ'Sèú¹dŠ^$4rô2‚R¿ºNÝ݇—:¾Ž¹9=É͆¡ôÉ›œŽRøÝ}–u¥ökK›7ªwYCîç)8`}lW–Neå»çÐQ4×½7Ù7iJ]ÝJÅ ŽŽ¥½ú q4Ù¼­s'á÷éã\ñä¤z¤²/+S¡{ë7„ߢâ"êúÒÿ Ûž*cûæ@ê°Ê‹ž·s¤a¯÷Ö^¯ÊùZ™\<õ°úuëÑÿýUp$šüjÉ×x¸ ;µKp$Ê…’£ï¬g u72g7L¼¡V›W˜OéÌÔ·´¢Â¢"Ö {Ç‹б¯?¦©#È·Ë[²zxvHWYʣ㲶¬/4þ¹yOžõ°eÒ꣞iÏG=®\úENux‘ç³Æ8’qs‚)|ârè® ó[F«§úª¶9Þó–Pd€7ådeªî.ÏÆí¥ϑςeãÉ…q–ï?J«&{QNv& ˜)ܵöáAm;¼ÉJ>íY¹˜¦ElŽõyã%Á©tuª1Cý§SLÄRÁ‘¨ß©ß šäâDñ·Õ9or:ªûó¡­ö]zÿ²UzÙÇ­Çœ¥ëï2m®¶má¬2u*+ßÍšSÓ[ÑÀ±¾BoHÊÔˆ JëfLz?\O]l.O.LªÇÍ+)4ii&-ÙukÇ–4¥ÇHª#¾Ï6ôrgwê#Þè«:nÝè94rgjûiA¾pÇû07»D#ýI"%ݺB‘#gÊÆÓÆùhκ}6=|üHV9ìêÛ[ûîªm•^!´àXy|°P¸ä†üøPæX¹C™›¸¢Ç/öÙõ†ÖF;÷×x^Þ« :²Qp$ïöC®¬‡'u:êi¨ëSÖ|…z\¹ôål­-\“m¸.rö>÷Ý5Ök›g¸NAâú±;Èx!&sú‰Û7ÒŽË_ N¬&!¾øÏGã «ß¼¾Q+‡Oo¤oD>ß.l4}»ìCj`‰jZSÐôVu>É&Ü8®öùóÎýŸx7ë®ú><µ Ÿoás#5͉ÔfÏëKÓz{À‰€JÀ‡•€q‘uF¨hêuTgoD葨¾É?ýXgëü`FP“ÉLK3/...2Vý~͸oñÉ¿o¢ *'ƾ- Qrž>¶Ô´¯"“ím˜ô€yA-/}ÞõÂ2ò ûIN«†VÖwa‰òSÖ2òPÛákæ„+ Üåj;Ê×È{Âp$PŠmÝx˜ŽôÅ‘‰rõÒ¾0 è _ƒ§±¸ÍÃk “À‘€>ð甯öó¯Ã ‡IàH@^f—ÖåÑ©KÏ&ÞÁãp€Ú ì·“kLˆ=’7Äv¯æA´1ŠÉLørž2éÅ$›ž=\ (‹yôlÔå’øË{(~Upn“rRæ¸Öµ”ôlk"“X&|mÀý ñ·)þ-pþyNþÕ¨Lê1¹,îo-Æçß±å ŸñIü‹L0¹Ïä[ñ8þ}^å÷ƒÃÄô39Ä$\ü¿Ö¡-@m¥@pÞÐóo=o`²ƒëIöóž»2‰ÿßÌ„Ö?^¼IrÜ9É ºr-CþÁ´;L&ÕVCc²ˆ®Jn®•þ°Ñ!žú–²7R(Æç= ×™x2‰a²ŽL“Y¤˜¼_ þ?Wâ4æÊŸÄ䡨ÆòÇóI1t †r©qñt—0G@%öHz$àHÀ‘€#àHÀ‘€#GÀ‘¨(f0FÁ»F>0CåP—ßÔ²î_°„á),,(Ä꿜:uõè<À –5ŠÄmráH0Z9µ§>#=aP£8·7s$* 5Œ±N-*åXCÆ•‹Ÿ›MÛƒgW‹Œµ|Œ¥¬¥ð2âe¥ÚT É1ÑÔ±ï€*mÌ96¡ö]º“_HÙ9<§w|k[;;g! ?ÑdÊ©cW¡¬ÆÎ^ˆ À¸¸vú9uêZe=Œ„Ô{´îIJj`M{—”+þòØ#t8jMè½J§ÎÝè³Ó'Ñ# ¶‘’x¬[I.’§º®&£ýkWÛ‚—SÏa£éò±v\8=Ê|(4„œ÷Í¡)çÉwá2rõô–'ƹsãsÚ4ƒÞžHƒ¼ü„°‚)+=]ضup €°µÂö– éôÅ…3TXP :·”´?î‘mãÆªÿ¥ÇK4W×¼Éé'ÅÎÁ‘¼‚B(Э§^6“bcg¯1®>vÓ–ç#\irh$ee¤SòÞ´2>IuÌ—,ξÈPaÈÉÍÇŸÆËÚ{OøbºrüCrŸ0…¼æ.’§v|×ÖzØÚ7¦´û÷àH¨mÄo^C¡1 Âö•‰Âoìš0 Ùu€Š‹‹iít?¡‹ÛA!ïÇQ›×UqÝYcÁ%òÁ‘ÈÅ“ ãlš@›wÑk]{¨Òó_ºŠVøyÛ›wªÂN½M-Û´¥!dóàØ¼k$3Èþ¹&¥Žï;jŒª!Ó'orú•…®é*V³:u˜£\£1®>vÓ–g÷Sæ˜~ý!•†ùO+÷¨¦ýWØNÚ½CpröîÅÒpõO¡Þ£G"O=ŒŸ_ªGÖƒ rx¾9 ¦„™™™Á⩇YZYÑý»?•h òó(›56–Võ©¨°Ì-ÍÈú“)tý\2E/Iuz A©_]§îîÃe¯cnNOrs„¡(]ó&§Ÿ~wŸ°e]©ýºØŒ7¬wYcîç)8àŠÚM[ž{EsÝ{“}“¦ÔÙµôûDÁѱԡW?!Ž&{·uî$ü>}œ«1ž\˜TTÖ›âeG@-cÜœ` Ÿ8†\º«Âü…ÑꩾªmŽ÷¼%àM9Y™ª;̳q{éÆÅsä³`™ÆxraœåûÒªÉ^”“Iñ›V iî^Bm;¼ÉJ>íY¹˜¦ElŽõyã%Á©tu*›‡¡þÓ)&b©Ê‘¨ß©ß šäâDñ·Õ9oRýFÌ,Õ£àC[í»ô ÿe«ô²™2~=æ,]ÇxWÈnR½ÊʳC³æÔôÅV4p¬¯Ð’25bÅF†Òº…Þ×S›½5Å“ “êqóJ MZ¡ßM ª(FÁrÏ™óÂ<Þ ‚%L”sÌá'nßH;.%8°šBˆ‡ûC<µFŸoás#5ɉ(ÁÐ|X©¦G€‘ð÷½ßèΗŸÃ FñøÑ# Ì‘`øÙ4²„@M£¨°°àÿ$ˆÂ K•§IEND®B`‚refdb-1.0.2/doc/refdbmanualfig1.svg000644 001750 001750 00000067536 11512721663 020004 0ustar00markusmarkus000000 000000 image/svg+xml refdbc refdba refdbib perlclient refdbd db engine db1 db2 refdb refdb-1.0.2/doc/refdbmanualfig2.svg000644 001750 001750 00001403044 11512721663 017772 0ustar00markusmarkus000000 000000 image/svg+xml refdba refdbd refdbc MySQL refdbib refdb-1.0.2/doc/refdbmanualfig3.svg000644 001750 001750 00003644445 11512721663 020011 0ustar00markusmarkus000000 000000 image/svg+xml refdba refdbib refdbd MySQL refdba refdbib refdbc refdbc refdb-1.0.2/doc/refdbmanualfig4.svg000644 001750 001750 00000056647 11512721663 020010 0ustar00markusmarkus000000 000000 image/svg+xml STYLENAME REFSTYLE REFNUMBER GEN CITSTYLE BIBSTYLE THES JOUR BOOK JOURNALNAME TITLE AUTHORLIST others... others... others... others... others... others... others... others... refdb-1.0.2/doc/refdbmanualfig5.svg000644 001750 001750 00000157135 11512721663 020003 0ustar00markusmarkus000000 000000 image/svg+xml Slide Drawing Drawing Drawing Drawing risx UTF-8 Drawing database UTF-8 Drawing Medline UTF-8/ASCII Drawing RIS win-1251/UTF-8 Drawing bibtex ASCII Drawing MARC UTF-8/others Drawing Drawing RIS UTF-8 Drawing Drawing Drawing Drawing Drawing Drawing DocBook SGML ISO-8859-1 Drawing bibtex UTF-8 Drawing DocBook/TEI XML UTF-8 Drawing HTML/XHTML UTF-8 Drawing Drawing Drawing Drawing Drawing input Drawing storage Drawing output refdb-1.0.2/doc/refdbmanualfig6.svg000644 001750 001750 00000051727 11512721663 020004 0ustar00markusmarkus000000 000000 image/svg+xml refdbd database style.xsl (intermediate driver file) refdbib runbib style.fo.xsl (style-specific driver file) docbk-refdb-fo.xsl (general RefDB driver file) docbook.xsl (stock DocBook stylesheet) imports imports runbib -a myrefdbdriver.xsl imports imports imports style.fo.xsl (style-specific driver file) myrefdbdriver.xsl (user-supplied) docbook.xsl (stock DocBook stylesheet) mydocbookdriver.xsl (user-supplied) refdb-1.0.2/doc/index.html000644 001750 001750 00000002027 11512721663 016211 0ustar00markusmarkus000000 000000 RefDB Documentation

RefDB Documentation

RefDB is a reference/notes database and bibliography tool for SGML, XML, and LaTeX documents. The following local documentation is available:

Additional information is available on the web. Please visit RefDB on the web for all available information.


$Id: index.html,v 1.1.2.2 2005/12/11 20:06:20 mhoenicka Exp $ (c) Markus Hoenicka 2005

refdb-1.0.2/doc/citestylex.xml000644 001750 001750 00000205222 12247746230 017140 0ustar00markusmarkus000000 000000 STYLE (BOLD | ITALIC | BOLDITALIC | SUPER | SUB | ULINE | BOLDULINE | ITULINE | BOLDITULINE | NONE) #IMPLIED STYLE (BOLD | ITALIC | BOLDITALIC | SUPER | SUB | ULINE | BOLDULINE | ITULINE | BOLDITULINE | NONE) #IMPLIED STYLE (BOLD | ITALIC | BOLDITALIC | SUPER | SUB | ULINE | BOLDULINE | ITULINE | BOLDITULINE | NONE) #IMPLIED STYLE (BOLD | ITALIC | BOLDITALIC | SUPER | SUB | ULINE | BOLDULINE | ITULINE | BOLDITULINE | NONE) #IMPLIED CASE (ASIS | UPPER | LOWER | ICAPS) "ASIS" DEFAULTTEXT (ABBREV | FULL | USERONE | USERTWO) "ABBREV" ALTERNATETEXT (AABBREV | AFULL | AUSERONE | AUSERTWO) "AFULL" PUNCTUATION (SPACE | PERIOD | PERIODSPACE) "SPACE" STYLE (BOLD | ITALIC | BOLDITALIC | SUPER | SUB | ULINE | BOLDULINE | ITULINE | BOLDITULINE | NONE) #IMPLIED STYLE (BOLD | ITALIC | BOLDITALIC | SUPER | SUB | ULINE | BOLDULINE | ITULINE | BOLDITULINE | NONE) #IMPLIED TYPE (ABST|ADVS|ART|BILL|BOOK|CASE|CHAP|COMP|CONF|CTLG|DATA|ELEC|GEN|ICOMM|INPR|JFULL|JOUR|MAP|MGZN|MPCT|MUSIC|NEWS|PAMP|PAT|PCOMM|RPRT|SER|SLIDE|SOUND|STAT|THES|UNBILL|UNPB|VIDEO) #REQUIRED STYLE (BOLD | ITALIC | BOLDITALIC | SUPER | SUB | ULINE | BOLDULINE | ITULINE | BOLDITULINE | NONE) #IMPLIED STYLE (BOLD | ITALIC | BOLDITALIC | SUPER | SUB | ULINE | BOLDULINE | ITULINE | BOLDITULINE | NONE) #IMPLIED FULL CDATA #IMPLIED ABBREV CDATA #IMPLIED THREELET CDATA #IMPLIED STYLE (BOLD | ITALIC | BOLDITALIC | SUPER | SUB | ULINE | BOLDULINE | ITULINE | BOLDITULINE | NONE) #IMPLIED STYLE (BOLD | ITALIC | BOLDITALIC | SUPER | SUB | ULINE | BOLDULINE | ITULINE | BOLDITULINE | NONE) #IMPLIED CASE (ASIS | UPPER | LOWER | ICAPS) "ASIS" STYLE (BOLD | ITALIC | BOLDITALIC | SUPER | SUB | ULINE | BOLDULINE | ITULINE | BOLDITULINE | NONE) #IMPLIED MAXTITLE CDATA #IMPLIED ROLE (PART | PUB | SERIES | ALL) "PUB" STYLE (BOLD | ITALIC | BOLDITALIC | SUPER | SUB | ULINE | BOLDULINE | ITULINE | BOLDITULINE | NONE) #IMPLIED NAMEORDER (FIRSTMIDDLELAST | LASTCOMMAFIRSTMIDDLE | LASTCOMMASPCFIRSTMIDDLE | LASTFIRSTMIDDLE | LAST) "LASTFIRSTMIDDLE" INITIALSTYLE (FIRSTSPCMIDDLE | FIRSTSPCM. | FIRSTSPCM | F.SPCM. | F.M. | FSPCM | FM) "F.M." UPPERCASE (NONE | LASTNAME | ALL) "NONE" FULL CDATA #IMPLIED ABBREV CDATA #IMPLIED THREELET CDATA #IMPLIED STYLE (BOLD | ITALIC | BOLDITALIC | SUPER | SUB | ULINE | BOLDULINE | ITULINE | BOLDITULINE | NONE) #IMPLIED STYLE (BOLD | ITALIC | BOLDITALIC | SUPER | SUB | ULINE | BOLDULINE | ITULINE | BOLDITULINE | NONE) #IMPLIED INTEXTSEQUENCE (ASIS | AUTHORDATE | CITEKEY | DATEASC | DATEDESC) "AUTHORDATE" STYLE (BOLD | ITALIC | BOLDITALIC | SUPER | SUB | ULINE | BOLDULINE | ITULINE | BOLDITULINE | NONE) #IMPLIED STYLE (BOLD | ITALIC | BOLDITALIC | SUPER | SUB | ULINE | BOLDULINE | ITULINE | BOLDITULINE | NONE) #IMPLIED STYLE (BOLD | ITALIC | BOLDITALIC | SUPER | SUB | ULINE | BOLDULINE | ITULINE | BOLDITULINE | NONE) #IMPLIED ALTERNATESTYLE (ABOLD | AITALIC | ABOLDITALIC | ASUPER | ASUB | AULINE | ABOLDULINE | AITULINE | ABOLDITULINE | NONE) #IMPLIED ALTERNATETEXT (AEMPTY | TITLEPART | TITLEPUB | TITLESERIES | TITLEALL | JOURNALNAME| NONE) "AEMPTY" ROLE (PART | PUB | SERIES | ALL) "PUB" STYLE (BOLD | ITALIC | BOLDITALIC | SUPER | SUB | ULINE | BOLDULINE | ITULINE | BOLDITULINE | NONE) #IMPLIED STYLE (BOLD | ITALIC | BOLDITALIC | SUPER | SUB | ULINE | BOLDULINE | ITULINE | BOLDITULINE | NONE) #IMPLIED STYLE (BOLD | ITALIC | BOLDITALIC | SUPER | SUB | ULINE | BOLDULINE | ITULINE | BOLDITULINE | NONE) #IMPLIED FULL CDATA #IMPLIED ABBREV CDATA #IMPLIED THREELET CDATA #IMPLIED STYLE (BOLD | ITALIC | BOLDITALIC | SUPER | SUB | ULINE | BOLDULINE | ITULINE | BOLDITULINE | NONE) #IMPLIED STYLE (BOLD | ITALIC | BOLDITALIC | SUPER | SUB | ULINE | BOLDULINE | ITULINE | BOLDITULINE | NONE) #IMPLIED STYLE (BOLD | ITALIC | BOLDITALIC | SUPER | SUB | ULINE | BOLDULINE | ITULINE | BOLDITULINE | NONE) #IMPLIED STYLE (BOLD | ITALIC | BOLDITALIC | SUPER | SUB | ULINE | BOLDULINE | ITULINE | BOLDITULINE | NONE) #IMPLIED FULL CDATA #IMPLIED ABBREV CDATA #IMPLIED THREELET CDATA #IMPLIED BIBLIOSEQUENCE (BASIS | BAUTHORDATE | BCITEKEY | BDATEASC | BDATEDESC) "BAUTHORDATE" BIBLIOFIRSTINDENT CDATA #IMPLIED BIBLIOBLOCKINDENT CDATA #IMPLIED FONTSIZE CDATA #IMPLIED MAXAUTHOR CDATA #REQUIRED DISPLAYAUTHOR CDATA #REQUIRED STYLE (BOLD | ITALIC | BOLDITALIC | SUPER | SUB | ULINE | BOLDULINE | ITULINE | BOLDITULINE | NONE) #IMPLIED STYLE (BOLD | ITALIC | BOLDITALIC | SUPER | SUB | ULINE | BOLDULINE | ITULINE | BOLDITULINE | NONE) #IMPLIED FULL CDATA #IMPLIED ABBREV CDATA #IMPLIED THREELET CDATA #IMPLIED STYLE (BOLD | ITALIC | BOLDITALIC | SUPER | SUB | ULINE | BOLDULINE | ITULINE | BOLDITULINE | NONE) #IMPLIED STYLE (BOLD | ITALIC | BOLDITALIC | SUPER | SUB | ULINE | BOLDULINE | ITULINE | BOLDITULINE | NONE) #IMPLIED ROLE (0|1|2|3|4) "0" FULL CDATA #IMPLIED ABBREV CDATA #IMPLIED THREELET CDATA #IMPLIED MAXAUTHOR CDATA #REQUIRED DISPLAYAUTHOR CDATA #REQUIRED STYLE (BOLD | ITALIC | BOLDITALIC | SUPER | SUB | ULINE | BOLDULINE | ITULINE | BOLDITULINE | NONE) #IMPLIED STYLE (BOLD | ITALIC | BOLDITALIC | SUPER | SUB | ULINE | BOLDULINE | ITULINE | BOLDITULINE | NONE) #IMPLIED STYLE (BOLD | ITALIC | BOLDITALIC | SUPER | SUB | ULINE | BOLDULINE | ITULINE | BOLDITULINE | NONE) #IMPLIED STYLE (BOLD | ITALIC | BOLDITALIC | SUPER | SUB | ULINE | BOLDULINE | ITULINE | BOLDITULINE | NONE) #IMPLIED STYLE (BOLD | ITALIC | BOLDITALIC | SUPER | SUB | ULINE | BOLDULINE | ITULINE | BOLDITULINE | NONE) #IMPLIED STYLE (BOLD | ITALIC | BOLDITALIC | SUPER | SUB | ULINE | BOLDULINE | ITULINE | BOLDITULINE | NONE) #IMPLIED FULL CDATA #IMPLIED ABBREV CDATA #IMPLIED THREELET CDATA #IMPLIED STYLE (BOLD | ITALIC | BOLDITALIC | SUPER | SUB | ULINE | BOLDULINE | ITULINE | BOLDITULINE | NONE) #IMPLIED FULL CDATA #IMPLIED ABBREV CDATA #IMPLIED THREELET CDATA #IMPLIED STYLE (BOLD | ITALIC | BOLDITALIC | SUPER | SUB | ULINE | BOLDULINE | ITULINE | BOLDITULINE | NONE) #IMPLIED ROLE (1|2|3|4|5) "1" FULL CDATA #IMPLIED ABBREV CDATA #IMPLIED THREELET CDATA #IMPLIED STYLE (BOLD | ITALIC | BOLDITALIC | SUPER | SUB | ULINE | BOLDULINE | ITULINE | BOLDITULINE | NONE) #IMPLIED STYLE (BOLD | ITALIC | BOLDITALIC | SUPER | SUB | ULINE | BOLDULINE | ITULINE | BOLDITULINE | NONE) #IMPLIED FULL CDATA #IMPLIED ABBREV CDATA #IMPLIED THREELET CDATA #IMPLIED NAMEORDER (FIRSTMIDDLELAST | LASTCOMMAFIRSTMIDDLE | LASTCOMMASPCFIRSTMIDDLE | LASTFIRSTMIDDLE | LAST) "LASTFIRSTMIDDLE" INITIALSTYLE (FIRSTSPCMIDDLE | FIRSTSPCM. | FIRSTSPCM | F.SPCM. | F.M. | FSPCM | FM) "F.M." UPPERCASE (NONE | LASTNAME | ALL) "NONE" TYPE (FULL | ABBREV | CHICAGO | TWODIGIT | STARTONLY) "FULL" FULL CDATA #IMPLIED ABBREV CDATA #IMPLIED THREELET CDATA #IMPLIED FORMAT (YES | NO) "YES" SEQUENCE (MDY | DMY | YMD | MY | YM | MD | DM | Y) "Y" MONTHFORMAT (FULL | ABBREVDOT | THREELETTER | ARABICMONTH | ROMANMONTH) "ARABICMONTH" DAYFORMAT (ARABICDAY | ROMANDAY) "ARABICDAY" YEARFORMAT (FOURDIGIT | TWODIGIT | ROMANYEAR) "FOURDIGIT" PADLEADINGZERO (YY | NN) "NN" ROLE (PRIMARY | SECONDARY | ALL) "PRIMARY" STYLE (BOLD | ITALIC | BOLDITALIC | SUPER | SUB | ULINE | BOLDULINE | ITULINE | BOLDITULINE | NONE) #IMPLIED FULL CDATA #IMPLIED ABBREV CDATA #IMPLIED THREELET CDATA #IMPLIED refdb-1.0.2/doc/risx.xml000644 001750 001750 00000042416 12247746433 015741 0ustar00markusmarkus000000 000000 type (1|2|3|4|5) "1" type (ABST|ADVS|ART|BILL|BOOK|CASE|CHAP|COMP|CONF|CTLG|DATA|ELEC|GEN|HEAR|ICOMM|INPR|JFULL|JOUR|MAP|MGZN|MPCT|MUSIC|NEWS|PAMP|PAT|PCOMM|RPRT|SER|SLIDE|SOUND|STAT|THES|UNBILL|UNPB|VIDEO) "GEN" id NMTOKEN #IMPLIED citekey NMTOKEN #IMPLIED user NMTOKEN #REQUIRED status (NOTINFILE|ONREQUEST|INFILE) "NOTINFILE" type (1|2|3) "1" type (full|abbrev|user1|user2) "full" freq NMTOKEN #IMPLIED relfreq NMTOKEN #IMPLIED freq NMTOKEN #IMPLIED relfreq NMTOKEN #IMPLIED type (primary|secondary) "primary" role NMTOKEN #IMPLIED freq NMTOKEN #IMPLIED relfreq NMTOKEN #IMPLIED type (full|useroot) "full" type (url|pdf|fulltext|related|image|doi) "url" refdb-1.0.2/doc/citationlistx.xml000644 001750 001750 00000005101 12247741033 017627 0ustar00markusmarkus000000 000000 endterm ID #IMPLIED ENDTERM ID #IMPLIED refdb-1.0.2/doc/xnote.xml000644 001750 001750 00000011310 12247746435 016100 0ustar00markusmarkus000000 000000 type (reference|refid|author|keyword|journalfull|journalabbrev|journalcustabbrev1|journalcustabbrev2) #REQUIRED target CDATA #REQUIRED type (url|pdf|fulltext|related|image) "url" type CDATA #IMPLIED xml:lang CDATA #IMPLIED id NMTOKEN #IMPLIED citekey NMTOKEN #IMPLIED user NMTOKEN #IMPLIED date NMTOKEN #IMPLIED share (public|private) #IMPLIED xmlns CDATA #FIXED 'http://refdb.sourceforge.net/namespaces/xnote' refdb-1.0.2/doc/refdb-manual-statustable.xml000644 001750 001750 00000063411 12255431114 021622 0ustar00markusmarkus000000 000000 000 ok 001 error 100 void 101 incorrect scramble string 102 client and server protocols do not match 103 invalid client request 104 incomplete client command 105 missing client command 106 missing client command option 107 unknown client command option 108 could not descramble password 109 timeout while reading 110 timeout while writing 111 missing client command argument 112 client aborted command 200 void 201 main database is missing 202 could not open main database 203 main database is too old or corrupt 204 could not open reference database 205 could not connect to database server 206 main database version is not supported 207 could not create result from database query 208 could not retrieve reference database metadata 209 could not create reference database 210 could not create reference database metadata 211 create t_meta failed 212 create t_refdb failed 213 create t_author failed 214 create t_keyword failed 215 create t_periodical failed 216 create t_note failed 217 create t_user failed 218 create t_xauthor failed 219 create t_xkeyword failed 220 create t_xuser failed 221 create t_xnote failed 222 could not create user group 223 could not grant user permissions 224 access control not supported 225 not a RefDB database 226 database does not exist 227 begin transaction failed 228 cannot lock tables 229 failed to remove keyword 230 failed to remove author 231 failed to remove periodical 232 failed to update main reference data 233 inserting reference data failed 234 select failed 235 database successfully created 236 assume localhost as host 237 grant user permissions successful 238 revoke user permissions successful 239 could not revoke user permissions 240 switched to database 241 failed to access style data 242 create temporary table failed 243 delete temporary table failed 244 incomplete reference data 245 failed to remove note xlink 246 failed to delete main note data 247 failed to remove user 248 failed to delete main reference data 249 failed to delete database 250 could not delete user group 251 database successfully deleted 252 personal interest list is empty 253 failed to detach dataset from user 254 sucessfully detached dataset from user 255 failed to attach dataset to user 256 sucessfully attached dataset to user 257 create t_link failed 258 create t_xlink failed 259 failed to remove ulink 260 failed to update journal names 261 failed to create citation key 262 failed to create personal list 263 successfully created personal list 264 failed to delete personal list 265 successfully deleted personal list 266 personal list not owned by current user 267 personal list does not exist 268 create t_temp_xdup failed 269 style not found 300 void 301 missing argument 302 unknown output format 400 void 401 no more data available 402 finished transferring data 403 chunk added successfully 404 finished transferring dataset 405 finished adding dataset 406 citation key 407 refused to overwrite dataset 408 dataset added successfully 409 numerical id ignored 410 numerical id nonexistent 411 citation key nonexistent 412 ID and citation key missing 413 dataset updated successfully 414 failed to add dataset 415 missing link target 416 incorrect link type 417 dataset not found 418 link already exists 419 dataset removed successfully 420 failed to remove dataset 421 link added successfully 422 only owner can fiddle with dataset 423 dataset is still in use 424 dataset is already attached to user 425 periodical name changed successfully 426 reference type changed 700 void 701 failed to initialize character set conversion 702 character set conversion failed 703 remote administration disabled 704 administration is not restricted 705 administration not permitted 706 administration permitted 707 process ID 708 application server stop submitted 709 set server IP submitted 710 set timeout submitted 711 set logfile submitted 712 set logdest submitted 713 set loglevel submitted 800 void 801 out of memory 802 failed to load cgi templates 803 command partially processed, aborted after unrecoverable error 804 suffix pool exhausted 805 REFNUMBER formatting failed 806 AUTHORLIST formatting failed 807 EDITORLIST formatting failed 808 SEDITORLIST formatting failed 809 PUBDATE formatting failed 810 PUBDATESEC formatting failed 811 TITLE formatting failed 812 BOOKTITLE formatting failed 813 SERIESTITLE formatting failed 814 JOURNALNAME formatting failed 815 VOLUME formatting failed 816 ISSUE formatting failed 817 PAGES formatting failed 818 PUBLISHER formatting failed 819 PUBPLACE formatting failed 820 SERIAL formatting failed 821 ADDRESS formatting failed 822 URL formatting failed 823 USERDEF1 formatting failed 824 USERDEF2 formatting failed 825 USERDEF3 formatting failed 826 USERDEF4 formatting failed 827 USERDEF5 formatting failed 828 MISC1 formatting failed 829 MISC2 formatting failed 830 MISC3 formatting failed 831 LINK1 formatting failed 832 LINK2 formatting failed 833 LINK3 formatting failed 834 LINK4 formatting failed 835 ABSTRACT formatting failed 836 NOTES formatting failed 837 SEPARATOR formatting failed 838 remote administration failed 839 child->parent communication failure 840 FIFO write error 841 unknown command 842 failed to load style 999 summary refdb-1.0.2/doc/refdb-manual/ch01.html000644 001750 001750 00000007276 12255431176 020207 0ustar00markusmarkus000000 000000 Chapter 1. Introduction

Chapter 1. Introduction

What is RefDB?

  • RefDB is a reference and note database. Use it to manage your collection of offprints of scientific publications, or basically any other collection of printed or electronic documents along with your personal notes.

  • RefDB is also a bibliography tool for markup languages. The bibliography tool allows to create printable or online documents with formatted citations and bibliographies from DocBook SGML/XML, TEI XML, and LaTeX sources.

  • RefDB can also serve as a data source for other applications. You can either use the SRU interface, or use the Perl and PHP libraries to integrate RefDB functionality directly into your own projects.

refdb-1.0.2/doc/refdb-manual/ch01s02.html000644 001750 001750 00000011367 12255431175 020527 0ustar00markusmarkus000000 000000 Who should use RefDB?

Who should use RefDB?

RefDB was designed with the needs of a scientist in mind. At least one third of a scientist's work hours are spent reading and evaluating other scientist's publications. In no time you have a pile of offprints or PDF files that you would like to archive in a way that keeps the information accessible. RefDB helps you to keep track of those papers by creating a database with the essential bibliographic information, keywords for easy retrieval, your personal comments, the reprint status, a hint where you can find the offprint (or a link to the electronic version), and additional information for your personal categorization.

Extended notes help you organize your references according to topics and allow you to associate additional information with references, keywords, authors, or periodicals. This goes far beyond the one-note per reference approach of commercial tools, although this is of course still supported. Extended notes are associated to the user that created them, but they are visible to all users unless you restrict the display accordingly.

Scientists rarely work alone on a subject. More commonly they are members of a group with similar research interests. It would be a waste of time and effort if each member of the group hunts offprints individually, resulting in duplicate copies, and if each member keeps his personal reference database, making it hard to consolidate an information pool of the group. Instead of selling a complete database engine to each scientist and "allowing" the users to peek at each other's databases, RefDB uses the inverse approach: designed as a client/server application from the ground up, it allows a group to maintain a common reference database, but still allows each individual to view only those references that she added or explicitly selected. At the same time, each group member can find out in an instant which offprints are available in the whole group. However, there is no problem if you want to use RefDB as an individual user.

Eventually you'll want to publish your own data. You'll have to cite dozens of papers that you've already read. Your RefDB database will make it a breeze to retrieve those papers by author, by keyword, or by any other field or combination of fields. If you write your document using one of the supported SGML or XML DTDs or as a LaTeX document, RefDB can create the bibliography based on the citations in your document. It will also help you to format the citations and the bibliography according to the instructions of your publisher. Your paper got rejected and you want to submit it to a different journal? Fear not, RefDB can easily re-transform your document and format it for a different publisher.

Of course it is also feasible to manage your personal library of contemporary literature. Or your favourite cookie recipes. RefDB wasn't precisely designed for these purposes, but it's up to you to make the best use of the package.

refdb-1.0.2/doc/refdb-manual/ch01s03.html000644 001750 001750 00000010605 12255431175 020522 0ustar00markusmarkus000000 000000 General features

General features

  • RefDB uses a three-tier architecture (see Figure 1.1, “RefDB three-tier architectureâ€), consisting of clients on the workstation side, and an application server as well as the SQL database server on the server side.

    Figure 1.1. RefDB three-tier architecture

    RefDB three-tier architecture

    Optionally you may use an internal database engine instead of the external SQL server, resulting in a simpler two-tier setup.

  • The data storage proper is done by a SQL database engine. Currently MySQL and PostgreSQL are supported as external database engines. Additionally, an internal SQL engine based on SQLite is available, which allows data storage in a single, operating-system and architecture-independent file without any administration overhead.

  • By default, incoming data are converted to UTF-8 and stored as such (see Figure 1.2, “RefDB character encoding supportâ€). Outgoing data can be converted to other character encodings if needed. However, RefDB can be set up in a very flexible manner to accommodate other character encoding requirements as long as they are supported by your operating system.

    Figure 1.2. RefDB character encoding support

    RefDB character encoding support

  • The server can run as a daemon in a non-privileged account if security concerns require this. Besides, users can start it as a standalone application on demand. As just about everything is configurable, a thoughtful setup will allow to run several copies of the server on the same box in parallel.

refdb-1.0.2/doc/refdb-manual/ch01s04.html000644 001750 001750 00000006511 12255431175 020524 0ustar00markusmarkus000000 000000 Interfaces

Interfaces

  • The RefDB command-line clients are no fat applications, but rather a collection of small, portable tools implemented in ANSI C to perform all necessary client-side tasks on any platform with a decent C compiler.

  • The RefDB command-line clients can be run in an interactive mode or in a batch mode. The latter is useful for scripting purpose or for use as backends of graphical user interfaces.

  • A PHP interface allows to perform most RefDB operations through a web interface.

  • RefDB also provides clients which allow to access RefDB databases through a SRU (Search and Retrieve via URL) interface. A simple standalone client for personal use and a CGI program for shared use through a web server are available.

  • Separately available packages integrate RefDB functionality into Emacs and vim, turning these editors into integrated authoring environments for DocBook and TEI documents with easy access to your reference data.

  • The adepts of the Perl programming language might be delighted to know that the RefDBClient module allows Perl programs to directly communicate with a refdbd server without using the C clients. This allows the rapid development of custom programs that access RefDB databases.

refdb-1.0.2/doc/refdb-manual/ch01s05.html000644 001750 001750 00000014631 12255431176 020530 0ustar00markusmarkus000000 000000 Reference management features

Reference management features

  • Reference data are imported from text files or from stdin and exported to text files or to stdout. The data model is fairly close to the RIS specification that most Windows-based reference managers understand. RefDB natively understands both the tagged RIS format used by other reference management software and an XML format according to the risx.dtd similar to RIS.

  • Input filters can be used to convert references from various sources to the RIS format. Currently RefDB ships with Medline, BibTeX, MARC, and DocBook filters. You are free to use or write any other input filter that you may need. These filters must either create an output file or write the results to stdout for further plumbing. This way, input filters can be written in almost any programming language and it should be easy to extend the list of reference information formats that RefDB can import.

    In addition, SGML- or XML-based data formats can be easily transformed to risx using DSSSL or XSLT stylesheets.

  • Extended notes are supplied as XML files according to the xnote.dtd.

  • The query language is fairly simple yet powerful. You can search in all fields in the database. You can use the Boolean operators AND, OR, NOT to combine search expressions. You can use brackets () to group search expressions. You can use either literal matches or regular expressions in all alphanumeric fields (i.e. most except e.g. the publication year). This gives you enormous flexibility in your search strategies. The readline library reads the user input in all interactive clients. You can recall any previous search strings with a few keystrokes and re-run them or modify them as needed.

  • The query results can be displayed in a variety of formats. The standard backends create screen, HTML, XHTML, BiBTeX, DocBook (SGML and XML), TEI (XML), MODS (XML), RIS, and risx formats. All output can either be viewed on stdout or with a pager, or the output can be redirected into a file or into a pipe for further manipulation. RefDB provides a simple API to implement custom backends if you need other output formats.

    In addition, Perl programmers can use the risx output and the RefDBClient module to easily create any output format they desire.

  • RefDB supports all character encodings available on your platform. While the available encodings in the database may be limited by the database engine, RefDB can convert incoming data as well as exported data with only few limitations.

  • RefDB handles the L1 field of the RIS input files (denoting a local PDF or Postscript copy) in a very flexible way. You can specify a path to the file on your harddrive or on the web. The local path can be split into a variable and a static part. The variable part can be specified on the command line e.g. if you access your data remotely via a NFS-mounted share.

  • RefDB knows the concept of personal reference lists. This feature is useful if a database is shared among several users in a workgroup. In this case, all users benefit from the larger stock of references available in the database. RefDB keeps track of the user who added a reference to the database. You can use a switch in the getref command to restrict your search on those references that are associated with your username. On the other hand, if you find out that even your colleagues have one or two interesting papers, you can use the pickref command to add these references to your personal reference list. The personal part of the reference information (the reprint status, the availability, and the notes) are saved for each user individually. In addition to this default list, each user can create an unlimited number of additional lists.

    In a similar fashion, the display of extended notes can be limited to the notes of the current user, or all available extended notes are used.

refdb-1.0.2/doc/refdb-manual/ch01s06.html000644 001750 001750 00000012626 12255431176 020533 0ustar00markusmarkus000000 000000 Bibliography tool features

Bibliography tool features

Bibliography support is currently implemented for DocBook SGML and XML documents, TEI and TEILite XML documents, and for LaTeX documents.

SGML and XML

  • RefDB scans your input document for citations and generates a bibliography which contains the cited references. You can include this bibliography into your document and process it with RefDB's tools to obtain formatted citations and bibliographies.

  • RefDB creates bibliographies for DocBook (SGML, DTD-based XML, and schema-based XML), TEI (DTD-based XML and schema-based XML), and bibtex.

  • The implementation of the SGML/XML citations and bibliographies is "non-destructive", i.e. switching from one bibliographic output format to a different one is limited to re-creating the bibliography and transforming your document again.

    Alternatively you may use a short notation for your citations that makes do with a minimum of markup. The short notation needs an additional (but fully reversible) preprocessing step before bibliographies and formatted output can be created.

  • RefDB uses “cooked†bibliography output to provide full control over the formatting. This somewhat blurs the distinction between structure and formatting but it is the most efficient way to handle the task of formatting bibliographies and citations. The TEI bibliography output is even worse as it heavily abuses the all-purpose seg element as a wrapper where the elements intended for a particular purpose do not allow a “cooked†use.

  • Alternatively you can request “raw†bibliography output. In this case you can either rely on the default bibliography formatting provided by the stock DocBook or TEI stylesheet, or you resort to other bibliography formatting tools.

LaTeX

  • The BibTeX output integrates seamlessly with the LaTeX/BibTeX tools, so there is only one additional command to run on your way from the LaTeX source to the finished document.

  • RefDB creates a BibTeX bibliography file based on the information in a .aux file. The latter is created by latex from the LaTeX source document. This intermediate bibliography file serves as the input file for bibtex. So instead of keeping all your references in a flat text file, RefDB will create a short bibliography file with the references that your particular document requires.

  • RefDB performs only a very limited amount of formatting for those items which are not well supported in BibTeX (e.g. with BibTeX you need two separate bibliography files if you switch from a format that uses abbreviated journal names to a format that requires the full names). All other formatting is left to the LaTeX/BibTeX system.

refdb-1.0.2/doc/refdb-manual/ch01s07.html000644 001750 001750 00000007203 12255431176 020527 0ustar00markusmarkus000000 000000 Credits

Credits

Throughout the creation of this software the author borrowed code and solutions to particular problems from other software packages in a shameless way. But this is one of the purposes of free software, after all. The following is a hopefully complete list of all programs and libraries that in one way or another helped to get RefDB on its way.

refdb-1.0.2/doc/refdb-manual/ch02.html000644 001750 001750 00000010215 12255431176 020173 0ustar00markusmarkus000000 000000 Chapter 2. System requirements

Chapter 2. System requirements

Operating system

refdb was designed to run on as many platforms as possible and has positively been seen running on the following operating systems:

  • GNU/Linux

  • FreeBSD

  • NetBSD

  • OSX

  • Solaris/SunOS

  • Windows/Cygwin

Other Unix-like operating systems may work out of the box or with a minimum amount of tweaking. While this portability excludes fancy GUI bells and whistles, it makes it (most likely) possible to run refdb on the hardware and operating system that you happen to have. Both the clients and the application server should compile on all systems with a decent C compiler like gcc. There should be no problems to run refdb on heterogenous networks. For Windows users the free Cygwin tools are recommended. Cygwin is a POSIX layer on top of Win32 including a useful selection of the popular GNU tools.

To simplify the task of porting refdb to other operating systems the package uses autoconf and automake.

refdb-1.0.2/doc/refdb-manual/ch02s02.html000644 001750 001750 00000012674 12255431176 020533 0ustar00markusmarkus000000 000000 Libraries necessary to build and run refdb

Libraries necessary to build and run refdb

The following libraries are required on your system:

Note

The version numbers in this list do not indicate that it is impossible to build refdb with any lower version number, except where indicated. The numbers just indicate the versions that were used successfully. Lower version numbers may work, higher version numbers are assumed to work in all cases.

Some operating systems/distributions use separate packages for the run-time libraries and the development libraries. In order to build refdb from the sources and run the resulting applications, you need both types of libraries.

System libraries

These libraries should be offered by all operating systems if they are required on that particular system.

  • libreadline (version 4.1 or later)

  • libz (version 1.1.3 or later; not required on systems using glibc)

  • libnsl, a standard library on Solaris, may be required on this platform.

  • libdl, required on all systems that do not include the dl* functions for dealing with dynamic libraries in the standard C library.

  • libiconv, required on all systems that do not include the character encoding conversion functions in the standard C library.

Other libraries

  • libdbi (version 0.8.x) and libdbi-drivers (version 0.8.x): a database abstraction layer framework and a set of database-specific drivers.

    Note

    libdbi provides the framework for the separately available database drivers. refdb currently supports the MySQL, PostgreSQL, SQLite, and SQLite3 drivers. When configuring the libdbi-drivers source package, please make sure to understand that you have to request the drivers you want to build with the --with-mysql, --with-pgsql, --with-sqlite, or --with-sqlite3 options (you can specify as many drivers as you see fit).

  • SQLite (version 2.8.x or 3.x.y): an embedded SQL engine which you can use instead of the external database servers MySQL or PostgreSQL.

  • libexpat (version 1.95.1): a XML parser library.

  • btparse (version 0.34; only required if you want to build the BibTeX import filter): a bibtex parser library.

refdb-1.0.2/doc/refdb-manual/ch02s03.html000644 001750 001750 00000013716 12255431176 020532 0ustar00markusmarkus000000 000000 Perl modules

Perl modules

Some import filters and the SRU servers are implemented as Perl scripts or Perl modules. These require a couple of external Perl modules in order to run properly. Some of the modules are available at CPAN, the comprehensive Perl archive network, which allows you to search and download the modules by name. The refdb-specific modules are available as the refdb-perlmod and the refdb-perlsru packages on the refdb project page.

Note

If you're not familiar with Perl modules, here's how almost all of them can be installed: After unpacking the archive, change into the top-level directory of the extracted module. First run perl Makefile.PL which will create a system-specific Makefile. Then run make, optionally followed by make test to check the functionality. Finally, run make install as root.

marc2ris
  • MARC::Record (CPAN)

  • MARC::Charset (CPAN)

  • refdb-perlmod

med2ris
  • XML::Parser (CPAN)

  • Text::Iconv (CPAN)

  • refdb-perlmod

en2ris
  • Text::Iconv (CPAN)

  • refdb-perlmod

refdbsru
  • CQL (CPAN)

  • CGI (CPAN)

  • XML::Writer (CPAN)

  • refdb-perlsru

  • refdb-perlmod

refdb-sruserver
  • CQL (CPAN)

  • CGI (CPAN)

  • XML::Writer (CPAN)

  • HTTP::Server::Simple (CPAN)

  • refdb-perlsru

  • refdb-perlmod

Note

The configure script tests for the existence of the required Perl modules. If your system lacks some of the required scripts, you'll get a warning, but you'll still be able to make and make install refdb. You can install the modules at a later time without rebuilding refdb. In any case, the missing modules will only affect the Perl import filters, but not the core functionality of refdb. That is, if you don't require the Perl scripts, you don't have to install the modules either.

refdb also provides some support for Perl programmers. The RefDBClient module, also available at the refdb project page, implements Perl classes to directly communicate with refdbd. This allows to write custom clients that access the refdb databases and use the whole functionality implemented in refdbd. The test.pl script shipped with the module gives a basic idea how to write a custom client. See also the chapter about this module in the programmer's manual.

refdb-1.0.2/doc/refdb-manual/ch02s04.html000644 001750 001750 00000026300 12255431176 020524 0ustar00markusmarkus000000 000000 External applications

External applications

refdb was designed with the fact in mind that good applications are out there for almost any purpose. Therefore it relies on a few external applications which have to be properly installed. The following list shows the applications which are absolutely required and some applications which will make your life easier.

SQL database server (required for all purposes)

refdb uses libdbi as a database abstraction layer to access SQL database servers. refdb currently supports MySQL and PostgreSQL as external database engines. Both database servers run on a wide variety of Unix- and Unix-like operating systems as well as on Windows. Sources and precompiled binaries are available. MySQL should be at least version 4.1.x, PostgreSQL should be 7.1 or later.

If you prefer not to run an external SQL database server, choose the SQLite based internal database engine as explained in the libraries section above.

Jade/OpenJade and SP/OSP-based tools (required for DocBook SGML bibliographies, import of DocBook bibliography data)

Jade is a freely available and well-proven DSSSL engine which is based on the SP parser. The Jade package contains a few more SP-based tools, e.g. the nsgmls validator and the sgmlnorm normalizer. refdb uses Jade both to extract the IDs of the references which are cited in SGML documents and to transform SGML documents using DSSSL stylesheets. sgmlnorm is required to preprocess multipart documents using the short notation for refdb citations. The Jade/SP package is available on James Clarks homepage. Prebuilt binaries are available for some platforms, and it builds out of the box on quite a number of platforms. Jade has seen some further development by an independent group of programmers. These newer versions were released as OpenJade/OpenSP and are available at the OpenJade homepage.

Note

OpenJade has some advantages over Jade for our purposes. If it is possible to obtain or compile OpenJade on your platform, you should go for it. Both Jade and OpenJade can be installed on the same machine without conflicts. The configure script will look for both OpenJade and Jade and will use the former as the default DSSSL engine in the shell script customizations if it is available.

XSLT and FO processors (required for DocBook and TEI XML documents)

If you're working with XML documents and want to transform them using the XSL stylesheets, you'll need some sort of XSL processing machinery. Popular choices are Xalan, Saxon, and xsltproc. The latter is checked for in the configure script and will be used as the default processor if available. The Java-based tools among these need the Java Virtual Machine installed, of course. Generating printable output from FO seems to work best with FOP.

Stylesheets (required for SGML or XML bibliographies)

refdb ships with DSSSL stylesheet driver files for DocBook SGML documents, XSL stylesheet driver files for DocBook XML documents, and XSL stylesheet driver files for TEI XML documents. All of these rely on the respective stylesheets by Norm Walsh and Sebastian Rahtz. These must be installed on your system if you want to transform DocBook or TEI documents.

TeX (required for LaTeX bibliographies and recommended for printable output from SGML and XML documents)

Donald Knuth's famous typesetting system is available on almost any platform. You need a TeX system to generate LaTeX bibliographies. It is also convenient to generate nice-looking printable output from SGML and XML documents.

Unix-style text editor (required for all purposes)

This is nothing to worry about if you use some flavour of Unix or Linux: anything that lets you edit texts will do. However, if you have to use Windows, you should be aware that many run-of-the-mill Windows text editors are not suitable for use with refdb as they are not able to handle the Unix-style line endings (LF instead of CR/LF) properly. The standard Windows editors Notepad, WordPad, and MS Word will not work unless you use a DOS to Unix conversion filter like refdb_dos2unix. These line endings are important in almost all cases, especially when adding and editing references. Some freeware or shareware text-editors for programmers have an option to read and write Unix-style line endings. A few popular Unix text editors are available as Windows ports. Among them are vi clones like vim which is available as a native Windows application and as a Cygwin version, as well as Emacs. GNU Emacs is available as a native Windows application and also as a Cygwin package (even for the Cygwin XFree86 port if you wish). XEmacs can both be built as a native application and as a Cygwin program.

SGML/XML editor (recommended, but not mandatory)

If you plan to create bibliographies, you may need a SGML/XML editor for two reasons. First, the bibliography style specifications have to be written as XML documents (unless someone else has contributed such a file). Second, if you want to create bibliographies for DocBook documents, you want to use a SGML/XML editor anyway. But SGML is plain text after all, so SGML/XML editors make your life easier, but they are not strictly necessary to get something done.

Emacs/XEmacs and the PSGML mode for DTD-based SGML and XML documents or the nxml mode for RELAX NG-based XML documents are an excellent choice.

Web browser (recommended, but not mandatory)

Most likely you will not have a hard time to find some kind of web browser on your system. A web browser may be more pleasant to view the query results than the standard output on stdout or a pager. If you use refdb to manage a collection of PDF or Postscript files, the paths to these files will be displayed in the HTML output and you can open the files with one mouseclick. A web browser is of course also required to use the PHP interface, and it is also useful to interactively retrieve references through the SRU interface.

Perl (import of MARC datasets, import of Pubmed XML datasets, import of EndNote RIS datasets, post-processing BibTeX import files, SRU interfaces)

The Perl interpreter is available for almost any platform. refdb currently uses Perl for two purposes: the first are the MARC and Pubmed XML import filters, the other is a non-mandatory post-processing step of bibliography data that you import from BibTeX .bib files. The MARC import filter requires at least Perl version 5.6.0 and the Perl modules MARC::Record and MARC::Charset. The Pubmed XML import filter requires the Perl modules XML::Parser and Text::Iconv. The latter is also required for the Endnote import filter. Both the standalone and the CGI version of the SRU services are also implemented in Perl. All things Perl are available at CPAN.

Z39.50 client

In order to retrieve datasets from one of the countless libraries offering their contents through the Z39.50 protocol you'll need a client. The free YAZ toolkit includes a sample client which should be sufficient for general use. The toolkit is available as source, RPM and Debian binaries, and as a Windows binary package.

refdb-1.0.2/doc/refdb-manual/ch02s05.html000644 001750 001750 00000006420 12255431176 020526 0ustar00markusmarkus000000 000000 Related Software

Related Software

Please visit the RefDB web page for further information about the following tools which extend the capabilities of RefDB but are not included in the sources:

  • ris-mode, an Emacs major mode for RIS datasets

  • refdb-mode, an Emacs frontend for RefDB

  • A package providing RefDB support for vim, the improved vi editor

  • refdb-perlmod, a package containing several Perl support modules for the Perl scripts shipped with RefDB

  • RefDB::Client, a Perl module implementing an object-oriented access to RefDB for Perl programmers

  • RefDB::SRU and RefDB::SRUserver, the Perl modules that implement the SRU access to RefDB

  • A Ruby client library (partially implemented and currently unmaintained!)

refdb-1.0.2/doc/refdb-manual/ch03.html000644 001750 001750 00000007200 12255431176 020174 0ustar00markusmarkus000000 000000 Chapter 3. Current limitations and platform issues

Chapter 3. Current limitations and platform issues

This chapter briefly lists features which are either not yet implemented or which don't work as they should or which work differently on different platforms. These things may be implemented or fixed in future releases, respectively.

Limitations

  • The clients do not use a dynamic buffer to read the data from the application server. This may result in timeouts if you view the results with a pager that can't buffer large amounts of data in the background. To avoid these problems, it's prudent to redirect queries that return large amounts of data into a file.

  • The query results can only be sorted by ID (default) and publication year.

  • Support for different character encodings depends on the database server. PostgreSQL offers a variety of different character encodings, including Unicode, which are selectable per database. MySQL versions 4.1 and later support character encodings as well, including Unicode. SQLite offers Unicode support as a compile-time option. SQLite3 uses Unicode by default.

  • Export of bibliography styles to BibTeX .bst files would be really cool but is not implemented yet.

refdb-1.0.2/doc/refdb-manual/ch03s02.html000644 001750 001750 00000010000 12255431176 020511 0ustar00markusmarkus000000 000000 Platform issues

Platform issues

  • Cygwin currently does not support named pipes/FIFOs. refdbd uses these to implement a child->parent messaging after the application server has forked. On Cygwin, this messaging is emulated with a temporary file. This is a bit slower (and a lot kludgier and error-prone) than a named pipe and almost certainly is a security hole.

    Note

    As of this writing, support for named pipes appears to be implemented as an experimental feature in Cygwin. It does not work as expected yet, so RefDB still emulates named pipes on Cygwin.

  • Cygwin currently does not implement the detection of pending data on stdin. Therefore, data that you send to stdin of a client will not be read unless you use the -f stdin command line option.

  • The Cygwin port of SQLite has a problem working with absolute paths. The safest way is to start refdbd from the root directory (the start script refdbctl does this by default) and use a relative path to the database directory (i.e. leave away the leading slash).

  • As the Cygwin library has to translate all calls to Unix system functions to native Windows function calls, there is a small performance penalty in comparison to native Windows or Linux/Unix applications. My general impression however is that this does not affect the overall performance as most time seems to be spent inside the database server. You may gain some milliseconds by running the application server on a Linux/Unix box, though.

  • Of course a major problem is the lack of support for more platforms. RefDB may work on a variety of platforms besides those mentioned above, but unless you tell me so, I'll never know!

refdb-1.0.2/doc/refdb-manual/ch04.html000644 001750 001750 00000016722 12255431200 020172 0ustar00markusmarkus000000 000000 Chapter 4. Installation

Chapter 4. Installation

This chapter tries to explain the process of the installation. There are some things you should consider before you actually install the software. These will be discussed in the second section. The technical details of the installation on various platforms can be found in the following sections of this chapter. The final sections deal with the setup of optional web-based frontends. But first we start with a brief overview of installing and running RefDB for those who never read manuals.

Quickstart guide

These are the essential steps to get your reference database up and running:

  1. Follow the installation instructions for either Unix/Linux or Windows.

  2. Finish the installation by creating and filling the internal database.

  3. Start the application server refdbd, either manually or as a daemon, as explained in the OS-specific installation sections.

  4. Create one or more reference databases.

  5. Add one or more users that are permitted to work with this database (not required if you use the SQLite database engine as it lacks access control).

  6. Add bibliography styles.

Some of the above steps are simplified by the shell script refdb-init which you should have a thorough look at. Then it is up to the users to populate the database with references, run their queries, create bibliographies, and whatever they may desire.

refdb-1.0.2/doc/refdb-manual/ch04s02.html000644 001750 001750 00000010310 12255431177 020517 0ustar00markusmarkus000000 000000 Upgrading from an older version

Upgrading from an older version

If you already run an older version of RefDB and want to upgrade to the latest version, you may have to change a few things in your local setup in order to reuse existing databases and existing configuration files. This section lists all backwards-incompatible changes of the past few versions (the complete list since the days of yore can be found in the file README).

Note

The file UPGRADING contains instructions how to avoid losing your data in the case of non-trivial changes in the new version.

0.9.9

  • Major changes in both the reference databases and the main database require to upgrade both.

  • Before re-importing your reference data, you may have to migrate the contents of some AV fields to L1

  • Before re-importing custom citation styles, you may have to fix a few elements. The styles shipped with RefDB do not require these fixes, you can just add them again.

0.9.8

  • The implementation of personal reference lists has changed, most notably in that each user can have more than one of these lists. Although there was no need to alter the database schema, one of the tables is now used to record the ownership of a reference instead of the membership of a reference in a personal list. The results may be a bit unexpected if you upgrade to 0.9.8 without migrating the data.

0.9.7

  • The main database needs to be re-created if you use MySQL as a database engine.

refdb-1.0.2/doc/refdb-manual/ch04s03.html000644 001750 001750 00000053201 12255431177 020526 0ustar00markusmarkus000000 000000 Things to know before you start

Things to know before you start

Which database server?

RefDB currently supports MySQL and PostgreSQL as external database servers as well as SQLite as an embedded database engine. This section tries to help you decide which one to pick.

The first issue is whether you want to run an external database server or not. External database servers scale better if many users share databases and they provide access control. The external database servers also use more fine-grained locking mechanisms which allow concurrent read and write accesses, whereas the SQLite engine will lock the entire database for write accesses. However, the latter does not provide access control and thus doesn't require any sort of user administration.

Rule #1. If you don't intend to share databases, or if running a database server scares you in any way, then you may better off with SQLite.

Another issue is the way how the database engines store their data. SQLite is unique in that it uses a single architecture-independent file per database which makes transferring the data to a different box a breeze. The external database engines use more sophisticated ways to organize their data, but you need some basic administrative skills in order to replicate the data.

Rule #2. If you cannot rely on remote access to your databases (something which RefDB is well suited for) but have to take your data physically with you while travelling, SQLite is a better choice.

Now some words about the external database servers. As with many other fundamental schisms in the Unix world (vi vs. Emacs, KDE vs. Gnome, to name a few), both database servers supported by RefDB have followers who are semi-religious about their choice. Both MySQL and PostgreSQL are robust and well-proven. This leads us to:

Rule #3. If you already use one of the servers, then by all means use it also for RefDB. Being familiar with the server and having it happily running usually outweighs any advantages that the other server might have.

But what if you do not yet run a suitable database server? You can browse the web and read for hours about the differences between MySQL and PostgreSQL, but for the purpose of managing RefDB reference databases it boils down to one essential difference: MySQL is faster.

This leads us to:

Rule #4. If you cherish speed over anything else, use MySQL.

Note

There's a few more differences that you should be aware of: PostgreSQL has transaction support by default. MySQL supports transactions only if you use InnoDB tables. If you want this additional peace of mind from MySQL, make sure InnoDB is the default table type. SQLite does not support Unix-style regular expressions. If you'd like to use these more versatile expressions instead of the simpler SQL regular expressions supported by SQLite, choose MySQL or PostgreSQL.

Where do the components go?

As RefDB is a three-tiered client-server application, you have considerable freedom to distribute the components among your computers. Although RefDB shines in a network environment, there is absolutely no problem to run all components on a single standalone workstation.

Note

Please keep in mind that there's one tier less if you choose the SQLite embedded database engine. The databases will always be on the filesystem of the machine that runs refdbd (this doesn't exclude putting the files on an NFS share if you have a good reason to do so).

The basic idea of the client-server model has several implications:

  • Many workstations can access a single server running the database server. Thus many people can access the same databases without the pain of duplicating the data and the database engine on every single machine.

  • A considerable part of the computing effort is done outside of the workstations. Therefore even rather lame workstations may be sufficient to access and manipulate the data. The database server should run on a decent machine, though (better not that dusty 486 that has doubled as a paperweight since 1990).

  • Updates of the software will mainly affect the database server and the application server. This considerably reduces your workload, as the workstations need to be updated less frequently.

The most common scenarios for using RefDB will be on a department or institute network and on a standalone workstation. Let's see how these scenarios differ:

Installation on a standalone workstation

This is obviously the simplest case. The clients, the application server, the database server, and the databases reside on the same physical machine (see Figure 4.1, “RefDB on a standalone workstationâ€). The only requirement for the workstation is that a TCP/IP network is installed. This is necessary as the three layers of RefDB always communicate via TCP/IP sockets. The IP address 127.0.0.1 has to be specified in the configuration files of the clients and of the application server.

Figure 4.1. RefDB on a standalone workstation

RefDB on a standalone workstation

Installation in a network

In a network you can take advantage of the client-server model and distribute the workload between your computers. Although the three layers can well be distributed between three physical machines, it may be more useful to install the application server on the same machine as the database server and the databases (see Figure 4.2, “RefDB on a networkâ€). A dedicated or general-purpose server may be most suitable to hold these components, as a workstation may get sluggish if it has to answer a lot of database requests.

The clients as well as scripts and support files have to be installed on all workstations that will be used to access the databases. The client for administrative tasks, refdba, can be restricted to the workstations of system administrators or otherwise experienced staff.

Figure 4.2. RefDB on a network

RefDB on a network

The mystery of the configuration files

Like with most Unix-style software packages, the behaviour of the RefDB applications can be tweaked by configuration files. Wherever it makes sense, there is one global config file with useful admin-picked defaults, and another user config file for the individual user to play with. The purpose of the configuration files is to set some reasonable default values for the command-line switches of the RefDB programs. Once you have set these, you will never have to specify these values on the command line again, unless you want to temporarily override them.

Types of configuration files

All RefDB applications and scripts that use configuration files (these are the server refdbd, the clients refdbc, refdbib, refdba, the script refdbxml, as well as the conversion filters bib2ris, db2ris, med2ris.pl, marc2ris, and en2ris) can use two configuration files each. One global configuration file is supplied by the system administrator and can be used to set values that are common for all users on that box, like the IP address of the application server. Another file can be used by every user to supply the values that were not set in the global file or to override settings in this file. The users' copies can have a leading dot to hide the files (the refdb programs will first try to read a hidden configuration file, and only if that cannot be found they try to read a non-hidden file).

bib2ris, marc2ris, and med2ris use a second global configuration file if they are run as a CGI applications. A local configuration file does not make sense in this case.

The default location for the global configuration files is /usr/local/etc/refdb. There are two ways to change this. If you compile RefDB from the sources you can specify a different directory with the --prefix or --sysconfdir options of ./configure. E.g. if you specify --sysconfdir=/etc, then the configuration files will be installed in /etc/refdb (the refdb part is automatically appended by the RefDB install routines). If you use precompiled binaries, use the -y command line option to specify the directory. In this case you have to specify the full path, i.e. /etc/refdb to read the configuration files installed by the previous example.

The user copies of the client configuration files are expected to be in the users' home directories as specified by the environment variable HOME.

Configuration file syntax

All configuration files share a common syntax. There are just three essential things to know:

  • All information is stored as pairs of whitespace-separated items, one pair on each line. The first item on the line specifies the variable name, the second item specifies the variable value. Whitespace means one or more spaces or tabs in any combination.

  • Everything to the right of a hash sign (#) is a comment. The rest of the line is ignored.

  • The line endings are Unix-style (0x10, not DOS-style 0x13 0x10), regardless of the operating system.

A configuration example

The whole configuration stuff may sound a bit confusing, so let us now look at a simple configuration example that illustrates the principles laid out above.

The following is a listing of /usr/local/etc/refdb/refdbcrc, our global refdbc configuration file in this example:

# This is the global configuration file for refdbc
serverip	127.0.0.1
port	9734
pager	more
timeout	180
# end of refdbcrc
	

This is the corresponding copy that one of the users of the system created as /home/joe/.refdbcrc:

# This is the user configuration file for refdbc
pager	less
username	joesixpack
passwd  * 
timeout	30
# end of .refdbcrc
	

As you can see our hypothetical system administrator configured the IP address (serverip) and the port where refdbd listens to the client requests. This value is most likely the same for all users on the system, so this is nothing to worry about for the users. more is defined as the default pager, and the timeout is set to 3 minutes.

Joe Sixpack, our reckless user, does not like more as a pager and prefers to use less instead. He also thinks that half a minute as a timeout should be enough. Both of these settings override the corresponding values in the global file. serverip and port are not redefined in the user's copy, so the values of the global file take effect. Joe also defined username (which happens to be different from his login name "joe") and passwd so the correct values will be used for the database access (the asterisk in the passwd field will cause refdbc to ask for the password interactively for security reasons).

Configuration file variables

For a listing of available configuration file variables please see the tables for refdba, refdbc, refdbib, refdbd, refdbxml, bib2ris, db2ris, med2ris, marc2ris, and en2ris.

Environment variables

refdb uses the following environment variables to locate the files and directories it needs to run properly.

HOME

This variable should be set for all users anyway. It is used to locate the personal configuration files for the RefDB clients.

SGML_CATALOG_FILES

If you process SGML files, this variable will be consulted to locate the catalog files required for resolving public identifiers to their local filename equivalents.

Note

On some systems, the package system maintains a master catalog whose path is hard-coded into the SGML applications. In this case, the variable is not required.

XML_CATALOG_FILES

If you process XML files, this variable may be consulted to locate XML catalogs. If this variable is not set, many tools look into the default location /etc/xml/catalog instead. Remember that some XSLT processors need access to additional Java classes to provide XML catalog support at all.

Some notes on the filesystem

The default installation procedure will install the RefDB files in locations compatible with the filesystem hierarchy standard. You will learn in the following sections how to change where the RefDB files will be installed if you want to adapt the installation to specific needs of your system. To get a better idea of what you have to take care of if you don't like the defaults, here is a list of the directories used by RefDB:

/usr/local/bin

This directory will receive all binary files and shell scripts.

/usr/local/etc/refdb

All global RefDB configuration files end up in this directory.

/usr/local/share/refdb

This directory contains shareable, operating system independent files. The files are organized in a couple of subdirectories:

  • css contains a cascading stylesheet suitable for the HTML output of the getref command.

  • declarations contains the default SGML declarations.

  • dsssl contains DSSSL stylesheets.

  • dtd contains the document type definitions used by RefDB.

  • examples contains a few example reference data files as well as SGML and XML test documents using RefDB citations.

  • sql contains SQL scripts used to initialize databases.

  • sru contains the XSLT and CSS stylesheets required to set up the SRU service

  • styles contains some XML files containing bibliography styles.

  • xsl contains XSLT stylesheets.

/usr/local/var/lib/refdb/db

holds the database files of embedded database engines and a version file for use by package installation scripts

refdb-1.0.2/doc/refdb-manual/ch04s04.html000644 001750 001750 00000102613 12255431177 020531 0ustar00markusmarkus000000 000000 Installation on Linux and other Unix variants

Installation on Linux and other Unix variants

RefDB was designed with portability in mind. Thanks to the GNU autotools installation on many Unix variants is straightforward, others need only a little tweaking. The following instructions provide a guideline for all Unix-like systems. Please see also the hints for specific operating systems at the end of this section.

Generic instructions

Prerequisites

These instructions assume that the following software is installed and functional on your computer or on your network before you start:

  • A SQL database engine. For an external database server, choose between MySQL (version 3.23 or later) or PostgreSQL (version 7.1 or later). The database server does not have to physically run on the box(es) where you plan to install RefDB, it is sufficient if it is accessible through the network.

    If you prefer an embedded database engine, please use SQLite instead.

  • As far as non-standard libraries and header files are concerned, you'll need the readline library and headers (available at the GNU FTP site). Database access requires the libdbi library and headers as well as the libdbi-drivers package. Furthermore, you`ll need the expat library. If you need the BibTeX import filter, you'll also want to have the btparse library.

    Note

    Some operating systems/distributions use separate packages for the run-time libraries (ususally .so files) and for the development libraries (usually .a files). In order to build and run RefDB, you need both packages for each library.

  • If you want to import Pubmed or MARC datasets, please get the refdb-perlmod package. This collection of Perl modules is required to run the Pubmed and MARC import filters shipped with RefDB. These Perl modules in turn depend on MARC::Record, MARC::Charset, XML::Parser, and Text::Iconv, available at CPAN.

Installation from the sources

Note

The installation steps proper (as opposed to the build steps) should be run with root privileges.

  1. Unpack the archive in a convenient directory: tar -xzf refdb-x.y.z.tar.gz (the actual filename depends on the version).

  2. If you do not want to build in the source directory, create an empty build directory.

  3. cd into the new refdb-x.y.z source directory or into your separate build directory

  4. Use ./configure --help to see a list of things you can customize. If you use a separate build directory, use the relative path to configure in the source directory. Some important options are:

    Note

    All paths and URLs in the following options should be entered without a trailing slash.

    --prefix=PREFIX

    By default, all files will be installed in the /usr/local tree. Use this option to use a different install root, e.g. /usr or /opt.

    --datadir=DIR

    The data files will be installed in /usr/local/share/refdb unless you use this option. The data will be installed in the directory DIR/refdb. That is, specifying "--datadir=/usr/local/share" is equivalent to the default behaviour. The configuration variable refdblib (which will be automatically generated in the example configuration files) must point to the RefDB data directory.

    --sysconfdir=DIR

    The global configuration files will be installed in /usr/local/etc/refdb unless you specify a different directory here.

    --with-libdbi-lib=DIR

    Use this option to specify the directory that contains the libdbi library if it is not in the default library path.

    --with-expat-lib=DIR

    Use this option to specify the directory that contains the expat library if it is not in the default library path.

    --with-btparse-lib=DIR

    Use this option to specify the directory that contains the btparse library if it is not in the default library path.

    --with-sgml-declaration=PATH

    Specify the full path to a suitable SGML declaration for your SGML files. If this option is not used, RefDB will use its own copy of docbook.dcl stolen from the DocBook DTD distribution. This SGML declaration also works for a variety of other DTDs.

    --with-xml-declaration=PATH

    Specify the full path to xml.dcl which is the SGML declaration for XML files. If this option is not used, RefDB will use its own copy of xml.dcl which should work just fine.

    --with-docbook-xsl=PATH

    Specify the full path to the root directory of the DocBook XSL stylesheets.

    Note

    This option is required only on systems that do not maintain XML catalogs. If your system is set up properly to resolve public identifiers like those in the XSL stylesheets by XML catalogs, leave out this option. configure checks whether the required stylesheets are accessible, so watch out for error messages. If the stylesheets can't be found, either install them, fix your catalogs, or use this option to hardcode the path.

    --with-docbook-xsl-ns=PATH

    Specify the full path to the root directory of the DocBook XSL-NS (for DocBook V5.0 and later) stylesheets.

    Note

    This option is required only on systems that do not maintain XML catalogs. If your system is set up properly to resolve public identifiers like those in the XSL stylesheets by XML catalogs, leave out this option. configure checks whether the required stylesheets are accessible, so watch out for error messages. If the stylesheets can't be found, either install them, fix your catalogs, or use this option to hardcode the path.

    --with-tei-xsl=PATH

    Specify the full path to the root directory of the TEI XSL stylesheets for P4.

    Note

    As mentioned above for the DocBook stylesheets, use this option only if your catalogs cannot resolve the public identifiers properly. The TEI Consortium ships tei-xsl-5.2.9.zip which contains the stylesheets for both p4 and p5. The root directory which you want to specify here is the directory which contains the p4 and p5 subdirectories, e.g. /usr/local/share/xsl/tei-xsl-5.2.9.

    --with-tei-xsl-ns=PATH

    Specify the full path to the root directory of the TEI XSL stylesheets for P5.

    Note

    As mentioned above for the DocBook stylesheets, use this option only if your catalogs cannot resolve the public identifiers properly. The TEI Consortium ships tei-xsl-5.2.9.zip which contains the stylesheets for both p4 and p5. The root directory which you want to specify here is the directory which contains the p4 and p5 subdirectories, e.g. /usr/local/share/xsl/tei-xsl-5.2.9.

    --with-classpath-root=PATH

    The refdbxml script assumes that all Java classes for the Java parsers and xslt engines are stored in a class repository, i.e. all in the same directory. Specify this directory with this option. If you keep the relevant Java classes in different directories, either create symlinks or customize refdbxml manually.

    --with-var-dir=PATH

    Use this option to specify a directory where refdbd can write its PID file (a file containing the process ID). By default, /var/run will be used.

    --with-log-dir=PATH

    Use this option to specify a directory where RefDB programs can write log files to, if logging is directed to a custom file. By default, /var/log will be used.

    --with-main-db=dbname

    RefDB uses one main database to store citation styles and other stuff. There is exactly one such database per installation with the default name refdb. You may have to change this name if you want to run two different versions of RefDB in parallel, or if you're not free to choose your database name. Although the main database name is configurable at runtime, you should use this option to initialize your refdbdrc configuration file, as it allows the refdb-init script to use the proper database name.

    --with-db-dir

    Selects the directory which holds SQLite/SQLite3 databases.

    --with-trang-jar

    Specifies the full path to the jar file of the trang tool. You need this tool if you build RefDB from SVN sources, but not if you build from a tarball.

    --disable-docs

    RefDB ships with prebuilt docs. However, if you build a SVN version, or if the documentation is otherwise screwed up, you may have to build them. Building the docs from the sources requires a couple of extra tools. You can use this configure switch to build the rest of RefDB without having to install these tools.

    --disable-clients

    Use this switch if you want to build and install only the application server refdbd. This is mainly targeted at package builders.

    --disable-server

    Use this switch if you want to build and install only the clients but not the application server. This is mainly targeted at package builders.

    Some of these options are used to customize the shell scripts, XSL stylesheets, example configuration files, and HTML files which are part of RefDB. If you do not specify these options now, you can still build and install the package, but you will have to customize the scripts and stylesheets manually in order to make them work. Doing it now is much easier. You've been warned.

    Start the configuration with the command ./configure, specifying any additional options as you may need. Use the relative path to configure in the source directory if you build in a separate directory.

    Note

    If your system keeps non-system header files in odd places, it may be necessary to set the CFLAGS environment variable before you run configure. E.g. if headers like expat.h are stored in /usr/local/include, you should run CFLAGS="-I/usr/local/include" ./configure instead, specifying additional options as necessary.

  5. make

    Note

    The autotools-generated Makefiles apparently prefer (or require?) GNU make. If make results in spurious error messages about the Makefile syntax, try to run gmake instead as your regular make is apparently not the GNU version.

  6. make install

    This will install the binaries and scripts in /usr/local/bin and the data in /usr/local/share/refdb unless you chose different directories in the configure step. Again, run gmake install instead if your regular make is not the GNU version.

  7. To finish the installation, please follow the instructions in the section Finishing the RefDB installation below.

If this procedure results in strange error messages, you probably use a platform that is not supported yet. The author appreciates a porting effort or a description of the problem (in this particular order).

Living on the bleeding edge: installing a SVN version

While the official release versions of RefDB are your best bet to get a stable installation, you may be interested to test the latest developments "in statu nascendi". The SVN version is guaranteed to compile on the author's development platform (currently FreeBSD 6.1), but may fail on other platforms. Known bugs may have been fixed, but new ones may have crept in as well. New features may be implemented, but might not be without problems. You've been warned. If you still want to go ahead, this is what you need to do:

  1. Change into a suitable directory. SVN will create a subdirectory called refdb during the following steps

  2. Run the following command (adapt this accordingly if you use some graphical CVS frontend instead of the command line tool):

    	      $~/build 
    	      svn co https://svn.sourceforge.net/svnroot/refdb/refdb/trunk refdb
    	    

    Other interesting modules to check out are perlmod (the Perl modules and the Perl client library) and elisp (the Emacs support files).

    If you are interested in a particular repository version, release, or branch, use commands along these lines:

    	      $~/build 
    	      svn co --revision 324 https://svn.sourceforge.net/svnroot/refdb/refdb/trunk refdb-324
    	      svn co https://svn.sourceforge.net/svnroot/refdb/refdb/tags/Release-0.9.7 refdb-0.9.7
    	      svn co https://svn.sourceforge.net/svnroot/refdb/refdb/branches/back-to-a-1-branch refdb-a1-branch
    	    
  3. If you want to keep track of the latest developments, you'll have to update your SVN working copy once in a while. Run this command from within the top-level source directory:

    	      $~/build/refdb 
    	      svn update
    	    

    Consider subscribing to the refdb-cvs mailing list as you'll be notified about each SVN checkin.

  4. The SVN version lacks all autotool-generated files. You'll have to create them with your local autotools. RefDB contains a small script called autogen.sh in its top-level directory which performs all necessary steps.

    	      $~/build/refdb 
    	      ./autogen.sh
    	    

    Note

    The autotools can cause severe headaches at times. If the above command causes errors, read autogen.sh and run the commands manually, substituting different versions as appropriate. E.g. substitute automake with automake-1.8 if this gives better results. The native autotools shipped with FreeBSD 5.4 and later are unusable for our purposes, you have to install the gnu-autotools package instead. You have to modify your PATH to pick up the latter, and fiddle with the m4 macro paths in order to see the light.

  5. The SVN version also lacks a few other things which are included in the source tarballs. In order to create the missing stuff, you'll need the following additional tools:

    • Batik SVG Rasterizer: an image converter used to create the images from the SVG sources. The Makefile calls a script in your path called batik-rasterizer which is supposed to run this Java application appropriately.

    • dtdparse: a Perl script (which in turn depends on a few Perl modules, see the installation instuctions) which generates the DTD documentation.

    • trang: a tool required to turn the RefDB DTDs into RelaxNG schemas.

    To work around problems, you may want to use the following ./configure switches:

    • --with-trang-jar=PATH

    • --disable-docs

  6. Finally you're ready to build RefDB like you would with a released version.

There is also a neat shell script available on the RefDB download page which helps you to keep a SVN version up to date with a minimum number of keystrokes.

Installation of refdbd as a daemon

This is all it takes to run RefDB from the command line. If you want to start refdbd as a daemon at system startup, a few more steps are necessary. The exact procedure varies greatly between operating systems and distributions. First we'll look at SysV-style systems (most Linux distributions), then at BSD-style systems (BSD-derived Unices and the Slackware Linux distribution).

SysV-style

The following procedure describes the setup on a Debian GNU/Linux system. With a little help of your system handbook you should be able to adapt this to your system. On many systems /etc/init.d/README contains just what you need to know or at least it points you to the correct resources.

  1. Review the parameters in the script refdb in the scripts directory of the source distribution (this file is not automatically installed). If necessary, change the paths and names to your needs and adapt the following steps. Make sure the BSDSTYLE variable is set to "NO" (this is the default value).

  2. Copy the script refdb to /etc/init.d/ and make sure it is executable: chmod 755 /etc/init.d/refdb.

  3. Create symbolic links from every runlevel directory that should start refdbd to /etc/init.d/refdb, e.g. ln -s /etc/init.d/refdb /etc/rc2.d/S93refdb. The numbers in the link names are a convenient and simple way to determine the sequence of daemon starts. As most likely no other daemons rely on RefDB, you can choose as high a number as you want (the daemons are started in lexicographical order).

  4. In analogy to the previous step, generate symbolic links in every runlevel directory that should stop the daemon. Usually these are the runlevels 0 (system halt) and 6 (reboot):

    ln -s /etc/init.d/refdb /etc/rc0.d/K20refdb

    ln -s /etc/init.d/refdb /etc/rc6.d/K20refdb

  5. Review the settings in the script refdbctl which by default is installed in /usr/local/bin/. Most likely the script was properly customized for your system in the build step so you don't have to change anything.

When you boot, halt, or reboot the system you should see messages on the screen telling you that the daemon has been started or stopped successfully. If you don't, please check again all paths in the scripts, the file permissions, and the runlevels you're looking at. Try to run the control script from the command line, e.g. refdbctl start, to distinguish between general setup problems and init-related setup problems.

BSD-style

The following procedure describes the installation on a FreeBSD system. Other systems might differ somewhat, but you should get the idea.

  1. Review the parameters in the script refdb in the scripts directory of the source distribution (this file is not automatically installed). Set the value of the script variable BSDSTYLE to "YES" (the sole purpose of this variable is to make the boot message blend in seamlessly, if you happen to care for aesthetics). If necessary, change the paths and names to your needs and adapt the following steps.

  2. Copy the script refdb to /usr/local/etc/rc.d/refdb.sh and make sure it is executable: chmod 755 /usr/local/etc/rc.d/refdb.sh.

    Note

    The suffix .sh is mandatory on BSD-style systems.

  3. Review the settings in the script refdbctl which by default is installed in /usr/local/bin/. Most likely the script was properly customized for your system in the build step so you don't have to change anything.

When you boot, halt, or reboot the system you should see messages on the screen telling you that the daemon has been started or stopped. If you don't, please check again all paths in the scripts and the file permissions. Try to run the control script from the command line, e.g. refdbctl start, to distinguish between general setup problems and system-related setup problems.

OS-specific hints

This section contains a few hints about the installation on some popular Unix-like operating systems.

Linux

The generic instructions should work out of the box for most if not all Linux distributions.

Debian GNU/Linux

Debian keeps all configuration files in /etc and subdirectories thereof which makes backing up the configuration of the whole box a breeze. To support this nice feature, you want to add --sysconfdir=/etc to your configure options. The configuration files will then be in /etc/refdb. The following is an example of a complete configure call that works on Debian 3.0 (the line was split into several lines for the sake of clarity; type everything on one line and skip the backslashes):

	    #~ 
	    ./configure --sysconfdir=/etc \
	    --with-docbook-xsl=/usr/share/sgml/docbook/stylesheet/xsl/nwalsh \
	    --with-tei-xsl=/usr/local/lib/sgml/stylesheet/xsl
	  

FreeBSD

The BSD version of make cannot handle the autotools-generated Makefiles correctly. Use gmake instead, and set CFLAGS=-I/usr/local/include during the configuration step. The full configure command, using the default installation paths for the accessory files and programs, looks like this:

	  #~ 
	  CFLAGS=-I/usr/local/include ./configure --with-expat-lib=/usr/local/lib \
	  --with-classpath-root=/usr/local/share/java/classes 
	

The shared data end up in /usr/local/share/refdb, the configuration files will be in /usr/local/etc/refdb.

NetBSD

The BSD version of make cannot handle the autotools-generated Makefiles correctly. Use gmake instead, and set the following environment variables before running ./configure:

	  #~ 
	  setenv CFLAGS "-I/usr/pkg/include -I/usr/local/include -L/usr/pkg/lib"
	
	  #~ 
	  setenv LDFLAGS "-L/usr/pkg/lib  -R/usr/pkg/lib -R/usr/pkg/lib/mysql"
	
	  #~ 
	  ./configure --with-mysqlclient-lib=/usr/pkg/lib/mysql --with-btparse-lib=/usr/local/lib --prefix=/usr/pkg
	

Use additional options as needed. The shared data will end up in /usr/pkg/share/refdb, the configuration files go to /usr/pkg/etc/refdb.

Solaris

Both the standard C compiler and the standard make program will not give the desired results when building RefDB. Use gcc and gmake instead.

OSX

Use fink to conveniently install all the additional software needed. Then help configure find the fink-installed packages in /sw by setting the following environment variables: CFLAGS="-I/sw/include" LDFLAGS="-L/sw/lib" ./configure [your_options].

refdb-1.0.2/doc/refdb-manual/ch04s05.html000644 001750 001750 00000051433 12255431200 020520 0ustar00markusmarkus000000 000000 Installation on Windows NT/2000/XP

Installation on Windows NT/2000/XP

Prerequisites

In order to run RefDB you'll need a few external apps. The most important thing are the Cygwin tools which provide a Unix-like environment on the otherwise incompatible Windows platform. Additionally you'll have to build or obtain prebuilt versions of a few libraries which are not part of the standard Cygwin distribution (unless you use prebuilt binaries that contain all non-standard libraries).

External applications

  • Cygwin toolkit, DLL version 1.5.0 or later (the current version as of this writing, 1.5.12, has serious problems with PostgreSQL, though). The Cygwin distribution uses individual packages for the various parts. In addition to what is installed automatically (the base distribution), please make sure to select the following packages: libxml2, libxslt, expat, Perl, and a full TeX installation if you wish to create Postscript or PDF files.

  • A SQL database engine. Currently you can choose between MySQL (version 3.23 or later), PostgreSQL (version 7.1 or later), and SQLite/SQLite3 (versions 2.8.x or later; 3.0.x or later). The database server does not have to physically run on the box(es) where you plan to install RefDB, it is sufficient if it is accessible through the network.

    Cygwin offers a prepackaged version of PostgreSQL (7.3.3 as of this writing) which used to be the most convenient way to run a database server on your Cygwin box, but as stated above it may be broke when you try. Please follow the instructions in the readme shipped with the package to install and initialize the database server. It is crucial that you install and run the separately available cygipc package, available only here.

    SQLite does build on Cygwin, but all filename/path handling code uses the Windows conventions. You will have to use the Windows-style path when setting the database directory.

  • If you want to import Pubmed or MARC datasets, please make sure to install the Perl interpreter available for Cygwin and get the refdb-perlmod package. This collection of Perl modules is required to run the Pubmed and MARC import filters shipped with RefDB. These Perl modules in turn depend on MARC::Record, MARC::Charset, XML::Parser, available at CPAN.

The mentioned websites offer plenty of support as web documents or with mailing lists, so it should be possible to figure out how to do a basic install for these suites.

Libraries

  • The libdbi library and headers, along with the libdbi-drivers package. Please follow the Cygwin-specific instructions that accompany both packages to build and install the software. Prebuilt binaries for both libdbi and libdbi-drivers are available here.

  • If you need the BibTeX import filter, you'll also want to have the btparse library. This builds out of the tarball on Cygwin.

Installation from the sources

Note

Depending on the permission settings, you may have to run the installation steps proper (as opposed to the build steps) as an administrator.

  1. Unpack the sources in a convenient directory: tar -xzf refdb-x.y.z.tar.gz (the exact filename depends on the version).

  2. If you do not want to build in the source directory, create an empty build directory.

  3. Change into the new refdb-x.y.z source directory or into your separate build directory.

  4. ./configure --help

    This command will display a list of things you can customize. If you build in a separate directory, use the relative path to configure in the source directory. Some important options are:

    Note

    All paths and URLs in the following options should be entered without a trailing slash.

    --prefix=PREFIX

    By default, all files will be installed in the /usr/local tree. Use this option to use a different install root, e.g. /usr or /opt.

    --datadir=DIR

    The data files will be installed in /usr/local/share/refdb unless you use this option. The data will be installed in the directory DIR/refdb. That is, specifying "--datadir=/usr/local/share" is equivalent to the default behaviour. The configuration variable refdblib (which will be automatically generated in the example configuration files) must point to the RefDB data directory.

    --sysconfdir=DIR

    The global configuration files will be installed in /usr/local/etc/refdb unless you specify a different directory here.

    --with-libdbi-lib=DIR

    Use this option to specify the directory that contains the libdbi library if it is not in the default library path.

    --with-expat-lib=DIR

    Use this option to specify the directory that contains the expat library if it is not in the default library path.

    --with-btparse-lib=DIR

    Use this option to specify the directory that contains the btparse library if it is not in the default library path.

    --with-sgml-declaration=PATH

    Specify the full path to a suitable SGML declaration for your SGML files. If this option is not used, RefDB will use its own copy of docbook.dcl stolen from the DocBook DTD distribution. This SGML declaration also works for a variety of other DTDs.

    --with-xml-declaration=PATH

    Specify the full path to xml.dcl which is the SGML declaration for XML files. If this option is not used, RefDB will use its own copy of xml.dcl which should work just fine.

    --with-docbook-xsl=PATH

    Specify the full path to the root directory of the DocBook XSL stylesheets.

    Note

    This option is required only on systems that do not maintain XML catalogs. If your system is set up properly to resolve public identifiers like those in the XSL stylesheets by XML catalogs, leave out this option. configure checks whether the required stylesheets are accessible, so watch out for error messages. If the stylesheets can't be found, either install them, fix your catalogs, or use this option to hardcode the path.

    --with-docbook-xsl-ns=PATH

    Specify the full path to the root directory of the DocBook XSL-NS (for DocBook V5.0 and later) stylesheets.

    Note

    This option is required only on systems that do not maintain XML catalogs. If your system is set up properly to resolve public identifiers like those in the XSL stylesheets by XML catalogs, leave out this option. configure checks whether the required stylesheets are accessible, so watch out for error messages. If the stylesheets can't be found, either install them, fix your catalogs, or use this option to hardcode the path.

    --with-tei-xsl=PATH

    Specify the full path to the root directory of the TEI XSL stylesheets for P4.

    Note

    As mentioned above for the DocBook stylesheets, use this option only if your catalogs cannot resolve the public identifiers properly. The TEI Consortium ships tei-xsl-5.2.9.zip which contains the stylesheets for both p4 and p5. The root directory which you want to specify here is the directory which contains the p4 and p5 subdirectories, e.g. /usr/local/share/xsl/tei-xsl-5.2.9.

    --with-tei-xsl-ns=PATH

    Specify the full path to the root directory of the TEI XSL stylesheets for P5.

    Note

    As mentioned above for the DocBook stylesheets, use this option only if your catalogs cannot resolve the public identifiers properly. The TEI Consortium ships tei-xsl-5.2.9.zip which contains the stylesheets for both p4 and p5. The root directory which you want to specify here is the directory which contains the p4 and p5 subdirectories, e.g. /usr/local/share/xsl/tei-xsl-5.2.9.

    --with-classpath-root=PATH

    The refdbxml script assumes that all Java classes for the Java parsers and xslt engines are stored in a class repository, i.e. all in the same directory. Specify this directory with this option. If you keep the relevant Java classes in different directories, either create symlinks or customize refdbxml manually.

    --with-var-dir=PATH

    Use this option to specify a directory where refdbd can write its PID file (a file containing the process ID). By default, /var/run will be used.

    --with-log-dir=PATH

    Use this option to specify a directory where RefDB programs can write log files to, if logging is directed to a custom file. By default, /var/log will be used.

    --with-main-db=dbname

    RefDB uses one main database to store citation styles and other stuff. There is exactly one such database per installation with the default name refdb. You may have to change this name if you want to run two different versions of RefDB in parallel, or if you're not free to choose your database name. Although the main database name is configurable at runtime, you should use this option to initialize your refdbdrc configuration file, as it allows the refdb-init script to use the proper database name.

    --with-db-dir

    Selects the directory which holds SQLite/SQLite3 databases

    --with-trang-jar

    Specifies the full path to the jar file of the trang tool. You need this tool if you build RefDB from SVN sources, but not if you build from a tarball.

    --disable-docs

    RefDB ships with prebuilt docs. However, if you build a SVN version, or if the documentation is otherwise screwed up, you may have to build them. Building the docs from the sources requires a couple of extra tools. You can use this configure switch to build the rest of RefDB without having to install these tools.

    --disable-clients

    Use this switch if you want to build and install only the application server refdbd. This is mainly targeted at package builders.

    --disable-server

    Use this switch if you want to build and install only the clients but not the application server. This is mainly targeted at package builders.

    Finally, run ./configure with any options that you need. If you build in a separate directory, use the relative path to configure in the source directory. A complete set of options might look like this if you use PostgreSQL:

    	    $~ 
    	    ./configure --with-refdb-url=http://yourbox.com/refdb --with-db-server=pgsql --with-var-dir=/var/run \
    	    --with-log-dir=/var/log --with-libdbi-dir=/uar/local/lib --with-docbook-xsl=/usr/local/share/sgml/stylesheets/docbook \
    	    --with-tei-xsl=/usr/local/share/xsl/tei
    	  
  5. Run make. This will create the executables and adapt scripts and other files to your local installation.

  6. make install will copy the application server and the clients to /usr/local/bin and the data files to /usr/local/share/refdb unless you chose different directories in the configure step.

  7. To finish the installation, please follow the instructions in the section Finishing the RefDB installation below.

Now you have everything in place to use the RefDB clients and the application server from the command line. To install the application server as a service, the following additional steps are necessary:

  1. Install the service with the command cygrunsrv -I refdbd -p /usr/local/bin/refdbd -a '-s' (adapt the paths to your local installation if necessary).

  2. Start the service with the command cygrunsrv -S refdbd. To stop the service, use the command cygrunsrv -E refdbd. If you prefer, you can also start and stop the service with Windows' own tools: Either use the system control panel or use the commands net start refdbd and net stop refdbd.

With this setup, the service will be automatically started at system startup. See cygrunsrv --help for additional options.

Installation of prebuilt binaries

If you decide to grab the prebuilt binaries, the installation will be a little bit faster. The binaries are accompanied by a copy of libexpat. Please make sure to read the aptly named Readme files as they may have newer or additional information.

  1. Unpack the archive in the root directory (/) with the command tar -xzf refdb-cygwin-bin-x.y.z.tar.gz (the exact archive name depends on the version you use). This will extract the files into the /usr/local hierarchy. The binaries and scripts go to /usr/local/bin, the Document Type Definitions, stylesheets, styles and example configuration files go to /usr/local/share/refdb and its subdirectories.

  2. Unpack the prebuilt binaries for both libdbi and libdbi-drivers, available here, in the very same way.

  3. Add /usr/local/share/refdb/refdb.cat to your SGML_CATALOG_FILES environment variable.

  4. Create the configuration files in /usr/local/etc. Sample configuration files with a .example extension are created in the same directory during the installation. Provide personalized copies for the user's home directories as needed.

  5. To install refdbd as a service, follow the instructions above.

refdb-1.0.2/doc/refdb-manual/ch04s06.html000644 001750 001750 00000004735 12255431200 020524 0ustar00markusmarkus000000 000000 Installation on Windows 95/98/ME

Installation on Windows 95/98/ME

Most of the things said for Windows NT/2000/XP are applicable as well for Windows 95/98/ME. The main difference is that the latter operating systems do not support the idea of a daemon or service. The closest thing you can do to running a service is to put a shortcut to refdbd into the startup folder. This is not much of a problem if you run the RefDB clients on the same computer as refdbd. However, Windows 95/98/ME are not suitable to handle RefDB requests from other computers because refdbd will not run if nobody is logged in.

refdb-1.0.2/doc/refdb-manual/ch04s07.html000644 001750 001750 00000004575 12255431200 020527 0ustar00markusmarkus000000 000000 Other operating systems

Other operating systems

RefDB has not been ported to other operating systems yet. As no esoteric features of the C language are used, you may just try to run ./configure [options] && make and see what happens. Chances are that it either works or can be convinced to work with just a few modifications. If you manage to run RefDB on a platform not described here, a short notice with the porting instructions would be greatly appreciated.

refdb-1.0.2/doc/refdb-manual/ch04s08.html000644 001750 001750 00000045361 12255431200 020526 0ustar00markusmarkus000000 000000 Finishing the RefDB installation

Finishing the RefDB installation

This step is necessary for all platforms. You have to create some databases for RefDB to start with and you should make the RefDB SGML/XML support files known to your system. In most cases you will prefer to use a script provided with RefDB which performs all things required for a first-time installation. If you need more precise control, you'll also find instructions below how to set up RefDB manually.

Using the interactive setup script

The interactive script refdb-init must be run with root permission as it tries to fiddle with a couple of files that a regular user should not have write permission for. After starting the script, it will collect a few answers from you about your intended setup. It will also perform a couple of sanity checks. After this stage is completed, you will be asked to positively confirm whether or not your system should be modified. Therefore it is safe to dry-run this script in order to decide whether you prefer the script over the manual installation.

The script creates the main database, the refdbd and refdba configuration files, loads the available styles, creates a reference database and a database user account. All that is left to do manually is to take care of the SGML catalog file.

Manual setup

Configuration files

Now is the time to create the global configuration files described in the configuration file section. Create these files in /usr/local/etc/refdb (or whatever you chose during configuration). It is recommended to copy and modify the commented example configuration files in the same directory. These files are installed with the suffix ".example" to avoid overwriting existing configuration files. All required paths are automatically configured during the installation, so these files are a good starting point for your local modifications.

The refdbdrc configuration file can be copied from one of the templates refdbdrc.mysql.example, refdbdrc.pgsql.example, refdbdrc.sqlite.example, or refdbdrc.sqlite3.example according to your choice of the database engine.

Configuring your database server

The default installation of all supported database engines should be just fine for running RefDB. However, in some cases a little extra work is needed.

MySQL

The MySQL engine earlier than version 4.1 supports only one character encoding per server instance. The default encoding is ISO-8859-1, aka Latin-1. If you prefer a different encoding, you have to configure the server at startup. Either use the mysqld command-line option --default-character-set=charset, or add a "default-character-set=charset" entry to a suitable MySQL configuration file. A list of available encodings is usually installed as /usr/local/share/mysql/charsets/Index. In MySQL versions 4.1 and later each database (in fact, each table) may have one of various character encodings.

For security reasons many default installation allow only local connections. If refdbd has to connect to the database server from a different box, make sure to remove the --skip_networking option from the MySQL start script or from the appropriate MySQL configuration file.

PostgreSQL

Most default installations of this database server allow only local Unix sockets connections due to security concerns. However, the refdbd application server will always talk to the database server via a TCP/IP connection. Please make sure to start postmaster with the -i command line option to switch on TCP/IP support.

SQLite

The embedded database engine SQLite (versions 2.x) supports two character encodings as a compile-time option: ISO-8859-1 (Latin-1) and UTF-8. The former is the default if you don't use any configure options and if you use prebuilt binaries. If you need Unicode support, you'll have to recompile SQLite using the proper configure switch.

SQLite version 3.0 and higher uses UTF-8 as the default encoding which is just fine for the purposes of RefDB.

Creating the databases

The RefDB database contains common information that is shared by all reference databases. The following sections explain the database engine-specific steps. In all cases you have two options: The recommended way is to let refdbd handle the installation, but for special needs there is also a description how to set up the databases using the database engine clients.

MySQL

As mentioned above, the recommended way to create or update the main database is to run the following command from your root account:

	    ~$ 
	    refdbd -a -u username -w password
	  

Specify the username and password of your database administrator account.

If the default setup described above does not suit your needs, please use the following procedure instead to set up the main database.

Note

If mysqld (the MySQL database server) is installed on a remote box or if the security settings require it, you may have to use the -h hostname and/or the -u username/-p password options to run the mysql client as shown below (most fresh MySQL installations use "root" with no password as the default database administrator). mysqld needs to be up and running and you need the appropriate permissions, of course. See the MySQL documentation for further details.

Instead of using refdbd, you can also use the hard way and create the main database using your database engine client:

  • In a command line window, run the following command to create the database "refdb":

    		~$ 
    		mysql -u root -e "CREATE DATABASE refdb"
    	      
  • Then create the tables and fill in the data. For MySQL older than 4.1, run:

    		~$ 
    		mysql -u root refdb < /usr/local/share/refdb/sql/refdb.dump.mysql
    	      

    For MySQL 4.1 and later, run this instead:

    		~$ 
    		mysql -u root refdb < /usr/local/share/refdb/sql/refdb.dump.mysql41
    	      

    Adapt the path to the script accordingly if you configured RefDB to put the data directory somewhere else.

    The above command will create the tables using the MyISAM engine. This is the fastest of the supported engines, but it does not support transactions. If you prefer to use the InnoDB engine instead, use this command:

    		~$ 
    		sed 's/MyISAM/InnoDB/' < /usr/local/share/refdb/sql/refdb.X.dump.mysql41|mysql -u root refdb
    	      

    Use the highest dump file number 'X' shipped with your current RefDB version. See the MySQL documentation for further information about the table engines available with MySQL.

PostgreSQL

You must run the following command either from your root account, or from a special database administrator account (depending on your local PostgreSQL installation). Run this command to let refdbd create the main database:

	    ~$ 
	    refdbd -a -u username -w password
	  

Specify the username and password of your database administrator account.

If the default setup described above does not suit your needs, please use the following procedure instead to set up the main database.

Note

Your PostgreSQL administrator accound may not have the privileges to write to the PID file. In that case, add something like -P /var/tmp/refdbd.pid to the command line mentioned above. If postmaster (the PostgreSQL database server) is installed on a remote box or if the security settings require it, you may have to use the -h hostname and/or the -U username options to run the psql client as shown below (most fresh PostgreSQL installations on Unix-style systems use "pgsql" with no password as the default database administrator. The Cygwin port of PostgreSQL uses the name of whoever installed the package, usually "Administrator". On Debian you need to be logged in as user "postgres": first su root, then su postgres). postmaster needs to be up and running and you need the appropriate permissions, of course. See the PostgreSQL documentation for further details.

Instead of using refdbd, you can also create the main database using your database engine client:

  • In a command line window, run the command:

    		~$ 
    		createdb -U pgsql -E UNICODE refdb
    	      

    The data that you will import in the following steps are UTF-8 data. If you wish to use a different encoding, convert the dump file and adapt the above command accordingly.

  • Then run this command:

    		~$ 
    		psql -U pgsql refdb < /usr/local/share/refdb/sql/refdb.X.dump.pgsql
    	      

    Use the highest dump file number 'X' shipped with your current RefDB version. Adapt the path to the script accordingly if you configured RefDB to put the data directory somewhere else. This SQL script will generate the necessary table definitions and fill in a few values. PostgreSQL will notice you that it is going to truncate a few identifier names. It is safe to ignore these messages.

  • Access control works through user groups. To be able to access the main database, create a RefDB user group like this:

    		~$ psql -U pgsql refdb -c "CREATE GROUP refdbuser"
    		~$ psql -U pgsql refdb -c "GRANT SELECT ON CITSTYLE, POSITIONS, REFSTYLE, SEPARATORS, t_journal_words, t_meta TO GROUP refdbuser"
    	      
SQLite

Run the following command from your root account to let refdbd create the main database:

	    ~$ 
	    refdbd -a
	  

If the default setup described above does not suit your needs, please use the following procedure instead to set up the main database.

  • The default database directory is /usr/local/var/lib/refdb/db. RefDB will look here unless you selected a different data directory when configuring the application. If you want to keep your databases somewhere else, use the dbpath variable in refdbdrc and modify the following instructions accordingly.

    		~$ 
    		cd /usr/local/var/lib/refdb/db
    	      
  • Run the following command to create the database and load the data:

    		~$ 
    		sqlite refdb < /usr/local/share/refdb/sql/refdb.X.dump.sqlite
    	      

    Use the highest dump file number 'X' shipped with your current RefDB version.

The SGML/XML support files

The RefDB package comes with a few additional scripts and stylesheets for the creation of bibliographies. These files are installed in the package data directory (usually /usr/local/share/refdb) and its subdirectories, but you should spend a little time to integrate them into your SGML system.

To this end, add the catalog file /usr/local/share/refdb/refdb.cat to your SGML_CATALOG_FILES environment variable. This is a master catalog with CATALOG directives for all catalog files supplied by RefDB.

The shell scripts

The RefDB shell scripts and Perl scripts were installed in /usr/local/bin unless you chose a different install root during configure. As RefDB attempts to insert the correct settings during the build process, it should not be necessary to manually customize these scripts. If you still want to fiddle with the settings, the variables are clearly marked within a “user-customizable section†at the top of each script.

Note

If you want to use a Java XSL processor with the refdbxml script, you'll have to check the value of CLASSPATH in the script. The value must match the actual location of your .jar files and the current versions you've installed.

refdb-1.0.2/doc/refdb-manual/ch04s09.html000644 001750 001750 00000026570 12255431200 020530 0ustar00markusmarkus000000 000000 Testing your installation

Testing your installation

Now that you got this far, you surely want to see whether your setup actually works. To this end, you may want to run the following tests and see what happens. For your convenience you should perform this test in a graphical environment running at least two console windows.

  1. For our first tests it is desirable to have debug information directly available. Therefore you should start refdbd from the root account with some special parameters. Before going ahead you should make sure that you do not have a refdbd process already running, e.g. because you've setup your system to start that daemon at system startup. The following command will kill any refdbd processes. It will do no harm if no such process is running.

    	  #~ 
    	  refdbctl stop
    	

    If you see an error message saying “refdbctl: command not found†then your installation failed or your PATH environment variable is not set properly.

  2. Now that we know that there is no other refdbd process around, we'll start a fresh one with special properties: We'll run it in a separate xterm as a standalone application and have it write debug information to stderr. This way, RefDB will be slow, but we directly see what's going on.

    	  #~ 
    	  refdbd -s -e 0 -l 7
    	

    Note

    If you try to access refdbd from a different box, you should also use the -I switch to allow remote connections.

    refdbd should print some diagnostic information about its startup process and then wait for clients to connect. You may experience problems at this point if the access rights do not allow refdbd to create its PID file. This is why we run the test process as root, but if you plan to set up RefDB for use with a different account, this is a good time to check and try out these access rights. You may use the -P option to provide the path to a PID file that you have write access to in order to run refdbd from an unprivileged account.

    refdbd checks the availability of libdbi database drivers during the startup procedure. The following messages indicate a problem with libdbi:

    error while loading shared libraries: libdbi.so.0: cannot open shared object file: no such file or directory

    This is a common problem if you build your system from packages, but have to build some libraries (like libdbi, as shown here) from the sources. libdbi and most other autotools-based programs are installed into /usr/local by default. On some systems (like Debian, Ubuntu) the linker does not peek into /usr/local/lib for shared objects. To fix this, please add /usr/local/lib to /etc/ld.so.conf and run ldconfig(8), or configure the libraries to install into /usr/lib instead. See ./configure --help for further instructions.

    Unable to initialize libdbi! Make sure you specified a valid driver directory

    You should see a few lines before this message which libdbi driver directory refdbd attempted to use. Either the default directory is not where the drivers are, or you specified an incorrect driver directory.

    Initialized libdbi, but no drivers were found!

    The libdbi library was not able to locate or properly load at least one database driver. Please check the libdbi installation and make sure you've installed at least one database driver. Remember that on most systems the libdbi-drivers package is distributed separately from the libdbi package which contains only the framework, but no drivers. This error also occurs if you install driver versions which are too old for the libdbi framework.

    If refdbd successfully loads libdbi, it will list the available database drivers. Make sure the driver for the database engine you use is listed.

  3. Now switch to a different xterm and start the refdba client. The client can basically run from any user account, but the username and password settings have to be those of a database administrator. We're talking about that username and password that you would provide to the command line client of your database server (mysql or psql for MySQL and PostgeSQL, respectively) for administrative tasks. The username and password settings are either provided by the corresponding configuration file ~/.refdbarc, or by using the command line options -u <dbadmin> -p <dbadmin-password>. In the first case, that is if you set up your configuration file properly, you can just say:

    	  #~ 
    	  refdba
    	

    In the second case you have to use this instead:

    	  #~ 
    	  refdba -u <dbadmin> -w <dbadmin-passwd>
    	

    In both cases the client should start up and wait for your commands with a friendly prompt.

  4. At first you might try and see whether the RefDB programs read their configuration files properly. To this end, first run the following refdba command:

    	  refdba: 
    	  set
    	

    This will list the current settings of all configuration variables. Make sure these values are what you want. The most important variables are: username and passwd (you won't see the value of the latter for security reasons, though), as well as the host name or IP address of the box that runs refdbd. As we currently run both the server and the client on the same box, please make sure that the value of serverip is "127.0.0.1".

  5. Now try to send a command to the server. We use a command that does not require database access, but it will tell us whether we can connect to the server properly:

    	  refdba: 
    	  viewstat
    	

    Several things can happen. If you get several lines of output, telling you about the database server used and about a few refdbd variables, you're fine. This output may look like the following:

    You are served by: RefDB 0.9.4
    Client IP: 127.0.0.1
    Connected via pgsql driver (dbd_pgsql v0.7.1)
    to: PostgreSQL 7.2.1 on i386-portbld-freebsd4.3, compiled by GCC 2.95.3
    serverip: localhost
    timeout: 180
    dbs_port: 5432
    logfile: /home/markus/prog/refdb/pseudotest/log/refdbd.log
    logdest: 0
    loglevel: 7
    remoteadmin: off
    pidfile: /home/markus/refdbd.pid

    If you get the following message instead: “could not establish server connectionâ€, check that refdbd is still running and that the serverip setting in refdba is correct. If you try to access refdbd from a remote box, make sure the server was started with the -I option. The error may also result from the fact that you failed to create the common database refdb or that you did not use the appropriate database server administrator username and password when starting refdba. Finally, your system may lack the runtime client library of the database server.

    The error message “failed to connect to database server†shows that your client can talk to refdbd, but that in turn can't talk to the database server. This may be due to incorrect username/password settings or incorrect permissions with the database servers that support user authentication. If you use SQLite as the database engine, you may have specified an incorrect database directory.

    A third possible outcome of this test is the message "main database too old or corrupt". Sometimes this is just what it says, e.g. if you upgraded to a newer version without re-creating the main database although the UPGRADING file told you to do so. However, the most likely reason is an incorrect setting in the refdbdrc config file. Please check that the dbserver variable matches the database engine that you created the main database for. The default is sqlite.

This is all it takes to test the basic functionality of your setup. Everything beyond this is either site-specific setup or mere usage of the tools. Please peruse the manual, especially the hints about getting your database access rights correct.

refdb-1.0.2/doc/refdb-manual/ch04s10.html000644 001750 001750 00000026432 12255431200 020515 0ustar00markusmarkus000000 000000 SRU support

SRU support

In addition to its native clients, RefDB also supports optional read access through a web-based search protocol called SRU (Search and Retrieve via URL). There are two options to enable SRU access. We'll first describe a CGI script which is the preferred way but requires a running web server on your system. The subsequent section describes a simpler standalone server for testing purposes and for single-user access.

Setting up SRU support as a CGI program

In order to provide SRU services at your site, you need to add a CGI script to your web server. The following instructions assume that you use Apache as your web server. However, the CGI script will work just fine with any other web server that provides CGI support.

Configure your web server

If your web server is already set up to run CGI scripts, you might be all set to run the SRU CGI script as well. If you're not sure, follow the instructions below and check whether the your configuration file already has the relevant entries.

The Apache web server uses a configuration file called httpd.conf. On many systems this file is located in /usr/local/etc/apache. Locate the section starting with "<IfModule mod_alias.c>" and make sure it declares a CGI directory:

    ScriptAlias /cgi-bin/ "/usr/local/www/cgi-bin/"
	

You can choose a different directory, but the directory listed here must exist and be accessible from the account the web server runs in (often "www" or "nobody").

Now you have to allow the execution of CGI scripts in that directory:

    <Directory "/usr/local/www/cgi-bin">
        AllowOverride None
        Options ExecCGI
        Order allow,deny
        Allow from all
    </Directory>
	

Finally, you have to restart your web browser to let these changes take effect:

~# apachectl restart

Install the SRU CGI script

First you need to make sure the /cgi-bin/ directory configured above exists and has the proper permissions. Local habits may vary, but you should see something like this:

~# ls -ld /usr/local/www/cgi-bin
drwxr-xr-x  2 root  wheel  512 Mar 13 14:56 cgi-bin
	

Note

In the Apache default installation /usr/local/www/cgi-bin is a symbolic link to an example CGI directory. Remove the symlink and create a real directory with the appropriate ownership and permissions instead.

Now copy the scripts/refdbsru CGI script into that directory and make it executable for all:

~# cp refdbsru /usr/local/www/cgi-bin
~# chmod a+x /usr/local/www/cgi-bin/refdbsru
	

All SRU replies are XML files. This is just fine if the requesting agent is a program that intends to further process the data, or to store them somewhere. If the requesting agent is a web browser with a human being in front of it, the plain XML output is a bit hard on the eyes though. It is recommended to provide XSLT stylesheets which can render the XML output in a human-readable HTML format (most current web browsers support XSLT these days). These stylesheets are used by default, unless a user provides the URL of a stylesheet of his own.

Unless you already have a designated folder for system-wide stylesheets, just create one, and make sure it is readable:

~# mkdir -p /usr/local/www/data/styles
~# chmod a+r /usr/local/www/data/styles
	

Now copy the example stylesheets shipped with RefDB (installed in /usr/local/share/refdb/sru) into that directory:

~# cp refdbsru.xsl mods.xsl risx.xsl refdbsru.css /usr/local/www/data/styles
	

Needless to say, you can tweak all these stylesheets to your heart's content.

Finally you should provide a configuration file called refdbsrurc which usually goes into /usr/local/etc/refdb/. You'll find a preconfigured example file in the same directory which you can copy and edit. Make sure the xslurl variable points to the refdbsru.xsl file that you've just installed. The value of this variable is an absolute or relative URL in the filesystem of the web server. If your setup is as described above, /styles/refdbsru.xsl will work just fine. It is recommended to set the variables starting with zeerex_ to meaningful values. These values determine part of the output of the explain SRU command and are supposed to provide the users of your site with useful information about your SRU service.

Tune the SRU CGI script

From refdbd's point of view, the refdbsru CGI script is just another client. The script therefore requires a similar configuration file like the other clients, and it needs a database account to work with. For the configuration of the script, see the refdbsru reference.

As SRU provides only read access to your databases, it is recommended to create a separate database account for SRU accesses which all SRU users share. If you specify these values in the configuration files, the SRU users will not have to provide any login information. You may want to restrict that account to read access only using the appropriate switch of the adduser command.

Test the SRU CGI script

Open your favourite web browser and enter the following URL:

localhost/cgi-bin/refdbsru

You should now receive an XML document that describes the RefDB SRU service. If you receive a web server error instead, retrace your steps above and make sure you have restarted the web server before testing. If nothing else helps, please peruse the documentation of your web server. The appropriate document for Apache is the CGI HowTo.

Finally, you should advertize the new service on your web site. Provide a link to "<hostname>/cgi-bin/refdbsru" along with some instructions how to use SRU, as explained in the user manual.

Setting up SRU support using a standalone web server

RefDB also provides a standalone web server to run the SRU service. All you need to do in terms of "installation" is to create or edit the SRU configuration file that the standalone server shares with the CGI application. See also the refdb-sruserver reference. Then start the SRU server like this:

~# [perl] refdb-sruserver

The server will run in the foreground until you kill it with Ctrl+c. Now point your web browser to:

localhost:8080

As you can see, the SRU server uses the non-standard port 8080 so it does not interfere with any regular web server. This also means that the standalone SRU server is usually not accessible from a remote computer unless you configure your firewall appropriately. However, as long as you connect locally you should receive the output of the SRU explain command.

refdb-1.0.2/doc/refdb-manual/ch04s11.html000644 001750 001750 00000013612 12255431200 020512 0ustar00markusmarkus000000 000000 Install the PHP interface

Install the PHP interface

If you want to provide interactive access to your RefDB databases through the web, consider installing the PHP web interface. This web frontend provides a convenient way to perform the most common user tasks, like running queries or adding datasets.

Prerequisites

Please check the following prerequisites on your computer before attempting to install the PHP interface

Web server

Any web server that is capable of running PHP scripts. If you don't run a web server anyway, Apache is always a good choice to start with. Both versions 1.3.x and 2.x will work just fine.

PHP interpreter

You need PHP5, the older PHP4 won't do. When building PHP, make sure to configure the software appropriately so the php5 Apache module gets built. If you install a prebuilt package, you may have to select an extra package that contains the appropriate module for your web server.

With the exception of session support, the RefDB PHP interface relies solely on core features of PHP5. You may therefore have to install PHP5 session support separately. However, on some systems like FreeBSD, "core" does not mean "it's there". If the PHP5 core is split into several packages, you may also have to install DOM, XML, and XSL support separately.

Web server configuration

The following instructions assume that you use Apache as your web server. The configuration file is usually /etc/apache/httpd.conf or /usr/local/etc/apache/httpd.conf.

  • Locate the section "Dynamic Shared Object (DSO) Support". Check if the php5 module is loaded anyway. If not, add a line like the following:

    LoadModule php5_module    libexec/apache/libphp5.so
    	  
  • The subsequent section in the config file needs to be updated too if you had to add the php5 module:

    AddModule mod_php5.c
    	  
  • Further down there should be a section containing Aliases. Create a new one within this section like this:

        Alias /refdb/ "/usr/local/share/refdb/www/"
    
        <Directory "/usr/local/share/refdb/www">
            AllowOverride None
            Order allow,deny
            Allow from all
            AddType application/x-httpd-php .php .phtml
        </Directory>
    	  

    The paths point to the files that RefDB installs with all other shared files. If you intend to customize or modify the interface, you can copy the files to a directory in your home folder and change the directories in the config file accordingly.

  • Finally you'll have to let the Apache server re-read it's configuration file:

    ~# apachectl restart

Test your PHP interface

To see the PHP interface in action, first make sure that the RefDB application server is running:

~# refdbctl start

Now start your web browser and point it to:

localhost/refdb/

Please note the trailing slash! Now you should be greeted by the login screen.

refdb-1.0.2/doc/refdb-manual/ch05.html000644 001750 001750 00000013626 12255431201 020174 0ustar00markusmarkus000000 000000 Chapter 5. refdbd administration

Chapter 5. refdbd administration

This chapter will explain the usage of refdba for the administration of refdbd. Please refer to the reference chapter about refdba to learn about command-line switches and interactive commands of this application.

Create a database

Create new databases with the refdba command createdb foo. The new database will be empty initially. If you start adding datasets, the first dataset will have the ID 1.

In order to access the new database, users need to have their access rights set accordingly.

Due to restrictions of the database servers and of the way database names are encoded in refdb SGML/XML/LaTeX documents, the names of the databases should be treated as case-insensitive and should not contain colons (':').

Some database engines support different character encodings. In this case you can use the -E option to select an appropriate encoding. See the documentation of your database engine for available encodings.

Tip

Your SQL database server may manage more databases than your refdb databases. In this case it may be prudent to use a common prefix for all refdb reference databases that you create. By providing a simple regular expression to the listdb command, the execution time may drop considerably.

refdb-1.0.2/doc/refdb-manual/ch05s02.html000644 001750 001750 00000005421 12255431200 020512 0ustar00markusmarkus000000 000000 Delete a database

Delete a database

Delete existing databases with the refdba command deletedb foo.

Warning

The contents of the database as well as the database structure will be gone completely. This is different from deleting all datasets. The latter will leave the database structure intact so you can add references again. The former will force you to create a new database before you can add references again.

Usually this command also removes any permissions to the given database that you have granted to users. If you re-create a database with the same name later, you will have to grant permissions again.

refdb-1.0.2/doc/refdb-manual/ch05s03.html000644 001750 001750 00000021603 12255431201 020514 0ustar00markusmarkus000000 000000 Add or remove a user

Add or remove a user

Add users

Adding a user means to allow a user, identified by a database user name and optionally by a password, to read and to modify a particular refdb database.

Note

Both the database user name and the database password may be different from the login name and login password used to get access to the operating system.

Some database engines like SQLite do not support access control. There is no need to add or remove users with these database engines.

refdb uses the access control facilities of the database server. Therefore, the details of adding a user differ slightly between MySQL and PostgreSQL. In any case, refdb is designed to simplify user management as far as possible. This is mainly achieved by combining the information necessary to authenticate a user and the information necessary to grant access to specific database objects into a single command, the adduser command of refdba. This command also silently takes care of the fact that users need access to an internal refdb database in addition to the specified reference database.

Database servers use the username, optionally a password, and the host a user tries to connect from to authenticate a user. From the database server's point of view, refdbd is the database client that actually connects to the server, not the refdb clients refdba, refdbc, and refdbib. Database servers usually distinguish between local connections (i.e. by users logged into the same computer) and remote connections (i.e. all connections via TCP/IP). If both refdbd and your database server run on the same computer, all connections will be local and the host-based access control is fairly simple, as both MySQL and PostgreSQL allow local connections by default. All you need to do is:

refdba: adduser -d foo jack -W newpass

This will allow the new user "jack" to connect to the database server and to access the contents of the database "foo". "jack" has to identify himself by providing the password "newpass" when starting a refdb client.

Note

If a user is already known to the database server, e.g. if he already has access to a different database, you don't have to specify the password again. If you do provide a password, the password of that particular user will be changed to the new one.

Things get a tad more complicated if refdbd and your database server do not run on the same computer. As this is where MySQL and PostgreSQL differ, we'll look at these two cases separately.

MySQL

On many operating system distributions, MySQL is configured to accept only local connections. Either the mysqld process is started with the --skip-networking option, or the my.conf configuration file contains the corresponding option skip-networking. In order to allow remote connections, please remove these options from your system.

MySQL allows to alter the host-based component of access control through the SQL interface. The adduser command has an additional option -H to specify the host or the network where refdbd runs:

refdba: adduser -d foo -H % jack -W newpass

In this example, refdbd may run on any host. You can as well specify a subnet (-H 192.168.1.%) or one specific host (-H mono.mycomp.com).

PostgreSQL

By default, PostgreSQL will accept only local connections. To allow remote connections, the postmaster process must be started with the -i option. Change your start scripts accordingly.

The host-based component of access control is not available through the SQL interface in this database server. The -H option of the adduser command is therefore ignored. Instead the database administrator has to edit the configuration file /home/pgsql/data/pg_hba.conf. The following entries would:

  • Allow local access (i.e. refdbd and postmaster run on the same computer) to the databases refs and refdb. The latter is an internal refdb database that users must be able to access. Users must provide a password.

  • Allow access to the databases refs and refdb through refdbd instances that run somewhere in the network "192.168.1.0". Users must provide a password.

#   host  DBNAME  IP_ADDRESS  ADDRESS_MASK  AUTH_TYPE  [AUTH_ARGUMENT]
local refdb                            crypt
local refs                              crypt

host  refdb  192.168.1.0 255.255.255.0 crypt
host  refs    192.168.1.0 255.255.255.0 crypt
	

The default pg_hba.conf file allows local access to all databases without password protection. This may not be what you want. The file contains a bunch of helpful comments, though. You may also want to peruse the PostgreSQL documentation for more information about host-based access control.

Remove users

This is done with the deleteuser command. The access rights will be revoked for the specified username and database. No other access rights will be modified. The following command will revoke the access rights of user "jack" on the database "foo".

refdba: deleteuser -d foo jack

Keep in mind that user "jack" still can access the refdb main database refdb and any other databases he was granted access to.

If you use MySQL as your database server and refdbd runs on a different box than mysqld, you also have to specify the host or network with the -H option, just like when you added the user in the first place. See the Add users section for the specifics.

refdb-1.0.2/doc/refdb-manual/ch05s04.html000644 001750 001750 00000012602 12255431201 020514 0ustar00markusmarkus000000 000000 Configure the application server

Configure the application server

There are several ways to configure the application server refdbd to your needs. Two of these ways will modify the behaviour at startup, while the remaining two ways will reconfigure the server only for the duration of the current run.

Configuration at startup

There are two ways to permanently change the refdbd configuration. First, you can edit the configuration file which holds the default values. Second, you can modify the command line parameters in the script that starts refdbd in the first place (e.g. an init.d script).

Reconfiguring a running refdbd process

Again there are two ways to reconfigure an already running refdbd server. The recommended way is to send a HANGUP signal to the server (kill -HUP pid) after editing the configuration file. You can send the signal either manually or use the refdbctl script instead. This of course requires that you have a shell on the machine running refdbd. This should not be a problem if you sit in front of that machine. If you don't, and you can't do a remote login (e.g. because it is not supported, as on Windows), this won't help. In that case you may use the second possibility. refdb supports remote administration via refdba if refdbd is started with the appropriate parameter. This allows you to use the refdba confserv command to reconfigure the server.

Note

The current implementation of the access control to use the confserv command requires the refdb administrator to be a database server administrator. This is different from being root on the machine.

You can change the settings for the timeout and the settings for the logging facility.

refdba: confserv timeout 60

This will set the timeout to 60 s, i.e. a client-server connection has to be stalled for 60 seconds before refdbd gives up.

refdba: confserv loglevel 7

This will set the log level to 7.

refdba: confserv logdest 1

This will set syslog as the log info destination.

refdba: confserv logfile /var/log/mylog

This will use /var/log/mylog as logfile if logdest is set appropriately.

refdb-1.0.2/doc/refdb-manual/ch05s05.html000644 001750 001750 00000010711 12255431201 020514 0ustar00markusmarkus000000 000000 Add, edit, or delete bibliography styles

Add, edit, or delete bibliography styles

This task is currently restricted to the system administrators in order to prevent users overwriting each others bibliography styles. A more appropriate solution will be implemented later to allow users uploading their own styles.

Use the refdba command addstyle to add one or more bibliography style files to the database. Existing styles with the same name will be overwritten without a warning, so you should check with the liststyle command before you go ahead.

Note

The name of a bibliography style is encoded in the XML file. The filename of the bibliography style is irrelevant here. Use grep STYLENAME to see which bibliography styles are defined in a file and check with the liststyle command whether they're already defined in the database.

Warning

refdb uses a non-validating parser to load bibliography styles into the database. It is your responsibility to validate the files before you add them. Adding invalid styles may have undesired and unpredictable results.

The refdba command getstyle retrieves one or more bibliography styles as XML documents. In order to edit an existing bibliography style, simply retrieve the style with the getstyle command, edit the XML document as necessary, and add it again with the addstyle command. As stated above, this will overwrite the existing style definition.

Use the refdba command deletestyle to remove one or more bibliography styles from the database. The argument for this command is a Unix regular expression. All styles whose name match the regular expression will be deleted.

refdb-1.0.2/doc/refdb-manual/ch05s06.html000644 001750 001750 00000024257 12255431201 020527 0ustar00markusmarkus000000 000000 Logging data

Logging data

The refdb programs can spill out quite a lot of log messages to keep track of what is happening in your programs. This section explains the basics of setting up your message logging.

What to log

The application server refdbd as well as all command-line clients can generate log messages. Message logging is most important for two purposes:

  • Keep track of non-interactive programs. This includes refdbd as well as all client-side tools if they are run from scripts.

  • Track down bugs or user errors.

A useful approach is to log all messages with a log level (explained below) of 6. This would give you a good overview over the usage of these programs but would not clutter the log files with debug information. Switch to log level 7 only if you suspect a bug or some user error and need the full debug information to understand the problem.

For the interactive use of the clients logging is usually not necessary, so you'd use a log level of -1 to prevent logging altogether or a log level of maybe 3 or 4. In the latter case you'd get log messages only if something goes badly wrong. Again, if you encounter bugs or user errors you may switch on debug messages by using a log level of 7.

Destinations

There are three possible destinations the log messages can be sent to. Select the proper destination with either the logdest variable in the configuration file or the -e switch on the command line. In both cases the values in the following list are accepted. You may use either the numerical value or the case-insensitive string in brackets, e.g. -e 1 and -e syslog are equivalent.

0 (stderr)

stderr is mostly useful for debugging purposes when refdbd is run as a standalone process and when clients are run interactively. stderr does not make much sense if you run refdbd as a daemon (daemons detach from the console at startup, so all output to stderr is lost).

1 (syslog)

Sending the data to syslog integrates the log data with the rest of your system's log output. The log messages will be sent to the user facility, which usually is configured to write to /var/log/user.log. See the syslog(8) man page for information how to configure the syslog facility.

Note

If you run refdbd on Cygwin, the syslog messages are sent to the application message list in the NT message logging system. If you are used to going through your log output with tools like grep and awk, you may find it more useful to write to a custom log file instead.

2 (file)

You can define the full path of a custom log file with either the logfile configuration file parameter or the -L command line option. By default, refdb applications write their log output to /var/log/<appname>.log. Make sure to set the appropriate access rights for these log files.

Note

Some libraries used by refdb, e.g. the PostgreSQL client library, send log messages to stderr. This is not controlled by the log settings of refdbd. The same PostgreSQL log messages show up in the PostgreSQL log which is usually sent to /var/log/pgsql.

Log levels

You can select how verbose the log output of refdbd will be. You can do this by either setting the loglevel configuration file variable or the -l command line option to an appropriate value. You may either use the numerical value or the case-insensitive string as explained in the table below. E.g. -l 5 and -l notice are equivalent. Set the log level to -1 to disable logging completely. Use a value from 0 through 7 to generate increasingly verbose log output. The definitions of the log levels are taken from the include file syslog.h:

Table 5.1. Log level definitions

levelverboseexplanation
0emergsystem is unusable
1alertaction must be taken immediately
2critthe system is in a critical condition
3errthere is an error condition
4warningthere is a warning condition
5noticea normal but significant condition
6infoa purely informational message
7debugmessages generated to debug the application

Setting the log level to a given value means that all messages with a priority level up to the given value will be logged. E.g. if you set the log level to 6 (which is a reasonable default value), all messages with a priority from 0 through 6 will be logged, whereas messages with a priority level of 7 will be ignored.

Warning

Use log level 7 with caution. The amount of log messages is considerable and sufficient to slow down the application. You should not use this level in everyday use, only to track down bugs or user errors that you may encounter.

Interpreting the log information

If the messages are sent to stderr, only the message proper will be printed. If the messages are sent to the syslog facility, the default format including the process name and process ID is used.

A line in the custom log file looks like this:

6:pid=267:Sun Jul 22 18:39:52 2001:application server started

You will easily recognize the following fields:

message_priority:process_id:time:message
message priority

This is the priority assigned to the message by refdbd. The values are explained above.

process ID

This is the process ID (as seen in the ps ax listing) of the refdb process that generated the message. In the case of refdbd this may either be the parent process (the one that generated the above "application server started" message) or one of the children that are forked off to answer client requests.

time

This is the full time and date information when the message was generated.

message

This is the message text proper.

The message entries are sufficiently structured to allow easy access to the information with the standard Unix tools like awk and grep.

refdb-1.0.2/doc/refdb-manual/ch05s07.html000644 001750 001750 00000026322 12255431201 020523 0ustar00markusmarkus000000 000000 Security issues

Security issues

This section briefly discusses some security-related issues that you might want to think about as an administrator. We'll look at the access control provided by the external database servers MySQL and PostgreSQL.

Note

The embedded database engine SQLite does not provide built-in access control. All you can do is use chown and chmod to restrict access to the database files. There is no way to restrict access through refdb.

Passwords

refdb tries to support the security features of the SQL database servers as far as possible. This includes the username/password-based access rights scheme (not much surprise here). Since version 0.6.0 the passwords are no longer transmitted as plain text between the clients and the server (but you can request the old behaviour using the -x command line options since version 1.0). This means that it now makes sense to keep the passwords secret. There are several ways to specify the password when starting a refdb client. These ways differ with respect to the security of the passwords and are listed here in the order of increasing security:

Specify the password on the command line

The password is stored nowhere on the filesystem and thus pretty secure from this point of view. But the full command line can be viewed with the ps command by any user on the system, so the unencrypted password is basically world-readable at least for a very brief period until the applications have a chance to hide the string.

Store the password in the personal configuration file

This way the password is protected from other users who habitually run the ps command just for the heck of it. But now it is stored unencrypted on the hard drive, and you must make sure that no one else can read the configuration file (no group or world read access).

Specify the password interactively

This is the default behaviour if the password is not specified either in the configuration file or on the command line. The refdb client will ask for the password. This is certainly the most secure way to provide a password, but this won't work if you run the clients unattended via scripts.

Database server access control

It is beyond the scope of this manual to reiterate the security models of the database servers, but you need to keep in mind a few aspects relevant to refdb.

  • One component of the database server access control is based on the host from which you connect to the database server. This is partially circumvented by the refdb three-tier design. Keep in mind that only refdbd communicates with the database server. Therefore only the host where refdbd runs is relevant for the access control. There is currently no system in place for checking whether a client is allowed to connect to the refdbd application server from a particular host.

  • Both MySQL and PostgreSQL distinguish between local and remote connections. Access needs to be granted separately if you want to use both local and remote connections

    Note

    On many operating systems the default installations of MySQL and PostreSQL do not allow remote connections for security reasons. You need to manually allow remote connections as described below.

  • The refdba commands to remotely reconfigure a running application server are currently protected by a simple table access test. In any serious database server installation, only the database administators have read access to certain system tables. The current implementation of this check requires that you have access to this table if you want to run the confserv commands. You should be aware that if the access rights are set up improperly, you may also allow everyone and their grandma to stop or reconfigure the refdbd application server. If you cannot restrict read access to system tables for whatever reason, you should not enable refdbd remote administration (default is off) and use the kill command or the refdbctl script instead.

  • Most of the refdba commands require database administrator rights.

MySQL

If you run MySQL as your database server, these things apply as well:

  • When adding users with the adduser command the -H option has to specify the box where refdbd runs as the host, not the box from where the user will run the clients. If you do not specify a host, "localhost" is assumed. This works on some platforms (e.g. FreeBSD 5.4), but not on others (e.g. Fedora Core 4). In the latter case you may have to specify the hostname explicitly.

  • To allow remote connections to the database server, the MySQL configuration file my.cnf must not contain the option "skip-networking", and the start script must not use the command-line option --skip-networking. Many operating systems use one of these methods in default installations to restrict access to local users for security reasons.

  • If you install and run MySQL yourself, you should not use the default database administrator account. The name (root) is widely known and by default this account is not password-protected. To make your database server secure, please create a new database administrator account with a different name and specify a password.

PostgreSQL

If you run PostgreSQL as your database server, these hints are for you:

  • The host-based part of the PostgreSQL access control is not accessible through the SQL interface. Therefore, the refdba command adduser cannot provide the host information (in other words, the -H is ignored).

    Instead, the host-based part of the access control is specified in the PostgreSQL configuration file, usually /home/pgsql/data/pg_hba.conf. On most operating systems, the default configuration allows unrestricted access for all users on the local system, but no remote access. Use something like the following entries to enforce usage of passwords for both local access and remote access from the network 192.168.1.0 to refdb and a reference database "refs":

    #   host  DBNAME  IP_ADDRESS  ADDRESS_MASK  AUTH_TYPE  [AUTH_ARGUMENT]
    local refdb                            crypt
    local refs                              crypt
    
    host  refdb  192.168.1.0 255.255.255.0 crypt
    host  refs    192.168.1.0 255.255.255.0 crypt
    	    

    As mentioned previously, only the host where refdbd runs is relevant for the host or network entries in the configuration file.

    Make sure to read the PostgreSQL documentation to get your access control right.

    Note

    Please keep in mind that postmaster (the PostgreSQL database server parent process) needs to be started with the -i option to accept remote connections at all. Most default installations do not use this switch to increase security.

  • If you install and run PostgreSQL yourself, you should not use the default database administrator account. The name (pgsql) is widely known and by default this account is not password-protected. To make your database server secure, please create a new database administrator account with a different name and specify a password.

refdb-1.0.2/doc/refdb-manual/ch05s08.html000644 001750 001750 00000010741 12255431201 020522 0ustar00markusmarkus000000 000000 How to run several refdb instances

How to run several refdb instances

In all but a few cases, having one refdbd daemon per network is absolutely sufficient. However, there are a few cases where you may end up running more than one instance of refdbd on the same computer at the same time:

  • You want to provide access to more than one database engine. The only good reason to do this may be to test-drive a different database engine.

  • You want to test-drive a new refdb release without interrupting the access to your installed version

  • You do not want to run refdbd as a daemon serving all users. Instead, each user should be able to run his own copy of refdbd

You'll have to configure each refdbd process individually. If each user starts his own copy of the application server, private .refdbdrc configuration files in the users' $HOME directory allow a simple setup. If you want to run more than one daemon as non-user-processes, you cannot safely use the refdbctl script to control the instances. Instead you should start and stop the daemons manually and use the appropriate command-line options to configure each process individually. The options which need to be set differently whenever more than one refdbd instance runs on the same box are:

  • -D, -i, and-b to set the database engine, IP address, and the port it listens on, respectively. Only required if you fiddle with two different database engines.

  • -e and -L to use separate log files for the two instances. This may be easier to evaluate than using syslog, although the processes can be distinguished by means of their process ID.

  • -P to use separate PID files

  • -p to set the port each refdbd instance listens on. The ports must be different, otherwise clients can't select which instance to connect to.

On the client side you'll need only set the port configuration variable or use the -p command line option to select the application server instance that you want to connect to.

refdb-1.0.2/doc/refdb-manual/ch05s09.html000644 001750 001750 00000013177 12255431201 020531 0ustar00markusmarkus000000 000000 Backup your data

Backup your data

If your database crashes for whatever reasons, the first question you'll hear is: "You've got a backup, don't you?". At this point in your life you shouldn't even think about not having a backup.

There's basically two ways to create a backup of your reference data: Use a risx dump or use a SQL dump. The risx dump is slower but it would allow you to transfer the data to a refdb installation using a different database server. The SQL dump is faster but you're tied to the database server you're using. If you use SQLite as your database backend, you may simply grab copies of the database files. Each database is stored in one file. This file holds all required information and is platform-independent, so it is suitable for backup purposes.

Warning

Backups are useful only if you create them regularly. You should work out a schedule based on how often the contents of the database change. Think about setting up a cron job for nightly or weekly snapshots.

Creating a risx dump

All you need to do is to retrieve all references and write them to a file in risx format. Use the getref command in refdbc for this purpose:

	refdbc: 
	getref -t risx -s NOHOLES -o all.ris :ID:>0
      

The -s NOHOLES option will dump skeleton references for references that you deleted from the database. This simplifies re-creating the same ID values in a new database.

Creating a SQL dump

This is best done with the command line tools shipped with you database server. You should consult the manual of your database server, but the following commands should be all it takes:

If you run MySQL as your database server, run:

	$ 
	mysqldump -u root -p --opt dbname > dbname.dump
      

This assumes that "root" is the name of your database administrator account and "dbname" is the name of your database.

If you run PostgreSQL instead, use this command:

	$ 
	pg_dump -u pgsql -C dbname > dbname.dump
      

This assumes that "pgsql" is the name of your database administrator account and "dbname" is the name of your database.

To restore a database from a dump, use the command line clients shipped with your database server. For MySQL, the required sequence is:

	$ 
	mysql -u root -p -e "CREATE DATABASE dbname"
      
	$ 
	mysql -u root -p dbname < dbname.dump
      

whereas the following would do the trick with PostgreSQL:

	$ 
	psql -u pgsql template1 < dbname.dump
      

Tip

SQL dumps are also well suited to create backups of refdb, the common refdb database.

refdb-1.0.2/doc/refdb-manual/ch06.html000644 001750 001750 00000016102 12255431202 020166 0ustar00markusmarkus000000 000000 Chapter 6. Overview of the RefDB command-line clients

Chapter 6. Overview of the RefDB command-line clients

There are several client applications, each one performing a self-contained subset of tasks. This chapter provides a short overview over common features of the clients. Please refer to the reference chapters about refdba, refdbc, and refdbib for the nitty gritty details.

Note

This manual covers only the clients shipped with RefDB. Please visit the RefDB website for other options. Currently there are tools for both Emacs and Vim which turn these editors into integrated authoring tools with bibliography support.

The clients serve the following purposes:

refdba

The system administrator's tool to create or delete databases, set access rights, and view all kinds of statistics.

refdbc

The client for adding, editing, deleting, and searching reference entries.

refdbib

The tool to create bibliographies.

refdbc and refdba can be run in an interactive mode where they provide their own command line, similar to a command-line FTP client for example. They use the GNU readline library with its powerful and convenient editing and history capabilities. In a nutshell, you can edit commands on this built-in command line as you can do in your bash or in the Emacs minibuffer. You can scroll through the history of your previous commands with the arrow keys, you can use the tab key to complete command names and filenames, and you can use Ctrl+r to search the history with a regular expression. For further information you should consult the readline manual.

refdba and refdbc can also be run in batch mode. You can specify one of the built-in commands as an argument to the -C option and pipe or redirect data into stdin. This is very useful if you want to automatize tasks using shell scripts.

refdbib does not have an interactive mode and can be run only in batch mode. The result will be written to stdout. However, you'll hardly ever run refdbib directly, as RefDB ships with convenient scripts and Makefiles for this purpose.

Quickstart guide

These are the essential steps to get up and running as a RefDB user:

  1. Ask your RefDB administrator to grant access to an existing reference database or have him create one for you.

  2. If the application server refdbd is not installed to run as a daemon, start it now: refdbd -s & (see Starting refdbd for more options).

  3. Start the refdbc command line client to manage and retrieve references.

  4. Add references to the database.

  5. Retrieve references according to your search criteria.

  6. Create bibliographies with the references in your database.

Note

There is a tutorial for first-time users available at the RefDB documentation page.

refdb-1.0.2/doc/refdb-manual/ch06s02.html000644 001750 001750 00000015402 12255431202 020515 0ustar00markusmarkus000000 000000 The interactive mode of refdba and refdbc

The interactive mode of refdba and refdbc

For informations how to start these clients from the command line, please see the sections about refdba and refdbc.

If you did not specify a password in the corresponding configuration file or with the -w command line switch (see later in this chapter), the clients will at first prompt you for a password. This is the password to access the database which may be different from your login password. To protect your password from prying eyes, it will not be echoed on the screen while you type it, so no one can even see the length of your password. If your database account was set up without password protection, just press enter now.

Note

If you run a client in batch mode and send data to stdin, the interactive password prompt will not work. Please use the configuration file or the -w option to specify the password in this case.

Then you will be faced with a command prompt similar to the one in your shell. The client waits for you to enter commands. If it just escapes you which commands are available, use the help command (or ? for the lazy among us) to see a list.

The general format of a command is:

command [-x option-argument...] [argument...]

Commands may thus have options and arguments. The options have the general style -x [option-argument]. They consist of a dash followed by one character. Options are case-sensitive. The option may be followed by an option-argument. This has to be enclosed in quotation marks if it contains spaces. The order of the options and arguments on the command line is arbitrary. Options without arguments can be combined, e.g. you may write -xy instead of -x -y.

The command line of the RefDB interactive clients uses the GNU readline library. This offers you a functionality similar to the bash command line or the Emacs minibuffer. By default the Emacs keybindings are active, allowing you to conveniently edit your command. You can scroll through a history of previous commands. You can use the Tab key to try a completion of a partially entered token. If it is the first token on the command line, the clients try to complete a command. If it is any other token, the clients try to complete a filename.

When a command is sent to the application server, the client waits for the result of the command. This may take some time, depending on the load of the application server and of the database server. Network problems or a server crash may result in a timeout. The client will in this case return to the command prompt after a configurable time.

If everything runs smooth, you will see the results of your command. Short results of only a few lines will simply be sent to stdout. Results that may cause the terminal to scroll parts of the result off the screen will be piped through a pager of your choice. Depending on the pager, you can jump back and forth in the results and perhaps save the result or part of the result in a file or pipe it to another program. It may be necessary to press some button (like q in less) to get back to the command prompt when you're done. Instead of a pager you can specify any other program that accepts data on stdin, so you can e.g. preprocess the output with grep before you display it with a pager ("plumbing", i.e. piping through several applications, is of course possible). Some commands have a switch to redirect the output into a file without displaying it on the screen.

If you output large amounts of data through a pager, the pager may refuse to read on before you scroll through. In this case, a timeout would result and the data would be incomplete. The best way to deal with large amounts of data is to send them to a file and inspect them afterwards. You can use the command tail -f outfile to view the data in another console window while they arrive.

refdb-1.0.2/doc/refdb-manual/ch06s03.html000644 001750 001750 00000010472 12255431202 020520 0ustar00markusmarkus000000 000000 The non-interactive mode of refdba and refdbc

The non-interactive mode of refdba and refdbc

These are the main features of the non-interactive (or batch) mode:

  • You have to specify a command name with the -C option. Specify all options that the command would take in an interactive session as additional options on the command line. The client will execute this command and exit.

  • The clients accept the input for some commands on stdin. If input is available on stdin, be it through a pipe or from a redirected file, this input will be used and any input from a file with the -f option will be ignored. As mentioned previously, the automatic detection of data on stdin does not work on a few platforms like Windows/Cygwin. In this case, please use the -f stdin option to make the client read from stdin.

  • The main purpose of the batch mode is to run the clients from shell scripts (or Perl or PHP if you prefer). You can figure out scripts of arbitrary complexity to interact with your reference database.

    Note

    You will still be prompted for a password unless you specify one with the -w or in the configuration file. Both ways are considered less secure than typing it on the password prompt, but this is a tradeoff if you want unattended operation. Please keep also in mind that the password prompt will fail if you send data to stdin.

Example

The following command runs refdbc and uses the getref command to retrieve references by the author "Miller", using the database "refs" and requesting the RIS output format as well as the abstracts.

	~$ 
	refdbc -d refs -t ris -s AB -C getref :AU:=Miller
      
refdb-1.0.2/doc/refdb-manual/ch06s04.html000644 001750 001750 00000005176 12255431202 020526 0ustar00markusmarkus000000 000000 The non-interactive mode of refdbib

The non-interactive mode of refdbib

refdbib is a somewhat simpler "filter"-style application. It accepts data either at stdin or from a file whose name is specified on the command line. The output always goes to stdout and can be piped to other applications or redirected into a file as you need it. For an overview of the command-line options, please see the section about starting refdbib. Keep in mind that the runbib script offers a simpler and more versatile way to run refdbib.

refdb-1.0.2/doc/refdb-manual/ch06s05.html000644 001750 001750 00000021511 12255431202 020516 0ustar00markusmarkus000000 000000 Common command-line options for all clients

Common command-line options for all clients

All clients share a common set of command-line options. The command-line options override the corresponding settings in the configuration files. Please see the chapters about the individual applications in the Reference manual for all application-specific options.

All clients use the GNU getopt library to parse the command line. Switches can be combined (-abc is the same as -a -b -c) and the sequence is arbitrary (-a -b is the same as -b -a). All options are case sensitive (-A is not the same as -a).

-c command

The command line of the pager that is to be used. Instead of a pager you can of course specify any valid command that accepts data on stdin. Use “stdout†to request data output to stdout. This is the default, but you may want to specify it on the command line if you need to temporarily override a default pager setting in your configuration file.

-e logdest

logdest can have the values 0, 1, or 2, or the equivalent strings "stderr", "syslog", or "file", respectively. This value specifies where the log information goes to. "0" (zero) means the messages are sent to stderr. They are immediately available on the screen but they may interfere with command output. "1" will send the output to the syslog facility. Keep in mind that syslog must be configured to accept log messages from user programs, see the syslog(8) man page for further information. Unix-like systems usually save these messages in /var/log/user.log. "2" will send the messages to a custom log file which can be specified with the -L option.

-h

Displays help and usage screen, then exits.

-i IP-address

Set the IP address of the box which is running the application server (refdbd). Instead of the IP address you can also specify the hostname as long as it can be properly resolved by your system.

-l loglevel

Specify the priority up to which events are logged. This is either a number between "0" and "7" or one of the strings "emerg", "alert", "crit", "err", "warning", "notice", "info", "debug", respectively (see also Log level definitions). "-1" disables logging completely. A low log level like "0" means that only the most critical messages are logged. A higher log level means that less critical events are logged as well. "7" will include debug messages. The latter can be verbose and abundant, so you want to avoid this log level unless you need to track down problems.

-L logfile

Specify the full path to a log file that will receive the log messages. Typically this would be /var/log/<appname>.

-p port

Set the port of the box which is running the application server

-q

Start without reading the configuration files. The client will use the compile-time defaults for all values that you do not set with command-line switches.

-T time

Set the timeout for client/application server dialogue in seconds. A connection with unsuccessful read or write attempts will be considered as dead and taken down after this amount of time has elapsed.

-u name

Set the username for the database access.

Note

This username need not be identical to the login name of the user. This is the username required to access the database server.

-v

Prints version and copyright information, then exits.

-V

Switches to verbose mode.

-w password

Set the password for the database access.

Note

This password need not be identical to the login password of the user. This is the password required to access the database server.

Warning

If you pass the password as a command-line parameter, it will be visible in the process listing with the ps command (at least for a brief period of time, until the client overwrites the password string). To avoid sharing your password with the rest of the world, you should either keep your password in your configuration file or use "-w '*'" instead. This will cause the RefDB client to ask you for the password interactively (this is also the default if you don't use the -w switch at all and don't have an entry in the configuration file). You must protect the '*' with single quotation marks to prevent the shell from expanding it into a list of files in the current working directory.

-y

Specify the directory where the global configuration files are

Note

By default, all RefDB applications look for their configuration files in a directory that is specified during the configure step when building the package. That is, you don't need the -y option unless you use precompiled binaries in unusual locations, e.g. by relocating a rpm package.

refdb-1.0.2/doc/refdb-manual/ch07.html000644 001750 001750 00000064102 12255431203 020173 0ustar00markusmarkus000000 000000 Chapter 7. Data input

Chapter 7. Data input

This chapter explains the ways how you can generate reference and extended note data suitable for RefDB databases. We'll cover manual generation of RIS files and automatic conversion of other bibliographic data with the help of input filters. You'll learn about writing risx documents, a new XML data format designed to simplify funneling XML or SGML bibliographic data into RefDB. risx is the preferable format to fully utilize RefDB's capabilities. Finally we'll cover writing extended notes that allow to append additional information to objects in your database or to categorize references in a very flexible way.

To actually import the resulting RIS datasets into the RefDB database, use the addref command of the refdbc command line client, as explained in the next chapter.

Writing RIS datasets

Overview

The Reference Manager Manual contains sort of a specification of the RIS data format. This format is a tagged file format with the following general rules:

  • A file can hold one or more references

  • Each reference starts with a newline. This also means that every RIS file starts with an empty line.

  • There can be only one tag per line.

  • The tag must be at the very beginning of the line.

  • The tags consist of two capital letters denoting the type, followed by two spaces, a dash, and another space.

  • The first tag of each reference is the Type tag (TY - )

  • The last tag of each reference is the End tag (ER - )

  • The sequence of all other elements is arbitrary.

    Note

    There is one exception: In the case of multiple authors, editors, or series editors, the sequence of these authors is significant. E.g. the first AU tag will be used as the first author, the last one as the last author.

Therefore a minimal RIS file may look like this:

1
TY  - BOOK                 2 
AU  - Hoenicka,M.          3
TI  - The RefDB manual
PY  - 2001
ER  -                      4

1

This is the empty line generated by a linefeed character (0x0A) that precedes every RIS citation, even at the start of a RIS file.

2

This is the mandatory first tag, the type specifier. In this case, we're looking at a BOOK entry.

3

This and the following lines are the contents proper of the citation. All additional tags would go here as well

4

This is the mandatory last tag which closes the citation. Although invisible here, this tag also has a trailing space like all others.

Character encodings

The RIS specification has no built-in means to specify the character encoding of the data. Commercial applications usually expect the data to be supplied in a particular encoding (e.g. Reference Manager uses the Windows ANSI character set). RefDB does not have this limitation, you are free to use any encoding available on your platform (except UTF-16 and UTF-32). However, you should be aware that this may cause an interchange issue if you plan to use these data in a commercial reference management program. In any case, as the datasets do not specify their encoding, you have to use -E option of the getref command if your input data use an encoding different from the default (UTF-8).

RIS tags

The following list shows all available tags and their use.

Note

Please keep in mind that a full tag consists of the letters mentioned below followed by two spaces, a dash, and another space. E.g. the first tag below would be written as “TY - †in a RIS file.

TY

This tag specifies the type of the reference and must be the first tag of each RIS dataset, preceeded by a newline.

Format: This can be any of the following strings:

  • ABST (abstract reference)

  • ADVS (audiovisual material)

  • ART (art work)

  • BILL (bill/resolution)

  • BOOK (whole book reference)

  • CASE (case)

  • CHAP (book chapter reference)

  • COMP (computer program)

  • CONF (conference proceeding)

  • CTLG (catalog)

  • DATA (data file)

  • ELEC (electronic citation)

  • GEN (generic)

  • HEAR (hearing)

  • ICOMM (internet communication)

  • INPR (in press reference)

  • JFULL (journal/periodical - full)

  • JOUR (journal/periodical reference)

  • MAP (map)

  • MGZN (magazine article)

  • MPCT (motion picture)

  • MUSIC (music score)

  • NEWS (newspaper)

  • PAMP (pamphlet)

  • PAT (patent)

  • PCOMM (personal communication)

  • RPRT (report)

  • SER (serial - book, monograph)

  • SLIDE (slide)

  • SOUND (sound recording)

  • STAT (statute)

  • THES (thesis/dissertation)

  • UNBILL (unenacted bill/resolution)

  • UNPB (unpublished work reference)

  • VIDEO (video recording)

ER

This empty tag denotes the end of the reference. It must be the last tag of each RIS dataset.

ID

This tag is used to uniquely identify the reference in the database. The value is either the unique ID that RefDB generates when a reference is imported into a database, or a unique citation key. The latter can be supplied by the user. If no citation key is specified when adding a reference, RefDB will automatically generate a unique citation key, based on the name of the first author and the publication year. RefDB will create an unique ID value for internal use regardless of whether a citation key is provided or not.

Note

ID values are always numerical (e.g. "11"), whereas citation keys are alphanumerical (e.g. "Miller1999").

While you are free to choose any reasonable citation key (as long as it is unique within the database), you should not attempt to create a ID value manually. It is ignored when adding the dataset, but it may overwrite an existing entry if you update a reference. Along the same line, you should leave the ID tag alone if you retrieve a dataset from the database and plan to update it. The citation key in the retrieved data set is essential to match the modified data with the copy in the database.

ID Format: Integer >0.

Citation key Format: A string with up to 255 characters. You should use 7-bit ASCII characters only to avoid character encoding issues. If you want to work with SGML documents, the citation keys should be all uppercase.

TI

This is the title of a publication. For BOOK and UNPB references this is the same as the BT tag.

Format: A string with unlimited length.

T2

This is the secondary title of a publication, e.g. the book title for a CHAP reference.

Format: A string with unlimited length.

T3

This is the tertiary title of a publication, e.g. the series title for a CHAP reference.

Format: A string with unlimited length.

AU

Synonym: A1. This is the name of one author of the reference. If a reference has multiple authors, each author is specified with an AU tag on a separate line. The number of authors per RIS dataset is not limited. The sequence of the authors in the authorlist will be determined from the sequence as they appear in the RIS dataset.

Format: A string with up to 255 characters in the form: Lastname[,(F.|First)[(M.|Middle)...][,Suffix]]. First and middle names can either be abbreviated or spelled out. Use periods to separate initials, and spaces to separate spelled-out first or middle names. Lastname can be a corporate name. Some examples for valid entries:

  • King,B.B.

  • Benberg,Steven C.

  • Mellencamp,John Cougar,Jr.

  • Van Zandt,Steven

A2

Synonym: ED. This is the name of an editor of the reference, e.g. an editor of the book in which a CHAP reference was published. The same formatting requirements as for AU apply.

A3

This is the name of a series editor of the reference, e.g. an editor of a series of books in one of which a CHAP reference was published. The same formatting requirements as for AU apply.

PY

Synonym: Y1. This is the primary publication date.

Format: A string with the format “YYYY/MM/DD/otherinfoâ€, where YYYY denotes the four-digit year, MM and DD denote the two-digit month and day, respectively, and otherinfo denotes any other information with up to 255 characters. If any of these parts is not available, it can be left out, but the slashes must be present. E.g. “1999///Christmas edition†is a valid string.

Y2

This is the secondary publication date.

Format: A string with the format “YYYY/MM/DD/otherinfoâ€, where YYYY denotes the four-digit year, MM and DD denote the two-digit month and day, respectively, and otherinfo denotes any other information with up to 255 characters. If any of these parts is not available, it can be left out, but the slashes must be present. E.g. “1999///Christmas edition†is a valid string.

N1

Synonym: AB (this is not logical as it sounds like ABstract, but I'm sure there is a reason in RIS' crooked history). The notes. This can be any form of additional information, like pointers to corrections or editorials, or just personal notes about the contents of the reference.

Format: A string with unlimited length

N2

The abstract of a reference.

Format: A string with unlimited length

KW

A keyword. If a publication has multiple keywords, each goes on a separate line preceeded with this tag. Keywords are crucial to find references in larger databases.

Format: A string with up to 255 characters

RP

The reprint status of a reference. This can be any of the following strings:

  • IN FILE

  • NOT IN FILE

  • ON REQUEST MM/DD/YY

AV

The availability information. This is a hint where you can find a physical copy or offprint of the reference.

Format: A string with up to 255 characters. This can either be a plain-text description like "methods folder, second drawer from top in the green cabinet on the yellow hallway", or a call number.

SP

The start page of the reference

Format: A string with up to 255 characters

EP

The end page of the reference

Format: A string with up to 255 characters

JO

The abbreviated name of a journal or periodical.

Format: A string with up to 255 characters. The components should be separated by a single space without a period after abbreviated words. If you use periods, these should not be followed by spaces.

JF

The full name of a journal or periodical.

Format: A string with up to 255 characters

J1

The abbreviated name of a journal or periodical (user abbreviation 1).

Format: A string with up to 255 characters

J2

The abbreviated name of a journal or periodical (user abbreviation 2).

Format: A string with up to 255 characters

VL

The volume of the journal/periodical.

Format: A string with up to 255 characters

IS

The issue of the journal/periodical

Format: A string with up to 255 characters

CY

City of publication of a book.

Format: A string with up to 255 characters

PB

Name of the publisher or the publishing company.

Format: A string with up to 255 characters

SN

The ISBN or ISSN number.

Format: A string with up to 255 characters

AD

The contact address, usually the any combination of postal or email address and the phone or fax number of the corresponding author.

Format: A string of unlimited length

UR

The URL of an online version of the reference.

Format: A string with up to 255 characters

L1 through L4

These fields hold the URLs of an offprint (e.g. a PDF or Postscript copy), of the fulltext (often available as HTML in addition to PDF), of a related resource, and of an image, respectively. Multiple entries of each type per reference are allowed. In contrast to the UR field above, these fields hold information which is stored for each user separately.

The L1 field is meant to store the location of local offprints. It is most common to use the "file://" protocol and specify a full path (starting with another slash on Unix systems) or a relative path. In the latter case the path is expanded with the pdfroot setting before it is displayed to the user. Using this feature requires some thought and is therefore explained in a separate section.

Format: A string with up to 255 characters

U1 through U5

The user-defined fields 1 through 5. These fields are not intended to be filled with random bits of information. Each database should have a set of rules what information is to be stored in these fields.

A possible use for these fields is some relevance indicator (e.g. “#†means low, “#####†means high relevance).

You may also use one of these fields to create the equivalents of “folders†that some other reference databases praise as the panacea to organize your references. Just assign the same value to one of these fields for all references that belong to the same folder. Retrieve them by specifying this value in addition to your other search criteria.

Format: A string with up to 255 characters

M1 through M3

The miscellaneous fields 1 through 3. These fields are used by various reference types to deal with additional information that doesn't fit anywhere else, and the usage differs from one type to another. An important information among the data contained here is the digital object identifier. Please refer to the Reference Manager Manual for the nasty details of these fields.

Format: A string with up to 255 characters

Examples

The following listing shows a few examples of valid RIS datasets. See also the example RIS file in the /usr/local/share/refdb/examples directory.

Note

Long entries like abstracts were divided into several lines using slashes. This is to make it more human-readable for this manual and should not be used in real data.

 
TY  - JOUR
T1  - T-lymphocytes from normal human peritoneum are phenotypically /
different from their counterparts in peripheral blood and CD3- lymphocyte /
subsets contain mRNA for the recombination activating gene RAG-1
A1  - Hartmann,J.
A1  - Maassen,V.
A1  - Rieber,P.
A1  - Fricke,H.
Y1  - 1995///
KW  - Peritoneum
KW  - T cell
KW  - T lymphocyte
KW  - lymphocyte
KW  - immunology
KW  - CD3
KW  - human
KW  - Adult
KW  - blood
RP  - IN FILE
SP  - 2626
EP  - 2631
JF  - European Journal of Immunology
JA  - Eur.J.Immunol.
VL  - 25
N2  - These findings are compatible with the hypothesis that the adult /
human peritoneum provides a microenvirinment capable of supporting a /
thymus-independent differentiation of T lymphocytes.
ER  - 

TY  - BOOK
T1  - Porphyrins and metalloporphyrins
A1  - Smith,K.M.
Y1  - 1975///
KW  - Porphyrins
KW  - Metalloporphyrins
KW  - Spectrophotometry [methods]
KW  - spectroscopy
RP  - NOT IN FILE
CY  - Amsterdam
PB  - Elsevier Scientific Publishing Company
ER  - 

TY  - CHAP
T1  - Physiological studies of the natriuretic peptide family
A1  - Lewicki,J.A.
A1  - Protter,A.A.
Y1  - 1995///
N1  - Atrial Natriuretic Peptide   Cardiac synthesis and secretion of /
ANP   Regulation of ANP Gene Expression   Regulation of ANP Release /
ANP Receptors   Biologic Actions of ANP Brain Natriuretic Peptide (BNP) /
BNP Structure   Biosynthesis of BNP   Biological Actions of BNP C-Type /
Natriuretic Peptide (CNP)   Biologic Actions of CNP Modulators of /
Natriuretic Peptide Clearance   Effects of Clearance Receptor Blockers /
Effects of Neutral Endopeptidase Inhibitors Role of the Natriuretic /
Peitedes in Physiology and Disease   Hypertension   Congestive Heart  /
Failure   Supraventricular Tachyarrhythmias   Acute Renal Dysfunction
KW  - natriuretic
KW  - ANF
KW  - ANP
KW  - receptors
KW  - BNP
KW  - CNP
KW  - hypertension
KW  - congestive heart failure
KW  - review
KW  - cardiac
KW  - regulation
KW  - gene expression
KW  - expression
KW  - brain
KW  - structure
KW  - biosynthesis
KW  - receptor
KW  - inhibitor
KW  - physiology
KW  - renal
KW  - study
KW  - Peptides
KW  - atrial natriuretic peptide
KW  - MODULATOR
KW  - secretion
KW  - Gene Expression Regulation
RP  - IN FILE
SP  - 1029
EP  - 1053
VL  - 2
T2  - Hypertension: Pathophysiology, Diagnosis, and Management
A2  - Laragh,J.H.
A2  - Brenner,B.M.
IS  - 61
CY  - New York
PB  - Raven Press, Ltd.
ER  - 
refdb-1.0.2/doc/refdb-manual/ch07s02.html000644 001750 001750 00000015530 12255431202 020520 0ustar00markusmarkus000000 000000 The Emacs helpers

The Emacs helpers

If your editor of choice should be Emacs or XEmacs, the separately available refdb-elisp package will come in handy. Please see the installation instructions contained in the source archive. The package consists of a major mode (ris-mode) to edit RIS datasets, and a minor mode (refdb-mode) which provides a general front-end to RefDB. refdb-mode is too powerful to be discussed here in a few lines, please see the separately available manual. The ris major mode can do the following things for you:

  • Font-locking will help you to spot syntax errors in the tags. Especially the end tag (ER - ) is prone to lack the trailing space if you're not careful. The ris-mode displays regular tags in blue and the special type (TY - ) and end (ER - ) tags in red. Tags will be displayed in the default foreground color if anything is wrong with them, like invalid specifiers, lowercase specifiers, missing or additional spaces.

  • ris-mode provides three commands to insert datasets ("references") and individual tags as described shortly. All of these commands have in common that they always start a new line after the current line if the cursor is not at the start of a line. Thus you can run these commands from any position of the current line and still get something that makes sense as a RIS dataset.

  • Run the command insert-set (C+c C+s) to insert a new skeleton dataset (a "reference"). The function will prompt you to enter the publication type. You can use either the auto-completion feature of the minibuffer to enter a valid type or the history feature to select a previously entered type. The function will create a newline, a type tag with the type you selected, and an end tag.

  • You can insert a new tag at the beginning of a line with the command insert-tag which is bound to C+c C+t. Use either the auto-completion feature of the minibuffer to enter a valid tag or the history feature to select a previously entered tag.

    Note

    Once you have created an empty tag, you can use commands provided by the refdb-mode to enter values from existing entries in the database. This is convenient to avoid spelling errors in author names, or to select keywords which are already used by other references. These commands use minibuffer completion for added convenience.

  • You can insert a new line below the current line with the same tag as the current line with the command duplicate-tag. This is bound to M+RET. This command is convenient if you add multiple keywords or authors, each of which have to go on separate tag lines.

  • You can move between RIS datasets with the commands backward-set (C+x[) and forward-set (C+x]). You can narrow the buffer to the current RIS set with the command narrow-to-set (C+xns). To widen to the full buffer contents again use C+xnwas usual.

Note

ris-mode does not attempt to validate the buffer contents. You can create invalid tags, leave out the essential type or end tags, forget about the newline preceeding each dataset and ris-mode will not complain. However, you can spot most errors by looking at the font colors: If the first and the last line of a dataset are not displayed in red, you have a problem (you might be using a monochrome display but that's not what I mean). If any tag (except TY and ER) is displayed in the default foreground color (usually black on X displays), you have a problem as well.

refdb-1.0.2/doc/refdb-manual/ch07s03.html000644 001750 001750 00000010770 12255431202 020522 0ustar00markusmarkus000000 000000 Input filters

Input filters

RefDB gets all reference data from text files (or from equivalent data read from stdin). These text files can be from various sources: you can enter them manually, you download files from search engines in the web, or you have data exported from a different database application. In almost any case, some kind of filtering has to be applied to those files in order to be valid input for RefDB.

The input filters currently shipped with RefDB are listed below. Please follow the links to the individual filters for further information.

refdb_dos2unix

A simple (maybe too simple) shell script to convert text files like RIS documents from DOS-style line endings to Unix-style line endings. Most RefDB tools need their input files with Unix-style line endings. This is a valuable tool to import reference databases from Windows reference managers.

med2ris

A tool to convert Pubmed data in both the tagged and the XML format to RIS. You may use refdb-pubmed to retrieve Pubmed data in the first place.

en2ris

A tool to convert EndNote "RIS" exported data to RIS

bib2ris

A tool to convert BibTeX data to RIS

db2ris

A tool to convert reference data in DocBook SGML/XML documents to RIS

marc2ris

A tool to convert references in MARC format to RIS.

If you need other formats than those listed above, you'll either have to provide your own input filter or search the web for existing filters that convert your data to one of the supported formats. A decent set of filters is supplied by Chris Putnam's bibutils package, which interconverts bibtex, COPAC, EndNote (Refer), EndNote (XML), ISI, PubMed, MODS, and RIS data. For example, use the following command to import MODS datasets into RefDB:

# xml2ris modsdata.xml|refdbc -C addref
refdb-1.0.2/doc/refdb-manual/ch08.html000644 001750 001750 00000031431 12255431204 020174 0ustar00markusmarkus000000 000000 Chapter 8. Reference management

Chapter 8. Reference management

You can manage your references with the refdbc command line client. We will demonstrate the interactive use of refdbc, but feel free to use the non-interactive batch mode instead if you prefer. We'll also use a conservative, least error-prone approach whenever there are several ways to achieve the same goal. E.g. we'll use intermediate files instead of piping so we can verify what we got at every stage. Once you're sure about what you're doing, you can still speed up things.

Add references

RIS datasets

Adding references boils down to running addref with proper input files. The input files have to be valid RIS files. They may contain one or more RIS datasets.

You can set some fields to default values with the -g defaultfile option of the addref. This will add the tags given in the defaultfile to the end of every dataset before they are added to the database. This means that these values override any values given in the datasets. This option may be convenient e.g. to set the reprint status of all datasets that you add in one fell swoop instead of editing them individually.

Note

Please be aware that any numerical values of the ID tag are ignored when you add references with the addref command. RefDB assigns an automatically generated ID to every new reference, so you can't enforce arbitrary IDs. You can however use the ID tag to provide an alphanumeric citation key, such as "Miller1999". The citation key should consist only of letters and numbers within the 7-bit ASCII range and has to be unique in the database. Remember that the citation key has to be all uppercase if you want to create bibliographies for SGML documents. If you do not specify a citation key, RefDB will generate a unique citation key based on the last name of the first author and the publication year.

If you want to overwrite an existing reference with a given numerical ID or a given citation key, use the updateref command instead.

Example 1

Let's assume we just downloaded a bunch of references from PubMed (the largest database for biomedical publications). We saved them in the "Medline" format, ending up with several small files containing one or more references each. How do we get them into the database?

  • First we convert all references in the files (we prudently named them pm001.txt, pm002.txt and so on) to the RIS format and write the result into an intermediate file, using the med2ris.pl input filter:

    	      ~# 
    	      med2ris.pl -o foo.ris pm*
    	    

    We could now open foo.ris in our favourite text editor and make a few changes. We could enter additional keywords, provide personal notes (e.g. why we currently find the article worth the paper it is printed on, something that may not be apparent a few months later), or specify the reprint status and availability.

  • Then we switch to (or start) the refdbc command line client and type the following command at the prompt to add the references to the database bar (use the full path to foo.ris if necessary):

    	      refdbc: 
    	      addref -d bar foo.ris
    	    

Example 2

You feel the urge to import MODS data, an XML data format developed by the Library of Congress. RefDB does not support this format natively or via converters at this time, so you'll have to resort to an external tool. Chris Putnam's bibutils package comes to the rescue, as it provides a set of command-line tools to interconvert a number of bibliography data formats. Both RIS and MODS are supported, so we have all it takes. The following command imports the MODS data into your default database in a single step, although you may first want to check the output of the converter before going ahead:

	      # xml2ris modsdata.xml|refdbc -C addref
	    

risx datasets

If you prefer the XML data format instead, use the addref with the -A risx switch. As the data are imported using a non-validating XML parser you should make sure the documents are valid, either by using some nifty feature of your XML editor or by running the document through a suitable tool like xmllint.

Each entry in a risx document can specify a numerical ID value and an alphanumeric citation key. The ID is ignored by the import routines. If you want to update or replace an entry by ID, you have to use the updateref command instead. The citation key should only use letters and numbers within the 7-bit ASCII range. Remember that the citation key has to be all uppercase if you want to create bibliographies for SGML documents. If you do not specify a citation key, RefDB will automatically assign a citation key based on the first author and the publication year.

Example

You've written a risx dataset from scratch and want to import it into your RefDB database. This is what you need to do:

  • First you need to make sure that your document is valid against the risx DTD. Unless your XML editor validates your document anyway, you'll have to use an external validator like onsgmls, which is a part of the OpenSP suite of SGML tools, or xmllint, which is shipped with libxml2.

    	      ~# 
    	      onsgmls -s /usr/local/share/refdb/declarations/xml.dcl foo.xml
    	      ~# 
    	      xmllint --noout --dtdvalid "http://refdb.sourceforge.net/risx/index.html" foo.xml
    	    

    No news is good news in both cases: If your document is valid, the validator will not output anything. If you do get some error messages, go back to your editor and fix the problems.

  • Now switch to refdbc and run the following command to add the references in foo.xml to the reference database bar:

    	      refdbc: 
    	      addref -A risx -d bar foo.xml
    	    
refdb-1.0.2/doc/refdb-manual/ch07s04.html000644 001750 001750 00000014104 12255431203 020517 0ustar00markusmarkus000000 000000 Writing risx datasets

Writing risx datasets

XML documents using the risx DTD are an alternative way to add datasets to RefDB databases. You can use your favourite SGML/XML editor to edit these datasets. You can also use DSSSL or XSLT scripts to transform bibliographic data available as SGML or XML documents to risx.

This section provides a quick outline of risx datasets. For a description of all available elements and their relationships, please visit the risx documentation.

As usual, start the document with the processing instructions, followed by the document type declaration. Make sure to include the character encoding if it is different from the default (UTF-8). The other encodings supported by RefDB are UTF-16, ISO-8859-1, and US-ASCII. The first line might then read:

<?xml version="1.0" encoding="utf-8"?>

The top-level element of a risx XML document is either ris (if the file provides multiple datasets) or entry, which corresponds to a single dataset. The ris element holds one or more entry elements. The type attribute specifies the type of the reference. These are the same types as described above for the RIS TY tag. The id and citekey attributes specify a numeric ID (which will only be used if you update references) and a citation key, respectively. The latter should be all uppercase if you intend to use the references with SGML documents.

Each entry element contains up to five subelements, the first three of which provide the bibliographic information proper. risx distinguishes three levels of bibliographic information. Each entry can specify one or more of these levels:

  • The part element corresponds to the analytical level of bibliographic information. This element specifies the information of a work that has been published as a part of a publication. This can be a journal article in a periodical, or a chapter in a book. The part element usually contains information about the authors and the title of the part, as well as volume, issue, and page information.

  • The publication element corresponds to the monographic level. This is essentially an individual item that you can find on the shelves of a library, like a book or a journal. The publication element contains information about the authors/editors and the title of the items.

  • The set element corresponds to the series level. This provides information about individual items that have been published as a part of a series, like a book about cats within a series of books about mammals. This element usually adds the information about the title of the series and the series editors.

Please refer to the risx documentation for further details about the structure of these elements.

The libinfo element contains the local "housekeeping" information of a particular user. Each dataset may contain libinfo elements of one or more users who are specified with the user attribute. Use this element to specify the notes, the reprint status, and the availability information.

The contents element specifies, you've guessed right, the contents of the reference, i.e. an abstract and an unlimited number of keywords for indexing purposes.

refdb-1.0.2/doc/refdb-manual/ch07s05.html000644 001750 001750 00000016522 12255431203 020526 0ustar00markusmarkus000000 000000 Writing extended notes

Writing extended notes

Both the RIS and the risx formats allow to keep user-supplied notes of unlimited length with each dataset. This is a great way to keep additional explanatory information along with the hard bibliographic data, but this approach is still somewhat limited.

Extended notes are kept separately from the reference data, but there is a mechanism to link each note to an unlimited number of references, author names, keywords, or periodical names. Possible applications of this feature include:

  • Write a note about a topic and link it to all references relevant to this topic

  • Keep biographic data or alternative (mis)spellings with author/editor names

  • Store the impact factor, the official web page, or your personal access information to the restricted part of that web page along with a journal name

  • Explain alternative spellings or synonyms of keywords

Searching for notes is similar to searching for references. Notes may have keywords, keys, and a title attached to them to easily find them. In addition, you can search for notes that link to a particular reference, author, keyword, or periodical. The inverse works as well: you can search for references that are linked to particular notes.

Extended notes are XML documents according to the xnote DTD. The structure of these documents is simple enough to do without a separate documentation. As usual, start the document with the processing instructions, followed by the document type declaration. Make sure to include the character encoding if it is different from the default (UTF-8). The other encodings supported by RefDB are UTF-16, ISO-8859-1, and US-ASCII. The first line might then read:

<?xml version="1.0" encoding="utf-8"?>

If you want to write several extended notes in a file, start with an xnoteset element. Each individual extended note is kept in an xnote element. This element carries up to four optional attributes:

id

An unique identifier supplied by the database engine. This attribute is ignored if you add a new note, but it is respected if you update an existing note.

citekey

This is a unique short title or tag which identifies a note unambiguously but is more convenient to remember than the id. If you do not supply a citekey, refdbd will create one based on the username and the date.

user

This is the name of the user that owns the note. If you do not supply a name, refdbd will use the name of the current user, which is most likely what you need anyway.

date

This is a timestamp (YYYY-MM-DD). refdbd will insert the current date if you do not supply this attribute.

An extended note consists of an optional title, the contents proper encoded in a content element, zero or more keyword elements, and zero or more link elements. The title is a short description of the note. The keywords serve the same purpose as in references.

The content element contains the note proper. The contents of the content element is stored by refdbd as is. It may be plain text or markup. The element uses the following optional attributes:

type

This description of the content type may be used by processing applications to render the contents properly. Store e.g. the MIME type or the name of a DTD/Schema in this attribute.

xml:lang

This attribute specifies the language of the contents.

The link element is used to link the note to one or more references, keywords, author names, or periodicals. The empty element uses two attributes:

type

The type of the link target. This may be one of reference, refid, author, keyword, journalfull, journalabbrev, journalcustabbrev1, journalcustabbrev2.

target

This attribute specifies the database object that the note should be linked to. In the case of a reference, use the ID (type refid) or citation key (type reference). In all other cases, use the name of the author, keyword, or periodical, respectively.

An example set of extended notes is installed into /usr/local/share/refdb/examples.

refdb-1.0.2/doc/refdb-manual/ch07s06.html000644 001750 001750 00000020425 12255431203 020524 0ustar00markusmarkus000000 000000 Input data mangling

Input data mangling

Input data are not stored as a literal chunk of text by RefDB. If you import a dataset, and later retrieve it using the same format, the dataset is not guaranteed to be the same character by character. Instead, the data are sliced up, sometimes slightly modified, and sometimes RefDB creates additional information. This section tries to explain what happens to your data behind the scenes, and why this is good for you.

Information that RefDB generates for you

In a few cases RefDB fills in some default values if the datasets do not specify them. This happens in the following cases:

  • Each reference and extended note will be assigned a unique numeric identifier. This is mainly used internally, but you can also retrieve references and extended notes by their ID. The ID is always created by the database server, there is no way to enforce specific IDs for your datasets.

  • Both references and extended notes require a unique alphanumeric key. With a few limitations this is an arbitrary string consisting of letters (at least one) and optional digits. If you do not specify a citation key, RefDB will create one automatically. In the case of references, the publication year is appended to the last name of the first author. If this string is not unique, a sequential suffix starting at "a" through "z", then "aa" and so forth, is tested until a unique string is found. The same algorithm is used for extended note keys, but instead of an author name the user name serves as the base.

  • If no reprint status is specified, RefDB inserts "NOT IN FILE" as the default value.

  • If your extended notes do not specify a date, RefDB will use the current date and insert that instead.

Information that RefDB mangles

Citation keys are supposed to work as ID values in SGML and XML documents. To avoid any character encoding hassles, only the first 127 characters of the US-ASCII character set are permitted. These characters work in most character encodings. Some special characters which are not allowed as part of an XML attribute value are stripped. Non-ASCII characters are converted to a reasonable ASCII equivalent, or they are dropped if no replacement is possible.

Periodical names and author/editor names receive some special treatment in order to make them usable for RefDB. Both periodical names and person names should be provided in a particular format. However, if you retrieve your data from an electronic source instead of writing them from scratch, the names may not conform to the rules. In order to make best use of these data, RefDB attempts to normalize the incoming periodical and person names until they conform to the rules.

There is a good reason for this normalization. Consider a periodical name like "The Journal of Biological Chemistry" . Different electronic sources may abbreviate this as one of:

  • J.Biol.Chem.

  • J. Biol. Chem.

  • J Biol Chem

Although a human reader does not have a hard time to guess that we're looking at the same journal in all three cases, a database is too stupid to understand this. If you add the periodical abbreviations as they are, you'll end up having three different journal entries. As a consequence, a query like getref :JO:='J.Biol.Chem.' will miss two out of three papers published in that journal. This is not a good thing.

Periodical names

RefDB normalizes abbreviated periodical names like this: First, the name is tokenized. Separators are periods and spaces. If a token has a trailing period, it is assumed to be an abbreviated word and used as such. If a token has no trailing period, the token is compared to an internal list of unabbreviated words (see the listword and addword commands for further information about this list). If a match is found, no period is added. If no match is found, the token is assumed to be an abbreviation of something else and a period is added. Spaces after periods will be removed as one separator is sufficient. If we consider the three versions of the journal name above, all versions would be normalized to the first one.

Person names

The names of authors and editors are normalized like this: Everything to the left of the first comma is assumed to be the last name and remains untouched. The next item (separated by either a space, a period, or both) is assumed to be the firstname. If it consists of one capital letter, a period is added and any trailing spaces are removed. If the firstname is spelled out, it is used as such. All following name parts to the left of the second comma, if any, are assumed to be middle names. Each part receives the same treatment as a firstname. Finally, everything to the right of the second comma, if any, is assumed to be a honorific or lineage part and used as such. All spaces following either a period or a comma are removed. A few examples should make this procedure clear:

  • "Miller, John S" -> "Miller,John S."

  • "Chun, H-K" -> "Chun,H.-K."

  • "Delorie, DJ" -> "Delorie,DJ"

  • "Doe, J S" -> "Doe,J.S."

  • "Random,Jane,Jr." -> "Random,Jane,Jr."

The last example shows that your data will not be modified as long as they stick to the input format.

refdb-1.0.2/doc/refdb-manual/ch08s02.html000644 001750 001750 00000011456 12255431203 020525 0ustar00markusmarkus000000 000000 Find and view references

Find and view references

The refdbc command getref is your friend to find and display references. The query language that is used to retrieve specific references from the database is explained in detail elsewhere. This section offers a few additional hints.

The general idea of the getref command is that you specify what you want and you get back a chunk of text. You can select the format of this chunk (e.g. screen, HTML, or DocBook output) and you can specify what you want to do with this chunk. A suitable strategy for most searches works as follows:

  • Run your initial query, send the screen output to a pager, and see whether the result is what you need. We use the screen output because it generates the least verbose output and thus is the fastest.

  • If necessary, refine your search as discussed shortly until you arrive at the desired list of publications.

  • Re-run the previous query, but use the output format and output destination that you need to work with the data. For example, if you want to edit the selected references, you would use the RIS format and write the result to a file with the -o option.

refdbc has a uniquely simple way to rerun and modify queries. Many reference database allow you to modify previous queries only by adding new restrictions to the end or removing restrictions from the end of a previous query. refdbc is more flexible. In the interactive mode, refdbc keeps its own history of commands. You can use the up key or the Ctrl+p combo to recall the previous query. You can press these keys repeatedly to go further back in the history. Use Ctrl+r to incrementally search for a previous query by entering a short string. Adding more characters will make the search more specific. Pressing Ctrl+r repeatedly after entering some search string will display other matches further back in the history.

In the batch-mode, you can use the history feature of your shell. In either case you can modify, extend, or restrict any previous query as you see fit.

refdb-1.0.2/doc/refdb-manual/ch08s03.html000644 001750 001750 00000010254 12255431203 020521 0ustar00markusmarkus000000 000000 Delete references

Delete references

The deleteref command accepts one or more reference IDs as its argument to specify the references you want to get rid of. This is quite straightforward if you want to delete one or two references. But what if you have a disjoint list of 17 references, e.g. all publications of an author who was convicted to be fraudulent? A useful strategy to delete such references is to save a query with the getref command to a file and use it as a list of ID values for a subsequent run of deleteref. This way you can verify by inspecting the file that you will delete the correct references. Use the -s ID option to request minimal datasets containing the ID value instead of the citation key in the ID field.

Example

To stick with the example of the fraudulent author, we assume his name is, as in so many examples, John Doe (apologies to all RefDB users with that name).

  • First we select all his publications from the database bar, request only the ID, and save the result in an intermediate file:

    	    refdbc: 
    	    getref -t ris -s ID -o tobekilled.ris -d bar ":AU:=Doe,J."
    	  

    The result is, once again, a file with plain text that we can check and edit to our needs. E.g. if you want to keep one or two publications in the list, just delete their entries in the intermediate file.

  • Then we use the deleteref command to actually delete the references associated with our list of IDs:

    	    refdbc: 
    	    deleteref -f tobekilled.ris -d bar
    	  
refdb-1.0.2/doc/refdb-manual/ch08s04.html000644 001750 001750 00000006415 12255431203 020526 0ustar00markusmarkus000000 000000 Edit references

Edit references

RefDB has no built-in reference editor (but see the Emacs and vim support files which allow you to add and update references from within your editor). The general strategy to edit an existing reference is as follows:

  • Save the reference(s) that you wish to edit to a file using a command like getref -o foo.ris -t ris -d bar ":ID:=1717 OR :AU:=^Miller". This would retrieve the reference with the ID 1717 as well as all references with a Mr. or Mrs. Miller on the author list. If you prefer, use the risx output format instead.

  • Use your favourite text editor to edit the references in the file foo.ris. Make sure you don't touch the ID field as this is crucial to match this reference in the next step with the existing copy in the database.

  • Use the command updateref -d bar foo.ris to update the reference(s) in the database.

refdb-1.0.2/doc/refdb-manual/ch08s05.html000644 001750 001750 00000005565 12255431203 020534 0ustar00markusmarkus000000 000000 Print references

Print references

There are two ways to print references:

  • Send the output of the getref command to a printer:

    	  refdbc: 
    	  getref -c lpr :ID:>0
    	

    You should probably be a bit more selective about the references than shown above unless you want to empty the paper tray of your printer. In any case, this command will print a list of your references in the screen output format. You can use some additional plumbing along these lines to obtain a more beautiful printer output:

    	  refdbc: 
    	  getref :ID:>0 -c 'pr -f | fmt -w 70 | lpr'
    	
  • The second option is to write the HTML output to a file and use your browser's print capabilities.

refdb-1.0.2/doc/refdb-manual/ch08s06.html000644 001750 001750 00000017601 12255431203 020527 0ustar00markusmarkus000000 000000 Managing personal reference lists

Managing personal reference lists

Personal reference lists mainly serve two purposes:

  • If you share your reference database with other users, your default personal reference list records which datasets you've added. Coincidentally, the name of this list is identical to your database username.

  • In addition to your default list, you can maintain as many additional lists as you see fit. Use these lists to select references for particular purposes, e.g. when preparing a presentation or if you need to keep track of papers that you still have to read.

So personal reference list are essentially a tool to have your own personal information for a dataset and to create personal, selective views of the database.

Creating and deleting personal reference lists

Actually there are no commands to create or delete personal reference lists. These lists are created automatically as soon as you add references to them. Now the question is, how does a reference get into your personal reference list? There are three ways to accomplish this:

  1. If you add a new reference to the database with the addref command, the reference will be automatically added to your default personal reference list.

  2. Add an existing reference to your personal reference list with the pickref command. This command will not add personal data to the reference. To add a reference to a list other than your default list, use the -b listname switch.

  3. If you use the updateref command to modify the information in an existing reference, this reference will also appear in your default personal reference list. If you use the -P switch with this command, the data of this reference common to all users will remain untouched, but your personal information (reprint status, availability, notes) will be added.

Remember that one user can act on behalf of a different user with the -U switch, that commands like addref support.

Of course there are also ways to get rid of the references that you once found useful. If you share the database with other users, the first choice should always be the dumpref command. This just removes your personal information and your association with the reference, while it leaves the common information untouched for other users of the database. Only if you know that no one else is interested in a reference, you should think about using the deleteref command. In both cases personal reference lists will be automatically removed if they are empty.

Accessing references in personal reference lists

You can limit your database search with the -b listname switch of the getref command to those references that you added to that particular personal reference list. If you want to access references in your default list, you have to pass your username as an argument to the -b switch.

Advanced use of personal reference lists

The pickref and dumpref commands mentioned above are actually only simplified interfaces to the extended notes feature. Each personal reference list corresponds to one extended note with these particular features:

  • The note is initially almost empty. Only the title, the username and the key are set.

  • The title and the key are initially identical and have the format <username>-<listname>. The username prefix is used to create a separate namespace for each user.

However, you can treat these notes just like any other note. In particular, you can retrieve the note with the getnote command, edit it by entering a description as the contents or a couple of keywords, and finally update it with the updatenote command. Just keep in mind that this information will be lost if you remove all references from this list, as this will cause the note representing the list to be purged automatically.

refdb-1.0.2/doc/refdb-manual/ch08s07.html000644 001750 001750 00000006764 12255431203 020540 0ustar00markusmarkus000000 000000 Global edit references

Global edit references

RefDB has no special command for a global edit of all references or a group of references. You can get pretty far though with a default file when updating references and with Unix plumbing.

To change existing text:

  • Run a search on the references that you wish to change and pipe the output through sed into a file, like getref -t ris -d bar -c "sed 's/foo/faa/g' > refs.ris" "search-string".

  • Use the command updateref refs.ris to update the reference(s) in the database.

To add or change fields:

  • Run a search on the references that you wish to change, like getref -t ris -o refs.ris "search-string"

  • Create a defaultfile containing the field(s) that you want to change or add.

  • Use the command updateref -g defaultfile refs.ris to update the reference(s) in the database.

refdb-1.0.2/doc/refdb-manual/ch08s08.html000644 001750 001750 00000004505 12255431204 020531 0ustar00markusmarkus000000 000000 Create periodical synonyms

Create periodical synonyms

Scientific journals are very often cited by standardized abbreviations which help to keep the space required for bibliography listings at a minimum. However, at times you need the full name instead. If you did not add both synonyms when adding the references that use a journal, you can use the updatejo command to add or edit these synonyms.

refdb-1.0.2/doc/refdb-manual/ch08s09.html000644 001750 001750 00000015574 12255431204 020542 0ustar00markusmarkus000000 000000 Character encoding issues

Character encoding issues

The 7-bit ASCII character set originally employed by PCs in the days of yore turned out to be insufficient for languages other than English. Reference data may require characters not included in the ASCII character set. The string sorting order may also follow different rules. RefDB supports national character sets as well as Unicode, which is sort of a superset of all national character sets. As a RefDB user and administrator you'll have to deal with character encoding issues at different levels.

Character encodings of databases

While it is possible to convert the data during import and export (see the following sections), it is still worthwile to spend a few thoughts about the character encoding used by your reference databases. If possible, use an encoding that ensures a suitable string sorting order for your data. Choosing a proper encoding also avoids unnecessary character encoding conversions when importing or exporting data.

The available encodings are limited by your database engine:

SQLite

SQLite currently supports only ISO-8859-1 (the default) and UTF-8 as a compile-time option. If you install a binary package, it most likely uses ISO-8859-1.

SQLite3

SQLite3 uses UTF-8 by default. UTF-16 is supported by the database engine, but not by the libdbi library which RefDB uses to access the engine.

MySQL

This database engine supports a fairly large number of encodings, but versions prior to 4.1 allow only one encoding per server instance. That is, all databases have to use the same character encoding. Please see the MySQL documentation for the growing list of supported encodings

PostgreSQL

This database engine supports a variety of encodings as a per-database option. That is, all reference databases may use different encodings. Please see the PostgreSQL documentation for a current list of supported encodings.

Character encodings of imported data

We'll have to distinguish two different sorts of data:

RIS

This plain-text format does not have a built-in way to declare the character encoding of the data. Instead you have to use the -E option of the addref and updateref commands to specify the encoding if it is different from the default (UTF-8).

Please note that the import filters med2ris, en2ris, and to a limited extent also marc2ris support on-the-fly character encoding conversion.

risx and xnote

These are XML formats that can use the XML way of declaring the encoding. This is done in the processing instructions, which is the first line in a XML file. Due to a limitation of the parser used for importing XML data, only four encodings are accepted by RefDB: UTF-8, UTF-16, ISO-8859-1, US-ASCII. If your data use a different encoding, use the iconv command line utility (usually a part of the libiconv package) to convert your data to one of the accepted encodings.

Character encodings of exported data

By default, data are exported without a character conversion, i.e. the data will use whatever encoding the database uses. If you want the exported data in a different format, request the encoding with the -E option. This option is accepted by the getref and getnote commands of refdbc as well as by the refdbib client. You may request any encoding that your local libiconv installation supports. man 3 iconv or man iconv_open should give a clue which encodings are available.

refdb-1.0.2/doc/refdb-manual/ch08s10.html000644 001750 001750 00000011770 12255431204 020524 0ustar00markusmarkus000000 000000 Use pdfroot

Use pdfroot

The pdfroot variable allows you to store the paths to PDF or Postscript offprints of your references in a more efficient and more flexible way than a full path.

The L1 field of a reference can hold the path to an electronic version of the document. This path will be converted into a link in the HTML output, and the neat plan is to open the document the link points to with a simple mouseclick. If you just store the full path of this document, something like file:///home/markus/literature/5503.pdf, you may run into problems fairly soon: If you have to reorganize the folder structure in your directory tree, all paths in the database would be incorrect. If you access the database from a different computer as the one that physically stores your offprints, you will be out of luck with these paths as well.

The idea is to store the invariable part of the path in the reference entry and any variable part of the path in the pdfroot variable. The pdfroot variable can be set either in your configuration file or with a command line option. Consider e.g. the following situation: You decide for some obscure reason to store the offprints in subdirectories according to the publication year. The full paths will thus be something like /home/markus/literature/1999/2345.pdf and /home/markus/literature/2001/6213.ps. The partial paths in the L1 field of the reference entry could then be set to file://1999/2345.pdf and file://2001/6213.ps, whereas the correct value for the pdfroot would be /home/markus/literature/. Simple concatenation by RefDB will then result in the proper full path.

If you now decide to rearrange your hard drive, all you need to do is to set pdfroot properly, as long as you don't change the directory structure below /literature (if you do that, you shoot yourself in the foot anyway).

If you want to access your offprints from a different computer, you have several options:

  • You can mount the directory tree that actually holds the data. If the computer that stores your offprints e.g. exports /home as an NFS share, you could mount that to /mnt on your local computer. Then you can set pdfroot to /mnt/markus/literature/ to access your offprints.

  • You can store the offprints in a location that is accessible with an internet protocol like HTTP or FTP. In that case it is most practical to just store the full URL in the L1 field, as in http://some.machine/literature/Miller1999.pdf.

refdb-1.0.2/doc/refdb-manual/ch08s11.html000644 001750 001750 00000012254 12255431204 020523 0ustar00markusmarkus000000 000000 Interaction with external applications

Interaction with external applications

RefDB has been designed to be as modular and as lightweight as possible. This means that you need some external applications for various purposes. This chapter briefly discusses how you can simplify your work with these external applications.

Editor

If you want to modify references in your database or write new entries from scratch, you need some suitable editor. Emacs and vim can directly interact with RefDB using special modes or support files. Any other editor will do as well as long as it creates the correct line endings: RefDB wants a plain Unix-style LF (0x0A), not a DOS-style CR LF (0x0D 0x0A). The prime contenders are vi and Emacs which are available on almost any Unix-style operating system as well as on Windows. For the Windows platform there are also a number of free- and shareware editors which let you select the line endings.

Creating new references is straightforward: Type them in, save them, and use refdbc to upload them. If you want to edit existing references in your database, you download them with the getref command to a disk file. Open this file with your editor, edit the contents, and save the file again for uploading. If you want to edit several references in a row, you can simply reuse the filename for downloading, then refresh the buffer in your editor (e.g. C-x C-f RET in Emacs). After saving the changes, simply recall the last upload command in refdbc with the up key and press Enter.

Note

Some editors like Emacs and vim support RefDB by means of add-on packages.

Viewer

While a pager will do in many cases to view the query results, a web browser is a nice alternative. The RefDB command getref can generate HTML output at your request with the -t html option. Save the output to a file and view this file with your favourite web browser. When you run the next query, reuse the filename and hit the reload button of your browser to display the new results.

Tip

A web browser is also a convenient way to print references.

refdb-1.0.2/doc/refdb-manual/ch09.html000644 001750 001750 00000012154 12255431205 020177 0ustar00markusmarkus000000 000000 Chapter 9. Notes management

Chapter 9. Notes management

Managing notes is very similar to managing references. The commands have analogous names and functionality. If you've familiarized yourself with managing references, the notes part should not be too hard either.

Add extended notes

Extended notes must be supplied as datasets according to the xnote DTD. Add them to the database using the addnote command. Each file supplied to this command may either contain a single xnote element or several of these wrapped into a xnoteset element.

Note

The id attribute, if any, will be ignored when you add extended notes. The database engine will assign each note a new, unique identifier. The citekey attribute will be honored unless there is a clash with an existing note. In this case refdbd will refuse to add the note.

If you want to overwrite or update an existing note, use the updatenote command instead.

Example

Assume the file foo.xml contains a couple of extended notes. The following command will add them to the database "bar" (use the full path to foo.xml if necessary):

	refdbc: 
	addnote -d bar foo.xml
      
refdb-1.0.2/doc/refdb-manual/ch09s02.html000644 001750 001750 00000005723 12255431204 020527 0ustar00markusmarkus000000 000000 Find and view extended notes

Find and view extended notes

Just as you'd use the getref command to locate references, you can use the getnote command to view notes. The query language is explained in a separate section.

The notes can be retrieved for screen display, as HTML or XHTML documents, or as xnote documents.

Note

Accessibility of notes is affected by the default note sharing setting of refdbd and by the properties of the individual notes. See below for further details.

refdb-1.0.2/doc/refdb-manual/ch09s03.html000644 001750 001750 00000005044 12255431204 020524 0ustar00markusmarkus000000 000000 Delete extended notes

Delete extended notes

Use the deletenote command to remove extended notes from the database. The argument to this command is a space-separated list of ID values.

Example

The following command removes the notes with the IDs 4 and 132 from the database "bar":

	refdbc: 
	deletenote -d bar 4 132
      
refdb-1.0.2/doc/refdb-manual/ch09s04.html000644 001750 001750 00000006233 12255431204 020526 0ustar00markusmarkus000000 000000 Edit extended notes

Edit extended notes

Use the same strategy as you would for references:

  • First retrieve the notes you want to edit with the getnote command and write the output to a file:

    	  refdbc: 
    	  getnote -d bar -o foo.xml -t xnote :NID:=4 OR :NCK:=biochemistry1999
    	
  • Now use your favourite XML editor to edit the notes. Keep the citekey and id elements alone, as at least one of them is required to match the dataset with the existing copy in the database.

  • Finally use the updatenote command to update the reference in the database:

    	  refdbc: 
    	  updatenote -d bar foo.xml
    	
refdb-1.0.2/doc/refdb-manual/ch09s05.html000644 001750 001750 00000006206 12255431204 020527 0ustar00markusmarkus000000 000000 Link existing notes to other objects in the database

Link existing notes to other objects in the database

If you want to link an existing extended notes to other objects in your database without modifying the contents of the note, the addlink command comes in handy. The command requires at least two arguments. The first argument specifies an existing note by its ID or citation key. The second argument specifies an object in the database, either a reference by ID or citation key, or an author name, a keyword, or a periodical by their names. Removing links works just the same except that you need to provide the -r switch.

Example

The following command links the existing note with the ID 5 to two references which are specified by their citation keys:

	refdbc: 
	addlink -d bar :NID:=5 :CK:=Miller1999 :CK:=Doe2000
      
refdb-1.0.2/doc/refdb-manual/ch09s06.html000644 001750 001750 00000013501 12255431205 020525 0ustar00markusmarkus000000 000000 To share or not to share extended notes

To share or not to share extended notes

RefDB was written with facilitating the cooperation of users in mind. Therefore extended notes are visible to all users of the system by default. However, situations may arise where you don't want to share any notes or where you want to protect only individual notes from your colleague's prying eyes. RefDB supports all these variants. Accessibility of notes is controlled by two filters: the default server setting and the settings in the individual notes.

The refdbd default

The refdbd server can be configured to either treat all extended notes as public or as private by default. Use the -S command line option or the share_default config file option to set the default mode. See the chapter about refdbd administration for further details. As the names imply, public will make all notes available to every user by default. Similarly, private will restrict access to the user who added the note by default. Use the server setting to define a default policy for your installation.

Warning

A warning for all admins: switching your server from "private" to "public" without prior announcement will alienate your users. Don't even think about it.

The share attribute of the extended notes

The xnote.dtd defines an optional share attribute which offers the same choice of values as the server setting above. If the attribute is set, the extended note will be public or private regardless of the server setting. The server setting only kicks in if a note does not set the share attribute. Each user can decide for each note whether or not she wants to share it with the world. The following table summarizes the settings.

Table 9.1. Sharing extended notes

 share attribute "public"share attribute "private"share attribute not set
share_default "public"publicprivatepublic
share_default "private"publicprivateprivate

Data privacy

The above settings control only the access to the extended notes through the RefDB interface. You should be aware that anyone who can access the database directly with an SQL client will be able to read and change the notes of every user, regardless of the settings mentioned above. The simplest way to secure the data is to run refdbd on a server that no user has shell access to. If the database engine access control is set in a way that users can only connect from the box that runs RefDB, they won't be able to connect from a SQL client running on their workstations.

refdb-1.0.2/doc/refdb-manual/ch10.html000644 001750 001750 00000015334 12255431206 020173 0ustar00markusmarkus000000 000000 Chapter 10. Bibliographies

Chapter 10. Bibliographies

The bibliography is the really hard part of writing a scientific manuscript or a thesis, much harder than generating the data in the first place. This is why RefDB tries to help you with this task as much as possible.

RefDB's job is to provide two kinds of information:

  • the bibliographic data

  • styling information according to a bibliography and citation style

If the default rendering of citations and bibliographies in the DocBook or TEI stylesheets is appropriate for your purposes, you can get away with using RefDB as a source for raw bibliographies. However, if your output is supposed to match the requirements of a particular journal or publisher, you'll need the styling information as well. There are literally thousands of possible combinations for the formatting of authors, titles, journal names, page and date informations, and almost each of these possiblilities has been adopted by at least one journal or publisher as the one and only citation and bibliography style. The format of the RefDB bibliography styles is described in the first section. The next section will then explain how you generate bibliographies and format your documents.

Quickstart guide

These are the essential steps to publish documents with formatted citations and a formatted bibliography:

  1. Load one or more bibliography styles into your RefDB database, using the addstyle command (this is usually done automatically during post-installation setup, see refdb-init).

  2. The bibliography will eventually be available as a separate file (see below). SGML and XML documents have to include this file, either as an external entity or via xinclude. LaTeX or RTF documents need no special care at this point.

  3. Insert citations into your document, preferrably using the short notation for SGML/XML documents. LaTeX documents use the regular bibtex commands, whereas RTF uses a plain-text citation format.

  4. Run the appropriate commands to create the bibliography and to transform the document. For SGML, XML, and RTF documents this may be as easy as running make pdf, whereas LaTeX users have to run one extra command in addition to the usual bibtex procedure.

refdb-1.0.2/doc/refdb-manual/ch10s02.html000644 001750 001750 00000023560 12255431205 020517 0ustar00markusmarkus000000 000000 Manage bibliography styles

Manage bibliography styles

Bibliography styles are defined as XML documents. Each document contains one or more bibliography styles for a particular journal or publisher. The bibliography styles need to be added to the RefDB database before they can be applied to your documents. The bibliography style controls, among others, characteristics like:

  • Numerical vs. author/year vs. citation key citation style

  • Bibliography sorting order (as it appears in the text vs. alphabetical or sorted by ascending or descending publication dates)

  • Formatting of author names: First and middle initial with or without periods, with or without spaces, before or after the surname

  • Appearance of name, volume, and issue number of journals (bold, underlined, italics)

  • Formatting of the bibliographic listing: indentation, font sizes.

Note

The extensive formatting specifications of the RefDB bibliography styles are almost wasted on BibTeX bibliographies currently. You still need one of the native BibTeX styles to do the actual formatting until RefDB bibliography styles can be exported as BibTeX styles. The current implementation uses only the formatting information of the journal name to allow either the full name or one of the abbreviations to appear in the bibliography. So for the current implementation you can get away with just two simple styles that define only the journal name formatting for the “GEN†publication type. These can be found as bibtex-abbrev.xml and bibtex-full.xml in the style directory of the source distribution.

It is admittedly no easy task to write correct bibliography styles from scratch. It may be easier to pick a similar style (if there is one) and modify it to your needs. In this section you will find a brief overview how a bibliograpy style is put together. For more detailed information, please peruse the separate documentation of the CiteStyle XML DTD.

Write or modify a bibliography style file

It is recommended to use a validating XML editor like Emacs/nXML to write bibliography styles using the CiteStyle XML DTD. This ensures that you end up with a valid style that won't confuse RefDB. If you edit styles with a simpler editor, please run the resulting file through a validating parser like onsgmls or xmllint before adding it to your main database.

The CITESTYLE element defines a bibliography style for one particular journal or publisher. You can group several styles in one file with the STYLESET wrapper element.

Each CITESTYLE element contains exactly four top-level elements (Figure 10.1, “Schematic representation of a CITESTYLE elementâ€). The STYLENAME defines the name of this style. For the sake of simplicity this could be identical with the name of the journal or publisher whose bibliography style it defines, e.g. “J.Biol.Chem.†or “Elsevierâ€. The REFSTYLE element contains the style definitions for the various publication types that can appear in a bibliography, like books, journals, or personal communications. A special case is the type “GEN†which defines a default bibliography style that is applied whenever no specific definition is available for the requested type. Although the DTD does not enforce this, it is strongly recommended to define a “GEN†definition for each bibliography style. The CITSTYLE element defines the citation style, i.e. the appearance of the citations in the main text. Finally, the BIBSTYLE element defines the properties of the bibliographic listing.

Figure 10.1. Schematic representation of a CITESTYLE element

Schematic representation of a CITESTYLE element

Each definition for a publication type in turn is basically an ordered list of the elements that make up the rendered bibliographic entry, like authorlists, publication dates, titles, and so on. You can arrange them in any order you like. All available elements can hold a PRECEEDING and a FOLLOWING element which define strings that are inserted before and after the corresponding element, respectively. This can be used to place punctuation characters or brackets wherever such a non-empty element occurs. A special element is SEPARATOR which usually also contains punctuation characters. This element is always inserted even if the preceeding or following element is empty.

The styles also reflect the three-level representation of the bibliographic data themselves. For a discussion of this representation see the description of the risx format. When you write a bibliographic style, you have to make sure to pick the correct level, as indicated with the role attribute, for the author lists and the titles. E.g. a chapter entry would typically have AUTHORLIST and TITLE elements with the role attribute set to "PART" to display the chapter author and title, respectively, and additionally AUTHORLIST and TITLE elements with the role attribute set to "PUB" to render the editor and the title of the whole book, respectively.

The CITSTYLE element can define three different styles for citations: INTEXTDEF for regular citations as well as AUTHORONLY and YEARONLY for citations that keep the authors in the flow of the text. These elements are equivalent to the definition of a publication type in the REFSTYLE element.

Please peruse the separate documentation for the CiteStyle XML DTD for the details about the individual elements, and feel free to consult the styles shipped with RefDB for further guidance.

Tip

The RefDB project also provides a tool to create citation styles interactively. The refdb-ms Perl script is part of the RefDB sources.

refdb-1.0.2/doc/refdb-manual/ch10s03.html000644 001750 001750 00000156100 12255431205 020515 0ustar00markusmarkus000000 000000 Create SGML and XML bibliographies

Create SGML and XML bibliographies

Although SGML documents are usually processed with a DSSSL toolchain and XML documents with a XML toolchain, the procedures to generate documents with bibliographies are similar enough to treat them in a single section. If you use the high-level tools provided by RefDB, you won't even notice a difference.

RefDB can create two types of bibliographies, cooked and raw. Cooked bibliographies are already preformatted using the information of a particular bibliography and citation style. Documents using cooked bibliographies have to be processed using the appropriate stylesheet driver files provided by RefDB. Raw bibliographies (currently supported only for XML documents) contain no particular formatting and should therefore be processed using the regular DocBook or TEI stylesheets.

RefDB provides both high-level tools which attempt to hide the entire complexity of the bibliography business, and low-level tools which allow experienced users to integrate RefDB into their own toolchains. We'll first describe the high-level approach which should always be the first choice. The subsequent sections give all the details about the low-level tools which you normally don't even want to know about.

Keeping it simple with refdbnd

refdbnd provides the simplest approach to create, maintain, and transform documents with RefDB bibliographies. Once set up, all you'll have to do is to run something as simple as make pdf. The following subsections cover how to set up a refdbnd-managed project, how to cite, and how to process the document.

Setting up a project

refdbnd is an interactive script which creates a skeleton document and a custom-tailored Makefile. Start the script in a clean subdirectory by typing refdbnd. You'll be asked a couple of questions, each of which supplies sufficient background information for novice users. The script will then create three files (we'll assume that the basename that you provided was "foo"):

foo.short.[sgml|xml]

The ".short" reminds you that you're supposed to use the short notation for citations in this file. This is simpler, usually more convenient, and should always be your first choice.

foo.[sgml|xml]

This file is just a dummy in a fresh project. If you edit the file foo.short.xml, the file foo.xml will automatically be updated and fed to the subsequent processing steps next time you run make. Unless you know what you do, you don't want to touch this file.

Makefile

This is a customized Makefile that contains all the information that you provided to refdbnd. Simply run commands like make pdf or make html to create printable or HTML output with formatted citations and bibliographies from your document.

Editing your document

The foo.short[sgml|xml] skeleton document contains the required markup to start a book or an article. You'll now want to open this file in your favourite text editor to write the contents and to add your citations. In DocBook SGML and XML documents, citations are encoded as citation elements. To distinguish these from citation elements that are not meant to be processed by RefDB, set the role attribute to REFDB in all caps. Each citation element contains one or more references, separated by semicolons. The trailing semicolon after the last reference is optional, so the following citations are absolutely equivalent:

<citation role="REFDB">2;5;9</citation>
<citation role="REFDB">2;5;9;</citation>
	

The values identifiy the bibliographic entries in your database. Use either numerical IDs as in the examples above, or alphanumeric citation keys as shown in the following example:

<citation role="REFDB">Miller1999;Jones2001</citation>
	

The corresponding syntax for TEI XML documents is quite similar, except that we abuse the general-purpose seg element and tag it for use with RefDB by setting the type to REFDBCITATION in all caps:

<seg type="REFDBCITATION">2;5;9</seg>
	

Again, you can use citation keys instead of the numerical IDs shown in the example above.

The examples shown above will be rendered as "regular" citations. In addition to this you can request author-only or year-only citations. These come in handy if you want to write something like: Jones et al. reported recently (2001)... Both the authors (Jones et al.) and the year (2001) need to be encoded as individual citations as shown in the following example:

<para><citation role="REFDB">A:Jones2001</citation> reported
recently <citation role="REFDB">Y:Jones2001</citation> ...</para>
	

You may have guessed that the prefix "A:" tags a citation as an author-only citation and that the prefix "Y:" means year-only.

Note

These prefixes tag the whole citation, not a particular reference in the citation. Therefore the prefix must be the first thing right after the start tag. Multiple citations using the author-only or year-only style would make no sense anyway.

Transforming your document

The Makefiles created by refdbnd offer the following targets:

pdf

This target generates a PDF file from your source document. PDF is a widely accepted document format with free viewers for essentially all current operating systems. Be aware that not all FO processors (used in transforming XML documents) offer PDF output.

html

This runs all required commands to create HTML output, viewable with any web browser. Depending on your local setup, the output will be chunked into a collection of HTML files.

rtf

This target generates a Rich Text Format (RTF) file. This plain text format is sort of a word processor interchange format understood by most current word processors, including MS Word, WordPerfect, and OpenOffice/StarOffice. Not all FO processors offer RTF output though.

ps

This target is only available for SGML documents. It will create a Postscript document from your source. Postscript is the universal document format on Unix systems and can be printed directly on Postscript printers. Viewers are available for all current operating systems.

The Makefile also offers a few more targets. For each of the above targets there is a corresponding '<target>dist' target which creates a .tar.gz archive of the output document, along with its associated CSS stylesheet if applicable. The target 'all', which is also the default if you don't specify a target to make, builds all available output formats. Accordingly, the target 'dist' creates all archives. And finally, the target 'clean' removes all intermediate files and returns your directory to the original state.

The refdbnd-generated Makefiles should be sufficient for the average document. However, feel free to modify them in order to adapt them to specific needs. For example you can specify a different style in order to switch your output to a different citation and bibliography style. make also allows you to override variable settings on the command line. E.g. if you want to output your document using a different bibliography style without making it the permanent default, invoke make like this:

	  ~$ 
	  make clean && make pdf stylename="Eur.J.Pharmacol."
	

Note

make clean removes intermediate files to let the change of the bibliography style take effect.

Bibliographies, the hard way

If the simple approach outlined above does not suit your needs, you can turn to the low-level bibliography tools provided by RefDB. Needless to say, you can always start with a refdbnd-created project and use the low-level tools whenever you run into any limitations. However, this section describes the manual creation and transformation of documents from the ground up.

Prepare the document

RefDB's bibliography output is a bibliography element that contains all required references. You can redirect the output into a file and include this file at the spot where your bibliography should appear. To achieve this you need two modifications in your document:

  1. When using DTD-based documents (i.e. DocBook 4.x or TEI P4), extend the document type declaration at the beginning of your document to declare the external entity. The first example is from a DocBook SGML document:

    <!DOCTYPE BOOK PUBLIC "-//OASIS//DTD DocBook V3.1//EN" [
    	    <!ENTITY bibliography "foo.bib.sgml">
    	    ]>
    	    ...
    	    

    The second example shows a TEI XML document:

    <?xml version="1.0"?> 
    	    <!DOCTYPE TEI.2 PUBLIC "-//TEI P4//DTD Main Document Type//EN" "http://www.tei-c.org/P4X/DTD/tei2.dtd" [
    	    <!ENTITY % TEI.general 'INCLUDE'>
    	    <!ENTITY % TEI.names.dates 'INCLUDE'>
    	    <!ENTITY % TEI.linking 'INCLUDE'>
    	    <!ENTITY % TEI.XML 'INCLUDE'>
    	    <!ENTITY bibliography SYSTEM "refdbtest.bib.xml">
    	    ]>
    	    ...
    	    

    The name of the entity is of course yours to choose, but using “bibliography†as in this example is pretty descriptive.

    When using schema-based documents (i.e. DocBook 5.x or TEI P5), there is no need to declare the bibliography at the beginning of the document.

  2. Include the bibliography at the desired spot as an external entity for DTD-based documents:

    ...
    	    &bibliography;
    	    ...
    	    

    Alternatively, use xinclude to include the bibliography in schema-based documents:

    ...
    	    <xi:include href="refdbtest.bib.xml"
    	    xmlns:xi="http://www.w3.org/2001/XInclude">
    	    <xi:fallback>refdbtest.bib.xml appears to be missing</xi:fallback>
    	    </xi:include>
    	    

    Note

    Some XSLT processors require a command-line switch or additional libraries to support xincludes. If your transformed document should lack the bibliographic listing, consult the documentation of your XSLT processor.

    You need to make sure that the included chunk of text is valid at the point where you want to include it. DocBook SGML and XML bibliographies are generated as bibliography elements, TEI XML bibliographies are wrapped in div elements.

Create citations

Creating citations and bibliographies in SGML or XML documents with RefDB is very similar to what you would do if you had to manually code the bibliographies - but without the sweat. First you create the citations. Each citation consists of one or more bibliographic references in the text, each of which points to one particular entry in the bibliography. Then you create a bibliography for all cited publications (and possibly some more). For an increased benefit you would certainly also want to create functional links from the citations to the corresponding bibliography entries, which would act as hyperlinks in suitable output formats like HTML or PDF. In real life, you would probably jump back and forth, adding a bibliography entry whenever you add a new citation, and invent suitable ID values for your bibliographic link targets as needed.

Note

The distinction made here between a citation and a bibliographical reference may sound like nitpicking, but it will be important when we deal with citations that contain more than one bibliographical reference.

RefDB requires a slightly more formalized approach. You have to stick to a particular syntax when you create the citations, but the good news is that RefDB does almost all of the rest. You will usually also create the citations first and let RefDB create the bibliography just before you are ready to transform the first draft.

RefDB uses three different notations for references:

Short notation

The short notation is, as the name implies, a lot faster to type and thus more convenient, but it requires an additional preprocessing step that adds some small restrictions to the way you write your documents (please see the section about refdbxp for details about these restrictions). The preprocessing of documents using the short notation also automates the issue of first and subsequent citations of a bibliographic entry and it automatically creates the ID values used in multiple citations. Using multiple databases per document is not supported by the short notation currently.

The short notation is fully valid SGML or XML code, without any extensions of the original DTDs. You can use all sorts of SGML or XML processing tools on such documents.

Full notation

The full notation offers full control but requires a lot more typing and thinking. It does not require a preprocessing step before the transformation, though. You need to take care of the issue of first and subsequent citations of a reference, and you have to manually generate ID values for use in multiple citations. You can include references taken from several databases.

Just like the short notation, the full notation is also fully valid SGML or XML code, without any extensions of the original DTDs.

ID notation for raw bibliographies

If you want to process your document with the default Docbook or TEI stylesheets using a raw bibliography, you just use the citation key as te value of the linkend attribute of the xref or biblioref elements to refer to the appropriate reference entry in the bibliography. RefDB will generate the bibliography using the citation key as the id or xml:id (for DocBook 5.x and TEI P5) attribute.

First we'll have a look at the short notation, before we get into the gruesome details of the full notation. Keep in mind that the refdbxp application interconverts the short and the full notation. You can convert your document back and forth as often as you wish, so you're not limited to the notation that you initially choose. In fact, you can mix both notations in a single document. Finally, we'll also show examples of the ID notation for raw bibliographies.

Short notation

The short notation has been described above as this is the notation which you use in refdbnd-maintained projects. The only thing you must not forget when not using refdbnd is that you must preprocess documents that contain citations in short notation with refdbxp before you transform the document to one of the output formats.

Full notation

The full notation is a lot more complex than the simple notation described above. So unless you have specific reasons to write citations in full notation from scratch, it is more advisable to use the short notation and preprocess your documents with refdbxp. The output created by this utility is the full notation described in this section.

The particular syntax of citations and bibliographic references is necessary for two reasons: first we have to tell RefDB which bibliographic database entry (and probably, from which database) we want to reference. Second, we need to encode which type of citation or reference we want. The exact markup depends on the DTD that your document uses, but the basics are the same.

In both DocBook and TEI documents, these two bits of information are encoded in attributes of elements that create a link from the reference to the bibliographic entry. In order to handle multiple citations correctly, these link elements need to be inside a wrapper element. For a DocBook document, basic citations therefore look like this:

<citation role="REFDB">      1
	  <xref linkend="ID1-X">        2
	  </citation>
	  <citation role="REFDB">
	  <xref linkend="LITIBP-ID2-X"> 3
	  </citation>
	  

1

The citation element is a wrapper for one or more bibliographic references. The role attribute is set to REFDB to distinguish this citation from other citation elements that RefDB should leave alone. Each citation element can contain one or more xref elements.

2

Each xref element specifies one bibliographic reference. The value of the linkend attribute encodes which bibliographic item is referenced (in this case, the database entry with the ID 1) and how the reference should be rendered (see below). It consists of the string "ID" followed by the numerical database entry ID, and a trailing one-letter type specifier ("X" in this case), separated from the rest by a dash. This simple form does not encode the database from which the reference is to be pulled. When generating the bibliography, you will specify a default database from which all references without an explicit database label will be taken from. This form is most convenient if all your bibliographic items are stored in one database.

3

This xref element shows the syntax when an explicit database (LITIBP in this case) is specified. The attribute value consists of the database name, a dash, the string "ID", the numerical database entry ID, and the trailing type specifier. This form is mandatory only if you reference bibliographic entries from different databases in the same document (again, one database can be set as the default database in subsequent processing steps, so you could use the simple form for all references to entries in that particular database).

Note

This and the following DocBook examples are given in SGML notation. Keep in mind two things when working with XML documents:

  • The empty xref elements need a closing slash as in <xref linkend="ID2-X"/>.

  • All attribute values relevant to RefDB must be in uppercase. This restriction is imposed by the way citations are currently extracted from the document. It may be dropped in later versions though.

The corresponding syntax in a TEI XML document looks like this:

<seg type="REFDBCITATION">      1
	  <ptr targOrder="U" target="ID1-X" TEIform="ptr"/>       2
	  </seg>
	  <seg type="REFDBCITATION">
	  <ptr targOrder="U" target="LITIBP-ID2-X" TEIform="ptr"/>3
	  </seg>
	  

1

The general-purpose seg element with the type attribute set to REFDBCITATION is the citation wrapper for one or more bibliographic references.

2

Each bibliographic reference is specified by a ptr element whose target attribute encodes the bibliographic entry that is referenced. As explained in the DocBook example, this is the simple form that does not specify the database.

3

This is the corresponding bibliographic reference with the database specified.

Note

You don't have to worry about the attributes in the example which are not mentioned in the explanations. These are TEI default attributes which do not have anything to do with RefDB (your XML editor will most likely create them automatically for you).

There are several ways to render citations and bibliographic references in the text. You select what you need by a trailing capital letter after the database ID (the "X" in the above examples). RefDB will create several preformatted strings in the bibliography file which can be linked to by selecting the proper postfix. These preformatted strings have several purposes, as shown in the following table:

Table 10.1. Bibliographic reference types

PostfixPurpose
XThe most common case. This is the first occurrence of a reference which is to be displayed outside the flow of the text. In numerical citation schemes this will be something like "(2)", in author-year citation schemes this may be rendered as "(Miller et al., 1992)".
SThis is the same as X, but for a subsequent occurrence of the same reference. This distinction is important for some author-year citation schemes that print the full (or at least a longer) author list at the first occurrence and an abbreviated one at all subsequent occurrences of the same reference.
AThis is the first occurrence of a reference that displays the authorlist inside the flow of the text, like in "Miller et al. reported recently (2001)...".
QThis is the same as A, but for subsequent occurrences of the same reference.
YThis type complements the author-only references mentioned above. In numerical citation schemes this is usually rendered like a normal reference, e.g. as "(2)", but in author-year citation schemes usually only the publication date is rendered, as in "(2001)".

Note

The exact formatting of these references, e.g. which citation style is used or which brackets surround the reference, is controlled by the style specification for a particular publication or publisher. This takes effect when you generate the bibliography and transform the final document.

An additional twist comes into play if you have multiple citations, i.e. a citation that contains more than one bibliographic reference. In most cases, all references are displayed inside of one pair of brackets. Some numerical citation styles require that bibliographic references with consecutive numbers be formatted as ranges within the same citation.

Note

Formatting consecutive numbers as ranges kills the links from the reference to the bibliographic item for each reference that make up a range. Any generated hyperlinks will therefore point to one common target for all members of a multiple citation. If this is not desired (e.g. to keep the links alive in a HTML presenation of a scientific document), you may override this behaviour during the transformation of the final document.

In order to format these cases properly, you need to include a dummy element whose sole purpose is to provide a link to an element that contains the combined, preformatted citation string. This is shown for a DocBook document in the following example.

<citation role="REFDB">
	  <xref endterm="IMTHEFIRST" linkend="ID1" role="MULTIXREF">1
	  <xref linkend="ID1-X">                                   2
	  <xref linkend="ID14-X">
	  <xref linkend="ID7-X">
	  </citation>
	  

1

This is the additional xref element which is mandatory in multiple citations. The linkend specifies the target of a link, which by convention could be the first of the following references. Note that the attribute value does not have a trailing type specifier. The element must have a role attribute with the value MULTIXREF. You also have to provide an unique value for the endterm attribute. This specifies the ID value that will be used in the corresponding element in the RefDB-generated bibliography that contains the preformatted string for the multiple citation. The ID value has to start with the letters "IM" as a sort of sanity check.

2

This and the following xref elements define the actual references that comprise the multiple citation.

Note

The sequence of the xref elements that encode the actual references may be important. Depending on the bibliography style used for the document transformation, the references may be displayed in the sequence as they were entered, or they may be rearranged according to the sequence of the bibliographic entries in the finished bibliography.

Keep also in mind that all attribute values must be in uppercase for the same reasons as stated above.

The corresponding TEI citation is a little bit simpler:

<seg type="REFDBCITATION">
	  <ptr type="MULTIXREF" targOrder="U" target="IMTHEFIRST" TEIform="ptr"/>1
	  <ptr targOrder="U" target="ID1-X" TEIform="ptr"/>                     2
	  <ptr targOrder="U" target="LITIBP-ID21-X" TEIform="ptr"/>
	  <ptr targOrder="U" target="ID5-X" TEIform="ptr"/>
	  </seg>
	  

1

This is the additional ptr element which is mandatory in multiple citations. The element must have a type attribute with the value MULTIXREF. You also have to provide an unique value for the target attribute. This specifies the ID value that will be used in the corresponding element in the RefDB-generated bibliography. The ID string has to start with "IM". In contrast to DocBook elements, there is no way to specify where a link should point to. The RefDB XSL stylesheets will use the first bibliographic entry referenced in a multiple citation as the link target.

2

This and the following xref elements define the actual references that comprise the multiple citation.

ID notation for raw bibliographies

This notation is similar to what you'd do in a document which does not use RefDB bibliographies at all, except that you have to declare which citation elements should be processed by RefDB (it may very well be that RefDB is supposed to process all of these elements, but in order to support cases where it shouldn't, there is a mechanism to allow just this). Just set the role attribute of the citation element to REFDB to include it in the list of citations that runbib extracts from your document, like this:

<citation role="REFDB"><xref linkend="Bellamy2002"/></citation>
	  

Generate the bibliography

Unless you have good reasons not to do so, you should use the runbib shell script to generate the bibliography. This script greatly simplifies this task and offers a common interface for all supported document types. The following subsection will explain the use of this script. If you like to do it the hard way (or if you want to peek under the hood) you'll find a few explanations further down how to do this.

Use runbib

Lets assume you have a DocBook SGML document mypaper.sgml and want to submit it to the "Journal of Irreproducible Results". We further assume that the bibliography style for this famous periodical is stored in your database under the name "J.Irrep.Res." (see Manage bibliography styles to learn how it gets there). All your bibliography entries (at least those referenced without an explicit database name) are stored in the database mybib. Start the script from the directory that contains your document with the following command:

	    ~$ 
	    runbib -d mybib -S "J.Irrep.Res." -t db31 foo.sgml
	  

For a similar TEI XML document bar.xml you would run:

	    ~$ 
	    runbib -d mybib -S "J.Irrep.Res." -t teix bar.xml
	  

In both cases you will end up with a bibliography file (foo.bib.sgml and bar.bib.xml, respectively) as well as with a stylesheet (J.Irrep.Res.dsl) or a set of stylesheets (J.Irrep.Res.fo.xsl and J.Irrep.Res.html.xsl), respectively.

Note

Don't worry if you are greeted by a list of (Open)Jade errors complaining about missing elements when you first run this script on a particular document. Your document contains a number of crosslinks that point to elements that do not exist yet - you use runbib precisely to create these elements (you thus face a classic bootstrapping problem). As soon as the bibliography is created, these error messages should go away. Later you will only get an error message for each bibliographic entry that was added since the last time you ran runbib.

To tell runbib that you want to create a raw instead of a cooked bibliography, use the -r command line switch. As there is no style information involved, you don't need the -S option in this case:

	    ~$ 
	    runbib -d mybib -r -t db50x bar.xml
	  

This will create a raw bibliography from the DocBook 5.0 document bar.xml, using the reference entries in the database mybib.

Do it the hardest possible way

The following steps trace back exactly what the runbib script does. The only benefit of the hard way is that you have a chance to fiddle with the intermediate XML file which contains the list of bibliographic entries that should go into the bibliography. You can add further entries to extend the bibliography if you want to include uncited publications. The following procedure was written with a DocBook SGML document in mind, but transferring the commands to XML documents is straightforward. However, when working with XML documents there are additional steps required as outlined below.

  1. Extract the list of bibliographic references

    Use Jade or OpenJade with the citations.dsl stylesheet to create a list of the reference IDs from SGML files (provide full paths as needed):

    		#~ 
    		openjade -t sgml -d citations.dsl /usr/lib/sgml/declaration/docbook-3.1.dcl foo.sgml > foo.id.xml
    	      

    Be prepared for a long list of "missing ID" error messages. This is due to the fact that the elements with the IDs that the xref elements in the citations point to do not yet exist, they will be generated in the RefDB bibliography output. If you process documents with more than 200 citations, you'll have to increase the maximum error limit of Jade in order to obtain all IDs the first time. After the first complete pass (including the steps outlined below), Jade will only complain about any additional citations that you have inserted since the last run.

    XML files are processed using your favourite XSL processor. There are two different stylesheets available for raw and for cooked bibliographies. Both work all the same for DTD-based (DocBook 4.x, TEI P4) and schema-based (DocBook 5.x, TEI P5) documents:

    		#~ 
    		xsltproc --catalogs --xinclude /usr/local/share/refdb/xsl/citations.xsl  foo.xml > foo.id.xml
    		#~ 
    		xsltproc --catalogs --xinclude /usr/local/share/refdb/xsl/citationsraw.xsl  foo.xml > foo.id.xml
    	      

    In all cases the output is a simple XML file that contains the information about all citation and xref elements with their relevant attributes. It is absolutely legal to extend this file with additional citation elements to specify references which are not cited but nonetheless should appear in the bibliography.

    Unfortunately, both Jade and OpenJade don't get that Doctype line quite correct. Both forget to insert a space between the public and the system identifier, thus leaving you with a not well-formed document. Fire up your favourite editor and fix this line manually (insert a space between the two consecutive quotation marks on line 2).

    If you edit this intermediate XML file (that is, if you do more than just fixing the Doctype line), you should make sure that the result is still valid according to the CitationList XML DTD. RefDB uses a non-validating parser to read this file so deviations from the DTD may slip through undetected and may have undesired consequences. The intermediate XML file carries the SYSTEM identifier of the CitationList XML DTD in the document type declaration. You may have to adapt the stylesheet citations.dsl to use the correct path for your local system.

    The following command lines can be used to validate the document with (o)nsgmls or xmllint (change the paths as necessary):

    		~$ 
    		onsgmls -wxml -s /usr/lib/sgml/declaration/xml.dcl foo.id.xml
    		~$ 
    		xmllint --noout --nonet --dtdvalid file:///usr/local/share/refdb/dtd/citationlistx.dtd foo.id.xml
    	      
  2. Create the bibliography file

    		~$ 
    		refdbib -d mybib -S "J.Irrep.Res." -t db31 foo.id.xml > foo.bib.sgml
    	      

    This assumes that your reference database is called "mybib" and that you try to publish your paper in a journal that accepts the style with the name "J.Irrep.Res.".

    In addition to the bibliography file, refdbib will also create a DSSSL script containing the style specification. This file is a customized driver file for the RefDB-DocBook driver files and provides a couple of variable values specific for the given bibliography style.

    If you want to generate a raw bibliography, use a command like this:

    		~$ 
    		refdbib -d mybib -r -t db50x foo.id.xml > foo.bib.xml
    	      
  3. Post-processing

    This step is only required for XML documents. First we have to bring the stylesheets into shape, and if it is a TEI document, we'll also have to transform the bibliography file itself.

    refdbib creates a general-purpose XSL stylesheet which we need to turn into one FO and one HTML stylesheet. Create two copies of the file. If the stylesheet was e.g. J.Biol.Chem.xsl, you need one copy named J.Biol.Chem.fo.xsl and one copy named J.Biol.Chem.html.xsl. Scan the files for an import statement whose href attribute is surrounded with two "<!-- REFDBSTYLESHEET -->" comments. The value of this attribute must be set to the full path of the corresponding original stylesheet (DocBook FO or HTML, or TEI FO or HTML).

    If you're working on a TEI P4 XML document, you'll have to transform the bibliography file itself. This is a DocBook SGML document and can be transformed easily with Jade/OpenJade and the bibdb2tei.dsl stylesheet. TEI P5 bibliographies are exported directly by refdbd and do not require further processing.

Transform the document

Finally you can transform the document to create printable or HTML output. If you use cooked bibliographies you have to use the RefDB driver files for the DocBook or TEI stylesheets.

In addition to the general modifications of these driver files we'll have to apply modifications specific for the particular reference style. Therefore you have to specify the DSSSL or XSL style specification file that was created in the previous step. For your convenience it is recommended to use the supplied refdbjade and refdbxml scripts for DSSSL and XSL transformations, respectively, which were designed for this task:

	  ~$ 
	  refdbjade -t html -s J.Irrep.Res.dsl foo.sgml
	
	  ~$ 
	  refdbxml -t pdf -s J.Irrep.Res.fo.xsl bar.xml
	

If you want to change the bibliography style of your document, all you need to do is to rerun runbib and refdbjade or refdbxml with the new parameters. No changes to your DocBook source are necessary.

Processing your document with a raw bibliography does not differ from processing any other DocBook or TEI document. However, you can still use the refdbxml script to avoid having to type the full command line of your XSL processor. Use something like this to process a Docbook 5.0 document with a raw bibliography:

	  ~$ 
	  refdbxml -t pdf -s db5 bar.xml
	

The -s option tells the script to use the stock DocBook stylesheets for version 5. Other values are "db", "tei", and "tei5" for the DocBook stylesheet for version 4.x, the TEI P4 stylesheets, and the TEI P5 stylesheets, respectively

Note

If you want to create a bibliography for each part of a book or for each chapter, the procedure is not much different. The simplest approach is to keep the parts or chapters in individual files and process these individually as described above for the whole document. You'll get several bibliography files that you can include into the corresponding document source files.

How to use custom stylesheets

We have assumed in the previous instructions that the stock DocBook or TEI stylesheets suit your needs when processing your documents. However, if you need a particular formatting of the parts of your document which are not under the control of RefDB (things like fonts, colours, font sizes and so on), you'll have to create a driver file with your personal modifications, and somehow make sure this driver file is used whenever your document is processed. This section discusses the available mechanisms to use particular XSL driver files as a per-user or a per-document option. Currently no such mechanism is available for the DSSSL stylesheets.

A driver file is essentially a stylesheet which imports the stock stylesheets and adds a few modifications. XSL is designed such that any definition of a template in the driver file overrides the definition in the imported file. RefDB uses this mechanism extensively to provide the formatting of citations and bibliographic listings. Whenever you run refdbib (or runbib which calls the former), a driver file is created which imports a general RefDB driver file. This general driver file in turn includes the stock stylesheets (imports can be nested). If the stock stylesheets don't suit your needs, you'll have to provide two driver files:

  • a driver file for the stock stylesheets which contains your modifications of those parts which are not under RefDB's control. Obviously, this driver file must import the stock stylesheets. You can put this driver file into any convenient subdirectory in your home directory. For further information about how to set up a driver file, please see Bob Stayton's DocBook XSL Guide (the general approach is applicable to TEI and any other XSL stylesheets just as well)

  • a modified general RefDB driver file which imports your driver file instead of the stock stylesheets. To this end, copy the relevant general RefDB driver file (there are driver files for fo, html, and xhtml output, and they are available both for DocBook and for TEI) to a convenient subdirectory in your home directory and modify the import statements to suit your needs.

There are two options to have the modified general RefDB driver file used instead of the default ones:

  • if you want to apply your modifications as a default to all documents which you process, consider adding the paths to your personal copy of the runbibrc configuration file.

  • if you want to apply the modifications to a particular refdbnd-created project, just specify the paths of the modified general RefDB driver files when setting up the project. This way, each project can use a different set of modifications.

Figure 10.2, “Stylesheets involved in processing RefDB documents†visualizes how a document containing a RefDB bibliography is processed with a focus on the stylesheets involved. The example shows the transformation of a DocBook XML document to fo (which might then be processed to e.g. PDF). However, the same principles are applicable to other output formats and other document types. The left hand side shows the default processing using the stylesheets installed by RefDB. refdbib (which may be invoked by runbib, or by running a refdbnd-created Makefile) creates an intermediate stylesheet containing the style-specific information. This stylesheet is converted to output-type-specific driver files for fo, html, and sometimes xhtml output. The figure shows only the fo driver file to keep it simple. This driver file imports the general RefDB fo driver file, which in turn imports the appropriate official DocBook fo stylesheet. The right hand side shows how to process the same document with a DocBook driver file which may alter the general formatting of the document (page size, borders, fonts and the like). As you can see, you have to provide both the DocBook driver file and an equivalent of the general RefDB fo driver file, which has to import your driver file instead of the stock DocBook stylesheet.

Note

You can of course add all your general modifications to myrefdbdriver.xsl and have that import the stock DocBook stylesheet. However, doing it in two steps as shown will allow you to use mydocbookdriver.xsl for non-RefDB projects as well.

Figure 10.2. Stylesheets involved in processing RefDB documents

Stylesheets involved in processing RefDB documents

refdb-1.0.2/doc/refdb-manual/ch10s04.html000644 001750 001750 00000017157 12255431206 020527 0ustar00markusmarkus000000 000000 Create LaTeX/BibTeX bibliographies

Create LaTeX/BibTeX bibliographies

RefDB integrates quite nicely with the LaTeX/BibTeX system. If you previously used a flat text file to store your BibTeX references, you will notice that there is only one additional command to run when you process your source document. Instead of keeping all of your references in a text file, refdbib will retrieve only the required references from the SQL database and store them in an intermediate text file.

  1. Prepare the document

    Use the LaTeX commands cite and nocite to include the references as usual. The extended commands from the natbib package should work as well. All these commands take an identifier for the reference as an argument. These reference definitions can come in two flavours just like in DocBook documents: Either you use the same database for all references in the text. Then you just specify the citation key of the reference and tell the processing application which database to use. Or you specify the database name with each citation. In this case, you can pull the references from different databases in the same document. The two versions look like this:

    \cite{Miller1999}
    	\cite{litibp:Myers2001}
    	

    The first version cites the reference with the citation key “Miller1999†in the database passed to the processing application as an argument. The second form cites the reference with the citation key “Myers2001†in the database “litibpâ€. Please note that, in contrast to SGML/XML citations, the database part is separated by a colon from the citation key.

    The LaTeX \bibliography command takes as an argument the name of the intermediate bibliography file without the extension. A simple choice would be the basename of your LaTeX document.

    Note

    Keep in mind that even if you pull references from different RefDB databases, you still need to specify only one reference database in your LaTeX document as RefDB consolidates all cited references into one bibliography file.

  2. Create the auxiliary file

    Run the latex interpreter with the basename of your document (foo.tex) as an argument:

    	  #~ 
    	  latex foo
    	

    latex will create, among other files, foo.aux. latex stores all sorts of information in these auxiliary files for later use in subsequent runs. The interesting part for us is the list of citations.

  3. Create the intermediate bibliography file

    Now RefDB enters the stage. We process the auxiliary file to create a BibTeX bibliography tailored to our document. Either we do it manually:

    	  #~ 
    	  sort foo.aux | uniq | refdbib -d mybib -S name -t bibtex > foo.bib
    	

    Note

    The .aux file should be preprocessed through sort and uniq as shown here to avoid duplicate entries in your bibliography.

    Or we use the runbib shell script:

    	  #~ 
    	  runbib -d mybib -S name -t bibtex foo
    	

    Remember that the basename of the file that receives the bibliographic information (foo.bib in our example) must match the name given in the bibliography command in the LaTeX document.

    The resulting bibliography file will contain all references that were requested from the LaTeX document. If you add more citations to this document, you have to run refdbib again to update the intermediate bibliography file (it won't hurt if you remove citations from your LaTeX document, though).

    Note

    For the sake of consistency with bibtex, it is possible (though not necessary) to specify the auxiliary file without the .aux extension (foo in the above example).

  4. Run bibtex

    From here, everything runs as you are used to from LaTeX/BibTeX:

    	  #~ 
    	  bibtex foo
    	
  5. Run latex

    Run latex on your LaTeX document at least twice to get all references right:

    	  #~ 
    	  latex foo && latex foo
    	
refdb-1.0.2/doc/refdb-manual/ch10s05.html000644 001750 001750 00000016707 12255431206 020530 0ustar00markusmarkus000000 000000 Create RTF bibliographies

Create RTF bibliographies

Rich Text Format (RTF) is a plain-text format understood by most word processors. While RefDB does not integrate into the menu bar of M$ Word or OpenOffice, it still allows you to add bibliographies to word processor documents saved as RTF files. This is a one-way process which leaves your original document untouched. You can edit the compound document and save it to native word processor formats like .doc or .odt, but you'll have to start over with the RTF document as soon as you add, change, or remove citations. Therefore the following sequence (which will be familiar to the SGML/XML and LaTeX folks) is recommended when using RefDB to create bibliographies for word processor documents:

  1. Author your document

    Write the contents of your document until you're really done. Use the citation format described further down. It does not matter which file format you use at this stage, as long as you can export it to RTF in the end.

  2. Save your document in RTF format

    Now save your document as a RTF file. There may be an extra menu entry called Export but usually you can just select the file format in the Save as... dialog.

  3. Create and insert the bibliography

    The exact procedure will be described below. The runbib command creates a bibliography file, and the refdbrtf tool combines the source document and the bibliography file to a new compound RTF document. Note that neither your word processor document nor the RTF copy are altered by this procedure.

  4. Import and finalize your document

    You can now open the compound RTF document using your word processor and add final touches (like adding images which you don't need during the authoring step). You can save the document in a word processor format, print it, or export it as a PDF file.

As with SGML and XML documents, RTF documents can be maintained in a simple fashion using a refdbnd-created Makefile. The more complex way of running the involved tools manually essentially parallels the way used for SGML and XML documents and will not be elaborated here.

Create a RTF document for use with RefDB

In contrast to SGML and XML documents, there is nothing special about RTF documents that you can use with RefDB. You should still run refdbnd and select "rtf" as a document type. This will generate a suitable Makefile and a skeleton RTF document. You can open that with your favourite word processor, or copy an existing RTF document and save it under the same name.

Create citations in word processor documents

RefDB recognizes a simple plain-text citation format in RTF documents. Citations are enclosed in square brackets. Inside a citation, each reference is again enclosed in square brackets. References are identified by their citation keys, followed by one of "-X", "-A", and "-Y" to denote regular citations, author-only citations, or year-only citations, respectively (the RefDB low-level tools handle the first vs. subsequent occurrence issue silently for you, therefore there is no need for "-S" and "-Q" although these are valid too). The following text snippet shows some citations:

...was shown[[Miller1999-X]]. This was confirmed by other groups
as well [[Doe2000-X][Jones2000-X]]. However, [[Nerd2002-A]] challenged this
view in a recent work[[Nerd2002-Y]]...
      

Process RTF documents

As word processor documents lack the separation between content and formatting, there is usually no transformation required to read or print a document. However, as the processing requirements from RefDB's point of view are not any different between RTF and XML documents, RefDB still has to transform your RTF document - to yet another RTF document. While doing so, it massages your in-text citations into appropriately formatted links to the bibliographic entries, and appends a formatted bibliographic listing. All you need to do is to run make. This will create the output file foo.refdb.rtf from your project file foo.rtf.

refdb-1.0.2/doc/refdb-manual/ch10s06.html000644 001750 001750 00000007660 12255431206 020527 0ustar00markusmarkus000000 000000 Using custom stylesheets to process documents with bibliographies

Using custom stylesheets to process documents with bibliographies

The RefDB stylesheets handle the oddities of formatting your bibliographies. The stock DocBook or TEI stylesheets handle the remainder of your documents. What if the formatting of the latter is not to your liking? To this end, the recommended way is to use stylesheet driver files which override those parameters, or entire sections, of the stylesheets which you need modified. Now, processing documents containing RefDB bibliographies with regular DocBook or TEI driver files won't do you any good as you'll lose the journal-specific citation and bibliography support. However, you can easily design driver files which accomplish the task at hand.

refdbnd-created Makefiles contain hooks to use custom driver files; if you prefer to run the transformations manually, these Makefiles will also tell you how. The relevant Makefile section looks like this:

# options to use customized RefDB driver files, if any
fodriveropt = -a custom-fo.xsl
htmldriveropt = -b custom-html.xsl
xhtmldriveropt = -c custom-xhtml.xsl
    

As shown here, you can pass options to runbib which specify custom driver files. You can keep those in the same directory as the document itself, or specify a relative or full path. Your custom driver files must include the appropriate RefDB stylesheets, not the stock DocBook or TEI stylesheets, like this (shown for the fo driver file):

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">

  <xsl:import href="/usr/local/share/refdb/xsl/docbk-refdb-xsl/docbk-fo/docbk-refdb-fo.xsl"/>

  <!-- your customizations here -->

</xsl:stylesheet>
    
refdb-1.0.2/doc/refdb-manual/ch11.html000644 001750 001750 00000010536 12255431206 020173 0ustar00markusmarkus000000 000000 Chapter 11. RefDB SRU interface

Chapter 11. RefDB SRU interface

What SRU is all about

SRU (Search and Retrieve via URL) is a standard search protocol developed by the Library of Congress to allow web-based access to libraries. SRU uses a fairly simple query language called CQL (Contextual Query Language). Any program that can send a HTTP GET request to a remote site and receive the resulting XML document is basically suited as a SRU client. This is especially true for your web browser and for command-line utilities like wget, but a dedicated client like YAZ may be more convenient for all but the most simple queries. Also, some software packages read bibliographic data from databases via SRU (e.g. citeproc).

RefDB implements SRU server capabilities through a CGI script that you can optionally install in your web server. This will allow anyone with access to your web server to search and retrieve bibliographic data in your RefDB databases. Alternatively, a standalone web server for single-user access is available too. This chapter explains how to use SRU access. See the installation chapter for the instructions how to set up SRU support in your RefDB installation.

refdb-1.0.2/doc/refdb-manual/ch11s02.html000644 001750 001750 00000037035 12255431206 020523 0ustar00markusmarkus000000 000000 SRU Operations

SRU Operations

Note

This section assumes that you run the SRU service using the CGI application. If you use the standalone server instead, please adapt the URLs by replacing "http://mybox.com/cgi-bin/" with "http://localhost:8080/".

SRU defines three operations, all of which return XML documents:

explain

describes the available facilities in terms of record schemas, available indexes and so on. Sort of a cheat sheet. The original specification is here.

searchRetrieve

performs a database query and retrieves the matching datasets. The original specification is here.

scan

retrieves a list of matching search terms for later use in a searchRetrieve operation. The original specification is here.

You are encouraged to peruse the linked specifications above to learn the general principles. The following sections build on this knowledge and describe the RefDB SRU interface with a focus on its peculiarities and limitations. We'll assume that your web server is set up to run the refdbsru CGI script using the following URL: http://mybox.com/cgi-bin/refdbsru/.

The explain operation

The explain operation is the simplest of all and a good start to introduce the syntax of the SRU interface. RefDB fully supports the explain operation. Any of the following URLs typed into your browser will run it:

  • http://mybox.com/cgi-bin/refdbsru/

  • http://mybox.com/cgi-bin/refdbsru/?

  • http://mybox.com/cgi-bin/refdbsru/?operation=explain&version=1.1

The URL part following the question mark ("?") in the third example is the search-part which consists of "parameter=value" pairs glued together with ampersands ("&"). Both parameters shown here are mandatory for all SRU operations as we'll see shortly.

The query will return a XML document describing the capabilities of the RefDB SRU interface.

The searchRetrieve operation

The searchRetrieve operation is the one used to actually get hold of the reference data you're looking for. Your query is sent in the query parameter which is mandatory for this operation. A few examples:

  • http://mybox.com/cgi-bin/refdbsru/?operation=searchRetrieve&version=1.1&recordSchema=mods&query=bib.name%3d%22Miller,Henry J.%22

  • http://mybox.com/cgi-bin/refdbsru/?operation=searchRetrieve&version=1.1&recordSchema=risx&query=dc.subject%3d%22circular dichroism%22+or+dc.subject%3d%22NMR%22

The first example requests the bibliographic data in MODS format. The query proper reads 'bib.name="Miller, Henry J."' and translates to a search for all references where a person with that name is listed as an author, editor, or series editor. The second example requests the data in risx format and searches all references with the keywords "circular dichroism" or "NMR".

Both examples make use of percent encoding to make the URL string conform to the specs. This is further discussed below.

The query parameter

The query parameter describes the criteria of your database query and is a string using the Common Query Language.

Conformance

The RefDB SRU support conforms to CQL Level 2. The following general restrictions apply:

  • RefDB does not support persistent result sets. Therefore, the resultSetTTL request parameter is meaningless, and it is not possible to reference a result set in a subsequent query.

  • RefDB does not support XPath expressions to modify the results. Therefore the recordXPath request parameter is not honored. You can of course apply any XPath expressions on the client side using an appropriate processor.

  • Sorting is currently not supported, and the sortKeys parameter is not applicable. Data will always be sorted by ID

  • The recordPacking parameter is not supported. Records are always returned as XML.

  • RefDB does not support relation modifiers and boolean modifiers in CQL queries.

  • prox is not supported as a boolean operator.

  • The relation encloses is not supported

  • The support for regular expressions ("masking" in CQL) depends on the database backend. Most notably, anchoring is not supported by SQLite and SQLite3.

Defaults

If a query or a query part does not specify an index and a relation, RefDB looks for the term in the author, keyword, and title indexes:

http://mybox.com/cgi-bin/refdbsru/?operation=searchRetrieve&version=1.1&query=cat

This query will try to find references that contain the string "cat" in either the title, a keyword, or an author name.

Context sets

RefDB supports the context sets Dublin Core (dc) and the not yet officially released CQL Bibliographic Searching (bib). The following table lists the relationship of the indexes defined in these context sets with the RefDB fields.

Note

RefDB of course implicitly also supports the cql context set.

Table 11.1. Context sets

dc indexbib indexRefDB fieldsearch/scan?description
titletitleTXy/nitem titles
 seriesTitleT3y/nseries title
 titleAbbrevJAy/yjournal title, abbreviated
creator, contributorname, namePersonal, nameCorporateAXy/yauthors and editors
subject, coveragesubjectKWy/ykeywords
datedateIssuedPYy/npublication date
 volumeVLy/nperiodical volume
 issueISy/nperiodical issue
 startPageSPy/nstart page
 endPageEPy/nend page
publisher PBy/npublisher

Encoding

As you may have noticed, it is necessary to percent-encode a few special characters in the parameter values. E.g. the equal sign ("=") assigns the values to the parameters and does not have to be encoded. However, equal signs within the CQL query string (which is the value of the query parameter) must be percent-encoded. If you use a dedicated client to run your queries, you should not have to care about these conversions. If you use a web-browser or a similar device, you may find the following conversion table useful:

Table 11.2. Percent-encoding special characters

replacewithreplacewith
:%3a/%2f
?%3f#%23
[%5B]%5D
@%40!%21
$%24&%26
'%27(%28
)%29*%2a
+%2b,%2c
;%3b=%3d
%%25"%22

Schemas

RefDB can return the datasets using two different XML schemas which you can request with the recordSchema parameter:

MODS

MODS is a schema for bibliographic data in library applications. Use 'mods' as the parameter value. The returned datasets will use 'mods' as the namespace prefix. MODS is the default if you do not specify a schema.

risx

This is RefDB's default XML input and output format. Use 'risx' as the parameter value to request risx. The datasets will use 'risx' as the namespace prefix.

Databases

SRU assumes that the base URL of the SRU service (the one you enter to get an explain response) corresponds to one database. Instead of using several copies of the CGI script to service more than one database, refdbsru allows to specify the name of a database in the additional path information of the URL. Compare the following (pseudo-)URLs:

http://myserver.com/cgi-bin/refdbsru/?<query>
http://myserver.com/cgi-bin/refdbsru/foo?<query>
	

The first URL will use the default database. The second URL will use the database "foo" instead. The database name goes between the slash that follows the CGI script name and the question mark that opens the query string.

The scan operation

The purpose of the scan operation is to provide a matching list of query terms, along with the number of references each term would retrieve. This is similar to browsing through a stack of library cards with subjects or author names on them. The RefDB SRU service allows to scan the following database fields:

  • keywords (bib.subject)

    http://mybox.com/cgi-bin/refdbsru/?operation=scan&version=1.1&scanClause=bib.subject%3d%22dichroism%22

  • author names (bib.name)

    http://mybox.com/cgi-bin/refdbsru/?operation=scan&version=1.1&scanClause=bib.name%3d%22Henry J.%22

  • journal abbreviations (bib.titleAbbrev)

refdb-1.0.2/doc/refdb-manual/ch12.html000644 001750 001750 00000021435 12255431211 020170 0ustar00markusmarkus000000 000000 Chapter 12. The application server

Chapter 12. The application server

refdbd is the RefDB application server, i.e. a program that runs in the background and handles the requests from the RefDB clients. This is the program that directly interacts with the database server and does most of the serious work.

refdbd can be configured at startup with the configuration file refdbdrc or by passing command-line options. The latter override the corresponding settings in the configuration files. While refdbd is running, most of the parameters can be changed remotely with refdba (see the refdba command confserv), but to make changes permanent you'll have to edit the configuration file or the script line that starts refdbd.

Warning

In the current implementation, the remote administration via refdba uses a fairly indirect access control. If this is a concern, you should not enable remote administration (it is disabled by default). You can use the command refdbctl reload instead to cause refdbd to reread its configuration file while running. Then the usual access controls for editing the configuration file and for sending a signal to a process apply.

You can run refdbd as a standalone application or as a daemon. The main difference between the standalone process and a daemon process is the fact that the daemon is no longer associated with a particular terminal. This means that no output to stdout or stderr will ever show up on a terminal and that the process will keep running even if the terminal that started the process terminates. This is good if you want it running unattended, similar to a web server or a ftp server. On the other hand it can be handy for debugging purposes to directly get log output (or additional printf() output) on a terminal and to use the standard ways of process control, e.g. to kill refdbd with Ctrl-C. The -s command line switch lets refdbd run as a normal application for exactly this purpose.

The above holds true for almost any Unix-like operating system. On Windowsish operating systems the story is somewhat different. First of all, the Win95/98/ME family does not support daemons at all. WinNT/2000 do support daemons (they're called “services†here just for the sake of having a different name for the same thing). The simplest way to run refdbd as a NT service is to use a service installer as described in the Installation chapter. In this case you should run refdbd as a standalone application (i.e. include the -s switch), as the installer will take care of all the magic. Another possibility is to start refdbd from Cygwin inetd. In that case you'd run refdbd as a daemon again, but this is currently beyond the scope of this manual.

You can run refdbd as a daemon either from the command line, i.e. start it manually when you need it, or you can start the daemon at the system start. For the latter, refer to the Installation chapter.

This chapter explains how to control refdbd from the command line. The easiest and strongly recommended way is to use the provided control script that will be explained in the first section. If you need further control, you can use the command line of refdbd directly as explained in the second section. The third section describes the script which is usually run automatically by your system if you install refdbd as a daemon. The final sections describe the two applications which provide SRU access to RefDB databases.

refdb-1.0.2/doc/refdb-manual/ch13.html000644 001750 001750 00000016101 12255431213 020165 0ustar00markusmarkus000000 000000 Chapter 13. Administration tools

Chapter 13. Administration tools

The following tasks can be performed with the tools described in this chapter:

  • Perform the initial system setup

  • Create and delete databases.

  • Add, remove, and retrieve bibliography styles.

  • Add and remove users

  • Add and remove reserved journal words

  • View statistics and connection information.

  • Configure the application server while running

  • Create and restore database backups

The first section explains the usage of the command-line client refdba in full detail. The following sections introduce two scripts which simplify the task of backing up and restoring the system and reference databases of your installation.

refdb-1.0.2/doc/refdb-manual/ch14.html000644 001750 001750 00000036361 12255431221 020177 0ustar00markusmarkus000000 000000 Chapter 14. Tools for reference and notes management

Chapter 14. Tools for reference and notes management

The following tasks can be performed with the tools described in this chapter:

  • Manually add, update, and delete reference entries

  • Search for and display reference entries

  • Search for and display authors and keywords

  • Include existing references into personal reference list

  • Convert reference data from various formats to RIS

We'll first introduce the command-line client refdbc, RefDB's own multi-purpose reference and notes management client, along with the reference data converters that you can use along with it. The following sections explain the input and output data formats as well as the query language used by RefDB.

Tools

The first subsection explains the usage of the command-line client refdbc.

Whenever you have an electronic source for reference data, you should use these instead of typing datasets from scratch. Reference data come in a variety of formats. Therefore RefDB ships with a few conversion utilities which are discussed in this chapter. These utilities create tagged RIS data from the input data.

Note

Please visit Chris Putnam's Bibutils project for another set of bibliographic data converters. These tools allow to convert a few additional formats like ISI and MODS to RIS which can then be imported by RefDB.

Since version 0.9.3, RefDB supports risx as an additional native input format. You can employ the standard techniques of SGML and XML transformations, i.e. by running DSSSL or XSLT scripts with a suitable engine, to turn bibliographic data encoded as SGML or XML documents into risx.

Remember that RefDB accepts only four character encodings for XML input data: UTF-8, UTF-16, ISO-8859-1, and US-ASCII. If your input data use a different character encoding, please use the command-line utility iconv (usually part of the libiconv package) to convert your data to one of the existing character encodings. Do not forget to specify the character encoding in the processing instructions of the input file, otherwise RefDB will assume the data are encoded as UTF-8.

refdb-1.0.2/doc/refdb-manual/ch14s02.html000644 001750 001750 00000025362 12255431220 020522 0ustar00markusmarkus000000 000000 Reference data output formats

Reference data output formats

refdbd implements several standard backends for data output. You can select them with the -t option of the getref command in refdbc. Remember that all backends just send data. It is your decision what you want to do with the information. You can either view the data on the screen or pipe them to another application or write them to a disk file.

scrn

The screen backend provides a basic data output for viewing in a terminal, preferably through a pager. By default, the reference ID, the publication year, the authors, the title, and the source information are displayed. You can use the -s option to additionally display the abstract (AB or N2), the notes (N1), the reprint info (RP), the address (AD), the publisher (PB), the city (CY), the ISSN/ISBN (SN), the URL (UR), and the user (U1 through U5) and misc (M1 through M3) fields. In addition, the pseudo-field codes NX (all notes) and LX (all links, including UR and DOI) can be used. To specify several fields, simply concatenate the field codes, as in -s ADPBRP. -s ALL will display all available fields.

html

The html backend works just like the scrn backend, but encodes this information in a HTML text. This comes in handy if you would like to view the results of your queries in a web browser rather than in a terminal window. This is also the easiest way to obtain fairly nice-looking printed output of your reference data. You simply use the -o switch to write the results of your queries to a file, reusing the same filename for each query. After each query you just have to hit the reload button of your browser to view the results of the most recent query.

The visual appearance of the generated HTML files can be customized using CSS files. The URL of the CSS file must be specified with the refdbc -G command-line option or by setting the configuration variable cssurl. The global configuration file /usr/local/etc/refdb/refdbcrc is preconfigured with a cssurl entry pointing to the default CSS file installed in /usr/local/share/refdb/css. If you want a different appearance, it might be prudent to create a copy of this CSS file and customize it as you see fit. The following element classes can be customized. In most cases, the class name reflects the database field to be formatted:

  • H1.h1

  • H2.id

  • P.title

  • P.authors

  • P.abstract

  • P.note

  • P.address

  • P.city

  • P.publisher

  • P.m1, P.m2, P.m3

  • P.u1, P.u2, P.u3, P.u4, P.u5

  • P.url

  • EM.periodical

  • EM.volume

  • EM.issue

  • EM.page

xhtml

This is a variant of the html output which creates valid XML output according to the XHTML V1.0 Transitional DTD.

ris

This is identical to the input format. Use it to export references to other reference management systems.

risx

Retrieves the data as an XML document using the risx DTD. Use it to edit references or to create backups of your databases. The default output includes a docline and an internal subset declaring some common entities. This format works ok for DTD-based processing systems. If you require namespaced output for further processing with schema-based tools, use the -n option to declare a namespace prefix.

mods

This backend retrieves the data as an XML document using the MODS schema. This is another useful exchange format for bibliographic data. Use the -n option to retrieve namespaced output with the given namespace prefix.

bibtex

This backend provides output formatted for use as a bibtex reference database. This can be used with the tex and bibtex applications to create bibliographies for documents written with Donald Knuth's famous TeX typesetting system. The -s option cannot be used with this backend and will be ignored.

db31

The DocBook SGML backend formats the query result as a bibliography element in a SGML document using the DocBook DTD. RefDB outputs an appropriate doctype string at the beginning of the data. The string is commented out so the contents can be directly inserted into a larger document by some processing application. If you need the data as a standalone document, simply use a script to uncomment the first line. The -s option cannot be used with this backend and will be ignored. This option is called “db31†to distinguish it from any later additions that may be necessary due to possible incompatibilities in new DocBook versions. It just means that the SGML that this backend creates should work with DocBook V.3.1 or later unless a new backend will be added.

db31x

The output is essentially the same as with the preceeding backend but you'll get a DocBook XML document instead. The default output works for DTD-based processing with DocBook XML versions 4.x. If you need namespaced output for schema-based processing, use the -n option to define a namespace prefix.

db50x

This backend outputs schema-based DocBook V5. The default output declares a default namespace. You can use the -n option to define a namespace prefix which will be used in all elements.

teix

The TEI XML backend formats the query results as a TEI P4 listBibl element. RefDB outputs an appropriate processing instruction and doctype string at the beginning of the data. The string is commented out so the contents can be directly inserted into a larger document by some processing application. If you need the data as a standalone document, simply use a script to uncomment the first line. The -s option cannot be used with this backend and will be ignored.

tei5x

This backend outputs schema-based TEI P5. The default output declares a default namespace. You can use the -n option to define a namespace prefix which will be used in all elements.

refdb-1.0.2/doc/refdb-manual/ch14s03.html000644 001750 001750 00000007525 12255431220 020524 0ustar00markusmarkus000000 000000 Extended notes output formats

Extended notes output formats

RefDB implements a few backends to output extended notes. You can select them with the -t option of the getnote command.

scrn

The screen backend provides the output most suitable for viewing notes in a terminal. Send the output through a pager for best results. Use the -s NL or -s ALL options to display all objects the note is linked to.

html

The information returned by this backend is encoded as a HTML document. Use this format to print nicely formatted notes from your web browser. Otherwise the same applies as said for the scrn backend. See above for some hints about formatting the output with a CSS file.

xhtml

The output is the same as for the html backend but the output is formatted as an XHTML document according to the XHTML V1.0 Transitional DTD.

xnote

This backend encodes the output in xnote documents, the same as the input format for extended notes.

refdb-1.0.2/doc/refdb-manual/ch14s04.html000644 001750 001750 00000052724 12255431221 020527 0ustar00markusmarkus000000 000000 The query language

The query language

The getref command is probably the most heavily used command. You use it to retrieve the references that you collected and saved in the database. To find a certain article or several related articles, all you have to do is to express your query in a language that RefDB understands. The first section describes how to formulate search strings for your queries.

The getnote command used to locate extended notes is very similar. The specifics of this command will be described in the subsequent section.

The reference query language

The syntax for the search string follows these rules:

  • You can search for any fields in the RefDB database. As a matter of fact, you have to specify at least one field for your query. Something like getref * will not work, but you may use getref ":ID:>0" instead to list all entries in the database (beware, this may be a lot).

  • Every search item has the following general form:

    :XY:[=|~|!=|!~|<>|<|>|<=|>=]string

    Warning

    The current implementation of RefDB is very picky about spaces. Please make sure that you do not insert spaces or other whitespace on either side of the operators ("=", "~" and so on). If your value happens to start with a space, include the value in quotation marks or protect the space with a backslash.

    The sequence ":XY:" denotes the reference data field to search in. The names are mostly taken from the RIS specification. Possible field names are:

    :TY:

    Type of the reference.

    :ID:

    The unique identifier of a reference. This is the numeric identifier that RefDB assigns to each new reference.

    :CK:

    The unique citation key of a reference. This is the alphanumeric string that was either supplied by the user or automatically generated by RefDB.

    :TI:, :T2:, :T3:, :TX:

    The title of the reference, of the secondary title, and of the series title, respectively. :TX: performs a search in all title levels.

    :AU:, :A2:, :A3:, :AX:

    The name of an author, of a secondary author/editor, and of a series author, respectively. :AX: performs a search in all author levels.

    :PY:, :Y2:

    The publication date and the secondary date, respectively.

    :N1:

    The notes that user can add to the reference.

    :KW:

    A keyword.

    :RP:

    The reprint status of the reference.

    :AV:

    The location of an offprint (physical, URL, or path)

    :SP:

    The start page.

    :EP:

    The end page.

    :JO:, :JF:, :J1:, :J2:

    The abbreviated name, the full name, the user abbreviation 1, and the user abbreviation 2 of a journal name, respectively.

    :VL:

    The volume number.

    :ED:

    The name of an editor.

    :IS:

    The issue (article) or chapter (book part) number.

    :CY:

    City of publication of a book.

    :PB:

    Name of the publishing company.

    :U1: through :U5:

    The user-defined fields 1 through 5. In certain cases, U5 contains the number of the paper copy of the reference (see the addref command).

    :N2:

    The abstract of the reference.

    :SN:

    The ISSN or ISBN number.

    :L1: through :L4:

    The link fields 1 through 4.

    :AD:

    The address of the contact person.

    :UR:

    The URL of a web page related to the reference.

    Some pseudo-fields help to retrieve the contents of the RIS fields M1 through M3. RefDB provides these pseudo-fields to better identify the contents of these fields. Please be aware that these pseudo-fields apply only to particular reference types. If in doubt, consult the Reference Manager manual which contains a list of how the M1-M3 fields are used by each reference type.

    :DO:

    The digital objects identifier.

    :TO:

    The type of work.

    :AR:

    The area of a map

    :OS:

    The operating system of a computer program

    :DG:

    The type of degree of a thesis.

    :RT:

    Running time of audiovisual data.

    :CI:

    International class code of a patent.

    :CU:

    US class code of a patent.

    :SE:

    The email address of the sender.

    :RE:

    The email address of the recipient.

    :MT:

    The type of media.

    :NV:

    The total number of volumes in a series

    :EI:

    The edition of a book.

    :CO:

    The type of computer used for a software or data.

    :CF:

    The location of a conference

    :RN:

    The registry number.

    :CL:

    The classification of an audiovisual material.

    :SC:

    The section of a magazine or newspaper

    :PN:

    The number of a pamphlet.

    :CN:

    The number of a chapter.

    In addition to the above field specifiers, there are a few that allow to retrieve references based on extended notes attached to them:

    :NID:

    The ID of an extended note.

    :NCK:

    The alphanumeric key of an extended note.

    References are matched according to these rules:

    • The alphanumerical fields are matched by (non-)equality to a literal string or to a regular expression. For literal matches the operators "=" and "!=" are accepted, denoting equality and non-equality, respectively. The search-string is a plain-text string.

      Along the same lines, "~" and "!~" denote equality and non-equality for regular expression matches. The search-string can contain any legal characters and constructs as in standard Unix regular expressions. By default, the query matches if the search string is contained anywhere in the target string. If you need a left-match, a right-match, or a full match, use the regexp special characters "^" (match the beginning of a line) and "$" (match the end of a line) to your needs. For further information about regular expressions, see the section regular expressions

      Note

      Some database engines, like SQLite, do not support Unix-style regular expressions. Use SQL regular expressions instead.

      If you use regular expressions, be aware that you will have to escape characters with a special meaning if you want them to be matched literally. For further details, see the examples below.

    • The numerical fields can be matched by equality, non-equality, or by greater-than/less-than comparisons. In these cases, use "!=", ">", and "<" instead of the "=", respectively.

    • If the search-string contains spaces, the whole string must be enclosed by single quotation marks or the spaces must be escaped with a backslash "\".

  • Several search items can be combined by the Boolean operators "AND", "OR", " AND NOT". They can be grouped by brackets "()".

    Note

    If you use the operator "AND NOT", the search item it refers to has to be enclosed in brackets. See the examples below.

  • The author (:AU:) and keyword (:KW:) searches allow an abbreviated syntax if you search for several authors or keywords at a time. The construct:

    :AU:=name1 AND :AU:=name2 AND :AU:=name3 ...

    can be written as:

    :AU:='& name1 name2 name3 ...'

    To specify an "OR" search, use "|" instead of "&".

    Note

    If an item in the search contains spaces, they have to be escaped by backslashes, as in "Amino\ Acid\ Sequence".

The notes query language

The getnote command uses essentially the same query language as described above. However, there is a different set of field specifiers that you can use to locate extended notes:

:NID:

The unique id of an extended note.

:NCK:

The unique citation key of an extended note.

:NPY:

The date of an extended note.

:NTI:

The title of an extended note.

:NKW:

A keyword. This is a keyword attached to a note in order to categorize the latter, similar to a keyword in a reference.

:KW:

A keyword. This is a keyword that the note is linked to, i.e. a keyword that the note was attached to in order to supply additional information.

:AU:

The name of an author or editor. Use this field specifier to locate notes that are linked to a particular author.

:JF:, :JO:, :J1:, :J2:

The full, abbreviated, or user-abbreviated name of a periodical. Use this field specifier to locate notes that are linked to a periodical.

:ID:

The id of a reference. Use this field specifier to locate notes linked to a particular reference.

:CK:

The citation key of a reference. Use this field specifier to locate notes linked to a particular reference.

Some example queries

This section shows a few example queries to help you get familiar with the syntax. If you are not familiar with the regular expressions used here, please peruse the regular expressions section. We will not use any of the fancy switches of the getref command here, so the output will always be a simple listing on the screen.

Note

These examples assume that your database engine supports Unix regular expressions. This holds true for MySQL and PostgreSQL, wherease SQLite uses the simpler SQL regular expressions instead.

We'll start with some easy queries. First we want to display a reference with a specific ID (25 in this example):

	  refdbc: 
	  getref :ID:=25
	

Next we want to list all references by a specific author. We'll use only the last name here. If several authors share this last name, we have to specify the initials as well, as shown in the second example. In the first example we use a regular expression match, denoted by the tilde operator. This obviates the need to know the full name precisely. The second example uses a literal match instead. Note the use of the caret "^" in the first example which makes sure that the name actually starts with the capital M. Otherwise, a last name like "DeMillerette" would match as well. This trick is not required in the second example as the literal match always implies a full match.

	  refdbc: 
	  getref :AU:~^Miller
	
	  refdbc: 
	  getref :AU:=Miller,J.D.
	

If Dr. Miller was a productive person, our previous query may have returned dozens of references. Now we try to filter out the paper or the papers that we really need. In the next example, we restrict the results to the years 1995 through 1999:

	  refdbc: 
	  getref :AU:~^Miller AND :PY:>1994 AND :PY:<2000
	

If this did not bring us close enough, we may try to include a coauthor:

	  refdbc: 
	  getref :AU:=~Miller AND :AU:~^Doe AND :PY:>1994 AND :PY:<2000
	

At this point we could narrow down the search by excluding other authors that often published with Dr. Miller, but are irrelevant here:

	  refdbc: 
	  getref :AU:~^Miller AND :AU:~^Doe AND NOT (:AU:~^Jones) AND :PY:>1994 AND :PY:<2000
	

Unfortunately, this is still a venerable list of publications. Now we try to include a few keywords. This is now a pretty complex query. It will return all references by the authors Miller and Doe between 1995 and 1999 with either the keyword "blood" or the keyword "animal" or the keywords "guanyl" and "cyclase", the latter only if both are present. The truncated spelling of "guanyl" ensures that both "guanylyl" and "guanylate" (which are interchangeable) will match. The funny expressions with the angle brackets ensure that the keywords will match regardless of whether they start with a capital letter or not.

	  refdbc: 
	  getref :AU:~^Miller AND :AU:~^Doe AND :PY:>1994 AND :PY:<2000 AND
	  (:KW:~[bB]lood OR :KW:~[aA]nimal OR (:KW:~[gG]uanyl AND :KW:~[cC]yclase))
	

And now for something completely different. If you've added a couple extended notes to your database, you can retrieve references that are attached to a specific extended note, e.g. to the note with the citation key "biochemistry1999":

	  refdbc: 
	  getref :NCK:=biochemistry1999
	

If you want to see all notes which are attached to a reference with the citation key "Miller1999", use the following command:

	  refdbc: 
	  getnote :CK:=Miller1999
	

Regular expressions may have unwanted side effects at times. Consider the keyword "52-67-5 (Penicillamine)" (a chemical name as used by the Pubmed database). Doing a literal match is straightforward:

	  refdbc: 
	  getref :KW:='52-67-5 (Penicillamine)'
	

However, if we use the same argument for a regexp match, we won't get the desired results. The parentheses have a special meaning in regular expressions. Therefore we have to escape them if we want a literal match:

	  refdbc: 
	  getref :KW:~'\(Penicillamine\)'
	

Things are a little different again if you run a database engine that does not use Unix regular expressions, but SQL regular expressions instead. These know only '%' and '_' as special characters, and you have to escape them by doubling:

	  refdbc: 
	  getref :KW:~'100%%'
	

Tip

Remember that if you extend or modify a previous query, you don't have to retype everything: Just use the up arrow key to scroll through the previous commands, or use Ctrl+r to search for a specific query in the history.

refdb-1.0.2/doc/refdb-manual/ch14s05.html000644 001750 001750 00000023554 12255431221 020527 0ustar00markusmarkus000000 000000 Regular expressions

Regular expressions

This section provides a brief overview over regular expressions. In the context of RefDB, we have to deal with two flavors of regular expressions: Unix-style and SQL. The former are more important as we use them to write queries. The latter are used sparingly, e.g. to search the filenames of databases.

Note

Some database engines like SQLite do not support Unix-style regular expressions. You have to use SQL regular expressions in this case.

The difference between a literal match and a regular expression match is that the latter allows some “fuzziness†in the search string. The former requires that the search string and the search result match character by character. In simple words, regular expressions allow to search for strings which are similar to some extent, and you can exactly specify to which extent.

Unix-style regular expressions

Regular expressions distinguish between regular characters and special characters (meta characters). The simplest regular expressions actually don't look like regular expressions, as the following example shows:

foo

This will search for the string "foo" at any position in the target elements. This would find strings like “foobarâ€, “lifooâ€, or “lifoobarâ€. That is: if there are no meta characters, a simple string match is attempted, however at any position in the element. This is different from search strategies in some other databases where a full match or a left-match is attempted by default.

We can now replace one “o†in the above sample with a meta character. We use the “.†(dot) which matches any single character, including a newline, at that position:

f.o

This will find strings like “faoâ€, “fdoâ€, but as well all strings of the previous example.

Another very common meta character is the “*â€, which matches zero or more instances of the previous character. Thus,

fo*

will now find things like “foâ€, “fooooâ€, but also “fbar†and “lifooobarâ€. The meta character “+†is similar, but requires at least one instance of the previous character:

fo+

This would retrieve all strings of the last example except “fbar†as this contains the “o†zero times.

fo?

The questionmark meta character will retrieve either zero or one instances of the previous character. This would match “f†and “foâ€, but not “fooâ€.

The meta characters “^†and “$†are important to determine the relation of the search string to the line start or line end:

^foo

This will match “foo†only if it is located at the line start. Similarly,

foo$

will find “foo†only when it is located at the line end. If you combine these two like in the next example:

^foo$

“foo†will be found only if this is the complete element, starting and ending the line.

The following list briefly explains some more terms which are helpful in regular expressions.

()

Use the round brackets to group characters to a sequence. This is particularly useful with the above mentioned metacharacters *, +, and ?.

(foo)*

This will match zero or more instances of the sequence “fooâ€. It will find e.g. “foo†and “foofooâ€, but not “fofoâ€.

[]

matches any single character between the brackets.

[0-9]

This will match any digit. Continuous ranges of characters can be indicated with a dash, as seen here.

[^]

matches any single character except the ones between the brackets

[^abc]

This will match any character except “aâ€, “bâ€, and “câ€.

\

The backslash escapes the following meta character and treats it as a literal character.

\.

This will match only the dot instead of any single character.

\{n,m\}

This will find n to m repeats of the previous character.

fo\{2,3\}

This regular expression will find “foo†and “foooâ€, but not “fo†or “fooooâ€.

For further information about regular expressions, see the regex chapter in the MySQL documentation.

SQL regular expressions

SQL regular expressions are much simpler, as there are only two metacharacters:

%

matches any string

_ (underscore)

matches any single character

In order to match a SQL regular expression special character literally, you have to escape it by doubling.

refdb-1.0.2/doc/refdb-manual/ch15.html000644 001750 001750 00000021420 12255431224 020171 0ustar00markusmarkus000000 000000 Chapter 15. Tools for bibliographiesrefdb-1.0.2/doc/refdb-manual/ch16.html000644 001750 001750 00000010662 12255431230 020175 0ustar00markusmarkus000000 000000 Chapter 16. Reference database design

Chapter 16. Reference database design

This section gives an overview over the design of the reference database with MySQL as the database server. The same design is used with the other database engines, although the details may differ somewhat. This will be mentioned where appropriate.

The requirements of the database necessitate some tables which hold the data proper and some tables which cross-reference these tables.

The table t_meta

The t_meta table contains the following meta-information about the database:

meta_app

This string contains the name of the application that created the database.

meta_version

This string contains the version number of the application that created the database.

meta_type

This string describes the type of the database. Currently only the type "risx" is supported.

meta_create_date

This timestamp is set by refdbd when the database is created.

meta_modify_date

This timestamp is updated by refdbd whenever the database is changed.

refdb-1.0.2/doc/refdb-manual/ch16s02.html000644 001750 001750 00000026517 12255431226 020535 0ustar00markusmarkus000000 000000 The table t_refdb

The table t_refdb

This table is the main table of the database and holds all fields which are unique to one reference entry and not different between users.

This table contains the following columns:

refdb_id

This unique identifier for entries in t_refdb is automatically generated by refdb and is stored as a BIGINT value (INTEGER for SQLite).

refdb_citekey

This is a user-supplied unique identifier for entries in t_refdb. If not supplied by the user, RefDB will create a unique identifier when the entry is added.

refdb_type

This indicates the type of the document. This six-character string must be one of the following:

  • ABST (abstract reference)

  • ADVS (audiovisual material)

  • ART (art work)

  • BILL (bill/resolution)

  • BOOK (whole book reference)

  • CASE (case)

  • CHAP (book chapter reference)

  • COMP (computer program)

  • CONF (conference proceeding)

  • CTLG (catalog)

  • DATA (data file)

  • ELEC (electronic citation)

  • GEN (generic)

  • ICOMM (internet communication)

  • INPR (in press reference)

  • JFULL (journal - full)

  • JOUR (journal reference)

  • MAP (map)

  • MGZN (magazine article)

  • MPCT (motion picture)

  • MUSIC (music score)

  • NEWS (newspaper)

  • PAMP (pamphlet)

  • PAT (patent)

  • PCOMM (personal communication)

  • RPRT (report)

  • SER (serial - book, monograph)

  • SLIDE (slide)

  • SOUND (sound recording)

  • STAT (statute)

  • THES (thesis/dissertation)

  • UNBILL (unenacted bill/resolution)

  • UNPB (unpublished work reference)

  • VIDEO (video recording)

refdb_pubyear

This numerical value (SMALLINT) indicates the publication year.

refdb_secyear

This numerical value (SMALLINT) indicates the secondary year information.

refdb_startpage

This alphanumeric string (up to 255 characters) contains the start page information.

refdb_endpage

This alphanumeric string (up to 255 characters) contains the end page information.

refdb_abstract

This variable-length string contains the abstract or table of contents of the entry.

refdb_title

This alphanumeric field of variable length contains the title of the entry.

refdb_volume

This alphanumeric field (up to 255 characters) contains the volume number or identifier of the periodical.

refdb_issue

This alphanumeric field (up to 255 characters) contains the issue number or specifier.

refdb_booktitle

This alphanumeric field of variable length contains the book title (book chapter or whole book reference).

refdb_city

This alphanumeric field (up to 255 characters) contains the city where the periodical or book was published.

refdb_publisher

This alphanumeric field (up to 255 characters) contains the name of the publisher.

refdb_title_series

This alphanumerical field of variable length contains the title of a series of books or publications.

refdb_address

This alphanumeric field of variable length holds the address of the corresponding author and other contact information.

refdb_url

This alphanumeric field (up to 255 characters) holds a URL related to the entry, e.g. the homepage of an author or a link to an electronic reprint.

refdb_issn

This alphanumeric field with a maximum of 255 characters stores the ISSN or ISBN number of the publication.

refdb_pyother_info

This alphanumeric field with a maximum of 255 characters stores the additional information of a PY field after the publication year. The format is “/MM/DD/otherinfoâ€, with MM being the month and DD being the day of the publication. If either of these is missing, the corresponding slash “/†still has to be entered. The other information is free alphanumeric information.

refdb_secother_info

This alphanumeric field with a maximum of 255 characters provides the same additional information for the refdb_secyear field as the refdb_pyother_info field for refdb_pubyear.

refdb_periodical_id

This BIGINT (INTEGER for SQLite) variable points to the periodical_id in t_periodical which corresponds to the periodical the given article appeared in.

refdb_user1 through refdb_user5

These alphanumeric fields with a maximum of 255 characters provide space for user-defined information.

refdb_typeofwork

This alphanumeric field with a maximum of 255 characters stores tye type of work of some reference types.

refdb_area

This alphanumeric field with a maximum of 255 characters stores the area information of MAP entries.

refdb_ostype

This alphanumeric field with a maximum of 255 characters stores the type of the operating system of a computer program.

refdb_degree

This alphanumeric field with a maximum of 255 characters stores the type of the degree of a THES reference..

refdb_runningtime

This alphanumeric field with a maximum of 255 characters stores the running time of several multimedia reference types.

refdb_classcodeintl

This alphanumeric field with a maximum of 255 characters stores the international class code of PAT references.

refdb_classcodeus

This alphanumeric field with a maximum of 255 characters stores the US class code of PAT references.

refdb_senderemail

This alphanumeric field with a maximum of 255 characters stores the email address of the sender of an ICOMM reference.

refdb_recipientemail

This alphanumeric field with a maximum of 255 characters stores the email address of the recipient of an ICOMM reference.

refdb_mediatype

This alphanumeric field with a maximum of 255 characters stores the type of the medium of a reference.

refdb_numvolumes

This alphanumeric field with a maximum of 255 characters stores the total number of volumes of a monographic item which is part of a limited series.

refdb_edition

This alphanumeric field with a maximum of 255 characters stores the edition of a monographic item.

refdb_computer

This alphanumeric field with a maximum of 255 characters stores the type of computer of a COMP reference.

refdb_conferencelocation

This alphanumeric field with a maximum of 255 characters stores the location of a conference of a CONF entry.

refdb_registrynum

This alphanumeric field with a maximum of 255 characters stores the registry number of JFULL entries.

refdb_classification

This alphanumeric field with a maximum of 255 characters stores the classification of multimedia entries.

refdb_section

This alphanumeric field with a maximum of 255 characters stores the section of a NEWS entry.

refdb_pamphletnum

This alphanumeric field with a maximum of 255 characters stores the number of the pamphlet of a PAMP entry.

refdb_chapternum

This alphanumeric field with a maximum of 255 characters stores the number of the chapter of a CHAP entry.

refdb-1.0.2/doc/refdb-manual/ch16s03.html000644 001750 001750 00000004517 12255431226 020532 0ustar00markusmarkus000000 000000 The table t_author

The table t_author

This table is a list of all authors, editors, and series editors.

author_id

The unique identifier of each author is stored as a BIGINT value (INTEGER for SQLite).

author_name

The name of the author is stored in a alphanumerical field (maximum lenght 255 characters). The name has the format Lastname[,(F.|First)[(M.|Middle)[,Suffix]]].

refdb-1.0.2/doc/refdb-manual/ch16s04.html000644 001750 001750 00000004514 12255431226 020530 0ustar00markusmarkus000000 000000 The table t_keyword

The table t_keyword

This table is a list of all keywords.

keyword_id

The unique identifier of each keyword is stored as a BIGINT value (INTEGER for SQLite).

keyword_name

This field holds the keyword (key phrase may be a better word as a keyword may consist of any alphanumeric string, including spaces). The maximum size is 255 characters.

refdb-1.0.2/doc/refdb-manual/ch16s05.html000644 001750 001750 00000006457 12255431227 020542 0ustar00markusmarkus000000 000000 The table t_periodical

The table t_periodical

This table is a list of all periodicals.

periodical_id

This is the unique identifier of each periodical and is stored as a BIGINT value (INTEGER for SQLite).

periodical_name

This is the full, unabbreviated name of the periodical. This is an alphanumeric field with a limit of 255 characters.

Examples: Trends in Biochemical Sciences; Proceedings of the National Academy of Sciences of the United States of America

periodical_abbrev

This is the official abbreviation of the periodical as seen in the Index Medicus. Abbreviated words have a trailing period. All words are separated by a space. This is also an alphanumeric field with a maximum of 255 characters.

Examples: Trends Biochem. Sci.; Proc. Natl. Acad. Sci. USA

periodical_custabbrev1

This is a custom abbreviation, often shorter and more popular than the official abbreviation. This is again an alphanumeric field with a limit of 255 characters.

Examples: TIBS; PNAS

periodical_custabbrev2

This is another custom abbreviation, often shorter and more popular than the official abbreviation. This is again an alphanumeric field with a limit of 255 characters.

refdb-1.0.2/doc/refdb-manual/ch16s06.html000644 001750 001750 00000006727 12255431227 020543 0ustar00markusmarkus000000 000000 The table t_note

The table t_note

This table contains the extended notes.

note_id

This unique identifier for entries in t_note is automatically generated by RefDB and is stored as a BIGINT value (INTEGER for SQLite).

note_key

This is a user-supplied unique identifier for entries in t_note. If not supplied by the user, RefDB will create a unique identifier when the entry is added.

note_title

This alphanumeric field (up to 255 characters) contains the title of the entry.

note_content

This alphanumeric field of unlimited length contains the text of the note.

note_content_type

This alphanumeric field (up to 255 characters) contains the type of the data in the note_content field.

note_content_xmllang

This alphanumeric field (up to 255 characters) contains an identifier of the language of the data in the note_content field.

note_user_id

This BIGINT (INTEGER for SQLite) variable points to the user_id in t_user which corresponds to the user who created the note.

note_date

This DATETIME field stores the date the note was added, or any other user-supplied date.

note_share

This short integer field stores whether the note may be shared with others (value != zero) or not (value = zero).

refdb-1.0.2/doc/refdb-manual/ch16s07.html000644 001750 001750 00000004646 12255431227 020542 0ustar00markusmarkus000000 000000 The table t_user

The table t_user

This table contains the information about the users accessing the database. This information is used to track the person who added a specific article and the persons who are interested in a particular article.

user_id

The unique ID of each user is stored as a BIGINT value (INTEGER for SQLite).

user_name

This alphanumeric field holds the mySQL login name of the user (maximum length is 16 characters). The length limit is imposed by MySQL.

refdb-1.0.2/doc/refdb-manual/ch16s08.html000644 001750 001750 00000004251 12255431227 020533 0ustar00markusmarkus000000 000000 The table t_link

The table t_link

This table contains URLs.

link_id

The unique ID of each user is stored as a BIGINT value (INTEGER for SQLite).

link_url

This alphanumeric field of unlimited length contains the URL.

refdb-1.0.2/doc/refdb-manual/ch16s09.html000644 001750 001750 00000006630 12255431227 020537 0ustar00markusmarkus000000 000000 The table t_xauthor

The table t_xauthor

This table cross-references the tables t_author and t_refdb.

xauthor_id

This is the unique ID of a t_xauthor entry, stored as a BIGINT value (INTEGER for SQLite).

author_id

This is the ID of the author in the t_author table, stored as a BIGINT value (INTEGER for SQLite).

refdb_id

This is the ID of the reference in the t_refdb table, stored as a BIGINT value (INTEGER for SQLite).

xauthor_type

This ENUM field has the three possible values “primaryâ€, “secondaryâ€, and “tertiary†which denote that the person is a regular author, an editor, or a series editor in the given reference, respectively. PostgreSQL implements this as a SMALLINT value, SQLite uses a TEXT field.

xauthor_position

This INT field stores the original position of the author in the paper. The sequence of authors is taken from the sequence they appear in the RIS file.

refdb-1.0.2/doc/refdb-manual/ch16s10.html000644 001750 001750 00000005277 12255431227 020535 0ustar00markusmarkus000000 000000 The table t_xkeyword

The table t_xkeyword

This table cross-references the tables t_keyword and t_refdb.

xkeyword_id

The unique ID of an t_xkeyword entry is stored as a BIGINT value (INTEGER for SQLite).

keyword_id

This BIGINT value (INTEGER for SQLite) points to the ID of the keyword in the table t_keyword.

refdb_id

This is the ID of the reference in the t_refdb table, stored as a BIGINT value (INTEGER for SQLite).

refdb-1.0.2/doc/refdb-manual/ch16s11.html000644 001750 001750 00000007541 12255431227 020532 0ustar00markusmarkus000000 000000 The table t_xuser

The table t_xuser

This table cross-references the tables t_user and t_refdb.

xuser_id

The unique ID of an t_xuser entry is stored as a BIGINT value (INTEGER for SQLite).

user_id

This BIGINT value (INTEGER for SQLite) points to the ID of the user in the table t_user.

refdb_id

This is the ID of the reference in the t_refdb table, stored as a BIGINT value (INTEGER for SQLite).

xuser_reprint

This alphanumeric string must contain one of the following:

  • NOT IN FILE (this is the default if nothing is specified)

  • ON REQUEST

  • IN FILE

xuser_date

This DATE field holds the date when a reprint was requested. If xuser_reprint contains something else than “ON REQUESTâ€, this field is not relevant.

xuser_avail

This alphanumeric field with a maximum of 255 characters contains the information where a physical copy of the article is stored. This may be a room number, a contact person, a binder or folder name or anything else that helps to track that copy down. This field is irrelevant if the reprint status is not “IN FILEâ€.

xuser_notes

This alphanumeric field of variable length contains notes or comments added by the user.

refdb-1.0.2/doc/refdb-manual/ch16s12.html000644 001750 001750 00000005420 12255431230 020517 0ustar00markusmarkus000000 000000 The table t_xnote

The table t_xnote

This table cross-references the tables t_note and t_refdb.

xnote_id

The unique ID of an t_xnote entry is stored as a BIGINT value (INTEGER for SQLite).

note_id

This BIGINT value (INTEGER for SQLite) points to the ID of the extended note in the table t_note.

xref_id

This is the ID of the database item that the note is linked to, stored as a BIGINT value (INTEGER for SQLite).

xnote_type

This field stores which type of database item (reference, keyword, author, periodical) the note is attached to.

refdb-1.0.2/doc/refdb-manual/ch16s13.html000644 001750 001750 00000005620 12255431230 020522 0ustar00markusmarkus000000 000000 The table t_xlink

The table t_xlink

This table cross-references the tables t_link and t_refdb.

xlink_id

The unique ID of an t_xlink entry is stored as a BIGINT value (INTEGER for SQLite).

link_id

This BIGINT value (INTEGER for SQLite) points to the ID of the link in the table t_link.

xref_id

This is the ID of the database item that the note is linked to, stored as a BIGINT value (INTEGER for SQLite).

xlink_type

This field stores the type of the link (URL, PDF, fulltext, related, or image).

xlink_source

This field stores whether the link is used in a reference or in a note.

refdb-1.0.2/doc/refdb-manual/ch17.html000644 001750 001750 00000007410 12255431231 020174 0ustar00markusmarkus000000 000000 Chapter 17. The RefDB database design

Chapter 17. The RefDB database design

The RefDB database is a helper database for the RefDB reference databases. It holds data for the recognition of unabbreviated words in journal names as well as the bibliography style information.

The table t_journal_words

This table holds a list with unabbreviated journal words. These are words in the names of journals which are not an abbreviation of something else. Many online sources of bibliographic information provide the journal information without periods so it is not clear whether a word in a journal name is complete by itself or whether it is an abbreviation. Some bibliographic formats ask for periods after abbreviated words, so we have to get these periods from somewhere. RefDB adds the periods if necessary when a reference is added to the database. This way you have the additional information that the periods provide always at your hands. If you don't need it, it is trivial to strip the periods away.

name

An alphanumeric field (maximum length 255 characters) that holds a word in uppercase which is an unabbreviated word in a journal name.

Examples: CELL, BIOCHEMISTRY, DRUGS

refdb-1.0.2/doc/refdb-manual/ch17s02.html000644 001750 001750 00000004575 12255431230 020531 0ustar00markusmarkus000000 000000 The table CITSTYLE

The table CITSTYLE

This table together with the REFSTYLE, POSITION, and SEPARATORS tables are used to store bibliography style sets. The CITSTYLE table contains one entry per bibliography style. It defines the appearance of the citations as well as the general appearance of the bibliography.

refdb-1.0.2/doc/refdb-manual/ch17s03.html000644 001750 001750 00000004234 12255431230 020522 0ustar00markusmarkus000000 000000 The table REFSTYLE

The table REFSTYLE

The REFSTYLE table contains zero or one entry for every publication type (such as book, journal, abstract) per bibliography style. Each entry is linked to one entry in the CITSTYLE table via the CITSTYLEID column.

refdb-1.0.2/doc/refdb-manual/ch17s04.html000644 001750 001750 00000004262 12255431230 020524 0ustar00markusmarkus000000 000000 The table SEPARATORS

The table SEPARATORS

The SEPARATORS table contains one entry per separator used in the POSITION table. Each entry is linked to an entry in the REFSTYLE table via the REFSTYLEID field.

refdb-1.0.2/doc/refdb-manual/ch17s05.html000644 001750 001750 00000004211 12255431231 020520 0ustar00markusmarkus000000 000000 The table POSITION

The table POSITION

The SEPARATORS table contains one entry per separator used in the REFSTYLE table. Each entry is linked via the REFSTYLEID and POSITION fields.

refdb-1.0.2/doc/refdb-manual/ch18.html000644 001750 001750 00000012614 12255431231 020177 0ustar00markusmarkus000000 000000 Chapter 18. RIS and risx format specifications

Chapter 18. RIS and risx format specifications

In general, RefDB tries to stick as closely as possible to the RIS format specification of the Reference Manager software version 8 (this is the most recent version I was working with). This chapter briefly recalls the general syntax of RIS and risx files and the few differences in the implementation between Reference Manager and RefDB.

The RefDB RIS implementation

Import from Reference Manager and similar bibliographic databases as well as export should work in general, although it is not always loss-free due to the varying degree of support for the full RIS specification. This chapter briefly summarizes the differences between the Reference Manager RIS specification and what RefDB uses.

  • In contrast to the mainly Windows-based bibliographic databases, RefDB expects the RIS files with UNIX line endings (LF = 0x0A). Most online sources allow to download the files in this format. The RefDB package also contains a refdb_dos2unix shell script which converts the line endings from DOS format to UNIX format (you may use your favourite perl or whatever program instead, of course).

  • In Reference Manager, the number of authors/editors/series authors per reference is limited to 255. Although this may not have any practical consequences, RefDB does not have this restriction.

  • The same holds true for keywords. In RefDB the number of keywords per reference is not limited.

  • Some of the tags defined in the RIS format specification have synonyms. RefDB does not use these randomly upon output of RIS datasets, but uses a defined subset. This subset may be a different one than Reference Manager uses. This should have no practical consequences for the data integrity, although this means that after shuffling datasets between the two databases different synonymous tags may be used.

  • The BT/T2 field is limited to 16KB in Reference Manager. It is limited to 64KB in RefDB.

  • A couple of fields in a Reference Manager database have either “no practical length limit†or the length limit is not specified at all. As these field lengths are not exactly given in SI units, I can just list what the corresponding limits in RefDB are: PY/Y1, Y2 are limited to 255 characters starting from the first slash (i.e. excluding the year information), TI/T1/CT, IS/CP, BT/T2, T3, AD are limited to 64KB, AB and N1 are limited to 16MB. I assume that none of these poses a “practical length limitâ€. If you should plan to exceed these limits, you can of course recompile refdbd and use up to the maximum field length that the database server offers (e.g. 4GB in MySQL).

refdb-1.0.2/doc/refdb-manual/ch18s02.html000644 001750 001750 00000004367 12255431231 020532 0ustar00markusmarkus000000 000000 The risx DTD

The risx DTD

The risx DTD allows to express RIS data in XML files. It has a few advantages over RIS, like full support for multiple-user notes, availability, and reprint information. The DTD is explained in a separate manual.

refdb-1.0.2/doc/refdb-manual/ch19.html000644 001750 001750 00000011407 12255431232 020200 0ustar00markusmarkus000000 000000 Chapter 19. Using RefDB in your programs

Chapter 19. Using RefDB in your programs

General thoughts

RefDB provides command-line clients to access the application server refdbd. This makes it easy to automate tasks through shell scripts or Makefiles. RefDB uses both possibilities for its own purposes. The prime example for a shell script is runbib, which transform your XML documents by invoking, among others, the RefDB bibliography client. Makefiles are more appropriate in other contexts. The Makefile created by refdbnd is just one example.

However, if you want more than that, you'll want to access refdbd from your own programs. Need RefDB support for your favourite editor? It is doable, as you can see from the RefDB integration in Emacs and in Vim. Want to access RefDB through the web? There is a PHP implementation of a web front-end in the RefDB sources with plenty of room for improvements, and there is also a SRU interface. Want to have a pointy-clicky frontend so you'll no longer have to envy the Mac and Windoze users of EndNote? Well, this is a challenge that no one has tried yet. Before you fire up your favourite IDE and start coding, please consider the following:

Do not even think about fiddling with the SQL database! Most languages offer a simple way to access SQL databases, and the database engines often provide client libraries for a variety of languages. However, RefDB is more than just a thin layer on top of a SQL database. RefDB normalizes data. RefDB takes data apart and reassembles them when needed. RefDB takes care of character encoding conversions. Even worse, the SQL table schemas may change from one RefDB version to the next. Therefore you should never attempt to access RefDB data from your own programs on the SQL level. Instead, you should rely on the interfaces that RefDB offers.

refdb-1.0.2/doc/refdb-manual/ch19s02.html000644 001750 001750 00000016211 12255431231 020522 0ustar00markusmarkus000000 000000 Interfaces

Interfaces

There are two interfaces available which will be explained below.

Call the C clients from your program

Using system calls is fairly straightforward. Most programming languages provide constructs to run external programs and to send data to their standard input or to read data from their standard output (rarely, however, both at a time). The following commands give an example how to accomplish this in Perl:

$output = `refdbc -d $dbname -C whichdb -u $user -w $pass 2>/dev/null`;
$result = `refdbc -d $dbname -C addref -t $type -u $user -w $pass $infile 2>&1`;
      

The first call discards the standard error of the command and writes only the standard output to the variable $output. The second call collects both standard error and standard output in a single variable. Your program would have to parse $result in order to separate both. In both cases Perl variables are used to supply database names, file names, or the reference type.

This kind of access works from most programming languages. For an example written in Lisp, see the Emacs frontend for RefDB. Easy as it may be, running the C clients from your program does have some drawbacks:

  • As shown in the examples above, the handling of standard output and standard error is less than perfect. You can retrieve either, or both in a single variable. Your program therefore needs the logic to separate output from error messages. If you need both separately, you can redirect both to separate files and then read in these files, but this is as kludgy as it sounds.

  • On most systems you can't send to standard input and read from standard output at the same time (see this Perl script how you can still achieve this). This can be circumvented by either writing the input data to a file (most RefDB commands can read data from files) or by capturing the input data in a file via redirection.

  • Last but not least, you need to have the C clients installed along with your own program.

Directly talk to refdbd

This is a somewhat more ambitious approach, as you have to implement the client part of the client/server dialog described here. The client/server dialog is a plain-text protocol which is fairly easy to implement in just about any language. The only tricky part is the password encryption, but that can be handed over to a little C program called eenc that is part of the RefDB sources. The RefDB project currently has client libraries for two languages which provide an implementation of the client part of the client/server protocol. The Perl client module provides an object-oriented access to refdbd which you can use in your programs without having to know anything about the client/server protocol. There is also a (rudimentary and currently unmaintained) implementation in Ruby.

To give you an impression of how you can use a client library, look at the following Perl example which does approximately the same as the examples above:

use RefDBClient::Client;
	
# create a Client object. You can create as many as you need
my $client = new RefDBClient::Client;

# set the initial connection parameters
$client->set_conninfo("127.0.0.1", "9734", "markus", "pass", "refdbtest",
           "/home/markus/literature", "/usr/local/share/refdb/css/refdb.css");

# run the whichdb command. We're not interested in the command summary,
# but read only the data proper into $data
$client->refdb_whichdb();
$data = $client->get_data();

# in order to add references from a RIS file, we first read the file contents
# into a Risdata object
my $risdata = new RefDBClient::Risdata;

$risdata->read_ris("testdata/pubmed.ris");

# now we send the data to the server. This time we read both the command
# summary (which the C clients send to stderr) into $summary and the
# data proper into $data
$summary = $clientc->refdb_addref(undef, $risdata, "ris", "ISO-8859-1");
$data = $clientc->get_data();

      

The advantages and disadvantages of using a client library are as follows:

  • You get a clean, object-oriented interface

  • No fiddling with standard error or standard output

  • However, there may be no client library for your favourite language

refdb-1.0.2/doc/refdb-manual/ch19s03.html000644 001750 001750 00000006462 12255431232 020533 0ustar00markusmarkus000000 000000 Tips and tricks

Tips and tricks

This is currently a ragbag of things to consider. It will hopefully be more structured at a later time.

Paging output

If you run commands like getref that are likely to return more information than fits on a screen, you can either try to parse the result in your program and then display it chunk-wise. You may have to parse the data anyway for a different reason, so this option may come at no extra cost. However, if you just want to display the data, you can also use the server-side paging which is implemented in all "get*" commands. These commands take an optional limit argument. The general format is limit[:offset]. limit is the number of datasets to display, and the optional offset is the number of references to skip at the beginning. That is, asking refdbd to limit the result set to 5:10 will cause it to ignore the first 10 datasets and send datasets 11 through 15. You can use this in a loop to retrieve the datasets in groups of 5 until no more datasets are available. Server-side paging is preferable in all cases where a query may return lots of data, as you don't have to buffer them locally.

refdb-1.0.2/doc/refdb-manual/ch20.html000644 001750 001750 00000007415 12255431233 020175 0ustar00markusmarkus000000 000000 Chapter 20. The Perl client module

Chapter 20. The Perl client module

While the C clients shipped with RefDB are quite versatile and scriptable, you may have a desire to bypass these clients and write scripts that directly talk to the RefDB server. The separately available RefDBClient::Client Perl module implements the client/server communication necessary to run all commands offered by the C clients from a Perl script.

Installation

Like with most Perl modules, the following command sequence will install the Perl module on your system

      ~$ 
      perl Makefile.PL
    
      ~$ 
      make
    
      ~$ 
      make install
    

Note

You need root permissions to run the last command on most systems.

refdb-1.0.2/doc/refdb-manual/ch20s02.html000644 001750 001750 00000150107 12255431233 020517 0ustar00markusmarkus000000 000000 Classes and their functions

Classes and their functions

Like most Perl modules, the RefDBClient::Client module is object-oriented. This section introduces the two classes that you need to know in order to work with the module. To see a working example, please check the test.pl script shipped with the module.

The main class that is used to access all RefDB client functions is called RefDBClient::Client. To get started, create a new instance and set the communication parameters:

use RefDBClient::Client;

my $client = new RefDBClient::Client;

$client->set_conninfo("127.0.0.1", "9734", "markus", "pass", "refdbtest",
                      "/home/markus/literature", "/usr/local/share/refdb/css/refdb.css", "360");
    

Then you can go ahead and send commands to the server like this:

$summary = $client->refdb_listdb("");
$data = $client->get_data();
    

Note

As you can easily guess the functions implementing the client commands are analogous to the commands found in the refdba and refdbc clients. See the reference pages about these apps for further information about the commands.

There are three helper classes:

  • RefDBClient::Risdata provides a simple interface to RIS data

  • ReFDBClient::Simplelist is used internally

  • RefDBClient::Enigma handles the password encryption

RefDBClient::Risdata

new

new RefDBClient::Risdata(void); 
 

Creates a new Risdata object

read_ris

$data->read_ris( $file );
 

loads RIS data from a file

$file

path of file

get_ris

$data->get_ris(void); 
 

returns previously loaded RIS data

RefDBClient::Simplelist

new

new RefDBClient::Simplelist(void); 
 

creates a new Simplelist element

RefDBClient::Enigma

new

new RefDBClient::Enigma(void); 
 

creates a new Enigma element

RefDBClient::Client

new

new RefDBClient::Client(void); 
 

creates a new Client element

set_conninfo

$client->set_conninfo( $server_ip ,
  $port_address ,
  $username ,
  $password ,
  $database ,
  $pdf_root ,
  $css_url ,
  $timeout );
 

sets the initial connection parameters of a Client object

$server_ip

IP address or hostname of the server that runs refdbd

$port_address

Port address at which refdbd listens

$username

Username for database password authentication

$password

Password for database password authentication

$database

Name of the reference database

$pdf_root

Path of the root directory of all electronic offprints

$css_url

URL of a Cascading Stylesheets file for (X)HTML output

$timeout

Timeout in seconds after which a stale connection is taken down

get_status

$client->get_status(void); 
 

returns the numerical server status

get_status_msg

$client->get_status_msg(void); 
 

returns the server status message

get_data

$client->get_data(void); 
 

returns the data of the most recent command

get_summary

$client->get_summary(void); 
 

returns the summary of the most recent command

refdb_addstyle

$client->refdb_addstyle( $styledata );
 

adds a citation/bibliography style to the database

$styledata

XML data representing the bibliography style

refdb_adduser

$client->refdb_adduser( $host ,
  $database ,
  $newuserpassword ,
  $username );
 

adds new users to the database

$host

host specification from which the user is allowed to connect

$database

name of the reference database

$newuserpassword

password (required only for new users)

$username

name of the user, as used to authenticate at the database engine

refdb_deleteuser

$client->refdb_deleteuser( $host ,
  $database ,
  $username );
 

deletes users from the database

$host

host specification from which the user is allowed to connect

$database

name of the reference database

$username

name of the user, as used to authenticate at the database engine

refdb_addword

$client->refdb_addword( $words );
 

adds reserved words to the main database

$words

space-separated list of words

refdb_deleteword

$summary = $client->refdb_deleteword( $words );
 

removes reserved words from the main database

$words

space-separated list of words

refdb_confserv

$client->refdb_confserv( $command );
 

sends a configuration command to the server

$command

the command proper, optionally followed by an argument

refdb_createdb

$client->refdb_createdb( $dbname ,
  $encoding );
 

creates a new database

$dbname

name of the reference database

$encoding

character encoding

refdb_deletedb

$client->refdb_deletedb( $databasename );
 

deletes a reference database

$dbname

name of the database

refdb_deletestyle

$client->refdb_deletestyle( $stylename_regexp );
 

deletes citation/bibliography styles

$stylename_regexp

regular expression describing the names of the styles to be deleted

refdb_getstyle

$client->refdb_getstyle( $stylename );
 

retrieves a citation/bibliography style as a citestylex doc

$stylename

name of the style

refdb_listdb

$client->refdb_listdb( $dbname_regexp );
 

lists matching databases

$dbname_regexp

regular expression describing the database names

refdb_listuser

$client->refdb_listuser( $dbname ,
  $username_regexp );
 

lists matching user names

$username_regexp

regular expression describing the user names

refdb_listword

$client->refdb_listword( $word_regexp );
 

lists matching journal name words

$wordname_regexp

regular expression describing the word names

refdb_liststyle

$client->refdb_liststyle( $stylename_regexp );
 

lists matching citation/bibliography styles

$stylename_regexp

regular expression describing the style names

refdb_viewstat

$client->refdb_viewstat(void); 
 

requests version/connection info from the server

refdb_scankw

$client->refdb_scankw( $dbname );
 

runs a thorough keyword scan in the given database

$dbname

name of the reference database

refdb_addref

$client->refdb_addref( $owner ,
  $refdata ,
  $type ,
  $encoding );
 

adds references to the database

$owner

name of the dataset owner, if different from current user

$refdata

string containing the reference data

$type

data type, must be one of 'ris' or 'risx'

$encoding

character encoding of the input data (only for RIS data)

refdb_checkref

$client->refdb_checkref( $risdata ,
  $type ,
  $encoding ,
  $outtype );
 

Checks new references against the references in the database without adding them permanently

$risdata

string containing the reference data

$type

data type, must be one of 'ris' or 'risx'

$encoding

character encoding of the input data (only for RIS data)

$outtype

output data type, must be one of 'scrn' or 'xhtml'

refdb_updateref

$client->refdb_updateref( $owner ,
  $is_personal ,
  $risdata ,
  $type ,
  $encoding );
 

updates references in the database

$owner

name of the dataset owner, if different from current user

$is_personal

set to 't' if only the personal information shall be updated

$refdata

string containing the reference data

$type

data type, must be one of 'ris' or 'risx'

$encoding

character encoding of the input data (only for RIS data)

refdb_deleteref

$client->refdb_deleteref( $idlist );
 

deletes references from the database

$idlist

string specifying the IDs of the references to be deleted

refdb_addnote

$client->refdb_addnote( $owner ,
  $xnotedata );
 

adds notes to the database

$owner

owner of the note, if different from the current user

$xnotedata

XML data specifying the note

refdb_updatenote

$client->refdb_updatenote( $owner ,
  $is_personal ,
  $xnotedata );
 

updates references in the database

$owner

owner of the note, if different from the current user

$is_personal

set to 't' if only the personal information shall be updated

$xnotedata

XML data specifying the note

refdb_deletenote

$client->refdb_deletenote( $idlist );
 

deletes notes from the database

$idlist

string specifying the ID values of the notes to be deleted

refdb_addlink

$client->refdb_addlink( $linkspec );
 

links notes to database objects

$linkspec

string specifying the link(s) to be created

refdb_deletelink

$client->refdb_deletelink( $linkspec );
 

unlinks notes from database objects

$linkspec

string specifying the link(s) to be deleted

refdb_getas

$client->refdb_getas( $limit_string ,
  $name_regexp );
 

retrieves matching series authors

$limit_string

Limits the matching datasets. Must be in the form 'limit[:offset]', where limit is the number of returned datasets, and offset the number of datasets to skip.

$name_regexp

regular expression describing the names to be retrieved

refdb_getau

$client->refdb_getau( $limit_string ,
  $name_regexp );
 

retrieves matching authors

$limit_string

Limits the matching datasets. Must be in the form 'limit[:offset]', where limit is the number of returned datasets, and offset the number of datasets to skip.

$name_regexp

regular expression describing the names to be retrieved

refdb_geted

$client->refdb_geted( $limit_string ,
  $name_regexp );
 

retrieves matching editors

$limit_string

Limits the matching datasets. Must be in the form 'limit[:offset]', where limit is the number of returned datasets, and offset the number of datasets to skip.

$name_regexp

regular expression describing the names to be retrieved

refdb_getkw

$client->refdb_getkw( $limit_string ,
  $keyword_regexp );
 

retrieves matching keywords

$limit_string

Limits the matching datasets. Must be in the form 'limit[:offset]', where limit is the number of returned datasets, and offset the number of datasets to skip.

$keyword_regexp

regular expression describing the keywords to be retrieved

refdb_getjf

$client->refdb_getjf( $is_all ,
  $limit_string ,
  $journal_regexp );
 

retrieves matching periodicals (full names)

$is_all

set to 't' if all synonymous journal names shall be returned

$limit_string

Limits the matching datasets. Must be in the form 'limit[:offset]', where limit is the number of returned datasets, and offset the number of datasets to skip.

$name_regexp

regular expression describing the names to be retrieved

refdb_getjo

$client->refdb_getjo( $is_all ,
  $limit_string ,
  $journal_regexp );
 

retrieves matching periodical names (abbrev)

$is_all

set to 't' if all synonymous journal names shall be returned

$limit_string

Limits the matching datasets. Must be in the form 'limit[:offset]', where limit is the number of returned datasets, and offset the number of datasets to skip.

$name_regexp

regular expression describing the names to be retrieved

refdb_getj1

$client->refdb_getj1( $is_all ,
  $limit_string ,
  $journal_regexp );
 

retrieves matching periodical names (custom abbrev 1)

$is_all

set to 't' if all synonymous journal names shall be returned

$limit_string

Limits the matching datasets. Must be in the form 'limit[:offset]', where limit is the number of returned datasets, and offset the number of datasets to skip.

$name_regexp

regular expression describing the names to be retrieved

refdb_getj2

$client->refdb_getj2( $is_all ,
  $limit_string ,
  $journal_regexp );
 

retrieves matching periodical names (custom abbrev 2)

$is_all

set to 't' if all synonymous journal names shall be returned

$limit_string

Limits the matching datasets. Must be in the form 'limit[:offset]', where limit is the number of returned datasets, and offset the number of datasets to skip.

$name_regexp

regular expression describing the names to be retrieved

refdb_getref

$client->refdb_getref( $type ,
  $format_string ,
  $sort_string ,
  $listname ,
  $encoding ,
  $limit_string ,
  $query_string );
 

retrieves references

$type

select output format

$format_string

specify additional fields to be retrieved

$sort_string

specify sorting key

$listname

specify a list name if the search is to be confined to a particular personal reference list

$encoding

the character encoding for the output data

$limit_string

Limits the matching datasets. Must be in the form 'limit[:offset]', where limit is the number of returned datasets, and offset the number of datasets to skip.

$query_string

the query that describes the datasets to be retrieved

refdb_countref

$client->refdb_countref( $listname ,
  $limit_string ,
  $query_string );
 

Counts matching references

$listname

specify a list name if the search is to be confined to a particular personal reference list

$limit_string

Limits the matching datasets. Must be in the form 'limit[:offset]', where limit is the number of returned datasets, and offset the number of datasets to skip.

$query_string

the query that describes the datasets to be counted

refdb_pickref

$client->refdb_pickref( $idlist $listname );
 

adds references to the users personal reference list

$idlist

specifies the ID values of the references to be picked

$listname

the name of the personal list that the references should be added to. If this string is empty, the default personal list is used instead,

refdb_dumpref

$client->refdb_dumpref( $idlist $listname );
 

removes references from personal reference list

$idlist

specifies the ID values of the references to be dumped

$listname

the name of the personal list that the references should be added to. If this string is empty, the default personal list is used instead,

refdb_getnote

$client->refdb_getnote( $type ,
  $format_string ,
  $sort_string ,
  $encoding ,
  $limit_string ,
  $query_string );
 

retrieves references

$type

select output format

$format_string

specify additional fields to be retrieved

$sort_string

specify sorting key

$encoding

the character encoding for the output data

$limit_string

Limits the matching datasets. Must be in the form 'limit[:offset]', where limit is the number of returned datasets, and offset the number of datasets to skip.

$query_string

the query that describes the datasets to be retrieved

refdb_countnote

$client->refdb_countnote( $listname ,
  $limit_string ,
  $query_string );
 

Counts matching extended notes

$listname

specify a list name if the search is to be confined to a particular personal reference list

$limit_string

Limits the matching datasets. Must be in the form 'limit[:offset]', where limit is the number of returned datasets, and offset the number of datasets to skip.

$query_string

the query that describes the datasets to be counted

refdb_selectdb

$client->refdb_selectdb( $dbname );
 

selects an existing database as the current database

$dbname

name of the reference database

refdb_whichdb

$client->refdb_whichdb(void); 
 

displays information about the current database

refdb_texbib

$client->refdb_texbib( $style ,
  $cite_data );
 

retrieves a bibliography in bibtex format based on citationlistx data

$style

the name of the citation/bibliography style

$cite_data

XML data describing the references

refdb_dbib

$client->refdb_dbib( $type ,
  $style ,
  $encoding ,
  $cite_data );
 

retrieves an XML/SGML bibliography based on citationlistx data

$type

type of the bibliography output

$style

name of the citation/bibliography style

$encoding

character encoding of the output data

$cite_data

XML data specifying the references

refdb-1.0.2/doc/refdb-manual/ch21.html000644 001750 001750 00000010636 12255431233 020175 0ustar00markusmarkus000000 000000 Chapter 21. Using the backend API to implement new output formats

Chapter 21. Using the backend API to implement new output formats

While there is nothing like a runtime-plugin mechanism to add new output formats, the RefDB code is sufficiently modularized to make the implementation of a new format a fairly easy task. You don't have to parse the query results directly, but you call wrapper functions instead. This also has the nice advantage that changes in the database design show up only in one place and thus are less likely to break the backend implementations.

We will first have a look at the API that backend.c provides. Then we'll have a look at those parts in the existing code that need to be modified in order to accept a new backend.

The backend API

In general, the backend API provides a get_foo() for every tag foo in the RIS specification. There are, however, two fundamentally different types of tag retrieval functions:

  1. The simple retrievals pull out values from the main table (t_refdb) of the database with a single function call.

  2. The compound retrievals need three functions: A request_foo() obtains an array of possible values. A get_foo() retrieves one or more of these values and can be used in a loop to retrieve all values. Finally, the clean_request() frees the allocated memory. Compound retrievals are used to get at values which are stored outside the main table, like authors or keywords.

The prototypes of these functions can be found in backend.h, and their use is shown in the existing backends backend-scrn.c, backend-ris.c, backend-db31.c, and backend-bibtex.c.

refdb-1.0.2/doc/refdb-manual/ch21s02.html000644 001750 001750 00000004374 12255431233 020524 0ustar00markusmarkus000000 000000 How to insert a new backend into RefDB

How to insert a new backend into RefDB

Define a new type, expand the if-then-else statement, include include-file. {work in progress}

refdb-1.0.2/doc/refdb-manual/ch22.html000644 001750 001750 00000007155 12255431234 020201 0ustar00markusmarkus000000 000000 Chapter 22. The RefDB SGML/XML input and output formats

Chapter 22. The RefDB SGML/XML input and output formats

RefDB uses XML files to encode the information about the required references for a bibliography. The resulting bibliographic output can be used as an external entity in both XML and SGML DocBook files (the bibliography can be transformed to any other SGML or XML type with suitable stylesheets). The structures of these files will be briefly explained in this chapter.

The XML input format for bibliographies

RefDB uses (Open)Jade (for SGML documents) or an XSLT processor (for XML documents) to extract a list of required references and their logical relationships (position in the document, single or multiple citations and such). This list is encoded in an XML document conforming to the CitationList XML DTD.

refdb-1.0.2/doc/refdb-manual/ch22s02.html000644 001750 001750 00000005274 12255431234 020526 0ustar00markusmarkus000000 000000 The XML input format for bibliographic styles

The XML input format for bibliographic styles

The formatting instructions specific to a publisher or a journal where your document is to be published are encoded in a document conforming to the CiteStyle XML DTD. To increase the speed of the bibliography creation the formatting information has to be imported into RefDB and is stored in the RefDB database. The CiteStyle XML DTD is moderately complex and is documented in a separate manual.

refdb-1.0.2/doc/refdb-manual/ch22s03.html000644 001750 001750 00000004444 12255431234 020525 0ustar00markusmarkus000000 000000 The XML input format for extended notes

The XML input format for extended notes

Extended notes are encoded in XML documents conforming to the Xnote DTD.

refdb-1.0.2/doc/refdb-manual/ch22s04.html000644 001750 001750 00000017024 12255431234 020524 0ustar00markusmarkus000000 000000 Processing expectations for the RefDB DocBook bibliography output

Processing expectations for the RefDB DocBook bibliography output

The accepted standard DSSSL and XSL stylesheets for DocBook by Norman Walsh as well as the XSL stylesheets for TEI by Sebastian Rahtz are not designed to handle the complexity of the bibliography formatting requirements of various journals and publishers. RefDB strains the limits of SGML and the document types to supply the required structural information, but it takes customized stylesheets to turn this into proper formatting. The RefDB package contains sets of DSSSL and XSL stylesheets that were designed for this purpose. They are implemented as driver files for the standard stylesheets. If those stylesheets do not do exactly what you need, you will have to modify them or write new ones from scratch. This chapter briefly explains the design of the output that RefDB generates and how this should be processed in your stylesheets.

Note

This section discusses the DocBook output. It is straightforward to transfer this to TEI output. See here for a description of the equivalent TEI elements and attributes.

The general principle of the RefDB bibliography is straightforward: Each citation that you want to be treated as a RefDB citation needs to have a role attribute with the value “REFDBâ€. Each citation defines at least one xref element. The value of the linkend attribute encodes the ID of the required reference in the database (if you need references in several databases, this attribute can additionally specify the database). RefDB uses this information to generate a DocBook bibliography element. This contains an entry for each requested reference. These entries are labelled with ID attributes that match the xref linkend attributes in the text. Each RefDB-generated reference entry defines a xreflabel attribute which holds the text that is to be displayed at the position of the corresponding xref elements.

This is all it takes for single and unique citations, i.e. with one xref element per citation element and only one occurrence throughout the text. Both multiple occurrences of the same citation in the text and multiple citations (more than one xref elements per citation element) make things a bit more difficult.

Some output formats require a different formatting for the first citation of a publication in the text and all subsequent citations of the same publication. The first citation is identical with the above mentioned default case. All following citations of the same publication need an additional xref endterm attribute which points to an additional bibliomset element which in turn contains the text to be displayed for subsequent citations. The endterm attribute has the same value as the linkend attribute except that the letter “S†(as in subsequent) is appended to the attribute.

The real trouble starts with multiple citations. The output format may require the sequence of the citations to be sorted, and in the case of a numerical citation style it may require sequences of consecutive citations to be displayed as ranges (e.g. “[5-7]†instead of “[5,6,7]â€). This may break the links between the individual citations and the reference in the bibliography in the output document. RefDB will create an additional bibliomset element for each multiple citation. This provides the sorted and formatted text that is to be displayed for the multiple citation. For this to work you have to define an additional xref element whose linkend attribute points to one of the references and whose endterm points to the additional bibliomset element. This arrangement allows the multiple citation to be displayed differently depending on the desired output format. If the output is generated for printout, only the additional xref element should be formatted. This ensures the correct formatting of the citation in the printout. In output formats that allow hyperlinks it may be preferable to format the xref elements that link to the references individually. This may be incorrect in terms of the citation style, but the functional links to the references in the bibliography may outweigh this disadvantage.

refdb-1.0.2/doc/refdb-manual/ch23.html000644 001750 001750 00000011524 12255431245 020177 0ustar00markusmarkus000000 000000 Chapter 23. The RefDB client/server communication protocol

Chapter 23. The RefDB client/server communication protocol

This chapter describes the communication protocol that the RefDB clients and server use to talk to each other. Knowledge of this protocol is useful for programmers who want to write custom RefDB clients. The protocol is versioned in order to allow clients and servers to negotiate whether they can fulfil each other's expectations. The protocol described in this document is version 5.

Tip

The RefDB project provides a Perl client module in addition to the C clients shipped with the RefDB package proper. Due to the simplicity of the Perl language, this module is a good resource for programmers who want to implement clients in other programming languages.

Prerequisites

Custom clients or client libraries can be implemented in any programming language that can create a Unix socket connection to the server and send/receive byte sequences through the socket. As the transferred data are essentially plain text, the endianness of the computer as well as the internal representation of data types in the particular programming language are irrelevant.

refdb-1.0.2/doc/refdb-manual/ch23s02.html000644 001750 001750 00000041261 12255431235 020524 0ustar00markusmarkus000000 000000 Basic principles

Basic principles

refdbd is implemented as a forking server. The parent process waits to accept connections from the clients. If a valid connection request is detected, the server forks. The parent closes the connection and is ready to respond to further requests. The child processes the client request and terminates when done.

The communication between the client and the server is at least a two-stage process. In the first stage, the validity of the client request is checked, the protocol version is checked and the password encryption is initiated. In the second stage, the command proper is executed and the results are sent back to the client. The second stage may use several iterations of client/server messages in order to transfer larger amounts of data.

Message format

All data, that is client commands as well as the server-generated results, are sent as plain text. We have to distinguish between three types of messages:

Status messages

Status messages are unterminated three-byte sequences which encode the client or server status. They may precede terminated messages, but they can also appear alone. The three bytes are a text representation of the client or server status. E.g. the sequence "000" (that is, three times the ASCII character 48 representing the digit 'zero') denotes an OK status. A listing of the status messages used by RefDB is shown in the section Status Messages.

Terminated messages

Most of the data transfer between client and server uses terminated messages. Due to the support of multibyte character sets the string termination character is not a single '\0' character as in a C string, but a sequence of four consecutive '\0' bytes (sequences of up to three '\0' bytes may occur as part of multibyte Unicode characters). It is best to think of the messages as binary strings. A custom client has to terminate its messages to the server appropriately, and it has to scan the data sent back by the server for the terminating sequence.

Messages of a specified length

In a few cases, the client asks the server to provide a buffer of a certain size, and will subsequently transfer exactly the requested number of bytes. These messages are unterminated.

First stage

The purpose of the first stage is to check whether the client request makes sense at all, and if so, to initiate the exchange of the password encryption information.

Sanity and permission check

Unless told otherwise, refdbd accepts only local connections. If the client request stems from a computer with a different IP address than the computer that runs refdbd, the connection request is refused without any further attempt to talk to the client. From the client side the connection will simply time out. This "unfriendly" behaviour minimizes the risk of remote exploits.

If the client is allowed to connect, refdbd tries to read a terminated string from the client. If this string is too short or too long to represent the protocol number which the client is supposed to send, the connection request is refused by sending back an appropriate status message. The same occurs if the protocol version of the client is not supported by the server.

Password encryption

The RefDB clients may have to transmit the database username and password in order to authenticate the user with the database server. In order to avoid sending the password across the network as plain text, the clients send encrypted versions, which the refdbd server decrypts again. Database engine client libraries usually employ their own means to encrypt the passwords when they are sent from refdbd to the database engine.

RefDB uses a fairly simple password encryption. It is still too cumbersome to decrypt for bored script kiddies so it should serve it's purpose. The encryption is somewhat modeled after the (in)famous ENIGMA boxes used by the bad guys in WWII. The basic idea is that refdbd sends a string to the client which encodes the (randomly generated) rotor sequence and positions for this particular connection. The client uses this information to encode the password. The server can decrypt the password using the sequence and position information that it previously generated.

The rotor wirings are hardcoded. Any client or library has to use the same wirings as in src/filename.c. The encoding string has the format "ABC-DE-FG-HI", which stands for:

ABC

This three-digit string denotes the sequence of the wheels. ABC denote the wheels in slots 0, 1, and 2, respectively. The wheels are also numbered 0 through 2, and each wheel can be used only once. That is, all valid combinations are "012", "021", "102", "120", "210", "201". For example, the string "120" means that wheel 1 is inserted in slot 0, wheel 2 in slot 1, and wheel 0 in slot 2.

DE

The position of the wheel in slot 0. A two-digit integer equal to or larger than 0 and smaller than 94. For example, the string "05" means the wheel in slot 0 has to advance 5 positions.

FG

Same as DE, but for slot 1.

HI

Same as DE, but for slot 2.

The encryption and decryption itself is described in sufficient detail in the source file src/enigma.c or in the Client.pm file of the RefDBClient Perl module. If you cannot implement this mechanism in your favourite programming language, there is also an external program eenc as part of the RefDB distribution which performs the encryption/decryption and sends the result to stdout. Use it like this:

	  ~$ 
	  eenc -p ABC-DE-FG-HI password
	

Most programming languages allow to read the results from stdout into a variable and use it as the encrypted or decrypted string.

Note

There is no switch for encryption or decryption as the ENIGMA mechanism is symmetrical.

Second stage

As the first step of the second stage the client sends the command string proper. These strings are commands as you know them from your shell. They are roughly equivalent to the command strings that you type into the C clients. refdbd parses the command string internally with the getopt library, just as your shell does. After the command string is parsed, refdbd executes the command. The result is returned in at least two steps. With one exception, refdbd first sends back the command result, followed by a command summary. For example, the listdb command first sends back a newline-separated list of database names (the command result proper), followed by the number of available databases (the command summary). These steps are explained in more detail in the following sections. First we'll have a look at the internal command syntax.

Command syntax

Each command consists of the command word proper, optionally followed by switches, options, and arguments. As the string is parsed by the getopt library, the sequence of options, commands, and arguments does not matter. The following synopsis shows all possible switches and options.

command [-a] [-A in_format] [-b listname] [-d database] [-E encoding] [-G URL] [-H host] [-k] [-n] [-N limit[:offset]] [-o number] [-p] [-P] [-r] [-R pdfroot] [-s format_string] [-S sort_string] [-t ref_format] [-u username] [-U name] [-w password] [-W newuser_password]

-a

The commands getjo, getjf, getj1, and getj2 use this switch to request all journal names (short, full, user abbrev1, and user abbrev2) instead of only the one used to match the query.

-A in_format

The input data format for addref, updateref, and checkref. Currently supported values are "ris" and "risx".

-b listname

Specifies the name of a personal reference list.

-d database

This option sets the name of the database to be used with the current command.

-E encoding

This option sets the character encoding for the current command.

-G URL

The getref command uses this option to pass the URL of a CSS stylesheet to the server.

-H host

The adduser command uses this option to set the hostname or IP address of the user to be added.

-k

This switch tells the addref command to preserve the numerical ID of the datasets in the U5 field.

-n namespace

This option passes a namespace prefix to the getref and getnote commands (applies only to XML output)

-N limit[:offset]

The getref command and all other get* commands use this option to limit the range of datasets to return. limit denotes the number of references to return, and offset is an optional number of references to skip at the beginning.

-o number

This option is used to set a custom starting number for numeric bibliographies.

-p

This option is used with the addref and updateref commands. If set, refdbd will update personal info only.

-P

If used with the getref command, only references in the personal interest list will be returned.

-r

This switch is used with several commands to turn an "add" operation into a "remove" operation.

-R pdfroot

This option tells the getref command the variant part of the link to an electronic offprint.

-s format_string

getbib uses this option to pass the bibliography style. Checkref uses this option to request additional fields in the xhtml output.

-S sort_string

The name of the bibliography style to be used with the getbib command.

-t ref_format

The output format of the references retrieved with the getref and getbib commands.

-u username

The username to be used to authenticate with the database engine.

-U name

The name of the user to be associated with a query.

-w password

The password to be used to authenticate with the database engine.

-W newuser_password

The adduser command uses this option to set the password of the new user.

refdb-1.0.2/doc/refdb-manual/ch23s03.html000644 001750 001750 00000310207 12255431245 020525 0ustar00markusmarkus000000 000000 Commented abstract representation of the client/server protocol

Commented abstract representation of the client/server protocol

This chapter tries to explain the client/server protocol of all currently supported RefDB commands using an abstract representation which should be fairly easy to port to any real programming language.

First stage

stepclientservermessage typecomment
16\0\0\0\0  the current protocol version, a terminated string of up to 16 characters. The whole string will be converted to an integer internally. The current protocol version of RefDB is a compile-time constant which is defined in src/connect.h.
2 000ABC-DE-FG-HI\0\0\0\0okthe ok status message, followed by the randomly generated encryption string
   errorthere is no server response in case of a refused remote connection
  102, 103, 104, or 801erroran error status message, ending the dialog
3000command\0\0\0\0 okthe ok status message, followed by the command proper. See below for details.
  112  errorthe error status code signalling a client error

Second stage

The second stage is the more interesting part of the protocol, as it is here where the commands differ. The following section briefly explain the inner workings of the commands and show an abstract representation of the protocol.

addlink

The internal API command addlink corresponds to refdbc: addlink.

stepclientservermessage typecomment
1000addlink [options] link-spec [link-spec...]\0\0\0\0 okthe ok message status, followed by the terminated addlink command sting
2 000<data>\0\0\0\0okthe ok message status, followed by a terminated string containing the command result
   803 partial success, aborted after unrecoverable errorthe error message status, followed by a terminated string containing the command result
  204, 417, 233, or 801errorthe error message status which terminates the session
3 000  okthe ok message status
4 000<data>\0\0\0\0okthe ok message status, followed by a terminated string containing the command result summary
5 000  okthe ok message status, ending the dialog

addnote

The internal API command addnote corresponds to refdbc: addnote.

stepclientservermessage typecomment
1000addnote [options] filename\0\0\0\0 okthe ok message status, followed by the terminated addnote command sting
2  000 okthe ok message status
   701 warningthe warning message status
  202, 204, or 801errorthe error message status which terminates the session
3000<bytes>\0\0\0\0 okthe ok message status, followed by a terminated string denoting the number of bytes that the client wants to transmit
  402  okthe message status saying that all data have been sent, ending the loop over all datasets
  404  okthe message status saying that the current dataset has been sent completely
  401  errorthe message status saying that there was a problem reading the input data, ending the session
4  000 okthe ok message status
   801 errorthe error message status, ending the session
5<data> okthe previously announced number of data bytes
6  403 okthe ok status for a successfully transmitted chunk of data
  400<message>\0\0\0\0errorthe error status, followed by a terminated, server-generated error message specifying the error
  408 or 413okthe message status denoting success of the previous add or update action
  702, 801errorthe error status, followed by a terminated, server-generated error message specifying the error
7see step 3 okrepeat loop until end of data
  402  okthe message status saying that all data have been sent, ending the loop over all datasets
  404  okthe message status saying that the current dataset has been sent completely
8 403<result message>\0\0\0\0okthe ok status signalling that a chunk has been added successfully, followed by the terminated server result message, finishing the dialog
9 000  okthe ok message status, ending the dialog

addref, updateref, checkref

The addref and updateref commands send bibliographic data in various formats to the database in order to add or update them, respectively. The related checkref command also sends bibliographic data to the server in order to check for duplicates. The client/server protocols differ slightly based on the type of data transferred. RIS data are transmitted one dataset at a time, whereas XML data are streamed in chunks of a defined size.

stepclientservermessage typecomment
1000XXref -s ris [options]\0\0\0\0 okthe ok message status, followed by the terminated addref command sting
2  000 okthe ok message status
   701 warningthe warning message status
  202, 401, or 801errorthe error message status which terminates the session
3000<bytes>\0\0\0\0 okthe ok message status, followed by a terminated string denoting the number of bytes that the client wants to transmit
  402  okthe message status saying that all data have been sent, ending the loop over all datasets
  401  errorthe message status saying that there was a problem reading the input data, ending the session
4  000 okthe ok message status
   801 errorthe error message status, ending the session
5<data> okthe previously announced number of data bytes
6  403 okthe ok status for a successfully transmitted chunk of data
  400<message>\0\0\0\0errorthe error status, followed by a terminated, server-generated error message specifying the error
  408<message>\0\0\0\0 or 413<message>\0\0\0\0okthe message status denoting success of the previous add or update action, followed by the current value of the dataset counter
  702, 801errorthe error status, followed by a terminated, server-generated error message specifying the error
7see step 3 okrepeat loop until end of data
  402  okthe message status saying that all data have been sent, ending the loop over all datasets
8  403<data>\0\0\0\0 okthe ok status signalling that a chunk has been added successfully, followed by an optional terminated string containing a result message
9 000  okthe ok message status
10 000<data>\0\0\0\0okthe ok message status, followed by a terminated string containing the command result summary
11 000  okthe ok message status, ending the dialog

And now the slightly different protocol for risx data:

stepclientservermessage typecomment
1000addref -s risx [options]\0\0\0\0 okthe ok message status, followed by the terminated addref command sting
2  000 okthe ok message status
   701 warningthe warning message status
  202, 204, or 801errorthe error message status which terminates the session
3000<bytes>\0\0\0\0 okthe ok message status, followed by a terminated string denoting the number of bytes that the client wants to transmit
  402  okthe message status saying that all data have been sent, ending the loop over all datasets
  404  okthe message status saying that the current dataset has been sent completely
  401  errorthe message status saying that there was a problem reading the input data, ending the session
4  000 okthe ok message status
   801 errorthe error message status, ending the session
5<data> okthe previously announced number of data bytes
6  403 okthe ok status for a successfully transmitted chunk of data
  400<message>\0\0\0\0errorthe error status, followed by a terminated, server-generated error message specifying the error
  408<message>\0\0\0\0 or 413<message>\0\0\0\0okthe message status denoting success of the previous add or update action, followed by the current value of the dataset counter
  702, 801errorthe error status, followed by a terminated, server-generated error message specifying the error
7see step 3 okrepeat loop until end of data
  402  okthe message status saying that all data have been sent, ending the loop over all datasets
8  403<data>\0\0\0\0 okthe ok status signalling that a chunk has been added successfully, followed by an optional terminated string containing the result message
9 000  okthe ok message status
10 000<data>\0\0\0\0okthe ok message status, followed by a terminated string containing the command result summary
11 000  okthe ok message status, ending the dialog

addstyle

The internal API command addstyle corresponds to refdba: addstyle.

stepclientservermessage typecomment
1000addstyle [options] filename\0\0\0\0 okthe ok message status, followed by the terminated addstyle command sting
2  000 okthe ok message status
  104, 105, 106, 107, 108, 202, 203, 204, 206, or 801errorthe error message status which terminates the session
3000<bytes>\0\0\0\0 okthe ok message status, followed by a terminated string denoting the number of bytes that the client wants to transmit
  402  okthe message status saying that all data have been sent, ending the loop over all datasets
  404  okthe message status saying that the current dataset has been sent completely
  401  errorthe message status saying that there was a problem reading the input data, ending the session
4 000okthe ok message status
   801 errorthe error message status, ending the session
5<data> okthe previously announced number of data bytes
6  403 okthe ok status for a successfully transmitted chunk of data
  400<message>\0\0\0\0errorthe error status, followed by a terminated, server-generated error message specifying the error
7see step 3 okrepeat loop until end of data
  402  okthe message status saying that all data have been sent, ending the loop over all datasets
  404  okthe message status saying that the current dataset has been sent completely
8 403<result message>\0\0\0\0okthe ok status signalling that a chunk has been added successfully, followed by the terminated server result message, finishing the dialog
9 000  okthe ok message status, ending the dialog

adduser

The internal API command adduser corresponds to refdba: adduser.

stepclientservermessage typecomment
1000adduser [options]\0\0\0\0 okthe ok message status, followed by the terminated adduser command sting
2  000 okthe ok message status
  202224 or 801errorthe error message status which terminates the session
3000<names>\0\0\0\0 okthe ok message status, followed by a terminated string containing a list of names
4  000<summary>\0\0\0\0 okthe ok message status
  205 801  errorthe message status saying that there was a problem, ending the session
5 000  okthe ok message status, ending the dialog

addword

The internal API command addword handles both the refdba: addword and the refdba: deleteword client commands.

stepclientservermessage typecomment
1000addword [options]\0\0\0\0 okthe ok message status, followed by the terminated addword command sting
2  000 okthe ok message status
  202, or 801errorthe error message status which terminates the session
3000<data>\0\0\0\0 okthe ok message status, followed by a terminated string containing the word list
  112  errorthe error message status which terminates the session
4 000<data>\0\0\0\0okthe ok message status, followed by a terminated string containing the command result
5 000  okthe ok message status
6 000<data>\0\0\0\0okthe ok message status, followed by a terminated string containing the command result summary
7 000  okthe ok message status, ending the dialog

confserv

The internal API command confserv corresponds to refdba: confserv.

stepclientservermessage typecomment
1000confserv command [argument]\0\0\0\0 okthe ok message status, followed by the terminated confserv command sting
2 000<data>\0\0\0\0okthe ok message status, followed by a terminated string containing the command result
  202, 301, 801, 839, 840errorthe error message status which terminates the session
3 000  okthe ok message status
4 000<data>\0\0\0\0okthe ok message status, followed by a terminated string containing the command result summary
5 000  okthe ok message status, ending the dialog

createdb

The internal API command createdb corresponds to refdba: createdb.

stepclientservermessage typecomment
1000createdb [options]dbname\0\0\0\0 okthe ok message status, followed by the terminated createdb command sting
2 000<data>\0\0\0\0okthe ok message status, followed by a terminated string containing the command result
  111, or 801errorthe error message status which terminates the session
3 000  okthe ok message status
4 000<data>\0\0\0\0okthe ok message status, followed by a terminated string containing the command result summary
5 000  okthe ok message status, ending the dialog

deletedb

The internal API command deletedb corresponds to refdba: deletedb.

stepclientservermessage typecomment
1000deletedb [options]\0\0\0\0 okthe ok message status, followed by the terminated deletedb command sting
2 000<data>\0\0\0\0okthe ok message status, followed by a terminated string containing the command result
  202, or 801errorthe error message status which terminates the session
3 000  okthe ok message status
4 000<data>\0\0\0\0okthe ok message status, followed by a terminated string containing the command result summary
5 000  okthe ok message status, ending the dialog

deletenote

The internal API command deletenote corresponds to refdbc: deletenote.

stepclientservermessage typecomment
1000deletenote [options] <bytes>\0\0\0\0 okthe ok message status, followed by the terminated adduser command sting containing the number of bytes required to store the ID list.
2  000 okthe ok message status
   111 801 errorthe error message status which terminates the session
3000<ID-list>\0\0\0\0 okthe ok message status, followed by a terminated string containing a list of note IDs
4  000<data>\0\0\0\0 okthe ok message status, followed by a report about the delete actions
  204, 412, 801errorthe message status saying that there was a problem, ending the session
5 000  okthe ok message status
6  000<summary>\0\0\0\0 okthe ok message status, followed by a command summary
7 000  okthe ok message status, ending the dialog

deleteref

The internal API command deleteref corresponds to refdbc: deleteref.

stepclientservermessage typecomment
1000deleteref [options] <bytes>\0\0\0\0 okthe ok message status, followed by the terminated adduser command sting containing the number of bytes required to store the ID list.
2  000 okthe ok message status
   801 errorthe error message status which terminates the session
3000<ID-list>\0\0\0\0 okthe ok message status, followed by a terminated string containing a list of reference IDs
4  000<data>\0\0\0\0 okthe ok message status, followed by a report about the delete actions
  204, 412, 801errorthe message status saying that there was a problem, ending the session
5 000  okthe ok message status
6  000<summary>\0\0\0\0 okthe ok message status, followed by a command summary
7 000  okthe ok message status, ending the dialog

deletestyle

The internal API command deletestyle corresponds to refdba: deletestyle.

stepclientservermessage typecomment
1000deletestyle {regexp}\0\0\0\0 okthe ok message status, followed by the terminated deletestyle command sting
2 000<data>\0\0\0\0okthe ok message status, followed by a terminated string containing the command result
  202, 234, or 801errorthe error message status which terminates the session
3 000  okthe ok message status
4 000<data>\0\0\0\0okthe ok message status, followed by a terminated string containing the command result summary
5 000  okthe ok message status, ending the dialog

getau, geted, getas, getkw, getjo, getjf, getj1, getj2

These internal API commands correspond to the client commands refdbc: getau, refdbc: geted, refdbc: getas, refdbc: getkw, refdbc: getjo, refdbc: getjf, refdbc: getj1, refdbc: getj2.

stepclientservermessage typecomment
1000getXX [options]\0\0\0\0 okthe ok message status, followed by the terminated command sting
2 000<data>\0\0\0\0okthe ok message status, followed by a terminated string containing the command result
  204, 208, 234, or 801errorthe error message status which terminates the session
3 000  okthe ok message status
4 000<data>\0\0\0\0okthe ok message status, followed by a terminated string containing the command result summary
5 000  okthe ok message status, ending the dialog

getbib

The internal API command getbib is used by the refdbib tool to retrieve cooked SGML and XML bibliographies.

stepclientservermessage typecomment
1000getbib [options]\0\0\0\0 okthe ok message status, followed by the terminated getbib command string.
2  000 okthe ok message status, meaning no style spec will be transmitted (jump to 4)
   402 okthe ok message status, meaning the style spec will be transmitted
  202, 204, 241, 701, 801errorthe error message status, terminating the dialog
3 000  okthe ok message status
4  000 okthe ok message status
   242 errorthe error message status, finishing the dialog
5000<bytes>\0\0\0\0 okthe ok message status, followed by a terminated string denoting the number of bytes that the client wants to transmit
  402  okthe message status saying that all data have been sent, ending the loop over all datasets
  404  okthe message status saying that the current dataset has been sent completely
  401  errorthe message status saying that there was a problem reading the input data, ending the session
6  000 okthe ok message status
   801 errorthe error message status, ending the session
7<data> okthe previously announced number of data bytes
8  403 okthe ok status for a successfully transmitted chunk of data
  400<message>\0\0\0\0errorthe error status, followed by a terminated, server-generated error message specifying the error
9 000  okthe ok message status
10  404 okthe ok status for a successfully transmitted chunk of data
   402 okthe ok status for the last chunk of data
11 000  okthe ok message status
12 000<summary>\0\0\0\0okthe ok message status, followed by the terminated command summary string.
13 000  okthe ok message status, finishing the dialog

getnote, countnote

The internal API command getnote corresponds to refdbc: getnote and refdbc: countnote.

stepclientservermessage typecomment
1000getnote [options] <bytes>\0\0\0\0 okthe ok message status, followed by the terminated getref command sting containing the number of bytes required to store the query string
2  000 okthe ok message status
   801 errorthe error message status which terminates the session
3000<query-string>\0\0\0\0 okthe ok message status, followed by a terminated string containing the query
4 404<data>\0\0\0\0okthe ok message status denoting a complete dataset, followed by a terminated string containing the dataset
  402<data>\0\0\0\0okthe ok message status denoting the last chunk of data (usually a "footer"), followed by a terminated string containing the data
  204, 234, 701, or 801errorthe error message status which terminates the session
5 000  okthe ok message status
6 402<data>\0\0\0\0okthe ok message status denoting the last chunk of data (usually a "footer"), see step 2
7 000<data>\0\0\0\0okthe ok message status, followed by a terminated string containing the command result summary
  702, or 801errorthe error message status which terminates the session
8 000  okthe ok message status, ending the dialog

getref, countref

The internal API command getref corresponds to refdbc: getref and refdbc: countref.

stepclientservermessage typecomment
1000getref [options] <bytes>\0\0\0\0 okthe ok message status, followed by the terminated getref command sting containing the number of bytes required to store the query string (including the terminal NULL bytes)
2  000 okthe ok message status
   301 errorthe error message status which terminates the session
   801 errorthe error message status which terminates the session
3000<query-string>\0\0\0\0 okthe ok message status, followed by a terminated string containing the query
4 404<data>\0\0\0\0okthe ok message status denoting a complete dataset, followed by a terminated string containing the dataset
  402<data>\0\0\0\0okthe ok message status denoting the last chunk of data (usually a "footer"), followed by a terminated string containing the data
  204, 234, 701, or 801errorthe error message status which terminates the session
5 000  okthe ok message status
6 402<data>\0\0\0\0okthe ok message status denoting the last chunk of data (usually a "footer"), see step 2
7 000<data>\0\0\0\0okthe ok message status, followed by a terminated string containing the command result summary
  702, or 801errorthe error message status which terminates the session
8 000  okthe ok message status, ending the dialog

getrefx

The internal API command getrefx is used by the refdbib tool to retrieve raw SGML and XML bibliographies.

stepclientservermessage typecomment
1000getrefx [options]\0\0\0\0 okthe ok message status, followed by the terminated getbib command string.
2  000 okthe ok message status
  204, 701, 801errorthe error message status, terminating the dialog
3000<bytes>\0\0\0\0 okthe ok message status, followed by a terminated string denoting the number of bytes that the client wants to transmit
  402  okthe message status saying that all data have been sent, ending the loop over all datasets
  404  okthe message status saying that the current dataset has been sent completely
  401  errorthe message status saying that there was a problem reading the input data, ending the session
4  000 okthe ok message status
   801 errorthe error message status, ending the session
5<data> okthe previously announced number of data bytes
6  403 okthe ok status for a successfully transmitted chunk of data
  400<message>\0\0\0\0errorthe error status, followed by a terminated, server-generated error message specifying the error
7 000  okthe ok message status
8  404 okthe ok status for a successfully transmitted chunk of data
   402 okthe ok status for the last chunk of data
   234, 801, 702 errorthe error message status
9 000  okthe ok message status
10 000<summary>\0\0\0\0okthe ok message status, followed by the terminated command summary string.
11 000  okthe ok message status, finishing the dialog

getstyle

The internal API command getstyle corresponds to refdba: getstyle.

stepclientservermessage typecomment
1000getstyle [options][regexp]\0\0\0\0 okthe ok message status, followed by the terminated getstyle command sting
2 000<data>\0\0\0\0okthe ok message status, followed by a terminated string containing the command result
  202, or 801errorthe error message status which terminates the session
3 000  okthe ok message status, ending the dialog

gettexbib

The internal API command gettexbib is used by the refdbib tool to retrieve bibtex bibliographies.

stepclientservermessage typecomment
1000gettexbib [options] data-size\0\0\0\0 okthe ok message status, followed by the terminated gettexbib command string. The only non-option argument is the size, in bytes, of the ID data to be sent, including the terminator.
2  000 okthe ok message status
   801 errorthe error message status, terminating the dialog
3000id-data\0\0\0\0 okthe ok message status, followed by the terminated ID list. This is a whitespace separated list of ID or CK values.
4 404<data>\0\0\0\0okthe ok message status denoting a complete dataset, followed by a terminated string containing the dataset
  402<data>\0\0\0\0okthe ok message status denoting the last chunk of data (usually a "footer"), followed by a terminated string containing the data
  204, 234, 269, 701, 801, or 842errorthe error message status which terminates the session
5 000  okthe ok message status
6 402<data>\0\0\0\0okthe ok message status denoting the last chunk of data (usually a "footer"), see step 4
7 000  okthe ok message status
8 000<data>\0\0\0\0okthe ok message status, followed by a terminated string containing the command result summary
  702, or 801errorthe error message status which terminates the session
9 000  okthe ok message status, ending the dialog

listdb

The internal API command listdb corresponds to refdbc: listdb.

stepclientservermessage typecomment
1000listdb [regexp]\0\0\0\0 okthe ok message status, followed by the terminated listdb/selectdb command sting
2 000<data>\0\0\0\0okthe ok message status, followed by a terminated string containing the command result
  202, 225, 226, 802, or 802errorthe error message status which terminates the session
3 000  okthe ok message status
4 000<data>\0\0\0\0okthe ok message status, followed by a terminated string containing the command result summary
5 000  okthe ok message status, ending the dialog

liststyle

The internal API command liststyle corresponds to refdbc: liststyle.

stepclientservermessage typecomment
1000liststyle [options][regexp]\0\0\0\0 okthe ok message status, followed by the terminated liststyle command sting
2 000<data>\0\0\0\0okthe ok message status, followed by a terminated string containing the command result
  202, or 801errorthe error message status which terminates the session
3 000  okthe ok message status
4 000<data>\0\0\0\0okthe ok message status, followed by a terminated string containing the command result summary
5 000  okthe ok message status, ending the dialog

listuser

The internal API command listuser corresponds to refdba: listuser.

stepclientservermessage typecomment
1000listuser [options] regexp\0\0\0\0 okthe ok message status, followed by the terminated listuser command sting
2 000<data>\0\0\0\0okthe ok message status, followed by a terminated string containing the command result
  204, 207, or 801errorthe error message status which terminates the session
3 000  okthe ok message status
4 000<data>\0\0\0\0okthe ok message status, followed by a terminated string containing the command result summary
5 000  okthe ok message status, ending the dialog

listword

The internal API command listword corresponds to refdba: listword.

stepclientservermessage typecomment
1000listword regexp\0\0\0\0 okthe ok message status, followed by the terminated listword command sting
2 000<data>\0\0\0\0okthe ok message status, followed by a terminated string containing the command result
  204, 207, or 801errorthe error message status which terminates the session
3 000  okthe ok message status
4 000<data>\0\0\0\0okthe ok message status, followed by a terminated string containing the command result summary
5 000  okthe ok message status, ending the dialog

pickref

The internal API command pickref handles the client commands refdbc: pickref and dumpref.

stepclientservermessage typecomment
1000pickref [options] <bytes>\0\0\0\0 okthe ok message status, followed by the terminated pickref command sting containing the number of bytes required to store the ID list.
2  000 okthe ok message status
   111 801 errorthe error message status which terminates the session
3000<ID-list>\0\0\0\0 okthe ok message status, followed by a terminated string containing a list of note IDs
4  000<data>\0\0\0\0 okthe ok message status, followed by a report about the pick or dump actions
  204, 412, 801errorthe message status saying that there was a problem, ending the session
5 000  okthe ok message status
6  000<summary>\0\0\0\0 okthe ok message status, followed by a command summary
  227, 228, 234errorthe error status, terminating the dialog
7 000  okthe ok message status, ending the dialog

scankw

The internal API command scankw corresponds to refdba: scankw.

stepclientservermessage typecomment
1000scankw -d <databasename>\0\0\0\0 okthe ok message status, followed by the terminated scankw command sting
2 000<data>\0\0\0\0okthe ok message status, followed by a terminated string containing the command result
  204, 208, or 801errorthe error message status which terminates the session
3 000  okthe ok message status
4 000<data>\0\0\0\0okthe ok message status, followed by a terminated string containing the command result summary
5 000  okthe ok message status, ending the dialog

selectdb

The internal API command selectdb corresponds to refdbc: selectdb.

stepclientservermessage typecomment
1000selectdb dbname\0\0\0\0 okthe ok message status, followed by the terminated listdb/selectdb command sting
2 000<data>\0\0\0\0okthe ok message status, followed by a terminated string containing the command result
  202, 225, 226, 802, or 802errorthe error message status which terminates the session
3 000  okthe ok message status
4 000<data>\0\0\0\0okthe ok message status, followed by a terminated string containing the command result summary
5 000  okthe ok message status, ending the dialog

viewstat

The internal API command viewstat corresponds to refdba: viewstat.

stepclientservermessage typecomment
1000viewstat [options]\0\0\0\0 okthe ok message status, followed by the terminated viewstat command sting
2 000<data>\0\0\0\0okthe ok message status, followed by a terminated string containing the command result
  204, 208, or 801errorthe error message status which terminates the session
3 000  okthe ok message status
4 000<data>\0\0\0\0okthe ok message status, followed by a terminated string containing the command result summary
5 000  okthe ok message status, ending the dialog

whichdb

The internal API command whichdb corresponds to refdbc: whichdb.

stepclientservermessage typecomment
1000whichdb\0\0\0\0 okthe ok message status, followed by the terminated whichdb command sting
2 000<data>\0\0\0\0okthe ok message status, followed by a terminated string containing the command result
  204, 207, or 801errorthe error message status which terminates the session
3 000  okthe ok message status
4 000<data>\0\0\0\0okthe ok message status, followed by a terminated string containing the command result summary
5 000  okthe ok message status, ending the dialog

Status messages

Note

The status codes which are multiples of 100 are not associated with a fixed message. Instead, clients should retrieve the terminated string sent after these codes to read the dynamically generated message.

000

ok

001

error

100

void

101

incorrect scramble string

102

client and server protocols do not match

103

invalid client request

104

incomplete client command

105

missing client command

106

missing client command option

107

unknown client command option

108

could not descramble password

109

timeout while reading

110

timeout while writing

111

missing client command argument

112

client aborted command

200

void

201

main database is missing

202

could not open main database

203

main database is too old or corrupt

204

could not open reference database

205

could not connect to database server

206

main database version is not supported

207

could not create result from database query

208

could not retrieve reference database metadata

209

could not create reference database

210

could not create reference database metadata

211

create t_meta failed

212

create t_refdb failed

213

create t_author failed

214

create t_keyword failed

215

create t_periodical failed

216

create t_note failed

217

create t_user failed

218

create t_xauthor failed

219

create t_xkeyword failed

220

create t_xuser failed

221

create t_xnote failed

222

could not create user group

223

could not grant user permissions

224

access control not supported

225

not a RefDB database

226

database does not exist

227

begin transaction failed

228

cannot lock tables

229

failed to remove keyword

230

failed to remove author

231

failed to remove periodical

232

failed to update main reference data

233

inserting reference data failed

234

select failed

235

database successfully created

236

assume localhost as host

237

grant user permissions successful

238

revoke user permissions successful

239

could not revoke user permissions

240

switched to database

241

failed to access style data

242

create temporary table failed

243

delete temporary table failed

244

incomplete reference data

245

failed to remove note xlink

246

failed to delete main note data

247

failed to remove user

248

failed to delete main reference data

249

failed to delete database

250

could not delete user group

251

database successfully deleted

252

personal interest list is empty

253

failed to detach dataset from user

254

sucessfully detached dataset from user

255

failed to attach dataset to user

256

sucessfully attached dataset to user

257

create t_link failed

258

create t_xlink failed

259

failed to remove ulink

260

failed to update journal names

261

failed to create citation key

262

failed to create personal list

263

successfully created personal list

264

failed to delete personal list

265

successfully deleted personal list

266

personal list not owned by current user

267

personal list does not exist

268

create t_temp_xdup failed

269

style not found

300

void

301

missing argument

302

unknown output format

400

void

401

no more data available

402

finished transferring data

403

chunk added successfully

404

finished transferring dataset

405

finished adding dataset

406

citation key

407

refused to overwrite dataset

408

dataset added successfully

409

numerical id ignored

410

numerical id nonexistent

411

citation key nonexistent

412

ID and citation key missing

413

dataset updated successfully

414

failed to add dataset

415

missing link target

416

incorrect link type

417

dataset not found

418

link already exists

419

dataset removed successfully

420

failed to remove dataset

421

link added successfully

422

only owner can fiddle with dataset

423

dataset is still in use

424

dataset is already attached to user

425

periodical name changed successfully

426

reference type changed

700

void

701

failed to initialize character set conversion

702

character set conversion failed

703

remote administration disabled

704

administration is not restricted

705

administration not permitted

706

administration permitted

707

process ID

708

application server stop submitted

709

set server IP submitted

710

set timeout submitted

711

set logfile submitted

712

set logdest submitted

713

set loglevel submitted

800

void

801

out of memory

802

failed to load cgi templates

803

command partially processed, aborted after unrecoverable error

804

suffix pool exhausted

805

REFNUMBER formatting failed

806

AUTHORLIST formatting failed

807

EDITORLIST formatting failed

808

SEDITORLIST formatting failed

809

PUBDATE formatting failed

810

PUBDATESEC formatting failed

811

TITLE formatting failed

812

BOOKTITLE formatting failed

813

SERIESTITLE formatting failed

814

JOURNALNAME formatting failed

815

VOLUME formatting failed

816

ISSUE formatting failed

817

PAGES formatting failed

818

PUBLISHER formatting failed

819

PUBPLACE formatting failed

820

SERIAL formatting failed

821

ADDRESS formatting failed

822

URL formatting failed

823

USERDEF1 formatting failed

824

USERDEF2 formatting failed

825

USERDEF3 formatting failed

826

USERDEF4 formatting failed

827

USERDEF5 formatting failed

828

MISC1 formatting failed

829

MISC2 formatting failed

830

MISC3 formatting failed

831

LINK1 formatting failed

832

LINK2 formatting failed

833

LINK3 formatting failed

834

LINK4 formatting failed

835

ABSTRACT formatting failed

836

NOTES formatting failed

837

SEPARATOR formatting failed

838

remote administration failed

839

child->parent communication failure

840

FIFO write error

841

unknown command

842

failed to load style

999

summary

refdb-1.0.2/doc/refdb-manual/ch23s04.html000644 001750 001750 00000004030 12255431245 020520 0ustar00markusmarkus000000 000000 Tools for the client-server protocol

Tools for the client-server protocol

refdb-1.0.2/doc/refdb-manual/co01.html000644 001750 001750 00000005727 12255431245 020212 0ustar00markusmarkus000000 000000 Colophon

Colophon

This document was written with GNU Emacs on FreeBSD. The XML sources use the DocBook XML DTD version 4.2. The images were created with Inkscape. The SVG files were then transformed to PNG and PDF using the Java application batik-rasterizer.

The document was transformed to the PDF and HTML output formats using xsltproc, FOP, and the DocBook XSL stylesheets through customization layers which are part of the documentation sources. The HTML output is further enhanced by a CSS file.

refdb-1.0.2/doc/refdb-manual/index.html000644 001750 001750 00000146122 12255431245 020552 0ustar00markusmarkus000000 000000 RefDB handbook

RefDB handbook

covers version 0.9.9

Markus Hoenicka


          
        

Revision History
Revision 1.232007-11-03
Revision 1.222006-12-06
Revision 1.212006-05-27
Revision 1.202005-11-14
Revision 1.192004-12-12
Revision 1.182004-02-18
Revision 1.172003-12-20
Revision 1.162003-08-15
Revision 1.152003-02-16
Revision 1.142002-11-29
Revision 1.132002-11-11
Revision 1.122002-9-1
Revision 1.112002-7-23
Revision 1.102002-5-13
Revision 1.92002-3-2
Revision 1.82002-1-1
Revision 1.72001-11-22
Revision 1.62001-10-1
Revision 1.52001-8-9
Revision 1.42001-8-5
Revision 1.32001-7-21
Revision 1.22001-6-25
Revision 1.12001-6-18
Revision 1.02001-5-22

Table of Contents

Preface
RefDB in a nutshell
Organization of this manual
Further information
I. Overview
1. Introduction
What is RefDB?
Who should use RefDB?
General features
Interfaces
Reference management features
Bibliography tool features
SGML and XML
LaTeX
Credits
2. System requirements
Operating system
Libraries necessary to build and run refdb
System libraries
Other libraries
Perl modules
External applications
Related Software
3. Current limitations and platform issues
Limitations
Platform issues
II. Administrator manual
4. Installation
Quickstart guide
Upgrading from an older version
0.9.9
0.9.8
0.9.7
Things to know before you start
Which database server?
Where do the components go?
The mystery of the configuration files
Environment variables
Some notes on the filesystem
Installation on Linux and other Unix variants
Generic instructions
OS-specific hints
Installation on Windows NT/2000/XP
Prerequisites
Installation from the sources
Installation of prebuilt binaries
Installation on Windows 95/98/ME
Other operating systems
Finishing the RefDB installation
Using the interactive setup script
Manual setup
Testing your installation
SRU support
Setting up SRU support as a CGI program
Setting up SRU support using a standalone web server
Install the PHP interface
Prerequisites
Web server configuration
Test your PHP interface
5. refdbd administration
Create a database
Delete a database
Add or remove a user
Add users
Remove users
Configure the application server
Configuration at startup
Reconfiguring a running refdbd process
Add, edit, or delete bibliography styles
Logging data
What to log
Destinations
Log levels
Interpreting the log information
Security issues
Passwords
Database server access control
How to run several refdb instances
Backup your data
Creating a risx dump
Creating a SQL dump
III. User manual
6. Overview of the RefDB command-line clients
Quickstart guide
The interactive mode of refdba and refdbc
The non-interactive mode of refdba and refdbc
The non-interactive mode of refdbib
Common command-line options for all clients
7. Data input
Writing RIS datasets
Overview
Character encodings
RIS tags
Examples
The Emacs helpers
Input filters
Writing risx datasets
Writing extended notes
Input data mangling
Information that RefDB generates for you
Information that RefDB mangles
8. Reference management
Add references
RIS datasets
risx datasets
Find and view references
Delete references
Edit references
Print references
Managing personal reference lists
Creating and deleting personal reference lists
Accessing references in personal reference lists
Advanced use of personal reference lists
Global edit references
Create periodical synonyms
Character encoding issues
Character encodings of databases
Character encodings of imported data
Character encodings of exported data
Use pdfroot
Interaction with external applications
Editor
Viewer
9. Notes management
Add extended notes
Find and view extended notes
Delete extended notes
Edit extended notes
Link existing notes to other objects in the database
To share or not to share extended notes
The refdbd default
The share attribute of the extended notes
Data privacy
10. Bibliographies
Quickstart guide
Manage bibliography styles
Write or modify a bibliography style file
Create SGML and XML bibliographies
Keeping it simple with refdbnd
Bibliographies, the hard way
How to use custom stylesheets
Create LaTeX/BibTeX bibliographies
Create RTF bibliographies
Create a RTF document for use with RefDB
Create citations in word processor documents
Process RTF documents
Using custom stylesheets to process documents with bibliographies
11. RefDB SRU interface
What SRU is all about
SRU Operations
The explain operation
The searchRetrieve operation
The scan operation
IV. Reference manual
12. The application server
refdbctl
Description
Options
Files
See also
Author
refdbd
Description
Options
Configuration
Files
See also
Author
refdb
Description
Options
See also
Author
refdbsru
Description
Configuration
Environment
Files
See also
Author
refdb-sruserver
Description
Configuration
Files
See also
Author
13. Administration tools
refdba
Description
Options
Diagnostics
Configuration
Commands
addstyle
adduser
addword
confserv
createdb
deletedb
deletestyle
deleteuser
deleteword
getstyle
help
listdb
liststyle
listuser
listword
scankw
set
verbose
viewstat
Files
See also
Author
refdb-backup
Description
Options
See also
Author
refdb-restore
Description
Options
See also
Author
refdb-init
Description
Files
See also
Author
refdb-bug
Description
See also
Author
14. Tools for reference and notes management
Tools
refdbc
Description
Options
Diagnostics
Configuration
Commands
addlink
addnote
addref
checkref
deletelink
deletenote
deleteref
dumpref
getau, geted, getas, getax
getjo, getjf, getj1, getj2
getkw
getnote
getref
help, ?
listdb
liststyle
pickref
countnote
countref
selectdb
set
updatejo
updatenote
updateref
verbose
whichdb
Files
See also
Author
bib2ris
Description
Options
Diagnostics
Configuration
Data Processing
Files
See also
Author
db2ris
Description
Options
Configuration
Data Processing
Modifying db2ris
Files
See also
Author
en2ris
Description
Options
Configuration
Data Processing
Files
See also
Author
marc2ris
Description
Options
Configuration
Data Processing
Files
See also
Author
med2ris
Description
Options
Configuration
Data Processing
Files
See also
Author
refdb-pubmed
Description
Options
See also
Author
refdb_dos2unix
Description
See also
Author
refdb_latex2utf8txt
Description
Diagnostics
Data Processing
See also
Author
Reference data output formats
scrn
html
xhtml
ris
risx
mods
bibtex
db31
db31x
db50x
teix
tei5x
Extended notes output formats
scrn
html
xhtml
xnote
The query language
The reference query language
The notes query language
Some example queries
Regular expressions
Unix-style regular expressions
SQL regular expressions
15. Tools for bibliographies
refdbib
Description
Options
Diagnostics
Configuration
Examples
Files
See also
Author
refdbnd
Description
Options
Makefile Targets
Files
See also
Author
runbib
Description
Options
Configuration
SGML Output
XML Output
Bibtex Output
RTF Output
Example
Files
See also
Author
runbib-missing
Description
Options
Configuration
Example
See also
Author
refdbjade
Description
Options
Configuration
Environment
Example
See also
Author
refdbxml
Description
Options
Configuration
Resolving Public Identifiers
Files
Example
See also
Author
refdbrtf
Description
Options
Example
See also
Author
refdbxp
Description
Options
Example
See also
Author
refdb-ms
Description
Files
See also
Author
rtfcitations
Description
Options
Example
See also
Author
V. Programmer's manual
16. Reference database design
The table t_meta
The table t_refdb
The table t_author
The table t_keyword
The table t_periodical
The table t_note
The table t_user
The table t_link
The table t_xauthor
The table t_xkeyword
The table t_xuser
The table t_xnote
The table t_xlink
17. The RefDB database design
The table t_journal_words
The table CITSTYLE
The table REFSTYLE
The table SEPARATORS
The table POSITION
18. RIS and risx format specifications
The RefDB RIS implementation
The risx DTD
19. Using RefDB in your programs
General thoughts
Interfaces
Call the C clients from your program
Directly talk to refdbd
Tips and tricks
Paging output
20. The Perl client module
Installation
Classes and their functions
RefDBClient::Risdata
RefDBClient::Simplelist
RefDBClient::Enigma
RefDBClient::Client
21. Using the backend API to implement new output formats
The backend API
How to insert a new backend into RefDB
22. The RefDB SGML/XML input and output formats
The XML input format for bibliographies
The XML input format for bibliographic styles
The XML input format for extended notes
Processing expectations for the RefDB DocBook bibliography output
23. The RefDB client/server communication protocol
Prerequisites
Basic principles
Message format
First stage
Second stage
Commented abstract representation of the client/server protocol
First stage
Second stage
Status messages
Tools for the client-server protocol
eenc
Description
Options
See also
Author
refdb-1.0.2/doc/refdb-manual/manual.css000644 001750 001750 00000002647 12255431171 020545 0ustar00markusmarkus000000 000000 h1 {font-family: Verdana, Arial, Helvetica, sans-serif; color: #00B000} h1.sect1 {font-family: Verdana, Arial, Helvetica, sans-serif; color: #009900} h2 {font-family: Verdana, Arial, Helvetica, sans-serif; color: green} h3 {font-family: Verdana, Arial, Helvetica, sans-serif; color: #006600} code.filename, code.option {color: #660099; font-size: 110%; font-weight: bold;} code.sgmltag, code.envar {color: #009966; font-size: 110%; font-weight: bold;} b.command {color: #990000;} div.variablelist dt {color: #990000; font-weight: bold;} table th {color: #990000; font-weight: bold;} div.warning, div.warning h3.title {color: red;} pre.screen, pre.programlisting { background-color: #E0E0E0; } span.guimenu, span.guimenuitem, span.guisubmenu { font-family: sans-serif; } /* give keycaps a '3D' shaded look */ strong.keycap, b.KEYCAP { padding-left: .2em; padding-right: .2em; border-style: solid; border-top-width: 2px; border-left-width: 3px; border-right-width: 3px; border-bottom-width: 4px; border-top-color: #eeeecc; border-left-color: #eeeecc; border-right-color: #999977; border-bottom-color: #999977; background-color: #ddddbb; /* All these borders may interfere with text on the line bellow. Make the text a little smaller to try and 'pull up' the bottom edge, */ font-size: smaller; } refdb-1.0.2/doc/refdb-manual/pr01.html000644 001750 001750 00000006032 12255431175 020222 0ustar00markusmarkus000000 000000 Preface

Preface

RefDB in a nutshell

RefDB is a free and portable reference and notes database toolkit as well as a bibliography application that serves a similar purpose for SGML, XML, and LaTeX documents like Reference Manager or EndNote do for word processor documents. The bibliography part is something like bibtex for markup languages. RefDB consists of an application server which interacts with a relational database on the server side and a variety of clients on the workstation side. There is a choice of command line clients, web interfaces, editor interfaces, and language bindings that allow you to work with your reference data any way you want.

refdb-1.0.2/doc/refdb-manual/pr01s02.html000644 001750 001750 00000006067 12255431175 020557 0ustar00markusmarkus000000 000000 Organization of this manual

Organization of this manual

Part 1 provides a general overview.

Part 2 of this manual explains the installation of the components and the administration of RefDB. These tasks should be performed by a system administrator, as you'll need certain privileges that a regular user should not have.

Part 3 explains the general use of RefDB for the regular user. This is the place to look if you just need to add or retrieve references or if you want to generate bibliographies.

Part 4 contains all the nasty details of the applications that RefDB ships with: All these confusing command-line switches, interactive commands, and configuration file variables that your brain refuses to memorize.

Part 5 is meant for programmers who want to modify or extend the behaviour of RefDB. You'll find a few internals which are of no interest for the regular user but might be of interest for casual hackers or notorious code fiddlers.

refdb-1.0.2/doc/refdb-manual/pr01s03.html000644 001750 001750 00000010212 12255431175 020543 0ustar00markusmarkus000000 000000 Further information

Further information

This document is complemented by the RefDB tutorial which explains the tasks a regular user will face in plain English.

Please visit the RefDB homepage for additional information and new versions.

The refdb-users mailing list is intended to discuss the use of the RefDB package. This covers all topics from installation to running queries. Visit the refdb-users list page to subscribe and to browse the list archives.

The refdb-devel mailing list is intended to discuss the development of RefDB. Use this list to send patches and discuss the further development of this project. Visit the refdb-devel list page to subscribe and to browse the list archives.

The refdb-cvs mailing list receives (in spite of its name) the subversion checkin messages. Subscribe to this read-only list to be informed about the ongoing development of this project. Visit the refdb-cvs list page to subscribe and for further information.

Please send general bug reports to the users list (it might be a configuration or usage problem, and would thus be of interest to other users). However, if you have investigated the source code and either have a good idea what might cause the bug or even have a patch, please send the report to the devel list. In both cases you may wish to include the output of the refdb-bug script. This will create a file refdb-bug.txt in the present working directory which contains all sorts of information about your RefDB setup.

RefDB is maintained by Markus Hoenicka.

refdb-1.0.2/doc/refdb-manual/pt01.html000644 001750 001750 00000007233 12255431176 020231 0ustar00markusmarkus000000 000000 Part I. Overviewrefdb-1.0.2/doc/refdb-manual/pt02.html000644 001750 001750 00000016252 12255431201 020220 0ustar00markusmarkus000000 000000 Part II. Administrator manualrefdb-1.0.2/doc/refdb-manual/pt03.html000644 001750 001750 00000021630 12255431206 020222 0ustar00markusmarkus000000 000000 Part III. User manual

Part III. User manual

Table of Contents

6. Overview of the RefDB command-line clients
Quickstart guide
The interactive mode of refdba and refdbc
The non-interactive mode of refdba and refdbc
The non-interactive mode of refdbib
Common command-line options for all clients
7. Data input
Writing RIS datasets
Overview
Character encodings
RIS tags
Examples
The Emacs helpers
Input filters
Writing risx datasets
Writing extended notes
Input data mangling
Information that RefDB generates for you
Information that RefDB mangles
8. Reference management
Add references
RIS datasets
risx datasets
Find and view references
Delete references
Edit references
Print references
Managing personal reference lists
Creating and deleting personal reference lists
Accessing references in personal reference lists
Advanced use of personal reference lists
Global edit references
Create periodical synonyms
Character encoding issues
Character encodings of databases
Character encodings of imported data
Character encodings of exported data
Use pdfroot
Interaction with external applications
Editor
Viewer
9. Notes management
Add extended notes
Find and view extended notes
Delete extended notes
Edit extended notes
Link existing notes to other objects in the database
To share or not to share extended notes
The refdbd default
The share attribute of the extended notes
Data privacy
10. Bibliographies
Quickstart guide
Manage bibliography styles
Write or modify a bibliography style file
Create SGML and XML bibliographies
Keeping it simple with refdbnd
Bibliographies, the hard way
How to use custom stylesheets
Create LaTeX/BibTeX bibliographies
Create RTF bibliographies
Create a RTF document for use with RefDB
Create citations in word processor documents
Process RTF documents
Using custom stylesheets to process documents with bibliographies
11. RefDB SRU interface
What SRU is all about
SRU Operations
The explain operation
The searchRetrieve operation
The scan operation
refdb-1.0.2/doc/refdb-manual/pt04.html000644 001750 001750 00000064702 12255431224 020232 0ustar00markusmarkus000000 000000 Part IV. Reference manual

Part IV. Reference manual

Table of Contents

12. The application server
refdbctl
Description
Options
Files
See also
Author
refdbd
Description
Options
Configuration
Files
See also
Author
refdb
Description
Options
See also
Author
refdbsru
Description
Configuration
Environment
Files
See also
Author
refdb-sruserver
Description
Configuration
Files
See also
Author
13. Administration tools
refdba
Description
Options
Diagnostics
Configuration
Commands
addstyle
adduser
addword
confserv
createdb
deletedb
deletestyle
deleteuser
deleteword
getstyle
help
listdb
liststyle
listuser
listword
scankw
set
verbose
viewstat
Files
See also
Author
refdb-backup
Description
Options
See also
Author
refdb-restore
Description
Options
See also
Author
refdb-init
Description
Files
See also
Author
refdb-bug
Description
See also
Author
14. Tools for reference and notes management
Tools
refdbc
Description
Options
Diagnostics
Configuration
Commands
addlink
addnote
addref
checkref
deletelink
deletenote
deleteref
dumpref
getau, geted, getas, getax
getjo, getjf, getj1, getj2
getkw
getnote
getref
help, ?
listdb
liststyle
pickref
countnote
countref
selectdb
set
updatejo
updatenote
updateref
verbose
whichdb
Files
See also
Author
bib2ris
Description
Options
Diagnostics
Configuration
Data Processing
Files
See also
Author
db2ris
Description
Options
Configuration
Data Processing
Modifying db2ris
Files
See also
Author
en2ris
Description
Options
Configuration
Data Processing
Files
See also
Author
marc2ris
Description
Options
Configuration
Data Processing
Files
See also
Author
med2ris
Description
Options
Configuration
Data Processing
Files
See also
Author
refdb-pubmed
Description
Options
See also
Author
refdb_dos2unix
Description
See also
Author
refdb_latex2utf8txt
Description
Diagnostics
Data Processing
See also
Author
Reference data output formats
scrn
html
xhtml
ris
risx
mods
bibtex
db31
db31x
db50x
teix
tei5x
Extended notes output formats
scrn
html
xhtml
xnote
The query language
The reference query language
The notes query language
Some example queries
Regular expressions
Unix-style regular expressions
SQL regular expressions
15. Tools for bibliographies
refdbib
Description
Options
Diagnostics
Configuration
Examples
Files
See also
Author
refdbnd
Description
Options
Makefile Targets
Files
See also
Author
runbib
Description
Options
Configuration
SGML Output
XML Output
Bibtex Output
RTF Output
Example
Files
See also
Author
runbib-missing
Description
Options
Configuration
Example
See also
Author
refdbjade
Description
Options
Configuration
Environment
Example
See also
Author
refdbxml
Description
Options
Configuration
Resolving Public Identifiers
Files
Example
See also
Author
refdbrtf
Description
Options
Example
See also
Author
refdbxp
Description
Options
Example
See also
Author
refdb-ms
Description
Files
See also
Author
rtfcitations
Description
Options
Example
See also
Author
refdb-1.0.2/doc/refdb-manual/pt05.html000644 001750 001750 00000017053 12255431245 020233 0ustar00markusmarkus000000 000000 Part V. Programmer's manualrefdb-1.0.2/doc/refdb-manual/re01.html000644 001750 001750 00000011114 12255431210 020172 0ustar00markusmarkus000000 000000 refdbctl

Name

refdbctl — refdbd startup script

Synopsis

refdbctl start | stop | restart | reload

Description

refdbctl is a wrapper script to be used as a manual control script for the refdbd(1) daemon. It is also used by the refdb(8) startup script. The script takes care of avoiding multiple copies of the daemon and allows you to stop the daemon without knowing its process ID.

Options

start

Starts the refdbd(1) daemon unless it is already running

stop

Stops the refdbd(1) daemon

restart

Restarts the refdbd(1) daemon if it is already running. The existing process is stopped, and a new process is started.

reload

Asks the refdbd(1) daemon to reload its configuration file. Use this command to let changes to your configuration file take effect without stopping the process.

Files

/var/run/refdbd.pid

The run file containing the process ID of the running refdbd process.

See also

RefDB (7), refdbd (1).

RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html

RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html>

RefDB on the web <http://refdb.sourceforge.net/>

Author

refdbctl was written by Markus Hoenicka <markus@mhoenicka.de>.

refdb-1.0.2/doc/refdb-manual/re02.html000644 001750 001750 00000057001 12255431211 020201 0ustar00markusmarkus000000 000000 refdbd

Name

refdbd — the application server of RefDB

Synopsis

refdbd [-b dbs-port] [-d default-database] [-D dbserver] [-e log-destination] [-E encoding] [-h ] [-i IP-address] [-I ] [-k ] [-K ] [-l log-level] [-L log-file] [-p port] [-P PID-file] [-q ] [-r ] [-s ] [-S note-share-mode] [-T time] [-U ] [-v ] [-V ] [-x ] [-y confdir] [-Y libdbidir]

refdbd {[-a] | [-c]} [-b dbs-port] [-D dbserver] [-e log-destination] [-E encoding] [-h ] [-i IP-address] [-l log-level] [-L log-file] [-p port] [-P PID-file] [-q ] [-u username] [-v ] [-V ] [-w password] [-x ] [-y confdir] [-Y libdbidir]

Description

refdbd is the application server of RefDB(7). refdbd contains most of the application logic of RefDB and interacts with the database engine. refdbd must run somewhere in your network to do anything useful with the RefDB clients. refdbd usually runs as a daemon and responds to client requests, but it can be started as a regular process for debugging purposes. To start refdbd as a server, use the first command synopsis shown above.

It is recommended to use a wrapper script to start and stop refdbd. If you want to start and stop refdbd manually, use refdbctl(1). If you want to run refdbd as a daemon, use refdb(8). Edit the configuration file (see below) to permanently configure refdbd.

In addition to being run as a server, refdbd can also be invoked to check, install, or upgrade the main database. Refer to the second command synopsis shown above.

Options

-a

Runs refdbd to install or upgrade the main database. refdbd will exit after performing the maintenance tasks. In order to perform the maintenance tasks you have to provide a database administrator username and password using the -u and -w options, respectively, if your database engine uses access control. Some database configurations (e.g. PostgreSQL on Debian) further require you to run the administrative tasks from a special privileged user account (often called pgsql or postgres). If you use one of the file-based engines (SQLite or SQLite3), you must run the tool from an account which has write permissions in the database folder. refdbd first checks whether a main database already exists. If not, it will attempt to install it. Otherwise, it will upgrade the database to the current version if required. refdbd will print an error message to stderr if the maintenance job fails, and exit with a non-zero exit code.

-b dbs-port

Set the port on which the database server listens for incoming connections. The default is 3306 for MySQL and 5432 for PostgreSQL. This option does not apply if you use SQLite as your database engine.

-c

Runs refdbd to check the main database version and the database engine connection. refdbd will exit after performing the maintenance tasks. In order to perform the maintenance tasks you have to provide a database administrator username and password using the -u and -w options, respectively, if your database engine uses access control. If you use one of the file-based engines (SQLite or SQLite3), you must run the tool from an account which has read permissions for the main database file. refdbd will print an error message to stderr if the check fails, and exit with a non-zero exit code.

-d default-database

Set a default database to be used for all client queries that do not specify a database.

-D dbserver

Select the database server. Currently the values mysql, pgsql, and sqlite are supported to select MySQL, PostgreSQL, and SQLite, respectively.

-e log-destination

This specifies the destination of the log information. If destination is 0 or "stderr", the log output is sent to stderr. This should only be used for debugging purposes when refdbd is not run as a daemon. If destination is 1 or "syslog", the syslog facility of the system is used. syslog has to be configured properly to accept refdb's log output. Consult the syslogd(8) man page how to achieve this. If destination is 2 or "file", a custom log file as defined by the -L switch is used instead. If this log file cannot be written to, refdbd falls back to using syslog.

-E encoding

Select the default character encoding for new reference databases. Specify the IANA name of the encoding. You can override this default by using the -E option of the createdb command.

-h

Displays help and usage screen, then exits.

-i IP-address

For external database servers, set the IP address of the box which is running the database server. Instead of the IP address you can also specify the hostname as long as it can be properly resolved by your system. If the database server runs on the same box as refdbd, use the string localhost. Note: If localhost does not seem to work, try specifying the real IP address of the box instead - some database client libraries refuse to use TCP/IP for local connections which may cause mayhem on particular systems. For embedded database engines, this option sets the directory which contains the database files. The default is /usr/local/share/refdb/db. Note: SQLite on Cygwin has a bug which prevents the use of absolute paths. Use a relative path instead by leaving out the leading slash. This assumes that refdbd is started from the root directory. The start script refdbctl does this automatically.

-I

Set this switch to allow remote connections to refdbd. Otherwise only connections from localhost (127.0.0.1) will be answered.

-k

refdb stores up to four names (full name, official abbreviation, and two user-defined abbreviations) of each periodical. These synonyms are shared by all references that use one of these periodical names. As it sometimes requires some effort to get at the synonyms (public reference data often contains only the official abbreviation), it is desirable to keep these synonyms even if you remove the last reference that uses a particular periodical name. If you use the -k option, the synonyms will not be removed from the database and will be available immediately if you add a new reference using that particular periodical name.

-K

If this option is used, refdbd will run an automatic keyword scan each time you add or update references. refdbd will scan the title fields and the abstract field of the modified references for any keywords already present in the database but not in the particular reference. This increases the usability of keywords in queries. There is no speed decrease for the user interaction as the keyword scan is performed in the background. See also the related refdba command scankw which performs a more thorough manual keyword scan.

-l log-level

Set the log level to a value between 0 and 7 or to a string value as described in log level definitions. 0 means that only critical log messages will be logged, while a value of 7 means that every log message will be logged. Set level to -1 to disable logging.

-L log-file

This switch specifies a custom log file (full path please). This will only be used if the -e switch is set accordingly.

-p port

Set the port on which refdbd listens for incoming connections. The default is 9734.

-P PID-file

Specify the full path of the file that refdbd writes its process ID to. This PID simplifies stopping and reconfiguring the application server from the command line. The default value is /var/log/refdbd.pid.

-q

Start without reading the configuration file. Useful for debugging purposes

-r

Enables remote administration via refdba.

-s

Starts as a standalone application, not as daemon.

-S note-share-mode

Set the default extended note share mode to either public or private. This setting affects the accessibility of extended notes if they do not explicitly carry a share attribute. See the section about notes sharing for more information.

-T time

Set the timeout for client/application server dialogue in seconds.

-u name

Set the username of the database administrator account.

-U

This switch causes refdbd to automatically uppercase all citation keys of newly added references. This makes it more convenient to work with SGML bibliographies.

-v

Prints version and copyright information, then exits.

-V

Switches to verbose mode. To be honest, currently this doesn't make much of a difference.

-w password

The password of the database administrator account. You can pass an asterisk to let refdbd ask for a password interactively. This keeps your password from showing up in the process list. Keep in mind that you have to protect the asterisk on the command line by surrounding it with single quotes.

-x

Assume incoming passwords are unencrypted.

-y confdir

Specify the directory where the global configuration files are Note: By default, all RefDB applications look for their configuration files in a directory that is specified during the configure step when building the package. That is, you don't need the -y option unless you use precompiled binaries in unusual locations, e.g. by relocating a rpm package.

-Y libdbidir

Specify the directory where the libdbi drivers are Note: By default, libdbi (the database abstraction library used by refdbd) looks for its driver files in a directory that is specified during the configure step when building the package. That is, you don't need the -Y option unless you use precompiled libdbi binaries in unusual locations, e.g. by relocating a rpm package.

Configuration

Table 12.1. refdbdrc

VariableDefaultComment
refdblib /usr/local/share/refdb The path of the directory containing shareable refdb files like DTDs, HTML templates etc. Actually, most of the files are in subdirectories of refdblib.
dbsport3306The port on which the database server listens. Use either 3306 or 5432 for MySQL and PostgreSQL, respectively. This variable is ignored if you use SQLite as your database engine.
dbserversqliteThe database server you want to connect to. Use one of mysql, pgsql, or sqlite to select MySQL, PostgreSQL, or SQLite as your database engine, respectively.
dbpath/usr/local/var/lib/refdb/dbThe directory that contains the database files of an embedded database engine. Leave out the leading slash if you use SQLite on Cygwin.
logdest2The destination of the log information. 0 = print to stderr (for debugging only, don't use when running as a daemon); 1 = use the syslog facility; 2 = use a custom logfile. The latter needs a proper setting of logfile.
logfile/var/log/refdbd.logThe full path of a custom log file. This is used only if logdest is set appropriately. If you start refdbd from the command line as a regular user, you should specify a file that you have write access to (you may not be allowed to create /var/log/refdbd.log or write to this file as a regular user).
loglevel6The log level up to which messages will be sent. A low setting (0) will notify you only in case of a meltdown, whereas a high setting (7) allows all messages including debug messages (this is a lot). -1 means nothing will be logged.
pidfile/var/log/refdb.pidThe file refdbd writes its process ID to. If you start refdbd from the command line as a regular user, you should specify a file that you have write access to (you may not be allowed to create /var/log/refdbd.pid or write to this file as a regular user).
port9734The port on which refdbd listens. The server and all clients that are supposed to connect to it must agree on the same port. Obviously, this option allows to run several instances of refdbd on the same box if there is a good reason to do so. In this case you should also use separate log and pid files.
remoteadminfSet this to 't' to allow remote administration via refdba. Be aware that this is a security risk.
serveriplocalhostThe IP address or hostname of the machine where the database server runs. Use the default (localhost) address if the database server and refdbd run on the same machine.
timeout180The timeout in seconds. After this time has elapsed, a stalled connection is taken down. Increase this value if you encounter frequent timeout errors due to high network traffic.
keep_pnamestSet this to 't' to keep periodical names and synonyms if you remove references. If set to 'f', the names will be removed from the database if the last reference using these names is deleted.
db_encoding(none)Specify the default character encoding for new refdb reference databases. If the database server supports this feature (currently only PostgreSQL does), all new databases will use this encoding unless a different one is specified with the createdb command.
in_encodingISO-8859-1Specify the default character encoding for RIS data being added to databases.
dbi_driverdir(none)Specify the directory containing the libdbi driver files. As mentioned above, this is only necessary if you use precompiled libdbi binaries in funny locations.
keyword_scantSet this to 't' to allow an automatic keyword scan after references are added or updated. 'f' will switch off this feature.
upper_citekeyfSet this to 't' to uppercase all citation keys of newly added references (this makes sure they work with SGML bibliographies).
share_defaultpublicWhether ("public") or not ("private") to share extended notes between users by default. See the section about notes sharing for more information.
remoteconnectfSet this to 't' to allow remote connections to refdbd. By default, refdbd accepts only local connections due to security concerns.
no_decryptfIf set to 't', incoming passwords are assumed to be unencrypted. The default is to expect encrypted passwords.

Files

PREFIX/etc/refdb/refdbdrc

The global configuration file of refdbd.

See also

RefDB (7), refdb (8), refdbctl (1), refdba (1), refdbc (1).

RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html

RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html>

RefDB on the web <http://refdb.sourceforge.net/>

Author

refdbd was written by Markus Hoenicka <markus@mhoenicka.de>.

refdb-1.0.2/doc/refdb-manual/re03.html000644 001750 001750 00000010274 12255431211 020203 0ustar00markusmarkus000000 000000 refdb

Name

refdb, refdb.sh — refdbd startup script

Synopsis

refdb start | stop | restart | force-reload

Description

refdb is a wrapper script for refdbd(1) to be used as a rc(8) or init(8) control script. The script is called refdb.sh on BSD-style systems. See the documentation of your system how to integrate refdb into the start process to run refdbd(1) automatically as a daemon.

Options

start

Starts the refdbd(1) daemon

stop

Stops the refdbd(1) daemon

restart

Restarts the refdbd(1) daemon

force-reload

Causes the refdbd(1) daemon to read its configuration file

See also

RefDB (7), refdbd (1) refdbctl (1).

RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html

RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html>

RefDB on the web <http://refdb.sourceforge.net/>

Author

refdb was written by Markus Hoenicka <markus@mhoenicka.de>.

refdb-1.0.2/doc/refdb-manual/re04.html000644 001750 001750 00000022510 12255431211 020200 0ustar00markusmarkus000000 000000 refdbsru

Name

refdbsru — CGI script providing SRU access to RefDB databases

Synopsis

refdbsru

Description

refdbsru is a CGI script which turns your web server into a proxy RefDB server providing SRU (Search and Retrieve via URL) access. Anyone with a web browser or some other tool capable of sending HTTP requests can query your RefDB databases. This script is not intended to be run by users. It is invoked by your web server.

The output of the script is a XML document as described in the SRU standard.

Configuration

refdbsru evaluates the file refdbsrurc to initialize itself.

Note

The parameters starting with "zeerex_" do not actually influence how the script operates. They provide some of the site-specific information which appears in the SRU explain output.

Table 12.2. refdbsrurc

VariableDefaultComment
logfile/var/log/refdbsru.logThe full path of a custom log file. This is used only if logdest is set appropriately.
logdest1The destination of the log information. 0 = print to stderr; 1 = use the syslog facility; 2 = use a custom logfile. The latter needs a proper setting of logfile.
loglevel6The log level up to which messages will be sent. A low setting (0) allows only the most important messages, a high setting (7) allows all messages including debug messages. -1 means nothing will be logged.
serverip127.0.0.1The IP address or hostname of the machine where refdbd runs. Use the default (localhost) address if the clients and refdbs run on the same machine.
port9734The port on which refdbd listens. Change this for all clients and the server if this value interferes with another program using this port.
timeout180The timeout in seconds. After this time has elapsed, a stalled connection is taken down. Increase this value if you encounter frequent timeout errors due to high network traffic or refdbd overload.
usernamelogin nameThe username which is used for authentication with the database server.
passwd The password which is used for authentication with the database server.
pdfroot(none)This value will be used as the root of the paths to PDF or Postscript offprints that can be specified with the AV field in a RIS dataset. The path should not rely on shell expansion, e.g. use /home/me/literature/ instead of ~/literature/. The pdfroot allows you to shorten the paths that you enter for each dataset and to maintain a certain portability if you have to move the offprints to a different directory or want to access them remotely. The html output routine will concatenate the relative path of each dataset with the pdfroot to construct the link to the offprint. Instead of a local path name you can specify an URL starting with http:// or ftp:// if your offprints are accessible through a web server or ftp server.
cssurl(none)In spite of the parameter name, this may be the URL either of a Cascading Style Sheet (CSS) file, or of a XSLT file. This file, if specified, is used to format the SRU output in the web browser.
dbserver(none)This is the name of the database engine that refdbd uses (currently either mysql, pgsql, sqlite, or sqlite3). refdbsru can obtain this value at runtime, but it has to send one additional query per searchRetrieve or scan operation. If you provide the value here instead, response times will be faster.
zeerex_hostwww.change.meThe hostname of the computer that runs your web server and refdbsru
zeerex_port80The port that your web server listens to.
zeerex_databasecgi-bin/refdbsruThe path section of the URL which provides SRU access to your database, without the leading slash. zeerex_host, a slash, and this option combined make up the URL which a user has to type into his web browser to access your SRU service.
zeerex_databaseInfo_titleReference DatabaseA public name of your database.
zeerex_databaseInfo_descriptionA reference databaseA brief description of your database.
zeerex_databaseInfo_authorYour NameThe name of the person who is in charge of running the database.
zeerex_databaseInfo_contactyour@emailHow to contact the database maintainer. Usually the email address.

Environment

As a CGI script, refdbsru evaluates a variety of environment variables that the web server provides. These are:

REQUEST_METHOD

Either GET or POST

QUERY_STRING

The query string proper in a GET request.

PATH_INFO

This value, if present, is used as the name of a database (other than the preconfigured default database).

Files

PREFIX/etc/refdb/refdbsrurc

The global configuration file of refdbsru.

See also

RefDB (7)

refdb-sruserver (1)

RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html

RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html>

RefDB on the web <http://refdb.sourceforge.net/>

SRU (Search and Retrieve via URL) <http://www.loc.gov/standards/sru/>

Author

refdbsru was written by Markus Hoenicka <markus@mhoenicka.de>.

refdb-1.0.2/doc/refdb-manual/re05.html000644 001750 001750 00000022540 12255431211 020204 0ustar00markusmarkus000000 000000 refdb-sruserver

Name

refdb-sruserver — Simple SRU server for RefDB databases

Synopsis

refdb-sruserver

Description

refdb-sruserver is a simple standalone web server which povides a SRU service for RefDB databases. It is intended solely for local single-user access. For anything more ambitious, please see the CGI version of the SRU service, refdbsru(1).

Before starting the SRU service, make sure to set up the refdbsrurc configuration file which it shares with the CGI variant. The RefDB application server refdbd(1) must also be up and running. Now start the script which will run in the foreground until you kill it with Ctrl-c. The SRU service is available at the URL http://localhost:8080. Pointing your web browser to this address should return the output of the SRU explain command in a nicely formatted page. To run real queries, append the SRU query strings to the above URL.

Configuration

refdb-sruserver evaluates the file refdbsrurc to initialize itself. It shares this configuration file with refdbsru(1), the CGI variant of the SRU service.

Note

The parameters starting with "zeerex_" do not actually influence how the script operates. They provide some of the site-specific information which appears in the SRU explain output.

Table 12.3. refdb-sruserverrc

VariableDefaultComment
logfile/var/log/refdb-sruserver.logThe full path of a custom log file. This is used only if logdest is set appropriately.
logdest1The destination of the log information. 0 = print to stderr; 1 = use the syslog facility; 2 = use a custom logfile. The latter needs a proper setting of logfile.
loglevel6The log level up to which messages will be sent. A low setting (0) allows only the most important messages, a high setting (7) allows all messages including debug messages. -1 means nothing will be logged.
serverip127.0.0.1The IP address or hostname of the machine where refdbd runs. Use the default (localhost) address if the clients and refdbs run on the same machine.
port9734The port on which refdbd listens. Change this for all clients and the server if this value interferes with another program using this port.
timeout180The timeout in seconds. After this time has elapsed, a stalled connection is taken down. Increase this value if you encounter frequent timeout errors due to high network traffic or refdbd overload.
usernamelogin nameThe username which is used for authentication with the database server.
passwd The password which is used for authentication with the database server.
pdfroot(none)This value will be used as the root of the paths to PDF or Postscript offprints that can be specified with the AV field in a RIS dataset. The path should not rely on shell expansion, e.g. use /home/me/literature/ instead of ~/literature/. The pdfroot allows you to shorten the paths that you enter for each dataset and to maintain a certain portability if you have to move the offprints to a different directory or want to access them remotely. The html output routine will concatenate the relative path of each dataset with the pdfroot to construct the link to the offprint. Instead of a local path name you can specify an URL starting with http:// or ftp:// if your offprints are accessible through a web server or ftp server.
cssurl(none)In spite of the parameter name, this may be the URL either of a Cascading Style Sheet (CSS) file, or of a XSLT file. This file, if specified, is used to format the SRU output in the web browser.
dbserver(none)This is the name of the database engine that refdbd uses (currently either mysql, pgsql, sqlite, or sqlite3). refdb-sruserver can obtain this value at runtime, but it has to send one additional query per searchRetrieve or scan operation. If you provide the value here instead, response times will be faster.
zeerex_hostwww.change.meThe hostname of the computer that runs your web server and refdb-sruserver
zeerex_port80The port that your web server listens to.
zeerex_databasecgi-bin/refdb-sruserverThe path section of the URL which provides SRU access to your database, without the leading slash. zeerex_host, a slash, and this option combined make up the URL which a user has to type into his web browser to access your SRU service.
zeerex_databaseInfo_titleReference DatabaseA public name of your database.
zeerex_databaseInfo_descriptionA reference databaseA brief description of your database.
zeerex_databaseInfo_authorYour NameThe name of the person who is in charge of running the database.
zeerex_databaseInfo_contactyour@emailHow to contact the database maintainer. Usually the email address.

Files

PREFIX/etc/refdb/refdbsrurc

The global configuration file of refdb-sruserver.

See also

RefDB (7)

refdbsru (1)

RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html

RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html>

RefDB on the web <http://refdb.sourceforge.net/>

SRU (Search and Retrieve via URL) <http://www.loc.gov/standards/sru/>

Author

refdb-sruserver was written by Markus Hoenicka <markus@mhoenicka.de>.

refdb-1.0.2/doc/refdb-manual/re06.html000644 001750 001750 00000214247 12255431213 020216 0ustar00markusmarkus000000 000000 refdba

Name

refdba — the administration client of RefDB

Synopsis

Interactive mode:

refdba [-c pager-command] [-e log-destination] [-f stdin] [-h ] [-i IP-address] [-l log-level] [-L log-file] [-p port] [-q ] [-T time] [-u name] [-v ] [-V ] [-w password] [-x ] [-y confdir]
Non-Interactive mode:

Batch mode:

refdba -C command [-c pager-command] [-e log-destination] [-f stdin] [-i IP-address] [-l log-level] [-L log-file] [-p port] [-q ] [-T time] [-u name] [-w password] [-x ] [-y confdir]

Description

refdba is a command-line client providing the commands to administer RefDB(7) databases, users, and styles. refdba can be started in an interactive mode, providing a command prompt. Type ? or help to see a list of available commands. Alternatively you can start refdba in non-interactive mode. refdba will execute the requested command and return. In this mode refdba will accept input on stdin for a variety of commands, allowing Unix piping.

Options

-c pager-command

The command line of the pager that is to be used. Instead of a pager you can of course specify any valid command that accepts data on stdin. Use "stdout" to request data output to stdout. This is the default, but you may want to specify it on the command line if you need to temporarily override a default pager setting in your configuration file.

-C command

The command to be run in non-interactive mode. You can supply all options and parameters that the command accepts on the refdba command line.

-e log-destination

log-destination can have the values 0, 1, or 2, or the equivalent strings stderr, syslog, or file, respectively. This value specifies where the log information goes to. 0 (zero) means the messages are sent to stderr. They are immediately available on the screen but they may interfere with command output. 1 will send the output to the syslog facility. Keep in mind that syslog must be configured to accept log messages from user programs, see the syslog(8) man page for further information. Unix-like systems usually save these messages in /var/log/user.log. 2 will send the messages to a custom log file which can be specified with the -L option.

-f stdin

Read data from stdin. refdbc usually knows when it should read from stdin. However, a few commands use data supplied in the command line but also allow to read from a file. Use this option to force refdbc to read from stdin in addition to values supplied on the command line.

-h

Displays help and usage screen, then exits.

-i IP-address

Set the IP address of the box which is running the application server refdbd(1). Instead of the IP address you can also specify the hostname as long as it can be properly resolved by your system.

-l log-level

Specify the priority up to which events are logged. This is either a number between 0 and 7 or one of the strings emerg, alert, crit, err, warning, notice, info, debug, respectively (see also Log level definitions). -1 disables logging completely. A low log level like 0 means that only the most critical messages are logged. A higher log level means that less critical events are logged as well. 7 will include debug messages. The latter can be verbose and abundant, so you want to avoid this log level unless you need to track down problems.

-L log-file

Specify the full path to a log file that will receive the log messages. Typically this would be /var/log/refdba.

-p port

Set the port of the box which is running the application server.

-q

Start without reading the configuration files. The client will use the compile-time defaults for all values that you do not set with command-line switches. Useful for debugging config files.

-T time

Set the timeout for client/application server dialogue in seconds. A connection with unsuccessful read or write attempts will be considered as dead and taken down after this amount of time has elapsed.

-u name

Set the username for the database access. Note: This username need not be identical to the login name of the user. This is the username required to access the database server.

-v

Prints version and copyright information, then exits.

-V

Switches to verbose mode.

-w password

Set the password for the database access. Note: This password need not be identical to the login password of the user. This is the password required to access the database server.

-x

Send passwords unencrypted.

-y confdir

Specify the directory where the global configuration files are Note: By default, all RefDB applications look for their configuration files in a directory that is specified during the configure step when building the package. That is, you don't need the -y option unless you use precompiled binaries in unusual locations, e.g. by relocating a rpm package.

Diagnostics

The exit code is 0 if all went fine. It will be 1 if the command (when run in batch mode) or the last command (when run in interactive mode) returned an error, or if there was a general error condition during startup like a lack of available memory.

Configuration

refdba evaluates the refdbarc configuration file at startup to initialize itself.

Table 13.1. refdbarc

VariableDefaultComment
logfile/var/log/refdba.logThe full path of a custom log file. This is used only if logdest is set appropriately. If you start refdba from the command line as a regular user, you should specify a file that you have write access to (you may not be allowed to create /var/log/refdb.log or write to this file as a regular user).
logdest2The destination of the log information. 0 = print to stderr (this is mainly intended for debugging, as it may visually interfere with command output); 1 = use the syslog facility; 2 = use a custom logfile. The latter needs a proper setting of logfile.
loglevel6The log level up to which messages will be logged. A low setting (0) allows only the most important messages, a high setting (7) allows all messages including debug messages. -1 means nothing will be logged.
pagerstdoutThe command line of a pager that accepts the output of refdb on stdin to allow scrolling and other nifty things. “stdout†sends the data to stdout.
passwd*The password which is used for authentication with the database server. It is potentially evil to store unencrypted passwords in disk files. At least make sure that the configuration file is not readable for anyone else. The default setting causes refdba to ask for your password interactively.
port9734The port on which refdbd listens. Change this for all clients and the server if this value interferes with another program using this port.
serverip127.0.0.1The IP address or hostname of the machine where refdbd runs. Use the default (localhost) address if the clients and refdbd run on the same machine.
timeout180The timeout in seconds. After this time has elapsed, a stalled connection is taken down. Increase this value if you encounter frequent timeout errors due to high network traffic or refdbd overload.
usernamelogin nameThe username which is used for authentication with the database server. This may be different from the login name of the user.
verbosefSet this to t if you prefer verbose error messages.
no_encryptfIf set to 't', passwords are transmitted unencrypted. The default is to encrypt passwords.

Commands

All commands consist of a single word which specifies the command. This may be followed by arguments and/or switches. The general syntax rules of the getopts library apply.

addstyle

Synopsis

addstyle [-c command] [-h] [[-o filename] | [-O filename]] {style-file...}

Description

Adds one or more bibliography style specifications from the input file(s).

Options

-c command

Specifies a command that will receive the output instead of the default pager. This may be a different pager, any command that takes input on stdin, or the string “stdout†to send the data to stdout without using a pager.

-h

Displays the online help about the addstyle command.

-o filename

Write the output to filename instead of to stdout.

-O filename

Append the output to filename instead of writing it to stdout.

style-file

All other arguments are interpreted as the names of files containing style specifications.

Example

	  refdba: 
	  addstyle j.biol.chem.xml pharmacol.rev.xml
	

This will add the style specifications contained in the files j.biol.chem.xml and pharmacol.rev.xml to the bibliography style database.

adduser

Synopsis

adduser {-d database} [-h] {-H host-IP} [-R] [-W password] {[-f file] | [ username ...]}

Description

Grants access rights to a refdb database to the given users. Specify the database with the -d option.

Note

If a user is not yet known to the database server, refdb will create an account with the default access rights (=none). If you do not specify a password for the new user with the -W option (see below), the user will have access to the database server with the default password "refdb". In most cases this is not a good thing.

A new user will automatically get access to the internal refdb database refdb.

Some database engines like SQLite do not support access control. The adduser command is not supported with these engines and will just return an explanatory message.

-d database

Specifies the reference database for which the access rights should apply.

-f file

Reads a whitespace-separated list of usernames from file.

-h

Displays the online help about the adduser command.

-H hostname

hostname specifies the host the refdb application server runs on. If it runs on the same machine as the database server, you may specify “localhost†as hostname. Use “%†as hostname to allow access from all addresses except localhost. Otherwise, the hostname argument can be either a hostname, an IP address, or a subnet that specifies one or more computers to allow access from. You can add the same user several times with different hostnames.

Note

This option is only supported by MySQL. It is ignored if you use PostgreSQL as your database server. Please see the PostgreSQL documentation for help on how to manipulate host-based access control with the pg_hba.conf file.

-R

Use this option to grant read-only access for the user. By default, users are granted read/write access. Users with read-only access can basically only retrieve references and notes.

-W password

Set the password for a new user. The password is encrypted before transferring it to the application server. If the user already exists, his password will be changed accordingly.

username

All other arguments are interpreted as usernames. If neither a username argument nor an input file is specified, refdba attempts to read a whitespace-separated list of names from stdin. To force refdba to read from stdin in addition to explicitly named users, use the -f stdin option.

Examples

	  refdba: 
	  adduser -d db1 -N newpassjim 
	

This will grant access to the database db1 for the new user jim. refdbd runs on the same computer as the database server (if you leave out the -H option, localhost is assumed). "jim" will have to provide "newpass" as a password when starting one of the refdb clients.

	  refdba: 
	  adduser -d db1 -H mono.mycomp.com jim jane
	

This will grant access to the database db1 for the users jim and jane. refdbd runs on the computer with the name "mono.mycomp.com". If "jim" and "jane" are already known to the database server, they will keep their existing passwords. If not, they will have to use the default password "refdb".

Alternatives on sites with restricted database server access

If you as the refdb administrator do not have GRANT permission on your database server, the adduser command is bound to fail. As a security-minded person your database administrator might refuse to run refdba regardless of how often you ensure him it doesn't contain malicious code. He'll want to do it the hard way, and this is what he needs to do:

  • If you use MySQL as your database server, each new user needs at least entries in the mysql.user and mysql.db tables. Your database administrator might have set up his own rules, but in general the mysql.user table should grant no privileges to the user, whereas the mysql.db table should grant INSERT, SELECT, UPDATE, DELETE permissions to each user for the refdb database and SELECT, INSERT, UPDATE, DELETE, CREATE, DROP privileges for each reference database the user should have access to. Make sure to mention that the Host field in mysql.user must contain the name or address of the box that runs refdbd, which is not necessarily identical with the workstation of the user.

  • If you prefer PostgreSQL instead, things are a little simpler. When you create a refdb database, a new group will be created to manage access to this database. All your database administrator needs to do is to add the new user to the groups refdbuser (granting access to the common refdb database) and <dbname>user, where <dbname> is the name of the reference database the user should be allowed to access.

addword

Synopsis

addword [-h] {[-f file] | [word...]...}

Description

Most bibliography styles use standardized abbreviations of the journal names. Most data sources specify these abbreviations without dots, as in "Mol Cell Biol". If the words are to be abbreviated with dots (as in "Mol. Cell Biol.") in the bibliography, refdb needs to know which tokens in the abbreviated name are indeed abbreviated (e.g. "Mol."), and which are full words (e.g. "Cell"). To this end, refdb keeps a list of reserved words which are known not to be abbreviations of something else. refdb ships with a fairly complete list of such words, but if you detect errors or omissions, the addword command comes in handy.

Options

-f file

Read a whitespace-separated list of journal title words from file.

-h

Displays the online help about the addword command.

word

All other arguments are interpreted as reserved words. If neither a word list nor an input file is specified, refdba attempts to read a whitespace-separated list of words from stdin. To force refdba to read from stdin in addition to explicitly listed words, use the -f stdin option.

Note

refdb will convert all reserved words to uppercase internally, so it does not matter which case you provide these words in.

Example

	  refdba: 
	  addword -f wordlist FOO BAR
	

This will add all reserved words in the file wordlist as well as the words "FOO" and "BAR" to the list of reserved words.

confserv

Synopsis

confserv {command} [value]

Description

Configures the application server while it is running and does some tricks with the refdb helper databases as well. Some of the commands modify variables that can be set as command line arguments or with the init file. See Running the refdbd daemon for more information about these variables.

Note

This command will only reconfigure refdbd transiently. All changes are lost when the application server is restarted. To make permantent changes to the configuration, edit the init-file or change the command-line parameters in the script that starts refdbd. Please note also that remote administration must be enabled for this command to work.

The following commands are available:

stop

Stops the application server.

Note

This command affects only the refdbd parent process. Any children that may be currently serving clients will continue to do so until they are done.

ping

Checks whether the application server is still alive and well. If this is the case, it will report the process IDs of the child that handles your query and of the parent. If not, the connection will time out with no response.

serverip value

Sets the database server IP address to value.

timeout value

Sets the timeout in seconds to value.

logdest value

Sets the destination of log output to value. Possible values are 0 (stderr), 1 (the system syslog facility), 2 (a private log file as defined by logfile).

logfile value

Sets the filename of the log file to value.

loglevel value

Sets the maximum level of messages to be logged to value. 0 means that only critical errors will be logged, 7 means that all messages including the extremely verbose debug messages will be logged. -1 disables logging completely.

Example

refdba: confserv loglevel 7

This will set the log level to 7. This temporary change will only be effective until refdbd is restarted.

createdb

Synopsis

createdb [-E encoding] [-h] {dbname...}

Description

Creates a new database with the name dbname. Several databases may be specified in a single call of this command.

Options

-E encoding

Select a character encoding for the new database. This is currently only supported by MySQL and PostgreSQL. If you use a different engine, this option is ignored. Please see the documentation of your database engine installation for available encodings. The value passed with the -E option should be the IANA encoding name. If you do not use this option, the new database will use the default encoding of the database server unless your refdbdrc configuration file sets a default with a "db_encoding" entry.

-h

Displays the online help about the createdb command.

name

The name of the reference database. The name must not contain a colon (':') or a dash ('-') due to the citation formats in documents using RefDB. The allowed characters may be further restricted by the database engine you use. The database name should also be considered case-insensitive, i.e. don't try to create a database "mybase" if you already have one called "MYBASE". Also, avoid using names which are SQL reserved words as this is doomed to fail. Unfortunately, this includes the all too convenient name "references". Try "refs" or "biblio" instead.

Tip

Prepend a constant string like “rd†to all refdb database names. This speeds up retrieving refdb databases with the listdb command if your database engine manages additional, non-RefDB databases. Use a simple regular expression like “rd%†to restrict your search to RefDB databases.

Example

	  refdba: 
	  createdb db1 -E UTF-8 db2
	

This will create the databases db1 and db2 with the character encoding UTF-8.

Using SQL scripts to create databases

refdb contains two plain-text SQL scripts (installed in /usr/local/share/refdb/sql) to create database tables just like the createdb command does. These scripts are preferable to the command in these cases:

  • You do not have database administrator permissions and have to ask your admin to create the databases for you. Your admin might prefer to run the script as he can easily find out what it is going to do.

  • You want to integrate refdb with an existing or a custom database system. In that case you want the refdb-specific tables in an existing database in addition to non-refdb tables.

The following procedures are equivalent to running the createdb command. If you want to add the tables to an existing database, please adapt the scripts and/or the procedures accordingly.

  • If you're running MySQL, use the following commands (provide additional options like username and password as required):

    	      #~ 
    	      mysql -e "CREATE DATABASE dbname"
    	    
    	      #~ 
    	      mysql dbname < empty.mysql.dump
    	    
  • If you're using PostgreSQL, the following sequence should work (again, provide additional options like username and password as required):

    	      #~ 
    	      sed 's/refdbtest/dbname/g' < empty.pgsql.dump.in > empty.pgsql.dump
    	    
    	      #~ 
    	      psql template1 < empty.pgsql.dump
    	    

The empty.pgsql.dump.in script contains the commands to create a database and to set appropriate access rights for a new group of database users. Therefore it is a good idea to replace the string "refdbtest" with the intended name of your new database. The sed command in the first line does just this. You may also edit a few more things, like the encoding. The second command actually creates the database, a new group, grants privileges to this group, and creates all necessary tables and sequences. template1 is a PostgreSQL system database. The psql command requires the name of an existing database as an argument, but in this case you could use any other existing database just as well.

deletedb

Synopsis

deletedb [-h] {dbname...}

Description

Deletes the database with the name dbname. Several databases may be specified in a single call of this command.

Caution

The database structure and the data will be gone, really gone, so be careful with this command. Think twice and, if in doubt, at least make a backup first to avoid extensive hairpulling.

Options

-h

Displays a brief usage message and returns to the prompt.

dbname

The name of the database to be deleted.

Example

	  refdba: 
	  deletedb db1 db2
	

This will delete the databases db1 and db2.

deletestyle

Synopsis

deletestyle [-h] {unix-regexp}

Description

Deletes the bibliography styles whose names match the Unix regular expression unix-regexp.

Note

Some database engines, like SQLite, do not support Unix-style regular expressions. Use SQL regular expressions instead.

Options

-h

Displays a brief usage message and returns to the prompt.

unix-regexp

The remaining arguments are interpreted as a regular expression which specifies the style or styles to be deleted.

Example

	  refdba: 
	  deletestyle J\..*
	

This will delete all bibliography styles that start with “J.â€.

deleteuser

Synopsis

deleteuser {-d database} [-h] {-H host-IP} {-R} {[-f file] | [ username ...]}

Description

Revokes access rights to a refdb database from the given users.

Note

Some database engines like SQLite do not support access control. The adduser command is not supported with these engines and will just return an explanatory message.

refdb will only revoke the access rights to the specified database. It will revoke neither access rights to the internal database refdb, nor will it revoke database server access. You can revoke access to the internal database by specifying "refdb" with the -d option. To revoke access to the database server, please use the command line utilities of your database server.

Options

-d database

Specify the name of the database.

-f filename

Read the usernames from filename

-h

Displays the online help about the deleteuser command.

-H hostname

Specify the hostname or IP address for which to modify the access rights. This must be the same name that you used for a previous call to adduser.

Note

This option is only supported by MySQL. It is ignored if you useother database engines.

-R

Revokes read-only access.

username

All other arguments are interpreted as usernames. If neither a username argument nor an input file is specified, refdba attempts to read a whitespace-separated list of names from stdin. To force refdba to read from stdin in addition to explicitly named users, use the -f stdin option.

Examples

	  refdba: 
	  deleteuser -d -H % db1jim
	

This will revoke the access to the database db1 for the user jim for all but local connections.

deleteword

Synopsis

deleteword [-h] {[-f file] | [ word ...]...}

Description

This command performs the reverse operation of addword. The specified reserved words will be removed from the list.

Options

-f

Read a whitespace-separated list of words from file.

-h

Displays the online help about the addword command.

word

All other arguments are interpreted as reserved words. If neither a word list nor an input file is specified, refdba attempts to read a whitespace-separated list of words from stdin. To force refdba to read from stdin in addition to explicitly listed words, use the -f stdin option.

Note

refdb will convert all reserved words to uppercase internally, so it does not matter in which case you provide these words.

Example

	  refdba: 
	  deleteword -f wordlist FOO BAR
	

This will delete all reserved words in the file wordlist as well as the words "FOO" and "BAR" from the list of reserved words.

getstyle

Synopsis

getstyle [-c] [-h] [[-o] | [-O]] { style ...}

Description

Retrieves one or more bibliography style specifications from the database and formats them as an XML file.

Options

-c command

Specify a command that will receive the output instead of the default pager. This may be a different pager, any command that takes input on stdin, or the string “stdout†to send the data to stdout without using a pager.

-h

Displays the online help about the getstyle command.

-o

Write the output to a file instead of to stdout.

-O

Append the output to a file instead of writing it to stdout

Warning

Be careful with the append (-O) option. refdb will output the processing instructions, the doctype line, and one CITESTYLE element for each individually requested style. If you concatenate the results of several getstyle calls, the resulting XML file will not be well-formed without further processing. In order to write several styles into a single XML file, use a single getstyle call and list all required styles as arguments. This will output the styles wrapped in a STYLESET element, resulting in a valid XML file.

style

All other arguments are interpreted as the names of bibliography styles.

Example

	  refdba: 
	  getstyle -o j.biol.chem.xml J.Biol.Chem.
	

This will write the style specification stored under the style name "J.Biol.Chem." to the file j.biol.chem.xml.

help

Synopsis

help

?

Description

Displays a brief summary of the available commands.

Example

	  refdba: 
	  help
	

listdb

Synopsis

listdb [-h] [database-regexp]

Description

Lists all available databases if no argument is specified. If database-regexp is specified, only the databases matching this expression will be listed.

Note

In order to tell refdb reference databases apart from other databases maintained by your database server, refdbd has to peek into each database returned by the database server. Depending on the number of available databases this may take some time. Therefore it may be a good idea to use a common prefix for all refdb databases as explained in the section about the createdb command.

Options

-h

Displays a help message explaining the listdb command.

database-regexp

A valid SQL regular expression which limits the output to matching database names.

Example

	  refdba: 
	  listdb db%
	

This will list all databases with names that start with the string “dbâ€.

liststyle

Synopsis

liststyle [-h] [ style-regexp ]

Description

Lists all available bibliography styles that match style-regexp. If no argument is given, all available styles will be listed. This may or may not be what you want.

Options

-h

Displays a help message explaining the listdb command.

style-regexp

A valid Unix regular expression which limits the output to matching style names.

Note

Some database engines, like SQLite, do not support Unix-style regular expressions. Use SQL regular expressions instead.

Example

	  refdba: 
	  liststyle ^J.*
	

This will list all bibliography styles that start with a capital “Jâ€.

listuser

Synopsis

listuser {-d database} [-h] [name-regexp]

Description

Lists all available users of the specified database that match name-regexp. If no argument is given, all available users will be listed. This may or may not be what you want.

Options

-d database

Specify the database name.

-h

Displays a help message explaining the listdb command.

name-regexp

A valid Unix regular expression which limits the output to matching database user names.

Note

Some database engines, like SQLite, do not support Unix-style regular expressions. Use SQL regular expressions instead.

Example

	  refdba: 
	  listuser -d refs ^mo.*
	

This will list all users of the database "refs" whose names start with “moâ€.

listword

Synopsis

listword [-h] {word-regexp}

Description

Lists all available reserved journal words that match unix-regexp. If no argument is given, all available words will be listed. This may or may not be what you want.

Note

Keep in mind that the journal words are uppercased internally. You should write your unix-regexp using all caps accordingly.

Options

-h

Displays a help message explaining the listdb command.

word-regexp

A valid Unix regular expression which limits the output to matching journal title words.

Note

Some database engines, like SQLite, do not support Unix-style regular expressions. Use SQL regular expressions instead.

Note

For a brief description of the purpose of reserved words, see the addword command.

Example

	  refdba: 
	  listword ^BIO.*
	

This will list all reserved journal words that start with “BIOâ€.

scankw

Synopsis

scankw {-d database} [-h]

Description

This command schedules a full keyword scan in the database specified with the -d option. The abstract field as well as all title fields of all references found in the database are scanned for the presence of all keywords available in the database. If a match is found and the keyword is not yet associated with that reference, the keyword is added to that reference. As the time required to perform this operation increases with both the number of references and the number of keywords, the keyword scan is performed in the background and the command returns immediately on the client side. See the server log for the results.

As this command will cause a huge number of database accesses it is best scheduled to run automatically as a cron job at a time of low use, either nightly or on weekends.

Please note the difference between the full keyword scan and the automatic keyword scan which can be requested by the refdbd command line switch -K or the corresponding configuration variable keyword_scan. The full keyword scan is "retrospective", i.e. it will add keywords that were added later to previously existing references. The automatic keyword scan will only add existing keywords to newly added references, thus causing less impact on the database performance while users are likely to access the database.

Options

-d database

Specify the database name.

-h

Displays a help message explaining the listdb command.

set

Synopsis

set [-h] [varname] [varvalue]

Description

The set command displays or modifies the values of configuration variables.

If you call set without any arguments, it will display a list of all configuration variables with their current values.

If you call set with one argument, it will display the current value of this particular variable.

If you call set with two arguments, it will set the variable (first argument) to the new value (second argument) for the current session. To specify an empty value, use two quotation marks like this:"".

Note

For obvious reasons, set will never display the current password although you can certainly change the password with this command. To make sure no one else sees the new password that you enter, run the command set passwd *. You will then be asked to enter a password which will not be echoed on the screen.

This command is not available in batch mode, use the command line switches instead. In the interactive mode, the changes to the configuration variables are limited to the current session. If you want to change the values permanently, you should rather edit one of the configuration files.

Options

-h

Displays a help message explaining the listdb command.

varname

The name of the variable whose value should be displayed or set.

varvalue

The new value of the variable to be set.

Example

	  refdba: 
	  set timeout 90
	

This command will set the timeout to 90 seconds for the current session.

verbose

Synopsis

verbose [-h]

Description

Toggles the verbose mode on or off. If the verbose mode is on, the error messages and warnings may be some more comprehensible.

Options

-h

Displays a help message explaining the listdb command.

Example

	  refdba: 
	  verbose
	

Depending on the previous setting, this will toggle the verbose mode on or off.

viewstat

Synopsis

viewstat [-h]

Description

Shows the version numbers of the libdbi driver used to connect to your database server as well as the version information of that server. It also shows the current values of the variables that can be modified with confserv.

Options

-h

Displays a help message explaining the listdb command.

Example

	  refdba: 
	  viewstat
	

This will print some connection statistics and informations on the screen.

Files

PREFIX/etc/refdb/refdbarc

The global configuration file of refdba.

$HOME/.refdbarc

The user configuration file of refdba.

See also

RefDB (7), refdbd (1), refdb-backup (1), refdb-restore (1), refdbc (1).

RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html

RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html>

RefDB on the web <http://refdb.sourceforge.net/>

Author

refdba was written by Markus Hoenicka <markus@mhoenicka.de>.

refdb-1.0.2/doc/refdb-manual/re07.html000644 001750 001750 00000012433 12255431213 020210 0ustar00markusmarkus000000 000000 refdb-backup

Name

refdb-backup — RefDB tool: back up RefDB references, notes and styles

Synopsis

refdb-backup [-h ] [-u user] [-w pwd] [-f format] [-d dir] [-s ]

Description

refdb-backup is a tool for backing up RefDB(7) references, notes and styles. A gzipped tarfile of the form 'refdb_backup_YYYYMMDD_HHMM.tar.gz' is created.

While users can restore data from the backup archive manually, it is expressly designed to restored by the companion tool refdb-restore.

Options

-d dir

directory in which to place backup file (default: current directory)

-f format

references storage format ('ris' (default)|'risx')

-h

print help and exit

-s

silent, no screen feedback

-u user

username for RefDB clients (refdba, refdbc) not required if clients are configured for automatic access

-w pwd

password for RefDB clients (refdba, refdbc) not required if clients are configured for automatic access

See also

RefDB (7), refdb-restore (1), refdba (1), refdbc (1).

RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html

RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html>

RefDB on the web <http://refdb.sourceforge.net/>

Author

refdb-backup was written by David Nebauer <david@nebauer.org>

This manual page was written by David Nebauer <david@nebauer.org> for the Debian project (but may be used by others).

refdb-1.0.2/doc/refdb-manual/re08.html000644 001750 001750 00000011423 12255431213 020207 0ustar00markusmarkus000000 000000 refdb-restore

Name

refdb-restore — RefDB tool: restore RefDB references, notes and styles

Synopsis

refdb-restore [-h ] [-u user] [-w pwd] backup-archive

Description

refdb-restore is a tool for restoring RefDB(7) references, notes and styles. The backup archive must have been created by the companion tool refdb-backup.

Before performing the restore all reference databases must be removed (archived) from /var/lib/refdb/db/. The system database in that directory ('refdb') must be recreated from the sql dump (see Manual).

Options

-h

print help and exit

-u user

username for RefDB clients (refdba, refdbc) not required if clients are configured for automatic access

-w pwd

password for RefDB clients (refdba, refdbc) not required if clients are configured for automatic access

See also

RefDB (7), refdb-backup (1), refdba (1), refdbc (1).

RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html

RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html>

RefDB on the web <http://refdb.sourceforge.net/>

Author

refdb-restore was written by David Nebauer <david@nebauer.org>

This manual page was written by David Nebauer <david@nebauer.org> for the Debian project (but may be used by others).

refdb-1.0.2/doc/refdb-manual/re09.html000644 001750 001750 00000012525 12255431213 020214 0ustar00markusmarkus000000 000000 refdb-init

Name

refdb-init — RefDB setup script

Synopsis

refdb-init

Description

refdb-init is an interactive shell script that guides the system administrator through the initial setup of RefDB(7). refdb-init asks all necessary questions and performs all necessary checks before any changes are committed. Your confirmation is required before your system will be touched. As many of the operations performed by this script require root permission, you have to run this script from a privileged account.

While refdb-init does check for an existing installation of RefDB and offers to back up existing configuration files, it is not yet designed to upgrade an installation appropriately. If used to upgrade an existing installation, the administrator is responsible to back up and restore data that may be overwritten during the setup.

refdb-init performs the following tasks (you can interactively skip some of the tasks):

  • Creates the main database refdb for the selected database engine. If a copy of the main database already exists, it asks for permission to delete this database before proceeding.

  • Creates a configuration file for refdbd(1), the RefDB application server. If the file already exists, it will keep a copy of this version.

  • Creates a configuration file for refdba(1), the RefDB administrative client, in the current login account. If the file already exists, it will keep a copy of this version.

  • Starts refdbd, the RefDB application server

  • Loads the bibliography and citation styles shipped with RefDB

  • Creates a reference database

  • Creates a database user with permissions to work with the reference database

Files

PREFIX/etc/refdb/refdbdrc

The configuration file for refdbd

/root/.refdba

The configuration file for refdba for the root account

See also

RefDB (7), refdbd (1).

RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html

RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html>

RefDB on the web <http://refdb.sourceforge.net/>

Author

refdb-init was written by Markus Hoenicka <markus@mhoenicka.de>.

refdb-1.0.2/doc/refdb-manual/re10.html000644 001750 001750 00000006656 12255431213 020214 0ustar00markusmarkus000000 000000 refdb-bug

Name

refdb-bug — RefDB tool: writes text file containing summary of RefDB's configuration

Synopsis

refdb-bug

Description

RefDB is a free and portable reference and notes database as well as a bibliography application that serves a similar purpose for SGML, XML, and LaTeX documents as Reference Manager or EndNote do for word processor documents.

This script creates a text file (./refdb-bug.txt) containing useful information about RefDB's configuration. This file can be attached to bug reports to aid in debugging.

See also

RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html

RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html>

Author

RefDB was written by Markus Hoenicka <mhoenicka@users.sourceforge.net>.

This manual page was written by David Nebauer <david@nebauer.org> for the Debian project (but may be used by others).

refdb-1.0.2/doc/refdb-manual/re11.html000644 001750 001750 00000357052 12255431216 020217 0ustar00markusmarkus000000 000000 refdbc

Name

refdbc — the reference and note management client of RefDB

Synopsis

Interactive mode:

refdbc [-c pager-command] [-d database] [-e log-destination] [-f stdin] [-F fields] [-g deffile] [-G CSS-file] [-h ] [-i IP-address] [-l log-level] [-L log-file] [-p port] [-q ] [-R pdfroot] [-T time] [-u name] [-v ] [-V ] [-w password] [-x ] [-y confdir]

Batch mode:

refdbc -C command [-c pager-command] [-d database] [-e log-destination] [-f stdin] [-F fields] [-g deffile] [-G CSS-file] [-i IP-address] [-l log-level] [-L log-file] [-p port] [-q ] [-R pdfroot] [-T time] [-u name] [-v ] [-V ] [-w password] [-x ] [-y confdir]

Description

refdbc is a command-line client providing the commands to manage references and notes with RefDB(7). refdbc can be started in an interactive mode, providing a command prompt. Type ? or help to see a list of available commands. Alternatively you can start refdbc in non-interactive mode. refdbc will execute the requested command and return. In this mode refdbc will accept input on stdin for a variety of commands, allowing Unix piping.

Options

-c pager-command

The command line of the pager that is to be used. Instead of a pager you can of course specify any valid command that accepts data on stdin. Use "stdout" to request data output to stdout. This is the default, but you may want to specify it on the command line if you need to temporarily override a default pager setting in your configuration file.

-C command

The command to be run in non-interactive mode. You can supply all options and parameters that the command accepts on the refdba command line.

-d database

The name of the default database. You can change the database anytime during an interactive session.

-e log-destination

log-destination can have the values 0, 1, or 2, or the equivalent strings stderr, syslog, or file, respectively. This value specifies where the log information goes to. 0 (zero) means the messages are sent to stderr. They are immediately available on the screen but they may interfere with command output. 1 will send the output to the syslog facility. Keep in mind that syslog must be configured to accept log messages from user programs, see the syslog(8) man page for further information. Unix-like systems usually save these messages in /var/log/user.log. 2 will send the messages to a custom log file which can be specified with the -L option.

-f stdin

Read data from stdin. refdbc usually knows when it should read from stdin. However, a few commands use data supplied in the command line but also allow to read from a file. Use this option to force refdbc to read from stdin in addition to values supplied on the command line.

-F fields

Specify the default fields that are to be displayed in a getref query.

-g deffile

This option can be used to add some default fields to all RIS references that are added or updated. The argument deffile is the filename of a RIS file containing these additional fields. refdbc first tries the filename as is, so it should be a valid relative or absolute path. If the file is not found, refdb looks for the file in $HOME. The command aborts if the file cannot be found.

-G CSS-file

Specify the URL of a Cascading Style Sheets (CSS) file. This file will be used to customize the HTML output of the getref command. The URL can be either a local path (e.g. refdb.css, /home/myname/custom.css) or the web address of a file on a web server (e.g. http://www.mycomp.com/refdb.css).

-h

Displays help and usage screen, then exits.

-i IP-address

Set the IP address of the box which is running the application server refdbd(1). Instead of the IP address you can also specify the hostname as long as it can be properly resolved by your system.

-l log-level

Specify the priority up to which events are logged. This is either a number between 0 and 7 or one of the strings emerg, alert, crit, err, warning, notice, info, debug, respectively (see also Log level definitions). -1 disables logging completely. A low log level like 0 means that only the most critical messages are logged. A higher log level means that less critical events are logged as well. 7 will include debug messages. The latter can be verbose and abundant, so you want to avoid this log level unless you need to track down problems.

-L log-file

Specify the full path to a log file that will receive the log messages. Typically this would be /var/log/refdba.

-p port

Set the port of the box which is running the application server.

-q

Start without reading the configuration files. The client will use the compile-time defaults for all values that you do not set with command-line switches. Useful for debugging configuration files.

-R pdfroot

Specify the root path of your collection of electronic offprints.

-T time

Set the timeout for client/application server dialogue in seconds. A connection with unsuccessful read or write attempts will be considered as dead and taken down after this amount of time has elapsed.

-u name

Set the username for the database access. Note: This username need not be identical to the login name of the user. This is the username required to access the database server.

-v

Prints version and copyright information, then exits.

-V

Switches to verbose mode.

-w password

Set the password for the database access. Note: This password need not be identical to the login password of the user. This is the password required to access the database server.

-x

Send passwords unencrypted.

-y confdir

Specify the directory where the global configuration files are Note: By default, all RefDB applications look for their configuration files in a directory that is specified during the configure step when building the package. That is, you don't need the -y option unless you use precompiled binaries in unusual locations, e.g. by relocating a rpm package.

Diagnostics

The exit code is 0 if all went fine. It will be 1 if the command (when run in batch mode) or the last command (when run in interactive mode) returned an error, or if there was a general error condition during startup like a lack of available memory.

Configuration

refdbc evaluates the refdbcrc configuration file at startup to initialize itself.

Table 14.1. refdbcrc

VariableDefaultComment
cssurl(none)The URL of a Cascading Style Sheet (CSS) file. This file, if specified, is used to customize the visual appearance of the HTML output of the getref command.
defaultdb(none)The default database. refdbc will try to use this database unless you select a different one with the selectdb command.
defaultris(none)The path of a RIS file with entries that should be added to all new or updated references. This is typically used to set some default value for the RP field or to specify additional keywords.
fields(none)A list of additional fields which should be displayed by default in the reference output. The list is a simple concatenation of the field names. Possible fields are N1, N2, NX, AB, AD, RP, SN, PB, CY, UR, U1 through U5, M1 through M3. Use the string "ALL" to request all available fields.
fromencodingISO-8859-1The default encoding of RIS input data. You can use any encoding that your local libiconv implementation supports.
logdestfileWhere the log output should be written to. Use either stderr, syslog, or file. For the latter to work, the logfile variable must be set appropriately
logfile /var/log/refdbc.log The full path of a custom log file.
loglevelinfoSet the level of log information that you would receive. Possible values, in order of increasing verbosity, are: emerg, alert, crit, err, warning, notice, info, debug
pagerstdoutThe command line of a pager that accepts the output of refdb on stdin to allow scrolling and other nifty things. “stdout†sends the data to stdout.
passwd*The password which is used for authentication with the database server. It is potentially evil to store unencrypted passwords in disk files. At least make sure that the configuration file is not readable for anyone else. The default setting causes refdbc to ask for your password interactively.
pdfroot(none)This value will be used as the root of the paths to PDF or Postscript offprints that can be specified with the AV field in a RIS dataset. The path should not rely on shell expansion, e.g. use /home/me/literature/ instead of ~/literature/. The pdfroot allows you to shorten the paths that you enter for each dataset and to maintain a certain portability if you have to move the offprints to a different directory or want to access them remotely. The html output routine will concatenate the relative path of each dataset with the pdfroot to construct the link to the offprint. Instead of a local path name you can specify an URL starting with http:// or ftp:// if your offprints are accessible through a web server or ftp server.
port9734The port on which refdbd listens. Change this for all clients and the server if this value interferes with another program using this port.
serverip127.0.0.1The IP address or hostname of the machine where refdbd runs. Use the default (localhost) address if the clients and refdbs run on the same machine.
timeout180The timeout in seconds. After this time has elapsed, a stalled connection is taken down. Increase this value if you encounter frequent timeout errors due to high network traffic or refdbd overload.
toencoding(none)The default encoding of output data. You can use any encoding that your local libiconv implementation supports. If this value is not set, the encoding of the database will be used without conversion.
usernamelogin nameThe username which is used for authentication with the database server. This may be different from the login name of the user.
verbosefSet this to t if you prefer verbose error messages.
no_encryptfIf set to 't', passwords are transmitted unencrypted. The default is to encrypt passwords.

Commands

All commands consist of a single word which specifies the command. This may be followed by arguments and/or switches. The general syntax rules of the getopts library apply.

addlink

Synopsis

addlink [-d database] [-h] [[-c command] | [-o outfile] | [-O outfile]] {note-specifier} {link-target...}

Description

The addlink command links an extended note to one or more link targets.

You have to specify exactly one note on the command line, either by using the :NID: field selector to specify the note ID, or by using the :NCK: field selector to specify the note key. Then you need at least one link target. This can be one of :ID: (reference by ID), :CK: (reference by citation key), :AU: (author by name), :KW: (keyword by name), or one of :JF:, :JO:, :J1:, :J2: (periodical by full name, abbreviated name, or user abbreviations 1 and 2).

Options

-c command

Pipe the output through command.

-d database

Specify the database.

-h

Display a help message explaining the command.

-o filename

Write the output to filename instead of to stdout.

-O filename

Append the output to filename instead of sending it to stdout.

note-specifier

Specify one note by either its :NID: or its :NCK: value.

link-target

Specify one or more link targets by means of their :ID:, :CK:, :AU:, :KW:, :JF:, :JO:, :J1:, or :J2: values.

Example

	  refdbc: 
	  addlink :NID:=12 :CK:=Miller1999 :KW:=biochemistry
	

This command will link the note carrying the ID 12 with a reference specified by its citation key "Miller1999" and with the keyword "biochemistry".

addnote

Synopsis

addnote [-d database] [-E encoding] [-h] [[-c command] | [-o outfile] | [-O outfile]] [ file ...]

Description

Adds the extended notes in file to the current database. You can specify several files in one run. Any ID fields in the notes are ignored.

Options

-c command

Pipe the output through command.

-d database

Specify the database.

-E encoding

Select the character encoding for the input data if it is different from the default UTF-8.

-h

Display a help message explaining the command.

-o filename

Write the output to filename instead of to stdout.

-O filename

Append the output to filename instead of sending it to stdout.

Example

	  refdbc: 
	  addnote foo.xml
	

This command will add the extended notes in foo.ris to the currently selected database. If the notes do not specify a date, refdbd will insert a timestamp automatically.

addref

Synopsis

addref [-d database] [-E encoding] [-h] [[-c command] | [-o outfile] | [-O outfile]] [-t type] [-U username] [ file ...]

Description

Adds the references in file to the current database. You can specify several files in one run. Any ID fields in the references are ignored unless you specify the -k option.

Options

-c command

Pipe the output through command.

-d database

Specify the database.

-E encoding

Select the character encoding for the input data if it is different from the default setting. RIS datasets can use any encoding that your local libiconv supports (see man iconv_open for a list of available encodings), except UTF-16 and UTF-32. RISX datasets carry the encoding in the processing instructions, therefore this option is not needed and ignored.

-h

Display a help message explaining the command.

-o filename

Write the output to filename instead of to stdout.

-O filename

Append the output to filename instead of sending it to stdout.

-t type

Select the input data type. Possible values are "ris" (default) and "risx". Other data types have to be converted to one of these types before adding them to the database.

-U username

Provide a different username than that of the current user, so e.g. some technician or administrative staff can add references in behalf of a researcher.

file

All other command-line arguments will be interpreted as filenames to read references from. If no filenames are specified, the data will be read from stdin.

Example

	  refdbc: 
	  addref -U doe -g .refdbdefault.ris -E ISO-8859-1 foo.ris
	
	  $ 
	  refdbc -C addref -U doe -g .refdbdefault.ris -d db1 < foo.ris
	

These commands will add the references in foo.ris. The references will be associated with the user “doeâ€. Every reference will use the specified values in .refdbdefault.ris in the appropriate fields. In the first (interactive) command, the active database will be used, and the encoding is set to ISO-8859-1, aka Latin-1. In the second (non-interactive) command, the database has to be specified explicitly with the -d option, and the default encoding (UTF-8) is assumed.

checkref

Synopsis

checkref [-A output-type] [-d database] [-E encoding] [-h] [[-c command] | [-o outfile] | [-O outfile]] [-r field-list] [-s field-list] [-t input-type] [-U username] [ file ...]

Description

Adds the references in file to temporary tables in the current database. The command is similar to the addref command, except that it does not add the references permanently to your database. Instead, the import is "simulated" in temporary tables, and the resulting datasets are analyzed in terms of similarities to existing permanent entries. If a reference is similar to an existing one in terms of the location (periodical, volume, issue, startpage), of the titles, or of the citekey, you may want to check these references manually as they are probably duplicates. If an abbreviated periodical name is reported to match an existing full name, you may want to add both names to the new reference to make refdb aware that it is dealing with the same journal. If an author name using abbreviated first or middle names is reported to be a possible duplicate of an existing author or vice versa, you may want to check if these authors are indeed identical, and change the abbreviated one to the full version. In addition, keywords are checked for similar existing keywords (often there are singular and plural forms of the same keyword). You should prefer to use existing keywords if possible to make your database more consistent and easier to search.

Options

-A outtype

Select the output type of the report. Currently supported values are "scrn" for a terse screen output, and "xhtml" for a voluptuous xhtml report, bells and whistles included.

-c command

Pipe the output through command.

-d database

Specify the database.

-E encoding

Select the character encoding for the input data if it is different from the default setting. RIS datasets can use any encoding that your local libiconv supports (see man iconv_open for a list of available encodings), except UTF-16 and UTF-32. RISX datasets carry the encoding in the processing instructions, therefore this option is not needed and ignored.

-G cssfile

Select the CSS stylesheet that is to be used for the xhtml output.

-h

Display a help message explaining the command.

-o filename

Write the output to filename instead of to stdout.

-O filename

Append the output to filename instead of sending it to stdout.

-r fieldlist

Select fields to check. If this option is not used, all available checks are performed. This may result in a more comprehensive report than you want. You can instead check for particular fields, or a subset of the available fields. fieldlist is a concatenation of the two-letter (pseudo) field codes: TX (all titles), PY (pubdate, volume, issue, pages), AX (all authors), JO (all journal names), CK, and KW.

-s fieldlist

Select additional fields to display with the default xhtml output. fieldlist is a concatenation of the two-letter field codes of those fields which are not printed by default: N1, N2, NX, AB, AD, PB, CY, RP, SN, LX, U1-U5, and M1-M3.

-t input-type

Select the input data type. Possible values are "ris" (default) and "risx". Other data types have to be converted to one of these types before adding them to the database.

-U username

Provide a different username than that of the current user, so e.g. some technician or administrative staff can add references in behalf of a researcher.

file

All other command-line arguments will be interpreted as filenames to read references from. If no filenames are specified, the data will be read from stdin.

Example

	  refdbc: 
	  checkref -A xhtml -G /usr/local/share/refdb/css/refdb-frequency.css -E ISO-8859-1 -s KW foo.ris
	

This command adds the data in foo.ris to temporary tables in the current database, using the ISO-8859-1 encoding. The result of the duplicate checks is requested in xhtml format using a stylesheet that displays frequency information graphically. In addition to the default fields the keywords will be listed as well.

deletelink

Synopsis

deletelink [-d database] [-h] [[-c command] | [-o outfile] | [-O outfile]] {note-specifier} {link-target...}

Description

The deletelink command removes links from an extended note to one or more link targets.

You have to specify exactly one note on the command line, either by using the :NID: field selector to specify the note ID, or by using the :NCK: field selector to specify the note key. Then you need at least one link target. This can be one of :ID: (reference by ID), :CK: (reference by citation key), :AU: (author by name), :KW: (keyword by name), or one of :JF:, :JO:, :J1:, :J2: (periodical by full name, abbreviated name, or user abbreviations 1 and 2).

Options

-c command

Pipe the output through command.

-d database

Specify the database.

-h

Display a help message explaining the command.

-o filename

Write the output to filename instead of to stdout.

-O filename

Append the output to filename instead of sending it to stdout.

note-specifier

Specify one note by either its :NID: or its :NCK: value.

link-target

Specify one or more link targets by means of their :ID:, :CK:, :AU:, :KW:, :JF:, :JO:, :J1:, or :J2: values.

Example

	  refdbc: 
	  deletelink :NID:=12 :CK:=Miller1999 :KW:=biochemistry
	

This command will delete the links from the note carrying the ID 12 to a reference specified by its citation key "Miller1999" and to the keyword "biochemistry".

deletenote

Synopsis

deletenote [-d database] [-h] [[-c command] | [-o outfile] | [-O outfile]] {{ID...} | {-f infile}}

Description

Deletes the extended note with the identifier ID from the current database. Several extended notes may be specified in a single call of this command. Notes with consecutive ID values may be specified as ranges.

Caution

It is not possible to delete a note if it belongs to a different user.

Options

-c command

Pipe the output through command.

-d database

Specify the database.

-f infile

Read a list of NID values in the RIS format from infile.

-h

Display a help message explaining the command.

-o filename

Write the output to filename instead of to stdout.

-O filename

Append the output to filename instead of sending it to stdout.

NID

All other arguments are interpreted as a list of noteID values. Ranges may be used to specify consecutive NIDs. If neither NIDs nor an infile are provided, refdbc attempts to read the NIDs from stdin. You can ask refdbc to read NID values from stdin in addition to other NIDs by using the -f stdin option.

Example

	  refdbc: 
	  deletenote 3 5-10 26
	

This command will delete the extended notes with the ID values 3, 5 through 10, and 26.

deleteref

Synopsis

deleteref [-d database] [-h] [[-c command] | [-o outfile] | [-O outfile]] {{ ID ...} | {-f infile}}

Description

Deletes the reference with the identifier ID from the current database. Several references may be specified in a single call of this command. References with consecutive ID values may be specified as ranges.

Caution

It is not possible to delete a reference if it belongs to the personal reference list of more than one user.

If you're the only user of this reference and go ahead and delete it, all data saved in the specified references will be gone, so be careful with this command. Make sure you understand the difference between the deleteref command and the dumpref command. The former deletes the data, the latter deletes only your personal data associated with the specified references (the notes, availability, and reprint data) and removes your association with this reference. In other words, deleteref removes the reference from the database, whereas dumpref removes the reference from your personal reference list, leaving the remaining data for the other users of the database.

Options

-c command

Pipe the output through command.

-d database

Specify the database.

-f infile

Read a list of ID values in the RIS format from infile. This list may be the result of a previous getref command.

-h

Display a help message explaining the command.

-o filename

Write the output to filename instead of to stdout.

-O filename

Append the output to filename instead of sending it to stdout.

ID

All other arguments are interpreted as a list of ID values. Ranges may be used to specify consecutive IDs. If neither IDs nor an infile are provided, refdbc attempts to read the IDs from stdin. You can ask refdbc to read ID values from stdin in addition to other IDs by using the -f stdin option.

Example

	  refdbc: 
	  deleteref 3 5-10 26
	

This command will delete the references with the ID values 3, 5 through 10, and 26.

dumpref

Synopsis

dumpref [-b listname] [-d database] [-h] [[-c command] | [-o outfile] | [-O outfile]] {[ ID ...] | [-f file]...}

Description

Removes references from the specified personal reference list in the current database. If no personal reference list is specified, the default list (carrying the same name as your database username) will be used instead.

Options

-b listname

Use the personal reference list named listname.

-c command

Pipe the output through command.

-d database

Specify the database.

-f infile

Read a list of ID values in the RIS format from infile. This list may be the result of a previous getref command.

-h

Display a help message explaining the command.

-o filename

Write the output to filename instead of to stdout.

-O filename

Append the output to filename instead of sending it to stdout.

ID

All other arguments are interpreted as a list of ID values. Ranges may be used to specify consecutive IDs. If neither IDs nor an infile are provided, refdbc attempts to read the IDs from stdin. You can ask refdbc to read ID values from stdin in addition to other IDs by using the -f stdin option.

Example

	  refdbc: 
	  dumpref -f foo.ris 3 5-10 26
	

This command will remove the references 3, 5 through 10, and 26 as well as those listed in the file foo.ris from your personal reference list.

getau, geted, getas, getax

Synopsis

getau [-d database] [-h] [[-c command] | [-o outfile] | [-O outfile]] [-N limit[:offset]] [-s format] { unix-regexp }

geted [-d database] [-h] [[-c command] | [-o outfile] | [-O outfile]] [-N limit[:offset]] [-s format] { unix-regexp }

getas [-d database] [-h] [[-c command] | [-o outfile] | [-O outfile]] [-N limit[:offset]] [-s format] { regexp }

getas [-d database] [-h] [[-c command] | [-o outfile] | [-O outfile]] [-N limit[:offset]] [-s format] { regexp }

Description

Retrieve all author names that match the regular expression regexp in the current database. If no regexp argument is given, all author names will be listed, which may or may not be what you want. getau retrieves the primary authors which is the most common case if you want to locate a publication. geted and getas retrieve book or periodical editors and series authors, respectively. getax retrieves authors from any level.

Options

-c command

Pipe the output through command.

-d database

Specify the database.

-h

Display a help message explaining the command.

-N limit[:offset]

Limit the number of returned datasets. If limit is used all by itself, the first limit author names are returned. If the optional offset argument is used as well, the first offset author names will be skipped, and the next limit author names will be returned.

-o filename

Write the output to filename instead of to stdout.

-O filename

Append the output to filename instead of sending it to stdout.

-s format

Request additional frequency information. "freq" provides the absolute number of references that contain the given author. "relfreq" reports a relative frequency indicator as an integer between 0 and 10.

regexp

All other arguments are interpreted as a unix regular expression which limits the results to matching author names.

Note

Some database engines, like SQLite, do not support Unix-style regular expressions. Use SQL regular expressions instead.

Example

	  refdbc: 
	  getau -o authors.txt '^Simpson'
	

This command will write a list of all authors starting with “Simpson†to the file authors.txt.

	  refdbc: 
	  getau -N 5:10
	

This command prints the author names 11 through 15.

getjo, getjf, getj1, getj2

Synopsis

getjo [-a] [-d database] [-h] [[-c command] | [-o outfile] | [-O outfile]] [-N limit[:offset]] [-s format] { regexp }

getjf [-a] [-d database] [-h] [[-c command] | [-o outfile] | [-O outfile]] [-N limit[:offset]] [-s format] { regexp }

getj1 [-a] [-d database] [-h] [[-c command] | [-o outfile] | [-O outfile]] [-N limit[:offset]] [-s format] { regexp }

getj2 [-a] [-d database] [-h] [[-c command] | [-o outfile] | [-O outfile]] [-N limit[:offset]] [-s format] { regexp }

Description

Retrieve all journal names that match the regular expression regexp in the current database. The regexp will be matched to the journal abbreviation, the full name, the custom abbreviation 1, and the custom abbreviation 2, respectively. If no regexp argument is given, all available journal names will be listed.

Options

-a

Return all synonymous journal names, i.e. full name, abbreviation, custom abbreviation 1, and custom abbreviation 2. If the option is absent, only the name that you search for will be returned, e.g. only the full name in the case of getjf.

-c command

Pipe the output through command.

-d database

Specify the database.

-h

Display a help message explaining the command.

-N limit[:offset]

Limit the number of returned datasets. If limit is used all by itself, the first limit journal names are returned. If the optional offset argument is used as well, the first offset journal names will be skipped, and the next limit journal names will be returned.

-o filename

Write the output to filename instead of to stdout.

-O filename

Append the output to filename instead of sending it to stdout.

-s format

Request additional frequency information. "freq" provides the absolute number of references that contain the given journal name. "relfreq" reports a relative frequency indicator as an integer between 0 and 10.

regexp

All other arguments are interpreted as a unix regular expression which limits the results to matching journal names.

Note

Some database engines, like SQLite, do not support Unix-style regular expressions. Use SQL regular expressions instead.

Example

	  refdbc: 
	  getjo -a -o journals.txt '^J'
	

This command will list all synonyms of the journals whose abbreviations start with a capital J. The output will be redirected into the file journals.txt.

getkw

Synopsis

getkw [-d database] [-h] [[-c command] | [-o outfile] | [-O outfile]] [-N limit[:offset]] [-s format] { regexp }

Description

Retrieve all keywords that match the regular expression regexp in the current database. If no regexp argument is specified, all keywords in the database will be listed.

Options

-c command

Pipe the output through command.

-d database

Specify the database.

-h

Display a help message explaining the command.

-N limit[:offset]

Limit the number of returned datasets. If limit is used all by itself, the first limit keywords are returned. If the optional offset argument is used as well, the first offset keywords will be skipped, and the next limit keywords will be returned.

-o filename

Write the output to filename instead of to stdout.

-O filename

Append the output to filename instead of sending it to stdout.

-s format

Request additional frequency information. "freq" provides the absolute number of references that contain the given keyword. "relfreq" reports a relative frequency indicator as an integer between 0 and 10.

regexp

All other arguments are interpreted as a unix regular expression which limits the results to matching keywords.

Note

Some database engines, like SQLite, do not support Unix-style regular expressions. Use SQL regular expressions instead.

Examples

	  refdbc: 
	  getkw -o keywords.txt '^An.*l$'
	

This command will request a list of all keywords that start with “An†and end with the letter “lâ€, like “Animalâ€, and write the result to the file keywords.txt.

	  ~# 
	  refdbc -C getkw -s freq -c "sort -r|cut -d ':' -f 2"|less
	

Here we run the getkw command from the shell. The result list contains the frequency of each returned keyword. The data are sorted in descending order according to the frequency, and the frequency information itself is stripped off. Of course there is more than one way to arrive here. E.g. you could use the -c option to send the data to stdout and pipe them through the argument of the -c option in the example shown above.

getnote

Synopsis

getnote [-d database] [-E encoding] [-h] [[-c command] | [-o outfile] | [-O outfile]] [-N limit[:offset]] [-P] [-S sort-string] [-t output-type] {[ search-string ] | [-f file]}

Description

Displays all extended notes which match the search-string in the current database. Refer to the section The query language for a description of the syntax of a search string.

Options

-c command

Pipe the output through command.

-d database

Specify the database.

-E encoding

Select the character encoding for the output data if it is different from the database encoding. You can request any encoding that your local libiconv supports (see man iconv_open for a list of available encodings).

-f infile

Read the search string from infile. This is a simple way to re-run saved queries.

-h

Display a help message explaining the command.

-N limit[:offset]

Limit the number of returned datasets. If limit is used all by itself, the first limit extended notes are returned. If the optional offset argument is used as well, the first offset notes will be skipped, and the next limit notes will be returned.

-o filename

Write the output to filename instead of to stdout.

-O filename

Append the output to filename instead of sending it to stdout.

-P

Limit the search to the notes which were added by the current user. If this switch is absent, the whole database will be searched.

-S sort-string

Sort the output. Currently you can sort only by ID (the default) or by PY (publication year).

-t output-type

Select the type of output. Available are "scrn", "html", "xhtml", and "xnote" for a compact format suitable for terminal browsing, HTML, XHTML, or the native XML format, respectively.

search-string

The remainder of the arguments is interpreted as a search string. The syntax of the queries is described in the section query language.

Example

	  refdbc: 
	  getnote -t xnote :CK:=Miller1999
	

This command retrieves notes which are attached to the reference with the citation key "Miller1999" and displays them in the xnote format.

getref

Synopsis

getref [-b listname] [-d database] [-E encoding] [-h] [[-c command] | [-o outfile] | [-O outfile]] [-N limit[:offset]] [-s format-string] [-S sort-string] [-t output-format] {[ search-string ] | [-f file]}

Description

Displays all datasets which match the search-string in the current database. Refer to the section The query language for a description of the syntax of a search string. See the countref command if you want to know how many references match your current query without actually retrieving a possibly large amount of reference data.

Options

-b listname

Limit the search to the personal reference list named listname.

-c command

Pipe the output through command.

-d database

Specify the database.

-E encoding

Select the character encoding for the output data if it is different from the database encoding. You can request any encoding that your local libiconv supports (see man iconv_open for a list of available encodings).

-f infile

Read the search string from infile. This is a simple way to re-run saved queries.

-h

Display a help message explaining the command.

-N limit[:offset]

Limit the number of returned datasets. If limit is used all by itself, the first limit matching references are returned. If the optional offset argument is used as well, the first offset matching references will be skipped, and the next limit matching references will be returned.

-o filename

Write the output to filename instead of to stdout.

-O filename

Append the output to filename instead of sending it to stdout.

-s format-string

Specify additional fields and pseudo-fields (N1, N2/AB, NX, RP, SN, AD, CY, PB, LX, U1 through U5, M1 through M3) that are not displayed by default, except for the RIS and risx output formats. Use "ALL" as an argument to display all available fields. If several fields are specified, the argument has to be enclosed by single quotation marks. If applied to RIS output, you can specify ID as format-string to get only a list of ID values in RIS format for all references that match the search. This is a convenient way to generate ID lists for later operations like deleteref.

-S sort-string

Sort the output. Currently you can sort only by ID (the default) or by PY (publication year).

-t output-type

Select the type of output. Available are "scrn", "ris", "risx", "html", "xhtml", "db31", "db31x", "db50x, "teix", "tei5x", "mods", and "bibtex" for a compact format suitable for terminal browsing, the native RIS and risx (XML) formats, HTML, XHTML, DocBook SGML, DocBook XML (DTD-based), DocBook XML (schema-based), TEI P4 XML, TEI P5 XML, MODS, or BibTeX format, respectively.

search-string

The remainder of the arguments is interpreted as a search string. The syntax of the queries is described in the section query language.

Example

	  refdbc: 
	  getref -t ris -o temp.sgml -E ISO-8859-15 ":AU:='& ^Doe ^Jones' AND :KW:=circular\ dichroism"
	

This command retrieves articles with both an author starting with “Doe†and an author starting with “Jones†that have the keyword “circular dichroismâ€. The output will be saved in RIS format to the file temp.sgml using the character encoding ISO-8859-15.

help, ?

Synopsis

help

?

Description

Displays a brief summary of the available commands.

Note

This command is not available in the batch mode (use the -h option instead to review the command line usage).

Example

	  refdbc: 
	  help
	

This will list the available commands.

listdb

Synopsis

listdb [-h] [database-regexp]

Description

Lists all available databases if no argument is specified. If database-regexp is specified, only the databases matching this expression will be listed.

Options

-h

Displays a help message explaining the listdb command.

database-regexp

A valid SQL regular expression which limits the output to matching database names.

Example

	  refdbc: 
	  listdb db%
	

This command will list all available databases that start with “dbâ€.

liststyle

Synopsis

liststyle { style-regexp }

Description

Lists all available bibliography styles that match style-regexp.If no argument is specified, all available styles will be listed.

Options

-h

Displays a help message explaining the listdb command.

style-regexp

A valid Unix regular expression which limits the output to matching style names.

Note

Some database engines, like SQLite, do not support Unix-style regular expressions. Use SQL regular expressions instead.

Example

	  refdbc: 
	  liststyle ^J.*
	

This will list all bibliography styles that start with a capital “Jâ€.

pickref

Synopsis

pickref [-b listname] [-d database] [-h] [[-c command] | [-o outfile] | [-O outfile]] {[ID...] | [-f file]}

Description

Adds references to the specified personal reference list in the current database. If no personal reference list is specified, the default list (carrying the same name as your database username) will be used instead.

Options

-b listname

Use the personal reference list named listname.

-c command

Pipe the output through command.

-d database

Specify the database.

-f infile

Read a list of ID values in the RIS format from infile. This list may be the result of a previous getref command.

-h

Display a help message explaining the command.

-o filename

Write the output to filename instead of to stdout.

-O filename

Append the output to filename instead of sending it to stdout.

ID

All other arguments are interpreted as a list of ID values. Ranges may be used to specify consecutive IDs. If neither IDs nor an infile are provided, refdbc attempts to read the IDs from stdin. You can ask refdbc to read ID values from stdin in addition to other IDs by using the -f stdin option.

Example

	  refdbc: 
	  pickref -f foo.ris 3 5-10 26
	

This command will add the references 3, 5 through 10, and 26 as well as those listed in the file foo.ris to your personal reference list.

countnote

Synopsis

countnote [-b listname] [-c command] [-d database] [-h] [-N limit[:offset]] {[ search-string ] | [-f file]}

Description

Counts all extended notes which match the search-string in the current database. Refer to the section The query language for a description of the syntax of a search string. This command is equivalent to the getnote command except that it does not return the matching notes. It just counts them.

Options

-b listname

Limit the search to the personal reference list named listname.

-c command

Pipe the output through command.

-d database

Specify the database.

-f infile

Read the search string from infile. This is a simple way to re-run saved queries.

-h

Display a help message explaining the command.

-N limit[:offset]

Limit the number of returned datasets. If limit is used all by itself, the first limit matching references are returned. If the optional offset argument is used as well, the first offset matching references will be skipped, and the next limit matching references will be returned.

search-string

The remainder of the arguments is interpreted as a search string. The syntax of the queries is described in the section query language.

Example

	  refdbc: 
	  countnote :KW:~[rR]eview
	

This command looks for extended notes that are linked to references which contain keywords like "review" or "Review". The command will return the number of matching notes in the result summary.

countref

Synopsis

countref [-b listname] [-c command] [-d database] [-h] [-N limit[:offset]] {[ search-string ] | [-f file]}

Description

Counts all datasets which match the search-string in the current database. Refer to the section The query language for a description of the syntax of a search string. This command is equivalent to the getref command except that it does not return the matching references. It just counts them.

Options

-b listname

Limit the search to the personal reference list named listname.

-c command

Pipe the output through command.

-d database

Specify the database.

-f infile

Read the search string from infile. This is a simple way to re-run saved queries.

-h

Display a help message explaining the command.

-N limit[:offset]

Limit the number of returned datasets. If limit is used all by itself, the first limit matching references are returned. If the optional offset argument is used as well, the first offset matching references will be skipped, and the next limit matching references will be returned.

search-string

The remainder of the arguments is interpreted as a search string. The syntax of the queries is described in the section query language.

Example

	  refdbc: 
	  countref ":AU:='& ^Doe ^Jones' AND :KW:=circular\ dichroism"
	

This command looks for articles with both an author starting with “Doe†and an author starting with “Jones†that have the keyword “circular dichroismâ€. The command will return the number of matching references in the result summary.

selectdb

Synopsis

selectdb [-h] { database }

Description

Select database as the current database. This current database will be used in all queries unless you specify a different database with the -d option of the query commands.

Note

This command is not available in the batch mode. Use the -d command line option instead.

Options

-h

Display a help message explaining the command.

database

The name of the database to be selected.

Example

	  refdbc: 
	  selectdb db1
	

This command will make the database db1 the active database. All further queries and operations will affect this database.

set

Synopsis

set [-h] [varname] [varvalue]

Description

The set command displays or modifies the values of configuration variables.

If you call set without any arguments, it will display a list of all configuration variables with their current values.

If you call set with one argument, it will display the value of this particular variable.

If you call set with two arguments, it will set the variable (first argument) to the new value (second argument). To specify an empty value, use two quotation marks like this:"".

Note

For obvious reasons, set will never display the current password although you can certainly change the password with this command. To make sure no one else sees the new password that you enter, run the command set passwd *. You will then be asked to enter a password which will not be echoed on the screen.

This command is not available in batch mode, use the command line switches instead. In the interactive mode, the changes to the configuration variables are limited to the current session. If you want to change the values permanently, you should rather edit one of the configuration files.

Options

-h

Displays a help message explaining the set command.

varname

The name of the variable whose value should be displayed or set.

varvalue

The new value of the variable to be set.

Example

	  refdbc: 
	  set timeout 90
	

This command will set the timeout to 90 seconds for the current session.

updatejo

Synopsis

updatejo [-d database] [-h] [[-c command] | [-o outfile] | [-O outfile]] {:XY:=name} {:XY:=name...}

Description

Updates the list of synonyms of a particular periodical.

Each periodical can have up to four synonymous names. The full name and an official abbreviation (e.g. according to the Index Medicus for biomedical publications) should always be supplied if available. In addition, refdb can store up to two user-defined abbreviations which may serve as shorthands when adding datasets.

Options

-c command

Pipe the output through command.

-d database

Specify the database.

-h

Display a help message explaining the command.

-o filename

Write the output to filename instead of to stdout.

-O filename

Append the output to filename instead of sending it to stdout.

:XY:=name

XY stands for one of JF, JO, J1, or J2 which denote the full name, the abbreviated name, and the user abbreviations 1 and 2, respectively. You have to supply at least two of these items. The first one selects the periodical by one of its existing names in the database. All other items update or add the names as provided.

Example

	  refdbc: 
	  updatejo :JO:="J.Biol.Chem." :JF:="The Journal of Biological Chemistry"
	

Adds (or changes) the full name of the periodical known by its official abbreviation as "J.Biol.Chem." to read "The Journal of Biological Chemistry".

updatenote

Synopsis

updatenote [-d database] [-E encoding] [-h] [[-c command] | [-o outfile] | [-O outfile]] [file...]

Description

Updates the extended notes in file in the current database.

This command is essentially the same as addnote, but it uses the citekey or id attributes (in this order) to update an existing note in the database. If the specified note does not exist in the database, a new one will be created.

Options

-c command

Pipe the output through command.

-d database

Specify the database.

-E encoding

Select the character encoding for the input data if it is different from the default UTF-8.

-h

Display a help message explaining the command.

-o filename

Write the output to filename instead of to stdout.

-O filename

Append the output to filename instead of sending it to stdout.

Example

	  refdbc: 
	  updatenote foo.xml
	

This command will update the extended notes in foo.ris in the currently selected database. If the notes do not specify a date, refdbd will insert a timestamp automatically.

updateref

Synopsis

updateref [-d database] [-E encoding] [-h] [[-c command] | [-o outfile] | [-O outfile]] [-t type] [-P] [-U username] [file]

Description

Updates the references in RIS format in file in the current database.

This command is essentially the same as addref, but it uses the ID fields in the input data to update existing references with the same ID. If the ID of a reference is not existent in the database, a new entry is created, ignoring the ID specified in the RIS or risx file. Currently refdb does not check whether the new dataset has any similarity with the old one having the same ID. If you tell refdb to update a reference, it uses whatever you send to this end.

Options

-c command

Pipe the output through command.

-d database

Specify the database.

-E encoding

Select the character encoding for the input data if it is different from the default setting. RIS datasets can use any encoding that your local libiconv supports (see man iconv_open for a list of available encodings), except UTF-16 and UTF-32. RISX datasets carry the encoding in the processing instructions, therefore this option is not needed and ignored.

-h

Display a help message explaining the command.

-o filename

Write the output to filename instead of to stdout.

-O filename

Append the output to filename instead of sending it to stdout.

-t type

Select the input data type. Possible values are "ris" (default) and "risx". Other data types have to be converted to one of these types before adding them to the database.

-P

Update only the personal information for this reference, i.e. the N1 (notes), RP (reprint status), and AV (availability) fields. This will automatically add the reference to your personal reference list. All other fields will be ignored. Combine this option with the -g option e.g. to quickly change the reprint status of existing references to “IN FILE†from “NOT IN FILE†or from “ON REQUESTâ€.

-U username

Provide a different username than that of the current user, so e.g. some technician or administrative staff can add references in behalf of a researcher.

file

All other command-line arguments will be interpreted as filenames to read references from. If no filenames are specified, the data will be read from stdin.

Example

	  refdbc: 
	  updateref -P foo.ris
	

This command will update the references in foo.ris in the previously selected active database. Only the personal information (AV, N1, RP) will be added or modified for the current user.

verbose

Synopsis

verbose [-h]

Description

Toggles the verbose mode on or off. If the verbose mode is on, the error messages and warnings may be some more comprehensible.

Options

-h

Displays a help message explaining the verbose command.

Example

	  refdbc: 
	  verbose
	

Depending on the previous value, this command will either turn the verbose mode on or off.

whichdb

Synopsis

whichdb [-h]

Description

Displays a plethora of information about the currently selected database.

Options

-h

Displays a help message explaining the whichdb command.

Example

	  refdbc: 
	  whichdb
	

This will print the information about the active database. Refer to the selectdb command for information how to change the active database. The whichdb output looks like this:

Current database: alltypes
Number of references: 45
Highest reference ID: 45
Number of notes: 2
Highest note ID: 2
Encoding: ISO-8859-1
Database type: risx
Server type: pgsql
Created: 2003-12-24 22:27:43 UTC
Using refdb version: 0.9.4-pre2
Last modified: 2003-12-24 22:29:05 UTC
	

Files

PREFIX/etc/refdb/refdbcrc

The global configuration file of refdbc.

$HOME/.refdbcrc

The user configuration file of refdbc.

See also

RefDB (7), refdbd (1), refdba (1).

RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html

RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html>

RefDB on the web <http://refdb.sourceforge.net/>

Author

refdbc was written by Markus Hoenicka <markus@mhoenicka.de>.

refdb-1.0.2/doc/refdb-manual/re12.html000644 001750 001750 00000050434 12255431217 020213 0ustar00markusmarkus000000 000000 bib2ris

Name

bib2ris, bib2ris-utf8 — converts bibtex bibliographic data to the RIS format

Synopsis

bib2ris [-e log-destination] [-h ] [-j ] [-l log-level] [-L log-file] [-q ] [-s separator] [-v ] [-y confdir] file

bib2ris-utf8 [-e log-destination] [-h ] [-j ] [-l log-level] [-L log-file] [-q ] [-s separator] [-v ] [-y confdir] file

Description

bib2ris converts BibTeX bibliography files into RIS files. Latex commands, including non-ASCII characters written as commands, are preserved in the output. Importing the output of the bib2ris utility directly into RefDB is useful only if you use the data exclusively for LaTeX.

bib2ris-utf8 is a variant which converts foreign characters to UTF-8 and strips all other LaTeX commands by means of the refdb_latex2utf8txt (1) tool. The output of bib2ris-utf8 is the preferred format for import into RefDB as it is suitable for both LaTeX and SGML/XML bibliographies.

Unfortunately the concepts underlying BibTeX and RIS bibliographic data are quite different so that BibTeX data do not readily lend themselves to a clean conversion to the RIS format. This is not meant as an excuse to provide a bad filter but you should be aware that a few compile-time assumptions have to be made in order to get reasonable results. In any case, as the data models differ considerably, a loss-free round-trip conversion between the two data types is not possible: If you convert a BibTeX bibliography file to RIS and then back, the result will differ considerably from your input.

The following considerations apply to the data import into RefDB and the data export from RefDB:

  1. BibTeX input data that are not written in UTF-8, that use formatting commands like font name, weight, or posture specifications, or that use LaTeX commands to write foreign and special characters should always be converted with bib2ris-utf8.

  2. BibTeX output data will have the LaTeX command characters properly escaped. The data will use the default encoding of your reference database unless you specifically request a different encoding with the getref command or with the refdbib tool. Keep in mind that recent LaTeX installations can work with UTF-8 data using the following incantation in the prolog, allowing the easiest support for all kinds of foreign characters:

    \usepackage[utf8]{inputenc}
    	

Options

-e log-destination

log-destination can have the values 0, 1, or 2, or the equivalent strings stderr, syslog, or file, respectively. This value specifies where the log information goes to. 0 (zero) means the messages are sent to stderr. They are immediately available on the screen but they may interfere with command output. 1 will send the output to the syslog facility. Keep in mind that syslog must be configured to accept log messages from user programs, see the syslog(8) man page for further information. Unix-like systems usually save these messages in /var/log/user.log. 2 will send the messages to a custom log file which can be specified with the -L option.

-h

Displays help and usage screen, then exits.

-j

Force bib2ris to use JO RIS fields in all cases. If this option is not used, bib2ris tries to infer whether a journal name is an abbreviation or not. If the string contains at least one period, JO will be used, otherwise JF will be used.

-l log-level

Specify the priority up to which events are logged. This is either a number between 0 and 7 or one of the strings emerg, alert, crit, err, warning, notice, info, debug, respectively (see also Log level definitions). -1 disables logging completely. A low log level like 0 means that only the most critical messages are logged. A higher log level means that less critical events are logged as well. 7 will include debug messages. The latter can be verbose and abundant, so you want to avoid this log level unless you need to track down problems.

-L log-file

Specify the full path to a log file that will receive the log messages. Typically this would be /var/log/refdba.

-q

Start without reading the configuration files. The client will use the compile-time defaults for all values that you do not set with command-line switches.

-s separator

Specify the delimiter which separates individual keywords in a non-standard keyword field. Use the string spc for whitespace-separated lists (spaces and tabs).

-v

Prints version and copyright information, then exits.

-y confdir

Specify the directory where the global configuration files are Note: By default, all RefDB applications look for their configuration files in a directory that is specified during the configure step when building the package. That is, you don't need the -y option unless you use precompiled binaries in unusual locations, e.g. by relocating a rpm package.

file

If used, this parameter denotes the names of one or more bibtex files. If no file is specified, bib2ris tries to read the data from stdin. Output is always sent to stdout.

Diagnostics

The exit code of bib2ris indicates what went wrong in general (the details can be found in the log output). The code is the sum of the following error values:

1

general error; includes out of memory situations and invalid command-line options

2

incomplete entry (at least one essential field in an entry was missing)

4

unknown field name

8

unknown publication type

16

invalid BibTeX->RIS type mapping

32

parse error; includes file access errors

Configuration

bib2ris evaluates the file bib2risrc to initialize itself.

Table 14.2. bib2risrc

VariableDefaultComment
logfile/var/log/bib2ris.logThe full path of a custom log file. This is used only if logdest is set appropriately.
logdest1The destination of the log information. 0 = print to stderr; 1 = use the syslog facility; 2 = use a custom logfile. The latter needs a proper setting of logfile.
loglevel6The log level up to which messages will be sent. A low setting (0) allows only the most important messages, a high setting (7) allows all messages including debug messages. -1 means nothing will be logged.
abbrevfirsttIf this option is set to "t", the first names of all authors and editors will be abbreviated to the initials. If set to "f", the first names will be used as they are found in the BibTeX bibliography file.
listsep;This is the delimiter which separates individual keywords in a non-standard keyword field. Use the string "spc" for whitespace-separated lists (spaces and tabs).
forcejabbrevfIf this is set to "t", journal names will be wrapped in RIS "JO" entries. If it is set to "f", bib2ris will use "JO" entries only if the journal name contains at least one period, otherwise it will use "JF".
maparticleJOURmap the BibTeX article publication type to a RIS type
mapbookBOOKmap the BibTeX book publication type to a RIS type
mapbookletPAMPmap the BibTeX booklet publication type to a RIS type
mapconferenceCHAPmap the BibTeX conference publication type to a RIS type
mapinbookCHAPmap the BibTeX inbook publication type to a RIS type
mapincollectionCHAPmap the BibTeX incollection publication type to a RIS type
mapinproceedingsCHAPmap the BibTeX inproceedings publication type to a RIS type
mapmanualBOOKmap the BibTeX manual publication type to a RIS type
mapmastersthesisTHESmap the BibTeX mastersthesis publication type to a RIS type
mapmiscGENmap the BibTeX misc publication type to a RIS type
mapphdthesisTHESmap the BibTeX phdthesis publication type to a RIS type
mapproceedingsCONFmap the BibTeX proceedings publication type to a RIS type
maptechreportRPRTmap the BibTeX techreport publication type to a RIS type
mapunpublishedUNPBmap the BibTeX unpublished publication type to a RIS type
nsf_xyz(none)You can specify an unlimited number of these entries to map non-standard BibTeX fields to RIS tags. The BibTeX field name in this variable has to be in lowercase, regardless of the case in your input data (bib2ris treats field names as case-insensitive). The two-letter RIS tag has to be in uppercase. E.g. to map your BibTeX "Abstract" field to the RIS "N2" tag, the entry would read: "nsf_abstract N2".

Data Processing

This section provides a few hints about the data conversion itself and the BibTeX format requirements.

  • The parsing of the input data is done by the btparse library. All limitations of that library apply to bib2ris as well. This applies very specifically to two hardcoded settings in btparse which, simply put, limit the size and complexity (in terms of macros) of an input file that btparse can handle. If you run into this kind of problem (I had to pull a 2 MB BibTeX bibliography from the net in order to verify this limit) you should increase the values of NUM_MACROS and STRING_SIZE in the source file macros.c and recompile the btparse library.

  • All entry names and field names in the BibTeX input file are treated as case-insensitive, i.e. "BoOk" is the same as "book" and "AUTHOR" is the same as "aUthoR".

  • The entries are checked for completeness. An error is generated if an entry lacks fields which are considered essential for the particular publication type.

  • Non-standard fields can be imported in addition to the predefined BibTeX fields. Create an entry for each non-standard BibTeX field name that your input data use in your bib2ris configuration file. The data are handled differently based on the type of RIS field they are imported to. If the data are imported to the RIS fields AD, N1, or N2, which basically have an unlimited size, all occurrences of these fields will be concatenated into a single AD, N1, or N2 tag line, respectively. If the data are mapped to the RIS KW field, the string will be tokenized based on the list separator specified in the listsep configuration variable. Each token will be written as a separate KW tag line. A special case is the RIS pseudo-field "PY.day". Data imported to this tag are integrated as the day part in the publication date tag line "PY" (year and month, but not day, are standard BibTeX fields and are recognized by default). All other fields will be printed with their requested RIS tag. It is at the discretion of any RIS importing application to decide what to do with duplicate tag lines. Multiples are allowed for author tags (AU, A2, A3) and the keyword tag (KW). refdb will use the last occurrence of a tag line that does not allow multiple occurrences.

  • Abbreviated journal names are detected only if they use periods. E.g. “J. Biol. Chem.†will be mapped to a "JO" RIS element whereas “J Biol Chem†will be (incorrectly) mapped to a "JF" element (“Journal of Biological Chemistry†would correctly end up here too). Spaces after periods are optional. To capture “J Biol Chem†in a "JO" element, use the -j command line option or the "forcejabbrev" configuration file variable.

  • The mapping of BibTeX publication types (book, inproceedings...) to RIS types as specified in the configuration file is checked for valid RIS types. If an invalid RIS type is specified, an error is generated and the compile-time default is used instead.

  • By default the first names of authors and editors are not abbreviated. If you wish you can configure bib2ris to abbreviate first and middle names.

Files

PREFIX/etc/refdb/bib2risrc

The global configuration file of bib2ris.

$HOME/.bib2risrc

The user configuration file of bib2ris.

See also

RefDB (7), refdb_latex2utf8txt (1), db2ris (1), en2ris (1), marc2ris (1), med2ris (1).

RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html

RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html>

RefDB on the web <http://refdb.sourceforge.net/>

Author

bib2ris was written by Markus Hoenicka <markus@mhoenicka.de>.

refdb-1.0.2/doc/refdb-manual/re13.html000644 001750 001750 00000030721 12255431217 020211 0ustar00markusmarkus000000 000000 db2ris

Name

db2ris — converts DocBook bibliographic data to the RIS format

Synopsis

db2ris [-a ] [-e log-destination] [-h ] [-L log-file] [-o file] [-O file] [-r reftype] file

Description

db2ris converts DocBook bibliographic data into RIS files. The design and purpose of the DocBook bibliography information is too different from the RIS format to warrant a simple and straightforward conversion, let alone a bi-directional one. The DocBook bibliography definition allows for a lot of freedom how to encode your information. To accommodate as wide a range of uses and abuses of the bibliographic elements as possible, this import filter is implemented as a DSSSL stylesheet rather than as a C application. This allows you to quickly change or extend the stylesheet to adapt it to your needs. db2ris is a wrapper script which invokes OpenJade to do the actual transformation.

Options

-a

Use full first- and othernames if they are present in the DocBook source. By default, all first- and othernames will be abbreviated.

-e log-destination

log-destination can have the values 0, 1, or 2, or the equivalent strings stderr, syslog, or file, respectively. This value specifies where the log information goes to. 0 (zero) means the messages are sent to stderr. They are immediately available on the screen but they may interfere with command output. 1 will send the output to the syslog facility. Keep in mind that syslog must be configured to accept log messages from user programs, see the syslog(8) man page for further information. Unix-like systems usually save these messages in /var/log/user.log. 2 will send the messages to a custom log file which can be specified with the -L option.

-h

Displays help and usage screen, then exits.

-L log-file

Specify the full path to a log file that will receive the log messages. Typically this would be /var/log/refdba.

-o file

Send output to file instead of to stdout. If file exists, its contents will be overwritten.

-O file

Send output to file instead of to stdout. If file exists, the output will be appended.

-r reftype

Set the default RIS reference type. This type will be used if db2ris cannot infer the reference type from the BiblioEntry element.

file

The names of one or more DocBook files.

Configuration

db2ris evaluates the file db2risrc to initialize itself.

Table 14.3. db2risrc

VariableDefaultComment
logfile/var/log/db2ris.logThe full path of a custom log file. This is used only if logdest is set appropriately.
logdest0The destination of the log information. 0 = print to stderr; 2 = use a custom logfile. The latter needs a proper setting of logfile.
authorlongfSet this to t if full first- and othernames should be used if possible.
defaultreftypeGENThe default RIS reference type will be used if a BiblioEntry element does not specify the type.

Data Processing

We have to make a bunch of assumptions to arrive at a suitable output:

  • db2ris will handle only “raw†(as opposed to “cookedâ€) bibliographic data. This basically means that you must encode all bibliographic data in BiblioEntry elements, not in BiblioMixed elements.

  • db2ris discards all publication date information from the PubDate except the first 4 characters of #PCDATA so these should better be a 4-digit year.

  • By default, the publication type is neither explicitly encoded in a BiblioEntry element nor can it be easily inferred. Therefore db2ris assumes that the BiblioEntry carry a role attribute with the RIS publication type as the value. If the attribute is missing, a default type is used instead. This means that you should add these attributes before the conversion in order to get useful RIS datasets (or fix the TY entries in the RIS file afterwards).

  • DocBook does not have a special element to encode the name of a journal or magazine that published an article. Instead the same Title element is used as for the article title, a book title, or a series title. To distinguish between a journal or magazine name and “real†titles, the Title element encoding the journal name is assumed to be nested in a BiblioSet whose relation attribute is set to “journalâ€, “pubâ€, “abbrevâ€, or “full†(this more or less arbitrary list can of course be extended or changed, see below). The values “abbrev†and “full†furthermore decide whether the RIS tag “JO†or “JF†will be used.

Modifying db2ris

As previously stated, db2ris is implemented as a DSSSL stylesheet that can be easily and quickly adapted to your needs. It may be prudent to create copies of the script and modify these in order to adapt them for particular “abuses†of the DocBook bibliographic elements in various documents or data sources. This section briefly lists the functions which you would most likely want to change.

reftype-heuristic

This function attempts to infer the correct RIS publication type.

titletype-heuristic

This function gives a hint whether a Title element is used as a journal/magazine name or as an article title or book title.

process-date

This function creates a valid string for the RIS PY tag from the PubDate element.

Files

PREFIX/etc/refdb/db2risrc

The global configuration file of db2ris.

$HOME/.db2risrc

The user configuration file of db2ris.

See also

RefDB (7), bib2ris (1), en2ris (1), marc2ris (1), med2ris (1).

RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html

RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html>

RefDB on the web <http://refdb.sourceforge.net/>

Author

db2ris was written by Markus Hoenicka <markus@mhoenicka.de>.

refdb-1.0.2/doc/refdb-manual/re14.html000644 001750 001750 00000026037 12255431217 020217 0ustar00markusmarkus000000 000000 en2ris

Name

en2ris — converts EndNote bibliographic data to the RIS format

Synopsis

en2ris [-e logdest] [-f from-encoding] [-h ] [-l loglevel] [-L logfile] [-o file] [-O file] [-q ] [-t to-encoding] [-y path]

Description

en2ris fixes the markup errors encountered in EndNote "RIS" output and writes RIS output to stdout.

Options

-e log-destination

log-destination can have the values 0, 1, or 2, or the equivalent strings stderr, syslog, or file, respectively. This value specifies where the log information goes to. 0 (zero) means the messages are sent to stderr. They are immediately available on the screen but they may interfere with command output. 1 will send the output to the syslog facility. Keep in mind that syslog must be configured to accept log messages from user programs, see the syslog(8) man page for further information. Unix-like systems usually save these messages in /var/log/user.log. 2 will send the messages to a custom log file which can be specified with the -L option.

-f from-encoding

Select the input character encoding. Supported encodings are platform-dependent and can usually be found in iconv_open(3). If no encodings are specified, ISO-8859-1 aka Latin-1 is assumed.

-h

Displays help and usage screen, then exits.

-l log-level

Specify the priority up to which events are logged. This is either a number between 0 and 7 or one of the strings emerg, alert, crit, err, warning, notice, info, debug, respectively (see also Log level definitions). -1 disables logging completely. A low log level like 0 means that only the most critical messages are logged. A higher log level means that less critical events are logged as well. 7 will include debug messages. The latter can be verbose and abundant, so you want to avoid this log level unless you need to track down problems.

-L log-file

Specify the full path to a log file that will receive the log messages. Typically this would be /var/log/refdba.

-o file

Send output to file. If file exists, its contents will be overwritten.

-O file

Send output to file. If file exists, the output will be appended.

-q

Start without reading the configuration files. The client will use the compile-time defaults for all values that you do not set with command-line switches.

-t to-encoding

Select the output character encoding. Supported encodings are platform-dependent and can usually be found in iconv_open(3). If no encodings are specified, UTF-8 is assumed.

-y confdir

Specify the directory where the global configuration files are Note: By default, all RefDB applications look for their configuration files in a directory that is specified during the configure step when building the package. That is, you don't need the -y option unless you use precompiled binaries in unusual locations, e.g. by relocating a rpm package.

Configuration

en2ris evaluates the file en2risrc to initialize itself.

Table 14.4. en2risrc

VariableDefaultComment
outfile(none)The default output file name.
outappendtDetermines whether output is appended (t) to an existing file or overwrites (f) an existing file.
from_encISO-8859-1The character encoding of the input data
to_encISO-8859-1The character encoding of the output data
logfile/var/log/med2ris.logThe full path of a custom log file. This is used only if logdest is set appropriately.
logdest1The destination of the log information. 0 = print to stderr; 1 = use the syslog facility; 2 = use a custom logfile. The latter needs a proper setting of logfile.
loglevel6The log level up to which messages will be sent. A low setting (0) allows only the most important messages, a high setting (7) allows all messages including debug messages. -1 means nothing will be logged.

Data Processing

en2ris fixes a couple of problems found in RIS data exported from EndNote. The main issues are the incomplete date formats, the export of page ranges into a single "SP" tag line, and the export of keywords as a list into a single "KW" tag line.

en2ris does not validate the input files. That is, the input files must stick to the rules of the data sources, otherwise the conversion results are not predictable.

Files

PREFIX/etc/refdb/en2risrc

The global configuration file of en2ris.

$HOME/.en2risrc

The user configuration file of en2ris.

See also

RefDB (7), bib2ris (1), db2ris (1), marc2ris (1), med2ris (1).

RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html

RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html>

RefDB on the web <http://refdb.sourceforge.net/>

Author

en2ris was written by Markus Hoenicka <markus@mhoenicka.de>.

refdb-1.0.2/doc/refdb-manual/re15.html000644 001750 001750 00000034752 12255431217 020223 0ustar00markusmarkus000000 000000 marc2ris

Name

marc2ris — converts MARC bibliographic data to the RIS format

Synopsis

marc2ris [-e log-destination] [-h ] [-l log-level] [-L log-file] [-m ] [-o outfile] [-O outfile] [-t input_type] [-u t|f] file

Description

marc2ris attempts to extract the information useful to RefDB from MARC datasets. MARC (Machine Readable Catalogue Format) is a standard originating from the 1960s and is widely used by libraries and bibliographic agencies. Most libraries that offer Z39.50 access can provide the records in at least one MARC format (like with most other "standards" there's a couple to choose from). Currently the following MARC dialects are supported:

MARC21

This is an attempt to consolidate existing MARC variants (mainly USMARC and CANMARC) and will most likely be the format supported by all libraries in the near future. The format is described on the Library of Congress MARC pages.

UNIMARC

This is the European equivalent of a standardization attempt. The specification can be found here.

UKMARC

This format is fairly close to the USMARC variant and is mainly used by libraries in the United Kingdom and in Ireland. Libraries supporting this format may switch to MARC21 in the future. Unfortunately there is no online description of this format, but this PDF document describes the main differences between USMARC and UKMARC.

Options

By default the script reads USMARC data from stdin and sends RIS data to stdout.

-e log-destination

log-destination can have the values 0, 1, or 2, or the equivalent strings stderr, syslog, or file, respectively. This value specifies where the log information goes to. 0 (zero) means the messages are sent to stderr. They are immediately available on the screen but they may interfere with command output. 1 will send the output to the syslog facility. Keep in mind that syslog must be configured to accept log messages from user programs, see the syslog(8) man page for further information. Unix-like systems usually save these messages in /var/log/user.log. 2 will send the messages to a custom log file which can be specified with the -L option.

-h

Displays help and usage screen, then exits.

-l log-level

Specify the priority up to which events are logged. This is either a number between 0 and 7 or one of the strings emerg, alert, crit, err, warning, notice, info, debug, respectively (see also Log level definitions). -1 disables logging completely. A low log level like 0 means that only the most critical messages are logged. A higher log level means that less critical events are logged as well. 7 will include debug messages. The latter can be verbose and abundant, so you want to avoid this log level unless you need to track down problems.

-L log-file

Specify the full path to a log file that will receive the log messages. Typically this would be /var/log/refdba.

-m

Switch on additional MARC output. The output data will be the RIS output interspersed with the source MARC data used to generate the output. This is useful to fix conversion errors manually.

-o file

Send output to file. If file exists, its contents will be overwritten.

-O file

Send output to file. If file exists, the output will be appended.

-t input_type

Specify the MARC input type. The default is MARC21. Other available types are UNIMARC and UKMARC.

-u t|f

Request Unicode output if set to "t" (this is the default). marc2ris attempts to convert the input data into Unicode (unless the dataset explicitly states that it already uses Unicode). If the conversion does not seem to work, set this to "f" as some MARC variants do not state the character encoding explicitly.

Configuration

marc2ris evaluates the file marc2risrc to initialize itself.

Table 14.5. marc2risrc

VariableDefaultComment
outfile(none)The default output file name.
outappendtDetermines whether output is appended (t) to an existing file or overwrites (f) an existing file.
unmappedtIf set to t, unknown tags in the input data will be output following a <unmapped> tag; the resulting data can be inspected and then be sent through sed to strip off these additional lines. If set to f, unknown tags will be gracefully ignored.
logfile/var/log/med2ris.logThe full path of a custom log file. This is used only if logdest is set appropriately.
logdest1The destination of the log information. 0 = print to stderr; 1 = use the syslog facility; 2 = use a custom logfile. The latter needs a proper setting of logfile.
loglevel6The log level up to which messages will be sent. A low setting (0) allows only the most important messages, a high setting (7) allows all messages including debug messages. -1 means nothing will be logged.

Data Processing

The purpose of the MARC format is entirely different from the purpose of the RIS format, so you shouldn't be too surprised that the import of MARC data is somewhat rough at the edges. The filter apparently deals fine with quite a lot of datasets, but the following shortcomings are known (and more are likely to be discovered by the interested reader):

  • Some fields, like 846, are currently ignored completely. This, of course, is bound to change.

  • Author names specified in the natural order, i.e. something like First Middle Last, are not normalized due to the problems with multiple middle or last names. Author names in the inverse order, i.e. something like Last, First Middle, are normalized correctly in most cases. Handling of non-European names is a matter of trial and error.

  • Character set handling is somewhat limited. Only the unaltered input character encoding or UTF-8 are available for the output data.

That said, there is still some hope. The -m command line option switches on additional MARC output. That is, the generated output will contain interspersed lines that show the contents of the original MARC fields used to generate the following RIS line or lines. For example, the following output snippet shows how marc2ris generated the author lines from the MARC input:

<marc>empty author field (100)
<marc>:Author(Ind1): 1
<marc>:Author($a): Ershov, A. P.
<marc>:Author($b): 
<marc>:Author($c): 
<marc>:Author(Ind1): 1
<marc>:Author($a): Knuth, Donald Ervin,
<marc>:Author($b): 
<marc>:Author($c): 
AU  - Ershov,A.P.
AU  - Knuth,Donald Ervin

If you feel marc2ris does not translate your data appropriately, the easiest way might be to use the -m switch and redirect the output into a file. Then you can analyze the situation and fix the RIS lines as you see fit. Finally you can strip the MARC lines off with a command like:

~$ grep -v "<marc>" < withmarc.ris > womarc.ris

Files

PREFIX/etc/refdb/marc2risrc

The global configuration file of marc2ris.

$HOME/.marc2risrc

The user configuration file of marc2ris.

See also

RefDB (7), bib2ris (1), db2ris (1), en2ris (1), med2ris (1).

RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html

RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html>

RefDB on the web <http://refdb.sourceforge.net/>

Author

marc2ris was written by Markus Hoenicka <markus@mhoenicka.de>.

refdb-1.0.2/doc/refdb-manual/re16.html000644 001750 001750 00000030405 12255431220 020205 0ustar00markusmarkus000000 000000 med2ris

Name

med2ris — converts Medline/Pubmed bibliographic data to the RIS format

Synopsis

med2ris [-e logdest] [-f from-encoding] [-h ] [-i ] [-l loglevel] [-L logfile] [-o file] [-O file] [-q ] [-t to-encoding] [-T type] [-y path]

Description

med2ris converts Pubmed reference data into RIS data. The converter understands both the tagged Pubmed format (which superficially resembles RIS) and the XML format according to the PubMedArticle DTD. In most cases med2ris is able to automatically detect the input data type.

Options

-e log-destination

log-destination can have the values 0, 1, or 2, or the equivalent strings stderr, syslog, or file, respectively. This value specifies where the log information goes to. 0 (zero) means the messages are sent to stderr. They are immediately available on the screen but they may interfere with command output. 1 will send the output to the syslog facility. Keep in mind that syslog must be configured to accept log messages from user programs, see the syslog(8) man page for further information. Unix-like systems usually save these messages in /var/log/user.log. 2 will send the messages to a custom log file which can be specified with the -L option.

-f from-encoding

Select the input character encoding. Supported encodings are platform-dependent and can usually be found in iconv_open(3). If no encodings are specified, ISO-8859-1 aka Latin-1 is assumed.

-h

Displays help and usage screen, then exits.

-i

Output additional information about unknown or unused tags. Mainly useful to debug the conversion if the input format has changed.

-l log-level

Specify the priority up to which events are logged. This is either a number between 0 and 7 or one of the strings emerg, alert, crit, err, warning, notice, info, debug, respectively (see also Log level definitions). -1 disables logging completely. A low log level like 0 means that only the most critical messages are logged. A higher log level means that less critical events are logged as well. 7 will include debug messages. The latter can be verbose and abundant, so you want to avoid this log level unless you need to track down problems.

-L log-file

Specify the full path to a log file that will receive the log messages. Typically this would be /var/log/refdba.

-o file

Send output to file. If file exists, its contents will be overwritten.

-O file

Send output to file. If file exists, the output will be appended.

-q

Start without reading the configuration files. The client will use the compile-time defaults for all values that you do not set with command-line switches.

-t to-encoding

Select the output character encoding. Supported encodings are platform-dependent and can usually be found in iconv_open(3). If no encodings are specified, ISO-8859-1 aka Latin-1 is assumed.

-T type

Overrides the automatic type detection. Allowed values for type are "tag" and "xml" for the tagged Pubmed format and the XML Pubmed format, respectively.

-y confdir

Specify the directory where the global configuration files are Note: By default, all RefDB applications look for their configuration files in a directory that is specified during the configure step when building the package. That is, you don't need the -y option unless you use precompiled binaries in unusual locations, e.g. by relocating a rpm package.

Configuration

med2ris evaluates the file med2risrc to initialize itself.

Table 14.6. med2risrc

VariableDefaultComment
outfile(none)The default output file name.
outappendtDetermines whether output is appended (t) to an existing file or overwrites (f) an existing file.
unmappedtIf set to t, unknown tags in the input data will be output following a <unmapped> tag; the resulting data can be inspected and then be sent through sed to strip off these additional lines. If set to f, unknown tags will be gracefully ignored.
from_encISO-8859-1The character encoding of the input data
to_encISO-8859-1The character encoding of the output data
logfile/var/log/med2ris.logThe full path of a custom log file. This is used only if logdest is set appropriately.
logdest1The destination of the log information. 0 = print to stderr; 1 = use the syslog facility; 2 = use a custom logfile. The latter needs a proper setting of logfile.
loglevel6The log level up to which messages will be sent. A low setting (0) allows only the most important messages, a high setting (7) allows all messages including debug messages. -1 means nothing will be logged.

Data Processing

Keywords with multiple MeSH subheadings are split into multiple keywords with one MeSH subheading each. This simplifies searching for MeSH subheadings greatly.

med2ris does not validate the input files. That is, the input files must stick to the rules of the data sources, otherwise the conversion results are not predictable.

Files

PREFIX/etc/refdb/med2risrc

The global configuration file of med2ris.

$HOME/.med2risrc

The user configuration file of med2ris.

See also

RefDB (7), bib2ris (1), db2ris (1), en2ris (1), marc2ris (1).

RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html

RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html>

RefDB on the web <http://refdb.sourceforge.net/>

Author

med2ris was written by Markus Hoenicka <markus@mhoenicka.de>.

refdb-1.0.2/doc/refdb-manual/re17.html000644 001750 001750 00000012127 12255431220 020207 0ustar00markusmarkus000000 000000 refdb-pubmed

Name

refdb-pubmed — retrieves an XML representation of Pubmed (http://pubmed.org) entries by their Pubmed IDs

Synopsis

refdb-pubmed [-d database] [-h ] [-m mode] [-t type] [PMID...]

Description

refdb-pubmed retrieves datasets from the Pubmed database using the efetch utility. refdb-pubmed reads Pubmed IDs (PMIDs) either as parameters from the command line, or on stdin. Input data should contain PMIDs separated by non-digits (spaces, tabs, newlines, commas,...). All results are written to stdout.

Options

-d database

Specify the Pubmed database to query. Allowed values are pubmed, pmc, journals, or omim. Default is pubmed.

-h

Displays help and usage screen, then exits.

-m mode

Specify the retrieval mode. Allowed values are xml, html, text, and asn.1. Default is xml.

-t type

Select the retrieval type. Allowed values are uilist, abstract, citation, medline, or full. Default is full.

See also

RefDB (7), med2ris (1).

RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html

RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html>

RefDB on the web <http://refdb.sourceforge.net/>

Author

refdb-pubmed was written by Markus Hoenicka <markus@mhoenicka.de>.

refdb-1.0.2/doc/refdb-manual/re18.html000644 001750 001750 00000007403 12255431220 020211 0ustar00markusmarkus000000 000000 refdb_dos2unix

Name

refdb_dos2unix — RefDB tool: convert file formats from DOS to Unix

Synopsis

refdb_dos2unix [-h ] file1 [file2...]

Description

RefDB is a free and portable reference and notes database as well as a bibliography application that serves a similar purpose for SGML, XML, and LaTeX documents as Reference Manager or EndNote do for word processor documents. The bibliography part is something like bibtex for markup languages. RefDB consists of an application server which interacts with a relational database on the server side and a variety of clients (including refdba and refdbc) on the workstation side. These clients perform the common tasks of a reference database, like adding and searching entries, as well as generating bibliographies.

refdb_dos2unix is a helper utility that converts a file from DOS format (newline = \r\n) to Unix format (newline = \n).

See also

RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html

RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html>

Author

RefDB was written by Markus Hoenicka <mhoenicka@users.sourceforge.net>.

This manual page was written by David Nebauer <david@nebauer.org> for the Debian project (but may be used by others).

refdb-1.0.2/doc/refdb-manual/re19.html000644 001750 001750 00000010325 12255431220 020207 0ustar00markusmarkus000000 000000 refdb_latex2utf8txt

Name

refdb_latex2utf8txt — converts bibtex bibliographic data to UTF-8 plain text

Synopsis

refdb_latex2utf8txt

Description

refdb_latex2utf8txt is a helper tool which is used by bib2ris-utf8 to clean up the output of bib2ris. It is implemented as a filter which reads from stdin and writes to stdout, without any command-line options.

Diagnostics

The exit code of refdb_latex2utf8txt is always 0 (zero).

Data Processing

  • The conversion that this tool performs was designed to facilitate the import of reference data from bibtex, through bib2ris (1), to RefDB.

  • Foreign and special characters which are encoded as LaTeX commands are converted to their UTF-8 counterparts.

  • All other LaTeX command are stripped off.

See also

RefDB (7), bib2ris (1).

RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html

RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html>

RefDB on the web <http://refdb.sourceforge.net/>

Author

refdb_latex2utf8txt was written by Markus Hoenicka <markus@mhoenicka.de> based on a similar script by Peter Csizmadia.

refdb-1.0.2/doc/refdb-manual/re20.html000644 001750 001750 00000057556 12255431222 020222 0ustar00markusmarkus000000 000000 refdbib

Name

refdbib — the bibliography client of RefDB

Synopsis

refdbib [-d database] [-D stylespec-directory] [-e log-destination] [-E encoding] [-f stdin] [-h ] [-i IP-address] [-l log-level] [-L log-file] [-m ] [-N number] [-p port] [-q ] [-r ] [-S style] [-t output-type] [-T time] [-u name] [-v ] [-V ] [-w password] [-x ] [-y confdir] filename

Description

refdbib is a command-line client to generate bibliographies with RefDB(7). refdbib reads the contents of filename, which contains a list of citations as an XML document according to citationlistx.dtd, and sends a bibliography in the requested format to stdout. If no input file is specified, refdbib tries to read the data from stdin. Unless suppressed, it also writes a style specification file (either a DSSSL or an XSLT stylesheet) and a CSS stylesheet for HTML output to your disk.

refdbib is a low-level tool. It is advisable to use one of the wrappers shipped with RefDB. runbib(1) is a shell script which creates the list of citations, runs refdbib on this list, and transforms the document. refdbnd(1) is a Makefile-based system that encapsulates the bibliography generation and document transformation conveniently.

This man page describes only the startup options of refdbib. Please consult the RefDB manual (see below) for a description of the input and output formats, as well as for post-processing instructions that are required for some output types.

Options

-d database

The name of the default database. You can change the database anytime during an interactive session.

-D stylespec-directory

Specify either a full path or . to use the current working directory for the output of the style specification and CSS files. The latter case is what you usually want if you run refdbib from the directory where your LaTeX or SMGL/XML document is stored. This is also the default if you do not specify a directory at all.

-e log-destination

log-destination can have the values 0, 1, or 2, or the equivalent strings stderr, syslog, or file, respectively. This value specifies where the log information goes to. 0 (zero) means the messages are sent to stderr. They are immediately available on the screen but they may interfere with command output. 1 will send the output to the syslog facility. Keep in mind that syslog must be configured to accept log messages from user programs, see the syslog(8) man page for further information. Unix-like systems usually save these messages in /var/log/user.log. 2 will send the messages to a custom log file which can be specified with the -L option.

-E encoding

Select an output character encoding. If this option is not used, the bibliography data will use the character encoding of the database. See iconv_open(3) for a list of available encodings.

-f stdin

This is a crutch to make reading data from stdin possible on platforms that do not allow automatic detection of data on stdin, like Windows/Cygwin. On other platforms, refdbib automatically reads data from stdin if data are available.

-h

Displays help and usage screen, then exits.

-i IP-address

Set the IP address of the box which is running the application server refdbd(1). Instead of the IP address you can also specify the hostname as long as it can be properly resolved by your system.

-l log-level

Specify the priority up to which events are logged. This is either a number between 0 and 7 or one of the strings emerg, alert, crit, err, warning, notice, info, debug, respectively (see also Log level definitions). -1 disables logging completely. A low log level like 0 means that only the most critical messages are logged. A higher log level means that less critical events are logged as well. 7 will include debug messages. The latter can be verbose and abundant, so you want to avoid this log level unless you need to track down problems.

-L log-file

Specify the full path to a log file that will receive the log messages. Typically this would be /var/log/refdba.

-m

This switch turns errors caused by missing references (i.e. cited but not available in the database) into warnings, causing refdbib to return 0 instead of an error code.

-N number

Use this option to specify where the numbering of the references is supposed to start. The default is 1. This option comes in handy if you need to cobble together composite bibliographies or per-chapter bibliographies that still need to be numbered consecutively.

-p port

Set the port of the box which is running the application server.

-q

Start without reading the configuration files. The client will use the compile-time defaults for all values that you do not set with command-line switches.

-r

Use this option to request a raw instead of a cooked bibliography. Raw bibliographies are not formatted in any way and are processed with the standard DocBook or TEI stylesheets instead of with the RefDB driver files.

-S style

Specifies the bibliography style. This controls the formatting of the bibliography and the in-text citations when the document is processed.

-t output-type

Select the output type. Use db31 to generate DocBook SGML bibliographies, db31x for DocBook XML bibliographies (DTD-based, up to 4.3), db50x for Docbook V5 XML bibliographies (schema-based), teix for TEI P4 XML bibliographies, tei5x for TEI P5 XML bibliographies, bibtex for BibTeX bibliographies, and rtf for RTF bibliographies. The type of output also determines the type of style specification file, if any, that will be generated in addition to the bibliography for formatting purposes. This is only a matter of concern if you want to process a DocBook XML document with the DSSSL stylesheets: In this case you should use db31 with this option. The SGML bibliography element is also a valid XML element, but you will get a DSSSL driver file instead of a XSL driver file when you use db31x.

Note: In the current implementation, the -t teix option will also return a DocBook bibliography which needs to be transformed to a TEI bibliography with the bibdb2tei.xsl stylesheet. The -t tei5x option creates a directly usable TEI bibliography.

-T time

Set the timeout for client/application server dialogue in seconds. A connection with unsuccessful read or write attempts will be considered as dead and taken down after this amount of time has elapsed.

-u name

Set the username for the database access. Note: This username need not be identical to the login name of the user. This is the username required to access the database server.

-v

Prints version and copyright information, then exits.

-V

Switches to verbose mode.

-w password

Set the password for the database access. Note: This password need not be identical to the login password of the user. This is the password required to access the database server.

-x

Send passwords unencrypted.

-y confdir

Specify the directory where the global configuration files are Note: By default, all RefDB applications look for their configuration files in a directory that is specified during the configure step when building the package. That is, you don't need the -y option unless you use precompiled binaries in unusual locations, e.g. by relocating a rpm package.

Diagnostics

The exit code is 0 if all went fine. It will be 1 if the command returned an error, or if there was a general error condition during startup like a lack of available memory.

Configuration

refdbib evaluates the refdbibrc configuration file at startup to initialize itself.

Table 15.1. refdbibrc

VariableDefaultComment
refdblib(none)The path of a directory containing shareable files like DTDs, HTML templates etc.
defaultdb(none)The default database. refdbib will use this database unless you specify the databases in the citation elements of your documents.
pagerstdoutThe command line of a pager that accepts the output of refdb on stdin to allow scrolling and other nifty things. “stdout†sends the data to stdout.
passwd*The password which is used for authentication with the database server. It is potentially evil to store unencrypted passwords in disk files. At least make sure that the init file is not readable for anyone else. The default setting causes refdbib to ask for your password interactively.
port9734The port on which refdbd listens. Change this for all clients and the server if this value interferes with another program using this port.
serverip127.0.0.1The IP address or hostname of the machine where refdbd runs. Use the default (localhost) address if the clients and refdbd run on the same machine.
timeout180The timeout in seconds. After this time has elapsed, a stalled connection is taken down. Increase this value if you encounter frequent timeout errors due to high network traffic or refdbs overload.
usernamelogin nameThe username which is used for authentication with the database server. This may be different from the login name of the user.
verbosefSet this to t if you prefer verbose error messages.
logfile/var/log/refdbib.logThe full path of a custom log file. This is used only if logdest is set appropriately.
logdest1The destination of the log information. 0 = print to stderr; 1 = use the syslog facility; 2 = use a custom logfile. The latter needs a proper setting of logfile.
loglevel6The log level up to which messages will be sent. A low setting (0) allows only the most important messages, a high setting (7) allows all messages including debug messages. -1 means nothing will be logged.
outtypedb31The type of output generated. Use db31 for DocBook SGML bibliographies, db31x for DocBook XML bibliographies, teix for TEI XML bibliographies, and bibtex for BibTeX bibliographies.
outformat(none)The bibliographic style to be used for the output. This is the name of a style as it was previously added to the database.
stylespecdir.A path to a directory (including the trailing directory separator) that will receive the stylesheet driver files. The default setting will direct the driver files to the current working directory that most likely contains the input files. It should rarely be necessary to use a different setting.
startnumber1The number where the reference numbering starts at. This option is mostly useful for compiling advanced bibliographies or for C boneheads who insist that counting starts at zero.
toencoding(the database encoding)The character encoding for the bibliography output. If this is not specified, the data will use the same encoding as the database.
ignore_missingfIf this is set to "f", missing references (i.e. cited but not in the database) will throw an error. If set to "t", you'll get a warning but missing references will not cause refdbib to return an error.
no_encryptfIf set to 't', passwords are transmitted unencrypted. The default is to encrypt passwords.

Examples

The first example shows how to create a DocBook SGML bibliography file.

      $~ 
      refdbib -d myrefs -S "Br.J.Pharmacol." -t db31 -D "." mypaper.id.xml > mypaper.bib.sgml
    

This command will use the database “myrefs†to retrieve the references defined in mypaper.id.xml. They will be formatted according to the bibliography style called “Br.J.Pharmacol.†and will be redirected into the bibliography file mypaper.bib.sgml. The DSSSL driver file (it will be automatically named after the bibliography style, that is Br.J.Pharmacol.dsl) will be stored in the current working directory.

The second example shows how to create the BibTeX bibliography from your LaTeX document (it is assumed that you ran latex at least once before this command.

      $~ 
      refdbib -d myrefs -S "name" -t bibtex mypaper.aux > mypaper.bib
    

This command will use the database “myrefs†to retrieve the references defined in mypaper.aux. The intermediate bibliography database will be stored in mypaper.bib and will serve as an input file for bibtex.

Note

For the sake of consistency with bibtex, it is possible to specify the auxiliary file without the .aux extension (mypaper in the above example).

If you are working on a long document that cites the same references over and over again, it may be prudent to preprocess the .aux file in order to eliminate duplicates (duplicates do not confuse bibtex but they waste space):

      $~ 
      sort mypaper.aux | uniq | refdbib -d myrefs -S "name" -t bibtex > mypaper.bib
    

Note

The runbib script does exactly this kind of preprocessing automatically.

Files

PREFIX/etc/refdb/refdbibrc

The global configuration file of refdbib.

$HOME/.refdbibrc

The user configuration file of refdbib.

See also

RefDB (7), refdbd (1), runbib (1), refdbnd (1), refdba (1), refdbc (1).

RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html

RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html>

RefDB on the web <http://refdb.sourceforge.net/>

Author

refdbib was written by Markus Hoenicka <markus@mhoenicka.de>.

refdb-1.0.2/doc/refdb-manual/re21.html000644 001750 001750 00000025550 12255431222 020210 0ustar00markusmarkus000000 000000 refdbnd

Name

refdbnd — creates a skeleton document and a Makefile for RefDB

Synopsis

Interactive mode:

refdbnd

Non-interactive mode:

refdbnd basename doctype pubtype database style encoding [css-file] [fo-driver] [html-driver] [xhtml-driver]

Description

This script should be the first choice for novices for creating new SGML,XML, or RTF documents for use with RefDB(7). If called without arguments, the script runs in a novice-friendly interactive mode and collects a few answers about the new document. Based on these answers it will create a skeleton document as well as a custom-tailored Makefile that performs all necessary steps to create formatted output from the document.

Alternatively you can call this script from a directory that contains an existing SGML, XML, or RTF file. Pass the full name to the script when it asks for a filename, and the script will try to guess some of the settings from the existing file.

The script can create the following document types:

DocBook SGML

Versions 3.1, 4.0, 4.1

DocBook XML

Versions 4.1.2, 4.2, 4.3, 5.0

TEI XML

Versions P4, P5

Rich Text Format (RTF)

Version 1.9 (M$ Word 2007 and earlier, OpenOffice, AbiWord, and most other contemporary word processors)

The skeleton documents created by the script contain the appropriate prolog for the selected document type. If required (SGML, DTD-based XML), an external entity is declared in the internal subset in order to include the bibliography.

Options

basename

The basename of the document, i.e. sans extension. If you want to end up with foo.pdf, use foo

doctype

Available options are db31, db40, and db41 for DocBook SGML; db41x, db42x, and db43x for DocBook XML; teix for TEI XML; rtf for RTF

pubtype

This is one of set, book, or article for DocBook, and TEI.2 for TEI. This argument is ignored by the other document types, but must be present nonetheless (pass "foo" or "bar", depending on your mood).

database

The name of the database that contains your references.

style

The name of the bibliography style.

encoding

The character encoding of the document.

css-file

The name of a CSS file for the HTML output. This option is meaningless for RTF documents and can be left out.

fo-driver

A custom driver file for fo output. Please consult the manual for the requirements of such a driver. This option is meaningless for RTF documents and can be left out.

html-driver

A custom driver file for html output. Please consult the manual for the requirements of such a driver. This option is meaningless for RTF documents and can be left out.

xhtml-driver

A custom driver file for xhtml output. Please consult the manual for the requirements of such a driver. This option is meaningless for RTF documents and can be left out.

Makefile Targets

The Makefile is set up to process your document properly depending on its type. The following targets are available for SGML and XML documents:

html

Creates a set of HTML files.

pdf

Creates a PDF file.

ps

Creates a Postscript file (SGML documents only).

rtf

Creates a RTF file. The Rich Text Format can be edited by most Word Processors.

Note

Not all FO processors offer RTF output, so this target may not work for XML documents with your setup.

all

This is the default if you call make without specifying a target. It will build all of the above targets.

htmldist

Creates a .tar.gz archive of the HTML files.

pdfdist

Creates a .tar.gz archive of the PDF file.

ps

Creates a .tar.gz archive of the Postscript file (SGML documents only).

rtf

Creates a .tar.gz archive of the RTF file.

dist

This will build all of the above archives.

clean

This will remove all built files, except for the source document using the full citation format.

shortclean

This will remove all built files, including the source document using the full citation format.

For RTF output there is only a default target which you can invoke by running make without an argument, and the "clean" target which removes generated files.

Files

PREFIX/share/refdb/db/examples/Makefile.template

PREFIX/share/refdb/db/examples/Makefile.rtf.template

The templates used to create the Makefile.

See also

RefDB (7).

RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html

RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html>

RefDB on the web <http://refdb.sourceforge.net/>

Author

refdbnd was written by Markus Hoenicka <markus@mhoenicka.de>.

refdb-1.0.2/doc/refdb-manual/re22.html000644 001750 001750 00000042545 12255431223 020215 0ustar00markusmarkus000000 000000 runbib

Name

runbib — creates RefDB bibliographies

Synopsis

runbib [-a fo-driver] [-b html-driver] [-c xhtml-driver] [-d database] [-E encoding] [-G css-file] [-h ] [-i IP-address] [-I name] [-j jade-args] [-N number] [-r ] [-s ] [-S style] [-t output-type] [-u name] [-w password] filename

Description

This shell script is a wrapper for the bibliography client refdbib(1) to simplify the creation of bibliographies. For SGML and XML documents, runbib first runs openjade or xsltproc(1), respectively, to retrieve a list of citations from your source document. Then it runs refdbib(1) to generate the bibliography as an external entity based on the extracted citation information. It will also create stylesheet driver files with the formatting information for subsequent document transformations. For BibTeX documents, runbib uses the information in the .aux file to retrieve a bibliography file that you can use as an input file for bibtex(1).

Options

-a fo-driver

The full path of a custom XSL driver file for printed output. This file has to import the appropriate RefDB fo driver file.

-b html-driver

The full path of a custom XSL driver file for HTML output. This file has to import the appropriate RefDB html driver file.

-c xhtml-driver

The full path of a custom XSL driver file for XHTML output. This file has to import the appropriate RefDB xhtml driver file.

-d database

The name of the default database.

-E encoding

Select an output character encoding. If this option is not used, the bibliography data will use the character encoding of the database. See iconv_open(3) for a list of available encodings.

-G CSS-file

Set the path or the URL of a CSS file to be used by the (x)html output

-h

Displays help and usage screen, then exits.

-i IP-address

Set the IP address of the box which is running the application server refdbd(1). Instead of the IP address you can also specify the hostname as long as it can be properly resolved by your system.

-I name

Change the value of an entity declaration to include marked sections. Multiple entries are possible. These are passed as -i options to Jade/OpenJade.

-j jade-args

Set additional command line options for Jade/OpenJade

-N number

Use this option to specify where the numbering of the references is supposed to start. The default is 1. This option comes in handy if you need to cobble together composite bibliographies or per-chapter bibliographies that still need to be numbered consecutively.

-r

Use this option to request a raw instead of a cooked bibliography. Raw bibliographies are not formatted in any way and are processed with the standard DocBook or TEI stylesheets instead of with the RefDB driver files.

-s

Skip the ID extraction step of runbib. You have to provide an aptly named XML file containing the requested IDs.

-S style

Specifies the bibliography style. This controls the formatting of the bibliography and the in-text citations when the document is processed.

-t output-type

Select the output type. Use db31 to generate DocBook SGML bibliographies, db31x for DocBook XML bibliographies, teix for TEI XML bibliographies, bibtex for BibTeX bibliographies, and rtf for RTF bibliographies.

-u name

Set the username for the database access. Note: This username need not be identical to the login name of the user. This is the username required to access the database server.

-w password

Set the password for the database access. Note: This password need not be identical to the login password of the user. This is the password required to access the database server.

Configuration

Instead of using the command-line switches, runbib can also be configured by means of the runbib configuration file. As with all refdb configuration files, you may maintain a global copy in /usr/local/etc/refdb/ and one copy per user in $HOME. Keep in mind that the runbib configuration file covers only those options which are not passed to refdbib(1) as that tool has its own configuration file.

Table 15.2. refdbjaderc

VariableDefaultComment
jade_includeargnoneChange the value of an entity declaration to include marked sections. Multiple entries are possible. These are passed as -i options to Jade/OpenJade.
jadeargsnoneSet additional command line options for Jade/OpenJade. Use e.g. "-E 0" to disable the maximum error limit
outformatdb31Set the default output format. Supported values are db31 (DocBook SGML 3.1 and later), db31x (DocBook XML 3.1 and later), db50x (DocBook XML 5.0 and later), teix (TEI P4), bibtex, and rtf.

SGML Output

refdbib generates two output files in addition to the ID listing created by Jade/OpenJade. runbib creates another output file from these. Assuming you have a source file foo.sgml and use the bibliography style J.Biol.Chem. you will get:

J.Biol.Chem.dsl

This is the DSSSL driver file file that encodes some additional formatting information specific for the chosen bibliography style for use in subsequent document transformations. This file will be written to the present working directory. The driver file is a dual-purpose stylesheet for HTML and printable output.

foo.id.xml

This is the intermediate XML file that encodes the citations in foo.sgml.

foo.bib.sgml

This is the file that holds the DocBook bibliography element. You have to include this file as an external entity into your source document to integrate the bibliography into your text.

J.Biol.Chem.css

This is a CSS file which contains formatting information used by the html output.

XML Output

refdbib again generates two output files as for the DocBook SGML output above, and we also count the ID listing created by xsltproc. However, runbib does a little post-processing, so you'll get two additional files in the end. Assuming you have a source file foo.xml and use the bibliography style J.Biol.Chem. you will get:

J.Biol.Chem.fo.xsl

This is the XSL driver file used for printable output, containing additional formatting information specific for the chosen bibliography style. This file will be written to the present working directory.

J.Biol.Chem.html.xsl

This is the XSL driver file used for HTML output, containing additional formatting information specific for the chosen bibliography style. This file will be written to the present working directory.

foo.id.xml

This is the intermediate XML file that encodes the citations in foo.xml.

foo.bib.xml

This is the file that holds the DocBook or TEI bibliography. You have to include this file as an external entity into your source document to integrate the bibliography into your text.

J.Biol.Chem.css

This is a CSS file which contains formatting information used by the html or xhtml output.

Bibtex Output

refdbib creates one output file with the reference information. If your document is named foo.tex, latex will create a file foo.aux which refdbib uses as an input file. The refdbib output file will then be named foo.bib and can be used by bibtex as an input file.

RTF Output

refdbib creates one output file with the reference information. If your document is named foo.rtf, rtfcitations extracts the citations and writes them into foo.id.xml which refdbib uses as an input file. The refdbib output file will then be named foo.bib.rtf and can be used by refdbrtf as an input file.

Example

You should run this script from the directory where your document files are stored, as all output will be written to the present working directory by default.

The following command will create a DocBook SGML bibliography file together with a DSSSL stylesheet driver file for the DocBook SGML document mypaper.sgml. The output files are tweaked to match the citation and bibliography style of the "Journal of Biological Chemistry", which was added to the database with the name "J.Biol.Chem." previously. All references which do not contain a hard-coded database name are assumed to be in the database bar.

      ~$ 
      runbib -d bar -S "J.Biol.Chem." -t db31 mypaper.sgml
    

Files

PREFIX/etc/refdb/refdbibrc

The global configuration file of refdbib(1), which does most of the work of runbib.

$HOME/.refdbibrc

The user configuration file of refdbib.

See also

RefDB (7), refdbd (1), refdbib (1), refdbnd (1), refdba (1), refdbc (1).

RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html

RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html>

RefDB on the web <http://refdb.sourceforge.net/>

Author

runbib was written by Markus Hoenicka <markus@mhoenicka.de>.

refdb-1.0.2/doc/refdb-manual/re23.html000644 001750 001750 00000014317 12255431223 020212 0ustar00markusmarkus000000 000000 runbib-missing

Name

runbib-missing — displays references not found by runbib(1)

Synopsis

runbib-missing [-b basename]

runbib-missing [-f basename.bib.xml] basename.id.xml

runbib-missing [-]

Description

runbib(1) may report that it was unable to locate some or all of the references cited in the document, but it will not tell you which ones were missing. runbib-missing collects a list of the ID values which caused these failures and sends them to stdout.

Options

-b basename

The basename, optionally including a path, of your document. runbib-missing assumes that the ID file is called basename.id.xml, and the bibliography file is called basename.bib.xml. This is always the case if you use tools like runbib(1) and refdbnd(1) to create your bibliographies. Using this option is the simplest and recommended way to run the script.

-f basename.bib.xml

The relative or full path of the bibliography file created by runbib(1).

-h

Displays help and usage screen, then exits.

basename.id.xml

The relative or full path of the ID file created by runbib(1). Optionally you can pipe the data into stdin instead of specifying the file as a parameter.

Configuration

runbib-missing does not use any configuration files.

Example

For the least amount of typing, you should run this script from the directory where your document files are stored. Then the following command will diplay the IDs, if any, of all RefDB citations which were not found in the database during the most recent runbib(1) invocation on your document thesis.xml.

      ~$ 
      runbib-missing -b thesis
    

See also

RefDB (7), refdbib (1), refdbnd (1), runbib (1).

RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html

RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html>

RefDB on the web <http://refdb.sourceforge.net/>

Author

runbib-missing was written by Markus Hoenicka <markus@mhoenicka.de>.

refdb-1.0.2/doc/refdb-manual/re24.html000644 001750 001750 00000024255 12255431223 020215 0ustar00markusmarkus000000 000000 refdbjade

Name

refdbjade — transform SGML and XML documents containing RefDB bibliographies

Synopsis

refdbjade [-h ] [-I name] [-j jade-args] [-p prefix] [-s stylesheet] [-t format] [-v variable[=name]] file

Description

refdbjade uses the stylesheet driver file that you created with runbib(1) and feeds it to Jade/OpenJade to transform your DocBook SGML or XML document to one of the supported output formats.

Note: If you prefer to transform your DocBook XML document with the XSL stylesheets as most people do these days, please use refdbxml(1) instead.

Options

-h

Prints a command synopsis on the screen and exits

-I name

Change the value of an entity declaration to include marked sections. Multiple entries are possible. These are passed as -i options to Jade/OpenJade.

-j jade-args

Set additional command line options for Jade/OpenJade

-p prefix

This determines a prefix that is added to all filenames that Jade/OpenJade create. This can be useful to avoid filename conflicts if you transform or use several DocBook documents in the same folder.

-s stylesheet

This selects the stylesheet driver file. This file is generated by refdbib(1) (which in turn is called by runbib(1)) and contains additional formatting information.

-t format

Select an output format with this option. Possible values are html, rtf, dvi, pdf, ps, tex, to generate HTML, RTF, DVI, PDF, PostScript, or JadeTeX output, respectively. Use tps and tpdf to create PostScript or PDF output, respectively, from the intermediate JadeTeX output generated by any of the switches dvi, pdf, ps, or tex. This is useful if you have to edit the intermediate JadeTeX file, e.g. to manually shift pagebreaks. If your DSSSL engine of choice is OpenJade, you can use htmlr to generate raw HTML output (the same as HTML but without these funny linefeeds in the end tags).

-v variable[=value]

Change the value of a variable in the stylesheet. Multiple entries are possible. These are passed as such to Jade/OpenJade. The syntax "variable" causes "variable" to be set to "#t". The extended syntax "variable[=value]" sets the variable to the given value.

file

The names of one or more SGML or XML files. Each document will be processed separately.

Configuration

Instead of using the command-line switches, refdbjade can also be configured by means of the refdbjaderc configuration file. As with all refdb configuration files, you may maintain a global copy in /usr/local/etc/refdb/ and one copy per user in $HOME.

Table 15.3. refdbjaderc

VariableDefaultComment
jade_includeargnoneChange the value of an entity declaration to include marked sections. Multiple entries are possible. These are passed as -i options to Jade/OpenJade.
jade_variablenoneChange the value of a variable in the stylesheet. Multiple entries are possible. These are passed as -v options to Jade/OpenJade. The syntax "variable" causes "variable" to be set to "#t". The extended syntax "variable[=value]" sets the variable to the given value.
jadeargsnoneSet additional command line options for Jade/OpenJade. Use e.g. "-E 0" to disable the maximum error limit
outformattexSet the default output format. Supported values are tex, html, rtf, dvi, pdf, ps, tps, and tpdf

Environment

SGML_CATALOG_FILES

This environment variable is consulted to resolve public identifiers in the SGML source documents. It is advisable to keep local copies of the DTD files and add OVERRIDE YES to the top of your catalog files. This ensures that the local copies are used and avoids unnecessary network traffic.

Example

Here we'll use the files generated in the last example above (see runbib) and generate a nicely formatted PDF file:

      ~$ 
      refdbjade -d J.Biol.Chem.dsl -t pdf mypaper.sgml
    

To obtain HTML output, you just change the output type switch:

      ~$ 
      refdbjade -d J.Biol.Chem.dsl -t html mypaper.sgml
    

See also

RefDB (7), refdbib (1), runbib (1), refdbxml (1).

RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html

RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html>

RefDB on the web <http://refdb.sourceforge.net/>

Author

refdbjade was written by Markus Hoenicka <markus@mhoenicka.de>.

refdb-1.0.2/doc/refdb-manual/re25.html000644 001750 001750 00000024574 12255431224 020223 0ustar00markusmarkus000000 000000 refdbxml

Name

refdbxml — transform XML documents containing RefDB bibliographies

Synopsis

refdbxml [-c fop_config_file] [-f fo_processor] [-h ] [-p xslt-processor] [-s stylesheet] [-t format] file

Description

refdbxml uses the stylesheet driver file that you created with runbib(1) and feeds it to an XSLT processor to transform your DocBook or TEI XML document to one of the supported output formats. If printable output is requested, the intermediate FO output will be further processed by a FO processor.

Options

-c fop_config_file

The path to a custom configuration file for the FO processor FOP.

-f fo_processor

The name of the FO processor used to transform FO files into printable output. Supported values are fop (default), passivetex, xep, and xfor.

-h

Prints a command synopsis on the screen and exits

-i variable

Define a variable that is passed to Jade/OpenJade. Multiple entries are possible. This can be used to conditionally include or exclude parts of the document according to which variable is set.

-p xslt-processor

This determines the XSL processor that is to be used. refdbxml currently knows to handle Xalan, XT, Saxon, and xsltproc.

-s stylesheet

This selects the stylesheet driver file. This file is generated by refdbib(1) (which in turn is called by runbib(1)) and contains additional formatting information.

-t format

Select an output format with this option. Possible values are html\fr, rtf, and pdf.

file

The names of one or more XML files. Each document will be processed separately.

Configuration

Instead of using the command-line switches, refdbxml can also be configured by means of the refdbxmlrc configuration file. As with all refdb configuration files, you may maintain a global copy in /usr/local/etc/refdb/ and one copy per user in $HOME.

Table 15.4. refdbxmlrc

VariableDefaultComment
xslt_processorxsltprocThe name of the XSLT processor used to transform XML documents to html or fo files. Supported values are xsltproc (default), xalan, xt, saxon, saxon-xerces (using the xerces parser instead of the built-in parser)
xslt_classpath/usr/share/javaSpecify the directory which contains the Java classes for Java-based XSLT processors. This variable is not required if you use a non-Java processor (xsltproc).
fo_processorfopThe name of the FO processor used to transform FO files into printable output. Supported values are fop (default), passivetex, xep, and xfor.
fo_classpath/usr/share/javaSpecify the directory which contains the Java classes for Java-based FO processors. This variable is not required if you use a non-Java processor (passivetex).
fop_config_file(none)The path to a custom configuration file for FOP.
outformathtmlSet the default output format. Supported values are html, xhtml, pdf, and rtf. Be aware that pdf and rtf are not supported by all FO processors.

Resolving Public Identifiers

Public identifiers can be resolved to local files if you have a working XML catalog on your system and if your XSLT processor supports XML catalogs. xalan and saxon require additional Java classes to support XML catalogs. For further information, please consult Bob Stayton's book about XSLT.

Files

/usr/local/etc/refdb/refdbxmlrc

The global configuration file of refdbxml

$HOME/.refdbxmlrc

The user configuration file of refdbxml.

/etc/xml/catalog

The global XML catalog file, used to resolve public identifiers. Please note that the location of this file is system-dependent. Also, some XSLT processors do not support catalogs, and others require additional classes or plugins to do so.

Example

We'll transform our document (which is either a DocBook or TEI XML document) to a nice-looking PDF file with the following command:

      ~$ 
      refdbxml -d J.Biol.Chem.fo.xsl -t pdf mypaper.xml
    

Note that we used the FO stylesheet for this purpose. If we want HTML output, we need to change the output type switch and use the corresponding HTML stylesheet:

      ~$ 
      refdbxml -d J.Biol.Chem.html.xsl -t html mypaper.xml
    

See also

RefDB (7), refdbib (1), runbib (1), refdbjade (1).

RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html

RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html>

RefDB on the web <http://refdb.sourceforge.net/>

Author

refdbxml was written by Markus Hoenicka <markus@mhoenicka.de>.

refdb-1.0.2/doc/refdb-manual/re26.html000644 001750 001750 00000011161 12255431224 020210 0ustar00markusmarkus000000 000000 refdbrtf

Name

refdbrtf — build RTF documents with RefDB bibliographies

Synopsis

refdbrtf [-b bibfile] [-h ]

Description

refdbrtf takes a RTF bibliography file (such as created with refdbib) and inserts the citations and the bibliographic listing into the file the bibliography was created from. The source RTF document is read from stdin, and the compound RTF document is sent to stdout.

Options

-b bibfile

The path to the RTF bibliography file.

-h

Prints a command synopsis on the screen and exits

Example

We have authored a source document called mypaper.rtf which contains a variety of citations. Then we invoked runbib which provided a matching bibliography file called mypaper.bib.rtf. The following command will combine the two RTF files to a new compound document with resolved references and a bibliographic listing:

      ~$ 
      refdbrtf -b mypaper.bib.rtf < mypaper.rtf > mypaper.refdb.rtf
    

See also

RefDB (7), refdbib (1), runbib (1).

RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html

RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html>

RefDB on the web <http://refdb.sourceforge.net/>

Author

refdbrtf was written by Markus Hoenicka <markus@mhoenicka.de>.

refdb-1.0.2/doc/refdb-manual/re27.html000644 001750 001750 00000024035 12255431224 020215 0ustar00markusmarkus000000 000000 refdbxp

Name

refdbxp — converts short and full citation formats in SGML and XML documents containing RefDB citations.

Synopsis

refdbxp [-h ] [-s ] [-t input-format] refdbxp

Description

refdbxp allows the interconversion of the short and full notation of citations in the supported SGML and XML documents of RefDB(7). See the RefDB manual (see below) for information about the two notations. The conversion is round-trip safe, and it supports mixing short and full notation in the same source document. Full-notation citations will use the correct encoding for first and subsequent citations of the same reference.

Note

You should be aware that refdbxp is not a SGML or XML-aware tool. It is a simple text replacement tool with some restrictions:

  • If you comment out citation elements, they still count as if they were present when the first/subsequent citation issue is resolved (refdbxp simply doesn't know about the concept of a comment). In the following example, the citation in the last line will be the only one transformed, but it will be formatted as a subsequent citation of reference 9, not as the first citation:

    <!-- <citation role="REFDB">9;</citation> first occurrence -->
    <!-- other stuff inbetween -->
    <citation role="REFDB">9;</citation><!-- second occurrence -->
    	  
  • If you use SGML/XML tags within a comment and nest this comment ingeniously between the start tag and the end tag of an element relevant for refdbxp, you shoot yourself in the foot. You do not want to use code like this (why would you, anyways?):

    <citation role="REFDB"><!-- </citation> -->2;5;9;</citation>
  • refdbxp does not include external entities. The whole document refdbxp is supposed to convert needs to be in one chunk.

  • refdbxp currently does not support multiple databases per document.

One way to work around the problem with comments is to create a copy of your master source and use a small script to remove comments just before you process and transform your text. To work around the fact that refdbxp does not treat external entities correctly, use a tool like sgmlnorm (shipped with the Jade/OpenJade packages) to preprocess the document. To work around the missing support of multiple databases, well... just wait.

Options

-h

Prints a command synopsis on the screen and exits.

-s

Create citations using the short notation. The default is to use the full notation.

-t input-format

Select the type of input. Currently supported values are db31 (DocBook SGML version 3.1 or later), db31x (DocBook XML, all versions), and teix (TEI XML).

Example

Lets first try the most common usage of refdbxp. The following command expands all citations, regardless of whether they are written in short or full notation, to the full notation and writes the result to a new file foo.full.sgml. The input from foo.sgml is assumed to be DocBook SGML:

	~$ 
	refdbxp -t db31 < foo.sgml > foo.full.sgml
      

The following command goes the other way. This time we convert all citations of a TEI XML document, regardless of whether they are written in short or full notation, to the short notation and write the result to a new file:

	~$ 
	refdbxp -t teix -s < bar.xml > bar.short.xml
      

The last example shows how to treat documents that consist of several files. The DocBook SGML master file foo_master.sgml includes several other subdocuments as external entities. Treating those files individually with refdbxp would screw up things as the first/subsequent citation issue would not be treated correctly and collisions of automatically created element IDs would result. The following command comes to the rescue and expands all citations in the document correctly:

	~$ 
	osgmlnorm -dn /usr/local/share/sgml/docbook/4.1/docbook.dcl foo_master.sgml | refdbxp -t db31 > foo.full.sgml
      

Note

You may have realized that there's two small problems with this procedure. First, using (o)sgmlnorm will also include the external entity that contains (or will contain once it's created) the bibliography element created by refdb. One way around this is to use a mock file that just contains the entity reference in a comment. Lets assume your document foo.sgml wants to include the bibliography by using the entity declaration %bibliography; at the proper location. The entity is declared in the declaration subset at the top of your sourcefile as the external file foo.bib.sgml. Then you should create a file foo.bib.sgml with the following contents:

<!--&bibliography;-->

We have to outcomment the entity reference as these may be nested, i.e. the parser would try to replace this entity again and fail because the entity is already opened. After the conversion you just need to uncomment the parameter entity. If you like long commands, you could do this on the fly like this:

	  ~$ 
	  osgmlnorm -dn /usr/local/share/sgml/docbook/4.1/docbook.dcl foo_master.sgml | refdbxp -t db31 | sed 's%<!--\&bibliography;-->%\&bibliography;%' > foo.full.sgml
	

Second, (o)nsgmlnorm will not output the internal declaration subset that we need at least to declare the parameter entity for the bibliography. You could fix this with a sed command along the lines of the command shown above or add it back manually.

See also

RefDB (7), refdbnd (1).

RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html

RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html>

RefDB on the web <http://refdb.sourceforge.net/>

Author

refdbxp was written by Markus Hoenicka <markus@mhoenicka.de>.

refdb-1.0.2/doc/refdb-manual/re28.html000644 001750 001750 00000014615 12255431224 020221 0ustar00markusmarkus000000 000000 refdb-ms

Name

refdb-ms — a console-based style generator for RefDB

Synopsis

refdb-ms

Description

refdb-ms is a console-based style generator for RefDB.

In short, this utility consists of a loop in which you are asked to:

  • select an element from a list of elements allowed in that part of the style,

  • enter or select appropriate values for mandatory attributes,

  • select optional attributes for that element and enter their values,

  • select an element from a list of elements ...

This process ends when you have exhausted the DTD.

Every time you are presented with a list of elements you have the option of selecting help. Doing so will present a screen with a summary of each element on the list. The same thing happens when you are presented with a list of attributes.

When an attribute or element is required by the DTD this utility will select it automatically. For some objects you will not need to provide input and so this utility will create the object(s) automatically. This can be disconcerting at first. Please read the console feedback carefully.

Whenever you are asked to enter or select a value for an attribute or element, you are given a brief prompt explaining the purpose of the element or attribute. After each element is added to the style you are presented with a "progress report" showing the (major) elements. It may take a little while to understand this feedback. As you add elements they will be appended to the report. When you complete a major element, such as a PUBTYPE or AUTHORLIST, however, its subsidiary elements are no longer displayed -- they are "folded". This saves space and makes it easier to quickly understand where in the style you are at that point in time. As you become more familiar with the structure of the style DTD this display will become increasingly useful.

At certain times within PUBTYPE, AUTHORONLY, YEARONLY and INTEXTDEF elements you are able to delete the previous "major" element. "Major" elements are those corresponding to ris fields. These elements may contain other elements. For example, deleting an AUTHORLIST element will delete all the children elements of that author list style. You can view the complete element before deletion occurs.

When you select some elements (in general, those corresponding to ris fields) you will be given an opportunity to copy the most recently entered element of that type. If you choose to copy, all attributes and sub-elements will be copied. This can save you a lot of time if, for example, your author lists will always have the same formatting.

After you have created your style this utility will save it to a disk file. It will also generate a brief summary of it in html format. This summary can be of great help when entering references in your reference database.

This utility will then offer to upload the style to RefDB. There is no foreseeable way in which this operation could damage your reference data, but you use it at your own risk.

Files

RefDB::Makestyle

This module is required by refdb-ms. It is available as a tar.gz archive or a Debian package from the RefDB website <refdb.sourceforge.net>.

See also

RefDB::Makestyle (3).

RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html

RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html>

RefDB on the web <http://refdb.sourceforge.net/>

Author

refdb-ms was written by David Nebauer <david@nebauer.org>.

This manual page was written by David Nebauer <david@nebauer.org> for the Debian project (but may be used by others).

refdb-1.0.2/doc/refdb-manual/re29.html000644 001750 001750 00000011401 12255431224 020210 0ustar00markusmarkus000000 000000 rtfcitations

Name

rtfcitations — Extracts RefDB citations from a text file and writes them into an XML file using the citationlistx.dtd.

Synopsis

rtfcitations [-h ]

Description

rtfcitations reads a plain text document (such as the word processor format RTF, hence its name) from stdin and scans it for particular character sequences which denote RefDB citations. The citations are converted to an XML document following the citationlistx.dtd and sent to stdout. The input document may be any structured or non-structured text which sticks to the following conventions:

Simple citations

Enclose the RefDB citation key in double square brackets, as in "[[Miller1999]]".

Multi-head citations

Enclose each RefDB citation key in square brackets, and surround the entire multi-head citation with another pair of square brackets, as in "[[Miller1999][Doe2001]]".

The resulting XML file can be fed to refdbib to generate a bibliography file containing the cited works.

Options

-h

Prints a command synopsis on the screen and exits.

Example

The following command extracts all citations from foo.rtf and writes them to foo.id.xml:

	~$ 
	rtfcitations < foo.rtf > foo.id.xml
      

See also

RefDB (7), refdbib (1).

RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html

RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html>

RefDB on the web <http://refdb.sourceforge.net/>

Author

rtfcitations was written by Markus Hoenicka <markus@mhoenicka.de>.

refdb-1.0.2/doc/refdb-manual/re30.html000644 001750 001750 00000011027 12255431245 020207 0ustar00markusmarkus000000 000000 eenc

Name

eenc — perform password encryption for RefDB clients

Synopsis

eenc [-p ABC-DE-FG-HI] password

Description

RefDB(7) clients send passwords to refdbd(1) in an encrypted form. Programmers that implement custom clients in languages other than C or Perl may use this program to perform the password encryption if implementing the algorithm in the target language is too cumbersome. The program writes the encoded password to stdout. As the encoding algorithm is symmetrical, you can use this utility to encode plain text passwords as well as to decode encrypted passwords.

The algorithm used by eenc is derived from the ENIGMA algorithm. Security is limited but should be sufficient for the purposes of a reference management software. Please see the RefDB manual (see below) for further information about the client-server protocol.

Options

-p ABC-DE-FG-HI

The slot and rotor position string sent back by refdbd(1) during the first stage of the client-server protocol. ABC denotes which wheel goes into which slot, and the remaining digits encode the positions of the wheels in slots 0 through 2.

password

The plain-text password when encrypting, or the encoded password when decrypting.

See also

RefDB (7), refdbd (1).

RefDB manual (local copy) PREFIX/share/doc/refdb-<version>/refdb-manual/index.html

RefDB manual (web) <http://refdb.sourceforge.net/manual/index.html>

RefDB on the web <http://refdb.sourceforge.net/>

Author

eenc was written by Markus Hoenicka <markus@mhoenicka.de>.

refdb-1.0.2/doc/refdb-manual/refdbmanualfig1.png000644 001750 001750 00000016141 12255431171 022305 0ustar00markusmarkus000000 000000 ‰PNG  IHDRƒ…¹J”» cHRMz&€„ú€èu0ê`:˜pœºQ<gAMA±Ž|ûQ“sRGB®ÎébKGDÿÿÿ ½§“ pHYsÄÄ•+¸IDATxÚí ˜MåÞÆoB*•G*ŠâRÉAQGQÅ‹päô!D—z‘‘ºäEq"zãP*}pä¢Pd ¥×G”“:¦R™PR½û^«5³öžµÖþ˜½÷ì½öý»®}ÍÌÞkí½g}<÷óüŸÿÿ~ÊüB!2–2NÒaB!1B!1B!1B!1B!1B!1B!1B!1B!1B!1B!1B!1B!1BDV"Þ´I«¶8PpÂwëı ¹µ;F ½[WŽBbŽ_ªÖDÞÀgüw´¶­Aþµºj„¾Ca"!„!„!„!„é)K²Ë›W?¿l&0ïà‡ýÀ€z:³BYiõmæü'6µ/ÓÙB_‰{óC¯2øsë}Æß~<| ðÍgæßt=ÃÜ~Æ`r.°çß@NWàçc@³òÌ×û Øð/`ê@àæ‘ÀM÷}֯׀ÿ|ý)P¯ðàKÀiUu%!2šÔ }µ è2,Ðxßgþ½0³˜ý1°u pà+àÅ}@Í‹M! ³†w> L\ ¼ý¢í½> ˆÈ€æŸm1~C$~¦ßŒzxá[àäŠÀªê*Bhd2ßä´³€úÍ‹þþx=pF5ó÷K¯6­šw,zý×_€/w Z˜ÿ¹gÑkO:Þº²@?ÿ‹u€2í›ÿEÑvWdßçë*BH R曜zVÑïGò¶íË=wëCÁÛ= ”µ}ý3ÿü¶HX(¤\yàÇEÛ1üô¯éÀ#†7îÒU „¤Ì7)ckø+TΫ<õQð6œ[(ìýW6ç ,Ù^cH‰ÂPålàx`›*ÕŠ^Ýè:hÒ> ï^/ˆéënß¾*T@:ut !$ †‹šš!œ¬rÀ£=Í äKZmÞÿ Þj5ÞzhÕÝ|í—Àü1Àm“]›€~Íç)¦×GoÌ-Ú'JjÖ¬‰ºuë¢C‡¸ûî»qùå—ëj¢زe zÜ1Ô—ÿ[ù“€­¹oe°^cqÏw­{šóöpüx`›N¦0\Õ©èùs.ÿø[àç=œ}žù|¹“¾9ÀßgTþÔ6æ¯W¥J >£FÂܹsÑ©S'Œ9Íš5ÓÝ)D9xð v^ÕhÛÇwÿ[õéý2ldÀÔÎ9;CŽBm`êïíªÕþ±¥øûYÛ\Õ¹økað8"˜:u*öî݋ŋV­Zá@›6mt— !Ò†,‚ØáœG÷ÜsOáskÖ¬1 ;;vÔB¤<ò&*!ƒ B­ZµŠ=Ï8&CGœW˜7oNœ8¡ƒ%„øytÀ€Ÿ~ú)úöí‹ÚµkcÚ´i(((ÐABH üHÏž=æ˜îٳǼ¼<0!„ÄÀdeeyެm^zé%Ô«'GU!ÒË ™„sDÞ¹ß%}Û±D¼éá}{•óüwaìÙ Ô©à::xì±ÇŒ¹'˜u¤ #!| ís(_!1°óÈ]pøðaÿðKë¡aÆ®/stÀIãPX“Ð¥KÝ0B¤E§ÏÅ ™89"³€•ËôCãè@bPD¦6|L#mÒ¤ 6mÚTøç8‰Üºuk¼õÖ[¨^½ºn6!RË ùçÃZ×ÝZôšÝyÚ Óùìó™y¦µhÎ ÎLš4)HÖ¯_o„ˆvî܉–-[?…)ŠÝ ™¼Ý ™XŽÈå+9"Ó2ç”ÓÓþ_—ÄV óQ¹re,]ºU«V-¬T¶F!¢ƒ–,æœ1c†‘¢°º'7d;^ŽÈiNBÂDc›†/öôåE٣ݵøKëVÞÿÿ˜18vìXPæÂÀš+d¤Ì"!‚a#ÏÎÒŽ;Œd ºó'S³ ìm3;/!x¹!/Gd‰Aq^Y»Û»Môß•ºs#ª¬^V 82p‚G,RëÞ½»« Ðçˆ7]Q…ð3¼Ö·nÝZØàó'…À­0Óm;UüÇ/Vâá†LÜ‘%.ozrÓDÎoäçz % ñprýùçŸwf`Ýpà ¸ä’KðÌ3Ϩµ¾æúë¯wMÅ.Ö¦F¼o˜ ‘pÜ܉›#²МA)` Âþýû A`ȸ62‘,X`Ì/ágÂjÚ™9s&²³³“óÅ,7äéúä˜Ï[®ÉtC~v}{ð~œtæºí« 4oÞ·Ýv›!„a¢qãÆé _ÃTìHæÍh ß¿0‰ÿáøñã˜={vÐk†H‡ÐB¤+Æ ó|½W¯^?~¼”ÄÀÿ\xá…([¶¬ãk?ó / ''Çõõë®»Nsgƒ0,yÈ.l^ü¼e*ÎP*E`6'Œ=êø:WN³W3 ‘·ç’%FM€¼¦Y€É$Šüü|G &Q¼ú꫉K!ÅH¿#}ø 07Ðà?h$k_–¶žóݺu+ÌŸvcĈFÆ‘éÀ† ŒÐN‹-Š¥X³óóàƒk†óú§°bŸµçž{®ñ:áß+W®4RI#†&’ÛÖøîx?°7ÃÄ€=ù¡W™û¹õ>ão¿0ÍŸ¾ùÌüÛZ·¸ëæÏC€É¹î¦RN†RÛ×™ï}VÀÏ7€SÏLú¿Ìu "éõXËhºÕ.‘*0®sçÎFŠôŠ+Œ9/.ÿʺV ?òÈ#F%1ÓC§L™b†…µ|,€B‡ëî¡›ð¡µþë­·i–#ƒ¯vÃçÎì%æß sÌ4-–†Ïø;pe‡@ã}ðâ>àÞ¦7S)'C©¿/@óT@î›o†™–Ï6Å"Éзˆ=~™'L˜`„„Ü`ojݺujmDʬ8†<­Þ=áœ+î‡nxŽ úôéSl.K øùóç!¢h LÉ£“à1 çGýæEÓüŒßK½/½Ø´h’^f7•"vS)ËPŠ…#–¡ÅàÄÏÀ¾/ËÛ˜$Àžo;¼1XÌ^c£¬5˜ßô ´§9êâe*åf(Uæ$Ó§|G '³a©9y\‚9 BãÆÑ£G x©íÛ·/¼x™}ѨQ#,\¸0h’˜ 3-¬‘ËñY‰É›Óšxædø3‹±¿I'ßÝ•Þ[Œe矟òbÀÐÈO/ÆOWøïTÝ´×^{­«ÐNš/ØIâœX"ëxú>Ÿ[.ö§¯ž“áb@zÆu>ß´ˆAs—‰›©”—¡ÔÀIf6QÕšÀ„%þªlÄïdª¨Ûp9´Ç;pàÀ žMÛ¶ml‹ÐŠL.™IKì‘#GbÖ¬YX½zµ±¿Eå‹.Çþ¶}|w”ÿ./}¾kËñ“ÏAåÜÏç°˜ý œc§&’PQÌP|x*þ{M†…‰,(;ÕkS7„ßÖ2• ÅÚ†¦RNγ_Åõ_`–ÙA6s!/ `øµ‡ö ˜uÁì"ZS„öÆ8ÁÆ5„(m¬Z‚HB£œ £ÿ;< áã‘A:̬,#šslðÓ…jŸ|ò‰ë{Ыˆó ‹-Òâ7"å°×„Ž`YSÀ aÆÆOvb„Ä cá$oƒ Œ°Qhº³‡8áæUW@1hÚ´©1¼V‘H¬Zfý°`ŒiÑVïŘ$Âcxüþûï£_¿~AÙmÚ´Áí·ßvö¼èÙÂL%º6Ê£E¤ÂÈ—scêíû¹–&ÆýîaÆo$†8Rp ¹ÁIe®i¦R\ gH"5´ï“Ï^¶l™gÊ!SwÃyC•˜Ò4OŒóg2Ðr…™D^0S®T®íhÏ_¸ã¹~ Ð÷à¦Ó™÷¤e{¥îf`†c©Œ·Æ’ͰCN,ÕOèú¯AC“ô4d=ƼyóŒÃ,Ö³g_Ùá„=G^Ìã„h¸œú´Ã)1#Ñ—M £Ãz˹”™Dn0#‰çvÕ< ‹¦Ý9øíWàwã—gÖü+ð^à÷+²ÓêßHˆT+S€zãZû²a¯7°oLû1<Ä+6NŒ»:e %<¯>RSÀH ›ÁÅÐkŸ8ÂÞý³Ï>k4@֢ь V­Ze<¾ëÚµ«Ñ(ñ\Åš‹Å<ÑŽÓùày»³©™>½r®™E7i-Pé4óóêç¾oÃVæs\ª‘ûÐÇërÝ÷uû¼(!;9<þœ s[ÐÞkÛñÁ{‚áQz±Æ¡T£Ñ^ë¬]šÿEÑ6×vvo“‹j8àG¥N$¦€‘ïçb èµOz Ìu§ñòxÀFŒ kŠBÏž=£_„=óD;Nç£ÜÉ@~`¿óÏçn^™ô<5 èû0P§‘ûqvÛ×íóh á(Œpñ õð¼Z瀓Ҵ¹æ9Hê}˵ôO|oÃ*L$R?|) ½ÈÏË8™²NÄkŸ`ríÚµ†°ÉÜ ãÖ^ ­¸ÁëEø`Š/…• a³fb1O Åí|ð¼µ`>ߤ}àKî1Cì…Z—îå~ÎC÷õú¼výã6 ‹åø[ŸÅù6>˜a‰sB3—b¹Öíçûç}ôüo‰H¢5ô2´šPSÀpûDÉÓO?mÄÿ£ð¥pðQ8éO+>8¿@k×¹›X̃ö÷8§Uuþ<Ž ?¯ºóq>ÍÅ.BSH÷Áƒãµ×^‹úøµn]ò1…‡ó;|tèÐÁðïJÈüY,׺W§]†¿G&‹+£¦ ¼“6‰›("1üÁfúçeHœLÃí%ýû÷7< ¢ K°ñv[ˆâ)ÌcÏ”5$žîš±˜'Ú‰ä|ØaÜÿ¸í^‹Vp#4…doœþY¡“Ñàuœ£9¬mà\'™æp˵nñáZsN¡ÁÕiÙ,$D z½ûë·òœØ›‡Û×Âäñ±/¤Ao!§Þ-o¶²eˆ½!ã^Òïf x‰ÍôËË8™†Û'¬ WøE.¢ÐÛ)–†ˆÇš1k†‡">'F{>B©ÛØœÔdØ‚Ÿç*Šæü_UÜx“»e>¢ ¹ÿHπᡤtÂb¹ÖIîËÀÖ·€!ÓÓ¶}KˆT>§>½Å‡+m[ƒ_cXZ£$®úÄêcŽšnˆÙ3KN¦€¡Ã_7C@âf èµOI.Ú¬¬Âì,k"™'’£±w‚=Nf±ñ±/˱˜'F{>‚†MZÕŽfh¢q;Ó¦½¤ç? ì˜Ð<‘N$S8b‹GÝÏ5qÌYÒ‰öZ§@Lé9,an×c´™Ñ•éb ŠàÍA/Ð1i¥Ñˆ>öž¼rµ£"RSÀH íÛ…šºíÏŽG ·ÊFƒ†Ž¬0wÄ‘’  [qö@y~J\a‹yb´ç#ÛVÅ^óbó5Ö†0Å´e×âû¸íëöy1ŒØØÙáˆÇŸU÷ÑWò˜³ÃÃP\vvvéVÜG{­S„_>˜öm•Ä 0®j_瀹ØlÔÙ«Š¤ÅŠOö¶ÜЦDH›V½ºáìÊ'}Ù[õÊ8𵋄$†’§%Ø´+t~À NT>÷Üs†)½X,³f|•ñV'xóÉÆZ”6œ_aE°µä%¯K¦–òa·jçhÁ.¼®SŠE¤°$Ë8-t4©iX8͸ÁôG†’hÆe‰oθåQs"”ÛÒµ4t$ñ뻋QkÛß]˜?ÿxnKý‰s6z§l\Œ*ùïüè€ee·¥à½eá¯q¦œòÁì¢DÎ ðÔxc:ÊçÎõÝ98QÂbÍô$Ã8­r•ÏŒÐ4̯ù×ÎáÃxçwŒô9ÂL f^8ÍПi¨¼¡œVFc¦ÌçÛ7«KSŠ0~ÏŽÌ;,ü£ „Ë"^Uàñ:_m{_£/Ä Æi×t ¿MbÉü€lØé­Âa5‡ÝN!'©Y%ÿjkùK‘jp¤Ê°h8kŠXŠ,E¦ŠA2ŒÓœ(Ü6°WÎe- oˆh¼˜¬ì‹P!à€": àâB¤\ã‘•…¥K—¢e˖Ƶëk?®¾új,‰A„$Ã8-”H¶‰’.HÔ=.ènâF¡Ùs999FŠ*3¢5 {{x“VÔ3%uèСFçÅ8ê¥ë)=¸èþøãÂ0逰qãÆ m8ŸFA`HUH |c©Na >Çá³~…£vˆvíÚ…5j8nCòn¸Á·KèJ „ÓI¹P8³ˆ5jô3/Jš®*DºÜ_ýµëë¹¹¹èÝ»w‰W°‹4ËÌ.l^ü<Í2çý^\Çd•égÔ'1(8f‡?9™ööÛofO°Ç¤QÈ}ôѰÛpŽaĈ¥ÿeíf™¥´€PBGk‰xÓwïLjJT²8~`/²Ú”lMV Gs¢ÍÊ©^´h‘ñ<'Ù´ ÈÜ<·œà½ÂIç„Ø»'Ë,3ÅàÓÖëJwêX>Œnݺ =[È*܉fÝX!Òý~`ïz|Ù Öœ - Ùxq'f™5R»“§ÒÖàTIÉ ŸùÓŒòpJu³°Â04j/.£°èlëÖ­†@päÀ¿í$ΧU«V-þ.¨É0Ë”d,(ãÄ/Z^ìœüêׯ_¡°$_ xr²»¦çÑŽ; a @péÍÙ³gÇw5µÒ0Ë”øV[•”œ$¦Œ;Ö˜ã’ôBDGÌ|Xk€$„Ò0ËÌ1hÒª-œðÝEyâX†ÜÚ£†ºW³ªÒ‚3W^y%Ž9bÁÂ… e:'Dª“,³ÌLƒ_ªÖDÞÀgüw‘l[ƒük]_æ$XèB‚Š+"!!"MH„Yf&ŠA¦B;j'Ž=jØK0[ÈiyK!D)’,³ÌGEgq‚Ù^9Óœ;`ZiÊTR !„Ä þDRI¹bŠáQ!R …‰â«Š,X๠Óå˜IÔ¤I0!„Ä m8ñ³™Iá¨À-üC{ Zõ¶iÓFÇT‘²¤W˜(œ ýõ’8ÆtˆhS¦Î™3§Øóô¢ ÝæÍ›%B J § H9~Èÿ<¢M§M›T.O!™õïß_©¤B$‰Jï-Fùïò|÷۵ŧbÀÞ:žZt–<Ü|Ðãwp'—ÀP7ÁÎ!Å^Û×™ûœU#ðó çÏ¢ 8½·µÍMÍá•sÍT±IkßëæëÃl¦TNˆ‚Ìœ9Óø«’ÑH‹®ŠZ·XˆäÁP첇|ºDì­×úxd@wÀSN7ÝüÆÞ\ÝÅ,ývr ,wr°› ½ü›ä„Ó{{ÁðÕ9u17Wê*Bøž2¿ýƘM|iÔµ¶8YXÛÓ=Ó‘mkpÏ¡µ˜’3FWŽÂ?B@FuB!’!„!„©IB²‰ïÛ ¬œç¿£µg'PG¾CB‰AD…ŠÛ˜ž7IEND®B`‚refdb-1.0.2/doc/refdb-manual/refdbmanualfig2.png000644 001750 001750 00000022522 12255431171 022306 0ustar00markusmarkus000000 000000 ‰PNG  IHDR®®¯ 6î cHRMz&€„ú€èu0ê`:˜pœºQ<gAMA±Ž|ûQ“sRGB®ÎébKGDÿÿÿ ½§“ pHYsÄÄ•+ IDATxÚí tTÕýÇÉd_ I€B‘EQ¡ŠXE–ªˆâJëÑÚŶzjmm]ºjw«mµíßÚÖÖ..uáTiµ. .ˆ »¬DBØ [HB {òŸÏîäÍdÖ$“y“Üï9sf{ïÍ›{¿÷wÛýݸ6'ÄÀ ÆošÀÀ×À ‡Ë7___/‡’Ý»wˉ'äèÑ£ŸƒææfÙ¿‡s9öøñã¯ÏyœßÝÈËË“ŒŒ ÏŽHH!C†tì ?Ÿûõ×^+ãÇ7Ä& ÍæÍ›eÏž=ê¹´´T‘T“‚Æ"¸÷Háù矗íÛ·âF .”AƒÉK/½äþ¬  @=ŠŠŠÂ¾^aa¡8ÁíI{´¥¥Å-ý}¡¼¼¼ÃFâFÁj¸¦ËjKGµ:õ¿Ö¨ß»ËkðhP¯Aȃ`ÈéRpÚͲ§¬ÝØÊ0È­ëúCoÏ‹iUÁêÏ|ðÔö/o¬ÄíÍa_[« T‡ñkõ™Öæà†üEo>ÖDÃθUòûÕ©¥2‘œáÉ>tì­ª˜‡•´û÷ï :æ$®–½{-:k\bH¿Ù› µ˜Ôqé¶=bh²,YðpÒžp›$'ÇÉâ¿ï”äœpþu!Ö„K%1çj÷2¢`¤2d¨”íï"|þNYûáb1è^…PA‚µKõ˜ê!-ÓuuM‹ÚñtØj’sÐðëeËú¿†tü'§Þ,ª†JKc³[W­Úÿ²_Ò²ŠwÐð«åPeœ Ϋ–•¼lXÚ[$.Ðѳ†º£~ÕŒ*«Û kþÜ)wÉ¡#Ò\³°ƒw!TÉ™ê8âW'¶w×¾£EÎÁáÒÃs³êeɳÔ‘ .¾ÁIÚ åY(ÙôRHz~O¹†¸A¨”¿ˆ~Ú¢¼}²hÞƒ$íE3î“{TäkÛGËú— §}^jZΓäÄxY¾ø™€Ç2@¦ÏºßíîҤݻí9exùÃy§ÊžòbqÄ·IÃÑy-(( ÙÈ5ªB#iƒ„mkªk^‘-^Ò<€ãnq’¶NF7É{óË|}ꊻ¥d/Ѫ6ÉË:"[êmŸ¸øÙ¾».,ÒŽ}¦T6¯H›“¸T6ìØðžFéý›ðõj·¥Å9£"Œ¯©Ÿª0'ÛΑ}딡¶ø­ÿ ùÚHÎ)3¿/%»Û%÷ŠÅÏ4ÚFs›ìÚi1ÆYWJks›d:> ëVvº=z{:cÌ7==]=Ÿ<^%YYÙïEÚ¢â3dä¸ÙNÉéUÞ¬·¡øú.#Î*9Õ@ñãb9z¢¤æ]¡ˆ{:Ï­•­ëžs’©Öïïäôï/‡])Éñ¥²eã{RB!Þ‘.õ ­}N¯âÚöˆ:¸M-Nýõ§’äpeD5·åÈÞõ§HëZ¡pxçK!'Õh¯ö¹z衟¼¶C £­.~’TkO{,Ì­‘Íkþ©jøÃÚ¥O„Õ.mâðK\£*Ø¡TcimuéÁ®Å„º’xeº“Ô¶u²uÏG!»»òŠ®÷›bXQ7Úiùß(.Y ráÔ/É®CÙnw:à°¬Zò\H:z ¢«èÍáߘ×qU‘´e†ª–÷ßžÒµü-NTÀi4 Ϋ”¸¶Z9\]$cîUŸ—–¹d ›´¹%²|Ñ+öh›^œ“kkâVvQ±øñý¡­R /iZï•›èl¡Âœ=²móBY¾©Üí„«<Ž#Ÿ€Ðìò%=åjhl‘¾ [·+ëªðçnZft«¥ÙCÂåpLóe×FÏT²m‹ 9ó*ÏAUÙ«²ÖšOA4µ¤É‰“Í}Ö0몂?$·® )ºÕ¾ì¼ÍÃpx÷|YºÉ7 ÛS ‹TÊÆU/„d„u'jŽáEñ\u¬Hˆ!n„ÑÕº®§sÈ¢yÁõÚöÀ‚ $jç$­——,ô{IìƒO›-•µ­Ò?i¬X´¨ÇÛ§¹5Q6ox_¦MgT;¢3Û×SlnÊ'ƒ“vÖw¥dw¼ÅP![7¾,¥Aôê “nrNÕÍrâàó²óT~lO£®!QöU쓾Œ^§*ô?*%k…LZ¤lzÛRY¾(x´Š\‚Æ“{äÃU £úkO&H¦ˆ!noY ¬7i òšdÿö¥ô€gä‘#GIiiI‡s·—lˆºoÔª_ƒq‡ÅˆW!?ë¨ßWÞ¤u¹‘Hæ.ÝôŒG`ÌØq’7xš´ÔíðI\;8ô (’êÖf‘VC\Û¢¢"¼Ê4›Ö¿î—´_þÙ¾»ÝêN—ݤ2¤HN;c–ì(Ë–¦Ê89\²Ô¶m’ѯXk*¤0¿cZ£.Ò³‰ä¾¤_‚#Ñ/iK÷xºŠÊö—ªç /¾J’|N‘VMÅ9“b¢ r*O ‘†ã%2zôh£ãÚRô4q³²Û“mFOø‚}ûWî 0­X%­ÆØñ×Èè3k¥ô ;÷´ûp›ëüï¯6tè0U8$1)Uêëj¤¹¹INž¨Q;á=z¤K«å<ãΚ(’:INÔ5ɲÅ/˃?»Ó×®%”™•嶺ξè~Éɨ•Öæ:ihØ!-Q£d/¶ãJ]v ècö\4Zâó¤¦>WZS“%9)M’ãæXMƒÓÐk'?Ënâ,ƒ!5©QâãZ3B½óóSÊiëqç5]¯ë;ê¢IÉYçH‘–¶~r´&S*’_!k?*·ßþÕ°jªâÚÓ¦M“’í{$!kº4Y+iË+PxÔ©ÝÐU}±¶Zik>. õU*ùœ<ÞææF©©®”'Aš])‰¯*÷»—ØÖ­[;ÌÞƒ«¨¨X=¨ÈÊv­ÔÍÈì'IN)š–- ‰)N‰)ñWà#ÎÑOiÜ Sç¤ÑÖZ#-Mår²æìݳU¶}¼Y~ô£É—¿üeéë°=q ¥ú*¹tÏ=÷ÈìÙ³¯ž”üÓîpé§ýˆ£õ°dg¥É‰ã’–š(ÙÙÙ’••%ƒ»öÆEš2õ²Ø2))©[ï•:GŽQ¯© êÀC¯ÓeîÕs«+À‚ª½'ºÞµÑxpïC‡U뮹C¦L™ÒéòS†¸= \:¾: â-Y²D%{­j¼œdU:4ª™ …….k_?UÁ·Áä$k´ kÐó°½;,ØÞµíðöjZÞo$n„8|øð>MÈW_}U–/_®j¦yæ™r饗ú,CåMÔÞ¼u¼Ø7nt~åN#혬Xñª,[ö^HçõæÄòC û×ߘ15röÙmÒÖ'UUJ(9ã½¹ZcLxú:pƒ¹TÀÇY·Ñƒ 2ªB´Ð×÷ó è¿VŒ3ÆHÜžA‚n¸A9è/ºè¢˜jPï -,}_ª ¬TUUùœÞ<èq¾¿¬/½B„ëã}!PÑÆ5ˆ2D^ÝwÆß'&&ª@ÇàÁƒ%??ß·«`ʻꪫ”´]¶lYHºœµ³½Áw¾ô=¢\¾,oÈRVVT…±›£#ogŸ}¶|ï{ßSCàó¨­­U‘^Î8ã Ù¶m›ê ö2(--UîÈÒÛ·´ïR‡:%îµ×^´þT² 6ÈÎ;eܸq%® qÃÀyç§þyq÷@dRyæ½N…ô–ˆH\_„ç$ò¨Q£Â¾G:7”|¦dò6mÚ¤²ÌfΜéþ®µµUÝ'Ÿƒþýû«\  +Lÿ&çq¾þœ÷ÄïulŠˆÏÃÙ®¹1ëCãÑ@ò‰'*Ò~éK_Šø=3H^{í5ùÕ¯~¥\\ÔA@êliPtÚHÙ U oĈg¼ vÁ7¿ùMùøã;X㑉AHþÏ~ö³JZb\Ù¹ž-Òü£>’÷ßß§!i$n”ðÌ3Ϩç±cÇöÈï!ÙÑA‘fÏ>û¬œvÚiÝz}Œ­P«Ù nàYufbf ôN[aƒâ:±páBÙ¼y³[oÕÖ±¯Dí®Â—7àÛßþvÄÿ£žÖuPàw¿û]Àéi§õ^«ÑÊ9x<ºcíÚµKJJJ”DEe îà õ¯E´·¨—Æ¿í¶ÛT§žuÖYªq0,pÍ`paé38&œÕÀ:I;@âùËÈêLU¥¨¼uû`ÿÉ×uøŒë@à›o¾Y&L˜Òþq“+V(½ý7ZÒ7!š¤E×Ãsð…/|Á–n¥ÔÔT5ˆì05F ÌüOf¼ñãCÛ³cÇø8÷ÜsÃv½Å4qï¸ã%%¬¤}ã7”ó_mR׉8{WW0 £ÇeffvÉ¥¤êÊ”ŽJYº’®ˆ^Kd’¶×D%Mò•W^ ™¸Öûf KåGŽÙ£ž‡¨÷…^>ø@Õ Í3Îptß›nº©ÃùDz0˜Þ´*Ah| þ ×{YIÊ#i ùtµ«ð5­C½jwåÊ•rÁ¨×|ƱH­›ëi_¯uÍ={ö¨ Í%—\ânÃwß}W.¿ürõþÉ'Ÿ”ÏþóJ•áØÿøÇª4qÿñ¨ïÂH_<3¨kô‡w¢O¯!.RèÎ;ï”§žzÊC3gŽÌ˜1ýcäøCùÙÏ~¦t_oK‘£JXS\ëׯ—éÓ§wø=$ƒÕq|$*„ýë_ÿ*·ß~»{0}îsŸsŸg%Ó(ß+øç?ÿ)·Ür‹û^ ŒNhñ¾Ž?XIb½ÞÃ?,ßÿþ÷Õk/×GÂ`å~õqà±Ç“OúÓêõš5kù~ñ‹_¸¿ÿ÷¿ÿí¾g’Ñ!µÖcÿûßÿº›5k–ú|éÒ¥ò™Ï|¦SýÊF3‹/–O|âî>ìUÄEE¸ì²ËdÒ¤Iîϰn‰Öè- 0¸ˆ2555ɺuëT'óÉ º“ˆDñ¬IÆh×ï!5V2Ák‚‚€\ ’1Ýr¼–¢ ,ð˜ÖéØë®sm4DÑR I‡^\\ì–~[¶lq×Wþ¿é=½Cp@Ä}p=ý[HGî]{X¸>×€ˆV©Ï}ðŸ¸o®ñ¬Kב¸úwØ F¼(úúŒÿÁçÏŸ¯VNwV§'ÑGøH“·G‰Ë¨‡ 4°UzâOýÓŸþ¤¦L’>îºë.õÂAjHdlýñ”¿üå/î÷<''GuÆþó%¡è`<zJEo¦“Q=x½jÕ*“ׄáxýZ[îV2¡ÿéB!ZRj n "ø*ÔùxÖ3dÕÞ>gPèó!?F¿áxæD…z:¦™™¬³ÄäÉ“Ýê÷…ôfPÑ.܇výñPÅn¼ñFõžA Ñqy¡¯vÚpë5Äeäß}÷ÝJϲf Aæ+¯¼R½FG%…ïõ4?‚鼦~üˆH¬aš¤:LûG!¶¾ö­·Þê&šž.ÁÚµkÕ©;é­·ÞrO«€ŽÖï!93„–°L§¥| èÿbçéiŸ¥_”@Âêë[ïKmD¡b@tMÚ rêûäw!'Ä%:ñ5q‘öH}M\Úî½÷Þëq¯J@1K܇zHI–¯}íkFÉ¢E‹”ôÄ¥þ󟻉øŽEƘzþùç•'B“ãßø†{ê´ZÆV=ÉhõSÒÁºƒTÖï¸O«äD‡õç'õÙú3ntPE²òÓ5î]{ œXêú5Õ¿…ž«÷ùøã»‰Êÿ@jò¿´d¥} /Ò›c˜]¸j…n¤?Ç3#"\:“\Ãu¸ï®n…`âB ßþö·rõÕW{H[T„/~ñ‹*©º®®NIÝt$S=º u_$ÐW\áîL$—~ ©!ä×ßé€Ït´þŽi–×B@N=•s¬~èÁ±>ú¨{XÁ ÓÄÓz´¯NÕ::°F‘˜HqÔ^ëó‘’`êÔ©ný™sô{î—{×ïyM;ëY…YªbALÚ„Ù ò2‹aPéã1Ìhof£‹/¾8,÷I ©Wyp½hU?Æô.K:!ddú¿þõ¯•'AK1¤ÒÖjŒ ‹1ŦA¼•ëÿþ÷¿—¿ÿýïn¢ÐQLZ…@wÖFÄùéOꞎ!£¾.é÷ 8MZ}mk§¸¥ n!mé÷Áƒ{çm y{ø--Á (ÄÒï™æ‘šd›H{iÝ™kòZ«xW ¥V« ê¿þõ/7q¹oj“¡R#.÷ŽóßQ z:{,âÄE’!Yi,½èüò—¿TDÒS;Dzâ‰'Ü:Ò…†×ÄÓwu*Ò„¡C‘.ú;tTÝ!ú>¬–¿Õ:ç;-µô{ë’!oƒË*q½õ×P³½¸W}]ôZ¼¾ÀÿÑ3÷ŒÊ¢%µžâõ{¾gÀ!UµÞKH]KpÚÒz¼GPXýA[bkX:“߯oÌ2ì‘hF#NÜûî»Ouôw¾ó÷g‡Æ´ê£tâܹs=ÜE4ºUÝ Ñ­”•˜\ËûzV½Ôß§ƒ­þPõ{:Ôªÿz[ÈVÏ„·qúâ‹/z$»£ê ÿO«|oõI3¬Ðꎾë{–<¡÷Zaõâx@þ'3—·ºÀÀ'íSƒl2Tîˆ(vâÚ¼Sº4þUE€Àj¨Ì›7O‘ËÛh±HšLZ·£ÓñxµD «%°¼µ4¤sq‡a±‡ê=éŽ[´À aí Hd´ J<:v@D%.z%À`ðžþ´'Àî€ü¡’6˜4Ž 0ÚP7 _ýõîïÈp#+ÌE¥#J\¦Bü¨Ö)ÝÎðáÒ?ØŠ^9²þÖºyÏ.ɯ w¥±Ž’yC§7jwââ¿¶—ɯ‰/¿t¯!.ú—Ñ‹ÑEÇRæÃÉW ¥Ã0"|e\A>÷å$'ŒÌÃGûJâÁª”ÇŠu)Ð{"¾¯hwÚõüóÏWÿ ¥7ÈIð6ÜzqñâzÁ˜ºæškÄÀ>…t¨þV†G‚`è)Ÿm« Dż#V±¤¿]Ñù<AøM_e©BÉa‡lÚÏî dëal3SDkõoÄYqëà%b¤Ì:cÈèÒ?LÃ:;,xW±!CIïÃ`ýÌ» ’¯%?þ<}蹟>Ðõ"Xø*3*É@Ñ oĈËTCà)€ñáÏð‰†—@»È06tGÂѺÀÓ©ž)øŒÇ’…f×´¿á`ò}Aonbº··-@öäðUß+Ü6Õ…C¬×æÑ 0=‘TÓcÄÅ2ݾ}{éÈgZÚiéÈ{ˆá«#}IXŽ% DKn>ã<’tø 2qm^óÀЈ Ë:jèÌÎAþÔŸpÁ`êÌ,i{׸W*-›>óÇ#5ZQM jwu’ ”óGB#,G˧ۣÄÅ5quÂ8$£Ù Ä>@˜èYJÛ!ºdjî?;”cêQâ"ùãþ¦/Œ€Þ¦U‡P+³tÔ‡®è~ÁtìP§wŽ ä‘Aöç%ðw.Ÿ{Õƒœ±¶ß6~*tV³k¢A¨0»îââââââô!tÙë«r¶µfTˆË¦]‰n±¼ç'?ù‰ZÁ  ø‡¿hkÕø-uAê„hÎ՜߮ mç}@ J©’ûQïm–¯³¬‡N`S>Óv1¡ãê­G;³A^_G_n»n“¸¾Ö1é©‹2?”F¢>‰åã Ø‡µ––Þ•FŸC‚˃>¨ÊÛcKŸKÒ6%šxàD–§Ÿ~Z•ãDßb¥«Ž©àâoadOîmÎub–¸TB¡L’&ÅsÏ=§j´Ò(ì3‰¨Ù…Ag]-ê­kýùÏVFm,Χú¶µ&®t&Ó¦>†ßæ½Éêo¾ù¦Ê¥ õµø}jÙ vk»p®óªÂ~ðIFumpï½÷ªQM‘:¬M ÚåŠeI9ïë_ÿºßc©rn=楗^òøžF?çœs”4¢Nù¥o¿ý¶í¦?»µ]8׉y‰K†¼z¢µàÖÏy#ôH½Î 딩^¯ óõ›ú$¬Þ½‡2Pì«À’jë¦Í¼¶[¹$»µ]8׉yâz½Œ©lõêÕamMÂ9ÇjR1²FÍ_ƒÑØèjú–édi¤¿O,t[¦YÊéDu;#ÚmÎu|•.ªøð[Ù¬G¼ _ýêWÕ3ºdXI•]ÐÙn¸áõL¶¢Gßòô.ë1Öcô©á WIDAT*VÚ²Âék‰ mÎu|{fÿmÛ¶ÙWâ~å+_Qå…(O\HÃÚ3þ@+0 XŸF¹KŒ’@ 3ô0ÊÀ[KšRr“ººì8ÓÕýo{Ñn»p®ÓÓèr™Q¦H® 3ˆ]àùðÞ„Ñ ÊsY jÛJU00ˆ w˜!®A´Œ³`0Ùa1I\“Öž«ÀvMÖÍ 9Ú¢g/ ¬ÿ`À …0 >n,9~`ÂÝÖÍG0žØæ€r°x¨Tƒ÷Ï‚uO ; ˆ¨ß…Ék¾Í{î¹GH.Ù}(\â&7ƒÐ0¥BKJJÔÞÈV¤e£CüÜøÃT­[¢Œ¸ÀØ…‡ ©‡Þû%®³ÃpÉà EÅ .û«Yw\´ ­’ø‘Ò—¢rD P‘hö=F‚²Gÿ—Oé{$*EÁ²eËÔ3ù´•3 "Xñ›ßüFEÄØoN×ÁeS>|ÞßúÖ·Ôf‰´YŸQì–á¤S™QG Ä€)ÑIž¦íº¶ìƉ´ä~‘€ìwÞQÛ¿’ôÂ.´åÌ™3Ý×!JˆŠpÙe—©ÄæìÁAÙ¸›äø‰'ºaWJT‰uëÖ©]%Èô*ƒ0@P0ʬ*GâÛeɨgÑÎp¢SЭ¹‡±cÇÚž¼¨=Z5ÐI6¾T f.½õ)Ó»wéP0y <ÈA@ßÕå[ùŽp+Ò˜ ÀÉãÐ@ ѤO© Þˆv†“þ}ôj¤/ƒÄ®ù觸½vîÜéwï3 4ëžÁ¼·böìÙJ÷eÐ3Ý#у1¾ôrq\^ÌPalí…ˆûŒ~âë>¾}RâF;ÉßAÝ``ˆh¯‚uÜP¡ÕŒNÚÐ[ ƒü¨—Jû£"X—31‹-X°@m¢ˆ1ȱ¨W–¾òµ{¤·º(Xi˜ì°ú+;¥#mƒº¡€>œ5k–Ò™™‘ºÃ]h²Ã :èôHO¼3ÝåfBåbFB]رcGßV ºXüãÇWn=µ¨_ÝvN·;a qcøXm"ÝgÚ!Ú7éì0ïcLF™!n·Àd‡Ä$q#f¦UCÜ€°kv˜?Õ XF™A“¸v¬Ö]çØ}¢vXwcЋ%®Ý²Ã‚Ýg8çô!ã,ÚÙaþЙs z±ªàhg‡uç9}HâF;;¬;Ï1°Lv˜AÄ`²Ã q q q q q q q ú.º9#úhmýÊ•+Uƒ¾êÙ–¸,gÖéS|ÍÀÀ¨ †¸¦ q q q q ¢ˆ¯€˜1c†I47ð ëf*¶#n,”¯70ª‚!®!®A¯Âÿq¶ÀóžºAIEND®B`‚refdb-1.0.2/doc/refdb-manual/refdbmanualfig3.png000644 001750 001750 00000052201 12255431171 022304 0ustar00markusmarkus000000 000000 ‰PNG  IHDR&&ÏÄ=Ú cHRMz&€„ú€èu0ê`:˜pœºQ<gAMA±Ž|ûQ“sRGB®ÎébKGDÿÿÿ ½§“ pHYsÄÄ•+ IDATxÚí½xeÚÿ§'@:„ª€(¨¨(»î®kYuÝW]õe]ÔÕK÷]+öW]ËÚËßÞVѵꢀtŽH¯"Ò -’üÎç Ïar2§%çä”Üßë˜Ì™>ó|çîwJUUÕQ(Š8Bºg¤·A¡PÄ1%V®\ö6¿þú«”––\§mÛ¶’íú[Ë–-¥Y³fú–(ÉFL;wî”… Êúõë Qüüóφd¶mÛf&À²½{÷šyˆ„õâÍ›77SЛž.wÞy§\~ùåú–)±&&ÈfË–-òÐCÉüùó 1µhÑÂuÝüü|3ÅüF›É‰]»vÉæÍ›½[Ò´„ ,Ð7L¡ˆbš={¶äææÊ°aÃÍMüå—_\—Ï;Wß0…"^T¹ªªªFuÛ·oïº|Ô¨Qú†)u@j¤wXQQ¡wÕ¡*Š8 & ÙŠj`ðW(q@LŠšÕP®P(¢LLÄÿ(T‚T(ꊨ¿333C^·¼¼\6mÚäú[^^^Ä7lØ`b¥ÊÊʼ!H3„€uëÖygÝ`hÚ´©Jë֭墋.ò»ž¿kS( HL¡DhCFo½õ–¼÷Þ{²hÑ¢ö A…+‰A ÄQ…b®š4i&mÛIvviÒ4_š4+´´LÉÊi))©Y")9²«B¤xc¾¬-Î’Ó¶ï‘æy®ûS;“BÄ,T`Íš5rñÅ#:ºOŸ¾Ò¾èÉi’ïô©²{çÖëïÞU,¥¥»½ïÚ¹]vìØð hÕºƒdddJn^u€'ÇHÏÈ6côØô|©’4Ù[•ë9ï4)ݓ㺿Ê}ÓŽ>NÇò½•²|Õ&9¢O;×mƒ¥Ä(ŠªÒUW]eHéÔÓϓŽ¿‘Òò¦ÕÛ훲}¸!»UÏ r±#µI¦.Ȫ˜$Ó&þè!¦k]çô…"^Ñ ^¹O>ùD~üñG9îø“¤I›K¼¤¯èØ.Gzvéжv’oZZŠtm»Qvn[a¤@W•T(Q˜HÏÀ¨ì–èúñÇ›ÿ»|ì(sß¾ ?[òó²¤INðSÛ´¥TZV“FfFšäåeJ¥GçZ¼l«lØ´«Î×Цe¶ìÝ9E&þڻ씳o—E+«çós3%¥d‚ŒÿvŒ‰ú¶ ÈnP¯œBÄÄ Ý½{·+1!-åç7÷RMýì î-äôAEÒµ¨‰dfÖ_ˆ«¨è$O½º@–­ /†)¨[û]òýÿéÙÇž¿ýŒõºYZµÈ•?¾%ë]±o›4Y½zµòT¯œB{b ¤Ò Iõ;úøËŸØY~f‘lÜR.³KñŽòjÉÉ#ý¤g¤JsÏÿÍóÒ¥YÓtI÷G¨ƒÔÚ·É‘-kGȘ¯¦»“‡p»tØ#F?)åe%Þålj)))ªÊ)ñLLÛ·×ö¤µmÝT~sZyç“2iú/A÷‘—›å‘Xr¤ y¶‡¬²$·Y†Q«ÒÓS$×C\u®¬¼BfÍß,3ç†î¦ÇŽ4ö«kII¾ønÄc.ÒY` ºF~+qLLn8áèöòý”!‘’!·efв³Ó¥yæùvħ!¨‡{ü,¯ô›¬‹Z«Ä¤P„ˆ{屩téØL~˜³!&ŽêV¶éSùaò§ußGQwévÈe~‰iíÚµªÊ)ñ 1…3‰–^óËö¿èî]ÒdÚØ'e×®º—%é}ØIRžqœü¼aoĈZ¡PÄH•«¨(ßOb»özþn¸¢r„thñ«Œñÿ×k?Göÿïé#¥%Õ¤Dty0²Ö¦ E U¹`ظ!2ª$Ó³kª4OŸ&%Þ•ËŒÍÈ šgIFùXÿmýHé¤3n”õ;zIié~I)XÁN•šŠ8—˜œ(ޱǸöÑšXÿÀŽU2}Â˲|öþ¿yãÇ2è´ëdéÚ¼ZÛ¹½tîkžuê옙•#Çþ›,YYÛ^PØÊtXí±Ó|9…"$¦­[·†&=m.•V-š„¼ßV-²¥IÕDùvÄ£²½x“ ÔöØaOš5áÿêEJ-ZÉ‘nw%%Ð,×½Æo ùr EHL%%%~Û¾}¿ÁyåÏ;¤°y¶üº!xúH§9²hÖ« &3§Tר–¬º´Ý*cF¼T¯k9°g?iÚê,Y³Îÿ55kV¨o’B‘ˆªœí$R\¼?®gÖ¼õ!©qÒœ‰Á½h[¶c„.5¶¦¼´Ù2î›õ:ç>}KIê1²yk`U,+'/àïZ“I¡ˆ±*ŽÚ )‘á )õ<ø¸}ªa¶T”™ÓêGJNù³l¯8ª†‘ÛÒÒ³ýö–jcR(b,1ErB2‹ç¼Zƒ”š6Í÷AF-SQײ»,Ǭ_{RZZ† <ýFY¼ŠŠ”¡åÓ34@¡ˆk‰)dg”_Ç£Žÿòy ’Á}ô€ÿ©EJyù-=’*s'?YoRpúûHI¤së_%uLJ’]þ¹´oQ;´ ·L:äÍö\»QÜ–<Ñp…"ˆÉz£|QTT]ò6%%xéHlD˗ΪAJ=û^- fYkÝüæ­å»×+’» °­sÊ?déªêÐŽ?ÊÄ1oÊêÕ+eé’Ÿdö”×$·É~µ®E^©ü¼ø-™:ùkIOs—m&MKQ(âXb¢Æw(èÞqw êÛ}®–òs¼uœX³jA½Î«s·C¥[Ÿ!²zmµ$WÔ|žLžP“i ›S]{<3£R6¯ùT¶nÙbþÎÈl¢o’B‘èª\ZŠÿ =ºTʘ¯þUƒ”;þfi–³+¬„[È/ÈyË*f’‚ÜÝ2ˇtúøƒ—÷0yiÝ;•ʘQÁÝ–È–¯®ö¨æ§ÊOeµã¤èuÔµ†ðB!¥‚ÂBiÙù÷’“¹]–/øRÖ¯_§o‹B‘ÈÄ´nݺÀÄäÁ®Ò&¦àZyÙnÉoÞAÊSºzT7H£\èœ%cF>ô8;,­»\X#Ávû®*£®9mRxèZv<Ï€»¿YÕ8)Mó»ï6m:ÈŠù¯‡¤––—W蛤PÄ;1³©ìݳSÖþŠg®—ù{«©WM4›üa\pYÿYgxÝü[·•É 3o•éã_1^¹ÃŽ<]öfí] ÉŠí_ÉÜE?ÜÿŸæ…|½»Kæ5WN¡ˆcU΢b¯g ºT£¥ûî¦5Ÿà&ö7¿íAg‘Y!m›¯—’]iRÐùjé“!›wzÖ)­^hm#:Ië1)q@L»vÕ­=w^ÆùaùÜ€ë{ôëö¥Â‘õ”Ÿù“Ì5V–Î>ö¤kd͆ýu’:´,–…³ßËc**«RõMR(â˜6oÞö6=º¤ÊwAú»{´ò×o¹” ÏÙ·o¾T¦Oþ¤Œ8‘ZEݧjbêÜj¹LÿIÐæ”uEIymñ/Ô*ž …"ƪ\ëÖ­]—·(È–©cÛ•ö×ó®òJ@«—|!çÔNnÒ¤‰l+)’¼f{Dv~'ÇÎŽêue¦l•¥K—ʸŸ¬JJböP­M+;;[ßp…S0dee¹.Ï–Ú•là$hšS!Mª¦ÈÔq\×MKK“CþIMÙ!?Îü(*ª[-"(‹¯Ž»Ò7Þ(ýû÷—?þñú–+ Zöd‹K€bçiiÂÇ!‘RÇÖ[ä×%¯È¬ü®ÄQƒ¤tû\™4æÕ!%ââ·ß~»üå/‘~ýúÉØ±cõMW(1ù³å¸Å‹×””h,йÅB™<æ/ÙdffJ‡¢Žµ¶ùqÞd¿A“Ñ@aAuë¦x’˜µ¯yäùá‡䤓N’óÎ;Ϩ› E£$¦¶mÛ†¼.MæÏãúÛ)çüÝ+)®‰ßæ%¤cO8Cz÷¿Ivï®Mt»÷yå -[w©*‘æÍ›ÇÝÃ2dˆ 4ÈÌÿç?ÿ‘^½zO+j*1aß5n'+m«_IiÑŠê6LMrReÖ´/Ìü¡‡õ“>ýÿ*k¶&9é[ýæ®5è Ìî$»¶¯ð–tqC,+X¾òÊ+^#8¯Ï>û¬tïÞ]}ôQ üT4.UÎß o;‰¤¦U×ÔÞ[UàW}³ÈÌL‘V­ZË€“Η-{O–õ›««”ïZó›wd¿òë¦æ²jùléÚµ«ßõb)¡à)|àj,Cí¼ãŽ;Œõî»ïê(PÄÔ+gSU2² ¤Ì3»bM‰ <ënÙ±i†É™kUt¼‡”j¦wl+®´ü‹eņšK¶nqÏÇ;~Ðd[I{))K—œ¬½’šR%9™Õ33Òj^Õn©ª¬>ŸŠ=»¥¢¢Üäו쮮 P\¼Y*+*kì›VàÙ9ͤi^)ÙÛN6gIÙæÏåì³Î¨uñds:t¨|ðÁÆÞäÄÊ•+å²Ë.“§žzJ{ì1¯Ú§P$-1!%´lY³´íQGeŠª•Vu÷.[¶ Òè]=˜=¤D•ŒTêSU.UÛ¤bïnÙ[²[Jvl’ÊÊ ¹y–Wî‘”¼éØ±ÚøM‰74}Ru&†v–·lÕFRRR½Â!í¼33÷W›lÒ¬@ÒÓ³%3»Ú»–šÓYªªR¤¹G…Ü[U³ø[JJ‰”yΫdÓFÙ¹}¡Ìž1FÎ=÷¹úê«k]]£ß£òÓÓJ‡‡Î-ÑÈ÷»ß‚rÆc)IEL¾‘Øàª«®’ÉS®‘lY$;åiU˜*…9+¥IiT–Kv–H^^ž‡ÐZ™˜'ì6üÏÀòœQÚs¢3.žC&k£"BYY™GÝ\f° A.Î(ö6mÚ˜*œØhN8æh¹ëoðvŽw~øárçwʽ÷Þëw ä_~ù¥\{íµrÏ=÷Ôú°(I©Êá¹úø£dã–j‚(ÌÏ´´cäØÎA–(diÛ„J·pá€ê6òwÞyÇØ¦n¸á%ŠGÔ²O奵*Ì4ñIІÞ¹×_=¤6ZHŒ]ºtÑ›¦H.bB]JV âad ¥žw<Å ‘¦‚ªPŒö’ÕÙgŸ­#D‘üª\²`ÅŠr饗Èá‡÷ðÎy≧kŒé7ñÖ‰÷á‡6¶$¼rnÀKwþùçëƒV$1E«ÄH<à€›oþ£Üv[uËó;НàO^9_4kÖL^|ñE9ãŒÚa©©©ÚÕE‘¼Ä”ÌUQu.»ìo².@‚BGro¨­Ñ§Ÿ~º\qÅòÆox—ÝtÓMr '˜å¨Ÿ÷ß¿ŽEr“„š[&+°=Y{RçνË>úh×âyH'ÔŽòW&ÚxòÉ'嫯¾2H‰¿agžy¦QAí2…"¡‰‰8™Áƒˉ'ž±Aî ªC*ÄÆ@óU%7nÜè7U†@Lg‰” 6¸®K9ßý¢öê´ A]tÑE2i’ÿŠ$&·k×Ψˆ Iè„o€¡›ÀJ ¤¦ÿþ÷¿¦"÷òí·ßŽK©O‘¼H©ò ’;ä Ì‹Î`]µjU@{iñV.$Ò`À÷ìÙ3´‡‘’bÊ•tÐA Z}’gäF<Ä;QANZS‘°Ää&½àýAÚ@5`žÿ‘†J¬-Š¿}½Wu%.Œ»…apCJ!ò›èh n‹%ÕÜÜ\3:ž,ço"ØIìíÖ­[ØçЇôÔ£G3Kð¼PëP5j”¹6…"á‰)Røì³Ïä‚ .çž{.âû&å¯ý«‰v¦-µ©S§ÆÜ³aöéÓGZµjÓóàãä9}ôÑGaÕÜR(ê‚„è;ÄÀÀStØa‡EeÿFM!—*Ë–-‹ w?ç0eÊ™5k–ìÙ³'fçMŸ>ÝÌCPÚ'O‘p“¯úeÕ6'lªC¨ªƒâ½÷Þ“cŽ9¦†·+’˜9s¦!%Ԏᦲ`$·¨¬¬ ¸¿;v„D&xìX£z µ ù¡‡jŒä±Ïƒ8öÃO?ýÔØÂЏ#&<]O<ñ„Ð3fÌðI¬ð2ú!ÔÈSO=5èú¬ AAT±v·K.¹D&L˜ cÆŒQrRDuöã±!öåÿþïÿ¼™ûN¿­V Øwê“K†' U,ÖîlŽß¡C¿¿s|¥0ÔGÔ$œØnP“‚]Fzb¢b%=q~ï¿ÿ¾\sÍ52`À#9áµS(bNLÉŸþô'yá…Ì€ã+ºfÍ(HÀ ñ1Ñ.-±rrrÌ9ÅBrð¿äô6:ïÛØ¦”%t õ[ÅÜ‚ÅÝ:uê$‡rHƒ“2Ç£JÁÍ7ßlT_¼uJNŠ˜¤tÝu×yÉÛÈ#¼¿9RÎ:ë,W)‹‚o¸òùòûÆ8ñ»ăýÅR–oõ»¯P©›c „ë\ $H€ê›–tl<ÄDÜÀVÆ>ù›}@L½{WWæ´Û×E7kcðMeI¶!o°PˆÉbõêÕFzbß„'44ˆ çš‘ôˆ]KÖÄ_ž'µÑyÆÜ«@ ¼àˆ¿xþþö·¿™åÎy?ÉU’ÔûÕà7–ïwª¨d—_~yß! ?üáfž}ò;ÄÄÀGà?þxs\ÔY$…ã@rŽ%^Öçº £o¿ýÖüÆu!a@D bî©=ˆ‰»M]"¾Ù_¬ÊsϪ«.\fÈØäd‘š¬tJÛy<¦$B3&°ºÕ«çý±Ï"cß|(ùÈð^ò±s¾"dç¦Â{…´^—,ƒxEÈo?_|T6ç×ðÍ7ß”K/½ÔÜ|¾ß}÷WÍù÷¿ÿm˜}°Â"]ƒ‡ôåLq~©¬qØ™ªâ$ÎÚ{ k_ò÷õ EEâåà¸Lö…´Äh`kfC‚HŠöEC³)8lqî\÷èÑ£Íz¼@Vâd+‰Ô!Rw–/_öƒ$e&Ö¢<’üq£Ê& x'|½C•dý†ôƒ •]Ÿã9«Qئþbç°5® Tƒ'Y%&ÒDz?^8¾ H+ü4dK¶2QIøzÎ9ç‘–‹4Áýœ‡€tcmA¶£-ƒ›å T$HЪrvé2bb]Ä–- ñõæ|øÝÚlîž[‚1¤aÖÎcA,¬ÏþØRä…‚°­ªÈ1¬] ÒáüN9åC¼\'Ûs¿¸~ l^¨s¬‡ÚÉyCð¡’ ^PHžëŽu^½¼t^x¡¹/÷½2ïm$«2^Pñµ³‡´¬$¨’à]Žef@̈ õƒÁôÚk¯™—,--Í,Ã.D™V– HwW2’jÎÖÆöÄ€†°¬>Œ­ÕüøãÞAÍ—‰ÁÌ`C"ÂΠµ6æ-0 -q bYb´Äd% öa¥ž@EöÙ§U­fì¨ØO1KØÐž ï²-þÇG–É:g"Ò‚¬‰Doû6*bBJb€Q#Ú׸³ß˜ýÚ[£/U,0Ûu! l,v b0µó‡€ÆøB°¿aÏá8̳ÌyÎZAlãÖ¬ÑßWU‰ÍÚÃôxЬß}÷Õ°©YB´Þ?ȱê°ßzë­ÞyöÅË Û{a%:È“//ƒ™{É~ 8ŠíYâ…?øàƒê傌­ä„½r '"^€ª„¤‚Ǫt šƒ “ dD MYÉŠ“3aœß ; +%Y0OÅ €m—ß“1©:=˜´„:—ÛéÂF"°.{ƒÊ—±ìv@bfò^V&;ؘ¨|þÀzV ²pÖ§v3¦[Bq*¤U#cþ@ö©s¨¾<ñIÖÀ‰t‹@Êú‰ɉ¯ü±Çkˆ*˦ í9mBHDu18[ »`]Iõ;UAA$+*Ò ùPNøªGN‚H¸¥ †HŠânƒ×)ñ!qBL°%&<6 ,[5Ø"sHMHOHN‰ ˆ´ä¬.Zˆ˜XŸÉ©Zûl}`¥+>ÌHWä‰6:bb ¢ŠÍ£®75"p+b¸Ë¹øzm:ɳ¾çf“ƒýÅõ@Á °ñeŠV nŒ¥þj>ñÛÉ'Ÿ\ëØx‡P±Å9ÒÆp’­2ž1§»žwÑzuYÎ; q±ž?oϳ¾×Ì;Ï1¬ºï¶Æ¨Fo²ÞÝÄxÜõùºÆª¤G¼Á­Z'êö¦XuV©¯šŠ‡Ž`[$'Þ­xOþEšå£éëŽG³4 >bn圭äÄ:õ%ûä s V,imLØÜ’3­]¨¡Á—Âù`Šü¥àæuŠßÑ€¯±ø,}¿š¡Þ7R!|U7ŽÇrпŢªB$ȉ¸¶D©L€dÍ;æ«2‘jJiŸH’…U }ãïüÙN“–˜¿I7aâ…²7€Áe!ùß©r0ïür8c;œ°nTç€óň·.*\¿Ó³çŒì­kžšýâqñ²ð7ª)/¡[…«Òᡌƒ}]@ešPÂ#â½2±D¨Þ–xF6êߟtÃ3tÚ˜ ¨úØ„ì¾|¥·dl­ðŠèañÛavÞÚwð¹‰os#Q0±Œ 2ãA“ëÃÇöƒªb.@!í‚k_^öc¿"Η€å tß—´@et¿ÙW $Íx@2¸ˆ X…œÈ(ˆ÷²)H§¼—|hù :ƒ!y¯øø"ó~¹™8Øž=FÿºJPN›V²# 1Ù@H‹%K–x“ íͱ‰‡Ñ°7E¾¶™D9oûr3qïiï” °‰Ú¡)ñ\™€{o?l¿m Ëm~e´ïöƒH¦ÌÄ=1¹‰³x`n7ƒ ":6¤O¤J$J$Gî{2µ`'úŸk„œøÐÙ ñg„5Òv}»M×ÅÞ…´å|öV«Oyê„'&Ô-g]k_ëÂDrrÆúð{0òâÆòQÜjV(ˆ†´Ãƒ·ã¬¿œ6û2ù© mðýêñ·ñƒC2z-Qã!À ŽšŠ *Þà–3×འxؾOŒhKi AL¾ÀǤÝY‘€­L@~9åbãŰËGÓí#KŒ„å+±P}£®²¿&8IU`=ì£2ŽI¡ˆ9Mž<ÙÄ9áH‰—ʾÒ9Cœƒ¿@YßNþ*8HÁзo_yþùçÍq¶„ê IDAT“ѧĤˆ[Z‡ä„jGJT¬¥r_i Òüä“OætFKC}ó%¥d«.ªÃ@¯äDp/!*S¬½Nñ 2ù#%lTbRÄ-ˆƒCr¢&ÅÑbY™À­&“…MÖµÿ3á¹¶!5öﺒ‘ Ê$ŽºßÄ~%kò®“"aÈÉY™€ù@H£¼Î¥±'A8äR‹ÀJÔºPÓƒ|Á¼áÇM–86%&EÂûMh´jk:Å¢2!H*¤Ù"‚¶je$á$)BKÈb@r –’”ÄÄQ‘ø`à$Z1¹P@\:ÈÉÖtŠE® ãÄJ<Ñ*?cmHlJ‚˜ŒŒdnØ7ß|cºÊâ…ôܲ°íCµ¿ùþHhl׳—u_Ù*Xµ®!+Ø\¸ú#>ûq6 ŠýÚØ'[« bb\: Û…mïC7)KU9?  $%@¹iB™ìhl×kŽz‡Ý‰Ê QA•p_Ïà?ÿùOSò†;dã[ òá½°„‰´È™ª¦Hní4…÷R‰)ìÃh,ƒ´±]o<€ïVzðW™€¦Êë£ Y2!ºÛ7?‘ÎAZÚçïŒöÆElQ°ÚÞÑmzçIt7j+dG¢0„ÈÿØšœª#Æx¤)·"Ž‚˜|õh«zðàå c £äC=d¸©/<4šfRä,P‡R¶ÁÃA„ëK/½T#7ϹO¾˜½zõ2*ëFá^+^ç6‘¼^DùGyDFŽiDyö¡j_MP‰€÷€–WH ÎÊÜ34I ®O»r+%¹•!Œ£|¤l]ä@ éXï_ ØüÒdSãÂ’˜{ì1ÓÜ‚‡¾OK#X±š¯‡³&µs Ý}÷Ý2sæLÆÏ õ×öÆù;ÛÐ>Ê,–-[fjGßrË-F…Š$B½VZ,Eëz!\šŠÞxã¦GŸ–vÇUW]å­éÄå^!å`ƒ¢{äŽ=&^,>>¡’^7Î=œzK¼;r¢5wˆ1!2;c5€mr lÏ47ÿh|è!:Ÿ4iRßhÇýàƒšºP6w‰ùH£¾×‰ë¥U9 wž’R` Æq¿hB¹bÅ ™3gŽ!%€„Kq¢È£áÝâ£T_‰Å’[]ªµÚ&®á¥…o™;pçÍ›ñ8 ߨNËÔÔ8ô÷hTó‹Åµº]¯"tPÔðË/¿4ÿû0Òš5ÙÙ µ¾à@J”øHÚ&ÎJû·ìz¡4•€¸,yñ‘¢2+ÒÛí5%ÅaøCÕ “…½‚Ý`ŠêãVGúÞïüý¸ãŽ«ñ›M¤$VÕª¡îµFâzí1Qõp‡*5ñ‚2@ý›L¼××® è´Íöw¯ï¸ãSq2QãA<ð€ùøm:`IÄ툠œû’™s6%Ž1AP‰Ø"ªÄ„ „óùçŸËË/¿ì•\üh‡ f\«×_}@Ƀ±5;Ûs ÎwÝu—)`ß÷Z#q½ï v¬gžy&dã7"½mµî†DlÑ P×>þøc¿¿cľæškŒ±:ظ%¶Gm‚|¸‡”3ÁÆ |û6l ñdEŠç…¯‚±}[)W ‰‰AÏuµë$Jg„:;m…Á€ÃãŠ+®0–Aƒ™exÍb)At¿%&H IûZ²@Ëž(%`¸é¦›êŒë,¨ˆ¾ÒR²… (1)ÔÁF¢AR €ç «®@Vk£ h{ÙWR×Éù­Ä¤H`ÜÆsŠ ±š„´BØ@]¤'ˆ†êœ•z )_ ÎöŽCƒŒHv’–Ó›©%KAB%ñº©oÁ’~ @¢-ügŸ}&·Þz«©<®½öZc— w@C¶¾w¸ÛA>¨e”åuSŬɦªpæ!36&òì 1YÄKo}×W4nP» #91ì £þýï—ýë_aíÒpöŒ ا°¡Ž¹‘’­îFV¶¬/Ä£Æoâ!‰7ë+¾r¼xÌ“F xß °$…„4ÆÛºU´õÃíºh%±nK÷ÄI¼‘^_Ѹá4“—H<i@N¸—!‹pŒÎŒ-2‡”…—-ÛS}Ëø6 bòE,’x#±¾Bá‹¢¢"¿qO¾‹n%vý7ª›’¿vâVÕcœGØm!&Ì#]HóCQb „X$ñFb}… ¼t¼CÄ}¥%7„Z3 ;š„äFJ¶” ’RìMì‹É­ÂD²6¾ JLþˆ†›Ù0…²M§NL¥pão PÔx°ˆc"¾ ](‰½K(é(N¿Uý‚‘¤ƒñÛ—li"l‡šh뾸˜ŠD9ê3Y釮+ÁrÔòC1DÛèlkƒ…m¹@`HThNã˜N"´5˜ìvz:=ƒ‘è¢ĤP40æÏŸoj2QÑÒ‚FzÓY);O°HoK؇… %A>–Œ°+aô¶QÝØNQålA8´âô0Ž;%¥F©Ê)‰Èû#ysNo6%¼rÁT>Ì i8É’ dB]ƒ”œy|HD;wxH‰É"Ùª (1)ˆô&øÖmßyçÆ#W_ø’êW 8'5j®-¿Ë1œ¤äK˜á|*1) "º1nÿç?ÿqý:Z=ÕÎ%Ù`ÄäyöGH„ 2BB¨sL¨yÎ}QVÚŸ÷°.]V⚘Ð_­QÍ è¹ ,з=L/g]€ñÄO˜F¼T?þxHáT84Q¿, úTÀpŽ4ÅxãÎâc9ó/”sNb²‰…^öqãÆé¨WÄ5è;HLFî@’µßý•W^i àÖÖ4jÔ(Sî™e4µSo8¨¯MÇ78¢C««½*™ÒSÒC}™Ãé÷®P4$ˆð=zt 8ï,ätá…͇« ˆWªOë$')±¯HÄ@%S+' P$<)ц õÍ×+gÉ©®pk”iQ»%%[J%™¼iJL %%)T ù ¨ hŠéþ⌂#78H¯®=霰=“ jüV$<)ª§)Øê’7"ùøº÷ƒIJlG0&ñHÉêêW‰IÑ(ñôÓO7()7uËæ³a¬Æp¨R%¤DŽÞ¶HcZ8C ´‚¥BCR¢ŽRC’R0b@ò DJ†ípÝÿ‹BˆÄgsÎ9FJtvs±U‘§ªr EÝLh Ð¤Š— RB- D\Ø“ê“Ô²E¡! üD®[`Ø'©8Y»òªÄ¤H(RúàƒL›ï†@°¸ Pê/±N]±¶iÓF^½&Wµž-³‹{ÊØ]m ¡:ë@)1)1U-)…ZG©!@ìQ}#¿Æå/4ó‡ç/’CŽ¿@RZµªS»“BA >\®¾úê¸#¥HÖ_ò‡†Ý+ÍZý"»Ë·HfÅIïs‹¤xH ÍÆQÕUSbR(êAJ¤“à‹)9Cœ¯HÖ_ „º÷”íÒ³ÚûçQß !ìMÚ-!-_¾Ü»~ÒÕüV(â•”¨Í«t(§—Ë9©úKÁ€=‰2-dâÕƒx| òο•˜Š(bĈ^R:th\[¤ê/ƒ³’%¶¬Æ–¶¢Ä¤ˆ+ØjñHJ ¾õ—~ùå—£–ùÆ@Ù®»v,g„xûöíÍd‘¬ÑãJLЏ"%J•Ü{ï½qAJÎ\9lL¾õ—P7§M›&«W¯ö.#wÍ’RŽ[46êá6µ…˜¤víÚÛ`ŽÍ:üîlå[ÓItØhŽê×­[·ZÍ1•˜Š:’¸H4¢ŒœÕ _/ÜGa$g¥þö%K,ÁÚ1±-d‚T ÖÔkÖ¬‘^½z‚JÄ L%&E\‘R]Z+5‚|c–Þ~ûm¹ûî»#²*Y"!aÕµ®’“H‘žhR»~ýzC ‰Ö(SSR1ÅÂ… å¼ó΋kR²Ý $¨—^z)"û¶RÒN¸¤äL‡„|AÈÍj×­[§Ä¤P„JJ't’\vÙeqMJnˆD+)áå«ëþBñÖjðÃ?ÈìÙ³£©®ªœ"iH‰Z܉@J¾eoñŒ93ýëT7[,‰ŒØ(æ}'§…a;Ü:PØÊ9äž=%¦}z0‡•+Wš¿W­Zåe~7%Ô"ë˜Õ5ÈŒ¾dnz¸õ BQQ‘kþÒé§Ÿnö«p'%*`§IPG‰ê“ÎàJl7¾ï¶•HxoízÌ3a$gëÔ§f8Fm·$ÞPìHœãŒ3Ìø£¬J ¶çIGLÜp‚䏸ùóç›ÿ!þTG9Ù€Ýä•W^Q&r€’%¥÷ß?¡R‘V˜ &ZBùJ@6 õ )Èé±CÊñGüF'^¿6—}¿s ë~*°=Mš4ɨ’HPõ•þ➘ÐeqO"uíÚÕLNÀо=×ýÈ×hy8?7½7­¯Ô…$ç[|££['¢²%ßx(d¦¤8.•(ؾ­°xïmXÒU"€1@#Z“~øá!Í„#&<Œ0žÁ9F»ÇÚ‡~¨läCJô'LRrž£ó]¡CnCäÊ5´ªŠ÷nàÀqANê•‹"’©s$H ©ã£>JI Û¡›™"Y[vs]ÎjI%1K‘¬Ý^Ã…o^Tc%gKJÔéNôw5{O´$&kbpæÐ‘æi Õ8M`ñâÅÞyRZê‹`Žž„%¦Æd܆dêŒZ×AFðd¢’^+ œ8tõ…hëS.àìÇ>#Q= ®¹qT0àÙ`޹Å%1Ù UTO$v•ÆHJ¤™€D•”ú÷ï//¾ø¢,]ºTî¹çs 8Fð0C,6ìifÙ²eÆq‚ý ‰Ç:VX/R¨Î;{µ+àÂתU+CœuÁa‡wa-Q!¦xs=†Ädk?ðmnèÜÆx^‚%f6Fb²¤„$0f̘„V߆ RKÕaêÝ»·ùï,^­c=6$ :”ä\TÅhÜ3ö‰§›@K$>¼ˆHIñkqb Õà |þùçFDvËñD¸22¯¹©áÀéÒÇÞc‰Ç/Tº5å)2³¥m»"Ϫ‰4iZ}N¹ùm$/¯@î¹óZIOsÏàŽv]èx'¥d0åĆŠ £?qCÑÄÆ91ñµøòÛÁl$:ÆV¼:"¢.ì«ñÏþSž{î¹"n§N¥´¬T6ø!©z_¨ç´k×ÁÌC0 {ϾžÙL²rò$5-C22ó%%­©ç— Ù+ùRY•!e{ü»N‰ñÝìy—¬Ø%½lV/¢NðÚ·É‘ŠÝ3eƸÏk,?ùìÛdñÊÚ\Û$']š¥Î–1_¨×¹ŸpÒå²fs;©ØY³•ͽKFXR"8ö·¿ýmÒ^ç7ß|#÷Þ{¯¬^½Ú84ÜŠüÙ”û›ïßAßÛ0×WbŠ0Bµ lÙV&- sdó–ÐDu1‹Zn‰cÞt5*Ý…4Ö¡&i´Î‘õËÿ-‹MdÝ€‘{à7í#½*ݹ‰ëv¶X¢–>y÷Ýw½¤tþùç'õ@øÇ?þaž1YÎq K\ÇsŒ|úé§Þå|Hõ ‡ÔæÍ›'·ß~»iN’o§NLÌ™Ôø¦§ßܹsMhKŸ>}äoû› 0 ædU.Po·²òýjϪŸwzÔ±&!í3?7S2ÊÇÊ÷£_u%%CMkVß; s–ü4íÉ}‘ÛuCÓ¦ùrüiw•Ä,šåúµÄ;üyQ‡nÚO5Rr~DbEJNL:Õ €4,)…†Î»±fýúõ«EJüãý“ù±cÇGƒM/j4ªœ-ç,k2kÞúIiç†ÏdÕò¹×ÛU ÉU_NeòÝÈGë÷+ê.í¸T–¯lCjš¸0^ \ºX‚ðšk®©U Rºøâ‹.ÑHÉ7Ãß~é!`*[|ýõׯ[Ja·‡zÈ”’unã”(¨vÝu×ɬY³–Òe$޾}ûÊK/½$:TKí¡nï‹£Ž:ÊÜ{Êñ?“oqî¹çš¦•Ï>û¬üþ÷¿7×DjSÒ¢¢fµ4Ÿm*y<üðÃ5ŽÁ¾QYï¾ûn騱£YÆ<ûã·XÛ#.1ù“–ÜÊíîÚ½ÇL‘ %Hdí¯¥&>©CÁ2ùnÔSõºŽÞ‡$E×0rûCJJjÀ0‰ºvŽ6ˆI²]qm ¨%¥Ç\.¿üò„•€{ì±uµ)K×_–ÓV‹Á|ÓM7ÕRS˜·3PgΜ)Ï?ÿ¼!xá…LóKÖe‹P·÷Å 7Ü`fÑ¢EòÙgŸ™¿àc(´hícà¯ý«wH Ð šºëœƒÓÄ‚ª(ç}ç÷UåDJK:‰)’ƒ’)ÛúU-RÊËo)Û‹kAÏ>gɆ­™R¹k¬L1¾^Ç=æ„ dãÎR¾£<4ÛWva­ÞöñŽ×^{Íû†œ°+`OúË_þbHièС ­š]pÁFб€ˆ€“lQ™Èî@ówºÛ†»½/N;í4#ÅüéO2u¾ùÛ‰³Ï>ÛTq@ýBÿöÛo}ÈÙËÉ 29r¤¹N&$ä÷Þ{Ï磚âò¡M‰Ê3ÁÖ¨l5R»U¥c\“•Q°2$À½Ÿ—6[f.šîX–!_#ãG×l»™•#UÍeÓÊ·dý¯+êun'9T–¬&¬BÚî””ò…’ž‘#Û÷t—â5¥¾ ÏÝkW¸^v»­³RT¼UàãAL’xCí¸ãŽ;ž”Ì;æÓ´Ñ6$…hVo¬O÷ç¹ò,°=ñĵˆ‚ŠW]u•Üwß}òÈ#˜ê>ø`u蘂ñ› Bºè¢‹j1Ò¦Ÿ~úɍЀ2×¾RT¤‰ Ôèl‰)*ÆoùaÖΔš²'è>º¶Û.3§¨AJ'žq»ü¼rz-ãwQǃdÆø§êEJìÿä³ÿ¾”D:µÞ,³&½(Ó§~+“'|)¿,yS23öPÓœ ©*þX&yC2Ó܉ÇR¼‹{ôÑG]Ÿƒêõ×_7T²áŒ3Î0ÿSÒ9Ô†•tI±Ò¥þàüý¸ãŽ {{7`„F¥ä7\z饦¹À[o½%Ý»w—³Î:«ÆïH†Í‘äm`c¯^½j¨ñv7T^bíxà³ ©9éT9àÏÅ evï’!cF<_SR:ý©Ü³A–.ªí¡X¾tV½ÎÏÛn–Å+Kö‘Òz™úýÛ5®cë–-Ò½÷Nùesž¤¥VIZÉhÏ`Ù>‰­i P$#Tµ@T‚d+eBŒ…ù±Ë¼üòËÞÐÜàÆ 3ÒÈõ×_PBº±Æo¤˜p·¯ ˆpL¼ù曆H|¥*Þ]:¼P¸ø‰'žhHÈ«xž1³Ä©ñÑõHb÷©§žZëxþœ ELÁHbêÖ1[¾ÿê¡Ë”*«RdÜ7/…|Œ­Š¤t÷Ž QÞ6½dÅšjRêÜj•LóAm;Rf¦ì(©mh—7_¦Lœ”/e°ÄbÈ ÷26kMø0t (˜BÝŽØl4á+ÔíÃÙŸïo4=@-">ã¶/  f 9Y»Ä aûÆ Æ*´ASRl+¦Ô*÷ÌNrŒJæTÕˆæÞ¶#MfM|>äãt;°¯vÔAIéÀžý¤e—ýé%†”Æ~àºn¿ãΓ»Ó45ebí—¯q¼•âË/¿ º­~žzê©„#¥Æ>,¨oHCx#‘‡ù¿ÿû¿FÕ³ÑïI©Êùë¥f‰É Cþ0îÉdròY·ÊÏë3¥l˧µ¼pþpÄÑgKIÊòã¬w‚®·½âp)Þçy DJ½û)«6v‘–ÍKeöÔ»¬‘˜â¡&/³uÂe—]f¢±iicDiIï^Ü\c4v “‡ òØZçþ,ãF¾Yc9’Ò²5iÒ"{¶,^Z\ʼnƒ¯–UZÊKå§©+‚®WQ±7()µkßAJÓO’̪JY¿âc×t›ôŒ&µÊ98Ã⡊%îã@FmìIÄã 4HG¾"9‰)(ªvš¶HY•óä—5óeñK¶€|9zвxå9 ÃV÷Mh‰·HW‹W¥y"M~˜ðªÿõ¼‰¾ÕÆÈŽ?zHÉ]½)(,”Ö/%)’^2RÖý²Öu½œfµÛÅ“'Žsñ °€P À­j­…"©ˆÉöc¯ªÜ+­ öÈ·_~Zã÷^}H““eÉÊRÓ>é»ÁÝÙQ‡zH©ÚܦEº,±Éÿz+÷»Š‹šÏ“ÉÜ“ty9°÷%RQY%);>—ÅË%ìC¾ë®»\_llZWÑ(ˆiãÆ®Ë ÷'»–ïÍ’ÎÝ•=å%Ò¶}Éky„,]U.;6•#ø¸¯ zó& øœÙºüö¿‘Õk«×#H2WÆËÓ¦ÜÿÜ9ÓB¾Þ;Ÿk,ë~ßxã5ŽOÅòÅð¼%P/[·ößé˜Èe›+¦ˆo„Z0eÀIDATØÚજEÅÞRY./aunÜæ+>B69-Ï©•`‹$Ô®Å6Ùµ;Uzu‡‡„ReóÖRCV ·É^Ù³m¤ÌYòSƒ^o¬*X’K>ÀõÿÊ+¯x£‘øç÷]òH«;vìÐQ¯Sd™Ñ‰Ö¹«‚6 ´mIê1^7? g­}Á*Y0÷Y5¯Ú#ØàùyÓ~© uA‰¬^ø¾lÚ´1â×[Y•w©•¤\$bSÈ»Jôºã %¦zÁ_;£@ IÀØ‘cÈúÿuûRQ¾×+!ul¹N~œ3BVÌ©¢&À«‰©Këµ2ùû÷£V¸­¤¼¶øë¯8ÉŸHI¤–$bõL…SƒÁ_V7¡3ƒDvï=ªvó·)Ø%ÛÖýW&Œ©í-ã¶³¼H²3+¤YÊ$Ï:“¢z])ÛeÅŠÒµk׸ &lJdŒS.V¡Pb à ÍÒ—ŒìxÚY¶é§ÊMaÖ™6á¿~×ïÛÿ²go¹¬]òž,‚êæ¦ºRgÆIL1}¨•@ …SªÜöíµÛ|wl—#“G¿çw_ƒN¿^–þœkæ;´,–e?H6ýúŸ"å»–›r% ‚ÂB}‹ŠD &Æo·Ú×;7û/|n£´)×±p™Lÿ‰×NDnOË–­äŸhìŸæO“;NÊÏ+ˆ¹ê¦P(1Á{¡¦cH9é›ÑI ®– c?2ó¸Žû㑊Ò—µ‹ÞªMt;– Z·í&;JKL}EÃã€HèÚäŠý°™!Q!&vnKtCVÚÖ ¤Ô$'UfMû™ïÝçÉ.$?oÎÎm¶zTÆØgí§åt‘]fH‹'ú]'ÞJë&ÛËì|¡*1ù…¿Èo[ª®"€:ÝH©ZeK‘V­ZKÇ.}d妃EöÕ2ß³{iÌoÞ‘ýʯ›šËÏ«æ4|Ç[i]…¢Q“?ØÔˆÌœ–B(Òò5¥2ð¬»eÛú©RZ²CÚw=ÙTpb[q…¤å_ì!¥š¥I·lvÏô?aÐ…R\ÚÁ³ÿtIO«ôÔJÉÊ(÷a•g~úJUÅ~CüÞòRY¹×s~ežó¨–nJKvIIIÍ'ùÍ ¥IÓ|išÛNJ*:Ȧâ,Ù³u„œqzíR¤ñÚ²I¡hÔÄ„”à[lŒØš’Ò )­êî]¶ÌT8Ü#F‰,ñT2RwJª”HåÞb)/Ý"U啲§d»”—W ÌåéU¦Å Fgg¤i“>óΓ ’–ž!­Z¶òì¿úR322%7¯Å>i,G²ròªç³ò%%µ©¤dw3çä¤KFUÍZÞiR,eU{¤dó6)ÞòµÌš1NÎ=÷“æ Åò E ‰É­Ï-gfÍš-Ù²HvÊ!ÒºEªd¯”&MR%Û£²••n÷¨m­ ¡Ñ~‡DSbŸòòò"bG 0ùĶQ£Fyë(ùCug“Úƒ—žpÀ`<ðÀ·¬®^+__}×ç·U«Vù]UÌÜpR× à¹ÃàβÃ?\¦L™"ƒ z.¨•HO:Ò“¿~} E£!&ì!^x¡<úè£ÞâmÖåo«V¾ñÆ2dÈ󷳕F\"j1;…ó €t#¡={ö Ïñݤ –31Ø{¨é! çj¥ÃN8Á{­öTÀöÕ¹sgCJüOó .ô6>|¸œþù5æ!¤ÍW^yÅܳ3Î8C^~ùåˆÉ‚Da¤§C=Ô„&(–˜îºë.óuçKmÕ#FÈ•W^iþ~õÕWå–[n‘#Ž8ÂØœ¬DÃzcÆŒ‘?ýéOæï¯¾úÊ F€Êg¿úH hH{†höüñÇBprˆu89™ìÀ;v¬wž}öïßß,ƒ`©}–l؆´T0HŠcBÄ~ø¡üá0ëâÁ³­ƒØ7¶"$9ÎéwÞ1ª.˜8q¢Ù'Ûýõ×Þób=Óoû[¹õÖ[ÍßÎt–`€´‰*ÇÎG”¹ªvŠFGL D¤¡o¿ÝßåöÓO?5îóÏ?7öï¾ûÎÄÝ0PgΜiH,Y²Äxµž{î9cO"NÇs™ïÞ½»!H{ ÿ31H9.„aIƶ‡²^@ÈRb}«2ñ7R „æôŽAÖÞÃrˆÆ©ªYbB2²çþFmˆ‘í!U+IYi‘m™ @¶ã<‘,¹7œ'ÛCH,'|èСæÞp/‘Ì 4&Îß_8X¾|¹ùpŠFEL7Þx£\sÍ5^;‰©HEãg?ðÀòÈ#˜Á á|ðÁ&oà뭷̶ӧO—c=Öä…¡Î 6Ì J§4òÒK/™yȵñöÛo7ËŸxâ  >0³-’Ô‘GiH±öš@)1¨u¾Ío»í6¹çž{Ì>Þ|óM£’bSƒ0¨YþÙgŸÉ!‡bŽyóÍ7›e Çy÷Ýw½ 䃄‘òûe] ã5Ö‹/¾hÖ\pùé¬.ÆühyCІFÈ– ,ØW\á]ÆÀe`c3B Ú¸q£!%)!1` '`BâkNŠÓ&«"u0È}”am9Nƒ²sðaDZØI@þâ¨BQ‘Ø?Rû€Ø/˸v«.¢Z"²¢bžå!óLHJ%Ë!!†pØa‡™ßëpmV¢#–Šc‡Ú0Ô÷ÚTZR4*‰‰ÁƒýãÏþ³×àD€ñBBuA’A`ÐaðæwkŸùøã¥]»vòÞ{ïy·e0ZË}÷Ýg–3 !k³±`Þ®Ã<„…´ƒJÅ<ÒŒ%$`¥:öÏ9@¬¾$†jé[••  i†míº–¤¬j Á@¨ÌC(œë[5I‰ka¹UK9¶që!ùacbžã’mUà@Àž„Ñ›cjUE£#&H‡/9ª Fjb‡°)2€}ˆÎÀµ*$‚z Fª¸óÎ;eòäÉfС®=ùä“f bkyÿý÷Írl-lÃ@f@#e Ê1Ïï¨L lÉ’¿YU iÅ.wzÎ +æÙŸ%™@1EH6—ã0o Õó\Çe"fÞ’¶)ë̓¬ØÞž†~ª-œrÊ)æ\¬‘›cáP€˜¬:÷ÔSO›Ù@F&䲞¡P$-1!Q0P06é„zK Dkë!—ÍÚwV¬JÇo_|±w[¼•\Î9çïrŽc1^¦cŽ9Æ+ñ`;²’Ž3Øéúwöƒ˜¬zh]þ¡Úh :« B2VrcŸ¨®–1â[¯ •æØ{˜=6ëÙߨdŽá¾X°j}‰û{îTÕ¨8@8K…"™‘RE´^üýï7íY³fy% Ó|ùmé'°'AN¨:€ …B€Vý²î}_X5‰³RpΑÞÜìVVmó òäxœw-ÖvCº’¬OĹ3hµçq_ñ€Úp é¸ãŽÓ7V¡ƒƒ¯7*›Óæš‚t9XÛŠ5à’hêÄ 7Üð|ƒ躮s¹ï6N»)¹’$èF„ц?• óñÇ7©V•$‘7Ü'…")‰ »Äsÿý÷×’B` @áþ~#”!kßP¯êgñ»P‰Øª¢–8*­3œDi¼šZ\Ѩ‰ ïF_Šx%ŒÞnƒÈm·ÚØ¡¢iÓ¦&ÿË_žDá{l+5átSÁ0 »Ð†PÊÖ²_røÜŽ pÏüÆmÔçeË–ÕXn =zôÐ7WÑx‰ erCm, ˆp,à­ó¥f MÈK¡h”Ä0*ŸuÖYÞ¿1ÂZu¤G‰ w­ ŠoB0ð×ñ°.O¢ ŽíïøHsþê}sC©àvþH–DΓjƒ¤©P4:b–„Ž)BõPE³œ5Æ;±›šçPYßmÆi¢h“%Ÿp‹¶qýVm… ~XÆ>!-Îæ6LÂt‰‰:ùä“õ V4>búè£ÌàÂ!ÙFJ3ˆ¬Dªa€Ù/{ ÂÁæcí5Öfd=LdÈ3±ý`æw+1¡¶°®3—AK-&Àrtc÷L¡h”Äd‰)ÏÁ–ÂmKT_8 ÂAb¡VÇL&@Ú2¤D"±BÑ(‰É´º¦È>TII‰‘–P+˜×/xx zÛ7‚éÔYOɶGÝÞÄÇ@£¾JL.R 6&¶ÛöŠ´ŠªÚQúƒUÃ…% €PÜâ“Ø&Ôª™ …¢Ätgû²èÖ¡V(u…†+ %&…B¡PbR(JL …B¡Ä¤P(”˜ …"Ú0¾}"©5@29@<•a*’‚˜Z¬O=%EüÀÁ* OL‘Æ7ß|#÷Þ{¯Iô…ô|Ëš›áoóý;QИ®U¡Hhb¢-åkÇŒS«x²¡1]«BÑPˆŠñ› Ã@mLתPÄÄä[T õƒª4( 7‰µÇ{¬<ôÐC¦æ’s}§Ê²fÍÓà’6P:F± ܾ}ûšuÎöIv”ÿèÕ«—Q¡X/Rp»Vàïz…Ü"}­Ô¾¢î7]yéŽÂ~TõS(1ùà±Ç“K/½ÔÌßsÏ=¦ƒ. )Åqæ™gšúH”áeð¸ÙPî¾ûn™9s¦¼ð ¦ 2Ýàüm^{íµZDA‘~êßrË-F…Š4œ×èz£y­.mÍo¼ñFÓáØYJ¡PbÚºÂÚZA¶‹¬mÏ (õ´§Ÿ~z@)Âù;}Õ,(R÷àƒÊ’%K¼E☜×Z—ë­ïµºöúò)))”˜üÀ6 vÐΛ7/ª®iç :t¨¬[·Î¨6¨q]»vZI]çµ6Ôõiˆ2¨‰¨¯õ¡Â­Q®PÄ-19qÆg5ƒöß·ß~{­ì:ÝâZGúðí€â„ówgKlJð jUC"Üë­ïµ:‰ºwóÍ7‡,5ÑìáË/¿ôû;e’!y…"éˆ û• ?ÿüsyùå—½’K ãì°aÃLӂ믿> t€ÑØ„ï»ï>ïrŒÍôY;õÔSü&…{½õ½V{L*_b·{æ™gÔø­hTHñ¼ðU|µ£ÝƒMÑ0€¼TbR$:4‰W¡P(1) …“B¡H8$L¯&Â*JLõ‚&¶*Џ#¦h$¶ªd¤P(1ÕR¡œ‹$^ª[ DX…B‘˜ÙøMb«•„Hj}ûí·Í2!¨›nº©q0oÿ¶‰­Ï?ÿ¼<ûì³~C¤ó¿þõ/³.ÛC¸ë+Š$RåbÄ©õ ES¬“x£±¾B¡HpUÎ LI­eee!mCb«•¶Fåw=çノ­‘X_¡P$‘ÄäD,’x#µ¾B¡ˆho’A“xV•S( %&…B¡Ä¤P(JL …B¡Ä¤P(â&\€Î%É>|¸Þ­@¨qe EÜq@ºp@\šÝ¯P(T•S(JL …B¡Ä¤P(JL …B‰I¡P(”˜ E² ¤²'Íš5«Q­R‘À<=]o‚"9ˆ‰—¹K—.z· …ªr …B‰I¡P(”˜ …B‰I¡P(1) E]ðÿôw†]t•sáIEND®B`‚refdb-1.0.2/doc/refdb-manual/refdbmanualfig4.png000644 001750 001750 00000033430 12255431171 022310 0ustar00markusmarkus000000 000000 ‰PNG  IHDRÂñX·ò cHRMz&€„ú€èu0ê`:˜pœºQ<gAMA±Ž|ûQ“sRGB®ÎébKGDÿÿÿ ½§“ pHYsÄÄ•+ IDATxÚí \”Õ÷Æw4LL3Ë5Ã¥ÜSË#w Ü2wý å‚¥iB*(¦¦©¹‡¦¸¤æ‚ JVŠæ‚e¥2s+-MÍ\HQqÿ¿çâà° Ì ¼Ï—˜wÞmî{æ>w9÷œ<><B!$—’_û-Çb „’[ÉË" „B!$„B(„„B…B¡B!BB!„BH!„P !„ !!„B!$„B(„„B…B¡B!BB!„BH!„P !„ !!„B!$„B(„„B…B¡B!BB!„BH!„P !„ !!„B!$„B(„„B…B¡B!BB!„BH!„P !„ !!„’™ägŒrôèQ\¸p¡SJ•*777»»o±©Áƒ£oß¾(\¸0¤)W®œú¥’\/‚ƒÞ…š^þ, r}CÌøÈ®îùÞ½{èÔ©NþqÏzø"/Ç®ôÉ×a˜:q,…änlÖ¬œŸx븳@tÊáßwÙÝ=ûùùáôéÓhÛ¡+Üêyð!ê”ã§wåˆÏÁv± ¶êС5j„–í}X ÄfÌœ9«V­ÂæÍ›áèäÌ!B¢O”ž Ì=­\¹y9nElĶmÛ0|øp,_¾5kÖd !ѱ±±J]]]U‹=~Ž®Û Cí]»vE`` <==Y „BHôG\\Ú·o¯D022Îζ"¶k`ÉP{«V­0vìX¡}Š`ëÖ­qéÒ%„‡‡S‰ÍÑnݺÁÁÁ¡¡¡,’åp\‹˜UQIk]D0**Jõí‰CQáý  îß»«^(è€A3"àöòcoÄuó˜<~Á÷é¼ ÚôHò¾l7ìC,gĈˆ‰‰ÁlÒÀJþ,‹ R­Æè5fŠ/eö37õ¾%ö`Ê6’oŸÐ½6š¿õê·îžbßï·.Ç7+>AàŠƒ©>§¢¨TãUt>O=÷¼Ù¶lNQ 1j­‹+ûîÝ»•ƒŒ½‰àç¾…­F­f*–Ș7¼ƒÃçk7IQI¤Å7˦jçéˆB…h6 ,, ³gÏV¶U¦L›×øYÆß¼Ží_ÌÀêiþ0q•ÉýÒ;OfÚÙc‡°}å ¼Ø¨-‹¸$n¿yí*¶-‚¿Oþ’ê}=|ð7ãb±mÉd,Õ ~c¶-›[F¹’tEpÏž=Ê1ÆÞDPž`ßñËEPVw·Qs°â#_‹Ï׸ã@D.žHã°bWýû÷ÇÂ… Ñ AƒL»Žôv<ÞôÇὑ6?·-í¡F“7´FÚò¤½Aíu¦¦‡òäÍ §¢O¢ýÀq¸|î´.ËÈîz„Òêkà0”}nËzäÏc1X¾`z–…4’ðVRYÉp¨=†èd8ÔX‹á[¨óz'‹Ï×Ä{ &÷nˆF^ýáZº<ÒJΞ=«"Çøûû£W¯^™~½<ÚO¾|¶³¥=ÔmÑŸêŒf=n,lXˆ~V`ë¢ ©óðáCÜŠû;V}Š6}tYFv'„‹M¼P«U/~SuÈ¡¯Â²ìZÆ Sk¹dÞÆ^E0Í/}ž-§!„á7#øøOÅúY£Tkš˜OPP¾ýöÛL_‚#Ïwþ÷ñ¿I_¢xéòèüît5–Y˜²Ç"Åp÷ö­$ÛîÄßDa#‡˜$Bؼ3l[…ëWÿUëµè’îȆ8×¼Ò¾þ=sR×eD!$v#‚ÞjíÚµ9Fóå/ Îýq$ɶóÚë²nuR?Ï3Pªœ–‡ü®e* dÙ̺þí[qpz¢¸®ËˆBHôßSZ°@‰ ;nÙ²eŽù\²lB–O‹¡ñ’ŠŒÐºÏhìZ;Æc²N°wïÞ˜:u*<<²6›„{§·Õò€ÔD¶$5{hÝw4¾œæó§~ÃÝ;ñ8{ü'µD¡EÏ&Ï#ã1;7˜MN\ì%å,S·EÝ—‘^á!Q-uñÞôööÎQŸMÃlÿv¨Ö°% :8ZýÌÓ"5{¨T³‘™9ÃÚãê?gP¬ä³h7` ª6haZ›wƺ™#Ô_Sî[†F]\ñrëîðz;$CŸËTåò<”ÙÖGÈò‰É+vYå5ãÂçŒÆ¡ëqã¿Ëx²ÔshØ®Zõù~/›Ö[Ùîç¡ÈØ$ œOü ƒ1lî·‰×Ôƒ´ud_ölQF!‹®e‘«1æF0çž,A¼FGvojÓå"‚RA͘1ï¼óŽUç22Õ;3>¤^9üe>œ=ÏGÖ¢JvA–áXêCÛÒ7Ç×11¯1KÇ÷GÙ*u0nÍ88Á­ë±ØúùDlœ˜¤Ò7%fžZkfíŒáxÑžÄmæ¨Ihs±edïÖ/À«žýÔ˜r!´$ „žComß¾]‰  WY+‚„¤Å€ÔšÁèèhf*!ºÅfs„?{§w”0ÈÚ™¸mÙsön\dÖñ^l§¢ÅTOLµb÷EÂQ{-“ͶĜHW/žÅ_G¢ÛÈÙêoìÅ¿SìcM=! å½¼¼0iÒ¤l®"9›iÓ¦)Ç{JD(„Sâ™ j‹±û°oúÍE³Ïñ†ßxlš?FÅÏ“¿ž¾ãmþ%Äoû¿Á¥s§L‹Ä†…x¹Õ›jÁµŒ½Ëëä¨õ>ɶËëz˜°ÎJ”LÞê½÷Þã·€ØI°;jÔ(”¡zõê,¢kl6V!Q $<о͋Që5oµÈT\Ë<ÿ’Ùçx¶rM<õl%,Û%ÊTD™Ê5,º[D!ß»ñs ›—0/ùªg_L÷{múªc ˜–“ñ¶@’ŸŠã‚ˆàôéÓù ™bc>>>7nì’Ü%„2?8!üNi‚pìÀì\3Çÿo§rN©×¢«ù½Bß`ŒñvCðúc߃-"ƒÞ³®¥Ë)¡3ž¼–íÉÙBOs„RA‰ã‚TRA’ì¶k×,’»„PÅ™2×'¿²~ædÌ, xÓ"!4, 5Qf!N8¡tÅÈÅû’l'™‡v§èÉv~"¥6ïŒñÝj*G‰1zÙ]·ÒEe¡ü¼y\ûFlxˆJ m‰Ã»$W á»®˜ù7ò,”¸í9·ÚjY…I-Ä• áÌñÌÙŸäsÈBØ@¯J‰ë€Ïaeˆ¬FÖqI+]DpåÊ•6÷Þ«Z¹œrÑ'úDžOV v>l³»´-ýÓ¨~ÎÈTd³±FÓ7°õó4hÛS­!Œ»ú/¾ÿjEªkíô‚D‚˜Ü÷•Ä×2¼éÑuhÄiFR£Èûí&ýRÊð¨,ûðzGŸ9êD¥'(^{™!‚‚o?.(Ïí,Z´óçÏWkm™`—¶EìJ½‡LÁâ1=µzni½À".%”ǥϰi6½áÔœOL¥LIþ~rŒ#Aˆ“Œ¹$:Õ}%ŸˆfÛc’ a:Q ²ÓYFækD]]]• ;×q‘Ì@¼}}}3=Á.!™…Í"ËÌÇ’È2’óM–H’I"3#ý“Ü‹Ô 6TqD3;· !ºïý`ÁK—.a÷îÝ™.‚#‚pé&Ë]¯¸:‡ŒÍ;“¹gI°;~üxÚV.ä…g\0j¸ýä æ0ÄsO*'A™¯‘aÑÌæö= á[Œ©W2ËÙ¤G™ž`—¶¥o$ÖhN€i˜r˜vëÖM W‰2¬É,$ÁîÎ;ÕÜ3‡Ý …èJÅq±If²zõêÄ»•*Ub !уV"(=Á¬ÈþMr'’`WÂóIÚ®¬N°K…˜dذa*¸1Ed&Æ v™¶‹ä$RÌpÿòÝ\ûç4KF‡üy,èÞ4…Êú-Y"A$™…Á K†B¢äh!”õi{¶…³Tì„™3g&Š „O#)88E¥¯¢Ëð™xê¹ç·_>ÿ'ÖNGö|ù  ú«­Ñqȸ”(äxsö3•l:êËÙ¸{íþgÿ^’`Wz„ö’`WòšÎöo‡A3"R$Ö6õ¼ ÛMÁŒƒw¤ukl(‰Ý:A¥ZÑkÌ"•Î.­k¦öž„¶ Ÿ3Z ¹ñßeí«a»^hÕçø½œ?ÝÏ—ë{„Ä~Dpøðለˆ šø2K^Ë›q±Ø¶d2Œê„¿ˆQÛo\»‚sTj­¾–ãîíxœ8¸ ç¢ó»ÓU€uKöKœ$‚“'OVŽ1"‚öâ„%Áó_õì§b 'Bsí'=ñ1Kl(‰Ý¼Ží_ÌÀêiþ0q•Å×]:¾¿Ê4nÍ­1X·®Çbëçµ{ ´éçË)pŽÐ+ú ”®Zµ -[¶d˜@²¡8}íŽÃås§·o ›‚&Þ¾*ÿ¥Ä‘u,â‚M=Ñ#0û·,µx¿œ,‚’`700PÙš½$ؽzñ,þ:zÝFÎVc/þ}åg¥ IÐãMÞiÕuÞ÷Nï¨ëIU§'Š£eÏØ»q+†ôz„²{tÐdí!p]‰¿‡WêTƒ¿¿¿ª˜¼½½Y(i ÑoÅý‡«>E›¾F•ÄfU)¤hjÆÁëѬË`‹öË©"hœ`·mÛ¶vsßÿåVo*á‘xÇò:»ž‡56”ØÓ~òå³nЮÄ3ðÕ’IhP\†X§~s‘CzB(!“ò•ªŽêŒ5ªKv®˜¢\×eX”"hšäó-yòäAï °Ç ¾³ °ÖRN3ÇY¼Ÿ±þ¹#GÛ}JÀvñõòò²«»<ïÆÏ1lÞ·êõ«ž}1Ýïu54i„̲³Ô°Ô† ŸáÊù?–"ª¹ˆ½6ª3öm^ŒZ¯y«dä’6®Ìó/±‚HO‰¾y¢xIlÚ´ mÚ´aa¤Aâá£á÷‘ËUë¸A›e”7Swïî<¸ÏXAÍÛï‘^»üž}¡¾[7_ ‡Ù+†»...vç!zxÏV¸–.—˜Ø[þÊkÙni¥ÚË“Ç*;KS-°!ãc vBmt}–Uå óƒÂOàÔ¯?àØعf.ŽÿßNô ^jQ¢t !Ñ%U«Ve!˜‰Tl2GòJû>ÊkÏ€ ‰@ʼ‰1²MZÍ–î'üsú˜ª´îß»‹O·Â3ZË»âK¯Øe¹É’I°{èÐ!» Ÿ&N2'íN!Hâ”bBÇ"Åp÷ö-(T8ñý;ñ7MöÜ2‚%6$Â*^w¬CDh°r¦‘¹B«í?o^Tx±úmÝw4NÆìÁ€7)„B’¹}+.IETÓÝ ç~ÿÏ×n’d¿ó§Ž(GK÷ºŒøTý÷ø~!_(×ýw>Ù„'\Ÿ¶«²’»²$ÇcÕ^¹ðÎÁœ}ñI’kß½@¯J¸úÏ+ù,ÊW¯sQ½¦Äg*¯ÝêØüž,±!ƒxÕy½®_ýaÁ}á7Õºålïz¸bJäßIÊá9·ÚjYI ½FIŽ&.ö’r–©Û¢Kâ¶=G¨¹“³Ç½;·Õ¯ü/sK’¨ÙÒý ½OEŸ,‰nïÏV­o³$ˆ¶='ا®C“Tþ‚8Í4ëÆïÙ"’‚Ä|êÙJX<¶'J”©ˆ2•kXôùÌù „èüQE)š={6ì aV\Äœˆ #´U$…7|ƒ1ÆÛ ÁëYü9)xÄtJ’[Pì8B(„Yq[GL0…-")”,ûBÂßG!šÉIÄÇÇ3Á.!Ù!„‘²EÄS0’Böq+.»Â‚X:Åñ~lâÿ’`W²ÌØK‚]Ú–¾)S”Bh²õPÔz1¡V³6;¯!’Bƒ¶=ÕÂ8Mp¿ÿj#)d¡s¦³ìI°»aÃ%‚®®®´-B²Ks#&æÎ»eU$…´";ÐY†è•-[¶¨¼‚’iÞ^ì’Udzdb;ôY†èI°[¯^=Œ5Ê®r ’£{„$g1QŽ?Í‚Ð!·nÝÄÆÕav—`—¶e4ª_;zR ‘ŠŠñ õ‰$=~äg„††Ò¶ˆÍùa]PŽB¦a"$“7_~Ô¨Ó, B(„„B…B¡B!R8Ëœ;uNÿ·“%£CäÙMY„’YBXªT) {«%KE¯Tn‰wß}C† »»;Ëà ’'b¾|þO¬þŽìÿùò@õW[£ã)p)QÚä1¦¶'  ñs+ÕjŒ^c©`$çÙ’)ŒƒjÈÿ–ìkíµH& ¡x–±‚Õ7’C.((ˆÏÉ n\»‚sЦ úNXŽ»·ãqâà.lœ¨Áv~ÂâsWJñ7¯cû3°zš?L\ÅÏa$o¥%H–ìKÁË~8GhgŒ;û÷ïÇÆY²-l šxûª¼“ :À±ˆ j4õDÀPìß²4Ãç—¡Ç›þ8¼7’…Mˆ½öãââðÅêu`;DŸÈ`É›]¼áëë«âFzzz²P,àçݛѲ爔­Á¼ùppÇz4ë2ØÏ(òåcœ BìV%=Ëw¿]Bµ¦Þ,òë®uh¡=£‘#GbþüùªWH14ŸKgÿ@a­˜gŽÊй<¸+çÿDtD^jÒž…M2 ƒøg“ Eй¢xér,"ÏF§&ö ­é®iËÔ•Ƚ»wT(²Ç»å1qxž4+«B…PÛÃ]ߟŲ&†‚—BHìö -§Ä3p+î?8=Q<ÉvÙæª½gÀ±H1ܽ}  NÜv'þfª½I©¬>x€ƒ;Ö!"4X9ÝÈ\!!Ä~ ³Œ"½BI«ˆ{÷î±@1ªís¸y=6Q¼œ§Ð®éî…s¿ÿšâ˜ó§Ž(§å«×ǹ?Ž$ÝG{]Ö­Nê=żyQçõNhêㇰà¾|„PIV1tèPœ={+V¬`a<¢XÉ2صvžZÊ Iš+¼Ø ñ½=G`ßæÅ8{ü'Ü»s[ýÊÿ{7~Ž=†'î׺ïh|9Í_Èßp÷N¼ÚG–D´HÅÑÆ÷No«ëŠ çƒ ÄŽàШãââL˜0Ý»wGþü|œÝGÍS½²-¡Á(S¹ú?^!ë=ý&`íÌ8½ µŸj [ÁgèÇIÖVªÙH‰ÚœaíqõŸ3š¸>‹vÆ jƒé^¿GÀg˜íßN;oKtp¤‘’4IÍ!ÆxÁ}jpîÐö0C½‘Z†úØØX”/_3fÌ@¯^Ùó܆Œ bÎ8søË |:Ù>ŸmKß_„©íÿùdiâŸ?aÍô÷pâàwpr)Ž=F¨–wò’¹!Šâo\CøœÑ8´c=nüwO–z ÛõB«>¨µaæœcºŸ‡ÖÚ‹çk7I|Oî/ba0†ÍýV÷aØ+$„;Âk—/h¢ó:¼MDÿ‰+qõÂ, 膼ùò¡IÇi ‰)1Z:¾?ÊV©ƒqkŽÀÁ©n]ÅÖÏ'bãÜ@tô‘Yçð|;kg Çû‹ö$nÛ07>þSÍú\z¦¹BéÊ\avõ !Ä^É2g™¯–LR^u ÚôPîåOW¨Šî£(Gkùyw„Ö£|G…Ê’ ¸ÅKä½™}q¦p*Z ¿ìÙ¢^Þ GíµxÚ Ò+”5…òO«&„= ¡Ä_¬íáB„F-Ùoõ9e]˜¬Dõ0 Qÿ§~sÑ¢ó¼á7›æQëÁ䯧ïx»{T"¸`ÁZ5!„X@– ^ùç Š—.Ÿb»©(æÐ;( Ÿê¬\âk½æ ·z¯©…ÑežÉ¢óHæ§ž­„Åc{¢D™ŠÊÛÐlÒ‰g—d‘u…“&MR¢(¯ !„èHEðõÜlÌN?S¿þ€cv`çš¹8þ;•Ë|½]-ëúcŒ·‚׳è8=¹2‹ŠJ¯Pæ !„èH%~é¥s§ñtù*‰Û$òÇOßm²X´’lÞ¼jˆU~e!ôɘ=Xð¦Åç,Yö…„¿ÏU¶Û‡™]½ÂÛ·ãU„è ÷ÍÖp\6PE#²7h[$G ¡,Fމ O"„‡÷nEÔêÙV á»®˜ù7ò,”¸í9·ÚjYEnEPg¦o`ëç!hж§ZCwõ_|ÿÕ ÔoÝ=צôÅ{TÖÊR ñ(ÍlÜÜÜÔ/Ñ'¨W¯ €Å‹ÛÕ½Ó¶HŽBõûx½Z³·4¸\J”Vór5š¼aõ9½‡LÁâ1=ULÉ[Z/°ˆK ¼¬‰ Ï°i¶íeÙY$YX/ ìgΜ©2Ú“Ü ‰nÞ¼7FÍš59LH2bÍŽH-Äš)ÂÂÂT¯ðÔ©S™Þ+ÜùÝ;ñ;NyáùŠpoÒH¥ìòññQ=Ä–-[ÚŽӶôM½Z5P»vMö‰>ÉÊ^ášMÛP¦i?ºNY³i‘BÉ[)Ãæ"†°‹!GÚ–¾ùbm…èøÁæÏ¯rJ¯P†Â2³W˜/_~5ôMôÉù|¿æ8zô(Ú·oèèh¸ººêúÞi[úærùÌG˜Ã{…2Œ:mÚ4I$44T  x’2©3!Âß+”¡°©S§Ò$"žÅáááªgèççÇ!BAÎFæ…d.hòäÉ, ’ˆÁ“tÕªUŒOK(„,‚œô çÏŸÏ^!IBݺu±páB 4Û·og\Kgq¨(ró´Ê:LôG‘<òŒ<3Ô+œ>}: ’$Ò¥K5D*ž¤â<ÃÅë„B¨ á”.ÀΉÈR ©ìFŽi—1'-ÁTÁ8BjAŒ·§w å>g4íXÿ]VѶë…V}>Pù1íY^#bØ¡C%†YÈ–ÏÚø9^>ÿ'ÖNGö|ù  ú«­ÑqÈÀÃÔ1æ<{É¡Z©Vcô³H¥z3>F‚üKžÕ´îKœ§³ýÛaÐŒ¼Ø¨mºûÛúº×Fó·ÞK5òÖ÷[—㛟 pÅA³¿C9VIÎ¥mÛ¶hР>üðCå5˜“1þ¢¦UÁXz®ä,ß_e@·æœŠàÖõXlý|"6Î D‡AÙU™‰M4kÖLy’FFFÚ]LRáÆµ+ZÙ Mÿ@ô°woÇãÄÁ]Ø8/ߎÂÎOXýìão^Çö/f`õ4 ˜¸*É~ß,›ŠZÍ:¢Pa§4Ï÷ÝúxÕ³v¯ÿ,…H¥‡-®qæØ!l_9Cm—dæn^»ŠmK§àï“¿äxÁ3çsÒò_²d Nž<ɰ?{§wT¥"=@§'Š£eÏØ»q‘Ý}gggåIzøða 6Ì.ŸÇ¶°)hâí«ò‹(è žK¦žèŠý[–fèÜÒ#ôxÓ_%ON㎹xbšÇ_½x=¨b+Ëߨ‹[t}[]CBZ~¹.ìÙ°/·zS ´ÄC–×íþgþ4”­®Q·E•̼YçAIŽë7a¶.š@!4ðb/ÆÕ)kÔ½ÂæÍ›«#•*UÊÕå™ÖU¡í0xÖÍSÖ¦züÞŸcؼoÕëW=ûbºßëj×ܹd[]Cò­Š Ÿ>råªÖÃé_Àýû÷Pºbu‹l?Ç !ÉÙ°W˜ö:ù—?­/½ÌN?SZerìÀì\3W%‘džŒ$›În$"‘8ÏÈ|¡8ÏØMƒ)öì¦|^÷îÞÁƒû÷ŒvËcâð<&mAææj{ø ëû³R=VA;×ÌÁ±£ðBÝfIÞ;¼g«Ö‹+—˜ô[þÊkÙžš°šÂV×^ážðP%„Ò¬Û¼K®< !Idüøñjø‹½BÔ½yó¢Â‹ Ôoë¾£q2f¼i×Bh°™/”˜¤ [æõŽ UߊûOÍÕ#Û¤§nÀ±H1ܽ}  NÜv'þfŠÞ¤ÁÃppÇ:D„+‡™+4…ÿT„~Ð#ïK²]XNÚ¢‘%Î;–¡­®Q·ygŒïVžo‡àÀ¶U½ì@®ÿSs!Ò#l×®>øà¬Y³†b%ïz¸bJäßÈ_°Pâ¶çÜj«e9eË–©†Ò3”(4zð$Õö9ŒYõ³r„ñrp*šø^Mw/œûýW<_»I’cΟ:’Ĥ|õú8÷ÇÕ£OÜG^»ÕIµ¡SçõN¸~õ_„÷…ßÔp“÷&swU^öP›®\ø gŽÇ`ξø$vr÷N<½*áê?gP¬ä³f~[\C¥Ê¹ayÈÿT¢ô’e_ÈõßezæRd®píÚµˆ‰‰aaXI¦o`ëç!¸xæ¤~/½¨/g§ºNË1x’ŠH£I+Y»ÖÎSË$!·ôÄ ´è9BÍמ=þîݹ­~å™;kÑcxâ~Òsÿrš¿&¿)±}dYD‹Tm ¸wz[]óPTxš÷׺ÏhudèÑ£ëÐ$%ˆC‹8¬Èû–b‹kÈðhÌÎ &‡EÙ#$¹ñ ôòòBPPªìHê¤å0à=d é©*ä[Z/°ˆK å­ç3,çdûe5¡ôêÕ«£W¯ìu¤ë>jžê™m F™Ê5Ô|¬ôô›€µ3GàHô6<Ô~ª5lŸ¡'YCX©f#%ls†µOì-µ0U´HóÚ=>S‹Õ«5l‰‚Ž©îSÈÑY‰îâ±½”‹[¹$:Õ}›úøarßWÐV»¶)[Kmž.#×HÂæ±N+'ùkíç4²,C}ŠH NEQ©Æ«è2|&žzîùÄ}LFvHeÿô"{˜aºŸ‡ö%›d8åÄÁï±0Ãæ~›nćôÎoK,ÉPoÒÒ¯U«:¤„ÑZ†Œ BõÎŒH¤W„O'gìù„……¡ÿþˆŠŠRCëYmKßH8ΩíÿùdiÐ 2}3.Û–LÆ‚Qðá1VíŸ^ds"ŒÈ„ñÚÃñþ¢=‰Û6Ì P“Ò–|&ö INFz‚Æž¤¶jŒ¢²eŽP& Š>‰öÇáò¹ÓVïo‹È2ÇàT´˜ŠÑ§ZÏû"ᨽ– õÜÀG}„ˆˆüøãü64ORÉX!ž¤qqq,B!Ì2{Së½m[ú1Úô °zCd'7`Md7üÆcÓü1ªç)=}Ççlo½õFŒÁoIñ]¹r¥ú¿[·nÌnOrŽmgåÅ’Ï©ÉV‰Îaíþ¶Šì!± Ÿz¶í‰e*ªIxk?“{2•õ„UªTÁÎ;í*’Éz ž¤ 6TCêÒK$„Bh‰s~ZO¹J°WéÑ%O/bîþ¶Œìñ†o0Æx»!xý1«>“=#‹ê¥W(…˜c/âI*¡údDA"ÑbÏdϡֳ“y½WÚ÷Á¿gNfhCdYä?çk¼;ÖÍ|ßâ{2,*5„(ÊmH¯pÏž=ªWHHzHƒiþüùÊ“tÿþý,¡µÜ¾—"’%ûçôÈöÒ+¬Z¹œrÑ'úDžOf Ù)$ ›$ô•0l’½"3î¶¥_ÕÏ™Š²Mãb/aǪOU„k÷7Döhж§ZCwõ_|ÿÕŠÙ#«ÒòåËcÛ¶mhÙ²¥ÙÇùöc¶’ÜÊǬ–Uˆ'éîÝ»m“”¶ErœKd¨ÓÙÅUEáðz;Äêý³*²GZrRô…R¥JÁ××£F²HI.®@òçWó…õêÕC=¸•Ø%YY†d[G–I .¨^áªU«àééÉB'f!½Bñ$õ÷÷Wql aØ-†^á¸qãÌÂï ÃÍ|.,<âx?¡s¦gê5Ä{T‚¸·jÕJýߥ‹m‚9Ó¶ôM™¢Àä ±Fr #GŽT7n4K ;» ãAê–¬r6ñððÀìÙ³•'©d·—(4…¶¥o$ÖhN€i˜Hª½Bâ’^!!–0pà@å},Î32ÌN…Øu¯PæŒ%ë!–0kÖ,•²‰1I …Ø5...ªW8aÂÆ”$að$Å€X „BHì—¡C‡âÒ¥KX±b ƒXÜÚ¼y³Êl"AÑuã-yKîôÁoé4KF‡\øë$ò÷òÈ–^¡Ä“û Ä\ ž¤íÚµS¹/¹‡Ø…Jˆ¤ÈuËX*$I¯pÆŒªW(ÉYí…k—/¨”\‚©¤Ì$ó‘À S§NU4yFÑÞ¡må<84JÒíJ¤{›+ êò"žŽS]»vÍ1ž¤´- !É¥™xÿÍ™3ÇnîYbÓý0oÞ<Ø]tÇÇÇÛõg¡må<òãb1’27X @Lš4 ƒ J1Wùí.ÌÄkj×p­‚º{'ßo]ŽÙþíðñ¶ó4 ‘~†„¾"†ßVOж(„„˜DÖ˰ÖÌ™3³=ï\õFm°ë2¼êÙÿ·}-ª½Ò*ñ=©xŒ×{¥ÅKÚáüGPªœöE,AtDF~¾/Õ}Çu®†vÆ¢ökáôDqÜøï²îŸÙÁÃGÑç=뢻äÏ |04S=¡¡¡hÖ¬:uꄨ¨(]l m™Çž1º´- !É\ƒÑ*«ÀÀ@qF†G³Óˆ½ÞÁâ±½°aÎhTªÙ}Ç/O|¯–V™xVĬ=7Ò?Ï ‰ ê‹£¶£äs•Ñ7ØtP‰ž.Š|±(°»jÍ‹ƒ„ãÅÕÉZgçÂë¿ݰ·¼uןÛ)ÏÙ“TúJLÒÅ‹ëÆÎi[æq²HM|¯CÛ²”$ê 1YX_¥J-Dz…CF¡:sÆé– “‚p¦©õ•ÕÑMQ®\¹L»¿˜˜4nÜX;÷Þ{IÞ£mé›Ñ!A¸üš~mË\è5J¬îJè5É0@HF°kË—/WsÏÛ¶mc !±d®Pd®Œ"¹¥Gèã㣜h¡»èŠ©TŽ¿Ï!& ^^^Ê“TÒB!$vÑŠ—ø‘'Žsá/± âI*hÄ“” ¡ …Ø2œuêô)± ²VU°í8ÿ]À³LµC۲¶’Ûm‹BHˆEH"s02wsç†éÊ(Ýó¸ãN%T<©a”f'ñºCµ ênAìζ84J!$WC!$„B!$„B(„„B…B¡B!BB!$7Àõ$ÛiUˆ?e]ι=?Äà$t–Ïí·%@•Þ¦_۲ʸš§]Þº‹‹ ¼ž8{´-Ú…èy“­_ÛgHVYeÂíø+À7½€s»€gÜæa@¡bÀ¬G±÷Œ?|ü¿Se`×`àÎ5MùW圓×ßöÎlÊ4Óγ(ø(眜«ñ'ÀQm[×CÀïáÀW]j'«Mg¥™o.-! ý˜¶EÛJb ßžkô=Tð¢åœ3TPƒ“lº­Õ¬%TT_åœÛ¯§¾V™ ¸”k H–s.Ÿàù(ßœ×d&ðvþì…XÜË£³Û·N…Ë¥üß¹~š¶EÛÒ½mQ‰]3oZÆÖy•o„ÓÎÙ°Vìîà—^ÀÕ]@1wàÅ0 @1`›QØ«–^¿ôðÛ`àÞ5 Æj d‡ÇûȶÃ}€ËÛ'›içYª}«¥Ú‘cÝ>þÖ¶½rø'øéQªçj@•YÚµ39ÕN ÚmKÿ¶Å¡QB²ƒ“c€âÍ÷sZå㥽|\Aÿb£¦%TT?uIyžŠã€×.iC[à÷d©vò:u¥Ú‘c«ÌšÇkÇh×;Ì4N´-Ú…ìâß-@é@>g­²ê\L#ÕN%­2Êç˜ÐZx7é{7h-ð*@žüÀSžZË~¯dG`wE3Ï389Ø¡µÞÏ~T[hzßj‹€?´ý¿)œàÜPãQªcoBs^Ú–¹¶•Ü~tj[LÃDr5ÙæâNÒ'›Ó0Ѷrm±GH!$WC!$„B!$„B(„„B…B¡B!BB!$7Àk$WÓª7ˆ¡G*åÊõ¢m‘L·- !ÉÕÌ›ÉÏ„¶•ÛáÐ(!„ !!„B!$„B(„„B…B¡B!BB!„BH!„P !„ !!„B!$„B(„„B…B¡B!BB!„BH!„P !„ !!„B!$„Bì€ÿ‚ :({ÀNyIEND®B`‚refdb-1.0.2/doc/refdb-manual/refdbmanualfig5.png000644 001750 001750 00000033625 12255431171 022317 0ustar00markusmarkus000000 000000 ‰PNG  IHDRhð-§þO cHRMz&€„ú€èu0ê`:˜pœºQ<gAMA±Ž|ûQ“sRGB®ÎébKGDÿÿÿ ½§“ pHYsÄÄ•+ IDATxÚíxU÷Æ_!„fè½™þF@¥I/RƒR$t¤÷ÐAÀ€é ŠŠ€€ M¤ƒÔ~ ]éMŠ ÿ=w™e“ì&ٴݼ¿ç™'³Óvrwæ3çž{@!„B!„B!„B!„B!„B!„B!„B!„B^2ÿP°DÙÉ®n™ò³Yˆ=yt/ïC÷Œ·ÙI#ߣ°¼Ý]Ù~Î㨧'Oþy}¦Ìg0_Q¬ÜÛ ;Ž]ìÃ&"ö`ô€ZáçÎðdK$lº‡™Û‹íçà´¹0Hh6!„è 4!„P  !„P  !„M!„M!hB!hB!hBq42° Iœ»|7Bî³!l䕹Q0ON 4!$õè7sr(,lŒDòÏ?!Èï‰E£ÚP  !©GÔ“hL›> ÅŠcc$’   ,Ÿ¦ßI4!„è 4!D—¼ôÒKé¾ èâ „ÄF™ (€ÆcúôéÈ–-[’ÄÕÅÅE¹Q¦L™‚V­Z¥èyîÛ·Æ éS§P¤H mÛ¶ˆˆˆÀ!C°~ýzõý£GFÿþýMç5qâDµLù±cÇâÙ³gjü¥@BtMtt4®_¿Ž¾}ûb̘1˜;w®ÍDZ“ãˆ~ðÁ).ÐíÛ·WÂߺuk\»vÍ$П|ò ®^½Š£GÂÃÓ&Mбߒ%K0|øp5¿råJZЄÇ£`Á‚˜1cêÖ­kè={ö sçÎj~Ù²ejÝÉ“'ѽ{w%ˆ‘‘‘­P///«û[ZfÎW_}…K—.)á5'kÖ¬¸yó¦ú^¬ZµJ-ÿöÛo±cÇ*TH}ž9sfŒýäøëÖ­SçÙ¨Q#œ={–moîý}_=¯Ÿ×HWW”,W.®|FýR¸paܾý¢ŠÖÀ¨æýýý•8øá‡h×®ŠrÈ”)S7GÆŒ±aëû[Z¦ñõ×_ãÌ™3˜6mZœsÛ¶mfÏž­ö9þ<æÏŸ6mÚàÆ(Z´hŒs0hˆõܱcGµnõêÕêh;óë÷ ñÏéŸPäùgoŽ9Š&ƒ>‡÷Õ©D·ˆ« _¾|¦Ïþù'êÕ«§OæÍ‚6gMe:pàºv튦M›ZÜßÒ2 ñ[<·’%Kâ‹/¾0ƒC:þüJ¤‹/nò-›SªT)å³ÿ´ü¥‹CëK.èÚ¥:uꤋó©R½–8ú¨D·ˆÈ‰µÙ¼yó¢¸wï^å[.Q¢„ZV®\9,Z´½zõŠ#ÒwïÞµº¿¥e"À:tP¸«á­ÓñA‹ßYDV:úùýÔ¢E Õñ'n™°°0‹ç³f͇ø ø~M±`У8š5kÃ÷+îqiâ/^ŒnݺaèСxòä‰É Eƒˆ›dÞ¼yV÷·´L£~ýú¸rå  §£R"Lš4i‚Ë—/+«XÎC?~< €W^yîîîÊMbËÿmþ`÷ßÁüCU߮ǜµª÷®%ãÑôíbº² «´€w…šTƒçHUïVõN2Þº‡ŸMdUïZ}¾ÀÒo¿çHBÐF.Û.U¿Gªz¯Û\Kæ9PÅÆ§*!„¤èD ·àuB’˃ˆGl€>èx¬f}´`ÁDEE™DZ‚ÞçÌ™ƒµ¬wïÞx÷Ýwáëë‹Í›7«øK ÷!D¯|¶z/nþs— Avl*V¬¨†fÈ𢙦Nªz–¥YŽ éå±–žìM›6±áˆ®ÅÙæZ”*’?ÙŒ\óÖ†[ß»wOõ÷ˆß¶V­ZX¾|9²gÏç8Ò)8bÄÓ½eÞY{ylW£f4I,³ÄRË`˜ï¾û¥K—¶zÎŽöFL޹Ðb‡öˆE-¢üå—_â‡~PÅàÁƒÕ褟þYå¢GVmÿU‰³àžÉ-EŽim¸µ Ï›7¯(B+ËåÍ36’3c÷îÝj^â˜5¶¶Ü’¸Ê@´"Œ5J‰´%,ÅDëú ã{zeÈ`Q´EˆE¸Åzxðàr{ìÚµK%`yôˆ¾=¢?6ì;ŠÎã–™>§”@›·–°ú9sæT¢iíÍRöÑІfÇ·ÜOŸ>5Yȇ¢‹#=£=«U«†:uê¨×;†*îñU‹ßZ\„èIœÛŒZ„'O£Í:eÞô¬ ·–áášÈJN[·nYÜ_¬j¹—y#Mh¹dÕË;·z‹•8ha„ ê^”Ï÷ï;W/ ´Ì_¥¬Í âêÐÄ+2¢~8x"Ž8çÈê ±\wIÅÚpkqoÈHD‰³–¬xæÃÅÍ}Á={öÄÁƒÕgÉx§ õ¶´\¶—0[·nUCËåø‚tÔË$CÊ>lñ{(ÐÄ&dXê¿¡·zãCk“G.x~ÓéÿÎ1Ü:yòèú¿€6Åg¡X~¯ûkí%ïÆäÉ“Uß§Ÿ~c¸¸¹`š[¼Ò±˜Ðr]Ký¯»ó’¿>-Ó¶Ú€§§'ÂÃÃcüMˆØ¢œ˜ØNBÒ’©ËwÀ߯ÜÝ↥}1´…š-hÝS¡BÔ£G¾óæ›oÚ|ŒÄÄv’V„Ü Çú=Gq~Ó6Ú±‘‘PÒ‘'¹4Ê–-‹¥K—&Ïr±ÛIHZ1omжd= ´C!¢üÛo¿%hÇ·Ìk±„¤ë¼lë![5†áà°k—'#pãOhY§‚Šw&hBˆNx…öcHûzl 4!DWÖó†h^ÓG ó&ŽOºñAgËUÃFŽÆÈ1ã’uœ/çÆ½;ÿ$û|rxåCö\x’”ãÙ3|±6ÛçöOpÓöãVàÀ±?áÊ,)ÎÓèhT(]ßMIþât#Е|»©‰gåßîdx×§”Êb—×ÿ¾©ls$e‘2_]üÞK‘cññIˆ“zí¶ÛˆN ØNšÄ2¾”ú0N!!/æ'N´ÿ¹íß·ÌîÑ¥‹åsšæv´¯©ã  I,’kÉ’ŸƒŸg„óñ±ÿ¹«HþÈ”¸§Ee’¤_’úôéª`RÄUr}ˆE*·jÕ*ÙÿæñãÇUÕKéâKl)+¥”æ’äÿRñE9r¤*<°zõjµ½Ák‚Ì;Öê±(Є؛5€É“¥ŒtÌåuêØ÷¼$ïK®\pGDtJRJWI-Á¾}ûb̘1ªH«­ˆˆÉqöíÛ§rÒ¤„@ïܹSÒÕê &%°†Ôõ1<\¥<— Â,%†‡ñðáÃÕüÊ•+iA¢kräÄ-€ù¨ÓÂ…ooûž×Š@Àò)zX©Æ=cÆ Ô­[×$Ð{öìAçÎÕü²eËÔ:©E(E\=ŠÈÈH‹âèååeuKËÌ‘ÒñöÉ'Ÿ`ÇŽš›EËSþð…  Û·o›>8ÐTÐßß_‰³ä±i×®‚‚‚)S¦8n)òºaëû[Z¦!µ Ïœ9ƒiÓ¦©L“GŽAíÚµíbIÈšn`ø=óäɃ 2Äy0ˆõ,uåXb]Ïž=;ý ôW#ßÕÓÁpI¡2ðŽB&÷,ðûøk)]ž¢çÈn{»7äÕ»mÛT;üÕ«W‘/ß‹ŽGñýJ• =ͬYÐæâ¬ £L@×®]•+ÁÒþ––iˆï7øùCH\%’iR Ä&ƽ’¶mÛ†ÐÐP“ûD[CŠàJµrñ£Ëßtéâx~‡Hwñ˜Uª×£ÿRðÙÍao÷ƹs€X·òÐHnܸ¡¬ÈæÍ››–•,Y{÷îU¾å%J¨eåÊ•S®‚^½zÅi»wïZÝßÒ2 ñ5wèÐAYàšÿ9¥¸sçz÷î­Ž-‚.>òcÇŽÅps¬Y³Æ®—]„$ÕÍao÷ÆÂ…’:1U­Eq4kÖLù~5ä5_«±)¾aAr©KöÆ¡C‡ªª#æÑ2‰›dÞ¼yV÷·´ì…©>®\¹‚Aƒ)Ö\%)áâèÓ§:ïŠ+ªÏâ‹–eâÎH)J²óU}»ë8vqšÆ ÍïW ß­^j Ú¼8-Cg4 ºJûxW¨IÁ{ÎèµÂCæÎðÔý‰Ji霳—}õ*0`°~=ðÜ=è= {øÙ¹½Õ~µú|¥ß~Ï‘„©€6’ðÇ/z'iÿÖ#­Û\Ëá-èøbSJ¸‰ƒiD’Úˆõ,¥ÑnÜHÝï‘×íÌ™ã.K³kW“8çÄá]©«Hqv\²,Ê\»w#s¶ÔÍæö,:/¥rµœÈˆÜ}õUÜõ÷¹B ¿þ Œ±=!ÿ“§Ñ8ùçu<ˆxÄ‹…úÄ«(…[ů¦üdÒ‹¼qãFåwßZB´üŸÔòåËU°¾Œ4²v\¢2Dmü!èÔ©“Ãÿ/¶æ÷ùçqWHÇU‡ ZÏšŸ¾‚ãg¯â—“áä…(VÀ ¹ŸÇ% tª_¬b¿~ýT€½„ ɰNÒQ£Fa…ø ˆð&DÆ • K&ЖŽKHš !aáV¾g ìýí ¶ü~9qQ‰²$ð7GòDÿ8~c¿¶û¿Û•h-÷F|C¸Í‘Æ#F¨y©ªuDÈ•›nµzÍĸMQºx~ÌX±K­šáß-jë/¥€´ä×0ÿkë=oþI;K› ’=ÏRJR 4!:%¾b¹Á%› k¶–ó×|M [·n­&ñš tìm¥ÓJ†-·oßÞ´MÍ2‚N’ùXŠ¾ØºU*|öÒ3[5Fùšï…=IJ-‡Ð¹i ô«£ËߣB… êÁÔ£GõV*y6’c¤Ý¿ß4OÑ‚&I%ìßû¸ù×)Ž$LC¬u‹u;kÖ,•›A:›-amíxrìø¶]°`cÉA,¯ß’~3ÑÍb=˃ÅìO!oq†ïAž<À¼yÈ=ý“Hƒ8«ÞCéís â«Euû{ÈK:òd YÙ²e±téÒdO‚Z®Ž©©£Nvrä¦þé»E¨Ñª#°ÖA,ýÒû/¹ŒkÖ4>03gÎŒ›7o"þüV·´ã™™¶´mÛ¶mÕkwõêÕUV6IÌ“èÎæíÛ·ß6 ±ð÷ߢnÀ… º`LÞd=‹³ ¢ü›yêÖx\Ö–™#î«nÝœ«0´®:­â$µ2:çÎSa{‚ø¯Ì'7Õ°aÃpêÔ)Πö‘×f‰¿ŽŠŠRƒY$·mbr|dËžáQaø}ÿf¼^×ê™Xë ·ƒ¤™4Ü"”¼½½•oT~?KÛA¤ù ã;žv-I'Vç)JÕÙ,ËÄz–ø~±¤ÅŠ—† ó6\ƒêíÜ8œq’ZÃC‡¡jÕªêÚ¼ùM'uÕÄßxíÚ5%ÐçÏŸW…‡FöìÙ1YòÛ@õ½°%pÊUk W¾Ì¤6Ö:ˆÅý “ðùó‘{Ò¹'S|ÛX»Ö»mb:›# ×Ä:?}èÛטZÂìâ‰ä ÎCºªêm-NRÊèˆÅ#½ü’x\&™7'«á†W^éø‘ã¬2Ü$ÒáôÙgŸ¡hѢȑ#‡ªú` y —B¾b¥ñëöU¼‰Eˆ0®;åæ”†74Š3-h‡ÅÖ8Ió2:Òi!;Úë°9RyA†‘KI±œçÏŸ¯ŠjJUàäЬ÷ÌÔo7lG+šÄ@JM=}ôèÒÅÁ‘‚äÌævmZÁÍ-£C´E©Åqᯋq®‘‘QÈîž2÷²®!-â$µ2:R÷l×®]1^¬åòåñ£RõA«$,%~ÄE"E5/^¼ˆ2eÊ$ù+º”O5ü¸vêø ¤*yóæÅK®®xf0ðÆ–Cì’ÈÂQ­þà±^r—u˜óõÌ’Éù:-â$5ÿ³¸4$+žtü ëׯWË4´ø¥ƒPZ:u¤t J¹Ím«›Cð5XÑSºTF5ß®ÈäáIe²ãÛ—Þ’÷dñöF˜ÔìÓGÚ/"9’I®ìžj"tq$™´ˆ“ÔÊèÈ@.ò*ù|üñǪ€ I“š4i‚Ë—/«HypˆßZ¢8*Uª¤JýŒIB~^!›W>¼Y¿ v¯œ‰&=xUê{'ïÉ\´(Â~ÿÝØA(ƒc$šƒUP(Ðz -â$/H,)¤“ütŒå"ÂR§áç秦ØÌœ9SMÖÎ#±ùt‰íÞ@m¿ðÈšƒW¦É{\$k¸ÐÜÝauƒQ¤)Ð$­Q®Ñ¢¶.Öƒg³AÈ-bíaœbÉ{Z´0¦a‘w‡„túøð @“´B¬ç€–eP¯ýäÌSˆ ’Æè6yŒ”¨")u%¢üå—FKZÄš"íÔ¸° ôCF7w¼Ûy$¾Ÿ?–a´Né‡&«SZíMÞ#V´›/î ±¦Ç—!®üáhA§â ¸eF«6í âä–æß?AܼyÝ.ÿwhè¸fŒû?K$ÇÞoæàï«TI;t¼Gª¨´kôîmÞ-"-WÄ’V¯_µm:Ügk÷cýÞãÈÀ¡âŠèèghT¥ Ft¬««ó²»@û}ü5? ·ËwÛ5)»á»½òÇMf#ƒUšö‡ Ÿ CïßñÎICt¼GFŠ«cÿþb,âT[±à³7ÑwèXD Ò7ŒÜ‹Ï¹ÔD^P±þرl .Ÿ:‚¢¯Vdƒ#’GdÑ¢˜Ö² ^‘:wÃî$zX ««‹ÊC]ŒÑ /Œ£—ôçñ¥Z§¼× Ö¬hBL”+'ã¿%±uÌå"Òóæ!,ô^†I_mc;9ÓCƒM O^«Ü@ý=ÄÆ /ÎÂÍ›ã.÷ð@áWK= :rƒf­±ê—±Ý†ÙéÙŠî÷)¾ù´7Æ|sŒ‘H¢ÜÝ0s&¦ˆ+ ÉU¤B®\IÕˆÀã×^‹¹PŠÆj…±:Ö_ruy¶}öø}´H‰ôô-ñÃÁh9|ÖOë߯'ê{“2ä]FÜJçª ócÇŽw¦ä`çwTÙ/-1ÙÈ‘#ÕH]ɯžÒç¡Ë"ÀhǦD¹Jð*P G÷m@ùÚ-Ø ‰àA«VxP«Vê‘$0zžg#UÉ™3ægé,¬\2¼YÕ¯÷†vuÁêÉÝ•H×ë3GN_“§Ñ¸«•Së“BBCÞ—,Y‚áÇ«ù•2¨&$łĆKÚ^­£³wZžš$ I¤8¢|jø2ib«Òlˆuª 1Í»v:ÞÞv¸(|Ï>³(КHK¡ØÚ½f!êÉS£Åzî*VmÿšTN•Sª[·®J6&¢Ù¨Q#Uo1>$ûàÁƒUé/©l®‰kÎØ¤T>§èýk?Ãñ½ëáJÑHY²{¡Iß©È]¨d¼Û(YVYÒ’Ô¿r“Nl8= ¡nOŸJABûô«¯ÆÎB Qg.ÝBÓAóLâ¬1ná|P¿"Ü‘:Þ"¶«µcÇŽj?±„%wº5Ìs°gÉ’yòäA† ”¸¦åy8µ@ß<Œ±Cû2Ž2‰ 2wo_MP …&Ý0³W-~'£ ‰1¼ž+ÄŠ_°=hÞX»V)Ϊ½¿±¸Ë¥¡Üp@Y׉ui$V$%¹˜¤â•*æò7>´ì"ÎR#44Ôäö ‘iuN-Ð.®®Œ£Lî™3'z[ñCûÔlŽ µóTžbGĽlœ¿z8wÎ>V´ŒP”Üåþþq: û¶®©\K6Ä”e;p+ô_Óº‰K¶¥š›C è&îùfÌÁ~çÎÃó­·J÷+B,îŽcÇŽ%ÛÍ‘Øópj&iK£GcrÇ7QÕ·+Ó‘êÁ½a2WíäæððjÖ4Zñ2 <ž™”¥Ü³Eu|»ëˆæ WÿFȽp|¶:íów˜[¿RHDY*§ËHËŠƒ±Ä-Ë´(ŽÔ<G‰èˆñÎ`¸ùu»8Qé±ÖNî‚1ý;®‘š¼i“Àí» põNð®øöÛºp¼Ñåá¤IýG¨2w†¾Ë|Ȱjóáà… ßÙiH¾dÇ“‚Ïs†xè~vn/«í·yÿï¡þAù¨×| ½†}Âû÷9—.]B—šáÇ/ûÙý\Z\´nOp-§± µ'cîܹU죔ÈÒ–Ë“R|^Æ S øÅ/%¥«Ú¶mëpÿ§¤#•¤þÕ[ôTUXˆÝöts”,ùB¨K&Ü—!qÐ2ŸÃ„e»ù{:N3’P„X:$Ø=6ROPjÞ½{W%NOVòt;"®:~þضd¯\=¸7ÌÝöBF®]kÓ.5+x£HþÜü=§òA‹HKÏpl²fÍŠ›7oª*ÝRkP‚㱞'¶}ƒéHí$Ì—Œr‰ÆÜÂó(» ±Ð’,i ~*Â[¨æ³tϦEñ] ´. é|+:6²Lâ!ýýýqþüyÌŸ?_‰uD´¤þÛ¿š„NKAÒóºfÍ€À@ûŸ“DpHüðŽa@YpK¢lNJߥ‹ÃÎDFFªªÛæ…^5D¸%»äúýé§Ÿ0HKrݰ.:‚«çŽS4‰1 é¦MNûï¥Dñ]ZÐö¶,3fTIWªT©¢‚ÝsäxŠ&>h锓'O"::Ú±Ÿª®мÏDU«ïì-¨ôŽŒEÈœÂÃÖàJ“â»hû’Ùp‘J¥d°úüóÏMË7n¬¬kÉ”%#¤îœ£óz _ìZ1C¥#µ%T8)-Zàþg33êáTt[|—mÌÜîÝ»ÇYîçç§&gC)mY8C)Ðéžš5ñ`\@†{a‘#«‡]OE+¾+á®É)¾«‘¢Åw)Ð$1<~ü—þøo²¬_Ù7c¦©ø}ÿfeQ“tŒ›²zåx²jûoe¨·=Ñuñ] 4I Q‘‘8²mÎ;€Vƒg'9dN’ú/×åª5f:ÒtNöü¹£lØowޝø®%wFšߥ@Ç­• Ì}QòÚ4fÌås–ð¹-ZÄØ6öoé’¼eË–¸páB’*7Äw%&nÓ3k6´6ÿ†ÞÆçªdH ?msžÂÞ>(Pª¬Õt¤ÿ;°ûVLA†Œnº¸à›f•$ÁˆvÏ]È=§*qU©\ 6ÚvlMRb)ý?þÀ¹sçTLjŸ&ÐÖŽoéZF­„ÎÓÚ%¥â6%…èë5}±{åL5Œ[bœ«ùvµÉ–t¤ó5Uáw±÷»ræ(º¶{?FÙ[Ò¬ÛéÖ¼7þD¦@[&þüjÄÞéÓ§Q§NlÞ¼Y化|7n܈!x2/QË—/W±¥aÚ–˜;w®ú+åË—OÒyjR[ã6eð‰d« ø»/FáÇo¿€ßðÏíŸ÷ˆlûãÚy¨ãwDY®\¹t“Ö–4«Äv|kø`èœõ*k]®žl tLD0% FÂÜDp?þøc,Z´Èª6lØPù—ÄÒL¬@kìäÉ“ã ÛΖ-›Jš$".áu–0¯èW5k:©q›9󇟬À_'~ÁºYƒÃðY|̉ñO7í€)]*+ë;“‡§ê8Ì[ô?¼ÂÓÛ íê‚6õßÄò­‡1¤}=«Û…?|¤ £ý’_„¨èG#_ Åª•ìq2¢Or¾®]»³fÍRË-!"*b§UU°ä/¶Ä€T±I±Í…òÉ“'غ»!¤àIDATu« ·‹Ýæ½ÅmJ‰«K+¿²ø§Ë×i‰FÄ럖ìvo7l5Óû#äÆ%ÝóÒ!=ߝކæÆ+ÐýÞ«¤²ÚáF(Ì€ÜY㻿›>,è:¨);#ÖñG}„MV†¢&Ôáf 9¶|Oìò8ÚñdTa|Äö?ë5nS|Êåë´PÙëÄ?ݸëå±äŸ–aß—OýÞiZvëÒxxÚžÜ?¡ô­ÚCÎR¸:#Å x¡Tá?eÊ´nÝ×®]£@ëŒ^-ª«úƒ5)Âhs .¬iHݨ¨(‹–¦µù„,j[¶µ´\Bë̉/nÓÖ!5â6¥.a·É«qáøA¬5y •Rþ錙Üq.x¿Åh“«g'Y µÿÓRúVÁ™R¸:# *¿ÿ™kU=Â|^ÙØ h’ˆåüÑ×ÿÅÏ›—¨JßîYñ8"\­×GôÓ'¦mÿ ½…¨ÈGI~s±–¾Up¦®Nyc»º }÷UgáˆN Ø Š ›À1‘â±F/Âõ 'LËDœÅ%bNø½$?¾ô­‚³¥puFº6¯ŠÅ›²!(ÐÄ|¿`lœeb1»gÉÊN ZúVñ3[êè´XÎÒßà )\‘Byr¢lÉØyø6Fzsq}çéê|Ãþ½˧âðÖåq×? ãÇ;FÃgt Oòs,Ù|£?ldZæžÉMUº×K  ÝÛxS§„@ýâ•¿˜è;·®âA˜¾œ»»gÆk•««,|±ùã¯ãO7iâÊ÷Þ{s=tjR•»LÁˆNÆØ|ñIGG?ãB&i…øš%ÿÆÿ~ÚŠ?íP…Y²¿ŒÌñŒ$´GšÕŒnnJœ-%‚ʘ=ÇSXI @’ޏ6^+Q@U?pô<®ý}•^ÿO¢¯ [× 41p÷ïk8ux'þ»s Îň–˜è÷ï WAÛÒN¦UšU’6ˆµ,„;ÄS3«9ÚF¥(Û†Ù9("ÆÓ»½ƒ¯'tÃéßöÄgm½”\IÅÖ4«$uyò4—lÃú½Gcˆ³ù$IîøœÐ‚&frÏ)ëTŠÑØâlޏ9R’ÔH³JRéævuÁº©=ñN·é¸põï˜ðgñÇ­wêÔ [¶lQá“ï¿ÿ~ Ú|}ìŠF²dsìܹ3ÂÂÂÔ62òTòÓøúúªñ’]FŸ’t.Ð’§BRoê wÏl¨Ò´‹Í%®Ì)ü”y»®ò9[#>´ÞÒ¬’”GüÏ[f÷Eå.S!¿MtTü´$Á’IÜV"Ðñ­×*™_ýúõS9Ù%¤*HÍ›7WÛH~xkÙ-I:èß6ÏGÕÿ+ŽÒ¥Kë꼦Θ…"ÿy#ÉU½e„àWc; [®|‘®‡Ó¿î¶Ù‚ÖkšU’²”.–ßÍèz}f+·‡² ˆâ>ùm/]º”¤õgÏžE³fÍÔS-°T0ª[·.~þùçS“t"Ðnî™UÞèš5kêê¼—,Kò¾’óyÕ§½Ð´Ç8•úÃ;Ô ¡g±^[Å:›Ã=§Y%)‹¤]<¶#:[–( zï޽꯵8éØëeÔ©d7”’wê¡`0ˆ&L˜ *&¹ººâÁƒ˜4ivíÚ¥®·íÛ·«Á$ ´3!¾fÉ }ú×=ðŸ·ÛT ëµÊïbÐü=¸r&›æÆ“(cº×Ü ”Êr„4«$åxhñEKÇaB¹SÖ¬Ycò1'f½¤ðööV®2¹Nä¬k×®Êç,ßÕ»woL›6 +VTé‡û÷ï¯\„mGŠ÷ ½q #[©Ñ›#–Žcÿ§b-u¾ÅËUµÞÇŽeSTÎhBÌ™ÐÛg.ÝÂÁß/ZÝ&¡‡³¥õ3fÌP“Æ[o½…'NX<~£FÔD†avDYoÙõ­Êý,%¯¤šŠ5·Å–…ãѬçxUÙ{ò–‹hÐyP‡¥áéA÷ÚIŒÅœV".IV}Ú?®ýÃÿ„×køZÝV‹TÑ:EÄ- §&ÄÓ# æe2"º8[â=µõæ"-ÉêÍã=¥Ò¸øÛ’ó) $J£Ü;M0$ðG‹…bc[ÏM{X\§…¾%ëBÉAULO.·n^GaÞwºS´GBŽƒ-ñž²>v̧Ôã3÷–Ïɉù<°1»WÌ@»Q Pú­: nùÔUöÊRÈÞë5}ñ{Ðfl8t)yŠ[&<‰|œìöÎëÓ0YiV‰ýß.™€f¤t¼§r/$1æóaØ=|óio< ¿‡KÃ3G®Dí·í«IÊ?m qsÐÕAì ÓP “„­ñž‚yÌgìxO!)1Ÿb/í‡ê-z¡^û!‰>IÐ/ñù§ Ik· ÓP S[ã=ó˜Ï_ý5F¼§\˜Ã† ³)æsçò©8¸i1ºMZ¢¯V´éü·Šï¹ç8^É$Ea ´ÝIJ¼§;æ3v¼ç—_~iš/æ3"ü>æh¨2ÎYu ™<æ1cƨœæáG —¸â\Š'ùœ·5 ¬DnB(ÐNáC‡PµjU%¨Ú¼Ð¾}{L™2EÅA_»vÍ$П~ú©ò;>|Ù³gÇäÉ“Óô|ÅzþëÄ/è0†Éf¡@;97nD÷îÝ•@˼&ÐY³fUátGURV­Z¥–¯X±BEv-ZT}–ˆ´D¬çw;Lpt!!„íðHµ‡Y³f©y±Ž5¤LÏìÙ³áïïóçÏ«áÚ2Zðúõë(^¼¸]ΕÖ3I ¤ä•¼¦)™õ1*ê  ô ‚ƒƒÕ€ó {±˜Ë—/’%KªÞláäÉ“jT¡tÁ‚qñâE”)S&ÍÏ—Ö3I Þ­T£õ†‹KòIâ¥ë·CS伊åÉŽÙ2ó¢@¿po¬[·-[¶TŸ×¯_¯–‰@‹ZüÎÒA(­%9ïСƒê”Á'š:-ÜRæêlp­g’lFuª§&BÖ½@wéò"ÔM|Íü1&NœˆÆ£I“&¸|ù²ŠòÐFJ‡L•*URÞ$Š#-ر|*êøùÓz&„>8}útŒÏ"ÄV'øùù©)6nnn˜9s¦šÌIÌ(ÄäXÏǃ6aüúÓ¼j I'0a¿ƒ YÏñ%„P I£YÏÕ[ôdcB&zb÷Ê™´ž I‡8½:úéSܺuËjÂ}[HÑxÏÈÈDm'Iüƒ÷®GÀš¼Z ¡@;…_­Œ 3æÁÕ50ÙÇòÊ[¡·¯§ÈyydË ¯DäâØ·ú3TiÒÙæT¤„ ´î©Ú¢·š±žm]¦rEBÒôAëÍzöÈšƒAšèÍz®í7Ašè‰Ÿ6Òz&„MôFTä#ìß°5[÷ecB&zâÀ†@øÔlϹ؄¤cÒ4ŠãÖå³ø7ä&[Ý€kF7í­8‰ÄzÞ»zF.=ÌF"„v¬ h ¯œÙØêBCïà½!óQâõ*­çl^ùØH„P ÓŽðûwpöD0[Ý@•êµðäI$­gBˆUèƒÖ‡·.§õL¡@ëè§O°÷›9¨×~ƒ¢pŠ¡Þ’ÄH* Œ=Z}–ù±cÇšI©*IÄ/üù矦úƒÚßܹs«}zôè¡>GFFªŠ)«W¯FTT”ª˜"%®R“_·¯B‰r•3O!^•„ç² —,Y¢ÄT¦•+WÆXwèÐ!T­ZUªTQóæˆˆKõî‘#Gš–Ieï'Nàðáêš·TñNmëyDz)høáh^‘„ç² …ºuëªâ¯"¸5ÂÙ³gMë¤î`÷îÝÕ:™±Ž-ÒY²d1}^±b¶lÙ‚¢E‹ªÏ©]V³žó.Å+’â|ôðáÃñÅ_àË/¿„¿¿ŒuüñªW¯Ž5j¨ùØî©;(V´†XÌÅ‹O“ó¦õLqz Z|ÌEŠ‹‹‹ú«Œ]»v™üÍÂÑ£GQ¾|y5/þæaÆ©B±åÊ•SË ,ˆ‹/¢L™2©~ÞÇ÷o¦õLqnÖ¬Yg™¸4ÄõѲeKõyýúõj™&Ð3fT>gñO7hÐ9rä@‡T§à¢E‹={vLž<9ÕÜÛOćVðJ$„8¯‹Ã"Æ>>>¦Ï2/ËÌÉœ93úôé£"?‰àkºR¥Jxå•W”E\øýgx(†%ËòJ$„8§m©N ¶ìôéÓ1–‹+Dܱ÷“ND 777Ìœ9SM©Éá-ËÐcê:^…„ôiAë•;¡!jÄ`ao6!Äy-hG$£ÁJ¯ò^w6!„tR0üHi²f͆—óa#BôoA‹šû„­‰£¶Mìõ±ýÐ_}õFŒ¡æ§NŠ?üÇWÑ.\à/O¡@'s1ޝ#ÐC† ÁîÝ»Õ|½zõ”@ïܹï¾û®M B¡@§0 0Í*dL@´cÇ ´iÓÆ$ÐBÅŠœ9sª¡çíÛ·çUFqlöôôT"jþ7±.Ø‚-Ë{öì©,]áƒ>ÀìÙ³ñæ›oš’"IÚQ]ÙVæ­Ñ¸qcuÜÐÐPÓ2IÄÔ¬Y3•Æ4¶/¼mÛ¶puuUV´ˆ¸ä‘„——¯6Bˆc t… ”»@r2‹e+bj+æ‚}ÿþ}Óü½{÷âøŸK–,‰½{÷*‘-Q¢„i¹Œ*¼yó&òçÏÇJ×(]º4&L˜ ¬kã š!ƒI¨åÁ IšöíÛ‡V­Zñj#„8¦@‹;@:ò$é~Ù²e±téÒdO"74A–ù)S¦`Æ ¦õbQË÷ ñ¡!C¾½½½•o y€tíÚ¾¾¾Jà-ù˜5a7K:ux¥Bl&†yXշ뱎c§ÚжñïÇõ+Ùê0­Ò>Þj²1ž3z@­ð¹3<ÙIÃ{@÷ð³s{±ýœÖ#­Û\Kæ9P…Bt šB(ЄBl!M; óõFÁ"ÅíþOçôÊ»¡ÿØõ<²æ@–l/ó $„èC {ÍÙÉ'„DB!„P  !„P  !„M!„M!hB!hB!hB¡@B¡@BšBšBšB(ЄB(ЄBvzV|É)¾ƒ¤+² €—*öÔå±(ÐÉ$ðÈ3^Ý„‡ÅÕüC‘Òå{½^£Y>g² ›ögšwqqÅ—ƒ}´vò+kïø…[Õ¤m#Ë=ŽBó¡ó±)è8ê¾]9³z$éXzcÝžàK§þº¹Üé-èØ<}…©Û®¡ÕàYøv¦Ì'U†Œ˜¶ã†çµ3üm²Ðå/­u3q"0r$pà€QLOœŽ1®“¿Ú¼ ÂüúëÀöí@Ù²ÀŒ1õ×_ÀªUÀÿûbÿ_Æ‹¹­ÌW® ìØa¸Ë,Üf²¾vm`Ï`Àã9:9"ÌU^/‰ëÛ§áí²Å1pÆ· îóìH é¯6¯‘1ƒ+n옦ÄÙÆÚd‹.ÐðÃÉÃoÔ~ÿ\û3ƺzí‡À=K6Ôï8ç ¨9Íš-YÅ+W€±c­o{ìб#% ЩpôhÌõ9oWJ˜Û´ªV5ZÇrlãnjǑãÅF¬sõ*UŒýçŸNÿ3ütì†w¬lYÜ1¢Ó»Øô\²Ž7¤}=u,9æcç²Í2¤§û4£›»ñ©äâŠgÑщÚç%ƒõýTíõ8‚bçˆøÞˆnÜöï,¶l&LHÚ±²f}1?~¼Ñ2¯T xò¨^=ñÇyöÌh¥çÎÍßGÝ“/á©ážt5Üo£ts,ZÐ:a÷Ê™xô0 »¾ž†WÞxq£å.XÇömÄãˆع|ZœýÄê¹q‘ ¨g&O6 h«VF±>tȸ\¬[nsÞxX¹xøX±(_Þúq?6ú¤åØóçÇ\'nq…hljXÝsç}Ñ·oýÑNÎ;o”ÂÌ•»öð¦¯Ø…å½MëJÌûŽáAÄcL[¾3Æ~b%_¼çxÚ±¦}½ Õßx%YÇ¢­sÄ?=¼A~ä/þ*ºOyák5hVM黣~Çaqö«×n0&øùàуé‡Ö+Ò'n„¿ÿ6vâi.Žví??c'žæ‡fø€o¾^}Õh%[cÐ `øpÃ]d¸Z´ˆõþ=Ä(º"ö¾¾ÆŽIsä{¦M3î'"/ççä|>¬ :,ÃìoöâÍW‹bùø.¦u³µBï)«Ð}â ëX?Æ~ƒÛÕƒßüûàQ ßqÔ“§Èß`8^-žßN鞬cé•A¼U}»ë8v±Oz»%ƒâjF¨2w†§SýSQ†Wìo ü  `ñâTý*ïÝÃÏÎíå™®‰Èp”Ž>[i=raк=ÁµhA’šHžDp”,iì$„.Û¡õLRóð=’¢8«õvBšBšB(ЄB(ЄB&„¢b„Ùݾ|ÖíÀÆÀ6 ±ÑwïfÆÆ¼þ’ÈÝ»á™7`û987þ¹—‘­@!„B!„B!„B!„B!„B!„B!„¤þ+°ñ”§t ¼IEND®B`‚refdb-1.0.2/doc/refdb-manual/refdbmanualfig6.png000644 001750 001750 00000030630 12255431171 022311 0ustar00markusmarkus000000 000000 ‰PNG  IHDR’à)à„ cHRMz&€„ú€èu0ê`:˜pœºQ<gAMA±Ž|ûQ“sRGB®ÎébKGDÿÿÿ ½§“ pHYsÄÄ•+ IDATxÚí XǶÇ‚ˆ‚ BÔ¨y1Æø$æ%b÷0îQ”¸ÄqA\qW\"š¨ˆ¢Hp×(QMLÌ5×ÄHronbcr( ¨¬¯ª§gl†f˜ÿï|ÓTwUŸ:ÕU§«ª»ÚŒ¨&š·œigo¿¨a£Æa íÜûé?ÓîÿÞ–ƆLª‹66õ|.oñªK7CBÇü's$00:êÀàHÀ‘ É{w’¯óË¥ÂÇ:µ(ñ«‰Šî7t<àH¨bNÅ좨³ŸÂÀ‘P>23ÒÈ¡Yó*?/z”Om£„7Øn>þtáð~ ÜMû"C)7;[;¾k«ê˜„Ô{”’x¬[I.ÜJ¤ñÞ¢9t#å<ù.\F®žÞS¢i??O]KKÊÏË+q^õýý=ÆËžWî¸ìôÅ…3TXP JëKö¿4Ÿãƒq!ôH¨zõ£ƒ·~¦=áK(ýÏûô8ç%íÞ¡jx•¿ñ›×PhL¹yO*ß5Æ<œï/ë8%rûíÜJ6v'bnnQâ¼êû/&ÄÉžWSoSË6mizäfÕ1êù=*ˆsïþªíàèXÁ±Ô17¯RN¼¿–î=Lùy´b‚‡pþ'¹9dÕÀZv¿®é¬?™B×Ï%Sôâ ê;jLµç€Š€«TvŽÝ™³ô\‹Jí;òÞ&òœ9OØnñò+»z9í_F‰Û7 áÒý lliÛÂYÂü/ßßQíÏÏ{Jñ›VÓø ÅÔúµ×e“"·?íþ=:´aYÔ­K?~ûOêìêFÑK‚ÈcÆ\!Žú~ŽúyåŽ;¶s ýãòêê6”º zKc>¥\:zøÏô?ÿØ…+f0¨.^hÛnžÿ’ˆ x³]7ø›í?|}Ã–ÆæHÀ‘¨>0Ùª•»ß#èHAA>ê+€#@ÊÃûi§>>otz=øë/û¦M¿4:Gòôñ]\5P3ˆ ÐÌ‘€#GŽ GŽ 8€~Ìg’+^¬ö«‰b˜À‘`Úðˆü¯žqà< @E&¿éß5|!€ÒŒdrRCïÁAÜ·’Éh&1YÁ$Rt aâÿL.1iǤƒÆ÷µfË$ÉM1Íbúrû@€ZÆ9&Vâö{LZ2iȤ@­‡Á‹+“íjñ·‰á‘Ò×¶£ËÈ gÔþÆä,“BÂ|€#èÉ&QL’¨ô\ÇR&39¦>‹É(& 4¤©m?€¾G€`Ž 8p$àH8p$àHÀ‘ZÁ)(h$ džI+q›/Æø;Ì€fð-ô$Å’ð™LìÄßL’™øÀ< Gbªô… ôâ&]ÄíúLþf’;êÅ÷Lþ„Ð#µss‹üÛ½ú–Ђü¼:÷~úѦ°  ŽY:ÅŸÚ7iö–Ñô?ÿ¨›™žö.)>ÌÐ#µk;»'«œmKèNìêåtþÐ>jÜôy³-ç¯Z1gl«èÆ¡«žÜ½†0AðÔÆ-&»F49tïÑÁ À‘C2Ö©E¥¥•›MÛƒgW{ëÖ«G‹w"çÞ®ÏseÚSä½;É×ùeÏÇmÏË8PcIމ¦Ž}TI#«VíÚWi£_ç9³‹¢Î~ªszû¸ e 0Ú;dm\;}‚œ:uUýŸzϨô¬*}Ê:>df¤‘C³æ:§çÔ¹}vú$*(6a¶M§/.œ¡Â‚‚"o|Œp¥É¡‘”•‘. “¬ŒORó%‹³/2T qóñ§qÁª}„SVzº°mëà@akKK®qKûãÙ6n\Jþ;ÈË®ÿÜ'L¡ïo+±_N¾o_8¼_8ß ¯ t™Å¸ˆ~úîºqá, óŸFž³æËÆOIÿ¥«„»a.|[î\r86oÁœV†ì¾^L—ðC'èì=¥ôÔ¤K‡^ýèà­Ÿ…ío¢ÕGβ<œ3§’Ní{_cüøÍk(4&ܼ'•ÒåØÎ­Âd|~^]LˆÓY%šÒ–êÛßË.=L—ŽÄ ÛÚì.+ÕESoD.¬äð|sT € Ðõ'Sèú¹dŠ^D}G¡:ææô$7‡¬XSÏ¡£h®{o²oÒ”:»º•Š+4`<Ž”‚ü<Êf’¥U}**,$s Ùs©ÓcÈJýê:uw^j_[çNÂïÓÇ¹Š»‰žštqîÝ_µÝîMá·¸¨H•¯-/rðÑÒ½‡…|®˜à¡³>ÚêËxBÔZ*fSV¬Õjwi\]QO'õÆçB€ Ð Ÿ7^¢è%AÔÕm¨ð§~ƒh’‹“°ÍÇ×›¾ØŠÞšø™Õ)y™LØ ¼o1þÿ^,5Œ²{Eµíð&µ|ùÚ³r±Æs©3Ô:ݼ|Q'½¥zÊé¢rñÇÍ ¦ð‰cèÜÁ˜Ò½£á£)rÊxúâüéréSVÚJ¬Ú’sWêØg€°]–®åA.›WR„2 <àÍöZŒmc‡ì®}cSž¸|¬þ]WÚrþÕ³ªc­ˆ/$ÞlG¡Ñ¡µ0Ž'ÐæH€,ñ·…è‘@T€œÌL«÷‡¦×â¢b3³:fÅеúà«ÿ¢Ö™&˜l¯Ý´2<öfŸÃý“š²ô,œíE&“âcZjQy¤1Á§ àH0zš1ñ#ŧΑâ)¡šÖóâËÓ÷a2RÌÏe&G Ÿõp$T*}EB¢ó¸\Kòe!:•qLáT †¥‘è<ÜÄ–;Úü)W©Sáy¿Ê„¿ýø#.G€~ð¥€'3á/TîcrÞDíГÉÛLÚ0¹Î$N`Ì—sŸ¡àNc*“d&Ë™´D‘”r*›Eû, ®%Ã2ŸIn:W ßÕióJï‘c¸8;0á_Uâ Pña«QLVæÔáÃ\s™ cr…C~Ç™¬mˆk©âÌcò¿&˜ï ÷H€6*kø“?µ4–O-}Ï„/s{æÖË©\•8b>üµšÉW¤˜¨ÿ§ ]K†¤ “ßL0ßÂõ±Öö"˜ðOÞ…‹w÷Êðâ/¯0‰¤NJ÷‡1iMŠ mþuª›’8rûÊC;R ËL;þÑ>ÿñÅVnx/¤x'…;•…¢­ù‡Øÿ0е´Rr=h»ž y-ñx!¤xLúŒZxSñ¼|8j&“Lê‘âÁŒo˜Üf¿°Gi~¾#Å{<+$z›‰úñ°Ñ®íDg­Iw¹ãÔë _£ÿ'&/39Âd—˜‡Ñj:|,csÎN&þâÍW?&§˜frHRÇÃ$eS¥`h«örN¼ë×otø˜ûlµpþ BW&‘2qÊÚ§KïƒÃL+¾âÇOPT…;çeLÜÅÆn0)æT6‹å]×’¦ë©¼×R±d8ˆßtdˆÎaªÌ±‡DG± ÿJW&A¼I1ï±A&?ï‘b®¡èxÍÔz‘¢ŽÛµè®é8©ÝöˆŽ`²¸­D]M6Ÿ%:ë&â6Ç™É&“0´* å[ŽxÁ5PÛÿ™øk]‰:´+?¿S;ÁÄ Ž£JùQìñqÚˆÎßt–Ia%ÖA¥S‹ó6Mí89ΨÃóï(ö¼øHR>“×™x’bnq ¨L¶ˆ•-FÇãg‰½…zî“^So1ñ!År»È8ÇëáTˆÞˈ7²|ò¾ÀÀ×SE¯%N)†>Ëó“ßÄ|ók°Hf?^b’$6ðêsKÅ¡¦cZt×tœ”‡çðPŠÅ0ÞÛú\t(ï‰=›'¢CI¬î‹ ï‘CÑR¼¸ù0Ã)ñ k.ÕŒrãs*}E§rX§bìð?ŒÉ $ÿH/€#FƒŸ(: >ö{&S1¸Þ|¾h5ŠŽµaÑD Ý©ð›7ñ&ñ!&Ìq8P!úRí\4” Ÿäå¯oàT Ð S[4èæTÜD§r‘‹Jb> Ž€R`ÑD  IO…ò8 §Gj?üñÜ‚2o±aàKmðÉs¬wàT PÁ‡¨øKLóÔÂù²üÅA>lÁŸÛ?MµãñOP}N…¿K4€C£çD§’VFœVâM ®;8`ļÆä)&H_{&ÒEùK[wa&``ø2ƒÅ묑¤§¢îTøË|ÙôìaGŒð‘¿]ÎŒãK\\ïüø{GqªÑ©ðÞ/xã1Œ¯ S™¦#éKŠÏƒãÄO:P–÷_¤øþ‡©ÃŸ:Ú3T ÒO óï¼IŠõ»øêÅ|é‘=0‘é9’寺t kïÒ52~¸yƒîÜP¼l^Ÿ'ü֫߀\=½ÉÚÖÖdí’“•E—ŽÆ§=Îyôœ‘©6ØÚ®Q¤™™™É¬ÌÍÊàÅÂü|{U£dfVPÏÚú ‹ºÙ¨ÁÆKAÞÓÏŸäæÎPÞîD<Þ ‚u?½KiüN¿ýûúéηôÇþM-Û¼"8Såï{¿qGbŒª5{©]{§·gÌ­o*e±qöÊÉ΢Ö6d^·.Y5°¶xåõŽ/ëƒÊk¤Üýþ;:E”›Ku$Àxiö?­y­kO£`çèXÈzø&s“Ó¡wj×Ñ…^éБZµk  b”Ýç±N-t:.yïNòu~¹ÒΙ›MÛƒgWj*ƒŠØ¥2õ–Ó«¬óqÛó2µ·.ñœYë¶ÑÀq¾HuÕ%Ô£îHtåTÌ.Š:ûiåXL4uì; Æ5R»â‚6T¥Pê¥kzû¸ eP—jC=2T:úêUõ¨NuVEÈÌH#‡fÍ+MÇk§OS§®F×ãÐDBê½RvQ†"]C•—®é9uîFŸ>‰V¾ œ<êRå×#C¥£¯^UQªdŽdKÐtúâÂ*,(2®¼pø/ÿÁWšIYéB·MÊ—,Þ¾ÈP¡kææãOãƒK\|Ê4®&£ýkß½Ÿ¼œz-lLYéé¶­ƒ„­•ÕIŽ´?î‘mãÆ¥Ž—V9ýWÆ'iÕ¿,ÛôáA7RΓïÂe„¸\—%Ðuáô(ó¡Ji…Tê¦ü•;^IJâA¶o%¹ p+ŸŸëÂáý‚n­œ^#ïùK„}7¬¢µÇÎkÌŸ4î¡o)U^r@.[ûÆ”vÿùëÅP×!êRɺQYõˆ×þ¿®uéø®­eÖ#©^eÕ%Ï™ó*½UIäçÔÛÔ²M[š¹¹D#¢üåê§ìâåÎ0ÿ’Ÿ3Þ¾„Òÿ¼Ï¤¤Ý;Jyvåoìš0Z´s?GǪ*Çé*ÁƒsáÛšt’ñy vAg”:¾¢úóÂW^rz¸³ÂI øÍk4¦·!‚BÞ+u©ë¦DÓñ~~>7ïI%Â;ôêGoý,l÷÷ð¢KGÓ¥#ñ¶¶ò‘Æ-K¯²ÒÉzAÏ7‡÷ÐP— QP—äëFeÕ#}ë’¾õH.ª¨GUÒ#Y2…®ŸK¦èÅAÔwÔ…37§'¹9üQ?ê9tÍuïMöMšRgW·RñùÍ ÊãhÃ̬ä«1ü݉lfHK«úTTXHæuR§Ç”úÕuêî>¼ÔñÑ_z袇¾60νû«¶yOˆZKÅìoÊŠµZu“ÆÕõtRo|.”Ð\—*«¡.UN=Ò§.qYžz¤žÎggNVz=ªGâóÆKÂE×Õm¨*¬S¿A4Éʼnâoÿ*Œ÷5}± ëKfuJv’¦Fl XÖM[7c"kìÎù- £ÕS}UÛʻ޵mÛáMV òiÏÊÅ4-b£FÔê?b"– ¿úñÑ_›mÎÆí¥ϑςeÓðž·„"¼)'+S§qÒ²Ž7'˜Â'Ž!—îã[7´%ç>®ªm]ó§+réܼ’B“–FÀ{”q½ºÉÕ%åq»W„˜|]ªh=Ò§.•õtz »Òë‘ÁÞl÷œ9/¬¼/$ò1Íw]]hËùkTϪ潇uŽ]¬‰Û7ÒŽË_UXM•þB₌ñÍv¿oØ>{ÃS«G¨K5‡;_~NçüóÑÃΓQÜeuh-Œ+ÖÔ‹Ÿ)óñÜšª?¨%½•^P—j.FÑ#=’Š÷H0é Ð Ÿ„Sè‘Ì©om³æ4<ùyOÔµ¬÷˜mÆ¥°¨ðnÞãÇ­GR×Òòƒú6 Ÿ¢„ Xž>µ¨[¯¾»c òóÌ‹‹Š¾}œ“ÓÅŽTYL¦39S˜|HËf0(C˜ð·ñÍ$ÿ¶Ê?J†ÕœfLø¬ãH8“á‘(Àpð%=/6zO`Ã9ãf¨XF.0妋ø‹ ‰Iâ#–ï•´‚9(W¯¾!“ºLüa8Sƒ;¶·˜ ‡I(W¯ÞAÜ~æ€#15øšÛÖ’rò†IÐ/z6Ìdh“À‘˜Zàënç1)b—ﴂYÐ e¯ž×¡¦LÆÃ$p$¦Ä@&iLþÁä{±{Þf@¯^½=“ûL~g¿7;f#1ø!ÿ(s “˜x2ùwSèÅX&|­x¾”ñÇLŽ3y•C\ޤÖÃטæC[ÊwGr™t†YЋ—Åzóñ?&ûÅú@•Q]Ë’HßlŽ¡gþò;)¼D €vx=QN¬·ë‘’Õ\¿¨r'%u$€òc"7¡Õ‚9®/­à ñ—?ñ‘HŠa¦™L0©Ç䲸Ÿ?Ë$ÉMR<®{‘ÉRLö}+Ç'Íψ釉éfrˆI¸ø¿>9x…ÉCå†×£“FX¿k˜#Ñ~!tb²ÉR®BÙýØòq<ÝZz¸ZHC;F÷ö=jTèk/7–?žO8-df¤‘C³æÕ¿,®>ANº•½RïѲ½ t>>V/»ðxëN\ «Ö´'|I‰ðå±GèpÔšrébÈk@×ôœ:w£ÏNŸ„gГ¿³PKû¦M3wëgÕ–Ÿÿqz¶q®Qe ¯½z±ü%Þ¼Xeúéõ©Ý”ăt`ÝJrঠ»š|Œö¯Ut'/§žÃFÓåc ì¸pz”ùPUÉß[4‡n¤œ'ß…ËÈÕÓ[»sãsÚ4ƒÞžHƒ¼üJݵºùøÓ…Ãû)pS4í‹ †%xØñ][UÇðôåôÒtNé1ÿµn[)ý•|LYéé¶­ƒ„­eúN§/.œ¡Â‚ XÚ÷ȶqcaû#ÖpÚI]Ý蓤#ª8_²4ÔóÄmpåø‡ä>a yÍ]¤ñ8¥]}û‹*u--©¿Çxò_¶Jc/À¬Nš½á=U˜\ÚR»*±sp$¯  tëY*];{®iyrÛµrz¼ç+ÓÁ «hí±ó²: .Wšgé¯zYÈ¥ckߘÒîß«Õ>¿s è9šâ¾8MaC§Ò׿ý@Iß\¡Àþãié)Ôy/EyΧ´G„;Ö/~¾MÓ{{ÒîkÇ)só'tòÖeš4J™ÞÇ“Ö}«J÷½q‹(äÄ6þzŸç ˆ[IÉß|B«G΢I݇SÌgI²Çñ4”çÊ/, 7Z¶¥ˆá3„}K“vÐç ½[ux>¤q¹ž³Ö Žó\C{Ú6v¡¢ï âóô55¾¿=ø‹m©tR§ÜVOC}”È_îü×ÛŽ„Ý䤶Ӥ‹œ½¬íè·Œ¿Œ³G¿y …Æ$›÷$UXìš0Z´s?GǪä¸ ò~\‰ÊíÎ*3ËÓP²ivÍZ¿]åD”C&J:ôêGoý,Ü §ÿyŸç<¢¤Ý;Té*åô’;§2}i|9ý•ø/]%ÜõráÛœŸSoSË6mizäfvrlÞ‚²22w?[×Sè>æ|ýK£ž'á.‚9±ðC'èì=e§´ çØÎ­¬1oDùyyt1!N£N¼æöøâü)i«ÛUÛðTðÛƒiä;3uºNÔõîïáE—ަKGâ…í²ò«Wª£&]åÒÉzAÏ7§ÚÎØNéꂽ¬qÙNïôMÏÝE[/Å ûÆuL‡¿:/8î\8ƒ^íJ6]¶7Ò½‡ÿå|Ò¦‹qªÿ†&ï¤33·Ñ´Þ%ÎÇTÎ÷s4§~®‰Ý†Ñþë§(– ßV¢®ƒ\ÜMAô7s†\ø¶’[¿ÿ‹Ú5kE»¼—h´Ï ¬w•öè¡Æýêiè¢oè¹èr~MvÓ&EN9{§çd²^dãì‘”…™™™Þq,­¬èþÝŸèµ®=dçÞýUÛ¼¡çIsó ïè£A~e³ÆÇÒª>’¹…­?™B×Ï%Sôâ ê;jŒlZ=†Œ Ô¯®Sw÷áeê#Ío˜Û:wŸ>Î-ó8©]N¼¿–î=,èºb‚‡Æsqݽæ†Ð·ôÓí[Ôúµ7t¶kVF:%lY§*'¥-ï2§îçY¢·WR½yÏ/!j-³¿)+Öj̯\\]QO'•õ€yÙÔvº·V”mQqu}éÿ„íGO+œÌ›©Ã*/zÞΑ†½Þ[üj·ñ¾³ž5’ÝȼŽáG¾¥çâN-ìÔ.áE6e¢,¤qó ó)9ƒú–VTXTDuÅKåËEèØ×ÓÔƒäÛå-Y<;2Gûã×äÑqY[Öÿܼ'Ïz³2ihÓGépŸä—Š+wŽŠ Kù|ÊòÇói”ŽdÜœ` Ÿ8†\º«Âü…ÑꩾªmŽ÷¼%àM9Y™ªÆûlÜ^ºqñù,X¦Š»|ÿQZ5Ù‹r²3idÀLç±b#CiÝŒ‰T\\\Ê!Èé¥éœêÈé¯ìµì^Bm;¼Éé|Ú³r1M‹ØH>o¼$4Ê]݆jLs¨ÿtЉX*8’1³º9÷q§¦<éš÷Rc¡ÃGSä”ñÔg¤§NŽÛãÝ :´iµà|´ÙUi >´Õ¾KÃf<¼s°®c¼uºNÔ±nh+ØD¹­kYëŠ\:7¯¤Ð¤¥&=ßÁç:Z;¶¤)=FR³Ò Q´W-8E,ì& ú¹o›I#Þè[2Î'‰”të EŽœYæqêØÕ·!·öÝUۺ蠼ûçC@]˜“äen⊿XØgÔ‡9 í¬ùÆ#Ðu<Ù(8’wûŽ!רi%œŽzÚô‘"w~¹sÈÙMS˜¶ò‘³÷¹ï®±žÚ¼*»®„7Û 5ù 4s#廫_O’R`ŒZÄ‘÷6Qâöü¤ÒŸ'mhÕàï¿Ö]¬Ð ‰|ì¾]ØhúvÙ‡ÔÀÒ XMHçMÊ «nø{$ã÷„ÉÈÍö¬’¡- ~÷nmkGSW®‡1@µÒx^_ }ë8P}C[ | ÇŒ…쨫0‚ ×ó0¶Þˆ>`õ_ï‘l?ãLaœÙ¾æ2j¦0á¯cÿ S-W˜\®‚óðå0¹Q>ø‹«`†rñ'“ïa†šÝc,`² ¦ Üð´ s•æHŒ›®bSPn<%õ À‘˜|í>ßwS”›!b[çSÀ‘˜"®âoC&=aô†¯ÎØX­>8“¡åÚ!|ý˜€rõFÄm[±^8“/æ%]£L€Þð…ôê‰ÛŽb½p$&ƒX>üÛ°|Mz>¼Õš?ÔªãIDATf@/^%Å+üéǺèÙÑTÕõŸX“É7L’˜„3á_ÂÓ[èì×A¬G·˜üÎä5zöà ^PµÚIñ‰õ›¤˜‰aÒŠ‰·èTº±šIªX.1iÇ$“ªæÁ“rRæ¸Ö´^ +Ä_þÑêD&ü«SücH1özYÜßš ÿ.iºèxÃÏ?š¼€É}&ߊÇñ;¤3búabú‡™{ü'q›/‡1’oNJŠ!®ÿ XЉ¤˜#áõh"“LN0á_¤ºQõ»Ö¡-Ý9$v•70áßnåŸ ’ìßFŠÇ #Åÿù·xù—løäÞ&Éqç$\ùYFg&w˜(¿M{^¼øÕ9b@gVÈÔ#¾ÔÇžj®ßµ¼ä¦;W%ÎW¹Þ³M9º¸Ê»•B1>¿Ð_'ÅÛ·|kL €Ax¢G8ê7‰Q0‹É(±«Ë™+¹¨æÊÏç;ŠeÀ/ì|±k @ý&HeN¬)'Ûåç’‘ÖïZæH€Zz$To GŽ 8Ž 8p$=[²<øµËúõ¯ç=~ÜÍUlßÀ6ÒÌÌ 7}  °°¾…¹ùcX¢üäæçe?ÉÁ6ÿTßW¡EÛ:wz²òÐI+˜Ôdî|ù9mœ`ʼn1ª×l@;—¶“{Œ´AIêdêÁȖȶ÷Xý#ç?_Ðû•Ž0¨V¬ëÕÏÓ´¯J»ËcZTʱ†Œ«)~nv6mž]-¶0Æò1¦ò–Âˈ—ÐNƒÙÝ+åX}âV$ÝʲAÖãG4ùÀŠZW†Òãyþx> z$:’Mû¨Ò½‘cjߥ;ù…„‘Ãszŵ¶µ£±sÒàñMªœ:öqÊjìì…¸hk¸“ËÝúYµœ;êãCäÞ¾G­¶—ËÏgè[ïäü˜ÀÓ‘k§OS§®UÖ»HH½GëN\ «Ö´'|‰Þq—Ç¡ÃQkjTÆz8uîFŸ>‰ ¶†S]N„óá?.PÏ6εÚ^½Xþo^¬9=’”ăt`ÝJrঠ»š|Œö¯Ut'/§žÃFÓåc ì¸pz”ùPh9ï-šC7RΓïÂeäêé-O.ŒsçÆç´%h½=#yù a„SVzº°mëà@ak…í-AÓé‹ g¨° @unuÒþ¸G¶—:^Ú˜ñ¸ºæM“ŽRìÉ+(„Ýzêe7%6vöeÚ\=L›Neå{ÁWšIY锼w'­ŒORó%‹³/2Trróñ§qÁ²6ß¾˜®ÿÜ'L!¯¹‹d㩇ßµµ„¶ö)íþ=“¹kè9šâ¾8MaC§Ò׿ý@Iß\¡Àþãié)Ôy/EyΧ´G„»ÏKsß§˜Ï’(äÄ6þzU:‡¿:OÁÇv\;j6å±2áÇ<ÈÍ*Ñ@Ä­¤äo>¡Õ#gѤîÃKÅ×i°lçÓ¿¦ ûB)dð$ªknQJž—é½=i÷µã”¹ùáÿ7Z¶¥ˆá3„ýK“vÐç ÷ Û'o]¦ùG£„¡™é}¼ñ–ꤜ—à ½.ç—³µ¶pM¶áºÈ•yzN&µ´oRsIY˜™™,žz˜¥•Ý¿ûS‰± ?²YCciUŸŠ ÉÜB‘ýõ'Sèú¹dŠ^$4rô2‚R¿ºNÝ݇—:¾Ž¹9=É͆¡ôÉ›œŽRøÝ}–u¥ökK›7ªwYCîç)8`}lW–Neå»çÐQ4×½7Ù7iJ]ÝJÅ ŽŽ¥½ú q4Ù¼­s'á÷éã\ñä¤z¤²/+S¡{ë7„ߢâ"êúÒÿ Ûž*cûæ@ê°Ê‹ž·s¤a¯÷Ö^¯ÊùZ™\<õ°úuëÑÿýUp$šüjÉ×x¸ ;µKp$Ê…’£ï¬g u72g7L¼¡V›W˜OéÌÔ·´¢Â¢"Ö {Ç‹б¯?¦©#È·Ë[²zxvHWYʣ㲶¬/4þ¹yOžõ°eÒ꣞iÏG=®\úENux‘ç³Æ8’qs‚)|ârè® ó[F«§úª¶9Þó–Pd€7ådeªî.ÏÆí¥ϑςeãÉ…q–ï?J«&{QNv& ˜)ܵöáAm;¼ÉJ>íY¹˜¦ElŽõyã%Á©tuª1Cý§SLÄRÁ‘¨ß©ß šäâDñ·Õ9or:ªûó¡­ö]zÿ²UzÙÇ­Çœ¥ëï2m®¶má¬2u*+ßÍšSÓ[ÑÀ±¾BoHÊÔˆ JëfLz?\O]l.O.LªÇÍ+)4ii&-ÙukÇ–4¥ÇHª#¾Ï6ôrgwê#Þè«:nÝè94rgjûiA¾pÇû07»D#ýI"%ݺB‘#gÊÆÓÆùhκ}6=|üHV9ìêÛ[ûîªm•^!´àXy|°P¸ä†üøPæX¹C™›¸¢Ç/öÙõ†ÖF;÷×x^Þ« :²Qp$ïöC®¬‡'u:êi¨ëSÖ|…z\¹ôål­-\“m¸.rö>÷Ý5Ök›g¸NAâú±;Èx!&sú‰Û7ÒŽË_ N¬&!¾øÏGã «ß¼¾Q+‡Oo¤oD>ß.l4}»ìCj`‰jZSÐôVu>É&Ü8®öùóÎýŸx7ë®ú><µ Ÿoás#5͉ÔfÏëKÓz{À‰€JÀ‡•€q‘uF¨hêuTgoD葨¾É?ýXgëü`FP“ÉLK3/...2Vý~͸oñÉ¿o¢ *'ƾ- Qrž>¶Ô´¯"“ím˜ô€yA-/}ÞõÂ2ò ûIN«†VÖwa‰òSÖ2òPÛákæ„+ Üåj;Ê×È{Âp$PŠmÝx˜ŽôÅ‘‰rõÒ¾0 è _ƒ§±¸ÍÃk “À‘€>ð甯öó¯Ã ‡IàH@^f—ÖåÑ©KÏ&ÞÁãp€Ú ì·“kLˆ=’7Äv¯æA´1ŠÉLørž2éÅ$›ž=\ (‹yôlÔå’øË{(~Upn“rRæ¸Öµ”ôlk"“X&|mÀý ñ·)þ-pþyNþÕ¨Lê1¹,îo-Æçß±å ŸñIü‹L0¹Ïä[ñ8þ}^å÷ƒÃÄô39Ä$\ü¿Ö¡-@m¥@pÞÐóo=o`²ƒëIöóž»2‰ÿßÌ„Ö?^¼IrÜ9É ºr-CþÁ´;L&ÕVCc²ˆ®Jn®•þ°Ñ!žú–²7R(Æç= ×™x2‰a²ŽL“Y¤˜¼_ þ?Wâ4æÊŸÄ䡨ÆòÇóI1t †r©qñt—0G@%öHz$àHÀ‘€#àHÀ‘€#GÀ‘¨(f0FÁ»F>0CåP—ßÔ²î_°„á),,(Ä꿜:uõè<À –5ŠÄmráH0Z9µ§>#=aP£8·7s$* 5Œ±N-*åXCÆ•‹Ÿ›MÛƒgW‹Œµ|Œ¥¬¥ð2âe¥ÚT É1ÑÔ±ï€*mÌ96¡ö]º“_HÙ9<§w|k[;;g! ?ÑdÊ©cW¡¬ÆÎ^ˆ À¸¸vú9uêZe=Œ„Ô{´îIJj`M{—”+þòØ#t8jMè½J§ÎÝè³Ó'Ñ# ¶‘’x¬[I.’§º®&£ýkWÛ‚—SÏa£éò±v\8=Ê|(4„œ÷Í¡)çÉwá2rõô–'ƹsãsÚ4ƒÞžHƒ¼ü„°‚)+=]ضup €°µÂö– éôÅ…3TXP :·”´?î‘mãÆªÿ¥ÇK4W×¼Éé'ÅÎÁ‘¼‚B(Э§^6“bcg¯1®>vÓ–ç#\irh$ee¤SòÞ´2>IuÌ—,ξÈPaÈÉÍÇŸÆËÚ{OøbºrüCrŸ0…¼æ.’§v|×ÖzØÚ7¦´û÷àH¨mÄo^C¡1 Âö•‰Âoìš0 Ùu€Š‹‹iít?¡‹ÛA!ïÇQ›×UqÝYcÁ%òÁ‘ÈÅ“ ãlš@›wÑk]{¨Òó_ºŠVøyÛ›wªÂN½M-Û´¥!dóàØ¼k$3Èþ¹&¥Žï;jŒª!Ó'orú•…®é*V³:u˜£\£1®>vÓ–g÷Sæ˜~ý!•†ùO+÷¨¦ýWØNÚ½CpröîÅÒpõO¡Þ£G"O=ŒŸ_ªGÖƒ rx¾9 ¦„™™™Á⩇YZYÑý»?•h òó(›56–Võ©¨°Ì-ÍÈú“)tý\2E/Iuz A©_]§îîÃe¯cnNOrs„¡(]ó&§Ÿ~wŸ°e]©ýºØŒ7¬wYcîç)8àŠÚM[ž{EsÝ{“}“¦ÔÙµôûDÁѱԡW?!Ž&{·uî$ü>}œ«1ž\˜TTÖ›âeG@-cÜœ` Ÿ8†\º«Âü…ÑꩾªmŽ÷¼%àM9Y™ª;̳q{éÆÅsä³`™ÆxraœåûÒªÉ^”“Iñ›V iî^Bm;¼ÉJ>íY¹˜¦ElŽõyã%Á©tu*›‡¡þÓ)&b©Ê‘¨ß©ß šäâDñ·Õ9oRýFÌ,Õ£àC[í»ô ÿe«ô²™2~=æ,]ÇxWÈnR½ÊʳC³æÔôÅV4p¬¯Ð’25bÅF†Òº…Þ×S›½5Å“ “êqóJ MZ¡ßM ª(FÁrÏ™óÂ<Þ ‚%L”sÌá'nßH;.%8°šBˆ‡ûC<µFŸoás#5ɉ(ÁÐ|X©¦G€‘ð÷½ßèΗŸÃ FñøÑ# Ì‘`øÙ4²„@M£¨°°àÿ$ˆÂ K•§IEND®B`‚refdb-1.0.2/doc/include/fotitlepage.templates.xml000644 001750 001750 00000076274 11512721660 022675 0ustar00markusmarkus000000 000000 ]> <subtitle/> <corpauthor space-before="0.5em" font-size="&hsize2;"/> <authorgroup space-before="0.5em" font-size="&hsize2;"/> <author space-before="0.5em" font-size="&hsize2;"/> <othercredit space-before="0.5em"/> <releaseinfo space-before="0.5em"/> <copyright space-before="0.5em"/> <legalnotice text-align="start" margin-left="0.5in" margin-right="0.5in" font-family="{$body.fontset}"/> <pubdate space-before="0.5em"/> <revision space-before="0.5em"/> <revhistory space-before="0.5em"/> <abstract space-before="0.5em" text-align="start" margin-left="0.5in" margin-right="0.5in" font-family="{$body.fontset}"/> </t:titlepage-content> <t:titlepage-content t:side="verso"> </t:titlepage-content> <t:titlepage-separator> </t:titlepage-separator> <t:titlepage-before t:side="recto"> </t:titlepage-before> <t:titlepage-before t:side="verso"> </t:titlepage-before> </t:titlepage> <!-- ==================================================================== --> <t:titlepage t:element="set" t:wrapper="fo:block"> <t:titlepage-content t:side="recto"> <title t:named-template="division.title" param:node="ancestor-or-self::set[1]" text-align="center" font-size="&hsize5;" space-before="&hsize5space;" font-weight="bold" font-family="{$title.fontset}"/> <subtitle font-family="{$title.fontset}" text-align="center"/> <corpauthor/> <authorgroup/> <author/> <othercredit/> <releaseinfo/> <copyright/> <legalnotice/> <pubdate/> <revision/> <revhistory/> <abstract/> </t:titlepage-content> <t:titlepage-content t:side="verso"> </t:titlepage-content> <t:titlepage-separator> </t:titlepage-separator> <t:titlepage-before t:side="recto"> </t:titlepage-before> <t:titlepage-before t:side="verso"> </t:titlepage-before> </t:titlepage> <!-- ==================================================================== --> <t:titlepage t:element="book" t:wrapper="fo:block"> <t:titlepage-content t:side="recto"> <title t:named-template="division.title" param:node="ancestor-or-self::book[1]" text-align="center" font-size="&hsize5;" space-before="&hsize5space;" font-weight="bold" font-family="{$title.fontset}" color="#00B000"/> <subtitle text-align="center" font-size="&hsize4;" space-before="&hsize4space;" font-family="{$title.fontset}" color="#009900"/> <corpauthor font-size="&hsize3;" keep-with-next.within-column="always" space-before="2in"/> <authorgroup space-before="2in"/> <author font-size="&hsize3;" space-before="&hsize2space;" keep-with-next.within-column="always"/> </t:titlepage-content> <t:titlepage-content t:side="verso"> <title t:named-template="book.verso.title" font-size="&hsize2;" font-weight="bold" font-family="{$title.fontset}"/> <corpauthor/> <authorgroup t:named-template="verso.authorgroup"/> <author/> <othercredit/> <pubdate space-before="1em"/> <copyright/> <abstract/> <legalnotice font-size="8pt"/> </t:titlepage-content> <t:titlepage-separator> <fo:block break-after="page"/> </t:titlepage-separator> <t:titlepage-before t:side="recto"> </t:titlepage-before> <t:titlepage-before t:side="verso"> <fo:block break-after="page"/> </t:titlepage-before> </t:titlepage> <!-- ==================================================================== --> <t:titlepage t:element="part" t:wrapper="fo:block"> <t:titlepage-content t:side="recto"> <title t:named-template="division.title" param:node="ancestor-or-self::part[1]" text-align="center" font-size="&hsize5;" space-before="&hsize5space;" font-weight="bold" font-family="{$title.fontset}" color="#00B000"/> <subtitle text-align="center" font-size="&hsize4;" space-before="&hsize4space;" font-weight='bold' font-style='italic' font-family="{$title.fontset}"/> </t:titlepage-content> <t:titlepage-content t:side="verso"> </t:titlepage-content> <t:titlepage-separator> </t:titlepage-separator> <t:titlepage-before t:side="recto"> </t:titlepage-before> <t:titlepage-before t:side="verso"> </t:titlepage-before> </t:titlepage> <t:titlepage t:element="partintro" t:wrapper="fo:block"> <t:titlepage-content t:side="recto"> <title text-align="center" font-size="&hsize5;" font-weight="bold" space-before="1em" font-family="{$title.fontset}"/> <subtitle text-align="center" font-size="&hsize2;" font-weight="bold" font-style="italic" font-family="{$title.fontset}"/> <corpauthor/> <authorgroup/> <author/> <othercredit/> <releaseinfo/> <copyright/> <legalnotice/> <pubdate/> <revision/> <revhistory/> <abstract/> </t:titlepage-content> <t:titlepage-content t:side="verso"> </t:titlepage-content> <t:titlepage-separator> </t:titlepage-separator> <t:titlepage-before t:side="recto"> </t:titlepage-before> <t:titlepage-before t:side="verso"> </t:titlepage-before> </t:titlepage> <!-- ==================================================================== --> <t:titlepage t:element="reference" t:wrapper="fo:block"> <t:titlepage-content t:side="recto"> <title t:named-template="division.title" param:node="ancestor-or-self::reference[1]" text-align="center" font-size="&hsize5;" space-before="&hsize5space;" font-weight="bold" font-family="{$title.fontset}"/> <subtitle font-family="{$title.fontset}" text-align="center"/> <corpauthor/> <authorgroup/> <author/> <othercredit/> <releaseinfo/> <copyright/> <legalnotice/> <pubdate/> <revision/> <revhistory/> <abstract/> </t:titlepage-content> <t:titlepage-content t:side="verso"> </t:titlepage-content> <t:titlepage-separator> </t:titlepage-separator> <t:titlepage-before t:side="recto"> </t:titlepage-before> <t:titlepage-before t:side="verso"> </t:titlepage-before> </t:titlepage> <!-- ==================================================================== --> <t:titlepage t:element="refsynopsisdiv" t:wrapper="fo:block"> <t:titlepage-content t:side="recto"> <title font-family="{$title.fontset}"/> </t:titlepage-content> <t:titlepage-content t:side="verso"> </t:titlepage-content> <t:titlepage-separator> </t:titlepage-separator> <t:titlepage-before t:side="recto"> </t:titlepage-before> <t:titlepage-before t:side="verso"> </t:titlepage-before> </t:titlepage> <!-- ==================================================================== --> <t:titlepage t:element="refsection" t:wrapper="fo:block"> <t:titlepage-content t:side="recto"> <title font-family="{$title.fontset}"/> </t:titlepage-content> <t:titlepage-content t:side="verso"> </t:titlepage-content> <t:titlepage-separator> </t:titlepage-separator> <t:titlepage-before t:side="recto"> </t:titlepage-before> <t:titlepage-before t:side="verso"> </t:titlepage-before> </t:titlepage> <!-- ==================================================================== --> <t:titlepage t:element="refsect1" t:wrapper="fo:block"> <t:titlepage-content t:side="recto"> <title font-family="{$title.fontset}"/> </t:titlepage-content> <t:titlepage-content t:side="verso"> </t:titlepage-content> <t:titlepage-separator> </t:titlepage-separator> <t:titlepage-before t:side="recto"> </t:titlepage-before> <t:titlepage-before t:side="verso"> </t:titlepage-before> </t:titlepage> <!-- ==================================================================== --> <t:titlepage t:element="refsect2" t:wrapper="fo:block"> <t:titlepage-content t:side="recto"> <title font-family="{$title.fontset}"/> </t:titlepage-content> <t:titlepage-content t:side="verso"> </t:titlepage-content> <t:titlepage-separator> </t:titlepage-separator> <t:titlepage-before t:side="recto"> </t:titlepage-before> <t:titlepage-before t:side="verso"> </t:titlepage-before> </t:titlepage> <!-- ==================================================================== --> <t:titlepage t:element="refsect3" t:wrapper="fo:block"> <t:titlepage-content t:side="recto"> <title font-family="{$title.fontset}"/> </t:titlepage-content> <t:titlepage-content t:side="verso"> </t:titlepage-content> <t:titlepage-separator> </t:titlepage-separator> <t:titlepage-before t:side="recto"> </t:titlepage-before> <t:titlepage-before t:side="verso"> </t:titlepage-before> </t:titlepage> <!-- ==================================================================== --> <t:titlepage t:element="dedication" t:wrapper="fo:block"> <t:titlepage-content t:side="recto"> <title t:force="1" t:named-template="component.title" param:node="ancestor-or-self::dedication[1]" margin-left="{$title.margin.left}" font-size="&hsize5;" font-family="{$title.fontset}" font-weight="bold"/> <subtitle font-family="{$title.fontset}"/> </t:titlepage-content> <t:titlepage-content t:side="verso"> </t:titlepage-content> <t:titlepage-separator> </t:titlepage-separator> <t:titlepage-before t:side="recto"> </t:titlepage-before> <t:titlepage-before t:side="verso"> </t:titlepage-before> </t:titlepage> <!-- ==================================================================== --> <t:titlepage t:element="preface" t:wrapper="fo:block"> <t:titlepage-content t:side="recto"> <title t:force="1" t:named-template="component.title" param:node="ancestor-or-self::preface[1]" margin-left="{$title.margin.left}" font-size="&hsize5;" font-family="{$title.fontset}" font-weight="bold"/> <subtitle font-family="{$title.fontset}"/> <corpauthor/> <authorgroup/> <author/> <othercredit/> <releaseinfo/> <copyright/> <legalnotice/> <pubdate/> <revision/> <revhistory/> <abstract/> </t:titlepage-content> <t:titlepage-content t:side="verso"> </t:titlepage-content> <t:titlepage-separator> </t:titlepage-separator> <t:titlepage-before t:side="recto"> </t:titlepage-before> <t:titlepage-before t:side="verso"> </t:titlepage-before> </t:titlepage> <!-- ==================================================================== --> <t:titlepage t:element="chapter" t:wrapper="fo:block" font-family="{$title.fontset}"> <t:titlepage-content t:side="recto" margin-left="{$title.margin.left}"> <title t:named-template="component.title" param:node="ancestor-or-self::chapter[1]" font-size="&hsize5;" font-weight="bold" color="#00B000"/> <subtitle space-before="0.5em" font-style="italic" font-size="&hsize2;" font-weight="bold"/> <corpauthor space-before="0.5em" space-after="0.5em" font-size="&hsize2;"/> <authorgroup space-before="0.5em" space-after="0.5em" font-size="&hsize2;"/> <author space-before="0.5em" space-after="0.5em" font-size="&hsize2;"/> <othercredit/> <releaseinfo/> <copyright/> <legalnotice/> <pubdate/> <revision/> <revhistory/> <abstract/> </t:titlepage-content> <t:titlepage-content t:side="verso"> </t:titlepage-content> <t:titlepage-separator> </t:titlepage-separator> <t:titlepage-before t:side="recto"> </t:titlepage-before> <t:titlepage-before t:side="verso"> </t:titlepage-before> </t:titlepage> <!-- ==================================================================== --> <t:titlepage t:element="appendix" t:wrapper="fo:block"> <t:titlepage-content t:side="recto"> <title t:named-template="component.title" param:node="ancestor-or-self::appendix[1]" margin-left="{$title.margin.left}" font-size="&hsize5;" font-weight="bold" font-family="{$title.fontset}"/> <subtitle font-family="{$title.fontset}"/> <corpauthor/> <authorgroup/> <author/> <othercredit/> <releaseinfo/> <copyright/> <legalnotice/> <pubdate/> <revision/> <revhistory/> <abstract/> </t:titlepage-content> <t:titlepage-content t:side="verso"> </t:titlepage-content> <t:titlepage-separator> </t:titlepage-separator> <t:titlepage-before t:side="recto"> </t:titlepage-before> <t:titlepage-before t:side="verso"> </t:titlepage-before> </t:titlepage> <!-- ==================================================================== --> <t:titlepage t:element="section" t:wrapper="fo:block"> <t:titlepage-content t:side="recto"> <title margin-left="{$title.margin.left}" font-family="{$title.fontset}"/> <subtitle font-family="{$title.fontset}"/> <corpauthor/> <authorgroup/> <author/> <othercredit/> <releaseinfo/> <copyright/> <legalnotice/> <pubdate/> <revision/> <revhistory/> <abstract/> </t:titlepage-content> <t:titlepage-content t:side="verso"> </t:titlepage-content> <t:titlepage-separator> </t:titlepage-separator> <t:titlepage-before t:side="recto"> </t:titlepage-before> <t:titlepage-before t:side="verso"> </t:titlepage-before> </t:titlepage> <t:titlepage t:element="sect1" t:wrapper="fo:block"> <t:titlepage-content t:side="recto"> <title margin-left="{$title.margin.left}" font-family="{$title.fontset}"/> <subtitle font-family="{$title.fontset}"/> <corpauthor/> <authorgroup/> <author/> <othercredit/> <releaseinfo/> <copyright/> <legalnotice/> <pubdate/> <revision/> <revhistory/> <abstract/> </t:titlepage-content> <t:titlepage-content t:side="verso"> </t:titlepage-content> <t:titlepage-separator> </t:titlepage-separator> <t:titlepage-before t:side="recto"> </t:titlepage-before> <t:titlepage-before t:side="verso"> </t:titlepage-before> </t:titlepage> <t:titlepage t:element="sect2" t:wrapper="fo:block"> <t:titlepage-content t:side="recto"> <title margin-left="{$title.margin.left}" font-family="{$title.fontset}"/> <subtitle font-family="{$title.fontset}"/> <corpauthor/> <authorgroup/> <author/> <othercredit/> <releaseinfo/> <copyright/> <legalnotice/> <pubdate/> <revision/> <revhistory/> <abstract/> </t:titlepage-content> <t:titlepage-content t:side="verso"> </t:titlepage-content> <t:titlepage-separator> </t:titlepage-separator> <t:titlepage-before t:side="recto"> </t:titlepage-before> <t:titlepage-before t:side="verso"> </t:titlepage-before> </t:titlepage> <t:titlepage t:element="sect3" t:wrapper="fo:block"> <t:titlepage-content t:side="recto"> <title margin-left="{$title.margin.left}" font-family="{$title.fontset}"/> <subtitle font-family="{$title.fontset}"/> <corpauthor/> <authorgroup/> <author/> <othercredit/> <releaseinfo/> <copyright/> <legalnotice/> <pubdate/> <revision/> <revhistory/> <abstract/> </t:titlepage-content> <t:titlepage-content t:side="verso"> </t:titlepage-content> <t:titlepage-separator> </t:titlepage-separator> <t:titlepage-before t:side="recto"> </t:titlepage-before> <t:titlepage-before t:side="verso"> </t:titlepage-before> </t:titlepage> <t:titlepage t:element="sect4" t:wrapper="fo:block"> <t:titlepage-content t:side="recto"> <title margin-left="{$title.margin.left}" font-family="{$title.fontset}"/> <subtitle font-family="{$title.fontset}"/> <corpauthor/> <authorgroup/> <author/> <othercredit/> <releaseinfo/> <copyright/> <legalnotice/> <pubdate/> <revision/> <revhistory/> <abstract/> </t:titlepage-content> <t:titlepage-content t:side="verso"> </t:titlepage-content> <t:titlepage-separator> </t:titlepage-separator> <t:titlepage-before t:side="recto"> </t:titlepage-before> <t:titlepage-before t:side="verso"> </t:titlepage-before> </t:titlepage> <t:titlepage t:element="sect5" t:wrapper="fo:block"> <t:titlepage-content t:side="recto"> <title margin-left="{$title.margin.left}" font-family="{$title.fontset}"/> <subtitle font-family="{$title.fontset}"/> <corpauthor/> <authorgroup/> <author/> <othercredit/> <releaseinfo/> <copyright/> <legalnotice/> <pubdate/> <revision/> <revhistory/> <abstract/> </t:titlepage-content> <t:titlepage-content t:side="verso"> </t:titlepage-content> <t:titlepage-separator> </t:titlepage-separator> <t:titlepage-before t:side="recto"> </t:titlepage-before> <t:titlepage-before t:side="verso"> </t:titlepage-before> </t:titlepage> <t:titlepage t:element="simplesect" t:wrapper="fo:block"> <t:titlepage-content t:side="recto"> <title margin-left="{$title.margin.left}" font-family="{$title.fontset}"/> <subtitle font-family="{$title.fontset}"/> <corpauthor/> <authorgroup/> <author/> <othercredit/> <releaseinfo/> <copyright/> <legalnotice/> <pubdate/> <revision/> <revhistory/> <abstract/> </t:titlepage-content> <t:titlepage-content t:side="verso"> </t:titlepage-content> <t:titlepage-separator> </t:titlepage-separator> <t:titlepage-before t:side="recto"> </t:titlepage-before> <t:titlepage-before t:side="verso"> </t:titlepage-before> </t:titlepage> <!-- ==================================================================== --> <t:titlepage t:element="bibliography" t:wrapper="fo:block"> <t:titlepage-content t:side="recto"> <title t:force="1" t:named-template="component.title" param:node="ancestor-or-self::bibliography[1]" margin-left="{$title.margin.left}" font-size="&hsize5;" font-family="{$title.fontset}" font-weight="bold"/> <subtitle font-family="{$title.fontset}"/> </t:titlepage-content> <t:titlepage-content t:side="verso"> </t:titlepage-content> <t:titlepage-separator> </t:titlepage-separator> <t:titlepage-before t:side="recto"> </t:titlepage-before> <t:titlepage-before t:side="verso"> </t:titlepage-before> </t:titlepage> <!-- ==================================================================== --> <t:titlepage t:element="bibliodiv" t:wrapper="fo:block"> <t:titlepage-content t:side="recto"> <title t:named-template="component.title" param:node="ancestor-or-self::bibliodiv[1]" margin-left="{$title.margin.left}" font-size="&hsize4;" font-family="{$title.fontset}" font-weight="bold"/> <subtitle font-family="{$title.fontset}"/> </t:titlepage-content> <t:titlepage-content t:side="verso"> </t:titlepage-content> <t:titlepage-separator> </t:titlepage-separator> <t:titlepage-before t:side="recto"> </t:titlepage-before> <t:titlepage-before t:side="verso"> </t:titlepage-before> </t:titlepage> <!-- ==================================================================== --> <t:titlepage t:element="glossary" t:wrapper="fo:block"> <t:titlepage-content t:side="recto"> <title t:force="1" t:named-template="component.title" param:node="ancestor-or-self::glossary[1]" margin-left="{$title.margin.left}" font-size="&hsize5;" font-family="{$title.fontset}" font-weight="bold"/> <subtitle font-family="{$title.fontset}"/> </t:titlepage-content> <t:titlepage-content t:side="verso"> </t:titlepage-content> <t:titlepage-separator> </t:titlepage-separator> <t:titlepage-before t:side="recto"> </t:titlepage-before> <t:titlepage-before t:side="verso"> </t:titlepage-before> </t:titlepage> <!-- ==================================================================== --> <t:titlepage t:element="glossdiv" t:wrapper="fo:block"> <t:titlepage-content t:side="recto"> <title t:named-template="component.title" param:node="ancestor-or-self::glossdiv[1]" margin-left="{$title.margin.left}" font-size="&hsize4;" font-family="{$title.fontset}" font-weight="bold"/> <subtitle font-family="{$title.fontset}"/> </t:titlepage-content> <t:titlepage-content t:side="verso"> </t:titlepage-content> <t:titlepage-separator> </t:titlepage-separator> <t:titlepage-before t:side="recto"> </t:titlepage-before> <t:titlepage-before t:side="verso"> </t:titlepage-before> </t:titlepage> <!-- ==================================================================== --> <t:titlepage t:element="index" t:wrapper="fo:block"> <t:titlepage-content t:side="recto"> <title t:force="1" t:named-template="component.title" param:node="ancestor-or-self::index[1]" param:pagewide="1" margin-left="0pt" font-size="&hsize5;" font-family="{$title.fontset}" font-weight="bold"/> <subtitle font-family="{$title.fontset}"/> </t:titlepage-content> <t:titlepage-content t:side="verso"> </t:titlepage-content> <t:titlepage-separator> </t:titlepage-separator> <t:titlepage-before t:side="recto"> </t:titlepage-before> <t:titlepage-before t:side="verso"> </t:titlepage-before> </t:titlepage> <!-- ==================================================================== --> <!-- The indexdiv.title template is used so that manual and --> <!-- automatically generated indexdiv titles get the same --> <!-- formatting. --> <t:titlepage t:element="indexdiv" t:wrapper="fo:block"> <t:titlepage-content t:side="recto"> <title t:force="1" t:named-template="indexdiv.title" param:title="title"/> <subtitle font-family="{$title.fontset}"/> </t:titlepage-content> <t:titlepage-content t:side="verso"> </t:titlepage-content> <t:titlepage-separator> </t:titlepage-separator> <t:titlepage-before t:side="recto"> </t:titlepage-before> <t:titlepage-before t:side="verso"> </t:titlepage-before> </t:titlepage> <!-- ==================================================================== --> <t:titlepage t:element="setindex" t:wrapper="fo:block"> <t:titlepage-content t:side="recto"> <title t:force="1" t:named-template="component.title" param:node="ancestor-or-self::setindex[1]" param:pagewide="1" margin-left="0pt" font-size="&hsize5;" font-family="{$title.fontset}" font-weight="bold"/> <subtitle font-family="{$title.fontset}"/> </t:titlepage-content> <t:titlepage-content t:side="verso"> </t:titlepage-content> <t:titlepage-separator> </t:titlepage-separator> <t:titlepage-before t:side="recto"> </t:titlepage-before> <t:titlepage-before t:side="verso"> </t:titlepage-before> </t:titlepage> <!-- ==================================================================== --> <t:titlepage t:element="colophon" t:wrapper="fo:block"> <t:titlepage-content t:side="recto"> <title t:force="1" t:named-template="component.title" param:node="ancestor-or-self::colophon[1]" margin-left="{$title.margin.left}" font-size="&hsize5;" font-family="{$title.fontset}" font-weight="bold"/> <subtitle font-family="{$title.fontset}"/> </t:titlepage-content> <t:titlepage-content t:side="verso"> </t:titlepage-content> <t:titlepage-separator> </t:titlepage-separator> <t:titlepage-before t:side="recto"> </t:titlepage-before> <t:titlepage-before t:side="verso"> </t:titlepage-before> </t:titlepage> <!-- ==================================================================== --> <t:titlepage t:element="table.of.contents" t:wrapper="fo:block"> <t:titlepage-content t:side="recto"> <title t:force="1" t:named-template="gentext" param:key="'TableofContents'" space-before.minimum="1em" space-before.optimum="1.5em" space-before.maximum="2em" space-after="0.5em" margin-left="{$title.margin.left}" start-indent="0pt" font-size="&hsize3;" font-weight="bold" font-family="{$title.fontset}"/> </t:titlepage-content> <t:titlepage-content t:side="verso"> </t:titlepage-content> <t:titlepage-separator> </t:titlepage-separator> <t:titlepage-before t:side="recto"> </t:titlepage-before> <t:titlepage-before t:side="verso"> </t:titlepage-before> </t:titlepage> <t:titlepage t:element="list.of.tables" t:wrapper="fo:block"> <t:titlepage-content t:side="recto"> <title t:force="1" t:named-template="gentext" param:key="'ListofTables'" space-before.minimum="1em" space-before.optimum="1.5em" space-before.maximum="2em" space-after="0.5em" margin-left="{$title.margin.left}" start-indent="0pt" font-size="&hsize3;" font-weight="bold" font-family="{$title.fontset}"/> </t:titlepage-content> <t:titlepage-content t:side="verso"> </t:titlepage-content> <t:titlepage-separator> </t:titlepage-separator> <t:titlepage-before t:side="recto"> </t:titlepage-before> <t:titlepage-before t:side="verso"> </t:titlepage-before> </t:titlepage> <t:titlepage t:element="list.of.figures" t:wrapper="fo:block"> <t:titlepage-content t:side="recto"> <title t:force="1" t:named-template="gentext" param:key="'ListofFigures'" space-before.minimum="1em" space-before.optimum="1.5em" space-before.maximum="2em" space-after="0.5em" margin-left="{$title.margin.left}" start-indent="0pt" font-size="&hsize3;" font-weight="bold" font-family="{$title.fontset}"/> </t:titlepage-content> <t:titlepage-content t:side="verso"> </t:titlepage-content> <t:titlepage-separator> </t:titlepage-separator> <t:titlepage-before t:side="recto"> </t:titlepage-before> <t:titlepage-before t:side="verso"> </t:titlepage-before> </t:titlepage> <t:titlepage t:element="list.of.examples" t:wrapper="fo:block"> <t:titlepage-content t:side="recto"> <title t:force="1" t:named-template="gentext" param:key="'ListofExamples'" space-before.minimum="1em" space-before.optimum="1.5em" space-before.maximum="2em" space-after="0.5em" margin-left="{$title.margin.left}" start-indent="0pt" font-size="&hsize3;" font-weight="bold" font-family="{$title.fontset}"/> </t:titlepage-content> <t:titlepage-content t:side="verso"> </t:titlepage-content> <t:titlepage-separator> </t:titlepage-separator> <t:titlepage-before t:side="recto"> </t:titlepage-before> <t:titlepage-before t:side="verso"> </t:titlepage-before> </t:titlepage> <t:titlepage t:element="list.of.equations" t:wrapper="fo:block"> <t:titlepage-content t:side="recto"> <title t:force="1" t:named-template="gentext" param:key="'ListofEquations'" space-before.minimum="1em" space-before.optimum="1.5em" space-before.maximum="2em" space-after="0.5em" margin-left="{$title.margin.left}" start-indent="0pt" font-size="&hsize3;" font-weight="bold" font-family="{$title.fontset}"/> </t:titlepage-content> <t:titlepage-content t:side="verso"> </t:titlepage-content> <t:titlepage-separator> </t:titlepage-separator> <t:titlepage-before t:side="recto"> </t:titlepage-before> <t:titlepage-before t:side="verso"> </t:titlepage-before> </t:titlepage> <t:titlepage t:element="list.of.procedures" t:wrapper="fo:block"> <t:titlepage-content t:side="recto"> <title t:force="1" t:named-template="gentext" param:key="'ListofProcedures'" space-before.minimum="1em" space-before.optimum="1.5em" space-before.maximum="2em" space-after="0.5em" margin-left="{$title.margin.left}" start-indent="0pt" font-size="&hsize3;" font-weight="bold" font-family="{$title.fontset}"/> </t:titlepage-content> <t:titlepage-content t:side="verso"> </t:titlepage-content> <t:titlepage-separator> </t:titlepage-separator> <t:titlepage-before t:side="recto"> </t:titlepage-before> <t:titlepage-before t:side="verso"> </t:titlepage-before> </t:titlepage> <t:titlepage t:element="list.of.unknowns" t:wrapper="fo:block"> <t:titlepage-content t:side="recto"> <title t:force="1" t:named-template="gentext" param:key="'ListofUnknown'" space-before.minimum="1em" space-before.optimum="1.5em" space-before.maximum="2em" space-after="0.5em" margin-left="{$title.margin.left}" start-indent="0pt" font-size="&hsize3;" font-weight="bold" font-family="{$title.fontset}"/> </t:titlepage-content> <t:titlepage-content t:side="verso"> </t:titlepage-content> <t:titlepage-separator> </t:titlepage-separator> <t:titlepage-before t:side="recto"> </t:titlepage-before> <t:titlepage-before t:side="verso"> </t:titlepage-before> </t:titlepage> <!-- ==================================================================== --> </t:templates> ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refdb-1.0.2/doc/include/fotitlepages.xsl������������������������������������������������������������000644 �001750 �001750 �00000713272 12247746234 021077� 0����������������������������������������������������������������������������������������������������ustar�00markus��������������������������markus��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" version="1.0" exclude-result-prefixes="exsl"> <!-- This stylesheet was created by template/titlepage.xsl--> <xsl:template name="article.titlepage.recto"> <xsl:choose> <xsl:when test="articleinfo/title"> <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/title"/> </xsl:when> <xsl:when test="artheader/title"> <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/title"/> </xsl:when> <xsl:when test="info/title"> <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/title"/> </xsl:when> <xsl:when test="title"> <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="title"/> </xsl:when> </xsl:choose> <xsl:choose> <xsl:when test="articleinfo/subtitle"> <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/subtitle"/> </xsl:when> <xsl:when test="artheader/subtitle"> <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/subtitle"/> </xsl:when> <xsl:when test="info/subtitle"> <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/subtitle"/> </xsl:when> <xsl:when test="subtitle"> <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="subtitle"/> </xsl:when> </xsl:choose> <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/corpauthor"/> <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/corpauthor"/> <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/corpauthor"/> <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/authorgroup"/> <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/authorgroup"/> <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/authorgroup"/> <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/author"/> <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/author"/> <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/author"/> <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/othercredit"/> <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/othercredit"/> <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/othercredit"/> <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/releaseinfo"/> <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/releaseinfo"/> <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/releaseinfo"/> <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/copyright"/> <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/copyright"/> <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/copyright"/> <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/legalnotice"/> <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/legalnotice"/> <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/legalnotice"/> <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/pubdate"/> <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/pubdate"/> <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/pubdate"/> <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/revision"/> <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/revision"/> <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/revision"/> <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/revhistory"/> <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/revhistory"/> <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/revhistory"/> <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/abstract"/> <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/abstract"/> <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/abstract"/> </xsl:template> <xsl:template name="article.titlepage.verso"> </xsl:template> <xsl:template name="article.titlepage.separator"> </xsl:template> <xsl:template name="article.titlepage.before.recto"> </xsl:template> <xsl:template name="article.titlepage.before.verso"> </xsl:template> <xsl:template name="article.titlepage"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" font-family="{$title.fontset}"> <xsl:variable name="recto.content"> <xsl:call-template name="article.titlepage.before.recto"/> <xsl:call-template name="article.titlepage.recto"/> </xsl:variable> <xsl:variable name="recto.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count > 0)"> <fo:block start-indent="0pt" text-align="center"><xsl:copy-of select="$recto.content"/></fo:block> </xsl:if> <xsl:variable name="verso.content"> <xsl:call-template name="article.titlepage.before.verso"/> <xsl:call-template name="article.titlepage.verso"/> </xsl:variable> <xsl:variable name="verso.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count > 0)"> <fo:block><xsl:copy-of select="$verso.content"/></fo:block> </xsl:if> <xsl:call-template name="article.titlepage.separator"/> </fo:block> </xsl:template> <xsl:template match="*" mode="article.titlepage.recto.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="*" mode="article.titlepage.verso.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="title" mode="article.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="article.titlepage.recto.style" keep-with-next.within-column="always" font-size="24.8832pt" font-weight="bold"> <xsl:call-template name="component.title"> <xsl:with-param name="node" select="ancestor-or-self::article[1]"/> </xsl:call-template> </fo:block> </xsl:template> <xsl:template match="subtitle" mode="article.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="article.titlepage.recto.style"> <xsl:apply-templates select="." mode="article.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="corpauthor" mode="article.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="article.titlepage.recto.style" space-before="0.5em" font-size="14.4pt"> <xsl:apply-templates select="." mode="article.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="authorgroup" mode="article.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="article.titlepage.recto.style" space-before="0.5em" font-size="14.4pt"> <xsl:apply-templates select="." mode="article.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="author" mode="article.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="article.titlepage.recto.style" space-before="0.5em" font-size="14.4pt"> <xsl:apply-templates select="." mode="article.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="othercredit" mode="article.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="article.titlepage.recto.style" space-before="0.5em"> <xsl:apply-templates select="." mode="article.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="releaseinfo" mode="article.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="article.titlepage.recto.style" space-before="0.5em"> <xsl:apply-templates select="." mode="article.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="copyright" mode="article.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="article.titlepage.recto.style" space-before="0.5em"> <xsl:apply-templates select="." mode="article.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="legalnotice" mode="article.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="article.titlepage.recto.style" text-align="start" margin-left="0.5in" margin-right="0.5in" font-family="{$body.fontset}"> <xsl:apply-templates select="." mode="article.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="pubdate" mode="article.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="article.titlepage.recto.style" space-before="0.5em"> <xsl:apply-templates select="." mode="article.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="revision" mode="article.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="article.titlepage.recto.style" space-before="0.5em"> <xsl:apply-templates select="." mode="article.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="revhistory" mode="article.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="article.titlepage.recto.style" space-before="0.5em"> <xsl:apply-templates select="." mode="article.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="abstract" mode="article.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="article.titlepage.recto.style" space-before="0.5em" text-align="start" margin-left="0.5in" margin-right="0.5in" font-family="{$body.fontset}"> <xsl:apply-templates select="." mode="article.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template name="set.titlepage.recto"> <xsl:choose> <xsl:when test="setinfo/title"> <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/title"/> </xsl:when> <xsl:when test="info/title"> <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/title"/> </xsl:when> <xsl:when test="title"> <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="title"/> </xsl:when> </xsl:choose> <xsl:choose> <xsl:when test="setinfo/subtitle"> <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/subtitle"/> </xsl:when> <xsl:when test="info/subtitle"> <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/subtitle"/> </xsl:when> <xsl:when test="subtitle"> <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="subtitle"/> </xsl:when> </xsl:choose> <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/corpauthor"/> <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/corpauthor"/> <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/authorgroup"/> <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/authorgroup"/> <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/author"/> <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/author"/> <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/othercredit"/> <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/othercredit"/> <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/releaseinfo"/> <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/releaseinfo"/> <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/copyright"/> <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/copyright"/> <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/legalnotice"/> <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/legalnotice"/> <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/pubdate"/> <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/pubdate"/> <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/revision"/> <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/revision"/> <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/revhistory"/> <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/revhistory"/> <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/abstract"/> <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/abstract"/> </xsl:template> <xsl:template name="set.titlepage.verso"> </xsl:template> <xsl:template name="set.titlepage.separator"> </xsl:template> <xsl:template name="set.titlepage.before.recto"> </xsl:template> <xsl:template name="set.titlepage.before.verso"> </xsl:template> <xsl:template name="set.titlepage"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format"> <xsl:variable name="recto.content"> <xsl:call-template name="set.titlepage.before.recto"/> <xsl:call-template name="set.titlepage.recto"/> </xsl:variable> <xsl:variable name="recto.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count > 0)"> <fo:block><xsl:copy-of select="$recto.content"/></fo:block> </xsl:if> <xsl:variable name="verso.content"> <xsl:call-template name="set.titlepage.before.verso"/> <xsl:call-template name="set.titlepage.verso"/> </xsl:variable> <xsl:variable name="verso.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count > 0)"> <fo:block><xsl:copy-of select="$verso.content"/></fo:block> </xsl:if> <xsl:call-template name="set.titlepage.separator"/> </fo:block> </xsl:template> <xsl:template match="*" mode="set.titlepage.recto.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="*" mode="set.titlepage.verso.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="title" mode="set.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="set.titlepage.recto.style" text-align="center" font-size="24.8832pt" space-before="18.6624pt" font-weight="bold" font-family="{$title.fontset}"> <xsl:call-template name="division.title"> <xsl:with-param name="node" select="ancestor-or-self::set[1]"/> </xsl:call-template> </fo:block> </xsl:template> <xsl:template match="subtitle" mode="set.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="set.titlepage.recto.style" font-family="{$title.fontset}" text-align="center"> <xsl:apply-templates select="." mode="set.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="corpauthor" mode="set.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="set.titlepage.recto.style"> <xsl:apply-templates select="." mode="set.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="authorgroup" mode="set.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="set.titlepage.recto.style"> <xsl:apply-templates select="." mode="set.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="author" mode="set.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="set.titlepage.recto.style"> <xsl:apply-templates select="." mode="set.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="othercredit" mode="set.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="set.titlepage.recto.style"> <xsl:apply-templates select="." mode="set.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="releaseinfo" mode="set.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="set.titlepage.recto.style"> <xsl:apply-templates select="." mode="set.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="copyright" mode="set.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="set.titlepage.recto.style"> <xsl:apply-templates select="." mode="set.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="legalnotice" mode="set.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="set.titlepage.recto.style"> <xsl:apply-templates select="." mode="set.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="pubdate" mode="set.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="set.titlepage.recto.style"> <xsl:apply-templates select="." mode="set.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="revision" mode="set.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="set.titlepage.recto.style"> <xsl:apply-templates select="." mode="set.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="revhistory" mode="set.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="set.titlepage.recto.style"> <xsl:apply-templates select="." mode="set.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="abstract" mode="set.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="set.titlepage.recto.style"> <xsl:apply-templates select="." mode="set.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template name="book.titlepage.recto"> <xsl:choose> <xsl:when test="bookinfo/title"> <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/title"/> </xsl:when> <xsl:when test="info/title"> <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/title"/> </xsl:when> <xsl:when test="title"> <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="title"/> </xsl:when> </xsl:choose> <xsl:choose> <xsl:when test="bookinfo/subtitle"> <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/subtitle"/> </xsl:when> <xsl:when test="info/subtitle"> <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/subtitle"/> </xsl:when> <xsl:when test="subtitle"> <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="subtitle"/> </xsl:when> </xsl:choose> <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/corpauthor"/> <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/corpauthor"/> <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/authorgroup"/> <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/authorgroup"/> <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/author"/> <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/author"/> </xsl:template> <xsl:template name="book.titlepage.verso"> <xsl:choose> <xsl:when test="bookinfo/title"> <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/title"/> </xsl:when> <xsl:when test="info/title"> <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/title"/> </xsl:when> <xsl:when test="title"> <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="title"/> </xsl:when> </xsl:choose> <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/corpauthor"/> <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/corpauthor"/> <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/authorgroup"/> <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/authorgroup"/> <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/author"/> <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/author"/> <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/othercredit"/> <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/othercredit"/> <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/pubdate"/> <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/pubdate"/> <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/copyright"/> <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/copyright"/> <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/abstract"/> <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/abstract"/> <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/legalnotice"/> <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/legalnotice"/> </xsl:template> <xsl:template name="book.titlepage.separator"><fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" break-after="page"/> </xsl:template> <xsl:template name="book.titlepage.before.recto"> </xsl:template> <xsl:template name="book.titlepage.before.verso"><fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" break-after="page"/> </xsl:template> <xsl:template name="book.titlepage"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format"> <xsl:variable name="recto.content"> <xsl:call-template name="book.titlepage.before.recto"/> <xsl:call-template name="book.titlepage.recto"/> </xsl:variable> <xsl:variable name="recto.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count > 0)"> <fo:block><xsl:copy-of select="$recto.content"/></fo:block> </xsl:if> <xsl:variable name="verso.content"> <xsl:call-template name="book.titlepage.before.verso"/> <xsl:call-template name="book.titlepage.verso"/> </xsl:variable> <xsl:variable name="verso.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count > 0)"> <fo:block><xsl:copy-of select="$verso.content"/></fo:block> </xsl:if> <xsl:call-template name="book.titlepage.separator"/> </fo:block> </xsl:template> <xsl:template match="*" mode="book.titlepage.recto.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="*" mode="book.titlepage.verso.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="title" mode="book.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.recto.style" text-align="center" font-size="24.8832pt" space-before="18.6624pt" font-weight="bold" font-family="{$title.fontset}" color="#00B000"> <xsl:call-template name="division.title"> <xsl:with-param name="node" select="ancestor-or-self::book[1]"/> </xsl:call-template> </fo:block> </xsl:template> <xsl:template match="subtitle" mode="book.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.recto.style" text-align="center" font-size="20.736pt" space-before="15.552pt" font-family="{$title.fontset}" color="#009900"> <xsl:apply-templates select="." mode="book.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="corpauthor" mode="book.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.recto.style" font-size="17.28pt" keep-with-next.within-column="always" space-before="2in"> <xsl:apply-templates select="." mode="book.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="authorgroup" mode="book.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.recto.style" space-before="2in"> <xsl:apply-templates select="." mode="book.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="author" mode="book.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.recto.style" font-size="17.28pt" space-before="10.8pt" keep-with-next.within-column="always"> <xsl:apply-templates select="." mode="book.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="title" mode="book.titlepage.verso.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style" font-size="14.4pt" font-weight="bold" font-family="{$title.fontset}"> <xsl:call-template name="book.verso.title"> </xsl:call-template> </fo:block> </xsl:template> <xsl:template match="corpauthor" mode="book.titlepage.verso.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style"> <xsl:apply-templates select="." mode="book.titlepage.verso.mode"/> </fo:block> </xsl:template> <xsl:template match="authorgroup" mode="book.titlepage.verso.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style"> <xsl:call-template name="verso.authorgroup"> </xsl:call-template> </fo:block> </xsl:template> <xsl:template match="author" mode="book.titlepage.verso.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style"> <xsl:apply-templates select="." mode="book.titlepage.verso.mode"/> </fo:block> </xsl:template> <xsl:template match="othercredit" mode="book.titlepage.verso.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style"> <xsl:apply-templates select="." mode="book.titlepage.verso.mode"/> </fo:block> </xsl:template> <xsl:template match="pubdate" mode="book.titlepage.verso.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style" space-before="1em"> <xsl:apply-templates select="." mode="book.titlepage.verso.mode"/> </fo:block> </xsl:template> <xsl:template match="copyright" mode="book.titlepage.verso.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style"> <xsl:apply-templates select="." mode="book.titlepage.verso.mode"/> </fo:block> </xsl:template> <xsl:template match="abstract" mode="book.titlepage.verso.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style"> <xsl:apply-templates select="." mode="book.titlepage.verso.mode"/> </fo:block> </xsl:template> <xsl:template match="legalnotice" mode="book.titlepage.verso.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style" font-size="8pt"> <xsl:apply-templates select="." mode="book.titlepage.verso.mode"/> </fo:block> </xsl:template> <xsl:template name="part.titlepage.recto"> <xsl:choose> <xsl:when test="partinfo/title"> <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="partinfo/title"/> </xsl:when> <xsl:when test="docinfo/title"> <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="docinfo/title"/> </xsl:when> <xsl:when test="info/title"> <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="info/title"/> </xsl:when> <xsl:when test="title"> <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="title"/> </xsl:when> </xsl:choose> <xsl:choose> <xsl:when test="partinfo/subtitle"> <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="partinfo/subtitle"/> </xsl:when> <xsl:when test="docinfo/subtitle"> <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="docinfo/subtitle"/> </xsl:when> <xsl:when test="info/subtitle"> <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="info/subtitle"/> </xsl:when> <xsl:when test="subtitle"> <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="subtitle"/> </xsl:when> </xsl:choose> </xsl:template> <xsl:template name="part.titlepage.verso"> </xsl:template> <xsl:template name="part.titlepage.separator"> </xsl:template> <xsl:template name="part.titlepage.before.recto"> </xsl:template> <xsl:template name="part.titlepage.before.verso"> </xsl:template> <xsl:template name="part.titlepage"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format"> <xsl:variable name="recto.content"> <xsl:call-template name="part.titlepage.before.recto"/> <xsl:call-template name="part.titlepage.recto"/> </xsl:variable> <xsl:variable name="recto.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count > 0)"> <fo:block><xsl:copy-of select="$recto.content"/></fo:block> </xsl:if> <xsl:variable name="verso.content"> <xsl:call-template name="part.titlepage.before.verso"/> <xsl:call-template name="part.titlepage.verso"/> </xsl:variable> <xsl:variable name="verso.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count > 0)"> <fo:block><xsl:copy-of select="$verso.content"/></fo:block> </xsl:if> <xsl:call-template name="part.titlepage.separator"/> </fo:block> </xsl:template> <xsl:template match="*" mode="part.titlepage.recto.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="*" mode="part.titlepage.verso.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="title" mode="part.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="part.titlepage.recto.style" text-align="center" font-size="24.8832pt" space-before="18.6624pt" font-weight="bold" font-family="{$title.fontset}" color="#00B000"> <xsl:call-template name="division.title"> <xsl:with-param name="node" select="ancestor-or-self::part[1]"/> </xsl:call-template> </fo:block> </xsl:template> <xsl:template match="subtitle" mode="part.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="part.titlepage.recto.style" text-align="center" font-size="20.736pt" space-before="15.552pt" font-weight="bold" font-style="italic" font-family="{$title.fontset}"> <xsl:apply-templates select="." mode="part.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template name="partintro.titlepage.recto"> <xsl:choose> <xsl:when test="partintroinfo/title"> <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/title"/> </xsl:when> <xsl:when test="docinfo/title"> <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/title"/> </xsl:when> <xsl:when test="info/title"> <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/title"/> </xsl:when> <xsl:when test="title"> <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="title"/> </xsl:when> </xsl:choose> <xsl:choose> <xsl:when test="partintroinfo/subtitle"> <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/subtitle"/> </xsl:when> <xsl:when test="docinfo/subtitle"> <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/subtitle"/> </xsl:when> <xsl:when test="info/subtitle"> <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/subtitle"/> </xsl:when> <xsl:when test="subtitle"> <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="subtitle"/> </xsl:when> </xsl:choose> <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/corpauthor"/> <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/corpauthor"/> <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/corpauthor"/> <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/authorgroup"/> <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/authorgroup"/> <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/authorgroup"/> <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/author"/> <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/author"/> <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/author"/> <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/othercredit"/> <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/othercredit"/> <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/othercredit"/> <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/releaseinfo"/> <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/releaseinfo"/> <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/releaseinfo"/> <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/copyright"/> <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/copyright"/> <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/copyright"/> <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/legalnotice"/> <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/legalnotice"/> <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/legalnotice"/> <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/pubdate"/> <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/pubdate"/> <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/pubdate"/> <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/revision"/> <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/revision"/> <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/revision"/> <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/revhistory"/> <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/revhistory"/> <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/revhistory"/> <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/abstract"/> <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/abstract"/> <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/abstract"/> </xsl:template> <xsl:template name="partintro.titlepage.verso"> </xsl:template> <xsl:template name="partintro.titlepage.separator"> </xsl:template> <xsl:template name="partintro.titlepage.before.recto"> </xsl:template> <xsl:template name="partintro.titlepage.before.verso"> </xsl:template> <xsl:template name="partintro.titlepage"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format"> <xsl:variable name="recto.content"> <xsl:call-template name="partintro.titlepage.before.recto"/> <xsl:call-template name="partintro.titlepage.recto"/> </xsl:variable> <xsl:variable name="recto.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count > 0)"> <fo:block><xsl:copy-of select="$recto.content"/></fo:block> </xsl:if> <xsl:variable name="verso.content"> <xsl:call-template name="partintro.titlepage.before.verso"/> <xsl:call-template name="partintro.titlepage.verso"/> </xsl:variable> <xsl:variable name="verso.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count > 0)"> <fo:block><xsl:copy-of select="$verso.content"/></fo:block> </xsl:if> <xsl:call-template name="partintro.titlepage.separator"/> </fo:block> </xsl:template> <xsl:template match="*" mode="partintro.titlepage.recto.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="*" mode="partintro.titlepage.verso.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="title" mode="partintro.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="partintro.titlepage.recto.style" text-align="center" font-size="24.8832pt" font-weight="bold" space-before="1em" font-family="{$title.fontset}"> <xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="subtitle" mode="partintro.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="partintro.titlepage.recto.style" text-align="center" font-size="14.4pt" font-weight="bold" font-style="italic" font-family="{$title.fontset}"> <xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="corpauthor" mode="partintro.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="partintro.titlepage.recto.style"> <xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="authorgroup" mode="partintro.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="partintro.titlepage.recto.style"> <xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="author" mode="partintro.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="partintro.titlepage.recto.style"> <xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="othercredit" mode="partintro.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="partintro.titlepage.recto.style"> <xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="releaseinfo" mode="partintro.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="partintro.titlepage.recto.style"> <xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="copyright" mode="partintro.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="partintro.titlepage.recto.style"> <xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="legalnotice" mode="partintro.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="partintro.titlepage.recto.style"> <xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="pubdate" mode="partintro.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="partintro.titlepage.recto.style"> <xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="revision" mode="partintro.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="partintro.titlepage.recto.style"> <xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="revhistory" mode="partintro.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="partintro.titlepage.recto.style"> <xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="abstract" mode="partintro.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="partintro.titlepage.recto.style"> <xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template name="reference.titlepage.recto"> <xsl:choose> <xsl:when test="referenceinfo/title"> <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/title"/> </xsl:when> <xsl:when test="docinfo/title"> <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/title"/> </xsl:when> <xsl:when test="info/title"> <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/title"/> </xsl:when> <xsl:when test="title"> <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="title"/> </xsl:when> </xsl:choose> <xsl:choose> <xsl:when test="referenceinfo/subtitle"> <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/subtitle"/> </xsl:when> <xsl:when test="docinfo/subtitle"> <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/subtitle"/> </xsl:when> <xsl:when test="info/subtitle"> <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/subtitle"/> </xsl:when> <xsl:when test="subtitle"> <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="subtitle"/> </xsl:when> </xsl:choose> <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/corpauthor"/> <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/corpauthor"/> <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/corpauthor"/> <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/authorgroup"/> <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/authorgroup"/> <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/authorgroup"/> <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/author"/> <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/author"/> <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/author"/> <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/othercredit"/> <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/othercredit"/> <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/othercredit"/> <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/releaseinfo"/> <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/releaseinfo"/> <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/releaseinfo"/> <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/copyright"/> <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/copyright"/> <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/copyright"/> <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/legalnotice"/> <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/legalnotice"/> <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/legalnotice"/> <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/pubdate"/> <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/pubdate"/> <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/pubdate"/> <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/revision"/> <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/revision"/> <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/revision"/> <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/revhistory"/> <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/revhistory"/> <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/revhistory"/> <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/abstract"/> <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/abstract"/> <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/abstract"/> </xsl:template> <xsl:template name="reference.titlepage.verso"> </xsl:template> <xsl:template name="reference.titlepage.separator"> </xsl:template> <xsl:template name="reference.titlepage.before.recto"> </xsl:template> <xsl:template name="reference.titlepage.before.verso"> </xsl:template> <xsl:template name="reference.titlepage"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format"> <xsl:variable name="recto.content"> <xsl:call-template name="reference.titlepage.before.recto"/> <xsl:call-template name="reference.titlepage.recto"/> </xsl:variable> <xsl:variable name="recto.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count > 0)"> <fo:block><xsl:copy-of select="$recto.content"/></fo:block> </xsl:if> <xsl:variable name="verso.content"> <xsl:call-template name="reference.titlepage.before.verso"/> <xsl:call-template name="reference.titlepage.verso"/> </xsl:variable> <xsl:variable name="verso.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count > 0)"> <fo:block><xsl:copy-of select="$verso.content"/></fo:block> </xsl:if> <xsl:call-template name="reference.titlepage.separator"/> </fo:block> </xsl:template> <xsl:template match="*" mode="reference.titlepage.recto.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="*" mode="reference.titlepage.verso.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="title" mode="reference.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="reference.titlepage.recto.style" text-align="center" font-size="24.8832pt" space-before="18.6624pt" font-weight="bold" font-family="{$title.fontset}"> <xsl:call-template name="division.title"> <xsl:with-param name="node" select="ancestor-or-self::reference[1]"/> </xsl:call-template> </fo:block> </xsl:template> <xsl:template match="subtitle" mode="reference.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="reference.titlepage.recto.style" font-family="{$title.fontset}" text-align="center"> <xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="corpauthor" mode="reference.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="reference.titlepage.recto.style"> <xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="authorgroup" mode="reference.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="reference.titlepage.recto.style"> <xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="author" mode="reference.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="reference.titlepage.recto.style"> <xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="othercredit" mode="reference.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="reference.titlepage.recto.style"> <xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="releaseinfo" mode="reference.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="reference.titlepage.recto.style"> <xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="copyright" mode="reference.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="reference.titlepage.recto.style"> <xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="legalnotice" mode="reference.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="reference.titlepage.recto.style"> <xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="pubdate" mode="reference.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="reference.titlepage.recto.style"> <xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="revision" mode="reference.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="reference.titlepage.recto.style"> <xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="revhistory" mode="reference.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="reference.titlepage.recto.style"> <xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="abstract" mode="reference.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="reference.titlepage.recto.style"> <xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template name="refsynopsisdiv.titlepage.recto"> <xsl:choose> <xsl:when test="refsynopsisdivinfo/title"> <xsl:apply-templates mode="refsynopsisdiv.titlepage.recto.auto.mode" select="refsynopsisdivinfo/title"/> </xsl:when> <xsl:when test="docinfo/title"> <xsl:apply-templates mode="refsynopsisdiv.titlepage.recto.auto.mode" select="docinfo/title"/> </xsl:when> <xsl:when test="info/title"> <xsl:apply-templates mode="refsynopsisdiv.titlepage.recto.auto.mode" select="info/title"/> </xsl:when> <xsl:when test="title"> <xsl:apply-templates mode="refsynopsisdiv.titlepage.recto.auto.mode" select="title"/> </xsl:when> </xsl:choose> </xsl:template> <xsl:template name="refsynopsisdiv.titlepage.verso"> </xsl:template> <xsl:template name="refsynopsisdiv.titlepage.separator"> </xsl:template> <xsl:template name="refsynopsisdiv.titlepage.before.recto"> </xsl:template> <xsl:template name="refsynopsisdiv.titlepage.before.verso"> </xsl:template> <xsl:template name="refsynopsisdiv.titlepage"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format"> <xsl:variable name="recto.content"> <xsl:call-template name="refsynopsisdiv.titlepage.before.recto"/> <xsl:call-template name="refsynopsisdiv.titlepage.recto"/> </xsl:variable> <xsl:variable name="recto.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count > 0)"> <fo:block><xsl:copy-of select="$recto.content"/></fo:block> </xsl:if> <xsl:variable name="verso.content"> <xsl:call-template name="refsynopsisdiv.titlepage.before.verso"/> <xsl:call-template name="refsynopsisdiv.titlepage.verso"/> </xsl:variable> <xsl:variable name="verso.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count > 0)"> <fo:block><xsl:copy-of select="$verso.content"/></fo:block> </xsl:if> <xsl:call-template name="refsynopsisdiv.titlepage.separator"/> </fo:block> </xsl:template> <xsl:template match="*" mode="refsynopsisdiv.titlepage.recto.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="*" mode="refsynopsisdiv.titlepage.verso.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="title" mode="refsynopsisdiv.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="refsynopsisdiv.titlepage.recto.style" font-family="{$title.fontset}"> <xsl:apply-templates select="." mode="refsynopsisdiv.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template name="refsection.titlepage.recto"> <xsl:choose> <xsl:when test="refsectioninfo/title"> <xsl:apply-templates mode="refsection.titlepage.recto.auto.mode" select="refsectioninfo/title"/> </xsl:when> <xsl:when test="docinfo/title"> <xsl:apply-templates mode="refsection.titlepage.recto.auto.mode" select="docinfo/title"/> </xsl:when> <xsl:when test="info/title"> <xsl:apply-templates mode="refsection.titlepage.recto.auto.mode" select="info/title"/> </xsl:when> <xsl:when test="title"> <xsl:apply-templates mode="refsection.titlepage.recto.auto.mode" select="title"/> </xsl:when> </xsl:choose> </xsl:template> <xsl:template name="refsection.titlepage.verso"> </xsl:template> <xsl:template name="refsection.titlepage.separator"> </xsl:template> <xsl:template name="refsection.titlepage.before.recto"> </xsl:template> <xsl:template name="refsection.titlepage.before.verso"> </xsl:template> <xsl:template name="refsection.titlepage"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format"> <xsl:variable name="recto.content"> <xsl:call-template name="refsection.titlepage.before.recto"/> <xsl:call-template name="refsection.titlepage.recto"/> </xsl:variable> <xsl:variable name="recto.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count > 0)"> <fo:block><xsl:copy-of select="$recto.content"/></fo:block> </xsl:if> <xsl:variable name="verso.content"> <xsl:call-template name="refsection.titlepage.before.verso"/> <xsl:call-template name="refsection.titlepage.verso"/> </xsl:variable> <xsl:variable name="verso.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count > 0)"> <fo:block><xsl:copy-of select="$verso.content"/></fo:block> </xsl:if> <xsl:call-template name="refsection.titlepage.separator"/> </fo:block> </xsl:template> <xsl:template match="*" mode="refsection.titlepage.recto.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="*" mode="refsection.titlepage.verso.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="title" mode="refsection.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="refsection.titlepage.recto.style" font-family="{$title.fontset}"> <xsl:apply-templates select="." mode="refsection.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template name="refsect1.titlepage.recto"> <xsl:choose> <xsl:when test="refsect1info/title"> <xsl:apply-templates mode="refsect1.titlepage.recto.auto.mode" select="refsect1info/title"/> </xsl:when> <xsl:when test="docinfo/title"> <xsl:apply-templates mode="refsect1.titlepage.recto.auto.mode" select="docinfo/title"/> </xsl:when> <xsl:when test="info/title"> <xsl:apply-templates mode="refsect1.titlepage.recto.auto.mode" select="info/title"/> </xsl:when> <xsl:when test="title"> <xsl:apply-templates mode="refsect1.titlepage.recto.auto.mode" select="title"/> </xsl:when> </xsl:choose> </xsl:template> <xsl:template name="refsect1.titlepage.verso"> </xsl:template> <xsl:template name="refsect1.titlepage.separator"> </xsl:template> <xsl:template name="refsect1.titlepage.before.recto"> </xsl:template> <xsl:template name="refsect1.titlepage.before.verso"> </xsl:template> <xsl:template name="refsect1.titlepage"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format"> <xsl:variable name="recto.content"> <xsl:call-template name="refsect1.titlepage.before.recto"/> <xsl:call-template name="refsect1.titlepage.recto"/> </xsl:variable> <xsl:variable name="recto.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count > 0)"> <fo:block><xsl:copy-of select="$recto.content"/></fo:block> </xsl:if> <xsl:variable name="verso.content"> <xsl:call-template name="refsect1.titlepage.before.verso"/> <xsl:call-template name="refsect1.titlepage.verso"/> </xsl:variable> <xsl:variable name="verso.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count > 0)"> <fo:block><xsl:copy-of select="$verso.content"/></fo:block> </xsl:if> <xsl:call-template name="refsect1.titlepage.separator"/> </fo:block> </xsl:template> <xsl:template match="*" mode="refsect1.titlepage.recto.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="*" mode="refsect1.titlepage.verso.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="title" mode="refsect1.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="refsect1.titlepage.recto.style" font-family="{$title.fontset}"> <xsl:apply-templates select="." mode="refsect1.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template name="refsect2.titlepage.recto"> <xsl:choose> <xsl:when test="refsect2info/title"> <xsl:apply-templates mode="refsect2.titlepage.recto.auto.mode" select="refsect2info/title"/> </xsl:when> <xsl:when test="docinfo/title"> <xsl:apply-templates mode="refsect2.titlepage.recto.auto.mode" select="docinfo/title"/> </xsl:when> <xsl:when test="info/title"> <xsl:apply-templates mode="refsect2.titlepage.recto.auto.mode" select="info/title"/> </xsl:when> <xsl:when test="title"> <xsl:apply-templates mode="refsect2.titlepage.recto.auto.mode" select="title"/> </xsl:when> </xsl:choose> </xsl:template> <xsl:template name="refsect2.titlepage.verso"> </xsl:template> <xsl:template name="refsect2.titlepage.separator"> </xsl:template> <xsl:template name="refsect2.titlepage.before.recto"> </xsl:template> <xsl:template name="refsect2.titlepage.before.verso"> </xsl:template> <xsl:template name="refsect2.titlepage"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format"> <xsl:variable name="recto.content"> <xsl:call-template name="refsect2.titlepage.before.recto"/> <xsl:call-template name="refsect2.titlepage.recto"/> </xsl:variable> <xsl:variable name="recto.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count > 0)"> <fo:block><xsl:copy-of select="$recto.content"/></fo:block> </xsl:if> <xsl:variable name="verso.content"> <xsl:call-template name="refsect2.titlepage.before.verso"/> <xsl:call-template name="refsect2.titlepage.verso"/> </xsl:variable> <xsl:variable name="verso.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count > 0)"> <fo:block><xsl:copy-of select="$verso.content"/></fo:block> </xsl:if> <xsl:call-template name="refsect2.titlepage.separator"/> </fo:block> </xsl:template> <xsl:template match="*" mode="refsect2.titlepage.recto.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="*" mode="refsect2.titlepage.verso.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="title" mode="refsect2.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="refsect2.titlepage.recto.style" font-family="{$title.fontset}"> <xsl:apply-templates select="." mode="refsect2.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template name="refsect3.titlepage.recto"> <xsl:choose> <xsl:when test="refsect3info/title"> <xsl:apply-templates mode="refsect3.titlepage.recto.auto.mode" select="refsect3info/title"/> </xsl:when> <xsl:when test="docinfo/title"> <xsl:apply-templates mode="refsect3.titlepage.recto.auto.mode" select="docinfo/title"/> </xsl:when> <xsl:when test="info/title"> <xsl:apply-templates mode="refsect3.titlepage.recto.auto.mode" select="info/title"/> </xsl:when> <xsl:when test="title"> <xsl:apply-templates mode="refsect3.titlepage.recto.auto.mode" select="title"/> </xsl:when> </xsl:choose> </xsl:template> <xsl:template name="refsect3.titlepage.verso"> </xsl:template> <xsl:template name="refsect3.titlepage.separator"> </xsl:template> <xsl:template name="refsect3.titlepage.before.recto"> </xsl:template> <xsl:template name="refsect3.titlepage.before.verso"> </xsl:template> <xsl:template name="refsect3.titlepage"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format"> <xsl:variable name="recto.content"> <xsl:call-template name="refsect3.titlepage.before.recto"/> <xsl:call-template name="refsect3.titlepage.recto"/> </xsl:variable> <xsl:variable name="recto.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count > 0)"> <fo:block><xsl:copy-of select="$recto.content"/></fo:block> </xsl:if> <xsl:variable name="verso.content"> <xsl:call-template name="refsect3.titlepage.before.verso"/> <xsl:call-template name="refsect3.titlepage.verso"/> </xsl:variable> <xsl:variable name="verso.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count > 0)"> <fo:block><xsl:copy-of select="$verso.content"/></fo:block> </xsl:if> <xsl:call-template name="refsect3.titlepage.separator"/> </fo:block> </xsl:template> <xsl:template match="*" mode="refsect3.titlepage.recto.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="*" mode="refsect3.titlepage.verso.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="title" mode="refsect3.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="refsect3.titlepage.recto.style" font-family="{$title.fontset}"> <xsl:apply-templates select="." mode="refsect3.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template name="dedication.titlepage.recto"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="dedication.titlepage.recto.style" margin-left="{$title.margin.left}" font-size="24.8832pt" font-family="{$title.fontset}" font-weight="bold"> <xsl:call-template name="component.title"> <xsl:with-param name="node" select="ancestor-or-self::dedication[1]"/> </xsl:call-template></fo:block> <xsl:choose> <xsl:when test="dedicationinfo/subtitle"> <xsl:apply-templates mode="dedication.titlepage.recto.auto.mode" select="dedicationinfo/subtitle"/> </xsl:when> <xsl:when test="docinfo/subtitle"> <xsl:apply-templates mode="dedication.titlepage.recto.auto.mode" select="docinfo/subtitle"/> </xsl:when> <xsl:when test="info/subtitle"> <xsl:apply-templates mode="dedication.titlepage.recto.auto.mode" select="info/subtitle"/> </xsl:when> <xsl:when test="subtitle"> <xsl:apply-templates mode="dedication.titlepage.recto.auto.mode" select="subtitle"/> </xsl:when> </xsl:choose> </xsl:template> <xsl:template name="dedication.titlepage.verso"> </xsl:template> <xsl:template name="dedication.titlepage.separator"> </xsl:template> <xsl:template name="dedication.titlepage.before.recto"> </xsl:template> <xsl:template name="dedication.titlepage.before.verso"> </xsl:template> <xsl:template name="dedication.titlepage"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format"> <xsl:variable name="recto.content"> <xsl:call-template name="dedication.titlepage.before.recto"/> <xsl:call-template name="dedication.titlepage.recto"/> </xsl:variable> <xsl:variable name="recto.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count > 0)"> <fo:block><xsl:copy-of select="$recto.content"/></fo:block> </xsl:if> <xsl:variable name="verso.content"> <xsl:call-template name="dedication.titlepage.before.verso"/> <xsl:call-template name="dedication.titlepage.verso"/> </xsl:variable> <xsl:variable name="verso.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count > 0)"> <fo:block><xsl:copy-of select="$verso.content"/></fo:block> </xsl:if> <xsl:call-template name="dedication.titlepage.separator"/> </fo:block> </xsl:template> <xsl:template match="*" mode="dedication.titlepage.recto.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="*" mode="dedication.titlepage.verso.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="subtitle" mode="dedication.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="dedication.titlepage.recto.style" font-family="{$title.fontset}"> <xsl:apply-templates select="." mode="dedication.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template name="preface.titlepage.recto"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="preface.titlepage.recto.style" margin-left="{$title.margin.left}" font-size="24.8832pt" font-family="{$title.fontset}" font-weight="bold"> <xsl:call-template name="component.title"> <xsl:with-param name="node" select="ancestor-or-self::preface[1]"/> </xsl:call-template></fo:block> <xsl:choose> <xsl:when test="prefaceinfo/subtitle"> <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/subtitle"/> </xsl:when> <xsl:when test="docinfo/subtitle"> <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/subtitle"/> </xsl:when> <xsl:when test="info/subtitle"> <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/subtitle"/> </xsl:when> <xsl:when test="subtitle"> <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="subtitle"/> </xsl:when> </xsl:choose> <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/corpauthor"/> <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/corpauthor"/> <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/corpauthor"/> <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/authorgroup"/> <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/authorgroup"/> <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/authorgroup"/> <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/author"/> <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/author"/> <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/author"/> <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/othercredit"/> <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/othercredit"/> <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/othercredit"/> <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/releaseinfo"/> <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/releaseinfo"/> <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/releaseinfo"/> <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/copyright"/> <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/copyright"/> <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/copyright"/> <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/legalnotice"/> <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/legalnotice"/> <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/legalnotice"/> <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/pubdate"/> <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/pubdate"/> <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/pubdate"/> <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/revision"/> <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/revision"/> <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/revision"/> <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/revhistory"/> <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/revhistory"/> <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/revhistory"/> <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/abstract"/> <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/abstract"/> <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/abstract"/> </xsl:template> <xsl:template name="preface.titlepage.verso"> </xsl:template> <xsl:template name="preface.titlepage.separator"> </xsl:template> <xsl:template name="preface.titlepage.before.recto"> </xsl:template> <xsl:template name="preface.titlepage.before.verso"> </xsl:template> <xsl:template name="preface.titlepage"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format"> <xsl:variable name="recto.content"> <xsl:call-template name="preface.titlepage.before.recto"/> <xsl:call-template name="preface.titlepage.recto"/> </xsl:variable> <xsl:variable name="recto.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count > 0)"> <fo:block><xsl:copy-of select="$recto.content"/></fo:block> </xsl:if> <xsl:variable name="verso.content"> <xsl:call-template name="preface.titlepage.before.verso"/> <xsl:call-template name="preface.titlepage.verso"/> </xsl:variable> <xsl:variable name="verso.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count > 0)"> <fo:block><xsl:copy-of select="$verso.content"/></fo:block> </xsl:if> <xsl:call-template name="preface.titlepage.separator"/> </fo:block> </xsl:template> <xsl:template match="*" mode="preface.titlepage.recto.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="*" mode="preface.titlepage.verso.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="subtitle" mode="preface.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="preface.titlepage.recto.style" font-family="{$title.fontset}"> <xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="corpauthor" mode="preface.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="preface.titlepage.recto.style"> <xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="authorgroup" mode="preface.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="preface.titlepage.recto.style"> <xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="author" mode="preface.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="preface.titlepage.recto.style"> <xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="othercredit" mode="preface.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="preface.titlepage.recto.style"> <xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="releaseinfo" mode="preface.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="preface.titlepage.recto.style"> <xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="copyright" mode="preface.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="preface.titlepage.recto.style"> <xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="legalnotice" mode="preface.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="preface.titlepage.recto.style"> <xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="pubdate" mode="preface.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="preface.titlepage.recto.style"> <xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="revision" mode="preface.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="preface.titlepage.recto.style"> <xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="revhistory" mode="preface.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="preface.titlepage.recto.style"> <xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="abstract" mode="preface.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="preface.titlepage.recto.style"> <xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template name="chapter.titlepage.recto"> <xsl:choose> <xsl:when test="chapterinfo/title"> <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/title"/> </xsl:when> <xsl:when test="docinfo/title"> <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/title"/> </xsl:when> <xsl:when test="info/title"> <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/title"/> </xsl:when> <xsl:when test="title"> <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="title"/> </xsl:when> </xsl:choose> <xsl:choose> <xsl:when test="chapterinfo/subtitle"> <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/subtitle"/> </xsl:when> <xsl:when test="docinfo/subtitle"> <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/subtitle"/> </xsl:when> <xsl:when test="info/subtitle"> <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/subtitle"/> </xsl:when> <xsl:when test="subtitle"> <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="subtitle"/> </xsl:when> </xsl:choose> <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/corpauthor"/> <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/corpauthor"/> <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/corpauthor"/> <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/authorgroup"/> <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/authorgroup"/> <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/authorgroup"/> <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/author"/> <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/author"/> <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/author"/> <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/othercredit"/> <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/othercredit"/> <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/othercredit"/> <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/releaseinfo"/> <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/releaseinfo"/> <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/releaseinfo"/> <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/copyright"/> <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/copyright"/> <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/copyright"/> <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/legalnotice"/> <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/legalnotice"/> <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/legalnotice"/> <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/pubdate"/> <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/pubdate"/> <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/pubdate"/> <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/revision"/> <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/revision"/> <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/revision"/> <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/revhistory"/> <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/revhistory"/> <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/revhistory"/> <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/abstract"/> <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/abstract"/> <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/abstract"/> </xsl:template> <xsl:template name="chapter.titlepage.verso"> </xsl:template> <xsl:template name="chapter.titlepage.separator"> </xsl:template> <xsl:template name="chapter.titlepage.before.recto"> </xsl:template> <xsl:template name="chapter.titlepage.before.verso"> </xsl:template> <xsl:template name="chapter.titlepage"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" font-family="{$title.fontset}"> <xsl:variable name="recto.content"> <xsl:call-template name="chapter.titlepage.before.recto"/> <xsl:call-template name="chapter.titlepage.recto"/> </xsl:variable> <xsl:variable name="recto.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count > 0)"> <fo:block margin-left="{$title.margin.left}"><xsl:copy-of select="$recto.content"/></fo:block> </xsl:if> <xsl:variable name="verso.content"> <xsl:call-template name="chapter.titlepage.before.verso"/> <xsl:call-template name="chapter.titlepage.verso"/> </xsl:variable> <xsl:variable name="verso.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count > 0)"> <fo:block><xsl:copy-of select="$verso.content"/></fo:block> </xsl:if> <xsl:call-template name="chapter.titlepage.separator"/> </fo:block> </xsl:template> <xsl:template match="*" mode="chapter.titlepage.recto.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="*" mode="chapter.titlepage.verso.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="title" mode="chapter.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="chapter.titlepage.recto.style" font-size="24.8832pt" font-weight="bold" color="#00B000"> <xsl:call-template name="component.title"> <xsl:with-param name="node" select="ancestor-or-self::chapter[1]"/> </xsl:call-template> </fo:block> </xsl:template> <xsl:template match="subtitle" mode="chapter.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="chapter.titlepage.recto.style" space-before="0.5em" font-style="italic" font-size="14.4pt" font-weight="bold"> <xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="corpauthor" mode="chapter.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="chapter.titlepage.recto.style" space-before="0.5em" space-after="0.5em" font-size="14.4pt"> <xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="authorgroup" mode="chapter.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="chapter.titlepage.recto.style" space-before="0.5em" space-after="0.5em" font-size="14.4pt"> <xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="author" mode="chapter.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="chapter.titlepage.recto.style" space-before="0.5em" space-after="0.5em" font-size="14.4pt"> <xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="othercredit" mode="chapter.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="chapter.titlepage.recto.style"> <xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="releaseinfo" mode="chapter.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="chapter.titlepage.recto.style"> <xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="copyright" mode="chapter.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="chapter.titlepage.recto.style"> <xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="legalnotice" mode="chapter.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="chapter.titlepage.recto.style"> <xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="pubdate" mode="chapter.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="chapter.titlepage.recto.style"> <xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="revision" mode="chapter.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="chapter.titlepage.recto.style"> <xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="revhistory" mode="chapter.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="chapter.titlepage.recto.style"> <xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="abstract" mode="chapter.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="chapter.titlepage.recto.style"> <xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template name="appendix.titlepage.recto"> <xsl:choose> <xsl:when test="appendixinfo/title"> <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/title"/> </xsl:when> <xsl:when test="docinfo/title"> <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/title"/> </xsl:when> <xsl:when test="info/title"> <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/title"/> </xsl:when> <xsl:when test="title"> <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="title"/> </xsl:when> </xsl:choose> <xsl:choose> <xsl:when test="appendixinfo/subtitle"> <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/subtitle"/> </xsl:when> <xsl:when test="docinfo/subtitle"> <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/subtitle"/> </xsl:when> <xsl:when test="info/subtitle"> <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/subtitle"/> </xsl:when> <xsl:when test="subtitle"> <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="subtitle"/> </xsl:when> </xsl:choose> <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/corpauthor"/> <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/corpauthor"/> <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/corpauthor"/> <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/authorgroup"/> <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/authorgroup"/> <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/authorgroup"/> <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/author"/> <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/author"/> <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/author"/> <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/othercredit"/> <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/othercredit"/> <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/othercredit"/> <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/releaseinfo"/> <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/releaseinfo"/> <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/releaseinfo"/> <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/copyright"/> <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/copyright"/> <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/copyright"/> <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/legalnotice"/> <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/legalnotice"/> <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/legalnotice"/> <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/pubdate"/> <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/pubdate"/> <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/pubdate"/> <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/revision"/> <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/revision"/> <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/revision"/> <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/revhistory"/> <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/revhistory"/> <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/revhistory"/> <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/abstract"/> <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/abstract"/> <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/abstract"/> </xsl:template> <xsl:template name="appendix.titlepage.verso"> </xsl:template> <xsl:template name="appendix.titlepage.separator"> </xsl:template> <xsl:template name="appendix.titlepage.before.recto"> </xsl:template> <xsl:template name="appendix.titlepage.before.verso"> </xsl:template> <xsl:template name="appendix.titlepage"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format"> <xsl:variable name="recto.content"> <xsl:call-template name="appendix.titlepage.before.recto"/> <xsl:call-template name="appendix.titlepage.recto"/> </xsl:variable> <xsl:variable name="recto.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count > 0)"> <fo:block><xsl:copy-of select="$recto.content"/></fo:block> </xsl:if> <xsl:variable name="verso.content"> <xsl:call-template name="appendix.titlepage.before.verso"/> <xsl:call-template name="appendix.titlepage.verso"/> </xsl:variable> <xsl:variable name="verso.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count > 0)"> <fo:block><xsl:copy-of select="$verso.content"/></fo:block> </xsl:if> <xsl:call-template name="appendix.titlepage.separator"/> </fo:block> </xsl:template> <xsl:template match="*" mode="appendix.titlepage.recto.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="*" mode="appendix.titlepage.verso.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="title" mode="appendix.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="appendix.titlepage.recto.style" margin-left="{$title.margin.left}" font-size="24.8832pt" font-weight="bold" font-family="{$title.fontset}"> <xsl:call-template name="component.title"> <xsl:with-param name="node" select="ancestor-or-self::appendix[1]"/> </xsl:call-template> </fo:block> </xsl:template> <xsl:template match="subtitle" mode="appendix.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="appendix.titlepage.recto.style" font-family="{$title.fontset}"> <xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="corpauthor" mode="appendix.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="appendix.titlepage.recto.style"> <xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="authorgroup" mode="appendix.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="appendix.titlepage.recto.style"> <xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="author" mode="appendix.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="appendix.titlepage.recto.style"> <xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="othercredit" mode="appendix.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="appendix.titlepage.recto.style"> <xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="releaseinfo" mode="appendix.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="appendix.titlepage.recto.style"> <xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="copyright" mode="appendix.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="appendix.titlepage.recto.style"> <xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="legalnotice" mode="appendix.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="appendix.titlepage.recto.style"> <xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="pubdate" mode="appendix.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="appendix.titlepage.recto.style"> <xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="revision" mode="appendix.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="appendix.titlepage.recto.style"> <xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="revhistory" mode="appendix.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="appendix.titlepage.recto.style"> <xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="abstract" mode="appendix.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="appendix.titlepage.recto.style"> <xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template name="section.titlepage.recto"> <xsl:choose> <xsl:when test="sectioninfo/title"> <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/title"/> </xsl:when> <xsl:when test="info/title"> <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/title"/> </xsl:when> <xsl:when test="title"> <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="title"/> </xsl:when> </xsl:choose> <xsl:choose> <xsl:when test="sectioninfo/subtitle"> <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/subtitle"/> </xsl:when> <xsl:when test="info/subtitle"> <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/subtitle"/> </xsl:when> <xsl:when test="subtitle"> <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="subtitle"/> </xsl:when> </xsl:choose> <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/corpauthor"/> <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/corpauthor"/> <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/authorgroup"/> <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/authorgroup"/> <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/author"/> <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/author"/> <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/othercredit"/> <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/othercredit"/> <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/releaseinfo"/> <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/releaseinfo"/> <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/copyright"/> <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/copyright"/> <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/legalnotice"/> <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/legalnotice"/> <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/pubdate"/> <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/pubdate"/> <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/revision"/> <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/revision"/> <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/revhistory"/> <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/revhistory"/> <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/abstract"/> <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/abstract"/> </xsl:template> <xsl:template name="section.titlepage.verso"> </xsl:template> <xsl:template name="section.titlepage.separator"> </xsl:template> <xsl:template name="section.titlepage.before.recto"> </xsl:template> <xsl:template name="section.titlepage.before.verso"> </xsl:template> <xsl:template name="section.titlepage"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format"> <xsl:variable name="recto.content"> <xsl:call-template name="section.titlepage.before.recto"/> <xsl:call-template name="section.titlepage.recto"/> </xsl:variable> <xsl:variable name="recto.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count > 0)"> <fo:block><xsl:copy-of select="$recto.content"/></fo:block> </xsl:if> <xsl:variable name="verso.content"> <xsl:call-template name="section.titlepage.before.verso"/> <xsl:call-template name="section.titlepage.verso"/> </xsl:variable> <xsl:variable name="verso.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count > 0)"> <fo:block><xsl:copy-of select="$verso.content"/></fo:block> </xsl:if> <xsl:call-template name="section.titlepage.separator"/> </fo:block> </xsl:template> <xsl:template match="*" mode="section.titlepage.recto.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="*" mode="section.titlepage.verso.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="title" mode="section.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="section.titlepage.recto.style" margin-left="{$title.margin.left}" font-family="{$title.fontset}"> <xsl:apply-templates select="." mode="section.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="subtitle" mode="section.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="section.titlepage.recto.style" font-family="{$title.fontset}"> <xsl:apply-templates select="." mode="section.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="corpauthor" mode="section.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="section.titlepage.recto.style"> <xsl:apply-templates select="." mode="section.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="authorgroup" mode="section.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="section.titlepage.recto.style"> <xsl:apply-templates select="." mode="section.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="author" mode="section.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="section.titlepage.recto.style"> <xsl:apply-templates select="." mode="section.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="othercredit" mode="section.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="section.titlepage.recto.style"> <xsl:apply-templates select="." mode="section.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="releaseinfo" mode="section.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="section.titlepage.recto.style"> <xsl:apply-templates select="." mode="section.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="copyright" mode="section.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="section.titlepage.recto.style"> <xsl:apply-templates select="." mode="section.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="legalnotice" mode="section.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="section.titlepage.recto.style"> <xsl:apply-templates select="." mode="section.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="pubdate" mode="section.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="section.titlepage.recto.style"> <xsl:apply-templates select="." mode="section.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="revision" mode="section.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="section.titlepage.recto.style"> <xsl:apply-templates select="." mode="section.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="revhistory" mode="section.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="section.titlepage.recto.style"> <xsl:apply-templates select="." mode="section.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="abstract" mode="section.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="section.titlepage.recto.style"> <xsl:apply-templates select="." mode="section.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template name="sect1.titlepage.recto"> <xsl:choose> <xsl:when test="sect1info/title"> <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/title"/> </xsl:when> <xsl:when test="info/title"> <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/title"/> </xsl:when> <xsl:when test="title"> <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="title"/> </xsl:when> </xsl:choose> <xsl:choose> <xsl:when test="sect1info/subtitle"> <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/subtitle"/> </xsl:when> <xsl:when test="info/subtitle"> <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/subtitle"/> </xsl:when> <xsl:when test="subtitle"> <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="subtitle"/> </xsl:when> </xsl:choose> <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/corpauthor"/> <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/corpauthor"/> <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/authorgroup"/> <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/authorgroup"/> <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/author"/> <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/author"/> <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/othercredit"/> <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/othercredit"/> <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/releaseinfo"/> <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/releaseinfo"/> <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/copyright"/> <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/copyright"/> <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/legalnotice"/> <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/legalnotice"/> <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/pubdate"/> <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/pubdate"/> <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/revision"/> <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/revision"/> <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/revhistory"/> <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/revhistory"/> <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/abstract"/> <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/abstract"/> </xsl:template> <xsl:template name="sect1.titlepage.verso"> </xsl:template> <xsl:template name="sect1.titlepage.separator"> </xsl:template> <xsl:template name="sect1.titlepage.before.recto"> </xsl:template> <xsl:template name="sect1.titlepage.before.verso"> </xsl:template> <xsl:template name="sect1.titlepage"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format"> <xsl:variable name="recto.content"> <xsl:call-template name="sect1.titlepage.before.recto"/> <xsl:call-template name="sect1.titlepage.recto"/> </xsl:variable> <xsl:variable name="recto.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count > 0)"> <fo:block><xsl:copy-of select="$recto.content"/></fo:block> </xsl:if> <xsl:variable name="verso.content"> <xsl:call-template name="sect1.titlepage.before.verso"/> <xsl:call-template name="sect1.titlepage.verso"/> </xsl:variable> <xsl:variable name="verso.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count > 0)"> <fo:block><xsl:copy-of select="$verso.content"/></fo:block> </xsl:if> <xsl:call-template name="sect1.titlepage.separator"/> </fo:block> </xsl:template> <xsl:template match="*" mode="sect1.titlepage.recto.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="*" mode="sect1.titlepage.verso.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="title" mode="sect1.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect1.titlepage.recto.style" margin-left="{$title.margin.left}" font-family="{$title.fontset}"> <xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="subtitle" mode="sect1.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect1.titlepage.recto.style" font-family="{$title.fontset}"> <xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="corpauthor" mode="sect1.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect1.titlepage.recto.style"> <xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="authorgroup" mode="sect1.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect1.titlepage.recto.style"> <xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="author" mode="sect1.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect1.titlepage.recto.style"> <xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="othercredit" mode="sect1.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect1.titlepage.recto.style"> <xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="releaseinfo" mode="sect1.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect1.titlepage.recto.style"> <xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="copyright" mode="sect1.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect1.titlepage.recto.style"> <xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="legalnotice" mode="sect1.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect1.titlepage.recto.style"> <xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="pubdate" mode="sect1.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect1.titlepage.recto.style"> <xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="revision" mode="sect1.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect1.titlepage.recto.style"> <xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="revhistory" mode="sect1.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect1.titlepage.recto.style"> <xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="abstract" mode="sect1.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect1.titlepage.recto.style"> <xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template name="sect2.titlepage.recto"> <xsl:choose> <xsl:when test="sect2info/title"> <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/title"/> </xsl:when> <xsl:when test="info/title"> <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/title"/> </xsl:when> <xsl:when test="title"> <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="title"/> </xsl:when> </xsl:choose> <xsl:choose> <xsl:when test="sect2info/subtitle"> <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/subtitle"/> </xsl:when> <xsl:when test="info/subtitle"> <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/subtitle"/> </xsl:when> <xsl:when test="subtitle"> <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="subtitle"/> </xsl:when> </xsl:choose> <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/corpauthor"/> <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/corpauthor"/> <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/authorgroup"/> <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/authorgroup"/> <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/author"/> <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/author"/> <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/othercredit"/> <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/othercredit"/> <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/releaseinfo"/> <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/releaseinfo"/> <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/copyright"/> <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/copyright"/> <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/legalnotice"/> <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/legalnotice"/> <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/pubdate"/> <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/pubdate"/> <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/revision"/> <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/revision"/> <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/revhistory"/> <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/revhistory"/> <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/abstract"/> <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/abstract"/> </xsl:template> <xsl:template name="sect2.titlepage.verso"> </xsl:template> <xsl:template name="sect2.titlepage.separator"> </xsl:template> <xsl:template name="sect2.titlepage.before.recto"> </xsl:template> <xsl:template name="sect2.titlepage.before.verso"> </xsl:template> <xsl:template name="sect2.titlepage"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format"> <xsl:variable name="recto.content"> <xsl:call-template name="sect2.titlepage.before.recto"/> <xsl:call-template name="sect2.titlepage.recto"/> </xsl:variable> <xsl:variable name="recto.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count > 0)"> <fo:block><xsl:copy-of select="$recto.content"/></fo:block> </xsl:if> <xsl:variable name="verso.content"> <xsl:call-template name="sect2.titlepage.before.verso"/> <xsl:call-template name="sect2.titlepage.verso"/> </xsl:variable> <xsl:variable name="verso.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count > 0)"> <fo:block><xsl:copy-of select="$verso.content"/></fo:block> </xsl:if> <xsl:call-template name="sect2.titlepage.separator"/> </fo:block> </xsl:template> <xsl:template match="*" mode="sect2.titlepage.recto.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="*" mode="sect2.titlepage.verso.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="title" mode="sect2.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect2.titlepage.recto.style" margin-left="{$title.margin.left}" font-family="{$title.fontset}"> <xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="subtitle" mode="sect2.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect2.titlepage.recto.style" font-family="{$title.fontset}"> <xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="corpauthor" mode="sect2.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect2.titlepage.recto.style"> <xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="authorgroup" mode="sect2.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect2.titlepage.recto.style"> <xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="author" mode="sect2.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect2.titlepage.recto.style"> <xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="othercredit" mode="sect2.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect2.titlepage.recto.style"> <xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="releaseinfo" mode="sect2.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect2.titlepage.recto.style"> <xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="copyright" mode="sect2.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect2.titlepage.recto.style"> <xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="legalnotice" mode="sect2.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect2.titlepage.recto.style"> <xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="pubdate" mode="sect2.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect2.titlepage.recto.style"> <xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="revision" mode="sect2.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect2.titlepage.recto.style"> <xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="revhistory" mode="sect2.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect2.titlepage.recto.style"> <xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="abstract" mode="sect2.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect2.titlepage.recto.style"> <xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template name="sect3.titlepage.recto"> <xsl:choose> <xsl:when test="sect3info/title"> <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/title"/> </xsl:when> <xsl:when test="info/title"> <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/title"/> </xsl:when> <xsl:when test="title"> <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="title"/> </xsl:when> </xsl:choose> <xsl:choose> <xsl:when test="sect3info/subtitle"> <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/subtitle"/> </xsl:when> <xsl:when test="info/subtitle"> <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/subtitle"/> </xsl:when> <xsl:when test="subtitle"> <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="subtitle"/> </xsl:when> </xsl:choose> <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/corpauthor"/> <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/corpauthor"/> <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/authorgroup"/> <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/authorgroup"/> <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/author"/> <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/author"/> <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/othercredit"/> <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/othercredit"/> <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/releaseinfo"/> <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/releaseinfo"/> <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/copyright"/> <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/copyright"/> <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/legalnotice"/> <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/legalnotice"/> <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/pubdate"/> <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/pubdate"/> <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/revision"/> <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/revision"/> <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/revhistory"/> <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/revhistory"/> <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/abstract"/> <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/abstract"/> </xsl:template> <xsl:template name="sect3.titlepage.verso"> </xsl:template> <xsl:template name="sect3.titlepage.separator"> </xsl:template> <xsl:template name="sect3.titlepage.before.recto"> </xsl:template> <xsl:template name="sect3.titlepage.before.verso"> </xsl:template> <xsl:template name="sect3.titlepage"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format"> <xsl:variable name="recto.content"> <xsl:call-template name="sect3.titlepage.before.recto"/> <xsl:call-template name="sect3.titlepage.recto"/> </xsl:variable> <xsl:variable name="recto.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count > 0)"> <fo:block><xsl:copy-of select="$recto.content"/></fo:block> </xsl:if> <xsl:variable name="verso.content"> <xsl:call-template name="sect3.titlepage.before.verso"/> <xsl:call-template name="sect3.titlepage.verso"/> </xsl:variable> <xsl:variable name="verso.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count > 0)"> <fo:block><xsl:copy-of select="$verso.content"/></fo:block> </xsl:if> <xsl:call-template name="sect3.titlepage.separator"/> </fo:block> </xsl:template> <xsl:template match="*" mode="sect3.titlepage.recto.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="*" mode="sect3.titlepage.verso.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="title" mode="sect3.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect3.titlepage.recto.style" margin-left="{$title.margin.left}" font-family="{$title.fontset}"> <xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="subtitle" mode="sect3.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect3.titlepage.recto.style" font-family="{$title.fontset}"> <xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="corpauthor" mode="sect3.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect3.titlepage.recto.style"> <xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="authorgroup" mode="sect3.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect3.titlepage.recto.style"> <xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="author" mode="sect3.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect3.titlepage.recto.style"> <xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="othercredit" mode="sect3.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect3.titlepage.recto.style"> <xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="releaseinfo" mode="sect3.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect3.titlepage.recto.style"> <xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="copyright" mode="sect3.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect3.titlepage.recto.style"> <xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="legalnotice" mode="sect3.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect3.titlepage.recto.style"> <xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="pubdate" mode="sect3.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect3.titlepage.recto.style"> <xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="revision" mode="sect3.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect3.titlepage.recto.style"> <xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="revhistory" mode="sect3.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect3.titlepage.recto.style"> <xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="abstract" mode="sect3.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect3.titlepage.recto.style"> <xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template name="sect4.titlepage.recto"> <xsl:choose> <xsl:when test="sect4info/title"> <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/title"/> </xsl:when> <xsl:when test="info/title"> <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/title"/> </xsl:when> <xsl:when test="title"> <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="title"/> </xsl:when> </xsl:choose> <xsl:choose> <xsl:when test="sect4info/subtitle"> <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/subtitle"/> </xsl:when> <xsl:when test="info/subtitle"> <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/subtitle"/> </xsl:when> <xsl:when test="subtitle"> <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="subtitle"/> </xsl:when> </xsl:choose> <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/corpauthor"/> <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/corpauthor"/> <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/authorgroup"/> <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/authorgroup"/> <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/author"/> <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/author"/> <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/othercredit"/> <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/othercredit"/> <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/releaseinfo"/> <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/releaseinfo"/> <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/copyright"/> <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/copyright"/> <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/legalnotice"/> <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/legalnotice"/> <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/pubdate"/> <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/pubdate"/> <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/revision"/> <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/revision"/> <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/revhistory"/> <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/revhistory"/> <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/abstract"/> <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/abstract"/> </xsl:template> <xsl:template name="sect4.titlepage.verso"> </xsl:template> <xsl:template name="sect4.titlepage.separator"> </xsl:template> <xsl:template name="sect4.titlepage.before.recto"> </xsl:template> <xsl:template name="sect4.titlepage.before.verso"> </xsl:template> <xsl:template name="sect4.titlepage"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format"> <xsl:variable name="recto.content"> <xsl:call-template name="sect4.titlepage.before.recto"/> <xsl:call-template name="sect4.titlepage.recto"/> </xsl:variable> <xsl:variable name="recto.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count > 0)"> <fo:block><xsl:copy-of select="$recto.content"/></fo:block> </xsl:if> <xsl:variable name="verso.content"> <xsl:call-template name="sect4.titlepage.before.verso"/> <xsl:call-template name="sect4.titlepage.verso"/> </xsl:variable> <xsl:variable name="verso.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count > 0)"> <fo:block><xsl:copy-of select="$verso.content"/></fo:block> </xsl:if> <xsl:call-template name="sect4.titlepage.separator"/> </fo:block> </xsl:template> <xsl:template match="*" mode="sect4.titlepage.recto.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="*" mode="sect4.titlepage.verso.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="title" mode="sect4.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect4.titlepage.recto.style" margin-left="{$title.margin.left}" font-family="{$title.fontset}"> <xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="subtitle" mode="sect4.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect4.titlepage.recto.style" font-family="{$title.fontset}"> <xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="corpauthor" mode="sect4.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect4.titlepage.recto.style"> <xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="authorgroup" mode="sect4.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect4.titlepage.recto.style"> <xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="author" mode="sect4.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect4.titlepage.recto.style"> <xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="othercredit" mode="sect4.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect4.titlepage.recto.style"> <xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="releaseinfo" mode="sect4.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect4.titlepage.recto.style"> <xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="copyright" mode="sect4.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect4.titlepage.recto.style"> <xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="legalnotice" mode="sect4.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect4.titlepage.recto.style"> <xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="pubdate" mode="sect4.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect4.titlepage.recto.style"> <xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="revision" mode="sect4.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect4.titlepage.recto.style"> <xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="revhistory" mode="sect4.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect4.titlepage.recto.style"> <xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="abstract" mode="sect4.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect4.titlepage.recto.style"> <xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template name="sect5.titlepage.recto"> <xsl:choose> <xsl:when test="sect5info/title"> <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/title"/> </xsl:when> <xsl:when test="info/title"> <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/title"/> </xsl:when> <xsl:when test="title"> <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="title"/> </xsl:when> </xsl:choose> <xsl:choose> <xsl:when test="sect5info/subtitle"> <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/subtitle"/> </xsl:when> <xsl:when test="info/subtitle"> <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/subtitle"/> </xsl:when> <xsl:when test="subtitle"> <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="subtitle"/> </xsl:when> </xsl:choose> <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/corpauthor"/> <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/corpauthor"/> <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/authorgroup"/> <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/authorgroup"/> <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/author"/> <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/author"/> <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/othercredit"/> <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/othercredit"/> <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/releaseinfo"/> <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/releaseinfo"/> <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/copyright"/> <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/copyright"/> <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/legalnotice"/> <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/legalnotice"/> <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/pubdate"/> <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/pubdate"/> <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/revision"/> <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/revision"/> <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/revhistory"/> <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/revhistory"/> <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/abstract"/> <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/abstract"/> </xsl:template> <xsl:template name="sect5.titlepage.verso"> </xsl:template> <xsl:template name="sect5.titlepage.separator"> </xsl:template> <xsl:template name="sect5.titlepage.before.recto"> </xsl:template> <xsl:template name="sect5.titlepage.before.verso"> </xsl:template> <xsl:template name="sect5.titlepage"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format"> <xsl:variable name="recto.content"> <xsl:call-template name="sect5.titlepage.before.recto"/> <xsl:call-template name="sect5.titlepage.recto"/> </xsl:variable> <xsl:variable name="recto.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count > 0)"> <fo:block><xsl:copy-of select="$recto.content"/></fo:block> </xsl:if> <xsl:variable name="verso.content"> <xsl:call-template name="sect5.titlepage.before.verso"/> <xsl:call-template name="sect5.titlepage.verso"/> </xsl:variable> <xsl:variable name="verso.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count > 0)"> <fo:block><xsl:copy-of select="$verso.content"/></fo:block> </xsl:if> <xsl:call-template name="sect5.titlepage.separator"/> </fo:block> </xsl:template> <xsl:template match="*" mode="sect5.titlepage.recto.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="*" mode="sect5.titlepage.verso.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="title" mode="sect5.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect5.titlepage.recto.style" margin-left="{$title.margin.left}" font-family="{$title.fontset}"> <xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="subtitle" mode="sect5.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect5.titlepage.recto.style" font-family="{$title.fontset}"> <xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="corpauthor" mode="sect5.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect5.titlepage.recto.style"> <xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="authorgroup" mode="sect5.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect5.titlepage.recto.style"> <xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="author" mode="sect5.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect5.titlepage.recto.style"> <xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="othercredit" mode="sect5.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect5.titlepage.recto.style"> <xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="releaseinfo" mode="sect5.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect5.titlepage.recto.style"> <xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="copyright" mode="sect5.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect5.titlepage.recto.style"> <xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="legalnotice" mode="sect5.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect5.titlepage.recto.style"> <xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="pubdate" mode="sect5.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect5.titlepage.recto.style"> <xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="revision" mode="sect5.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect5.titlepage.recto.style"> <xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="revhistory" mode="sect5.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect5.titlepage.recto.style"> <xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="abstract" mode="sect5.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect5.titlepage.recto.style"> <xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template name="simplesect.titlepage.recto"> <xsl:choose> <xsl:when test="simplesectinfo/title"> <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/title"/> </xsl:when> <xsl:when test="docinfo/title"> <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/title"/> </xsl:when> <xsl:when test="info/title"> <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/title"/> </xsl:when> <xsl:when test="title"> <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="title"/> </xsl:when> </xsl:choose> <xsl:choose> <xsl:when test="simplesectinfo/subtitle"> <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/subtitle"/> </xsl:when> <xsl:when test="docinfo/subtitle"> <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/subtitle"/> </xsl:when> <xsl:when test="info/subtitle"> <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/subtitle"/> </xsl:when> <xsl:when test="subtitle"> <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="subtitle"/> </xsl:when> </xsl:choose> <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/corpauthor"/> <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/corpauthor"/> <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/corpauthor"/> <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/authorgroup"/> <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/authorgroup"/> <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/authorgroup"/> <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/author"/> <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/author"/> <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/author"/> <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/othercredit"/> <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/othercredit"/> <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/othercredit"/> <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/releaseinfo"/> <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/releaseinfo"/> <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/releaseinfo"/> <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/copyright"/> <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/copyright"/> <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/copyright"/> <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/legalnotice"/> <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/legalnotice"/> <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/legalnotice"/> <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/pubdate"/> <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/pubdate"/> <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/pubdate"/> <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/revision"/> <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/revision"/> <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/revision"/> <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/revhistory"/> <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/revhistory"/> <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/revhistory"/> <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/abstract"/> <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/abstract"/> <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/abstract"/> </xsl:template> <xsl:template name="simplesect.titlepage.verso"> </xsl:template> <xsl:template name="simplesect.titlepage.separator"> </xsl:template> <xsl:template name="simplesect.titlepage.before.recto"> </xsl:template> <xsl:template name="simplesect.titlepage.before.verso"> </xsl:template> <xsl:template name="simplesect.titlepage"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format"> <xsl:variable name="recto.content"> <xsl:call-template name="simplesect.titlepage.before.recto"/> <xsl:call-template name="simplesect.titlepage.recto"/> </xsl:variable> <xsl:variable name="recto.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count > 0)"> <fo:block><xsl:copy-of select="$recto.content"/></fo:block> </xsl:if> <xsl:variable name="verso.content"> <xsl:call-template name="simplesect.titlepage.before.verso"/> <xsl:call-template name="simplesect.titlepage.verso"/> </xsl:variable> <xsl:variable name="verso.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count > 0)"> <fo:block><xsl:copy-of select="$verso.content"/></fo:block> </xsl:if> <xsl:call-template name="simplesect.titlepage.separator"/> </fo:block> </xsl:template> <xsl:template match="*" mode="simplesect.titlepage.recto.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="*" mode="simplesect.titlepage.verso.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="title" mode="simplesect.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="simplesect.titlepage.recto.style" margin-left="{$title.margin.left}" font-family="{$title.fontset}"> <xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="subtitle" mode="simplesect.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="simplesect.titlepage.recto.style" font-family="{$title.fontset}"> <xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="corpauthor" mode="simplesect.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="simplesect.titlepage.recto.style"> <xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="authorgroup" mode="simplesect.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="simplesect.titlepage.recto.style"> <xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="author" mode="simplesect.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="simplesect.titlepage.recto.style"> <xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="othercredit" mode="simplesect.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="simplesect.titlepage.recto.style"> <xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="releaseinfo" mode="simplesect.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="simplesect.titlepage.recto.style"> <xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="copyright" mode="simplesect.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="simplesect.titlepage.recto.style"> <xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="legalnotice" mode="simplesect.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="simplesect.titlepage.recto.style"> <xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="pubdate" mode="simplesect.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="simplesect.titlepage.recto.style"> <xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="revision" mode="simplesect.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="simplesect.titlepage.recto.style"> <xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="revhistory" mode="simplesect.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="simplesect.titlepage.recto.style"> <xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template match="abstract" mode="simplesect.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="simplesect.titlepage.recto.style"> <xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template name="bibliography.titlepage.recto"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="bibliography.titlepage.recto.style" margin-left="{$title.margin.left}" font-size="24.8832pt" font-family="{$title.fontset}" font-weight="bold"> <xsl:call-template name="component.title"> <xsl:with-param name="node" select="ancestor-or-self::bibliography[1]"/> </xsl:call-template></fo:block> <xsl:choose> <xsl:when test="bibliographyinfo/subtitle"> <xsl:apply-templates mode="bibliography.titlepage.recto.auto.mode" select="bibliographyinfo/subtitle"/> </xsl:when> <xsl:when test="docinfo/subtitle"> <xsl:apply-templates mode="bibliography.titlepage.recto.auto.mode" select="docinfo/subtitle"/> </xsl:when> <xsl:when test="info/subtitle"> <xsl:apply-templates mode="bibliography.titlepage.recto.auto.mode" select="info/subtitle"/> </xsl:when> <xsl:when test="subtitle"> <xsl:apply-templates mode="bibliography.titlepage.recto.auto.mode" select="subtitle"/> </xsl:when> </xsl:choose> </xsl:template> <xsl:template name="bibliography.titlepage.verso"> </xsl:template> <xsl:template name="bibliography.titlepage.separator"> </xsl:template> <xsl:template name="bibliography.titlepage.before.recto"> </xsl:template> <xsl:template name="bibliography.titlepage.before.verso"> </xsl:template> <xsl:template name="bibliography.titlepage"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format"> <xsl:variable name="recto.content"> <xsl:call-template name="bibliography.titlepage.before.recto"/> <xsl:call-template name="bibliography.titlepage.recto"/> </xsl:variable> <xsl:variable name="recto.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count > 0)"> <fo:block><xsl:copy-of select="$recto.content"/></fo:block> </xsl:if> <xsl:variable name="verso.content"> <xsl:call-template name="bibliography.titlepage.before.verso"/> <xsl:call-template name="bibliography.titlepage.verso"/> </xsl:variable> <xsl:variable name="verso.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count > 0)"> <fo:block><xsl:copy-of select="$verso.content"/></fo:block> </xsl:if> <xsl:call-template name="bibliography.titlepage.separator"/> </fo:block> </xsl:template> <xsl:template match="*" mode="bibliography.titlepage.recto.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="*" mode="bibliography.titlepage.verso.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="subtitle" mode="bibliography.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="bibliography.titlepage.recto.style" font-family="{$title.fontset}"> <xsl:apply-templates select="." mode="bibliography.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template name="bibliodiv.titlepage.recto"> <xsl:choose> <xsl:when test="bibliodivinfo/title"> <xsl:apply-templates mode="bibliodiv.titlepage.recto.auto.mode" select="bibliodivinfo/title"/> </xsl:when> <xsl:when test="docinfo/title"> <xsl:apply-templates mode="bibliodiv.titlepage.recto.auto.mode" select="docinfo/title"/> </xsl:when> <xsl:when test="info/title"> <xsl:apply-templates mode="bibliodiv.titlepage.recto.auto.mode" select="info/title"/> </xsl:when> <xsl:when test="title"> <xsl:apply-templates mode="bibliodiv.titlepage.recto.auto.mode" select="title"/> </xsl:when> </xsl:choose> <xsl:choose> <xsl:when test="bibliodivinfo/subtitle"> <xsl:apply-templates mode="bibliodiv.titlepage.recto.auto.mode" select="bibliodivinfo/subtitle"/> </xsl:when> <xsl:when test="docinfo/subtitle"> <xsl:apply-templates mode="bibliodiv.titlepage.recto.auto.mode" select="docinfo/subtitle"/> </xsl:when> <xsl:when test="info/subtitle"> <xsl:apply-templates mode="bibliodiv.titlepage.recto.auto.mode" select="info/subtitle"/> </xsl:when> <xsl:when test="subtitle"> <xsl:apply-templates mode="bibliodiv.titlepage.recto.auto.mode" select="subtitle"/> </xsl:when> </xsl:choose> </xsl:template> <xsl:template name="bibliodiv.titlepage.verso"> </xsl:template> <xsl:template name="bibliodiv.titlepage.separator"> </xsl:template> <xsl:template name="bibliodiv.titlepage.before.recto"> </xsl:template> <xsl:template name="bibliodiv.titlepage.before.verso"> </xsl:template> <xsl:template name="bibliodiv.titlepage"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format"> <xsl:variable name="recto.content"> <xsl:call-template name="bibliodiv.titlepage.before.recto"/> <xsl:call-template name="bibliodiv.titlepage.recto"/> </xsl:variable> <xsl:variable name="recto.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count > 0)"> <fo:block><xsl:copy-of select="$recto.content"/></fo:block> </xsl:if> <xsl:variable name="verso.content"> <xsl:call-template name="bibliodiv.titlepage.before.verso"/> <xsl:call-template name="bibliodiv.titlepage.verso"/> </xsl:variable> <xsl:variable name="verso.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count > 0)"> <fo:block><xsl:copy-of select="$verso.content"/></fo:block> </xsl:if> <xsl:call-template name="bibliodiv.titlepage.separator"/> </fo:block> </xsl:template> <xsl:template match="*" mode="bibliodiv.titlepage.recto.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="*" mode="bibliodiv.titlepage.verso.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="title" mode="bibliodiv.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="bibliodiv.titlepage.recto.style" margin-left="{$title.margin.left}" font-size="20.736pt" font-family="{$title.fontset}" font-weight="bold"> <xsl:call-template name="component.title"> <xsl:with-param name="node" select="ancestor-or-self::bibliodiv[1]"/> </xsl:call-template> </fo:block> </xsl:template> <xsl:template match="subtitle" mode="bibliodiv.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="bibliodiv.titlepage.recto.style" font-family="{$title.fontset}"> <xsl:apply-templates select="." mode="bibliodiv.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template name="glossary.titlepage.recto"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="glossary.titlepage.recto.style" margin-left="{$title.margin.left}" font-size="24.8832pt" font-family="{$title.fontset}" font-weight="bold"> <xsl:call-template name="component.title"> <xsl:with-param name="node" select="ancestor-or-self::glossary[1]"/> </xsl:call-template></fo:block> <xsl:choose> <xsl:when test="glossaryinfo/subtitle"> <xsl:apply-templates mode="glossary.titlepage.recto.auto.mode" select="glossaryinfo/subtitle"/> </xsl:when> <xsl:when test="docinfo/subtitle"> <xsl:apply-templates mode="glossary.titlepage.recto.auto.mode" select="docinfo/subtitle"/> </xsl:when> <xsl:when test="info/subtitle"> <xsl:apply-templates mode="glossary.titlepage.recto.auto.mode" select="info/subtitle"/> </xsl:when> <xsl:when test="subtitle"> <xsl:apply-templates mode="glossary.titlepage.recto.auto.mode" select="subtitle"/> </xsl:when> </xsl:choose> </xsl:template> <xsl:template name="glossary.titlepage.verso"> </xsl:template> <xsl:template name="glossary.titlepage.separator"> </xsl:template> <xsl:template name="glossary.titlepage.before.recto"> </xsl:template> <xsl:template name="glossary.titlepage.before.verso"> </xsl:template> <xsl:template name="glossary.titlepage"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format"> <xsl:variable name="recto.content"> <xsl:call-template name="glossary.titlepage.before.recto"/> <xsl:call-template name="glossary.titlepage.recto"/> </xsl:variable> <xsl:variable name="recto.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count > 0)"> <fo:block><xsl:copy-of select="$recto.content"/></fo:block> </xsl:if> <xsl:variable name="verso.content"> <xsl:call-template name="glossary.titlepage.before.verso"/> <xsl:call-template name="glossary.titlepage.verso"/> </xsl:variable> <xsl:variable name="verso.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count > 0)"> <fo:block><xsl:copy-of select="$verso.content"/></fo:block> </xsl:if> <xsl:call-template name="glossary.titlepage.separator"/> </fo:block> </xsl:template> <xsl:template match="*" mode="glossary.titlepage.recto.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="*" mode="glossary.titlepage.verso.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="subtitle" mode="glossary.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="glossary.titlepage.recto.style" font-family="{$title.fontset}"> <xsl:apply-templates select="." mode="glossary.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template name="glossdiv.titlepage.recto"> <xsl:choose> <xsl:when test="glossdivinfo/title"> <xsl:apply-templates mode="glossdiv.titlepage.recto.auto.mode" select="glossdivinfo/title"/> </xsl:when> <xsl:when test="docinfo/title"> <xsl:apply-templates mode="glossdiv.titlepage.recto.auto.mode" select="docinfo/title"/> </xsl:when> <xsl:when test="info/title"> <xsl:apply-templates mode="glossdiv.titlepage.recto.auto.mode" select="info/title"/> </xsl:when> <xsl:when test="title"> <xsl:apply-templates mode="glossdiv.titlepage.recto.auto.mode" select="title"/> </xsl:when> </xsl:choose> <xsl:choose> <xsl:when test="glossdivinfo/subtitle"> <xsl:apply-templates mode="glossdiv.titlepage.recto.auto.mode" select="glossdivinfo/subtitle"/> </xsl:when> <xsl:when test="docinfo/subtitle"> <xsl:apply-templates mode="glossdiv.titlepage.recto.auto.mode" select="docinfo/subtitle"/> </xsl:when> <xsl:when test="info/subtitle"> <xsl:apply-templates mode="glossdiv.titlepage.recto.auto.mode" select="info/subtitle"/> </xsl:when> <xsl:when test="subtitle"> <xsl:apply-templates mode="glossdiv.titlepage.recto.auto.mode" select="subtitle"/> </xsl:when> </xsl:choose> </xsl:template> <xsl:template name="glossdiv.titlepage.verso"> </xsl:template> <xsl:template name="glossdiv.titlepage.separator"> </xsl:template> <xsl:template name="glossdiv.titlepage.before.recto"> </xsl:template> <xsl:template name="glossdiv.titlepage.before.verso"> </xsl:template> <xsl:template name="glossdiv.titlepage"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format"> <xsl:variable name="recto.content"> <xsl:call-template name="glossdiv.titlepage.before.recto"/> <xsl:call-template name="glossdiv.titlepage.recto"/> </xsl:variable> <xsl:variable name="recto.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count > 0)"> <fo:block><xsl:copy-of select="$recto.content"/></fo:block> </xsl:if> <xsl:variable name="verso.content"> <xsl:call-template name="glossdiv.titlepage.before.verso"/> <xsl:call-template name="glossdiv.titlepage.verso"/> </xsl:variable> <xsl:variable name="verso.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count > 0)"> <fo:block><xsl:copy-of select="$verso.content"/></fo:block> </xsl:if> <xsl:call-template name="glossdiv.titlepage.separator"/> </fo:block> </xsl:template> <xsl:template match="*" mode="glossdiv.titlepage.recto.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="*" mode="glossdiv.titlepage.verso.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="title" mode="glossdiv.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="glossdiv.titlepage.recto.style" margin-left="{$title.margin.left}" font-size="20.736pt" font-family="{$title.fontset}" font-weight="bold"> <xsl:call-template name="component.title"> <xsl:with-param name="node" select="ancestor-or-self::glossdiv[1]"/> </xsl:call-template> </fo:block> </xsl:template> <xsl:template match="subtitle" mode="glossdiv.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="glossdiv.titlepage.recto.style" font-family="{$title.fontset}"> <xsl:apply-templates select="." mode="glossdiv.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template name="index.titlepage.recto"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="index.titlepage.recto.style" margin-left="0pt" font-size="24.8832pt" font-family="{$title.fontset}" font-weight="bold"> <xsl:call-template name="component.title"> <xsl:with-param name="node" select="ancestor-or-self::index[1]"/> <xsl:with-param name="pagewide" select="1"/> </xsl:call-template></fo:block> <xsl:choose> <xsl:when test="indexinfo/subtitle"> <xsl:apply-templates mode="index.titlepage.recto.auto.mode" select="indexinfo/subtitle"/> </xsl:when> <xsl:when test="docinfo/subtitle"> <xsl:apply-templates mode="index.titlepage.recto.auto.mode" select="docinfo/subtitle"/> </xsl:when> <xsl:when test="info/subtitle"> <xsl:apply-templates mode="index.titlepage.recto.auto.mode" select="info/subtitle"/> </xsl:when> <xsl:when test="subtitle"> <xsl:apply-templates mode="index.titlepage.recto.auto.mode" select="subtitle"/> </xsl:when> </xsl:choose> </xsl:template> <xsl:template name="index.titlepage.verso"> </xsl:template> <xsl:template name="index.titlepage.separator"> </xsl:template> <xsl:template name="index.titlepage.before.recto"> </xsl:template> <xsl:template name="index.titlepage.before.verso"> </xsl:template> <xsl:template name="index.titlepage"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format"> <xsl:variable name="recto.content"> <xsl:call-template name="index.titlepage.before.recto"/> <xsl:call-template name="index.titlepage.recto"/> </xsl:variable> <xsl:variable name="recto.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count > 0)"> <fo:block><xsl:copy-of select="$recto.content"/></fo:block> </xsl:if> <xsl:variable name="verso.content"> <xsl:call-template name="index.titlepage.before.verso"/> <xsl:call-template name="index.titlepage.verso"/> </xsl:variable> <xsl:variable name="verso.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count > 0)"> <fo:block><xsl:copy-of select="$verso.content"/></fo:block> </xsl:if> <xsl:call-template name="index.titlepage.separator"/> </fo:block> </xsl:template> <xsl:template match="*" mode="index.titlepage.recto.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="*" mode="index.titlepage.verso.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="subtitle" mode="index.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="index.titlepage.recto.style" font-family="{$title.fontset}"> <xsl:apply-templates select="." mode="index.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template name="indexdiv.titlepage.recto"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="indexdiv.titlepage.recto.style"> <xsl:call-template name="indexdiv.title"> <xsl:with-param name="title" select="title"/> </xsl:call-template></fo:block> <xsl:choose> <xsl:when test="indexdivinfo/subtitle"> <xsl:apply-templates mode="indexdiv.titlepage.recto.auto.mode" select="indexdivinfo/subtitle"/> </xsl:when> <xsl:when test="docinfo/subtitle"> <xsl:apply-templates mode="indexdiv.titlepage.recto.auto.mode" select="docinfo/subtitle"/> </xsl:when> <xsl:when test="info/subtitle"> <xsl:apply-templates mode="indexdiv.titlepage.recto.auto.mode" select="info/subtitle"/> </xsl:when> <xsl:when test="subtitle"> <xsl:apply-templates mode="indexdiv.titlepage.recto.auto.mode" select="subtitle"/> </xsl:when> </xsl:choose> </xsl:template> <xsl:template name="indexdiv.titlepage.verso"> </xsl:template> <xsl:template name="indexdiv.titlepage.separator"> </xsl:template> <xsl:template name="indexdiv.titlepage.before.recto"> </xsl:template> <xsl:template name="indexdiv.titlepage.before.verso"> </xsl:template> <xsl:template name="indexdiv.titlepage"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format"> <xsl:variable name="recto.content"> <xsl:call-template name="indexdiv.titlepage.before.recto"/> <xsl:call-template name="indexdiv.titlepage.recto"/> </xsl:variable> <xsl:variable name="recto.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count > 0)"> <fo:block><xsl:copy-of select="$recto.content"/></fo:block> </xsl:if> <xsl:variable name="verso.content"> <xsl:call-template name="indexdiv.titlepage.before.verso"/> <xsl:call-template name="indexdiv.titlepage.verso"/> </xsl:variable> <xsl:variable name="verso.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count > 0)"> <fo:block><xsl:copy-of select="$verso.content"/></fo:block> </xsl:if> <xsl:call-template name="indexdiv.titlepage.separator"/> </fo:block> </xsl:template> <xsl:template match="*" mode="indexdiv.titlepage.recto.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="*" mode="indexdiv.titlepage.verso.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="subtitle" mode="indexdiv.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="indexdiv.titlepage.recto.style" font-family="{$title.fontset}"> <xsl:apply-templates select="." mode="indexdiv.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template name="setindex.titlepage.recto"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="setindex.titlepage.recto.style" margin-left="0pt" font-size="24.8832pt" font-family="{$title.fontset}" font-weight="bold"> <xsl:call-template name="component.title"> <xsl:with-param name="node" select="ancestor-or-self::setindex[1]"/> <xsl:with-param name="pagewide" select="1"/> </xsl:call-template></fo:block> <xsl:choose> <xsl:when test="setindexinfo/subtitle"> <xsl:apply-templates mode="setindex.titlepage.recto.auto.mode" select="setindexinfo/subtitle"/> </xsl:when> <xsl:when test="docinfo/subtitle"> <xsl:apply-templates mode="setindex.titlepage.recto.auto.mode" select="docinfo/subtitle"/> </xsl:when> <xsl:when test="info/subtitle"> <xsl:apply-templates mode="setindex.titlepage.recto.auto.mode" select="info/subtitle"/> </xsl:when> <xsl:when test="subtitle"> <xsl:apply-templates mode="setindex.titlepage.recto.auto.mode" select="subtitle"/> </xsl:when> </xsl:choose> </xsl:template> <xsl:template name="setindex.titlepage.verso"> </xsl:template> <xsl:template name="setindex.titlepage.separator"> </xsl:template> <xsl:template name="setindex.titlepage.before.recto"> </xsl:template> <xsl:template name="setindex.titlepage.before.verso"> </xsl:template> <xsl:template name="setindex.titlepage"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format"> <xsl:variable name="recto.content"> <xsl:call-template name="setindex.titlepage.before.recto"/> <xsl:call-template name="setindex.titlepage.recto"/> </xsl:variable> <xsl:variable name="recto.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count > 0)"> <fo:block><xsl:copy-of select="$recto.content"/></fo:block> </xsl:if> <xsl:variable name="verso.content"> <xsl:call-template name="setindex.titlepage.before.verso"/> <xsl:call-template name="setindex.titlepage.verso"/> </xsl:variable> <xsl:variable name="verso.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count > 0)"> <fo:block><xsl:copy-of select="$verso.content"/></fo:block> </xsl:if> <xsl:call-template name="setindex.titlepage.separator"/> </fo:block> </xsl:template> <xsl:template match="*" mode="setindex.titlepage.recto.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="*" mode="setindex.titlepage.verso.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="subtitle" mode="setindex.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="setindex.titlepage.recto.style" font-family="{$title.fontset}"> <xsl:apply-templates select="." mode="setindex.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template name="colophon.titlepage.recto"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="colophon.titlepage.recto.style" margin-left="{$title.margin.left}" font-size="24.8832pt" font-family="{$title.fontset}" font-weight="bold"> <xsl:call-template name="component.title"> <xsl:with-param name="node" select="ancestor-or-self::colophon[1]"/> </xsl:call-template></fo:block> <xsl:choose> <xsl:when test="colophoninfo/subtitle"> <xsl:apply-templates mode="colophon.titlepage.recto.auto.mode" select="colophoninfo/subtitle"/> </xsl:when> <xsl:when test="docinfo/subtitle"> <xsl:apply-templates mode="colophon.titlepage.recto.auto.mode" select="docinfo/subtitle"/> </xsl:when> <xsl:when test="info/subtitle"> <xsl:apply-templates mode="colophon.titlepage.recto.auto.mode" select="info/subtitle"/> </xsl:when> <xsl:when test="subtitle"> <xsl:apply-templates mode="colophon.titlepage.recto.auto.mode" select="subtitle"/> </xsl:when> </xsl:choose> </xsl:template> <xsl:template name="colophon.titlepage.verso"> </xsl:template> <xsl:template name="colophon.titlepage.separator"> </xsl:template> <xsl:template name="colophon.titlepage.before.recto"> </xsl:template> <xsl:template name="colophon.titlepage.before.verso"> </xsl:template> <xsl:template name="colophon.titlepage"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format"> <xsl:variable name="recto.content"> <xsl:call-template name="colophon.titlepage.before.recto"/> <xsl:call-template name="colophon.titlepage.recto"/> </xsl:variable> <xsl:variable name="recto.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count > 0)"> <fo:block><xsl:copy-of select="$recto.content"/></fo:block> </xsl:if> <xsl:variable name="verso.content"> <xsl:call-template name="colophon.titlepage.before.verso"/> <xsl:call-template name="colophon.titlepage.verso"/> </xsl:variable> <xsl:variable name="verso.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count > 0)"> <fo:block><xsl:copy-of select="$verso.content"/></fo:block> </xsl:if> <xsl:call-template name="colophon.titlepage.separator"/> </fo:block> </xsl:template> <xsl:template match="*" mode="colophon.titlepage.recto.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="*" mode="colophon.titlepage.verso.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="subtitle" mode="colophon.titlepage.recto.auto.mode"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="colophon.titlepage.recto.style" font-family="{$title.fontset}"> <xsl:apply-templates select="." mode="colophon.titlepage.recto.mode"/> </fo:block> </xsl:template> <xsl:template name="table.of.contents.titlepage.recto"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="table.of.contents.titlepage.recto.style" space-before.minimum="1em" space-before.optimum="1.5em" space-before.maximum="2em" space-after="0.5em" margin-left="{$title.margin.left}" start-indent="0pt" font-size="17.28pt" font-weight="bold" font-family="{$title.fontset}"> <xsl:call-template name="gentext"> <xsl:with-param name="key" select="'TableofContents'"/> </xsl:call-template></fo:block> </xsl:template> <xsl:template name="table.of.contents.titlepage.verso"> </xsl:template> <xsl:template name="table.of.contents.titlepage.separator"> </xsl:template> <xsl:template name="table.of.contents.titlepage.before.recto"> </xsl:template> <xsl:template name="table.of.contents.titlepage.before.verso"> </xsl:template> <xsl:template name="table.of.contents.titlepage"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format"> <xsl:variable name="recto.content"> <xsl:call-template name="table.of.contents.titlepage.before.recto"/> <xsl:call-template name="table.of.contents.titlepage.recto"/> </xsl:variable> <xsl:variable name="recto.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count > 0)"> <fo:block><xsl:copy-of select="$recto.content"/></fo:block> </xsl:if> <xsl:variable name="verso.content"> <xsl:call-template name="table.of.contents.titlepage.before.verso"/> <xsl:call-template name="table.of.contents.titlepage.verso"/> </xsl:variable> <xsl:variable name="verso.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count > 0)"> <fo:block><xsl:copy-of select="$verso.content"/></fo:block> </xsl:if> <xsl:call-template name="table.of.contents.titlepage.separator"/> </fo:block> </xsl:template> <xsl:template match="*" mode="table.of.contents.titlepage.recto.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="*" mode="table.of.contents.titlepage.verso.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template name="list.of.tables.titlepage.recto"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="list.of.tables.titlepage.recto.style" space-before.minimum="1em" space-before.optimum="1.5em" space-before.maximum="2em" space-after="0.5em" margin-left="{$title.margin.left}" start-indent="0pt" font-size="17.28pt" font-weight="bold" font-family="{$title.fontset}"> <xsl:call-template name="gentext"> <xsl:with-param name="key" select="'ListofTables'"/> </xsl:call-template></fo:block> </xsl:template> <xsl:template name="list.of.tables.titlepage.verso"> </xsl:template> <xsl:template name="list.of.tables.titlepage.separator"> </xsl:template> <xsl:template name="list.of.tables.titlepage.before.recto"> </xsl:template> <xsl:template name="list.of.tables.titlepage.before.verso"> </xsl:template> <xsl:template name="list.of.tables.titlepage"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format"> <xsl:variable name="recto.content"> <xsl:call-template name="list.of.tables.titlepage.before.recto"/> <xsl:call-template name="list.of.tables.titlepage.recto"/> </xsl:variable> <xsl:variable name="recto.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count > 0)"> <fo:block><xsl:copy-of select="$recto.content"/></fo:block> </xsl:if> <xsl:variable name="verso.content"> <xsl:call-template name="list.of.tables.titlepage.before.verso"/> <xsl:call-template name="list.of.tables.titlepage.verso"/> </xsl:variable> <xsl:variable name="verso.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count > 0)"> <fo:block><xsl:copy-of select="$verso.content"/></fo:block> </xsl:if> <xsl:call-template name="list.of.tables.titlepage.separator"/> </fo:block> </xsl:template> <xsl:template match="*" mode="list.of.tables.titlepage.recto.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="*" mode="list.of.tables.titlepage.verso.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template name="list.of.figures.titlepage.recto"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="list.of.figures.titlepage.recto.style" space-before.minimum="1em" space-before.optimum="1.5em" space-before.maximum="2em" space-after="0.5em" margin-left="{$title.margin.left}" start-indent="0pt" font-size="17.28pt" font-weight="bold" font-family="{$title.fontset}"> <xsl:call-template name="gentext"> <xsl:with-param name="key" select="'ListofFigures'"/> </xsl:call-template></fo:block> </xsl:template> <xsl:template name="list.of.figures.titlepage.verso"> </xsl:template> <xsl:template name="list.of.figures.titlepage.separator"> </xsl:template> <xsl:template name="list.of.figures.titlepage.before.recto"> </xsl:template> <xsl:template name="list.of.figures.titlepage.before.verso"> </xsl:template> <xsl:template name="list.of.figures.titlepage"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format"> <xsl:variable name="recto.content"> <xsl:call-template name="list.of.figures.titlepage.before.recto"/> <xsl:call-template name="list.of.figures.titlepage.recto"/> </xsl:variable> <xsl:variable name="recto.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count > 0)"> <fo:block><xsl:copy-of select="$recto.content"/></fo:block> </xsl:if> <xsl:variable name="verso.content"> <xsl:call-template name="list.of.figures.titlepage.before.verso"/> <xsl:call-template name="list.of.figures.titlepage.verso"/> </xsl:variable> <xsl:variable name="verso.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count > 0)"> <fo:block><xsl:copy-of select="$verso.content"/></fo:block> </xsl:if> <xsl:call-template name="list.of.figures.titlepage.separator"/> </fo:block> </xsl:template> <xsl:template match="*" mode="list.of.figures.titlepage.recto.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="*" mode="list.of.figures.titlepage.verso.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template name="list.of.examples.titlepage.recto"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="list.of.examples.titlepage.recto.style" space-before.minimum="1em" space-before.optimum="1.5em" space-before.maximum="2em" space-after="0.5em" margin-left="{$title.margin.left}" start-indent="0pt" font-size="17.28pt" font-weight="bold" font-family="{$title.fontset}"> <xsl:call-template name="gentext"> <xsl:with-param name="key" select="'ListofExamples'"/> </xsl:call-template></fo:block> </xsl:template> <xsl:template name="list.of.examples.titlepage.verso"> </xsl:template> <xsl:template name="list.of.examples.titlepage.separator"> </xsl:template> <xsl:template name="list.of.examples.titlepage.before.recto"> </xsl:template> <xsl:template name="list.of.examples.titlepage.before.verso"> </xsl:template> <xsl:template name="list.of.examples.titlepage"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format"> <xsl:variable name="recto.content"> <xsl:call-template name="list.of.examples.titlepage.before.recto"/> <xsl:call-template name="list.of.examples.titlepage.recto"/> </xsl:variable> <xsl:variable name="recto.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count > 0)"> <fo:block><xsl:copy-of select="$recto.content"/></fo:block> </xsl:if> <xsl:variable name="verso.content"> <xsl:call-template name="list.of.examples.titlepage.before.verso"/> <xsl:call-template name="list.of.examples.titlepage.verso"/> </xsl:variable> <xsl:variable name="verso.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count > 0)"> <fo:block><xsl:copy-of select="$verso.content"/></fo:block> </xsl:if> <xsl:call-template name="list.of.examples.titlepage.separator"/> </fo:block> </xsl:template> <xsl:template match="*" mode="list.of.examples.titlepage.recto.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="*" mode="list.of.examples.titlepage.verso.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template name="list.of.equations.titlepage.recto"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="list.of.equations.titlepage.recto.style" space-before.minimum="1em" space-before.optimum="1.5em" space-before.maximum="2em" space-after="0.5em" margin-left="{$title.margin.left}" start-indent="0pt" font-size="17.28pt" font-weight="bold" font-family="{$title.fontset}"> <xsl:call-template name="gentext"> <xsl:with-param name="key" select="'ListofEquations'"/> </xsl:call-template></fo:block> </xsl:template> <xsl:template name="list.of.equations.titlepage.verso"> </xsl:template> <xsl:template name="list.of.equations.titlepage.separator"> </xsl:template> <xsl:template name="list.of.equations.titlepage.before.recto"> </xsl:template> <xsl:template name="list.of.equations.titlepage.before.verso"> </xsl:template> <xsl:template name="list.of.equations.titlepage"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format"> <xsl:variable name="recto.content"> <xsl:call-template name="list.of.equations.titlepage.before.recto"/> <xsl:call-template name="list.of.equations.titlepage.recto"/> </xsl:variable> <xsl:variable name="recto.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count > 0)"> <fo:block><xsl:copy-of select="$recto.content"/></fo:block> </xsl:if> <xsl:variable name="verso.content"> <xsl:call-template name="list.of.equations.titlepage.before.verso"/> <xsl:call-template name="list.of.equations.titlepage.verso"/> </xsl:variable> <xsl:variable name="verso.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count > 0)"> <fo:block><xsl:copy-of select="$verso.content"/></fo:block> </xsl:if> <xsl:call-template name="list.of.equations.titlepage.separator"/> </fo:block> </xsl:template> <xsl:template match="*" mode="list.of.equations.titlepage.recto.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="*" mode="list.of.equations.titlepage.verso.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template name="list.of.procedures.titlepage.recto"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="list.of.procedures.titlepage.recto.style" space-before.minimum="1em" space-before.optimum="1.5em" space-before.maximum="2em" space-after="0.5em" margin-left="{$title.margin.left}" start-indent="0pt" font-size="17.28pt" font-weight="bold" font-family="{$title.fontset}"> <xsl:call-template name="gentext"> <xsl:with-param name="key" select="'ListofProcedures'"/> </xsl:call-template></fo:block> </xsl:template> <xsl:template name="list.of.procedures.titlepage.verso"> </xsl:template> <xsl:template name="list.of.procedures.titlepage.separator"> </xsl:template> <xsl:template name="list.of.procedures.titlepage.before.recto"> </xsl:template> <xsl:template name="list.of.procedures.titlepage.before.verso"> </xsl:template> <xsl:template name="list.of.procedures.titlepage"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format"> <xsl:variable name="recto.content"> <xsl:call-template name="list.of.procedures.titlepage.before.recto"/> <xsl:call-template name="list.of.procedures.titlepage.recto"/> </xsl:variable> <xsl:variable name="recto.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count > 0)"> <fo:block><xsl:copy-of select="$recto.content"/></fo:block> </xsl:if> <xsl:variable name="verso.content"> <xsl:call-template name="list.of.procedures.titlepage.before.verso"/> <xsl:call-template name="list.of.procedures.titlepage.verso"/> </xsl:variable> <xsl:variable name="verso.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count > 0)"> <fo:block><xsl:copy-of select="$verso.content"/></fo:block> </xsl:if> <xsl:call-template name="list.of.procedures.titlepage.separator"/> </fo:block> </xsl:template> <xsl:template match="*" mode="list.of.procedures.titlepage.recto.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="*" mode="list.of.procedures.titlepage.verso.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template name="list.of.unknowns.titlepage.recto"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="list.of.unknowns.titlepage.recto.style" space-before.minimum="1em" space-before.optimum="1.5em" space-before.maximum="2em" space-after="0.5em" margin-left="{$title.margin.left}" start-indent="0pt" font-size="17.28pt" font-weight="bold" font-family="{$title.fontset}"> <xsl:call-template name="gentext"> <xsl:with-param name="key" select="'ListofUnknown'"/> </xsl:call-template></fo:block> </xsl:template> <xsl:template name="list.of.unknowns.titlepage.verso"> </xsl:template> <xsl:template name="list.of.unknowns.titlepage.separator"> </xsl:template> <xsl:template name="list.of.unknowns.titlepage.before.recto"> </xsl:template> <xsl:template name="list.of.unknowns.titlepage.before.verso"> </xsl:template> <xsl:template name="list.of.unknowns.titlepage"> <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format"> <xsl:variable name="recto.content"> <xsl:call-template name="list.of.unknowns.titlepage.before.recto"/> <xsl:call-template name="list.of.unknowns.titlepage.recto"/> </xsl:variable> <xsl:variable name="recto.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count > 0)"> <fo:block><xsl:copy-of select="$recto.content"/></fo:block> </xsl:if> <xsl:variable name="verso.content"> <xsl:call-template name="list.of.unknowns.titlepage.before.verso"/> <xsl:call-template name="list.of.unknowns.titlepage.verso"/> </xsl:variable> <xsl:variable name="verso.elements.count"> <xsl:choose> <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')"> <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count > 0)"> <fo:block><xsl:copy-of select="$verso.content"/></fo:block> </xsl:if> <xsl:call-template name="list.of.unknowns.titlepage.separator"/> </fo:block> </xsl:template> <xsl:template match="*" mode="list.of.unknowns.titlepage.recto.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> <xsl:template match="*" mode="list.of.unknowns.titlepage.verso.mode"> <!-- if an element isn't found in this mode, --> <!-- try the generic titlepage.mode --> <xsl:apply-templates select="." mode="titlepage.mode"/> </xsl:template> </xsl:stylesheet> ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refdb-1.0.2/doc/include/manual-fo.xsl���������������������������������������������������������������000644 �001750 �001750 �00000006327 11512721660 020252� 0����������������������������������������������������������������������������������������������������ustar�00markus��������������������������markus��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" version="1.0"> <!-- driver file for the transformation of the RefDB manual to fo. Most of the changes are related to adding some color to the output --> <xsl:import href="http://docbook.sourceforge.net/release/xsl/current/fo/docbook.xsl"/> <xsl:include href="fotitlepages.xsl"/> <xsl:attribute-set name="section.title.level1.properties"> <xsl:attribute name="color">#009900</xsl:attribute> </xsl:attribute-set> <xsl:attribute-set name="section.title.level2.properties"> <xsl:attribute name="color">green</xsl:attribute> </xsl:attribute-set> <xsl:attribute-set name="section.title.level3.properties"> <xsl:attribute name="color">#006600</xsl:attribute> </xsl:attribute-set> <xsl:template match="varlistentry" mode="vl.as.blocks"> <xsl:variable name="id"> <xsl:call-template name="object.id"/> </xsl:variable> <fo:block id="{$id}" xsl:use-attribute-sets="list.item.spacing" keep-together.within-column="always" keep-with-next.within-column="always" color="#990000"> <xsl:apply-templates select="term"/> </fo:block> <fo:block margin-left="0.25in"> <xsl:apply-templates select="listitem"/> </fo:block> </xsl:template> <xsl:template name="my.inline.monoseq"> <xsl:param name="color">black</xsl:param> <xsl:param name="content"> <xsl:apply-templates/> </xsl:param> <fo:inline xsl:use-attribute-sets="monospace.properties" color="{$color}"> <xsl:if test="@dir"> <xsl:attribute name="direction"> <xsl:choose> <xsl:when test="@dir = 'ltr' or @dir = 'lro'">ltr</xsl:when> <xsl:otherwise>rtl</xsl:otherwise> </xsl:choose> </xsl:attribute> </xsl:if> <xsl:copy-of select="$content"/> </fo:inline> </xsl:template> <xsl:template match="filename"> <xsl:call-template name="my.inline.monoseq"> <xsl:with-param name="color">#660099</xsl:with-param> </xsl:call-template> </xsl:template> <!-- some overrides of parameters defined in param.xsl --> <xsl:param name="paper.type" select="'A4'"/> <xsl:param name="section.autolabel" select="1"/> <xsl:param name="section.label.includes.component.label" select="1"/> <xsl:param name="fop.extensions" select="0"/> <xsl:param name="fop1.extensions" select="1"/> <xsl:param name="callout.unicode" select="1"/> <xsl:param name="callout.graphics" select="0"/> <xsl:param name="variablelist.as.blocks" select="1"/> <xsl:param name="graphic.default.extension" select="'svg'"/> <xsl:attribute-set name="admonition.title.properties"> <xsl:attribute name="font-family"><xsl:value-of select="$title.fontset"/></xsl:attribute> <xsl:attribute name="font-size">14pt</xsl:attribute> <xsl:attribute name="font-weight">bold</xsl:attribute> <xsl:attribute name="hyphenate">false</xsl:attribute> <xsl:attribute name="keep-with-next.within-column">always</xsl:attribute> </xsl:attribute-set> </xsl:stylesheet> ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refdb-1.0.2/doc/include/manual-man.xsl��������������������������������������������������������������000644 �001750 �001750 �00000004045 11512721660 020414� 0����������������������������������������������������������������������������������������������������ustar�00markus��������������������������markus��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <!-- driver file for the transformation of the RefDB manual refentry sections to man pages. We only provide a rather simplistic rendering of tables here. --> <xsl:import href="http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl"/> <!-- the table and table/title templates are a workaround for two issues: 1) the default output contains the character #160 representing a non-breaking space. This leads to groff errors on some systems (seen e.g. on Debian) 2) the default output does not put the table title on a separate line, making the output somewhat hard on the eyes the downside of this poor-man's approach is that we lose automatic table numbering --> <xsl:template match="table|informaltable"> <xsl:message> <xsl:value-of select="substring($VERSION,3,2)"/> </xsl:message> <xsl:choose> <xsl:when test="substring($VERSION,3,2) >= 70"> <xsl:apply-templates select="." mode="to.tbl"> <xsl:with-param name="source" select="ancestor::refentry/refnamediv[1]/refname[1]"/> </xsl:apply-templates> </xsl:when> <xsl:otherwise> <xsl:apply-templates mode="to.pp"/> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template match="table/title" mode="to.pp"> <xsl:text> .PP \fBTable: </xsl:text> <xsl:apply-templates/> <xsl:text>\fR .PP </xsl:text> </xsl:template> <xsl:template match="tbody" mode="to.pp"> <xsl:apply-templates/> </xsl:template> <xsl:template match="entry" mode="to.pp"> <xsl:apply-templates/> <xsl:text> | </xsl:text> </xsl:template> <xsl:template match="row" mode="to.pp"> <xsl:text> .PP | </xsl:text> <xsl:apply-templates/> <xsl:text> .PP </xsl:text> </xsl:template> </xsl:stylesheet> �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������refdb-1.0.2/doc/include/manual-xhtml.xsl������������������������������������������������������������000644 �001750 �001750 �00000010565 11512721660 021001� 0����������������������������������������������������������������������������������������������������ustar�00markus��������������������������markus��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <!-- driver file for the transformation of the RefDB manual to xhtml. Most of the changes are related to properly integrating refentries into the output --> <xsl:import href="http://docbook.sourceforge.net/release/xsl/current/xhtml/chunk.xsl"/> <!-- the following templates add refentries to the chapter TOCs --> <xsl:template match="sect1" mode="toc"> <xsl:param name="toc-context" select="."/> <xsl:call-template name="subtoc"> <xsl:with-param name="toc-context" select="$toc-context"/> <xsl:with-param name="nodes" select="sect2|refentry |bridgehead[$bridgehead.in.toc != 0]"/> </xsl:call-template> </xsl:template> <xsl:template match="sect2" mode="toc"> <xsl:param name="toc-context" select="."/> <xsl:call-template name="subtoc"> <xsl:with-param name="toc-context" select="$toc-context"/> <xsl:with-param name="nodes" select="sect3|refentry |bridgehead[$bridgehead.in.toc != 0]"/> </xsl:call-template> </xsl:template> <!-- add refsects and synopsis to the TOCs avoid duplicate refentrytitles --> <xsl:template match="refentry" mode="toc"> <xsl:param name="toc-context" select="."/> <xsl:variable name="refmeta" select=".//refmeta"/> <xsl:variable name="refentrytitle" select="$refmeta//refentrytitle"/> <xsl:variable name="refnamediv" select=".//refnamediv"/> <xsl:variable name="refname" select="$refnamediv//refname"/> <xsl:variable name="refdesc" select="$refnamediv//refdescriptor"/> <xsl:variable name="title"> <xsl:choose> <xsl:when test="$refentrytitle"> <xsl:apply-templates select="$refentrytitle[1]" mode="titleabbrev.markup"/> </xsl:when> <xsl:when test="$refdesc"> <xsl:apply-templates select="$refdesc" mode="titleabbrev.markup"/> </xsl:when> <xsl:when test="$refname"> <xsl:apply-templates select="$refname[1]" mode="titleabbrev.markup"/> </xsl:when> </xsl:choose> </xsl:variable> <xsl:call-template name="subtoc"> <xsl:with-param name="toc-context" select="$toc-context"/> <xsl:with-param name="nodes" select="refsect1 | refsect2 | refsect3"/> </xsl:call-template> </xsl:template> <xsl:template match="refsect1" mode="toc"> <xsl:param name="toc-context" select="."/> <xsl:call-template name="subtoc"> <xsl:with-param name="toc-context" select="$toc-context"/> <xsl:with-param name="nodes" select="refsect2"/> </xsl:call-template> </xsl:template> <xsl:template match="refsect2" mode="toc"> <xsl:param name="toc-context" select="."/> <xsl:call-template name="subtoc"> <xsl:with-param name="toc-context" select="$toc-context"/> <xsl:with-param name="nodes" select="refsect3"/> </xsl:call-template> </xsl:template> <xsl:template match="refsect3" mode="toc"> <xsl:param name="toc-context" select="."/> <xsl:call-template name="subtoc"> <xsl:with-param name="toc-context" select="$toc-context"/> <xsl:with-param name="nodes" select="refsect4"/> </xsl:call-template> </xsl:template> <!-- The title must be generated before passing it to the toc-generating code. This one causes a warning during the transformation which you can safely ignore as long as the result is correct --> <xsl:template match="refsynopsisdiv" mode="toc"> <xsl:param name="toc-context" select="."/> <xsl:variable name="title"> <xsl:call-template name="gentext"> <xsl:with-param name="key" select="'RefSynopsisDiv'"/> </xsl:call-template> </xsl:variable> <xsl:call-template name="subtoc"> <xsl:with-param name="toc-context" select="$toc-context"/> <xsl:with-param name="nodes" select="$title"/> </xsl:call-template> </xsl:template> <!-- some overrides of parameters defined in param.xsl --> <xsl:param name="html.stylesheet" select="'manual.css'"/> <xsl:param name="funcsynopsis.style" select="'ansi'"/> <xsl:param name="graphic.default.extension" select="'png'"/> </xsl:stylesheet> �������������������������������������������������������������������������������������������������������������������������������������������refdb-1.0.2/doc/xnote/ele-desc/���������������������������������������������������������������������000755 �001750 �001750 �00000000000 12303477605 017034� 5����������������������������������������������������������������������������������������������������ustar�00markus��������������������������markus��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������refdb-1.0.2/doc/xnote/dtdelem/����������������������������������������������������������������������000755 �001750 �001750 �00000000000 12303477605 016771� 5����������������������������������������������������������������������������������������������������ustar�00markus��������������������������markus��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������refdb-1.0.2/doc/xnote/elements/���������������������������������������������������������������������000755 �001750 �001750 �00000000000 12303477605 017167� 5����������������������������������������������������������������������������������������������������ustar�00markus��������������������������markus��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������refdb-1.0.2/doc/xnote/dtdelem.html������������������������������������������������������������������000644 �001750 �001750 �00000002213 12247746435 017664� 0����������������������������������������������������������������������������������������������������ustar�00markus��������������������������markus��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<HTML> <HEAD> <TITLE>xnote XML DTD: Elements
xnote XML DTD: DTD Element View [User Element View]
[Home]  

C | K | L | T | U | X

Top level element: xnoteset.

C

content

K

keyword

L

link

T

title

U

ulink

X

xnote
xnoteset


HTML Presentation of xnote XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/xnote/dtdent.html000644 001750 001750 00000001025 12247746435 017530 0ustar00markusmarkus000000 000000 xnote XML DTD: Entities
xnote XML DTD: DTD Entity View [User Entity View]
[Home] [Elements]  


HTML Presentation of xnote XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/xnote/elements.html000644 001750 001750 00000002222 12247746435 020062 0ustar00markusmarkus000000 000000 xnote XML DTD: Elements
xnote XML DTD: User Element View [DTD Element View]
[Home]  

C | K | L | T | U | X

Top level element: xnoteset.

C

content

K

keyword

L

link

T

title

U

ulink

X

xnote
xnoteset


HTML Presentation of xnote XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/xnote/entities.html000644 001750 001750 00000001024 12247746435 020071 0ustar00markusmarkus000000 000000 xnote XML DTD: Entities
xnote XML DTD: User Entity View [DTD Entity View]
[Home] [Elements]  


HTML Presentation of xnote XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/xnote/index.html000644 001750 001750 00000001200 12247746435 017350 0ustar00markusmarkus000000 000000 xnote XML DTD

xnote XML DTD

[Elements]

The xnote XML DTD is identified with:

  • The system identifier: "http://refdb.sourceforge.net/dtd/xnote.dtd"

It is composed of 7 elements, no entities, and no notations.

  • 7 elements
  • 0 entities
  • 0 notations

It claims to be an XML DTD. Element names are case sensitive. Entity names are case sensitive.


HTML Presentation of xnote XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/xnote/notations.html000644 001750 001750 00000000755 12247746435 020275 0ustar00markusmarkus000000 000000 xnote XML DTD: Notations
xnote XML DTD: Notation View  
[Home] [Elements]  


HTML Presentation of xnote XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/xnote/elements/content.html000644 001750 001750 00000004107 12247746435 021540 0ustar00markusmarkus000000 000000 xnote XML DTD: Element content
xnote XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Next]

Element content

Synopsis

Content Model

(ANY)

Attributes

Name Type Default Value
type CDATA None
xml:lang CDATA None

Description

The content element holds the note proper. This may be a string or markup.

The type attribute specifies the type of the note contents. This may e.g. be a namespace, the name of a DTD, or anything else which gives a hint to a processing application.

The xml:lang attribute denotes the language of the note contents.

Parents

xnote

Example

<xnote id="1" citekey="markus2005" date="2005-10-12" share="public">
<title>myfirstnote</title>
<content>The note text proper</content>
<keyword>biochemistry</keyword>
<keyword>enzymes</keyword>
<link type="reference" target="WANG2002"/>
<link type="reference" target="Phadke1994"/>
<link type="author" target="Walsh,N."/>
<link type="journalabbrev" target="Biochem.Pharmacol."/>
</xnote>
    

HTML Presentation of xnote XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/xnote/elements/keyword.html000644 001750 001750 00000003007 12247746435 021550 0ustar00markusmarkus000000 000000 xnote XML DTD: Element keyword
xnote XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element keyword

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

The keyword element holds a string that aids in categorizing the note.

Parents

xnote

Example

<xnote id="1" citekey="markus2005" date="2005-10-12" share="public">
<title>myfirstnote</title>
<content>The note text proper</content>
<keyword>biochemistry</keyword>
<keyword>enzymes</keyword>
<link type="reference" target="WANG2002"/>
<link type="reference" target="Phadke1994"/>
<link type="author" target="Walsh,N."/>
<link type="journalabbrev" target="Biochem.Pharmacol."/>
</xnote>
    

HTML Presentation of xnote XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/xnote/elements/link.html000644 001750 001750 00000004337 12247746435 021030 0ustar00markusmarkus000000 000000 xnote XML DTD: Element link
xnote XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element link

Synopsis

Content Model

EMPTY

Attributes

Name Type Default Value
target CDATA Required
type Enumeration:
  author
  journalabbrev
  journalcustabbrev1
  journalcustabbrev2
  journalfull
  keyword
  reference
  refid
Required

Description

The link element specifies the name of an author, of a keyword, the title of a periodical, or a reference by means of the target attribute. The type attribute selects which database object the note is attached to.

Parents

xnote

Example

<xnote id="1" citekey="markus2005" date="2005-10-12" share="public">
<title>myfirstnote</title>
<content>The note text proper</content>
<keyword>biochemistry</keyword>
<keyword>enzymes</keyword>
<link type="reference" target="WANG2002"/>
<link type="reference" target="Phadke1994"/>
<link type="author" target="Walsh,N."/>
<link type="journalabbrev" target="Biochem.Pharmacol."/>
</xnote>
    

HTML Presentation of xnote XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/xnote/elements/title.html000644 001750 001750 00000002760 12247746435 021212 0ustar00markusmarkus000000 000000 xnote XML DTD: Element title
xnote XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element title

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

The title element holds the optional title of the note.

Parents

xnote

Example

<xnote id="1" citekey="markus2005" date="2005-10-12" share="public">
<title>myfirstnote</title>
<content>The note text proper</content>
<keyword>biochemistry</keyword>
<keyword>enzymes</keyword>
<link type="reference" target="WANG2002"/>
<link type="reference" target="Phadke1994"/>
<link type="author" target="Walsh,N."/>
<link type="journalabbrev" target="Biochem.Pharmacol."/>
</xnote>
    

HTML Presentation of xnote XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/xnote/elements/ulink.html000644 001750 001750 00000004162 12247746435 021211 0ustar00markusmarkus000000 000000 xnote XML DTD: Element ulink
xnote XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element ulink

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

Name Type Default Value
type Enumeration:
  fulltext
  image
  pdf
  related
  url
"url"

Description

The ulink element contains an URL of a resource.

The type attribute further specifies the URL, indicating whether it points to a PDF file, to the full text of some article, to related material, to an image, or something else.

Parents

xnote

Example

<xnote id="1" citekey="markus2005" date="2005-10-12" share="public">
<title>myfirstnote</title>
<content>The note text proper</content>
<keyword>biochemistry</keyword>
<keyword>enzymes</keyword>
<link type="reference" target="WANG2002"/>
<link type="reference" target="Phadke1994"/>
<link type="author" target="Walsh,N."/>
<link type="journalabbrev" target="Biochem.Pharmacol."/>
<ulink type="pdf">http://dot.com/foo.pdf</ulink>
<ulink type="image">http://dot.com/geewhiz.jpg</ulink>
</xnote>
    

HTML Presentation of xnote XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/xnote/elements/xnote.html000644 001750 001750 00000006257 12247746435 021233 0ustar00markusmarkus000000 000000 xnote XML DTD: Element xnote
xnote XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element xnote

Synopsis

Content Model

(title?,content?,keyword*,link*,ulink*)

Attributes

Name Type Default Value
share Enumeration:
  private
  public
None
date NMTOKEN None
user NMTOKEN None
id NMTOKEN None
citekey NMTOKEN None

Description

The xnote element holds one extended note, being a wrapper for the note text, a title, keywords, and links to other database objects.

The id attribute specifies the reference ID as generated by RefDB.

The citekey attribute specifies the note citation key. This is a unique string which unambiguously identifies the note in the database.

The user attribute specifies the user who added the note.

The date attribute holds the date of the note in ISO notation (YYYY-MM-DD).

The share attribute specifies whether the note should be public or private.

Parents

xnoteset

Children

content, keyword, link, title, ulink

Example

<xnote id="1" citekey="markus2005" date="2005-10-12" share="public">
<title>myfirstnote</title>
<content>The note text proper</content>
<keyword>biochemistry</keyword>
<keyword>enzymes</keyword>
<link type="reference" target="WANG2002"/>
<link type="reference" target="Phadke1994"/>
<link type="author" target="Walsh,N."/>
<link type="journalabbrev" target="Biochem.Pharmacol."/>
</xnote>
    

HTML Presentation of xnote XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/xnote/elements/xnoteset.html000644 001750 001750 00000003407 12247746435 021741 0ustar00markusmarkus000000 000000 xnote XML DTD: Element xnoteset
xnote XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev]

Element xnoteset

Synopsis

Content Model

(xnote)+

Attributes

Name Type Default Value
xmlns CDATA "http://refdb.sourceforge.net/namespaces/xnote" (fixed)

Description

xnoteset is a wrapper for one or more xnote elements. The namespace is "http://refdb.sourceforge.net/namespaces/xnote".

Children

xnote

Example

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xnoteset PUBLIC "-//Markus Hoenicka//DTD Xnote V1.2//EN" "http://refdb.sourceforge.net/dtd/xnote-1.2/xnote.dtd" [
<!ENTITY lt "&#60;">
<!ENTITY gt ">">
<!ENTITY amp "&#38;">
]>
<xnoteset xmlns="http://refdb.sourceforge.net/namespaces/xnote">
<xnote>
...
</xnote>
<xnote>
...
</xnote>
</xnoteset>
    

HTML Presentation of xnote XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/xnote/dtdelem/content.html000644 001750 001750 00000002157 12247746435 021345 0ustar00markusmarkus000000 000000 xnote XML DTD: Element content
xnote XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Next]

Element content

Synopsis

Content Model

(ANY)

Attributes

NameTypeDefault Value
type CDATA None
xml:lang CDATA None

Description

Parents

xnote


HTML Presentation of xnote XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/xnote/dtdelem/keyword.html000644 001750 001750 00000001463 12247746435 021356 0ustar00markusmarkus000000 000000 xnote XML DTD: Element keyword
xnote XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element keyword

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

Parents

xnote


HTML Presentation of xnote XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/xnote/dtdelem/link.html000644 001750 001750 00000002567 12247746435 020635 0ustar00markusmarkus000000 000000 xnote XML DTD: Element link
xnote XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element link

Synopsis

Content Model

EMPTY

Attributes

NameTypeDefault Value
target CDATA Required
type Enumeration:
  author
  journalabbrev
  journalcustabbrev1
  journalcustabbrev2
  journalfull
  keyword
  reference
  refid
Required

Description

Parents

xnote


HTML Presentation of xnote XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/xnote/dtdelem/title.html000644 001750 001750 00000001453 12247746435 021012 0ustar00markusmarkus000000 000000 xnote XML DTD: Element title
xnote XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element title

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

Parents

xnote


HTML Presentation of xnote XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/xnote/dtdelem/ulink.html000644 001750 001750 00000002170 12247746435 021010 0ustar00markusmarkus000000 000000 xnote XML DTD: Element ulink
xnote XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element ulink

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

NameTypeDefault Value
type Enumeration:
  fulltext
  image
  pdf
  related
  url
"url"

Description

Parents

xnote


HTML Presentation of xnote XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/xnote/dtdelem/xnote.html000644 001750 001750 00000003723 12247746435 021030 0ustar00markusmarkus000000 000000 xnote XML DTD: Element xnote
xnote XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element xnote

Synopsis

Content Model

(title?,content?,keyword*,link*,ulink*)

Attributes

NameTypeDefault Value
share Enumeration:
  private
  public
None
date NMTOKEN None
user NMTOKEN None
id NMTOKEN None
citekey NMTOKEN None

Description

Parents

xnoteset

Children

content, keyword, link, title, ulink


HTML Presentation of xnote XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/xnote/dtdelem/xnoteset.html000644 001750 001750 00000002062 12247746435 021537 0ustar00markusmarkus000000 000000 xnote XML DTD: Element xnoteset
xnote XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev]

Element xnoteset

Synopsis

Content Model

(xnote)+

Attributes

NameTypeDefault Value
xmlns CDATA "http://refdb.sourceforge.net/namespaces/xnote" (fixed)

Description

Children

xnote


HTML Presentation of xnote XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/xnote/ele-desc/content.html000644 001750 001750 00000002047 11512721661 021372 0ustar00markusmarkus000000 000000 CONTENT description

Description

The content element holds the note proper. This may be a string or markup.

The type attribute specifies the type of the note contents. This may e.g. be a namespace, the name of a DTD, or anything else which gives a hint to a processing application.

The xml:lang attribute denotes the language of the note contents.

Example

<xnote id="1" citekey="markus2005" date="2005-10-12" share="public">
<title>myfirstnote</title>
<content>The note text proper</content>
<keyword>biochemistry</keyword>
<keyword>enzymes</keyword>
<link type="reference" target="WANG2002"/>
<link type="reference" target="Phadke1994"/>
<link type="author" target="Walsh,N."/>
<link type="journalabbrev" target="Biochem.Pharmacol."/>
</xnote>
    
refdb-1.0.2/doc/xnote/ele-desc/keyword.html000644 001750 001750 00000001435 11512721661 021404 0ustar00markusmarkus000000 000000 KEYWORD description

Description

The keyword element holds a string that aids in categorizing the note.

Example

<xnote id="1" citekey="markus2005" date="2005-10-12" share="public">
<title>myfirstnote</title>
<content>The note text proper</content>
<keyword>biochemistry</keyword>
<keyword>enzymes</keyword>
<link type="reference" target="WANG2002"/>
<link type="reference" target="Phadke1994"/>
<link type="author" target="Walsh,N."/>
<link type="journalabbrev" target="Biochem.Pharmacol."/>
</xnote>
    
refdb-1.0.2/doc/xnote/ele-desc/link.html000644 001750 001750 00000001651 11512721661 020655 0ustar00markusmarkus000000 000000 LINK description

Description

The link element specifies the name of an author, of a keyword, the title of a periodical, or a reference by means of the target attribute. The type attribute selects which database object the note is attached to.

Example

<xnote id="1" citekey="markus2005" date="2005-10-12" share="public">
<title>myfirstnote</title>
<content>The note text proper</content>
<keyword>biochemistry</keyword>
<keyword>enzymes</keyword>
<link type="reference" target="WANG2002"/>
<link type="reference" target="Phadke1994"/>
<link type="author" target="Walsh,N."/>
<link type="journalabbrev" target="Biochem.Pharmacol."/>
</xnote>
    
refdb-1.0.2/doc/xnote/ele-desc/title.html000644 001750 001750 00000001414 11512721661 021036 0ustar00markusmarkus000000 000000 TITLE description

Description

The title element holds the optional title of the note.

Example

<xnote id="1" citekey="markus2005" date="2005-10-12" share="public">
<title>myfirstnote</title>
<content>The note text proper</content>
<keyword>biochemistry</keyword>
<keyword>enzymes</keyword>
<link type="reference" target="WANG2002"/>
<link type="reference" target="Phadke1994"/>
<link type="author" target="Walsh,N."/>
<link type="journalabbrev" target="Biochem.Pharmacol."/>
</xnote>
    
refdb-1.0.2/doc/xnote/ele-desc/ulink.html000644 001750 001750 00000002111 11512721661 021032 0ustar00markusmarkus000000 000000 ULINK description

Description

The ulink element contains an URL of a resource.

The type attribute further specifies the URL, indicating whether it points to a PDF file, to the full text of some article, to related material, to an image, or something else.

Example

<xnote id="1" citekey="markus2005" date="2005-10-12" share="public">
<title>myfirstnote</title>
<content>The note text proper</content>
<keyword>biochemistry</keyword>
<keyword>enzymes</keyword>
<link type="reference" target="WANG2002"/>
<link type="reference" target="Phadke1994"/>
<link type="author" target="Walsh,N."/>
<link type="journalabbrev" target="Biochem.Pharmacol."/>
<ulink type="pdf">http://dot.com/foo.pdf</ulink>
<ulink type="image">http://dot.com/geewhiz.jpg</ulink>
</xnote>
    
refdb-1.0.2/doc/xnote/ele-desc/xnote.html000644 001750 001750 00000002456 11512721661 021061 0ustar00markusmarkus000000 000000 XNOTE description

Description

The xnote element holds one extended note, being a wrapper for the note text, a title, keywords, and links to other database objects.

The id attribute specifies the reference ID as generated by RefDB.

The citekey attribute specifies the note citation key. This is a unique string which unambiguously identifies the note in the database.

The user attribute specifies the user who added the note.

The date attribute holds the date of the note in ISO notation (YYYY-MM-DD).

The share attribute specifies whether the note should be public or private.

Example

<xnote id="1" citekey="markus2005" date="2005-10-12" share="public">
<title>myfirstnote</title>
<content>The note text proper</content>
<keyword>biochemistry</keyword>
<keyword>enzymes</keyword>
<link type="reference" target="WANG2002"/>
<link type="reference" target="Phadke1994"/>
<link type="author" target="Walsh,N."/>
<link type="journalabbrev" target="Biochem.Pharmacol."/>
</xnote>
    
refdb-1.0.2/doc/xnote/ele-desc/xnoteset.html000644 001750 001750 00000001427 11512721661 021572 0ustar00markusmarkus000000 000000 XNOTESET description

Description

xnoteset is a wrapper for one or more xnote elements. The namespace is "http://refdb.sourceforge.net/namespaces/xnote".

Example

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xnoteset PUBLIC "-//Markus Hoenicka//DTD Xnote V1.2//EN" "http://refdb.sourceforge.net/dtd/xnote-1.2/xnote.dtd" [
<!ENTITY lt "&#60;">
<!ENTITY gt ">">
<!ENTITY amp "&#38;">
]>
<xnoteset xmlns="http://refdb.sourceforge.net/namespaces/xnote">
<xnote>
...
</xnote>
<xnote>
...
</xnote>
</xnoteset>
    
refdb-1.0.2/doc/risx/ele-desc/000755 001750 001750 00000000000 12303477605 016664 5ustar00markusmarkus000000 000000 refdb-1.0.2/doc/risx/dtdelem/000755 001750 001750 00000000000 12303477605 016621 5ustar00markusmarkus000000 000000 refdb-1.0.2/doc/risx/elements/000755 001750 001750 00000000000 12303477605 017017 5ustar00markusmarkus000000 000000 refdb-1.0.2/doc/risx/dtdelem.html000644 001750 001750 00000006123 12247746434 017517 0ustar00markusmarkus000000 000000 risx XML DTD: Elements
risx XML DTD: DTD Element View [User Element View]
[Home]  

A | C | D | E | F | I | K | L | M | N | O | P | R | S | T | U | V | Y

Top level element: ris.

A

abstract
address
author
availability

C

city
conftitle
contents

D

date
day

E

endpage
entry

F

firstname

I

issue

K

keyword

L

lastname
libinfo
link

M

middlename
misc
month

N

name
notes

O

otherinfo

P

part
pubdate
pubinfo
publication
publisher

R

reprint
ris

S

serial
set
startpage
suffix

T

title

U

userdef

V

volume

Y

year


HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/dtdent.html000644 001750 001750 00000001022 12247746434 017354 0ustar00markusmarkus000000 000000 risx XML DTD: Entities
risx XML DTD: DTD Entity View [User Entity View]
[Home] [Elements]  


HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/elements.html000644 001750 001750 00000006171 12247746434 017720 0ustar00markusmarkus000000 000000 risx XML DTD: Elements
risx XML DTD: User Element View [DTD Element View]
[Home]  

A | C | D | E | F | I | K | L | M | N | O | P | R | S | T | U | V | Y

Top level element: ris.

A

abstract
address
author
availability

C

city
conftitle
contents

D

date
day

E

endpage
entry

F

firstname

I

issue

K

keyword

L

lastname
libinfo
link

M

middlename
misc
month

N

name
notes

O

otherinfo

P

part
pubdate
pubinfo
publication
publisher

R

reprint
ris

S

serial
set
startpage
suffix

T

title

U

userdef

V

volume

Y

year


HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/entities.html000644 001750 001750 00000001021 12247746434 017715 0ustar00markusmarkus000000 000000 risx XML DTD: Entities
risx XML DTD: User Entity View [DTD Entity View]
[Home] [Elements]  


HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/index.html000644 001750 001750 00000001175 12247746434 017212 0ustar00markusmarkus000000 000000 risx XML DTD

risx XML DTD

[Elements]

The risx XML DTD is identified with:

  • The system identifier: "http://refdb.sourceforge.net/dtd/risx.dtd"

It is composed of 38 elements, no entities, and no notations.

  • 38 elements
  • 0 entities
  • 0 notations

It claims to be an XML DTD. Element names are case sensitive. Entity names are case sensitive.


HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/notations.html000644 001750 001750 00000000752 12247746434 020121 0ustar00markusmarkus000000 000000 risx XML DTD: Notations
risx XML DTD: Notation View  
[Home] [Elements]  


HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/elements/abstract.html000644 001750 001750 00000002561 12247746434 021522 0ustar00markusmarkus000000 000000 risx XML DTD: Element abstract
risx XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Next]

Element abstract

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

The abstract element contains an abstract of the reference. Articles published in scientific journals usually contain abstracts. For books, the liner or backcover texts might just be fine.

Parents

contents

Example

<contents>
<abstract>Dinosaurs were big animals that ate a lot</abstract>
<keyword>dinosaurs</keyword>
<keyword>evolution</keyword>
<keyword>animals</keyword>
</contents>
    

HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/elements/address.html000644 001750 001750 00000002743 12247746434 021346 0ustar00markusmarkus000000 000000 risx XML DTD: Element address
risx XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element address

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

The address element contains a string with whatever information is available to contact the author of a publication.

Parents

pubinfo

Example

<pubinfo>
<pubdate type="primary">
<date>
<year>1999</year>
</date>
</pubdate>
<city>Sebastopol</city>
<publisher>O'Reilly</publisher>
<serial>1-56592-580-7</serial>
<address>millera@dinosaurs.upenn.edu</address>
<link type="url">http://www.dinosaurs.upenn.edu/</url>
</pubinfo>
    

HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/elements/author.html000644 001750 001750 00000005647 12247746434 021231 0ustar00markusmarkus000000 000000 risx XML DTD: Element author
risx XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element author

Synopsis

Content Model

(name|
 (lastname?,firstname?,middlename*,suffix?))

Attributes

Name Type Default Value
relfreq NMTOKEN None
freq NMTOKEN None
role NMTOKEN None

Description

The author element contains the name of an author or editor. Whenever possible, the parts of a personal name should be qualified by using the lastname, firstname, middlename, and suffix elements. If that does not work out, or if you're looking at a corporate or institutional name, use the name element instead.

The freq and relfreq attributes may be used by database applications to export the frequency (the total number of references using this author) and the relative frequency (a numerical value between 0 and 10), respectively, of the given author in the database. As these are properties of a particular collection of datasets in that database, the attributes are ignored during import.

Parents

part, publication, set

Children

firstname, lastname, middlename, name, suffix

Example

<author>
<lastname>Myers</lastname>
<firstname>B</firstname>
<middlename>B</middlename>
<suffix>Jr.</suffix>
</author>
    

HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/elements/availability.html000644 001750 001750 00000004156 12247746434 022373 0ustar00markusmarkus000000 000000 risx XML DTD: Element availability
risx XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element availability

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

Name Type Default Value
type Enumeration:
  full
  useroot
"full"

Description

The availability element holds the information necessary to keep track of a paper copy or of an electronic offprint of the reference.

If the type attribute is set to "full", the element may contain a verbose description of the physical location of a copy of the reference, or a fully qualified URL of an electronic version. The latter should start with a protocol specifier, i.e. "http://", "ftp://", or "file://" if the copy is on the local filesystem.

If the type attribute is set to "useroot" instead, the element should contain the partial path of an electronic version. This path will be completed by RefDB using the pdfroot feature.

Parents

libinfo

Example

<libinfo user="jdoe">
<notes>Not bad, after all</notes>
<reprint status="INFILE"/>
<availability type="useroot">palaeontology/dinosaurs/millera2002.pdf</availability>
</libinfo>
    

HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/elements/city.html000644 001750 001750 00000002737 12247746434 020674 0ustar00markusmarkus000000 000000 risx XML DTD: Element city
risx XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element city

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

The city element holds the city of publication, usually the location of the headquarter of the publishing company.

Parents

pubinfo

Example

<pubinfo>
<pubdate type="primary">
<date>
<year>1999</year>
</date>
</pubdate>
<city>Sebastopol</city>
<publisher>O'Reilly</publisher>
<serial>1-56592-580-7</serial>
<address>millera@dinosaurs.upenn.edu</address>
<link type="url">http://www.dinosaurs.upenn.edu/</url>
</pubinfo>
    

HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/elements/conftitle.html000644 001750 001750 00000001473 12247746434 021707 0ustar00markusmarkus000000 000000 risx XML DTD: Element conftitle
risx XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element conftitle

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

Parents

pubinfo


HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/elements/contents.html000644 001750 001750 00000003123 12247746434 021547 0ustar00markusmarkus000000 000000 risx XML DTD: Element contents
risx XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element contents

Synopsis

Content Model

(abstract?,keyword*)

Attributes

None

Description

The contents element is a wrapper for the information that describes the contents of a reference. The contents are further specified by the abstract and keyword elements.

Parents

entry

Children

abstract, keyword

Example

<contents>
<abstract>Dinosaurs were big animals that ate a lot</abstract>
<keyword>dinosaurs</keyword>
<keyword>evolution</keyword>
<keyword>animals</keyword>
</contents>
    

HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/elements/date.html000644 001750 001750 00000002715 12247746434 020635 0ustar00markusmarkus000000 000000 risx XML DTD: Element date
risx XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element date

Synopsis

Content Model

(year?,month?,day?)

Attributes

None

Description

The date element is a wrapper for the year, month, and day elements describing a date.

Parents

pubdate, reprint

Children

day, month, year

Example

<pubdate type="primary">
<date>
<year>1999</year>
</date>
</pubdate>
    

HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/elements/day.html000644 001750 001750 00000002432 12247746434 020471 0ustar00markusmarkus000000 000000 risx XML DTD: Element day
risx XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element day

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

The day element holds the day information of a date element. The day should be specified as a numeric value in the range of 1 through 31.

Parents

date

Example

<pubdate type="primary">
<date>
<year>1999</year>
<month>11</month>
<day>12</day>
</date>
</pubdate>
    

HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/elements/endpage.html000644 001750 001750 00000002571 12247746434 021323 0ustar00markusmarkus000000 000000 risx XML DTD: Element endpage
risx XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element endpage

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

Journal and magazine articles are usually published on a range of pages. The endpage element specifies the last page of an article.

Parents

pubinfo

Example

<pubinfo>
<pubdate type="primary">
<date>
<year>2002</year>
</date>
</pubdate>
<volume>63</volume>
<issue>4</issue>
<startpage>577</startpage>
<endpage>85</endpage>
</pubinfo>
    

HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/elements/entry.html000644 001750 001750 00000007724 12247746434 021066 0ustar00markusmarkus000000 000000 risx XML DTD: Element entry
risx XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element entry

Synopsis

Content Model

(part?,publication,set?,libinfo*,contents?)

Attributes

Name Type Default Value
id NMTOKEN None
type Enumeration:
  ABST
  ADVS
  ART
  BILL
  BOOK
  CASE
  CHAP
  COMP
  CONF
  CTLG
  DATA
  ELEC
  GEN
  HEAR
  ICOMM
  INPR
  JFULL
  JOUR
  MAP
  MGZN
  MPCT
  MUSIC
  NEWS
  PAMP
  PAT
  PCOMM
  RPRT
  SER
  SLIDE
  SOUND
  STAT
  THES
  UNBILL
  UNPB
  VIDEO
"GEN"
citekey NMTOKEN None

Description

The entry element is the wrapper for a single reference.

The id attribute specifies a unique identifier provided by a database application.

The type attribute specifies the type of the reference. The following types are supported:

  • ABST: abstract reference
  • ADVS: audiovisual material
  • ART: art work
  • BILL: bill/resolution
  • BOOK: whole book reference
  • CASE: case
  • CHAP: book chapter reference
  • COMP: computer program
  • CONF: conference proceeding
  • CTLG: catalog
  • DATA: data file
  • ELEC: electronic citation
  • GEN: generic
  • ICOMM: internet communication
  • INPR: in press reference
  • JFULL: journal - full
  • JOUR: journal reference
  • MAP: map
  • MGZN: magazine article
  • MPCT: motion picture
  • MUSIC: music score
  • NEWS: newspaper
  • PAMP: pamphlet
  • PAT: patent
  • PCOMM: personal communication
  • RPRT: report
  • SER: serial - book, monograph
  • SLIDE: slide
  • SOUND: sound recording
  • STAT: statute
  • THES: thesis/dissertation
  • UNBILL: unenacted bill/resolution
  • UNPB: unpublished work reference
  • VIDEO: video recording

Parents

ris

Children

contents, libinfo, part, publication, set

Example

<ris>
<entry type="ABST" citekey="MILLER1999">
...
</entry>
<entry type="BOOK" citekey="JONES2000">
...
</entry>
</ris>
    

HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/elements/firstname.html000644 001750 001750 00000002344 12247746434 021706 0ustar00markusmarkus000000 000000 risx XML DTD: Element firstname
risx XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element firstname

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

The firstname element contains the first name of an author or editor.

Parents

author

Example

<author>
<lastname>Myers</lastname>
<firstname>B</firstname>
<middlename>B</middlename>
<suffix>Jr.</suffix>
</author>
    

HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/elements/issue.html000644 001750 001750 00000002512 12247746434 021043 0ustar00markusmarkus000000 000000 risx XML DTD: Element issue
risx XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element issue

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

The issue element specifies the issue of a periodical that an article appeared in.

Parents

pubinfo

Example

<pubinfo>
<pubdate type="primary">
<date>
<year>2002</year>
</date>
</pubdate>
<volume>63</volume>
<issue>4</issue>
<startpage>577</startpage>
<endpage>85</endpage>
</pubinfo>
    

HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/elements/keyword.html000644 001750 001750 00000004056 12247746434 021404 0ustar00markusmarkus000000 000000 risx XML DTD: Element keyword
risx XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element keyword

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

Name Type Default Value
relfreq NMTOKEN None
freq NMTOKEN None

Description

The keyword element holds a keyword or subject heading used as a search term in a database application.

The freq and relfreq attributes may be used by database applications to export the frequency (the total number of references using this keyword) and the relative frequency (a numerical value between 0 and 10), respectively, of the given keyword in the database. As these are properties of a particular collection of datasets in that database, the attributes are ignored during import.

Parents

contents

Example

<contents>
<abstract>Dinosaurs were big animals that ate a lot</abstract>
<keyword>dinosaurs</keyword>
<keyword>evolution</keyword>
<keyword>animals</keyword>
</contents>
    

HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/elements/lastname.html000644 001750 001750 00000002355 12247746434 021524 0ustar00markusmarkus000000 000000 risx XML DTD: Element lastname
risx XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element lastname

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

The lastname element contains the last name (surname) of an author or editor.

Parents

author

Example

<author>
<lastname>Myers</lastname>
<firstname>B</firstname>
<middlename>B</middlename>
<suffix>Jr.</suffix>
</author>
    

HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/elements/libinfo.html000644 001750 001750 00000003751 12247746434 021343 0ustar00markusmarkus000000 000000 risx XML DTD: Element libinfo
risx XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element libinfo

Synopsis

Content Model

(notes?,reprint,availability?,link*)

Attributes

Name Type Default Value
user NMTOKEN Required

Description

The libinfo element is a wrapper for information specific to a particular user of a reference database system.

The user attribute specifies the name of the user that provides this information. The name usually corresponds to the username of a particular database application.

Parents

entry

Children

availability, link, notes, reprint

Example

<libinfo user="jdoe">
<notes>Not bad, after all</notes>
<reprint status="INFILE"/>
<availability type="useroot">palaeontology/dinosaurs/millera2002.pdf</availability>
</libinfo>
    

HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/elements/link.html000644 001750 001750 00000002265 12247746434 020655 0ustar00markusmarkus000000 000000 risx XML DTD: Element link
risx XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element link

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

NameTypeDefault Value
type Enumeration:
  doi
  fulltext
  image
  pdf
  related
  url
"url"

Description

Parents

libinfo, pubinfo


HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/elements/middlename.html000644 001750 001750 00000002371 12247746434 022015 0ustar00markusmarkus000000 000000 risx XML DTD: Element middlename
risx XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element middlename

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

The middlename element contains the middle name or middle initial of an author or editor.

Parents

author

Example

<author>
<lastname>Myers</lastname>
<firstname>B</firstname>
<middlename>B</middlename>
<suffix>Jr.</suffix>
</author>
    

HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/elements/misc.html000644 001750 001750 00000004027 12247746434 020651 0ustar00markusmarkus000000 000000 risx XML DTD: Element misc
risx XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element misc

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

Name Type Default Value
type Enumeration:
  1
  2
  3
"1"

Description

The misc element is an all-purpose element to store information not covered by the other elements. For reasons of consistency, a reference database administrator should figure out rules which kind of information should be stored in the misc element.

The type element can be set to one of "1", "2", or "3", thus allowing to use 3 different misc elements per dataset.

Parents

pubinfo

Example

<pubinfo>
<pubdate type="primary">
<date>
<year>1999</year>
</date>
</pubdate>
<city>Sebastopol</city>
<publisher>O'Reilly</publisher>
<serial>1-56592-580-7</serial>
<address>millera@dinosaurs.upenn.edu</address>
<link type="url">http://www.dinosaurs.upenn.edu/</url>
<misc type="1">high</misc>
</pubinfo>
    

HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/elements/month.html000644 001750 001750 00000002443 12247746434 021043 0ustar00markusmarkus000000 000000 risx XML DTD: Element month
risx XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element month

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

The month element holds the month information of a date element. The month should be specified as a numeric value in the range of 1 through 12.

Parents

date

Example

<pubdate type="primary">
<date>
<year>1999</year>
<month>11</month>
<day>12</day>
</date>
</pubdate>
    

HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/elements/name.html000644 001750 001750 00000002617 12247746434 020641 0ustar00markusmarkus000000 000000 risx XML DTD: Element name
risx XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element name

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

The name element contains the name of an author or editor if it is not possible to further qualify name parts using the lastname, firstname, middlename, and suffix elements. Use the name element for corporate and institutional names as well.

Parents

author

Example

<author>
<name>Library of Congress</name>
</author>
    

HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/elements/notes.html000644 001750 001750 00000002365 12247746434 021051 0ustar00markusmarkus000000 000000 risx XML DTD: Element notes
risx XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element notes

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

The notes element contains personal notes of a user.

Parents

libinfo

Example

<libinfo user="jdoe">
<notes>Not bad, after all</notes>
<reprint status="INFILE"/>
<availability type="useroot">palaeontology/dinosaurs/millera2002.pdf</availability>
</libinfo>
    

HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/elements/otherinfo.html000644 001750 001750 00000002326 12247746434 021713 0ustar00markusmarkus000000 000000 risx XML DTD: Element otherinfo
risx XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element otherinfo

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

The otherinfo element holds additional information about the publication date.

Parents

pubdate

Example

<pubdate type="primary">
<date>
<year>1999</year>
</date>
<otherinfo>Spring meeting</otherinfo>
</pubdate>
    

HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/elements/part.html000644 001750 001750 00000004425 12247746434 020666 0ustar00markusmarkus000000 000000 risx XML DTD: Element part
risx XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element part

Synopsis

Content Model

(title,author*)

Attributes

None

Description

The part element contains the information related to a reference that is part of a published work. This corresponds to the analytical level of bibliographic information.

Parents

entry

Children

author, title

Example

<entry type="CHAP" id="32" citekey="WALSH1999">
<part>
<title>XML: Principles, Tools, and Techniques</title>
<author>
<lastname>Walsh</lastname>
<firstname>N</firstname>
</author>
</part>
<publication>
<title>Guide to XML</title>
<author>
<lastname>Connolly</lastname>
<firstname>D</firstname>
</author>
<pubinfo>
<pubdate type="primary">
<date>
<year>1999</year>
</date>
</pubdate>
<city>Sebastopol</city>
<publisher>O'Reilly</publisher>
</pubinfo>
</publication>
<libinfo user="markus"><notes>Not bad</notes>
<reprint status="NOTINFILE"/></libinfo>
<contents><abstract>An introduction how to deal with XML</abstract>
<keyword>XML</keyword>
<keyword>computer</keyword>
<keyword>markup languages</keyword>
</contents>
</entry>
    

HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/elements/pubdate.html000644 001750 001750 00000003270 12247746434 021341 0ustar00markusmarkus000000 000000 risx XML DTD: Element pubdate
risx XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element pubdate

Synopsis

Content Model

(date,otherinfo?)

Attributes

Name Type Default Value
type Enumeration:
  primary
  secondary
"primary"

Description

The pubdate holds the information about the publication date.

The type attribute can be set to either "primary" or "secondary".

Parents

pubinfo

Children

date, otherinfo

Example

<pubdate type="primary">
<date>
<year>1999</year>
</date>
<otherinfo>Spring meeting</otherinfo>
</pubdate>
    

HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/elements/pubinfo.html000644 001750 001750 00000004631 12247746434 021361 0ustar00markusmarkus000000 000000 risx XML DTD: Element pubinfo
risx XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element pubinfo

Synopsis

Content Model

(pubdate*,volume?,issue?,conftitle?,startpage?,endpage?,city?,
 publisher?,serial?,address?,userdef*,misc*,link*)

Attributes

None

Description

The pubinfo element is a wrapper for all bibliographic information of a publication element.

Parents

publication

Children

address, city, conftitle, endpage, issue, link, misc, pubdate, publisher, serial, startpage, userdef, volume

Example

<pubinfo>
<pubdate type="primary">
<date>
<year>1999</year>
</date>
</pubdate>
<city>Sebastopol</city>
<publisher>O'Reilly</publisher>
<serial>1-56592-580-7</serial>
<address>millera@dinosaurs.upenn.edu</address>
<link type="url">http://www.dinosaurs.upenn.edu/</url>
</pubinfo>
    

HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/elements/publication.html000644 001750 001750 00000004643 12247746435 022234 0ustar00markusmarkus000000 000000 risx XML DTD: Element publication
risx XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element publication

Synopsis

Content Model

(title*,author*,pubinfo?)

Attributes

None

Description

The publication element contains the information related to a published work. Roughly speaking, this is what you find on the shelf of a library. This corresponds to the monographic level of bibliographic information.

Parents

entry

Children

author, pubinfo, title

Example

<entry type="CHAP" id="32" citekey="WALSH1999">
<part>
<title>XML: Principles, Tools, and Techniques</title>
<author>
<lastname>Walsh</lastname>
<firstname>N</firstname>
</author>
</part>
<publication>
<title>Guide to XML</title>
<author>
<lastname>Connolly</lastname>
<firstname>D</firstname>
</author>
<pubinfo>
<pubdate type="primary">
<date>
<year>1999</year>
</date>
</pubdate>
<city>Sebastopol</city>
<publisher>O'Reilly</publisher>
</pubinfo>
</publication>
<libinfo user="markus"><notes>Not bad</notes>
<reprint status="NOTINFILE"/></libinfo>
<contents><abstract>An introduction how to deal with XML</abstract>
<keyword>XML</keyword>
<keyword>computer</keyword>
<keyword>markup languages</keyword>
</contents>
</entry>
    

HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/elements/publisher.html000644 001750 001750 00000002703 12247746435 021713 0ustar00markusmarkus000000 000000 risx XML DTD: Element publisher
risx XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element publisher

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

The publisher element contains the name of the publisher of a publication.

Parents

pubinfo

Example

<pubinfo>
<pubdate type="primary">
<date>
<year>1999</year>
</date>
</pubdate>
<city>Sebastopol</city>
<publisher>O'Reilly</publisher>
<serial>1-56592-580-7</serial>
<address>millera@dinosaurs.upenn.edu</address>
<link type="url">http://www.dinosaurs.upenn.edu/</url>
</pubinfo>
    

HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/elements/reprint.html000644 001750 001750 00000003736 12247746435 021410 0ustar00markusmarkus000000 000000 risx XML DTD: Element reprint
risx XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element reprint

Synopsis

Content Model

(date?)

Attributes

Name Type Default Value
status Enumeration:
  INFILE
  NOTINFILE
  ONREQUEST
"NOTINFILE"

Description

The reprint element specifies the status of a reprint request.

The status attribute can be set to one of "NOTINFILE", "ONREQUEST", or "INFILE" to specify that no local copy is available, that a reprint was requested, and that a local copy is available, respectively. In the case of "ONREQUEST", an optional date element can be used to provide the date when the reprint was requested.

Parents

libinfo

Children

date

Example

<libinfo user="jdoe">
<notes>Not bad, after all</notes>
<reprint status="INFILE"/>
<availability type="useroot">palaeontology/dinosaurs/millera2002.pdf</availability>
</libinfo>
    

HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/elements/ris.html000644 001750 001750 00000002416 12247746435 020514 0ustar00markusmarkus000000 000000 risx XML DTD: Element ris
risx XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element ris

Synopsis

Content Model

(entry)+

Attributes

None

Description

ris is a container for one or more entry elements. Each entry contains one complete bibliographic dataset.

Children

entry

Example

<ris>
<entry type="ABST" citekey="MILLER1999">
...
</entry>
<entry type="BOOK" citekey="JONES2000">
...
</entry>
</ris>
    

HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/elements/serial.html000644 001750 001750 00000002761 12247746435 021201 0ustar00markusmarkus000000 000000 risx XML DTD: Element serial
risx XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element serial

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

The serial element contains an ISSN or ISBN. These numbers are provided by the publisher in order to unambiguously identify a published work.

Parents

pubinfo

Example

<pubinfo>
<pubdate type="primary">
<date>
<year>1999</year>
</date>
</pubdate>
<city>Sebastopol</city>
<publisher>O'Reilly</publisher>
<serial>1-56592-580-7</serial>
<address>millera@dinosaurs.upenn.edu</address>
<link type="url">http://www.dinosaurs.upenn.edu/</url>
</pubinfo>
    

HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/elements/set.html000644 001750 001750 00000005505 12247746435 020514 0ustar00markusmarkus000000 000000 risx XML DTD: Element set
risx XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element set

Synopsis

Content Model

(title*,author*)

Attributes

None

Description

The set element contains the information related to a series of published works. This corresponds to the series level of bibliographic information.

Parents

entry

Children

author, title

Example

<entry type="BOOK" id="31" citekey="MILLER1999">
<publication>
<title>My first book about dinosaurs</title>
<author>
<lastname>Miller</lastname>
<firstname>A</firstname>
</author>
<author>
<lastname>Myers</lastname>
<firstname>B</firstname>
<middlename>B</middlename>
<suffix>Jr.</suffix>
</author>
<pubinfo>
<pubdate type="primary">
<date>
<year>1999</year>
</date>
</pubdate>
<city>Sebastopol</city>
<publisher>O'Reilly</publisher>
<serial>1-56592-580-7</serial>
<address>millera@dinosaurs.upenn.edu</address>
<link type="url">http://www.dinosaurs.upenn.edu/</url>
</pubinfo>
</publication>
<set>
<title>My first book series</title>
<author>
<lastname>Smith</lastname>
<firstname>K</firstname>
</author>
</set>
<libinfo user="markus">
<notes>Not bad, after all</notes>
<reprint status="ONREQUEST">
<date>
<year>2002</year>
<month>2</month>
<day>24</day>
</date>
</reprint>
<availability type="useroot">palaeontology/dinosaurs/millera2002.pdf</availability>
</libinfo>
<contents>
<abstract>Dinosaurs were big animals that ate a lot</abstract>
<keyword>dinosaurs</keyword>
<keyword>evolution</keyword>
<keyword>animals</keyword>
</contents>
</entry>
    

HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/elements/startpage.html000644 001750 001750 00000002603 12247746435 021707 0ustar00markusmarkus000000 000000 risx XML DTD: Element startpage
risx XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element startpage

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

Journal and magazine articles are usually published on a range of pages. The startpage element specifies the first page of an article.

Parents

pubinfo

Example

<pubinfo>
<pubdate type="primary">
<date>
<year>2002</year>
</date>
</pubdate>
<volume>63</volume>
<issue>4</issue>
<startpage>577</startpage>
<endpage>85</endpage>
</pubinfo>
    

HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/elements/suffix.html000644 001750 001750 00000002366 12247746435 021227 0ustar00markusmarkus000000 000000 risx XML DTD: Element suffix
risx XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element suffix

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

The suffix element contains an optional suffix of an author or editor, such as "3rd", "Jr.".

Parents

author

Example

<author>
<lastname>Myers</lastname>
<firstname>B</firstname>
<middlename>B</middlename>
<suffix>Jr.</suffix>
</author>
    

HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/elements/title.html000644 001750 001750 00000006114 12247746435 021037 0ustar00markusmarkus000000 000000 risx XML DTD: Element title
risx XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element title

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

Name Type Default Value
relfreq NMTOKEN None
freq NMTOKEN None
type Enumeration:
  abbrev
  full
  user1
  user2
"full"

Description

The title element contains the title of a part, publication, or set element.

The type attribute should be set to "gen" for all titles except the names of periodicals. In that case, multiple titles can be specified and distinguished by the attribute values "abbrev", "full", "user1", "user2" to denote the official abbreviation of the periodical name (usually as specified by the Index Medicus), the full name, and up to two user-specified abbreviations, respectively.

The freq and relfreq attributes may be used by database applications to export the frequency (the total number of references using a periodical) and the relative frequency (a numerical value between 0 and 10), respectively, of the given periodical in the database. The attributes are meaningless in non-periodical titles. As these are properties of a particular collection of datasets in that database, the attributes are ignored during import.

Parents

part, publication, set

Example

<publication>
<title type="abbrev">Biochem.Pharmacol.</title>
<title type="full">Biochemical Pharmacology</title>
<title type="user1">BP</title>
<pubinfo>
<pubdate type="primary">
<date>
<year>2002</year>
</date>
</pubdate>
<volume>63</volume>
<issue>4</issue>
<startpage>577</startpage>
<endpage>85</endpage>
</pubinfo>
</publication>
    

HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/elements/url.html000644 001750 001750 00000001417 12247746435 020521 0ustar00markusmarkus000000 000000

The url element holds the unique resource locator (URL) of an electronic version of the publication or of electronic information relevant to that publication.

Example

<pubinfo>
<pubdate type="primary">
<date>
<year>1999</year>
</date>
</pubdate>
<city>Sebastopol</city>
<publisher>O'Reilly</publisher>
<serial>1-56592-580-7</serial>
<address>millera@dinosaurs.upenn.edu</address>
<url>http://www.dinosaurs.upenn.edu/</url>
</pubinfo>
    
refdb-1.0.2/doc/risx/elements/userdef.html000644 001750 001750 00000004131 12247746435 021350 0ustar00markusmarkus000000 000000 risx XML DTD: Element userdef
risx XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element userdef

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

Name Type Default Value
type Enumeration:
  1
  2
  3
  4
  5
"1"

Description

The userdef element is an all-purpose element to store information not covered by the other elements. For reasons of consistency, a reference database administrator should figure out rules which kind of information should be stored in the userdef element.

The type element can be set to one of "1", "2", "3", "4", or "5", thus allowing to use 5 different userdef elements per dataset.

Parents

pubinfo

Example

<pubinfo>
<pubdate type="primary">
<date>
<year>1999</year>
</date>
</pubdate>
<city>Sebastopol</city>
<publisher>O'Reilly</publisher>
<serial>1-56592-580-7</serial>
<address>millera@dinosaurs.upenn.edu</address>
<link type="url">http://www.dinosaurs.upenn.edu/</url>
<userdef type="1">high</userdef>
</pubinfo>
    

HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/elements/volume.html000644 001750 001750 00000002512 12247746435 021223 0ustar00markusmarkus000000 000000 risx XML DTD: Element volume
risx XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element volume

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

The volume element specifies the volume of a periodical that an article appeared in.

Parents

pubinfo

Example

<pubinfo>
<pubdate type="primary">
<date>
<year>2002</year>
</date>
</pubdate>
<volume>63</volume>
<issue>4</issue>
<startpage>577</startpage>
<endpage>85</endpage>
</pubinfo>
    

HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/elements/year.html000644 001750 001750 00000002352 12247746435 020656 0ustar00markusmarkus000000 000000 risx XML DTD: Element year
risx XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev]

Element year

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

The year element holds the year information of a date element. The year should be specified as a numeric 4-digit value.

Parents

date

Example

<pubdate type="primary">
<date>
<year>1999</year>
<month>11</month>
<day>12</day>
</date>
</pubdate>
    

HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/dtdelem/abstract.html000644 001750 001750 00000001432 12247746434 021320 0ustar00markusmarkus000000 000000 risx XML DTD: Element abstract
risx XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Next]

Element abstract

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

Parents

contents


HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/dtdelem/address.html000644 001750 001750 00000001467 12247746434 021152 0ustar00markusmarkus000000 000000 risx XML DTD: Element address
risx XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element address

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

Parents

pubinfo


HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/dtdelem/author.html000644 001750 001750 00000003355 12247746434 021025 0ustar00markusmarkus000000 000000 risx XML DTD: Element author
risx XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element author

Synopsis

Content Model

(name|
 (lastname?,firstname?,middlename*,suffix?))

Attributes

NameTypeDefault Value
relfreq NMTOKEN None
freq NMTOKEN None
role NMTOKEN None

Description

Parents

part, publication, set

Children

firstname, lastname, middlename, name, suffix


HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/dtdelem/availability.html000644 001750 001750 00000002115 12247746434 022166 0ustar00markusmarkus000000 000000 risx XML DTD: Element availability
risx XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element availability

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

NameTypeDefault Value
type Enumeration:
  full
  useroot
"full"

Description

Parents

libinfo


HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/dtdelem/city.html000644 001750 001750 00000001465 12247746434 020473 0ustar00markusmarkus000000 000000 risx XML DTD: Element city
risx XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element city

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

Parents

pubinfo


HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/dtdelem/conftitle.html000644 001750 001750 00000001473 12247746434 021511 0ustar00markusmarkus000000 000000 risx XML DTD: Element conftitle
risx XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element conftitle

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

Parents

pubinfo


HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/dtdelem/contents.html000644 001750 001750 00000001723 12247746434 021355 0ustar00markusmarkus000000 000000 risx XML DTD: Element contents
risx XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element contents

Synopsis

Content Model

(abstract?,keyword*)

Attributes

None

Description

Parents

entry

Children

abstract, keyword


HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/dtdelem/date.html000644 001750 001750 00000002015 12247746434 020430 0ustar00markusmarkus000000 000000 risx XML DTD: Element date
risx XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element date

Synopsis

Content Model

(year?,month?,day?)

Attributes

None

Description

Parents

pubdate, reprint

Children

day, month, year


HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/dtdelem/day.html000644 001750 001750 00000001442 12247746434 020273 0ustar00markusmarkus000000 000000 risx XML DTD: Element day
risx XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element day

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

Parents

date


HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/dtdelem/endpage.html000644 001750 001750 00000001461 12247746434 021122 0ustar00markusmarkus000000 000000 risx XML DTD: Element endpage
risx XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element endpage

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

Parents

pubinfo


HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/dtdelem/entry.html000644 001750 001750 00000004557 12247746434 020671 0ustar00markusmarkus000000 000000 risx XML DTD: Element entry
risx XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element entry

Synopsis

Content Model

(part?,publication,set?,libinfo*,contents?)

Attributes

NameTypeDefault Value
id NMTOKEN None
type Enumeration:
  ABST
  ADVS
  ART
  BILL
  BOOK
  CASE
  CHAP
  COMP
  CONF
  CTLG
  DATA
  ELEC
  GEN
  HEAR
  ICOMM
  INPR
  JFULL
  JOUR
  MAP
  MGZN
  MPCT
  MUSIC
  NEWS
  PAMP
  PAT
  PCOMM
  RPRT
  SER
  SLIDE
  SOUND
  STAT
  THES
  UNBILL
  UNPB
  VIDEO
"GEN"
citekey NMTOKEN None

Description

Parents

ris

Children

contents, libinfo, part, publication, set


HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/dtdelem/firstname.html000644 001750 001750 00000001467 12247746434 021515 0ustar00markusmarkus000000 000000 risx XML DTD: Element firstname
risx XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element firstname

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

Parents

author


HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/dtdelem/issue.html000644 001750 001750 00000001463 12247746434 020651 0ustar00markusmarkus000000 000000 risx XML DTD: Element issue
risx XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element issue

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

Parents

pubinfo


HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/dtdelem/keyword.html000644 001750 001750 00000002240 12247746434 021177 0ustar00markusmarkus000000 000000 risx XML DTD: Element keyword
risx XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element keyword

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

NameTypeDefault Value
relfreq NMTOKEN None
freq NMTOKEN None

Description

Parents

contents


HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/dtdelem/lastname.html000644 001750 001750 00000001470 12247746434 021323 0ustar00markusmarkus000000 000000 risx XML DTD: Element lastname
risx XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element lastname

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

Parents

author


HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/dtdelem/libinfo.html000644 001750 001750 00000002466 12247746434 021147 0ustar00markusmarkus000000 000000 risx XML DTD: Element libinfo
risx XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element libinfo

Synopsis

Content Model

(notes?,reprint,availability?,link*)

Attributes

NameTypeDefault Value
user NMTOKEN Required

Description

Parents

entry

Children

availability, link, notes, reprint


HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/dtdelem/link.html000644 001750 001750 00000002265 12247746434 020457 0ustar00markusmarkus000000 000000 risx XML DTD: Element link
risx XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element link

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

NameTypeDefault Value
type Enumeration:
  doi
  fulltext
  image
  pdf
  related
  url
"url"

Description

Parents

libinfo, pubinfo


HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/dtdelem/middlename.html000644 001750 001750 00000001470 12247746434 021616 0ustar00markusmarkus000000 000000 risx XML DTD: Element middlename
risx XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element middlename

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

Parents

author


HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/dtdelem/misc.html000644 001750 001750 00000002100 12247746434 020441 0ustar00markusmarkus000000 000000 risx XML DTD: Element misc
risx XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element misc

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

NameTypeDefault Value
type Enumeration:
  1
  2
  3
"1"

Description

Parents

pubinfo


HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/dtdelem/month.html000644 001750 001750 00000001445 12247746434 020646 0ustar00markusmarkus000000 000000 risx XML DTD: Element month
risx XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element month

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

Parents

date


HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/dtdelem/name.html000644 001750 001750 00000001450 12247746434 020435 0ustar00markusmarkus000000 000000 risx XML DTD: Element name
risx XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element name

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

Parents

author


HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/dtdelem/notes.html000644 001750 001750 00000001460 12247746434 020646 0ustar00markusmarkus000000 000000 risx XML DTD: Element notes
risx XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element notes

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

Parents

libinfo


HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/dtdelem/otherinfo.html000644 001750 001750 00000001470 12247746434 021514 0ustar00markusmarkus000000 000000 risx XML DTD: Element otherinfo
risx XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element otherinfo

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

Parents

pubdate


HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/dtdelem/part.html000644 001750 001750 00000001671 12247746434 020470 0ustar00markusmarkus000000 000000 risx XML DTD: Element part
risx XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element part

Synopsis

Content Model

(title,author*)

Attributes

None

Description

Parents

entry

Children

author, title


HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/dtdelem/pubdate.html000644 001750 001750 00000002334 12247746434 021143 0ustar00markusmarkus000000 000000 risx XML DTD: Element pubdate
risx XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element pubdate

Synopsis

Content Model

(date,otherinfo?)

Attributes

NameTypeDefault Value
type Enumeration:
  primary
  secondary
"primary"

Description

Parents

pubinfo

Children

date, otherinfo


HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/dtdelem/pubinfo.html000644 001750 001750 00000003333 12247746434 021161 0ustar00markusmarkus000000 000000 risx XML DTD: Element pubinfo
risx XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element pubinfo

Synopsis

Content Model

(pubdate*,volume?,issue?,conftitle?,startpage?,endpage?,city?,
 publisher?,serial?,address?,userdef*,misc*,link*)

Attributes

None

Description

Parents

publication

Children

address, city, conftitle, endpage, issue, link, misc, pubdate, publisher, serial, startpage, userdef, volume


HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/dtdelem/publication.html000644 001750 001750 00000002027 12247746434 022027 0ustar00markusmarkus000000 000000 risx XML DTD: Element publication
risx XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element publication

Synopsis

Content Model

(title*,author*,pubinfo?)

Attributes

None

Description

Parents

entry

Children

author, pubinfo, title


HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/dtdelem/publisher.html000644 001750 001750 00000001501 12247746434 021507 0ustar00markusmarkus000000 000000 risx XML DTD: Element publisher
risx XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element publisher

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

Parents

pubinfo


HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/dtdelem/reprint.html000644 001750 001750 00000002253 12247746434 021202 0ustar00markusmarkus000000 000000 risx XML DTD: Element reprint
risx XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element reprint

Synopsis

Content Model

(date?)

Attributes

NameTypeDefault Value
status Enumeration:
  INFILE
  NOTINFILE
  ONREQUEST
"NOTINFILE"

Description

Parents

libinfo

Children

date


HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/dtdelem/ris.html000644 001750 001750 00000001471 12247746434 020315 0ustar00markusmarkus000000 000000 risx XML DTD: Element ris
risx XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element ris

Synopsis

Content Model

(entry)+

Attributes

None

Description

Children

entry


HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/dtdelem/serial.html000644 001750 001750 00000001454 12247746434 021000 0ustar00markusmarkus000000 000000 risx XML DTD: Element serial
risx XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element serial

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

Parents

pubinfo


HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/dtdelem/set.html000644 001750 001750 00000001666 12247746434 020321 0ustar00markusmarkus000000 000000 risx XML DTD: Element set
risx XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element set

Synopsis

Content Model

(title*,author*)

Attributes

None

Description

Parents

entry

Children

author, title


HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/dtdelem/startpage.html000644 001750 001750 00000001470 12247746434 021511 0ustar00markusmarkus000000 000000 risx XML DTD: Element startpage
risx XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element startpage

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

Parents

pubinfo


HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/dtdelem/suffix.html000644 001750 001750 00000001462 12247746434 021024 0ustar00markusmarkus000000 000000 risx XML DTD: Element suffix
risx XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element suffix

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

Parents

author


HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/dtdelem/title.html000644 001750 001750 00000002705 12247746434 020642 0ustar00markusmarkus000000 000000 risx XML DTD: Element title
risx XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element title

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

NameTypeDefault Value
relfreq NMTOKEN None
freq NMTOKEN None
type Enumeration:
  abbrev
  full
  user1
  user2
"full"

Description

Parents

part, publication, set


HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/dtdelem/userdef.html000644 001750 001750 00000002151 12247746434 021151 0ustar00markusmarkus000000 000000 risx XML DTD: Element userdef
risx XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element userdef

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

NameTypeDefault Value
type Enumeration:
  1
  2
  3
  4
  5
"1"

Description

Parents

pubinfo


HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/dtdelem/volume.html000644 001750 001750 00000001461 12247746434 021026 0ustar00markusmarkus000000 000000 risx XML DTD: Element volume
risx XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element volume

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

Parents

pubinfo


HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/dtdelem/year.html000644 001750 001750 00000001405 12247746434 020455 0ustar00markusmarkus000000 000000 risx XML DTD: Element year
risx XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev]

Element year

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

Parents

date


HTML Presentation of risx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/risx/ele-desc/abstract.html000644 001750 001750 00000001233 11512721661 021347 0ustar00markusmarkus000000 000000 abstract description

Description

The abstract element contains an abstract of the reference. Articles published in scientific journals usually contain abstracts. For books, the liner or backcover texts might just be fine.

Example

<contents>
<abstract>Dinosaurs were big animals that ate a lot</abstract>
<keyword>dinosaurs</keyword>
<keyword>evolution</keyword>
<keyword>animals</keyword>
</contents>
    
refdb-1.0.2/doc/risx/ele-desc/address.html000644 001750 001750 00000001376 11512721661 021201 0ustar00markusmarkus000000 000000 address description

Description

The address element contains a string with whatever information is available to contact the author of a publication.

Example

<pubinfo>
<pubdate type="primary">
<date>
<year>1999</year>
</date>
</pubdate>
<city>Sebastopol</city>
<publisher>O'Reilly</publisher>
<serial>1-56592-580-7</serial>
<address>millera@dinosaurs.upenn.edu</address>
<link type="url">http://www.dinosaurs.upenn.edu/</url>
</pubinfo>
    
refdb-1.0.2/doc/risx/ele-desc/author.html000644 001750 001750 00000002363 11512721661 021053 0ustar00markusmarkus000000 000000 author description

Description

The author element contains the name of an author or editor. Whenever possible, the parts of a personal name should be qualified by using the lastname, firstname, middlename, and suffix elements. If that does not work out, or if you're looking at a corporate or institutional name, use the name element instead.

The freq and relfreq attributes may be used by database applications to export the frequency (the total number of references using this author) and the relative frequency (a numerical value between 0 and 10), respectively, of the given author in the database. As these are properties of a particular collection of datasets in that database, the attributes are ignored during import.

Example

<author>
<lastname>Myers</lastname>
<firstname>B</firstname>
<middlename>B</middlename>
<suffix>Jr.</suffix>
</author>
    
refdb-1.0.2/doc/risx/ele-desc/availability.html000644 001750 001750 00000002146 11512721661 022222 0ustar00markusmarkus000000 000000 availability description

Description

The availability element holds the information necessary to keep track of a paper copy or of an electronic offprint of the reference.

If the type attribute is set to "full", the element may contain a verbose description of the physical location of a copy of the reference, or a fully qualified URL of an electronic version. The latter should start with a protocol specifier, i.e. "http://", "ftp://", or "file://" if the copy is on the local filesystem.

If the type attribute is set to "useroot" instead, the element should contain the partial path of an electronic version. This path will be completed by RefDB using the pdfroot feature.

Example

<libinfo user="jdoe">
<notes>Not bad, after all</notes>
<reprint status="INFILE"/>
<availability type="useroot">palaeontology/dinosaurs/millera2002.pdf</availability>
</libinfo>
    
refdb-1.0.2/doc/risx/ele-desc/city.html000644 001750 001750 00000001371 11512721661 020517 0ustar00markusmarkus000000 000000 city description

Description

The city element holds the city of publication, usually the location of the headquarter of the publishing company.

Example

<pubinfo>
<pubdate type="primary">
<date>
<year>1999</year>
</date>
</pubdate>
<city>Sebastopol</city>
<publisher>O'Reilly</publisher>
<serial>1-56592-580-7</serial>
<address>millera@dinosaurs.upenn.edu</address>
<link type="url">http://www.dinosaurs.upenn.edu/</url>
</pubinfo>
    
refdb-1.0.2/doc/risx/ele-desc/contents.html000644 001750 001750 00000001300 11512721661 021374 0ustar00markusmarkus000000 000000 contents description

Description

The contents element is a wrapper for the information that describes the contents of a reference. The contents are further specified by the abstract and keyword elements.

Example

<contents>
<abstract>Dinosaurs were big animals that ate a lot</abstract>
<keyword>dinosaurs</keyword>
<keyword>evolution</keyword>
<keyword>animals</keyword>
</contents>
    
refdb-1.0.2/doc/risx/ele-desc/date.html000644 001750 001750 00000000763 11512721661 020470 0ustar00markusmarkus000000 000000 date description

Description

The date element is a wrapper for the year, month, and day elements describing a date.

Example

<pubdate type="primary">
<date>
<year>1999</year>
</date>
</pubdate>
    
refdb-1.0.2/doc/risx/ele-desc/day.html000644 001750 001750 00000001065 11512721661 020324 0ustar00markusmarkus000000 000000 day description

Description

The day element holds the day information of a date element. The day should be specified as a numeric value in the range of 1 through 31.

Example

<pubdate type="primary">
<date>
<year>1999</year>
<month>11</month>
<day>12</day>
</date>
</pubdate>
    
refdb-1.0.2/doc/risx/ele-desc/endpage.html000644 001750 001750 00000001226 11512721661 021151 0ustar00markusmarkus000000 000000 endpage description

Description

Journal and magazine articles are usually published on a range of pages. The endpage element specifies the last page of an article.

Example

<pubinfo>
<pubdate type="primary">
<date>
<year>2002</year>
</date>
</pubdate>
<volume>63</volume>
<issue>4</issue>
<startpage>577</startpage>
<endpage>85</endpage>
</pubinfo>
    
refdb-1.0.2/doc/risx/ele-desc/entry.html000644 001750 001750 00000003560 11512721661 020712 0ustar00markusmarkus000000 000000 entry description

Description

The entry element is the wrapper for a single reference.

The id attribute specifies a unique identifier provided by a database application.

The type attribute specifies the type of the reference. The following types are supported:

  • ABST: abstract reference
  • ADVS: audiovisual material
  • ART: art work
  • BILL: bill/resolution
  • BOOK: whole book reference
  • CASE: case
  • CHAP: book chapter reference
  • COMP: computer program
  • CONF: conference proceeding
  • CTLG: catalog
  • DATA: data file
  • ELEC: electronic citation
  • GEN: generic
  • ICOMM: internet communication
  • INPR: in press reference
  • JFULL: journal - full
  • JOUR: journal reference
  • MAP: map
  • MGZN: magazine article
  • MPCT: motion picture
  • MUSIC: music score
  • NEWS: newspaper
  • PAMP: pamphlet
  • PAT: patent
  • PCOMM: personal communication
  • RPRT: report
  • SER: serial - book, monograph
  • SLIDE: slide
  • SOUND: sound recording
  • STAT: statute
  • THES: thesis/dissertation
  • UNBILL: unenacted bill/resolution
  • UNPB: unpublished work reference
  • VIDEO: video recording

Example

<ris>
<entry type="ABST" citekey="MILLER1999">
...
</entry>
<entry type="BOOK" citekey="JONES2000">
...
</entry>
</ris>
    
refdb-1.0.2/doc/risx/ele-desc/firstname.html000644 001750 001750 00000000761 11512721661 021541 0ustar00markusmarkus000000 000000 firstname description

Description

The firstname element contains the first name of an author or editor.

Example

<author>
<lastname>Myers</lastname>
<firstname>B</firstname>
<middlename>B</middlename>
<suffix>Jr.</suffix>
</author>
    
refdb-1.0.2/doc/risx/ele-desc/issue.html000644 001750 001750 00000001144 11512721661 020675 0ustar00markusmarkus000000 000000 issue description

Description

The issue element specifies the issue of a periodical that an article appeared in.

Example

<pubinfo>
<pubdate type="primary">
<date>
<year>2002</year>
</date>
</pubdate>
<volume>63</volume>
<issue>4</issue>
<startpage>577</startpage>
<endpage>85</endpage>
</pubinfo>
    
refdb-1.0.2/doc/risx/ele-desc/keyword.html000644 001750 001750 00000001721 11512721661 021232 0ustar00markusmarkus000000 000000 keyword description

Description

The keyword element holds a keyword or subject heading used as a search term in a database application.

The freq and relfreq attributes may be used by database applications to export the frequency (the total number of references using this keyword) and the relative frequency (a numerical value between 0 and 10), respectively, of the given keyword in the database. As these are properties of a particular collection of datasets in that database, the attributes are ignored during import.

Example

<contents>
<abstract>Dinosaurs were big animals that ate a lot</abstract>
<keyword>dinosaurs</keyword>
<keyword>evolution</keyword>
<keyword>animals</keyword>
</contents>
    
refdb-1.0.2/doc/risx/ele-desc/lastname.html000644 001750 001750 00000000770 11512721661 021355 0ustar00markusmarkus000000 000000 lastname description

Description

The lastname element contains the last name (surname) of an author or editor.

Example

<author>
<lastname>Myers</lastname>
<firstname>B</firstname>
<middlename>B</middlename>
<suffix>Jr.</suffix>
</author>
    
refdb-1.0.2/doc/risx/ele-desc/libinfo.html000644 001750 001750 00000001353 11512721661 021171 0ustar00markusmarkus000000 000000 libinfo description

Description

The libinfo element is a wrapper for information specific to a particular user of a reference database system.

The user attribute specifies the name of the user that provides this information. The name usually corresponds to the username of a particular database application.

Example

<libinfo user="jdoe">
<notes>Not bad, after all</notes>
<reprint status="INFILE"/>
<availability type="useroot">palaeontology/dinosaurs/millera2002.pdf</availability>
</libinfo>
    
refdb-1.0.2/doc/risx/ele-desc/middlename.html000644 001750 001750 00000001006 11512721661 021641 0ustar00markusmarkus000000 000000 middlename description

Description

The middlename element contains the middle name or middle initial of an author or editor.

Example

<author>
<lastname>Myers</lastname>
<firstname>B</firstname>
<middlename>B</middlename>
<suffix>Jr.</suffix>
</author>
    
refdb-1.0.2/doc/risx/ele-desc/misc.html000644 001750 001750 00000002052 11512721661 020477 0ustar00markusmarkus000000 000000 misc description

Description

The misc element is an all-purpose element to store information not covered by the other elements. For reasons of consistency, a reference database administrator should figure out rules which kind of information should be stored in the misc element.

The type element can be set to one of "1", "2", or "3", thus allowing to use 3 different misc elements per dataset.

Example

<pubinfo>
<pubdate type="primary">
<date>
<year>1999</year>
</date>
</pubdate>
<city>Sebastopol</city>
<publisher>O'Reilly</publisher>
<serial>1-56592-580-7</serial>
<address>millera@dinosaurs.upenn.edu</address>
<link type="url">http://www.dinosaurs.upenn.edu/</url>
<misc type="1">high</misc>
</pubinfo>
    
refdb-1.0.2/doc/risx/ele-desc/month.html000644 001750 001750 00000001075 11512721661 020675 0ustar00markusmarkus000000 000000 month description

Description

The month element holds the month information of a date element. The month should be specified as a numeric value in the range of 1 through 12.

Example

<pubdate type="primary">
<date>
<year>1999</year>
<month>11</month>
<day>12</day>
</date>
</pubdate>
    
refdb-1.0.2/doc/risx/ele-desc/name.html000644 001750 001750 00000001226 11512721661 020466 0ustar00markusmarkus000000 000000 name description

Description

The name element contains the name of an author or editor if it is not possible to further qualify name parts using the lastname, firstname, middlename, and suffix elements. Use the name element for corporate and institutional names as well.

Example

<author>
<name>Library of Congress</name>
</author>
    
refdb-1.0.2/doc/risx/ele-desc/notes.html000644 001750 001750 00000000777 11512721661 020710 0ustar00markusmarkus000000 000000 notes description

Description

The notes element contains personal notes of a user.

Example

<libinfo user="jdoe">
<notes>Not bad, after all</notes>
<reprint status="INFILE"/>
<availability type="useroot">palaeontology/dinosaurs/millera2002.pdf</availability>
</libinfo>
    
refdb-1.0.2/doc/risx/ele-desc/otherinfo.html000644 001750 001750 00000000736 11512721661 021550 0ustar00markusmarkus000000 000000 otherinfo description

Description

The otherinfo element holds additional information about the publication date.

Example

<pubdate type="primary">
<date>
<year>1999</year>
</date>
<otherinfo>Spring meeting</otherinfo>
</pubdate>
    
refdb-1.0.2/doc/risx/ele-desc/part.html000644 001750 001750 00000002750 11512721661 020517 0ustar00markusmarkus000000 000000 part description

Description

The part element contains the information related to a reference that is part of a published work. This corresponds to the analytical level of bibliographic information.

Example

<entry type="CHAP" id="32" citekey="WALSH1999">
<part>
<title>XML: Principles, Tools, and Techniques</title>
<author>
<lastname>Walsh</lastname>
<firstname>N</firstname>
</author>
</part>
<publication>
<title>Guide to XML</title>
<author>
<lastname>Connolly</lastname>
<firstname>D</firstname>
</author>
<pubinfo>
<pubdate type="primary">
<date>
<year>1999</year>
</date>
</pubdate>
<city>Sebastopol</city>
<publisher>O'Reilly</publisher>
</pubinfo>
</publication>
<libinfo user="markus"><notes>Not bad</notes>
<reprint status="NOTINFILE"/></libinfo>
<contents><abstract>An introduction how to deal with XML</abstract>
<keyword>XML</keyword>
<keyword>computer</keyword>
<keyword>markup languages</keyword>
</contents>
</entry>
    
refdb-1.0.2/doc/risx/ele-desc/pubdate.html000644 001750 001750 00000001030 11512721661 021163 0ustar00markusmarkus000000 000000 pubdate description

Description

The pubdate holds the information about the publication date.

The type attribute can be set to either "primary" or "secondary".

Example

<pubdate type="primary">
<date>
<year>1999</year>
</date>
<otherinfo>Spring meeting</otherinfo>
</pubdate>
    
refdb-1.0.2/doc/risx/ele-desc/pubinfo.html000644 001750 001750 00000001405 11512721661 021207 0ustar00markusmarkus000000 000000 pubinfo description

Description

The pubinfo element is a wrapper for all bibliographic information of a publication element.

Example

<pubinfo>
<pubdate type="primary">
<date>
<year>1999</year>
</date>
</pubdate>
<city>Sebastopol</city>
<publisher>O'Reilly</publisher>
<serial>1-56592-580-7</serial>
<address>millera@dinosaurs.upenn.edu</address>
<link type="url">http://www.dinosaurs.upenn.edu/</url>
</pubinfo>
    
refdb-1.0.2/doc/risx/ele-desc/publication.html000644 001750 001750 00000003036 11512721661 022060 0ustar00markusmarkus000000 000000 publication description

Description

The publication element contains the information related to a published work. Roughly speaking, this is what you find on the shelf of a library. This corresponds to the monographic level of bibliographic information.

Example

<entry type="CHAP" id="32" citekey="WALSH1999">
<part>
<title>XML: Principles, Tools, and Techniques</title>
<author>
<lastname>Walsh</lastname>
<firstname>N</firstname>
</author>
</part>
<publication>
<title>Guide to XML</title>
<author>
<lastname>Connolly</lastname>
<firstname>D</firstname>
</author>
<pubinfo>
<pubdate type="primary">
<date>
<year>1999</year>
</date>
</pubdate>
<city>Sebastopol</city>
<publisher>O'Reilly</publisher>
</pubinfo>
</publication>
<libinfo user="markus"><notes>Not bad</notes>
<reprint status="NOTINFILE"/></libinfo>
<contents><abstract>An introduction how to deal with XML</abstract>
<keyword>XML</keyword>
<keyword>computer</keyword>
<keyword>markup languages</keyword>
</contents>
</entry>
    
refdb-1.0.2/doc/risx/ele-desc/publisher.html000644 001750 001750 00000001326 11512721661 021544 0ustar00markusmarkus000000 000000 publisher description

Description

The publisher element contains the name of the publisher of a publication.

Example

<pubinfo>
<pubdate type="primary">
<date>
<year>1999</year>
</date>
</pubdate>
<city>Sebastopol</city>
<publisher>O'Reilly</publisher>
<serial>1-56592-580-7</serial>
<address>millera@dinosaurs.upenn.edu</address>
<link type="url">http://www.dinosaurs.upenn.edu/</url>
</pubinfo>
    
refdb-1.0.2/doc/risx/ele-desc/reprint.html000644 001750 001750 00000001557 11512721661 021240 0ustar00markusmarkus000000 000000 reprint description

Description

The reprint element specifies the status of a reprint request.

The status attribute can be set to one of "NOTINFILE", "ONREQUEST", or "INFILE" to specify that no local copy is available, that a reprint was requested, and that a local copy is available, respectively. In the case of "ONREQUEST", an optional date element can be used to provide the date when the reprint was requested.

Example

<libinfo user="jdoe">
<notes>Not bad, after all</notes>
<reprint status="INFILE"/>
<availability type="useroot">palaeontology/dinosaurs/millera2002.pdf</availability>
</libinfo>
    
refdb-1.0.2/doc/risx/ele-desc/ris.html000644 001750 001750 00000001012 11512721661 020334 0ustar00markusmarkus000000 000000 ris description

Description

ris is a container for one or more entry elements. Each entry contains one complete bibliographic dataset.

Example

<ris>
<entry type="ABST" citekey="MILLER1999">
...
</entry>
<entry type="BOOK" citekey="JONES2000">
...
</entry>
</ris>
    
refdb-1.0.2/doc/risx/ele-desc/serial.html000644 001750 001750 00000001426 11512721661 021027 0ustar00markusmarkus000000 000000 serial description

Description

The serial element contains an ISSN or ISBN. These numbers are provided by the publisher in order to unambiguously identify a published work.

Example

<pubinfo>
<pubdate type="primary">
<date>
<year>1999</year>
</date>
</pubdate>
<city>Sebastopol</city>
<publisher>O'Reilly</publisher>
<serial>1-56592-580-7</serial>
<address>millera@dinosaurs.upenn.edu</address>
<link type="url">http://www.dinosaurs.upenn.edu/</url>
</pubinfo>
    
refdb-1.0.2/doc/risx/ele-desc/set.html000644 001750 001750 00000004120 11512721661 020335 0ustar00markusmarkus000000 000000 set description

Description

The set element contains the information related to a series of published works. This corresponds to the series level of bibliographic information.

Example

<entry type="BOOK" id="31" citekey="MILLER1999">
<publication>
<title>My first book about dinosaurs</title>
<author>
<lastname>Miller</lastname>
<firstname>A</firstname>
</author>
<author>
<lastname>Myers</lastname>
<firstname>B</firstname>
<middlename>B</middlename>
<suffix>Jr.</suffix>
</author>
<pubinfo>
<pubdate type="primary">
<date>
<year>1999</year>
</date>
</pubdate>
<city>Sebastopol</city>
<publisher>O'Reilly</publisher>
<serial>1-56592-580-7</serial>
<address>millera@dinosaurs.upenn.edu</address>
<link type="url">http://www.dinosaurs.upenn.edu/</url>
</pubinfo>
</publication>
<set>
<title>My first book series</title>
<author>
<lastname>Smith</lastname>
<firstname>K</firstname>
</author>
</set>
<libinfo user="markus">
<notes>Not bad, after all</notes>
<reprint status="ONREQUEST">
<date>
<year>2002</year>
<month>2</month>
<day>24</day>
</date>
</reprint>
<availability type="useroot">palaeontology/dinosaurs/millera2002.pdf</availability>
</libinfo>
<contents>
<abstract>Dinosaurs were big animals that ate a lot</abstract>
<keyword>dinosaurs</keyword>
<keyword>evolution</keyword>
<keyword>animals</keyword>
</contents>
</entry>
    
refdb-1.0.2/doc/risx/ele-desc/startpage.html000644 001750 001750 00000001233 11512721661 021536 0ustar00markusmarkus000000 000000 startpage description

Description

Journal and magazine articles are usually published on a range of pages. The startpage element specifies the first page of an article.

Example

<pubinfo>
<pubdate type="primary">
<date>
<year>2002</year>
</date>
</pubdate>
<volume>63</volume>
<issue>4</issue>
<startpage>577</startpage>
<endpage>85</endpage>
</pubinfo>
    
refdb-1.0.2/doc/risx/ele-desc/suffix.html000644 001750 001750 00000001005 11512721661 021045 0ustar00markusmarkus000000 000000 suffix description

Description

The suffix element contains an optional suffix of an author or editor, such as "3rd", "Jr.".

Example

<author>
<lastname>Myers</lastname>
<firstname>B</firstname>
<middlename>B</middlename>
<suffix>Jr.</suffix>
</author>
    
refdb-1.0.2/doc/risx/ele-desc/title.html000644 001750 001750 00000003345 11512721661 020673 0ustar00markusmarkus000000 000000 title description

Description

The title element contains the title of a part, publication, or set element.

The type attribute should be set to "gen" for all titles except the names of periodicals. In that case, multiple titles can be specified and distinguished by the attribute values "abbrev", "full", "user1", "user2" to denote the official abbreviation of the periodical name (usually as specified by the Index Medicus), the full name, and up to two user-specified abbreviations, respectively.

The freq and relfreq attributes may be used by database applications to export the frequency (the total number of references using a periodical) and the relative frequency (a numerical value between 0 and 10), respectively, of the given periodical in the database. The attributes are meaningless in non-periodical titles. As these are properties of a particular collection of datasets in that database, the attributes are ignored during import.

Example

<publication>
<title type="abbrev">Biochem.Pharmacol.</title>
<title type="full">Biochemical Pharmacology</title>
<title type="user1">BP</title>
<pubinfo>
<pubdate type="primary">
<date>
<year>2002</year>
</date>
</pubdate>
<volume>63</volume>
<issue>4</issue>
<startpage>577</startpage>
<endpage>85</endpage>
</pubinfo>
</publication>
    
refdb-1.0.2/doc/risx/ele-desc/url.html000644 001750 001750 00000001430 11512721661 020345 0ustar00markusmarkus000000 000000 url description

Description

The url element holds the unique resource locator (URL) of an electronic version of the publication or of electronic information relevant to that publication.

Example

<pubinfo>
<pubdate type="primary">
<date>
<year>1999</year>
</date>
</pubdate>
<city>Sebastopol</city>
<publisher>O'Reilly</publisher>
<serial>1-56592-580-7</serial>
<address>millera@dinosaurs.upenn.edu</address>
<url>http://www.dinosaurs.upenn.edu/</url>
</pubinfo>
    
refdb-1.0.2/doc/risx/ele-desc/userdef.html000644 001750 001750 00000002106 11512721661 021201 0ustar00markusmarkus000000 000000 userdef description

Description

The userdef element is an all-purpose element to store information not covered by the other elements. For reasons of consistency, a reference database administrator should figure out rules which kind of information should be stored in the userdef element.

The type element can be set to one of "1", "2", "3", "4", or "5", thus allowing to use 5 different userdef elements per dataset.

Example

<pubinfo>
<pubdate type="primary">
<date>
<year>1999</year>
</date>
</pubdate>
<city>Sebastopol</city>
<publisher>O'Reilly</publisher>
<serial>1-56592-580-7</serial>
<address>millera@dinosaurs.upenn.edu</address>
<link type="url">http://www.dinosaurs.upenn.edu/</url>
<userdef type="1">high</userdef>
</pubinfo>
    
refdb-1.0.2/doc/risx/ele-desc/volume.html000644 001750 001750 00000001146 11512721661 021056 0ustar00markusmarkus000000 000000 volume description

Description

The volume element specifies the volume of a periodical that an article appeared in.

Example

<pubinfo>
<pubdate type="primary">
<date>
<year>2002</year>
</date>
</pubdate>
<volume>63</volume>
<issue>4</issue>
<startpage>577</startpage>
<endpage>85</endpage>
</pubinfo>
    
refdb-1.0.2/doc/risx/ele-desc/year.html000644 001750 001750 00000001044 11512721661 020504 0ustar00markusmarkus000000 000000 year description

Description

The year element holds the year information of a date element. The year should be specified as a numeric 4-digit value.

Example

<pubdate type="primary">
<date>
<year>1999</year>
<month>11</month>
<day>12</day>
</date>
</pubdate>
    
refdb-1.0.2/doc/citestylex/ele-desc/000755 001750 001750 00000000000 12303477605 020074 5ustar00markusmarkus000000 000000 refdb-1.0.2/doc/citestylex/dtdelem/000755 001750 001750 00000000000 12303477605 020031 5ustar00markusmarkus000000 000000 refdb-1.0.2/doc/citestylex/elements/000755 001750 001750 00000000000 12303477605 020227 5ustar00markusmarkus000000 000000 refdb-1.0.2/doc/citestylex/dtdelem.html000644 001750 001750 00000013256 12247746231 020727 0ustar00markusmarkus000000 000000 citestyle XML DTD: Elements
citestyle XML DTD: DTD Element View [User Element View]
[Home]  

A | B | C | D | E | F | I | J | L | M | N | O | P | R | S | T | U | V | Y

Top level element: STYLESET.

A

ABBREVIATEFIRST
ABBREVIATESUBSEQ
ABSTRACT
ADDRESS
AEMPTY
APR
AREA
ASAME
AUG
AUTHOR
AUTHORLIST
AUTHORNAMES
AUTHORONLY
AUTHORSEPS

B

BIBLIOTITLE
BIBSTYLE

C

CHAPTERNUM
CITEKEY
CITESTYLE
CITSEPARATOR
CITSTYLE
CLASSCODEINTL
CLASSCODEUS
CLASSIFICATION
COMMENT
COMPUTER
CONFERENCELOCATION

D

DEC
DEGREE

E

EDITION

F

FEB
FIRSTSEP
FOLLOWING

I

INTEXTDEF
ISSUE

J

JAN
JOURNALNAME
JUL
JUN

L

LINK

M

MAR
MAY
MEDIATYPE
MONTHS

N

NAMEFIRST
NAMEOTHER
NOTES
NOV
NUMVOLUMES

O

OCT
OSTYPE

P

PAGERANGE
PAGES
PAMPHLETNUM
PRECEEDING
PUBDATE
PUBLISHER
PUBPLACE
PUBTYPE

R

RANGESEPARATOR
RECIPIENTEMAIL
REFNUMBER
REFSTYLE
REGISTRYNUM
RUNNINGTIME

S

SECONDSEP
SECTION
SENDEREMAIL
SEP
SEPARATOR
SERIAL
SINGLEPAGE
STYLENAME
STYLESET

T

TEXT
TEXTED
TEXTMULTIPLE
TEXTSINGLE
THREESEPS
THREESEPSEACH
THREESEPSLAST
TITLE
TWOSEPS
TYPEOFWORK

U

URL
USERDEF

V

VOLUME

Y

YEARONLY


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdent.html000644 001750 001750 00000001041 12247746231 020560 0ustar00markusmarkus000000 000000 citestyle XML DTD: Entities
citestyle XML DTD: DTD Entity View [User Entity View]
[Home] [Elements]  


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements.html000644 001750 001750 00000013406 12247746231 021122 0ustar00markusmarkus000000 000000 citestyle XML DTD: Elements
citestyle XML DTD: User Element View [DTD Element View]
[Home]  

A | B | C | D | E | F | I | J | L | M | N | O | P | R | S | T | U | V | Y

Top level element: STYLESET.

A

ABBREVIATEFIRST
ABBREVIATESUBSEQ
ABSTRACT
ADDRESS
AEMPTY
APR
AREA
ASAME
AUG
AUTHOR
AUTHORLIST
AUTHORNAMES
AUTHORONLY
AUTHORSEPS

B

BIBLIOTITLE
BIBSTYLE

C

CHAPTERNUM
CITEKEY
CITESTYLE
CITSEPARATOR
CITSTYLE
CLASSCODEINTL
CLASSCODEUS
CLASSIFICATION
COMMENT
COMPUTER
CONFERENCELOCATION

D

DEC
DEGREE

E

EDITION

F

FEB
FIRSTSEP
FOLLOWING

I

INTEXTDEF
ISSUE

J

JAN
JOURNALNAME
JUL
JUN

L

LINK

M

MAR
MAY
MEDIATYPE
MONTHS

N

NAMEFIRST
NAMEOTHER
NOTES
NOV
NUMVOLUMES

O

OCT
OSTYPE

P

PAGERANGE
PAGES
PAMPHLETNUM
PRECEEDING
PUBDATE
PUBLISHER
PUBPLACE
PUBTYPE

R

RANGESEPARATOR
RECIPIENTEMAIL
REFNUMBER
REFSTYLE
REGISTRYNUM
RUNNINGTIME

S

SECONDSEP
SECTION
SENDEREMAIL
SEP
SEPARATOR
SERIAL
SINGLEPAGE
STYLENAME
STYLESET

T

TEXT
TEXTED
TEXTMULTIPLE
TEXTSINGLE
THREESEPS
THREESEPSEACH
THREESEPSLAST
TITLE
TWOSEPS
TYPEOFWORK

U

URL
USERDEF

V

VOLUME

Y

YEARONLY


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/entities.html000644 001750 001750 00000001040 12247746231 021121 0ustar00markusmarkus000000 000000 citestyle XML DTD: Entities
citestyle XML DTD: User Entity View [DTD Entity View]
[Home] [Elements]  


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/index.html000644 001750 001750 00000001227 12247746231 020413 0ustar00markusmarkus000000 000000 citestyle XML DTD

citestyle XML DTD

[Elements]

The citestyle XML DTD is identified with:

  • The system identifier: "http://refdb.sourceforge.net/dtd/citestylex.dtd"

It is composed of 88 elements, no entities, and no notations.

  • 88 elements
  • 0 entities
  • 0 notations

It claims to be an XML DTD. Element names are case sensitive. Entity names are case sensitive.


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/notations.html000644 001750 001750 00000000771 12247746231 021325 0ustar00markusmarkus000000 000000 citestyle XML DTD: Notations
citestyle XML DTD: Notation View  
[Home] [Elements]  


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/abbreviatefirst.html000644 001750 001750 00000005352 12247746231 024277 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element ABBREVIATEFIRST
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Next]

Element ABBREVIATEFIRST

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

Name Type Default Value
DISPLAYAUTHOR CDATA Required
MAXAUTHOR CDATA Required
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

In certain cases it is not desired to render the whole list of authors, esp. in in-text citations. The ABBREVIATEFIRST element contains the string that is to be printed instead of the suppressed authors in the first citation of this reference in the text. ABBREVIATESUBSEQ defines the string for all subsequent citations

The MAXAUTHOR attribute denotes the maximum number of authors that should be displayed in the authorlist. Up to this limit, all authors will be rendered. Above this limit, the content of the element will be printed instead of the suppressed authors.

The DISPLAYAUTHOR attribute denotes the number of authors that will actually be rendered if the total number of authors exceed the limit in MAXAUTHOR.

Parents

AUTHORLIST

Example

<AUTHORLIST role="PRIMARY">
<ABBREVIATEFIRST MAXAUTHOR="4" DISPLAYAUTHOR="3">, et al</ABBREVIATEFIRST>
<ABBREVIATESUBSEQ MAXAUTHOR="4" DISPLAYAUTHOR="1">, et al</ABBREVIATESUBSEQ>
...
</AUTHORLIST>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/abbreviatesubseq.html000644 001750 001750 00000005417 12247746231 024454 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element ABBREVIATESUBSEQ
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element ABBREVIATESUBSEQ

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

Name Type Default Value
DISPLAYAUTHOR CDATA Required
MAXAUTHOR CDATA Required
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

In certain cases it is not desired to render the whole list of authors, esp. in in-text citations. The ABBREVIATEFIRST element contains the string that is to be printed instead of the suppressed authors in the first citation of this reference in the text. ABBREVIATESUBSEQ defines the string for all subsequent citations

The MAXAUTHOR attribute denotes the maximum number of authors that should be displayed in the authorlist. Up to this limit, all authors will be rendered. Above this limit, the content of the element will be printed instead of the suppressed authors.

The DISPLAYAUTHOR attribute denotes the number of authors that will actually be rendered if the total number of authors exceed the limit in MAXAUTHOR.

Parents

AUTHORLIST

Example

<AUTHORLIST role="PRIMARY">
<ABBREVIATEFIRST MAXAUTHOR="4" DISPLAYAUTHOR="3">, et al</ABBREVIATEFIRST>
<ABBREVIATESUBSEQ MAXAUTHOR="4" DISPLAYAUTHOR="1">, et al</ABBREVIATESUBSEQ>
...
</AUTHORLIST>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/abstract.html000644 001750 001750 00000004145 12247746231 022725 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element ABSTRACT
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element ABSTRACT

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

Name Type Default Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

ABSTRACT describes how the abstract of a publication is to be rendered.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Parents

PUBTYPE

Children

FOLLOWING, PRECEEDING

Example

<ABSTRACT>
<PRECEEDING>, </PRECEEDING>
</ABSTRACT>   

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/address.html000644 001750 001750 00000004136 12247746231 022547 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element ADDRESS
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element ADDRESS

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

Name Type Default Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

ADDRESS describes how the contact address of a publication is to be rendered.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Parents

PUBTYPE

Children

FOLLOWING, PRECEEDING

Example

<ADDRESS>
<PRECEEDING>, </PRECEEDING>
</ADDRESS>   

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/aempty.html000644 001750 001750 00000004434 12247746231 022422 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element AEMPTY
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element AEMPTY

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

AEMPTY defines a string that is to be printed if the author of a reference is unknown. The string is used if the "alternatetext" attribute of AUTHORLIST says so.

Parents

AUTHORLIST

Example

<AUTHORLIST role="PUB" alternatetext="AEMPTY">
<FOLLOWING> </FOLLOWING>
<ABBREVIATEFIRST MAXAUTHOR="256" DISPLAYAUTHOR="255">, et al</ABBREVIATEFIRST>
<ABBREVIATESUBSEQ MAXAUTHOR="256" DISPLAYAUTHOR="255">, et al</ABBREVIATESUBSEQ>
<AEMPTY>Anonymous</AEMPTY>
<AUTHORSEPS>
<TWOSEPS> and </TWOSEPS>
<THREESEPS>
<THREESEPSEACH>, </THREESEPSEACH>
<THREESEPSLAST>, and </THREESEPSLAST>
</THREESEPS>
</AUTHORSEPS>
<AUTHORNAMES>
<NAMEFIRST NAMEORDER="LASTFIRSTMIDDLE" INITIALSTYLE="F.M." UPPERCASE="NONE">
<NAMEOTHER NAMEORDER="FIRSTMIDDLELAST" INITIALSTYLE="F.M." UPPERCASE="NONE">
</AUTHORNAMES>
<TEXT>
<TEXTSINGLE>
<FOLLOWING>, </FOLLOWING>
</TEXTSINGLE>
<TEXTMULTIPLE>
<FOLLOWING>, </FOLLOWING>
</TEXTMULTIPLE>
</TEXT>
<TEXTED>
<TEXTSINGLE>
<FOLLOWING>, </FOLLOWING>
</TEXTSINGLE>
<TEXTMULTIPLE>
<FOLLOWING>, </FOLLOWING>
</TEXTMULTIPLE>
</TEXTED>
</AUTHORLIST>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/apr.html000644 001750 001750 00000003300 12247746231 021674 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element APR
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element APR

Synopsis

Content Model

EMPTY

Attributes

Name Type Default Value
THREELET CDATA None
ABBREV CDATA None
FULL CDATA None

Description

APR defines the full name, abbreviation, and three-letter abbreviation, if applicable, for the month April in the language of the publication.

Parents

MONTHS

Example

<MONTHS>
...
<APR FULL="April" ABBREV="Apr." THREELET="Apr"/>
...
</MONTHS>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/area.html000644 001750 001750 00000004077 12247746231 022036 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element AREA
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element AREA

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

Name Type Default Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

AREA describes how the area information of a map is to be rendered.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Parents

PUBTYPE

Children

FOLLOWING, PRECEEDING

Example

<AREA>
<PRECEEDING>, </PRECEEDING>
</AREA>   

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/asame.html000644 001750 001750 00000002565 12247746231 022214 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element ASAME
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element ASAME

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

ASAME defines a string that is to be printed instead of the authorlist for subsequent references of the same author(s). This is obviously only useful for bibliographies sorted by author names. If the element is defined and empty, the processing system is expected to suppress the authorlist.

Parents

AUTHORLIST

Example

<AUTHORLIST role="PRIMARY">
...
<ASAME>----</ASAME>
...
</AUTHORLIST>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/aug.html000644 001750 001750 00000003303 12247746231 021671 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element AUG
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element AUG

Synopsis

Content Model

EMPTY

Attributes

Name Type Default Value
THREELET CDATA None
ABBREV CDATA None
FULL CDATA None

Description

AUG defines the full name, abbreviation, and three-letter abbreviation, if applicable, for the month August in the language of the publication.

Parents

MONTHS

Example

<MONTHS>
...
<AUG FULL="August" ABBREV="Aug." THREELET="Aug"/>
...
</MONTHS>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/author.html000644 001750 001750 00000002147 12247746231 022424 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element AUTHOR
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element AUTHOR

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

AUTHOR contains the name and/or the email address of the style author.

Parents

CITESTYLE

Example

<AUTHOR>Barney Gumble</AUTHOR>

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/authorlist.html000644 001750 001750 00000014133 12247746231 023316 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element AUTHORLIST
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element AUTHORLIST

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?,ABBREVIATEFIRST?,ABBREVIATESUBSEQ?,AEMPTY?,
 ASAME?,AUTHORSEPS,AUTHORNAMES,TEXT?,TEXTED?)

Attributes

Name Type Default Value
ALTERNATESTYLE Enumeration:
  ABOLD
  ABOLDITALIC
  ABOLDITULINE
  ABOLDULINE
  AITALIC
  AITULINE
  ASUB
  ASUPER
  AULINE
  NONE
None
ALTERNATETEXT Enumeration:
  AEMPTY
  JOURNALNAME
  NONE
  TITLEALL
  TITLEPART
  TITLEPUB
  TITLESERIES
"AEMPTY"
ROLE Enumeration:
  ALL
  PART
  PUB
  SERIES
"PUB"
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

AUTHORLIST is a wrapper for the authors of a publication.

The ROLE attribute defines the purpose of the authorlist. The value of the attribute can be:

  • PART: The authors of an article or a chapter.
  • PUB: The authors or editors of a monographic item like a book or a report.
  • SERIES: The editors of a series of books.
  • ALL: Use this value if it is uncertain which of the above informationi will be available. The processing application should test the availability of author data in the sequence PART, PUB, SERIES, and display the first information it encounters.

The ALTERNATETEXT attribute determines what to print in place of an author list if a bibliographic entry does not contain authors or editors. Possible values are:

  • NONE: nothing will be printed instead
  • AEMPTY: the string defined in the element AEMPTY is printed
  • TITLEPART: use the title of the analytical level
  • TITLEPUB: use the title of the monographic level
  • TITLESERIES: use the title of the series level
  • TITLEALL: use the first available title. Processing applications should check for titles in the order PART, PUB, SERIES.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

The ALTERNATESTYLE attribute serves a similar purpose, but is used if a reference has no author and the title is used in the position of the authorlist. The formatting may then differ from a regular authorlist.

Parents

AUTHORONLY, INTEXTDEF, PUBTYPE, YEARONLY

Children

ABBREVIATEFIRST, ABBREVIATESUBSEQ, AEMPTY, ASAME, AUTHORNAMES, AUTHORSEPS, FOLLOWING, PRECEEDING, TEXT, TEXTED

Example

<AUTHORLIST role="PUB">
<FOLLOWING> </FOLLOWING>
<ABBREVIATEFIRST MAXAUTHOR="256" DISPLAYAUTHOR="255">, et al</ABBREVIATEFIRST>
<ABBREVIATESUBSEQ MAXAUTHOR="256" DISPLAYAUTHOR="255">, et al</ABBREVIATESUBSEQ>
<AEMPTY>Anonymous</AEMPTY>
<AUTHORSEPS>
<TWOSEPS> and </TWOSEPS>
<THREESEPS>
<THREESEPSEACH>, </THREESEPSEACH>
<THREESEPSLAST>, and </THREESEPSLAST>
</THREESEPS>
</AUTHORSEPS>
<AUTHORNAMES>
<NAMEFIRST NAMEORDER="LASTFIRSTMIDDLE" INITIALSTYLE="F.M." UPPERCASE="NONE">
<NAMEOTHER NAMEORDER="FIRSTMIDDLELAST" INITIALSTYLE="F.M." UPPERCASE="NONE">
</AUTHORNAMES>
<TEXT>
<TEXTSINGLE>
<FOLLOWING>, </FOLLOWING>
</TEXTSINGLE>
<TEXTMULTIPLE>
<FOLLOWING>, </FOLLOWING>
</TEXTMULTIPLE>
</TEXT>
<TEXTED>
<TEXTSINGLE>
<FOLLOWING>, </FOLLOWING>
</TEXTSINGLE>
<TEXTMULTIPLE>
<FOLLOWING>, </FOLLOWING>
</TEXTMULTIPLE>
</TEXTED>
</AUTHORLIST>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/authornames.html000644 001750 001750 00000003042 12247746231 023443 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element AUTHORNAMES
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element AUTHORNAMES

Synopsis

Content Model

(NAMEFIRST,NAMEOTHER)

Attributes

None

Description

AUTHORNAMES is a wrapper for the name specification of authors. It holds the NAMEFIRST and NAMEOTHER elements.

Parents

AUTHORLIST

Children

NAMEFIRST, NAMEOTHER

Example

<AUTHORNAMES>
<NAMEFIRST NAMEORDER="LASTFIRSTMIDDLE" INITIALSTYLE="F.M." UPPERCASE="NONE">
<NAMEOTHER NAMEORDER="FIRSTMIDDLELAST" INITIALSTYLE="F.M." UPPERCASE="NONE">
</AUTHORNAMES>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/authoronly.html000644 001750 001750 00000006063 12247746231 023327 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element AUTHORONLY
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element AUTHORONLY

Synopsis

Content Model

(((REFNUMBER|AUTHORLIST|PUBDATE|TITLE|JOURNALNAME|VOLUME|ISSUE|
   PAGES|PUBLISHER|PUBPLACE),
  SEPARATOR?)+)

Attributes

None

Description

AUTHORONLY is the wrapper for the information that defines the appearance of an in-text citation that shows only the authors. It can have the same children as a PUBTYPE element. This element should be used in conjunction with the YEARONLY element to obtain a citation format that keeps the authors in the flow of the normal text, as shown in the following example sentence:

... as was shown by Smith and Miller in a recent publication (2001).

Parents

CITSTYLE

Children

AUTHORLIST, ISSUE, JOURNALNAME, PAGES, PUBDATE, PUBLISHER, PUBPLACE, REFNUMBER, SEPARATOR, TITLE, VOLUME

Example

<AUTHORONLY>
<AUTHORLIST>
<FOLLOWING>. </FOLLOWING>
<ABBREVIATE MAXAUTHOR="4" DISPLAYAUTHOR="1" ROLE="ALL"> et al. </ABBREVIATE>
<AUTHORSEPS>
<TWOSEPS> and </TWOSEPS>
<THREESEPS>
<THREESEPSEACH>, </THREESEPSEACH>
<THREESEPSLAST>, and </THREESEPSLAST>
</THREESEPS>
</AUTHORSEPS>
<AUTHORNAMES>
<NAMEFIRST NAMEORDER="LASTFIRSTMIDDLE" INITIALSTYLE="FIRSTSPCMIDDLE" UPPERCASE="NONE">
<NAMEOTHER NAMEORDER="LASTFIRSTMIDDLE" INITIALSTYLE="FIRSTSPCMIDDLE" UPPERCASE="NONE">
</AUTHORNAMES>
<TEXT>
<TEXTSINGLE>
<FOLLOWING>, </FOLLOWING>
</TEXTSINGLE>
<TEXTMULTIPLE>
<FOLLOWING>, </FOLLOWING>
</TEXTMULTIPLE>
</TEXT>
</AUTHORLIST>
</AUTHORONLY>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/authorseps.html000644 001750 001750 00000003024 12247746231 023312 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element AUTHORSEPS
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element AUTHORSEPS

Synopsis

Content Model

(TWOSEPS,THREESEPS)

Attributes

None

Description

AUTHORSEPS is a wrapper for the separators between authors. It holds the TWOSEPS and THREESEPS elements.

Parents

AUTHORLIST

Children

THREESEPS, TWOSEPS

Example

<AUTHORSEPS>
<TWOSEPS> and </TWOSEPS>
<THREESEPS>
<THREESEPSEACH>, </THREESEPSEACH>
<THREESEPSLAST>, and </THREESEPSLAST>
</THREESEPS>
</AUTHORSEPS>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/bibliotitle.html000644 001750 001750 00000002566 12247746231 023431 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element BIBLIOTITLE
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element BIBLIOTITLE

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

BIBLIOTITLE specifies the string which is to be used as the header of the bibliography. It is not uncommon to use "Bibliography" here.

Parents

BIBSTYLE

Example

<CITSTYLE INTEXTSEQUENCE="AUTHORDATE">
<CITSEPARATOR>;</CITSEPARATOR>
<RANGESEPARATOR>-</RANGESEPARATOR>
<INTEXTDEF>
<REFNUMBER>
</REFNUMBER>
</INTEXTDEF>
</CITSTYLE>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/bibstyle.html000644 001750 001750 00000005772 12247746231 022746 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element BIBSTYLE
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element BIBSTYLE

Synopsis

Content Model

(BIBLIOTITLE?,MONTHS?)

Attributes

Name Type Default Value
BIBLIOFIRSTINDENT CDATA None
BIBLIOSEQUENCE Enumeration:
  BASIS
  BAUTHORDATE
  BCITEKEY
  BDATEASC
  BDATEDESC
"BAUTHORDATE"
BIBLIOBLOCKINDENT CDATA None
FONTSIZE CDATA None

Description

BIBSTYLE defines the general appearance of the bibliography.

The BIBLIOSEQUENCE attribute specifies the sorting order of the references in the bibliography. Possible values are:

  • BASIS: The references appear in the sequence as they are first cited in the text
  • BAUTHORDATE: The references are sorted by authornames and publication dates.
  • BCITEKEY: The references are sorted by citation keys.
  • BDATEASC: The references are sorted by date, older entries first.
  • BDATEDESC: The references are sorted by date, older entries last.

The BIBLIOFIRSTINDENT attribute can be used to specify the indentation of the first line of each reference in the bibliography listing, e.g. to create hanging indents.

The BIBLIOBLOCKINDENT attribute does the same for the remaining lines of each reference.

The FONTSIZE attribute sets the font size of the bibliography.

Parents

CITESTYLE

Children

BIBLIOTITLE, MONTHS

Example

<BIBSTYLE BIBLIOSEQUENCE="BASIS">
<BIBLIOTITLE>Literatur</BIBLIOTITLE>
<MONTHS>
...
</MONTHS>
</BIBSTYLE>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/chapternum.html000644 001750 001750 00000004162 12247746231 023267 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element CHAPTERNUM
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element CHAPTERNUM

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

Name Type Default Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

CHAPTERNUM describes how the number of a chapter within a book is to be rendered.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Parents

PUBTYPE

Children

FOLLOWING, PRECEEDING

Example

<CHAPTERNUM>
<PRECEEDING>, </PRECEEDING>
</CHAPTERNUM>   

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/citekey.html000644 001750 001750 00000004614 12247746231 022560 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element CITEKEY
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element CITEKEY

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

Name Type Default Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

CITEKEY describes the appearance of a citation key in the bibliography or the in-text citation.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Parents

INTEXTDEF, PUBTYPE

Children

FOLLOWING, PRECEEDING

Example

<CITSTYLE INTEXTSEQUENCE="CITEKEY">
<CITSEPARATOR>;</CITSEPARATOR>
<RANGESEPARATOR>-</RANGESEPARATOR>
<INTEXTDEF>
<CITEKEY STYLE="BOLD">
<PRECEEDING>[</PRECEEDING>
<FOLLOWING>]</FOLLOWING>
</CITEKEY>
</INTEXTDEF>
</CITSTYLE>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/citestyle.html000644 001750 001750 00000004511 12247746231 023124 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element CITESTYLE
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element CITESTYLE

Synopsis

Content Model

(STYLENAME,AUTHOR?,COMMENT?,URL?,REFSTYLE,CITSTYLE,BIBSTYLE)

Attributes

None

Description

CITESTYLE specifies the citation style and the bibliography style of a particular journal or other publication. The style consists of a STYLENAME element to provide a unique name for the style, a REFSTYLE element to define the rendering of the various publication types, a CITSTYLE element to define the citation style, and of a BIBSTYLE element which defines the general appearance of the bibliographic listing.

Parents

STYLESET

Children

AUTHOR, BIBSTYLE, CITSTYLE, COMMENT, REFSTYLE, STYLENAME, URL

Example

<CITESTYLE>
<STYLENAME>Br.J.Chem.</STYLENAME>
<REFSTYLE>
<PUBTYPE TYPE="GEN">
...
</PUBTYPE>
<PUBTYPE TYPE="JOUR">
...
</PUBTYPE>
</REFSTYLE>
<CITSTYLE INTEXTSEQUENCE="AUTHORDATE">
...
</CITSTYLE>
<BIBSTYLE BIBLIOSEQUENCE="BAUTHORDATE">
...
</BIBSTYLE>
</CITESTYLE>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/citseparator.html000644 001750 001750 00000002643 12247746232 023624 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element CITSEPARATOR
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element CITSEPARATOR

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

CITSEPARATOR specifies a string which separates multiple citations like in (Jones, 2000; James, 2001).

Parents

CITSTYLE

Example

<CITSTYLE INTEXTSEQUENCE="AUTHORDATE">
<CITSEPARATOR>;</CITSEPARATOR>
<RANGESEPARATOR>-</RANGESEPARATOR>
<INTEXTDEF>
<REFNUMBER>
<PRECEEDING>[</PRECEEDING>
<FOLLOWING>]<FOLLOWING>
</REFNUMBER>
</INTEXTDEF>
</CITSTYLE>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/citstyle.html000644 001750 001750 00000007007 12247746232 022763 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element CITSTYLE
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element CITSTYLE

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?,CITSEPARATOR,RANGESEPARATOR?,INTEXTDEF?,
 AUTHORONLY?,YEARONLY?)

Attributes

Name Type Default Value
INTEXTSEQUENCE Enumeration:
  ASIS
  AUTHORDATE
  CITEKEY
  DATEASC
  DATEDESC
"AUTHORDATE"
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

CITSTYLE defines the in-text citation style of the bibliography.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

The INTEXTSEQUENCE attribute specifies the sorting order of citations within a multiple in-text citation. The value can be one of the following:

  • ASIS: The citations appear in the sequence as they are cited in the text
  • AUTHORDATE: The citations are sorted by authornames and publication dates.
  • CITEKEY: The citations are sorted by the citation keys.
  • DATEASC: The citations are sorted by date, older entries first.
  • DATEDESC: The citations are sorted by date, older entries last.

Parents

CITESTYLE

Children

AUTHORONLY, CITSEPARATOR, FOLLOWING, INTEXTDEF, PRECEEDING, RANGESEPARATOR, YEARONLY

Example

<CITSTYLE INTEXTSEQUENCE="AUTHORDATE">
<CITSEPARATOR>;</CITSEPARATOR>
<RANGESEPARATOR>-</RANGESEPARATOR>
<INTEXTDEF>
<REFNUMBER>
<PRECEEDING>[</PRECEEDING>
<FOLLOWING>]</FOLLOWING>
</REFNUMBER>
</INTEXTDEF>
</CITSTYLE>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/classcodeintl.html000644 001750 001750 00000004213 12247746232 023746 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element CLASSCODEINTL
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element CLASSCODEINTL

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

Name Type Default Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

CLASSCODEINTL describes how the international class code of a patent is to be rendered.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Parents

PUBTYPE

Children

FOLLOWING, PRECEEDING

Example

<CLASSCODEINTL>
<PRECEEDING>, </PRECEEDING>
</CLASSCODEINTL>   

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/classcodeus.html000644 001750 001750 00000004174 12247746232 023435 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element CLASSCODEUS
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element CLASSCODEUS

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

Name Type Default Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

CLASSCODEUS describes how the US class code of a patent is to be rendered.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Parents

PUBTYPE

Children

FOLLOWING, PRECEEDING

Example

<CLASSCODEUS>
<PRECEEDING>, </PRECEEDING>
</CLASSCODEUS>   

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/classification.html000644 001750 001750 00000004246 12247746232 024120 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element CLASSIFICATION
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element CLASSIFICATION

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

Name Type Default Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

CLASSIFICATION describes how the classification of a movie, of a video, or of a sound track is to be rendered.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Parents

PUBTYPE

Children

FOLLOWING, PRECEEDING

Example

<CLASSIFICATION>
<PRECEEDING>, </PRECEEDING>
</CLASSIFICATION>   

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/comment.html000644 001750 001750 00000002167 12247746232 022567 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element COMMENT
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element COMMENT

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

COMMENT contains a brief description of the style.

Parents

CITESTYLE

Example

<COMMENT>Tissue Engineering, Mary Ann Liebert</COMMENT>

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/computer.html000644 001750 001750 00000004171 12247746232 022760 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element COMPUTER
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element COMPUTER

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

Name Type Default Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

COMPUTER describes how the hardware information of a computer program is to be rendered.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Parents

PUBTYPE

Children

FOLLOWING, PRECEEDING

Example

<COMPUTER>
<PRECEEDING>, </PRECEEDING>
</COMPUTER>   

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/conferencelocation.html000644 001750 001750 00000004225 12247746232 024762 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element CONFERENCELOCATION
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element CONFERENCELOCATION

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

Name Type Default Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

CONFERENCELOCATION describes how the location of a conference is to be rendered.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Parents

PUBTYPE

Children

FOLLOWING, PRECEEDING

Example

<CONFERENCELOCATION>
<PRECEEDING>, </PRECEEDING>
</CONFERENCELOCATION>   

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/dec.html000644 001750 001750 00000003317 12247746232 021656 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element DEC
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element DEC

Synopsis

Content Model

EMPTY

Attributes

Name Type Default Value
THREELET CDATA None
ABBREV CDATA None
FULL CDATA None

Description

DEC defines the full name, abbreviation, and three-letter abbreviation, if applicable, for the month December in the language of the publication.

Parents

MONTHS

Example

<MONTHS>
...
<DEC FULL="December" ABBREV="Dec." THREELET="Dec"/>
</MONTHS>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/degree.html000644 001750 001750 00000004104 12247746232 022351 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element DEGREE
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element DEGREE

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

Name Type Default Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

DEGREE describes how the type of a thesis is to be rendered.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Parents

PUBTYPE

Children

FOLLOWING, PRECEEDING

Example

<DEGREE>
<PRECEEDING>, </PRECEEDING>
</DEGREE>   

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/edition.html000644 001750 001750 00000004126 12247746232 022555 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element EDITION
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element EDITION

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

Name Type Default Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

EDITION describes how the edition of a monographic item is to be rendered.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Parents

PUBTYPE

Children

FOLLOWING, PRECEEDING

Example

<EDITION>
<PRECEEDING>, </PRECEEDING>
</EDITION>   

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/feb.html000644 001750 001750 00000003313 12247746232 021653 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element FEB
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element FEB

Synopsis

Content Model

EMPTY

Attributes

Name Type Default Value
THREELET CDATA None
ABBREV CDATA None
FULL CDATA None

Description

FEB defines the full name, abbreviation, and three-letter abbreviation, if applicable, for the month February in the language of the publication.

Parents

MONTHS

Example

<MONTHS>
...
<FEB FULL="February" ABBREV="Feb." THREELET="Feb"/>
...
</MONTHS>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/firstsep.html000644 001750 001750 00000002766 12247746232 022771 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element FIRSTSEP
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element FIRSTSEP

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

FIRSTSEP defines the first separator in a date entry. This is usually a slash or a dash or a period. The second separator, if applicable, is defined by SECONDSEP

Parents

PUBDATE

Example

<PUBDATE FORMAT="YES" SEQUENCE="MDY" MONTHFORMAT="ARABICMONTH" DAYFORMAT="ARABICDAY" YEARFORMAT="FOURDIGIT" PADLEADINGZERO="NN" ROLE="PRIMARY">
<FIRSTSEP>/</FIRSTSEP>
<SECONDSEP>/</SECONDSEP>
<PRECEEDING></PRECEEDING>
<FOLLOWING>. </FOLLOWING>
</PUBDATE>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/following.html000644 001750 001750 00000006275 12247746232 023131 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element FOLLOWING
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element FOLLOWING

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

All elements in PUBTYPE and equivalent wrappers can define strings that always precede (PRECEEDING) or follow the element. These may e.g. be punctuation characters or whitespace to separate the entries. In some cases the SEPARATOR element may be more appropriate.

Parents

ABSTRACT, ADDRESS, AREA, AUTHORLIST, CHAPTERNUM, CITEKEY, CITSTYLE, CLASSCODEINTL, CLASSCODEUS, CLASSIFICATION, COMPUTER, CONFERENCELOCATION, DEGREE, EDITION, ISSUE, JOURNALNAME, LINK, MEDIATYPE, NOTES, NUMVOLUMES, OSTYPE, PAGERANGE, PAGES, PAMPHLETNUM, PUBDATE, PUBLISHER, PUBPLACE, RECIPIENTEMAIL, REFNUMBER, REGISTRYNUM, RUNNINGTIME, SECTION, SENDEREMAIL, SERIAL, SINGLEPAGE, TEXTMULTIPLE, TEXTSINGLE, TITLE, TYPEOFWORK, USERDEF, VOLUME

Example

<PUBDATE FORMAT="YES" SEQUENCE="MDY" MONTHFORMAT="ARABICMONTH" DAYFORMAT="ARABICDAY" YEARFORMAT="FOURDIGIT" PADLEADINGZERO="NN" ROLE="PRIMARY">
<FIRSTSEP>/</FIRSTSEP>
<SECONDSEP>/</SECONDSEP>
<FOLLOWING>. </FOLLOWING>
</PUBDATE>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/intextdef.html000644 001750 001750 00000006002 12247746232 023107 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element INTEXTDEF
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element INTEXTDEF

Synopsis

Content Model

(((REFNUMBER|CITEKEY|AUTHORLIST|PUBDATE|TITLE|JOURNALNAME|VOLUME|
   ISSUE|PAGES|PUBLISHER|PUBPLACE),
  SEPARATOR?)+)

Attributes

None

Description

INTEXTDEF is the wrapper for the information that defines the appearance of the in-text citation. It can have the same children as a PUBTYPE element.

Parents

CITSTYLE

Children

AUTHORLIST, CITEKEY, ISSUE, JOURNALNAME, PAGES, PUBDATE, PUBLISHER, PUBPLACE, REFNUMBER, SEPARATOR, TITLE, VOLUME

Example

<INTEXTDEF>
<AUTHORLIST>
<FOLLOWING>. </FOLLOWING>
<ABBREVIATE MAXAUTHOR="4" DISPLAYAUTHOR="1" ROLE="ALL"> et al. </ABBREVIATE>
<AUTHORSEPS>
<TWOSEPS> and </TWOSEPS>
<THREESEPS>
<THREESEPSEACH>, </THREESEPSEACH>
<THREESEPSLAST>, and </THREESEPSLAST>
</THREESEPS>
</AUTHORSEPS>
<AUTHORNAMES>
<NAMEFIRST NAMEORDER="LASTFIRSTMIDDLE" INITIALSTYLE="FIRSTSPCMIDDLE" UPPERCASE="NONE">
<NAMEOTHER NAMEORDER="LASTFIRSTMIDDLE" INITIALSTYLE="FIRSTSPCMIDDLE" UPPERCASE="NONE">
</AUTHORNAMES>
<TEXT>
<TEXTSINGLE>
<PRECEEDING></PRECEEDING>
<FOLLOWING>, </FOLLOWING>
</TEXTSINGLE>
<TEXTMULTIPLE>
<PRECEEDING></PRECEEDING>
<FOLLOWING>, </FOLLOWING>
</TEXTMULTIPLE>
</TEXT>
</AUTHORLIST>
<PUBDATE FORMAT="YES" SEQUENCE="Y" MONTHFORMAT="ARABICMONTH" DAYFORMAT="ARABICDAY" YEARFORMAT="FOURDIGIT" PADLEADINGZERO="YY">
</PUBDATE>
</INTEXTDEF>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/issue.html000644 001750 001750 00000005266 12247746232 022260 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element ISSUE
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element ISSUE

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

Name Type Default Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

ISSUE describes how the issue information of a periodical is rendered. Most periodicals use the combination of journal name, volume, issue, and page(s) to identify a publication.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Parents

AUTHORONLY, INTEXTDEF, PUBTYPE, YEARONLY

Children

FOLLOWING, PRECEEDING

Example

<JOURNALNAME CASE="ASIS" DEFAULTTEXT="FULL" ALTERNATETEXT="AABBREV" PUNCTUATION="PERIOD">
<FOLLOWING> </FOLLOWING>
</JOURNALNAME>
<VOLUME STYLE="BOLD">
</VOLUME>
<ISSUE>
<PRECEEDING>(</PRECEEDING>
<FOLLOWING>)</FOLLOWING>
</ISSUE>
<PAGES>
<PRECEEDING>:</PRECEEDING>
<FOLLOWING>,</FOLLOWING>
<PAGERANGE TYPE="FULL">
</PAGERANGE>
</PAGES>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/jan.html000644 001750 001750 00000003306 12247746232 021671 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element JAN
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element JAN

Synopsis

Content Model

EMPTY

Attributes

Name Type Default Value
THREELET CDATA None
ABBREV CDATA None
FULL CDATA None

Description

JAN defines the full name, abbreviation, and three-letter abbreviation, if applicable, for the month January in the language of the publication.

Parents

MONTHS

Example

<MONTHS>
<JAN FULL="January" ABBREV="Jan." THREELET="Jan"/>
...
</MONTHS>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/journalname.html000644 001750 001750 00000010364 12247746232 023436 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element JOURNALNAME
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element JOURNALNAME

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

Name Type Default Value
ALTERNATETEXT Enumeration:
  AABBREV
  AFULL
  AUSERONE
  AUSERTWO
"AFULL"
DEFAULTTEXT Enumeration:
  ABBREV
  FULL
  USERONE
  USERTWO
"ABBREV"
PUNCTUATION Enumeration:
  PERIOD
  PERIODSPACE
  SPACE
"SPACE"
CASE Enumeration:
  ASIS
  ICAPS
  LOWER
  UPPER
"ASIS"
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

JOURNALNAME describes how the name of a periodical is rendered. Most periodicals use the combination of journal name, volume, issue, and page(s) to identify a publication.

You can select with the CASE attribute whether the case of the letters should be standardized. By default ("ASIS"), no changes are made to the journal name string in the database. If necessary, all letters can be converted to uppercase ("UPPER") or lowercase ("LOWER").

The DEFAULTTEXT attribute determines which form of the journal name should be printed, if available. If this form is not in the database, the formatting application should try the form given with the ALTERNATETEXT attribute.

The PUNCTUATION attribute selects the punctuation after abbreviated words in the journal name, if applicable.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Parents

AUTHORONLY, INTEXTDEF, PUBTYPE, YEARONLY

Children

FOLLOWING, PRECEEDING

Example

<JOURNALNAME CASE="ASIS" DEFAULTTEXT="FULL" ALTERNATETEXT="AABBREV" PUNCTUATION="PERIOD">
<FOLLOWING> </FOLLOWING>
</JOURNALNAME>
<VOLUME STYLE="BOLD">
</VOLUME>
<ISSUE>
<PRECEEDING>(</PRECEEDING>
<FOLLOWING>)</FOLLOWING>
</ISSUE>
<PAGES>
<PRECEEDING>:</PRECEEDING>
<FOLLOWING>,</FOLLOWING>
<PAGERANGE TYPE="FULL">
</PAGERANGE>
</PAGES>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/jul.html000644 001750 001750 00000003302 12247746232 021707 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element JUL
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element JUL

Synopsis

Content Model

EMPTY

Attributes

Name Type Default Value
THREELET CDATA None
ABBREV CDATA None
FULL CDATA None

Description

JUL defines the full name, abbreviation, and three-letter abbreviation, if applicable, for the month July in the language of the publication.

Parents

MONTHS

Example

<MONTHS>
...
<JUL FULL="July" ABBREV="Jul." THREELET="Jul"/>
...
</MONTHS>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/jun.html000644 001750 001750 00000003273 12247746232 021720 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element JUN
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element JUN

Synopsis

Content Model

EMPTY

Attributes

Name Type Default Value
THREELET CDATA None
ABBREV CDATA None
FULL CDATA None

Description

JUN defines the full name, abbreviation, and three-letter abbreviation, if applicable, for the month June in the language of the publication.

Parents

MONTHS

Example

<MONTHS>
...
<JUN FULL="June" ABBREV="Jun." THREELET="Jun"/>
...
</MONTHS>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/link.html000644 001750 001750 00000004777 12247746232 022073 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element LINK
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element LINK

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

Name Type Default Value
ROLE Enumeration:
  0
  1
  2
  3
  4
"0"
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

LINK describes how links and URLs of a publication are to be rendered.

The ROLE attribute picks the contents to be printed. The allowed values and the corresponding RIS fields are:

  • 0: UR
  • 1: L1
  • 2: L2
  • 3: L3
  • 4: L4

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Parents

PUBTYPE

Children

FOLLOWING, PRECEEDING

Example

<LINK ROLE="0">
<PRECEEDING>, </PRECEEDING>
</LINK>   

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/mar.html000644 001750 001750 00000003275 12247746232 021705 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element MAR
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element MAR

Synopsis

Content Model

EMPTY

Attributes

Name Type Default Value
THREELET CDATA None
ABBREV CDATA None
FULL CDATA None

Description

MAR defines the full name, abbreviation, and three-letter abbreviation, if applicable, for the month March in the language of the publication.

Parents

MONTHS

Example

<MONTHS>
...
<MAR FULL="March" ABBREV="Mar." THREELET="Mar"/>
...
</MONTHS>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/may.html000644 001750 001750 00000003275 12247746232 021714 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element MAY
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element MAY

Synopsis

Content Model

EMPTY

Attributes

Name Type Default Value
THREELET CDATA None
ABBREV CDATA None
FULL CDATA None

Description

MAY defines the full name, abbreviation, and three-letter abbreviation, if applicable, for the month May in the language of the publication.

Parents

MONTHS

Example

<MONTHS>
...
<MAY FULL="May" ABBREV="May" THREELET="May"/>
...
</MONTHS>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/mediatype.html000644 001750 001750 00000004133 12247746232 023101 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element MEDIATYPE
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element MEDIATYPE

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

Name Type Default Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

MEDIATYPE describes how the media type information is to be rendered.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Parents

PUBTYPE

Children

FOLLOWING, PRECEEDING

Example

<MEDIATYPE>
<PRECEEDING>, </PRECEEDING>
</MEDIATYPE>   

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/months.html000644 001750 001750 00000003545 12247746232 022436 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element MONTHS
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element MONTHS

Synopsis

Content Model

(JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC)

Attributes

None

Description

MONTHS is a wrapper for the individual elements describing the name and abbreviations of month names in the language of the publication.

Parents

BIBSTYLE

Children

APR, AUG, DEC, FEB, JAN, JUL, JUN, MAR, MAY, NOV, OCT, SEP

Example

<MONTHS>
...
<MAY FULL="May" ABBREV="May" THREELET="May"/>
...
</MONTHS>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/namefirst.html000644 001750 001750 00000005417 12247746232 023116 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element NAMEFIRST
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element NAMEFIRST

Synopsis

Content Model

EMPTY

Attributes

Name Type Default Value
UPPERCASE Enumeration:
  ALL
  LASTNAME
  NONE
"NONE"
INITIALSTYLE Enumeration:
  F.M.
  F.SPCM.
  FIRSTSPCM
  FIRSTSPCM.
  FIRSTSPCMIDDLE
  FM
  FSPCM
"F.M."
NAMEORDER Enumeration:
  FIRSTMIDDLELAST
  LAST
  LASTCOMMAFIRSTMIDDLE
  LASTCOMMASPCFIRSTMIDDLE
  LASTFIRSTMIDDLE
"LASTFIRSTMIDDLE"

Description

NAMEFIRST is an empty element whose attributes describe the formatting of the first author in an authorlist. The formatting of all subsequent authors is described by the NAMEOTHER element.

Use the NAMEORDER attribute to select the general sequence and appearance of lastname and other name parts.

Use the INITIALSTYLE attribute to select if the first name and middle initial should be abbreviated and whether a period and a space should follow the abbreviated items.

If the whole name or the last name should be rendered in uppercase, set the UPPERCASE attribute to "ALL" or "LASTNAME", respectively.

Parents

AUTHORNAMES

Example

<AUTHORNAMES>
<NAMEFIRST NAMEORDER="LASTFIRSTMIDDLE" INITIALSTYLE="F.M." UPPERCASE="NONE">
<NAMEOTHER NAMEORDER="FIRSTMIDDLELAST" INITIALSTYLE="F.M." UPPERCASE="NONE">
</AUTHORNAMES>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/nameother.html000644 001750 001750 00000005421 12247746232 023103 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element NAMEOTHER
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element NAMEOTHER

Synopsis

Content Model

EMPTY

Attributes

Name Type Default Value
UPPERCASE Enumeration:
  ALL
  LASTNAME
  NONE
"NONE"
INITIALSTYLE Enumeration:
  F.M.
  F.SPCM.
  FIRSTSPCM
  FIRSTSPCM.
  FIRSTSPCMIDDLE
  FM
  FSPCM
"F.M."
NAMEORDER Enumeration:
  FIRSTMIDDLELAST
  LAST
  LASTCOMMAFIRSTMIDDLE
  LASTCOMMASPCFIRSTMIDDLE
  LASTFIRSTMIDDLE
"LASTFIRSTMIDDLE"

Description

NAMEOTHER is an empty element whose attributes describe the formatting of all authors but the first in an authorlist. The formatting of the first author is described by the NAMEFIRST element.

Use the NAMEORDER attribute to select the general sequence and appearance of lastname and other name parts.

Use the INITIALSTYLE attribute to select if the first name and middle initial should be abbreviated and whether a period and a space should follow the abbreviated items.

If the whole name or the last name should be rendered in uppercase, set the UPPERCASE attribute to "ALL" or "LASTNAME", respectively.

Parents

AUTHORNAMES

Example

<AUTHORNAMES>
<NAMEFIRST NAMEORDER="LASTFIRSTMIDDLE" INITIALSTYLE="F.M." UPPERCASE="NONE">
<NAMEOTHER NAMEORDER="FIRSTMIDDLELAST" INITIALSTYLE="F.M." UPPERCASE="NONE">
</AUTHORNAMES>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/notes.html000644 001750 001750 00000004107 12247746232 022251 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element NOTES
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element NOTES

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

Name Type Default Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

NOTES describes how the notes of a publication are to be rendered.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Parents

PUBTYPE

Children

FOLLOWING, PRECEEDING

Example

<NOTES>
<PRECEEDING>, </PRECEEDING>
</NOTES>   

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/nov.html000644 001750 001750 00000003313 12247746232 021721 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element NOV
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element NOV

Synopsis

Content Model

EMPTY

Attributes

Name Type Default Value
THREELET CDATA None
ABBREV CDATA None
FULL CDATA None

Description

NOV defines the full name, abbreviation, and three-letter abbreviation, if applicable, for the month November in the language of the publication.

Parents

MONTHS

Example

<MONTHS>
...
<NOV FULL="November" ABBREV="Nov." THREELET="Nov"/>
...
</MONTHS>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/numvolumes.html000644 001750 001750 00000004202 12247746232 023327 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element NUMVOLUMES
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element NUMVOLUMES

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

Name Type Default Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

NUMVOLUMES describes how the total number of volumes of a multi-volume monographic item is to be rendered.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Parents

PUBTYPE

Children

FOLLOWING, PRECEEDING

Example

<NUMVOLUMES>
<PRECEEDING>, </PRECEEDING>
</NUMVOLUMES>   

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/oct.html000644 001750 001750 00000003312 12247746232 021703 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element OCT
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element OCT

Synopsis

Content Model

EMPTY

Attributes

Name Type Default Value
THREELET CDATA None
ABBREV CDATA None
FULL CDATA None

Description

OCT defines the full name, abbreviation, and three-letter abbreviation, if applicable, for the month October in the language of the publication.

Parents

MONTHS

Example

<MONTHS>
...
<OCT FULL="October" ABBREV="Oct." THREELET="Oct"/>
...
</MONTHS>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/ostype.html000644 001750 001750 00000004135 12247746232 022445 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element OSTYPE
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element OSTYPE

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

Name Type Default Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

OSTYPE describes how the type information of an operating system is to be rendered.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Parents

PUBTYPE

Children

FOLLOWING, PRECEEDING

Example

<OSTYPE>
<PRECEEDING>, </PRECEEDING>
</OSTYPE>   

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/pagerange.html000644 001750 001750 00000004040 12247746232 023046 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element PAGERANGE
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element PAGERANGE

Synopsis

Content Model

(PRECEEDING?,RANGESEPARATOR?,FOLLOWING?)

Attributes

Name Type Default Value
TYPE Enumeration:
  ABBREV
  CHICAGO
  FULL
  STARTONLY
  TWODIGIT
"FULL"

Description

PAGERANGE describes how a range of page numbers is rendered. Journals differ in the way how the end page of a page range is formatted. Some omit it, others print the full end page, some strip the end page to the minimum number of digits necessary.

Use the TYPE attribute to select the formatting of the end page.

Parents

PAGES

Children

FOLLOWING, PRECEEDING, RANGESEPARATOR

Example

<PAGES>
<PRECEEDING>:</PRECEEDING>
<FOLLOWING>,</FOLLOWING>
<PAGERANGE TYPE="FULL">
</PAGERANGE>
</PAGES>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/pages.html000644 001750 001750 00000005522 12247746232 022222 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element PAGES
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element PAGES

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?,SINGLEPAGE?,PAGERANGE?)

Attributes

Name Type Default Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

PAGES describes how the page information of a periodical is rendered. Most periodicals use the combination of journal name, volume, issue, and page(s) to identify a publication.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Parents

AUTHORONLY, INTEXTDEF, PUBTYPE, YEARONLY

Children

FOLLOWING, PAGERANGE, PRECEEDING, SINGLEPAGE

Example

<JOURNALNAME CASE="ASIS" DEFAULTTEXT="FULL" ALTERNATETEXT="AABBREV" PUNCTUATION="PERIOD">
<FOLLOWING> </FOLLOWING>
</JOURNALNAME>
<VOLUME STYLE="BOLD">
</VOLUME>
<ISSUE>
<PRECEEDING>(</PRECEEDING>
<FOLLOWING>)</FOLLOWING>
</ISSUE>
<PAGES>
<PRECEEDING>:</PRECEEDING>
<FOLLOWING>,</FOLLOWING>
<PAGERANGE TYPE="FULL">
</PAGERANGE>
</PAGES>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/pamphletnum.html000644 001750 001750 00000004153 12247746232 023454 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element PAMPHLETNUM
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element PAMPHLETNUM

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

Name Type Default Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

PAMPHLETNUM describes how the number of a pamphlet is to be rendered.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Parents

PUBTYPE

Children

FOLLOWING, PRECEEDING

Example

<PAMPHLETNUM>
<PRECEEDING>, </PRECEEDING>
</PAMPHLETNUM>   

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/preceeding.html000644 001750 001750 00000006607 12247746232 023235 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element PRECEEDING
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element PRECEEDING

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

All elements in PUBTYPE and INTEXTDEF can define strings that always precede or follow (FOLLOWING) the element. These may e.g. be punctuation characters or whitespace to separate the entries. In some cases the SEPARATOR element may be more appropriate.

Parents

ABSTRACT, ADDRESS, AREA, AUTHORLIST, CHAPTERNUM, CITEKEY, CITSTYLE, CLASSCODEINTL, CLASSCODEUS, CLASSIFICATION, COMPUTER, CONFERENCELOCATION, DEGREE, EDITION, ISSUE, JOURNALNAME, LINK, MEDIATYPE, NOTES, NUMVOLUMES, OSTYPE, PAGERANGE, PAGES, PAMPHLETNUM, PUBDATE, PUBLISHER, PUBPLACE, RECIPIENTEMAIL, REFNUMBER, REGISTRYNUM, RUNNINGTIME, SECTION, SENDEREMAIL, SERIAL, SINGLEPAGE, TEXTMULTIPLE, TEXTSINGLE, TITLE, TYPEOFWORK, USERDEF, VOLUME

Example

<JOURNALNAME CASE="ASIS" DEFAULTTEXT="FULL" ALTERNATETEXT="AABBREV" PUNCTUATION="PERIOD">
<FOLLOWING> </FOLLOWING>
</JOURNALNAME>
<VOLUME STYLE="BOLD">
</VOLUME>
<ISSUE>
<PRECEEDING>(</PRECEEDING>
<FOLLOWING>)</FOLLOWING>
</ISSUE>
<PAGES>
<PRECEEDING>:</PRECEEDING>
<FOLLOWING>,</FOLLOWING>
<PAGERANGE TYPE="FULL">
</PAGERANGE>
</PAGES>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/pubdate.html000644 001750 001750 00000011461 12247746232 022546 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element PUBDATE
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element PUBDATE

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?,FIRSTSEP?,SECONDSEP?)

Attributes

Name Type Default Value
SEQUENCE Enumeration:
  DM
  DMY
  MD
  MDY
  MY
  Y
  YM
  YMD
"Y"
FORMAT Enumeration:
  NO
  YES
"YES"
YEARFORMAT Enumeration:
  FOURDIGIT
  ROMANYEAR
  TWODIGIT
"FOURDIGIT"
MONTHFORMAT Enumeration:
  ABBREVDOT
  ARABICMONTH
  FULL
  ROMANMONTH
  THREELETTER
"ARABICMONTH"
PADLEADINGZERO Enumeration:
  NN
  YY
"NN"
ROLE Enumeration:
  ALL
  PRIMARY
  SECONDARY
"PRIMARY"
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None
DAYFORMAT Enumeration:
  ARABICDAY
  ROMANDAY
"ARABICDAY"

Description

PUBDATE describes how the publication date is rendered. You can use the FIRSTSEP and SECONDSEP elements to specify the first and second separator, respectively, between day, month, and year, if applicable.

Set the FORMAT attribute to "NO" to switch off all formatting. The publication date string will be printed as it was entered into the database.

The SEQUENCE attribute selects where and whether at all day, month, and year should appear.

The DAYFORMAT, MONTHFORMAT, and YEARFORMAT attributes specify the formatting of the day, month, and year parts, respectively.

Set PADLEADINGZERO to "YY" if single-digit day and month numbers should be padded with a leading zero.

Use the ROLE attribute to specify whether this element describes the primary or secondary date. The value of "ALL" indicates that the processing application should first try the primary date. If this information is not available, it should try the secondary date.

The STYLE attribute selects the font formatting.

Parents

AUTHORONLY, INTEXTDEF, PUBTYPE, YEARONLY

Children

FIRSTSEP, FOLLOWING, PRECEEDING, SECONDSEP

Example

<PUBDATE FORMAT="YES" SEQUENCE="MDY" MONTHFORMAT="ARABICMONTH" DAYFORMAT="ARABICDAY" YEARFORMAT="FOURDIGIT" PADLEADINGZERO="YY" ROLE="PRIMARY">
<FOLLOWING>, </FOLLOWING>
<FIRSTSEP>-</FIRSTSEP>
<SECONDSEP>-</SECONDSEP>
</PUBDATE>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/publisher.html000644 001750 001750 00000004340 12247746233 023116 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element PUBLISHER
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element PUBLISHER

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

Name Type Default Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

PUBLISHER describes how the publisher of a publication is to be rendered.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Parents

AUTHORONLY, INTEXTDEF, PUBTYPE, YEARONLY

Children

FOLLOWING, PRECEEDING

Example

<PUBLISHER>
<PRECEEDING>, </PRECEEDING>
</PUBLISHER>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/pubplace.html000644 001750 001750 00000004351 12247746233 022716 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element PUBPLACE
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element PUBPLACE

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

Name Type Default Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

PUBPLACE describes how the city where a publication was published should be displayed.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Parents

AUTHORONLY, INTEXTDEF, PUBTYPE, YEARONLY

Children

FOLLOWING, PRECEEDING

Example

<PUBPLACE>
<PRECEEDING>, </PRECEEDING>
</PUBPLACE>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/pubtype.html000644 001750 001750 00000012231 12247746233 022607 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element PUBTYPE
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element PUBTYPE

Synopsis

Content Model

(((REFNUMBER|CITEKEY|AUTHORLIST|PUBDATE|TITLE|JOURNALNAME|VOLUME|
   ISSUE|PAGES|PUBLISHER|PUBPLACE|SERIAL|ADDRESS|USERDEF|NOTES|
   ABSTRACT|LINK|TYPEOFWORK|AREA|OSTYPE|DEGREE|RUNNINGTIME|CLASSCODEINTL|
   CLASSCODEUS|SENDEREMAIL|RECIPIENTEMAIL|MEDIATYPE|NUMVOLUMES|
   EDITION|COMPUTER|CONFERENCELOCATION|REGISTRYNUM|CLASSIFICATION|
   SECTION|PAMPHLETNUM|CHAPTERNUM),
  SEPARATOR?)+)

Attributes

Name Type Default Value
TYPE Enumeration:
  ABST
  ADVS
  ART
  BILL
  BOOK
  CASE
  CHAP
  COMP
  CONF
  CTLG
  DATA
  ELEC
  GEN
  ICOMM
  INPR
  JFULL
  JOUR
  MAP
  MGZN
  MPCT
  MUSIC
  NEWS
  PAMP
  PAT
  PCOMM
  RPRT
  SER
  SLIDE
  SOUND
  STAT
  THES
  UNBILL
  UNPB
  VIDEO
Required

Description

PUBTYPE is a wrapper for all formatting information that pertains to a specific type of publication.

Use the TYPE attribute to select the type of publication that this element describes. Each CITESTYLE element should contain at least a description of the type "GEN". This generic type is intended to be used by the formatting application if no specific information for the given publication type is defined.

Parents

REFSTYLE

Children

ABSTRACT, ADDRESS, AREA, AUTHORLIST, CHAPTERNUM, CITEKEY, CLASSCODEINTL, CLASSCODEUS, CLASSIFICATION, COMPUTER, CONFERENCELOCATION, DEGREE, EDITION, ISSUE, JOURNALNAME, LINK, MEDIATYPE, NOTES, NUMVOLUMES, OSTYPE, PAGES, PAMPHLETNUM, PUBDATE, PUBLISHER, PUBPLACE, RECIPIENTEMAIL, REFNUMBER, REGISTRYNUM, RUNNINGTIME, SECTION, SENDEREMAIL, SEPARATOR, SERIAL, TITLE, TYPEOFWORK, USERDEF, VOLUME

Example

<PUBTYPE>
<AUTHORLIST>
...
</AUTHORLIST>
<PUBDATE>
...
</PUBDATE>
<JOURNALNAME>
...
</JOURNALNAME>
<VOLUME>
...
</VOLUME>
<PAGES>
...
</PAGES>
</PUBTYPE>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/rangeseparator.html000644 001750 001750 00000002754 12247746233 024145 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element RANGESEPARATOR
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element RANGESEPARATOR

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

RANGESEPARATOR defines the separator that is used when a sequence of consecutively numbered citations is displayed as a range.

Parents

CITSTYLE, PAGERANGE

Example

<CITSTYLE INTEXTSEQUENCE="AUTHORDATE">
<CITSEPARATOR>;</CITSEPARATOR>
<RANGESEPARATOR>-</RANGESEPARATOR>
<INTEXTDEF>
<REFNUMBER;
<PRECEEDING>[</PRECEEDING>
<FOLLOWING>]</FOLLOWING>
</REFNUMBER>
</INTEXTDEF>
</CITSTYLE>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/recipientemail.html000644 001750 001750 00000004217 12247746233 024116 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element RECIPIENTEMAIL
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element RECIPIENTEMAIL

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

Name Type Default Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

RECIPIENTEMAIL describes how the recipient's address of an email is to be rendered.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Parents

PUBTYPE

Children

FOLLOWING, PRECEEDING

Example

<RECIPIENTEMAIL>
<PRECEEDING>, </PRECEEDING>
</RECIPIENTEMAIL>   

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/refnumber.html000644 001750 001750 00000005071 12247746233 023110 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element REFNUMBER
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element REFNUMBER

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

Name Type Default Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

REFNUMBER describes the appearance of a reference number in the bibliography or the in-text citation. The presence of this element implies that the bibliography is numbered.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Parents

AUTHORONLY, INTEXTDEF, PUBTYPE, YEARONLY

Children

FOLLOWING, PRECEEDING

Example

<CITSTYLE INTEXTSEQUENCE="AUTHORDATE">
<CITSEPARATOR>;</CITSEPARATOR>
<RANGESEPARATOR>-</RANGESEPARATOR>
<INTEXTDEF>
<REFNUMBER STYLE="BOLD">
<PRECEEDING>[</PRECEEDING>
<FOLLOWING>]</FOLLOWING>
</REFNUMBER>
</INTEXTDEF>
</CITSTYLE>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/refstyle.html000644 001750 001750 00000002707 12247746233 022763 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element REFSTYLE
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element REFSTYLE

Synopsis

Content Model

(PUBTYPE+)

Attributes

None

Description

REFSTYLE is a wrapper for all publication types that have a PUBTYPE element.

Parents

CITESTYLE

Children

PUBTYPE

Example

<CITESTYLE>
<STYLENAME>J.Biol.Chem.</STYLENAME>
<REFSTYLE>
<PUBTYPE TYPE="GEN">
...
</PUBTYPE>
<PUBTYPE TYPE="BOOK">
...
</PUBTYPE>
<PUBTYPE TYPE="JOURNAL">
...
</PUBTYPE>
</REFSTYLE>
</CITESTYLE>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/sep.html000644 001750 001750 00000003322 12247746233 021707 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element SEP
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element SEP

Synopsis

Content Model

EMPTY

Attributes

Name Type Default Value
THREELET CDATA None
ABBREV CDATA None
FULL CDATA None

Description

SEP defines the full name, abbreviation, and three-letter abbreviation, if applicable, for the month September in the language of the publication.

Parents

MONTHS

Example

<MONTHS>
...
<SEP FULL="September" ABBREV="Sep." THREELET="Sep"/>
...
</MONTHS>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/registrynum.html000644 001750 001750 00000004202 12247746233 023506 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element REGISTRYNUM
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element REGISTRYNUM

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

Name Type Default Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

REGISTRYNUM describes how the registry number of a full journal entry is to be rendered.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Parents

PUBTYPE

Children

FOLLOWING, PRECEEDING

Example

<REGISTRYNUM>
<PRECEEDING>, </PRECEEDING>
</REGISTRYNUM>   

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/runningtime.html000644 001750 001750 00000004216 12247746233 023462 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element RUNNINGTIME
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element RUNNINGTIME

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

Name Type Default Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

RUNNINGTIME describes how the running time of a video, a movie, or a sound track is to be rendered.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Parents

PUBTYPE

Children

FOLLOWING, PRECEEDING

Example

<RUNNINGTIME>
<PRECEEDING>, </PRECEEDING>
</RUNNINGTIME>   

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/secondsep.html000644 001750 001750 00000002727 12247746233 023113 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element SECONDSEP
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element SECONDSEP

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

SECONDSEP defines the second separator in a date entry, if applicable. This is usually a slash or a dash or a period. The first separator is defined by FIRSTSEP

Parents

PUBDATE

Example

<PUBDATE FORMAT="YES" SEQUENCE="MDY" MONTHFORMAT="ARABICMONTH" DAYFORMAT="ARABICDAY" YEARFORMAT="FOURDIGIT" PADLEADINGZERO="NN" ROLE="PRIMARY">
<FIRSTSEP>/</FIRSTSEP>
<SECONDSEP>/</SECONDSEP>
<FOLLOWING>. </FOLLOWING>
</PUBDATE>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/section.html000644 001750 001750 00000004156 12247746233 022572 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element SECTION
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element SECTION

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

Name Type Default Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

SECTION describes how the section information of a newspaper article is to be rendered.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Parents

PUBTYPE

Children

FOLLOWING, PRECEEDING

Example

<SECTION>
<PRECEEDING>, </PRECEEDING>
</SECTION>   

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/senderemail.html000644 001750 001750 00000004156 12247746233 023416 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element SENDEREMAIL
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element SENDEREMAIL

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

Name Type Default Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

SENDEREMAIL describes how the sender's address of an email is to be rendered.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Parents

PUBTYPE

Children

FOLLOWING, PRECEEDING

Example

<SENDEREMAIL>
<PRECEEDING>, </PRECEEDING>
</SENDEREMAIL>   

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/separator.html000644 001750 001750 00000003701 12247746233 023121 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element SEPARATOR
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element SEPARATOR

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

The SEPARATOR is an alternative to PRECEEDING and FOLLOWING for introducing punctuation characters, whitespace, or short strings. While PRECEEDING and FOLLOWING are children of the elements to be formatted and appear only if the element itself is present, SEPARATOR is a separate element. Use separator in cases where a string has to appear at a certain position even if it is possible that the adjacent elements are missing.

Parents

AUTHORONLY, INTEXTDEF, PUBTYPE, YEARONLY

Example

<PAGES>
<PRECEEDING>, </PRECEEDING>
<PAGERANGE TYPE="FULL">
</PAGERANGE>
</PAGES>
<SEPARATOR>. </SEPARATOR>
<PUBDATE FORMAT="NO" SEQUENCE="Y" MONTHFORMAT="ARABICMONTH" DAYFORMAT="ARABICDAY" YEARFORMAT="FOURDIGIT" PADLEADINGZERO="NN" ROLE="PRIMARY">
<FOLLOWING>. </FOLLOWING>
</PUBDATE>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/serial.html000644 001750 001750 00000004163 12247746233 022403 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element SERIAL
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element SERIAL

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

Name Type Default Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

SERIAL describes how the serial number (like an ISSN or ISBN) of a publication are to be rendered.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Parents

PUBTYPE

Children

FOLLOWING, PRECEEDING

Example

<SERIAL>
<PRECEEDING>, </PRECEEDING>
</SERIAL>   

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/singlepage.html000644 001750 001750 00000003033 12247746233 023235 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element SINGLEPAGE
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element SINGLEPAGE

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

None

Description

SINGLEPAGE describes how the start page number is rendered if no end page is available. The appearance of the end page (if there is one) is described by the PAGERANGE element.

Parents

PAGES

Children

FOLLOWING, PRECEEDING

Example

<PAGES>
<PRECEEDING>:</PRECEEDING>
<SINGLEPAGE>
<FOLLOWING>,</FOLLOWING>
<PAGERANGE TYPE="STARTONLY">
</PAGERANGE>
</PAGES>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/stylename.html000644 001750 001750 00000002342 12247746233 023122 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element STYLENAME
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element STYLENAME

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

STYLENAME defines an unique name for the bibliography file defined in the parent CITESTYLE element.

Parents

CITESTYLE

Example

<CITESTYLE>
<STYLENAME>J.Biol.Chem.</STYLENAME>
...
</CITESTYLE>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/styleset.html000644 001750 001750 00000002400 12247746233 022770 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element STYLESET
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element STYLESET

Synopsis

Content Model

(CITESTYLE)+

Attributes

None

Description

The STYLESET element is a wrapper to keep several CITESTYLE elements in a single document.

Children

CITESTYLE

Example

<STYLESET>
<CITESTYLE>
...
</CITESTYLE>
<CITESTYLE>
...
</CITESTYLE>
</STYLESET>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/text.html000644 001750 001750 00000004503 12247746233 022106 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element TEXT
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element TEXT

Synopsis

Content Model

(TEXTSINGLE?,TEXTMULTIPLE?)

Attributes

None

Description

TEXT is a wrapper for the TEXTSINGLE and the TEXTMULTIPLE elements which govern the preceeding and following strings of single and multiple authors. Use TEXTED as a wrapper for editors.

Parents

AUTHORLIST

Children

TEXTMULTIPLE, TEXTSINGLE

Example

<AUTHORLIST ROLE="PRIMARY">
<FOLLOWING> </FOLLOWING>
<ABBREVIATEFIRST MAXAUTHOR="256" DISPLAYAUTHOR="255">, et al</ABBREVIATEFIRST>
<ABBREVIATESUBSEQ MAXAUTHOR="256" DISPLAYAUTHOR="255">, et al</ABBREVIATESUBSEQ>
<AEMPTY>Anonymous</AEMPTY>
<AUTHORSEPS>
<TWOSEPS> and </TWOSEPS>
<THREESEPS>
<THREESEPSEACH>, </THREESEPSEACH>
<THREESEPSLAST>, and </THREESEPSLAST>
</THREESEPS>
</AUTHORSEPS>
<AUTHORNAMES>
<NAMEFIRST NAMEORDER="LASTFIRSTMIDDLE" INITIALSTYLE="F.M." UPPERCASE="NONE">
<NAMEOTHER NAMEORDER="FIRSTMIDDLELAST" INITIALSTYLE="F.M." UPPERCASE="NONE">
</AUTHORNAMES>
<TEXT>
<TEXTSINGLE>
<FOLLOWING>, </FOLLOWING>
</TEXTSINGLE>
<TEXTMULTIPLE>
<FOLLOWING>, </FOLLOWING>
</TEXTMULTIPLE>
</TEXT>
</AUTHORLIST>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/texted.html000644 001750 001750 00000001757 12247746231 022425 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element TEXTED
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element TEXTED

Synopsis

Content Model

(TEXTSINGLE?,TEXTMULTIPLE?)

Attributes

None

Description

Parents

AUTHORLIST

Children

TEXTMULTIPLE, TEXTSINGLE


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/textmultiple.html000644 001750 001750 00000004443 12247746233 023665 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element TEXTMULTIPLE
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element TEXTMULTIPLE

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

None

Description

TEXTMULTIPLE is a wrapper for the preceeding and the following elements which govern the preceeding and following strings of multiple authors.

Parents

TEXT, TEXTED

Children

FOLLOWING, PRECEEDING

Example

<AUTHORLIST ROLE="PRIMARY">
<FOLLOWING> </FOLLOWING>
<ABBREVIATEFIRST MAXAUTHOR="256" DISPLAYAUTHOR="255">, et al</ABBREVIATEFIRST>
<ABBREVIATESUBSEQ MAXAUTHOR="256" DISPLAYAUTHOR="255">, et al</ABBREVIATESUBSEQ>
<AEMPTY>Anonymous</AEMPTY>
<AUTHORSEPS>
<TWOSEPS> and </TWOSEPS>
<THREESEPS>
<THREESEPSEACH>, </THREESEPSEACH>
<THREESEPSLAST>, and </THREESEPSLAST>
</THREESEPS>
</AUTHORSEPS>
<AUTHORNAMES>
<NAMEFIRST NAMEORDER="LASTFIRSTMIDDLE" INITIALSTYLE="F.M." UPPERCASE="NONE">
<NAMEOTHER NAMEORDER="FIRSTMIDDLELAST" INITIALSTYLE="F.M." UPPERCASE="NONE">
</AUTHORNAMES>
<TEXT>
<TEXTSINGLE>
<FOLLOWING>, </FOLLOWING>
</TEXTSINGLE>
<TEXTMULTIPLE>
<FOLLOWING>, </FOLLOWING>
</TEXTMULTIPLE>
</TEXT>
</AUTHORLIST>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/textsingle.html000644 001750 001750 00000004437 12247746233 023316 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element TEXTSINGLE
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element TEXTSINGLE

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

None

Description

TEXTSINGLE is a wrapper for the preceeding and the following elements which govern the preceeding and following strings of a single author.

Parents

TEXT, TEXTED

Children

FOLLOWING, PRECEEDING

Example

<AUTHORLIST ROLE="PRIMARY">
<FOLLOWING> </FOLLOWING>
<ABBREVIATEFIRST MAXAUTHOR="256" DISPLAYAUTHOR="255">, et al</ABBREVIATEFIRST>
<ABBREVIATESUBSEQ MAXAUTHOR="256" DISPLAYAUTHOR="255">, et al</ABBREVIATESUBSEQ>
<AEMPTY>Anonymous</AEMPTY>
<AUTHORSEPS>
<TWOSEPS> and </TWOSEPS>
<THREESEPS>
<THREESEPSEACH>, </THREESEPSEACH>
<THREESEPSLAST>, and </THREESEPSLAST>
</THREESEPS>
</AUTHORSEPS>
<AUTHORNAMES>
<NAMEFIRST NAMEORDER="LASTFIRSTMIDDLE" INITIALSTYLE="F.M." UPPERCASE="NONE">
<NAMEOTHER NAMEORDER="FIRSTMIDDLELAST" INITIALSTYLE="F.M." UPPERCASE="NONE">
</AUTHORNAMES>
<TEXT>
<TEXTSINGLE>
<FOLLOWING>, </FOLLOWING>
</TEXTSINGLE>
<TEXTMULTIPLE>
<FOLLOWING>, </FOLLOWING>
</TEXTMULTIPLE>
</TEXT>
</AUTHORLIST>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/threeseps.html000644 001750 001750 00000004346 12247746233 023131 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element THREESEPS
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element THREESEPS

Synopsis

Content Model

(THREESEPSEACH,THREESEPSLAST)

Attributes

None

Description

THREESEPS is a wrapper for the strings to be printed between authors if three or more authors are in the authorlist.

Parents

AUTHORSEPS

Children

THREESEPSEACH, THREESEPSLAST

Example

<AUTHORLIST ROLE="PRIMARY">
<FOLLOWING> </FOLLOWING>
<ABBREVIATEFIRST MAXAUTHOR="256" DISPLAYAUTHOR="255">, et al</ABBREVIATEFIRST>
<ABBREVIATESUBSEQ MAXAUTHOR="256" DISPLAYAUTHOR="255">, et al</ABBREVIATESUBSEQ>
<AEMPTY>Anonymous</AEMPTY>
<AUTHORSEPS>
<TWOSEPS> and </TWOSEPS>
<THREESEPS>
<THREESEPSEACH>, </THREESEPSEACH>
<THREESEPSLAST>, and </THREESEPSLAST>
</THREESEPS>
</AUTHORSEPS>
<AUTHORNAMES>
<NAMEFIRST NAMEORDER="LASTFIRSTMIDDLE" INITIALSTYLE="F.M." UPPERCASE="NONE">
<NAMEOTHER NAMEORDER="FIRSTMIDDLELAST" INITIALSTYLE="F.M." UPPERCASE="NONE">
</AUTHORNAMES>
<TEXT>
<TEXTSINGLE>
<FOLLOWING>, </FOLLOWING>
</TEXTSINGLE>
<TEXTMULTIPLE>
<FOLLOWING>, </FOLLOWING>
</TEXTMULTIPLE>
</TEXT>
</AUTHORLIST>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/threesepseach.html000644 001750 001750 00000004140 12247746233 023742 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element THREESEPSEACH
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element THREESEPSEACH

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

THREESEPSEACH defines the strings to be printed between all but the last pair of authors in the authorlist if three or more authors are in this list.

Parents

THREESEPS

Example

<AUTHORLIST ROLE="PRIMARY">
<FOLLOWING> </FOLLOWING>
<ABBREVIATEFIRST MAXAUTHOR="256" DISPLAYAUTHOR="255">, et al</ABBREVIATEFIRST>
<ABBREVIATESUBSEQ MAXAUTHOR="256" DISPLAYAUTHOR="255">, et al</ABBREVIATESUBSEQ>
<AEMPTY>Anonymous</AEMPTY>
<AUTHORSEPS>
<TWOSEPS> and </TWOSEPS>
<THREESEPS>
<THREESEPSEACH>, </THREESEPSEACH>
<THREESEPSLAST>, and </THREESEPSLAST>
</THREESEPS>
</AUTHORSEPS>
<AUTHORNAMES>
<NAMEFIRST NAMEORDER="LASTFIRSTMIDDLE" INITIALSTYLE="F.M." UPPERCASE="NONE">
<NAMEOTHER NAMEORDER="FIRSTMIDDLELAST" INITIALSTYLE="F.M." UPPERCASE="NONE">
</AUTHORNAMES>
<TEXT>
<TEXTSINGLE>
<FOLLOWING>, </FOLLOWING>
</TEXTSINGLE>
<TEXTMULTIPLE>
<FOLLOWING>, </FOLLOWING>
</TEXTMULTIPLE>
</TEXT>
</AUTHORLIST>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/threesepslast.html000644 001750 001750 00000004122 12247746233 024005 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element THREESEPSLAST
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element THREESEPSLAST

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

THREESEPSLAST defines the string to be printed between the last pair of authors in the authorlist if three or more authors are in this list.

Parents

THREESEPS

Example

<AUTHORLIST ROLE="PRIMARY">
<FOLLOWING> </FOLLOWING>
<ABBREVIATEFIRST MAXAUTHOR="256" DISPLAYAUTHOR="255">, et al</ABBREVIATEFIRST>
<ABBREVIATESUBSEQ MAXAUTHOR="256" DISPLAYAUTHOR="255">, et al</ABBREVIATESUBSEQ>
<AEMPTY>Anonymous</AEMPTY>
<AUTHORSEPS>
<TWOSEPS> and </TWOSEPS>
<THREESEPS>
<THREESEPSEACH>, </THREESEPSEACH>
<THREESEPSLAST>, and </THREESEPSLAST>
</THREESEPS>
</AUTHORSEPS>
<AUTHORNAMES>
<NAMEFIRST NAMEORDER="LASTFIRSTMIDDLE" INITIALSTYLE="F.M." UPPERCASE="NONE">
<NAMEOTHER NAMEORDER="FIRSTMIDDLELAST" INITIALSTYLE="F.M." UPPERCASE="NONE">
</AUTHORNAMES>
<TEXT>
<TEXTSINGLE>
<FOLLOWING>, </FOLLOWING>
</TEXTSINGLE>
<TEXTMULTIPLE>
<FOLLOWING>, </FOLLOWING>
</TEXTMULTIPLE>
</TEXT>
</AUTHORLIST>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/title.html000644 001750 001750 00000006444 12247746233 022251 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element TITLE
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element TITLE

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

Name Type Default Value
CASE Enumeration:
  ASIS
  ICAPS
  LOWER
  UPPER
"ASIS"
ROLE Enumeration:
  ALL
  PART
  PUB
  SERIES
"PUB"
MAXTITLE CDATA None
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

TITLE describes how the title of a publication is rendered.

The CASE attribute determines whether the case of the title string remains unchanged ("ASIS") or is converted to all uppercase ("UPPER") or all lowercase ("LOWER").

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired.

The ROLE attribute decides whether this element pertains to an article or chapter ("PART"), to a monographic title like a book title ("PUB"), or to a series title ("SERIES"). Use the value "ALL" if it is not certain which of the data are available. The processing application should try in the mentioned order.

Parents

AUTHORONLY, INTEXTDEF, PUBTYPE, YEARONLY

Children

FOLLOWING, PRECEEDING

Example

<TITLE CASE="ASIS" ROLE="PUB">
<FOLLOWING>. </FOLLOWING>
</TITLE>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/twoseps.html000644 001750 001750 00000004032 12247746233 022623 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element TWOSEPS
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element TWOSEPS

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

TWOSEPS defines the string to be printed between authors if exactly two authors are in the authorlist.

Parents

AUTHORSEPS

Example

<AUTHORLIST ROLE="PRIMARY">
<FOLLOWING> </FOLLOWING>
<ABBREVIATEFIRST MAXAUTHOR="256" DISPLAYAUTHOR="255">, et al</ABBREVIATEFIRST>
<ABBREVIATESUBSEQ MAXAUTHOR="256" DISPLAYAUTHOR="255">, et al</ABBREVIATESUBSEQ>
<AEMPTY>Anonymous</AEMPTY>
<AUTHORSEPS>
<TWOSEPS> and </TWOSEPS>
<THREESEPS>
<THREESEPSEACH>, </THREESEPSEACH>
<THREESEPSLAST>, and </THREESEPSLAST>
</THREESEPS>
</AUTHORSEPS>
<AUTHORNAMES>
<NAMEFIRST NAMEORDER="LASTFIRSTMIDDLE" INITIALSTYLE="F.M." UPPERCASE="NONE">
<NAMEOTHER NAMEORDER="FIRSTMIDDLELAST" INITIALSTYLE="F.M." UPPERCASE="NONE">
</AUTHORNAMES>
<TEXT>
<TEXTSINGLE>
<FOLLOWING>, </FOLLOWING>
</TEXTSINGLE>
<TEXTMULTIPLE>
<FOLLOWING>, </FOLLOWING>
</TEXTMULTIPLE>
</TEXT>
</AUTHORLIST>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/typeofwork.html000644 001750 001750 00000004146 12247746233 023336 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element TYPEOFWORK
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element TYPEOFWORK

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

Name Type Default Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

TYPEOFWORK describes how the type information of a work is to be rendered.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Parents

PUBTYPE

Children

FOLLOWING, PRECEEDING

Example

<TYPEOFWORK>
<PRECEEDING>, </PRECEEDING>
</TYPEOFWORK>   

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/url.html000644 001750 001750 00000002152 12247746233 021722 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element URL
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element URL

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

URL contains a link to a page that describes the bibliography style.

Parents

CITESTYLE

Example

<URL>http://www.liebertpub.com/te/</URL>

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/userdef.html000644 001750 001750 00000005030 12247746233 022553 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element USERDEF
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element USERDEF

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

Name Type Default Value
ROLE Enumeration:
  1
  2
  3
  4
  5
"1"
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

USERDEF describes how the USERDEF fields of a publication are to be rendered.

The ROLE attribute picks the contents to be printed. The allowed values and the corresponding RIS fields are:

  • 1: U1
  • 2: U2
  • 3: U3
  • 4: U4
  • 5: U5

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Parents

PUBTYPE

Children

FOLLOWING, PRECEEDING

Example

<USERDEF ROLE="1">
<PRECEEDING>, </PRECEEDING>
</USERDEF>   

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/volume.html000644 001750 001750 00000004535 12247746233 022436 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element VOLUME
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element VOLUME

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

Name Type Default Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

VOLUME describes how the volume information of a periodical is rendered. Most periodicals use the combination of journal name, volume, issue, and page(s) to identify a publication.

Parents

AUTHORONLY, INTEXTDEF, PUBTYPE, YEARONLY

Children

FOLLOWING, PRECEEDING

Example

<JOURNALNAME CASE="ASIS" DEFAULTTEXT="FULL" ALTERNATETEXT="AABBREV" PUNCTUATION="PERIOD">
<FOLLOWING> </FOLLOWING>
</JOURNALNAME>
<VOLUME STYLE="BOLD">
</VOLUME>
<ISSUE>
<PRECEEDING>(</PRECEEDING>
<FOLLOWING>)</FOLLOWING>
</ISSUE>
<PAGES>
<PRECEEDING>:</PRECEEDING>
<FOLLOWING>,</FOLLOWING>
<PAGERANGE TYPE="FULL">
</PAGERANGE>
</PAGES>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/elements/yearonly.html000644 001750 001750 00000005061 12247746233 022764 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element YEARONLY
citestyle XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev]

Element YEARONLY

Synopsis

Content Model

(((REFNUMBER|AUTHORLIST|PUBDATE|TITLE|JOURNALNAME|VOLUME|ISSUE|
   PAGES|PUBLISHER|PUBPLACE),
  SEPARATOR?)+)

Attributes

None

Description

YEARONLY is the wrapper for the information that defines the appearance of an in-text citation that shows only the publication date (for author-year citation styles) or the reference number (for numeric citation styles). It can have the same children as a PUBTYPE element. This element should be used in conjunction with the AUTHORONLY element to obtain a citation format that keeps the authors in the flow of the normal text, as shown in the following example sentence:

... as was shown by Smith and Miller in a recent publication (2001).

Parents

CITSTYLE

Children

AUTHORLIST, ISSUE, JOURNALNAME, PAGES, PUBDATE, PUBLISHER, PUBPLACE, REFNUMBER, SEPARATOR, TITLE, VOLUME

Example

<YEARONLY>
<PUBDATE FORMAT="YES" SEQUENCE="Y" MONTHFORMAT="ARABICMONTH" DAYFORMAT="ARABICDAY" YEARFORMAT="FOURDIGIT" PADLEADINGZERO="YY">
<PRECEEDING>(</PRECEEDING>
<FOLLOWING>)</FOLLOWING>
</PUBDATE>
</YEARONLY>
    

HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/abbreviatefirst.html000644 001750 001750 00000003105 12247746231 024073 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element ABBREVIATEFIRST
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Next]

Element ABBREVIATEFIRST

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

NameTypeDefault Value
DISPLAYAUTHOR CDATA Required
MAXAUTHOR CDATA Required
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

Parents

AUTHORLIST


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/abbreviatesubseq.html000644 001750 001750 00000003152 12247746231 024250 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element ABBREVIATESUBSEQ
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element ABBREVIATESUBSEQ

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

NameTypeDefault Value
DISPLAYAUTHOR CDATA Required
MAXAUTHOR CDATA Required
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

Parents

AUTHORLIST


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/abstract.html000644 001750 001750 00000002673 12247746231 022533 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element ABSTRACT
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element ABSTRACT

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

NameTypeDefault Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

Parents

PUBTYPE

Children

FOLLOWING, PRECEEDING


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/address.html000644 001750 001750 00000002657 12247746231 022357 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element ADDRESS
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element ADDRESS

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

NameTypeDefault Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

Parents

PUBTYPE

Children

FOLLOWING, PRECEEDING


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/aempty.html000644 001750 001750 00000001505 12247746231 022220 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element AEMPTY
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element AEMPTY

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

Parents

AUTHORLIST


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/apr.html000644 001750 001750 00000002433 12247746231 021504 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element APR
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element APR

Synopsis

Content Model

EMPTY

Attributes

NameTypeDefault Value
THREELET CDATA None
ABBREV CDATA None
FULL CDATA None

Description

Parents

MONTHS


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/area.html000644 001750 001750 00000002640 12247746231 021632 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element AREA
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element AREA

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

NameTypeDefault Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

Parents

PUBTYPE

Children

FOLLOWING, PRECEEDING


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/asame.html000644 001750 001750 00000001477 12247746231 022017 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element ASAME
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element ASAME

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

Parents

AUTHORLIST


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/aug.html000644 001750 001750 00000002434 12247746231 021477 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element AUG
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element AUG

Synopsis

Content Model

EMPTY

Attributes

NameTypeDefault Value
THREELET CDATA None
ABBREV CDATA None
FULL CDATA None

Description

Parents

MONTHS


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/author.html000644 001750 001750 00000001506 12247746231 022224 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element AUTHOR
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element AUTHOR

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

Parents

CITESTYLE


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/authorlist.html000644 001750 001750 00000006067 12247746231 023127 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element AUTHORLIST
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element AUTHORLIST

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?,ABBREVIATEFIRST?,ABBREVIATESUBSEQ?,AEMPTY?,
 ASAME?,AUTHORSEPS,AUTHORNAMES,TEXT?,TEXTED?)

Attributes

NameTypeDefault Value
ALTERNATESTYLE Enumeration:
  ABOLD
  ABOLDITALIC
  ABOLDITULINE
  ABOLDULINE
  AITALIC
  AITULINE
  ASUB
  ASUPER
  AULINE
  NONE
None
ALTERNATETEXT Enumeration:
  AEMPTY
  JOURNALNAME
  NONE
  TITLEALL
  TITLEPART
  TITLEPUB
  TITLESERIES
"AEMPTY"
ROLE Enumeration:
  ALL
  PART
  PUB
  SERIES
"PUB"
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

Parents

AUTHORONLY, INTEXTDEF, PUBTYPE, YEARONLY

Children

ABBREVIATEFIRST, ABBREVIATESUBSEQ, AEMPTY, ASAME, AUTHORNAMES, AUTHORSEPS, FOLLOWING, PRECEEDING, TEXT, TEXTED


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/authornames.html000644 001750 001750 00000001764 12247746231 023256 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element AUTHORNAMES
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element AUTHORNAMES

Synopsis

Content Model

(NAMEFIRST,NAMEOTHER)

Attributes

None

Description

Parents

AUTHORLIST

Children

NAMEFIRST, NAMEOTHER


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/authoronly.html000644 001750 001750 00000003104 12247746231 023122 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element AUTHORONLY
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element AUTHORONLY

Synopsis

Content Model

(((REFNUMBER|AUTHORLIST|PUBDATE|TITLE|JOURNALNAME|VOLUME|ISSUE|
   PAGES|PUBLISHER|PUBPLACE),
  SEPARATOR?)+)

Attributes

None

Description

Parents

CITSTYLE

Children

AUTHORLIST, ISSUE, JOURNALNAME, PAGES, PUBDATE, PUBLISHER, PUBPLACE, REFNUMBER, SEPARATOR, TITLE, VOLUME


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/authorseps.html000644 001750 001750 00000001754 12247746231 023124 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element AUTHORSEPS
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element AUTHORSEPS

Synopsis

Content Model

(TWOSEPS,THREESEPS)

Attributes

None

Description

Parents

AUTHORLIST

Children

THREESEPS, TWOSEPS


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/bibliotitle.html000644 001750 001750 00000001530 12247746231 023221 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element BIBLIOTITLE
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element BIBLIOTITLE

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

Parents

BIBSTYLE


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/bibstyle.html000644 001750 001750 00000003425 12247746231 022541 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element BIBSTYLE
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element BIBSTYLE

Synopsis

Content Model

(BIBLIOTITLE?,MONTHS?)

Attributes

NameTypeDefault Value
BIBLIOFIRSTINDENT CDATA None
BIBLIOSEQUENCE Enumeration:
  BASIS
  BAUTHORDATE
  BCITEKEY
  BDATEASC
  BDATEDESC
"BAUTHORDATE"
BIBLIOBLOCKINDENT CDATA None
FONTSIZE CDATA None

Description

Parents

CITESTYLE

Children

BIBLIOTITLE, MONTHS


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/chapternum.html000644 001750 001750 00000002671 12247746231 023074 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element CHAPTERNUM
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element CHAPTERNUM

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

NameTypeDefault Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

Parents

PUBTYPE

Children

FOLLOWING, PRECEEDING


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/citekey.html000644 001750 001750 00000002734 12247746231 022363 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element CITEKEY
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element CITEKEY

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

NameTypeDefault Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

Parents

INTEXTDEF, PUBTYPE

Children

FOLLOWING, PRECEEDING


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/citestyle.html000644 001750 001750 00000002440 12247746231 022725 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element CITESTYLE
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element CITESTYLE

Synopsis

Content Model

(STYLENAME,AUTHOR?,COMMENT?,URL?,REFSTYLE,CITSTYLE,BIBSTYLE)

Attributes

None

Description

Parents

STYLESET

Children

AUTHOR, BIBSTYLE, CITSTYLE, COMMENT, REFSTYLE, STYLENAME, URL


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/citseparator.html000644 001750 001750 00000001532 12247746231 023421 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element CITSEPARATOR
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element CITSEPARATOR

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

Parents

CITSTYLE


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/citstyle.html000644 001750 001750 00000004131 12247746231 022557 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element CITSTYLE
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element CITSTYLE

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?,CITSEPARATOR,RANGESEPARATOR?,INTEXTDEF?,
 AUTHORONLY?,YEARONLY?)

Attributes

NameTypeDefault Value
INTEXTSEQUENCE Enumeration:
  ASIS
  AUTHORDATE
  CITEKEY
  DATEASC
  DATEDESC
"AUTHORDATE"
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

Parents

CITESTYLE

Children

AUTHORONLY, CITSEPARATOR, FOLLOWING, INTEXTDEF, PRECEEDING, RANGESEPARATOR, YEARONLY


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/classcodeintl.html000644 001750 001750 00000002706 12247746231 023554 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element CLASSCODEINTL
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element CLASSCODEINTL

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

NameTypeDefault Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

Parents

PUBTYPE

Children

FOLLOWING, PRECEEDING


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/classcodeus.html000644 001750 001750 00000002710 12247746231 023230 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element CLASSCODEUS
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element CLASSCODEUS

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

NameTypeDefault Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

Parents

PUBTYPE

Children

FOLLOWING, PRECEEDING


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/classification.html000644 001750 001750 00000002710 12247746231 023713 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element CLASSIFICATION
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element CLASSIFICATION

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

NameTypeDefault Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

Parents

PUBTYPE

Children

FOLLOWING, PRECEEDING


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/comment.html000644 001750 001750 00000001522 12247746231 022362 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element COMMENT
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element COMMENT

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

Parents

CITESTYLE


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/computer.html000644 001750 001750 00000002675 12247746231 022570 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element COMPUTER
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element COMPUTER

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

NameTypeDefault Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

Parents

PUBTYPE

Children

FOLLOWING, PRECEEDING


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/conferencelocation.html000644 001750 001750 00000002715 12247746231 024565 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element CONFERENCELOCATION
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element CONFERENCELOCATION

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

NameTypeDefault Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

Parents

PUBTYPE

Children

FOLLOWING, PRECEEDING


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/dec.html000644 001750 001750 00000002451 12247746231 021455 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element DEC
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element DEC

Synopsis

Content Model

EMPTY

Attributes

NameTypeDefault Value
THREELET CDATA None
ABBREV CDATA None
FULL CDATA None

Description

Parents

MONTHS


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/degree.html000644 001750 001750 00000002650 12247746231 022156 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element DEGREE
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element DEGREE

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

NameTypeDefault Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

Parents

PUBTYPE

Children

FOLLOWING, PRECEEDING


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/edition.html000644 001750 001750 00000002652 12247746231 022360 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element EDITION
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element EDITION

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

NameTypeDefault Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

Parents

PUBTYPE

Children

FOLLOWING, PRECEEDING


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/feb.html000644 001750 001750 00000002440 12247746231 021454 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element FEB
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element FEB

Synopsis

Content Model

EMPTY

Attributes

NameTypeDefault Value
THREELET CDATA None
ABBREV CDATA None
FULL CDATA None

Description

Parents

MONTHS


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/firstsep.html000644 001750 001750 00000001507 12247746231 022562 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element FIRSTSEP
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element FIRSTSEP

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

Parents

PUBDATE


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/following.html000644 001750 001750 00000004577 12247746231 022735 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element FOLLOWING
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element FOLLOWING

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

Parents

ABSTRACT, ADDRESS, AREA, AUTHORLIST, CHAPTERNUM, CITEKEY, CITSTYLE, CLASSCODEINTL, CLASSCODEUS, CLASSIFICATION, COMPUTER, CONFERENCELOCATION, DEGREE, EDITION, ISSUE, JOURNALNAME, LINK, MEDIATYPE, NOTES, NUMVOLUMES, OSTYPE, PAGERANGE, PAGES, PAMPHLETNUM, PUBDATE, PUBLISHER, PUBPLACE, RECIPIENTEMAIL, REFNUMBER, REGISTRYNUM, RUNNINGTIME, SECTION, SENDEREMAIL, SERIAL, SINGLEPAGE, TEXTMULTIPLE, TEXTSINGLE, TITLE, TYPEOFWORK, USERDEF, VOLUME


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/intextdef.html000644 001750 001750 00000003172 12247746231 022715 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element INTEXTDEF
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element INTEXTDEF

Synopsis

Content Model

(((REFNUMBER|CITEKEY|AUTHORLIST|PUBDATE|TITLE|JOURNALNAME|VOLUME|
   ISSUE|PAGES|PUBLISHER|PUBPLACE),
  SEPARATOR?)+)

Attributes

None

Description

Parents

CITSTYLE

Children

AUTHORLIST, CITEKEY, ISSUE, JOURNALNAME, PAGES, PUBDATE, PUBLISHER, PUBPLACE, REFNUMBER, SEPARATOR, TITLE, VOLUME


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/issue.html000644 001750 001750 00000003037 12247746231 022053 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element ISSUE
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element ISSUE

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

NameTypeDefault Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

Parents

AUTHORONLY, INTEXTDEF, PUBTYPE, YEARONLY

Children

FOLLOWING, PRECEEDING


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/jan.html000644 001750 001750 00000002441 12247746231 021471 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element JAN
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element JAN

Synopsis

Content Model

EMPTY

Attributes

NameTypeDefault Value
THREELET CDATA None
ABBREV CDATA None
FULL CDATA None

Description

Parents

MONTHS


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/journalname.html000644 001750 001750 00000004756 12247746231 023247 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element JOURNALNAME
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element JOURNALNAME

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

NameTypeDefault Value
ALTERNATETEXT Enumeration:
  AABBREV
  AFULL
  AUSERONE
  AUSERTWO
"AFULL"
DEFAULTTEXT Enumeration:
  ABBREV
  FULL
  USERONE
  USERTWO
"ABBREV"
PUNCTUATION Enumeration:
  PERIOD
  PERIODSPACE
  SPACE
"SPACE"
CASE Enumeration:
  ASIS
  ICAPS
  LOWER
  UPPER
"ASIS"
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

Parents

AUTHORONLY, INTEXTDEF, PUBTYPE, YEARONLY

Children

FOLLOWING, PRECEEDING


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/jul.html000644 001750 001750 00000002437 12247746231 021520 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element JUL
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element JUL

Synopsis

Content Model

EMPTY

Attributes

NameTypeDefault Value
THREELET CDATA None
ABBREV CDATA None
FULL CDATA None

Description

Parents

MONTHS


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/jun.html000644 001750 001750 00000002430 12247746231 021513 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element JUN
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element JUN

Synopsis

Content Model

EMPTY

Attributes

NameTypeDefault Value
THREELET CDATA None
ABBREV CDATA None
FULL CDATA None

Description

Parents

MONTHS


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/link.html000644 001750 001750 00000003210 12247746231 021651 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element LINK
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element LINK

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

NameTypeDefault Value
ROLE Enumeration:
  0
  1
  2
  3
  4
"0"
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

Parents

PUBTYPE

Children

FOLLOWING, PRECEEDING


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/mar.html000644 001750 001750 00000002430 12247746231 021476 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element MAR
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element MAR

Synopsis

Content Model

EMPTY

Attributes

NameTypeDefault Value
THREELET CDATA None
ABBREV CDATA None
FULL CDATA None

Description

Parents

MONTHS


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/may.html000644 001750 001750 00000002435 12247746231 021512 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element MAY
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element MAY

Synopsis

Content Model

EMPTY

Attributes

NameTypeDefault Value
THREELET CDATA None
ABBREV CDATA None
FULL CDATA None

Description

Parents

MONTHS


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/mediatype.html000644 001750 001750 00000002660 12247746231 022705 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element MEDIATYPE
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element MEDIATYPE

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

NameTypeDefault Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

Parents

PUBTYPE

Children

FOLLOWING, PRECEEDING


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/months.html000644 001750 001750 00000002703 12247746231 022232 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element MONTHS
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element MONTHS

Synopsis

Content Model

(JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC)

Attributes

None

Description

Parents

BIBSTYLE

Children

APR, AUG, DEC, FEB, JAN, JUL, JUN, MAR, MAY, NOV, OCT, SEP


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/namefirst.html000644 001750 001750 00000003371 12247746231 022714 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element NAMEFIRST
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element NAMEFIRST

Synopsis

Content Model

EMPTY

Attributes

NameTypeDefault Value
UPPERCASE Enumeration:
  ALL
  LASTNAME
  NONE
"NONE"
INITIALSTYLE Enumeration:
  F.M.
  F.SPCM.
  FIRSTSPCM
  FIRSTSPCM.
  FIRSTSPCMIDDLE
  FM
  FSPCM
"F.M."
NAMEORDER Enumeration:
  FIRSTMIDDLELAST
  LAST
  LASTCOMMAFIRSTMIDDLE
  LASTCOMMASPCFIRSTMIDDLE
  LASTFIRSTMIDDLE
"LASTFIRSTMIDDLE"

Description

Parents

AUTHORNAMES


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/nameother.html000644 001750 001750 00000003370 12247746231 022705 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element NAMEOTHER
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element NAMEOTHER

Synopsis

Content Model

EMPTY

Attributes

NameTypeDefault Value
UPPERCASE Enumeration:
  ALL
  LASTNAME
  NONE
"NONE"
INITIALSTYLE Enumeration:
  F.M.
  F.SPCM.
  FIRSTSPCM
  FIRSTSPCM.
  FIRSTSPCMIDDLE
  FM
  FSPCM
"F.M."
NAMEORDER Enumeration:
  FIRSTMIDDLELAST
  LAST
  LASTCOMMAFIRSTMIDDLE
  LASTCOMMASPCFIRSTMIDDLE
  LASTFIRSTMIDDLE
"LASTFIRSTMIDDLE"

Description

Parents

AUTHORNAMES


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/notes.html000644 001750 001750 00000002647 12247746231 022061 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element NOTES
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element NOTES

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

NameTypeDefault Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

Parents

PUBTYPE

Children

FOLLOWING, PRECEEDING


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/nov.html000644 001750 001750 00000002440 12247746231 021522 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element NOV
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element NOV

Synopsis

Content Model

EMPTY

Attributes

NameTypeDefault Value
THREELET CDATA None
ABBREV CDATA None
FULL CDATA None

Description

Parents

MONTHS


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/numvolumes.html000644 001750 001750 00000002660 12247746231 023136 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element NUMVOLUMES
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element NUMVOLUMES

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

NameTypeDefault Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

Parents

PUBTYPE

Children

FOLLOWING, PRECEEDING


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/oct.html000644 001750 001750 00000002441 12247746231 021506 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element OCT
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element OCT

Synopsis

Content Model

EMPTY

Attributes

NameTypeDefault Value
THREELET CDATA None
ABBREV CDATA None
FULL CDATA None

Description

Parents

MONTHS


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/ostype.html000644 001750 001750 00000002652 12247746231 022250 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element OSTYPE
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element OSTYPE

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

NameTypeDefault Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

Parents

PUBTYPE

Children

FOLLOWING, PRECEEDING


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/pagerange.html000644 001750 001750 00000002613 12247746231 022653 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element PAGERANGE
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element PAGERANGE

Synopsis

Content Model

(PRECEEDING?,RANGESEPARATOR?,FOLLOWING?)

Attributes

NameTypeDefault Value
TYPE Enumeration:
  ABBREV
  CHICAGO
  FULL
  STARTONLY
  TWODIGIT
"FULL"

Description

Parents

PAGES

Children

FOLLOWING, PRECEEDING, RANGESEPARATOR


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/pages.html000644 001750 001750 00000003270 12247746231 022021 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element PAGES
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element PAGES

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?,SINGLEPAGE?,PAGERANGE?)

Attributes

NameTypeDefault Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

Parents

AUTHORONLY, INTEXTDEF, PUBTYPE, YEARONLY

Children

FOLLOWING, PAGERANGE, PRECEEDING, SINGLEPAGE


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/pamphletnum.html000644 001750 001750 00000002674 12247746231 023263 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element PAMPHLETNUM
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element PAMPHLETNUM

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

NameTypeDefault Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

Parents

PUBTYPE

Children

FOLLOWING, PRECEEDING


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/preceeding.html000644 001750 001750 00000004603 12247746231 023030 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element PRECEEDING
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element PRECEEDING

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

Parents

ABSTRACT, ADDRESS, AREA, AUTHORLIST, CHAPTERNUM, CITEKEY, CITSTYLE, CLASSCODEINTL, CLASSCODEUS, CLASSIFICATION, COMPUTER, CONFERENCELOCATION, DEGREE, EDITION, ISSUE, JOURNALNAME, LINK, MEDIATYPE, NOTES, NUMVOLUMES, OSTYPE, PAGERANGE, PAGES, PAMPHLETNUM, PUBDATE, PUBLISHER, PUBPLACE, RECIPIENTEMAIL, REFNUMBER, REGISTRYNUM, RUNNINGTIME, SECTION, SENDEREMAIL, SERIAL, SINGLEPAGE, TEXTMULTIPLE, TEXTSINGLE, TITLE, TYPEOFWORK, USERDEF, VOLUME


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/pubdate.html000644 001750 001750 00000006433 12247746231 022352 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element PUBDATE
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element PUBDATE

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?,FIRSTSEP?,SECONDSEP?)

Attributes

NameTypeDefault Value
SEQUENCE Enumeration:
  DM
  DMY
  MD
  MDY
  MY
  Y
  YM
  YMD
"Y"
FORMAT Enumeration:
  NO
  YES
"YES"
YEARFORMAT Enumeration:
  FOURDIGIT
  ROMANYEAR
  TWODIGIT
"FOURDIGIT"
MONTHFORMAT Enumeration:
  ABBREVDOT
  ARABICMONTH
  FULL
  ROMANMONTH
  THREELETTER
"ARABICMONTH"
PADLEADINGZERO Enumeration:
  NN
  YY
"NN"
ROLE Enumeration:
  ALL
  PRIMARY
  SECONDARY
"PRIMARY"
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None
DAYFORMAT Enumeration:
  ARABICDAY
  ROMANDAY
"ARABICDAY"

Description

Parents

AUTHORONLY, INTEXTDEF, PUBTYPE, YEARONLY

Children

FIRSTSEP, FOLLOWING, PRECEEDING, SECONDSEP


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/publisher.html000644 001750 001750 00000003056 12247746231 022721 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element PUBLISHER
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element PUBLISHER

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

NameTypeDefault Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

Parents

AUTHORONLY, INTEXTDEF, PUBTYPE, YEARONLY

Children

FOLLOWING, PRECEEDING


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/pubplace.html000644 001750 001750 00000003054 12247746231 022515 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element PUBPLACE
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element PUBPLACE

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

NameTypeDefault Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

Parents

AUTHORONLY, INTEXTDEF, PUBTYPE, YEARONLY

Children

FOLLOWING, PRECEEDING


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/pubtype.html000644 001750 001750 00000010440 12247746231 022407 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element PUBTYPE
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element PUBTYPE

Synopsis

Content Model

(((REFNUMBER|CITEKEY|AUTHORLIST|PUBDATE|TITLE|JOURNALNAME|VOLUME|
   ISSUE|PAGES|PUBLISHER|PUBPLACE|SERIAL|ADDRESS|USERDEF|NOTES|
   ABSTRACT|LINK|TYPEOFWORK|AREA|OSTYPE|DEGREE|RUNNINGTIME|CLASSCODEINTL|
   CLASSCODEUS|SENDEREMAIL|RECIPIENTEMAIL|MEDIATYPE|NUMVOLUMES|
   EDITION|COMPUTER|CONFERENCELOCATION|REGISTRYNUM|CLASSIFICATION|
   SECTION|PAMPHLETNUM|CHAPTERNUM),
  SEPARATOR?)+)

Attributes

NameTypeDefault Value
TYPE Enumeration:
  ABST
  ADVS
  ART
  BILL
  BOOK
  CASE
  CHAP
  COMP
  CONF
  CTLG
  DATA
  ELEC
  GEN
  ICOMM
  INPR
  JFULL
  JOUR
  MAP
  MGZN
  MPCT
  MUSIC
  NEWS
  PAMP
  PAT
  PCOMM
  RPRT
  SER
  SLIDE
  SOUND
  STAT
  THES
  UNBILL
  UNPB
  VIDEO
Required

Description

Parents

REFSTYLE

Children

ABSTRACT, ADDRESS, AREA, AUTHORLIST, CHAPTERNUM, CITEKEY, CLASSCODEINTL, CLASSCODEUS, CLASSIFICATION, COMPUTER, CONFERENCELOCATION, DEGREE, EDITION, ISSUE, JOURNALNAME, LINK, MEDIATYPE, NOTES, NUMVOLUMES, OSTYPE, PAGES, PAMPHLETNUM, PUBDATE, PUBLISHER, PUBPLACE, RECIPIENTEMAIL, REFNUMBER, REGISTRYNUM, RUNNINGTIME, SECTION, SENDEREMAIL, SEPARATOR, SERIAL, TITLE, TYPEOFWORK, USERDEF, VOLUME


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/rangeseparator.html000644 001750 001750 00000001614 12247746231 023737 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element RANGESEPARATOR
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element RANGESEPARATOR

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

Parents

CITSTYLE, PAGERANGE


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/recipientemail.html000644 001750 001750 00000002715 12247746231 023717 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element RECIPIENTEMAIL
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element RECIPIENTEMAIL

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

NameTypeDefault Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

Parents

PUBTYPE

Children

FOLLOWING, PRECEEDING


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/refnumber.html000644 001750 001750 00000003065 12247746231 022711 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element REFNUMBER
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element REFNUMBER

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

NameTypeDefault Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

Parents

AUTHORONLY, INTEXTDEF, PUBTYPE, YEARONLY

Children

FOLLOWING, PRECEEDING


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/refstyle.html000644 001750 001750 00000001636 12247746231 022563 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element REFSTYLE
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element REFSTYLE

Synopsis

Content Model

(PUBTYPE+)

Attributes

None

Description

Parents

CITESTYLE

Children

PUBTYPE


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/sep.html000644 001750 001750 00000002445 12247746231 021514 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element SEP
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element SEP

Synopsis

Content Model

EMPTY

Attributes

NameTypeDefault Value
THREELET CDATA None
ABBREV CDATA None
FULL CDATA None

Description

Parents

MONTHS


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/registrynum.html000644 001750 001750 00000002700 12247746231 023307 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element REGISTRYNUM
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element REGISTRYNUM

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

NameTypeDefault Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

Parents

PUBTYPE

Children

FOLLOWING, PRECEEDING


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/runningtime.html000644 001750 001750 00000002701 12247746231 023257 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element RUNNINGTIME
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element RUNNINGTIME

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

NameTypeDefault Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

Parents

PUBTYPE

Children

FOLLOWING, PRECEEDING


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/secondsep.html000644 001750 001750 00000001520 12247746231 022701 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element SECONDSEP
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element SECONDSEP

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

Parents

PUBDATE


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/section.html000644 001750 001750 00000002665 12247746231 022375 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element SECTION
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element SECTION

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

NameTypeDefault Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

Parents

PUBTYPE

Children

FOLLOWING, PRECEEDING


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/senderemail.html000644 001750 001750 00000002667 12247746231 023223 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element SENDEREMAIL
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element SENDEREMAIL

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

NameTypeDefault Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

Parents

PUBTYPE

Children

FOLLOWING, PRECEEDING


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/separator.html000644 001750 001750 00000001677 12247746231 022733 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element SEPARATOR
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element SEPARATOR

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

Parents

AUTHORONLY, INTEXTDEF, PUBTYPE, YEARONLY


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/serial.html000644 001750 001750 00000002661 12247746231 022204 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element SERIAL
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element SERIAL

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

NameTypeDefault Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

Parents

PUBTYPE

Children

FOLLOWING, PRECEEDING


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/singlepage.html000644 001750 001750 00000001747 12247746231 023047 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element SINGLEPAGE
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element SINGLEPAGE

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

None

Description

Parents

PAGES

Children

FOLLOWING, PRECEEDING


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/stylename.html000644 001750 001750 00000001524 12247746231 022723 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element STYLENAME
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element STYLENAME

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

Parents

CITESTYLE


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/styleset.html000644 001750 001750 00000001536 12247746231 022601 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element STYLESET
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element STYLESET

Synopsis

Content Model

(CITESTYLE)+

Attributes

None

Description

Children

CITESTYLE


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/text.html000644 001750 001750 00000001747 12247746231 021715 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element TEXT
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element TEXT

Synopsis

Content Model

(TEXTSINGLE?,TEXTMULTIPLE?)

Attributes

None

Description

Parents

AUTHORLIST

Children

TEXTMULTIPLE, TEXTSINGLE


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/texted.html000644 001750 001750 00000001757 12247746231 022227 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element TEXTED
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element TEXTED

Synopsis

Content Model

(TEXTSINGLE?,TEXTMULTIPLE?)

Attributes

None

Description

Parents

AUTHORLIST

Children

TEXTMULTIPLE, TEXTSINGLE


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/textmultiple.html000644 001750 001750 00000002016 12247746231 023457 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element TEXTMULTIPLE
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element TEXTMULTIPLE

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

None

Description

Parents

TEXT, TEXTED

Children

FOLLOWING, PRECEEDING


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/textsingle.html000644 001750 001750 00000002015 12247746231 023104 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element TEXTSINGLE
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element TEXTSINGLE

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

None

Description

Parents

TEXT, TEXTED

Children

FOLLOWING, PRECEEDING


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/threeseps.html000644 001750 001750 00000002011 12247746231 022714 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element THREESEPS
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element THREESEPS

Synopsis

Content Model

(THREESEPSEACH,THREESEPSLAST)

Attributes

None

Description

Parents

AUTHORSEPS

Children

THREESEPSEACH, THREESEPSLAST


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/threesepseach.html000644 001750 001750 00000001544 12247746231 023547 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element THREESEPSEACH
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element THREESEPSEACH

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

Parents

THREESEPS


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/threesepslast.html000644 001750 001750 00000001540 12247746231 023606 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element THREESEPSLAST
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element THREESEPSLAST

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

Parents

THREESEPS


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/title.html000644 001750 001750 00000004206 12247746231 022043 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element TITLE
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element TITLE

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

NameTypeDefault Value
CASE Enumeration:
  ASIS
  ICAPS
  LOWER
  UPPER
"ASIS"
ROLE Enumeration:
  ALL
  PART
  PUB
  SERIES
"PUB"
MAXTITLE CDATA None
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

Parents

AUTHORONLY, INTEXTDEF, PUBTYPE, YEARONLY

Children

FOLLOWING, PRECEEDING


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/twoseps.html000644 001750 001750 00000001515 12247746231 022426 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element TWOSEPS
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element TWOSEPS

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

Parents

AUTHORSEPS


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/typeofwork.html000644 001750 001750 00000002664 12247746231 023141 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element TYPEOFWORK
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element TYPEOFWORK

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

NameTypeDefault Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

Parents

PUBTYPE

Children

FOLLOWING, PRECEEDING


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/url.html000644 001750 001750 00000001501 12247746231 021517 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element URL
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element URL

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

None

Description

Parents

CITESTYLE


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/userdef.html000644 001750 001750 00000003224 12247746231 022356 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element USERDEF
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element USERDEF

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

NameTypeDefault Value
ROLE Enumeration:
  1
  2
  3
  4
  5
"1"
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

Parents

PUBTYPE

Children

FOLLOWING, PRECEEDING


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/volume.html000644 001750 001750 00000003045 12247746231 022231 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element VOLUME
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element VOLUME

Synopsis

Content Model

(PRECEEDING?,FOLLOWING?)

Attributes

NameTypeDefault Value
STYLE Enumeration:
  BOLD
  BOLDITALIC
  BOLDITULINE
  BOLDULINE
  ITALIC
  ITULINE
  NONE
  SUB
  SUPER
  ULINE
None

Description

Parents

AUTHORONLY, INTEXTDEF, PUBTYPE, YEARONLY

Children

FOLLOWING, PRECEEDING


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/dtdelem/yearonly.html000644 001750 001750 00000003024 12247746231 022561 0ustar00markusmarkus000000 000000 citestyle XML DTD: Element YEARONLY
citestyle XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev]

Element YEARONLY

Synopsis

Content Model

(((REFNUMBER|AUTHORLIST|PUBDATE|TITLE|JOURNALNAME|VOLUME|ISSUE|
   PAGES|PUBLISHER|PUBPLACE),
  SEPARATOR?)+)

Attributes

None

Description

Parents

CITSTYLE

Children

AUTHORLIST, ISSUE, JOURNALNAME, PAGES, PUBDATE, PUBLISHER, PUBPLACE, REFNUMBER, SEPARATOR, TITLE, VOLUME


HTML Presentation of citestyle XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citestylex/ele-desc/abbreviatefirst.html000644 001750 001750 00000002353 11512721662 024135 0ustar00markusmarkus000000 000000 ABBREVIATEFIRST description

Description

In certain cases it is not desired to render the whole list of authors, esp. in in-text citations. The ABBREVIATEFIRST element contains the string that is to be printed instead of the suppressed authors in the first citation of this reference in the text. ABBREVIATESUBSEQ defines the string for all subsequent citations

The MAXAUTHOR attribute denotes the maximum number of authors that should be displayed in the authorlist. Up to this limit, all authors will be rendered. Above this limit, the content of the element will be printed instead of the suppressed authors.

The DISPLAYAUTHOR attribute denotes the number of authors that will actually be rendered if the total number of authors exceed the limit in MAXAUTHOR.

Example

<AUTHORLIST role="PRIMARY">
<ABBREVIATEFIRST MAXAUTHOR="4" DISPLAYAUTHOR="3">, et al</ABBREVIATEFIRST>
<ABBREVIATESUBSEQ MAXAUTHOR="4" DISPLAYAUTHOR="1">, et al</ABBREVIATESUBSEQ>
...
</AUTHORLIST>
    
refdb-1.0.2/doc/citestylex/ele-desc/abbreviatesubseq.html000644 001750 001750 00000002353 11512721662 024310 0ustar00markusmarkus000000 000000 ABBREVIATESUBSEQ description

Description

In certain cases it is not desired to render the whole list of authors, esp. in in-text citations. The ABBREVIATEFIRST element contains the string that is to be printed instead of the suppressed authors in the first citation of this reference in the text. ABBREVIATESUBSEQ defines the string for all subsequent citations

The MAXAUTHOR attribute denotes the maximum number of authors that should be displayed in the authorlist. Up to this limit, all authors will be rendered. Above this limit, the content of the element will be printed instead of the suppressed authors.

The DISPLAYAUTHOR attribute denotes the number of authors that will actually be rendered if the total number of authors exceed the limit in MAXAUTHOR.

Example

<AUTHORLIST role="PRIMARY">
<ABBREVIATEFIRST MAXAUTHOR="4" DISPLAYAUTHOR="3">, et al</ABBREVIATEFIRST>
<ABBREVIATESUBSEQ MAXAUTHOR="4" DISPLAYAUTHOR="1">, et al</ABBREVIATESUBSEQ>
...
</AUTHORLIST>
    
refdb-1.0.2/doc/citestylex/ele-desc/abstract.html000644 001750 001750 00000001340 11512721662 022557 0ustar00markusmarkus000000 000000 ABSTRACT description

Description

ABSTRACT describes how the abstract of a publication is to be rendered.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Example

<ABSTRACT>
<PRECEEDING>, </PRECEEDING>
</ABSTRACT>   
refdb-1.0.2/doc/citestylex/ele-desc/address.html000644 001750 001750 00000001343 11512721662 022404 0ustar00markusmarkus000000 000000 ADDRESS description

Description

ADDRESS describes how the contact address of a publication is to be rendered.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Example

<ADDRESS>
<PRECEEDING>, </PRECEEDING>
</ADDRESS>   
refdb-1.0.2/doc/citestylex/ele-desc/aempty.html000644 001750 001750 00000003133 11512721662 022255 0ustar00markusmarkus000000 000000 AEMPTY description

Description

AEMPTY defines a string that is to be printed if the author of a reference is unknown. The string is used if the "alternatetext" attribute of AUTHORLIST says so.

Example

<AUTHORLIST role="PUB" alternatetext="AEMPTY">
<FOLLOWING> </FOLLOWING>
<ABBREVIATEFIRST MAXAUTHOR="256" DISPLAYAUTHOR="255">, et al</ABBREVIATEFIRST>
<ABBREVIATESUBSEQ MAXAUTHOR="256" DISPLAYAUTHOR="255">, et al</ABBREVIATESUBSEQ>
<AEMPTY>Anonymous</AEMPTY>
<AUTHORSEPS>
<TWOSEPS> and </TWOSEPS>
<THREESEPS>
<THREESEPSEACH>, </THREESEPSEACH>
<THREESEPSLAST>, and </THREESEPSLAST>
</THREESEPS>
</AUTHORSEPS>
<AUTHORNAMES>
<NAMEFIRST NAMEORDER="LASTFIRSTMIDDLE" INITIALSTYLE="F.M." UPPERCASE="NONE">
<NAMEOTHER NAMEORDER="FIRSTMIDDLELAST" INITIALSTYLE="F.M." UPPERCASE="NONE">
</AUTHORNAMES>
<TEXT>
<TEXTSINGLE>
<FOLLOWING>, </FOLLOWING>
</TEXTSINGLE>
<TEXTMULTIPLE>
<FOLLOWING>, </FOLLOWING>
</TEXTMULTIPLE>
</TEXT>
<TEXTED>
<TEXTSINGLE>
<FOLLOWING>, </FOLLOWING>
</TEXTSINGLE>
<TEXTMULTIPLE>
<FOLLOWING>, </FOLLOWING>
</TEXTMULTIPLE>
</TEXTED>
</AUTHORLIST>
    
refdb-1.0.2/doc/citestylex/ele-desc/apr.html000644 001750 001750 00000000720 11512721662 021537 0ustar00markusmarkus000000 000000 APR description

Description

APR defines the full name, abbreviation, and three-letter abbreviation, if applicable, for the month April in the language of the publication.

Example

<MONTHS>
...
<APR FULL="April" ABBREV="Apr." THREELET="Apr"/>
...
</MONTHS>
    
refdb-1.0.2/doc/citestylex/ele-desc/area.html000644 001750 001750 00000001320 11512721662 021662 0ustar00markusmarkus000000 000000 AREA description

Description

AREA describes how the area information of a map is to be rendered.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Example

<AREA>
<PRECEEDING>, </PRECEEDING>
</AREA>   
refdb-1.0.2/doc/citestylex/ele-desc/asame.html000644 001750 001750 00000001151 11512721662 022042 0ustar00markusmarkus000000 000000 ASAME description

Description

ASAME defines a string that is to be printed instead of the authorlist for subsequent references of the same author(s). This is obviously only useful for bibliographies sorted by author names. If the element is defined and empty, the processing system is expected to suppress the authorlist.

Example

<AUTHORLIST role="PRIMARY">
...
<ASAME>----</ASAME>
...
</AUTHORLIST>
    
refdb-1.0.2/doc/citestylex/ele-desc/aug.html000644 001750 001750 00000000722 11512721662 021533 0ustar00markusmarkus000000 000000 AUG description

Description

AUG defines the full name, abbreviation, and three-letter abbreviation, if applicable, for the month August in the language of the publication.

Example

<MONTHS>
...
<AUG FULL="August" ABBREV="Aug." THREELET="Aug"/>
...
</MONTHS>
    
refdb-1.0.2/doc/citestylex/ele-desc/author.html000644 001750 001750 00000000521 11512721662 022256 0ustar00markusmarkus000000 000000 AUTHOR description

Description

AUTHOR contains the name and/or the email address of the style author.

Example

<AUTHOR>Barney Gumble</AUTHOR>
refdb-1.0.2/doc/citestylex/ele-desc/authorlist.html000644 001750 001750 00000006354 11512721662 023164 0ustar00markusmarkus000000 000000 AUTHORLIST description

Description

AUTHORLIST is a wrapper for the authors of a publication.

The ROLE attribute defines the purpose of the authorlist. The value of the attribute can be:

  • PART: The authors of an article or a chapter.
  • PUB: The authors or editors of a monographic item like a book or a report.
  • SERIES: The editors of a series of books.
  • ALL: Use this value if it is uncertain which of the above informationi will be available. The processing application should test the availability of author data in the sequence PART, PUB, SERIES, and display the first information it encounters.

The ALTERNATETEXT attribute determines what to print in place of an author list if a bibliographic entry does not contain authors or editors. Possible values are:

  • NONE: nothing will be printed instead
  • AEMPTY: the string defined in the element AEMPTY is printed
  • TITLEPART: use the title of the analytical level
  • TITLEPUB: use the title of the monographic level
  • TITLESERIES: use the title of the series level
  • TITLEALL: use the first available title. Processing applications should check for titles in the order PART, PUB, SERIES.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

The ALTERNATESTYLE attribute serves a similar purpose, but is used if a reference has no author and the title is used in the position of the authorlist. The formatting may then differ from a regular authorlist.

Example

<AUTHORLIST role="PUB">
<FOLLOWING> </FOLLOWING>
<ABBREVIATEFIRST MAXAUTHOR="256" DISPLAYAUTHOR="255">, et al</ABBREVIATEFIRST>
<ABBREVIATESUBSEQ MAXAUTHOR="256" DISPLAYAUTHOR="255">, et al</ABBREVIATESUBSEQ>
<AEMPTY>Anonymous</AEMPTY>
<AUTHORSEPS>
<TWOSEPS> and </TWOSEPS>
<THREESEPS>
<THREESEPSEACH>, </THREESEPSEACH>
<THREESEPSLAST>, and </THREESEPSLAST>
</THREESEPS>
</AUTHORSEPS>
<AUTHORNAMES>
<NAMEFIRST NAMEORDER="LASTFIRSTMIDDLE" INITIALSTYLE="F.M." UPPERCASE="NONE">
<NAMEOTHER NAMEORDER="FIRSTMIDDLELAST" INITIALSTYLE="F.M." UPPERCASE="NONE">
</AUTHORNAMES>
<TEXT>
<TEXTSINGLE>
<FOLLOWING>, </FOLLOWING>
</TEXTSINGLE>
<TEXTMULTIPLE>
<FOLLOWING>, </FOLLOWING>
</TEXTMULTIPLE>
</TEXT>
<TEXTED>
<TEXTSINGLE>
<FOLLOWING>, </FOLLOWING>
</TEXTSINGLE>
<TEXTMULTIPLE>
<FOLLOWING>, </FOLLOWING>
</TEXTMULTIPLE>
</TEXTED>
</AUTHORLIST>
    
refdb-1.0.2/doc/citestylex/ele-desc/authornames.html000644 001750 001750 00000001145 11512721662 023305 0ustar00markusmarkus000000 000000 AUTHORNAMES description

Description

AUTHORNAMES is a wrapper for the name specification of authors. It holds the NAMEFIRST and NAMEOTHER elements.

Example

<AUTHORNAMES>
<NAMEFIRST NAMEORDER="LASTFIRSTMIDDLE" INITIALSTYLE="F.M." UPPERCASE="NONE">
<NAMEOTHER NAMEORDER="FIRSTMIDDLELAST" INITIALSTYLE="F.M." UPPERCASE="NONE">
</AUTHORNAMES>
    
refdb-1.0.2/doc/citestylex/ele-desc/authoronly.html000644 001750 001750 00000003127 11512721662 023165 0ustar00markusmarkus000000 000000 AUTHORONLY description

Description

AUTHORONLY is the wrapper for the information that defines the appearance of an in-text citation that shows only the authors. It can have the same children as a PUBTYPE element. This element should be used in conjunction with the YEARONLY element to obtain a citation format that keeps the authors in the flow of the normal text, as shown in the following example sentence:

... as was shown by Smith and Miller in a recent publication (2001).

Example

<AUTHORONLY>
<AUTHORLIST>
<FOLLOWING>. </FOLLOWING>
<ABBREVIATE MAXAUTHOR="4" DISPLAYAUTHOR="1" ROLE="ALL"> et al. </ABBREVIATE>
<AUTHORSEPS>
<TWOSEPS> and </TWOSEPS>
<THREESEPS>
<THREESEPSEACH>, </THREESEPSEACH>
<THREESEPSLAST>, and </THREESEPSLAST>
</THREESEPS>
</AUTHORSEPS>
<AUTHORNAMES>
<NAMEFIRST NAMEORDER="LASTFIRSTMIDDLE" INITIALSTYLE="FIRSTSPCMIDDLE" UPPERCASE="NONE">
<NAMEOTHER NAMEORDER="LASTFIRSTMIDDLE" INITIALSTYLE="FIRSTSPCMIDDLE" UPPERCASE="NONE">
</AUTHORNAMES>
<TEXT>
<TEXTSINGLE>
<FOLLOWING>, </FOLLOWING>
</TEXTSINGLE>
<TEXTMULTIPLE>
<FOLLOWING>, </FOLLOWING>
</TEXTMULTIPLE>
</TEXT>
</AUTHORLIST>
</AUTHORONLY>
    
refdb-1.0.2/doc/citestylex/ele-desc/authorseps.html000644 001750 001750 00000001152 11512721662 023152 0ustar00markusmarkus000000 000000 AUTHORSEPS description

Description

AUTHORSEPS is a wrapper for the separators between authors. It holds the TWOSEPS and THREESEPS elements.

Example

<AUTHORSEPS>
<TWOSEPS> and </TWOSEPS>
<THREESEPS>
<THREESEPSEACH>, </THREESEPSEACH>
<THREESEPSLAST>, and </THREESEPSLAST>
</THREESEPS>
</AUTHORSEPS>
    
refdb-1.0.2/doc/citestylex/ele-desc/bibliotitle.html000644 001750 001750 00000001144 11512721662 023260 0ustar00markusmarkus000000 000000 BIBLIOTITLE description

Description

BIBLIOTITLE specifies the string which is to be used as the header of the bibliography. It is not uncommon to use "Bibliography" here.

Example

<CITSTYLE INTEXTSEQUENCE="AUTHORDATE">
<CITSEPARATOR>;</CITSEPARATOR>
<RANGESEPARATOR>-</RANGESEPARATOR>
<INTEXTDEF>
<REFNUMBER>
</REFNUMBER>
</INTEXTDEF>
</CITSTYLE>
    
refdb-1.0.2/doc/citestylex/ele-desc/bibstyle.html000644 001750 001750 00000002514 11512721662 022575 0ustar00markusmarkus000000 000000 BIBSTYLE description

Description

BIBSTYLE defines the general appearance of the bibliography.

The BIBLIOSEQUENCE attribute specifies the sorting order of the references in the bibliography. Possible values are:

  • BASIS: The references appear in the sequence as they are first cited in the text
  • BAUTHORDATE: The references are sorted by authornames and publication dates.
  • BCITEKEY: The references are sorted by citation keys.
  • BDATEASC: The references are sorted by date, older entries first.
  • BDATEDESC: The references are sorted by date, older entries last.

The BIBLIOFIRSTINDENT attribute can be used to specify the indentation of the first line of each reference in the bibliography listing, e.g. to create hanging indents.

The BIBLIOBLOCKINDENT attribute does the same for the remaining lines of each reference.

The FONTSIZE attribute sets the font size of the bibliography.

Example

<BIBSTYLE BIBLIOSEQUENCE="BASIS">
<BIBLIOTITLE>Literatur</BIBLIOTITLE>
<MONTHS>
...
</MONTHS>
</BIBSTYLE>
    
refdb-1.0.2/doc/citestylex/ele-desc/chapternum.html000644 001750 001750 00000001360 11512721662 023124 0ustar00markusmarkus000000 000000 CHAPTERNUM description

Description

CHAPTERNUM describes how the number of a chapter within a book is to be rendered.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Example

<CHAPTERNUM>
<PRECEEDING>, </PRECEEDING>
</CHAPTERNUM>   
refdb-1.0.2/doc/citestylex/ele-desc/citekey.html000644 001750 001750 00000001770 11512721662 022420 0ustar00markusmarkus000000 000000 CITEKEY description

Description

CITEKEY describes the appearance of a citation key in the bibliography or the in-text citation.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Example

<CITSTYLE INTEXTSEQUENCE="CITEKEY">
<CITSEPARATOR>;</CITSEPARATOR>
<RANGESEPARATOR>-</RANGESEPARATOR>
<INTEXTDEF>
<CITEKEY STYLE="BOLD">
<PRECEEDING>[</PRECEEDING>
<FOLLOWING>]</FOLLOWING>
</CITEKEY>
</INTEXTDEF>
</CITSTYLE>
    
refdb-1.0.2/doc/citestylex/ele-desc/citestyle.html000644 001750 001750 00000002155 11512721662 022766 0ustar00markusmarkus000000 000000 CITESTYLE description

Description

CITESTYLE specifies the citation style and the bibliography style of a particular journal or other publication. The style consists of a STYLENAME element to provide a unique name for the style, a REFSTYLE element to define the rendering of the various publication types, a CITSTYLE element to define the citation style, and of a BIBSTYLE element which defines the general appearance of the bibliographic listing.

Example

<CITESTYLE>
<STYLENAME>Br.J.Chem.</STYLENAME>
<REFSTYLE>
<PUBTYPE TYPE="GEN">
...
</PUBTYPE>
<PUBTYPE TYPE="JOUR">
...
</PUBTYPE>
</REFSTYLE>
<CITSTYLE INTEXTSEQUENCE="AUTHORDATE">
...
</CITSTYLE>
<BIBSTYLE BIBLIOSEQUENCE="BAUTHORDATE">
...
</BIBSTYLE>
</CITESTYLE>
    
refdb-1.0.2/doc/citestylex/ele-desc/citseparator.html000644 001750 001750 00000001230 11512721662 023452 0ustar00markusmarkus000000 000000 CITSEPARATOR description

Description

CITSEPARATOR specifies a string which separates multiple citations like in (Jones, 2000; James, 2001).

Example

<CITSTYLE INTEXTSEQUENCE="AUTHORDATE">
<CITSEPARATOR>;</CITSEPARATOR>
<RANGESEPARATOR>-</RANGESEPARATOR>
<INTEXTDEF>
<REFNUMBER>
<PRECEEDING>[</PRECEEDING>
<FOLLOWING>]<FOLLOWING>
</REFNUMBER>
</INTEXTDEF>
</CITSTYLE>
    
refdb-1.0.2/doc/citestylex/ele-desc/citstyle.html000644 001750 001750 00000003025 11512721662 022616 0ustar00markusmarkus000000 000000 CITSTYLE description

Description

CITSTYLE defines the in-text citation style of the bibliography.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

The INTEXTSEQUENCE attribute specifies the sorting order of citations within a multiple in-text citation. The value can be one of the following:

  • ASIS: The citations appear in the sequence as they are cited in the text
  • AUTHORDATE: The citations are sorted by authornames and publication dates.
  • CITEKEY: The citations are sorted by the citation keys.
  • DATEASC: The citations are sorted by date, older entries first.
  • DATEDESC: The citations are sorted by date, older entries last.

Example

<CITSTYLE INTEXTSEQUENCE="AUTHORDATE">
<CITSEPARATOR>;</CITSEPARATOR>
<RANGESEPARATOR>-</RANGESEPARATOR>
<INTEXTDEF>
<REFNUMBER>
<PRECEEDING>[</PRECEEDING>
<FOLLOWING>]</FOLLOWING>
</REFNUMBER>
</INTEXTDEF>
</CITSTYLE>
    
refdb-1.0.2/doc/citestylex/ele-desc/classcodeintl.html000644 001750 001750 00000001377 11512721662 023615 0ustar00markusmarkus000000 000000 CLASSCODEINTL description

Description

CLASSCODEINTL describes how the international class code of a patent is to be rendered.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Example

<CLASSCODEINTL>
<PRECEEDING>, </PRECEEDING>
</CLASSCODEINTL>   
refdb-1.0.2/doc/citestylex/ele-desc/classcodeus.html000644 001750 001750 00000001354 11512721662 023271 0ustar00markusmarkus000000 000000 CLASSCODEUS description

Description

CLASSCODEUS describes how the US class code of a patent is to be rendered.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Example

<CLASSCODEUS>
<PRECEEDING>, </PRECEEDING>
</CLASSCODEUS>   
refdb-1.0.2/doc/citestylex/ele-desc/classification.html000644 001750 001750 00000001431 11512721662 023750 0ustar00markusmarkus000000 000000 CLASSIFICATION description

Description

CLASSIFICATION describes how the classification of a movie, of a video, or of a sound track is to be rendered.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Example

<CLASSIFICATION>
<PRECEEDING>, </PRECEEDING>
</CLASSIFICATION>   
refdb-1.0.2/doc/citestylex/ele-desc/comment.html000644 001750 001750 00000000527 11512721662 022424 0ustar00markusmarkus000000 000000 COMMENT description

Description

COMMENT contains a brief description of the style.

Example

<COMMENT>Tissue Engineering, Mary Ann Liebert</COMMENT>
refdb-1.0.2/doc/citestylex/ele-desc/computer.html000644 001750 001750 00000001361 11512721662 022615 0ustar00markusmarkus000000 000000 COMPUTER description

Description

COMPUTER describes how the hardware information of a computer program is to be rendered.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Example

<COMPUTER>
<PRECEEDING>, </PRECEEDING>
</COMPUTER>   
refdb-1.0.2/doc/citestylex/ele-desc/conferencelocation.html000644 001750 001750 00000001407 11512721662 024620 0ustar00markusmarkus000000 000000 CONFERENCELOCATION description

Description

CONFERENCELOCATION describes how the location of a conference is to be rendered.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Example

<CONFERENCELOCATION>
<PRECEEDING>, </PRECEEDING>
</CONFERENCELOCATION>   
refdb-1.0.2/doc/citestylex/ele-desc/dec.html000644 001750 001750 00000000722 11512721662 021512 0ustar00markusmarkus000000 000000 DEC description

Description

DEC defines the full name, abbreviation, and three-letter abbreviation, if applicable, for the month December in the language of the publication.

Example

<MONTHS>
...
<DEC FULL="December" ABBREV="Dec." THREELET="Dec"/>
</MONTHS>
    
refdb-1.0.2/doc/citestylex/ele-desc/degree.html000644 001750 001750 00000001317 11512721662 022213 0ustar00markusmarkus000000 000000 DEGREE description

Description

DEGREE describes how the type of a thesis is to be rendered.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Example

<DEGREE>
<PRECEEDING>, </PRECEEDING>
</DEGREE>   
refdb-1.0.2/doc/citestylex/ele-desc/edition.html000644 001750 001750 00000001340 11512721662 022407 0ustar00markusmarkus000000 000000 EDITION description

Description

EDITION describes how the edition of a monographic item is to be rendered.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Example

<EDITION>
<PRECEEDING>, </PRECEEDING>
</EDITION>   
refdb-1.0.2/doc/citestylex/ele-desc/feb.html000644 001750 001750 00000000726 11512721662 021517 0ustar00markusmarkus000000 000000 FEB description

Description

FEB defines the full name, abbreviation, and three-letter abbreviation, if applicable, for the month February in the language of the publication.

Example

<MONTHS>
...
<FEB FULL="February" ABBREV="Feb." THREELET="Feb"/>
...
</MONTHS>
    
refdb-1.0.2/doc/citestylex/ele-desc/firstsep.html000644 001750 001750 00000001360 11512721662 022615 0ustar00markusmarkus000000 000000 FIRSTSEP description

Description

FIRSTSEP defines the first separator in a date entry. This is usually a slash or a dash or a period. The second separator, if applicable, is defined by SECONDSEP

Example

<PUBDATE FORMAT="YES" SEQUENCE="MDY" MONTHFORMAT="ARABICMONTH" DAYFORMAT="ARABICDAY" YEARFORMAT="FOURDIGIT" PADLEADINGZERO="NN" ROLE="PRIMARY">
<FIRSTSEP>/</FIRSTSEP>
<SECONDSEP>/</SECONDSEP>
<PRECEEDING></PRECEEDING>
<FOLLOWING>. </FOLLOWING>
</PUBDATE>
    
refdb-1.0.2/doc/citestylex/ele-desc/following.html000644 001750 001750 00000001547 11512721662 022765 0ustar00markusmarkus000000 000000 FOLLOWING description

Description

All elements in PUBTYPE and equivalent wrappers can define strings that always precede (PRECEEDING) or follow the element. These may e.g. be punctuation characters or whitespace to separate the entries. In some cases the SEPARATOR element may be more appropriate.

Example

<PUBDATE FORMAT="YES" SEQUENCE="MDY" MONTHFORMAT="ARABICMONTH" DAYFORMAT="ARABICDAY" YEARFORMAT="FOURDIGIT" PADLEADINGZERO="NN" ROLE="PRIMARY">
<FIRSTSEP>/</FIRSTSEP>
<SECONDSEP>/</SECONDSEP>
<FOLLOWING>. </FOLLOWING>
</PUBDATE>
    
refdb-1.0.2/doc/citestylex/ele-desc/intextdef.html000644 001750 001750 00000002772 11512721662 022760 0ustar00markusmarkus000000 000000 INTEXTDEF description

Description

INTEXTDEF is the wrapper for the information that defines the appearance of the in-text citation. It can have the same children as a PUBTYPE element.

Example

<INTEXTDEF>
<AUTHORLIST>
<FOLLOWING>. </FOLLOWING>
<ABBREVIATE MAXAUTHOR="4" DISPLAYAUTHOR="1" ROLE="ALL"> et al. </ABBREVIATE>
<AUTHORSEPS>
<TWOSEPS> and </TWOSEPS>
<THREESEPS>
<THREESEPSEACH>, </THREESEPSEACH>
<THREESEPSLAST>, and </THREESEPSLAST>
</THREESEPS>
</AUTHORSEPS>
<AUTHORNAMES>
<NAMEFIRST NAMEORDER="LASTFIRSTMIDDLE" INITIALSTYLE="FIRSTSPCMIDDLE" UPPERCASE="NONE">
<NAMEOTHER NAMEORDER="LASTFIRSTMIDDLE" INITIALSTYLE="FIRSTSPCMIDDLE" UPPERCASE="NONE">
</AUTHORNAMES>
<TEXT>
<TEXTSINGLE>
<PRECEEDING></PRECEEDING>
<FOLLOWING>, </FOLLOWING>
</TEXTSINGLE>
<TEXTMULTIPLE>
<PRECEEDING></PRECEEDING>
<FOLLOWING>, </FOLLOWING>
</TEXTMULTIPLE>
</TEXT>
</AUTHORLIST>
<PUBDATE FORMAT="YES" SEQUENCE="Y" MONTHFORMAT="ARABICMONTH" DAYFORMAT="ARABICDAY" YEARFORMAT="FOURDIGIT" PADLEADINGZERO="YY">
</PUBDATE>
</INTEXTDEF>
    
refdb-1.0.2/doc/citestylex/ele-desc/issue.html000644 001750 001750 00000002351 11512721662 022107 0ustar00markusmarkus000000 000000 ISSUE description

Description

ISSUE describes how the issue information of a periodical is rendered. Most periodicals use the combination of journal name, volume, issue, and page(s) to identify a publication.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Example

<JOURNALNAME CASE="ASIS" DEFAULTTEXT="FULL" ALTERNATETEXT="AABBREV" PUNCTUATION="PERIOD">
<FOLLOWING> </FOLLOWING>
</JOURNALNAME>
<VOLUME STYLE="BOLD">
</VOLUME>
<ISSUE>
<PRECEEDING>(</PRECEEDING>
<FOLLOWING>)</FOLLOWING>
</ISSUE>
<PAGES>
<PRECEEDING>:</PRECEEDING>
<FOLLOWING>,</FOLLOWING>
<PAGERANGE TYPE="FULL">
</PAGERANGE>
</PAGES>
    
refdb-1.0.2/doc/citestylex/ele-desc/jan.html000644 001750 001750 00000000720 11512721662 021525 0ustar00markusmarkus000000 000000 JAN description

Description

JAN defines the full name, abbreviation, and three-letter abbreviation, if applicable, for the month January in the language of the publication.

Example

<MONTHS>
<JAN FULL="January" ABBREV="Jan." THREELET="Jan"/>
...
</MONTHS>
    
refdb-1.0.2/doc/citestylex/ele-desc/journalname.html000644 001750 001750 00000003546 11512721662 023301 0ustar00markusmarkus000000 000000 JOURNALNAME description

Description

JOURNALNAME describes how the name of a periodical is rendered. Most periodicals use the combination of journal name, volume, issue, and page(s) to identify a publication.

You can select with the CASE attribute whether the case of the letters should be standardized. By default ("ASIS"), no changes are made to the journal name string in the database. If necessary, all letters can be converted to uppercase ("UPPER") or lowercase ("LOWER").

The DEFAULTTEXT attribute determines which form of the journal name should be printed, if available. If this form is not in the database, the formatting application should try the form given with the ALTERNATETEXT attribute.

The PUNCTUATION attribute selects the punctuation after abbreviated words in the journal name, if applicable.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Example

<JOURNALNAME CASE="ASIS" DEFAULTTEXT="FULL" ALTERNATETEXT="AABBREV" PUNCTUATION="PERIOD">
<FOLLOWING> </FOLLOWING>
</JOURNALNAME>
<VOLUME STYLE="BOLD">
</VOLUME>
<ISSUE>
<PRECEEDING>(</PRECEEDING>
<FOLLOWING>)</FOLLOWING>
</ISSUE>
<PAGES>
<PRECEEDING>:</PRECEEDING>
<FOLLOWING>,</FOLLOWING>
<PAGERANGE TYPE="FULL">
</PAGERANGE>
</PAGES>
    
refdb-1.0.2/doc/citestylex/ele-desc/jul.html000644 001750 001750 00000000716 11512721662 021554 0ustar00markusmarkus000000 000000 JUL description

Description

JUL defines the full name, abbreviation, and three-letter abbreviation, if applicable, for the month July in the language of the publication.

Example

<MONTHS>
...
<JUL FULL="July" ABBREV="Jul." THREELET="Jul"/>
...
</MONTHS>
    
refdb-1.0.2/doc/citestylex/ele-desc/jun.html000644 001750 001750 00000000716 11512721662 021556 0ustar00markusmarkus000000 000000 JUN description

Description

JUN defines the full name, abbreviation, and three-letter abbreviation, if applicable, for the month June in the language of the publication.

Example

<MONTHS>
...
<JUN FULL="June" ABBREV="Jun." THREELET="Jun"/>
...
</MONTHS>
    
refdb-1.0.2/doc/citestylex/ele-desc/link.html000644 001750 001750 00000001721 11512721662 021714 0ustar00markusmarkus000000 000000 LINK description

Description

LINK describes how links and URLs of a publication are to be rendered.

The ROLE attribute picks the contents to be printed. The allowed values and the corresponding RIS fields are:

  • 0: UR
  • 1: L1
  • 2: L2
  • 3: L3
  • 4: L4

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Example

<LINK ROLE="0">
<PRECEEDING>, </PRECEEDING>
</LINK>   
refdb-1.0.2/doc/citestylex/ele-desc/mar.html000644 001750 001750 00000000720 11512721662 021534 0ustar00markusmarkus000000 000000 MAR description

Description

MAR defines the full name, abbreviation, and three-letter abbreviation, if applicable, for the month March in the language of the publication.

Example

<MONTHS>
...
<MAR FULL="March" ABBREV="Mar." THREELET="Mar"/>
...
</MONTHS>
    
refdb-1.0.2/doc/citestylex/ele-desc/may.html000644 001750 001750 00000000713 11512721662 021545 0ustar00markusmarkus000000 000000 MAY description

Description

MAY defines the full name, abbreviation, and three-letter abbreviation, if applicable, for the month May in the language of the publication.

Example

<MONTHS>
...
<MAY FULL="May" ABBREV="May" THREELET="May"/>
...
</MONTHS>
    
refdb-1.0.2/doc/citestylex/ele-desc/mediatype.html000644 001750 001750 00000001341 11512721662 022736 0ustar00markusmarkus000000 000000 MEDIATYPE description

Description

MEDIATYPE describes how the media type information is to be rendered.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Example

<MEDIATYPE>
<PRECEEDING>, </PRECEEDING>
</MEDIATYPE>   
refdb-1.0.2/doc/citestylex/ele-desc/months.html000644 001750 001750 00000000712 11512721662 022266 0ustar00markusmarkus000000 000000 MONTHS description

Description

MONTHS is a wrapper for the individual elements describing the name and abbreviations of month names in the language of the publication.

Example

<MONTHS>
...
<MAY FULL="May" ABBREV="May" THREELET="May"/>
...
</MONTHS>
    
refdb-1.0.2/doc/citestylex/ele-desc/namefirst.html000644 001750 001750 00000002122 11512721662 022743 0ustar00markusmarkus000000 000000 NAMEFIRST description

Description

NAMEFIRST is an empty element whose attributes describe the formatting of the first author in an authorlist. The formatting of all subsequent authors is described by the NAMEOTHER element.

Use the NAMEORDER attribute to select the general sequence and appearance of lastname and other name parts.

Use the INITIALSTYLE attribute to select if the first name and middle initial should be abbreviated and whether a period and a space should follow the abbreviated items.

If the whole name or the last name should be rendered in uppercase, set the UPPERCASE attribute to "ALL" or "LASTNAME", respectively.

Example

<AUTHORNAMES>
<NAMEFIRST NAMEORDER="LASTFIRSTMIDDLE" INITIALSTYLE="F.M." UPPERCASE="NONE">
<NAMEOTHER NAMEORDER="FIRSTMIDDLELAST" INITIALSTYLE="F.M." UPPERCASE="NONE">
</AUTHORNAMES>
    
refdb-1.0.2/doc/citestylex/ele-desc/nameother.html000644 001750 001750 00000002125 11512721662 022740 0ustar00markusmarkus000000 000000 NAMEOTHER description

Description

NAMEOTHER is an empty element whose attributes describe the formatting of all authors but the first in an authorlist. The formatting of the first author is described by the NAMEFIRST element.

Use the NAMEORDER attribute to select the general sequence and appearance of lastname and other name parts.

Use the INITIALSTYLE attribute to select if the first name and middle initial should be abbreviated and whether a period and a space should follow the abbreviated items.

If the whole name or the last name should be rendered in uppercase, set the UPPERCASE attribute to "ALL" or "LASTNAME", respectively.

Example

<AUTHORNAMES>
<NAMEFIRST NAMEORDER="LASTFIRSTMIDDLE" INITIALSTYLE="F.M." UPPERCASE="NONE">
<NAMEOTHER NAMEORDER="FIRSTMIDDLELAST" INITIALSTYLE="F.M." UPPERCASE="NONE">
</AUTHORNAMES>
    
refdb-1.0.2/doc/citestylex/ele-desc/notes.html000644 001750 001750 00000001322 11512721662 022104 0ustar00markusmarkus000000 000000 NOTES description

Description

NOTES describes how the notes of a publication are to be rendered.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Example

<NOTES>
<PRECEEDING>, </PRECEEDING>
</NOTES>   
refdb-1.0.2/doc/citestylex/ele-desc/nov.html000644 001750 001750 00000000726 11512721662 021565 0ustar00markusmarkus000000 000000 NOV description

Description

NOV defines the full name, abbreviation, and three-letter abbreviation, if applicable, for the month November in the language of the publication.

Example

<MONTHS>
...
<NOV FULL="November" ABBREV="Nov." THREELET="Nov"/>
...
</MONTHS>
    
refdb-1.0.2/doc/citestylex/ele-desc/numvolumes.html000644 001750 001750 00000001411 11512721662 023165 0ustar00markusmarkus000000 000000 NUMVOLUMES description

Description

NUMVOLUMES describes how the total number of volumes of a multi-volume monographic item is to be rendered.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Example

<NUMVOLUMES>
<PRECEEDING>, </PRECEEDING>
</NUMVOLUMES>   
refdb-1.0.2/doc/citestylex/ele-desc/oct.html000644 001750 001750 00000000724 11512721662 021546 0ustar00markusmarkus000000 000000 OCT description

Description

OCT defines the full name, abbreviation, and three-letter abbreviation, if applicable, for the month October in the language of the publication.

Example

<MONTHS>
...
<OCT FULL="October" ABBREV="Oct." THREELET="Oct"/>
...
</MONTHS>
    
refdb-1.0.2/doc/citestylex/ele-desc/ostype.html000644 001750 001750 00000001346 11512721662 022305 0ustar00markusmarkus000000 000000 OSTYPE description

Description

OSTYPE describes how the type information of an operating system is to be rendered.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Example

<OSTYPE>
<PRECEEDING>, </PRECEEDING>
</OSTYPE>   
refdb-1.0.2/doc/citestylex/ele-desc/pagerange.html000644 001750 001750 00000001322 11512721662 022705 0ustar00markusmarkus000000 000000 PAGERANGE description

Description

PAGERANGE describes how a range of page numbers is rendered. Journals differ in the way how the end page of a page range is formatted. Some omit it, others print the full end page, some strip the end page to the minimum number of digits necessary.

Use the TYPE attribute to select the formatting of the end page.

Example

<PAGES>
<PRECEEDING>:</PRECEEDING>
<FOLLOWING>,</FOLLOWING>
<PAGERANGE TYPE="FULL">
</PAGERANGE>
</PAGES>
    
refdb-1.0.2/doc/citestylex/ele-desc/pages.html000644 001750 001750 00000002350 11512721662 022055 0ustar00markusmarkus000000 000000 PAGES description

Description

PAGES describes how the page information of a periodical is rendered. Most periodicals use the combination of journal name, volume, issue, and page(s) to identify a publication.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Example

<JOURNALNAME CASE="ASIS" DEFAULTTEXT="FULL" ALTERNATETEXT="AABBREV" PUNCTUATION="PERIOD">
<FOLLOWING> </FOLLOWING>
</JOURNALNAME>
<VOLUME STYLE="BOLD">
</VOLUME>
<ISSUE>
<PRECEEDING>(</PRECEEDING>
<FOLLOWING>)</FOLLOWING>
</ISSUE>
<PAGES>
<PRECEEDING>:</PRECEEDING>
<FOLLOWING>,</FOLLOWING>
<PAGERANGE TYPE="FULL">
</PAGERANGE>
</PAGES>
    
refdb-1.0.2/doc/citestylex/ele-desc/pamphletnum.html000644 001750 001750 00000001347 11512721662 023315 0ustar00markusmarkus000000 000000 PAMPHLETNUM description

Description

PAMPHLETNUM describes how the number of a pamphlet is to be rendered.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Example

<PAMPHLETNUM>
<PRECEEDING>, </PRECEEDING>
</PAMPHLETNUM>   
refdb-1.0.2/doc/citestylex/ele-desc/preceeding.html000644 001750 001750 00000002105 11512721662 023061 0ustar00markusmarkus000000 000000 PRECEEDING description

Description

All elements in PUBTYPE and INTEXTDEF can define strings that always precede or follow (FOLLOWING) the element. These may e.g. be punctuation characters or whitespace to separate the entries. In some cases the SEPARATOR element may be more appropriate.

Example

<JOURNALNAME CASE="ASIS" DEFAULTTEXT="FULL" ALTERNATETEXT="AABBREV" PUNCTUATION="PERIOD">
<FOLLOWING> </FOLLOWING>
</JOURNALNAME>
<VOLUME STYLE="BOLD">
</VOLUME>
<ISSUE>
<PRECEEDING>(</PRECEEDING>
<FOLLOWING>)</FOLLOWING>
</ISSUE>
<PAGES>
<PRECEEDING>:</PRECEEDING>
<FOLLOWING>,</FOLLOWING>
<PAGERANGE TYPE="FULL">
</PAGERANGE>
</PAGES>
    
refdb-1.0.2/doc/citestylex/ele-desc/pubdate.html000644 001750 001750 00000003132 11512721662 022401 0ustar00markusmarkus000000 000000 PUBDATE description

Description

PUBDATE describes how the publication date is rendered. You can use the FIRSTSEP and SECONDSEP elements to specify the first and second separator, respectively, between day, month, and year, if applicable.

Set the FORMAT attribute to "NO" to switch off all formatting. The publication date string will be printed as it was entered into the database.

The SEQUENCE attribute selects where and whether at all day, month, and year should appear.

The DAYFORMAT, MONTHFORMAT, and YEARFORMAT attributes specify the formatting of the day, month, and year parts, respectively.

Set PADLEADINGZERO to "YY" if single-digit day and month numbers should be padded with a leading zero.

Use the ROLE attribute to specify whether this element describes the primary or secondary date. The value of "ALL" indicates that the processing application should first try the primary date. If this information is not available, it should try the secondary date.

The STYLE attribute selects the font formatting.

Example

<PUBDATE FORMAT="YES" SEQUENCE="MDY" MONTHFORMAT="ARABICMONTH" DAYFORMAT="ARABICDAY" YEARFORMAT="FOURDIGIT" PADLEADINGZERO="YY" ROLE="PRIMARY">
<FOLLOWING>, </FOLLOWING>
<FIRSTSEP>-</FIRSTSEP>
<SECONDSEP>-</SECONDSEP>
</PUBDATE>
    
refdb-1.0.2/doc/citestylex/ele-desc/publisher.html000644 001750 001750 00000001350 11512721662 022752 0ustar00markusmarkus000000 000000 PUBLISHER description

Description

PUBLISHER describes how the publisher of a publication is to be rendered.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Example

<PUBLISHER>
<PRECEEDING>, </PRECEEDING>
</PUBLISHER>
    
refdb-1.0.2/doc/citestylex/ele-desc/pubplace.html000644 001750 001750 00000001362 11512721662 022553 0ustar00markusmarkus000000 000000 PUBPLACE description

Description

PUBPLACE describes how the city where a publication was published should be displayed.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Example

<PUBPLACE>
<PRECEEDING>, </PRECEEDING>
</PUBPLACE>
    
refdb-1.0.2/doc/citestylex/ele-desc/pubtype.html000644 001750 001750 00000001634 11512721662 022452 0ustar00markusmarkus000000 000000 PUBTYPE description

Description

PUBTYPE is a wrapper for all formatting information that pertains to a specific type of publication.

Use the TYPE attribute to select the type of publication that this element describes. Each CITESTYLE element should contain at least a description of the type "GEN". This generic type is intended to be used by the formatting application if no specific information for the given publication type is defined.

Example

<PUBTYPE>
<AUTHORLIST>
...
</AUTHORLIST>
<PUBDATE>
...
</PUBDATE>
<JOURNALNAME>
...
</JOURNALNAME>
<VOLUME>
...
</VOLUME>
<PAGES>
...
</PAGES>
</PUBTYPE>
    
refdb-1.0.2/doc/citestylex/ele-desc/rangeseparator.html000644 001750 001750 00000001257 11512721662 024000 0ustar00markusmarkus000000 000000 RANGESEPARATOR description

Description

RANGESEPARATOR defines the separator that is used when a sequence of consecutively numbered citations is displayed as a range.

Example

<CITSTYLE INTEXTSEQUENCE="AUTHORDATE">
<CITSEPARATOR>;</CITSEPARATOR>
<RANGESEPARATOR>-</RANGESEPARATOR>
<INTEXTDEF>
<REFNUMBER;
<PRECEEDING>[</PRECEEDING>
<FOLLOWING>]</FOLLOWING>
</REFNUMBER>
</INTEXTDEF>
</CITSTYLE>
    
refdb-1.0.2/doc/citestylex/ele-desc/recipientemail.html000644 001750 001750 00000001376 11512721662 023757 0ustar00markusmarkus000000 000000 RECIPIENTEMAIL description

Description

RECIPIENTEMAIL describes how the recipient's address of an email is to be rendered.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Example

<RECIPIENTEMAIL>
<PRECEEDING>, </PRECEEDING>
</RECIPIENTEMAIL>   
refdb-1.0.2/doc/citestylex/ele-desc/refnumber.html000644 001750 001750 00000002117 11512721662 022744 0ustar00markusmarkus000000 000000 REFNUMBER description

Description

REFNUMBER describes the appearance of a reference number in the bibliography or the in-text citation. The presence of this element implies that the bibliography is numbered.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Example

<CITSTYLE INTEXTSEQUENCE="AUTHORDATE">
<CITSEPARATOR>;</CITSEPARATOR>
<RANGESEPARATOR>-</RANGESEPARATOR>
<INTEXTDEF>
<REFNUMBER STYLE="BOLD">
<PRECEEDING>[</PRECEEDING>
<FOLLOWING>]</FOLLOWING>
</REFNUMBER>
</INTEXTDEF>
</CITSTYLE>
    
refdb-1.0.2/doc/citestylex/ele-desc/refstyle.html000644 001750 001750 00000001160 11512721662 022611 0ustar00markusmarkus000000 000000 REFSTYLE description

Description

REFSTYLE is a wrapper for all publication types that have a PUBTYPE element.

Example

<CITESTYLE>
<STYLENAME>J.Biol.Chem.</STYLENAME>
<REFSTYLE>
<PUBTYPE TYPE="GEN">
...
</PUBTYPE>
<PUBTYPE TYPE="BOOK">
...
</PUBTYPE>
<PUBTYPE TYPE="JOURNAL">
...
</PUBTYPE>
</REFSTYLE>
</CITESTYLE>
    
refdb-1.0.2/doc/citestylex/ele-desc/sep.html000644 001750 001750 00000000730 11512721662 021545 0ustar00markusmarkus000000 000000 SEP description

Description

SEP defines the full name, abbreviation, and three-letter abbreviation, if applicable, for the month September in the language of the publication.

Example

<MONTHS>
...
<SEP FULL="September" ABBREV="Sep." THREELET="Sep"/>
...
</MONTHS>
    
refdb-1.0.2/doc/citestylex/ele-desc/registrynum.html000644 001750 001750 00000001372 11512721662 023351 0ustar00markusmarkus000000 000000 REGISTRYNUM description

Description

REGISTRYNUM describes how the registry number of a full journal entry is to be rendered.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Example

<REGISTRYNUM>
<PRECEEDING>, </PRECEEDING>
</REGISTRYNUM>   
refdb-1.0.2/doc/citestylex/ele-desc/runningtime.html000644 001750 001750 00000001405 11512721662 023315 0ustar00markusmarkus000000 000000 RUNNINGTIME description

Description

RUNNINGTIME describes how the running time of a video, a movie, or a sound track is to be rendered.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Example

<RUNNINGTIME>
<PRECEEDING>, </PRECEEDING>
</RUNNINGTIME>   
refdb-1.0.2/doc/citestylex/ele-desc/secondsep.html000644 001750 001750 00000001305 11512721662 022740 0ustar00markusmarkus000000 000000 SECONDSEP description

Description

SECONDSEP defines the second separator in a date entry, if applicable. This is usually a slash or a dash or a period. The first separator is defined by FIRSTSEP

Example

<PUBDATE FORMAT="YES" SEQUENCE="MDY" MONTHFORMAT="ARABICMONTH" DAYFORMAT="ARABICDAY" YEARFORMAT="FOURDIGIT" PADLEADINGZERO="NN" ROLE="PRIMARY">
<FIRSTSEP>/</FIRSTSEP>
<SECONDSEP>/</SECONDSEP>
<FOLLOWING>. </FOLLOWING>
</PUBDATE>
    
refdb-1.0.2/doc/citestylex/ele-desc/section.html000644 001750 001750 00000001355 11512721662 022426 0ustar00markusmarkus000000 000000 SECTION description

Description

SECTION describes how the section information of a newspaper article is to be rendered.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Example

<SECTION>
<PRECEEDING>, </PRECEEDING>
</SECTION>   
refdb-1.0.2/doc/citestylex/ele-desc/senderemail.html000644 001750 001750 00000001357 11512721662 023254 0ustar00markusmarkus000000 000000 SENDEREMAIL description

Description

SENDEREMAIL describes how the sender's address of an email is to be rendered.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Example

<SENDEREMAIL>
<PRECEEDING>, </PRECEEDING>
</SENDEREMAIL>   
refdb-1.0.2/doc/citestylex/ele-desc/separator.html000644 001750 001750 00000002107 11512721662 022756 0ustar00markusmarkus000000 000000 SEPARATOR description

Description

The SEPARATOR is an alternative to PRECEEDING and FOLLOWING for introducing punctuation characters, whitespace, or short strings. While PRECEEDING and FOLLOWING are children of the elements to be formatted and appear only if the element itself is present, SEPARATOR is a separate element. Use separator in cases where a string has to appear at a certain position even if it is possible that the adjacent elements are missing.

Example

<PAGES>
<PRECEEDING>, </PRECEEDING>
<PAGERANGE TYPE="FULL">
</PAGERANGE>
</PAGES>
<SEPARATOR>. </SEPARATOR>
<PUBDATE FORMAT="NO" SEQUENCE="Y" MONTHFORMAT="ARABICMONTH" DAYFORMAT="ARABICDAY" YEARFORMAT="FOURDIGIT" PADLEADINGZERO="NN" ROLE="PRIMARY">
<FOLLOWING>. </FOLLOWING>
</PUBDATE>
    
refdb-1.0.2/doc/citestylex/ele-desc/serial.html000644 001750 001750 00000001365 11512721662 022242 0ustar00markusmarkus000000 000000 SERIAL description

Description

SERIAL describes how the serial number (like an ISSN or ISBN) of a publication are to be rendered.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Example

<SERIAL>
<PRECEEDING>, </PRECEEDING>
</SERIAL>   
refdb-1.0.2/doc/citestylex/ele-desc/singlepage.html000644 001750 001750 00000001166 11512721662 023100 0ustar00markusmarkus000000 000000 SINGLEPAGE description

Description

SINGLEPAGE describes how the start page number is rendered if no end page is available. The appearance of the end page (if there is one) is described by the PAGERANGE element.

Example

<PAGES>
<PRECEEDING>:</PRECEEDING>
<SINGLEPAGE>
<FOLLOWING>,</FOLLOWING>
<PAGERANGE TYPE="STARTONLY">
</PAGERANGE>
</PAGES>
    
refdb-1.0.2/doc/citestylex/ele-desc/stylename.html000644 001750 001750 00000000706 11512721662 022762 0ustar00markusmarkus000000 000000 STYLENAME description

Description

STYLENAME defines an unique name for the bibliography file defined in the parent CITESTYLE element.

Example

<CITESTYLE>
<STYLENAME>J.Biol.Chem.</STYLENAME>
...
</CITESTYLE>
    
refdb-1.0.2/doc/citestylex/ele-desc/styleset.html000644 001750 001750 00000000733 11512721662 022635 0ustar00markusmarkus000000 000000 STYLESET description

Description

The STYLESET element is a wrapper to keep several CITESTYLE elements in a single document.

Example

<STYLESET>
<CITESTYLE>
...
</CITESTYLE>
<CITESTYLE>
...
</CITESTYLE>
</STYLESET>
    
refdb-1.0.2/doc/citestylex/ele-desc/text.html000644 001750 001750 00000002710 11512721662 021742 0ustar00markusmarkus000000 000000 TEXT description

Description

TEXT is a wrapper for the TEXTSINGLE and the TEXTMULTIPLE elements which govern the preceeding and following strings of single and multiple authors. Use TEXTED as a wrapper for editors.

Example

<AUTHORLIST ROLE="PRIMARY">
<FOLLOWING> </FOLLOWING>
<ABBREVIATEFIRST MAXAUTHOR="256" DISPLAYAUTHOR="255">, et al</ABBREVIATEFIRST>
<ABBREVIATESUBSEQ MAXAUTHOR="256" DISPLAYAUTHOR="255">, et al</ABBREVIATESUBSEQ>
<AEMPTY>Anonymous</AEMPTY>
<AUTHORSEPS>
<TWOSEPS> and </TWOSEPS>
<THREESEPS>
<THREESEPSEACH>, </THREESEPSEACH>
<THREESEPSLAST>, and </THREESEPSLAST>
</THREESEPS>
</AUTHORSEPS>
<AUTHORNAMES>
<NAMEFIRST NAMEORDER="LASTFIRSTMIDDLE" INITIALSTYLE="F.M." UPPERCASE="NONE">
<NAMEOTHER NAMEORDER="FIRSTMIDDLELAST" INITIALSTYLE="F.M." UPPERCASE="NONE">
</AUTHORNAMES>
<TEXT>
<TEXTSINGLE>
<FOLLOWING>, </FOLLOWING>
</TEXTSINGLE>
<TEXTMULTIPLE>
<FOLLOWING>, </FOLLOWING>
</TEXTMULTIPLE>
</TEXT>
</AUTHORLIST>
    
refdb-1.0.2/doc/citestylex/ele-desc/textmultiple.html000644 001750 001750 00000002610 11512721662 023515 0ustar00markusmarkus000000 000000 TEXTMULTIPLE description

Description

TEXTMULTIPLE is a wrapper for the preceeding and the following elements which govern the preceeding and following strings of multiple authors.

Example

<AUTHORLIST ROLE="PRIMARY">
<FOLLOWING> </FOLLOWING>
<ABBREVIATEFIRST MAXAUTHOR="256" DISPLAYAUTHOR="255">, et al</ABBREVIATEFIRST>
<ABBREVIATESUBSEQ MAXAUTHOR="256" DISPLAYAUTHOR="255">, et al</ABBREVIATESUBSEQ>
<AEMPTY>Anonymous</AEMPTY>
<AUTHORSEPS>
<TWOSEPS> and </TWOSEPS>
<THREESEPS>
<THREESEPSEACH>, </THREESEPSEACH>
<THREESEPSLAST>, and </THREESEPSLAST>
</THREESEPS>
</AUTHORSEPS>
<AUTHORNAMES>
<NAMEFIRST NAMEORDER="LASTFIRSTMIDDLE" INITIALSTYLE="F.M." UPPERCASE="NONE">
<NAMEOTHER NAMEORDER="FIRSTMIDDLELAST" INITIALSTYLE="F.M." UPPERCASE="NONE">
</AUTHORNAMES>
<TEXT>
<TEXTSINGLE>
<FOLLOWING>, </FOLLOWING>
</TEXTSINGLE>
<TEXTMULTIPLE>
<FOLLOWING>, </FOLLOWING>
</TEXTMULTIPLE>
</TEXT>
</AUTHORLIST>
    
refdb-1.0.2/doc/citestylex/ele-desc/textsingle.html000644 001750 001750 00000002603 11512721662 023145 0ustar00markusmarkus000000 000000 TEXTSINGLE description

Description

TEXTSINGLE is a wrapper for the preceeding and the following elements which govern the preceeding and following strings of a single author.

Example

<AUTHORLIST ROLE="PRIMARY">
<FOLLOWING> </FOLLOWING>
<ABBREVIATEFIRST MAXAUTHOR="256" DISPLAYAUTHOR="255">, et al</ABBREVIATEFIRST>
<ABBREVIATESUBSEQ MAXAUTHOR="256" DISPLAYAUTHOR="255">, et al</ABBREVIATESUBSEQ>
<AEMPTY>Anonymous</AEMPTY>
<AUTHORSEPS>
<TWOSEPS> and </TWOSEPS>
<THREESEPS>
<THREESEPSEACH>, </THREESEPSEACH>
<THREESEPSLAST>, and </THREESEPSLAST>
</THREESEPS>
</AUTHORSEPS>
<AUTHORNAMES>
<NAMEFIRST NAMEORDER="LASTFIRSTMIDDLE" INITIALSTYLE="F.M." UPPERCASE="NONE">
<NAMEOTHER NAMEORDER="FIRSTMIDDLELAST" INITIALSTYLE="F.M." UPPERCASE="NONE">
</AUTHORNAMES>
<TEXT>
<TEXTSINGLE>
<FOLLOWING>, </FOLLOWING>
</TEXTSINGLE>
<TEXTMULTIPLE>
<FOLLOWING>, </FOLLOWING>
</TEXTMULTIPLE>
</TEXT>
</AUTHORLIST>
    
refdb-1.0.2/doc/citestylex/ele-desc/threeseps.html000644 001750 001750 00000002516 11512721662 022764 0ustar00markusmarkus000000 000000 THREESEPS description

Description

THREESEPS is a wrapper for the strings to be printed between authors if three or more authors are in the authorlist.

Example

<AUTHORLIST ROLE="PRIMARY">
<FOLLOWING> </FOLLOWING>
<ABBREVIATEFIRST MAXAUTHOR="256" DISPLAYAUTHOR="255">, et al</ABBREVIATEFIRST>
<ABBREVIATESUBSEQ MAXAUTHOR="256" DISPLAYAUTHOR="255">, et al</ABBREVIATESUBSEQ>
<AEMPTY>Anonymous</AEMPTY>
<AUTHORSEPS>
<TWOSEPS> and </TWOSEPS>
<THREESEPS>
<THREESEPSEACH>, </THREESEPSEACH>
<THREESEPSLAST>, and </THREESEPSLAST>
</THREESEPS>
</AUTHORSEPS>
<AUTHORNAMES>
<NAMEFIRST NAMEORDER="LASTFIRSTMIDDLE" INITIALSTYLE="F.M." UPPERCASE="NONE">
<NAMEOTHER NAMEORDER="FIRSTMIDDLELAST" INITIALSTYLE="F.M." UPPERCASE="NONE">
</AUTHORNAMES>
<TEXT>
<TEXTSINGLE>
<FOLLOWING>, </FOLLOWING>
</TEXTSINGLE>
<TEXTMULTIPLE>
<FOLLOWING>, </FOLLOWING>
</TEXTMULTIPLE>
</TEXT>
</AUTHORLIST>
    
refdb-1.0.2/doc/citestylex/ele-desc/threesepseach.html000644 001750 001750 00000002563 11512721662 023607 0ustar00markusmarkus000000 000000 THREESEPSEACH description

Description

THREESEPSEACH defines the strings to be printed between all but the last pair of authors in the authorlist if three or more authors are in this list.

Example

<AUTHORLIST ROLE="PRIMARY">
<FOLLOWING> </FOLLOWING>
<ABBREVIATEFIRST MAXAUTHOR="256" DISPLAYAUTHOR="255">, et al</ABBREVIATEFIRST>
<ABBREVIATESUBSEQ MAXAUTHOR="256" DISPLAYAUTHOR="255">, et al</ABBREVIATESUBSEQ>
<AEMPTY>Anonymous</AEMPTY>
<AUTHORSEPS>
<TWOSEPS> and </TWOSEPS>
<THREESEPS>
<THREESEPSEACH>, </THREESEPSEACH>
<THREESEPSLAST>, and </THREESEPSLAST>
</THREESEPS>
</AUTHORSEPS>
<AUTHORNAMES>
<NAMEFIRST NAMEORDER="LASTFIRSTMIDDLE" INITIALSTYLE="F.M." UPPERCASE="NONE">
<NAMEOTHER NAMEORDER="FIRSTMIDDLELAST" INITIALSTYLE="F.M." UPPERCASE="NONE">
</AUTHORNAMES>
<TEXT>
<TEXTSINGLE>
<FOLLOWING>, </FOLLOWING>
</TEXTSINGLE>
<TEXTMULTIPLE>
<FOLLOWING>, </FOLLOWING>
</TEXTMULTIPLE>
</TEXT>
</AUTHORLIST>
    
refdb-1.0.2/doc/citestylex/ele-desc/threesepslast.html000644 001750 001750 00000002552 11512721662 023650 0ustar00markusmarkus000000 000000 THREESEPSLAST description

Description

THREESEPSLAST defines the string to be printed between the last pair of authors in the authorlist if three or more authors are in this list.

Example

<AUTHORLIST ROLE="PRIMARY">
<FOLLOWING> </FOLLOWING>
<ABBREVIATEFIRST MAXAUTHOR="256" DISPLAYAUTHOR="255">, et al</ABBREVIATEFIRST>
<ABBREVIATESUBSEQ MAXAUTHOR="256" DISPLAYAUTHOR="255">, et al</ABBREVIATESUBSEQ>
<AEMPTY>Anonymous</AEMPTY>
<AUTHORSEPS>
<TWOSEPS> and </TWOSEPS>
<THREESEPS>
<THREESEPSEACH>, </THREESEPSEACH>
<THREESEPSLAST>, and </THREESEPSLAST>
</THREESEPS>
</AUTHORSEPS>
<AUTHORNAMES>
<NAMEFIRST NAMEORDER="LASTFIRSTMIDDLE" INITIALSTYLE="F.M." UPPERCASE="NONE">
<NAMEOTHER NAMEORDER="FIRSTMIDDLELAST" INITIALSTYLE="F.M." UPPERCASE="NONE">
</AUTHORNAMES>
<TEXT>
<TEXTSINGLE>
<FOLLOWING>, </FOLLOWING>
</TEXTSINGLE>
<TEXTMULTIPLE>
<FOLLOWING>, </FOLLOWING>
</TEXTMULTIPLE>
</TEXT>
</AUTHORLIST>
    
refdb-1.0.2/doc/citestylex/ele-desc/title.html000644 001750 001750 00000002326 11512721662 022102 0ustar00markusmarkus000000 000000 TITLE description

Description

TITLE describes how the title of a publication is rendered.

The CASE attribute determines whether the case of the title string remains unchanged ("ASIS") or is converted to all uppercase ("UPPER") or all lowercase ("LOWER").

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired.

The ROLE attribute decides whether this element pertains to an article or chapter ("PART"), to a monographic title like a book title ("PUB"), or to a series title ("SERIES"). Use the value "ALL" if it is not certain which of the data are available. The processing application should try in the mentioned order.

Example

<TITLE CASE="ASIS" ROLE="PUB">
<FOLLOWING>. </FOLLOWING>
</TITLE>
    
refdb-1.0.2/doc/citestylex/ele-desc/twoseps.html000644 001750 001750 00000002476 11512721662 022473 0ustar00markusmarkus000000 000000 TWOSEPS description

Description

TWOSEPS defines the string to be printed between authors if exactly two authors are in the authorlist.

Example

<AUTHORLIST ROLE="PRIMARY">
<FOLLOWING> </FOLLOWING>
<ABBREVIATEFIRST MAXAUTHOR="256" DISPLAYAUTHOR="255">, et al</ABBREVIATEFIRST>
<ABBREVIATESUBSEQ MAXAUTHOR="256" DISPLAYAUTHOR="255">, et al</ABBREVIATESUBSEQ>
<AEMPTY>Anonymous</AEMPTY>
<AUTHORSEPS>
<TWOSEPS> and </TWOSEPS>
<THREESEPS>
<THREESEPSEACH>, </THREESEPSEACH>
<THREESEPSLAST>, and </THREESEPSLAST>
</THREESEPS>
</AUTHORSEPS>
<AUTHORNAMES>
<NAMEFIRST NAMEORDER="LASTFIRSTMIDDLE" INITIALSTYLE="F.M." UPPERCASE="NONE">
<NAMEOTHER NAMEORDER="FIRSTMIDDLELAST" INITIALSTYLE="F.M." UPPERCASE="NONE">
</AUTHORNAMES>
<TEXT>
<TEXTSINGLE>
<FOLLOWING>, </FOLLOWING>
</TEXTSINGLE>
<TEXTMULTIPLE>
<FOLLOWING>, </FOLLOWING>
</TEXTMULTIPLE>
</TEXT>
</AUTHORLIST>
    
refdb-1.0.2/doc/citestylex/ele-desc/typeofwork.html000644 001750 001750 00000001351 11512721662 023167 0ustar00markusmarkus000000 000000 TYPEOFWORK description

Description

TYPEOFWORK describes how the type information of a work is to be rendered.

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Example

<TYPEOFWORK>
<PRECEEDING>, </PRECEEDING>
</TYPEOFWORK>   
refdb-1.0.2/doc/citestylex/ele-desc/url.html000644 001750 001750 00000000526 11512721662 021563 0ustar00markusmarkus000000 000000 URL description

Description

URL contains a link to a page that describes the bibliography style.

Example

<URL>http://www.liebertpub.com/te/</URL>
refdb-1.0.2/doc/citestylex/ele-desc/userdef.html000644 001750 001750 00000001741 11512721662 022416 0ustar00markusmarkus000000 000000 USERDEF description

Description

USERDEF describes how the USERDEF fields of a publication are to be rendered.

The ROLE attribute picks the contents to be printed. The allowed values and the corresponding RIS fields are:

  • 1: U1
  • 2: U2
  • 3: U3
  • 4: U4
  • 5: U5

The STYLE attribute gives the processing system a hint on how this element should be rendered. The styles BOLD, ITALIC, and ULINE are available, as well as all of their combinations. In addition to this, SUB and SUPER can be used to indicate subscripts and superscripts. NONE can be used to explicitly state that no special formatting is desired

Example

<USERDEF ROLE="1">
<PRECEEDING>, </PRECEEDING>
</USERDEF>   
refdb-1.0.2/doc/citestylex/ele-desc/volume.html000644 001750 001750 00000001607 11512721662 022271 0ustar00markusmarkus000000 000000 VOLUME description

Description

VOLUME describes how the volume information of a periodical is rendered. Most periodicals use the combination of journal name, volume, issue, and page(s) to identify a publication.

Example

<JOURNALNAME CASE="ASIS" DEFAULTTEXT="FULL" ALTERNATETEXT="AABBREV" PUNCTUATION="PERIOD">
<FOLLOWING> </FOLLOWING>
</JOURNALNAME>
<VOLUME STYLE="BOLD">
</VOLUME>
<ISSUE>
<PRECEEDING>(</PRECEEDING>
<FOLLOWING>)</FOLLOWING>
</ISSUE>
<PAGES>
<PRECEEDING>:</PRECEEDING>
<FOLLOWING>,</FOLLOWING>
<PAGERANGE TYPE="FULL">
</PAGERANGE>
</PAGES>
    
refdb-1.0.2/doc/citestylex/ele-desc/yearonly.html000644 001750 001750 00000002123 11512721662 022616 0ustar00markusmarkus000000 000000 YEARONLY description

Description

YEARONLY is the wrapper for the information that defines the appearance of an in-text citation that shows only the publication date (for author-year citation styles) or the reference number (for numeric citation styles). It can have the same children as a PUBTYPE element. This element should be used in conjunction with the AUTHORONLY element to obtain a citation format that keeps the authors in the flow of the normal text, as shown in the following example sentence:

... as was shown by Smith and Miller in a recent publication (2001).

Example

<YEARONLY>
<PUBDATE FORMAT="YES" SEQUENCE="Y" MONTHFORMAT="ARABICMONTH" DAYFORMAT="ARABICDAY" YEARFORMAT="FOURDIGIT" PADLEADINGZERO="YY">
<PRECEEDING>(</PRECEEDING>
<FOLLOWING>)</FOLLOWING>
</PUBDATE>
</YEARONLY>
    
refdb-1.0.2/doc/citationlistx/ele-desc/000755 001750 001750 00000000000 12303477605 020575 5ustar00markusmarkus000000 000000 refdb-1.0.2/doc/citationlistx/dtdelem/000755 001750 001750 00000000000 12303477605 020532 5ustar00markusmarkus000000 000000 refdb-1.0.2/doc/citationlistx/elements/000755 001750 001750 00000000000 12303477605 020730 5ustar00markusmarkus000000 000000 refdb-1.0.2/doc/citationlistx/dtdelem.html000644 001750 001750 00000002017 12247746230 021420 0ustar00markusmarkus000000 000000 citationlistx XML DTD: Elements
citationlistx XML DTD: DTD Element View [User Element View]
[Home]  

C | X

Top level elements: CITATIONLIST, citationlist.

C

CITATION
citation
CITATIONLIST
citationlist

X

XREF
xref


HTML Presentation of citationlistx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citationlistx/dtdent.html000644 001750 001750 00000001055 12247746230 021265 0ustar00markusmarkus000000 000000 citationlistx XML DTD: Entities
citationlistx XML DTD: DTD Entity View [User Entity View]
[Home] [Elements]  


HTML Presentation of citationlistx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citationlistx/elements.html000644 001750 001750 00000002026 12247746230 021616 0ustar00markusmarkus000000 000000 citationlistx XML DTD: Elements
citationlistx XML DTD: User Element View [DTD Element View]
[Home]  

C | X

Top level elements: CITATIONLIST, citationlist.

C

CITATION
citation
CITATIONLIST
citationlist

X

XREF
xref


HTML Presentation of citationlistx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citationlistx/entities.html000644 001750 001750 00000001054 12247746230 021626 0ustar00markusmarkus000000 000000 citationlistx XML DTD: Entities
citationlistx XML DTD: User Entity View [DTD Entity View]
[Home] [Elements]  


HTML Presentation of citationlistx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citationlistx/index.html000644 001750 001750 00000001250 12247746230 021107 0ustar00markusmarkus000000 000000 citationlistx XML DTD

citationlistx XML DTD

[Elements]

The citationlistx XML DTD is identified with:

  • The system identifier: "http://refdb.sourceforge.net/dtd/citationlistx.dtd"

It is composed of 6 elements, no entities, and no notations.

  • 6 elements
  • 0 entities
  • 0 notations

It claims to be an XML DTD. Element names are case sensitive. Entity names are case sensitive.


HTML Presentation of citationlistx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citationlistx/notations.html000644 001750 001750 00000001005 12247746230 022014 0ustar00markusmarkus000000 000000 citationlistx XML DTD: Notations
citationlistx XML DTD: Notation View  
[Home] [Elements]  


HTML Presentation of citationlistx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citationlistx/elements/citation.html000644 001750 001750 00000003065 12247746230 023434 0ustar00markusmarkus000000 000000 citationlistx XML DTD: Element citation
citationlistx XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element citation

Synopsis

Content Model

(xref)+

Attributes

None

Description

CITATION defines one citation. Each citation can hold one or more references to the bibliographic data.

Parents

citationlist

Children

xref

Example

<CITATIONLIST>
<CITATION>
<XREF>IDNAKANE2002</XREF>
</CITATION>
<CITATION>
<XREF ENDTERM="IM0">IDNAKANE2002</XREF>
<XREF>IDNAKANE2002</XREF>
<XREF>IDCERWINKA2002</XREF>
<XREF>IDMIZUSAWA2002</XREF>
</CITATION>
<XREF>1</XREF>
</CITATION>
</CITATIONLIST>
    

HTML Presentation of citationlistx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citationlistx/elements/citationlist.html000644 001750 001750 00000002737 12247746230 024335 0ustar00markusmarkus000000 000000 citationlistx XML DTD: Element citationlist
citationlistx XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev] [Next]

Element citationlist

Synopsis

Content Model

(citation)+

Attributes

None

Description

CITATIONLIST defines the whole set of citations of a document.

Children

citation

Example

<CITATIONLIST>
<CITATION>
<XREF>IDNAKANE2002</XREF>
</CITATION>
<CITATION>
<XREF ENDTERM="IM0">IDNAKANE2002</XREF>
<XREF>IDNAKANE2002</XREF>
<XREF>IDCERWINKA2002</XREF>
<XREF>IDMIZUSAWA2002</XREF>
</CITATION>
<XREF>1</XREF>
</CITATION>
</CITATIONLIST>
    

HTML Presentation of citationlistx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citationlistx/elements/xref.html000644 001750 001750 00000003602 12247746230 022563 0ustar00markusmarkus000000 000000 citationlistx XML DTD: Element xref
citationlistx XML DTD: User Element View [DTD Element View]
[Home] [Elements] [Prev]

Element xref

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

Name Type Default Value
endterm ID None

Description

XREF defines one reference to the bibliographic data. The contents of the element describes the ID or the citation key of a single entry in the bibliographic database. This string always starts with "ID".

The ENDTERM attribute starts with the string "IM". The remainder is a number which is incremented with each multiple citation, starting at 0.

Parents

citation

Example

<CITATIONLIST>
<CITATION>
<XREF>IDNAKANE2002</XREF>
</CITATION>
<CITATION>
<XREF ENDTERM="IM0">IDNAKANE2002</XREF>
<XREF>IDNAKANE2002</XREF>
<XREF>IDCERWINKA2002</XREF>
<XREF>IDMIZUSAWA2002</XREF>
</CITATION>
<XREF>1</XREF>
</CITATION>
</CITATIONLIST>
    

HTML Presentation of citationlistx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citationlistx/dtdelem/citation.html000644 001750 001750 00000001653 12247746230 023237 0ustar00markusmarkus000000 000000 citationlistx XML DTD: Element citation
citationlistx XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element citation

Synopsis

Content Model

(xref)+

Attributes

None

Description

Parents

citationlist

Children

xref


HTML Presentation of citationlistx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citationlistx/dtdelem/citationlist.html000644 001750 001750 00000001576 12247746230 024137 0ustar00markusmarkus000000 000000 citationlistx XML DTD: Element citationlist
citationlistx XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev] [Next]

Element citationlist

Synopsis

Content Model

(citation)+

Attributes

None

Description

Children

citation


HTML Presentation of citationlistx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citationlistx/dtdelem/xref.html000644 001750 001750 00000001774 12247746230 022375 0ustar00markusmarkus000000 000000 citationlistx XML DTD: Element xref
citationlistx XML DTD: DTD Element View [User Element View]
[Home] [Elements] [Prev]

Element xref

Synopsis

Mixed Content Model

(#PCDATA)

Attributes

NameTypeDefault Value
endterm ID None

Description

Parents

citation


HTML Presentation of citationlistx XML DTD by DTDParse (version 2.00). refdb-1.0.2/doc/citationlistx/ele-desc/citation.html000644 001750 001750 00000001336 11512721660 023272 0ustar00markusmarkus000000 000000 CITATION description

Description

CITATION defines one citation. Each citation can hold one or more references to the bibliographic data.

Example

<CITATIONLIST>
<CITATION>
<XREF>IDNAKANE2002</XREF>
</CITATION>
<CITATION>
<XREF ENDTERM="IM0">IDNAKANE2002</XREF>
<XREF>IDNAKANE2002</XREF>
<XREF>IDCERWINKA2002</XREF>
<XREF>IDMIZUSAWA2002</XREF>
</CITATION>
<XREF>1</XREF>
</CITATION>
</CITATIONLIST>
    
refdb-1.0.2/doc/citationlistx/ele-desc/citationlist.html000644 001750 001750 00000001271 11512721660 024164 0ustar00markusmarkus000000 000000 CITATIONLIST description

Description

CITATIONLIST defines the whole set of citations of a document.

Example

<CITATIONLIST>
<CITATION>
<XREF>IDNAKANE2002</XREF>
</CITATION>
<CITATION>
<XREF ENDTERM="IM0">IDNAKANE2002</XREF>
<XREF>IDNAKANE2002</XREF>
<XREF>IDCERWINKA2002</XREF>
<XREF>IDMIZUSAWA2002</XREF>
</CITATION>
<XREF>1</XREF>
</CITATION>
</CITATIONLIST>
    
refdb-1.0.2/doc/citationlistx/ele-desc/xref.html000644 001750 001750 00000001730 11512721660 022422 0ustar00markusmarkus000000 000000 XREF description

Description

XREF defines one reference to the bibliographic data. The contents of the element describes the ID or the citation key of a single entry in the bibliographic database. This string always starts with "ID".

The ENDTERM attribute starts with the string "IM". The remainder is a number which is incremented with each multiple citation, starting at 0.

Example

<CITATIONLIST>
<CITATION>
<XREF>IDNAKANE2002</XREF>
</CITATION>
<CITATION>
<XREF ENDTERM="IM0">IDNAKANE2002</XREF>
<XREF>IDNAKANE2002</XREF>
<XREF>IDCERWINKA2002</XREF>
<XREF>IDMIZUSAWA2002</XREF>
</CITATION>
<XREF>1</XREF>
</CITATION>
</CITATIONLIST>
    
refdb-1.0.2/sru/Makefile.in000644 001750 001750 00000030552 12303475770 016335 0ustar00markusmarkus000000 000000 # Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = sru DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/./conf/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/./conf/mkinstalldirs CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BIB2RIS = @BIB2RIS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ ULLSPEC = @ULLSPEC@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bib2ris_LDADD = @bib2ris_LDADD@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ classpath_root = @classpath_root@ client1_mans = @client1_mans@ client_bins = @client_bins@ client_etc_distobjects = @client_etc_distobjects@ client_etc_objects = @client_etc_objects@ client_mans = @client_mans@ client_scripts = @client_scripts@ client_subdirs = @client_subdirs@ datadir = @datadir@ datarootdir = @datarootdir@ db_dir = @db_dir@ docbk_xsl = @docbk_xsl@ docbk_xsl_ns = @docbk_xsl_ns@ docdir = @docdir@ docs_subdirs = @docs_subdirs@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ log_dir = @log_dir@ main_db = @main_db@ man_subdirs = @man_subdirs@ mandir = @mandir@ mkdir_p = @mkdir_p@ mybatik = @mybatik@ mydtdformat = @mydtdformat@ mydtdparse = @mydtdparse@ myjade = @myjade@ myperl = @myperl@ mysgrep = @mysgrep@ myshell = @myshell@ mysvnversion = @mysvnversion@ mytidy = @mytidy@ myxmlcatalog = @myxmlcatalog@ myxsltproc = @myxsltproc@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psarg = @psarg@ psdir = @psdir@ refdba_LDADD = @refdba_LDADD@ refdbc_LDADD = @refdbc_LDADD@ refdbd_LDADD = @refdbd_LDADD@ sbindir = @sbindir@ server8_mans = @server8_mans@ server_bins = @server_bins@ server_etc_distobjects = @server_etc_distobjects@ server_etc_objects = @server_etc_objects@ server_mans = @server_mans@ server_scripts = @server_scripts@ server_subdirs = @server_subdirs@ sgml_decl = @sgml_decl@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ svnversioncommand = @svnversioncommand@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ tei_xsl = @tei_xsl@ tei_xsl_ns = @tei_xsl_ns@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ trang_cmd = @trang_cmd@ var_dir = @var_dir@ xml_decl = @xml_decl@ objects = refdbsru.xsl mods.xsl risx.xsl refdbsru.css EXTRA_DIST = $(objects) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu sru/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu sru/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-data-local install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags-am uninstall uninstall-am install-data-local: $(mkinstalldirs) $(DESTDIR)$(pkgdatadir)/sru @for f in $(objects); do \ $(INSTALL_DATA) $$f $(DESTDIR)$(pkgdatadir)/sru/$$f; \ done # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: refdb-1.0.2/sru/Makefile.am000644 001750 001750 00000000450 11512721663 016312 0ustar00markusmarkus000000 000000 ## Process this file with automake to produce Makefile.in objects = refdbsru.xsl mods.xsl risx.xsl refdbsru.css EXTRA_DIST = $(objects) install-data-local: $(mkinstalldirs) $(DESTDIR)$(pkgdatadir)/sru @for f in $(objects); do \ $(INSTALL_DATA) $$f $(DESTDIR)$(pkgdatadir)/sru/$$f; \ done refdb-1.0.2/sru/refdbsru.xsl000644 001750 001750 00000023661 11512721663 016633 0ustar00markusmarkus000000 000000 RefDB SRU Results

Your query matched records.


Record

Term Matching records

Server Information

Protocol via
Protocol version
URL /
Port
Username
Password

Database Information

Title
Description
Available records as of
Maintainer
Contact
Language usage

Meta Information

Explain information last updated at

Index Information

Available index sets:

Indexes

,

Operations search scan

Schema Information

Identifier
Location

Configuration Information

Supported relations
Supported masking characters
Supported operations
Settings
Defaults
, scan, =,

()

?version=1.1&operation=searchRetrieve&query=&startRecord=&maximumRecords=&recordSchema=& ... Click here to see more records found by this search More Records
refdb-1.0.2/sru/mods.xsl000644 001750 001750 00000013440 11512721663 015753 0ustar00markusmarkus000000 000000

: ( Edition ) ="", ()
refdb-1.0.2/sru/risx.xsl000644 001750 001750 00000017250 11512721663 016001 0ustar00markusmarkus000000 000000
Type
ID
Citation Key

Part Information

Author

Publication Information

Author

Set Information

Author

Housekeeping Information ()

Contents

Keyword
Title () () ; , , Date () Volume Issue Pages - Address City Publisher Serial Number Link () Notes Reprint Availability () Abstract ;
refdb-1.0.2/sru/refdbsru.css000644 001750 001750 00000001575 11512721663 016615 0ustar00markusmarkus000000 000000 /* stylesheet for the RefDB SRU output */ #head { padding: 10px; background-color: #0000FF; } #foot { padding: 10px; background-color: #EEEEEE; } h1 {font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 150%; color: #FFFFFF; } h2 {font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 130%; color: #0000FF; } p.diag { color: red; border-width: 2px; border-color: red; border-style: solid; padding: 10px; } table { border-style: solid; border-color: blue; border-width: 1px; border-collapse: collapse; font-family: Verdana, Arial, Helvetica, sans-serif; rules: all; } td { padding: 4px; } td.key { color: blue; } thead td { font-weight: bold; background-color: #DDDDDD }refdb-1.0.2/phpweb/Makefile.in000644 001750 001750 00000045504 12303475767 017022 0ustar00markusmarkus000000 000000 # Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = phpweb DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/./conf/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/./conf/mkinstalldirs CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BIB2RIS = @BIB2RIS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ ULLSPEC = @ULLSPEC@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bib2ris_LDADD = @bib2ris_LDADD@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ classpath_root = @classpath_root@ client1_mans = @client1_mans@ client_bins = @client_bins@ client_etc_distobjects = @client_etc_distobjects@ client_etc_objects = @client_etc_objects@ client_mans = @client_mans@ client_scripts = @client_scripts@ client_subdirs = @client_subdirs@ datadir = @datadir@ datarootdir = @datarootdir@ db_dir = @db_dir@ docbk_xsl = @docbk_xsl@ docbk_xsl_ns = @docbk_xsl_ns@ docdir = @docdir@ docs_subdirs = @docs_subdirs@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ log_dir = @log_dir@ main_db = @main_db@ man_subdirs = @man_subdirs@ mandir = @mandir@ mkdir_p = @mkdir_p@ mybatik = @mybatik@ mydtdformat = @mydtdformat@ mydtdparse = @mydtdparse@ myjade = @myjade@ myperl = @myperl@ mysgrep = @mysgrep@ myshell = @myshell@ mysvnversion = @mysvnversion@ mytidy = @mytidy@ myxmlcatalog = @myxmlcatalog@ myxsltproc = @myxsltproc@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psarg = @psarg@ psdir = @psdir@ refdba_LDADD = @refdba_LDADD@ refdbc_LDADD = @refdbc_LDADD@ refdbd_LDADD = @refdbd_LDADD@ sbindir = @sbindir@ server8_mans = @server8_mans@ server_bins = @server_bins@ server_etc_distobjects = @server_etc_distobjects@ server_etc_objects = @server_etc_objects@ server_mans = @server_mans@ server_scripts = @server_scripts@ server_subdirs = @server_subdirs@ sgml_decl = @sgml_decl@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ svnversioncommand = @svnversioncommand@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ tei_xsl = @tei_xsl@ tei_xsl_ns = @tei_xsl_ns@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ trang_cmd = @trang_cmd@ var_dir = @var_dir@ xml_decl = @xml_decl@ SUBDIRS = css images includes xsl objects = index.php EXTRA_DIST = index.php.in MOSTLYCLEANFILES = $(objects) all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu phpweb/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu phpweb/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-data-local install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic cscopelist-am ctags ctags-am \ distclean distclean-generic distclean-tags distdir dvi dvi-am \ html html-am info info-am install install-am install-data \ install-data-am install-data-local install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am all: $(objects) $(objects): %: %.in sed 's%%$(bindir)%' < $< > $@ install-data-local: $(mkinstalldirs) $(DESTDIR)$(pkgdatadir)/www chmod 1777 $(DESTDIR)$(pkgdatadir)/www @for f in $(objects) $(staticfiles); do \ $(INSTALL_DATA) $$f $(DESTDIR)$(pkgdatadir)/www/$$f; \ done # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: refdb-1.0.2/phpweb/Makefile.am000644 001750 001750 00000000714 11512721655 016772 0ustar00markusmarkus000000 000000 ## Process this file with automake to produce Makefile.in SUBDIRS = css images includes xsl objects = index.php EXTRA_DIST = index.php.in MOSTLYCLEANFILES=$(objects) all: $(objects) $(objects): %: %.in sed 's%%$(bindir)%' < $< > $@ install-data-local: $(mkinstalldirs) $(DESTDIR)$(pkgdatadir)/www chmod 1777 $(DESTDIR)$(pkgdatadir)/www @for f in $(objects) $(staticfiles); do \ $(INSTALL_DATA) $$f $(DESTDIR)$(pkgdatadir)/www/$$f; \ done refdb-1.0.2/phpweb/index.php.in000644 001750 001750 00000267045 12255426647 017207 0ustar00markusmarkus000000 000000 ===================================================*/ /*----------------------------------------------------------------------- Part 1: Some initialisation This section prepares initial values and variables, and calls essential includes, functions, and objects -------------------------------------------------------------------------*/ // First start session (see http://ca.php.net/session_start). This allows variables to be kept alive as long as the browser is engaged. session_start(); // Set the error reporting (http://ca.php.net/error-reporting and http://ca.php.net/manual/en/ref.errorfunc.php). E_ALL for debugging, E_ERROR for publication error_reporting(E_ALL); // debugging error level //error_reporting(E_ERROR); // publication error level // Load refdb interface require_once "includes/refdblib.inc.php"; // Load functions require_once "includes/functions.inc.php"; //Set session variables // Note: it is not clear this is necessary $refdbc="refdbc", etc., maybe enough // This is also where path names are set during install. $_SESSION["refdbc"]="/refdbc"; $_SESSION["refdba"]="/refdba"; $_SESSION["path"]=""; $refdbc=$_SESSION["refdbc"]; $refdba=$_SESSION["refdba"]; /*================================================= PART 2: Check for cookies from previous session The login screen allows users to "remember me on this computer". If the "remember me button is checked, user name, database, and password are stored in cookies. This section checks whether the cookies exist and are complete. If they are it uses their values to establish the session; otherwise it directs the user to the login screen. This section could be cleaned up: 1) There is probably a better (more secure) way of handling Login information 2) The database cookie is odd: it is set to "remember me" whatever the user does =================================================*/ /* Username and password Cookie (refdb) */ // Check for availability and completeness of the existing refdb session cookie // A complete cookie has values for both $name and $passwd. if (isset($_COOKIE['refdb'])) { // If either is missing or set to null, kill the session. if (!isset($_COOKIE['refdb']['name'])||!isset($_COOKIE['refdb']['passwd'])) { // Delete any remaining parts of the cookie array by setting the components to more than one year in the past. setcookie('refdb[name]', "", time() - 3600 * 24 * 400); setcookie('refdb[passwd]', "", time() - 3600 * 24 * 400); setcookie('database', "", time() - 3600 * 24 * 400); // Now destroy the PHP $_SESSION variables: see the comments in http://ca.php.net/manual/en/function.session-unset.php /* Note: Removed session_unset following advice at http://ca.php.net/manual/en/function.session-destroy.php: "Note: Only use session_unset() for older deprecated code that does not use $_SESSION.") */ $_SESSION=array(); session_destroy(); // Now start the session again, because we'll need it to be started before we log on session_start(); // Set a warning for use on the login page indicating what we have done $warning="There was a problem closing your last session.
Please re-enter your username and password."; } //If the refdb cookie has values for both $username and $passwd, use the cookie values to set the session variables else { $_SESSION['passwd']=$_COOKIE['refdb']['passwd']; $_SESSION['name']=$_COOKIE['refdb']['name']; } } // If the refdb cookie is missing or incomplete, there may be input from the login screen, or we may need // to go to the login screen for the first time else { // Case 1: We have come here from the login form // Check if there is input from the login form use that we can use if (isset($_POST['name'])&&isset($_POST['passwd'])) { // If both name and passwd are set, check whether they both have values other than "" if (($_POST['name']!="")&&($_POST['passwd']!="")) { //this is an attempt at a validity checker. It doesn't work though: even if you pass, you end up at the login screen /* $username=escapeshellarg($_POST['name']); $passwd=escapeshellarg($_POST['passwd']); $testcmd="$refdbc -u $username -w $passwd -C listdb -c cat"; exec($testcmd,$lines,$exit_state); switch ($exit_state) { case 0: $login="true"; case 1: $login="false"; } if ($login=="true") { */ $_SESSION["passwd"]=$_POST['passwd']; $_SESSION["name"]=$_POST['name']; // Establish new refdb cookie // Check if the remember me box was checked if (isset($_POST['rememberMe'])) { // if yes, set $duration to 1 year for the cookie $duration=time() + 3600 * 24 * 365; } else { // otherwise set the duration for this session only (i.e. null) $duration=0; } // Now set new cookies using form data we have just converted to session data setcookie ("refdb[name]", $_SESSION['name'], $duration); setcookie ("refdb[passwd]", $_SESSION['passwd'], $duration); } // if one or both of the $username and $passwd variables are not set, set a warning for use on the login form else { $warning="Please supply a valid username and password"; } } // Case 2: The user has not been here before as far as we can tell and is going to be sent to the login screen // Set the warning for use on the login form else { $warning="Please supply a username and password"; } } // This checks whether the database has been selected on the form // If it has, it sets a new cookie. if (isset($_POST['selectedDatabase'])){ $_SESSION['database']=$_POST['selectedDatabase']; //remember database for one year anyway . It is not checked if name and password do not exist setcookie ("database", $_SESSION['database'],time() + 3600 * 24 * 365); } /* Database Cookie (database) */ //Does a database cookie already exist? If so, use its values if (isset($_COOKIE['database'])) { $_SESSION['database']=stripQuotes($_COOKIE['database']); } // Preferences if (!session_is_registered('reference_limit')) { $_SESSION['reference_limit'] = 10; } if (!session_is_registered('index_limit')) { $_SESSION['index_limit'] = 50; } /*================================================= PART 3 Decide where to go Now we check whether after all this, we have a session name and passwd. If we do not, we go to the login form. If we do, we check to see whether we have a $thisPage variable. The two usual choices for a first hit on the URL are Login (if nothing is set) or Search (if the session variables are set but not the $thisPage). After the first search or login, the $thisPage variable becomes more common. =================================================*/ // First we check whether session name or password variables have been set above. if (!isset($_SESSION['name'])||!isset($_SESSION['passwd'])) { // If either has not been set, then we set this page to Login, since we will need to login $thisPage="Login"; } // If both session variables have been set, then we are logged in. else { //First let's escape the $passwd and $username variables so the can be passed to the shell from here on /* SECURITY note: $_SESSION['name'] and $_SESSION['passwd'] should not be used hereafter. */ $username=escapeshellarg($_SESSION['name']); $passwd=escapeshellarg($_SESSION['passwd']); $my_refdba = new RefDB($username, $passwd, "", "", $refdba); $my_refdbc = new RefDB($username, $passwd, "", "", $refdbc); $operation=""; $ID=""; // If $sendQuery is set we are being sent an operation. Check if it is set. if(isset($_POST['sendQuery'])) { $sendQuery=$_POST['sendQuery']; // Three types of $sendQuery (edit, delete, and display) require extraction of an ID number from the variable value; check if that's what we are looking at. if (substr($sendQuery,0,4)=="edit") { $operation="edit"; $ID=substr($sendQuery,5); } elseif (substr($sendQuery,0,6)=="delete") { $operation="delete"; $ID=substr($sendQuery,7); } elseif (substr($sendQuery,0,7)=="display") { $operation="display"; $citekey=substr($sendQuery,8); } elseif ($sendQuery=="next") { $_SESSION['offset'] += $_SESSION['limit']; $_SESSION['repeat'] = 1; $operation="Search"; } elseif ($sendQuery=="previous") { $_SESSION['offset'] -= $_SESSION['limit']; if ($_SESSION['offset'] < 0) { $_SESSION['offset'] = 0; } $_SESSION['repeat'] = 1; $operation="Search"; } elseif ($sendQuery=="nextindex") { $_SESSION['offset'] += $_SESSION['limit']; $_SESSION['repeat'] = 1; $operation="Search Indices"; } elseif ($sendQuery=="previousindex") { $_SESSION['offset'] -= $_SESSION['limit']; if ($_SESSION['offset'] < 0) { $_SESSION['offset'] = 0; } $_SESSION['repeat'] = 1; $operation="Search Indices"; } elseif ($sendQuery=="Set preferences") { // do some simple value checks // prefs_set is set in any case. The value remains 0 if all went ok // If the value is > 0, something went wrong and the Preferences page // can use the value to see which variable caused a problem. The first // variable adds 2^0, the second one 2^1 and so on. $_SESSION['prefs_set'] = 0; if ((int)$_POST['reference_limit'] > 0) { $_SESSION['reference_limit'] = $_POST['reference_limit']; } else { $_SESSION['reference_limit'] = 1; $_SESSION['prefs_set'] += 1; } if ((int)$_POST['index_limit'] > 1) { $_SESSION['index_limit'] = $_POST['index_limit']; } else { $_SESSION['index_limit'] = 1; $_SESSION['prefs_set'] += 2; } } //Check if $sendQuery is a legal value elseif ($sendQuery=="Login"|| $sendQuery=="Confirm deletion"|| $sendQuery=="Cancel deletion"|| $sendQuery=="Add reference"|| $sendQuery=="Send File"|| $sendQuery=="Search") { $operation=$sendQuery; } // if $sendQuery is none of the above, then it is illegal and needs to be cleaned out else { unset($sendQuery); $operation="Illegal operation"; } } else { // sendQuery was not set. Reset the session variables used in repeated queries $_SESSION['limit'] = $_SESSION['reference_limit']; $_SESSION['offset'] = 0; $_SESSION['repeat'] = 0; $_SESSION['totalhits'] = 0; unset($_SESSION['terms']); unset($_SESSION['kajqueryfield']); } // Now let's check whether thisPage has been set: if it has, we are responding to a user request; if it is not, // we are supposed to go to the default (Search) page. if(isset($_REQUEST['thisPage'])) { $thisPage=$_REQUEST['thisPage']; // SECURITY: compare $thisPage to a list of legal values; if it doesn't match, change it to the default (Search) if ($thisPage=="Search"|| $thisPage=="Search results"|| $thisPage=="Index results"|| $thisPage=="Confirm"|| $thisPage=="Logout"|| $thisPage=="Login"|| $thisPage=="Search indices"|| $thisPage=="Add-Edit-Delete"|| $thisPage=="Upload"|| $thisPage=="External databases"|| $thisPage=="Preferences"|| $thisPage=="Help") { $thisPage=$thisPage; } else { $thisPage="Search"; } } else { $thisPage="Search"; } } // Now we need to act on the $thisPage variable: // If $thisPage is "logout"--i.e. the user has requested to logout, we need to kill the cookies and everything before anything // is sent to the browser if ($thisPage=="Logout") { // First delete the cookie array by setting the components to more than one year in the past. setcookie('refdb[name]', "", time() - 3600 * 24 * 400); setcookie('refdb[passwd]', "", time() - 3600 * 24 * 400); setcookie('database', "", time() - 3600 * 24 * 400); // Then destroy the PHP $_SESSION variables: see the comments in http://ca.php.net/manual/en/function.session-unset.php // (note Removed session_unset following advice at http://ca.php.net/manual/en/function.session-destroy.php: // "Note: Only use session_unset() for older deprecated code that does not use $_SESSION.") $_SESSION=array(); session_destroy(); } // No matter what happens next, we are going to need a doctype and head // include_once('php/logo.inc.php'); echo "\n"; echo "\n"; echo " \n"; echo " Refdb: " . $thisPage . "\n"; echo " \n"; echo " \n"; echo " \n"; echo " \n"; echo " "; echo " \n"; echo " \n"; echo "
\n"; echo "
\n"; //check if there is a session name set; if there is, get the user name from it for the status box // echo "

DEBUG: session db went to:".$_SESSION['database'].".username went to:".$username."thisPage went to:".$thisPage."

"; if (isset($username) && !($thisPage=="Logout")) { echo "
\n"; echo "

You are logged in as " .htmlentities($username).".
\n"; echo " Database:"; echo "
\n"; if(!$selected){ echo"

Selected Database ". $_SESSION['database']. " is not valid, using ". $_SESSION['databases'][0]. " instead"; $_SESSION['database']=stripQuotes($_SESSION['databases'][0]); } /*echo "
\n";*/ echo " Switch User/Logout
\n"; echo "

\n"; //SECURITY: Escaping database here, do not use from //SESSION herafter //We also made sure, the database really exists. $database=escapeshellarg($_SESSION['database']); } // If the session name has not been set, indicate that we are not logged in. else { echo " Not logged in.\n"; } // The getversion() function does not require a valid username/password combo so we'll just create a fake client. The 'real' clients may not yet be available if we're still on the login screen $my_fakeclient = new RefDB("", "", "", "", $refdba); $version = $my_fakeclient->getversion(); $version=$version[0]; $version=str_replace("markus@mhoenicka.de","",$version); $version=str_replace("refdba ","",$version); echo "
\n"; echo "
\n"; echo "

\n"; echo " \n"; echo " \"Refdb\n"; echo " \n"; //echo " Reference manager and bibliography tool. Version $version"; echo "

\n"; echo "
\n"; echo "
\n"; // If this page is neither Login nor Logout, add a navigation list if ($thisPage!="Logout"&&$thisPage!="Login") { /* todo: is there a better place? */ $my_refdbc->selectdb($database); // if $thisPage is not login, add navigation list as well //include_once('php/navigationlist.inc.php'); echo "
\n"; echo " \n"; echo "
\n"; } // No matter what $thisPage was, we are going to need body text. Add appropriate content based on the nature of the $thisPage variable switch($thisPage) { /*************************************************************************************************************** LOGOUT ****************************************************************************************************************/ case('Logout'): // if $thisPage is Logout, we have already run the scripts to kill the session. This content informs the user of this fact. echo "
"; echo "

Logout

"; echo "

You have successfully logged out.
You will need to log in again to access Refdb.

"; echo "

Return to Login Screen

"; echo "
"; break; /*************************************************************************************************************** LOGIN ****************************************************************************************************************/ case('Login'): // If $thisPage is Login, just add login form at this point echo "
\n"; echo "

Login

\n"; echo "
\n"; //Add any warnings collected above if (isset($warning)) { echo "

" . $warning . "

\n"; unset($warning); } echo "

Username:

\n"; echo "

Password:

\n"; echo "

Remember me on this computer

\n"; echo "

\n"; echo "
\n"; echo "
\n"; break; /*************************************************************************************************************** ADD-EDIT-DELETE Add-Edit-Delete all use the same form. But different content and operations are used depending on which we want As a result we need to treat each operation separately in this section depending on the value of $operation: 1) if $operation=="delete" go to delete 2) if $operation=="edit" go to edit 3) otherwise, go to add ****************************************************************************************************************/ case('Add-Edit-Delete'): /*------------------------------------------------------------------------------------------------------- Delete If $operation=="delete" we come here. This page pulls the entry that is to be deleted from refdb, presents it and the refdb delete command to the user and asks them to confirm that this is what they want to do. -------------------------------------------------------------------------------------------------------*/ if ($operation=="delete") { // define variables $searchcmd=$_POST['searchcmd']; $searchdelTerms=":ID:=$ID"; $searchdelcmd=$corecmd . $searchdelTerms; $delTerms=" -C deleteref $ID"; $delcmd=$ID; $displaydelcmd = $displaycmd . $delTerms; // search refdb for entry that is to be deleted $lines = $my_refdbc->getref("risx", "ALL", "", "", "", "", "", "", $searchdelTerms); // print form echo "
\n"; echo "

Confirm deletion

\n"; echo "
\n"; echo "

Warning! This operation cannot be undone

\n"; echo "

You have requested that Refdb delete the following reference. This operation cannot be undone.

\n"; echo "
\n"; // print entry that is to be deleted; "false" refers to whether or not we need buttons to appear in this area (we don't) risx_xhtmlprocessor($lines,"false"); echo "

If you are sure you want this entry to be deleted permanently from your bibliography, select Delete!."; echo " Otherwise choose Cancel! or use your browser's back button.

\n"; echo "

(If you select Delete!, the following command will be sent to the server:" . $displaydelcmd . ").

\n"; echo "

 "; echo "

\n"; echo "

\n"; echo " \n"; echo "

\n"; echo " \n"; echo "
\n"; unset($operation); } /*-------------------------------------------------------------- display: display a dataset in a particular format --------------------------------------------------------------------*/ else if ($operation == "display") { // search refdb for entry that is to be edited $format = $_REQUEST["format$citekey"]; // echo "

format went to $format, id went to $ID

"; $lines = $my_refdbc->getref($format, "ALL", "", "", "", "", "", "", ":CK:=$citekey"); $formats = array("ris" => "RIS", "risx" => "risx", "mods" => "MODS", "bibtex" => "bibtex", "db31" => "DocBook SGML", "db31x" => "DocBook 4 XML", "db50x" => "DocBook 5 XML", "teix" => "TEI P4", "tei5x" => "TEI P5"); $my_format = $formats[$format]; echo "
\n"; echo "

Display dataset $citekey as $my_format

\n"; echo "
";
     foreach ($lines as $line) {
       // postprocess lines, e.g. substitute <>
       $fixed_line = str_replace(array("<", ">"), array("<", ">"), $line);
       echo "

$fixed_line

"; } echo "
"; echo "
"; unset($operation); } /*------------------------------------------------------------------------------------------------------- Edit and Add If $operation!="delete" we come here. -------------------------------------------------------------------------------------------------------*/ else { $fields = array("ID", "sec_primary","AU","TI","N2","KW","sec_secondary", "A2", "JF", "JO", "J1", "J2", "T2", "sec_tertiary", "A3", "T3", "sec_publication", "VL", "IS", "CY", "PB", "SN", "AD", "PY", "Y2", "SP", "EP", "N1", "sec_shelf", "RP", "AV", "UR", "L1", "U1", "U2", "U3", "U4", "U5", "M1", "M2", "M3"); $dateFields = array( "PY", "Y2"); $datePartFields= array( "PYyear", "PYmonth", "PYday", "PYother", "Y2year", "Y2month", "Y2day", "Y2other"); $allFields= array_merge($fields, $datePartFields); $auFields= array("AU", "A2", "A3", "KW"); $reverseAuFields = array_flip($auFields); //Entries in the Form $formfields=array(); //Checked Fields $myFields=array(); //Checked Array Fields $arrayFields=array(); /*--------------------------------------------------------------------------------------------------- Case 2a $operation=="edit" -----------------------------------------------------------------------------------------------------*/ if ($operation=="edit") { // search refdb for entry that is to be edited $lines = $my_refdbc->getref("ris", "ALL", "", "", "", "", "", "", ":ID:=$ID"); // Parse RIS for form $myFields=parseRSS ($lines); //ToDO remove the line below once we are only using checked fields in myField for creation of the form --DR $formfields=$myFields; //extract($RIS,EXTR_OVERWRITE); } /*--------------------------------------------------------------------------------------------------- Case 2b default (="Add") If $thisPage=="Add-Edit-Delete, but $operation has not been set, we end up here -----------------------------------------------------------------------------------------------------*/ else { $sendQuery=""; if(isset($_POST['formTY'])){ $formfields['TY'] = $_POST['formTY']; } else { $formfields['TY'] = ""; } //Sequence defines also execution sequence for import and Form //We can check the entire field for an entry (invalidText) and replace it by some alternative text altText $invalidText = array( "PYyear" => "YYYY" , "PYmonth" => "NoMonth" , "PYday" => "NoDay" , "PYother" => "Other:", "Y2year" => "YYYY" , "Y2month" => "NoMonth" , "Y2day" => "NoDay" , "Y2other" => "Other:" ); $altText = array("PYyear" => "", "PYmonth" =>"" , "PYday" =>"" , "PYother" =>"", "Y2year" => "", "Y2month" =>"" , "Y2day" =>"" , "Y2other" =>"" ); //We can also search for any number regular expressions and replace those field first s repl second s repl $searchReplaceText = array("AU" => array(array(", ", ","), array( "; ", ";")), "A2" => array(array(", ", ","), array( "; ", ";")), "A3" => array(array(", ", ","), array( "; ", ";")), "KW" => array(array(", ", ",")), "TY" => array(array("short", "")) //short entries just have different forms (treated in $referencetype) ); foreach($allFields as $field){ $name='form'.$field; if (isset($_POST[$name])) { //Initialize all fields to avoid undefined fields $myFields[$field] = ""; $formfields[$field] = $_POST[$name]; //Replaces formXX //include checks here for security reasons. All fields should be checked in the end if(isset($invalidText[$field]) && $formfields[$field]==$invalidText[$field] ){ $formfields[$field]=$altText[$field]; } if(isset($searchReplaceText[$field])){ foreach($searchReplaceText[$field] as $searchRepl){ $formfields[$field] = str_replace($searchRepl[0], $searchRepl[1], $formfields[$field]); } } //later on we check wheter the ID comes from RefDB or from the Form itself based on the fact whether myFields['ID'] exists //if($field!="ID"){ $myFields[$field] = $formfields[$field]; //$XX is replaced my myFields['XX']; //} } } //compile publication year from multiple fields foreach($dateFields as $dateField){ if(isset($formfields[$dateField.'year'])){ $myFields[$dateField]=$formfields[$dateField.'year']; if(isset($formfields[$dateField.'month'])){ $myFields[$dateField].= "/" . $formfields[$dateField.'month']; if(isset($formfields[$dateField.'day'])){ $myFields[$dateField].="/" . $formfields[$dateField.'day']; if(isset($formfields[$dateField.'other'])){ $myFields[$dateField].="/" . $formfields[$dateField.'other'];// Publication Year: YYYY/MM/DD/Otherinfo } } } } } //clear up formAU~A3 foreach($auFields as $field){ $separator=";"; if(isset($formfields[$field])){ //$$ arrayFields is a multidimensional array. Each key, e.g. "KW", has a value consisting of an array of all KW entries $arrayFields[$field] = explode($separator,$formfields[$field]); } } } // end if ($operation=="edit") if ($operation=="Add reference") { $entry=""; // initialise entry text //Debugging output: //echo "
\n"; /* echo "

dumping fields: \n"; var_dump($fields); echo "

dumping arrayFields: \n"; var_dump($arrayFields); echo "

dumping myFields: \n"; var_dump($myFields); echo "

dumping formfields: \n"; var_dump($formfields); echo "

"; */ // before adding the data to the database, we need to reverse-translate // whatever htmlentities() did to the data $un_htmlentities = get_html_translation_table(HTML_ENTITIES); $rev_un_htmlentities = array_flip($un_htmlentities); //ToDo Change code such that the following is not necessary anymore //$myFields['ID']=$ID; $tempfield = str_replace("short", "", $formfields['TY']); $myFields['TY']=$tempfield; // write out the tag lines. Avoid empty tags foreach(array_merge(array("TY"),$fields) as $field){ //For authors and keywords add each element if(array_key_exists($field, $reverseAuFields)){ foreach($arrayFields[$field] as $author){ if (isset($author) && strlen($author) > 0) { $entry.= $field." - ".trim(stripslashes(strtr($author, $rev_un_htmlentities)))."\n"; } } } else { //for nonauthor and nonkeyword fields add field as is if(isset($myFields[$field]) && strlen($myFields[$field]) > 0){ $entry.= $field." - ".stripslashes(strtr($myFields[$field], $rev_un_htmlentities))."\n"; } } } // terminate the RIS dataset $entry .= "ER - \n"; // currently the reference data are written to a temporary file and imported from that // todo: make this workaround unnecessary, needs work in refdblib.inc.php $tempFile=tempnam("/tmp", "refdb"); // make sure filename is unique - we may not be alone $fh=fopen($tempFile, 'w') or die("can't open file"); # fwrite($fh, htmlentities($entry)); fwrite($fh, $entry); fclose($fh); // if the ID field is set to an alphanumeric value, we're supposed to update, else add $lines = array(); // initialize as empty array if(isset($myFields["ID"]) && preg_match('/^[^0-9]+/', $myFields["ID"])){ $lines = $my_refdbc->updateref_from_file("", $tempFile, "ris", "UTF-8"); } else { $lines = $my_refdbc->addref_from_file("", $tempFile, "ris", "UTF-8"); } unlink($tempFile); // clean up our trash $num_success = 0; $num_failed = 0; $my_citekey = ""; foreach ($lines as $line) { $resultfields = explode(':', $line); $status = $resultfields[0]; // store citekey for later use. urlencoding $citekey should not be required as refdbd strips off offending characters anyway if ($status == "406") { $my_citekey = $resultfields[2]; } if ($status == "408") { $num_success++; } else if ($status == "413") { $num_success++; } else if ($status == "414") { $num_failed++; } } if ($num_success > 0) { // print form echo "
\n"; if(isset($myFields["ID"]) && preg_match('/^[^0-9]+/', $myFields["ID"])){ echo "

Successfully updated

\n"; echo "

The following entry has been successfully updated in your database as $my_citekey:

\n

"; } else { echo "

Successfully added

\n"; echo "

The following entry has been successfully added to your database as $my_citekey:

\n

"; } echo "

\n"; echo "
" . $entry . "
"; echo "
\n"; } else { echo "
\n"; echo "

Error while adding new entry

\n"; echo "

The following entry has not been successfully added to your database.

\n

"; echo "

\n"; echo "
" . $entry . "
"; echo "
\n"; } } else { // print form echo "
\n"; $addeditWarning="
Do not use any markup (e.g. html <b>) in your entries."; if ($operation=="edit") { echo "

"; echo "Edit reference"; echo "

\n"; echo "

This form allows you to edit pre-existing entries in the database. $addeditWarning

\n"; } else { echo "

"; echo "Add reference"; echo "

\n"; echo "

This form allows you to add new references to the database. $addeditWarning

\n"; } echo "
\n"; echo " \n\n"; echo "
\n"; echo "

Citation Identification

\n"; echo "

Citation Key: "; if (isset($formfields['ID'])&&$formfields['ID']!="") { echo "  (RefDB ID: #$ID)\n"; } echo "
(To be set by RefDB. Only expert users should edit this box. Mistakes may corrupt your data)\n"; echo "

\n"; echo "
\n"; echo "
\n"; echo "

Reference Type

\n"; echo " \n"; echo " \n\n"; echo " \n"; echo " \n"; echo " \n"; echo " \n"; echo "
Reference type:\n"; form_selection($formfields['TY']); echo "
\n"; echo "
\n"; //*********************************************************************************************** //Shorter way to create form!!!!!!!!!!!!!! //Here I would include the $fields later on foreach($fields as $theField){ if($theField == "ID"){ // A very dirty hack because ID-field is so far generated separately above. But needs to // be in list in order to be read. TODO: Fixme } else { //Date fields require an array of defaults if(in_array($theField, $dateFields)) { if(isset($formfields[$theField.'year'])){ $defaultValue['year']=$formfields[$theField.'year']; } else { $defaultValue['year']=""; } if(isset($formfields[$theField.'month'])){ $defaultValue['month']= $formfields[$theField.'month']; } else { $defaultValue['month']=""; } if(isset($formfields[$theField.'day'])){ $defaultValue['day']= $formfields[$theField.'day']; } else { $defaultValue['day']=""; } if(isset($formfields[$theField.'other'])){ $defaultValue['other']=$formfields[$theField.'other']; } else { $defaultValue['other']=""; } } elseif(isset($myFields[$theField])){ $defaultValue = $myFields[$theField]; } else { $defaultValue = ""; } generateFormPart($formfields['TY'],$theField, $defaultValue); } } echo " \n"; echo "
\n"; echo "

\n"; echo " \n"; echo "
\n"; if (isset($operation)) { unset($operation); } } } break; /*======================================================================== Upload This page is used to upload files for inclusion in a database ========================================================================*/ case('Upload'): echo "
\n"; echo "
\n"; echo "

Import references

\n"; echo "

Add references from a file here. The following file types are recognized automatically:

\n
    "; // dynamically create a list of supported input data formats // these are supported by default echo "
  • RIS
  • \n
  • risx
  • \n"; // these need converters provided by refdb if (!is_null(nwhich("bib2ris-utf8"))) { echo "
  • BibTeX
  • \n"; } // temporarily disabled as we cannot distinguish it from "good" RIS // if (!is_null(nwhich("en2ris"))) { // echo "
  • EndNote (tagged)
  • \n"; // } if (!is_null(nwhich("marc2ris"))) { echo "
  • MARC21 and UNIMARC
  • \n"; } if (!is_null(nwhich("med2ris"))) { echo "
  • Pubmed (tagged and XML)
  • \n"; } // these need bibutils. xml2ris is required for all of these converters if (!is_null(nwhich("xml2ris"))) { echo "
  • MODS
  • \n"; if (!is_null(nwhich("copac2xml"))) { echo "
  • COPAC
  • \n"; } if (!is_null(nwhich("endx2xml"))) { echo "
  • EndNote XML
  • \n"; } if (!is_null(nwhich("isi2xml"))) { echo "
  • ISI
  • \n"; } } // RIS, risx, and exports from the web of science

    \n"; echo "
\n"; echo "\n"; echo "File to import: \n"; echo "\n"; break; /*======================================================================== Confirm You come to this page from the Delete page after selecting confirming or canceling a deletion process. This page reports on the results. ========================================================================*/ case('Confirm'): // define variables if (isset($_REQUEST['searchcmd'])) { $searchcmd=$_REQUEST['searchcmd']; } if (isset($_REQUEST['delcmd'])) { $delcmd=$_REQUEST['delcmd']; } echo "
\n"; // do whatever was selected if ($sendQuery=="Confirm deletion") { $lines = $my_refdbc->deleteref($delcmd); echo "

Entry has been deleted

\n"; echo "

The requested entry has been permanently deleted from your database using the following"; } elseif ($sendQuery=='Cancel deletion') { echo "

Requested deletion has been cancelled

\n"; echo "

Your request has been cancelled. The entry has not been deleted.

\n"; } elseif($sendQuery=='Send File') { if (!isset($_FILES['userfile']) || !isset($_FILES['userfile']['name']) || strlen($_FILES['userfile']['name']) == 0) { echo "Error: no file was specified"; } else { $uploaddir='/tmp/'; $filename=$uploaddir . $_FILES['userfile']['name']; echo "
\n";
       if (move_uploaded_file($_FILES['userfile']['tmp_name'], $filename)) {
	 echo "File is valid, and was successfully uploaded.  Here's some more debugging info:\n";
       } 
       else {
	 echo "Error while uploading file! Error:\n";
	 print($_FILES['userfile']['error']."\n");
	 echo "error codes\n";
       }
       echo "
\n"; importFile($filename, $my_refdbc); } } else { echo "

Undefined error

\n"; echo "

Something has gone wrong, but we're not sure what it is.

\n"; } echo "

Return to search form

\n"; break; /*======================================================================== Search results This page displays search results. You get here from the search screen after a successful search. Like all output forms, this page does not have an associated tab in the navigation list. This is because you cannot navigate to it--i.e. it is produced by refdb and the php. Moreover, as a user, you want to be able to select an arbitrary form from this point, including the form that produced these results. ========================================================================*/ case('Search results'): if ($_SESSION['repeat'] == 0) { // this is an original search. 'repeat' will be 1 only if we page // through a result set. In that case we don't have to build the // query again. Instead, we re-run the previous query but with a // different limit:offset //This array is used to build the query that will be sent to the getref command for the advanced search on the query page $fields=array("anyauthor"=>":AX:", "anytitle"=>":TX:", "anyjournal"=>":JX:", "author"=>":A1:", "editor"=>":A2:", "seditor"=>":A3:", "title"=>":TI:", "booktitle"=>":T2:", "seriestitle"=>":T3:", "journaltitle"=>":JF:", "shortjournaltitle"=>":JO:", "publicationyear"=>":PY:", "keyword"=>":KW:", "Notes"=>":N1:", "Abstract"=>":N2:", "Address"=>":AD:", "Reprint"=>":RP:", "ISSN"=>":SN:", "URL"=>":UR:", "Publisher"=>":PB:", "City"=>":CY:", "U1"=>":U1:", "U2"=>":U2:", "U3"=>":U3:", "U4"=>":U4:", "U5"=>":U5:", "M1"=>":M1:", "M2"=>":M2:", "M3"=>":M3:" ); //These are the logical operators used in the advanced search $ops=array("and"=>"AND", "or"=>"OR", "not"=>"NOT" ); $equals=array("exact"=>"=", "contains"=>"~", "beginswith"=> "=^", "endswith"=> "=$" ); // build base refdbc command if(isset($_POST['query'])){ // for expert queries, currently not used $terms =$_POST['query']; } elseif(isset($_POST['simplequery']) && $_POST['simplequery'] != "") { // search string in all fields $query="'".$_POST['simplequery']."'"; $terms=""; if (is_numeric($query)) { $terms=":AX:~$query OR :TX:~$query OR :KW:~$query OR :UR:~$query OR :L1:~$query OR :L2:~$query OR :L3:~$query OR :L4:~$query OR :JX:~$query OR :RP:~$query OR :N1:~$query OR :AV:~$query OR :TY:~$query OR :PY:=$query OR :Y2:=$query OR :ID:=$query OR :CK:~$query OR :SN:~$query OR :N2:~$query OR :SP:~$query OR :EP:~$query OR :VL:~$query OR :IS:~$query OR :AD:~$query OR :CY:~$query OR :PB:~$query OR :U1:~$query OR :U2:~$query OR :U3:~$query OR :U4:~$query OR :U5:~$query OR :TO:~$query OR :AR:~$query OR :OS:~$query OR :DG:~$query OR :RT:~$query OR :CI:~$query OR :CU:~$query OR :SE:~$query OR :RE:~$query OR :MT:~$query OR :NV:~$query OR :EI:~$query OR :CO:~$query OR :CF:~$query OR :RN:~$query OR :CL:~$query OR :SC:~$query OR :PN:~$query OR :CN:~$query"; } else { $terms=":AX:~$query OR :TX:~$query OR :KW:~$query OR :UR:~$query OR :L1:~$query OR :L2:~$query OR :L3:~$query OR :L4:~$query OR :JX:~$query OR :RP:~$query OR :N1:~$query OR :AV:~$query OR :TY:~$query OR :CK:~$query OR :SN:~$query OR :N2:~$query OR :SP:~$query OR :EP:~$query OR :VL:~$query OR :IS:~$query OR :AD:~$query OR :CY:~$query OR :PB:~$query OR :U1:~$query OR :U2:~$query OR :U3:~$query OR :U4:~$query OR :U5:~$query OR :TO:~$query OR :AR:~$query OR :OS:~$query OR :DG:~$query OR :RT:~$query OR :CI:~$query OR :CU:~$query OR :SE:~$query OR :RE:~$query OR :MT:~$query OR :NV:~$query OR :EI:~$query OR :CO:~$query OR :CF:~$query OR :RN:~$query OR :CL:~$query OR :SC:~$query OR :PN:~$query OR :CN:~$query"; } } elseif((isset($_POST['citationkey']) && $_POST['citationkey'] != "") || (isset($_POST['doi']) && $_POST['doi'] != "")) { $citationkey=$_POST['citationkey']; $doi=$_POST['doi']; $terms=""; if ($citationkey!="") { $terms = ":CK:="."$citationkey"; } else if ($doi != "") { $terms = ":DO:="."$doi"; } } elseif(isset($_POST['simplequery1'])) { $simplequery1=$_POST['simplequery1']; $simplequery2=$_POST['simplequery2']; $simplequery3=$_POST['simplequery3']; $simplequery4=$_POST['simplequery4']; $simplequery5=$_POST['simplequery5']; $simplequery6=$_POST['simplequery6']; $simplequery7=$_POST['simplequery7']; $simplequery8=$_POST['simplequery8']; $advancedquery1=$_POST['advancedquery1']; $advancedquery2=$_POST['advancedquery2']; $advancedquery3=$_POST['advancedquery3']; $advancedquery4=$_POST['advancedquery4']; $advancedquery1equals=$_POST['advancedquery1equals']; $advancedquery2equals=$_POST['advancedquery2equals']; $advancedquery3equals=$_POST['advancedquery3equals']; $advancedquery4equals=$_POST['advancedquery4equals']; $advancedquery1op=$_POST['advancedquery1op']; $advancedquery2op=$_POST['advancedquery2op']; $advancedquery3op=$_POST['advancedquery3op']; $advancedquery1field=$_POST['advancedquery1field']; $advancedquery2field=$_POST['advancedquery2field']; $advancedquery3field=$_POST['advancedquery3equals']; $advancedquery4field=$_POST['advancedquery4field']; //set search terms to NULL in order to begin building search $terms=""; //build simple search. This assigns a variable that we will use to try to figure out if a field is to be used or not $first=true; //check if simplequeryAX is empty if ($simplequery1!="") { //add search terms acquired from this field $terms=":AX:~"."$simplequery1"." "; //set $first to false so that we won't treat any additional fields that way $first=false; } if ($simplequery2!="") { //add search terms acquired from this field if ($first) { $terms=$terms.":PY:=".$simplequery2." "; $first=false; } else { $terms=$terms."AND"." ".":PY:"."=".$simplequery2." "; } } if ($simplequery3!="") { //add search terms acquired from this field if ($first) { $terms=$terms.":TX:"."~".$simplequery3." "; $first=false; } else { $terms=$terms."AND"." ".":TX:"."~".$simplequery3." "; } } if ($simplequery4!="") { //add search terms acquired from this field if ($first) { $terms=$terms.":JX:"."~".$simplequery4." "; $first=false; } else { $terms=$terms."AND"." ".":JX:"."~".$simplequery4." "; } } if ($simplequery5!="") { //add search terms acquired from this field if ($first) { $terms=$terms.":VL:"."~".$simplequery5." "; $first=false; } else { $terms=$terms."AND"." ".":VL:"."~".$simplequery5." "; } } if ($simplequery6!="") { //add search terms acquired from this field if ($first) { $terms=$terms.":IS:"."~".$simplequery6." "; $first=false; } else { $terms=$terms."AND"." ".":IS:"."~".$simplequery6." "; } } if ($simplequery7!="") { //add search terms acquired from this field if ($first) { $terms=$terms.":SP:"."~".$simplequery7." "; $first=false; } else { $terms=$terms."AND"." ".":SP:"."~".$simplequery7." "; } } if ($simplequery8!="") { //add search terms acquired from this field if ($first) { $terms=$terms.":KW:"."~".$simplequery5." "; $first=false; } else { $terms=$terms."AND"." ".":KW:"."~".$simplequery5." "; } } if ($advancedquery1!="") { //we should rewrite these so that a date choice has EQUALS as the $equals field, no matter what the user has chosen. $field1=$fields[$advancedquery1field]; $equals1=$equals[$advancedquery1equals]; if ($first) { $terms=$terms.$field1.$equals1.$advancedquery1." "; $first=false; } else { $terms=$terms."AND"." ".$field1.$equals1.$advancedquery1." "; } } if ($advancedquery2!="") { $field2=$fields[$advancedquery2field]; $equals2=$equals[$advancedquery2equals]; if ($first) { $terms=$terms.$field2.$equals2.$advancedquery2." "; $first=false; } else { $op1=$ops[$advancedquery1op]; $terms=$terms.$op1." ".$field2.$equals2.$advancedquery2." "; } } if ($advancedquery3!="") { $field3=$fields[$advancedquery3field]; $equals3=$equals[$advancedquery3equals]; if ($first) { $terms=$terms.$field3.$equals3.$advancedquery3." "; $first=false; } else { $op2=$ops[$advancedquery2op]; $terms=$terms.$op2." ".$field3.$equals3.$advancedquery3." "; } } if ($advancedquery4!="") { $field4=$fields[$advancedquery4field]; $equals4=$equals[$advancedquery4equals]; if ($first) { $terms=$terms.$field4.$equals4.$advancedquery4." "; $first=false; } else { $op3=$ops[$advancedquery3op]; $terms=$terms.$op3." ".$field4.$equals4.$advancedquery4." "; } } /* // Build the commandline query --> removed because it wasn't working elseif($sendQuery=="Send command line query" ) { $cmd=$commandlinequery; $terms=$terms; } */ /* // Query terms if you've returned from a search elseif ($sendQuery=="Return to Search Results" ) { $terms=$return; } */ } elseif (isset($_REQUEST['query'])) { $raw_terms=$_REQUEST['query']; // escape regexp special characters $in_array = array('[', ']', '(', ')', '{', '}', '^', '$', '.', '+', '*', '?', '|'); $out_array = array('\\[', '\\]', '\\(', '\\)', '\\{', '\\}', '\\^', '\\$', '\\.', '\\+', '\\*', '\\?', '\\|'); $terms=str_replace($in_array, $out_array, $raw_terms); $terms = "'$terms'"; } // else { //No valid query, branching to Search //TODO This does not work yet. Work with include later on // $thisPage = "Search"; // echo "
"; // echo "

Sorry! Your request was an invalid search

"; // echo "
"; // break; // } // Build final command by adding terms we have constructed to command built earlier. $_SESSION['terms'] = $terms; $limit = $_SESSION['reference_limit']; $offset = 0; $lines = $my_refdbc->countref("", "", $terms); $_SESSION['totalhits'] = preg_replace('/.*:(\d+) .*/', '\1', $lines[0]); } else { // repeat search $terms = $_SESSION['terms']; $limit=$_SESSION['limit']; $offset=$_SESSION['offset']; } //check if the database has been set. If not give warning if ($database=="") { echo "
\n"; echo "

Database error

\n"; echo "

Please select a database.

"; echo "
"; } else { if ($offset > 0) { $lines = $my_refdbc->getref("risx", "", "", "", "", "$limit:$offset", "", "1", $terms); } else { $lines = $my_refdbc->getref("risx", "", "", "", "", "$limit", "", "1", $terms); } //Report on results //first set hits variable to hold count $hits=""; $str=str_replace(" $_SESSION['totalhits']) { $to_ref = $_SESSION['totalhits']; } echo "
\n"; echo "

Matching References

\n"; // echo " \n"; /* echo "

\n"; */ echo "

Your search for " .$terms . " generated " . $_SESSION['totalhits'] . " " . $resultsnumber . ".

"; if ($_SESSION['totalhits'] > $_SESSION['limit']) { echo "

Displaying datasets " . $from_ref . " to " . $to_ref . ".

"; } // echo "
\n"; // display the paging buttons only if appropriate echo " \n"; if ($offset > 0 || $hits == $limit) { echo "

"; if ($offset > 0) { echo ""; } if ($hits == $limit) { echo ""; } echo "

\n"; } echo " \n"; // echo " (RefDB command: " . $displaysearchcmd . ")

\n"; echo "

Back to Search screen.

\n"; // If the search had results, display them: $lineNumber=1; $checkboxNumber=risx_xhtmlprocessor ($lines,"true"); // echo "

\n"; // echo " \n"; // echo " \n"; // echo "

\n"; // echo " \n"; // display the paging buttons only if appropriate echo "
\n"; echo "

"; if ($offset > 0) { echo ""; } if ($hits == $limit) { echo ""; } echo "

\n"; echo "
\n"; echo "
\n"; } break; /*======================================================================== Help ========================================================================*/ case('Help'): echo "
\n"; echo "

Help and Manuals

\n"; echo "

The help function and manual for this version of PHP_RefDB is not yet complete. In the mean time, here are links to manuals and instructions for the command line engine.

\n"; echo "
    \n"; echo "
  • RefDB Handbook: A comprehensive manual to the RefDB suite.
  • \n"; echo "
  • RefDB Tutorial: A users manual aimed at the needs of clients rather than administrators.
  • \n"; echo "
\n"; echo "
\n"; break; /*======================================================================== Preferences ========================================================================*/ case('Preferences'): echo "
"; echo "

User Preferences

"; if (session_is_registered('prefs_set')) { if ($_SESSION['prefs_set']==0) { echo "

successfully changed

\n"; } else { echo "

preferences changed, values corrected

\n"; } } echo "
\n"; if (session_is_registered('prefs_set') && ($_SESSION['prefs_set'] & 1)) { echo "

Number of references per page

"; } else { echo "

Number of references per page

"; } if (session_is_registered('prefs_set') && ($_SESSION['prefs_set'] & 2)) { echo "

Number of index entries per page

"; } else { echo "

Number of index entries per page

"; } echo "

"; echo "
\n"; echo "
"; if (session_is_registered('prefs_set')) { session_unregister('prefs_set'); } break; /*======================================================================== Index Results ========================================================================*/ case('Index results'): if ($_SESSION['repeat'] == 0) { // this is an original search. 'repeat' will be 1 only if we page // through a result set. In that case we don't have to build the // query again. Instead, we re-run the previous query but with a // different limit:offset //if field is not set go to the form if (!isset($_POST['kajqueryfield'])||!isset($_POST['kajquery'])){ $thisPage ='Search indices'; } // Otherwise show results else{ //build the command $kajqueryfield = $_POST['kajqueryfield']; $kajquery = $_POST['kajquery']; $short = selectTag($_POST['kajqueryfield']); $in_array = array('[', ']', '(', ')', '{', '}', '^', '$', '.', '+', '*', '?', '|'); $out_array = array('\\[', '\\]', '\\(', '\\)', '\\{', '\\}', '\\^', '\\$', '\\.', '\\+', '\\*', '\\?', '\\|'); $terms=str_replace($in_array, $out_array, $kajquery); $terms = "'$terms'"; $_SESSION['terms'] = $terms; $limit = $_SESSION['index_limit']; $offset = 0; $_SESSION['kajqueryfield'] = $kajqueryfield; switch($kajqueryfield) { case "keyword": $lines = $my_refdbc->getkw("", "", $terms); break; case "author": $lines = $my_refdbc->getau("", "", $terms); break; case "editor": $lines = $my_refdbc->geted("", "", $terms); break; case "seditor": $lines = $my_refdbc->getas("", "", $terms); break; case "journalfull": $lines = $my_refdbc->getjf("f", "", "", $terms); break; case "journalabbrev": $lines = $my_refdbc->getjo("f", "", "", $terms); break; case "journalabbrev1": $lines = $my_refdbc->getj1("f", "", "", $terms); break; case "journalabbrev2": $lines = $my_refdbc->getj2("f", "", "", $terms); break; } $_SESSION['totalhits'] = count($lines); } } else { // repeat search $kajquery = $_SESSION['terms']; $limit=$_SESSION['limit']; $offset=$_SESSION['offset']; $kajqueryfield = $_SESSION['kajqueryfield']; } echo "

Results

Your index search for " . $kajquery . " in ". $kajqueryfield ." generated " . $_SESSION['totalhits'] . " entries.

"; $short = selectTag($kajqueryfield); if ($offset > 0) { $limit_string = $limit . ":" . $offset; } else { $limit_string = "$limit"; } switch($kajqueryfield) { case "keyword": $lines = $my_refdbc->getkw($limit_string, "relfreq", $terms); break; case "author": $lines = $my_refdbc->getau($limit_string, "relfreq", $terms); break; case "editor": $lines = $my_refdbc->geted($limit_string, "relfreq", $terms); break; case "seditor": $lines = $my_refdbc->getas($limit_string, "relfreq", $terms); break; case "journalfull": $lines = $my_refdbc->getjf("f", $limit_string, "relfreq", $terms); break; case "journalabbrev": $lines = $my_refdbc->getjo("f", $limit_string, "relfreq", $terms); break; case "journalabbrev1": $lines = $my_refdbc->getj1("f", $limit_string, "relfreq", $terms); break; case "journalabbrev2": $lines = $my_refdbc->getj2("f", $limit_string, "relfreq", $terms); break; } $hits = count($lines); $from_ref = $_SESSION['offset']+1; $to_ref = $_SESSION['offset'] + $_SESSION['limit']; if ($to_ref > $_SESSION['totalhits']) { $to_ref = $_SESSION['totalhits']; } if ($_SESSION['totalhits'] > $_SESSION['limit']) { echo "

Displaying datasets " . $from_ref . " to " . $to_ref . ".

"; } if ($lines) { // display the paging buttons only if appropriate echo "
\n"; if ($offset > 0 || $hits == $limit) { echo "

"; if ($offset > 0) { echo ""; } if ($hits == $limit) { echo ""; } echo "

\n"; } echo "
\n"; foreach($lines as $line) { list($relfreq, $item) = explode(":", $line); echo "

" . str_replace(",", ", ", $item) . "

\n"; } // display the paging buttons only if appropriate echo "
\n"; if ($offset > 0 || $hits == $limit) { echo "

"; if ($offset > 0) { echo ""; } if ($hits == $limit) { echo ""; } echo "

\n"; } echo "
\n"; } else { echo "

Sorry, there were no results.

"; } echo "
"; break; /*======================================================================== Search indices ========================================================================*/ case('Search indices'): // include_once('php/searchIndices.inc.php'); $_SESSION['limit'] = $_SESSION['index_limit']; $_SESSION['offset'] = 0; $_SESSION['repeat'] = 0; $_SESSION['totalhits'] = 0; unset($_SESSION['terms']); unset($_SESSION['kajqueryfield']); echo "
\n"; echo "

Search Indices

\n"; echo "

Use this form to search Refdb's pre-compiled indices.

"; echo "
\n"; //echo " \n"; echo "

\n"; echo " in "; echo " \n"; echo "

\n"; echo "

\n"; echo " \n"; echo " \n"; echo "

\n"; echo "
\n"; echo "
\n"; break; /*======================================================================== External databases ========================================================================*/ case('External databases'): if (function_exists('yaz_connect')) { function display_record($rec, $xslfile) { $xml = new DOMDocument; $xml->loadXML($rec); $xsl = new DOMDocument; $xsl ->load($xslfile); // Configure the transformer $proc = new XSLTProcessor; $proc->registerPHPFunctions(); $proc->importStyleSheet($xsl); // attach the xsl rules echo $proc->transformToXML($xml); } /* $processor = xslt_create(); $parms = array('/_xml' => $rec); $res = xslt_process($processor, 'arg:/_xml', $xslfile, NULL, $parms); xslt_free($processor); $res = preg_replace("']*>'", '', $res); print $res; } */ echo "
"; echo "

Search external resources

"; echo "

This search engine uses yaz and phpyaz to search selected Z39.50 servers. It is still very rudimentary, but it does allow you to search external sources.

"; // This adds subtracts slashes from in front of apostrophes as requires by the PHP server's "magic quotes" status function myAddSlashes( $string ) { if (get_magic_quotes_gpc()==1) { return ( $string ); } else { return ( addslashes ( $string ) ); } } $host=""; $term=""; if (isset($_POST['host'])) { $host=$_POST['host']; } if (isset($_POST['term'])) { $term=$_POST['term']; } $num_hosts=count($host); //The following checks the status of the term input and the number of hosts open. If either is null, then it displays the search field. echo "
\n"; echo "

Search

\n"; echo "

\n"; echo "

Supported CCL fields: ti (title), au (author), ab (abstract), date, isbn and issn. You can combine fields using operators and and or: e.g. ti=submarine and au=parrish thomas.

"; echo "

Databases: \n"; echo " MELVYL (University of California) \n"; echo " \n"; echo " Library of Congress

 "; if (!empty($term)&&count($host)!=0) { //Define each property of bibl1 (todo: add year) $bib1["term"]="u=1016 s=pw t=l,r"; $bib1["ti"]="u=4 s=pw t=l,r"; $bib1["au"]="u=1003"; $bib1["ab"]="u=62 s=pw t=l,r"; $bib1["isbn"]="u=7 s=pw"; $bib1["issn"]="u=8 s=pw"; $bib1["date"]="u=30 r=o"; // Repeat search terms back to user; htmlspecialchars ensures that things like & in input are rendered &. // See http://ca3.php.net/htmlspecialchars echo "
"; echo "

Results

"; echo '

You searched for ' . htmlspecialchars($term) . '

'; //Assigns ids to hosts: 1) begin with i=0, as long as i < that the num_hosts (defined above) keep adding 1 for ($i=0; $i < $num_hosts; $i++) { //for each host assign an index id $id[]=yaz_connect($host[$i]); // Mapping CCL terms to RPN as defined above (bib1) for each search yaz_ccl_conf($id[$i], $bib1); // Parse input against yaz_ccl_conf; if error report message; defines cclresult as output of parsing if (!yaz_ccl_parse($id[$i], $term, &$cclresult)) { echo '

Error: ' . $cclresult["errorstring"] . '

Clear results

'; continue; } //Specify z39.50 preferred syntax for retrieval from the server yaz_syntax($id[$i],"usmarc"); //Prepare search (excuted by yaz_wait). Attributes are (resource id, string type [must be "rpn", string query). // cclresult is produced by yaz_ccl_parse above. yaz_search($id[$i],"rpn",$cclresult["rpn"]); // Specify number of records to be retrieved. (Should be called befiore yaz_search: http://www.php.net/manual/en/function.yaz-range.php). This is replaced below. yaz_range($id[$i], 0, 0); } //Allows searches to be executed: returns when server completes or aborts. yaz_wait(); //run through each host for counts for ($i=0; $i < $num_hosts; $i++) { $count=yaz_hits($id[$i]); //sets yaz_range in response to number of hits if ($count >=4) { $count=4; yaz_range($id[$i], 1, $count); //prepares for retrieval of number of records specified in yaz_range above yaz_present($id[$i]); } //Allows searches to be executed: returns when server completes or aborts. yaz_wait(); for ($i=0; $i <$num_hosts; $i++) { //add line, indicate the host echo '
' . $host[$i] . ":"; //define error variable $error=yaz_error($id[$i]); //if there is an error, report it. if (!empty($error)) { echo "

Error: $error (Clear results)

"; } //Otherwise report the number of hits else { $hits=yaz_hits($id[$i]); echo "

Result Count $hits (Clear results)

"; } // Now present the output echo '
    '; //Restrict following to 20 records for ($p=1; $p <=20; $p++) { // present record of idx in position p, in format "string"; convert marc-8 to utf-8 $rec=yaz_record($id[$i],$p,"xml; charset=marc-8,utf-8"); //if the record is empty go on to the next host? if (empty($rec)) continue; //Print the position number echo "

    $p"; $xslfile="xsl/MARC21slim2English.xsl"; display_record($rec, $xslfile); /* //Go through each record looking for \n and replacing it with html:br element echo ereg_replace("\n", "
    \n",$rec); */ echo "

    "; } echo '
'; } } } } else {echo "
"; echo "

Not available

"; echo "

This feature requires the installation of yaz and phpyaz. Please install (or ask your system adminitrator to install) this software.

"; echo "
"; // include_once('php/externalsearchengine.inc.php'); } echo "
"; break; /*======================================================================== Search ========================================================================*/ // case('Search'): default : // include_once('php/searchform.inc.php'); $_SESSION['limit'] = $_SESSION['reference_limit']; $_SESSION['offset'] = 0; $_SESSION['repeat'] = 0; $_SESSION['totalhits'] = 0; unset($_SESSION['terms']); echo "
\n"; echo " \n"; echo "
\n"; echo "

Simple search

\n"; echo "

This form performs a simple search for a string in all fields

\n"; echo " Find this:
\n"; echo "

\n"; echo "
\n"; echo "
\n"; echo "

Search by unique identifier

\n"; echo "

Use this form to retrieve a particular dataset with a known unique identifier, either the citation key or the Digital Objects Identifier (DOI).

\n"; echo " Citation key: "; echo " DOI:
\n"; echo "

\n"; echo "
\n"; echo "
"; echo "

Simple field-based search

\n"; echo "

This form allows you to search the most common fields. Enter as many or as few search terms as you wish. The search is case-insensitive. Multiple fields are combined using \"AND\" (i.e. filling in author and publication year will result in a search for author AND publication year."; echo " You can also use the Advanced query below.

\n"; echo "

\n"; echo " Author/Editor/Translator:
\n"; echo " Publication Year:
\n"; echo " Book/Chapter/Article Title:
\n"; echo " Journal Name or Abbreviation:
\n"; echo " Volume: "; echo " Issue: "; echo " Start page:
\n"; echo " Subject:
\n"; echo "

\n"; echo "

\n"; echo "
\n"; echo "
"; echo "

Advanced query

\n"; echo "

This form allows you to search any available field. The search is case-insensitive."; echo " You can also use the simple search above.

\n"; echo "

\n"; echo " \n"; echo " \n"; echo " \n"; echo " \n"; echo "

\n"; echo "

\n"; echo " \n"; echo " \n"; echo " \n"; echo " \n"; echo "

\n"; echo "

\n"; echo " \n"; echo " \n"; echo " \n"; echo " \n"; echo "

\n"; echo "

\n"; echo " \n"; echo " \n"; echo " ."; echo "

\n"; echo "

\n"; echo "
\n"; /* This has been echoed out because I can't get it to work echo "
"; echo "\n"; echo "
"; */ echo " \n"; echo "
\n"; break; } // footer echo "
\n"; echo "

Reference manager and bibliography tool. Version $version

\n"; echo "
\n"; // close out the html echo " \n"; echo "\n"; ?> refdb-1.0.2/phpweb/css/000755 001750 001750 00000000000 12303477604 015525 5ustar00markusmarkus000000 000000 refdb-1.0.2/phpweb/images/000755 001750 001750 00000000000 12303477604 016202 5ustar00markusmarkus000000 000000 refdb-1.0.2/phpweb/includes/000755 001750 001750 00000000000 12303477604 016543 5ustar00markusmarkus000000 000000 refdb-1.0.2/phpweb/xsl/000755 001750 001750 00000000000 12303477604 015543 5ustar00markusmarkus000000 000000 refdb-1.0.2/phpweb/xsl/Makefile.in000644 001750 001750 00000031004 12303475767 017616 0ustar00markusmarkus000000 000000 # Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = phpweb/xsl DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/./conf/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/./conf/mkinstalldirs CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BIB2RIS = @BIB2RIS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ ULLSPEC = @ULLSPEC@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bib2ris_LDADD = @bib2ris_LDADD@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ classpath_root = @classpath_root@ client1_mans = @client1_mans@ client_bins = @client_bins@ client_etc_distobjects = @client_etc_distobjects@ client_etc_objects = @client_etc_objects@ client_mans = @client_mans@ client_scripts = @client_scripts@ client_subdirs = @client_subdirs@ datadir = @datadir@ datarootdir = @datarootdir@ db_dir = @db_dir@ docbk_xsl = @docbk_xsl@ docbk_xsl_ns = @docbk_xsl_ns@ docdir = @docdir@ docs_subdirs = @docs_subdirs@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ log_dir = @log_dir@ main_db = @main_db@ man_subdirs = @man_subdirs@ mandir = @mandir@ mkdir_p = @mkdir_p@ mybatik = @mybatik@ mydtdformat = @mydtdformat@ mydtdparse = @mydtdparse@ myjade = @myjade@ myperl = @myperl@ mysgrep = @mysgrep@ myshell = @myshell@ mysvnversion = @mysvnversion@ mytidy = @mytidy@ myxmlcatalog = @myxmlcatalog@ myxsltproc = @myxsltproc@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psarg = @psarg@ psdir = @psdir@ refdba_LDADD = @refdba_LDADD@ refdbc_LDADD = @refdbc_LDADD@ refdbd_LDADD = @refdbd_LDADD@ sbindir = @sbindir@ server8_mans = @server8_mans@ server_bins = @server_bins@ server_etc_distobjects = @server_etc_distobjects@ server_etc_objects = @server_etc_objects@ server_mans = @server_mans@ server_scripts = @server_scripts@ server_subdirs = @server_subdirs@ sgml_decl = @sgml_decl@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ svnversioncommand = @svnversioncommand@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ tei_xsl = @tei_xsl@ tei_xsl_ns = @tei_xsl_ns@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ trang_cmd = @trang_cmd@ var_dir = @var_dir@ xml_decl = @xml_decl@ objects = MARC21slim2English.xsl MARC21slim2RISX.xsl refdb-entry-parts.xsl refdb-entry-structure-buttons.xsl refdb-entry-structure.xsl EXTRA_DIST = $(objects) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu phpweb/xsl/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu phpweb/xsl/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-data-local install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags-am uninstall uninstall-am install-data-local: $(mkinstalldirs) $(DESTDIR)$(pkgdatadir)/www/xsl chmod 1777 $(DESTDIR)$(pkgdatadir)/www/xsl @for f in $(objects); do \ $(INSTALL_DATA) $$f $(DESTDIR)$(pkgdatadir)/www/xsl/$$f; \ done # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: refdb-1.0.2/phpweb/xsl/Makefile.am000644 001750 001750 00000000655 11512721655 017604 0ustar00markusmarkus000000 000000 ## Process this file with automake to produce Makefile.in objects = MARC21slim2English.xsl MARC21slim2RISX.xsl refdb-entry-parts.xsl refdb-entry-structure-buttons.xsl refdb-entry-structure.xsl EXTRA_DIST = $(objects) install-data-local: $(mkinstalldirs) $(DESTDIR)$(pkgdatadir)/www/xsl chmod 1777 $(DESTDIR)$(pkgdatadir)/www/xsl @for f in $(objects); do \ $(INSTALL_DATA) $$f $(DESTDIR)$(pkgdatadir)/www/xsl/$$f; \ done refdb-1.0.2/phpweb/xsl/MARC21slim2English.xsl000644 001750 001750 00001231734 11512721655 021453 0ustar00markusmarkus000000 000000

LEADER

  • Record Status (Leader 5):
  • Type of record (Leader 6):
  • Bibliographic level (Leader 7):
  • Type of control (Leader 8):
  • Character Encoding (Leader 9):
  • Encoding level (Leader 17):
  • Descriptive cataloging form (Leader 18):
  • Linked record requirement (Leader 19):

LIBRARY OF CONGRESS CONTROL NUMBER (010)

  • LC control number (a):
  • NUCMC control number (b):
  • Cancelled/invalid LC control number (z):

LINKING LIBRARY OF CONGRESS CONTROL NUMBER (011)

  • Linking LC control number (a):

PATENT CONTROL INFORMATION (013)

  • Number (a):
  • Country (b):
  • Type of number (c):
  • Date (d):
  • Status (e):
  • Party to document (f):
  • Linkage (6):

LINKAGE NUMBER (014)

  • Linkage number (a):
  • Source of number (b):
  • Cancelled/invalid linkage number (z):

NATIONAL BIBLIOGRAPHY NUMBER (015)

  • Linkage (6):
  • Field link and sequence number (8):
  • National bibliography number (a):

NATIONAL BIBLIOGRAPHIC AGENCY CONTROL NUMBER (016)

  • Field link and sequence number (8):
  • Record control number (a):
  • Canceled/invalid control number (z):
  • Source (2):

COPYRIGHT REGISTRATION NUMBER (017)

  • Copyright registration number (a):
  • Source (agency assigning number) (b):
  • Linkage (6):

COPYRIGHT ARTICLE-FEE CODE (018)

  • Copyright article-fee code (a):

INTERNATIONAL STANDARD BOOK NUMBER (020)

  • International Standard Book Number (a):
  • Binding information (b):
  • Terms of availability (c):
  • Cancelled/invalid ISBN (z):
  • Linkage (6):

INTERNATIONAL STANDARD SERIAL NUMBER (022)

  • International Standard Serial Number (a):
  • Incorrect ISSN (y):
  • Cancelled ISSN (z):
  • Linkage (6):

OTHER STANDARD IDENTIFIER (024)

  • Standard recording code (a):
  • Terms of availability (c):
  • Additional codes following the standard number or code (d):
  • Cancelled/invalid standard code (z):
  • Source of code or number (2):
  • Linkage (6):

OVERSEAS ACQUISITION NUMBER (025)

  • Overseas acquisition number (a):

STANDARD TECHNICAL REPORT NUMBER (027)

  • Standard Technical Report Number (a):
  • Cancelled/invalid STRN (z):

PUBLISHER NUMBER FOR MUSIC (028)

  • Publisher number (a):
  • Source (b):
  • Linkage (6):
  • Field link and sequence number (8):

CODEN DESIGNATION (030)

  • CODEN (a):
  • Cancelled/invalid CODEN (z):
  • Linkage (6):

POSTAL REGISTRATION NUMBER (032)

  • Postal registration number (a):
  • Source (agency assigning number) (b):
  • Linkage (6):

DATE/TIME AND PLACE OF AN EVENT (033)

  • Formatted date/time (a):
  • Geographic classification area code (b):
  • Geographic classification subarea code (c):
  • Materials specified (3):
  • Linkage (6):

CODED CARTOGRAPHIC MATHEMATICAL DATA (034)

  • Category of scale (a):
  • Constant ratio linear horizontal scale (b):
  • Constant ratio linear vertical scale (c):
  • Coordinates--westernmost longitude (d):
  • Coordinates--easternmost longitude (e):
  • Coordinates--northernmost latitude (f):
  • Coordinates--southernmost latitude (g):
  • Angular scale (h):
  • Declination--northern limit (j):
  • Declination--southern limit (k):
  • Right ascension--eastern limit (m):
  • Right ascension--western limit (n):
  • Equinox (p):
  • G-ring latitude (s):
  • G-ring longitude (t):
  • Linkage (6):

SYSTEM CONTROL NUMBER (035)

  • System control number (a):
  • Cancelled/invalid system control number (z):
  • Linkage (6):

ORIGINAL STUDY NUMBER FOR COMPUTER DATA FILES (036)

  • Original study number (a):
  • Source (agency assigning number) (b):
  • Linkage (6):

SOURCE OF ACQUISITION (037)

  • Stock number (a):
  • Source of stock number/acquisition (b):
  • Terms of availability (c):
  • Form of issue (f):
  • Additional format characteristics (g):
  • Note (n):
  • Linkage (6):

LEVEL OF BIBLIOGRAPHIC CONTROL AND CODING DETAIL (039)

  • Level of rules in bibliographic description (a):
  • Level of effort used to assign nonsubject heading access points (b):
  • Level of effort used to assign subject headings (c):
  • Level of effort used to assign classification (d):
  • Number of fixed field character positions coded (e):

CATALOGING SOURCE (040)

  • Original cataloging agency (a):
  • Language of cataloging (b):
  • Transcribing agency (c):
  • Modifying agency (d):
  • Description conventions (e):
  • Linkage (6):

LANGUAGE CODE (041)

  • Language code of text/sound track or separate title (a):
  • Language code of summary or abstract/overprinted title or subtitle (b):
  • Language code of sung or spoken text (d):
  • Language code of librettos (e):
  • Language code of table of contents (f):
  • Language code of accompanying material other than librettos (g):
  • Language code of original and/or intermediate translations of text (h):
  • Linkage (g):

AUTHENTICATION CODE (042)

  • Authentication code (a):

GEOGRAPHIC AREA CODE (043)

  • Linkage (6):
  • Field link and sequence number (8):
  • Geographic area code (a):
  • Local GAC code (b):
  • Source of local code (2):

COUNTRY OF PUBLISHING/PRODUCING ENTITY CODE (044)

  • Linkage (6):
  • Field link and sequence number (8):
  • Country of publishing/producing entity code (a):
  • Local subentity code (b):
  • ISO subentity code (c):
  • Source of local subentity data (2):

TIME PERIOD OF CONTENT (045)

  • Time period code (a):
  • Formatted 9999 B.C. through A.D. time period (b):
  • Formatted pre-9999 B.C. time period (c):

SPECIAL CODED DATES (046)

  • Type of date code (a):
  • Date 1 (B.C. date) (b):
  • Date 1 (A.D. date) (c):
  • Date 2 (B.C. date) (d):
  • Date 2 (A.D. date) (e):

FORM OF MUSICAL COMPOSITION CODE (047)

  • Form of musical composition code (a):

NUMBER OF MUSICAL INSTRUMENTS OR VOICES CODE (048)

  • Performer or ensemble (a):
  • Soloist (b):

LIBRARY OF CONGRESS CALL NUMBER (050)

  • Linkage (6):
  • Field link and number sequence (8):
  • Materials specified (3):
  • Classification number (a):
  • Item number (b):
  • Supplementary class number (d):

LIBRARY OF CONGRESS COPY, ISSUE, OFFPRINT STATEMENT (051)

  • Classification number (a):
  • Item number (b):
  • Copy information (c):

GEOGRAPHIC CLASSIFICATION (052)

  • Linkage (6):
  • Field Link and sequence number (8):
  • Geographic classification area code (a):
  • Geographic classification subarea code (b):
  • Subject (c):
  • Populated place name (d):
  • Code source (2):

CALL NUMBERS/CLASS NUMBERS ASSIGNED IN CANADA (055)

  • Classification number (a):
  • Item number (b):
  • Source of call/class number (2):

OTHER GEOGRAPHIC CLASSIFICATION CODE (058)

  • Geographic classification area code (a):
  • Geographic classification subarea code (b):
  • Code source (2):
  • Linkage (6):

NATIONAL LIBRARY OF MEDICINE CALL NUMBER (060)

  • Classification number (a):
  • Item number (b):

NATIONAL LIBRARY OF MEDICINE COPY STATEMENT (061)

  • Classification number (a):
  • Item number (b):
  • Copy information (c):

CHARACTER SETS PRESENT (066)

  • Non-ASCII G0 default character set designation (a):
  • Non-ANSEL G1 default character set designation (b):
  • Alternate graphic character set identification (c):

NATIONAL AGRICULTURAL LIBRARY CALL NUMBER (070)

  • Classification number (a):
  • Item number (b):

NATIONAL AGRICULTURAL LIBRARY COPY STATEMENT 071

  • Classification number (a):
  • Item number (b):
  • Copy information (c):

SUBJECT CATEGORY CODE 072

  • Subject category code (a):
  • Subject category code subdivision (x):
  • Code source (2):
  • Linkage (6):

TYPE OF PROGRAM OR ORGANIZATION CODE 073

  • Type of program or organization code (a):
  • Code source (2):
  • Linkage (6):

GPO ITEM NUMBER 074

  • GPO item number (a):
  • Cancelled/invalid GPO item number (z):

UNIVERSAL DECIMAL CLASSIFICATION NUMBER 080

  • Linkage (6):
  • Field Link and sequence number (8):
  • Universal Decimal Classification number (a):
  • Item number (b):
  • Common auxiliary subdivision (x):
  • Edition identifier (2):

DEWEY DECIMAL CALL NUMBER 082

  • Linkage (6):
  • Field Link and sequence number (8):
  • Classification number (a):
  • DDC number--abridged NST version (b):
  • Edition number (2):

OTHER CLASSIFICATION NUMBER 084

  • Classification number (a):
  • Item number (b):
  • Source of number (2):
  • Linkage (6):

GOVERNMENT DOCUMENT CLASSIFICATION NUMBER 086

  • Classification number (a):
  • Cancelled/invalid classification number (z):
  • Number source (2):
  • Linkage (6):
088

REPORT NUMBER

  • Report number (a):
  • Cancelled/invalid report number (z):
  • Linkage (6):

LOCAL CALL NUMBER 090

  • Local class number (a):
  • Local Cutter number (b):

MICROFILM SHELF LOCATION 091

  • Microfilm shelf location (a):

MAIN ENTRY--PERSONAL NAME 100

  • Linkage (6):
  • Field Link and sequence number (8):
  • Personal name (a):
  • Numeration (b):
  • Titles and other words associated with a name (c):
  • Dates associated with a name (d):
  • Relator term (e):
  • Date of a work (f):
  • Miscellaneous information (g):
  • Attribution qualifier (j):
  • Form subheading (k):
  • Language of a work (l):
  • Number of part/section of a work (n):
  • Name of part/section of a work (p):
  • Fuller form of name (q):
  • Title of a work (t):
  • Affiliation (u):
  • Relator code (4):

MAIN ENTRY--CORPORATE NAME 110

  • Corporate name or jurisdiction name as entry element (a):
  • Subordinate unit (b):
  • Location of meeting (c):
  • Date of meeting or treaty signing (d):
  • Relator term (e):
  • Date of a work (f):
  • Miscellaneous information (g):
  • Form subheading (k):
  • Language of a work (l):
  • Number of part/section/meeting (n):
  • Name of part/section of a work (p):
  • Title of a work (t):
  • Affiliation (u):
  • Relator code (4):
  • Linkage (6):

MAIN ENTRY--MEETING NAME 111

  • Meeting name or jurisdiction name as entry element (a):
  • Number (BK CF MP MU SE VM MX) (b):
  • Location of meeting (c):
  • Date of meeting (d):
  • Subordinate unit (e):
  • Date of a work (f):
  • Miscellaneous information (g):
  • Form subheading (k):
  • Language of a work (l):
  • Number of part/section/meeting (n):
  • Name of part/section of a work (p):
  • Name of meeting following jurisdiction name entry element (q):
  • Title of a work (t):
  • Affiliation (u):
  • Relator code (4):
  • Linkage (6):

MAIN ENTRY--UNIFORM TITLE 130

  • Uniform title (a):
  • Date of treaty signing (d):
  • Date of a work (f):
  • Miscellaneous information (g):
  • Medium (h):
  • Form subheading (k):
  • Language of a work (l):
  • Medium of performance for music (m):
  • Number of part/section of a work (n):
  • Arranged statement for music (o):
  • Name of part/section of a work (p):
  • Key for music (r):
  • Version (s):
  • Title of a work (t):
  • Linkage (6):

ABBREVIATED TITLE 210

  • Linkage (6):
  • Field Link and sequence number (8):
  • Abbreviated title (a):
  • Qualifying information (b):
  • Source (2):

ACRONYM OR SHORTENED TITLE 211

  • Acronym or shortened title (a):
  • Linkage (6):

VARIANT ACCESS TITLE 212

  • Variant access title (a):
  • Linkage (6):

AUGMENTED TITLE 214

  • Augmented title (a):
  • Linkage (6):

KEY TITLE 222

  • Key title (a):
  • Qualifying information (b):
  • Linkage (6):

UNIFORM TITLE 240

  • Uniform title (a):
  • Date of treaty signing (d):
  • Date of a work (f):
  • Miscellaneous information (g):
  • Medium (h):
  • Form subheading (k):
  • Language of a work (l):
  • Medium of performance for music (m):
  • Number of part/section of a work (n):
  • Arranged statement for music (o):
  • Name of part/section of a work (p):
  • Key for music (r):
  • Version (s):
  • Linkage (6):

ROMANIZED TITLE 241

  • Romanized title (a):
  • Medium (h):

TRANSLATION OF TITLE BY CATALOGING AGENCY 242

  • Title (a):
  • Remainder of title (b):
  • Remainder of title page transcription /statement of responsibility (c):
  • Designation of section (d):
  • Name of part/section (BK AM MP MU VM SE) (e):
  • Medium (h):
  • Number of part/section of a work (n):
  • Name of part/section of a work (p):
  • Language code of translated title (y):
  • Linkage (6):

COLLECTIVE UNIFORM TITLE 243

  • Uniform title (a):
  • Date of treaty signing (d):
  • Date of a work (f):
  • Miscellaneous information (g):
  • Medium (h):
  • Form subheading (k):
  • Language of a work (l):
  • Medium of performance for music (m):
  • Number of part/section of a work (n):
  • Arranged statement for music (o):
  • Name of part/section of a work (p):
  • Key for music (r):
  • Version (s):
  • Linkage (6):

TITLE STATEMENT 245

  • Linkage (6):
  • Field Link and sequence number (8):
  • Title (a):
  • Remainder of title (b):
  • Remainder of title page transcription/statement of responsibility (c):
  • Designation of section (d):
  • Name of part/section (SE) (e):
  • Inclusive dates (f):
  • Bulk dates (g):
  • Medium (h):
  • Form (k):
  • Number of part/section of a work (n):
  • Name of part/section of a work (p):
  • Version (s):

VARYING FORM OF TITLE 246

  • Title proper/short title (a):
  • Remainder of title (b):
  • Designation of section (d):
  • Name of part/section (SE) (e):
  • Designation of volume and issue number and/or date of a work (f):
  • Miscellaneous information (g):
  • Medium (h):
  • Display text (i):
  • Number of part/section of a work (n):
  • Name of part/section of a work (p):
  • Institution to which field applies (5):
  • Linkage (6):

FORMER TITLE OR TITLE VARIATIONS 247

  • Title proper/short title (a):
  • Remainder of title (b):
  • Designation of section (d):
  • Name of part/section (SE) (e):
  • Designation of volume and issue number and/or date of a work (f):
  • Miscellaneous information (g):
  • Medium (h):
  • Number of part/section of a work (n):
  • Name of part/section of a work (p):
  • International Standard Serial Number (x):
  • Linkage (6):

EDITION STATEMENT 250

  • Edition statement (a):
  • Remainder of edition statement (b):
  • Linkage (6):

MUSICAL PRESENTATION STATEMENT 254

  • Musical presentation statement (a):
  • Linkage (6):

CARTOGRAPHIC MATHEMATICAL DATA 255

  • Statement of scale (a):
  • Statement of projection (b):
  • Statement of coordinates (c):
  • Statement of zone (d):
  • Statement of equinox (e):
  • Outer G-ring coordinate pairs (f):
  • Exclusion G-ring coordinate pairs (g):
  • Linkage (6):

COMPUTER FILE CHARACTERISTICS 256

  • Computer file characteristics (a):
  • Linkage (6):

COUNTRY OF PRODUCING ENTITY FOR ARCHIVAL FILMS 257

  • Country of producing entity for archival films (a):
  • Linkage (6):

PUBLICATION, DISTRIBUTION, ETC. (IMPRINT) 260

  • Place of publication, distribution, etc. (a):
  • Name of publisher, distributor, etc. (b):
  • Date of publication, distribution, etc. (c):
  • Place of manufacture (e):
  • Manufacturer (f):
  • Date of manufacture (g):
  • Linkage (6):
  • Field Link and sequence number (8):

PROJECTED PUBLICATION DATE 263

  • Linkage (6):
  • Field Link and sequence number (8):
  • Projected publication date (a):

SOURCE FOR ACQUISITION/SUBSCRIPTION ADDRESS 265

  • Source for acquisition/subscription address (a):
  • Linkage (6):

ADDRESS 270

  • Address (a):
  • 270-b = City (m):
  • State or province (c):
  • Country (d):
  • Postal code (e):
  • Title preceding attention name (f):
  • Attention name (g):
  • Title following attention name (h):
  • Type of address (i):
  • Specialized telephone number (j):
  • Telephone number (k):
  • Fax number (l):
  • Electronic mail address (m):
  • TDD or TTY number (n):
  • Contact person (p):
  • Title of contact person (q):
  • Hours (r):
  • Public note (z):
  • Relator code (4):
  • Linkage (6):

PHYSICAL DESCRIPTION 300

  • Extent (a):
  • Other physical details (b):
  • Dimensions (c):
  • Accompanying material (e):
  • Type of unit (f):
  • Size of unit (g):
  • Materials specified (3):
  • Linkage (6):

PHYSICAL DESCRIPTION FOR FILMS (PRE-AACR 2) 301

  • Extent of item (a):
  • Sound characteristics (b):
  • Color characteristics (c):
  • Dimensions (d):
  • Accompanying material (e):
  • Speed (f):

PAGE OR ITEM COUNT 302

  • Page count (a):

SUBORDINATE ENTITIES 303

  • Name or description (a):
  • Schedule (b):
  • Location (c):
  • Contact person (p):
  • Linkage (6):

LINEAR FOOTAGE 304

  • Linear footage (a):

PHYSICAL DESCRIPTION FOR SOUND RECORDINGS (Pre-AACR 2) 305

  • Extent (a):
  • Other physical details (b):
  • Dimensions (c):
  • Microgroove or standard (d):
  • Stereophonic, monaural (e):
  • Number of tracks (f):
  • Serial identification (m):
  • Matrix and/or take number (n):
  • Linkage (6):

PLAYING TIME 306

  • Playing time (a):

HOURS, ETC. 307

  • Hours (a):
  • Additional information (b):
  • Linkage (6):

PHYSICAL DESCRIPTION FOR FILMS (ARCHIVAL) 308

  • Number of reels (a):
  • Footage (b):
  • Sound characteristics (c):
  • Color characteristics (d):
  • Width (e):
  • Presentation format (f):
  • Linkage (6):

CURRENT PUBLICATION FREQUENCY 310

  • Current publication frequency (a):
  • Date of current publication frequency (b):
  • Linkage (6):

MEETING ROOMS AND FACILITIES AVAILABLE 311

  • General description of facilities (a):
  • Name and location (b):
  • Physical description (c):
  • Capacity (d):
  • Equipment available (e):
  • Rental fee (f):
  • Special restrictions (g):
  • Accommodations for the disabled (h):
  • Miscellaneous information (m):
  • Contact person (p):
  • Linkage (6):

EQUIPMENT AVAILABLE 312

  • Type of equipment (a):
  • Brand name (b):
  • Physical description (c):
  • Rental fee (f):
  • Special restrictions (g):
  • Accommodations for the disabled (h):
  • Miscellaneous information (m):
  • Contact person (p):
  • Linkage (6):

FREQUENCY 315

  • Frequency (a)
  • Dates of frequency (b):
  • Linkage (6):

FORMER PUBLICATION FREQUENCY 321

  • Former publication frequency (a):
  • Dates of former publication frequency (b):
  • Linkage (6):

PHYSICAL MEDIUM 340

  • Material base and configuration (a):
  • Dimensions (b):
  • Materials applied to surface (c):
  • Information recording technique (d):
  • Support (e):
  • Production rate/ratio (f):
  • Location within medium (h):
  • Technical specifications of medium (i):
  • Materials specified (3):
  • Linkage (6):

GEOSPATIAL REFERENCE DATA 342

  • Name (a):
  • Coordinate or distance units (b):
  • Latitude resolution (c):
  • Longitude resolution (d):
  • Standard parallel or oblique line latitude (e):
  • Oblique line longitude (f):
  • Longitude of central meridian or projection center (g):
  • Latitude of projection origin or projection center (h):
  • False easting (i):
  • False northing (j):
  • Scale factor (k):
  • Height of perspective point above surface (l):
  • Azimuthal angle (m):
  • Azimuth measure point longitude or straight vertical longitude from pole (n):
  • Landsat number and path number (o):
  • Zone identifier (p):
  • Ellipsoid name (q):
  • Semi-major axis (r):
  • Denominator of flattening ratio (s):
  • Vertical resolution (t):
  • Vertical encoding method (u):
  • Local planar, local, or other projection or grid description (v):
  • Local planar or local georeference information (w):
  • Reference method used (2):
  • Linkage (6):

PLANAR COORDINATE DATA 343

  • Planar coordinate encoding method (a):
  • Planar distance units (b):
  • Abscissa resolution (c):
  • Ordinate resolution (d):
  • Distance resolution (e):
  • Bearing resolution (f):
  • Bearing units (g):
  • Bearing reference direction (h):
  • Bearing reference meridian (i):
  • Linkage (6):
  • ICE (=):

ORGANIZATION AND ARRANGEMENT OF MATERIALS 351

  • Organization (a):
  • Arrangement (b):
  • Hierarchical level (c):
  • Materials specified (3):
  • Linkage (6):

DIGITAL GRAPHIC REPRESENTATION 352

  • Direct reference method (a):
  • Object type (b):
  • Object count (c):
  • Row count (d):
  • Column count (e):
  • Vertical count (g):
  • Indirect reference description (i):
  • Linkage (6):

SECURITY CLASSIFICATION CONTROL 355

  • Linkage (6):
  • Field Link and sequence number (8):
  • Security classification (a):
  • Handling instructions (b):
  • External dissemination information (c):
  • Downgrading or declassification event (d):
  • Classification system (e):
  • Country of origin code (f):
  • Downgrading date (g):
  • Declassification date (h):
  • Authorization (j):

ORIGINATOR DISSEMINATION CONTROL 357

  • Originator control term (a):
  • Originating agency (b):
  • Authorized recipients of material (c):
  • Other restrictions (g):
  • Linkage (6):

RENTAL PRICE 359

  • Rental price (a):

DATES OF PUBLICATION AND/OR SEQUENTIAL DESIGNATION 362

  • Linkage (6):
  • Field Link and sequence number (8):
  • Dates of publication and/or sequential designation (a):
  • Source of information (z):

SERIES STATEMENT/ADDED ENTRY--TITLE 440

  • Title (a):
  • Number of part/section of a work (n):
  • Name of part/section of a work (p):
  • Volume number/sequential designation (v):
  • International Standard Serial Number (x):
  • Linkage (6):

SERIES STATEMENT 490

  • Series statement (a):
  • Library of Congress call number (l):
  • Volume number/sequential designation (v):
  • International Standard Serial Number (x):
  • Linkage (6):

GENERAL NOTE 500

  • General note (a):
  • Library of Congress call number (l):
  • International Standard Serial Number (x):
  • Source of note information (z):
  • Materials specified (3):
  • Institution to which field applies (5):
  • Linkage (6):

WITH NOTE 501

  • With note (a):
  • Institution to which field applies (5):
  • Linkage (6):

DISSERTATION NOTE 502

  • Dissertation note (a):
  • Linkage (6):

BIBLIOGRAPHIC HISTORY NOTE 503

  • Bibliographic history note (a):
  • Linkage (6):

BIBLIOGRAPHY, ETC. NOTE 504

  • Bibliography, etc. note (a):
  • Number of references (b):
  • Linkage (6):

FORMATTED CONTENTS NOTE 505

  • Linkage (6):
  • Field Link and sequence number (8):
  • Formatted contents note (a):
  • Miscellaneous information (g):
  • Statement of responsibility (r):
  • Title (t):
  • Uniform Resource Identifier (u):

RESTRICTIONS ON ACCESS NOTE 506

  • Materials specified (3):
  • Linkage (6):
  • Field Link and sequence number (8):
  • Terms governing access (a):
  • Jurisdiction (b):
  • Physical access provisions (c):
  • Authorized users (d):
  • Authorization (e):
  • Institution to which field applies (5):

SCALE NOTE FOR GRAPHIC MATERIAL 507

  • Representative fraction of scale note (a):
  • Remainder of scale note (b):
  • Linkage (6):

CREATION/PRODUCTION CREDITS NOTE 508

  • Creation/production credits note (a):
  • Linkage (6):

CITATION/REFERENCES NOTE 510

  • Name of source (a):
  • Dates of coverage of source (b):
  • Location within source (c):
  • International Standard Serial Number (x):
  • Materials specified (3):
  • Linkage (6):

PARTICIPANT OR PERFORMER NOTE 511

  • Participant or performer note (a):
  • Linkage (6):

EARLIER OR LATER VOLUMES SEPARATELY CATALOGED NOTE 512

  • Earlier or later volumes separately cataloged note (a):
  • Linkage (6):

TYPE OF REPORT AND PERIOD COVERED NOTE 513

  • Type of report (a):
  • Period covered (b):
  • Linkage (6):

DATA QUALITY NOTE 514

  • Linkage (6):
  • Field Link and sequence number (8):
  • Attribute accuracy report (a):
  • Attribute accuracy value (b):
  • Attribute accuracy explanation (c):
  • Logical consistency report (d):
  • Completeness report (e):
  • Horizontal position accuracy report (f):
  • Horizontal position accuracy value (g):
  • Horizontal position accuracy explanation (h):
  • Vertical positional accuracy report (i):
  • Vertical positional accuracy value (j):
  • Vertical positional accuracy explanation (k):
  • Cloud cover (m):
  • Uniform Resource Identifier (u):
  • Display note (z):

NUMBERING PECULIARITIES NOTE 515

  • Numbering peculiarities note (a):
  • Linkage (6):
  • Source of note information (z):

TYPE OF COMPUTER FILE OR DATA NOTE 516

  • Type of computer file or data note (a):
  • Linkage (6):

CATEGORIES OF FILMS NOTE (ARCHIVAL) 517

  • Different formats (a):
  • Content descriptors (b):
  • Additional animation techniques (c):

DATE/TIME AND PLACE OF AN EVENT NOTE 518

  • Date/time and place of an event note (a):
  • Materials specified (3):
  • Linkage (6):

SUMMARY, ETC. 520

  • Linkage (6):
  • Field Link and sequence number (8):
  • Materials specified (3):
  • Summary, etc. (a):
  • Expansion of summary note (b):
  • Uniform Resource Identifier (u):
  • Source of note information (z):

TARGET AUDIENCE NOTE 521

  • Target audience note (a):
  • Source (b):
  • Materials specified (3):
  • Linkage (6):

GEOGRAPHIC COVERAGE NOTE 522

  • Linkage (6):
  • Field Link and sequence number (8):
  • Geographic coverage note (a):

TIME PERIOD OF CONTENT NOTE 523

  • Time period of content note (a):
  • Dates of data collection note (b):
  • Linkage (6):

PREFERRED CITATION OF DESCRIBED MATERIALS NOTE 524

  • Preferred citation of described materials note (a):
  • Source of schema used (2):
  • Materials specified (3):
  • Linkage (6):

SUPPLEMENT NOTE 525

  • Supplement note (a):
  • Linkage (6):
  • Source of note information (z):

STUDY PROGRAM INFORMATION NOTE 526

  • Linkage (6):
  • Field and sequence number (8):
  • Program name (a):
  • Interest level (b):
  • Reading level (c):
  • Title point value (d):
  • Display text (i):
  • Nonpublic note (x):
  • Public note (z):
  • Institution to which field applies (5):

CENSORSHIP NOTE 527

  • Censorship note (a):
  • Linkage (6):

ADDITIONAL PHYSICAL FORM AVAILABLE NOTE 530

  • Linkage (6):
  • Field Link and sequence number (8):
  • Materials specified (3):
  • Additional physical form available note (a):
  • Availability source (b):
  • Availability conditions (c):
  • Order number (d):
  • Uniform Resource Identifier (u):
  • Source of note information (z):

ELIGIBILITY, FEES, PROCEDURES NOTE 531

  • Eligibility (a):
  • Fee (b):
  • Admission procedures (c):
  • Documents required (d):
  • Waiting list (e):
  • Waiting period (f):
  • Linkage (6):

REPRODUCTION NOTE 533

  • Type of reproduction (a):
  • Place of reproduction (b):
  • Agency responsible for reproduction (c):
  • Date of reproduction (d):
  • Physical description of reproduction (e):
  • Series statement of reproduction (f):
  • Dates of publication and/or sequential designation of issues reproduced (m):
  • Note about reproduction (n):
  • Materials specified (3):
  • Linkage (6):
  • Fixed-length data elements of reproduction (7):

ORIGINAL VERSION NOTE 534

  • Main entry of original (a):
  • Edition statement of original (b):
  • Publication, distribution, etc. of original (c):
  • Physical description, etc. of original (e):
  • Series statement of original (f):
  • Key title of original (k):
  • Location of original (l):
  • Material specific details (m):
  • Note about original (n):
  • Introductory phrase (p):
  • Title statement of original (t):
  • International Standard Serial Number (x):
  • International Standard Book Number (z):
  • Linkage (6):

LOCATION OF ORIGINALS/DUPLICATES NOTE 535

  • Custodian (a):
  • Postal address (b):
  • Country (c):
  • Telecommunications address (d):
  • Repository location code (g):
  • Materials specified (3):
  • Linkage (6):

FUNDING INFORMATION NOTE 536

  • Linkage (6):
  • Field Link and sequence number (8):
  • Text of note (a):
  • Contract number (b):
  • Grant number (c):
  • Undifferentiated number (d):
  • Program element number (e):
  • Project number (f):
  • Task number (g):
  • Work unit number (h):

SOURCE OF DATA NOTE 537

  • Source of data note (a):
  • Linkage (6):

SYSTEM DETAILS NOTE 538

  • System details note (a):
  • Linkage (6):

TERMS GOVERNING USE AND REPRODUCTION NOTE 540

  • Terms governing use and reproduction (a):
  • Jurisdiction (b):
  • Authorization (c):
  • Authorized users (d):
  • Materials specified (3):
  • Institution to which field applies (5):
  • Linkage (6):

IMMEDIATE SOURCE OF ACQUISITION NOTE 541

  • Source of acquisition (a):
  • Address (b):
  • Method of acquisition (c):
  • Date of acquisition (d):
  • Accession number (e):
  • Owner (f):
  • Purchase price (h):
  • Extent (n):
  • Type of unit (o):
  • Materials specified (3):
  • Institution to which field applies (5):
  • Linkage (6):

SOLICITATION INFORMATION NOTE 543

  • Solicitation information note (a):
  • Linkage (6):

LOCATION OF OTHER ARCHIVAL MATERIALS NOTE 544

  • Materials specified (3):
  • Linkage (6):
  • Field Link and sequence number (8):
  • Custodian (a):
  • Address (b):
  • Country (c):
  • Title (d):
  • Provenance (e):
  • Note (n):

BIOGRAPHICAL OR HISTORICAL DATA 545

  • Linkage (6):
  • Field Link and sequence number (8):
  • Biographical or historical data (a):
  • Expansion (b):
  • Uniform Resource Identifier (u):

LANGUAGE NOTE 546

  • Language note (a):
  • Information code or alphabet (b):
  • Source of note information (z):
  • Materials specified (3):
  • Linkage (6):

FORMER TITLE COMPLEXITY NOTE 547

  • Former title complexity note (a):
  • Source of note information (z):
  • Linkage (6):

ISSUING BODY NOTE 550

  • Issuing body note (a):
  • Source of note information (z):
  • Linkage (6):

ENTITY AND ATTRIBUTE INFORMATION NOTE 552

  • Linkage (6):
  • Field Link and sequence number (8):
  • Entity type label (a):
  • Entity type definition and source (b):
  • Attribute label (c):
  • Attribute definition and source (d):
  • Enumerated domain value (e):
  • Enumerated domain value definition and source (f):
  • Range domain minimum and maximum (g):
  • Codeset name and source (h):
  • Unrepresentable domain (i):
  • Attribute units of measurement and resolution (j):
  • Beginning date and ending date of attribute values (k):
  • Attribute value accuracy (l):
  • Attribute value accuracy explanation (m):
  • Attribute measurement frequency (n):
  • Entity and attribute overview (o):
  • Entity and attribute detail citation (p):
  • Uniform Resource Identifier (u):
  • Display note (z):

CUMULATIVE INDEX/FINDING AIDS NOTE 555

  • Linkage (6):
  • Field Link and sequence number (8):
  • Materials specified (3):
  • Cumulative index/finding aids note (a):
  • Availability source (b):
  • Degree of control (c):
  • Bibliographic reference (d):
  • Uniform Resource Identifier (u):

INFORMATION ABOUT DOCUMENTATION NOTE 556

  • Information about documentation note (a):
  • International Standard Book Number (z):
  • Linkage (6):

OWNERSHIP AND CUSTODIAL HISTORY 561

  • History (a):
  • Time of collation (b):
  • Materials specified (3):
  • Institution to which field applies (5):
  • Linkage (6):

COPY AND VERSION IDENTIFICATION NOTE 562

  • Identifying markings (a):
  • Copy identification (b):
  • Version identification (c):
  • Presentation format (d):
  • Number of copies (e):
  • Materials specified (3):
  • Institution to which field applies (5):
  • Linkage (6):

CASE FILE CHARACTERISTICS NOTE 565

  • Number of cases/variables (a):
  • Name of variable (b):
  • Unit of analysis (c):
  • Universe of data (d):
  • Filing scheme or code (e):
  • Materials specified (3):
  • Linkage (6):

METHODOLOGY NOTE 567

  • Methodology note (a):
  • Linkage (6):

EDITOR NOTE 570

  • Editor note (a):
  • Source of note information (z):
  • Linkage (6):

VOLUNTEERS NOTE 571

  • Volunteers note (a):
  • Special requirements (b):
  • Linkage (6):

AFFILIATION AND OTHER RELATIONSHIPS NOTE 572

  • Affiliation and other relationships note (a):
  • Linkage (6):

CREDENTIALS NOTE 573

  • Credentials note (a):
  • Linkage (6):

TRANSPORTATION AND DIRECTIONS NOTE 574

  • Transportation and directions note (a):
  • Linkage (6):

ACCOMMODATIONS FOR THE DISABLED NOTE 575

  • Accommodations for the disabled note (a):
  • Linkage (6):

SERVICES AVAILABLE NOTE 576

  • Services available note (a):
  • Linkage (6):

LINKING ENTRY COMPLEXITY NOTE 580

  • Linking entry complexity note (a):
  • Source of note information (z):
  • Linkage (6):

PUBLICATIONS ABOUT DESCRIBED MATERIALS NOTE 581

  • Publications about described materials note (a):
  • International Standard Book Number (z):
  • Materials specified (3):
  • Linkage (6):

RELATED COMPUTER FILES NOTE 582

  • Related computer files note (a):
  • Linkage (6):

ACTION NOTE 583

  • Linkage (6):
  • Link and sequence number (8):
  • Materials specified (3):
  • Action (a):
  • Action identification (b):
  • Time of action (c):
  • Action interval (d):
  • Contingency for action (e):
  • Authorization (f):
  • Jurisdiction (h):
  • Method of action (i):
  • Site of action (j):
  • Action agent (k):
  • Status (l):
  • Extent (n):
  • Type of unit (o):
  • Uniform Resource Identifier (u):
  • Nonpublic note (x):
  • Public note (z):
  • Source of item (2):
  • Institution to which field applies (5):

ACCUMULATION AND FREQUENCY OF USE NOTE 584

  • Accumulation (a):
  • Frequency of use (b):
  • Materials specified (3):
  • Institution to which field applies (5):
  • Linkage (6):

EXHIBITIONS NOTE 585

  • Exhibitions note (a):
  • Materials specified (3):
  • Institution to which field applies (5):
  • Linkage (6):

AWARDS NOTE 586

  • Awards note (a):
  • Materials specified (3):
  • Linkage (6):

OTHER INFORMATION AVAILABLE NOTE 587

  • Other information available note (a):
  • Linkage (6):

LOCAL NOTE 590

  • Local note (a):
  • Provenance (b):
  • Condition of individual reels (d):

SUBJECT ADDED ENTRY--PERSONAL NAME 600

  • Materials specified (3):
  • Linkage (6):
  • Field Link and sequence number (8):
  • Personal name (a):
  • Numeration (b):
  • Titles and other words associated with a name (c):
  • Dates associated with a name (d):
  • Relator term (e):
  • Date of a work (f):
  • Miscellaneous information (g):
  • Medium (h):
  • Attribution qualifier (j):
  • Form subheading (k):
  • Language of a work (l):
  • Medium of performance for music (m):
  • Number of part/section of a work (n):
  • Arranged statement for music (o):
  • Name of part/section of a work (p):
  • Fuller form of name (q):
  • Key for music (r):
  • Version (s):
  • Title of a work (t):
  • Affiliation (u):
  • Form subdivision (v):
  • General subdivision (x):
  • Chronological subdivision (y):
  • Geographic subdivision (z):
  • Source of heading or term (2):
  • Relator code (4):

SUBJECT ADDED ENTRY--CORPORATE NAME 610

  • Corporate name or jurisdiction name as entry element (a):
  • Subordinate unit (b):
  • Location of meeting (c):
  • Date of meeting or treaty signing (d):
  • Relator term (e):
  • Date of a work (f):
  • Miscellaneous information (g):
  • Medium (h):
  • Form subheading (k):
  • Language of a work (l):
  • Medium of performance for music (m):
  • Number of part/section/meeting (n):
  • Arranged statement for music (o):
  • Name of part/section of a work (p):
  • Key for music (r):
  • Version (s):
  • Title of a work (t):
  • Affiliation (u):
  • Form subdivision (v):
  • General subdivision (x):
  • Chronological subdivision (y):
  • Geographic subdivision (z):
  • Source of heading or term (2):
  • Materials specified (3):
  • Relator code (4):
  • Linkage (6):

SUBJECT ADDED ENTRY--MEETING NAME 611

  • Meeting name or jurisdiction name as entry element (a):
  • Number (BK CF MP MU SE VM MX) (b):
  • Location of meeting (c):
  • Date of meeting (d):
  • Subordinate unit (e):
  • Date of a work (f):
  • Miscellaneous information (g):
  • Medium (h):
  • Form subheading (k):
  • Language of a work (l):
  • Number of part/section/meeting (n):
  • Name of part/section of a work (p):
  • Name of meeting following jurisdiction name entry element (q):
  • Version (s):
  • Title of a work (t):
  • Affiliation (u):
  • Form subdivision (v):
  • General subdivision (x):
  • Chronological subdivision (y):
  • Geographic subdivision (z):
  • Source of heading or term (2):
  • Materials specified (3):
  • Relator code (4):
  • Linkage (6):

SUBJECT ADDED ENTRY--UNIFORM TITLE 630

  • Uniform title (a):
  • Date of treaty signing (d):
  • Date of a work (f):
  • Miscellaneous information (g):
  • Medium (h):
  • Form subheading (k):
  • Language of a work (l):
  • Medium of performance for music (m):
  • Number of part/section of a work (n):
  • Arranged statement for music (o):
  • Name of part/section of a work (p):
  • Key for music (r):
  • Version (s):
  • Title of a work (t):
  • Form subdivision (v):
  • General subdivision (x):
  • Chronological subdivision (y):
  • Geographic subdivision (z):
  • Source of heading or term (2):
  • Materials specified (3):
  • Linkage (6):

SUBJECT ADDED ENTRY--TOPICAL TERM 650

  • Topical term or geographic name as entry element (a):
  • Topical term following geographic name as entry element (b):
  • Location of event (c):
  • Active dates (d):
  • Relator term (e):
  • Form subdivision (v):
  • General subdivision (x):
  • Chronological subdivision (y):
  • Geographic subdivision (z):
  • Source of heading or term (2):
  • Materials specified (3):
  • Linkage (6):

SUBJECT ADDED ENTRY--GEOGRAPHIC NAME 651

  • Geographic name (a):
  • Geographic name following place entry element (b):
  • Form subdivision (v):
  • General subdivision (x):
  • Chronological subdivision (y):
  • Geographic subdivision (z):
  • Source of heading or term (2):
  • Materials specified (3):
  • Linkage (6):

SUBJECT ADDED ENTRY--REVERSED GEOGRAPHIC 652

  • Geographic name of place element (a):
  • General subdivision (x):
  • Chronological subdivision (y):
  • Geographic subdivision (z):

INDEX TERM--UNCONTROLLED 653

  • Uncontrolled term (a):
  • Linkage (6):

SUBJECT ADDED ENTRY--FACETED TOPICAL TERMS 654

  • Focus term (a):
  • Non-focus term (b):
  • Facet/hierarchy designation (c):
  • Form subdivision (v):
  • Chronological subdivision (y):
  • Geographic subdivision (z):
  • Source of heading or term (2):
  • Material specified (3):

INDEX TERM--GENRE/FORM/PHYSICAL CHARACTERISTICS 655

  • Linkage (6):
  • Field Link and sequence number (8):
  • Materials specified (3):
  • Genre/form/physical characteristics (a):
  • Non-focus term (b):
  • Facet/hierarchy designation (c):
  • Form subdivision (v):
  • General subdivision (x):
  • Chronological subdivision (y):
  • Geographic subdivision (z):
  • Source of term (2):
  • Institution to which field applies (5):

INDEX TERM--OCCUPATION 656

  • Occupation (a):
  • Form (k):
  • Form subdivision (v):
  • General subdivision (x):
  • Chronological subdivision (y):
  • Geographic subdivision (z):
  • Source of term (2):
  • Materials specified (3):
  • Linkage (6):

INDEX TERM--FUNCTION 657

  • Function (a):
  • Form subdivision (v):
  • General subdivision (x):
  • Chronological subdivision (y):
  • Geographic subdivision (z):
  • Source of term (2):
  • Materials specified (3):
  • Linkage (6):

INDEX TERM--CURRICULUM OBJECTIVE 658

  • Main curriculum objective (a):
  • Subordinate curriculum objective (b):
  • Curriculum code (c):
  • Correlation factor (d):
  • Source of term (2):
  • Linkage (6):

ADDED ENTRY--PERSONAL NAME 700

  • Materials specified (3):
  • Linkage (6):
  • Field Link and sequence number (8):
  • Personal name (a):
  • Numeration (b):
  • Titles and other words associated with a name (c):
  • Dates associated with a name (d):
  • Relator term (e):
  • Date of a work (f):
  • Miscellaneous information (g):
  • Medium (h):
  • Attribution qualifier (j):
  • Form subheading (k):
  • Language of a work (l):
  • Medium of performance for music (m):
  • Number of part/section of a work (n):
  • Arranged statement for music (o):
  • Name of part/section of a work (p):
  • Fuller form of name (q):
  • Key for music (r):
  • Version (s):
  • Title of a work (t):
  • Affiliation (u):
  • International Standard Serial Number (x):
  • Relator code (4):
  • Institution to which field applies (5):

ADDED ENTRY--PERSONAL NAME (PERFORMER) 705

  • Personal name (a):
  • Numeration (b):
  • Titles and other words associated with a name (c):
  • Dates associated with a name (d):
  • Relator term (e):
  • Date of a work (f):
  • Miscellaneous information (g):
  • Medium (h):
  • Form subheading (k):
  • Language of a work (l):
  • Medium of performance for music (m):
  • Number of part/section of a work (n):
  • Arranged statement for music (o):
  • Name of part/section of a work (p):
  • Key for music (r):
  • Version (s):
  • Title of a work (t):

ADDED ENTRY--CORPORATE NAME 710

  • Corporate name or jurisdiction name as entry element (a):
  • Subordinate unit (b):
  • Location of meeting (c):
  • Date of meeting or treaty signing (d):
  • Relator term (e):
  • Date of a work (f):
  • Miscellaneous information (g):
  • Medium (h):
  • Form subheading (k):
  • Language of a work (l):
  • Medium of performance for music (m):
  • Number of part/section/meeting (n):
  • Arranged statement for music (o):
  • Name of part/section of a work (p):
  • Key for music (r):
  • Version (s):
  • Title of a work (t):
  • Affiliation (u):
  • International Standard Serial Number (x):
  • Materials specified (3):
  • Relator code (4):
  • Institution to which field applies (5):
  • Linkage (6):

ADDED ENTRY--MEETING NAME 711

  • Meeting name or jurisdiction name as entry element (a):
  • Number (BK CF MP MU SE VM MX) (b):
  • Location of meeting (c):
  • Date of meeting (d):
  • Subordinate unit (e):
  • Date of a work (f):
  • Miscellaneous information (g):
  • Medium (h):
  • Form subheading (k):
  • Language of a work (l):
  • Number of part/section/meeting (n):
  • Name of part/section of a work (p):
  • Name of meeting following jurisdiction name entry element (q):
  • Version (s):
  • Title of a work (t):
  • Affiliation (u):
  • International Standard Serial Number (x):
  • Materials specified (3):
  • Relator code (4):
  • Institution to which field applies (5):
  • Linkage (6):

ADDED ENTRY--CORPORATE NAME-PERFORMING GROUP 715

  • Corporate name or jurisdiction name (a):
  • Subordinate unit (b):
  • Relator term (e):
  • Date of a work (f):
  • Miscellaneous information (g):
  • Medium (h):
  • Form subheading (k):
  • Language of a work (l):
  • Medium of performance for music (m):
  • Number of part/section/meeting (n):
  • Arranged statement for music (o):
  • Name of part/section of a work (p):
  • Key for music (r):
  • Version (s):
  • Title of a work (t):
  • Nonprinting information (u):

ADDED ENTRY--UNCONTROLLED NAME 720

  • Name (a):
  • Relator term (e):
  • Relator code (4):
  • Linkage (6):

ADDED ENTRY--UNIFORM TITLE 730

  • Uniform title (a):
  • Date of treaty signing (d):
  • Date of a work (f):
  • Miscellaneous information (g):
  • Medium (h):
  • Form subheading (k):
  • Language of a work (l):
  • Medium of performance for music (m):
  • Number of part/section of a work (n):
  • Arranged statement for music (o):
  • Name of part/section of a work (p):
  • Key for music (r):
  • Version (s):
  • Title of a work (t):
  • International Standard Serial Number (x):
  • Materials specified (3):
  • Institution to which field applies (5):
  • Linkage (6):

ADDED ENTRY--UNCONTROLLED RELATED/ANALYTICAL TITLE 740

  • Uncontrolled related/analytical title (a):
  • Medium (h):
  • Number of part/section of a work (n):
  • Name of part/section of a work (p):
  • Institution to which field applies (5):
  • Linkage (6):

ADDED ENTRY--HIERARCHICAL PLACE NAME 752

  • Country (a):
  • State, province, territory (b):
  • County, region, islands area (c):
  • City (d):
  • Linkage (6):

SYSTEM DETAILS ACCESS TO COMPUTER FILES 753

  • Make and model of machine (a):
  • Programming language (b):
  • Operating system (c):
  • Linkage (6):

ADDED ENTRY--TAXONOMIC IDENTIFICATION 754

  • Taxonomic name/taxonomic hierarchical category (a):
  • Source of taxonomic identification (2):
  • Linkage (6):

ADDED ENTRY--PHYSICAL CHARACTERISTICS

  • Access term (a):
  • General subdivision (x):
  • Chronological subdivision (y):
  • Geographic subdivision (z):
  • Source of term (2):
  • Materials specified (3):
  • Linkage (6):

MAIN SERIES ENTRY 760

  • Main entry heading (a):
  • Edition (b):
  • Qualifying information (c):
  • Place, publisher, and date of publication (d):
  • Relationship information (g):
  • Display text(i):
  • Physical description (h):
  • Material-specific details (m):
  • Note (n):
  • Other item identifier (o):
  • Parallel title (q):
  • Uniform title (s):
  • Title (t):
  • Record control number (w):
  • International Standard Serial Number (x):
  • CODEN designation (y):
  • Linkage (6):
  • Control subfield (7):

SUBSERIES ENTRY 762

  • Main entry heading (a):
  • Edition (b):
  • Qualifying information (c):
  • Place, publisher, and date of publication (d):
  • Relationship information (g):
  • Physical description of source (h):
  • Display text (i):
  • Material-specific details (m):
  • Note (n):
  • Other item identifier (o):
  • Parallel title (q):
  • Uniform title (s):
  • Title (t):
  • Record control number (w):
  • International Standard Serial Number (x):
  • CODEN designation (y):
  • Linkage (6):
  • Control subfield (7):

ORIGINAL LANGUAGE ENTRY 765

  • Main entry heading (a):
  • Edition (b):
  • Qualifying information (c):
  • Place, publisher, and date of publication (d):
  • Relationship information (g):
  • Physical description of source (h):
  • Display text (i):
  • Series data for related item (k):
  • Material-specific details (m):
  • Note (n):
  • Other item identifier (o):
  • Parallel title (q):
  • Report number (r):
  • Uniform title (s):
  • Title (t):
  • Standard Technical Report Number (u):
  • Record control number (w):
  • International Standard Serial Number (x):
  • CODEN designation (y):
  • International Standard Book Number (z):
  • Linkage (6):
  • Control subfield (7):

TRANSLATION ENTRY 767

  • Main entry heading (a):
  • Edition (b):
  • Qualifying information (c):
  • Place, publisher, and date of publication (d):
  • Relationship information (g):
  • Physical description of source (h):
  • Display text (i):
  • Series data for related item (k):
  • Material-specific details (m):
  • Note (n):
  • Other item identifier (o):
  • Parallel title (q):
  • Report number (r):
  • Uniform title (s):
  • Title (t):
  • Standard Technical Report Number (u):
  • Record control number (w):
  • International Standard Serial Number (x):
  • CODEN designation (y):
  • International Standard Book Number (z):
  • Linkage (6):
  • Control subfield (7):

SUPPLEMENT/SPECIAL ISSUE ENTRY 770

  • Main entry heading (a):
  • Edition (b):
  • Qualifying information (c):
  • Place, publisher, and date of publication (d):
  • Relationship information (g):
  • Physical description of source (h):
  • Display text (i):
  • Series data for related item (k):
  • Material-specific details (m):
  • Note (n):
  • Other item identifier (o):
  • Parallel title (q):
  • Report number (r):
  • Uniform title (s):
  • Title (t):
  • Standard Technical Report Number (u):
  • Record control number (w):
  • International Standard Serial Number (x):
  • CODEN designation (y):
  • International Standard Book Number (z):
  • Linkage (6):
  • Control subfield (7):

PARENT RECORD ENTRY

  • Main entry heading:
  • Edition:
  • Qualifying information (c):
  • Place, publisher, and date of publication:
  • Relationship information:
  • Physical description of source:
  • Display text:
  • Series data for related item:
  • Material-specific details:
  • Note:
  • Other item identifier:
  • Parallel title:
  • Report number:
  • Uniform title (s):
  • Title (t):
  • Standard Technical Report Number:
  • Record control number:
  • International Standard Serial Number (x):
  • CODEN designation:
  • International Standard Book Number:
  • Linkage (6):
  • Control subfield:

HOST ITEM ENTRY

  • Main entry heading:
  • Edition:
  • Place, publisher, and date of publication:
  • Relationship information:
  • Physical description of source:
  • Display text:
  • Series data for related item:
  • Material-specific details:
  • Note:
  • Other item identifier:
  • Abbreviated title (p):
  • Report number:
  • Uniform title (s):
  • Title (t):
  • Standard Technical Report Number:
  • Record control number:
  • International Standard Serial Number (x):
  • CODEN designation:
  • International Standard Book Number:
  • Materials specified (3):
  • Linkage (6):
  • Control subfield:

CONSTITUENT UNIT ENTRY

  • Main entry heading:
  • Edition:
  • Qualifying information (c):
  • Place, publisher, and date of publication:
  • Relationship information:
  • Physical description of source:
  • Display text:
  • Series data for related item:
  • Material-specific details:
  • Note:
  • Other item identifier:
  • Report number:
  • Uniform title (s):
  • Title (t):
  • Standard Technical Report Number:
  • Record control number:
  • International Standard Serial Number (x):
  • CODEN designation:
  • International Standard Book Number:
  • Linkage (6):
  • Control subfield:

OTHER EDITION ENTRY

  • Main entry heading:
  • Edition:
  • Qualifying information (c):
  • Place, publisher, and date of publication:
  • Language code:
  • Country code:
  • Relationship information:
  • Physical description of source:
  • Display text:
  • Series data for related item:
  • Material-specific details:
  • Note:
  • Other item identifier:
  • Parallel title:
  • Report number:
  • Uniform title (s):
  • Title (t):
  • Standard Technical Report Number:
  • Record control number:
  • International Standard Serial Number (x):
  • CODEN designation:
  • International Standard Book Number:
  • Linkage (6):
  • Control subfield:

ADDITIONAL PHYSICAL FORM ENTRY

  • Main entry heading:
  • Edition:
  • Qualifying information (c):
  • Place, publisher, and date of publication:
  • Relationship information:
  • Physical description of source:
  • Display text:
  • Series data for related item:
  • Material-specific details:
  • Note:
  • Other item identifier:
  • Parallel title:
  • Report number:
  • Uniform title (s):
  • Title (t):
  • Standard Technical Report Number:
  • Record control number:
  • International Standard Serial Number (x):
  • CODEN designation:
  • International Standard Book Number:
  • Linkage (6):
  • Control subfield:

ISSUED WITH ENTRY

  • Main entry heading:
  • Edition:
  • Qualifying information (c):
  • Place, publisher, and date of publication:
  • Relationship information:
  • Physical description of source:
  • Display text:
  • Series data for related item:
  • Material-specific details:
  • Note:
  • Other item identifier:
  • Parallel title:
  • Uniform title (s):
  • Title (t):
  • Record control number:
  • International Standard Serial Number (x):
  • CODEN designation:
  • Linkage (6):
  • Control subfield:

PRECEDING ENTRY

  • Main entry heading:
  • Edition:
  • Qualifying information (c):
  • Place, publisher, and date of publication:
  • Relationship information:
  • Physical description of source:
  • Display text:
  • Series data for related item:
  • Material-specific details:
  • Note:
  • Other item identifier:
  • Parallel title:
  • Report number:
  • Uniform title (s):
  • Title (t):
  • Standard Technical Report Number:
  • Record control number:
  • International Standard Serial Number (x):
  • CODEN designation:
  • International Standard Book Number:
  • Linkage (6):
  • Control subfield:

SUCCEEDING ENTRY

  • Main entry heading:
  • Edition:
  • Qualifying information (c):
  • Place, publisher, and date of publication:
  • Relationship information:
  • Physical description of source:
  • Display text:
  • Series data for related item:
  • Material-specific details:
  • Note:
  • Other item identifier:
  • Parallel title:
  • Report number:
  • Uniform title (s):
  • Title (t):
  • Standard Technical Report Number:
  • Record control number:
  • International Standard Serial Number (x):
  • CODEN designation:
  • International Standard Book Number:
  • Linkage (6):
  • Control subfield:

ISSUED WITH ENTRY

  • Linkage (6):
  • Control subfield:
  • Field Link and sequence number (8):
  • Main entry heading:
  • Edition:
  • Qualifying information (c):
  • Place, publisher, and date of publication:
  • Relationship information:
  • Physical description:
  • Display text:
  • Period of content:
  • Series data for related item:
  • Material-specific details:
  • Note:
  • Other item identifier:
  • Abbreviated title (p):
  • Report number:
  • Uniform title (s):
  • Title (t):
  • Standard Technical Report Number:
  • Source contribution:
  • Record control number:
  • International Standard Serial Number (x):
  • CODEN designation:
  • International Standard:

NONSPECIFIC RELATIONSHIP ENTRY

  • Main entry heading:
  • Edition:
  • Qualifying information (c):
  • Place, publisher, and date of publication:
  • Relationship information:
  • Physical description of source:
  • Display text:
  • Series data for related item:
  • Material-specific details:
  • Note:
  • Other item identifier:
  • Parallel title:
  • Report number:
  • Uniform title (s):
  • Title (t):
  • Standard Technical Report Number:
  • Record control number:
  • International Standard Serial Number (x):
  • CODEN designation:
  • International Standard Book Number:
  • Linkage (6):
  • Control subfield:

SERIES ADDED ENTRY--PERSONAL NAME

  • Linkage (6):
  • Field Link and sequence number (8):
  • Personal name (a):
  • Numeration (b):
  • Titles and other words associated with a name (c):
  • Dates associated with a name (d):
  • Relator term (e):
  • Date of a work (f):
  • Miscellaneous information (g):
  • Medium (h):
  • Attribution qualifier (j):
  • Form subheading (k):
  • Language of a work (l):
  • Medium of performance for music (m):
  • Number of part/section of a work (n):
  • Arranged statement for music (o):
  • Name of part/section of a work (p):
  • Fuller form of name (q):
  • Key for music (r):
  • Version (s):
  • Title of a work (t):
  • Affiliation (u):
  • Volume number/sequential designation (v):
  • Relator code (4):

SERIES ADDED ENTRY--CORPORATE NAME

  • Corporate name or jurisdiction name as entry element (a):
  • Subordinate unit (b):
  • Location of meeting (c):
  • Date of meeting or treaty signing (d):
  • Relator term (e):
  • Date of a work (f):
  • Miscellaneous information (g):
  • Medium (h):
  • Form subheading (k):
  • Language of a work (l):
  • Medium of performance for music (m):
  • Number of part/section/meeting (n):
  • Arranged statement for music (o):
  • Name of part/section of a work (p):
  • Key for music (r):
  • Version (s):
  • Title of a work (t):
  • Affiliation (u):
  • Volume number/sequential designation (v):
  • Relator code (4):
  • Linkage (6):

SERIES ADDED ENTRY--MEETING NAME

  • Meeting name or jurisdiction name as entry element (a):
  • Number (BK CF MP MU SE VM MX) (b):
  • Location of meeting (c):
  • Date of meeting (d):
  • Subordinate unit (e):
  • Date of a work (f):
  • Miscellaneous information (g):
  • Medium (h):
  • Form subheading (k):
  • Language of a work (l):
  • Number of part/section/meeting (n):
  • Name of part/section of a work (p):
  • Name of meeting following jurisdiction name entry element (q):
  • Version (s):
  • Title of a work (t):
  • Affiliation (u):
  • Volume number/sequential designation (v):
  • Relator code (4):
  • Linkage (6):

SERIES ADDED ENTRY--UNIFORM TITLE

  • Uniform title (a):
  • Date of treaty signing (d):
  • Date of a work (f):
  • Miscellaneous information (g):
  • Medium (h):
  • Form subheading (k):
  • Language of a work (l):
  • Medium of performance for music (m):
  • Number of part/section of a work (n):
  • Arranged statement for music (o):
  • Name of part/section of a work (p):
  • Key for music (r):
  • Version (s):
  • Title of a work (t):
  • Volume number/sequential designation (v):
  • Linkage (6):

SERIES ADDED ENTRY--TITLE

  • Title (a):
  • Medium (h):
  • Volume or number:

HOLDINGS CODED DATA VALUES

  • Type of record:
  • Fixed-length data elements:
  • Encoding level:

TEXTUAL PHYSICAL FORM DESIGNATOR

  • Textual physical form designator:

REPRODUCTION NOTE

  • Type of reproduction:
  • Place of reproduction:
  • Agency responsible for reproduction:
  • Date of reproduction:
  • Physical description of reproduction:
  • Series statement of reproduction:
  • Dates of publication and/or sequential designation of issues reproduced:
  • Note about reproduction:
  • Materials specified (3):
  • Fixed-length data elements of reproduction:

NAME OF UNIT

  • Name of unit:

TERMS GOVERNING USE AND REPRODUCTION NOTE

  • Terms governing use and reproduction:
  • Jurisdiction:
  • Authorization:
  • Authorized users:
  • Materials specified (3):

HOLDING INSTITUTION

  • Holding institution:
  • Holdings:
  • Inclusive dates (f):
  • Retention statement:

LOCATION

  • Name (custodian or owner):
  • Institutional division:
  • Street address:
  • Country:
  • Location of units:
  • Item number (f):
  • Repository location code:
  • Materials specified (3):
  • Linkage (6):

LOCATION/CALL NUMBER

  • Location:
  • Sublocation or collection:
  • Shelving location:
  • Address:
  • Coded location qualifier:
  • = Qualifier type:
  • = Number of units 1-9:
  • = Unit type:
  • Non-coded location qualifier:
  • Classification part:
  • Item part:
  • Shelving control number:
  • Call number prefix:
  • Shelving form of title:
  • Call number suffix:
  • Country code:
  • Piece designation:
  • Piece physical condition:
  • Copyright article-fee code:
  • Copy number:
  • Nonpublic note:
  • Public note:
  • Source of classification or shelving scheme:
  • Materials specified (3):
  • Link and sequence number (8):

CAPTIONS AND PATTERN--BASIC BIBLIOGRAPHIC UNIT

  • First level of enumeration:
  • Second level of enumeration:
  • Third level of enumeration:
  • Fourth level of enumeration:
  • Fifth level of enumeration:
  • Sixth level of enumeration:
  • Alternative numbering scheme, first level of enumeration:
  • Alternative numbering scheme, second level of enumeration:
  • First level of chronology:
  • Second level of chronology:
  • Third level of chronology:
  • Fourth level of chronology:
  • Alternative numbering scheme, chronology:
  • Copy:
  • Bibliographic units per next higher level:
  • Numbering continuity:
  • Frequency:
  • Calendar change:
  • Regularity pattern:
  • Materials specified (3):
  • Link and sequence number (8):

CAPTIONS AND PATTERN--SUPPLEMENTARY MATERIAL

  • First level of enumeration:
  • Second level of enumeration:
  • Third level of enumeration:
  • Fourth level of enumeration:
  • Fifth level of enumeration:
  • Sixth level of enumeration:
  • Alternative numbering scheme, first level of enumeration:
  • Alternative numbering scheme, second level of enumeration:
  • First level of chronology:
  • Second level of chronology:
  • Third level of chronology:
  • Fourth level of chronology:
  • Alternative numbering scheme, chronology:
  • Type of supplementary material:
  • Copy:
  • Bibliographic units per next higher level:
  • Numbering continuity:
  • Frequency:
  • Calendar change:
  • Regularity pattern:
  • Materials specified (3):
  • Link and sequence number (8):

CAPTIONS AND PATTERN--INDEXES

  • First level of enumeration:
  • Second level of enumeration:
  • Third level of enumeration:
  • Fourth level of enumeration:
  • Fifth level of enumeration:
  • Sixth level of enumeration:
  • Alternative numbering scheme, first level of enumeration:
  • Alternative numbering scheme, second level of enumeration:
  • First level of chronology:
  • Second level of chronology:
  • Third level of chronology:
  • Fourth level of chronology:
  • Alternative numbering scheme, chronology:
  • Type of index:
  • Copy:
  • Bibliographic units per next higher level:
  • Numbering continuity:
  • Frequency:
  • Calendar change:
  • Regularity pattern:
  • Materials specified (3):
  • Link and sequence number (8):

ELECTRONIC LOCATION AND ACCESS

  • Linkage (6):
  • Field Link and sequence number (8):
  • Materials specified (3):
  • Host name:
  • Access number:
  • Compression information:
  • Path:
  • Electronic name:
  • Uniform resource name:
  • Processor of request:
  • Instruction:
  • Bits per second:
  • Password:
  • Logon:
  • Contact for access assistance:
  • Name of location of host in subfield $a:
  • Operating system:
  • Port:
  • Electronic format type :
  • Settings:
  • File size:
  • Terminal emulation:
  • Uniform Resource Identifier:
  • Hours access method available:
  • Record control number:
  • Nonpublic note:
  • Link text :
  • Public note:
  • Access method:

ENUMERATION AND CHRONOLOGY--BASIC BIBLIOGRAPHIC UNIT

  • First level of enumeration:
  • Second level of enumeration:
  • Third level of enumeration:
  • Fourth level of enumeration:
  • Fifth level of enumeration:
  • Sixth level of enumeration:
  • Alternative numbering scheme, first level of enumeration:
  • Alternative numbering scheme, second level of enumeration:
  • First level of chronology:
  • Second level of chronology:
  • Third level of chronology:
  • Fourth level of chronology:
  • Alternative numbering scheme, chronology:
  • Converted Gregorian year:
  • Piece designation:
  • Piece physical condition:
  • Copyright article-fee code:
  • Copy number:
  • Break indicator:
  • Nonpublic note:
  • Public note:
  • Link and sequence number (8):

ENUMERATION AND CHRONOLOGY--SUPPLEMENTARY MATERIAL

  • First level of enumeration:
  • Second level of enumeration:
  • Third level of enumeration:
  • Fourth level of enumeration:
  • Fifth level of enumeration:
  • Sixth level of enumeration:
  • Alternative numbering scheme, first level of enumeration:
  • Alternative numbering scheme, second level of enumeration:
  • First level of chronology:
  • Second level of chronology:
  • Third level of chronology:
  • Fourth level of chronology:
  • Alternative numbering scheme, chronology:
  • Converted Gregorian year:
  • Title of supplementary material:
  • Piece designation:
  • Piece physical condition:
  • Copyright article-fee code:
  • Copy number:
  • Break indicator:
  • Nonpublic note:
  • Public note:
  • Link and sequence number (8):

ENUMERATION AND CHRONOLOGY--INDEXES

  • First level of enumeration:
  • Second level of enumeration:
  • Third level of enumeration:
  • Fourth level of enumeration:
  • Fifth level of enumeration:
  • Sixth level of enumeration:
  • Alternative numbering scheme, first level of enumeration:
  • Alternative numbering scheme, second level of enumeration:
  • First level of chronology:
  • Second level of chronology:
  • Third level of chronology:
  • Fourth level of chronology:
  • Alternative numbering scheme, chronology:
  • Converted Gregorian year:
  • Title of index:
  • Piece designation:
  • Piece physical condition:
  • Copyright article-fee code:
  • Copy number:
  • Break indicator:
  • Nonpublic note:
  • Public note:
  • Link and sequence number (8):

TEXTUAL HOLDINGS--BASIC BIBLIOGRAPHIC UNIT

  • Textual string:
  • Nonpublic note:
  • Public note:
  • Link and sequence number (8):

TEXTUAL HOLDINGS--SUPPLEMENTARY MATERIAL

  • Textual holdings:
  • Nonpublic note:
  • Public note:
  • Link and sequence number (8):

TEXTUAL HOLDINGS--INDEXES

  • Textual holdings:
  • Nonpublic note:
  • Public note:
  • Link and sequence number (8):

VARIANT PERSONAL NAME

  • Personal name (a):
  • Numeration (b):
  • Titles and other words associated with a name (c):
  • Dates associated with a name (d):
  • Relator term (e):
  • Date of a work (f):
  • Miscellaneous information (g):
  • Tag and sequence number of the field for which 870 is a variant(R):
  • Form subheading (k):
  • Language of a work (l):
  • Number of part/section of a work (n):
  • Name of part/section of a work (p):
  • Fuller form of name (q):
  • Title of a work (t):
  • Affiliation (u):
  • Relator code (4):
  • Linkage (6):

VARIANT CORPORATE NAME

  • Corporate name or jurisdiction name as entry element (a):
  • Subordinate unit (b):
  • Location of meeting (c):
  • Date of meeting or treaty signing (d):
  • Relator term (e):
  • Date of a work (f):
  • Miscellaneous information (g):
  • Tag and sequence number of the field for which 871 is a variant(R):
  • Form subheading (k):
  • Language of a work (l):
  • Number of part/section/meeting (n):
  • Name of part/section of a work (p):
  • Title of a work (t):
  • Affiliation (u):
  • Relator code (4):
  • Linkage (6):

VARIANT CONFERENCE OR MEETING NAME

  • Meeting name or jurisdiction name as entry element (a):
  • Number (BK CF MP MU SE VM MX) (b):
  • Location of meeting (c):
  • Date of meeting (d):
  • Subordinate unit (e):
  • Date of a work (f):
  • Miscellaneous information (g):
  • Tag and sequence number of the field for which 872 is a variant(R):
  • Form subheading (k):
  • Language of a work (l):
  • Number of part/section/meeting (n):
  • Name of part/section of a work (p):
  • Name of meeting following jurisdiction name entry element (q):
  • Title of a work (t):
  • Affiliation (u):
  • Relator code (4):
  • Linkage (6):

VARIANT UNIFORM TITLE HEADING

  • Uniform title (a):
  • Date of treaty signing (d):
  • Date of a work (f):
  • Miscellaneous information (g):
  • Medium (h):
  • Tag and sequence number of the field for which 873 is a variant(R):
  • Form subheading (k):
  • Language of a work (l):
  • Medium of performance for music (m):
  • Number of part/section of a work (n):
  • Arranged statement for music (o):
  • Name of part/section of a work (p):
  • Key for music (r):
  • Version (s):
  • Title of a work (t):
  • Linkage (6):

ITEM INFORMATION--BASIC BIBLIOGRAPHIC UNIT

  • Internal item number (a):
  • Invalid or cancelled internal item number (b):
  • Cost:
  • Date acquired:
  • Source of acquisition:
  • Use restrictions:
  • Item status:
  • Temporary location:
  • Piece designation:
  • Invalid or cancelled piece designation:
  • Copy number:
  • Nonpublic note:
  • Public note:
  • Materials specified (3):
  • Link and sequence number (8):

ITEM INFORMATION--SUPPLEMENTARY MATERIAL

  • Internal item number:
  • Invalid or cancelled internal item number:
  • Cost:
  • Date acquired:
  • Source of acquisition:
  • Use restrictions:
  • Item status:
  • Temporary location:
  • Piece designation:
  • Invalid or cancelled piece designation:
  • Copy number:
  • Nonpublic note:
  • Public note:
  • Materials specified (3):
  • Link and sequence number (8):

ITEM INFORMATION--INDEXES

  • Internal item number:
  • Invalid or cancelled internal item number:
  • Cost:
  • Date acquired:
  • Source of acquisition:
  • Use restrictions:
  • Item status:
  • Temporary location:
  • Piece designation:
  • Invalid or cancelled piece designation:
  • Copy number:
  • Nonpublic note:
  • Public note:
  • Materials specified (3):
  • Link and sequence number (8):

ALTERNATE GRAPHIC REPRESENTATION

  • Linkage (6):
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Undefined; each contains blank (#):
  • Undefined; each contains blank (#):
  • Undefined; each contains blank (#):

FOREIGN MARC INFORMATION FIELD

  • Tag of the foreign MARC field/Foreign MARC subfield:
  • Content of the foreign MARC field/Foreign MARC subfield:
  • Source of data:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
refdb-1.0.2/phpweb/xsl/MARC21slim2RISX.xsl000644 001750 001750 00000647706 11512721655 020660 0ustar00markusmarkus000000 000000

LEADER

BOOK MUSIC MAP ADVS SOUND ART DATA GEN GEN

INTERNATIONAL STANDARD BOOK NUMBER

  • International Standard Book Number:

INTERNATIONAL STANDARD SERIAL NUMBER

  • International Standard Serial Number:

STANDARD TECHNICAL REPORT NUMBER

  • Standard Technical Report Number:

PUBLISHER NUMBER FOR MUSIC

  • Publisher number:
  • Source:

DATE/TIME AND PLACE OF AN EVENT

  • Formatted date/time:
  • Geographic classification area code:
  • Geographic classification subarea code:
  • Materials specified:
  • Linkage:

ORIGINAL STUDY NUMBER FOR COMPUTER DATA FILES

  • Original study number:
  • Source (agency assigning number):
  • Linkage:

COUNTRY OF PUBLISHING/PRODUCING ENTITY CODE

  • Country of publishing/producing entity code:
  • Local subentity code:
  • ISO subentity code:

LIBRARY OF CONGRESS CALL NUMBER

  • Classification number:
  • Item number:
  • Supplementary class number:

CALL NUMBERS/CLASS NUMBERS ASSIGNED IN CANADA

  • Classification number:
  • Item number:

NATIONAL LIBRARY OF MEDICINE CALL NUMBER

  • Classification number:
  • Item number:

NATIONAL AGRICULTURAL LIBRARY CALL NUMBER

  • Classification number:
  • Item number:

SUBJECT CATEGORY CODE

  • Subject category code:
  • Subject category code subdivision:

UNIVERSAL DECIMAL CLASSIFICATION NUMBER

  • Linkage:
  • Field link and sequence number:
  • Universal Decimal Classification number:
  • Item number:
  • Common auxiliary subdivision:
  • Edition identifier:

DEWEY DECIMAL CALL NUMBER

  • Linkage:
  • Field link and sequence number:
  • Classification number:
  • DDC number--abridged NST version:
  • Edition number:

GOVERNMENT DOCUMENT CLASSIFICATION NUMBER

  • Classification number:
  • Cancelled/invalid classification number:
  • Number source:
  • Linkage:

REPORT NUMBER

  • Report number:
  • Cancelled/invalid report number:
  • Linkage:

LOCAL CALL NUMBER

  • Local class number:
  • Local Cutter number:

MICROFILM SHELF LOCATION

  • Microfilm shelf location:

MAIN ENTRY--PERSONAL NAME

  • Personal name:
  • Titles and other words associated with a name:
  • Dates associated with a name:
  • Relator term:
  • Attribution qualifier:
  • Form subheading:
  • Number of part/section of a work:
  • Name of part/section of a work:
  • Fuller form of name:
  • Title of a work:
  • Affiliation:
  • Relator code:

MAIN ENTRY--CORPORATE NAME

  • Corporate name or jurisdiction name as entry element:
  • Subordinate unit:
  • Location of meeting:
  • Date of meeting or treaty signing:
  • Relator term:
  • Date of a work:
  • Miscellaneous information:
  • Form subheading:
  • Number of part/section/meeting:
  • Name of part/section of a work:
  • Title of a work:
  • Affiliation:
  • Relator code:

MAIN ENTRY--MEETING NAME

  • Meeting name or jurisdiction name as entry element:
  • Number (BK CF MP MU SE VM MX):
  • Location of meeting:
  • Date of meeting:
  • Subordinate unit:
  • Date of a work:
  • Miscellaneous information:
  • Form subheading:
  • Number of part/section/meeting:
  • Name of part/section of a work:
  • Name of meeting following jurisdiction name entry element:
  • Title of a work:
  • Affiliation:
  • Relator code:

MAIN ENTRY--UNIFORM TITLE

  • Uniform title:
  • Date of treaty signing:
  • Date of a work:
  • Form subheading:
  • Medium of performance for music:
  • Number of part/section of a work:
  • Arranged statement for music:
  • Name of part/section of a work:
  • Key for music:
  • Version:
  • Title of a work:

ABBREVIATED TITLE

  • Field link and sequence number:
  • Abbreviated title:
  • Qualifying information:

ACRONYM OR SHORTENED TITLE

  • Acronym or shortened title:

VARIANT ACCESS TITLE

  • Variant access title:

AUGMENTED TITLE

  • Augmented title:

KEY TITLE

  • Key title:
  • Qualifying information:

UNIFORM TITLE

  • Uniform title:
  • Date of treaty signing:
  • Date of a work:
  • Medium:
  • Form subheading:
  • Medium of performance for music:
  • Number of part/section of a work:
  • Arranged statement for music:
  • Name of part/section of a work:
  • Key for music:
  • Version:

ROMANIZED TITLE

  • Romanized title:
  • Medium:

COLLECTIVE UNIFORM TITLE

  • Uniform title:
  • Date of treaty signing:
  • Date of a work:
  • Medium:
  • Form subheading:
  • Medium of performance for music:
  • Number of part/section of a work:
  • Arranged statement for music:
  • Name of part/section of a work:
  • Key for music:
  • Version:

TITLE STATEMENT

  • Title:
  • Remainder of title:
  • Remainder of title page transcription/statement of responsibility:
  • Designation of section:
  • Name of part/section (SE):
  • Inclusive dates:
  • Bulk dates:
  • Medium:
  • Form:
  • Number of part/section of a work:
  • Name of part/section of a work:
  • Version:

VARYING FORM OF TITLE

  • Title proper/short title:
  • Remainder of title:
  • Designation of section:
  • Name of part/section (SE):
  • Designation of volume and issue number and/or date of a work:
  • Miscellaneous information:
  • Medium:
  • Display text:
  • Number of part/section of a work:
  • Name of part/section of a work:
  • Institution to which field applies:
  • Linkage:

FORMER TITLE OR TITLE VARIATIONS

  • Title proper/short title:
  • Remainder of title:
  • Designation of section:
  • Name of part/section (SE):
  • Designation of volume and issue number and/or date of a work:
  • Miscellaneous information:
  • Medium:
  • Number of part/section of a work:
  • Name of part/section of a work:
  • International Standard Serial Number:
  • Linkage:

EDITION STATEMENT

  • Edition statement:
  • Remainder of edition statement:
  • Linkage:

MUSICAL PRESENTATION STATEMENT

  • Musical presentation statement:
  • Linkage:

CARTOGRAPHIC MATHEMATICAL DATA

  • Statement of scale:
  • Statement of projection:
  • Statement of coordinates:
  • Statement of zone:
  • Statement of equinox:
  • Outer G-ring coordinate pairs:
  • Exclusion G-ring coordinate pairs:
  • Linkage:

COMPUTER FILE CHARACTERISTICS

  • Computer file characteristics:
  • Linkage:

COUNTRY OF PRODUCING ENTITY FOR ARCHIVAL FILMS

  • Country of producing entity for archival films:
  • Linkage:

PUBLICATION, DISTRIBUTION, ETC. (IMPRINT)

  • Place of publication, distribution, etc.:
  • Name of publisher, distributor, etc.:
  • Date of publication, distribution, etc.:
  • Place of manufacture:
  • Manufacturer:
  • Date of manufacture:
  • Linkage:
  • Field link and sequence number:

PROJECTED PUBLICATION DATE

  • Linkage:
  • Field link and sequence number:
  • Projected publication date:

DATES OF PUBLICATION AND/OR SEQUENTIAL DESIGNATION

  • Linkage:
  • Field link and sequence number:
  • Dates of publication and/or sequential designation:
  • Source of information:

SERIES STATEMENT/ADDED ENTRY--TITLE

  • Title:
  • Number of part/section of a work:
  • Name of part/section of a work:
  • Volume number/sequential designation:
  • International Standard Serial Number:
  • Linkage:

SERIES STATEMENT

  • Series statement:
  • Library of Congress call number:
  • Volume number/sequential designation:
  • International Standard Serial Number:
  • Linkage:

GENERAL NOTE

  • General note:
  • Library of Congress call number:
  • International Standard Serial Number:
  • Source of note information:
  • Materials specified:
  • Institution to which field applies:
  • Linkage:

WITH NOTE

  • With note:
  • Institution to which field applies:
  • Linkage:

DISSERTATION NOTE

  • Dissertation note:
  • Linkage:

BIBLIOGRAPHIC HISTORY NOTE

  • Bibliographic history note:
  • Linkage:

BIBLIOGRAPHY, ETC. NOTE

  • Bibliography, etc. note:
  • Number of references:
  • Linkage:

FORMATTED CONTENTS NOTE

  • Linkage:
  • Field link and sequence number:
  • Formatted contents note:
  • Miscellaneous information:
  • Statement of responsibility:
  • Title:
  • Uniform Resource Identifier:

CREATION/PRODUCTION CREDITS NOTE

  • Creation/production credits note:
  • Linkage:

PARTICIPANT OR PERFORMER NOTE

  • Participant or performer note:
  • Linkage:

EARLIER OR LATER VOLUMES SEPARATELY CATALOGED NOTE

  • Earlier or later volumes separately cataloged note:
  • Linkage:

TYPE OF REPORT AND PERIOD COVERED NOTE

  • Type of report:
  • Period covered:
  • Linkage:

NUMBERING PECULIARITIES NOTE

  • Numbering peculiarities note:
  • Linkage:
  • Source of note information:

TYPE OF COMPUTER FILE OR DATA NOTE

  • Type of computer file or data note:
  • Linkage:

CATEGORIES OF FILMS NOTE (ARCHIVAL)

  • Different formats:
  • Content descriptors:
  • Additional animation techniques:

SUMMARY, ETC.

  • Linkage:
  • Field link and sequence number:
  • Materials specified:
  • Summary, etc.:
  • Expansion of summary note:
  • Uniform Resource Identifier:
  • Source of note information:

PREFERRED CITATION OF DESCRIBED MATERIALS NOTE

  • Preferred citation of described materials note:
  • Source of schema used:
  • Materials specified:
  • Linkage:

SUPPLEMENT NOTE

  • Supplement note:
  • Linkage:
  • Source of note information:

REPRODUCTION NOTE

  • Type of reproduction:
  • Place of reproduction:
  • Agency responsible for reproduction:
  • Date of reproduction:
  • Physical description of reproduction:
  • Series statement of reproduction:
  • Dates of publication and/or sequential designation of issues reproduced:
  • Note about reproduction:
  • Materials specified:
  • Linkage:
  • Fixed-length data elements of reproduction:

ORIGINAL VERSION NOTE

  • Main entry of original:
  • Edition statement of original:
  • Publication, distribution, etc. of original:
  • Physical description, etc. of original:
  • Series statement of original:
  • Key title of original:
  • Location of original:
  • Material specific details:
  • Note about original:
  • Introductory phrase:
  • Title statement of original:
  • International Standard Serial Number:
  • International Standard Book Number:
  • Linkage:

BIOGRAPHICAL OR HISTORICAL DATA

  • Linkage:
  • Field link and sequence number:
  • Biographical or historical data:
  • Expansion:
  • Uniform Resource Identifier:

LANGUAGE NOTE

  • Language note:
  • Information code or alphabet:
  • Source of note information:
  • Materials specified:
  • Linkage:

FORMER TITLE COMPLEXITY NOTE

  • Former title complexity note:
  • Source of note information:
  • Linkage:

ISSUING BODY NOTE

  • Issuing body note:
  • Source of note information:
  • Linkage:

ENTITY AND ATTRIBUTE INFORMATION NOTE

  • Linkage:
  • Field link and sequence number:
  • Entity type label:
  • Entity type definition and source:
  • Attribute label:
  • Attribute definition and source:
  • Enumerated domain value:
  • Enumerated domain value definition and source:
  • Range domain minimum and maximum:
  • Codeset name and source:
  • Unrepresentable domain:
  • Attribute units of measurement and resolution:
  • Beginning date and ending date of attribute values:
  • Attribute value accuracy:
  • Attribute value accuracy explanation:
  • Attribute measurement frequency:
  • Entity and attribute overview:
  • Entity and attribute detail citation:
  • Uniform Resource Identifier:
  • Display note:

EDITOR NOTE

  • Editor note:
  • Source of note information:
  • Linkage:

VOLUNTEERS NOTE

  • Volunteers note:
  • Special requirements:
  • Linkage:

AFFILIATION AND OTHER RELATIONSHIPS NOTE

  • Affiliation and other relationships note:
  • Linkage:

CREDENTIALS NOTE

  • Credentials note:
  • Linkage:

RELATED COMPUTER FILES NOTE

  • Related computer files note:
  • Linkage:

SUBJECT ADDED ENTRY--PERSONAL NAME

  • Materials specified:
  • Linkage:
  • Field link and sequence number:
  • Personal name:
  • Numeration:
  • Titles and other words associated with a name:
  • Dates associated with a name:
  • Relator term:
  • Date of a work:
  • Miscellaneous information:
  • Medium:
  • Attribution qualifier:
  • Form subheading:
  • Language of a work:
  • Medium of performance for music:
  • Number of part/section of a work:
  • Arranged statement for music:
  • Name of part/section of a work:
  • Fuller form of name:
  • Key for music:
  • Version:
  • Title of a work:
  • Affiliation:
  • Form subdivision:
  • General subdivision:
  • Chronological subdivision:
  • Geographic subdivision:
  • Source of heading or term:
  • Relator code:

SUBJECT ADDED ENTRY--CORPORATE NAME

  • Corporate name or jurisdiction name as entry element:
  • Subordinate unit:
  • Location of meeting:
  • Date of meeting or treaty signing:
  • Relator term:
  • Date of a work:
  • Miscellaneous information:
  • Medium:
  • Form subheading:
  • Language of a work:
  • Medium of performance for music:
  • Number of part/section/meeting:
  • Arranged statement for music:
  • Name of part/section of a work:
  • Key for music:
  • Version:
  • Title of a work:
  • Affiliation:
  • Form subdivision:
  • General subdivision:
  • Chronological subdivision:
  • Geographic subdivision:
  • Source of heading or term:
  • Materials specified:
  • Relator code:
  • Linkage:

SUBJECT ADDED ENTRY--MEETING NAME

  • Meeting name or jurisdiction name as entry element:
  • Number (BK CF MP MU SE VM MX):
  • Location of meeting:
  • Date of meeting:
  • Subordinate unit:
  • Date of a work:
  • Miscellaneous information:
  • Medium:
  • Form subheading:
  • Language of a work:
  • Number of part/section/meeting:
  • Name of part/section of a work:
  • Name of meeting following jurisdiction name entry element:
  • Version:
  • Title of a work:
  • Affiliation:
  • Form subdivision:
  • General subdivision:
  • Chronological subdivision:
  • Geographic subdivision:
  • Source of heading or term:
  • Materials specified:
  • Relator code:
  • Linkage:

SUBJECT ADDED ENTRY--UNIFORM TITLE

  • Uniform title:
  • Date of treaty signing:
  • Date of a work:
  • Miscellaneous information:
  • Medium:
  • Form subheading:
  • Language of a work:
  • Medium of performance for music:
  • Number of part/section of a work:
  • Arranged statement for music:
  • Name of part/section of a work:
  • Key for music:
  • Version:
  • Title of a work:
  • Form subdivision:
  • General subdivision:
  • Chronological subdivision:
  • Geographic subdivision:
  • Source of heading or term:
  • Materials specified:
  • Linkage:

SUBJECT ADDED ENTRY--TOPICAL TERM

  • Topical term or geographic name as entry element:
  • Topical term following geographic name as entry element:
  • Location of event:
  • Active dates:
  • Relator term:
  • Form subdivision:
  • General subdivision:
  • Chronological subdivision:
  • Geographic subdivision:
  • Source of heading or term:
  • Materials specified:
  • Linkage:

SUBJECT ADDED ENTRY--GEOGRAPHIC NAME

  • Geographic name:
  • Geographic name following place entry element:
  • Form subdivision:
  • General subdivision:
  • Chronological subdivision:
  • Geographic subdivision:
  • Source of heading or term:
  • Materials specified:
  • Linkage:

SUBJECT ADDED ENTRY--REVERSED GEOGRAPHIC

  • Geographic name of place element:
  • General subdivision:
  • Chronological subdivision:
  • Geographic subdivision:

INDEX TERM--UNCONTROLLED

  • Uncontrolled term:
  • Linkage:

SUBJECT ADDED ENTRY--FACETED TOPICAL TERMS

  • Focus term:
  • Non-focus term:
  • Facet/hierarchy designation:
  • Form subdivision:
  • Chronological subdivision:
  • Geographic subdivision:
  • Source of heading or term:
  • Material specified:

INDEX TERM--GENRE/FORM/PHYSICAL CHARACTERISTICS

  • Linkage:
  • Field link and sequence number:
  • Materials specified:
  • Genre/form/physical characteristics:
  • Non-focus term:
  • Facet/hierarchy designation:
  • Form subdivision:
  • General subdivision:
  • Chronological subdivision:
  • Geographic subdivision:
  • Source of term:
  • Institution to which field applies:

INDEX TERM--OCCUPATION

  • Occupation:
  • Form:
  • Form subdivision:
  • General subdivision:
  • Chronological subdivision:
  • Geographic subdivision:
  • Source of term:
  • Materials specified:
  • Linkage:

INDEX TERM--FUNCTION

  • Function:
  • Form subdivision:
  • General subdivision:
  • Chronological subdivision:
  • Geographic subdivision:
  • Source of term:
  • Materials specified:
  • Linkage:

INDEX TERM--CURRICULUM OBJECTIVE

  • Main curriculum objective:
  • Subordinate curriculum objective:
  • Curriculum code:
  • Correlation factor:
  • Source of term:
  • Linkage:

ADDED ENTRY--PERSONAL NAME

  • Materials specified:
  • Linkage:
  • Field link and sequence number:
  • Personal name:
  • Numeration:
  • Titles and other words associated with a name:
  • Dates associated with a name:
  • Relator term:
  • Date of a work:
  • Miscellaneous information:
  • Medium:
  • Attribution qualifier:
  • Form subheading:
  • Language of a work:
  • Medium of performance for music:
  • Number of part/section of a work:
  • Arranged statement for music:
  • Name of part/section of a work:
  • Fuller form of name:
  • Key for music:
  • Version:
  • Title of a work:
  • Affiliation:
  • International Standard Serial Number:
  • Relator code:
  • Institution to which field applies:

ADDED ENTRY--PERSONAL NAME (PERFORMER)

  • Personal name:
  • Numeration:
  • Titles and other words associated with a name:
  • Dates associated with a name:
  • Relator term:
  • Date of a work:
  • Miscellaneous information:
  • Medium:
  • Form subheading:
  • Language of a work:
  • Medium of performance for music:
  • Number of part/section of a work:
  • Arranged statement for music:
  • Name of part/section of a work:
  • Key for music:
  • Version:
  • Title of a work:

ADDED ENTRY--CORPORATE NAME

  • Corporate name or jurisdiction name as entry element:
  • Subordinate unit:
  • Location of meeting:
  • Date of meeting or treaty signing:
  • Relator term:
  • Date of a work:
  • Miscellaneous information:
  • Medium:
  • Form subheading:
  • Language of a work:
  • Medium of performance for music:
  • Number of part/section/meeting:
  • Arranged statement for music:
  • Name of part/section of a work:
  • Key for music:
  • Version:
  • Title of a work:
  • Affiliation:
  • International Standard Serial Number:
  • Materials specified:
  • Relator code:
  • Institution to which field applies:
  • Linkage:

ADDED ENTRY--MEETING NAME

  • Meeting name or jurisdiction name as entry element:
  • Number (BK CF MP MU SE VM MX):
  • Location of meeting:
  • Date of meeting:
  • Subordinate unit:
  • Date of a work:
  • Miscellaneous information:
  • Medium:
  • Form subheading:
  • Language of a work:
  • Number of part/section/meeting:
  • Name of part/section of a work:
  • Name of meeting following jurisdiction name entry element:
  • Version:
  • Title of a work:
  • Affiliation:
  • International Standard Serial Number:
  • Materials specified:
  • Relator code:
  • Institution to which field applies:
  • Linkage:

ADDED ENTRY--CORPORATE NAME-PERFORMING GROUP

  • Corporate name or jurisdiction name:
  • Subordinate unit:
  • Relator term:
  • Date of a work:
  • Miscellaneous information:
  • Medium:
  • Form subheading:
  • Language of a work:
  • Medium of performance for music:
  • Number of part/section/meeting:
  • Arranged statement for music:
  • Name of part/section of a work:
  • Key for music:
  • Version:
  • Title of a work:
  • Nonprinting information:

ADDED ENTRY--UNCONTROLLED NAME

  • Name:
  • Relator term:
  • Relator code:
  • Linkage:

ADDED ENTRY--UNIFORM TITLE

  • Uniform title:
  • Date of treaty signing:
  • Date of a work:
  • Miscellaneous information:
  • Medium:
  • Form subheading:
  • Language of a work:
  • Medium of performance for music:
  • Number of part/section of a work:
  • Arranged statement for music:
  • Name of part/section of a work:
  • Key for music:
  • Version:
  • Title of a work:
  • International Standard Serial Number:
  • Materials specified:
  • Institution to which field applies:
  • Linkage:

ADDED ENTRY--UNCONTROLLED RELATED/ANALYTICAL TITLE

  • Uncontrolled related/analytical title:
  • Medium:
  • Number of part/section of a work:
  • Name of part/section of a work:
  • Institution to which field applies:
  • Linkage:

ADDED ENTRY--HIERARCHICAL PLACE NAME

  • Country:
  • State, province, territory:
  • County, region, islands area:
  • City:
  • Linkage:

ADDED ENTRY--TAXONOMIC IDENTIFICATION

  • Taxonomic name/taxonomic hierarchical category:
  • Source of taxonomic identification:
  • Linkage:

MAIN SERIES ENTRY

  • Main entry heading:
  • Edition:
  • Qualifying information:
  • Place, publisher, and date of publication:
  • Relationship information:
  • Display text:
  • Physical description:
  • Material-specific details:
  • Note:
  • Other item identifier:
  • Parallel title:
  • Uniform title:
  • Title:
  • Record control number:
  • International Standard Serial Number:
  • CODEN designation:
  • Linkage:
  • Control subfield:

SUBSERIES ENTRY

  • Main entry heading:
  • Edition:
  • Qualifying information:
  • Place, publisher, and date of publication:
  • Relationship information:
  • Physical description of source:
  • Display text:
  • Material-specific details:
  • Note:
  • Other item identifier:
  • Parallel title:
  • Uniform title:
  • Title:
  • Record control number:
  • International Standard Serial Number:
  • CODEN designation:
  • Linkage:
  • Control subfield:

ORIGINAL LANGUAGE ENTRY

  • Main entry heading:
  • Edition:
  • Qualifying information:
  • Place, publisher, and date of publication:
  • Relationship information:
  • Physical description of source:
  • Display text:
  • Series data for related item:
  • Material-specific details:
  • Note:
  • Other item identifier:
  • Parallel title:
  • Report number:
  • Uniform title:
  • Title:
  • Standard Technical Report Number:
  • Record control number:
  • International Standard Serial Number:
  • CODEN designation:
  • International Standard Book Number:
  • Linkage:
  • Control subfield:

TRANSLATION ENTRY

  • Main entry heading:
  • Edition:
  • Qualifying information:
  • Place, publisher, and date of publication:
  • Relationship information:
  • Physical description of source:
  • Display text:
  • Series data for related item:
  • Material-specific details:
  • Note:
  • Other item identifier:
  • Parallel title:
  • Report number:
  • Uniform title:
  • Title:
  • Standard Technical Report Number:
  • Record control number:
  • International Standard Serial Number:
  • CODEN designation:
  • International Standard Book Number:
  • Linkage:
  • Control subfield:

SUPPLEMENT/SPECIAL ISSUE ENTRY

  • Main entry heading:
  • Edition:
  • Qualifying information:
  • Place, publisher, and date of publication:
  • Relationship information:
  • Physical description of source:
  • Display text:
  • Series data for related item:
  • Material-specific details:
  • Note:
  • Other item identifier:
  • Parallel title:
  • Report number:
  • Uniform title:
  • Title:
  • Standard Technical Report Number:
  • Record control number:
  • International Standard Serial Number:
  • CODEN designation:
  • International Standard Book Number:
  • Linkage:
  • Control subfield:

PARENT RECORD ENTRY

  • Main entry heading:
  • Edition:
  • Qualifying information:
  • Place, publisher, and date of publication:
  • Relationship information:
  • Physical description of source:
  • Display text:
  • Series data for related item:
  • Material-specific details:
  • Note:
  • Other item identifier:
  • Parallel title:
  • Report number:
  • Uniform title:
  • Title:
  • Standard Technical Report Number:
  • Record control number:
  • International Standard Serial Number:
  • CODEN designation:
  • International Standard Book Number:
  • Linkage:
  • Control subfield:

HOST ITEM ENTRY

  • Main entry heading:
  • Edition:
  • Place, publisher, and date of publication:
  • Relationship information:
  • Physical description of source:
  • Display text:
  • Series data for related item:
  • Material-specific details:
  • Note:
  • Other item identifier:
  • Abbreviated title:
  • Report number:
  • Uniform title:
  • Title:
  • Standard Technical Report Number:
  • Record control number:
  • International Standard Serial Number:
  • CODEN designation:
  • International Standard Book Number:
  • Materials specified:
  • Linkage:
  • Control subfield:

CONSTITUENT UNIT ENTRY

  • Main entry heading:
  • Edition:
  • Qualifying information:
  • Place, publisher, and date of publication:
  • Relationship information:
  • Physical description of source:
  • Display text:
  • Series data for related item:
  • Material-specific details:
  • Note:
  • Other item identifier:
  • Report number:
  • Uniform title:
  • Title:
  • Standard Technical Report Number:
  • Record control number:
  • International Standard Serial Number:
  • CODEN designation:
  • International Standard Book Number:
  • Linkage:
  • Control subfield:

OTHER EDITION ENTRY

  • Main entry heading:
  • Edition:
  • Qualifying information:
  • Place, publisher, and date of publication:
  • Language code:
  • Country code:
  • Relationship information:
  • Physical description of source:
  • Display text:
  • Series data for related item:
  • Material-specific details:
  • Note:
  • Other item identifier:
  • Parallel title:
  • Report number:
  • Uniform title:
  • Title:
  • Standard Technical Report Number:
  • Record control number:
  • International Standard Serial Number:
  • CODEN designation:
  • International Standard Book Number:
  • Linkage:
  • Control subfield:

ISSUED WITH ENTRY

  • Main entry heading:
  • Edition:
  • Qualifying information:
  • Place, publisher, and date of publication:
  • Relationship information:
  • Physical description of source:
  • Display text:
  • Series data for related item:
  • Material-specific details:
  • Note:
  • Other item identifier:
  • Parallel title:
  • Uniform title:
  • Title:
  • Record control number:
  • International Standard Serial Number:
  • CODEN designation:
  • Linkage:
  • Control subfield:

SERIES ADDED ENTRY--PERSONAL NAME

  • Linkage:
  • Field link and sequence number:
  • Personal name:
  • Numeration:
  • Titles and other words associated with a name:
  • Dates associated with a name:
  • Relator term:
  • Date of a work:
  • Miscellaneous information:
  • Medium:
  • Attribution qualifier:
  • Form subheading:
  • Language of a work:
  • Medium of performance for music:
  • Number of part/section of a work:
  • Arranged statement for music:
  • Name of part/section of a work:
  • Fuller form of name:
  • Key for music:
  • Version:
  • Title of a work:
  • Affiliation:
  • Volume number/sequential designation:
  • Relator code:

SERIES ADDED ENTRY--CORPORATE NAME

  • Corporate name or jurisdiction name as entry element:
  • Subordinate unit:
  • Location of meeting:
  • Date of meeting or treaty signing:
  • Relator term:
  • Date of a work:
  • Miscellaneous information:
  • Medium:
  • Form subheading:
  • Language of a work:
  • Medium of performance for music:
  • Number of part/section/meeting:
  • Arranged statement for music:
  • Name of part/section of a work:
  • Key for music:
  • Version:
  • Title of a work:
  • Affiliation:
  • Volume number/sequential designation:
  • Relator code:
  • Linkage:

SERIES ADDED ENTRY--MEETING NAME

  • Meeting name or jurisdiction name as entry element:
  • Number (BK CF MP MU SE VM MX):
  • Location of meeting:
  • Date of meeting:
  • Subordinate unit:
  • Date of a work:
  • Miscellaneous information:
  • Medium:
  • Form subheading:
  • Language of a work:
  • Number of part/section/meeting:
  • Name of part/section of a work:
  • Name of meeting following jurisdiction name entry element:
  • Version:
  • Title of a work:
  • Affiliation:
  • Volume number/sequential designation:
  • Relator code:
  • Linkage:

SERIES ADDED ENTRY--UNIFORM TITLE

  • Uniform title:
  • Date of treaty signing:
  • Date of a work:
  • Miscellaneous information:
  • Medium:
  • Form subheading:
  • Language of a work:
  • Medium of performance for music:
  • Number of part/section of a work:
  • Arranged statement for music:
  • Name of part/section of a work:
  • Key for music:
  • Version:
  • Title of a work:
  • Volume number/sequential designation:
  • Linkage:

SERIES ADDED ENTRY--TITLE

  • Title:
  • Medium:
  • Volume or number:

REPRODUCTION NOTE

  • Type of reproduction:
  • Place of reproduction:
  • Agency responsible for reproduction:
  • Date of reproduction:
  • Physical description of reproduction:
  • Series statement of reproduction:
  • Dates of publication and/or sequential designation of issues reproduced:
  • Note about reproduction:
  • Materials specified:
  • Fixed-length data elements of reproduction:

NAME OF UNIT

  • Name of unit:

LOCATION/CALL NUMBER

  • Location:
  • Sublocation or collection:
  • Shelving location:
  • Address:
  • Coded location qualifier:
  • = Qualifier type:
  • = Number of units 1-9:
  • = Unit type:
  • Non-coded location qualifier:
  • Classification part:
  • Item part:
  • Shelving control number:
  • Call number prefix:
  • Shelving form of title:
  • Call number suffix:
  • Country code:
  • Piece designation:
  • Piece physical condition:
  • Copyright article-fee code:
  • Copy number:
  • Nonpublic note:
  • Public note:
  • Source of classification or shelving scheme:
  • Materials specified:
  • Link and sequence number:

CAPTIONS AND PATTERN--BASIC BIBLIOGRAPHIC UNIT

  • First level of enumeration:
  • Second level of enumeration:
  • Third level of enumeration:
  • Fourth level of enumeration:
  • Fifth level of enumeration:
  • Sixth level of enumeration:
  • Alternative numbering scheme, first level of enumeration:
  • Alternative numbering scheme, second level of enumeration:
  • First level of chronology:
  • Second level of chronology:
  • Third level of chronology:
  • Fourth level of chronology:
  • Alternative numbering scheme, chronology:
  • Copy:
  • Bibliographic units per next higher level:
  • Numbering continuity:
  • Frequency:
  • Calendar change:
  • Regularity pattern:
  • Materials specified:
  • Link and sequence number:

CAPTIONS AND PATTERN--SUPPLEMENTARY MATERIAL

  • First level of enumeration:
  • Second level of enumeration:
  • Third level of enumeration:
  • Fourth level of enumeration:
  • Fifth level of enumeration:
  • Sixth level of enumeration:
  • Alternative numbering scheme, first level of enumeration:
  • Alternative numbering scheme, second level of enumeration:
  • First level of chronology:
  • Second level of chronology:
  • Third level of chronology:
  • Fourth level of chronology:
  • Alternative numbering scheme, chronology:
  • Type of supplementary material:
  • Copy:
  • Bibliographic units per next higher level:
  • Numbering continuity:
  • Frequency:
  • Calendar change:
  • Regularity pattern:
  • Materials specified:
  • Link and sequence number:

CAPTIONS AND PATTERN--INDEXES

  • First level of enumeration:
  • Second level of enumeration:
  • Third level of enumeration:
  • Fourth level of enumeration:
  • Fifth level of enumeration:
  • Sixth level of enumeration:
  • Alternative numbering scheme, first level of enumeration:
  • Alternative numbering scheme, second level of enumeration:
  • First level of chronology:
  • Second level of chronology:
  • Third level of chronology:
  • Fourth level of chronology:
  • Alternative numbering scheme, chronology:
  • Type of index:
  • Copy:
  • Bibliographic units per next higher level:
  • Numbering continuity:
  • Frequency:
  • Calendar change:
  • Regularity pattern:
  • Materials specified:
  • Link and sequence number:

ELECTRONIC LOCATION AND ACCESS

  • Linkage:
  • Field link and sequence number:
  • Materials specified:
  • Host name:
  • Access number:
  • Compression information:
  • Path:
  • Electronic name:
  • Uniform resource name:
  • Processor of request:
  • Instruction:
  • Bits per second:
  • Password:
  • Logon:
  • Contact for access assistance:
  • Name of location of host in subfield $a:
  • Operating system:
  • Port:
  • Electronic format type :
  • Settings:
  • File size:
  • Terminal emulation:
  • Uniform Resource Identifier:
  • Hours access method available:
  • Record control number:
  • Nonpublic note:
  • Link text :
  • Public note:
  • Access method:

ENUMERATION AND CHRONOLOGY--BASIC BIBLIOGRAPHIC UNIT

  • First level of enumeration:
  • Second level of enumeration:
  • Third level of enumeration:
  • Fourth level of enumeration:
  • Fifth level of enumeration:
  • Sixth level of enumeration:
  • Alternative numbering scheme, first level of enumeration:
  • Alternative numbering scheme, second level of enumeration:
  • First level of chronology:
  • Second level of chronology:
  • Third level of chronology:
  • Fourth level of chronology:
  • Alternative numbering scheme, chronology:
  • Converted Gregorian year:
  • Piece designation:
  • Piece physical condition:
  • Copyright article-fee code:
  • Copy number:
  • Break indicator:
  • Nonpublic note:
  • Public note:
  • Link and sequence number:

ENUMERATION AND CHRONOLOGY--SUPPLEMENTARY MATERIAL

  • First level of enumeration:
  • Second level of enumeration:
  • Third level of enumeration:
  • Fourth level of enumeration:
  • Fifth level of enumeration:
  • Sixth level of enumeration:
  • Alternative numbering scheme, first level of enumeration:
  • Alternative numbering scheme, second level of enumeration:
  • First level of chronology:
  • Second level of chronology:
  • Third level of chronology:
  • Fourth level of chronology:
  • Alternative numbering scheme, chronology:
  • Converted Gregorian year:
  • Title of supplementary material:
  • Piece designation:
  • Piece physical condition:
  • Copyright article-fee code:
  • Copy number:
  • Break indicator:
  • Nonpublic note:
  • Public note:
  • Link and sequence number:

ENUMERATION AND CHRONOLOGY--INDEXES

  • First level of enumeration:
  • Second level of enumeration:
  • Third level of enumeration:
  • Fourth level of enumeration:
  • Fifth level of enumeration:
  • Sixth level of enumeration:
  • Alternative numbering scheme, first level of enumeration:
  • Alternative numbering scheme, second level of enumeration:
  • First level of chronology:
  • Second level of chronology:
  • Third level of chronology:
  • Fourth level of chronology:
  • Alternative numbering scheme, chronology:
  • Converted Gregorian year:
  • Title of index:
  • Piece designation:
  • Piece physical condition:
  • Copyright article-fee code:
  • Copy number:
  • Break indicator:
  • Nonpublic note:
  • Public note:
  • Link and sequence number:

TEXTUAL HOLDINGS--BASIC BIBLIOGRAPHIC UNIT

  • Textual string:
  • Nonpublic note:
  • Public note:
  • Link and sequence number:

TEXTUAL HOLDINGS--SUPPLEMENTARY MATERIAL

  • Textual holdings:
  • Nonpublic note:
  • Public note:
  • Link and sequence number:

TEXTUAL HOLDINGS--INDEXES

  • Textual holdings:
  • Nonpublic note:
  • Public note:
  • Link and sequence number:

VARIANT PERSONAL NAME

  • Personal name:
  • Numeration:
  • Titles and other words associated with a name:
  • Dates associated with a name:
  • Relator term:
  • Date of a work:
  • Miscellaneous information:
  • Tag and sequence number of the field for which 870 is a variant(R):
  • Form subheading:
  • Language of a work:
  • Number of part/section of a work:
  • Name of part/section of a work:
  • Fuller form of name:
  • Title of a work:
  • Affiliation:
  • Relator code:
  • Linkage:

VARIANT CORPORATE NAME

  • Corporate name or jurisdiction name as entry element:
  • Subordinate unit:
  • Location of meeting:
  • Date of meeting or treaty signing:
  • Relator term:
  • Date of a work:
  • Miscellaneous information:
  • Tag and sequence number of the field for which 871 is a variant(R):
  • Form subheading:
  • Language of a work:
  • Number of part/section/meeting:
  • Name of part/section of a work:
  • Title of a work:
  • Affiliation:
  • Relator code:
  • Linkage:

VARIANT CONFERENCE OR MEETING NAME

  • Meeting name or jurisdiction name as entry element:
  • Number (BK CF MP MU SE VM MX):
  • Location of meeting:
  • Date of meeting:
  • Subordinate unit:
  • Date of a work:
  • Miscellaneous information:
  • Tag and sequence number of the field for which 872 is a variant(R):
  • Form subheading:
  • Language of a work:
  • Number of part/section/meeting:
  • Name of part/section of a work:
  • Name of meeting following jurisdiction name entry element:
  • Title of a work:
  • Affiliation:
  • Relator code:
  • Linkage:

VARIANT UNIFORM TITLE HEADING

  • Uniform title:
  • Date of treaty signing:
  • Date of a work:
  • Miscellaneous information:
  • Medium:
  • Tag and sequence number of the field for which 873 is a variant(R):
  • Form subheading:
  • Language of a work:
  • Medium of performance for music:
  • Number of part/section of a work:
  • Arranged statement for music:
  • Name of part/section of a work:
  • Key for music:
  • Version:
  • Title of a work:
  • Linkage:

ITEM INFORMATION--BASIC BIBLIOGRAPHIC UNIT

  • Internal item number:
  • Invalid or cancelled internal item number:
  • Cost:
  • Date acquired:
  • Source of acquisition:
  • Use restrictions:
  • Item status:
  • Temporary location:
  • Piece designation:
  • Invalid or cancelled piece designation:
  • Copy number:
  • Nonpublic note:
  • Public note:
  • Materials specified:
  • Link and sequence number:

ITEM INFORMATION--SUPPLEMENTARY MATERIAL

  • Internal item number:
  • Invalid or cancelled internal item number:
  • Cost:
  • Date acquired:
  • Source of acquisition:
  • Use restrictions:
  • Item status:
  • Temporary location:
  • Piece designation:
  • Invalid or cancelled piece designation:
  • Copy number:
  • Nonpublic note:
  • Public note:
  • Materials specified:
  • Link and sequence number:

ITEM INFORMATION--INDEXES

  • Internal item number:
  • Invalid or cancelled internal item number:
  • Cost:
  • Date acquired:
  • Source of acquisition:
  • Use restrictions:
  • Item status:
  • Temporary location:
  • Piece designation:
  • Invalid or cancelled piece designation:
  • Copy number:
  • Nonpublic note:
  • Public note:
  • Materials specified:
  • Link and sequence number:

ALTERNATE GRAPHIC REPRESENTATION

  • Linkage:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Same as associated field:
  • Undefined; each contains blank (#):
  • Undefined; each contains blank (#):
  • Undefined; each contains blank (#):

FOREIGN MARC INFORMATION FIELD

  • Tag of the foreign MARC field/Foreign MARC subfield:
  • Content of the foreign MARC field/Foreign MARC subfield:
  • Source of data:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
  • Foreign MARC subfield:
refdb-1.0.2/phpweb/xsl/refdb-entry-parts.xsl000644 001750 001750 00000046213 11512721655 021650 0ustar00markusmarkus000000 000000 part:author . /part:author index.php?thisPage=Search%20results&query=:PY:= [ index.php?thisPage=Search%20results&query=:PY:= ] . part:title " ." . /part:title index.php?thisPage=Search%20results&query=:JX:~ index.php?thisPage=Search%20results&query=:TX:~ . , ed(s). . , Series ed(s). . : p p . - . : .

Bibliographic notes:

Reprint status: on request in file not in file since

Location:

Keywords:

Abstract:

, . . , and index.php?thisPage=Search%20results&query=:AX:~ , index.php?thisPage=Search%20results&query=:AX:~ , index.php?thisPage=Search%20results&query=:KW:~ ;

:

:

refdb-1.0.2/phpweb/xsl/refdb-entry-structure-buttons.xsl000644 001750 001750 00000006263 11512721655 024254 0ustar00markusmarkus000000 000000
entry

( )

   

part /part publication /publication set /set

contents /contents

libinfo /libinfo

/part
refdb-1.0.2/phpweb/xsl/refdb-entry-structure.xsl000644 001750 001750 00000004456 11512721655 022562 0ustar00markusmarkus000000 000000
entry

( )

part /part publication /publication set /set

contents /contents

libinfo /libinfo

/part
refdb-1.0.2/phpweb/includes/Makefile.in000644 001750 001750 00000030710 12303475767 020621 0ustar00markusmarkus000000 000000 # Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = phpweb/includes DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/./conf/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/./conf/mkinstalldirs CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BIB2RIS = @BIB2RIS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ ULLSPEC = @ULLSPEC@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bib2ris_LDADD = @bib2ris_LDADD@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ classpath_root = @classpath_root@ client1_mans = @client1_mans@ client_bins = @client_bins@ client_etc_distobjects = @client_etc_distobjects@ client_etc_objects = @client_etc_objects@ client_mans = @client_mans@ client_scripts = @client_scripts@ client_subdirs = @client_subdirs@ datadir = @datadir@ datarootdir = @datarootdir@ db_dir = @db_dir@ docbk_xsl = @docbk_xsl@ docbk_xsl_ns = @docbk_xsl_ns@ docdir = @docdir@ docs_subdirs = @docs_subdirs@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ log_dir = @log_dir@ main_db = @main_db@ man_subdirs = @man_subdirs@ mandir = @mandir@ mkdir_p = @mkdir_p@ mybatik = @mybatik@ mydtdformat = @mydtdformat@ mydtdparse = @mydtdparse@ myjade = @myjade@ myperl = @myperl@ mysgrep = @mysgrep@ myshell = @myshell@ mysvnversion = @mysvnversion@ mytidy = @mytidy@ myxmlcatalog = @myxmlcatalog@ myxsltproc = @myxsltproc@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psarg = @psarg@ psdir = @psdir@ refdba_LDADD = @refdba_LDADD@ refdbc_LDADD = @refdbc_LDADD@ refdbd_LDADD = @refdbd_LDADD@ sbindir = @sbindir@ server8_mans = @server8_mans@ server_bins = @server_bins@ server_etc_distobjects = @server_etc_distobjects@ server_etc_objects = @server_etc_objects@ server_mans = @server_mans@ server_scripts = @server_scripts@ server_subdirs = @server_subdirs@ sgml_decl = @sgml_decl@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ svnversioncommand = @svnversioncommand@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ tei_xsl = @tei_xsl@ tei_xsl_ns = @tei_xsl_ns@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ trang_cmd = @trang_cmd@ var_dir = @var_dir@ xml_decl = @xml_decl@ objects = functions.inc.php refdblib.inc.php EXTRA_DIST = $(objects) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu phpweb/includes/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu phpweb/includes/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-data-local install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags-am uninstall uninstall-am install-data-local: $(mkinstalldirs) $(DESTDIR)$(pkgdatadir)/www/includes chmod 1777 $(DESTDIR)$(pkgdatadir)/www/includes @for f in $(objects); do \ $(INSTALL_DATA) $$f $(DESTDIR)$(pkgdatadir)/www/includes/$$f; \ done # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: refdb-1.0.2/phpweb/includes/Makefile.am000644 001750 001750 00000000542 11512721655 020577 0ustar00markusmarkus000000 000000 ## Process this file with automake to produce Makefile.in objects = functions.inc.php refdblib.inc.php EXTRA_DIST = $(objects) install-data-local: $(mkinstalldirs) $(DESTDIR)$(pkgdatadir)/www/includes chmod 1777 $(DESTDIR)$(pkgdatadir)/www/includes @for f in $(objects); do \ $(INSTALL_DATA) $$f $(DESTDIR)$(pkgdatadir)/www/includes/$$f; \ done refdb-1.0.2/phpweb/includes/functions.inc.php000644 001750 001750 00000253465 12255426414 022052 0ustar00markusmarkus000000 000000 ********************************/ // this function is a weird hack to remove the extra single quotes that appear around the database name as soon as we edit an entry or do something else except staring at the login screen. This function will be obsolete as soon as some gentle soul explains to me which f***ing PHP "feature" inserts those single quotes (MH) function stripQuotes($string) { // brute force, does not care about escaping and such. Used only for database names which must not contain quotes anyway (MH) return trim(str_replace("'", " ", $string)); } // this is a somewhat more intelligent "which" replacement. It checks whether a binary is available in the default path, or if not found, whether it is available in the same directory as the refdb binaries. The latter check helps on those systems which use an empty PATH in Apache's account for security reasons. Returns a string to call the tool if it is available, or NULL if not function nwhich($name) { $path = $_SESSION["path"]; exec("which $name", $dummy, $retval); if ($retval == 1) { exec("which $path/$name", $dummy, $retval); if ($retval == 0) { return "$path/$name"; } } else { return $name; } return NULL; } //This function sets the proper search tag depending //on the field that you're searching for function selectTag($kajqueryfield) { $get=""; switch($kajqueryfield) { case "keyword": $get="KW"; break; case "author": $get="AU"; break; case "editor": $get="ED"; break; case "seditor": $get="A2"; break; case "journalfull": $get="JF"; break; case "journalabbrev": $get="JO"; break; case "journalabbrev1": $get="J1"; break; case "journalabbrev2": $get="J2"; break; } return ":".$get.":"; } function refdb_xhtml2out($lines, $buttons=false) { //Establish initial checkbox number. $checkboxNumber=0; foreach( $lines as $line ) { //Remove title and ending if( substr($line,1,2)=="h1" || substr($line,1,4)=="?xml" || substr($line,1,4)=="!DOC" || substr($line,1,4)=="html" || substr($line,1,5)=="title" || substr($line,1,5)=="/head" || substr($line,1,4)=="body" || substr($line,1,5)=="/html") { //do nothing } //If this is the first line of a new reference it will contain the ID field elseif( substr($line,1,2)=="h2" ) { //strip the ID number out of the reference $colon=strpos($line, ':'); $space=strpos($line, " ("); $id=substr($line,$colon+1,$space-$colon-1); if($buttons) { ++$checkboxNumber; echo "

"; echo " "; echo " "; echo " 

"; // echo "

\n"; } echo "$line\n"; } else { //Here seems to be a bug in refdbc: missing
$line = str_replace("

", "

", "$line\n"); print $line; } } return $checkboxNumber; } function risx_xhtmlprocessor ($lines,$buttons) { // foreach ($lines as $line) { // echo "
$line
"; // } if ($lines) { $output=implode("\n",$lines); $xml = new DOMDocument; $xml->loadXML($output); $xsl = new DOMDocument; if ($buttons=="true") { $xsl->load('xsl/refdb-entry-structure-buttons.xsl'); } else { $xsl->load('xsl/refdb-entry-structure.xsl'); } // Configure the transformer $proc = new XSLTProcessor; $proc->registerPHPFunctions(); $proc->importStyleSheet($xsl); // attach the xsl rules echo $proc->transformToXML($xml); } } // New version function refdb_RIS2out($lines, $buttons=false) { //Establish initial checkbox number. $checkboxNumber=0; /* // Load the XML source $xml = new DOMDocument; $xml->load('collection.xml'); $xsl = new DOMDocument; $xsl->load('collection.xsl'); // Configure the transformer $proc = new XSLTProcessor; $proc->importStyleSheet($xsl); // attach the xsl rules echo $proc->transformToXML($xml); */ foreach( $lines as $line ) { //If this is the first line of a new reference it will contain the TY field if( substr($line,1,2)=="TY" ) { //strip the ID number out of the reference $ID=substr($line,6); if($buttons) { ++$checkboxNumber; echo "

"; echo " "; echo " "; echo " 

"; // echo "

\n"; } } $formfields=parseRSS ($lines); //extract($output,EXTR_OVERWRITE); $referencetype = $formfields['TY']; if ($referencetype=="ABST") {} elseif ($referencetype=="ADVS") {} elseif ($referencetype=="ART") {} elseif ($referencetype=="BILL") {} elseif ($referencetype=="UNBILL") {} elseif ($referencetype=="CHAP") { echo "

".$formfields['AI']. $formfields['PY']; if ($formy2!="") { echo "[$formy2]"; } echo $formfields['TI']; echo "In ".$formfields['A2']."; (ed.), "; if ($formfields['T2']!="") { echo "".$formfields['T2'].""; } elseif ($formfields['BT']!="") { echo "".$formfields['BT'].""; } echo ": ".$formfields['SP']."-".$formfields['EP'].".

\n"; } elseif ($referencetype=="BOOK") { echo"

".$formfields['AI'].". ".$formfields['PY']; if ($formy2!="") { echo "[$formy2]"; } echo ". "; if ($formfields['TI']!="") { echo "".$formfields['TI'].""; } elseif ($formfields['BT']!="") { echo "".$formfields['BT'].""; } echo ".

\n"; } elseif ($referencetype=="SER") {} elseif ($referencetype=="THES") {} elseif ($referencetype=="CTLG") {} elseif ($referencetype=="COMP") {} elseif ($referencetype=="CONF") {} elseif ($referencetype=="DATA") {} elseif ($referencetype=="ICOM") {} elseif ($referencetype=="GEN") {} elseif ($referencetype=="HEAR") {} elseif ($referencetype=="INPR") {} elseif ($referencetype=="JOUR") { echo"

".$formfields['AI'].". ".$formfields['PY'].""; if ($formfields['Y2']!="") { echo "[".$formfields['Y2']; } echo ". ".$formfields['TI'].". "; if ($formfields['JO']!="") { echo "".$formfields['JO'].""; } elseif ($formfields['J1']!="") { echo "".$formfields['J1'].""; } elseif ($formfields['J2']!="") { echo "".$formfields['J2'].""; } else { echo "".$formfields['JF'].""; } echo " ".$formfields['VL'].""; if ($formfields['IS']!="") { echo ".".$formfields['IS'].""; } echo ": ".$formfields['SP']."-".$formfields['EP'].".

\n"; } elseif ($referencetype=="JFULL") {} elseif ($referencetype=="CASE") {} elseif ($referencetype=="MGZN") {} elseif ($referencetype=="MAP") {} elseif ($referencetype=="MPCT") {} elseif ($referencetype=="MUSIC") {} elseif ($referencetype=="NEWS") {} elseif ($referencetype=="PAMP") {} elseif ($referencetype=="PAT") {} elseif ($referencetype=="PCOMM") {} elseif ($referencetype=="RPRT") {} elseif ($referencetype=="SLIDE") {} elseif ($referencetype=="SOUND") {} elseif ($referencetype=="STAT") {} elseif ($referencetype=="UNPB") {} elseif ($referencetype=="VIDEO") {} elseif ($referencetype=="ELEC") {} else { //Here seems to be a bug in refdbc: missing
$line = str_replace("

", "

", "$line\n"); print $line; } return $checkboxNumber; } } /* This function imports an "arbitrary" file into the database by sending it to various functions which return true if they recognize the file type. This corresponds to the STRATEGY design pattern Problem to solve: differing encodings EndNote RIS is currently disabled as we can't distinguish it from "good" RIS */ function importFile($infile, $my_refdbc) { echo "

File to import: $infile

"; if( importRIS($infile, $my_refdbc) || importrisx($infile, $my_refdbc) || importISI($infile, $my_refdbc) || importBibTeX($infile, $my_refdbc) // || importEndNote($infile, $my_refdbc) || importMarc($infile, $my_refdbc) || importPubmed($infile, $my_refdbc) || importCopac($infile, $my_refdbc) ) print("

File successfully imported"); else print("Not recognized File $infile with first line". getFirstline($infile, NULL)); } /** This function imports a web of science export file into the database by converting it to ris and then calling the importRIS function */ function importBibTeX($infile, $my_refdbc) { // check our prerequisites $bib2ris = nwhich("bib2ris-utf8"); if (is_null($bib2ris)) { return false; } if(substr(getFirstline($infile, "%"),0,1)=="@"){ //print("

Recognized BibTeX

"); $tempFile=tempnam("/tmp", "refdb"); // make sure filename is unique $cmd="$bib2ris $infile > $tempFile"; $lines = ""; exec($cmd,$lines); $retval = importRIS($tempFile, $my_refdbc); unlink($tempFile); // clean up return $retval; } return false; } function importEndNote($infile, $my_refdbc) { // check our prerequisites $en2ris = nwhich("en2ris"); if (is_null($en2ris)) { return false; } if(substr(getFirstline($infile, NULL),0,6)=="TY - "){ //print("

Recognized EndNote

"); $tempFile=tempnam("/tmp", "refdb"); // make sure filename is unique $cmd="$en2ris < $infile > $tempFile"; $lines = ""; exec($cmd,$lines); $retval = importRIS($tempFile, $my_refdbc); unlink($tempFile); // clean up return $retval; } return false; } function importMarc($infile, $my_refdbc) { // check our prerequisites $marc2ris = nwhich("marc2ris"); if (is_null($marc2ris)) { return false; } $header = getFirstline($infile, NULL); if ($header == false) { return false; } // the following regex is supposed to match all MARC21 datasets, // see http://www.loc.gov/marc/specifications/specrecstruc.html if(ereg('^..........22........4500', $header)){ //print("

Recognized MARC21

"); $tempFile=tempnam("/tmp", "refdb"); // make sure filename is unique $cmd="$marc2ris -t MARC21 < $infile > $tempFile"; $lines = ""; exec($cmd,$lines); $retval = importRIS($tempFile, $my_refdbc); unlink($tempFile); // clean up return $retval; } // the following regex is supposed to match all UNIMARC datasets, // see http://www.ifla.org/VI/3/p1996-1/uni.htm else if(ereg('^......... 22....... 450 ', $header)){ //print("

Recognized UNIMARC

"); $tempFile=tempnam("/tmp", "refdb"); // make sure filename is unique $cmd="$marc2ris -t UNIMARC < $infile > $tempFile"; $lines = ""; exec($cmd,$lines); $retval = importRIS($tempFile, $my_refdbc); unlink($tempFile); // clean up return $retval; } return false; } function importPubmed($infile, $my_refdbc) { // check our prerequisites $med2ris = nwhich("med2ris"); if (is_null($med2ris)) { return false; } $header = getFirstline($infile, " Recognized Pubmed XML

"); $tempFile=tempnam("/tmp", "refdb"); // make sure filename is unique $cmd="$med2ris -T xml < $infile > $tempFile"; $lines = ""; exec($cmd,$lines); $retval = importRIS($tempFile, $my_refdbc); unlink($tempFile); // clean up return $retval; } // now try tagged format else if (substr($header,0,6) == "PMID- ") { //print("

Recognized Pubmed tagged

"); $tempFile=tempnam("/tmp", "refdb"); // make sure filename is unique $cmd="$med2ris -T tag < $infile > $tempFile"; $lines = ""; exec($cmd,$lines); $retval = importRIS($tempFile, $my_refdbc); unlink($tempFile); // clean up return $retval; } return false; } function importISI($infile, $my_refdbc){ // check our prerequisites $isi2xml = nwhich("isi2xml"); if (is_null($isi2xml)) { return false; } $xml2ris = nwhich("xml2ris"); if (is_null($xml2ris)) { return false; } $header = getFirstline($infile, NULL); if ($header == false) { return false; } if(substr($header,0,20)=="FN ISI Export Format"){ //print("

Recognized ISI Export

"); $tempFile=tempnam("/tmp", "refdb"); // make sure filename is unique $cmd="$isi2xml $infile | $xml2ris > $tempFile"; $lines = ""; exec($cmd,$lines); /* echo "

$cmd returned
"; foreach ($lines as $line) { echo "$line
"; } echo "

"; */ return importRIS($tempFile, $my_refdbc); unlink($tempFile); // clean up } return false; } function importCopac($infile, $my_refdbc){ // check our prerequisites $copac2xml = nwhich("copac2xml"); if (is_null($copac2xml)) { return false; } $xml2ris = nwhich("xml2ris"); if (is_null($xml2ris)) { return false; } $header = getFirstline($infile, NULL); if ($header == false) { return false; } // as per the spec at http://copac.ac.uk/faq/, all datasets start with // a "TI- " tag, but their own exported records speak a different language // all seem to start with a "AU- " tag. Test for both variants if(substr($header,0,4) == "TI- " || substr($header,0,4) == "AU- "){ //print("

Recognized COPAC

"); $tempFile=tempnam("/tmp", "refdb"); // make sure filename is unique $cmd="$copac2xml $infile | $xml2ris > $tempFile"; $lines = ""; exec($cmd,$lines); return importRIS($tempFile, $my_refdbc); unlink($tempFile); // clean up } return false; } /** This function imports a RIS-file into the database. */ function importRIS($infile, $my_refdbc) { $lines = array(); // initialize as empty array if (substr(getFirstline($infile, NULL),0,6)=="TY - ") { //echo "

Recognized RIS

"; $returnvalue = 0; $lines = $my_refdbc->addref_from_file("", $infile, "ris", ""); //Debugging // echo "

return value: $returnvalue
$cmd returned
"; //foreach ($lines as $line) { // echo "$line
";} //end debugging } echo "

"; $num_success = 0; $num_failed = 0; $my_citekey = ""; foreach ($lines as $line) { $resultfields = explode(':', $line); $status = $resultfields[0]; if ($status == "406") { $my_citekey = $resultfields[2]; // echo "

Created citation key $citekey

"; } else if ($status == "407") { // urlencoding $citekey should not be required as refdbd strips off offending characters anyway if (isset($resultfields[2])) { $citekey = $resultfields[2]; echo "

Refused to overwrite dataset with citation key $citekey

"; } } else if ($status == "408") { echo "

Successfully added $my_citekey

"; $num_success++; } else if ($status == "409") { echo "

Numerical ID ignored

"; } else if ($status == "410") { echo "

Numerical ID noexistent

"; } else if ($status == "411") { echo "

Citation key noexistent

"; } else if ($status == "412") { echo "

ID or citation key are missing

"; } else if ($status == "413") { $citekey = $resultfields[2]; echo "

Successfully updated dataset with citation key $citekey

"; $num_success++; } else if ($status == "414") { echo "

Failed to add dataset

"; $num_failed++; } } if ($num_success > 0) { return true; } return false; } function importrisx($infile, $my_refdbc) { $my_firstline = getFirstline($infile, NULL); $lines = array(); // initialize as empty array if (substr($my_firstline, 0, 5) == "") { //echo "

Recognized risx

"; $returnvalue = 0; $lines = $my_refdbc->addref_from_file("", $infile, "risx", ""); //Debugging // echo "

return value: $returnvalue
$cmd returned
"; // foreach ($lines as $line) { // echo "$line
";} //end debugging } echo "

"; $num_success = 0; $num_failed = 0; $my_citekey = ""; foreach ($lines as $line) { $resultfields = explode(':', $line); $status = $resultfields[0]; if ($status == "406") { $my_citekey = $resultfields[1]; // echo "

Created citation key $citekey

"; } else if ($status == "407") { if (isset($resultfields[2])) { $citekey = $resultfields[2]; echo "

Refused to overwrite dataset with citation key $citekey

"; } } else if ($status == "408") { echo "

Successfully added $my_citekey

"; $num_success++; } else if ($status == "409") { echo "

Numerical ID ignored

"; } else if ($status == "410") { echo "

Numerical ID noexistent

"; } else if ($status == "411") { echo "

Citation key noexistent

"; } else if ($status == "412") { echo "

ID or citation key are missing

"; } else if ($status == "413") { $citekey = $resultfields[1]; echo "

Successfully updated dataset with citation key $citekey

"; $num_success++; } else if ($status == "414") { echo "

Failed to add dataset

"; $num_failed++; } } if ($num_success > 0) { return true; } return false; } // todo: import from endnote, copac, endnote xml, bibtex, marc, pubmed function getFirstline($infile, $commentstring) { $maxlength = 64;// the length limit avoids reading entire // MARC files into memory $inunit=fopen($infile,"r"); if(!$inunit) { die("Couldn't open existing input file '".$infile."'."."\n"); } /* skip leading empty lines, if any, and ignore commented out lines */ /* use two loops to avoid checking string lengths in the loop */ if (!is_null($commentstring)) { do { $inline=fgets($inunit, $maxlength); if (strncmp($inline, $commentstring, strlen($commentstring)) == 0) { continue; } $trimmedline = trim($inline); } while (strlen($trimmedline) == 0); } else { do { $inline=fgets($inunit, $maxlength); $trimmedline = trim($inline); } while (strlen($trimmedline) == 0); } fclose ($inunit); return $inline; } /* Creates the reference type selection element for the input form. $reference is the preselected type. */ function form_selection($referencetype) { ?> generateFormPart($ref_type, $field)

"); //var_dump($default); //print("

".substr($field,0,4)." ".substr($field,4)."

"); //First work on sections if(substr($field,0,4)=="sec_"){ $field = substr($field,4); $headings=array("primary" => "Primary Author, Title, and Date", "secondary" => "Secondary Information", "tertiary" => "Tertiary Author, Title", "publication" => "Publication Information", "shelf" => "Shelfing/Location Information" ); $heading = $headings[$field]; //For the first section //we must not include closing tags if($field=="primary"){ } else { echo " \n"; echo " \n"; } echo "
\n"; echo "

".$heading."

\n"; echo " \n"; //Now process actual fields } else { // set the M1-M3 field labels according to the reference type if ($ref_type == "ABST") { $m1label = "Miscellaneous field 1 (n/a)"; $m2label = "Miscellaneous field 1 (n/a)"; $m3label = "DOI"; } else if ($ref_type == "ART") { $m1label = "Type of work"; $m2label = "Miscellaneous field 2 (n/a)"; $m3label = "DOI"; } else if ($ref_type == "ADVS") { $m1label = "Miscellaneous field 1 (n/a)"; $m2label = "DOI"; $m3label = "Media type"; } else if ($ref_type == "BILL") { $m1label = "Miscellaneous field 1 (n/a)"; $m2label = "Miscellaneous field 2 (n/a)"; $m3label = "DOI"; } else if ($ref_type == "CHAP" || $ref_type == "CHAPshort") { $m1label = "Number of volumes"; $m2label = "Volume"; $m3label = "DOI"; } else if ($ref_type == "BOOK" || $ref_type == "BOOKshort") { $m1label = "Number of volumes"; $m2label = "Miscellaneous field 2 (n/a)"; $m3label = "DOI"; } else if ($ref_type == "CTLG") { $m1label = "Miscellaneous field 1 (n/a)"; $m2label = "Miscellaneous field 2 (n/a)"; $m3label = "DOI"; } else if ($ref_type == "COMP") { $m1label = "Computer"; $m2label = "Operating system type"; $m3label = "Media type"; } else if ($ref_type == "CONF") { $m1label = "Number of volumes"; $m2label = "Conference location"; $m3label = "DOI"; } else if ($ref_type == "DATA") { $m1label = "Miscellaneous field 1 (n/a)"; $m2label = "Miscellaneous field 2 (n/a)"; $m3label = "DOI"; } else if ($ref_type == "ELEC") { $m1label = "Medium"; $m2label = "Unique ID"; $m3label = "DOI"; } else if ($ref_type == "HEAR") { $m1label = "Miscellaneous field 1 (n/a)"; $m2label = "Miscellaneous field 2 (n/a)"; $m3label = "DOI"; } else if ($ref_type == "INPR") { $m1label = "Miscellaneous field 1 (n/a)"; $m2label = "Miscellaneous field 2 (n/a)"; $m3label = "DOI"; } else if ($ref_type == "ICOMM") { $m1label = "Sender email address"; $m2label = "Recipient email address"; $m3label = "DOI"; } else if ($ref_type == "JOUR" || $ref_type == "JOURshort") { $m1label = "Medium"; $m2label = "Miscellaneous field 2 (n/a)"; $m3label = "DOI"; } else if ($ref_type == "JFULL") { $m1label = "Registry number"; $m2label = "Unique ID"; $m3label = "DOI"; } else if ($ref_type == "MGZN") { $m1label = "Miscellaneous field 1 (n/a)"; $m2label = "Miscellaneous field 2 (n/a)"; $m3label = "DOI"; } else if ($ref_type == "MAP") { $m1label = "Area"; $m2label = "Type"; $m3label = "DOI"; } else if ($ref_type == "MPCT") { $m1label = "Classification"; $m2label = "Running time"; $m3label = "Media type"; } else if ($ref_type == "MUSIC") { $m1label = "Miscellaneous field 1 (n/a)"; $m2label = "Miscellaneous field 2 (n/a)"; $m3label = "DOI"; } else if ($ref_type == "NEWS") { $m1label = "Issue"; $m2label = "Section"; $m3label = "DOI"; } else if ($ref_type == "PAMP") { $m1label = "Pamphlet number"; $m2label = "Miscellaneous field 2 (n/a)"; $m3label = "DOI"; } else if ($ref_type == "PAT") { $m1label = "Class code (international)"; $m2label = "Class code (US)"; $m3label = "Document type"; } else if ($ref_type == "PCOMM") { $m1label = "Type"; $m2label = "Miscellaneous field 2 (n/a)"; $m3label = "DOI"; } else if ($ref_type == "RPRT") { $m1label = "Type"; $m2label = "Miscellaneous field 2 (n/a)"; $m3label = "DOI"; } else if ($ref_type == "SER") { $m1label = "Number of volumes"; $m2label = "Miscellaneous field 2 (n/a)"; $m3label = "DOI"; } else if ($ref_type == "SLIDE") { $m1label = "Miscellaneous field 1 (n/a)"; $m2label = "Miscellaneous field 2 (n/a)"; $m3label = "DOI"; } else if ($ref_type == "SOUND") { $m1label = "Classification"; $m2label = "Playing time"; $m3label = "Media type"; } else if ($ref_type == "STAT") { $m1label = "Miscellaneous field 1 (n/a)"; $m2label = "Miscellaneous field 2 (n/a)"; $m3label = "DOI"; } else if ($ref_type == "THES") { $m1label = "Degree"; $m2label = "Type"; $m3label = "DOI"; } else if ($ref_type == "UNBILL") { $m1label = "Miscellaneous field 1 (n/a)"; $m2label = "Miscellaneous field 2 (n/a)"; $m3label = "DOI"; } else if ($ref_type == "UNPB") { $m1label = "Miscellaneous field 1 (n/a)"; $m2label = "Miscellaneous field 2 (n/a)"; $m3label = "DOI"; } else if ($ref_type == "VIDEO") { $m1label = "Classification"; $m2label = "Running time"; $m3label = "Media type"; } else { $m1label = "Miscellaneous field 1"; $m2label = "Miscellaneous field 2"; $m3label = "Miscellaneous field 3"; } //names related to fields (scope) $scopes=array("AU" => "Author(s)", "TI" => "Title", "N2" => "Abstract", "KW" => "Keywords/Subject terms", "A2" => "Editor(s)", "JF" => "Full Title", "JO" => "Official Abbreviation", "J1" => "Custom Abbreviation 1", "J2" => "Custom Abbreviation 2", "T2" => "Secondary Title", "A3" => "Tertiary Contributor(s)", "T3" => "Tertiary Title", "VL" => "Volume", "IS" => "Issue", "CY" => "City of Publication", "PB" => "Publisher", "SN" => "ISBN/ISSN", "AD" => "Contact address", "PY" => "Publication Year
(most recent)", "Y2" => "Publication Year
(earlier or additional)", "SP" => "Starting page", "EP" => "Ending page", "N1" => "Bibilographic Notes", "RP" => "Reprint status", "AV" => "Local copy", "UR" => "Public URL", "L1" => "Local URL", "U1" => "User defined field 1", "U2" => "User defined field 2", "U3" => "User defined field 3", "U4" => "User defined field 4", "U5" => "User defined field 5", "M1" => $m1label, "M2" => $m2label, "M3" => $m3label ); $scope = $scopes[$field]; $scope=ucfirst($scope); //tips for field entry $author="Use the following format, separating multiple authors by semicolons: Lastname, Firstname I. Jr.; Lastname, Sir Firstname I. IV."; $title="Use sentence case as appropriate to the language in question: e.g. For whom the bell tolls vs. Altenglische Grammatik nach der angelsächsischen Grammatik von Eduard Sievers."; $keywords="Use semicolons to separate terms: Old English language; Book History."; $journalWarning=": You must provide at least one of the Journal's full title, official abbreviation, or custom abbreviation."; $journalFull="Enter the full name of the journal" . $journalWarning; $publicationYear="Use this field for year the copy you are cataloguing was published; use the \"Other:\" textbox to record additional date-related information; use Other publication date for the date of original publication if this is different and of interest."; $otherYear="Use this if the publication has a date of original publication that is of interest and different from the copy you are cataloguing"; $note1="Tip! Use this field for bibliographic notes: e.g. Includes CD-ROM."; $availability="Use this to indicate where your physical copy (if any) can be found: office filing cabinet, call number"; $URL="This refers to a URL that you could use in a published citation. It should not refer to a private copy."; $L1="This refers to a URL of a private copy. Use file://path for the local filesystem, or http://path for a local web server"; $journalAbbrOfficial="This is the standard abbreviation for the journal as it appears in standard bibliographies" . $journalWarning; $journalAbbrCustom="This is a custom or alternate abbreviation for the journal" . $journalWarning; $tips = array("AU" => $author, "TI" => $title, "KW" => $keywords, "A2" => $author, "JF" => $journalFull, "T2" => $title, "T3" => $title, "A3" => $author, "PY" => $publicationYear, "Y2" => $otherYear, "N1" => $note1, "AV" => $availability, "UR" => $URL, "L1" => $L1, "JO" => $journalAbbrOfficial, "J1" => $journalAbbrCustom, "J2" => $journalAbbrCustom ); // For multi row fields, we can set the row number here // Then, a textarea instead of an input will be created $rows = array("N2" => 10, "AD" => 5); // For date fields $is_date = array("PY" => True, "Y2" => True); //For field labels, //we chan use the either the scope only(scopeOnly=True) //or use the referencetype to //define a single text pattern where // _scope is replaced by the scope // or the most flexible way is to define an array // within $texts with // the scope as index $scopeOnly = array("N2" => True, "KW" => True, "CY" => True, "PB" => True, "SN" => True, "AD" => True, "PY" => True, "Y2" => True, "EP" => True, "SP" => True, "N1" => True, "RP" => True, "AV" => True, "UR" => True, "L1" => True, "U1" => True, "U2" => True, "U3" => True, "U4" => True, "U5" => True, "M1" => True, "M2" => True, "M3" => True ); // Some fields are of interest only for certain reference types // for examlpe various journal titles for journals only $ty_all= array("JOUR", "JOURshort","JFULL", "MGZN", "NEWS", "", "ABST","ADVS","ART", "BOOK", "BOOKshort", "CHAP", "CHAPshort", "COMP", "CONF", "CTLG", "DATA", "ELECT", "ICOMM", "INPR", "MAP", "MPCT", "MUSIC", "PAMP", "PAT", "PCOMM", "RPRT", "SER", "SLIDE", "SOUND", "THES", "UNPB", "VIDEO"); $ty_pages= array("JOUR", "JOURshort", "MGZN", "NEWS", "", "ABST","ADVS","ART", "CHAP", "CHAPshort", "COMP", "CONF", "CTLG", "INPR", "MAP", "MUSIC", "PAT", "PCOMM", "RPRT", "UNPB"); $ty_jour =array("JOUR", "JOURshort","JFULL", "MGZN", "NEWS"); $ty_no_jour = array("", "ABST","ADVS","ART", "BOOK", "BOOKshort", "CHAP", "CHAPshort", "COMP", "CONF", "CTLG", "DATA", "ELECT", "ICOMM", "INPR", "MAP", "MPCT", "MUSIC", "PAMP", "PAT", "PCOMM", "RPRT", "SER", "SLIDE", "SOUND", "THES", "UNPB", "VIDEO"); $someTypesOnly = array("JF"=> $ty_jour, "JO"=> $ty_jour, "J1"=> $ty_jour, "J2"=> $ty_jour, "IS"=> $ty_jour, "T2" => $ty_no_jour, "CY" => $ty_no_jour, "PB" => $ty_no_jour, "SP" => $ty_pages, "EP" => $ty_pages ); $texts = array("" => "_scope", "none" => "_scope", "ABST" => array( "Full Title" => "Journal Name", "Editor(s)" => "Journal editor(s)", "Official Abbreviation" => "Journal Abbreviation (official)", "Custom Abbreviation 1" => "Journal Abbreviation (custom 1)", "Custom Abbreviation 2" => "Journal Abbreviation (custom 2)", "Tertiary Contributor(s)" => "Series Editor(s)", "Tertiary Title" => "Series Title", "default" => "Article _scope"), "ADVS" => "_scope", "ART" => "_scope", "BOOK" => array( "Secondary Title" => "n/a", "Editor(s)" => "Book editor(s)", "Tertiary Contributor(s)" => "Series Editor(s)", "Tertiary Title" => "Series Title", "default" => "Book _scope"), "BOOKshort" => array( "Secondary Title" => "n/a", "Editor(s)" => "Book editor(s)", "Tertiary Contributor(s)" => "Series Editor(s)", "Tertiary Title" => "Series Title", "default" => "Book _scope"), "CHAP" => array( "Secondary Title" => "Book Title", "Editor(s)" => "Book editor(s)", "Tertiary Contributor(s)" => "Series Editor(s)", "Tertiary Title" => "Series Title", "default" => "Chapter _scope"), "CHAPshort" => array( "Secondary Title" => "Book Title", "Editor(s)" => "Book editor(s)", "Tertiary Contributor(s)" => "Series Editor(s)", "Tertiary Title" => "Series Title", "default" => "Chapter _scope"), "COMP" => "_scope", "CONF" => "Proceedings _scope", "CTLG" => "Catalogue _scope", "DATA" => "_scope of File", "ELEC" => "Web Page _scope", "ICOMM" => array( "title" => "Email Subject", "default" => "Email _scope"), "INPR" => array( "Full Title" => "Journal Name", "Editor(s)" => "Journal editor(s)", "Official Abbreviation" => "Journal Abbreviation (official)", "Custom Abbreviation 1" => "Journal Abbreviation (custom 1)", "Custom Abbreviation 2" => "Journal Abbreviation (custom 2)", "Tertiary Contributor(s)" => "Series Editor(s)", "Tertiary Title" => "Series Title", "default" => "Article _scope"), "JOUR" => array( "Full Title" => "Journal Name", "Editor(s)" => "Journal editor(s)", "Official Abbreviation" => "Journal Abbreviation (official)", "Custom Abbreviation 1" => "Journal Abbreviation (custom 1)", "Custom Abbreviation 2" => "Journal Abbreviation (custom 2)", "Tertiary Contributor(s)" => "Series Editor(s)", "Tertiary Title" => "Series Title", "default" => "Article _scope"), "JOURshort" => array( "Full Title" => "Journal Name", "Editor(s)" => "Journal editor(s)", "Official Abbreviation" => "Journal Abbreviation (official)", "Custom Abbreviation 1" => "Journal Abbreviation (custom 1)", "Custom Abbreviation 2" => "Journal Abbreviation (custom 2)", "Tertiary Contributor(s)" => "Series Editor(s)", "Tertiary Title" => "Series Title", "default" => "Article _scope"), "JFULL" => array( "Full Title" => "Journal Name", "Editor(s)" => "Journal editor(s)", "Official Abbreviation" => "Journal Abbreviation (official)", "Custom Abbreviation 1" => "Journal Abbreviation (custom 1)", "Custom Abbreviation 2" => "Journal Abbreviation (custom 2)", "Tertiary Contributor(s)" => "Series Editor(s)", "Tertiary Title" => "Series Title", "default" => "Article _scope"), "MAP" => "Map _scope", "MGZN" => array( "Full Title" => "Magazine Name", "Editor(s)" => "Magazine editor(s)", "Official Abbreviation" => "Magazine Abbreviation (official)", "Custom Abbreviation 1" => "Magazine Abbreviation (custom 1)", "Custom Abbreviation 2" => "Magazine Abbreviation (custom 2)", "Tertiary Contributor(s)" => "Series Editor(s)", "Tertiary Title" => "Series Title", "default" => "Article _scope"), "MPCT" => "Motion Picture _scope", "MUSIC" => "_scope of Composition", "NEWS" => array( "Full Title" => "Newspaper Name", "Editor(s)" => "Newspaper editor(s)", "Official Abbreviation" => "Newspaper Abbreviation (official)", "Custom Abbreviation 1" => "Newspaper Abbreviation (custom 1)", "Custom Abbreviation 2" => "Newspaper Abbreviation (custom 2)", "Tertiary Contributor(s)" => "Series Editor(s)", "Tertiary Title" => "Series Title", "default" => "Article _scope"), "PAMP" => "Pamphlet _scope", "PAT" => "Patent _scope", "PCOMM" => "_scope of Communication (if applicable)", "RPRT" => "Report _scope", "SER" => "Series _scope", "SLIDE" => "_scope of Slide/Slide Show", "SOUND" => "Recording _scope", "THES" => "Thesis/Dissertation _scope", "UNPB" => "_scope of Composition", "VIDEO" => "_scope"); if(isset($someTypesOnly[$field])){ if(!in_array($ref_type, $someTypesOnly[$field])){ //do not display certain fields for some reference types return; } } if(isset($scopeOnly[$field])){ $label=$scope; } else { if(is_array($texts[$ref_type])){ if(isset($texts[$ref_type][$scope])){ $label =$texts[$ref_type][$scope]; }elseif(isset($texts[$ref_type]['default'])){ $label = str_replace("_scope", $scope, $texts[$ref_type]['default']); } } else { $label = str_replace("_scope", $scope, $texts[$ref_type]); } } //Generate the formfield echo " \n"; echo " \n"; echo " \n"; echo " \n"; } } function monthChooser($datetype,$month) { echo ""; } function dateChooser($datetype,$date) { echo " "; } function parseRSS($lines) { // initialialise form variables $formfields['AU']=""; // Author of catalogued material (article/chapter for analtyic, book for monographic, etc. $formfields['A2']=""; // Secondary Contributor (i.e. Editor of Book) $formfields['A3']=""; // Series editor $formfields['N2']=""; // Abstract $formfields['AD']=""; // Contact Address $formfields['AV']=""; // AVAILABILITY. Can be prose description of a physical copy, or call number $formfields['CY']=""; // CITY of Publication (Book) $formfields['EP']=""; //END PAGE $formfields['ID']=""; // CITATION (Supplied by RefDB $formfields['IS']=""; // ISSUE of Volume Periodical $formfields['J1']=""; // Additional User Supplied Journal Abbreviation $formfields['J2']=""; // Additional User Supplied Addition $formfields['JF']=""; //Full Journal Name $formfields['JO']=""; // Abbreviated Journal Name (official) $formfields['KW']=""; // Subject descriptors or Keywords $formfields['M1']=""; //Miscellaneous Field 1 $formfields['M2']=""; //Miscellaneous Field 1 $formfields['M3']=""; //Miscellaneous Field 1 $formfields['N1']=""; //Notes (any type) $formfields['N2']=""; // Abstract $formfields['PB']=""; // PUBLISHER $PY=""; //original RIS form of publication year $formfields['PYyear']=""; // Publication Year: YYYY $formfields['PYmonth']=""; // Publication Month: MM $formfields['PYday']=""; // Publication Day: DD $formfields['PYother']=""; // Publication Other: Otherinfo $Y2=""; //original RIS form of publication year 2 $formfields['Y2year']=""; // Publication Year: YYYY $formfields['Y2month']=""; // Publication Month: MM $formfields['Y2day']=""; // Publication Day: DD $formfields['Y2other']=""; // Publication Other: Otherinfo $formfields['RP']=""; //Reprint status: IN FILE, NOT IN FILE, ON REQUEST MM/DD/YY $formfields['SN']=""; //ISSN or ISSB number $formfields['SP']=""; //START PAGE $formfields['TI']=""; //Primary Title $formfields['T2']=""; // Secondary Title $formfields['T3']=""; // Teritary Title $formfields['TY']=""; //Citation Type $formfields['U1']=""; //User Defined Field 1 $formfields['U2']=""; //User Defined Field 2 $formfields['U3']=""; //User Defined Field 3 $formfields['U4']=""; //User Defined Field 4 $formfields['U5']=""; //User Defined Field 5 $formfields['UR']=""; //URL (official) of an On-line Reference $formfields['L1']=""; //URL (local) of a private copy $formfields['VL']=""; //Volume of Journal/Periodical // Set some switches we'll be using below in combining multiple fields into a single form variable. $firstAU="true"; $firstA2="true"; $firstA3="true"; $firstKW="true"; // Cycle through resulting array if (isset($lines)) { foreach ($lines as $line) { // Check the type of each line and extract the content $test=substr($line,0,2); # $content=htmlentities(substr($line,6)); $content=substr($line,6); // Assign the form variables based on the value of the test variable if ($test=="N2") { $formfields['N2']=$content; } if ($test=="AU"||$test=="A1") { $content=str_replace(",", ", ", $content); if ($firstAU=="true") { $formfields['AU']=$content; $firstAU="false"; } else { $formfields['AU']=$formfields['AU'] . "; " . $content; } } if ($test=="A2") { $content=str_replace(",", ", ", $content); if ($firstA2=="true") { $formfields['A2']=$content; $firstA2="false"; } else { $formfields['A2']=$formfields['A2'] . "; " . $content; } } if ($test=="A3") { $content=str_replace(",", ", ", $content); if ($firstA3=="true") { $formfields['A3']=$content; $firstA3="false"; } else { $formfields['A3']=$formfields['A3'] . "; " . $content; } } if ($test=="AD") { $formfields['AD']=$content; // Contact Address } if ($test=="AV") { $formfields['AV']=$content; // AVAILABILITY. Can be prose description of for internal URL: PATH: } if ($test=="BT") { if ($formfields['TI']!="") { if ($formfields['T2']=="") { $formfields['T2']=$content; } } else { $formfields['TI']=$content; } } if ($test=="CY") { $formfields['CY']=$content; // CITY of Publication (Book) } if ($test=="EP") { $formfields['EP']=$content; //END PAGE } if ($test=="ID") { $formfields['ID']=$content; // CITATION (Supplied by RefDB } if ($test=="IS") { $formfields['IS']=$content; // ISSUE of Volume Periodical } if ($test=="J1") { $formfields['J1']=$content; // Additional User Supplied Journal Abbreviation } if ($test=="J2") { $formfields['J2']=$content; // Additional User Supplied Addition } if ($test=="JF") { $formfields['JF']=$content; //Full Journal Name } if ($test=="JO") { $formfields['JO']=$content; // Abbreviated Journal Name (official) } if ($test=="KW") { if ($firstKW=="true") { $formfields['KW']=$content; $firstKW="false"; } else { $formfields['KW']=$formfields['KW'] . "; " . $content; } } if ($test=="M1") { $formfields['M1']=$content; //Miscellaneous Field 1 } if ($test=="M2") { $formfields['M2']=$content; //Miscellaneous Field 1 } if ($test=="M3") { $formfields['M3']=$content; //Miscellaneous Field 1 } if ($test=="N1") { $formfields['N1']=$content; //Notes (any type) } /* if ($test=="N2") { $formfields['N2']=$content; // Abstract } */ if ($test=="PB") { $formfields['PB']=$content; // PUBLISHER } if ($test=="PY") { $PY=explode("/",$content); list($formfields['PYyear'], $formfields['PYmonth'], $formfields['PYday'], $formfields['PYother'])=$PY; } if ($test=="Y2") { $Y2=explode("/",$content); list($formfields['Y2year'], $formfields['Y2month'], $formfields['Y2day'], $formfields['Y2other'])=$Y2; } if ($test=="RP") { $formfields['RP']=$content; //Reprint status: IN FILE, NOT IN FILE, ON REQUEST MM/DD/YY } if ($test=="SN") { $formfields['SN']=$content; //ISSN or ISSB number } if ($test=="SP") { $formfields['SP']=$content; //START PAGE } if ($test=="TI") { $formfields['TI']=$content; //Primary Title } if ($test=="T2") { $formfields['T2']=$content; // Secondary Title } if ($test=="T3") { $formfields['T3']=$content; // Teritary Title } if ($test=="TY") { $formfields['TY']=$content; //Citation Type } if ($test=="U1") { $formfields['U1']=$content; //User Defined Field 1 } if ($test=="U2") { $formfields['U2']=$content; //User Defined Field 2 } if ($test=="U3") { $formfields['U3']=$content; //User Defined Field 3 } if ($test=="U4") { $formfields['U4']=$content; //User Defined Field 4 } if ($test=="U5") { $formfields['U5']=$content; //User Defined Field 5 } if ($test=="UR") { $formfields['UR']=$content; //URL (official) of an On-line Reference } if ($test=="L1") { $formfields['L1']=$content; //URL (official) of an On-line Reference } if ($test=="VL") { $formfields['VL']=$content; //Volume of Journal/Periodical } } } else { echo "

No content in variable

"; } /* $RIS = array("formAB"=>$formAB, "formAU"=>$formAU, "formA2"=>$formA2, "formA3"=>$formA3, "formAD"=>$formAD, "formAV"=>$formAV, "formCY"=>$formCY, "formEP"=>$formEP, "formID"=>$formID, "formIS"=>$formIS, "formJ1"=>$formJ1, "formJ2"=>$formJ2, "formJF"=>$formJF, "formJO"=>$formJO, "formKW"=>$formKW, "formM1"=>$formM1, "formM2"=>$formM2, "formM3"=>$formM3, "formN1"=>$formN1, /* "formN2"=>$formN2, / "formPB"=>$formPB, "formPY"=>$PY, "formPYyear"=>$formPYyear, "formPYmonth"=>$formPYmonth, "formPYday"=>$formPYday, "formPYother"=>$formPYother, "formY2"=>$Y2, "formY2year"=>$formY2year, "formY2month"=>$formY2month, "formY2day"=>$formY2day, "formY2other"=>$formY2other, "formRP"=>$formRP, "formSN"=>$formSN, "formSP"=>$formSP, "formT1"=>$formTI, "formT2"=>$formT2, "formT3"=>$formT3, "referencetype"=>$referencetype, "formU1"=>$formU1, "formU2"=>$formU2, "formU3"=>$formU3, "formU4"=>$formU4, "formU5"=>$formU5, "formUR"=>$formUR, "formVL"=>$formVL); */ return $formfields; } ?> refdb-1.0.2/phpweb/includes/refdblib.inc.php000644 001750 001750 00000035430 12255426414 021601 0ustar00markusmarkus000000 000000 2007-11-02 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, see ********************************/ class RefDB { var $usernamearg; /* username for db authentication */ var $passwordarg; /* password for db authentication */ var $dbarg; /* name of database to connect to */ var $pdf_rootarg; /* base path of offprint repository */ var $client; /* full path of refdbc or refdba binary */ function __construct($username, $password, $db, $pdf_root, $client) { $this->usernamearg = strlen($username) ? " -u ".$username : ""; $this->passwordarg = strlen($password) ? " -w ".$password : ""; $this->dbarg = strlen($db) ? " -d ".$db : ""; $this->pdf_rootarg = strlen($pdf_root) ? " -R ".$pdf_root : ""; $this->client = $client; /* this is the full path of the binary with all mandatory arguments. We send the output to stdout to bypass any pager that may lurk in the user's config files */ $this->clientcmd = $this->client.$this->usernamearg.$this->passwordarg.$this->dbarg." -c stdout "; } protected function _run_command($command) { $lines = ""; $exit_state = 0; // echo "

DEBUG: running command $command

"; exec($command, $lines, $exit_state); // echo "

DEBUG: exit state went to $exit_state

"; switch($exit_state) { case 0: return $lines; break; default: return array("ERROR"); } } public function addstyle_from_file($file) { $command = $this->clientcmd." -C addstyle ".escapeshellarg($file); return $this->_run_command($command); } public function adduser($host, $database, $newuserpasswd, $username) { $command = $this->clientcmd." -C adduser -d ".escapeshellarg($database); if (strlen($newuserpasswd) > 0) { $command .= " -W ".$newuserpasswd; } if (strlen($host) > 0) { $command .= " -H ".$host; } $command .= $username; return $this->_run_command($command); } public function deleteuser($host, $database, $username) { $command = $this->clientcmd." -C deleteuser -d ".escapeshellarg($database); if (strlen($host) > 0) { $command .= " -H ".$host; } $command .= $username; return $this->_run_command($command); } public function addword($words) { $command = $this->clientcmd." -C addword ".escapeshellarg($words); return $this->_run_command($command); } public function deleteword($words) { $command = $this->clientcmd." -C deleteword ".escapeshellarg($words); return $this->_run_command($command); } public function confserv($command) { $command = $this->clientcmd." -C confserv ".escapeshellarg($command); return $this->_run_command($command); } public function createdb($dbname, $encoding) { $command = $this->clientcmd." -C createdb "; if (strlen($encoding) > 0) { $command .= " -E ".escapeshellarg($encoding); } $command .= " ".escapeshellarg($dbname); return $this->_run_command($command); } public function deletedb($dbname) { $command = $this->clientcmd." -C deletedb ".escapeshellarg($dbname); return $this->_run_command($command); } public function deletestyle($style) { $command = $this->clientcmd." -C deletestyle ".escapeshellarg($style); return $this->_run_command($command); } public function getstyle($style) { $command = $this->clientcmd." -C getstyle ".escapeshellarg($style); return $this->_run_command($command); } public function listdb($dbname) { $command = $this->clientcmd." -C listdb ".escapeshellarg($dbname); return $this->_run_command($command); } public function listuser($dbname, $user) { $command = $this->clientcmd." -C listuser -d ".escapeshellarg($dbname)." ".escapeshellarg($user); return $this->_run_command($command); } public function listword($word) { $command = $this->clientcmd." -C listword ".escapeshellarg($word); return $this->_run_command($command); } public function liststyle($style) { $command = $this->clientcmd." -C liststyle ".escapeshellarg($style); return $this->_run_command($command); } public function viewstat() { $command = $this->clientcmd." -C viewstat"; return $this->_run_command($command); } public function scankw($dbname) { $command = $this->clientcmd." -C scankw ".escapeshellarg($dbname); return $this->_run_command($command); } public function addref($owner, $refdata, $type, $encoding) { return array("ERROR"); } public function addref_from_file($owner, $file, $type, $encoding) { $command = $this->clientcmd." -C addref -A $type ".escapeshellarg($file); if (strlen($encoding) > 0) { $command .= " -E $encoding"; } return $this->_run_command($command); } public function updateref($owner, $is_personal, $refdata, $type, $encoding) { return array("ERROR"); } public function updateref_from_file($owner, $file, $type, $encoding) { $command = $this->clientcmd." -C updateref -A $type ".escapeshellarg($file); if (strlen($encoding) > 0) { $command .= " -E $encoding"; } return $this->_run_command($command); } public function checkref($risdata, $type, $encoding, $outtype) { return array("ERROR"); } public function checkref_from_file($owner, $file, $type, $encoding) { $command = $this->clientcmd." -C checkref -A $type ".escapeshellarg($file); if (strlen($encoding) > 0) { $command .= " -E $encoding"; } return $this->_run_command($command); } public function deleteref($idlist) { $command = $this->clientcmd." -C deleteref ".escapeshellarg($idlist); return $this->_run_command($command); } public function addnote($owner, $xnotedata) { return array("ERROR"); } public function addnote_from_file($owner, $file) { $command = $this->clientcmd." -C addnote ".escapeshellarg($file); return $this->_run_command($command); } public function updatenote($owner, $xnotedata) { return array("ERROR"); } public function updatenote_from_file($owner, $file) { $command = $this->clientcmd." -C note ".escapeshellarg($file); return $this->_run_command($command); } public function deletenote($idlist) { $command = $this->clientcmd." -C deletenote ".escapeshellarg($idlist); return $this->_run_command($command); } public function addlink($linkspec) { $command = $this->clientcmd." -C addlink ".escapeshellarg($idlist); return $this->_run_command($command); } public function deletelink($linkspec) { $command = $this->clientcmd." -C deletelink ".escapeshellarg($idlist); return $this->_run_command($command); } public function getas($limit_string, $freq, $name) { $command = $this->clientcmd." -C getas ".escapeshellarg($name); if (strlen($freq) > 0) { $command .= " -s $freq"; } if (strlen($limit_string) > 0) { $command .= " -N $limit_string"; } return $this->_run_command($command); } public function getau($limit_string, $freq, $name) { $command = $this->clientcmd." -C getau ".escapeshellarg($name); if (strlen($freq) > 0) { $command .= " -s $freq"; } if (strlen($limit_string) > 0) { $command .= " -N $limit_string"; } return $this->_run_command($command); } public function getax($limit_string, $freq, $name) { $command = $this->clientcmd." -C getax ".escapeshellarg($name); if (strlen($freq) > 0) { $command .= " -s $freq"; } if (strlen($limit_string) > 0) { $command .= " -N $limit_string"; } return $this->_run_command($command); } public function geted($limit_string, $freq, $name) { $command = $this->clientcmd." -C geted ".escapeshellarg($name); if (strlen($freq) > 0) { $command .= " -s $freq"; } if (strlen($limit_string) > 0) { $command .= " -N $limit_string"; } return $this->_run_command($command); } public function getkw($limit_string, $freq, $name) { $command = $this->clientcmd." -C getkw ".escapeshellarg($name); if (strlen($freq) > 0) { $command .= " -s $freq"; } if (strlen($limit_string) > 0) { $command .= " -N $limit_string"; } return $this->_run_command($command); } public function getjf($is_all, $limit_string, $freq, $name) { $command = $this->clientcmd." -C getjf ".escapeshellarg($name); if (strlen($freq) > 0) { $command .= " -s $freq"; } if (strlen($limit_string) > 0) { $command .= " -N $limit_string"; } if ($is_all=="t") { $command .= " -a "; } return $this->_run_command($command); } public function getjo($is_all, $limit_string, $freq, $name) { $command = $this->clientcmd." -C getjo ".escapeshellarg($name); if (strlen($freq) > 0) { $command .= " -s $freq"; } if (strlen($limit_string) > 0) { $command .= " -N $limit_string"; } if ($is_all=="t") { $command .= " -a "; } return $this->_run_command($command); } public function getj1($is_all, $limit_string, $freq, $name) { $command = $this->clientcmd." -C getj1 ".escapeshellarg($name); if (strlen($freq) > 0) { $command .= " -s $freq"; } if (strlen($limit_string) > 0) { $command .= " -N $limit_string"; } if ($is_all=="t") { $command .= " -a "; } return $this->_run_command($command); } public function getj2($is_all, $limit_string, $freq, $name) { $command = $this->clientcmd." -C getj2 ".escapeshellarg($name); if (strlen($freq) > 0) { $command .= " -s $freq"; } if (strlen($limit_string) > 0) { $command .= " -N $limit_string"; } if ($is_all=="t") { $command .= " -a "; } return $this->_run_command($command); } public function getref($type, $format_string, $sort_string, $listname, $encoding, $limit_string, $namespace, $frequency, $query) { $command = $this->clientcmd." -C getref "; if (strlen($type) > 0) { $command .= " -t ".escapeshellarg($type); } if (strlen($format_string) > 0) { $command .= " -s ".escapeshellarg($format_string); } if (strlen($sort_string) > 0) { $command .= " -S ".escapeshellarg($sort_string); } if (strlen($listname) > 0) { $command .= " -b ".escapeshellarg($listname); } if (strlen($encoding) > 0) { $command .= " -E ".escapeshellarg($encoding); } if (strlen($limit_string) > 0) { $command .= " -N ".escapeshellarg($limit_string); } if (strlen($namespace) > 0) { $command .= " -n ".escapeshellarg($namespace); } if (strlen($query) > 0) { $command .= " ".escapeshellarg($query); // $command .= " ".$query; } if (strlen($frequency) > 0 && $frequency != 0) { $command .= " -Q"; } return $this->_run_command($command); } public function countref($listname, $limit_string, $query) { $command = $this->clientcmd." -C countref "; if (strlen($listname) > 0) { $command .= " -b ".escapeshellarg($listname); } if (strlen($limit_string) > 0) { $command .= " -N ".escapeshellarg($limit_string); } if (strlen($query) > 0) { $command .= " ".escapeshellarg($query); } // countref returns nothing on stdout, the summary appears // on stderr. Redirect the latter to stdout so run_command // will read it as regular output $command .= " 2>&1"; return $this->_run_command($command); } public function pickref($idlist, $listname) { $command = $this->clientcmd." -C pickref "; if (strlen($listname) > 0) { $command .= " -b ".escapeshellarg($listname); } $command .= " ".escapeshellarg($idlist); return $this->_run_command($command); } public function dumpref($idlist, $listname) { $command = $this->clientcmd." -C dumpref "; if (strlen($listname) > 0) { $command .= " -b ".escapeshellarg($listname); } $command .= " ".escapeshellarg($idlist); return $this->_run_command($command); } public function getnote($type, $format_string, $sort_string, $encoding, $limit_string, $namespace, $query) { $command = $this->clientcmd." -C getnote "; if (strlen($type) > 0) { $command .= " -t ".escapeshellarg($type); } if (strlen($format_string) > 0) { $command .= " -s ".escapeshellarg($format_string); } if (strlen($sort_string) > 0) { $command .= " -S ".escapeshellarg($sort_string); } if (strlen($encoding) > 0) { $command .= " -E ".escapeshellarg($encoding); } if (strlen($limit_string) > 0) { $command .= " -N ".escapeshellarg($limit_string); } if (strlen($namespace) > 0) { $command .= " -n ".escapeshellarg($namespace); } if (strlen($query) > 0) { $command .= " ".escapeshellarg($query); } return $this->_run_command($command); } public function countnote($listname, $limit_string, $query) { $command = $this->clientcmd." -C countnote "; if (strlen($limit_string) > 0) { $command .= " -N ".escapeshellarg($limit_string); } if (strlen($query) > 0) { $command .= " ".escapeshellarg($query); } return $this->_run_command($command); } public function selectdb($dbname) { $this->dbarg = strlen($dbname) ? " -d ".$dbname : ""; $this->clientcmd = $this->client.$this->usernamearg.$this->passwordarg.$this->dbarg." -c stdout "; return array($dbname); } public function whichdb() { $command = $this->clientcmd." -C whichdb"; return $this->_run_command($command); } public function updatejo($names) { $command = $this->clientcmd." -C updatejo ".escapeshellarg($names); return $this->_run_command($command); } public function texbib($style, $cite_data) { return array("ERROR"); } public function dbib($style, $encoding, $cite_data) { return array("ERROR"); } public function getrefx($type, $encoding, $cite_data) { return array("ERROR"); } public function getversion() { $command = $this->clientcmd." -v"; return $this->_run_command($command); } } /* end class RefDB */ ?> refdb-1.0.2/phpweb/images/Makefile.in000644 001750 001750 00000031026 12303475767 020261 0ustar00markusmarkus000000 000000 # Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = phpweb/images DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/./conf/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/./conf/mkinstalldirs CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BIB2RIS = @BIB2RIS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ ULLSPEC = @ULLSPEC@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bib2ris_LDADD = @bib2ris_LDADD@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ classpath_root = @classpath_root@ client1_mans = @client1_mans@ client_bins = @client_bins@ client_etc_distobjects = @client_etc_distobjects@ client_etc_objects = @client_etc_objects@ client_mans = @client_mans@ client_scripts = @client_scripts@ client_subdirs = @client_subdirs@ datadir = @datadir@ datarootdir = @datarootdir@ db_dir = @db_dir@ docbk_xsl = @docbk_xsl@ docbk_xsl_ns = @docbk_xsl_ns@ docdir = @docdir@ docs_subdirs = @docs_subdirs@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ log_dir = @log_dir@ main_db = @main_db@ man_subdirs = @man_subdirs@ mandir = @mandir@ mkdir_p = @mkdir_p@ mybatik = @mybatik@ mydtdformat = @mydtdformat@ mydtdparse = @mydtdparse@ myjade = @myjade@ myperl = @myperl@ mysgrep = @mysgrep@ myshell = @myshell@ mysvnversion = @mysvnversion@ mytidy = @mytidy@ myxmlcatalog = @myxmlcatalog@ myxsltproc = @myxsltproc@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psarg = @psarg@ psdir = @psdir@ refdba_LDADD = @refdba_LDADD@ refdbc_LDADD = @refdbc_LDADD@ refdbd_LDADD = @refdbd_LDADD@ sbindir = @sbindir@ server8_mans = @server8_mans@ server_bins = @server_bins@ server_etc_distobjects = @server_etc_distobjects@ server_etc_objects = @server_etc_objects@ server_mans = @server_mans@ server_scripts = @server_scripts@ server_subdirs = @server_subdirs@ sgml_decl = @sgml_decl@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ svnversioncommand = @svnversioncommand@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ tei_xsl = @tei_xsl@ tei_xsl_ns = @tei_xsl_ns@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ trang_cmd = @trang_cmd@ var_dir = @var_dir@ xml_decl = @xml_decl@ objects = bg.gif left_on.gif left.gif norm_left_on.gif norm_left.gif norm_right_on.gif norm_right.gif refdb.png right_on.gif right.gif EXTRA_DIST = $(objects) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu phpweb/images/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu phpweb/images/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-data-local install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags-am uninstall uninstall-am install-data-local: $(mkinstalldirs) $(DESTDIR)$(pkgdatadir)/www/images chmod 1777 $(DESTDIR)$(pkgdatadir)/www/images @for f in $(objects); do \ $(INSTALL_DATA) $$f $(DESTDIR)$(pkgdatadir)/www/images/$$f; \ done # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: refdb-1.0.2/phpweb/images/Makefile.am000644 001750 001750 00000000666 11512721655 020245 0ustar00markusmarkus000000 000000 ## Process this file with automake to produce Makefile.in objects = bg.gif left_on.gif left.gif norm_left_on.gif norm_left.gif norm_right_on.gif norm_right.gif refdb.png right_on.gif right.gif EXTRA_DIST = $(objects) install-data-local: $(mkinstalldirs) $(DESTDIR)$(pkgdatadir)/www/images chmod 1777 $(DESTDIR)$(pkgdatadir)/www/images @for f in $(objects); do \ $(INSTALL_DATA) $$f $(DESTDIR)$(pkgdatadir)/www/images/$$f; \ done refdb-1.0.2/phpweb/images/bg.gif000644 001750 001750 00000000243 11512721655 017257 0ustar00markusmarkus000000 000000 GIF89a-„ ÝãÕÛáÓþþþòôîæéàÚàÒüüüõ÷òùù÷êíäàäÖåèÞîñêíðéïòëâåÚøøö÷÷õóõðéìãúúøûûûëîçwfUãæÛäçÝýýýìïèáäÙñóîàãØèëâ,-(`!Ždižhª®lë¾p,Ïtmßx®ï|ïÿÀ pH,ÈäìÂl:ŸÏ;refdb-1.0.2/phpweb/images/left_on.gif000644 001750 001750 00000000542 11512721655 020317 0ustar00markusmarkus000000 000000 GIF89a –ÄÿÿÿwfUþþþýýüúúøùù÷ýýýüüúùøöø÷õõôïöõñôòíòñëöõð÷öòÝÙÕ»³ªõôóqaéæã˜‹~“…x“…w®¤šÖÔÌòñêÖÔËĽ´¹±§·®¤âåÚ!ù, –ßà'f]5ÈY$ÀÇaloWmÃ^´ÛÈ6y C&h6Nƒa@ L¡PP³ˆDâЇ‚Q>'ÔF;ì`44åmb±fgÏ| a ^X[aVSY[]RW…PM”ULNOIKGŸ¡?¤;¦6¨J£¬Iª ­¢®±¥´§¶©¸«³¼²¾µ½À¿·ÁÄùÅÈǻ˰ÉÌÂÑÆÒÊÔÐÓØÕÙ×ÚÝÜßÎͯãºáÖæÛèÞêàäÏìðîâåòçõé÷ëùíôýïûñüÍû'Ð^A|õ%;refdb-1.0.2/phpweb/images/left.gif000644 001750 001750 00000000563 11512721655 017626 0ustar00markusmarkus000000 000000 GIF89a –Ä·®ˆïíåàÜÌìêàñïéçäØ×Ò½ÛÖÄÖÑ»ôóíûûúöõòèåÚßÛËø÷ôÙÕÂáÞÐñïèðîçž ëèÞíëâîìãùøöÜØÆ¼´ÓÏ·ØÓ¿îìäåâÔÇÀ£âåÚ!ù, –ðà'Bˆ—€xLÇà(Ê÷hlCS_βho‘(NÃ!"É$zÊÇè K¥êKH,  ‹­PÄd3ƒ1V(…P” Aƒ.¥t ƒ‡‹w‘X“•—Œ”–’š ž›™Ÿ˜¡§œ¤£¢¨¬¯®«²¦¥©¶°³ªµ­»·½¸´¿±¾¹¼ÄÁÅÂÆÃºÉÏÀÑÈÒÎÔÇÕÓÙØÛ×ÝÍÞÌáËãÊåÐÚàäçÜßíâæÖîêñïëéðèòøìõôóùýþã7ðž=}ÜgÐC„„(ð¡Â†%Z ;refdb-1.0.2/phpweb/images/norm_left_on.gif000644 001750 001750 00000000537 11512721655 021356 0ustar00markusmarkus000000 000000 GIF89a –ÄÿÿÿwfUþþþýýüúúøùù÷ýýýüüúùøöø÷õõôïöõñôòíòñëöõð÷öò»³ªÝÙÕéæãõôóqa˜‹áÝÙ˜‹~º±§“…xáÞÙÇÀ¸òñꮤš“…wÆ¿¸!ù, –Ü jXEøeP4‰ÀÖI°hyt `.^€òò¥„G€`¹ 0 †4„B! ½"‰G[@< Ƹœ@7믃ÑàŒ³‰EZ}-?ô }_ \VY_TQWY[PUƒNK’S"LLI:5Ÿ0¡"£¥§B¦©¨H«®­°F¯²±ž³¶µ ·º¹¢»¾½¤¿ÂÁªÅ¬´É¸Ê¼ÌÀÎÄÐÆÒÈËÖÍ×ÏÙÑÛÓÝÕØáÚâÜäÞæàãêåëçíéìñîòðóöõøÃ÷úùÇüÿþR8Pà7‚ÝB;refdb-1.0.2/phpweb/images/norm_left.gif000644 001750 001750 00000000564 11512721655 020662 0ustar00markusmarkus000000 000000 GIF89a –Ä·®ˆïíåàÜÌìêàñïéçäØ×Ò¼ÕкÛÖÄýýýôóíèåÛöõòø÷ôñïèëèÞÜØÆíëâÙÕÁðîçîìãúù÷ãßÐØÓ¿Å¾ŸÇÀ£ßÛ˼´îìäåâÔìéàÓη!ù, –ñ`">F¶€aˆ×ˆ ô9pU=m7 sH;†b˜YTx ‚c²Q • €'$(‘iO1¡ <€­5òx„«äÅ"œ <  `8,ÍÜÁyt4 ƒ ‹v’V”–˜Œ•—“ž›¡Ÿœš ™¢¨¥¤£©­°¯¬³§¦ª·±´«¶®¼¸¾¹µÀ²¿º½ÅÂÆÃÇÄ»ÊÐÁÒÉÓÏÕÈÖÔÚÙÜØÞÎßÍâÌäËæÑÛáåèÝàîãç×ïëòðìêñéóùíöõôúüØ ¾{û ,Èï࿆ *4q Ä…-N¼;refdb-1.0.2/phpweb/images/norm_right_on.gif000644 001750 001750 00000002413 11512721655 021534 0ustar00markusmarkus000000 000000 GIF89a–Äÿÿÿþþþýýüôòíùù÷òñêwfUòñëúúø÷öòöõñø÷õØÒȯ¤—‘ƒtåáÕèæÚïíæùøöêèÞíêâõôïçãØöõðýýýñðéüüúðîçëéßÀ¸®€p_Ëö!ù,–ÿ !Ždižhª®lë¾p,Ïtmßx®ï¯ç4€pH,ȤrÉl:ŸÐ¨tJ­Z¯Ø¬vû $FÃÑ pÏè´zÍn»ßp®WR‰@ĸ~Ïïûÿ€Dsu ‚‹ŒŽk„† ‘™š›œ“†ˆž¤¥¦§¨I w©¯°±²Ÿ_…»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÅ”àáâãäåæçèéêëìíîïðñòóôõö÷øùê ÚܼH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜÈÑá‚ (Üêf É“(Sÿª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ0\8°ÁP7o’*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`Êz€(€G X˶­Û·pãÊK·®Ý»xóêÝË·¯ß¿€ LØn†gz+̸±ãÇ#KžL¹2á ‡Âe ¬çÏ C‹Mº´éÓ¨S«^ͺµë×°cËžM»¶íÔS¨ÁÀØßÀƒ N¼¸ñãÈÐMa·УKŸN½ºõëØ³kßν»÷ïàËO¾¼ùóèÓk¿p¡Â€Ü™#X@¿¾ýûøóëßÏ¿¿ÿÿ(à€hà&¨àÿ‚ 6øŸIí à™Uhá…f¨á†vèa…,tì€À‰(¦¨âŠ,¶èâ‹0Æ(ãŒ4Öhã8æ¨ãŽ<öèã@Ò8DJð>H&©ä’L6éä“PF‰¤T¢¨K5Xf©å–\véå—`†‰%d–iÀ,h¦©æšgœÉæ›pÆ)çnÎiçx–Rgž|öé' {þ)è „¶Y衈&E Š6êh¢Œ>*é¤|FJ饘²ii¦œvšÊ¦ž†*ª& Žjê©”Šêª¬¾¡j«°ÆºÅ«²Öj뢷æªk´îê뮽þ*l­Ák,«Å«ì¨É.ë,§Í>+í¤ÑNk­ÿ¢Õ^«-¡ÙnëmŸÝ~+®áŽkî›åž«.šé®ëî+í¾+¯žóÖ›g¼öæ ¾úö»¿þìÀÁ'Ì 7l¨Ã“ñÄûRl1# _¬1oìñ,²!üqÉ&oŒrʯÌ2Å.¿qÌ2;LsÍ ßŒ³Á:ï,pÏ>û tÐúM´½F=oÒJ¿ËtÓë> õ¹RO=nÕV‹uÖÛnÍõµ^=mØb?KvÙËžö±j¯=lÛnÿ wÜÀÒ½óÜvߊwÞÄò-óÞ~à xàÈžòà†ŸŠxâÌ2.òâŽ{ yäÐR®²åOŽ9¥šo.içž; zˆèØ’>³éŽz¡ª¯>hë®ÿ {ìàÒγíÏŽûºï>gï¾Ç |ðè_´ñù|šÊ/?KóÎÇ}ôðRï´õîN½)ÚoOJ÷Þw~ø›ŒO~&æŸ_±úÞ¦Ï~#î¿ÿ¯üÚÆO? ÷[kþ}ìÏÿþûßÁè¬Ð <àÂȶ;refdb-1.0.2/phpweb/images/norm_right.gif000644 001750 001750 00000002646 11512721655 021050 0ustar00markusmarkus000000 000000 GIF89a–ÄÕк·®ˆÒ̵ÙÔÁâÞÐéæÛýýüÞÚÉÖÑ»×Ò½óòìëèÞìêà÷öóðîçîìãçäØúúøÉ¦ÔϸÍÇ­ÐʲËÄ©À¸—åâÔÜØÆØÓ¿ÏɰÎÈ®Êçüüûïíå!ù,–ÿ` Ždižhª®lë¾p,Ïtmßx®ï°$@† pH,ȤrÉl:ŸÐ¨tJ­Z¯Ø¬öé‰(‚ )›Ïè´zÍn»ßð¸|N¯Ûïø¼~Ïïûã   ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢• ¥­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄŹ ÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéÛɨÌañòóôõö÷øùúûüýþÿ H° Áƒ*ì· À² `@±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sÿª\ɲåÇ < !Ì›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§C ¸Ë !A€X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pã’•Ib‰òêÝË·¯ß¿€ L¸°áÈ+^̸±ãÇ#K.Œ³»ØÌ¹³çÏ C‹Mº´éÓ¨S«^ͺµë×°cËžM53 p ·ïßÀƒ N¼¸ñãÈ“+_μ¹óçУKŸN½ºuä j˜P¡Â†‹O¾¼ùóèÓ«_Ͼ½û÷ðãËŸO¿¾ýûøóëo¯wP@hà&¨àÿ‚ 6èàƒF(á„Vhá…f¨á†vø þ °tˆ(¦¨âŠ,¶èâ‹0Æ(ãŒ4Öhã8æ¨ãŽ<öèã@ÎÀT`& ä’L6éä“PF)å”TViå•Xf©å–\véå—`†)æ˜UN@d$v Ad¶éæ›pÆ)çœtÖi'™f™æšwöé矀*è „2™'š%òY袌6êè£ÆyèžlFj饘fª© “&Z馠†*ꨤBÙ©šŸ–ªêª¬¶ 詊º*무ֺ%¬©Úªë®¼ÊŠk¯À+즿kì±ÈZl²Ì6ëì˜Ë>+í´ÔJmÿµØfûìµÚvëm°Ü~+žI)¹è¦Ëj¸ê¶ë.¤ì¾+ï¼Êšë)½øæûª½¨êëï¿rÆ ðÀc)pÁ'ìäÁ 7Œ0ÃGü/ÄWL/ÅgÜ.Æw<.LJ¬-È"—<-É&§Ì,Ê*·<,Ë.ÇÌ+Ì2×L+Í6ç¼.¿±êìóË<çúóлâLôÑ—ôÒŽ*ÍôÓ„: õÔJMõÕuZõÖpjÍõ×Ð öØM‹MöÙQ›öÚU«ÍöÛY» ÷Ü]ËM÷Ýaëy/Þ|çh¿}þ¥×‚¿MxákŽøÙŠ/>v㎠yä[ONùÕ–_>uæš?ÍyçKúÿÑ¢>té¦ûŒzê9¯ÎzÍ®¿sì²·L{í)ߎ{ɺïrï¾w |ðO|ÅÆqòÊ7Ì|ó ?}ÁÒO?põÖOlwödcÏ}¾Þñöâs~ùïžþÆä¯Oµúî£ ü·O?ÓóßïmþúlÿDã«%ÀžìÔYè¬2pe| Ì(ÁcQ°‚@Óà0xºr0wü ïB(Âß‘°„Â;! ‹§Â"¯….\ cè¼Ò0z6¼!õr¨Ãëñ°‡ÚÓ`Ï€(² qUF騉2Ù½Æ ph¤áR¤8)ˆ¢h>“‰þ¹’ ¿ÌóGç–ÊÝĽ§ŸÄX$©¤B‚H‡{òöJAd2ž㸪"Å–_ ¬½{f>üÚ×¼þ“££ct\‚pÃ$}ƒ º$®‰$@à°H™°jõ0åRB¦Â‰'Ë©Ï;öÒ  ]êi¾YÌWâ/ ½®ùüù~òò˯{¿R'x4S“Ü}ßZq£ ð»8ƒ©Ð³Ú³hÛ!Ä'Žb­L½^Fº##õëXËÐÐðEGyà¶bÞ»h8ç?üóæð™/ë«ß»Ï›œçëÄÏ“øÚÄ(™’jƒÔ¥(‰2šB©ˆÖ†¬P¬.†R3ÝzFüÅIõUŸ- Ù}Ú`5f»Ã^xÑÛ†‡‡ßuá%­øÞewá\†0ê°öÀ*J…( DŠºRÁB£ÃôT‹$|Þãmo=¯?ëŒKËÅìŸg2nG•Z¿n°®ùÑ–üå§>÷ñÑñYÞÿ¾÷pØAÃÌÌŒsëpõï%îõyÎɇӋûܱé1úäºËšzH^z ÁR µ NSææpVà¬YÍ+N{ž;ùY‡^–ËØój…ò ?3‡;8{ÉEçM5›…K6=Äb•bØ5 31m_#•B4 H£J2Ÿ ™ÍGx¾am¿ÏYå*/*•þfDÈK‚rõާ³öOÌî½êškV¿ûœOÐï*Ö˜ã缞0ÌxƤeBXú}ÁæûwsñÅWÓ˜o!¼õ-¯â-o~ µj®*Wjwÿ:Áúó¿üú|å¢Kµç¾÷-d¼&qw!3Ì4ai~ßÄ,µS¾sù&-E˜KyåKŸÅÚJ ßHŒï!ŒFùVûÌ5»l~p;=²‹Å®GàÃsŽ_ÅÎ<­7R>/krV,©þ“ç1»¯ñŽÙNë³ýþ­á­ƒåDf8©dð‡ç(£±„)°À.)¹Q^½–4—á ‰QÞb/[QïkßÿxP­þ}YyóO~–|ª*¹> ‚Ô¥#é·™š¥Ù˜ —ðtŸÐWx<íÈç$'žt¯xåo£ŸTD\tñ÷øÑMw211óç½^üÚýãûŠ¿N°¶lÝAâqÒenvKóSBVT8jãj?h%«VÈe<kI¿ÃüÜ8ÙÝ4 TŸŒIeŸPt.^øÜ£9ãôçQ«Wi9[7?Æù\æ?ºkÿûßo4¼Ççàš³~>´¬î{ÙÀG8ƒL$ý¹I'v7Ç ì9Õ¦¨»T‡,-*~Ìs“”7¶=6ì]@Å>Sõ¸|jÛöNxÍÅ…ÿOŽþÓk~Êw’z­þæË¯¸îµRx¡³á‚o|†*UêÃ% €”€H@¤$NeË\yÍ LNviubî½w kÖÔˆ"õþb¡ðuà¾_P»vÏ~î‡?s¢•) =–æÉ*C6(2\iyQq¶Ý¯ /¶ž—]Bx÷’ ‹•šÄZ„’d Eê##d2!Ú(¤¤Ö÷S†³/›ãÛ×ÞËì\ÀC»{\~íÍœùâc^´F”o™mL½¡RÚ!ò•^§Ó¸ÄZïc‚w{‰Â¬Ä82™ÕZJ¥‚ñ ñãXæRL¢8´Ùa²ß ™­1^^Å-ûvQ‘m“_µê;@ý‚0:>ý'Ô;œp R{„a–j¥Æª‘•-?È}B 9'…wôŠ=Ìøí3¢@ùc]ÊäÌ cãû(—}²Ùð/泯.–*½_¬¾ðHµ"–¾ƒÅvBš/b¼*¾_¸sÅšáÍ,Ì–r•ÂY=Ñü¸öƒªU=R¡pÒ`ü,ùR¡«ç ùð­Ý¼pΓέ&µÇõº½#+Ã1ínÂ%W?L?‘Ü·m”‘šÄ3Gœ0¬¢wïÃ’}x¾ñMåùï6i2ÈåÒ`ýˆ°P¥¶r-µúÐÑ× !ÒG¯Þ1Å8}κÉé5·¤ZªG/21Ù`2žaC6_™œœ<³^¯û‚51=¹+ V€“$H%0¾Áó½ïxAú7ÅBé‰jovv¶fÓÞm6±çI4Ž¡aaižæâä´¶Osï£Ó,ö=5õx^ö܉™éÃÕÚ{r? ¬jã\ŠBá9‡¯$¡Ñ“YÏY©Tø™/é]óqI¨x®+zH•âM’oÌÐ× ‹]¥Š½ O˳, V$ $–!Ýòhæ…'Ü“ÿ¿R©Lös_}yc¶…MÙœ¡Z-Ð;$ILš&EkS`tÿüQ~ë»}×{>pÆÃ[§PJa­ûýÄÆlܰž¿û‡¯ìå/ý‹³Qðåz=·ફ®yû®»åøØùôD+›mn»u÷¤ÆöÌQÇo|áøÜÞQÏ3/¨fWì¸çžûn$— HѤsøÒ(×yªµg å¾[œøôªª/N9ùàgoyl<Ÿ¤Y¦çÛìØ9E©ä‰BÙüÕ|kæáb¦z£&EŠ„TuÐV ‘H©pÊᤳOÔ¸sá¾Åøª[›]º…å™*>ÈH§I[‡4¤ ütr€ìYd*A(œÔ¤©4}$‰6úN=QœìÝkOøÁÕ·~ôóç}á´Vð–8êÈ ¬¨fÈù>F¬÷{¶ù…/]vÔŸ}äÓ7\{íål&àm¿÷Z~ëäcËl£Ë®»“«®¹•OÿÍW˜j}ôì׿ìC““ÿ˜‰Ô7ï¸kó×^òÂçèÅŽ;ús\Áè¾2Ž=|˜jQ°qý4fæ#¹*W*}øIâ4}©‰PhçpÊ GìØÿsßirÃ7ÌÌ6î>¢ž½²¢ÒS÷‹›²gz†ÓóõrÁD… Àžuø©À¸ÅE6>Vg SÍþ©Cyï&€çFc÷Öû¦¦Îü—=½[gÉ7ûº}'Ç4ç)©6‘ï0¡AkýôÀr6ÁI·KÍ·Þ|<0ÆÝ›ö«d^xaï#ñ9lÚç]缕»ïzˆNßáûpü³åÙÇŒ´}Â0$“É¢•ù?Ò ­Úµs÷ ß¿ú‡¥(ëóös^˱G®£Û™"Žû„™ §~3Íin¹}߸èRV‚þÖQïÅEÇ>ç¤cßÔ\JNÚ»oöèlä#„ÃÓŠj¥ÀȰO>—aqq‰¥E?›50(—‡@,¿«8±|ñÔžõ¸U+¥¥OŸÉ9ù\öÁ±H,.-1;7O½±D½ÿð¥Kª -VKf;1[;mÆ'¦ÙÊÖ(ŸýѧnÙD¢$·é~öÏÏñHWÓ ò([š¶©&MT ñ #Tjë©fª=Ïó.zzaPĤiŒ>͹&›îÜ‚‹·¡¼<‰LJƒë)FB¹R夃æÙÏ9LÖ£Ûœ'ò#V¯`¨¶"ÍfJ]Ëíú­K¿_ŠSÃQÇN}¸ÊÞ}û12¥Z®àgrdMÄ©Ï?™»îÛC³ÕáŠ+¯aÍHçê§J¥¿ ¥Iúg )Œs!%ÆóðŒG>Ÿ§PÈ“ÉdñŒ‰œs¿R1“:°œµHáèöz,¶{t–Ú¸N¿¶\-ãèI‹ Ij˜5CìË<°?Eζ°~ÔÓôŒÄEy’|ž ÉÍ/ÑIštû]ª…#µÖ¯'—)~¡Z­ìyZ`à¬CJI¹\á§KÆ+!MÄ¥W^΢ ›-ó†7¾‚ã;­b”tôºKt;mªÅCÕ*«W­"ŸÍD)õý˯¸ú¯ÍV†LL,ò틯ëÈE…B J3>9‰sŸ˜bÛ£;Éf4™(sR!ï}ÜÿO¢08OˆA¬µ&Œ"J¥õz½U,f¾åùÞg!ÂýJk©}„ÔJ@ÒïÑé%t{1qÒ“ýù†÷P;EYð¤½,-²ÒÎSÌLQ®Vðt„ŠThº©£9×cÇd¾ÌäÈJö¤5êc>/·°º>Dµèõ‚¼þ"O7g <„ô°±#5ÃÃ9Êù<…r•vú,.»üÚ­67ýèv*å µªG!o}Aµ4D1[¦^¢\-×÷ýÏO-Ú³{lïº$¡4»wìftç”Ðå!¥ápÒâp(à™k{LOO17Wg¸^«F™L>b—Ü Ìyž‡ï{d²¢(sçŠúŠ·<±@c–ôËÁ•-ÂTh)Ú&D¡G’$ôÒ„ØÚJß&ÇÉTNj+È$@œ2” VKIM *R)¤‚ÄA‚GK&lšç6§™:èPZCunÚö(£¨–L&å¹À#O ,œÆ¡@8 žïˆ"G¹døÝWžÊÌLÛnÝ£ÛwpÃõ!gœñ"²™<+‡+sEòÙâ.ß÷?þWs¥rrãm“Z‹s£§Ÿv µ’O±P¢V¢P(bŒå°©e©c™›kÐhL‹ qÒ#NljQòg/R*´T•¿N;hãš·~ûGâl¶ƒ'S¤€K*v9/J'0)hçȦŽÈ@6c¨•óó<¡YÓ œuôcXVÌÍsÕÄ^v®_ÇCäâíÛ¨g©-çÏÍÍ}§\.ÏÿâCXÀ>ágFyDa–z}%Õ•%Þûž•LŒŠGÝÏ–-ÛÙ°a-‡üb ù!Š…Â»¢(úR±\Jo߾ǘ™™B ‡MzãiƒQ¦‡ï/¡´F…-^EQÊ–ÑZQ*dñ=‡kàÔÐS6ǯßxxWm¦±ˆ”ž´äƒ§FI¤’KRÊǬA*±p8á°Úá…År‘kVP«ÖðDÆ8&qÄΊ¡~·Ÿ9p¶Î#Ý vØ>3¥,»<̓ÛÇÉnÔ­?>ö‹=K¤ R„“Rx~Žb~ˆzee«\êÞùÁüÑ ?øÁO±°Øáªï_ÏúF¨•ªä³rõ“xÖqÇP©”˜š@)! rT«C¬¨×ÉçsH©pGHIS‡çd3r¹ü…¡<´ØN‡µÝ2cä@,ÿÉO¾/ÊåJÐþPç²ô¯uû–ÝG\zõ-¯¶N I‰¿ÎJG,Á Kßs-ýb¾Ü+Ëç U†.ø‰p²ï¯³qî¸Fn6 ýÇ}ÏCË>JÄŒMÎ2–(kï{Z`9¡p6A:ƒvNœé#MŒ¯ü+ŒQçrê±G¼ùN:ÿ¾AsAñÕ¯\ËŠúÁÉîìÛ÷Ъ‘U>>^ùi­Zvï˜=kŸ[àÀCÖ’+”ª S¯UpÎþ.ë„—Êö1~àŸnûz©…mϰÔôh·Wû³³³‡T*•m?·ë>(Y-ÈdBêb„v  N&7 ×n‹2þKßðÆW·N{ñóQZ091Ã?]p!;wïg¡¹ôáÉéÉu·feékÏ;åy{|ep ŒNwS<PÈB?:båªõ´rÕÈß®Z½òSkG6¼î‘‡'/¸û®­Ù»÷}±2\¹8WÎöœ´ƒ™+ œ8ép$@üÞÔÄÒ¸H ʤ p6ÄÑ× ]¿e~Þú¯¸eÇ»¯¿e뙳Í-ßá|@V êÅ2¦\¢ŸÍïh%Š6š¶ è©—fPI€²‘ªÔ%4FÜÏêN<;tþG¦R¤ÍRn*¢ñ®­èõq çÜð¿J‘,g)àHqÒ‘:GмLÊA?²^º·V*þå;ßùûí#XO?é°mû¾öõï±wlâðV§³krzâ¤ÇÇ<æèc>vøÁëñH˜Ú?ÃŽí{YZJhwl¶Ó?±q—]q÷ç?ó™|ï­·ÝsHµ6ôü©©éÞmNb…À H…€Åò¼dç–½§)†}à^ºD%QËÉ—üžö¾Õ)¾î¢E?mY‡g%2èTÙ€àgÚMýج½£þÉ?ÏM¼ïl–lVïeåä$¡LцÙJ)÷üÂ0xÐÆC^ ¤£×‹I‰uMŠ8üIáío×°ê¸w¿û^ý§þ+fM®½î6ŠÅoxÝ«8pÝê &§fO©UGºzþì7þî5ÓŸ=ÿÅ“Ón¼y~”'WR&S¹t²‘|hq±Ù¾á‡7~ð¼óÏÿ­J¹ÈkÎz Æ—ßèö;éÄô̹õêy­®ÌÇ ¬U$R<çÔOä¬ã;òõß¾üjœø]+ÌwfÈôt45³²uGûcÓs lÞòÀpkiñ_þÊŒÎv ýˆÕ#9N8l4wS,j+†¨®\E6*|32úf€X¸ç/´ñm‚T3Nò˜KðD‡ŒkåöÅ »¡1³+µi4 ¹•ßÞ;õ¶Ëg–¸µ˜Eâ8tÇvÖ?•Á^ ("¢(²åryÏS2ÅlÛù[×^{í ³³ õƒë6q×]›±Và{’ƒYÍÚuÃüÎo?Ÿ—¾ô%ß, g—K¹'6æÑ“ßüê…ß9ëóç}‰Ø:Œ„£:˜Ÿu/Ù‹>{ä‘îwÎ~·ÓIî¹éæ;×ÿíß_Ä£»÷H© •X¹¢Fà{,.,066ÆK_ü"~ïgat Äd ;v޳õ¡=ŒO6¹âš;è& ÊuX³²Èš‘Çsgžñ»­ ß|Ã÷|f|b逶rÓí›ôˆ³ø*Å“dÚC)Ð'ý$Á ü€‘jŽCÖ×Y;R ß܇G‹áú«×N}íaý\&ÿ{¶žððØÌ›vÎN³i×( þ06Èâ»9bÕÆ…ÚÓ(ÏCy©BJ¤Q$¡¢k$Âm,²±±3»íb†kë8úÀ£Y±jä¯Y³æOéYawÞy'ããHN8þ(––é÷»tZmv<²›ƒ7n¤Ój½.Èxvfâ•êp ZÎ~àŒWvô\cúoºׇÆì·ßqÏ}î±ç..6Éç£íQF”žûÜc\®¼F\óÃ[¸ûÞ»Xj-2ºo”|.ÚU«xó›Ïæ +Iãyzí>žñÈEÆF÷qß=÷ÒéÃAëë´;’~‡^§Éc{šä3>Í…¥PkïÂÇFóîÛ²Øi6n¨Ñí§tÚm’¸‹QŠ R¡AH‡jjCe2¹b)O­Z¡àIlk¤3EXªÕU ¯ZK}õÚN&}x(£>ÿÏßüÕí;ö° ú¬-J;ó4誡ì&~à»Kü0 Êd΢º]j}AA;Lwš´?M(}VDë© F½¶v)“ñ>ús5ó¥è¶ÛíŹ¹ÅìØ¾Q&¦&ÛO¯S(äXµj˜‘Õ5êÃU …Ò9Õrý Op`SÓŸžšûàΣŒNÑïv(†êV¬¬Q¯Õ¦r¹Üq/=er¦}âäääû§'YX\$µ–B.‡o ¡ç£dŒQ‚À©Uë”ËÕ»”ñÿ)qîó‹‹§îß?Åøø~&&öÓî´|ÃðP+댌¬$_Èïu‚5ÓssÌÎÍ3::ÆÄþIZ‹M‘æ4ëöÍðüVÂÑÃeV¶Ñæ‡êo­×ëÿòt÷ò×zðl÷Þ¹÷ÞzûíÅ-›8~v¶óŠ-›â”SþvkÎ*´°B€‘ ÍrèȰ•Hñ}C>R*ùd2† ôM2(ô<ƒB£œÀatá´…h¥jp @ÉAi.¥DI± žÂi‰“üéK‰Tƒ½`pr á€Ô’¦v¹uo±Î’XGbí /&ŽØZâÔÒ’]LÒ$h.ÒZ´EJ¦Ÿd|ƽ 9•Êœs…ËþþJ`}ík—¸yó§aæýwÜyOæä“_Lca EsdpN íƒthŽ6Z+„²dsÅBŽj¥@¹˜§ZÉSÈg Y£µ@Hb@…HáPrPúJeÐÚÇ3ãi<ÏàƒÑƒÒÛ(­=Œ€6Ècj‹”Æj jàA¡ì é €ËÇ›Út)$ÂYœM±é€@MEŠ]>ú”¤ ÎZÒ$!I’$!ISd?ÅöºiL«ßÃ%Ïø”ë+(dJKJ©«~#`=²}îÄ·ýá[o¸ýö»#m2ôcP>â8‘ µ@ˆJ*•,Ãõ•RŽj­L.W! Â]®R”H1Ò¡UÏ3˜ ïEøžo|<ícŒ‘ƒÍ‘DûÏóð<£ Úh”1£1*E ZRÊ1„XDÈQã BʾÞV‰š—馅s>`¤bIÑVú8ÑÉ•óOT¾óÍFÞÚô‡Ë‰Ô[”V;—úÖ¦+­Mulc¬µ8góΩ5qPªí‘qÚÃ&1.jÊa!õ<ïÃ…ZñÑßX­në%ûöOENzô‹ŒF øreIDATŠ)”|V­®³¢Q«–( øžx“x\Œ£QR/{Dˆï|ß' ƒÁADE¾Öf¹ ­ÑZ7„ Éf!ÅìrwzTHñ­õD©PLþ½òo1_j?ü¥Ï”-̇¥B±ó?¦:3¯þÆ7¾qû—$r Jå<Ùœ’Ò.Rª1Ïó0Æ, [|Â0$Š"Â0|âzü3ß÷1ÆlRJÝlŒÙ®µ¾EJùp©TJùÿÜ~i°æ›³CÝž{åìôÜ}t·Ü·oK‹ Xb|_ú™Læ P<Ï{˜ ‚¥ÔýRÊ;1Ƙ›”R·”Ëå>ÏØ¿Oé¾g÷®éýû§«3ÓÓôzmüÀà¹\‰(ÊƘ1¥Ô&­õ­õ>­õ÷*•Êø3Ûÿkzræ¸8Ž/ét:ë¬MÑZ¥ZËË”6[µ1÷j­¯,—ËÉ3[ýŒ=cÏØ3öŒýŠöÎÍ/òð ±IEND®B`‚refdb-1.0.2/phpweb/images/right_on.gif000644 001750 001750 00000002417 11512721655 020505 0ustar00markusmarkus000000 000000 GIF89a–Äÿÿÿýýüþþþôòíùù÷òñêwfUòñëúúø÷öòöõñø÷õÑÍÁ‘ƒtåáÕèæÚïíæ®¤–ùøöêèÞíêâçãØõôïöõðýýýñðéüüúðîç½µ©ëé߀p_âåÚ!ù,–ÿ !Ždižhª®lë¾p,Ïtmßx®ï¯×DŒ@,ȤrÉl:ŸÐ¨tJ­Z¯Ø¬vËí: …ip†Þ´zÍn»ß𸜠–X6ãÈyÎïûÿ€‚ƒEu „Ž‘’“m†ˆ”œžŸ –‰‹¡§¨©ª«K£˜¬²³´µ¢a‡¤½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖÇ—»àáâãäåæçèéêëìíîïðñòóôõö÷øùê ܯ H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜÈÑá‚ (<¨àÍ@‚“(Sÿª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@c*¸p`C"o»(]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÊKõ@Q ‘(À¶­Û·pãÊK·®Ý»xóêÝË·¯ß¿€ L¸ðÝ оÚe¸±ãÇ#KžL¹²åÂ6$&U¡‚³ C‹Mº´éÓ¨S«^ͺµë×°cËžM»¶íÛ¸W@L!уÈ N¼¸ñãÈ“+_.üo ½ (˜N½ºõëØ³kßν»÷ïàËO¾¼ùóèÓ«_Ͼû… ìÖ ÁÀ‚ûøóëßÏ¿¿ÿÿ(à€hà&¨àÿ‚ 6èàƒ x|€&PGf¨á†vèᇠ†Ø‘ $0Ý{  âŠ,¶èâ‹0Æ(ãŒ4Öhã8æ¨ãŽ<öèã@)ä7$Á‘ Ï’L6éä“PF)å”T2©Á•+òrÍ–\véå—`†)æ˜dn‰Á™h`Ëšl¶éfj¾)çœtÖYDœvæ©çž¨àÉ矀*ˆŸ‚jè¡p"ªè¢ŒNAh£FÊ裒Vj韔^ªé¦ofÊé§ ²âi¨¤–Úɨ¦¦ªê ¨®êê«q´ 무v!k­¸æê¨®¼özÅ­¾ë+°Â‹+±Æ&û*²Ê6k*³ÎFû)´ÒVk)ÿµÖfÛ(¶Úv{(·Þ† (¸â–›'¹æ¦+'ºê¶»&»îÆ+ ¼òÖÛ§½øòIo¾üN²o¿;òoÀ2pÁÏqp »±pÃ'ñħRl±¿güÈÃwìLJœÈ"—LÉ&‹Œrʯ̲Æ.¿|qÌ2SLsÍߌsÃ:ïœpÏ> tÐMt¿FoÒJÛËtÓò> µ»RO­nÕV›‹uÖân͵·^­mØb[KvÙÒž¶³j¯­lÛn wÜÂÎM÷°wûlwÞºîÍ÷±×ìwà³Nø²‡³lxâª.Îø³—ìxä¡NNù´—·œyÇ–o~içžW zŒè‘ŽNú¶§ÛœúĦ¯Žhë® {ì‚ÎNû¸·ÿœ;¶ï®gï¾Û |ðtOüºÇ#<¿Æ/ÏfóÎÛ}ô´LOý¼×G}¼ÖoŸJ÷ÞŸ~ø ŒO¾'æŸÏIúêcÜ~¸ì¿Iüò \·ôß?¨þÙæÏÿþû_(@…0Z< ¨@‡5ðm!;refdb-1.0.2/phpweb/images/right.gif000644 001750 001750 00000002601 11512721655 020004 0ustar00markusmarkus000000 000000 GIF89a–ÄÕк·®ˆÒ̵ÙÔÁâÞÐéæÛÞÚÉóòìÖѼëèÞÖлìêàðîç÷öóîìãçäØúúøýýüɦÔϸÐʲÍÇ­ËÄ©À¸—åâÔÜØÆØÓ¿ÏɰÎÈ®ÊçüüûâåÚ!ù,–ÿ` Ždižhª®lë¾p,Ïtmßx®ï°DeŸ`dH,ȤrÉl:ŸÐ¨tJ­Z¯Ø¬vËuz ‚à"BÎè´zÍn»ßð¸|N¯Ûïø¼~Ïïûÿ€s  e Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£– ¦®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆº   ÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêÝÊ©Ícñòóôõö÷øùúûüýþÿ H° Áƒ*ì— ³ X@±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sÿª\ɲåÇ < !Ì›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§C ¸Ë Ab«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pÇÊ$ÄxóêÝË·¯ß¿€ L¸°áÈ+^̸±ãÇ#Æ@ ™Ý hÞ̹³çÏ C‹Mº´éÓ¨S«^ͺµë×°cËž}º™0À»·ïßÀƒ N¼¸ñãÈ“+_μ¹óçУKŸN½úñ 5L @aC€àËO¾¼ùóèÓ«_Ͼ½û÷ðãËŸO¿¾ýûøó³¯ºC… Ø%à€hà&¨àÿ‚ 6èàƒF(á„Vhá…f¨áƒ°Atà†$–hâ‰(¦¨âŠ,¶¨!Rà_"`ã8æ¨ãŽ<öèã@)äDiä‘H&©ä’L6éä“AN#ˆH”Xf©å–\véå—`† ¥”P@¥•b¦©æšl¶éæ›pâH¦™!¢çxæ©çž|r9ç™Wö)è „j¨›Ö行6êè£ò˜h•‹Fj饘fÊæ¤vjêé§ †z$§•ŠjꩨzJjª¬¶êê¡«¾*무¶k­¸æªë“·îêë¯ÀúØk°Ä»ë°Æ&«l«È.ë쳪N©(´ÔV‹iÿ³Öf«-ŸØnëí·¶JK)¸ä–»©¸š«îºZvËî»ðén¼ôÖ«ã¼öæK/¾úö».¿þ .Àœ-Á'ü, 7l,ÃGü+ÄWŒ+Ågü*ÆwŒ*LJ *È"—|-º¥š¬2³(¯ì²«$¿,ó 1Ïl³ž5߬3œ9ïìóš=ÿ,4˜Amô–E­4¯-/ítžI?-µ‘QOmu”M_­u˜UoíµœY-6–]½uÙf_vÚS¯ÍöÓn¿½tÜrMwÝCß÷Ïzï½sß~ß xà3NøË†¾r⊛Ìxã"?¹Ç’O®qå–[ŒyæoιÞ®pþè¢Lz韎º¿ª¯®oë®Û {ìû†Mû׳ßþnîºÿk{ïjÿ|ÛÂwñÆÏ|òv/Ï|ÞÎ?ÏwôÒÿM}õ‚_}áÚox÷Þ/~øŽO~äæŸOyúê_Î~ûš¿çòÏzýöŽþ¦ïÏêþûë(À×°€²; kW&@-Ðe¼{`®"(ÁZQ°‚³º 7¦À šKƒdCø±’ð[#<¡¨R¨Â‘™°…{! «ÅÂfª†6¼s©òðQ>üa£‚(DXɰˆ;"‰EÄ%ÒL‰Nœ£x¬)Rq‚V¼¢³¨Å r±‹l ¢B;refdb-1.0.2/phpweb/css/Makefile.in000644 001750 001750 00000030701 12303475767 017603 0ustar00markusmarkus000000 000000 # Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = phpweb/css DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/./conf/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/./conf/mkinstalldirs CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BIB2RIS = @BIB2RIS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ ULLSPEC = @ULLSPEC@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bib2ris_LDADD = @bib2ris_LDADD@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ classpath_root = @classpath_root@ client1_mans = @client1_mans@ client_bins = @client_bins@ client_etc_distobjects = @client_etc_distobjects@ client_etc_objects = @client_etc_objects@ client_mans = @client_mans@ client_scripts = @client_scripts@ client_subdirs = @client_subdirs@ datadir = @datadir@ datarootdir = @datarootdir@ db_dir = @db_dir@ docbk_xsl = @docbk_xsl@ docbk_xsl_ns = @docbk_xsl_ns@ docdir = @docdir@ docs_subdirs = @docs_subdirs@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ log_dir = @log_dir@ main_db = @main_db@ man_subdirs = @man_subdirs@ mandir = @mandir@ mkdir_p = @mkdir_p@ mybatik = @mybatik@ mydtdformat = @mydtdformat@ mydtdparse = @mydtdparse@ myjade = @myjade@ myperl = @myperl@ mysgrep = @mysgrep@ myshell = @myshell@ mysvnversion = @mysvnversion@ mytidy = @mytidy@ myxmlcatalog = @myxmlcatalog@ myxsltproc = @myxsltproc@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psarg = @psarg@ psdir = @psdir@ refdba_LDADD = @refdba_LDADD@ refdbc_LDADD = @refdbc_LDADD@ refdbd_LDADD = @refdbd_LDADD@ sbindir = @sbindir@ server8_mans = @server8_mans@ server_bins = @server_bins@ server_etc_distobjects = @server_etc_distobjects@ server_etc_objects = @server_etc_objects@ server_mans = @server_mans@ server_scripts = @server_scripts@ server_subdirs = @server_subdirs@ sgml_decl = @sgml_decl@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ svnversioncommand = @svnversioncommand@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ tei_xsl = @tei_xsl@ tei_xsl_ns = @tei_xsl_ns@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ trang_cmd = @trang_cmd@ var_dir = @var_dir@ xml_decl = @xml_decl@ objects = main.css navigationlist.css refdb.css refdb-frequency.css EXTRA_DIST = $(objects) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu phpweb/css/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu phpweb/css/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-data-local install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags-am uninstall uninstall-am install-data-local: $(mkinstalldirs) $(DESTDIR)$(pkgdatadir)/www/css chmod 1777 $(DESTDIR)$(pkgdatadir)/www/css @for f in $(objects); do \ $(INSTALL_DATA) $$f $(DESTDIR)$(pkgdatadir)/www/css/$$f; \ done # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: refdb-1.0.2/phpweb/css/Makefile.am000644 001750 001750 00000000552 11512721655 017562 0ustar00markusmarkus000000 000000 ## Process this file with automake to produce Makefile.in objects = main.css navigationlist.css refdb.css refdb-frequency.css EXTRA_DIST = $(objects) install-data-local: $(mkinstalldirs) $(DESTDIR)$(pkgdatadir)/www/css chmod 1777 $(DESTDIR)$(pkgdatadir)/www/css @for f in $(objects); do \ $(INSTALL_DATA) $$f $(DESTDIR)$(pkgdatadir)/www/css/$$f; \ done refdb-1.0.2/phpweb/css/main.css000644 001750 001750 00000005561 11512721655 017171 0ustar00markusmarkus000000 000000 @import url(navigationlist.css); /* Screen Geography */ body { background:#DAE0D2; margin:0; padding:0; color:#333; font:x-small/1.5em Verdana, sans-serif; voice-family: "\"}\""; voice-family:inherit; font-size:small; max-width:65em; margin:auto; } /* Child selector hack (hides from IE/Win <= 6.0) */ /* html>body { font-size:small; } */ /* End Child-selector hack */ /* div#header, div#logo { background:#DAE0D2; color: inherit; } */ /* div#logo { float:left; width: 75%; } */ div#status { float:right; width: 25%; font-size:70%; /* margin-top:-7em; */ line-height: 150%; border-color: #776655; border-style: solid; border-top-width: thin; border-left-width: thin; border-bottom-width: medium; border-right-width: medium; background-color:#fff; color: inherit; padding-left:0.5em; padding-right:0.5em; } div#login { clear:both; border-color: #776655; border-style: solid; border-top-width: thin; border-left-width: thin; border-bottom-width: medium; border-right-width: medium; position:relative; margin:auto; text-align:center; background-color:white; color: inherit; width:30em; height:25em; padding-top:2em; } div#content { float: left; width: 96.5%; clear:left; background-color:#fff; /* #9eb5ad; */ color:black; border-color: #776655; border-style: solid; border-top-width: 0; border-left-width: thin; border-bottom-width: medium; border-right-width: medium; clear:none; padding-left:1em; padding-right:1em; padding-bottom:1em; padding-top:2em; margin:auto; } div#footer { width: 96.5%; color:gray; margin:auto; text-align:center; font-size:xx-small; float:left; position:relative; bottom:0px; } .tip { display:block; font-size:95%; color: #765; background-color: inherit; margin-bottom:1em; /* float: right; clear:left; */ } .bibliographicform, .record, .searchform, .entry { border-color:gray; border-style: solid; border-top-width: thin; border-left-width: thin; border-bottom-width: medium; border-right-width: medium; margin-bottom: 0.5em; padding-left: 0.5em; padding-right: 0.5em; padding-bottom: 0.5em; } td.formlabel { width:25%; text-align: right; vertical-align: top; } td.forminput { width:75%; text-align: left; } code { /* background-color:black; color:#12f907; font-weight:900; */ /* background-color:#8d8e8d; */ color:gray; background-color: inherit; font: 1em courier, monospace; } a img { border:none; vertical-align:middle; } /* Phrase level elements */ a { font-weight:bold; text-decoration:none; } h1, h2, h3, h4, strong { color:#765; /* #528f02; */ background-color: inherit; }refdb-1.0.2/phpweb/css/navigationlist.css000644 001750 001750 00000002455 11512721655 021277 0ustar00markusmarkus000000 000000 #navigationlist { float:left; clear:both; width:100%; background:#DAE0D2 url("../images/bg.gif") repeat-x bottom; color:inherit; font-size:70%; line-height:normal; margin-top:-5px; } #navigationlist ul { margin:0; padding:10px 10px 0; list-style:none; } #navigationlist li { float:left; background:url("../images/left.gif") no-repeat left top; margin:0; padding:0 0 0 9px; border-bottom:1px solid #765; } #navigationlist a { float:left; display:block; background:url("../images/right.gif") no-repeat right top; padding:5px 15px 4px 6px; text-decoration:none; font-weight:bold; color:#765; background-color:inherit; } /* commented backslash hack to hide rule from IE5-Mac \*/ #header a {float:none;} /* end commented backslash hack */ #navigationlist a:hover { color:#333; background-color:inherit; } #navigationlist #currentpage { background-image:url("../images/left_on.gif"); border-width:0; } #navigationlist #currentpage a { background-image:url("../images/right_on.gif"); color:#333; background-color:inherit; padding-bottom:5px; }refdb-1.0.2/phpweb/css/refdb.css000644 001750 001750 00000006275 11512721655 017332 0ustar00markusmarkus000000 000000 h1.h1 { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 140%; display: none; } h2.id { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 90%; } p.title { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 110%; font-weight: bold; } p.authors { font-family: Verdana, Arial, Helvetica, sans-serif; font-weight: bold; background-color: transparent; } p.abstract { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 90%; font-weight: normal; margin-left: 30px; } p.citekey { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 90%; font-weight: bold; } p.note { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 90%; font-weight: normal; margin-left: 30px; } p.m1 { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 70%; font-weight: bold; margin-left: 30px; } p.m2 { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 70%; font-weight: bold; margin-left: 30px; } p.m3 { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 70%; font-weight: bold; margin-left: 30px; } p.ur { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 70%; font-weight: normal; color: #003366; /* background-color: transparent; */ background-color: inherit; margin-left: 30px; } span.periodical { font-family: Verdana, Arial, Helvetica, sans-serif; font-style: italic; } span.volume { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 80%; font-weight: bold; color: #003366; /* background-color: transparent; */ background-color: inherit; } span.issue { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 80%; font-weight: bold; color: #003366; /* background-color: transparent; */ background-color: inherit; } span.page { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 80%; color: #003366; /* background-color: transparent; */ background-color: inherit; } table.duplist { border-width: 2px; border-style: solid; border-collapse: collapse; empty-cells: show; margin-top: 10pt; margin-bottom: 10pt;} table.duplist td { border-width: thin; border-style: solid;} table.duplist td.match-field { text-transform: lowercase; } table.duplist td.match-type { text-transform: lowercase; } table.duplist tr.IDENT { background-color: #B4FFB4; color:inherit; } table.duplist tr.ABBREV { background-color: #FFB4B4; color:inherit; } table.duplist tr.LIKE { background-color: #FFFFB4; color:inherit; } table.duplist tr.CASE { background-color: #B4B4FF; color:inherit; } .tooltip { position: absolute; display: none; background-color: #FFFFFF; color:inherit; border-width: 1px; border-style: solid; border-color: #000000; padding: 2px;} .ok { color: #00FF00; } .warn { color: #FFFF00; } refdb-1.0.2/phpweb/css/refdb-frequency.css000644 001750 001750 00000010223 11512721655 021315 0ustar00markusmarkus000000 000000 h1.h1 { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 140%; display: none; } h2.id { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 90%; } p.title { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 110%; font-weight: bold; } p.authors { font-family: Verdana, Arial, Helvetica, sans-serif; font-weight: bold; background-color: transparent; } p.abstract { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 90%; font-weight: normal; margin-left: 30px; } p.citekey { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 90%; font-weight: bold; } p.note { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 90%; font-weight: normal; margin-left: 30px; } p.m1 { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 70%; font-weight: bold; margin-left: 30px; } p.m2 { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 70%; font-weight: bold; margin-left: 30px; } p.m3 { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 70%; font-weight: bold; margin-left: 30px; } p.ur { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 70%; font-weight: normal; color: #003366; /* background-color: transparent; */ background-color: inherit; margin-left: 30px; } span.periodical { font-family: Verdana, Arial, Helvetica, sans-serif; font-style: italic; } span.volume { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 80%; font-weight: bold; color: #003366; /* background-color: transparent; */ background-color: inherit; } span.issue { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 80%; font-weight: bold; color: #003366; /* background-color: transparent; */ background-color: inherit; } span.page { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 80%; color: #003366; /* background-color: transparent; */ background-color: inherit; } .relfreq0 { color: #0000FF; background-color: inherit; font-size: 60%;} .relfreq1 { color: #0000DD; background-color: inherit; font-size: 70%; } .relfreq2 { color: #1100BB; background-color: inherit; font-size: 80%; } .relfreq3 { color: #330099; background-color: inherit; font-size: 90%; } .relfreq4 { color: #550077; background-color: inherit; font-size: 100%;} .relfreq5 { color: #770055; background-color: inherit; font-size: 110%;} .relfreq6 { color: #990033; background-color: inherit; font-size: 120%; } .relfreq7 { color: #BB0011; background-color: inherit; font-size: 130%; } .relfreq8 { color: #DD0000; background-color: inherit; font-size: 140%;} .relfreq9 { color: #FF0000; background-color: inherit; font-size: 150%;} .relfreq10 { color: #000000; background-color: inherit; font-size: 160%; } .ok { color: #00FF00; } .warn { color: #EE5500; } table.duplist { border-width: 2px; border-style: solid; border-collapse: collapse; empty-cells: show; margin-top: 10pt; margin-bottom: 10pt;} table.duplist td { border-width: thin; border-style: solid;} table.duplist td.match-field { text-transform: lowercase; } table.duplist td.match-type { text-transform: lowercase; } table.duplist tr.IDENT { background-color: #B4FFB4; color:inherit; } table.duplist tr.ABBREV { background-color: #FFB4B4; color:inherit; } table.duplist tr.LIKE { background-color: #FFFFB4; color:inherit; } table.duplist tr.CASE { background-color: #B4B4FF; color:inherit; } .tooltip { position: absolute; display: none; background-color: #FFFFFF; color:inherit; border-width: 1px; border-style: solid; border-color: #000000; padding: 2px;} refdb-1.0.2/src/Makefile.in000644 001750 001750 00000075166 12303475767 016333 0ustar00markusmarkus000000 000000 # Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ EXTRA_PROGRAMS = refdbd$(EXEEXT) refdbib$(EXEEXT) refdbc$(EXEEXT) \ refdba$(EXEEXT) refdbxp$(EXEEXT) eenc$(EXEEXT) \ bib2ris$(EXEEXT) subdir = src DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/./conf/mkinstalldirs \ $(top_srcdir)/./conf/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/./conf/mkinstalldirs CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) am_bib2ris_OBJECTS = bib2ris.$(OBJEXT) getopt.$(OBJEXT) \ strfncs.$(OBJEXT) pref.$(OBJEXT) linklist.$(OBJEXT) \ cgi.$(OBJEXT) atoll.$(OBJEXT) svn_version.$(OBJEXT) bib2ris_OBJECTS = $(am_bib2ris_OBJECTS) bib2ris_DEPENDENCIES = am_eenc_OBJECTS = eenc.$(OBJEXT) getopt.$(OBJEXT) enigma.$(OBJEXT) \ svn_version.$(OBJEXT) eenc_OBJECTS = $(am_eenc_OBJECTS) eenc_LDADD = $(LDADD) am_refdba_OBJECTS = refdba.$(OBJEXT) pref.$(OBJEXT) strfncs.$(OBJEXT) \ readln.$(OBJEXT) page.$(OBJEXT) refdb-client.$(OBJEXT) \ client-commands.$(OBJEXT) connect.$(OBJEXT) getopt.$(OBJEXT) \ tokenize.$(OBJEXT) readris.$(OBJEXT) linklist.$(OBJEXT) \ enigma.$(OBJEXT) cgi.$(OBJEXT) atoll.$(OBJEXT) \ passwd.$(OBJEXT) svn_version.$(OBJEXT) refdba_OBJECTS = $(am_refdba_OBJECTS) refdba_DEPENDENCIES = am_refdbc_OBJECTS = refdbc.$(OBJEXT) pref.$(OBJEXT) strfncs.$(OBJEXT) \ readln.$(OBJEXT) page.$(OBJEXT) refdb-client.$(OBJEXT) \ client-commands.$(OBJEXT) readris.$(OBJEXT) connect.$(OBJEXT) \ tokenize.$(OBJEXT) getopt.$(OBJEXT) linklist.$(OBJEXT) \ enigma.$(OBJEXT) cgi.$(OBJEXT) atoll.$(OBJEXT) \ passwd.$(OBJEXT) svn_version.$(OBJEXT) refdbc_OBJECTS = $(am_refdbc_OBJECTS) refdbc_DEPENDENCIES = am_refdbd_OBJECTS = refdbd.$(OBJEXT) refdbdref.$(OBJEXT) \ refdbda.$(OBJEXT) refdbdbib.$(OBJEXT) pref.$(OBJEXT) \ strfncs.$(OBJEXT) tokenize.$(OBJEXT) connect.$(OBJEXT) \ risdb.$(OBJEXT) writeris.$(OBJEXT) getopt.$(OBJEXT) \ readris.$(OBJEXT) backend.$(OBJEXT) backend-scrn.$(OBJEXT) \ backend-ris.$(OBJEXT) backend-risx.$(OBJEXT) \ backend-mods.$(OBJEXT) backend-db31.$(OBJEXT) \ backend-teix.$(OBJEXT) backend-bibtex.$(OBJEXT) \ backend-html.$(OBJEXT) backend-dbib.$(OBJEXT) \ backend-dbiba.$(OBJEXT) backend-citationlistx.$(OBJEXT) \ backend-rtfbib.$(OBJEXT) linklist.$(OBJEXT) \ xmlhandler.$(OBJEXT) enigma.$(OBJEXT) cgi.$(OBJEXT) \ atoll.$(OBJEXT) dbfncs.$(OBJEXT) xmlout.$(OBJEXT) \ risxhandler.$(OBJEXT) authorinfo.$(OBJEXT) risdata.$(OBJEXT) \ noteshandler.$(OBJEXT) refdbdnote.$(OBJEXT) \ writenote.$(OBJEXT) backendn-scrn.$(OBJEXT) \ backendn-notex.$(OBJEXT) backendn-html.$(OBJEXT) \ xmlhelper.$(OBJEXT) rtfhelper.$(OBJEXT) mset.$(OBJEXT) \ refdbdgetref.$(OBJEXT) refdbdgetrefx.$(OBJEXT) \ refdbdupdb.$(OBJEXT) passwd.$(OBJEXT) refdbdcheckref.$(OBJEXT) \ svn_version.$(OBJEXT) refdbd_OBJECTS = $(am_refdbd_OBJECTS) refdbd_DEPENDENCIES = am_refdbib_OBJECTS = refdbib.$(OBJEXT) getopt.$(OBJEXT) \ strfncs.$(OBJEXT) pref.$(OBJEXT) refdb-client.$(OBJEXT) \ connect.$(OBJEXT) page.$(OBJEXT) tokenize.$(OBJEXT) \ readris.$(OBJEXT) linklist.$(OBJEXT) enigma.$(OBJEXT) \ cgi.$(OBJEXT) atoll.$(OBJEXT) passwd.$(OBJEXT) \ svn_version.$(OBJEXT) refdbib_OBJECTS = $(am_refdbib_OBJECTS) refdbib_LDADD = $(LDADD) am_refdbxp_OBJECTS = refdbxp.$(OBJEXT) getopt.$(OBJEXT) \ strfncs.$(OBJEXT) svn_version.$(OBJEXT) refdbxp_OBJECTS = $(am_refdbxp_OBJECTS) refdbxp_LDADD = $(LDADD) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/./conf/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(bib2ris_SOURCES) $(eenc_SOURCES) $(refdba_SOURCES) \ $(refdbc_SOURCES) $(refdbd_SOURCES) $(refdbib_SOURCES) \ $(refdbxp_SOURCES) DIST_SOURCES = $(bib2ris_SOURCES) $(eenc_SOURCES) $(refdba_SOURCES) \ $(refdbc_SOURCES) $(refdbd_SOURCES) $(refdbib_SOURCES) \ $(refdbxp_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BIB2RIS = @BIB2RIS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ ULLSPEC = @ULLSPEC@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bib2ris_LDADD = @bib2ris_LDADD@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ classpath_root = @classpath_root@ client1_mans = @client1_mans@ client_bins = @client_bins@ client_etc_distobjects = @client_etc_distobjects@ client_etc_objects = @client_etc_objects@ client_mans = @client_mans@ client_scripts = @client_scripts@ client_subdirs = @client_subdirs@ datadir = @datadir@ datarootdir = @datarootdir@ db_dir = @db_dir@ docbk_xsl = @docbk_xsl@ docbk_xsl_ns = @docbk_xsl_ns@ docdir = @docdir@ docs_subdirs = @docs_subdirs@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ log_dir = @log_dir@ main_db = @main_db@ man_subdirs = @man_subdirs@ mandir = @mandir@ mkdir_p = @mkdir_p@ mybatik = @mybatik@ mydtdformat = @mydtdformat@ mydtdparse = @mydtdparse@ myjade = @myjade@ myperl = @myperl@ mysgrep = @mysgrep@ myshell = @myshell@ mysvnversion = @mysvnversion@ mytidy = @mytidy@ myxmlcatalog = @myxmlcatalog@ myxsltproc = @myxsltproc@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psarg = @psarg@ psdir = @psdir@ refdba_LDADD = @refdba_LDADD@ refdbc_LDADD = @refdbc_LDADD@ refdbd_LDADD = @refdbd_LDADD@ @LIBICONV@ sbindir = @sbindir@ server8_mans = @server8_mans@ server_bins = @server_bins@ server_etc_distobjects = @server_etc_distobjects@ server_etc_objects = @server_etc_objects@ server_mans = @server_mans@ server_scripts = @server_scripts@ server_subdirs = @server_subdirs@ sgml_decl = @sgml_decl@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ svnversioncommand = @svnversioncommand@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ tei_xsl = @tei_xsl@ tei_xsl_ns = @tei_xsl_ns@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ trang_cmd = @trang_cmd@ var_dir = @var_dir@ xml_decl = @xml_decl@ bin_PROGRAMS = @server_bins@ @client_bins@ @BIB2RIS@ BUILT_SOURCES = refdbd.h refstat.h svn_version.c svn_dist_version EXTRA_DIST = refdbd.h.in refstat.h svn_dist_version MAINTAINERCLEANFILES = refstat.h CLEANFILES = refdbd.h RISXVERSION = $(shell grep DOCTYPE $(srcdir)/../dtd/risx.dtd | sed 's%.*V\([^/]*\).*%\1%') XNOTEVERSION = $(shell grep DOCTYPE $(srcdir)/../dtd/xnote.dtd | sed 's%.*V\([^/]*\).*%\1%') CITESTYLEXVERSION = $(shell grep DOCTYPE $(srcdir)/../dtd/citestylex.dtd | sed 's%.*V\([^/]*\).*%\1%') CITATIONLISTXVERSION = $(shell grep DOCTYPE $(srcdir)/../dtd/citationlistx.dtd | sed 's%.*V\([^/]*\).*%\1%') refdba_SOURCES = refdba.c pref.c strfncs.c readln.c page.c refdb-client.c client-commands.c connect.c getopt.c tokenize.c readris.c linklist.c enigma.c cgi.c atoll.c passwd.c svn_version.c refdb.h refdba.h pref.h strfncs.h readln.h page.h refdb-client.h client-commands.h connect.h getopt.h tokenize.h readris.h linklist.h enigma.h cgi.h passwd.h refdbib_SOURCES = refdbib.c getopt.c strfncs.c pref.c refdb-client.c connect.c page.c tokenize.c readris.c linklist.c enigma.c cgi.c atoll.c passwd.c svn_version.c refdb.h refdbib.h getopt.h strfncs.h pref.h refdb-client.h connect.h page.h tokenize.h readris.h linklist.h enigma.h cgi.h passwd.h outformats.h refdbc_SOURCES = refdbc.c pref.c strfncs.c readln.c page.c refdb-client.c client-commands.c readris.c connect.c tokenize.c getopt.c linklist.c enigma.c cgi.c atoll.c passwd.c svn_version.c refdb.h refdbc.h pref.h strfncs.h readln.h page.h refdb-client.h client-commands.h readris.h connect.h tokenize.h getopt.h linklist.h enigma.h cgi.h passwd.h refdbd_SOURCES = refdbd.c refdbdref.c refdbda.c refdbdbib.c pref.c \ strfncs.c tokenize.c connect.c risdb.c writeris.c getopt.c \ readris.c backend.c backend-scrn.c backend-ris.c \ backend-risx.c backend-mods.c backend-db31.c backend-teix.c \ backend-bibtex.c backend-html.c backend-dbib.c backend-dbiba.c \ backend-citationlistx.c backend-rtfbib.c linklist.c \ xmlhandler.c enigma.c cgi.c atoll.c dbfncs.c xmlout.c \ risxhandler.c authorinfo.c risdata.c noteshandler.c \ refdbdnote.c writenote.c backendn-scrn.c backendn-notex.c \ backendn-html.c xmlhelper.c rtfhelper.c mset.c refdbdgetref.c \ refdbdgetrefx.c refdbdupdb.c passwd.c refdbdcheckref.c \ svn_version.c refdb.h refdbd.h pref.h strfncs.h tokenize.h \ connect.h risdb.h writeris.h getopt.h readris.h backend.h \ backend-scrn.h backend-ris.h backend-risx.h backend-mods.h \ backend-db31.h backend-teix.h backend-bibtex.h backend-html.h \ backend-dbib.h backend-citationlistx.h backend-rtfbib.h \ linklist.h xmlhandler.h enigma.h cgi.h dbfncs.h xmlout.h \ risxhandler.h authorinfo.h risdata.h noteshandler.h \ writenote.h backendn-scrn.h backendn-notex.h xmlhelper.h \ rtfhelper.h backendn-html.h mset.h refdbdgetref.h \ refdbdgetrefx.h refdbdupdb.h passwd.h refdbdgetref.h \ refdbdcheckref.h outformats.h refdbxp_SOURCES = refdbxp.c getopt.c strfncs.c svn_version.c getopt.h strfncs.h eenc_SOURCES = eenc.c getopt.c enigma.c svn_version.c getopt.h enigma.h refdb.h bib2ris_SOURCES = bib2ris.c getopt.c strfncs.c pref.c linklist.c cgi.c atoll.c svn_version.c bib2ris.h getopt.h strfncs.h pref.h linklist.h cgi.h main_meta = @main_meta@ AM_CPPFLAGS = -DSYSCONFDIR=\"$(sysconfdir)/@PACKAGE@\" -DULLSPEC=\"@ULLSPEC@\" all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) bib2ris$(EXEEXT): $(bib2ris_OBJECTS) $(bib2ris_DEPENDENCIES) $(EXTRA_bib2ris_DEPENDENCIES) @rm -f bib2ris$(EXEEXT) $(AM_V_CCLD)$(LINK) $(bib2ris_OBJECTS) $(bib2ris_LDADD) $(LIBS) eenc$(EXEEXT): $(eenc_OBJECTS) $(eenc_DEPENDENCIES) $(EXTRA_eenc_DEPENDENCIES) @rm -f eenc$(EXEEXT) $(AM_V_CCLD)$(LINK) $(eenc_OBJECTS) $(eenc_LDADD) $(LIBS) refdba$(EXEEXT): $(refdba_OBJECTS) $(refdba_DEPENDENCIES) $(EXTRA_refdba_DEPENDENCIES) @rm -f refdba$(EXEEXT) $(AM_V_CCLD)$(LINK) $(refdba_OBJECTS) $(refdba_LDADD) $(LIBS) refdbc$(EXEEXT): $(refdbc_OBJECTS) $(refdbc_DEPENDENCIES) $(EXTRA_refdbc_DEPENDENCIES) @rm -f refdbc$(EXEEXT) $(AM_V_CCLD)$(LINK) $(refdbc_OBJECTS) $(refdbc_LDADD) $(LIBS) refdbd$(EXEEXT): $(refdbd_OBJECTS) $(refdbd_DEPENDENCIES) $(EXTRA_refdbd_DEPENDENCIES) @rm -f refdbd$(EXEEXT) $(AM_V_CCLD)$(LINK) $(refdbd_OBJECTS) $(refdbd_LDADD) $(LIBS) refdbib$(EXEEXT): $(refdbib_OBJECTS) $(refdbib_DEPENDENCIES) $(EXTRA_refdbib_DEPENDENCIES) @rm -f refdbib$(EXEEXT) $(AM_V_CCLD)$(LINK) $(refdbib_OBJECTS) $(refdbib_LDADD) $(LIBS) refdbxp$(EXEEXT): $(refdbxp_OBJECTS) $(refdbxp_DEPENDENCIES) $(EXTRA_refdbxp_DEPENDENCIES) @rm -f refdbxp$(EXEEXT) $(AM_V_CCLD)$(LINK) $(refdbxp_OBJECTS) $(refdbxp_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/atoll.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/authorinfo.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/backend-bibtex.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/backend-citationlistx.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/backend-db31.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/backend-dbib.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/backend-dbiba.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/backend-html.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/backend-mods.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/backend-ris.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/backend-risx.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/backend-rtfbib.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/backend-scrn.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/backend-teix.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/backend.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/backendn-html.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/backendn-notex.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/backendn-scrn.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bib2ris.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cgi.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/client-commands.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/connect.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dbfncs.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eenc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/enigma.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getopt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/linklist.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mset.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/noteshandler.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/page.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/passwd.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pref.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/readln.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/readris.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/refdb-client.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/refdba.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/refdbc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/refdbd.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/refdbda.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/refdbdbib.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/refdbdcheckref.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/refdbdgetref.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/refdbdgetrefx.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/refdbdnote.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/refdbdref.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/refdbdupdb.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/refdbib.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/refdbxp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/risdata.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/risdb.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/risxhandler.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtfhelper.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strfncs.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/svn_version.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tokenize.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/writenote.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/writeris.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xmlhandler.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xmlhelper.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xmlout.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) installdirs: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-binPROGRAMS clean-generic mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ clean-binPROGRAMS clean-generic cscopelist-am ctags ctags-am \ distclean distclean-compile distclean-generic distclean-tags \ distdir dvi dvi-am html html-am info info-am install \ install-am install-binPROGRAMS install-data install-data-am \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic pdf pdf-am \ ps ps-am tags tags-am uninstall uninstall-am \ uninstall-binPROGRAMS refdbd.h: refdbd.h.in sed 's%%$(RISXVERSION)%g' < $(top_srcdir)/src/refdbd.h.in | \ sed 's%%$(XNOTEVERSION)%g' | \ sed 's%%$(CITESTYLEXVERSION)%g' | \ sed 's%%$(CITATIONLISTXVERSION)%g' | \ sed 's%%$(db_dir)%' | \ sed 's%%$(main_db)%' > refdbd.h refstat.h: $(top_srcdir)/scripts/statgen.pl $(top_srcdir)/scripts/statgen.pl c > refstat.h svn_version.c: FORCE echo -n 'const char* svn_version(void) { const char* SVN_Version = "' > svn_version.c @mysvnversion@ >> svn_version.c echo '"; return SVN_Version; }' >> svn_version.c @HAVESVNWC_TRUE@svn_dist_version: FORCE @HAVESVNWC_TRUE@ @mysvnversion@ > svn_dist_version FORCE: # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: refdb-1.0.2/src/Makefile.am000755 001750 001750 00000010252 11512721657 016277 0ustar00markusmarkus000000 000000 ## Process this file with automake to produce Makefile.in EXTRA_PROGRAMS=refdbd refdbib refdbc refdba refdbxp eenc bib2ris bin_PROGRAMS= @server_bins@ @client_bins@ @BIB2RIS@ BUILT_SOURCES=refdbd.h refstat.h svn_version.c svn_dist_version EXTRA_DIST=refdbd.h.in refstat.h svn_dist_version MAINTAINERCLEANFILES=refstat.h CLEANFILES=refdbd.h RISXVERSION = $(shell grep DOCTYPE $(srcdir)/../dtd/risx.dtd | sed 's%.*V\([^/]*\).*%\1%') XNOTEVERSION = $(shell grep DOCTYPE $(srcdir)/../dtd/xnote.dtd | sed 's%.*V\([^/]*\).*%\1%') CITESTYLEXVERSION = $(shell grep DOCTYPE $(srcdir)/../dtd/citestylex.dtd | sed 's%.*V\([^/]*\).*%\1%') CITATIONLISTXVERSION = $(shell grep DOCTYPE $(srcdir)/../dtd/citationlistx.dtd | sed 's%.*V\([^/]*\).*%\1%') refdba_SOURCES = refdba.c pref.c strfncs.c readln.c page.c refdb-client.c client-commands.c connect.c getopt.c tokenize.c readris.c linklist.c enigma.c cgi.c atoll.c passwd.c svn_version.c refdb.h refdba.h pref.h strfncs.h readln.h page.h refdb-client.h client-commands.h connect.h getopt.h tokenize.h readris.h linklist.h enigma.h cgi.h passwd.h refdbib_SOURCES = refdbib.c getopt.c strfncs.c pref.c refdb-client.c connect.c page.c tokenize.c readris.c linklist.c enigma.c cgi.c atoll.c passwd.c svn_version.c refdb.h refdbib.h getopt.h strfncs.h pref.h refdb-client.h connect.h page.h tokenize.h readris.h linklist.h enigma.h cgi.h passwd.h outformats.h refdbc_SOURCES = refdbc.c pref.c strfncs.c readln.c page.c refdb-client.c client-commands.c readris.c connect.c tokenize.c getopt.c linklist.c enigma.c cgi.c atoll.c passwd.c svn_version.c refdb.h refdbc.h pref.h strfncs.h readln.h page.h refdb-client.h client-commands.h readris.h connect.h tokenize.h getopt.h linklist.h enigma.h cgi.h passwd.h refdbd_SOURCES = refdbd.c refdbdref.c refdbda.c refdbdbib.c pref.c strfncs.c tokenize.c connect.c risdb.c writeris.c getopt.c readris.c backend.c backend-scrn.c backend-ris.c backend-risx.c backend-mods.c backend-db31.c backend-teix.c backend-bibtex.c backend-html.c backend-dbib.c backend-dbiba.c backend-citationlistx.c backend-rtfbib.c linklist.c xmlhandler.c enigma.c cgi.c atoll.c dbfncs.c xmlout.c risxhandler.c authorinfo.c risdata.c noteshandler.c refdbdnote.c writenote.c backendn-scrn.c backendn-notex.c backendn-html.c xmlhelper.c rtfhelper.c mset.c refdbdgetref.c refdbdgetrefx.c refdbdupdb.c passwd.c refdbdcheckref.c svn_version.c refdb.h refdbd.h pref.h strfncs.h tokenize.h connect.h risdb.h writeris.h getopt.h readris.h backend.h backend-scrn.h backend-ris.h backend-risx.h backend-mods.h backend-db31.h backend-teix.h backend-bibtex.h backend-html.h backend-dbib.h backend-citationlistx.h backend-rtfbib.h linklist.h xmlhandler.h enigma.h cgi.h dbfncs.h xmlout.h risxhandler.h authorinfo.h risdata.h noteshandler.h writenote.h backendn-scrn.h backendn-notex.h xmlhelper.h rtfhelper.h backendn-html.h mset.h refdbdgetref.h refdbdgetrefx.h refdbdupdb.h passwd.h refdbdgetref.h refdbdcheckref.h outformats.h refdbxp_SOURCES = refdbxp.c getopt.c strfncs.c svn_version.c getopt.h strfncs.h eenc_SOURCES = eenc.c getopt.c enigma.c svn_version.c getopt.h enigma.h refdb.h bib2ris_SOURCES = bib2ris.c getopt.c strfncs.c pref.c linklist.c cgi.c atoll.c svn_version.c bib2ris.h getopt.h strfncs.h pref.h linklist.h cgi.h refdba_LDADD = @refdba_LDADD@ refdbc_LDADD = @refdbc_LDADD@ refdbd_LDADD = @refdbd_LDADD@ @LIBICONV@ bib2ris_LDADD = @bib2ris_LDADD@ main_db = @main_db@ main_meta = @main_meta@ AM_CPPFLAGS=-DSYSCONFDIR=\"$(sysconfdir)/@PACKAGE@\" -DULLSPEC=\"@ULLSPEC@\" refdbd.h: refdbd.h.in sed 's%%$(RISXVERSION)%g' < $(top_srcdir)/src/refdbd.h.in | \ sed 's%%$(XNOTEVERSION)%g' | \ sed 's%%$(CITESTYLEXVERSION)%g' | \ sed 's%%$(CITATIONLISTXVERSION)%g' | \ sed 's%%$(db_dir)%' | \ sed 's%%$(main_db)%' > refdbd.h refstat.h: $(top_srcdir)/scripts/statgen.pl $(top_srcdir)/scripts/statgen.pl c > refstat.h svn_version.c: FORCE echo -n 'const char* svn_version(void) { const char* SVN_Version = "' > svn_version.c @mysvnversion@ >> svn_version.c echo '"; return SVN_Version; }' >> svn_version.c if HAVESVNWC svn_dist_version: FORCE @mysvnversion@ > svn_dist_version endif FORCE: refdb-1.0.2/src/bib2ris.c000644 001750 001750 00000161705 12255427651 015754 0ustar00markusmarkus000000 000000 /*+++++++++++++++++ bib2ris - converts bibtex files to RIS files markus@mhoenicka.de 2001-8-24 $Id: bib2ris.c,v 1.13.2.2 2005/07/29 21:15:34 mhoenicka Exp $ 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, see ++++++++++++++++++++++++*/ /* temporary hack to include cgi features. This should be selectable via a configure switch */ #define REFDB_CGI 1 #include #include #include #include #include #include /* header of the bibtex parsing library */ #include /* definitions of log levels */ #include /* for isxx() */ #include #include /* required by log_print() */ #include /* for getpid() */ #include /* for getpid() */ #include "refdb.h" #include "getopt.h" #include "linklist.h" #include "pref.h" #include "bib2ris.h" #include "strfncs.h" #include "cgi.h" /* cgi related stuff */ /*+ this array will hold the user preferences +*/ Prefs prefs[23] = { {"abbrevfirstname", ""}, {"forcejabbrev", ""}, {"listsep", ""}, {"maparticle", ""}, {"mapbook", ""}, {"mapbooklet", ""}, {"mapconference", ""}, {"mapinbook", ""}, {"mapincollection", ""}, {"mapinproceedings", ""}, {"mapmanual", ""}, {"mapmastersthesis", ""}, {"mapmisc", ""}, {"mapphdthesis", ""}, {"mapproceedings", ""}, {"maptechreport", ""}, {"mapunpublished", ""}, {"logfile", ""}, {"loglevel", ""}, {"logdest", ""}, {"refdblib", ""}, {"autokill", ""}, {"", ""} }; /* these are the configurable variables with the compile-time defaults */ char abbrev_firstname[PREFS_BUF_LEN] = "f"; /*+ if t, firstnames are abbreviated +*/ char force_jabbrev[PREFS_BUF_LEN] = ""; /*+ if t, use JO instead of JF even if no periods are found +*/ char listsep[PREFS_BUF_LEN] = ";"; /*+ separator for lists in BibTeX fields +*/ char map_bibtypes[14][PREFS_BUF_LEN] = {"JOUR", "BOOK", "PAMP", "CHAP", "CHAP", "CHAP", "CHAP", "BOOK", "THES", "GEN", "THES", "CONF", "RPRT", "UNPB"}; /*+ map BibTeX fields to RIS +*/ char log_file[PREFS_BUF_LEN] = "/var/log/bib2ris.log"; /* filename of log file */ char log_dest[PREFS_BUF_LEN] = "1"; /*+ default log destination (0 = stderr, 1 = syslog, 2 = log_file +*/ char log_level[PREFS_BUF_LEN] = "6"; /*+ default level up to which messages are logged (0 through 7). -1 means no logging +*/ char autokill[PREFS_BUF_LEN] = "1800"; /*+ default time in seconds until the CGI app will kill itself +*/ char refdblib[PREFS_BUF_LEN] = ""; /* the location of shareable RefDB files */ char confdir[_POSIX_PATH_MAX+1] = ""; /* path to the config files */ int n_read_stdin = 0; /* if 1, data try to squeeze in at stdin */ int n_broken_pipe; /*+ 1 indicates that we attempted to write to a broken pipe +*/ int no_data = 1; /* will be set to 0 if at least one citation is found */ int n_log_level = 6; /* verbosity of message log */ int n_log_dest = 0; /* log destination, default is stderr */ int n_abbrev_first = 0; /* if 1, abbreviate firstnames */ int n_force_jabbrev = 0; /* if 1, always use JO; if 0, use JO only if periods are present */ unsigned int n_autokill = 1800; /* numeric version of autokill */ FILE* fp_log_file = NULL; Lilibib sentinel; /* linked list for non-standard field mapping */ /* these variables determine the exit code */ int n_incomplete_entry = 0; int n_unknown_field = 0; int n_unknown_type = 0; int n_invalid_mapping = 0; int n_parse_error = 0; int n_gen_error = 0; int loopcounter = 0; /* just for debugging */ int n_cgi = 0; /* if 1, we run as a cgi app */ /* forward declarations of static funtions */ void alrmhandler(int sig); /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ The one and only main function int main returns 0 if successful, >0 if error. The error code is the sum of the following error conditions: 1 = n_gen_error 2 = n_incomplete_entry 4 = n_unknown_field 8 = n_unknown_type 16 = n_invalid_mapping 32 = n_parse_error; int argc number of arguments char** argv ptr to array of strings with the command line arguments ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int main (int argc, char** argv) { struct sigaction act, alrm, oldalrm; char msgbuf[512] = ""; int errcode; int i; int n_opt; int n_readinit = 1; size_t n_content_length; char mp_bibtypes[14][PREFS_BUF_LEN] = {"", "", "", "", "", "", "", "", "", "", "", "", "", ""}; char delayed_cgi_errmsg[64] = ""; char* cgi_data; char* request_method; char* content_length; FILE* errstream; #ifdef REFDB_CGI struct liliform sentinelili; struct liliform* ptr_current; #endif sentinel.ptr_next = NULL; sentinel.name = NULL; sentinel.value = NULL; /* test how we were invoked */ #ifdef REFDB_CGI n_cgi = is_cgi(&request_method, &content_length, delayed_cgi_errmsg); /* 1 if we are running as a cgi app */ #endif /* redirect error messages correctly */ if (n_cgi) { errstream = stdout; } else { errstream = stderr; } if (!isatty(fileno(stdin))) { /* if we receive data on stdin via a redirection or a pipe */ n_read_stdin = 1; } /* initialize signal handler */ n_broken_pipe = 0; act.sa_handler = pipehandler; sigemptyset(&act.sa_mask); act.sa_flags = 0; #ifdef REFDB_CGI if (n_cgi) { alrm.sa_handler = alrmhandler; sigemptyset(&alrm.sa_mask); alrm.sa_flags = 0; if (sigaction(SIGALRM, &alrm, &oldalrm) != 0) { write_err("initializing signal handler failed\n"); LOG_PRINT(LOG_ERR, "could not initialize signal handler"); exit(1); } } #endif /* read preferences */ prefs[0].varvalue = abbrev_firstname; prefs[1].varvalue = force_jabbrev; prefs[2].varvalue = listsep; prefs[3].varvalue = mp_bibtypes[BT_ARTICLE]; prefs[4].varvalue = mp_bibtypes[BT_BOOK]; prefs[5].varvalue = mp_bibtypes[BT_BOOKLET]; prefs[6].varvalue = mp_bibtypes[BT_CONFERENCE]; prefs[7].varvalue = mp_bibtypes[BT_INBOOK]; prefs[8].varvalue = mp_bibtypes[BT_INCOLLECTION]; prefs[9].varvalue = mp_bibtypes[BT_INPROCEEDINGS]; prefs[10].varvalue = mp_bibtypes[BT_MANUAL]; prefs[11].varvalue = mp_bibtypes[BT_MASTERSTHESIS]; prefs[12].varvalue = mp_bibtypes[BT_MISC]; prefs[13].varvalue = mp_bibtypes[BT_PHDTHESIS]; prefs[14].varvalue = mp_bibtypes[BT_PROCEEDINGS]; prefs[15].varvalue = mp_bibtypes[BT_TECHREPORT]; prefs[16].varvalue = mp_bibtypes[BT_UNPUBLISHED]; prefs[17].varvalue = log_file; prefs[18].varvalue = log_level; prefs[19].varvalue = log_dest; prefs[20].varvalue = refdblib; /* look for custom config directory */ for (i = 0; i < argc; i++) { if (argv[i][0] == '-' && argv[i][1] == 'y') { strncpy(confdir, argv[i+1], _POSIX_PATH_MAX); confdir[_POSIX_PATH_MAX] = '\0'; break; } } if (!n_cgi) { /* a slimy hack to detect the -q option before we run getopt */ for (i = 0; i < argc; i++) { if (argv[i][0] == '-' && argv[i][1] == 'q') { n_readinit = 0; break; } } if (n_readinit) { /* read config file settings */ read_prefs((void*)prefs, "bib2risrc", 0); } /* read command line settings. These may override the config file settings */ while ((n_opt = getopt(argc, argv, "e:hl:L:qs:vy:")) != -1) { switch (n_opt) { case 'e': strncpy(log_dest, optarg, PREFS_BUF_LEN); log_dest[PREFS_BUF_LEN-1] = '\0'; break; case 'h': fprintf(stderr, "bib2ris converts references from BibTeX to RIS format as understood by the refdb package.\n"); fprintf(stderr, "Usage: bib2ris [-e destination] [-h] [-l log-level] [-L logfile] [-q] [-s separator] [-v] [-y confdir]\nOptions: -e set log destination (0 stderr;1 syslog;2 logfile)\n -h print this help and exit\n -l set the log level\n -L set the log file\n -q ignore configuration file\n -s set keyword list separator\n -v print version info and exit\n -y look for configuration files in confdir\n"); exit (0); break; case 'l': strncpy(log_level, optarg, PREFS_BUF_LEN); log_level[PREFS_BUF_LEN-1] = '\0'; break; case 'L': strncpy(log_file, optarg, PREFS_BUF_LEN); log_file[PREFS_BUF_LEN-1] = '\0'; break; case 'q': /* do nothing; prevents message about unknown -q option */ break; case 's': strncpy(listsep, optarg, PREFS_BUF_LEN); listsep[PREFS_BUF_LEN-1] = '\0'; break; case 'v': printf("bib2ris %s markus@mhoenicka.de\nYou may redistribute and modify this software under the terms of the GNU General Public License.\n", VERSION); exit (0); break; case 'y': /* do nothing, this option is used before getopt runs */ break; case ':': fprintf(stderr, "Usage: bib2ris [-e destination] [-h] [-l log-level] [-L logfile] [-q] [-s separator] [-v] [-y confdir]\nOptions: -e set log destination (0 stderr;1 syslog;2 logfile)\n -h print this help and exit\n -l set the log level\n -L set the log file\n -q ignore configuration file\n -s set keyword list separator\n -v print version info and exit\n -y look for configuration files in confdir\n"); exit (1); break; case '?': printf("unknown option %c: use bib2ris -h to display usage\n", optopt); exit (1); break; } } } else { /* if we run as cgi */ read_prefs((void*)prefs, "bib2riscgirc", 0); } #ifdef REFDB_CGI if (n_cgi) { /* no killer alarm in interactive mode */ n_autokill = (unsigned int)atoi(autokill); /* this alarm will go off after n_autokill seconds and cause the CGI app to exit as it is apparently hanging */ if (n_autokill) { alarm(n_autokill); } } #endif /* convert some configuration variables to numeric versions */ n_abbrev_first = (abbrev_firstname[0] == 't') ? 1:0; n_force_jabbrev = (force_jabbrev[0] == 't') ? 1:0; n_log_level = num_loglevel(log_level); n_log_dest = num_logdest(log_dest); /* set up logging */ if (n_log_dest == 2) { /* use custom log file */ if ((fp_log_file = fopen(log_file, "ab")) == NULL) { n_log_dest = 1; /* fall back to syslog */ openlog("bib2ris", LOG_PID|LOG_ODELAY, LOG_USER); LOG_PRINT(LOG_WARNING, "could not open custom log file"); } } else if (n_log_dest == 1) { /* use syslog */ openlog("bib2ris", LOG_PID|LOG_ODELAY, LOG_USER); } LOG_PRINT(LOG_INFO, "bib2ris started"); /* now report incorrect cgi input, if any */ if (delayed_cgi_errmsg[0]) { LOG_PRINT(LOG_ERR, delayed_cgi_errmsg); exit(1); } if (n_readinit) { /* read non-standard field mapping in config file */ if (!n_cgi) { read_prefs((void*)&sentinel, "bib2risrc", 1); } else { read_prefs((void*)&sentinel, "bib2riscgirc", 1); } } /* ptr_lb = &sentinel; */ /* while ((ptr_lb = get_next_lilibib(ptr_lb)) != NULL) { */ /* fprintf(stderr, "%s %s\n", ptr_lb->name, ptr_lb->value); */ /* } */ /* exit(0); */ /* check (and fix) map_xx settings: must be valid RIS tags, otherwise use defaults */ fix_bibtypes(mp_bibtypes, 14); if (n_cgi) { /* we're running as a cgi app */ #ifdef REFDB_CGI /* initialize linked list */ sentinelili.name[0] = '\0'; sentinelili.value = NULL; sentinelili.ptr_next = NULL; /* read string from stdin and chop it */ n_content_length = atoi(content_length); cgi_data = malloc(n_content_length + 1); if (!cgi_data) { cgi_header(CGI_PLAIN); fprintf(errstream, "out of memory\n"); LOG_PRINT(LOG_WARNING, "out of memory"); exit(1); } if (fread(cgi_data, 1, n_content_length, stdin) != n_content_length) { cgi_header(CGI_PLAIN); fprintf(errstream, "could not read cgi data\n"); free(cgi_data); LOG_PRINT(LOG_ERR, "could not read cgi data"); exit(1); } cgi_data[n_content_length] = '\0'; /* convert to a C-style string */ LOG_PRINT(LOG_DEBUG, cgi_data); if (decode_cgi(cgi_data, &sentinelili)) { delete_all_liliform(&sentinelili); free(cgi_data); cgi_header(CGI_PLAIN); fprintf(errstream, "could not decode cgi data\n"); LOG_PRINT(LOG_ERR, "could not decode cgi data"); exit(1); } free(cgi_data); /* deduce command */ if ((ptr_current = get_liliform(&sentinelili, "addref")) != NULL) { cgi_header(CGI_HTML); if (process_bib(ptr_current->value, 0)) { LOG_PRINT(LOG_ERR, "errors encountered while processing CGI data"); /* n_gen_error = 1; */ } } else { delete_all_liliform(&sentinelili); cgi_header(CGI_PLAIN); fprintf(errstream, "unknown command\n"); LOG_PRINT(LOG_ERR, "unknown command"); exit(1); } /* clean up */ delete_all_liliform(&sentinelili); #endif } else if (n_read_stdin) { /* read data from stdin */ if (process_bib("-", 1)) { LOG_PRINT(LOG_ERR, "errors encountered while processing stdin"); /* n_gen_error = 1; */ } } else { /* read data from all files on the command line */ for (i = optind; i < argc; i++) { /* loop over all filenames */ if (process_bib(argv[i], 1)) { sprintf(msgbuf, "errors encountered while processing %s", argv[i]); LOG_PRINT(LOG_ERR, msgbuf); /* n_gen_error = 1; */ } } } /* compute exit code */ errcode = n_gen_error + 2*n_incomplete_entry + 4*n_unknown_field + 8*n_unknown_type + 16*n_invalid_mapping + 32*n_parse_error; sprintf(msgbuf, "bib2ris finished with error code %d", errcode); LOG_PRINT(LOG_INFO, msgbuf); delete_all_lilibib(&sentinel); exit(errcode); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ process_bib(): scans the stream for citation information int process_bib returns 0 if ok, 1 if some error occurred char* infile ptr to a buffer specifying the data source. If file==1: - means stdin everything else means a file name if file==0 ptr points to a string with BibTeX data int file if 1, input comes from stdin or a file, if 0, input data is in a string ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int process_bib(char* infile, int file) { char* value_text; char* field_text; char* ris_type; /* the current RIS publication type */ char* new_notes; char* address; char* new_address; char* abstract; char* new_abstract; char* html_string; char fieldname[64]; char bib_type[16]; /* the current BibTeX publication type */ char errmsg[ERRMSG_LEN]; /* ToDo: size should be dependent on largest path string */ char bibvalid[13]; int n_error = 0; int n_total_incomplete = 0; int bv_index; size_t notes_len; size_t address_len; AST* ptr_ast; AST* ptr_entry; AST* ptr_field; AST* ptr_value; bt_metatype metatype; boolean status; struct RISPY rispy; struct TITLES titles; struct PUBINFO pubinfo; struct NOTES notes; Lilibib* ptr_lb; bt_initialize(); /* bt_set_stringopts(); */ /* use defaults, hope they work */ snprintf(errmsg, ERRMSG_LEN, "begin processing %s", infile); LOG_PRINT(LOG_INFO, errmsg); /* read input file or stdin */ if (file) { ptr_ast = bt_parse_file(infile, 0, &status); } else { ptr_ast = bt_parse_entry_s(infile, "cgidata", 0, 0, &status); } if (ptr_ast == NULL) { bt_cleanup(); snprintf(errmsg, 511, "parsing error while processing %s", infile); LOG_PRINT(LOG_CRIT, errmsg); return 1; } ptr_entry = NULL; if (n_cgi) { if ((html_string = load_html("refdbadd_head", refdblib)) == NULL) { LOG_PRINT(LOG_CRIT, "failed to load template"); printf("failed to load template\n"); return 1; } else { printf("%s", html_string); free(html_string); } } /* loop over all entries */ while ((ptr_entry = bt_next_entry(ptr_ast, ptr_entry)) != NULL) { metatype = bt_entry_metatype(ptr_entry); if (metatype != BTE_REGULAR) { continue; } no_data = 0; ptr_field = NULL; /* start RIS entry with a newline */ printf("\n"); /* next comes the type tag */ print_type(bib_type, &ris_type, ptr_entry); /* now the key */ printf("ID - %s\n", bt_entry_key(ptr_entry)); /* initialize stuff */ (rispy.year)[0] = '\0'; (rispy.month)[0] = '\0'; (rispy.day)[0] = '\0'; (rispy.edition)[0] = '\0'; (rispy.howpublished)[0] = '\0'; titles.title = NULL; titles.booktitle = NULL; titles.seriestitle = NULL; (pubinfo.institution)[0] = '\0'; (pubinfo.organization)[0] = '\0'; (pubinfo.publisher)[0] = '\0'; (pubinfo.school)[0] = '\0'; notes.annote = NULL; notes.note = NULL; address = NULL; abstract = NULL; memset((void*)bibvalid, (int)'f', sizeof(bibvalid)); bibvalid[12] = '\0'; /* loop over all fields */ while ((ptr_field = bt_next_field(ptr_entry, ptr_field, &value_text)) != NULL) { ptr_value = NULL; bv_index = -1; /* at this point we can retrieve the following values: */ /* bt_entry_type(ptr_entry): article, book etc */ /* bt_entry_key(ptr_entry): IDxx */ /* value_text: field name like author, title, year */ field_text = bt_get_text(ptr_field); if (field_text == NULL) { continue; } /* convert the field name to lowercase */ strncpy(fieldname, value_text, 63); /* arbitrary, custom fields could be longer */ fieldname[63] = '\0'; strdn(fieldname); /* generate RIS tags based on the field name in value_text some fields can be directly translated into RIS lines; other RIS lines need to be assembled from possibly more than one BibTeX field. in that case we pool the values in structures and evaluate the structures after reading the complete entry */ if (!strcmp(value_text, "address")) { printf("CY - %s\n", field_text); } else if (!strcmp(value_text, "annote")) { notes.annote = malloc(strlen(field_text)+1); if (notes.annote == NULL) { n_error = 1; break; } strcpy(notes.annote, field_text); } else if (!strcmp(value_text, "author")) { bv_index = BV_AUTHOR; print_authors(field_text, "AU", infile); } else if (!strcmp(value_text, "booktitle")) { bv_index = BV_BOOKTITLE; titles.booktitle = malloc(strlen(field_text)+1); if (titles.booktitle == NULL) { n_error = 1; break; } strcpy(titles.booktitle, field_text); } else if (!strcmp(value_text, "chapter")) { bv_index = BV_CHAPTER; printf("CP - %s\n", field_text); /* is this correct? */ } else if (!strcmp(value_text, "edition")) { strncpy(rispy.edition, field_text, MAX_FIXFIELD_LEN-1); (rispy.edition)[MAX_FIXFIELD_LEN-1] = '\0'; /* terminate */ } else if (!strcmp(value_text, "editor")) { bv_index = BV_EDITOR; print_authors(field_text, "A2", infile); } else if (!strcmp(value_text, "howpublished")) { strncpy(rispy.howpublished, field_text, MAX_FIXFIELD_LEN-1); (rispy.howpublished)[MAX_FIXFIELD_LEN-1] = '\0'; /* terminate */ } else if (!strcmp(value_text, "institution")) { bv_index = BV_INSTITUTION; strncpy(pubinfo.institution, field_text, MAX_FIXFIELD_LEN-1); (pubinfo.institution)[MAX_FIXFIELD_LEN-1] = '\0'; /* terminate */ } else if (!strcmp(value_text, "journal")) { bv_index = BV_JOURNAL; print_journal(field_text); } else if (!strcmp(value_text, "month")) { strncpy(rispy.month, field_text, MAX_FIXFIELD_LEN-1); (rispy.month)[MAX_FIXFIELD_LEN-1] = '\0'; /* terminate */ } else if (!strcmp(value_text, "note")) { bv_index = BV_NOTE; if (notes.note == NULL) { notes.note = malloc(strlen(field_text)+1); if (notes.note == NULL) { n_error = 1; break; } strcpy(notes.note, field_text); notes_len = strlen(field_text)+1; } else { if ((new_notes = mstrcat(notes.note, ";", ¬es_len, 0)) == NULL) { n_error = 1; break; } else { notes.note = new_notes; } if ((new_notes = mstrcat(notes.note, field_text, ¬es_len, 0)) == NULL) { n_error = 1; break; } else { notes.note = new_notes; } } } else if (!strcmp(value_text, "number")) { printf("IS - %s\n", field_text); } else if (!strcmp(value_text, "organization")) { strncpy(pubinfo.organization, field_text, MAX_FIXFIELD_LEN-1); (pubinfo.organization)[MAX_FIXFIELD_LEN-1] = '\0'; /* terminate */ } else if (!strcmp(value_text, "pages")) { bv_index = BV_PAGES; print_pageinfo(field_text); } else if (!strcmp(value_text, "publisher")) { bv_index = BV_PUBLISHER; strncpy(pubinfo.publisher, field_text, MAX_FIXFIELD_LEN-1); (pubinfo.publisher)[MAX_FIXFIELD_LEN-1] = '\0'; /* terminate */ } else if (!strcmp(value_text, "school")) { bv_index = BV_SCHOOL; strncpy(pubinfo.school, field_text, MAX_FIXFIELD_LEN-1); (pubinfo.school)[MAX_FIXFIELD_LEN-1] = '\0'; /* terminate */ } else if (!strcmp(value_text, "series")) { titles.seriestitle = malloc(strlen(field_text)+1); if (titles.seriestitle == NULL) { n_error = 1; break; } strcpy(titles.seriestitle, field_text); } else if (!strcmp(value_text, "title")) { bv_index = BV_TITLE; titles.title = malloc(strlen(field_text)+1); if (titles.title == NULL) { n_error = 1; break; } strcpy(titles.title, field_text); } else if (!strcmp(value_text, "url")) { printf("UR - %s\n", field_text); } else if (!strcmp(value_text, "volume")) { printf("VL - %s\n", field_text); } else if (!strcmp(value_text, "year")) { bv_index = BV_YEAR; strncpy(rispy.year, field_text, MAX_FIXFIELD_LEN-1); (rispy.year)[MAX_FIXFIELD_LEN-1] = '\0'; /* terminate */ } else if ((ptr_lb = get_lilibib(&sentinel, value_text)) != NULL) { if (!strcmp(ptr_lb->value, "N1")) { /* append to notes */ if (notes.note == NULL) { notes.note = malloc(strlen(field_text)+1); if (notes.note == NULL) { n_error = 1; break; } strcpy(notes.note, field_text); notes_len = strlen(field_text)+1; } else { if ((new_notes = mstrcat(notes.note, ";", ¬es_len, 0)) == NULL) { n_error = 1; break; } else { notes.note = new_notes; } if ((new_notes = mstrcat(notes.note, field_text, ¬es_len, 0)) == NULL) { n_error = 1; break; } else { notes.note = new_notes; } } } else if (!strcmp(ptr_lb->value, "N2")) { /* append to abstract */ if (abstract == NULL) { abstract = malloc(strlen(field_text)+1); if (abstract == NULL) { n_error = 1; break; } strcpy(abstract, field_text); notes_len = strlen(field_text)+1; } else { if ((new_abstract = mstrcat(abstract, ";", ¬es_len, 0)) == NULL) { n_error = 1; break; } else { abstract = new_abstract; } if ((abstract = mstrcat(abstract, field_text, ¬es_len, 0)) == NULL) { n_error = 1; break; } else { abstract = new_abstract; } } } else if (!strcmp(ptr_lb->value, "PY.day")) { strncpy(rispy.day, field_text, MAX_FIXFIELD_LEN-1); (rispy.day)[MAX_FIXFIELD_LEN-1] = '\0'; /* terminate */ } else if (!strcmp(ptr_lb->value, "KW")) { /* split into single keywords */ print_keywords(field_text); } else if (!strcmp(ptr_lb->value, "AD")) { if (address == NULL) { address = malloc(strlen(field_text)+1); if (address == NULL) { n_error = 1; break; } strcpy(address, field_text); address_len = strlen(field_text)+1; } else { if ((new_address = mstrcat(address, ";", &address_len, 0)) == NULL) { n_error = 1; break; } else { address = new_address; } if ((new_address = mstrcat(address, field_text, &address_len, 0)) == NULL) { n_error = 1; break; } else { address = new_address; } } } else { printf("%s - %s\n", ptr_lb->value, field_text); } } /* ToDo: this is what computer freaks use as additional fields taken from ftp://ftp.math.utah.edu/pub/tex/bib/sgml.bib acknowledgement, bibdate, isbn, keywords, lccn, issn, coden, affiliation, classification, thesaurus, abstract, pubcountry, conflocation, price, confdate, day, sponsor, alttitle, confsponsor, treatment, classcodes, language, corpsource, bookpages, type, conftitle, subject, xxnote, sponsororg, affiliationaddress, issue, journalabr, ericno, majordesc, minordesc, identifiers, countrypub, conference, lccnalt, meetingaddress, meetingdate, meetingdate2, dimensions, summary, key, paperback, pricecode, govtdocnumber, xxauthor, xxtitle, availability, stdtype, format, online, review, status, abstract2, keyword, searchkey, in, location, oldlabel, optprice, standardno, xmldata, alttitle-1, alttitle-2, annote-1, annote-2, author-1-address, author-2-address, contents, generalterms, issuedby, meetingabr, numericalindex, oclcno, oldtitle, optcoden, publishersnote, source, xxisbn, xxpages, xxprice, xxxnote */ else { snprintf(errmsg, ERRMSG_LEN, "unknown field: %s, value: %s\n", value_text, field_text); LOG_PRINT(LOG_WARNING, errmsg); n_unknown_field = 1; } if (bv_index != -1) { bibvalid[bv_index] = 't'; } } /* end while ptr_field */ if (n_error) { LOG_PRINT(LOG_ERR, "out of memory"); n_gen_error = 1; } /* dump all buffered tags now */ print_py(&rispy); print_titles(ris_type, &titles); /* deallocates all referenced strings */ print_pubinfo(bib_type, &pubinfo); print_notes(¬es); /* deallocates all referenced strings */ print_poolstring(address, "AD"); print_poolstring(abstract, "N2"); n_total_incomplete += validate_bib(bib_type, bibvalid, ptr_entry); /* finish entry with the end tag */ printf("ER - \n"); loopcounter++; /* only for debugging */ } /* end while ptr_entry */ if (n_cgi) { if ((html_string = load_html("refdbadd_foot", refdblib)) == NULL) { LOG_PRINT(LOG_CRIT, "failed to load template"); printf("failed to load template\n"); return 1; } else { printf("%s",html_string); free(html_string); } } /* cleanup */ if (!file) { ptr_ast = bt_parse_entry_s(NULL, "cgidata", 0, 0, &status); } bt_cleanup(); if (n_total_incomplete) { n_incomplete_entry = 1; snprintf(errmsg, ERRMSG_LEN, "%d incomplete datasets while processing %s", n_total_incomplete, infile); LOG_PRINT(LOG_INFO, errmsg); return 1; } snprintf(errmsg, ERRMSG_LEN, "done processing %s", infile); LOG_PRINT(LOG_INFO, errmsg); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ validate_bib(): validates input dataset. This fn checks whether all required fields for a given publication type are present. int validate_bib: returns 0 if dataset is ok. returns 1 if something is missing char* bib_type ptr to a buffer containing the current BibTeX publication type char* bibvalid ptr to a char map indicating which fields are present AST* ptr_entry ptr to a structure with the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int validate_bib(char* bib_type, char* bibvalid, AST* ptr_entry) { size_t i; int nincomplete = 0; char errmsg[ERRMSG_LEN] = ""; char essential[13]; char* id; memset((void*)essential, (int)'f', sizeof(essential)); essential[12] = '\0'; /* first we set up a char map indicating the fields which are essential for the current publication type. The corresponding chars are set to 't' unless either of two fields are essential. In that case both fields are set to an identical char other than 't' and other than 'f' */ if (!strcmp(bib_type, "article")) { essential[BV_AUTHOR] = 't'; essential[BV_TITLE] = 't'; essential[BV_JOURNAL] = 't'; essential[BV_YEAR] = 't'; } else if (!strcmp(bib_type, "book")) { essential[BV_AUTHOR] = 'x'; essential[BV_EDITOR] = 'x'; essential[BV_TITLE] = 't'; essential[BV_PUBLISHER] = 't'; essential[BV_YEAR] = 't'; } else if (!strcmp(bib_type, "booklet") || !strcmp(bib_type, "manual")) { essential[BV_TITLE] = 't'; } else if (!strcmp(bib_type, "conference") || !strcmp(bib_type, "inproceedings")) { essential[BV_AUTHOR] = 't'; essential[BV_TITLE] = 't'; essential[BV_BOOKTITLE] = 't'; essential[BV_YEAR] = 't'; } else if (!strcmp(bib_type, "inbook")) { essential[BV_AUTHOR] = 'x'; essential[BV_EDITOR] = 'x'; essential[BV_TITLE] = 't'; essential[BV_CHAPTER] = 'y'; essential[BV_PAGES] = 'y'; essential[BV_PUBLISHER] = 't'; essential[BV_YEAR] = 't'; } else if (!strcmp(bib_type, "incollection")) { essential[BV_AUTHOR] = 't'; essential[BV_TITLE] = 't'; essential[BV_BOOKTITLE] = 't'; essential[BV_PUBLISHER] = 't'; essential[BV_YEAR] = 't'; } else if (!strcmp(bib_type, "mastersthesis") || !strcmp(bib_type, "phdthesis")) { essential[BV_AUTHOR] = 't'; essential[BV_TITLE] = 't'; essential[BV_SCHOOL] = 't'; essential[BV_YEAR] = 't'; } else if (!strcmp(bib_type, "proceedings")) { essential[BV_TITLE] = 't'; essential[BV_YEAR] = 't'; } else if (!strcmp(bib_type, "techreport")) { essential[BV_AUTHOR] = 't'; essential[BV_TITLE] = 't'; essential[BV_INSTITUTION] = 't'; essential[BV_YEAR] = 't'; } else if (!strcmp(bib_type, "unpublished")) { essential[BV_AUTHOR] = 't'; essential[BV_TITLE] = 't'; essential[BV_NOTE] = 't'; } /* loop over all possible fields. If a field (and its alternative if applicable) is found missing, append the name of the field to the error string. The resulting error message won't exactly be Queen's English but it'll be sufficiently clear to indicate the problem */ for (i = 0; i < sizeof(essential); i++) { /* if a field is required but missing, generate error */ if (essential[i] == 't' && bibvalid[i] == 'f') { nincomplete = 1; strncat(errmsg, bv_names[i], ERRMSG_LEN-strlen(errmsg)); } else if (essential[i] != 'f' && bibvalid[i] == 'f' && i < sizeof(essential)-1) { /* if a field or an alternative is required but missing, check the alternative. If that is missing too, generate error */ id = strchr(&essential[i+1], (int)(essential[i])); if (id != NULL && bibvalid[id-essential] == 'f') { nincomplete = 1; strncat(errmsg, bv_names[i], ERRMSG_LEN-strlen(errmsg)); strncat(errmsg, "or ", ERRMSG_LEN-strlen(errmsg)); strncat(errmsg, bv_names[id-essential], ERRMSG_LEN-strlen(errmsg)); } } } /* else: other publication types do not have any required fields */ if (nincomplete) { id = bt_entry_key(ptr_entry); strncat(errmsg, "missing from ", ERRMSG_LEN-strlen(errmsg)); strncat(errmsg, id, ERRMSG_LEN-strlen(errmsg)); LOG_PRINT(LOG_WARNING, errmsg); return 1; } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ fix_bibtypes(): checks the RIS types read from the configuration file. If ok, the new value will be used in the global mapping array. If invalid, the default will be used int fix_bibtypes returns 0 if ok, 1 if an error occurred char mp_bibtypes[][] array with the BIB->RIS mapping int size size of first dimension of mp_bibtypes (number of entries) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int fix_bibtypes(char mp_bibtypes[14][PREFS_BUF_LEN], int size) { int i; int n_error = 0; char ris_type[16]; char errmsg[ERRMSG_LEN]; /* loop over all map entries */ for (i = 0; i < size; i++) { if (mp_bibtypes[i][0]) { strncpy(ris_type, mp_bibtypes[i], 15); ris_type[15] = '\0'; strup(ris_type); if (strcmp(ris_type, "ABST") && strcmp(ris_type, "ADVS") && strcmp(ris_type, "ART") && strcmp(ris_type, "BILL") && strcmp(ris_type, "BOOK") && strcmp(ris_type, "CASE") && strcmp(ris_type, "CHAP") && strcmp(ris_type, "COMP") && strcmp(ris_type, "CONF") && strcmp(ris_type, "CTLG") && strcmp(ris_type, "DATA") && strcmp(ris_type, "ELEC") && strcmp(ris_type, "GEN") && strcmp(ris_type, "HEAR") && strcmp(ris_type, "ICOMM") && strcmp(ris_type, "INPR") && strcmp(ris_type, "JFULL") && strcmp(ris_type, "JOUR") && strcmp(ris_type, "MAP") && strcmp(ris_type, "MGZN") && strcmp(ris_type, "MPCT") && strcmp(ris_type, "MUSIC") && strcmp(ris_type, "NEWS") && strcmp(ris_type, "PAMP") && strcmp(ris_type, "PAT") && strcmp(ris_type, "PCOMM") && strcmp(ris_type, "RPRT") && strcmp(ris_type, "SER") && strcmp(ris_type, "SLIDE") && strcmp(ris_type, "SOUND") && strcmp(ris_type, "STAT") && strcmp(ris_type, "THES") && strcmp(ris_type, "UNBILL") && strcmp(ris_type, "UNPB") && strcmp(ris_type, "VIDEO")) { snprintf(errmsg, ERRMSG_LEN, "unknown RIS type %s, use default instead", ris_type); LOG_PRINT(LOG_WARNING, errmsg); n_invalid_mapping = 1; n_error++; /* still use default value */ } else { strcpy(map_bibtypes[i], ris_type); /* use new value */ } } /* else: if no entry in config file, use default value */ } /* end for loop */ return (n_error) ? 1:0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ print_type(): prints the TY tag based on the bibtex entry type char* print_type returns ptr to result buffer char* bib_type ptr to a buffer that receives the BibTeX type string must hold at least 16 chars char** ris_type ptr to ptr that will be set to point to the RIS type AST* ptr_entry ptr to a node retrieved with bt_next_entry() ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* print_type(char* bib_type, char** ris_type, AST* ptr_entry) { char* type; char errmsg[ERRMSG_LEN]; if (ptr_entry == NULL) { n_parse_error = 1; return NULL; } type = bt_entry_type(ptr_entry); if (type == NULL) { n_parse_error = 1; return NULL; } strncpy(bib_type, type, 15); bib_type[15] = '\0'; strdn(bib_type); /* poor man's associative array... */ if (!strcmp(bib_type, "article")) { *ris_type = map_bibtypes[BT_ARTICLE]; } else if (!strcmp(bib_type, "book")) { *ris_type = map_bibtypes[BT_BOOK]; } else if (!strcmp(bib_type, "booklet")) { *ris_type = map_bibtypes[BT_BOOKLET]; } else if (!strcmp(bib_type, "conference")) { *ris_type = map_bibtypes[BT_CONFERENCE]; } else if (!strcmp(bib_type, "inbook")) { *ris_type = map_bibtypes[BT_INBOOK]; } else if (!strcmp(bib_type, "incollection")) { *ris_type = map_bibtypes[BT_INCOLLECTION]; } else if (!strcmp(bib_type, "inproceedings")) { *ris_type = map_bibtypes[BT_INPROCEEDINGS]; } else if (!strcmp(bib_type, "manual")) { *ris_type = map_bibtypes[BT_MANUAL]; } else if (!strcmp(bib_type, "mastersthesis")) { *ris_type = map_bibtypes[BT_MASTERSTHESIS]; } else if (!strcmp(bib_type, "proceedings")) { *ris_type = map_bibtypes[BT_PROCEEDINGS]; } else if (!strcmp(bib_type, "techreport")) { *ris_type = map_bibtypes[BT_TECHREPORT]; } else if (!strcmp(bib_type, "phdthesis")) { *ris_type = map_bibtypes[BT_PHDTHESIS]; } else if (!strcmp(bib_type, "unpublished")) { *ris_type = map_bibtypes[BT_UNPUBLISHED]; } else { /* misc */ *ris_type = map_bibtypes[BT_MISC]; if (strcmp(bib_type, "misc")) { snprintf(errmsg, ERRMSG_LEN, "unknown publication type %s", bib_type); n_unknown_type = 1; LOG_PRINT(LOG_WARNING, errmsg); } } printf("TY - %s\n", *ris_type); return *ris_type; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ print_journal(): creates the JO/JF tags int print_journal returns 0 if ok, 1 if error char* journal ptr to a buffer with the journal name ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int print_journal(char* journal) { int i; int len; char* my_journal; char* final_journal; char* start; char* period; char* next_start; my_journal = malloc(strlen(journal)+1); if (my_journal == NULL) { LOG_PRINT(LOG_ERR, "out of memory"); n_gen_error = 1; return 1; } my_journal[0] = '\0'; /* eliminate spaces after dots and collapse consecutive spaces to a single space */ start = journal; i = 0; while (journal[i]) { if ((journal[i] == '.' || journal[i] == ' ') && journal[i+1] == ' ') { period = &journal[i+1]; i++; while (journal[i] == ' ') { i++; } next_start = &journal[i]; len = strlen(my_journal); strncpy(&my_journal[len], start, period-start); my_journal[len+(period-start)] = '\0'; start = next_start; } else { i++; } } strcat(my_journal, start); /* remove leading or trailing whitespace */ final_journal = stripwhite(my_journal, 0, 0); /* assume abbreviated name if there is at least one period. this fails to catch the cases where the words are abbreviated without a trailing period */ if (strchr(final_journal, (int)'.') != NULL || n_force_jabbrev) { printf("JO - %s\n", final_journal); } else { printf("JF - %s\n", final_journal); } free(my_journal); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ print_py(): creates the publication year tag int print_py returns 0 (no error checking yet) struct RISPY* rispy ptr to a structure with all relevant strings ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int print_py(struct RISPY* rispy) { char pystring[267]; /* yyyy/mm/dd/otherinfo with otherinfo <= 255 chars */ char bufstring[MAX_FIXFIELD_LEN]; strcpy(pystring, get_year(bufstring, rispy->year)); strcat(pystring, get_month(bufstring, rispy->month)); strcat(pystring, get_day(bufstring, rispy->day)); /* lacking a better idea we just append edition and howpublished here we make sure that we don't get a buffer overflow so the second string may get truncated */ strcat(pystring, rispy->edition); if ((rispy->howpublished)[0] && strlen(rispy->edition) < MAX_FIXFIELD_LEN-1) { strcat(pystring, ";"); strncat(pystring, rispy->howpublished, MAX_FIXFIELD_LEN-strlen(rispy->edition)-2); } printf("PY - %s\n", pystring); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ print_authors(): creates the author/editor tags int print_authors returns 0 (no error checking yet) char* authorstring the string to scan for authors char* tagname ptr to two-letter tag name, e.g. "AU" for primary authors, "A2" for secondary etc char* infile name of input file (for error messages) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int print_authors(char* authorstring, char* tagname, char* infile) { int i, j; int nfirst = 1; int navail; /* maximum length of a RIS author field */ int nitem_len; char namestring[MAX_FIXFIELD_LEN]; char firstabbrev[3] = "x."; bt_stringlist* ptr_authorlist; bt_name* ptr_partlist; ptr_authorlist = bt_split_list(authorstring, "and", infile, -1, "name"); /* walk over all substrings (individual author names) */ for (i = 0; i < ptr_authorlist->num_items; i++) { /* split the name into its components */ ptr_partlist = bt_split_name((ptr_authorlist->items)[i], infile, -1, i); /* make sure we stop in time */ navail = MAX_FIXFIELD_LEN - 1; /* last name goes first, optionally with a "von" part */ namestring[0] = '\0'; for (j = 0; j < ptr_partlist->part_len[BTN_VON]; j++) { if ((nitem_len = strlen(ptr_partlist->parts[BTN_VON][j])) <= navail) { strcat(namestring, ptr_partlist->parts[BTN_VON][j]); navail -= nitem_len; } else { goto haveall; } } if (j > 0) { /* add a space only if there was some "von" output */ if (navail >= 1) { strcat(namestring, " "); navail--; } else { goto haveall; } } /* the "real" last name parts */ for (j = 0; j < ptr_partlist->part_len[BTN_LAST]; j++) { if ((nitem_len = strlen(ptr_partlist->parts[BTN_LAST][j])) <= navail) { strcat(namestring, ptr_partlist->parts[BTN_LAST][j]); navail -= nitem_len; } else { goto haveall; } } /* now the first names */ for (j = 0; j < ptr_partlist->part_len[BTN_FIRST]; j++) { if (nfirst) { /* add comma after last name only once */ nfirst = 0; if (navail >= 1) { strcat(namestring, ","); navail--; } else { goto haveall; } } /* add space, except when the previous char is a period or a comma */ if(j < ptr_partlist->part_len[BTN_FIRST]){ if (navail >= 1) { if (namestring[strlen(namestring)-1] != '.' && namestring[strlen(namestring)-1] != ',') { strcat(namestring, " "); navail--; } } else { goto haveall; } } if (n_abbrev_first) { /* abbreviate firstnames */ if (navail >= 2) { firstabbrev[0] = (char)toupper(ptr_partlist->parts[BTN_FIRST][j][0]); strcat(namestring, firstabbrev); navail -= 2; } else { goto haveall; } } else { /* use firstname parts as they come */ if ((nitem_len = strlen(ptr_partlist->parts[BTN_FIRST][j])) <= navail) { strcat(namestring, ptr_partlist->parts[BTN_FIRST][j]); navail -= nitem_len; } else { goto haveall; } } } /* now the pedigree suffix */ nfirst = 1; for (j = 0; j < ptr_partlist->part_len[BTN_JR]; j++) { if (nfirst) { /* need the comma once before the first part */ nfirst = 0; if (navail >= 1) { strcat(namestring, ","); navail--; } else { goto haveall; } } if ((nitem_len = strlen(ptr_partlist->parts[BTN_JR][j])) <= navail) { strcat(namestring, ptr_partlist->parts[BTN_JR][j]); navail -= nitem_len; } else { goto haveall; } } haveall: printf("%s - %s\n", tagname, namestring); bt_free_name(ptr_partlist); } bt_free_list(ptr_authorlist); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ print_titles(): creates the title tags int print_titles returns 0 (no error checking yet) char* ris_type ptr to a buffer with the current RIS publication type struct TITLES* titles ptr to a struct with the available titles ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int print_titles(char* ris_type, struct TITLES* titles) { if ((!strcmp(ris_type, "BOOK") || !strcmp(ris_type, "PAMP") || !strcmp(ris_type, "CONF")) && titles->title) { printf("BT - %s\n", titles->title); } else if (!strcmp(ris_type, "CHAP") || !strcmp(ris_type, "PAMP")) { if (titles->title) { printf("TI - %s\n", titles->title); } if (titles->booktitle) { printf("BT - %s\n", titles->booktitle); } if (titles->seriestitle) { printf("T3 - %s\n", titles->seriestitle); } } else if (titles->title) { printf("TI - %s\n", titles->title); } /* free memory */ if (titles->title) { free(titles->title); } if (titles->booktitle) { free(titles->booktitle); } if (titles->seriestitle) { free(titles->seriestitle); } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ print_pubinfo(): creates the PB tag int print_pubinfo returns 0 (no error checking yet) char* ris_type ptr to a buffer containing the current RIS publication type struct PUBINFO* pubinfo ptr to a struct with the notes ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int print_pubinfo(char* bib_type, struct PUBINFO* pubinfo) { char* the_pb; /* in lieu of a good idea we just set up arbitrary priorities and then choose the non-zero length string with the highest priority */ if (pubinfo->publisher[0]) { the_pb = pubinfo->publisher; } else if (pubinfo->organization[0]) { the_pb = pubinfo->organization; } else if (pubinfo->institution[0]) { the_pb = pubinfo->institution; } else if (pubinfo->school[0]) { the_pb = pubinfo->school; } else { the_pb = NULL; } if (the_pb != NULL) { printf("PB - %s\n", the_pb); } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ print_notes(): creates the N1 tag int print_notes returns 0 (no error checking yet) struct NOTES* notes ptr to a struct with the notes ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int print_notes(struct NOTES* notes) { if (notes->note) { printf("N1 - %s", notes->note); if (notes->annote) { printf(";%s", notes->annote); } printf("\n"); } else if (notes->annote) { printf("N1 - %s\n", notes->annote); } /* free memory */ if (notes->note) { free(notes->note); } if (notes->annote) { free(notes->annote); } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ print_poolstring(): creates a given tag with a pooled string and frees the memory allocated for the string int print_poolstring returns 0 (no error checking yet) char* the_string ptr to buffer with the address info char* tag ptr to buffer with the two-letter tag to print ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int print_poolstring(char* the_string, char* tag) { if (the_string != NULL) { printf("%s - %s\n", tag, the_string); free(the_string); } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ print_keywords(): creates KW tags int print_keywords returns 0 (no error checking yet) char* kwlist ptr to buffer with the address info ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int print_keywords(char* kwlist) { char* token; char my_listsep[PREFS_BUF_LEN] = " \t"; if (strcmp(listsep, "spc")) { strcpy(my_listsep, listsep); } token = strtok(kwlist, my_listsep); while (token) { printf("KW - %s\n", stripwhite(token, 0, 0)); token = strtok(NULL, my_listsep); } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ print_pageinfo(): creates the start/end page tags int print_pageinfo returns 0 (no error checking yet) char* pagestring the string to scan for pages ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int print_pageinfo(char* pagestring) { char* token; char* token1; char* mystring; char fullstring[MAX_FIXFIELD_LEN*2] = ""; char startpage[MAX_FIXFIELD_LEN] = ""; char endpage[MAX_FIXFIELD_LEN] = ""; /* possible formats are: 1. single page 2. page range with single hypen 3. page range with double hyphen 4. xx+ indicating page xx ssq. 5. comma-separated list of single pages 6. comma-separated list of a combination of 1, 2, 3, or 4 this function currently handles only 1-5 correctly. 6 will be handled more or less correctly if the tokens are arranged in ascending order. E.g. "5,7,14-16,19" will be converted to: SP - 5 EP - 19 which includes everything but is not strictly correct (and if the string starts or ends with a range the result is truly ugly). we can't bet that the page info is numeric as some journals (e.g. Am.J.Physiol.) use letters or strings to "enhance" the page information */ /* ToDo: in order to handle 6 correctly: break pagestring into comma-separated tokens, apply magic to each single token */ strncpy(fullstring, pagestring, (MAX_FIXFIELD_LEN*2)-1); fullstring[(MAX_FIXFIELD_LEN*2)-1] = '\0'; mystring = stripwhite(fullstring, 0, 0); /* try page range */ if ((token = strchr(mystring, (int)'-')) != NULL) { *token = '\0'; strncpy(startpage, mystring, MAX_FIXFIELD_LEN-1); startpage[MAX_FIXFIELD_LEN-1] = '\0'; token++; if (*token == '-') { token++; } if (*token) { strncpy(endpage, token, MAX_FIXFIELD_LEN-1); endpage[MAX_FIXFIELD_LEN-1] = '\0'; } } /* try comma-separated list and convert into a range */ else if ((token = strchr(mystring, (int)',')) != NULL) { /* first retrieve the EP string as we modify the string to copy the SP string */ token1 = strrchr(mystring, (int)','); /* will at least find the same comma as strchr() */ strncpy(endpage, token1+1, MAX_FIXFIELD_LEN-1); endpage[MAX_FIXFIELD_LEN-1] = '\0'; *token = '\0'; strncpy(startpage, mystring, MAX_FIXFIELD_LEN-1); startpage[MAX_FIXFIELD_LEN-1] = '\0'; } /* try strange + syntax */ else if ((token = strchr(mystring, (int)'+')) != NULL) { *token = '\0'; strncpy(startpage, mystring, MAX_FIXFIELD_LEN-1); startpage[MAX_FIXFIELD_LEN-1] = '\0'; } /* take it as it is */ else { strncpy(startpage, mystring, MAX_FIXFIELD_LEN-1); startpage[MAX_FIXFIELD_LEN-1] = '\0'; } if (*startpage) { printf("SP - %s\n", startpage); } if (*endpage) { printf("EP - %s\n", endpage); } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_year(): extracts a max. 4-digit year string from an input string char* get_year returns a ptr to the result string char* bufstring ptr to a buffer with at least 5 chars which will receive the result string char* yearstring input string containing the year information ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* get_year(char* bufstring, char* yearstring) { char* result; /* just make sure we got valid ptrs */ if (bufstring == NULL || yearstring == NULL) { return NULL; } if ((result = find_num(bufstring, yearstring, 4)) == NULL) { strcpy(bufstring, "/"); } else { sprintf(bufstring, "%s/", result); } return bufstring; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_month(): extracts a max. 2-digit month string from an input string char* get_month returns a ptr to the result string char* bufstring ptr to a buffer with at least 5 chars which will receive the result string char* monthstring input string containing the month information ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* get_month(char* bufstring, char* monthstring) { char* result; char month[16]; char monthbuf[16]; /* just make sure we got valid ptrs */ if (bufstring == NULL || monthstring == NULL) { return NULL; } /* truncate and lowercase input string */ bufstring[0] = '\0'; strncpy(month, monthstring, 15); /* maybe too short in other languages? */ month[15] = '\0'; strdn(month); /* the month information may be available in several formats: 1. numerical one or two-digit 2. full month name in any language 3. abbreviated month name in any language currently we handle only numerical and full/abbrev in English */ /* first try full and abbreviated month names */ if (!strcmp(month, "january") || !strcmp(month, "jan")) { strcpy(bufstring, "1/"); } else if (!strcmp(month, "february") || !strcmp(month, "feb")) { strcpy(bufstring, "2/"); } else if (!strcmp(month, "march") || !strcmp(month, "mar")) { strcpy(bufstring, "3/"); } else if (!strcmp(month, "april") || !strcmp(month, "apr")) { strcpy(bufstring, "4/"); } else if (!strcmp(month, "may")) { strcpy(bufstring, "5/"); } else if (!strcmp(month, "june") || !strcmp(month, "jun")) { strcpy(bufstring, "6/"); } else if (!strcmp(month, "july") || !strcmp(month, "jul")) { strcpy(bufstring, "7/"); } else if (!strcmp(month, "august") || !strcmp(month, "aug")) { strcpy(bufstring, "8/"); } else if (!strcmp(month, "september") || !strcmp(month, "sep")) { strcpy(bufstring, "9/"); } else if (!strcmp(month, "october") || !strcmp(month, "oct")) { strcpy(bufstring, "10/"); } else if (!strcmp(month, "november") || !strcmp(month, "nov")) { strcpy(bufstring, "11/"); } else if (!strcmp(month, "december") || !strcmp(month, "dec")) { strcpy(bufstring, "12/"); } if (*bufstring) { return bufstring; } /* now try numeric month */ if ((result = find_num(monthbuf, monthstring, 2)) == NULL) { strcpy(bufstring, "/"); } else { sprintf(bufstring, "%s/", result); } return bufstring; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_day(): extracts a max. 2-digit day string from an input string char* get_day returns a ptr to the result string char* bufstring ptr to a buffer with at least 5 chars which will receive the result string char* daystring input string containing the day information ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* get_day(char* bufstring, char* daystring) { char* result; char daybuf[16]; /* just make sure we got valid ptrs */ if (bufstring == NULL || daystring == NULL) { return NULL; } /* this fn currently handles only numeric day formats. Others are rare but possible (think "Ides of March" or something) */ if ((result = find_num(daybuf, daystring, 2)) == NULL) { strcpy(bufstring, "/"); } else { sprintf(bufstring, "%s/", result); } return bufstring; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ find_num(): finds a positive integer string of a given length in an input string char* find_num returns a ptr to the result buffer char* bufstring ptr to a buffer that will receive the result. Must hold at least len+1 chars char* numstring ptr to the buffer containing the number to find size_t len the length of the number string you're looking for. E.g. len is 4 if you try to find "1999" ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* find_num(char* bufstring, char* numstring, size_t len) { char* cur; char* end; char* new_num; int num; /* just make sure we got valid ptrs */ if (bufstring == NULL || numstring == NULL) { return NULL; } /* take the short way home if the request does not make any sense */ if (len <= 0) { bufstring[0] = '\0'; return bufstring; } cur = numstring; end = cur+strlen(numstring); /* find the first digit (skip any leading zeros) */ while (*cur && (!isdigit(*cur) || *cur == '0')) { cur++; } if (cur == end) { /* no digits found */ bufstring[0] = '\0'; return bufstring; } /* get a buffer to hold the remaining string. We don't want to modify the original string */ new_num = malloc(len+1); if (new_num == NULL) { LOG_PRINT(LOG_ERR, "out of memory"); n_gen_error = 1; return NULL; } strcpy(new_num, cur); /* chop off the next len characters and convert it to an integer. atoi() will end the input string at the first non-digit if any */ if (strlen(new_num) > len) { new_num[len] = '\0'; } num = atoi(new_num); free(new_num); sprintf(bufstring, "%d", num); return bufstring; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ pipehandler(): handler for the SIGPIPE signal. Sets the global variable n_broken_pipe to non-zero. This condition can be used by a function writing to a pipe to abort further write attempts. Any function that uses n_broken_pipe should reset it to zero when it is done dealing with the broken pipe. void pipehandler int sig the received signal ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ void pipehandler(int sig) { n_broken_pipe = 1; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ log_print(): writes a log message void log_print int priority the priority level of the log message as in syslog.h char* string a string containing the message to be logged ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ void log_print(int priority, char* string) { /* we must have this fn in the file with main() because FILE* cannot be declared extern (??) */ time_t the_time; char timestring[256]; if (n_log_dest == 0) { /* output on stderr */ fprintf(stderr, "%s\n", string); } else if (n_log_dest == 1) { /* output via syslog */ syslog(priority, "%s", string); } else { /* output in user-defined logfile */ time(&the_time); strftime(timestring, 256, "%a %b %d %H:%M:%S %Y", gmtime(&the_time)); fprintf(fp_log_file, "%d:pid=%d:%s:%s\n", priority, getpid(), timestring, string); } } #ifdef REFDB_CGI /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ alrmhandler(): handler for the SIGALRM signal. The app will exit. Purpose of this behaviour is to kill hanging CGI programs that could otherwise accumulate until the server dies of memory exhaustion void alrmhandler int sig the received signal ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ void alrmhandler(int sig) { LOG_PRINT(LOG_ERR, "received suicide alarm and exited"); exit(2); } #endif refdb-1.0.2/src/getopt.c000644 001750 001750 00000070074 12255427651 015720 0ustar00markusmarkus000000 000000 /* Getopt for GNU. NOTE: getopt is now part of the C library, so if you don't know what "Keep this file name-space clean" means, talk to roland@gnu.ai.mit.edu before changing it! Copyright (C) 1987, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97 Free Software Foundation, Inc. This file is part of the GNU C Library. Its master source is NOT part of the C library, however. The master source lives in /gd/gnu/lib. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. The GNU C Library 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with the GNU C Library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* This tells Alpha OSF/1 not to define a getopt prototype in . Ditto for AIX 3.2 and . */ #ifndef _NO_PROTO #define _NO_PROTO #endif #ifdef HAVE_CONFIG_H #include #endif #if !defined (__STDC__) || !__STDC__ /* This is a separate conditional since some stdc systems reject `defined (const)'. */ #ifndef const #define const #endif #endif #include #include /* Comment out all this code if we are using the GNU C Library, and are not actually compiling the library itself. This code is part of the GNU C Library, but also included in many other GNU distributions. Compiling and linking in this code is a waste when using the GNU C library (especially if it is a shared library). Rather than having every GNU program understand `configure --with-gnu-libc' and omit the object files, it is simpler to just do this in the source for each such file. */ #define GETOPT_INTERFACE_VERSION 2 #if !defined (_LIBC) && defined (__GLIBC__) && __GLIBC__ >= 2 #include #if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION #define ELIDE_CODE #endif #endif #ifndef ELIDE_CODE /* This needs to come after some library #include to get __GNU_LIBRARY__ defined. */ #ifdef __GNU_LIBRARY__ /* Don't include stdlib.h for non-GNU C libraries because some of them contain conflicting prototypes for getopt. */ #include #include #endif /* GNU C library. */ #ifdef VMS #include #if HAVE_STRING_H - 0 #include #endif #endif #if defined (WIN32) && !defined (__CYGWIN32__) /* It's not Unix, really. See? Capital letters. */ #include #define getpid() GetCurrentProcessId() #endif #ifndef _ /* This is for other GNU distributions with internationalized messages. When compiling libc, the _ macro is predefined. */ #ifdef HAVE_LIBINTL_H # include # define _(msgid) gettext (msgid) #else # define _(msgid) (msgid) #endif #endif /* This version of `getopt' appears to the caller like standard Unix `getopt' but it behaves differently for the user, since it allows the user to intersperse the options with the other arguments. As `getopt' works, it permutes the elements of ARGV so that, when it is done, all the options precede everything else. Thus all application programs are extended to handle flexible argument order. Setting the environment variable POSIXLY_CORRECT disables permutation. Then the behavior is completely standard. GNU application programs can use a third alternative mode in which they can distinguish the relative order of options and other arguments. */ #include "getopt.h" /* For communication from `getopt' to the caller. When `getopt' finds an option that takes an argument, the argument value is returned here. Also, when `ordering' is RETURN_IN_ORDER, each non-option ARGV-element is returned here. */ char *optarg = NULL; /* Index in ARGV of the next element to be scanned. This is used for communication to and from the caller and for communication between successive calls to `getopt'. On entry to `getopt', zero means this is the first call; initialize. When `getopt' returns -1, this is the index of the first of the non-option elements that the caller should itself scan. Otherwise, `optind' communicates from one call to the next how much of ARGV has been scanned so far. */ /* 1003.2 says this must be 1 before any call. */ int optind = 1; /* Formerly, initialization of getopt depended on optind==0, which causes problems with re-calling getopt as programs generally don't know that. */ int __getopt_initialized = 0; /* The next char to be scanned in the option-element in which the last option character we returned was found. This allows us to pick up the scan where we left off. If this is zero, or a null string, it means resume the scan by advancing to the next ARGV-element. */ static char *nextchar; /* Callers store zero here to inhibit the error message for unrecognized options. */ int opterr = 1; /* Set to an option character which was unrecognized. This must be initialized on some systems to avoid linking in the system's own getopt implementation. */ int optopt = '?'; /* Describe how to deal with options that follow non-option ARGV-elements. If the caller did not specify anything, the default is REQUIRE_ORDER if the environment variable POSIXLY_CORRECT is defined, PERMUTE otherwise. REQUIRE_ORDER means don't recognize them as options; stop option processing when the first non-option is seen. This is what Unix does. This mode of operation is selected by either setting the environment variable POSIXLY_CORRECT, or using `+' as the first character of the list of option characters. PERMUTE is the default. We permute the contents of ARGV as we scan, so that eventually all the non-options are at the end. This allows options to be given in any order, even with programs that were not written to expect this. RETURN_IN_ORDER is an option available to programs that were written to expect options and other ARGV-elements in any order and that care about the ordering of the two. We describe each non-option ARGV-element as if it were the argument of an option with character code 1. Using `-' as the first character of the list of option characters selects this mode of operation. The special argument `--' forces an end of option-scanning regardless of the value of `ordering'. In the case of RETURN_IN_ORDER, only `--' can cause `getopt' to return -1 with `optind' != ARGC. */ static enum { REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER } ordering; /* Value of POSIXLY_CORRECT environment variable. */ static char *posixly_correct; #ifdef __GNU_LIBRARY__ /* We want to avoid inclusion of string.h with non-GNU libraries because there are many ways it can cause trouble. On some systems, it contains special magic macros that don't work in GCC. */ #include #define my_index strchr #else /* Avoid depending on library functions or files whose names are inconsistent. */ char *getenv (); static char * my_index (str, chr) const char *str; int chr; { while (*str) { if (*str == chr) return (char *) str; str++; } return 0; } /* If using GCC, we can safely declare strlen this way. If not using GCC, it is ok not to declare it. */ #ifdef __GNUC__ /* Note that Motorola Delta 68k R3V7 comes with GCC but not stddef.h. That was relevant to code that was here before. */ #if !defined (__STDC__) || !__STDC__ /* gcc with -traditional declares the built-in strlen to return int, and has done so at least since version 2.4.5. -- rms. */ extern int strlen (const char *); #endif /* not __STDC__ */ #endif /* __GNUC__ */ #endif /* not __GNU_LIBRARY__ */ /* Handle permutation of arguments. */ /* Describe the part of ARGV that contains non-options that have been skipped. `first_nonopt' is the index in ARGV of the first of them; `last_nonopt' is the index after the last of them. */ static int first_nonopt; static int last_nonopt; #ifdef _LIBC /* Bash 2.0 gives us an environment variable containing flags indicating ARGV elements that should not be considered arguments. */ static const char *nonoption_flags; static int nonoption_flags_len; static int original_argc; static char *const *original_argv; /* Make sure the environment variable bash 2.0 puts in the environment is valid for the getopt call we must make sure that the ARGV passed to getopt is that one passed to the process. */ static void store_args (int argc, char *const *argv) __attribute__ ((unused)); static void store_args (int argc, char *const *argv) { /* XXX This is no good solution. We should rather copy the args so that we can compare them later. But we must not use malloc(3). */ original_argc = argc; original_argv = argv; } text_set_element (__libc_subinit, store_args); #endif /* Exchange two adjacent subsequences of ARGV. One subsequence is elements [first_nonopt,last_nonopt) which contains all the non-options that have been skipped so far. The other is elements [last_nonopt,optind), which contains all the options processed since those non-options were skipped. `first_nonopt' and `last_nonopt' are relocated so that they describe the new indices of the non-options in ARGV after they are moved. */ #if defined (__STDC__) && __STDC__ static void exchange (char **); #endif static void exchange (argv) char **argv; { int bottom = first_nonopt; int middle = last_nonopt; int top = optind; char *tem; /* Exchange the shorter segment with the far end of the longer segment. That puts the shorter segment into the right place. It leaves the longer segment in the right place overall, but it consists of two parts that need to be swapped next. */ while (top > middle && middle > bottom) { if (top - middle > middle - bottom) { /* Bottom segment is the short one. */ int len = middle - bottom; register int i; /* Swap it with the top part of the top segment. */ for (i = 0; i < len; i++) { tem = argv[bottom + i]; argv[bottom + i] = argv[top - (middle - bottom) + i]; argv[top - (middle - bottom) + i] = tem; } /* Exclude the moved bottom segment from further swapping. */ top -= len; } else { /* Top segment is the short one. */ int len = top - middle; register int i; /* Swap it with the bottom part of the bottom segment. */ for (i = 0; i < len; i++) { tem = argv[bottom + i]; argv[bottom + i] = argv[middle + i]; argv[middle + i] = tem; } /* Exclude the moved top segment from further swapping. */ bottom += len; } } /* Update records for the slots the non-options now occupy. */ first_nonopt += (optind - last_nonopt); last_nonopt = optind; } /* Initialize the internal data when the first call is made. */ #if defined (__STDC__) && __STDC__ static const char *_getopt_initialize (int, char *const *, const char *); #endif static const char * _getopt_initialize (argc, argv, optstring) int argc; char *const *argv; const char *optstring; { /* Start processing options with ARGV-element 1 (since ARGV-element 0 is the program name); the sequence of previously skipped non-option ARGV-elements is empty. */ first_nonopt = last_nonopt = optind = 1; nextchar = NULL; posixly_correct = getenv ("POSIXLY_CORRECT"); /* Determine how to handle the ordering of options and nonoptions. */ if (optstring[0] == '-') { ordering = RETURN_IN_ORDER; ++optstring; } else if (optstring[0] == '+') { ordering = REQUIRE_ORDER; ++optstring; } else if (posixly_correct != NULL) ordering = REQUIRE_ORDER; else ordering = PERMUTE; #ifdef _LIBC if (posixly_correct == NULL && argc == original_argc && argv == original_argv) { /* Bash 2.0 puts a special variable in the environment for each command it runs, specifying which ARGV elements are the results of file name wildcard expansion and therefore should not be considered as options. */ char var[100]; sprintf (var, "_%d_GNU_nonoption_argv_flags_", getpid ()); nonoption_flags = getenv (var); if (nonoption_flags == NULL) nonoption_flags_len = 0; else nonoption_flags_len = strlen (nonoption_flags); } else nonoption_flags_len = 0; #endif return optstring; } /* Scan elements of ARGV (whose length is ARGC) for option characters given in OPTSTRING. If an element of ARGV starts with '-', and is not exactly "-" or "--", then it is an option element. The characters of this element (aside from the initial '-') are option characters. If `getopt' is called repeatedly, it returns successively each of the option characters from each of the option elements. If `getopt' finds another option character, it returns that character, updating `optind' and `nextchar' so that the next call to `getopt' can resume the scan with the following option character or ARGV-element. If there are no more option characters, `getopt' returns -1. Then `optind' is the index in ARGV of the first ARGV-element that is not an option. (The ARGV-elements have been permuted so that those that are not options now come last.) OPTSTRING is a string containing the legitimate option characters. If an option character is seen that is not listed in OPTSTRING, return '?' after printing an error message. If you set `opterr' to zero, the error message is suppressed but we still return '?'. If a char in OPTSTRING is followed by a colon, that means it wants an arg, so the following text in the same ARGV-element, or the text of the following ARGV-element, is returned in `optarg'. Two colons mean an option that wants an optional arg; if there is text in the current ARGV-element, it is returned in `optarg', otherwise `optarg' is set to zero. If OPTSTRING starts with `-' or `+', it requests different methods of handling the non-option ARGV-elements. See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above. Long-named options begin with `--' instead of `-'. Their names may be abbreviated as long as the abbreviation is unique or is an exact match for some defined option. If they have an argument, it follows the option name in the same ARGV-element, separated from the option name by a `=', or else the in next ARGV-element. When `getopt' finds a long-named option, it returns 0 if that option's `flag' field is nonzero, the value of the option's `val' field if the `flag' field is zero. The elements of ARGV aren't really const, because we permute them. But we pretend they're const in the prototype to be compatible with other systems. LONGOPTS is a vector of `struct option' terminated by an element containing a name which is zero. LONGIND returns the index in LONGOPT of the long-named option found. It is only valid when a long-named option has been found by the most recent call. If LONG_ONLY is nonzero, '-' as well as '--' can introduce long-named options. */ int _getopt_internal (argc, argv, optstring, longopts, longind, long_only) int argc; char *const *argv; const char *optstring; const struct option *longopts; int *longind; int long_only; { optarg = NULL; if (!__getopt_initialized || optind == 0) { optstring = _getopt_initialize (argc, argv, optstring); optind = 1; /* Don't scan ARGV[0], the program name. */ __getopt_initialized = 1; } /* Test whether ARGV[optind] points to a non-option argument. Either it does not have option syntax, or there is an environment flag from the shell indicating it is not an option. The later information is only used when the used in the GNU libc. */ #ifdef _LIBC #define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0' \ || (optind < nonoption_flags_len \ && nonoption_flags[optind] == '1')) #else #define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0') #endif if (nextchar == NULL || *nextchar == '\0') { /* Advance to the next ARGV-element. */ /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been moved back by the user (who may also have changed the arguments). */ if (last_nonopt > optind) last_nonopt = optind; if (first_nonopt > optind) first_nonopt = optind; if (ordering == PERMUTE) { /* If we have just processed some options following some non-options, exchange them so that the options come first. */ if (first_nonopt != last_nonopt && last_nonopt != optind) exchange ((char **) argv); else if (last_nonopt != optind) first_nonopt = optind; /* Skip any additional non-options and extend the range of non-options previously skipped. */ while (optind < argc && NONOPTION_P) optind++; last_nonopt = optind; } /* The special ARGV-element `--' means premature end of options. Skip it like a null option, then exchange with previous non-options as if it were an option, then skip everything else like a non-option. */ if (optind != argc && !strcmp (argv[optind], "--")) { optind++; if (first_nonopt != last_nonopt && last_nonopt != optind) exchange ((char **) argv); else if (first_nonopt == last_nonopt) first_nonopt = optind; last_nonopt = argc; optind = argc; } /* If we have done all the ARGV-elements, stop the scan and back over any non-options that we skipped and permuted. */ if (optind == argc) { /* Set the next-arg-index to point at the non-options that we previously skipped, so the caller will digest them. */ if (first_nonopt != last_nonopt) optind = first_nonopt; return -1; } /* If we have come to a non-option and did not permute it, either stop the scan or describe it to the caller and pass it by. */ if (NONOPTION_P) { if (ordering == REQUIRE_ORDER) return -1; optarg = argv[optind++]; return 1; } /* We have found another option-ARGV-element. Skip the initial punctuation. */ nextchar = (argv[optind] + 1 + (longopts != NULL && argv[optind][1] == '-')); } /* Decode the current option-ARGV-element. */ /* Check whether the ARGV-element is a long option. If long_only and the ARGV-element has the form "-f", where f is a valid short option, don't consider it an abbreviated form of a long option that starts with f. Otherwise there would be no way to give the -f short option. On the other hand, if there's a long option "fubar" and the ARGV-element is "-fu", do consider that an abbreviation of the long option, just like "--fu", and not "-f" with arg "u". This distinction seems to be the most useful approach. */ if (longopts != NULL && (argv[optind][1] == '-' || (long_only && (argv[optind][2] || !my_index (optstring, argv[optind][1]))))) { char *nameend; const struct option *p; const struct option *pfound = NULL; int exact = 0; int ambig = 0; int indfound = -1; int option_index; for (nameend = nextchar; *nameend && *nameend != '='; nameend++) /* Do nothing. */ ; /* Test all long options for either exact match or abbreviated matches. */ for (p = longopts, option_index = 0; p->name; p++, option_index++) if (!strncmp (p->name, nextchar, nameend - nextchar)) { if ((unsigned int) (nameend - nextchar) == (unsigned int) strlen (p->name)) { /* Exact match found. */ pfound = p; indfound = option_index; exact = 1; break; } else if (pfound == NULL) { /* First nonexact match found. */ pfound = p; indfound = option_index; } else /* Second or later nonexact match found. */ ambig = 1; } if (ambig && !exact) { if (opterr) fprintf (stderr, _("%s: option `%s' is ambiguous\n"), argv[0], argv[optind]); nextchar += strlen (nextchar); optind++; optopt = 0; return '?'; } if (pfound != NULL) { option_index = indfound; optind++; if (*nameend) { /* Don't test has_arg with >, because some C compilers don't allow it to be used on enums. */ if (pfound->has_arg) optarg = nameend + 1; else { if (opterr) if (argv[optind - 1][1] == '-') /* --option */ fprintf (stderr, _("%s: option `--%s' doesn't allow an argument\n"), argv[0], pfound->name); else /* +option or -option */ fprintf (stderr, _("%s: option `%c%s' doesn't allow an argument\n"), argv[0], argv[optind - 1][0], pfound->name); nextchar += strlen (nextchar); optopt = pfound->val; return '?'; } } else if (pfound->has_arg == 1) { if (optind < argc) optarg = argv[optind++]; else { if (opterr) fprintf (stderr, _("%s: option `%s' requires an argument\n"), argv[0], argv[optind - 1]); nextchar += strlen (nextchar); optopt = pfound->val; return optstring[0] == ':' ? ':' : '?'; } } nextchar += strlen (nextchar); if (longind != NULL) *longind = option_index; if (pfound->flag) { *(pfound->flag) = pfound->val; return 0; } return pfound->val; } /* Can't find it as a long option. If this is not getopt_long_only, or the option starts with '--' or is not a valid short option, then it's an error. Otherwise interpret it as a short option. */ if (!long_only || argv[optind][1] == '-' || my_index (optstring, *nextchar) == NULL) { if (opterr) { if (argv[optind][1] == '-') /* --option */ fprintf (stderr, _("%s: unrecognized option `--%s'\n"), argv[0], nextchar); else /* +option or -option */ fprintf (stderr, _("%s: unrecognized option `%c%s'\n"), argv[0], argv[optind][0], nextchar); } nextchar = (char *) ""; optind++; optopt = 0; return '?'; } } /* Look at and handle the next short option-character. */ { char c = *nextchar++; char *temp = my_index (optstring, c); /* Increment `optind' when we start to process its last character. */ if (*nextchar == '\0') ++optind; if (temp == NULL || c == ':') { if (opterr) { if (posixly_correct) /* 1003.2 specifies the format of this message. */ fprintf (stderr, _("%s: illegal option -- %c\n"), argv[0], c); else fprintf (stderr, _("%s: invalid option -- %c\n"), argv[0], c); } optopt = c; return '?'; } /* Convenience. Treat POSIX -W foo same as long option --foo */ if (temp[0] == 'W' && temp[1] == ';') { char *nameend; const struct option *p; const struct option *pfound = NULL; int exact = 0; int ambig = 0; int indfound = 0; int option_index; /* This is an option that requires an argument. */ if (*nextchar != '\0') { optarg = nextchar; /* If we end this ARGV-element by taking the rest as an arg, we must advance to the next element now. */ optind++; } else if (optind == argc) { if (opterr) { /* 1003.2 specifies the format of this message. */ fprintf (stderr, _("%s: option requires an argument -- %c\n"), argv[0], c); } optopt = c; if (optstring[0] == ':') c = ':'; else c = '?'; return c; } else /* We already incremented `optind' once; increment it again when taking next ARGV-elt as argument. */ optarg = argv[optind++]; /* optarg is now the argument, see if it's in the table of longopts. */ for (nextchar = nameend = optarg; *nameend && *nameend != '='; nameend++) /* Do nothing. */ ; /* Test all long options for either exact match or abbreviated matches. */ for (p = longopts, option_index = 0; p->name; p++, option_index++) if (!strncmp (p->name, nextchar, nameend - nextchar)) { if ((unsigned int) (nameend - nextchar) == strlen (p->name)) { /* Exact match found. */ pfound = p; indfound = option_index; exact = 1; break; } else if (pfound == NULL) { /* First nonexact match found. */ pfound = p; indfound = option_index; } else /* Second or later nonexact match found. */ ambig = 1; } if (ambig && !exact) { if (opterr) fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"), argv[0], argv[optind]); nextchar += strlen (nextchar); optind++; return '?'; } if (pfound != NULL) { option_index = indfound; if (*nameend) { /* Don't test has_arg with >, because some C compilers don't allow it to be used on enums. */ if (pfound->has_arg) optarg = nameend + 1; else { if (opterr) fprintf (stderr, _("\ %s: option `-W %s' doesn't allow an argument\n"), argv[0], pfound->name); nextchar += strlen (nextchar); return '?'; } } else if (pfound->has_arg == 1) { if (optind < argc) optarg = argv[optind++]; else { if (opterr) fprintf (stderr, _("%s: option `%s' requires an argument\n"), argv[0], argv[optind - 1]); nextchar += strlen (nextchar); return optstring[0] == ':' ? ':' : '?'; } } nextchar += strlen (nextchar); if (longind != NULL) *longind = option_index; if (pfound->flag) { *(pfound->flag) = pfound->val; return 0; } return pfound->val; } nextchar = NULL; return 'W'; /* Let the application handle it. */ } if (temp[1] == ':') { if (temp[2] == ':') { /* This is an option that accepts an argument optionally. */ if (*nextchar != '\0') { optarg = nextchar; optind++; } else optarg = NULL; nextchar = NULL; } else { /* This is an option that requires an argument. */ if (*nextchar != '\0') { optarg = nextchar; /* If we end this ARGV-element by taking the rest as an arg, we must advance to the next element now. */ optind++; } else if (optind == argc) { if (opterr) { /* 1003.2 specifies the format of this message. */ fprintf (stderr, _("%s: option requires an argument -- %c\n"), argv[0], c); } optopt = c; if (optstring[0] == ':') c = ':'; else c = '?'; } else /* We already incremented `optind' once; increment it again when taking next ARGV-elt as argument. */ optarg = argv[optind++]; nextchar = NULL; } } return c; } } int getopt (argc, argv, optstring) int argc; char *const *argv; const char *optstring; { return _getopt_internal (argc, argv, optstring, (const struct option *) 0, (int *) 0, 0); } #endif /* Not ELIDE_CODE. */ #ifdef TEST /* Compile with -DTEST to make an executable for use in testing the above definition of `getopt'. */ int main (argc, argv) int argc; char **argv; { int c; int digit_optind = 0; while (1) { int this_option_optind = optind ? optind : 1; c = getopt (argc, argv, "abc:d:0123456789"); if (c == -1) break; switch (c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (digit_optind != 0 && digit_optind != this_option_optind) printf ("digits occur in two different argv-elements.\n"); digit_optind = this_option_optind; printf ("option %c\n", c); break; case 'a': printf ("option a\n"); break; case 'b': printf ("option b\n"); break; case 'c': printf ("option c with value `%s'\n", optarg); break; case '?': break; default: printf ("?? getopt returned character code 0%o ??\n", c); } } if (optind < argc) { printf ("non-option ARGV-elements: "); while (optind < argc) printf ("%s ", argv[optind++]); printf ("\n"); } exit (0); } #endif /* TEST */ refdb-1.0.2/src/strfncs.c000755 001750 001750 00000104742 12255427652 016104 0ustar00markusmarkus000000 000000 /*++++ strfncs.c provides some string and array helpers markus@mhoenicka.de 2-8-00 ++++++*/ /* 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ #include #include #include #include #include #include #include #include #include #include #include #include "strfncs.h" #include "outformats.h" #include "rtfhelper.h" /* for RTF treatment in sgml_entitize */ /* Max integer that can be stored in a size_t variable */ #ifndef SIZE_T_MAX #define SIZE_T_MAX UINT_MAX #endif /* !SIZE_T_MAX */ /* forward declarations of local functions */ static int is_ip(char *address); /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ is_ip(): checks whether string contains a valid IP address This function does not verify that the given IP address exists or is accessible, but rather checks whether the string is sane. static int is_ip returns 0 if error, 1 if ok char *address ptr to the string to check returns 0 if invalid, 1 if valid ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int is_ip(char *address) { char *token[4]; char ip_address[16]; int i, n_value; /* refuse if string is too long */ if (strlen(address) > 15) { return 0; } /* make a local copy as strtok modifies its argument */ strncpy(ip_address, address, 16); ip_address[15] = '\0'; /* now look for four tokens separated by "." */ token[0] = strtok(ip_address, "."); if (token[0] == NULL) { return 0; } token[1] = strtok(NULL, "."); if (token[1] == NULL) { return 0; } token[2] = strtok(NULL, "."); if (token[2] == NULL) { return 0; } token[3] = strtok(NULL, "\r\n"); if (token[3] == NULL) { return 0; } /* see whether the tokens are in the allowed numerical range */ for (i = 0; i < 4; i++) { n_value = atoi(token[i]); if (n_value < 0 || n_value > 255) { return 0; } } return 1; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ check_ip(): validate an IP address/hostname The fn first tests whether the input string looks like a dotted quad. If not, the string is assumed to be a hostname. It tries to resolve this host. If it has one IP address, the input string will be replaced with a string with a dotted quad representation of the IP address. If the host has more than one IP address, no substitution is performed. int check_ip returns 0 if the string looks like a dotted quad or if the string can be resolved as a hostname for exactly one IP address. Returns -1 if the string is 'localhost' which has a special meaning for some database servers. Returns > 0 if there's a problem: 1: cannot be resolved as a hostname 2: does not appear to be an IP host 3: does not appear to have a valid IP address 4: has more than one network interface char* server_ip ptr to a string with the IP-address or the putative hostname. The size of the buffer must be at least 16 chars regardless of the length of the input string as it will receive a dotted quad representation under certain circumstances. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int check_ip (char* server_ip) { char new_server_ip[16]; char** addrs; int num_interfaces = 0; struct hostent *hostinfo; if (server_ip == NULL) { return 1; } if (is_ip(server_ip)) { return 0; /* looks like a dotted quad */ } if (!strcmp(server_ip, "localhost")) { return -1; /* special hostname string for some database servers */ } /* try to use the string as a hostname */ hostinfo = gethostbyname(server_ip); if (hostinfo == NULL) { return 1; } if (hostinfo->h_addrtype != AF_INET) { return 2; } addrs = hostinfo->h_addr_list; while (*addrs && num_interfaces < 3) { sprintf(new_server_ip, "%s", inet_ntoa(*(struct in_addr*)*addrs)); num_interfaces++; addrs++; } if (!num_interfaces) { return 3; } else if (num_interfaces == 1) { strcpy(server_ip, new_server_ip); return 0; } else { return 4; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ is_port(): checks whether string contains a valid port This fn simply ensures that the port is outside the range that the system uses, i.e. > 1024 int is_port char *address ptr to the string to check returns 0 if invalid, 1 if valid ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int is_port(char *port) { if (port == NULL) { return 0; } if (atoi(port) < 1024) { return 0; } else { return 1; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ is_number(): tests whether a string is a number int is_number returns 1 if the string is a representation of a positive integer; returns 0 if the string does not exist or is empty or contains other characters than digits char* string address of string to test ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int is_number(char *string) { char *curr; if (!string || !*string) { return 0; } curr = string; while (*curr) { if (!isdigit((int)(*curr))) { return 0; } curr++; } return 1; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ is_real_number(): tests whether a string is a number including decimal fractions int is_real_number returns 1 if the string is a representation of a positive number; returns 0 if the string does not exist or is empty or contains other characters than digits or a decimal point or if there is more than one decimal point char* string address of string to test ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int is_real_number(const char *string) { char *curr; int decpoint = 0; if (!string || !*string) { return 0; } curr = (char*)string; while (*curr) { if (*curr == '.') { decpoint++; } if ((!isdigit((int)(*curr)) && *curr != '.') || decpoint > 1) { return 0; } curr++; } return 1; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ stripwhite(): strips whitespace from the start and end of STRING char* stripwhite char* string address of string to convert int mode 0 = strips start and end, 1 = start only, 2 = end only int type 0 = only space and tab 1 = space, tab, cr, lf Returns ptr to the modified string ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char *stripwhite (char *string, int mode, int type) { /* this function was modified from a readline sample program. The original style is unnecessarily cryptic, but it works. */ register char *s, *t; if (string == NULL) { return NULL; } s = string; if (type) { if (mode != 2) { for (; full_whitespace (*s); s++) ; if (*s == 0) return (s); } if (mode != 1) { t = s + strlen (s) - 1; while (t > s && full_whitespace (*t)) t--; *++t = '\0'; } } else { if (mode != 2) { for (; whitespace (*s); s++) ; if (*s == 0) return (s); } if (mode != 1) { t = s + strlen (s) - 1; while (t > s && whitespace (*t)) t--; *++t = '\0'; } } return s; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ strup(): converts a string in place to uppercase char* strup() returns a pointer to the modified string char* string pointer to the string to be converted ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* strup(char* string) { char* chr; if (string == NULL) { return NULL; } chr = string; /* don't modify string, we need it as a return value */ /* loop until we find \0 */ while (*chr) { *chr = (char)toupper((int)*chr); /* now convert */ chr++; } return string; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ strdn(): converts a string in place to lowercase char* strup() returns a pointer to the modified string char* string pointer to the string to be converted ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* strdn(char* string) { char* chr; if (string == NULL) { return NULL; } chr = string; /* don't modify string, we need it as a return value */ /* loop until we find \0 */ while (*chr) { *chr = (char)tolower((int)*chr); /* now convert */ chr++; } return string; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ stricap(): converts a string in place to lowercase, but capitalize the first letter of each word char* stricap() returns a pointer to the modified string char* string pointer to the string to be converted ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* stricap(char* string) { char* period; strdn(string); /* now uppercase the first character of each word unless it is something like "the", "a" etc. */ /* ToDo: handle the "the", "a" etc. cases */ period = string; if (islower((int)(*period))) { *period = (char)toupper((int)(*period)); } period++; while (*period != '\0') { if (ispunct((int)(*period)) || isspace((int)(*period))) { if (islower((int)(*(period+1)))) { *(period+1) = (char)toupper((int)(*(period+1))); } } period++; } return string; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ compare_ptr(): compares two pointers to strings int compare_ptr returns -1 if the first argument is smaller than the second; 0 if both are equal; 1 if the first is larger void* ptr_one the first char* to compare void* ptr_two the second char* to compare ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int compare_ptr(const void* ptr_one, const void* ptr_two) { char** firstptr; char** secondptr; firstptr = (char**)ptr_one; secondptr = (char**)ptr_two; /* handle cases where at least one of the ptrs is a NULL ptr */ if (*firstptr == NULL) { if (*secondptr == NULL) { return 0; } else { return 1; } } else if (*secondptr == NULL) { return -1; } /* all ptrs are non-NULL now */ if (*firstptr < *secondptr) { return -1; } else if (*firstptr == *secondptr) { return 0; } else { return 1; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ mstrcat(): a modified version of strcat which operates on destination strings obtained with malloc(); the length of the buffer is dynamically increased if necessary. char* mstrcat returns a pointer to the destination string or NULL if the realloc failed. As the buffer holding the destination string may have been reallocated, it is mandatory to use *ONLY* this returned pointer after the function call and *NEVER* the old pointer to destination char* destination the buffer obtained with malloc() to which the source string will be appended. The calling function is responsible to free this buffer after use char* source the string that will be appended to destination size_t* ptr_dest_len points to a variable that contains the current size of the buffer that destination points to. Will be modified if a realloc() is necessary to increase the buffer size size_t offset a positive value n will concatenate the string at the position omega-n of the destination string. Set offset to zero to get the standard strcat behaviour. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* mstrcat(char* destination, char* source, size_t* ptr_dest_len, size_t offset) { char *new_dest; size_t len; size_t source_len; size_t destination_len; /* take the short way out if destination doesn't exist */ if (destination == NULL || source == NULL) { return NULL; } source_len = strlen(source); destination_len = strlen(destination); /* don't allow offsets longer than the destination length */ offset = (offset > destination_len) ? destination_len : offset; /* we need the sum of both string lengths plus one for the \0 minus the offset if there is one */ len = destination_len + source_len + 1 - offset; /* reallocate buffer if it is too small */ if (len > *ptr_dest_len) { len = (len - *ptr_dest_len < realloc_chunk) ? *ptr_dest_len + realloc_chunk : len; if ((new_dest = (char*)realloc(destination, len)) == NULL) { return NULL; } else { destination = new_dest; } /* adjust the length variable */ *ptr_dest_len = len; } if (!offset) { /* this is the standard strcat behaviour */ strcat(destination, source); } else { /* this will append the string at position omega minus offset */ strcpy(&destination[strlen(destination)-offset], source); } /* return the new pointer to the buffer */ return destination; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ mstrcpy(): a modified version of strcpy which operates on destination strings obtained with malloc(); the length of the buffer is dynamically increased if necessary. char* mstrcpy returns a pointer to the destination string or NULL if the realloc failed. As the buffer holding the destination string may have been reallocated, it is mandatory to use *ONLY* this returned pointer after the function call and *NEVER* the old pointer to destination char* destination the buffer obtained with malloc() to which the source string will be copied char* source the string that will be copied to destination size_t* ptr_dest_len points to a variable that contains the current size of the buffer that destination points to. Will be modified if a realloc() is necessary to increase the buffer size ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* mstrcpy(char* destination, char* source, size_t* ptr_dest_len) { char *new_dest; size_t len; /* take the short way out if destination doesn't exist */ if (destination == NULL) { return NULL; } /* we need the length of the string plus one for the \0 */ len = strlen(source)+1; /* reallocate the buffer if it is too small */ if (*ptr_dest_len < len) { len = (len - *ptr_dest_len < realloc_chunk) ? *ptr_dest_len + realloc_chunk : len; if ((new_dest = (char*)realloc(destination, len)) == NULL) { return NULL; } else { destination = new_dest; } /* adjust the length variable */ *ptr_dest_len = len; } /* now copy the string*/ strcpy(destination, source); /* return the new pointer to the buffer */ return destination; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ mstrncpy(): a modified version of strncpy which operates on destination strings obtained with malloc(); the length of the buffer is dynamically increased if necessary. char* mstrncpy returns a pointer to the destination string or NULL if the realloc failed. As the buffer holding the destination string may have been reallocated, it is mandatory to use *ONLY* this returned pointer after the function call and *NEVER* the old pointer to destination char* destination the buffer obtained with malloc() to which the source string will be copied char* source the string that will be copied to destination size_t n the number of characters to copy size_t* ptr_dest_len points to a variable that contains the current size of the buffer that destination points to. Will be modified if a realloc() is necessary to increase the buffer size ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* mstrncpy(char* destination, char* source, size_t n, size_t* ptr_dest_len) { char *new_dest; size_t len; /* take the short way out if destination doesn't exist */ if (destination == NULL || source == NULL) { return NULL; } /* we need the length of the string plus one for the \0 */ len = n+1; /* reallocate the buffer if it is too small */ if (*ptr_dest_len < len) { len = (len - *ptr_dest_len < realloc_chunk) ? *ptr_dest_len + realloc_chunk : len; if ((new_dest = (char*)realloc(destination, len)) == NULL) { return NULL; } else { destination = new_dest; } /* adjust the length variable */ *ptr_dest_len = len; } /* now copy the string*/ strncpy(destination, source, n); /* return the new pointer to the buffer */ return destination; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ mstrdup() creates a copy of a string in a malloc()'ed buffer char* mstrdup returns a pointer to the copy of the string. Returns NULL in the case of a failure (out of memory) char* buffer pointer to the string to be copied ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* mstrdup(char *buffer) { char *new_buffer; if ((new_buffer = malloc(strlen(buffer)+1)) == NULL) { return NULL; } else { strcpy(new_buffer, buffer); return new_buffer; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ free_all() frees memory, taking the adresses out of a NULL-terminated array void free_all void*** ptr_mem pointer to an array of pointers which point to pointer variables which hold valid addresses of memory allocated with malloc/calloc/realloc or NULL. This somewhat complicated arrangement allows to reallocate the memory without changing the values in the array. If memory is freed before free_all() is called, the value of the pointer to the freed memory must be set to NULL, which will not harm free(). ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ void free_all(void*** ptr_mem) { int i = 0; while (ptr_mem[i] != NULL) { /* printf("free %d: %d\n", i, *(ptr_mem[i])); */ free(*(ptr_mem[i++])); } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ count_the_flowers() counts the number of occurrences of letter in buffer. letter may be a multibyte character static size_t count_the_flowers returns the number of occurrences of letter in buffer. It will return zero if letter is not in buffer. const char* buffer pointer to the string to scan const char* letter ptr to the letter to locate size_t len the number of bytes that represent letter ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ size_t count_the_flowers(const char *buffer, const char *letter, size_t len) { size_t numletters = 0; size_t i; size_t buflen; buflen = strlen(buffer); if (buflen >= len) { buflen = buflen-len+1; for (i = 0; i < buflen; i++) { if (!memcmp(buffer+i, letter, len)) { numletters++; } } return numletters; } else { /* string too short to hold the flower */ return 0; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ replace_char_string() replaces the letter that buffer points to with an insert of arbitrary size. The calling function is responsible to allocate enough space for buffer so the insertion can be safely executed. The letter may be a multibyte character. void replace_char_string has no return value char* buffer pointer to the null-terminated string that will be extended char* insert pointer to the string that will be inserted size_t len length of the letter to replace in bytes ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ void replace_char_string(char *buffer, char *insert, size_t len) { size_t insert_len; insert_len = strlen(insert); memmove(buffer+insert_len, buffer+len, strlen(buffer+len)+1); memcpy(buffer, insert, insert_len); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ remove_substring() removes the substring that buffer points to from a string. If the requested substring length is longer than the remainder of the string, the string will be terminated where buffer points to void remove_substring has no return value char* buffer pointer to the substring to be removed size_t sublen number of characters to remove ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ void remove_substring(char *buffer, size_t sublen) { if (strlen(buffer) >= sublen) { /* move one extra char to include the trailing \0 */ memmove(buffer, buffer+sublen, strlen(buffer+sublen)+1); } else { *buffer = '\0'; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ canonicalize_path(): converts a path to a canonical absolute path, resolving all symbolic links and eliminating path components like "/./" or "/../" or "~" char* canonicalize_path returns the canonical path in a malloc()'ed buffer. The calling function is responsible for freeing this buffer after use. Returns NULL if an error occurs. char* the_path ptr to a string with the path to convert ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char *canonicalize_path(char *the_path) { /* this fn was stolen and modified from cpbk */ char *temp; char *myhome; char *homepath; char *resolved_path; int numtilde; if ((temp = malloc(PATH_MAX)) == NULL) { return NULL; } if ((homepath = malloc(PATH_MAX)) == NULL) { free(temp); return NULL; } /* refuse if path is too long */ if (strlen(the_path) > PATH_MAX) { free(temp); free(homepath); return NULL; } /* check whether the string abbreviates the home directory. If so, expand with the value of HOME. This way we can call this function with paths that did not go through shell expansion */ if ((numtilde = count_the_flowers(the_path, "~", 1)) > 1) { free(homepath); free(temp); return NULL; } else if (numtilde) { myhome = getenv("HOME"); strcpy(homepath, the_path); replace_char_string(strchr(homepath, (int)'~'), myhome, 1); } else { strcpy(homepath, the_path); } resolved_path = realpath(homepath, temp); if (resolved_path == NULL) { /* some or all parts of the path are invalid */ if (errno == ENOENT) { /* file does not exist yet which may be ok if a file is to be created */ strcpy(temp, homepath); } else { free(homepath); free(temp); return NULL; } } free(homepath); return temp; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ strip_quote(): strips leading and trailing quotes char* strip_quote returns a ptr to the string without quotes or NULL if the_string is NULL char* the_string ptr to a string to strip ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char *strip_quote(char *the_string) { char* ptr_c; char* stripped_string; if (!the_string) { return NULL; } ptr_c = the_string; while (*ptr_c != '\0' && (*ptr_c == '\'' || *ptr_c == '\"' || *ptr_c == '`')) { ptr_c++; } stripped_string = ptr_c; ptr_c = &stripped_string[strlen(stripped_string)-1]; while (ptr_c >= the_string && (*ptr_c == '\'' || *ptr_c == '\"' || *ptr_c == '`')) { *ptr_c = '\0'; ptr_c--; } return stripped_string; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ truncate_quoted_string(): truncate a quoted string to a defined length the input string must be quoted with either single or double quotes, with no leading or trailing whitespace.. char* strip_quote returns a ptr to the string without quotes or NULL if the_string is NULL char* the_string ptr to a string to strip size_t len the maximum length of the string, sans the trailing '\0' ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char *truncate_quoted_string(char *the_string, size_t len) { char quote_char; if (!the_string || strlen(the_string) < len || len < 3) { /* nothing to do */ return the_string; } quote_char = *the_string; if (quote_char != '\'' && quote_char != '\"') { /* string does not appear to be quoted properly */ return NULL; } /* make sure we don't accidentally escape the trailing quote */ if (the_string[len-2] == '\\' || the_string[len-2] == quote_char) { the_string[len-1] = ' '; } the_string[len-1] = quote_char; the_string[len] = '\0'; return the_string; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ escape_chars(): backslash-escapes characters in a string size_t escape_chars returns the length of the escaped string char *dest pointer to a buffer that will receive the escaped string must hold at least twice the size of orig char *orig pointer to the buffer with the string to be escaped size_t orig_size length of original string const char *toescape array of characters that must be escaped ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ size_t escape_chars(char *dest, const char *orig, size_t orig_size, const char *toescape) { char *curdest = dest; const char *curorig = orig; const char *curescaped; size_t len = 0; while (curorig && curorig < orig+orig_size) { curescaped = toescape; while (curescaped && *curescaped) { if (*curorig == *curescaped) { *curdest = '\\'; curdest++; len++; break; } curescaped++; } /* Copy char to destination */ *curdest = *curorig; curorig++; curdest++; len++; } /* append a NULL byte. This is required if orig was a zero-terminated string. It does not hurt if orig was a binary string as the calling function is not supposed to read past len bytes */ *curdest = '\0'; return len; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ unescape_chars(): unescapes a backslash-escaped string size_t unescape_chars returns the length of the unescaped string char *dest pointer to a buffer that will receive the unescaped string must hold at least the size of orig char *orig pointer to the buffer with the string to be unescaped size_t orig_size length of original string ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ size_t unescape_chars(char *dest, const char *orig, size_t orig_size) { char *curdest = dest; const char *curorig = orig; size_t len = 0; while (curorig && curorig < orig+orig_size) { if (*curorig == '\\') { curorig++; } /* Copy char to destination */ *curdest = *curorig; curorig++; curdest++; len++; } /* append a NULL byte. This is required if orig was a zero-terminated string. It does not hurt if orig was a binary string as the calling function is not supposed to read past len bytes */ *curdest = '\0'; return len; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ escape_latex_chars(): backslash-escapes characters in a string this function is a wrapper for escape_chars() that escapes all LaTeX command characters size_t escape_chars returns the length of the escaped string char *dest pointer to a buffer that will receive the escaped string must hold at least twice the size of orig char *orig pointer to the buffer with the string to be escaped size_t orig_size length of original string ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ size_t escape_latex_chars(char *dest, const char *orig, size_t orig_size) { return escape_chars(dest, orig, orig_size, "#$%&~_^\\{}"); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ escape_latex_chars_copy(): backslash-escapes characters in a string this function is a wrapper for escape_latex_chars() it returns an allocated escaped string char* escape_chars returns the escaped string char *orig pointer to the buffer with the string to be escaped size_t orig_size length of original string ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* escape_latex_chars_copy(const char *orig, size_t orig_size) { char* dest; if ((dest = malloc(2*orig_size)) == NULL) { return NULL; } escape_latex_chars(dest, orig, orig_size); return dest; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ increment_suffix(): calling this function repeatedly generates a sequence of suffices. The sequence starts with a,b...z, then aa,ba..za...zz until the length of the string reaches max_depth where the fn will return an error. this function is recursive int increment_suffix returns 0 if ok or 1 if max_depth is exceeded char* suffix ptr to buffer to receive suffix. Must hold at least max_depth characters plus a terminating \0. In most cases you want the buffer to be an empty string when you first call this function to start with "a" or "A" int max_depth maximum depth of recursive nesting, determines maximum length of resulting suffix int upper if 1, the suffix will use uppercase characters, if 0 it'll be lowercase ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int increment_suffix(char* suffix, int max_depth, int upper) { char start[2] = "a"; char stopchar = 'z'; if (upper) { *start = 'A'; stopchar = 'Z'; } if (!*suffix) { /* still empty */ strcpy(suffix, start); } else { (*suffix)++; if (*suffix > stopchar) { if (max_depth > 1) { *suffix = *start; /* recursion increments the next character to the right */ if (increment_suffix(suffix+1, max_depth-1, upper)) { return 1; } } else { return 1; } } } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ parse_versioninfo(): parses a version info string (e.g. 3.23.11) and extracts the major, minor, and minuscule numbers the results are filled into a structure as numbers int parse_versioninfo returns 0 if ok or 1 if error const char* version ptr to buffer containing the version info string. the string may have up to two periods to separate the major, minor, and minuscule numbers. struct VERSIONINFO* ver ptr to structure that receives the numeric version info ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int parse_versioninfo(const char* version, struct VERSIONINFO* ver) { char* start; char* dot; char* my_version; /* initialize structure */ ver->major = 0; ver->minor = 0; ver->minuscule = 0; if (!version || !*version) { /* don't treat this as error. The version structure will contain all zeros */ return 0; } /* get a copy of version to mangle */ if ((my_version = strdup(version)) == NULL) { return 1; } start = my_version; if ((dot = strchr(start, (int)'.')) == NULL) { ver->major = atoi(start); free(my_version); return 0; } *dot = '\0'; ver->major = atoi(start); if (!(dot+1)) { free(my_version); return 0; } start = dot+1; if ((dot = strchr(start, (int)'.')) == NULL) { ver->minor = atoi(start); free(my_version); return 0; } *dot = '\0'; ver->minor = atoi(start); if (!(dot+1)) { free(my_version); return 0; } start = dot+1; ver->minuscule = atoi(start); free(my_version); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ min_token_length(): calculates the size of the smallest token in the string. The string is tokenized using strtok() according to the passed separators size_t min_token_length returns the size of the smallest token, or 0 if an error occurred const char* string ptr to the buffer to check const char* sep ptr to the string containing the separator characters ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ size_t min_token_length(const char* string, const char* sep) { char* my_string; char* start; size_t min_length = SIZE_T_MAX; size_t curr_length; if (!string || !sep || (my_string = strdup(string)) == NULL) { return 0; } start = my_string; for (start = strtok(my_string, sep); start; start = strtok(NULL, sep)) { if ((curr_length = strlen(start)) < min_length) { min_length = curr_length; } } free(my_string); return min_length; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ min_token_length(): calculates the size of the smallest token in the string. The string is tokenized using strtok() according to the passed separators size_t min_token_length returns the size of the smallest token, or 0 if an error occurred const char* string ptr to the buffer to check const char* sep ptr to the string containing the separator characters ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int replace_regexp_chars(char* string, char* regexp_chars, char replacement) { char* curr; char* regexp_char; int num_replaced = 0; curr = string; while (*curr) { regexp_char = regexp_chars; while (*regexp_char) { if (*curr == *regexp_char) { *curr = replacement; num_replaced++; } regexp_char++; } curr++; } return num_replaced; } refdb-1.0.2/src/pref.c000755 001750 001750 00000024240 12255427651 015347 0ustar00markusmarkus000000 000000 /* pref.c read, write, and manipulate preferences */ /* markus@mhoenicka.de 2-8-00 */ /* $Id: pref.c,v 1.15.2.2 2005/08/06 22:44:09 mhoenicka Exp $ */ /* 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ #include #include #include #include #include /* for isdigit() */ #include "refdb.h" #include "linklist.h" #include "pref.h" #include "strfncs.h" /* global variables */ extern char confdir[]; /* forward declarations of local functions */ static int read_data(FILE* fp, Prefs* ptr_prefs); static int read_nsf_data(FILE* fp, Lilibib* ptr_prefs); /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ read_prefs(): reads preferences from a configuration file The configuration file format is simple: Each line contains a pair of variable name and variable value, separated by whitespace. A # outcomments everything to the right. A variable name may have up to 16 characters, the value may have up to 255 characters (_POSIX_PATH_MAX) read_prefs() first looks for rc in /etc, and then in $REFDBLIB if /etc didn't contain a suitable file, and sets any variables it finds. Then it looks for .rc or rc (in this order) in $HOME and reads the variables from the first file it finds. Values in $HOME override the values in /etc or $REFDBLIB int read_prefs returns 0 if at least one init file is found, 1 if no init file is found. It is upon the discretion of the calling function whether this is an error or not. void* ptr_prefs ptr to an array of Prefs structures. The last Pref structure must have a zero-length varname string which acts as a terminator char *init_file ptr to a string with the name of the init file. This is first looked up in /etc, then $REFDBLIB, then in $HOME int type 0 = regular configuration data. ptr_prefs will be cast to Prefs*, numOpts must be set to the size of the array pointed to by ptr_prefs 1 = non-standard field mapping. ptr_prefs will be cast to Lilibib*, numOpts should be set to 0. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int read_prefs(void* ptr_prefs, char* init_file, int type) { FILE *fp; char *home; /* value of the HOME environment variable */ char *refdblib; /* value of the REFDBLIB environment variable */ char default_refdblib[_POSIX_PATH_MAX+1] = SYSCONFDIR; /* usually /etc */ char theinitfile[_POSIX_PATH_MAX+1]; char have_global = 0; home = getenv("HOME"); /* confdir is set through a command line option and overrides the compile-time default */ refdblib = (*confdir) ? confdir : default_refdblib; /* first try to read the global file */ snprintf(theinitfile, _POSIX_PATH_MAX, "%s/%s", refdblib, init_file); fp = fopen(theinitfile, "r"); if (fp != NULL) { have_global = 1; if (!type) { read_data(fp, (Prefs*)ptr_prefs); } else { read_nsf_data(fp, (Lilibib*)ptr_prefs); } fclose(fp); } else { /* fallback: look in $REFDBLIB */ refdblib = getenv("REFDBLIB"); if (refdblib != NULL) { snprintf(theinitfile, _POSIX_PATH_MAX, "%s/%s", refdblib, init_file); fp = fopen(theinitfile, "r"); if (fp != NULL) { have_global = 1; /* fprintf(stderr, "use config file %s\n", theinitfile); */ if (!type) { read_data(fp, (Prefs*)ptr_prefs); } else { read_nsf_data(fp, (Lilibib*)ptr_prefs); } fclose(fp); } } } /* if (!have_global) { */ /* fprintf(stderr, "no global config file found\n"); */ /* } */ /* now try to read the settings in $HOME/.rc */ if (home == NULL) { /* if HOME is not set, try the current directory */ fp = fopen(init_file, "r"); if (fp == NULL) { return ((have_global) ? 0:1); } } else { snprintf(theinitfile, _POSIX_PATH_MAX, "%s/.%s", home, init_file); fp = fopen(theinitfile, "r"); if (fp == NULL) { /* if not present, try a non-hidden rc file */ snprintf(theinitfile, _POSIX_PATH_MAX, "%s/%s", home, init_file); fp = fopen(theinitfile, "r"); if (fp == NULL) { /* if not present in HOME, we're done */ return ((have_global) ? 0:1); } } } if (!type) { read_data(fp, (Prefs*)ptr_prefs); } else { read_nsf_data(fp, (Lilibib*)ptr_prefs); } fclose(fp); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ read_data(): reads data from an init file static int read_data returns 0 (no error checking yet) FILE* fp ptr to an open stream with the data to analyze Prefs* ptr_prefs ptr to an array of Prefs structures ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int read_data(FILE* fp, Prefs* ptr_prefs) { char line [PREFS_BUF_LEN]; /* acommodates a variable name of max. 16 chars, a tab, a POSIX full path, and a \0 */ char *name_token; char *value_token; int i; char emtpy_string[1] = ""; line[0] = '\0'; while (fgets(line, PREFS_BUF_LEN, fp) != NULL) { /* discard comment lines right away*/ if (line[0] == '#') { continue; } line[PREFS_BUF_LEN-1] = '\0'; name_token = strtok(line, " \t\r\n#"); if (name_token == NULL || !name_token[0]) { continue; /* emtpy line */ } /* check also for # in value token, so we can outcomment values to get the default */ value_token = strtok(NULL, " \t\r\n#"); if (value_token == NULL) { value_token = emtpy_string; /* no value, assign empty string */ } /* loop over all variable names and see whether the config file line specifies one of the names */ i = 0; while (*(ptr_prefs[i].varname)) { if (strcmp(ptr_prefs[i].varname, name_token) == 0) { strcpy(ptr_prefs[i].varvalue, value_token); ptr_prefs[i].varvalue[PREFS_BUF_LEN-1] = '\0'; break; } i++; } } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ read_nsf_data(): reads non-standard field data from an init file static int read_nsf_data returns 0 if ok, 1 if memory error FILE* fp ptr to an open stream with the data to analyze Lilibib* ptr_prefs ptr to linked list for storing data ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int read_nsf_data(FILE* fp, Lilibib* ptr_prefs) { char* line; char *name_token; char *value_token; char emtpy_string[1] = ""; line = malloc(NSF_LINE_LEN); if (line == NULL) { return 1; } while (fgets(line, NSF_LINE_LEN, fp) != NULL) { /* discard comment lines right away*/ if (line[0] == '#') { continue; } /* line[PREFS_BUF_LEN-1] = '\0'; */ /* ignore lines that do not start with "nsf_" */ if (strncmp(line, "nsf_", 4)) { continue; } name_token = strtok(line, " \t\r\n#"); if (name_token == NULL || !name_token[0]) { continue; /* emtpy line */ } /* check also for # in value token, so we can outcomment values to get the default */ value_token = strtok(NULL, " \t\r\n#"); if (value_token == NULL) { value_token = emtpy_string; /* no value, assign empty string */ } /* strip the "nsf_" prefix when adding the name/value pair to the list */ if (insert_lilibib(ptr_prefs, name_token+4, value_token)) { free(line); return 1; } } free(line); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ num_loglevel(): converts the log_level string to a number int num_loglevel returns the log level or -1 if log_level was junk char* log_level ptr to a string containing the log level as a digit or as prose ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int num_loglevel(char* log_level) { char buffer[] = {'\0','\0'}; if (isdigit((int)log_level[0])) { buffer[0] = log_level[0]; /* use only first digit to avoid surprises */ return atoi(buffer); } else { strup(log_level); if (!strcmp(log_level, "EMERG")) { return 0; } else if (!strcmp(log_level, "ALERT")) { return 1; } else if (!strcmp(log_level, "CRIT")) { return 2; } else if (!strcmp(log_level, "ERR")) { return 3; } else if (!strcmp(log_level, "WARNING")) { return 4; } else if (!strcmp(log_level, "NOTICE")) { return 5; } else if (!strcmp(log_level, "INFO")) { return 6; } else if (!strcmp(log_level, "DEBUG")) { return 7; } } return -1; /* switch off logging if the string was junk */ } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ num_logdest(): converts the log_dest string to a number int num_logdest returns the log destination. If log_level is junk, syslog (=1) is assumed. char* log_dest ptr to a string containing the log destination as a digit or as prose ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int num_logdest(char* log_dest) { char buffer[] = {'\0','\0'}; if (isdigit((int)log_dest[0])) { buffer[0] = log_dest[0]; /* use only first digit to avoid surprises */ return atoi(buffer); } else { strup(log_dest); if (!strcmp(log_dest, "STDERR")) { return 0; } else if (!strcmp(log_dest, "SYSLOG")) { return 1; } else if (!strcmp(log_dest, "FILE")) { return 2; } } return 1; /* use syslog as default */ } refdb-1.0.2/src/linklist.c000755 001750 001750 00000074414 12255427651 016254 0ustar00markusmarkus000000 000000 /*+++++++++++++++++ linklist.c - implements some functions for linked lists markus@mhoenicka.de 7-11-00 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ #include /* for a definition of NULL */ #include /* for malloc */ #include #include "linklist.h" /********************************************************************* linked list for file descriptors This is an ordered linked list. The highest fd will always be the first member of the list. ********************************************************************/ /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ insert_olili(): inserts a new item into an ordered linked list. The list will be in descending order, so the first item after the sentinel is the item with the highest value int insert_olili returns 0 if ok, 1 if error struct olili *ptr_first pointer to sentinel int value the value to be inserted into the list (value >= 0) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int insert_olili(Olili *ptr_first, int value) { Olili *ptr_before; /* item before insertion point */ Olili *ptr_after; /* item after insertion point */ Olili *ptr_new_olili; /* new item */ ptr_before = ptr_first; /* start search at the beginning */ ptr_after = ptr_before->ptr_next; while (ptr_after != NULL) { if (ptr_after->fd <= value) { /* sort in descending order */ break; } ptr_after = ptr_after->ptr_next; ptr_before = ptr_before->ptr_next; } ptr_new_olili = malloc(sizeof(Olili)); if (ptr_new_olili == NULL) { return 1; } ptr_new_olili->fd = value; ptr_before->ptr_next = ptr_new_olili; ptr_new_olili->ptr_next = ptr_after; return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ delete_olili(): deletes an item from an ordered linked list. int delete_olili returns 0 if ok, 1 if error Olili *ptr_first pointer to sentinel int value the value to be inserted into the list ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int delete_olili(Olili *ptr_first, int value) { Olili *ptr_before; /* item before deletion point */ Olili *ptr_curr; /* item at deletion point */ ptr_before = ptr_first; /* start search at the beginning */ ptr_curr = ptr_before->ptr_next; while (ptr_curr != NULL) { if (ptr_curr->fd == value) { /* got it */ break; } ptr_curr = ptr_curr->ptr_next; ptr_before = ptr_before->ptr_next; } if (ptr_curr == NULL) { return 1; } ptr_before->ptr_next = ptr_curr->ptr_next; free(ptr_curr); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ max_olili(): returns the item with the highest value from an ordered linked list. int max_olili returns the maximum value, or -1 if an error occurred Olili *ptr_first pointer to sentinel ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int max_olili(Olili *ptr_first) { if (ptr_first != NULL && ptr_first->ptr_next != NULL) { return ptr_first->ptr_next->fd; } else if (ptr_first != NULL) { return ptr_first->fd; } else { return -1; } } /********************************************************************* linked list for allocated memory This is an unsorted linked list. The first list member is a sentinel which is not automatically deallocated by the lilimem functions. The calling fn has to explicitly declare, initialize, and destruct a lilimem struct for this purpose. ********************************************************************/ /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ insert_lilimem(): inserts a new member into the list int insert_lilimem returns 0 if ok, or 1 if an error occurred if an error occurs, the memory pointed to by ptr_mem will be freed Lilimem *ptr_first pointer to sentinel void** ptr_mem ptr to ptr to allocated memory char* varname ptr to string with the name of the variable used for that memory location. This name is used to find the correct list member if you want to delete a specific entry with the delete_lilimem() function. This can in fact be any unique string other than the variable name. You may pass NULL here if you don't use delete_lilimem(), but only delete_all_lilimem() ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int insert_lilimem(Lilimem *ptr_first, void** ptr_mem, char* varname) { Lilimem* ptr_new_item; if (varname && strlen(varname) > 32) { /* string too long to fit into struct */ return 1; } ptr_new_item = malloc(sizeof(Lilimem)); if (ptr_new_item == NULL) { /* malloc failed */ free(*ptr_mem); return 1; } if (varname) { strcpy(ptr_new_item->varname, varname); } else { (ptr_new_item->varname)[0] = '\0'; } ptr_new_item->ptr_mem = ptr_mem; ptr_new_item->ptr_next = ptr_first->ptr_next; ptr_first->ptr_next = ptr_new_item; return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ delete_lilimem(): deletes a member from the list by the varname int delete_lilimem returns 0 if ok, or 1 if an error occurred Lilimem *ptr_first pointer to sentinel char* varname ptr to string with the name of the variable used for that memory location ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int delete_lilimem(Lilimem *ptr_first, char* varname) { Lilimem* ptr_curr_item; Lilimem* ptr_prev_item; int gotit = 0; ptr_prev_item = ptr_first; ptr_curr_item = ptr_first->ptr_next; while (ptr_curr_item) { if (ptr_curr_item->varname && strcmp(ptr_curr_item->varname, varname) == 0) { gotit = 1; break; } /* else: silently ignore if item has no varname */ ptr_prev_item = ptr_curr_item; ptr_curr_item = ptr_curr_item->ptr_next; } if (gotit) { free(*(ptr_curr_item->ptr_mem)); /* free the memory referenced by the list member */ /* fprintf(stderr, "freeing %s\n", ptr_curr_item->varname); */ *(ptr_curr_item->ptr_mem) = NULL; /* set the memory ptr to NULL to avoid problems with erroneous subsequent free() calls */ ptr_prev_item->ptr_next = ptr_curr_item->ptr_next; free(ptr_curr_item); /* free the memory allocated for the list member */ return 0; } else { return 1; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ delete_all_lilimem(): deletes all members from the list int delete_all_lilimem returns 0 if ok, or 1 if an error occurred Lilimem *ptr_first pointer to sentinel ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int delete_all_lilimem(Lilimem *ptr_first) { Lilimem* ptr_curr_item; Lilimem* ptr_next_item; ptr_curr_item = ptr_first->ptr_next; ptr_first->ptr_next = NULL; while (ptr_curr_item) { ptr_next_item = ptr_curr_item->ptr_next; /* fprintf(stderr, "freeing %s\n", ptr_curr_item->varname); */ free(*(ptr_curr_item->ptr_mem)); /* free the memory referenced by the list member */ *(ptr_curr_item->ptr_mem) = NULL; /* set the memory ptr to NULL to avoid problems with erroneous subsequent free() calls */ free(ptr_curr_item); /* free the memory allocated for the list member */ ptr_curr_item = ptr_next_item; } return 0; } /********************************************************************* linked list for decoding cgi data This is an unsorted linked list. The first list member is a sentinel which is not automatically deallocated by the lilimem functions. The calling fn has to explicitly declare, initialize, and destruct a lilimem struct for this purpose. ********************************************************************/ /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ insert_liliform(): inserts a new member into the list int insert_liliform returns 0 if ok, or 1 if an error occurred if an error occurs, the memory pointed to by ptr_mem will be freed Liliform *ptr_first pointer to sentinel char* name ptr to string with the name of the variable used for that memory location. char* value ptr to allocated memory ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int insert_liliform(Liliform *ptr_first, char* name, char* value) { Liliform* ptr_new_item; char* my_value; if (name == NULL) { return 0; /* do nothing, no error */ } if (strlen(name) > 32) { /* string too long to fit into struct */ return 1; } ptr_new_item = malloc(sizeof(Liliform)); if (!ptr_new_item) { /* malloc failed */ return 1; } strcpy(ptr_new_item->name, name); if (value && strlen(value)) { my_value = malloc(strlen(value)+1); if (!my_value) { free(ptr_new_item); return 1; } strcpy(my_value, value); ptr_new_item->value = my_value; } else { ptr_new_item->value = NULL; } ptr_new_item->ptr_next = ptr_first->ptr_next; ptr_first->ptr_next = ptr_new_item; return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ append_liliform(): appends a new member into the list. The implementation is not very efficient but is ok for a low number of entries int append_liliform returns 0 if ok, or 1 if an error occurred if an error occurs Liliform *ptr_first pointer to sentinel char* name ptr to string with the name of the variable used for that memory location. char* value ptr to allocated memory ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int append_liliform(Liliform *ptr_first, char* name, char* value) { char* my_value; Liliform* ptr_new_item; Liliform* ptr_last_item; ptr_new_item = malloc(sizeof(Liliform)); if (!ptr_new_item) { /* malloc failed */ return 1; } strcpy(ptr_new_item->name, name); if (value && *value) { my_value = malloc(strlen(value)+1); if (!my_value) { free(ptr_new_item); return 1; } strcpy(my_value, value); ptr_new_item->value = my_value; } else { ptr_new_item->value = NULL; } ptr_new_item->ptr_next = NULL; ptr_last_item = ptr_first; /* this is going to be inefficient for a large number of entries */ while (ptr_last_item->ptr_next) { ptr_last_item = ptr_last_item->ptr_next; } ptr_last_item->ptr_next = ptr_new_item; return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_liliform(): retrieves a member of the list by name Liliform* get_liliform returns a ptr to the first member whose name matches as specified and whose value is not NULL, otherwise it returns NULL Liliform *ptr_first pointer to sentinel char* name ptr to string with the name of the variable ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ Liliform* get_liliform(Liliform* ptr_first, char* name) { Liliform* ptr_curr_item; Liliform* ptr_result = NULL; ptr_curr_item = ptr_first->ptr_next; while (ptr_curr_item) { if (!strcmp(ptr_curr_item->name, name)) { if (ptr_curr_item->value) { ptr_result = ptr_curr_item; } break; } ptr_curr_item = ptr_curr_item->ptr_next; } return ptr_result; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_nliliform(): retrieves a member of the list by partial name match Liliform* get_nliliform returns a ptr to the first member whose name matches as specified and whose value is not NULL, otherwise it returns NULL Liliform *ptr_first pointer to sentinel char* name ptr to string with the name of the variable size_t n the number of characters to compare, starting at name[0] ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ Liliform* get_nliliform(Liliform* ptr_first, char* name, size_t n) { Liliform* ptr_curr_item; Liliform* ptr_result = NULL; ptr_curr_item = ptr_first->ptr_next; while (ptr_curr_item) { if (!strncmp(ptr_curr_item->name, name, n)) { if (ptr_curr_item->value) { ptr_result = ptr_curr_item; } break; } ptr_curr_item = ptr_curr_item->ptr_next; } return ptr_result; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_next_liliform(): retrieves next member of the list Liliform* get_next_liliform returns a ptr to the next member or NULL if we're at the end of the list. Use this fn to loop over all list entries. In the first iteration, pass a ptr to the sentinel. In subsequent iterations, pass the ptr that the previous iteration returns. Liliform *ptr_first pointer to sentinel ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ Liliform* get_next_liliform(Liliform* ptr_first) { return ptr_first->ptr_next; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ delete_all_liliform(): deletes all members from the list int delete_all_liliform returns 0 if ok, or 1 if an error occurred Liliform *ptr_first pointer to sentinel ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int delete_all_liliform(Liliform *ptr_first) { Liliform* ptr_curr_item; Liliform* ptr_next_item; ptr_curr_item = ptr_first->ptr_next; ptr_first->ptr_next = NULL; while (ptr_curr_item) { ptr_next_item = ptr_curr_item->ptr_next; /* fprintf(stderr, "freeing %s\n", ptr_curr_item->varname); */ free(ptr_curr_item->value); /* free the memory allocated for the value */ free(ptr_curr_item); /* free the memory allocated for the list member */ ptr_curr_item = ptr_next_item; } return 0; } /********************************************************************* linked list for reading non-standard field mapping for BibTeX data This is an unsorted linked list. The first list member is a sentinel which is not automatically deallocated by the lilimem functions. The calling fn has to explicitly declare, initialize, and destruct a lilimem struct for this purpose. ********************************************************************/ /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ insert_lilibib(): inserts a new member into the list int insert_lilibib returns 0 if ok, or 1 if an error occurred if an error occurs, the memory pointed to by ptr_mem will be freed Lilibib *ptr_first pointer to sentinel char* name ptr to string with the name of the variable used for that memory location. May be NULL if retrieval by name is not necessary char* value ptr to allocated memory ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int insert_lilibib(Lilibib *ptr_first, char* name, char* value) { Lilibib* ptr_new_item; char* my_value; char* my_name; ptr_new_item = malloc(sizeof(Lilibib)); if (!ptr_new_item) { /* malloc failed */ return 1; } if (name && *name) { my_name = malloc(strlen(name)+1); if (!my_name) { free(ptr_new_item); return 1; } strcpy(my_name, name); ptr_new_item->name = my_name; } else { ptr_new_item->name = NULL; } if (value && *value) { my_value = malloc(strlen(value)+1); if (!my_value) { free(ptr_new_item); return 1; } strcpy(my_value, value); ptr_new_item->value = my_value; } else { ptr_new_item->value = NULL; } ptr_new_item->ptr_next = ptr_first->ptr_next; ptr_first->ptr_next = ptr_new_item; return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_next_lilibib(): retrieves next member of the list Lilibib* get_next_lilibib returns a ptr to the next member or NULL if we're at the end of the list. Use this fn to loop over all list entries. In the first iteration, pass a ptr to the sentinel. In subsequent iterations, pass the ptr that the previous iteration returns. Lilibib *ptr_first pointer to sentinel ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ Lilibib* get_next_lilibib(Lilibib* ptr_first) { return ptr_first->ptr_next; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_lilibib(): retrieves a member of the list by name Lilibib* get_next_lilibib returns a ptr to the list member with the given name or NULL if none such exists. Lilibib *ptr_first pointer to sentinel char* name name of the list member to return ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ Lilibib* get_lilibib(Lilibib* ptr_first, char* name) { Lilibib* ptr_curr_item; Lilibib* ptr_result = NULL; ptr_curr_item = ptr_first->ptr_next; while (ptr_curr_item) { if (!strcmp(ptr_curr_item->name, name)) { if (ptr_curr_item->value) { ptr_result = ptr_curr_item; } break; } ptr_curr_item = ptr_curr_item->ptr_next; } return ptr_result; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ delete_all_lilibib(): deletes all members from the list int delete_all_lilibib returns 0 if ok, or 1 if an error occurred Lilibib *ptr_first pointer to sentinel ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int delete_all_lilibib(Lilibib *ptr_first) { Lilibib* ptr_curr_item; Lilibib* ptr_next_item; ptr_curr_item = ptr_first->ptr_next; ptr_first->ptr_next = NULL; while (ptr_curr_item) { ptr_next_item = ptr_curr_item->ptr_next; /* fprintf(stderr, "freeing %s\n", ptr_curr_item->varname); */ if (ptr_curr_item->name) { free(ptr_curr_item->name); /* free the memory allocated for the name */ } if (ptr_curr_item->value) { free(ptr_curr_item->value); /* free the memory allocated for the value */ } free(ptr_curr_item); /* free the memory allocated for the list member */ ptr_curr_item = ptr_next_item; } return 0; } /********************************************************************* linked list for reading id lists This is a sorted linked list. The first list member is a sentinel which is not automatically deallocated by the lilimem functions. The calling fn has to explicitly declare, initialize, and destruct a lilid struct for this purpose. The payload of a member is an id value and two ints used as booleans ********************************************************************/ /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ insert_lilid(): inserts a new member into the list int insert_lilid returns 0 if ok, or 1 if an error occurred Lilid *ptr_first pointer to sentinel unsigned long long value the value to store ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int insert_lilid(Lilid *ptr_first, unsigned long long value) { Lilid* ptr_new_item; /* ptr to new list member */ Lilid* ptr_before; /* ptr to member before insertion point */ Lilid* ptr_after; /* ptr to member after insertion point */ ptr_new_item = malloc(sizeof(Lilid)); if (!ptr_new_item) { /* malloc failed */ return 1; } /* set requested value */ ptr_new_item->value = value; /* set default values */ ptr_new_item->is_duplicate = 0; ptr_new_item->is_existent = 0; /* find insertion point */ ptr_before = ptr_first; /* start search at the beginning */ ptr_after = ptr_before->ptr_next; while (ptr_after != NULL) { if (ptr_after->value >= value) { /* sort in ascending order */ break; } ptr_after = ptr_after->ptr_next; ptr_before = ptr_before->ptr_next; } /* insert new item into list */ ptr_before->ptr_next = ptr_new_item; ptr_new_item->ptr_next = ptr_after; return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_next_lilid(): retrieves next member of the list in ascending order Lilid* get_next_lilid returns a ptr to the next member or NULL if we're at the end of the list. Use this fn to loop over all list entries. In the first iteration, pass a ptr to the sentinel. In subsequent iterations, pass the ptr that the previous iteration returns. struct lilid *ptr_first pointer to sentinel ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ Lilid* get_next_lilid(Lilid* ptr_first) { return ptr_first->ptr_next; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ count_lilid(): counts all members in the list unsigned long long count_lilid returns the number of list members Lilid *ptr_first pointer to sentinel ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ unsigned long long count_lilid(Lilid* ptr_first) { unsigned long long ull_counter = 0; Lilid *ptr_curr; /* start at the beginning */ ptr_curr = ptr_first; /* loop over all list elements */ while ((ptr_curr = get_next_lilid(ptr_curr)) != NULL) { ull_counter++; } return ull_counter; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ delete_all_lilid(): deletes all members from the list int delete_all_lilid returns 0 if ok, or 1 if an error occurred Lilid *ptr_first pointer to sentinel ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int delete_all_lilid(Lilid *ptr_first) { Lilid* ptr_curr_item; Lilid* ptr_next_item; /* skip the sentinel when freeing memory */ ptr_curr_item = ptr_first->ptr_next; ptr_first->ptr_next = NULL; /* loop over all list members after the sentinel */ while (ptr_curr_item) { /* save a pointer to the next member, if any */ ptr_next_item = ptr_curr_item->ptr_next; /* free the memory allocated for the list member */ free(ptr_curr_item); ptr_curr_item = ptr_next_item; } return 0; } /********************************************************************* linked list for tokenizing strings. The list stores pointers to the individual tokens. The calling function should terminate the tokens by inserting \0 between the tokens. This is an unsorted linked list. The first list member is a sentinel which is not automatically deallocated by the lilimem functions. The calling fn has to explicitly declare, initialize, and destruct a lilimem struct for this purpose. ********************************************************************/ /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ insert_lilistring(): inserts a new member into the list int insert_lilistring returns 0 if ok, or 1 if an error occurred if an error occurs Lilistring *ptr_first pointer to sentinel char* token ptr to token ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int insert_lilistring(Lilistring *ptr_first, char* token) { Lilistring* ptr_new_item; ptr_new_item = malloc(sizeof(Lilistring)); if (!ptr_new_item) { /* malloc failed */ return 1; } if (token) { ptr_new_item->token = token; } else { ptr_new_item->token = NULL; } ptr_new_item->ptr_next = ptr_first->ptr_next; ptr_first->ptr_next = ptr_new_item; return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ append_lilistring(): appends a new member into the list. The implementation is not very efficient but is ok for a low number of entries int append_lilistring returns 0 if ok, or 1 if an error occurred if an error occurs Lilistring *ptr_first pointer to sentinel char* token ptr to token ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int append_lilistring(Lilistring *ptr_first, char* token) { Lilistring* ptr_new_item; Lilistring* ptr_last_item; ptr_new_item = malloc(sizeof(Lilistring)); if (!ptr_new_item) { /* malloc failed */ return 1; } if (token) { ptr_new_item->token = token; } else { ptr_new_item->token = NULL; } ptr_new_item->ptr_next = NULL; ptr_last_item = ptr_first; /* this is going to be inefficient for a large number of entries */ while (ptr_last_item->ptr_next) { ptr_last_item = ptr_last_item->ptr_next; } ptr_last_item->ptr_next = ptr_new_item; return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_next_lilistring(): retrieves next member of the list Lilistring* get_next_lilistring returns a ptr to the next member or NULL if we're at the end of the list. Use this fn to loop over all list entries. In the first iteration, pass a ptr to the sentinel. In subsequent iterations, pass the ptr that the previous iteration returns. Lilistring *ptr_first pointer to sentinel ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ Lilistring* get_next_lilistring(Lilistring* ptr_first) { return ptr_first->ptr_next; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ delete_all_lilistring(): deletes all members from the list int delete_all_lilistring returns 0 if ok, or 1 if an error occurred Lilistring *ptr_first pointer to sentinel ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int delete_all_lilistring(Lilistring *ptr_first) { Lilistring* ptr_curr_item; Lilistring* ptr_next_item; ptr_curr_item = ptr_first->ptr_next; ptr_first->ptr_next = NULL; while (ptr_curr_item) { ptr_next_item = ptr_curr_item->ptr_next; /* fprintf(stderr, "freeing %s\n", ptr_curr_item->varname); */ free(ptr_curr_item); /* free the memory allocated for the list member */ ptr_curr_item = ptr_next_item; } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ count_lilistring(): counts all members in the list int count_lilistring returns the number of list members Lilistring *ptr_first pointer to sentinel ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int count_lilistring(Lilistring* ptr_first) { int counter = 0; Lilistring *ptr_curr; /* start at the beginning */ ptr_curr = ptr_first; /* loop over all list elements */ while ((ptr_curr = get_next_lilistring(ptr_curr)) != NULL) { counter++; } return counter; } /********************************************************************* linked list for fixed-size strings. The list keeps the original order of items ********************************************************************/ /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ append_lilifstring(): appends a new member into the list. The implementation is not very efficient but is ok for a low number of entries int append_lilifstring returns 0 if ok, or 1 if an error occurred if an error occurs Lilifstring *ptr_first pointer to sentinel char* token ptr to token ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int append_lilifstring(Lilifstring *ptr_first, char* token) { Lilifstring* ptr_new_item; Lilifstring* ptr_last_item; ptr_new_item = malloc(sizeof(Lilifstring)); if (!ptr_new_item) { /* malloc failed */ return 1; } if (token) { strncpy(ptr_new_item->token, token, LILIFSTRING_SIZE); (ptr_new_item->token)[LILIFSTRING_SIZE-1] = '\0'; } else { (ptr_new_item->token)[0] = '\0'; } ptr_new_item->ptr_next = NULL; ptr_last_item = ptr_first; /* this is going to be inefficient for a large number of entries */ while (ptr_last_item->ptr_next) { ptr_last_item = ptr_last_item->ptr_next; } ptr_last_item->ptr_next = ptr_new_item; return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_next_lilifstring(): retrieves next member of the list Lilifstring* get_next_lilifstring returns a ptr to the next member or NULL if we're at the end of the list. Use this fn to loop over all list entries. In the first iteration, pass a ptr to the sentinel. In subsequent iterations, pass the ptr that the previous iteration returns. Lilifstring *ptr_first pointer to sentinel ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ Lilifstring* get_next_lilifstring(Lilifstring* ptr_first) { return ptr_first->ptr_next; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ delete_all_lilifstring(): deletes all members from the list int delete_all_lilifstring returns 0 if ok, or 1 if an error occurred Lilifstring *ptr_first pointer to sentinel ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int delete_all_lilifstring(Lilifstring *ptr_first) { Lilifstring* ptr_curr_item; Lilifstring* ptr_next_item; ptr_curr_item = ptr_first->ptr_next; ptr_first->ptr_next = NULL; while (ptr_curr_item) { ptr_next_item = ptr_curr_item->ptr_next; /* fprintf(stderr, "freeing %s\n", ptr_curr_item->varname); */ free(ptr_curr_item); /* free the memory allocated for the list member */ ptr_curr_item = ptr_next_item; } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ find_lilifstring(): checks whether token is already stored in the list int find_lilifstring returns 1 if token is part of the list. or 0 if not Lilifstring *ptr_first pointer to sentinel char* token ptr to token ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* find_lilifstring(Lilifstring* ptr_first, char* token) { Lilifstring* ptr_curr_item; ptr_curr_item = ptr_first; while ((ptr_curr_item = get_next_lilifstring(ptr_curr_item)) != NULL) { if (!strcmp(ptr_curr_item->token, token)) { return token; } } return NULL; } refdb-1.0.2/src/cgi.c000644 001750 001750 00000021140 12255427651 015146 0ustar00markusmarkus000000 000000 /*+++++++++++++++++ cgi.c - cgi support functions markus@mhoenicka.de 7-3-01 $Id: cgi.c,v 1.6.2.1 2005/11/08 21:39:50 mhoenicka Exp $ 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, see ++++++++++++++++++++++++*/ #include #include #include #include #include #include #include #include "refdb.h" #include "linklist.h" #include "cgi.h" extern int n_cgi; /* this is the easiest way to add portability to Cygwin */ /* O_BINARY is defined in fcntl.h on Win32/Cygwin */ #ifndef O_BINARY #define O_BINARY 0 #endif /* forward declarations of local functions */ static void unescape_url(char* url); static char x2c(char* what); /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ is_cgi(): determines whether the process runs as a CGI app and sets a few variables if so int is_cgi returns 1 if the process runs as a CGI app with the appropriate environment variables and values, 0 if not char* request_method ptr to string that receives the value of the environment variable REQUEST_METHOD char* content_length ptr to string that receives the value of the environment variable CONTENT_LENGTH char* delayed_cgi_errmsg ptr to string that receives an error message ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int is_cgi(char** request_method, char** content_length, char* delayed_cgi_errmsg) { if ((*request_method = getenv("REQUEST_METHOD")) != NULL) { if (strcmp(*request_method, "POST") != 0) { printf("Content-type: text/plain\n\nIncorrect request method\n"); strcpy(delayed_cgi_errmsg, "Incorrect request method"); return 0; } else if ((*content_length = getenv("CONTENT_LENGTH")) == NULL) { printf("Content-type: text/plain\n\nUnknown request size\n"); strcpy(delayed_cgi_errmsg, "Unknown request size"); return 0; } return 1; /* both variables seem to make sense */ } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ write_err(): writes a simple error message void write_err has no return value char* message ptr to string with message to print ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ void write_err(char* message) { if (!n_cgi) { fprintf(stderr, "%s", message); } else { /* send cgi type string */ printf("Content-type: text/plain\n\n"); printf("%s", message); } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ cgi_header(): writes a cgi header void cgi_header has no return value int type 0 = text/plain, 1 = text/html ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ void cgi_header(int type) { if (n_cgi) { if (!type) { printf("Content-type: text/plain\n\n"); } else { printf("Content-type: text/html\n\n"); } } /* do nothing if not cgi output */ } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ decode_cgi(): decodes a cgi string sent by the POST method int decode_cgi returns 0 if ok, 1 if mem error, 2 if decoding error char* cgi_data string containing the encoded cgi data struct liliform* ptr_first ptr to the sentinel of the linked list that receives the name/value pairs ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int decode_cgi(char* cgi_data, struct liliform* ptr_first) { char* temp_data; int name_offset; int the_end = 0; char* temp_name; char* temp_value; temp_data = cgi_data; while (*temp_data) { /* new name/value pair starts here. Look for the name part */ name_offset = 0; temp_name = temp_data; while (*temp_data && *temp_data != '=' && name_offset < 32) { if (*temp_data == '+') { *temp_data = ' '; } temp_data++; name_offset++; } if (*temp_data != '=') { /* could not find name */ return 2; } /* terminate, so temp_name is a valid C string */ *temp_data = '\0'; temp_data++; /* skip \0 */ temp_value = temp_data; /* value starts here */ /* look for the value part */ while (*temp_data && *temp_data != '&') { if (*temp_data == '+') { *temp_data = ' '; } temp_data++; } if (*temp_data == '&') { *temp_data = '\0'; } else { /* end of string */ the_end++; } /* decode %XX values */ unescape_url(temp_name); unescape_url(temp_value); if (insert_liliform(ptr_first, temp_name, temp_value)) { return 1; } if (the_end) { /* end of data */ return 0; } temp_data++; } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ load_html(): loads a string from a html template char* load_html returns a ptr to the loaded string, NULL if failed char* basename ptr to string with the basename (no extension, no path) of the file containing the html fragment char* sharedir ptr to string with the location of the shareable RefDB files. If this string is empty or NULL, the fn uses the environment variable REFDBLIB ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* load_html(char* basename, char* sharedir) { int infile_fd; int n_done = 0; size_t read_result; size_t bytes_read; size_t html_frag_size; char* html_frag; char* new_html_frag; char full_name[_POSIX_PATH_MAX]; char* refdblib = NULL; /* value of the REFDBLIB environment variable */ char default_refdblib[_POSIX_PATH_MAX] = SYSCONFDIR; /* default if REFDBLIB is not set */ /* assemble the full name of the file */ if (sharedir && *sharedir) { refdblib = sharedir; } else { refdblib = getenv("REFDBLIB"); } if (!refdblib) { /* use a default location if the environment variable is not set, e.g. in a daemon process */ refdblib = default_refdblib; } strcpy(full_name, refdblib); if (full_name[strlen(full_name)-1] != '/') { strcat(full_name, "/"); } strcat(full_name, "templates/"); strcat(full_name, basename); strcat(full_name, HTML_FRAG_EXT); /* fprintf(stderr, "%s<<\n", full_name); */ /* open the input file */ infile_fd = open(full_name, O_RDONLY|O_BINARY); if (infile_fd == -1) { /* open failed */ return NULL; } /* allocate a chunk of memory to load the html fragment */ html_frag = (char*)malloc(HTML_FRAG_SIZE); if (html_frag == NULL) { close(infile_fd); return NULL; } bytes_read = 0; html_frag_size = HTML_FRAG_SIZE; while (!n_done) { read_result = read(infile_fd, (void*)(html_frag+bytes_read), HTML_FRAG_SIZE); if (read_result < HTML_FRAG_SIZE) { n_done++; } else { html_frag_size += HTML_FRAG_SIZE; new_html_frag = (char*)realloc(html_frag, html_frag_size); if (new_html_frag == NULL) { close(infile_fd); free(html_frag); return NULL; } html_frag = new_html_frag; } if (read_result != -1) { bytes_read += read_result; } } close(infile_fd); if (read_result == -1) { free(html_frag); return NULL; } html_frag[bytes_read] = '\0'; /* terminate to get a C style string */ return html_frag; } /* The following routines were taken (almost) literally from Matthew&Stones, Beginning Linux Programming, WROX 1996 */ /* this routine borrowed from the examples that come with the NCSA server */ static void unescape_url(char* url) { register signed int x,y; for (x = 0, y = 0; url[y]; ++x,++y) { if ((url[x] = url[y]) == '%') { if ((url[x] = x2c(&url[y+1])) == 0x0D) { /* eliminate \r sent by */ x--; /* Windoze browsers */ } y += 2; } } url[x] = '\0'; } /* this routine borrowed from the examples that come with the NCSA server */ static char x2c(char* what) { register char digit; digit = (what[0] >= 'A' ? ((what[0] & 0xdf) - 'A') + 10 : (what[0] - '0')); digit *= 16; digit += (what[1] >= 'A' ? ((what[1] & 0xdf) - 'A') + 10 : (what[1] - '0')); return digit; } refdb-1.0.2/src/atoll.c000644 001750 001750 00000012263 12255427650 015524 0ustar00markusmarkus000000 000000 /* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ /* strtol,strtoul,strtoll,strtoull convert string to long, unsigned long, long long or unsigned long long. strtoxx(char *src,char **ptr,int base) converts the string pointed to by src to an long of appropriate long and returnes it. It skips leading spaces and tabs (but not newlines, formfeeds, backspaces), then it accepts an optional sign and a sequence of digits in the specified radix. If the value of ptr is not (char **)NULL, a pointer to the character terminating the scan is returned in the location pointed to by ptr. Trailing spaces will NOT be skipped. If an error is detected, the result will be LONG_MIN, 0 or LONG_MAX, (or LONGLONG..) and errno will be set to EDOM if there are no digits ERANGE if the result would overflow. the ptr will be set to src. This file is based on the strtol from the the GNU C Library. it can be compiled with the UNSIGNED and/or LONGLONG flag set */ #ifdef HAVE_CONFIG_H #include #endif /* #include */ #include #include /* for LONG_LONG_MIN etc */ #include /* for isspace() etc, toupper() */ #include /* uint */ #include #ifdef HAVE_STRING_H #include #endif #ifdef HAVE_STRINGS_H #include #endif #define UTYPE_MAX (~(unsigned long long) 0) #define TYPE_MIN LLONG_MIN #define TYPE_MAX LLONG_MAX #define longtype long long #define ulongtype unsigned long long #ifndef HAVE_STRTOLL /* this conditional encloses the rest of the file (except atoll) */ #ifdef UNSIGNED # define function ulongtype strtoull #else # define function longtype strtoll #endif /* Convert NPTR to an `unsigned long int' or `long int' in base BASE. If BASE is 0 the base is determined by the presence of a leading zero, indicating octal or a leading "0x" or "0X", indicating hexadecimal. If BASE is < 2 or > 36, it is reset to 10. If ENDPTR is not NULL, a pointer to the character after the last one converted is stored in *ENDPTR. */ function (const char *nptr,char **endptr,int base) { int negative; register ulongtype cutoff; register unsigned int cutlim; register ulongtype i; register const char *s; register unsigned char c; const char *save; int overflow; if (base < 0 || base == 1 || base > 36) base = 10; s = nptr; /* Skip white space. */ while (isspace (*s)) ++s; if (*s == '\0') { goto noconv; } /* Check for a sign. */ if (*s == '-') { negative = 1; ++s; } else if (*s == '+') { negative = 0; ++s; } else negative = 0; if (base == 16 && s[0] == '0' && toupper (s[1]) == 'X') s += 2; /* If BASE is zero, figure it out ourselves. */ if (base == 0) { if (*s == '0') { if (toupper (s[1]) == 'X') { s += 2; base = 16; } else base = 8; } else base = 10; } /* Save the pointer so we can check later if anything happened. */ save = s; cutoff = UTYPE_MAX / (unsigned long int) base; cutlim = (uint) (UTYPE_MAX % (unsigned long int) base); overflow = 0; i = 0; for (c = *s; c != '\0'; c = *++s) { if (isdigit (c)) c -= '0'; else if (isalpha (c)) c = toupper (c) - 'A' + 10; else break; if (c >= base) break; /* Check for overflow. */ if (i > cutoff || (i == cutoff && c > cutlim)) overflow = 1; else { i *= (ulongtype) base; i += c; } } /* Check if anything actually happened. */ if (s == save) goto noconv; /* Store in ENDPTR the address of one character past the last character we converted. */ if (endptr != NULL) *endptr = (char *) s; #ifndef UNSIGNED /* Check for a value that is within the range of `unsigned long int', but outside the range of `long int'. */ if (negative) { if (i > (ulongtype) TYPE_MIN) overflow = 1; } else if (i > (ulongtype) TYPE_MAX) overflow = 1; #endif if (overflow) { errno=ERANGE; #ifdef UNSIGNED return UTYPE_MAX; #else return negative ? TYPE_MIN : TYPE_MAX; #endif } /* Return the result of the appropriate sign. */ return (negative ? -((longtype) i) : i); noconv: /* There was no number to convert. */ errno=EDOM; if (endptr != NULL) *endptr = (char *) nptr; return 0L; } #endif /* !HAVE_STRTOLL */ #ifndef HAVE_ATOLL longtype atoll(const char *str) { return strtoll(str, (char **)NULL, 10); } #endif /* !HAVE_ATOLL */ refdb-1.0.2/src/svn_version.c000644 001750 001750 00000000133 12303477603 016752 0ustar00markusmarkus000000 000000 const char* svn_version(void) { const char* SVN_Version = "780:781"; return SVN_Version; } refdb-1.0.2/src/bib2ris.h000644 001750 001750 00000007226 12255427652 015757 0ustar00markusmarkus000000 000000 /* bib2ris.h: header file for bib2ris.c */ /* markus@mhoenicka.de 2001-8-24 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ /* $Id: bib2ris.h,v 1.7 2002/12/13 20:34:30 mhoenicka Exp $ */ #define MAX_FIXFIELD_LEN 256 #define ERRMSG_LEN 512 /* structure for gathering the publication year information. fixed length strings are ok as len(PY) < 256 */ struct RISPY { char year[MAX_FIXFIELD_LEN]; char month[MAX_FIXFIELD_LEN]; char day[MAX_FIXFIELD_LEN]; char edition[MAX_FIXFIELD_LEN]; char howpublished[MAX_FIXFIELD_LEN]; }; /* structure for collecting all titles of the reference. need ptrs to allocated strings as there is no length limit */ struct TITLES { char* title; char* booktitle; char* seriestitle; }; /* structure for collecting all notes of the reference. need ptrs to allocated strings as there is no length limit */ struct NOTES { char* annote; char* note; }; /* structure for collecting all publisher infos of the reference. fixed length strings are ok as len(PB) < 256 */ struct PUBINFO { char institution[MAX_FIXFIELD_LEN]; char organization[MAX_FIXFIELD_LEN]; char publisher[MAX_FIXFIELD_LEN]; char school[MAX_FIXFIELD_LEN]; }; /* definitions for checking completeness of entries */ #define BV_AUTHOR 0 #define BV_BOOKTITLE 1 #define BV_CHAPTER 2 #define BV_EDITOR 3 #define BV_INSTITUTION 4 #define BV_JOURNAL 5 #define BV_NOTE 6 #define BV_PAGES 7 #define BV_PUBLISHER 8 #define BV_SCHOOL 9 #define BV_TITLE 10 #define BV_YEAR 11 /* array of strings matching the above definitions for generating error messages */ const char bv_names[12][13] = {"author ", "booktitle ", "chapter ", "editor ", "institution ", "journal ", "note ", "pages ", "publisher ", "school ", "title ", "year "}; /* definitions for handling entry types */ #define BT_ARTICLE 0 #define BT_BOOK 1 #define BT_BOOKLET 2 #define BT_CONFERENCE 3 #define BT_INBOOK 4 #define BT_INCOLLECTION 5 #define BT_INPROCEEDINGS 6 #define BT_MANUAL 7 #define BT_MASTERSTHESIS 8 #define BT_MISC 9 #define BT_PHDTHESIS 10 #define BT_PROCEEDINGS 11 #define BT_TECHREPORT 12 #define BT_UNPUBLISHED 13 int process_bib(char* infile, int file); int validate_bib(char* bib_type, char* bibvalid, AST* ptr_entry); int fix_bibtypes(char mp_bibtypes[14][PREFS_BUF_LEN], int size); char* print_type(char* bib_type, char** ris_type, AST* ptr_entry); int print_journal(char* journal); int print_py(struct RISPY* rispy); int print_authors(char* authorstring, char* tagname, char* infile); int print_titles(char* typestring, struct TITLES* titles); int print_pubinfo(char* typestring, struct PUBINFO* pubinfo); int print_notes(struct NOTES* notes); int print_keywords(char* kwlist); int print_poolstring(char* address, char* tag); int print_pageinfo(char* pagestring); char* get_year(char* bufstring, char* yearstring); char* get_month(char* bufstring, char* monthstring); char* get_day(char* bufstring, char* daystring); char* find_num(char* bufstring, char* numstring, size_t len); void pipehandler(int sig); void log_print(int priority, char* string); refdb-1.0.2/src/getopt.h000644 001750 001750 00000011127 12255427652 015720 0ustar00markusmarkus000000 000000 /* Declarations for getopt. Copyright (C) 1989,90,91,92,93,94,96,97, 98 Free Software Foundation, Inc. This file is part of the GNU C Library. Its master source is NOT part of the C library, however. The master source lives in /gd/gnu/lib. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. The GNU C Library 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with the GNU C Library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _GETOPT_H #define _GETOPT_H 1 #ifdef __cplusplus extern "C" { #endif /* For communication from `getopt' to the caller. When `getopt' finds an option that takes an argument, the argument value is returned here. Also, when `ordering' is RETURN_IN_ORDER, each non-option ARGV-element is returned here. */ extern char *optarg; /* Index in ARGV of the next element to be scanned. This is used for communication to and from the caller and for communication between successive calls to `getopt'. On entry to `getopt', zero means this is the first call; initialize. When `getopt' returns -1, this is the index of the first of the non-option elements that the caller should itself scan. Otherwise, `optind' communicates from one call to the next how much of ARGV has been scanned so far. */ extern int optind; /* Callers store zero here to inhibit the error message `getopt' prints for unrecognized options. */ extern int opterr; /* Set to an option character which was unrecognized. */ extern int optopt; /* Describe the long-named options requested by the application. The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector of `struct option' terminated by an element containing a name which is zero. The field `has_arg' is: no_argument (or 0) if the option does not take an argument, required_argument (or 1) if the option requires an argument, optional_argument (or 2) if the option takes an optional argument. If the field `flag' is not NULL, it points to a variable that is set to the value given in the field `val' when the option is found, but left unchanged if the option is not found. To have a long-named option do something other than set an `int' to a compiled-in constant, such as set a value from `optarg', set the option's `flag' field to zero and its `val' field to a nonzero value (the equivalent single-letter option character, if there is one). For long options that have a zero `flag' field, `getopt' returns the contents of the `val' field. */ struct option { #if defined (__STDC__) && __STDC__ const char *name; #else char *name; #endif /* has_arg can't be an enum because some compilers complain about type mismatches in all the code that assumes it is an int. */ int has_arg; int *flag; int val; }; /* Names for the values of the `has_arg' field of `struct option'. */ #define no_argument 0 #define required_argument 1 #define optional_argument 2 #if defined (__STDC__) && __STDC__ #ifdef __GNU_LIBRARY__ /* Many other libraries have conflicting prototypes for getopt, with differences in the consts, in stdlib.h. To avoid compilation errors, only prototype getopt for the GNU C library. */ extern int getopt (int argc, char *const *argv, const char *shortopts); #else /* not __GNU_LIBRARY__ */ extern int getopt (); #endif /* __GNU_LIBRARY__ */ extern int getopt_long (int argc, char *const *argv, const char *shortopts, const struct option *longopts, int *longind); extern int getopt_long_only (int argc, char *const *argv, const char *shortopts, const struct option *longopts, int *longind); /* Internal only. Users should not call this directly. */ extern int _getopt_internal (int argc, char *const *argv, const char *shortopts, const struct option *longopts, int *longind, int long_only); #else /* not __STDC__ */ extern int getopt (); extern int getopt_long (); extern int getopt_long_only (); extern int _getopt_internal (); #endif /* __STDC__ */ #ifdef __cplusplus } #endif #endif /* _GETOPT_H */ refdb-1.0.2/src/strfncs.h000755 001750 001750 00000007660 12255427653 016113 0ustar00markusmarkus000000 000000 /* strfncs.h header for strfncs.c */ /* 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ /* this is from readline/chardefs.h. */ #ifndef whitespace #define whitespace(c) (((c) == ' ') || ((c) == '\t')) #endif /* this is different from whitespace in readline/chardefs.h */ #define full_whitespace(c) (((c) == ' ') || ((c) == '\t') || ((c) == '\n') || ((c) == '\r')) /* this defines a log print facility. This prevents that a costly function call to log_print() is made just to find out that the log level does not call for any actions. Don't use this macro in another expression, just put "LOG_PRINT(level, your_string)" on its own line. Arguments: char* s string to print int l minimum log level to get the string printed*/ #define LOG_PRINT(l,s) if (n_log_level >= l) {log_print(l,s);} /* the mstr* functions use this value to reallocate memory for an autogrowing string. They will simply reallocate the existing size plus realloc_chunk if the requested size is not larger than that. This prevents that during string assembly where lots of small bits and pieces like commas, quotation marks, and brackets are appended, each one or two-byte increase in size needs an expensive call to realloc(). The higher the value for realloc_chunk, the less realloc() calls are necessary, but we may waste memory */ #define realloc_chunk 512 /* structure used in letter->entity replacements */ struct charent { char letter[5]; /* a string containing the (possibly multibyte) */ /* letter */ size_t len; /* length in bytes of letter */ char entity[16]; /* null-terminated string containing the replacement */ /* entity string */ }; struct VERSIONINFO { int major; int minor; int minuscule; }; int check_ip (char* server_ip); int is_port(char *port); int is_number(char *string); int is_real_number(const char *string); char *stripwhite(char *string, int mode, int type); char* strup(char* string); char* strdn(char* string); char* stricap(char* string); int compare_ptr(const void* ptr_one, const void* ptr_two); char* mstrcat(char* destination, char* source, size_t* ptr_dest_len, size_t offset); char* mstrcpy(char* destination, char* source, size_t* ptr_dest_len); char* mstrncpy(char* destination, char* source, size_t n, size_t* ptr_dest_len); char* mstrdup(char *buffer); void free_all(void*** ptr_mem); void insert_string(char *buffer, char *insert); void remove_substring(char *buffer, size_t sublen); char *canonicalize_path(char *the_path); char *strip_quote(char *the_string); char *truncate_quoted_string(char *the_string, size_t len); size_t escape_chars(char *dest, const char *orig, size_t orig_size, const char *toescape); size_t unescape_chars(char *dest, const char *orig, size_t orig_size); size_t escape_latex_chars(char *dest, const char *orig, size_t orig_size); char* escape_latex_chars_copy(const char *orig, size_t orig_size); int increment_suffix(char* suffix, int max_depth, int upper); int parse_versioninfo(const char* version, struct VERSIONINFO* ver); size_t count_the_flowers(const char *buffer, const char *letter, size_t len); void replace_char_string(char *buffer, char *insert, size_t len); size_t min_token_length(const char* string, const char* sep); int replace_regexp_chars(char* string, char* regexp_chars, char replacement); refdb-1.0.2/src/pref.h000755 001750 001750 00000002234 12255427652 015354 0ustar00markusmarkus000000 000000 /* pref.h header file for preferences manipulation routines */ /* $Id: pref.h,v 1.7 2002/12/13 20:34:51 mhoenicka Exp $ */ /* 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ /* types */ typedef struct Prefs { const char *varname; char* varvalue; } Prefs; /* the line length we read from configuration files for BibTeX mapping */ #define NSF_LINE_LEN 4096 /* functions */ int read_prefs(void* ptr_prefs, char* init_file, int type); int num_loglevel(char* log_level); int num_logdest(char* log_dest); refdb-1.0.2/src/linklist.h000755 001750 001750 00000012244 12255427652 016253 0ustar00markusmarkus000000 000000 /*+++++++++++++++++ linklist.h - header file for linklist.c markus@mhoenicka.de 7-11-00 $Id: linklist.h,v 1.7.2.1 2004/09/26 21:07:05 mhoenicka Exp $ 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ #define LILIFSTRING_SIZE 256 /********************************************************************* linked list for file descriptors ********************************************************************/ typedef struct olili { int fd; /* file descriptor */ struct olili *ptr_next; /* pointer to next element in the list */ } Olili; int insert_olili(Olili *ptr_first, int value); int delete_olili(Olili *ptr_first, int value); int max_olili(Olili *ptr_first); /********************************************************************* linked list for allocated memory ********************************************************************/ typedef struct lilimem { void **ptr_mem; /* pointer to the pointer to the allocated memory */ struct lilimem *ptr_next; /* pointer to the next element in the list */ char varname[32]; /* name of the pointer to the allocated memory */ } Lilimem; int insert_lilimem(Lilimem *ptr_first, void** ptr_mem, char* varname); int delete_lilimem(Lilimem *ptr_first, char* varname); int delete_all_lilimem(Lilimem *ptr_first); /********************************************************************* linked list for decoding html form data ********************************************************************/ typedef struct liliform { char name[32]; /* name of the item */ char* value; /* ptr to allocated memory with the value of the item */ struct liliform *ptr_next; /* pointer to the next element in the list */ } Liliform; int insert_liliform(Liliform *ptr_first, char* name, char* value); int append_liliform(Liliform *ptr_first, char* name, char* value); Liliform* get_liliform(Liliform* ptr_first, char* name); Liliform* get_nliliform(Liliform* ptr_first, char* name, size_t n); Liliform* get_next_liliform(Liliform* ptr_first); int delete_all_liliform(Liliform *ptr_first); /********************************************************************* linked list for reading non-standard field mapping for BibTeX data ********************************************************************/ typedef struct lilibib { char* name; /* name of the item */ char* value; /* ptr to allocated memory with the value of the item */ struct lilibib *ptr_next; /* pointer to the next element in the list */ } Lilibib; int insert_lilibib(Lilibib *ptr_first, char* name, char* value); Lilibib* get_next_lilibib(Lilibib* ptr_first); Lilibib* get_lilibib(Lilibib* ptr_first, char* name); int delete_all_lilibib(Lilibib *ptr_first); /********************************************************************* linked list for ID values ********************************************************************/ typedef struct lilid { unsigned long long value; /* value of the item */ char is_duplicate; /* set to 1 if id is a duplicate */ char is_existent; /* set to 1 if id exists */ struct lilid *ptr_next; /* pointer to the next element in the list */ } Lilid; int insert_lilid(Lilid *ptr_first, unsigned long long value); Lilid* get_next_lilid(Lilid* ptr_first); unsigned long long count_lilid(Lilid* ptr_first); int delete_all_lilid(Lilid *ptr_first); /********************************************************************* linked list for tokenizing strings ********************************************************************/ typedef struct lilistring { char* token; /* ptr to allocated memory with the value of the item */ struct lilistring *ptr_next; /* pointer to the next element in the list */ } Lilistring; int insert_lilistring(Lilistring *ptr_first, char* token); int append_lilistring(Lilistring *ptr_first, char* token); Lilistring* get_next_lilistring(Lilistring* ptr_first); int delete_all_lilistring(Lilistring *ptr_first); int count_lilistring(Lilistring* ptr_first); /********************************************************************* linked list for fixed-size strings ********************************************************************/ typedef struct lilifstring { char token[LILIFSTRING_SIZE]; /* ptr to allocated memory with the value of the item */ struct lilifstring *ptr_next; /* pointer to the next element in the list */ } Lilifstring; int append_lilifstring(Lilifstring *ptr_first, char* token); Lilifstring* get_next_lilifstring(Lilifstring* ptr_first); int delete_all_lilifstring(Lilifstring *ptr_first); char* find_lilifstring(Lilifstring* ptr_first, char* token); refdb-1.0.2/src/cgi.h000644 001750 001750 00000002267 12255427652 015165 0ustar00markusmarkus000000 000000 /*+++++++++++++++++ cgi.h - header file for cgi support functions markus@mhoenicka.de 7-3-01 $Id: cgi.h,v 1.4 2002/12/13 20:34:31 mhoenicka Exp $ 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, see ++++++++++++++++++++++++*/ #define CGI_PLAIN 0 #define CGI_HTML 1 #define CGI_NAME_LENGTH 32 #define HTML_FRAG_EXT ".html" #define HTML_FRAG_SIZE 4096 int is_cgi(char** request_method, char** content_length, char* delayed_cgi_errmsg); void write_err(char* message); void cgi_header(int type); int decode_cgi(char* cgi_data, struct liliform* ptr_first); char* load_html(char* basename, char* sharedir); refdb-1.0.2/src/eenc.c000644 001750 001750 00000006203 12255427651 015321 0ustar00markusmarkus000000 000000 /* eenc.c Enigma-like encryption/decryption command-line tool */ /* markus@mhoenicka.de 2003-03-08 */ /* 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ #include #include #include #include "getopt.h" #include "enigma.h" #include "refdb.h" /* declaration of the svn version function */ const char* svn_version(void); int main (int argc, char** argv) { int n_opt; char wheelpos[PREFS_BUF_LEN] = ""; char passwd[PASSWD_LENGTH+1]; char scrambled_passwd[PASSWD_LENGTH+1]; char numberized_passwd[3*PASSWD_LENGTH+1]; /* read command line settings */ while ((n_opt = getopt(argc, argv, "hp:v")) != -1) { switch (n_opt) { case 'h': fprintf(stderr, "eenc encodes a string of up to 16 chars using an Enigma-like algorithm\nUsage: eenc -p wheelpos string\nwheelpos is a string ABC-DE-FG-HI where ABC denotes the wheel sequence and DE, FG, and HI denote the position of the wheels in the first, second, and third position, respectively\nRun eenc -v to display version info\n"); exit(0); break; case 'p': strncpy(wheelpos, optarg, PREFS_BUF_LEN); wheelpos[PREFS_BUF_LEN-1] = '\0'; break; case 'v': printf("eenc %s built from svn revision %s markus@mhoenicka.de\nYou may redistribute and modify this software under the terms of the GNU General Public License.\n", VERSION, svn_version()); exit (0); break; case ':': fprintf(stderr, "Usage: eenc -p wheelpos string\nwheelpos is a string ABC-DE-FG-HI where ABC denotes the wheel sequence and DE, FG, and HI denote the position of the wheels in the first, second, and third position, respectively\n"); exit(0); break; case '?': fprintf(stderr, "unknown option %c: use eenc -h to display usage\n", optopt); break; } } if (!*wheelpos) { fprintf(stderr, "no scramble string specified\n"); exit(1); } /* if password was passed on the command line */ if (argv[optind] && *(argv[optind])) { strncpy(passwd, argv[optind], PASSWD_LENGTH); passwd[PASSWD_LENGTH] = '\0'; } else { if (!fgets(passwd, PASSWD_LENGTH+1, stdin)) { exit(0); } /* remove trailing newline */ if (passwd[strlen(passwd)-1] == '\n') { passwd[strlen(passwd)-1] = '\0'; } } if (enigma_encrypt(passwd, scrambled_passwd, wheelpos)) { fprintf(stderr, "password encryption failed\n"); exit(1); } numberize_passwd(numberized_passwd, scrambled_passwd); printf("%s", numberized_passwd); exit(0); } refdb-1.0.2/src/enigma.c000644 001750 001750 00000027732 12255427651 015661 0ustar00markusmarkus000000 000000 /* enigma.c implements an Enigma-like encryption/decryption for passwords */ /* markus@mhoenicka.de 6-22-01 */ /* 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ #include #include #include #include #include "enigma.h" /* This encryption/decryption algorithm is one of the most secure that human ingenuity could ever conceive: everyone trying to crack the algorithm will invariably drop to the floor laughing 'till he or she passes away. */ /* In other words: while this encryption discourages casual packet sniffers, it is not as secure as e.g. public key encryptions. */ /* The code is a modification of the Enigma mechanism which is based on sequential permutation enhanced by a change of the encoding scheme after each character (see: http://www.cs.miami.edu/~harald/enigma/enigma.html for an introduction. As we try to encrypt passwords <= 16 chars, the original mechanism (advancing wheel 1 until a full cycle is completed, then advancing wheel 2 one position etc) does not make much sense: the password length is far less than the number of characters on the wheels. We'll simply rotate each wheel after each character. We also skip the steckerboard and use only 3 wheels */ /* rotor wirings. We have to work around a little problem: The original Enigma used 26 characters on each wheel. We don't want to arbitrarily limit the available characters, so we allow all printable characters. Unfortunately there are 95 printable characters, but we need an even number for the whole thing to work. We cannot include ASCII chars 127 or 31 as these are control characters with strange effects. We have to exclude the space as this is the easiest to skip and should not be used in passwords anyway */ char rotor[3][95] = { /* Input "!\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~" */ /* 0: */ "0uV`$/zG73La*N[;UFZ^ltm{]\"s=bQ+?OAgwT5cWv#~})oMS\'_\\@K(dDp|y8B%YxJ2:9&r4!kf-j.h16ICi,RneXH", /* 1: */ "EPlb(SO\'Dp|y8BxtJ2:j.hf-ICi,Rne0G\"169&%Y_\\k73uV$/zN@FZ^m{]swXUT5cWv#=Hqr4![;<>g~})Q+La*d?AK`oM", /* 2: */ "r4![;S5)@FZQDM|y8cW0G\"uvRY_\\#=pa*d?AK+LEPlb(\'H16tJ2:j.ne9&%hf-ICimoBx,k7O3Vg~}N^" }; /* the reflector array must be symmetrical, e.g. if ! maps to /, / must also map to ! */ char reflector[95] = { "/-Q=~E1.642H\"(!?\'+X*>)Scv@<;$50:RunZ&r{,YMspJ^zq#A7g\\fh3IDeU}Nywdo8a[VTW|mxtjCbLPFKlB9`k_OGi]%"}; /* forward declarations of local functions */ static void move_wheels(struct wheel_pos* pos); static char reflect(char inchar); static char wheel(char inchar, int pos, int the_wheel); static char rwheel(char inchar, int pos, int the_wheel); static int set_wheels(struct wheel_pos* pos, char* wheelpos); /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ enigma_encrypt(): encrypts a password int enigma_encrypt returns 0 if ok, 1 if error char* passwd ptr to a string containing the original password char* scrambled_passwd ptr to a string that receives the encrypted password. This buffer must be at least as long as passwd char* wheelpos ptr to a string that encodes the wheel sequence and wheel positions ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int enigma_encrypt(char* passwd, char* scrambled_passwd, char* wheelpos) { int i; int passwd_len; struct wheel_pos pos; if (set_wheels(&pos, wheelpos)) { /* fprintf(stderr, "could not set wheel positions\n"); */ return 1; } passwd_len = strlen(passwd); for (i = 0; i < passwd_len; i++) { /* using functions isn't as bad as it seems for passwd_len <= 16 */ scrambled_passwd[i] = wheel(passwd[i], pos.pos[0], pos.rotor[0]); scrambled_passwd[i] = wheel(scrambled_passwd[i], pos.pos[1], pos.rotor[1]); scrambled_passwd[i] = wheel(scrambled_passwd[i], pos.pos[2], pos.rotor[2]); scrambled_passwd[i] = reflect(scrambled_passwd[i]); scrambled_passwd[i] = rwheel(scrambled_passwd[i], pos.pos[2], pos.rotor[2]); scrambled_passwd[i] = rwheel(scrambled_passwd[i], pos.pos[1], pos.rotor[1]); scrambled_passwd[i] = rwheel(scrambled_passwd[i], pos.pos[0], pos.rotor[0]); /* printf("\n"); */ move_wheels(&pos); } scrambled_passwd[i] = '\0'; /* terminate string */ return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ wheel(): performs character permutation on a wheel in the forward direction static char wheel returns the permuted character char inchar the original character int pos position of the wheel int the_wheel number of the wheel to use ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static char wheel(char inchar, int pos, int the_wheel) { char outchar; outchar = rotor[the_wheel][((((int)inchar)-33)+pos)%94]; /* printf("%c:%d:%d:%c\n", inchar, (int)inchar, ((((int)inchar)-33)+pos)%94, outchar); */ return outchar; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ rwheel(): performs character permutation on a wheel in the reverse direction static char rwheel returns the permuted character char inchar the original character int pos position of the wheel int the_wheel number of the wheel to use ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static char rwheel(char inchar, int pos, int the_wheel) { signed char outchar; int i; /* find position of char on wheel */ for (i = 0; i < 94; i++) { if (rotor[the_wheel][i] == inchar) { break; } } /* the next block of code will fail if char is unsigned (ppc), thus we explicitly use signed char */ outchar = (signed char)(i+33-pos); while (outchar < 33) { outchar += 94; } return (char)outchar; /* return signed or unsigned, whatever the default is */ } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ reflect(): performs character permutation on the reflector static char reflect returns the permuted character char inchar the original character ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static char reflect(char inchar) { char outchar; outchar = reflector[((int)inchar)-33]; /* printf("%c:%d:%c\n", inchar, ((int)inchar)-33, outchar); */ return outchar; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ set_wheels(): set the wheel sequence and position static int set_wheels returns 0 if ok, 1 if error struct wheel_pos* pos ptr to a struct that holds the wheel sequence and position information char* wheelpos ptr to a string that holds the sequence and position information. The format is: ABC-DE-FG-HI with: ABC: wheel sequence: 012, 021, 120, 102, 210, 201 DE: position of wheel in position 0; 0rotor[0] = (int)(wheelpos[0]) - 48; pos->rotor[1] = (int)(wheelpos[1]) - 48; pos->rotor[2] = (int)(wheelpos[2]) - 48; /* position values must be between 0 and 2 and we don't use a wheel twice */ if (pos->rotor[0] == pos->rotor[1] || pos->rotor[1] == pos->rotor[2] || pos->rotor[0] == pos->rotor[2] || pos->rotor[0] < 0 || pos->rotor[0] > 2 || pos->rotor[1] < 0 || pos->rotor[1] > 2 || pos->rotor[2] < 0 || pos->rotor[2] > 2) { /* fprintf(stderr, "duplicate or out of range entries:pos0:%d:pos1:%d:pos2:%d\n", pos->rotor[0], pos->rotor[1], pos->rotor[2]); */ return 1; } for (i = 0; i < 3; i++) { the_pos[0] = wheelpos[(i*3)+4]; the_pos[1] = wheelpos[(i*3)+5]; n_pos = atoi(the_pos); if (n_pos < 0 || n_pos > 94) { /* fprintf(stderr, "n_pos out of range:%d<<\n", n_pos); */ return 1; /* out of range */ } pos->pos[i] = n_pos; } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ move_wheels(): advances the wheel positions void move_wheels does not return anything struct wheel_pos* pos ptr to a struct that holds the wheel sequence and position information ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ void move_wheels(struct wheel_pos* pos) { (pos->pos)[0] = ((pos->pos)[0]+1)%94; (pos->pos)[1] = ((pos->pos)[1]+1)%94; (pos->pos)[2] = ((pos->pos)[2]+1)%94; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ randomize_wheels(): generates a pseudo-random wheel sequence and position string void randomize_wheels does not return anything char* wheelpos ptr to a buffer of at least 13 chars which receives the position string ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ void randomize_wheels(char* wheelpos) { int i, j; /* seed the random functions with the time */ srand((unsigned int)time((time_t*)NULL)); /* create the wheel sequence */ j = (int)(6.0*rand()/RAND_MAX); if (!j) { strcpy(wheelpos, "012"); } else if (j == 1) { strcpy(wheelpos, "021"); } else if (j == 2) { strcpy(wheelpos, "120"); } else if (j == 3) { strcpy(wheelpos, "102"); } else if (j == 4) { strcpy(wheelpos, "201"); } else if (j == 5) { strcpy(wheelpos, "210"); } /* generate pseudo-random positions for the wheels */ for (i = 0; i < 3; i++) { j = (int)(93.0*rand()/RAND_MAX); sprintf(&wheelpos[3+(3*i)], "-%02d", j); } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ numberize_passwd(): transforms a password string into a numeric string representation void numberize_passwd does not return anything char* numberpasswd ptr to a buffer that will receive the numeric string representation. Must be at least three times the size of passwd char* passwd ptr to the original password string ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ void numberize_passwd(char* numberpasswd, char* passwd) { size_t i; for (i = 0; i < strlen(passwd); i++) { sprintf(numberpasswd+(3*i), "%03d", (int)passwd[i]); } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ denumberize_passwd(): transforms a numeric string representation of a password back into the password string void denumberize_passwd does not return anything char* passwd ptr to the buffer that receives the password string the size must be at least one-third of numberpasswd char* numberpasswd ptr to a buffer that contains the numeric string representation. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ void denumberize_passwd(char* passwd, char* numberpasswd) { size_t i; char buffer[4] = {'\0','\0','\0','\0'}; for (i = 0; i < strlen(numberpasswd)/3; i++) { strncpy(buffer, &numberpasswd[i*3], 3); passwd[i] = (char)atoi(buffer); } passwd[i] = '\0'; } refdb-1.0.2/src/enigma.h000644 001750 001750 00000002356 12255427652 015662 0ustar00markusmarkus000000 000000 /* enigma.h include file for enigma.c */ /* markus@mhoenicka.de 6-22-01 */ /* $Id: enigma.h,v 1.4 2002/12/13 20:34:39 mhoenicka Exp $ */ /* 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ struct wheel_pos { int rotor[3]; /* maps available rotors (0,1,2) to positions (0,1,2) */ int pos[3]; /* starting positions for rotors in positions (0,1,2) */ }; int enigma_encrypt(char* passwd, char* scrambled_passwd, char* wheelpos); void randomize_wheels(char* wheelpos); void numberize_passwd(char* numberpasswd, char* passwd); void denumberize_passwd(char* passwd, char* numberpasswd); refdb-1.0.2/src/refdb.h000755 001750 001750 00000003656 12255427652 015513 0ustar00markusmarkus000000 000000 /* refdb.h main include file for the refdb project */ /* markus@mhoenicka.de 2-10-00 */ /* $Id: refdb.h,v 1.14.2.2 2005/11/03 20:40:19 mhoenicka Exp $ */ /* 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ #define MAX_FMT_LEN 256 /* maximum length of a getref format string, including the terminating \0 */ #define DBNAME_LENGTH 32 /* maximum database name length (imposed by MySQL) */ #define PRIV_LENGTH 16 /* maximum length of a privilege name in MySQL security tables */ #define PASSWD_LENGTH 16 /* this appears to be the maximum length of a MySQL password */ #define DBUSER_LENGTH 16 /* the maximum database user name length */ #define XMLPARSE_CHUNKSIZE 4096 /* the chunk size when reading an XML file */ /* this accommodates a variable name of max. 16 chars, a tab, a POSIX full path, and a \0 (273 = _POSIX_PATH_MAX + 18)*/ #define PREFS_BUF_LEN 273 #ifndef __CYGWIN__ # if !defined _POSIX_PATH_MAX # define _POSIX_PATH_MAX 256 # endif #endif /* define a few things that should be accessible through libdbi */ #define USERNAME_LENGTH 16 #define HOSTNAME_LENGTH 64 /* these defines are for the getfoo() function */ #define GETAU 0 #define GETKW 1 #define GETJO 2 #define GETJF 3 #define GETJ1 4 #define GETJ2 5 #define GETED 6 #define GETAS 7 #define GETAX 8 refdb-1.0.2/src/refdba.c000755 001750 001750 00000217017 12255427652 015645 0ustar00markusmarkus000000 000000 /*+++++++++++++++++ refdba - the refdb administration console application markus@mhoenicka.de 2-10-00 $Id: refdba.c,v 1.45.2.9 2005/11/05 23:50:35 mhoenicka Exp $ 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, see ++++++++++++++++++++++++*/ /* ToDo: implement a fixdb command to ensure the integrity of the database ?? */ /* general includes */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "getopt.h" /* our own stuff */ #include "refdb.h" /* common stuff for all refdb applications*/ #include "connect.h" #include "linklist.h" /* linked list support */ #include "pref.h" /* for init file, depends on linklist.h */ #include "strfncs.h" /* for is functions */ #include "refdba.h" /* stuff specific to this file */ #include "readln.h" /* readline-related stuff */ #include "page.h" /* pager functions */ #include "refdb-client.h" /* stuff common to all clients */ #include "client-commands.h" /* common interactive commands */ #include "connect.h" /* modified read/write socket functions */ #include "tokenize.h" /* tokenizes command-lines */ #include "readris.h" /* read RIS datasets */ #include "passwd.h" /* securely obtain passwords */ #include "enigma.h" /* this is the easiest way to add portability to Cygwin */ /* O_BINARY is defined in fcntl.h on Win32/Cygwin */ #ifndef O_BINARY #define O_BINARY 0 #endif /*+ the commands array contains the user commands, the functions called, and short explanatory messages +*/ COMMAND commands[] = { { "help", com_help, "Display this text" }, { "?", com_help, "Synonym for `help'" }, { "quit", com_quit, "Quit using refdba" }, { "addstyle", com_addstyle, "Add or update a bibliography style" }, { "adduser", com_adduser, "Add users" }, { "addword", com_addword, "Add reserved journal words" }, { "confserv", com_confserv, "Configure the application server" }, { "createdb", com_createdb, "Create a new database" }, { "deletedb", com_deletedb, "Delete a database" }, { "deletestyle", com_deletestyle, "Delete a bibliography style" }, { "deleteuser", com_deleteuser, "Remove users" }, { "deleteword", com_deleteword, "Remove reserved journal words" }, { "getstyle", com_getstyle, "Retrieve a bibliography style" }, { "scankw", com_scankw, "Run keyword scan" }, { "listdb", com_listdb, "List databases" }, { "liststyle", com_liststyle, "List bibliography styles" }, { "listuser", com_listuser, "Get a list of users" }, { "listword", com_listword, "Get a list of reserved journal words" }, { "set", com_setvalue, "Set new value of config variable" }, { "verbose", com_verbose, "Toggle verbose mode" }, { "viewstat", com_viewstat, "View statistics" }, { (char *)NULL, (Function *)NULL, (char *)NULL } }; /* Globals */ /*+ When non-zero, this global means the user is done using this program. +*/ int n_done; /*+ this array will hold the user preferences +*/ Prefs prefs[13] = { {"serverip", ""}, {"port", ""}, {"verbose", ""}, {"pager", ""}, {"username", ""}, {"passwd", ""}, {"timeout", ""}, {"logfile", ""}, {"logdest", ""}, {"loglevel", ""}, {"refdblib", ""}, {"no_encrypt", ""}, {"", ""} }; /* these are the configurable variables with the compile-time defaults */ char server_ip[PREFS_BUF_LEN] = "127.0.0.1"; /*+ default IP address of refdbd +*/ char port_address[PREFS_BUF_LEN] = "9734"; /*+ default port address of refdbd +*/ char the_pager[PREFS_BUF_LEN] = "stdout"; /*+ default "pager" (stdout) +*/ char username[PREFS_BUF_LEN] = ""; /*+ default username (emtpy) +*/ char passwd[PREFS_BUF_LEN] = "*"; /*+ default password (ask user) +*/ char refdb_timeout[PREFS_BUF_LEN] = "180"; /*+ 180 seconds default timeout +*/ char verbose[PREFS_BUF_LEN] = "f"; /*+ 1 = verbose output, 0 = terse output +*/ char log_file[PREFS_BUF_LEN] = "/var/log/refdba.log"; /*+ default log file +*/ char log_dest[PREFS_BUF_LEN] = "2"; /*+ default log destination (0 = stderr, 1 = syslog, 2 = log_file +*/ char log_level[PREFS_BUF_LEN] = "6"; /*+ default level up to which messages are logged (0 through 7). -1 means no logging +*/ char refdblib[PREFS_BUF_LEN] = ""; /* path to shareable files */ char confdir[_POSIX_PATH_MAX+1] = ""; /* path to the config files */ char no_encrypt[PREFS_BUF_LEN] = ""; /* do not encrypt passwords if 't' */ int main_argc = 0; /* save argc for commands in batch mode */ char **main_argv = NULL; /* save argv for commands in batch mode */ #ifdef READLINE41 char* rl_readline_name; /* name used for readline history */ #else const char* rl_readline_name; /* name used for readline history */ #endif /* READLINE41 */ char readline_name[] = "refdba"; CPPFunction* rl_attempted_completion_function; /* ptr to completer */ int n_refdb_timeout; int n_verbose = 0; /*+ do we want logorrhoeic output? +*/ int n_broken_pipe; /*+ 1 indicates that we attempted to write to a broken pipe +*/ int n_abort_connect; /*+ 1 indicates that we want to abort a connection +*/ int n_log_dest = 1; /* destination of log output */ int n_oldlog_dest = 1; /* previous destination of log output */ int n_log_level = 0; /* level of log information that will be printed */ int n_cgi = 0; /* if 1, we run as a cgi app (currently dummy) */ int n_batchmode = 0; /* 1 if we're running in batch mode */ int n_read_stdin = 0; /* if 1, data try to squeeze in at stdin */ FILE* fp_log_file = NULL; /* ptr to log file struct */ extern const char cs_term[]; /* prototypes of local functions */ static int adduser(int n_remove, char* arg); static int addword (int n_remove, char* arg); /* declaration of the svn version function */ const char* svn_version(void); /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ The one and only main function int main returns 0 if successful (this is always the case in interactive mode), 1 if error int argc number of arguments char** argv ptr to array of strings with the command line arguments ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int main (int argc, char** argv) { char the_opt[5]; char the_cmd[32] = ""; char *line, *s; char *the_command; char *new_the_command; size_t the_command_len = 512; int retval = 0; int n_opt, i, j; int n_readinit = 1; /* if 1, read config file. If 0, skip config file */ struct sigaction act, oldact, intact, oldintact; if ((the_command = malloc(the_command_len)) == NULL) { fprintf(stderr, "out of memory\n"); exit (1); } the_command[0] = '\0'; /* Allow conditional parsing of the ~/.inputrc file. */ rl_readline_name = readline_name; /* initialize signal handler */ n_broken_pipe = 0; n_abort_connect = 0; act.sa_handler = pipehandler; sigemptyset(&act.sa_mask); act.sa_flags = 0; intact.sa_handler = inthandler; sigemptyset(&intact.sa_mask); intact.sa_flags = 0; if (sigaction(SIGPIPE, &act, &oldact) != 0 || sigaction(SIGINT, &intact, &oldintact) != 0) { fprintf(stderr, "initializing signal handlers failed\n"); exit(1); } /* initialize the array of preference values */ prefs[0].varvalue = server_ip; prefs[1].varvalue = port_address; prefs[2].varvalue = verbose; prefs[3].varvalue = the_pager; prefs[4].varvalue = username; prefs[5].varvalue = passwd; prefs[6].varvalue = refdb_timeout; prefs[7].varvalue = log_file; prefs[8].varvalue = log_dest; prefs[9].varvalue = log_level; prefs[10].varvalue = refdblib; prefs[11].varvalue = no_encrypt; /* a slimy hack to detect options before we run getopt */ j = 2; for (i = 0; i < argc; i++) { if (argv[i][0] == '-' && argv[i][1] == 'q') { n_readinit = 0; j--; if (!j) { break; } } if (argv[i][0] == '-' && argv[i][1] == 'y') { strncpy(confdir, argv[i+1], _POSIX_PATH_MAX); confdir[_POSIX_PATH_MAX] = '\0'; j--; if (!j) { break; } } } if (n_readinit) { /* read config file settings */ read_prefs(prefs, "refdbarc", 0); } /* read command line settings. These may override the config file settings */ while ((n_opt = getopt(argc, argv, "c:d:C:e:E:f:hH:i:l:L:o:O:p:qrRT:u:vVw:W:xy:")) != -1) { switch (n_opt) { case 'c': strncpy(the_pager, optarg, PREFS_BUF_LEN); the_pager[PREFS_BUF_LEN-1] = '\0'; break; case 'C': strncpy(the_cmd, optarg, 31); the_cmd[31] = '\0'; if (!find_command(optarg, commands)) { fprintf (stderr, "%s: No such command for refdb.\n", optarg); exit (1); } n_batchmode = 1; break; case 'e': strncpy(log_dest, optarg, PREFS_BUF_LEN); log_dest[PREFS_BUF_LEN-1] = '\0'; break; case 'h': if (!n_batchmode) { fprintf(stderr, "Usage: refdba [-c pager] [-C command] [-e logdest] [-h] [-i IP_address] [-l loglevel] [-L logfile] [-p port] [-q] [-T time] [-u name] [-v] [-V] [-w password] [-x] [-y confdir]\nOptions: -c command to run a pager\n -C run command in batch mode\n -e log destination (0=stderr;1=syslog;2=custom file)\n -h prints this help\n -i set server IP address to address\n -l log level (0<=level<=7)\n -L full path to custom log file\n -p set server port to port\n -q ignore init-file\n -T set timeout to time seconds\n -u set username\n -v show version information\n -V switch to verbose mode\n -w password (use '*' to be asked interactively)\n -x do not encrypt passwords\n -y look for configuration files in confdir\n"); exit (0); } else { if ((new_the_command = mstrcat(the_command, " -h ", &the_command_len, 0)) == NULL) { fprintf(stderr, "out of memory\n"); exit (1); } else { the_command = new_the_command; } } break; case 'i': strncpy(server_ip, optarg, PREFS_BUF_LEN); server_ip[PREFS_BUF_LEN-1] = '\0'; break; case 'l': strncpy(log_level, optarg, PREFS_BUF_LEN); log_level[PREFS_BUF_LEN-1] = '\0'; break; case 'L': strncpy(log_file, optarg, PREFS_BUF_LEN); log_file[PREFS_BUF_LEN-1] = '\0'; break; case 'p': strncpy(port_address, optarg, PREFS_BUF_LEN); port_address[PREFS_BUF_LEN-1] = '\0'; break; case 'q': n_readinit = 0; break; case 'T': strncpy(refdb_timeout, optarg, PREFS_BUF_LEN); refdb_timeout[PREFS_BUF_LEN-1] = '\0'; break; case 'u': strncpy(username, optarg, USERNAME_LENGTH); username[USERNAME_LENGTH] = '\0'; /* terminate if optarg string was too long */ break; case 'v': printf("refdba %s built from svn revision %s markus@mhoenicka.de\nYou may redistribute and modify this software under the terms of the GNU General Public License.\n", VERSION, svn_version()); exit (0); break; case 'V': verbose[0] = 't'; /* poor man's strcpy */ verbose[1] = '\0'; break; case 'w': strncpy(passwd, optarg, PREFS_BUF_LEN); passwd[PREFS_BUF_LEN-1] = '\0'; break; case 'x': strcpy(no_encrypt, "t"); break; case 'y': /* do nothing, this option is used before getopt runs */ break; /* now all the options that the commands handle themselves */ case 'd': /* fall through, we assemble the command string */ case 'E': case 'f': case 'H': case 'o': case 'O': case 'R': case 'W': case 'r': sprintf(the_opt, " -%c ", n_opt); if ((new_the_command = mstrcat(the_command, the_opt, &the_command_len, 0)) == NULL) { fprintf(stderr, "out of memory\n"); exit (1); } else { the_command = new_the_command; } if (optarg && *optarg) { if ((new_the_command = mstrcat(the_command, optarg, &the_command_len, 0)) == NULL) { fprintf(stderr, "out of memory\n"); exit (1); } else { the_command = new_the_command; } } break; case ':': fprintf(stderr, "Usage: refdba [-c pager] [-C command] [-e logdest] [-h] [-i IP_address] [-l loglevel] [-L logfile] [-p port] [-q] [-T time] [-u name] [-v] [-V] [-w password] [-x] [-y confdir]\nOptions: -c command to run a pager\n -C run command in batch mode\n -e log destination (0=stderr;1=syslog;2=custom file)\n -h prints this help\n -i set server IP address to address\n -l log level (0<=level<=7)\n -L full path to custom log file\n -p set server port to port\n -q ignore init-file\n -T set timeout to time seconds\n -u set username\n -v show version information\n -V switch to verbose mode\n -w password (use '*' to be asked interactively)\n -x do not encrypt passwords\n -y look for configuration files in confdir\n"); exit (1); break; case '?': fprintf(stderr, "unknown option %c: use refdba -h to display usage\n", optopt); break; } } /* a smart but simple hack to hide the password in the ps ax output */ for (i = 0; i < argc; i++) { if (argv[i][0] == '-' && argv[i][1] == 'w') { j = 0; while (argv[i+1][j]) { argv[i+1][j] = 'x'; j++; } break; } } /* translate some command line settings into numeric values */ postprocess_var("timeout"); postprocess_var("loglevel"); postprocess_var("logdest"); n_oldlog_dest = n_log_dest; /* keep a backup copy if changed by set */ postprocess_var("verbose"); /* set up logging */ if (n_log_dest == 2) { /* use custom log file */ if ((fp_log_file = fopen(log_file, "ab")) == NULL) { n_log_dest = 1; /* fall back to syslog */ log_dest[0] = '1'; log_dest[1] = '\0'; openlog("refdba", LOG_PID|LOG_ODELAY, LOG_USER); LOG_PRINT(LOG_WARNING, "could not open custom log file"); } } else if (n_log_dest == 1) { /* use syslog */ openlog("refdba", LOG_PID|LOG_ODELAY, LOG_USER); } /* check values */ if (postprocess_var("serverip")) { LOG_PRINT(LOG_CRIT, "incorrect IP address or hostname"); exit (1); } if (postprocess_var("port")) { LOG_PRINT(LOG_CRIT, "incorrect port"); exit (1); } /* see whether we have a username */ if (postprocess_var("username")) { fprintf(stderr, "incorrect username\n"); LOG_PRINT(LOG_CRIT, "incorrect username"); exit (1); } /* see whether we need a password */ postprocess_var("passwd"); /* printf("username: %s; password: %s<<\n", username, passwd); */ if (n_batchmode) { /* we're running in batch mode */ main_argv = argv; main_argc = argc; s = stripwhite (the_cmd, 0, 0); if (*s) { char* batchstring; /* s contains only the command name. For a full command line, add the remainder of the argv string array */ if ((batchstring = build_batchcommand(argc, argv, optind, s, the_command)) == NULL) { LOG_PRINT(LOG_WARNING, "out of memory"); retval = 1; } else { LOG_PRINT(LOG_DEBUG, batchstring); retval = execute_line(batchstring, commands); free(batchstring); } } } else { /* we're running in interactive mode */ if (n_verbose) { fprintf(stderr, "refdba %s markus@mhoenicka.de\nYou may redistribute and modify this software under the terms of the GNU General Public License.\nType '?' for a command overview\n", VERSION); } initialize_readline (); /* Bind our completer. */ /* Loop reading and executing lines until the user quits. */ for ( ; n_done == 0; ) { line = readline ("refdba: "); if (!line) break; /* Remove leading and trailing whitespace from the line. Then, if there is anything left, add it to the history list and execute it. */ s = stripwhite (line, 0, 0); if (*s) { LOG_PRINT(LOG_DEBUG, s); add_history (s); retval = execute_line (s, commands); n_abort_connect = 0; /* reset just in case Ctrl-C was not used to interrupt a stalled connection, but rather randomly */ } free (line); } /* for */ } /* if/else */ exit (retval); } /* **************************************************************** */ /* */ /* refdba Commands */ /* */ /* **************************************************************** */ /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ com_createdb(): create a new database int com_createdb 0 if successful, 1 on error char *arg the name of the new database. This must be a name which is a valid filename on the operating system that the database server runs on. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int com_createdb (char* arg) { char outbuffer[COMMAND_INBUF_LEN] = ""; /* holds the command for the server */ char inbuffer[COMMAND_INBUF_LEN] = ""; struct simplelistvals slvals; char scrambled_passwd[PASSWD_LENGTH*3+1] = ""; slvals.outbuffer = outbuffer; strcpy(slvals.outbuffer, "createdb "); slvals.n_file_open = 0; slvals.n_file_append = 0; slvals.n_pipe = 0; slvals.outfile = NULL; slvals.outpipe = NULL; if (strncmp(arg, "-h", 2) == 0) { printf("Creates new databases\nSyntax: createdb [-E encoding] [-h] {name} [name1...]\nOptions: -E set character encoding\n -h prints this mini-help\nAll other arguments are interpreted as database names\n"); return 0; } if (connect_to_server(&slvals.n_sockfd, server_ip, port_address) != 0) { return 1; } strcpy(scrambled_passwd, passwd); if (init_dialog(slvals.n_sockfd, scrambled_passwd, inbuffer)) { close(slvals.n_sockfd); return 1; } /* arg will contain the encoding (-E ) if specified */ strcat(slvals.outbuffer, arg); strcat(slvals.outbuffer, " -u "); strcat(slvals.outbuffer, username); if (strlen(passwd) > 0) { strcat(slvals.outbuffer, " -w "); strcat(slvals.outbuffer, scrambled_passwd); } getsimplelist(&slvals, 1); close(slvals.n_sockfd); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ com_deletedb(): delete a database int com_deletedb 0 if successful, 1 if error char *arg the name of the database which is to be deleted ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int com_deletedb (char* arg) { char outbuffer[COMMAND_INBUF_LEN] = ""; /* holds the command for the server */ char inbuffer[COMMAND_INBUF_LEN] = ""; struct simplelistvals slvals; char scrambled_passwd[PASSWD_LENGTH*3+1] = ""; slvals.outbuffer = outbuffer; strcpy(slvals.outbuffer, "deletedb "); slvals.n_file_open = 0; slvals.n_file_append = 0; slvals.n_pipe = 0; slvals.outfile = NULL; slvals.outpipe = NULL; if (strncmp(arg, "-h", 2) == 0) { printf("Deletes databases\nSyntax: deletedb [-h] {name} [name1...]\nOptions: -h prints this mini-help\nAll other arguments are interpreted as database names\n"); return 0; } if (connect_to_server(&slvals.n_sockfd, server_ip, port_address) != 0) { return 1; } strcpy(scrambled_passwd, passwd); if (init_dialog(slvals.n_sockfd, scrambled_passwd, inbuffer)) { close(slvals.n_sockfd); return 1; } strcat(slvals.outbuffer, arg); strcat(slvals.outbuffer, " -u "); strcat(slvals.outbuffer, username); if (strlen(passwd) > 0) { strcat(slvals.outbuffer, " -w "); strcat(slvals.outbuffer, scrambled_passwd); } getsimplelist(&slvals, 1); close(slvals.n_sockfd); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ com_confserv(): configure application server int com_confserv 0 if successful, 1 if error char *arg command argument. Currently supported by refdbd are stop, ping, serverip value, timeout value, logfile value, logdest value, loglevel value, cleanvar ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int com_confserv (char* arg) { char outbuffer[COMMAND_INBUF_LEN] = ""; /* holds the command for the server */ char inbuffer[COMMAND_INBUF_LEN] = ""; struct simplelistvals slvals; char scrambled_passwd[PASSWD_LENGTH*3+1] = ""; slvals.outbuffer = outbuffer; strcpy(slvals.outbuffer, "confserv "); slvals.n_file_open = 0; slvals.n_file_append = 0; slvals.n_pipe = 0; slvals.outfile = NULL; slvals.outpipe = NULL; if (strncmp(arg, "-h", 2) == 0) { printf("Reconfigures the application server (current session only)\nSyntax: confserv [-h] {command}\nOptions: -h prints this mini-help\nSupported commands are:\n stop stops the application server\n ping tests whether the application server is alive\n serverip value set the serverip variable to value\n timeout value set the timeout variable to value\n logfile value set the logfile variable to value\n logdest value set the logdest variable to value\n loglevel value set the loglevel variable to value\n"); return 0; } if (connect_to_server(&slvals.n_sockfd, server_ip, port_address) != 0) { return 1; } strcpy(scrambled_passwd, passwd); if (init_dialog(slvals.n_sockfd, scrambled_passwd, inbuffer)) { close(slvals.n_sockfd); return 1; } strcat(slvals.outbuffer, arg); strcat(slvals.outbuffer, " -u "); strcat(slvals.outbuffer, username); if (strlen(passwd) > 0) { strcat(slvals.outbuffer, " -w "); strcat(slvals.outbuffer, scrambled_passwd); } getsimplelist(&slvals, 1); close(slvals.n_sockfd); /* due to the odd implementation of the confserv command on the server side we have to send a second command to really let the server stop (the command is handled by a child and queued to the parent, so any changes take effect only just before the *next* command is accepted. this is ok for all commands except for stop which users expect to be immediate) */ if (strncmp(arg, "stop", 4) == 0 && strncmp(slvals.inbuffer, "708", 3) == 0) { /* the second check is necessary to see whether confserv stop was successfully submitted. We must not send strange commands now if we don't have the access rights to really stop the server */ if (connect_to_server(&slvals.n_sockfd, server_ip, port_address) != 0) { return 1; } strcpy(scrambled_passwd, passwd); if (init_dialog(slvals.n_sockfd, scrambled_passwd, inbuffer)) { /* this will kill */ close(slvals.n_sockfd); return 1; } close(slvals.n_sockfd); } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ com_viewstat(): view statistics int com_viewstat 0 if successful, 1 if error char *arg command argument, currently ignored by refdbd ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int com_viewstat (char* arg) { int retval; char outbuffer[COMMAND_INBUF_LEN] = ""; /* holds the command for the server */ char inbuffer[COMMAND_INBUF_LEN] = ""; struct simplelistvals slvals; char scrambled_passwd[PASSWD_LENGTH*3+1] = ""; slvals.outbuffer = outbuffer; strcpy(slvals.outbuffer, "viewstat "); slvals.n_file_open = 0; slvals.n_file_append = 0; slvals.n_pipe = 0; slvals.outfile = NULL; slvals.outpipe = NULL; if (strncmp(arg, "-h", 2) == 0) { printf("Shows some statistical and version information\nSyntax: viewstat [-h]\nOptions: -h prints this mini-help\n"); return 0; } if (connect_to_server(&slvals.n_sockfd, server_ip, port_address) != 0) { return 1; } strcpy(scrambled_passwd, passwd); if (init_dialog(slvals.n_sockfd, scrambled_passwd, inbuffer)) { close(slvals.n_sockfd); return 1; } /* strcat(outbuffer, arg); */ strcat(slvals.outbuffer, " -u "); strcat(slvals.outbuffer, username); if (strlen(passwd) > 0) { strcat(slvals.outbuffer, " -w "); strcat(slvals.outbuffer, scrambled_passwd); } retval = getsimplelist(&slvals, 1); close(slvals.n_sockfd); return retval; } /* Return non-zero if ARG is a valid argument for CALLER, else print an error message and return zero. */ /* int valid_argument (char *caller, char *arg) { */ /* if (!arg || !*arg) */ /* { */ /* fprintf (stderr, "%s: Argument required.\n", caller); */ /* return 0; */ /* } */ /* return 1; */ /* } */ /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ com_adduser(): add or remove user int com_adduser 0 if successful, 1 if error char *arg specifies the host, the database, and the usernames ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int com_adduser (char* arg) { return adduser(0, arg); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ com_deleteuser(): remove user int com_deleteuser 0 if successful, 1 if error char *arg specifies the host, the database, and the usernames ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int com_deleteuser (char* arg) { return adduser(1, arg); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ adduser(): add or remove user static int adduser 0 if successful, 1 if error int n_remove if 1, delete users, if 0, add users char *arg specifies the host, the database, and the usernames ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int adduser (int n_remove, char* arg) { int n_sockfd; /* file descriptor of the socket */ char *outbuffer; char *new_outbuffer; char inbuffer[COMMAND_INBUF_LEN] = ""; char srv_inbuffer[COMMAND_INBUF_LEN] = ""; /* char infile[_POSIX_PATH_MAX]; */ char* infile; char database_name[DBNAME_LENGTH+1] = ""; char user_host[HOSTNAME_LENGTH+1] = ""; char newuser_passwd[PASSWD_LENGTH*3+1] = ""; char newuser_scrambled_passwd[PASSWD_LENGTH*3+1] = ""; char **inargv; /* tokens of the argument */ char *newarg; /* char *read_result; */ char *send_buffer; char scrambled_passwd[PASSWD_LENGTH*3+1] = ""; size_t outbuf_len = COMMAND_INBUF_LEN; int numbyte; int n_read_done = 0; int inargc = 0; /* number of tokens of the argument */ int inargcmax; /* maximum number of tokens */ int result; int i; int infile_fd; int n_opt; int n_readonly = 0; int n_read_file = 0; int n_cmdlinerror = 0; int n_just_help = 0; int n_curr_trailing_z = 0; int n_last_trailing_z = 0; int n_server_status; size_t byte_written = 0; FILE *pagerfp; struct lilimem sentinel; sentinel.ptr_mem = NULL; sentinel.ptr_next = NULL; sentinel.varname[0] = '\0'; outbuffer = malloc(outbuf_len); if (outbuffer == NULL) { delete_all_lilimem(&sentinel); return 1; } if (insert_lilimem(&sentinel, (void**)&outbuffer, "outbuffer")) { delete_all_lilimem(&sentinel); return 1; } strcpy(outbuffer, "adduser "); /* if (n_batchmode) { */ /* in batchmode, the command line is already tokenized */ /* inargc = main_argc; */ /* inargv = main_argv; */ /* } */ /* else { */ /* parse the argument. first we cut the argument into pieces with strtok, then we use getopt to interpret */ /* get a buffer to hold the tokens. Start with 10 tokens, increase in steps of 10 as needed */ inargc = 0; inargcmax = 10; inargv = malloc((size_t)inargcmax*sizeof(char*)); if (inargv == NULL) { return 1; } if (insert_lilimem(&sentinel, (void**)&inargv, "inargv")) { return 1; } /* the following is a temporary hack to allow cmdln_tokenize to work */ newarg = malloc((size_t)(strlen(arg)+9)); if (newarg == NULL) { delete_all_lilimem(&sentinel); return 1; } if (insert_lilimem(&sentinel, (void**)&newarg, "newarg")) { delete_all_lilimem(&sentinel); return 1; } strcpy(newarg, "adduser "); strcat(newarg, arg); result = cmdln_tokenize(&inargc, &inargv, inargcmax, newarg); if (result == 1 || result == 2) { /* memory error */ delete_all_lilimem(&sentinel); return 1; } /* } */ /* if/else */ /* now we have the tokens nicely arranged in inargc */ /* for (i = 0; i < inargc; i++) { */ /* printf("inargv[%d]: %s\n", i, inargv[i]); */ /* } */ /* get options */ optind = 0; while ((n_opt = getopt(inargc, inargv, "c:C:d:e:f:hH:i:l:L:o:O:p:qRT:u:vVw:W:")) != -1) { switch(n_opt) { case 'd': /* printf("-f %s\n", optarg); */ strncpy(database_name, optarg, DBNAME_LENGTH); database_name[DBNAME_LENGTH] = '\0'; /* terminate in case string got truncated */ break; case 'f': if (!strcmp(optarg, "stdin")) { n_read_stdin = 1; } else { infile = canonicalize_path(optarg); if (insert_lilimem(&sentinel, (void**)&infile, "infile")) { delete_all_lilimem(&sentinel); return 1; } n_read_file = 1; } break; case 'h': if (n_remove) { printf("Revokes access rights to a database for the given users\nSyntax: deleteuser {-d database} [-h] {-H hostname} {user|-f infile}\nOptions: -d database specify the database\n -f infile Read the names of the users from file infile\n -h prints this mini-help\n -H hostname specify the hostname of the server that runs refdbd through which the users will connect\n All other arguments are interpreted as usernames.\n"); } else { printf("Grants access rights to a database for the given users\nSyntax: adduser {-d database} [-h] {-H hostname} [-R] [-W password] {user|-f infile}\nOptions: -d database specify the database\n -f infile Read the names of the users from file infile\n -h prints this mini-help\n -H hostname specify the hostname of the server that runs refdbd through which the users will connect\n -R grant read-only access (default: read/write)\n -W new password for given user\n All other arguments are interpreted as usernames.\n"); } n_just_help++; break; case 'H': /* printf("-H %s\n", optarg); */ strncpy(user_host, optarg, HOSTNAME_LENGTH); user_host[HOSTNAME_LENGTH] = '\0'; /* terminate in case string got truncated */ break; case 'R': n_readonly++; break; case 'W': /* printf("-N %s\n", optarg); */ strncpy(newuser_passwd, optarg, PASSWD_LENGTH); newuser_passwd[PASSWD_LENGTH] = '\0'; /* terminate in case string got truncated */ break; case 'c': /* fall through, has been taken care of in main() */ case 'C': case 'e': case 'i': case 'l': case 'L': case 'o': case 'O': case 'p': case 'q': case 'T': case 'u': case 'v': case 'V': case 'w': break; case ':': fprintf(stderr, "missing option\n"); n_cmdlinerror = 1; break; case '?': fprintf(stderr, "unknown option\n"); n_cmdlinerror = 1; break; } } /* get arguments */ /* for (i = 0; i < inargc; i++) { */ /* printf("argument %s\n", inargv[i]); */ /* } */ if (n_cmdlinerror || n_just_help) { delete_all_lilimem(&sentinel); return (n_just_help) ? 0:1; } else if (!*database_name && !n_remove) { fprintf(stderr, "can't add users without database information\n"); delete_all_lilimem(&sentinel); return 1; } else if (!*database_name) { fprintf(stderr, "can't change user status without database information\n"); delete_all_lilimem(&sentinel); return 1; } /* don't complain about missing host as some database servers do not support changing host-based info this way. refdbd will use localhost if no host is specified */ if (connect_to_server(&n_sockfd, server_ip, port_address) != 0) { delete_all_lilimem(&sentinel); return 1; } strcpy(scrambled_passwd, passwd); if (init_dialog(n_sockfd, scrambled_passwd, srv_inbuffer)) { close(n_sockfd); delete_all_lilimem(&sentinel); return 1; } /* encrypt newuser passwd if we have one */ if (newuser_passwd[0] && *no_encrypt != 't') { if (enigma_encrypt(newuser_passwd, newuser_scrambled_passwd, srv_inbuffer)) { fprintf(stderr, "password encryption error\n"); send_status(n_sockfd, 112, TERM_NO); return 1; } numberize_passwd(newuser_passwd, newuser_scrambled_passwd); } /* assemble command */ strcat(outbuffer, " -u "); strcat(outbuffer, username); if (*passwd) { strcat(outbuffer, " -w "); strcat(outbuffer, scrambled_passwd); } strcat(outbuffer, " -d "); strcat(outbuffer, database_name); if (n_remove) { strcat(outbuffer, " -r "); } if (n_readonly) { strcat(outbuffer, " -B "); } if (*user_host) { strcat(outbuffer, " -H "); strcat(outbuffer, user_host); } if (*newuser_passwd) { strcat(outbuffer, " -W "); strcat(outbuffer, newuser_passwd); } /* now send the command to the application server */ /* fprintf(stderr, "%s\n", outbuffer); */ send_status(n_sockfd, 0, TERM_NO); numbyte = tiwrite(n_sockfd, outbuffer, TERM_YES); if (numbyte == -1) { delete_all_lilimem(&sentinel); fprintf(stderr, "%s\n", get_status_msg(110)); close(n_sockfd); return 1; } if ((n_server_status = read_status(n_sockfd))) { delete_all_lilimem(&sentinel); fprintf(stderr, "%s\n", get_status_msg(n_server_status)); close(n_sockfd); return 1; } outbuffer[0] = '\0'; /* open data source for reading if necessary */ if (n_read_file || n_read_stdin || optind == inargc) { if (n_read_file) { infile_fd = open(infile, O_RDONLY|O_BINARY); } else { infile_fd = fileno(stdin); n_read_stdin = 1; /* not set if optind == inargc */ } if (infile_fd == -1) { send_status(n_sockfd, 112, TERM_NO); delete_all_lilimem(&sentinel); close(n_sockfd); return 1; } if ((new_outbuffer = read_tokens(infile_fd, outbuffer, &outbuf_len)) == NULL) { send_status(n_sockfd, 112, TERM_NO); delete_all_lilimem(&sentinel); close(n_sockfd); if (!n_read_stdin) { close(infile_fd); } return 1; } else { outbuffer = new_outbuffer; } if (!n_read_stdin) { close(infile_fd); } delete_lilimem(&sentinel, "infile"); } /* printf("%s\n", outbuffer); */ for (i = optind; i < inargc; i++) { /* printf("%s\n", inargv[i]); */ if ((new_outbuffer = mstrcat(outbuffer, inargv[i], &outbuf_len, 0)) == NULL) { send_status(n_sockfd, 112, TERM_NO); delete_all_lilimem(&sentinel); close(n_sockfd); return 1; } else { outbuffer = new_outbuffer; } if ((new_outbuffer = mstrcat(outbuffer, " ", &outbuf_len, 0)) == NULL) { send_status(n_sockfd, 112, TERM_NO); delete_all_lilimem(&sentinel); close(n_sockfd); return 1; } else { outbuffer = new_outbuffer; } } /* printf("%s\n", outbuffer); */ delete_lilimem(&sentinel, "inargv"); delete_lilimem(&sentinel, "newarg"); /* now send the string with the usernames to the application server */ send_status(n_sockfd, 0, TERM_NO); send_buffer = outbuffer; while (outbuf_len > COMMAND_INBUF_LEN) { numbyte = iwrite(n_sockfd, send_buffer, COMMAND_INBUF_LEN); if (numbyte == -1) { delete_all_lilimem(&sentinel); fprintf(stderr, "could not write to refdbd. Stop\n"); close(n_sockfd); return (1); } send_buffer += numbyte; outbuf_len -= numbyte; } numbyte = tiwrite(n_sockfd, send_buffer, TERM_YES); if (numbyte == -1) { delete_all_lilimem(&sentinel); fprintf(stderr, "could not write to refdbd. Stop\n"); close(n_sockfd); return (1); } /* read data */ if ((n_server_status = read_status(n_sockfd))) { delete_all_lilimem(&sentinel); fprintf(stderr, "%s\n", get_status_msg(n_server_status)); close(n_sockfd); return 1; } /* openpager and open_outfile are guaranteed to return a valid file/pipe - and be it stdout */ pagerfp = openpager(the_pager); do { numbyte = tread(n_sockfd, inbuffer, OUTBUF_LEN); if (numbyte == -1) { fprintf(stderr, "could not read from refdbd. Stop\n"); delete_all_lilimem(&sentinel); close(n_sockfd); closepager(pagerfp); n_broken_pipe = 0; return (1); } n_curr_trailing_z = get_trailz(inbuffer, numbyte); if (numbyte >= TERM_LEN) { if (n_curr_trailing_z >= TERM_LEN) { n_read_done++; /* send back confirmation to the server */ send_status(n_sockfd, 0, TERM_NO); } } else if (n_curr_trailing_z == numbyte && n_curr_trailing_z + n_last_trailing_z >= TERM_LEN) { n_read_done++; /* send back confirmation to the server */ send_status(n_sockfd, 0, TERM_NO); } else if (n_curr_trailing_z == numbyte) { /* terminator is still incomplete */ n_last_trailing_z += n_curr_trailing_z; continue; } /* write numbyte chars to output, unless this is the last chunk: we do not want to write the terminating \0 */ if (!n_broken_pipe) { if (n_last_trailing_z) { byte_written += fwrite(cs_term, sizeof(char), n_last_trailing_z, pagerfp); } byte_written += fwrite(inbuffer, sizeof(char), numbyte-n_curr_trailing_z, pagerfp); } if (!n_read_done) { n_last_trailing_z = n_curr_trailing_z; } /* printf("%s", inbuffer); */ } while (!n_read_done); /* read summary */ if ((n_server_status = read_status(n_sockfd))) { delete_all_lilimem(&sentinel); fprintf(stderr, "%s\n", get_status_msg(n_server_status)); close(n_sockfd); return 1; } /* send back confirmation to the server */ send_status(n_sockfd, 0, TERM_NO); numbyte = tread(n_sockfd, inbuffer, OUTBUF_LEN); if (numbyte == -1) { fprintf(stderr, "could not read from refdbd. Stop\n"); delete_all_lilimem(&sentinel); close(n_sockfd); n_broken_pipe = 0; return 1; } closepager(pagerfp); fprintf(stderr, "%s", inbuffer); n_broken_pipe = 0; delete_all_lilimem(&sentinel); close(n_sockfd); return (0); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ com_listuser(): list all users that have some entries in their personal interest lists int com_listuser 0 if successful, 1 if error char *arg specifies the regexp to look for ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int com_listuser (char* arg) { /* this command won't work without specifying a database to query */ if (!strstr(arg, "-d ")) { fprintf(stderr, "The listuser command requires a '-d database' argument.\n"); return 1; } return listvalue(arg, "listuser", "Lists the names of the refdb users of a given database.\nSyntax: listuser [-h] -d database \nOptions: -h prints this mini-help\n -d database\n All other arguments are interpreted as a Unix regular expression.\n", "could not connect", 1); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ com_scankw(): run a manual keyword scan int com_scankw 0 if successful, 1 if error char *arg specifies a command argument ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int com_scankw (char* arg) { return listvalue(arg, "scankw", "Runs a manual keyword scan.\nSyntax: scankw [-h] -d database\nOptions: -h prints this mini-help\n -d database\n", "could not connect", 1); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ com_addword(): add reserved journal word int com_addword 0 if successful, 1 if error char *arg specifies the arguments ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int com_addword (char* arg) { return addword(0, arg); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ com_deleteword(): remove reserved journal word int com_deleteword 0 if successful, 1 if error char *arg specifies the arguments ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int com_deleteword (char* arg) { return addword(1, arg); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ addword(): add or remove reserved journal word static int addword 0 if successful, 1 if error int n_remove if 1, words will be removed, if 0, will be added char *arg specifies the arguments ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int addword (int n_remove, char* arg) { int n_sockfd; /* file descriptor of the socket */ char *outbuffer; char *new_outbuffer; char inbuffer[COMMAND_INBUF_LEN] = ""; char srv_inbuffer[COMMAND_INBUF_LEN] = ""; char* infile; char **inargv; /* tokens of the argument */ char *newarg; char scrambled_passwd[PASSWD_LENGTH*3+1] = ""; size_t outbuf_len = COMMAND_INBUF_LEN; int numbyte; int n_read_done = 0; int inargc = 0; /* number of tokens of the argument */ int inargcmax; /* maximum number of tokens */ int result; int i; int infile_fd; int n_opt; int n_read_file = 0; int n_cmdlinerror = 0; int n_just_help = 0; int n_curr_trailing_z = 0; int n_last_trailing_z = 0; int n_server_status; size_t byte_written = 0; FILE *pagerfp; struct lilimem sentinel; sentinel.ptr_mem = NULL; sentinel.ptr_next = NULL; sentinel.varname[0] = '\0'; outbuffer = malloc(outbuf_len); if (outbuffer == NULL) { delete_all_lilimem(&sentinel); return 1; } if (insert_lilimem(&sentinel, (void**)&outbuffer, "outbuffer")) { delete_all_lilimem(&sentinel); return 1; } strcpy(outbuffer, "addword "); /* if (n_batchmode) { */ /* in batchmode, the command line is already tokenized */ /* inargc = main_argc; */ /* inargv = main_argv; */ /* } */ /* else { */ /* parse the argument. first we cut the argument into pieces with strtok, then we use getopt to interpret */ /* get a buffer to hold the tokens. Start with 10 tokens, increase in steps of 10 as needed */ inargc = 0; inargcmax = 10; inargv = malloc((size_t)inargcmax*sizeof(char*)); if (inargv == NULL) { return 1; } if (insert_lilimem(&sentinel, (void**)&inargv, "inargv")) { return 1; } /* the following is a temporary hack to allow cmdln_tokenize to work */ newarg = malloc((size_t)(strlen(arg)+9)); if (newarg == NULL) { delete_all_lilimem(&sentinel); return 1; } if (insert_lilimem(&sentinel, (void**)&newarg, "newarg")) { delete_all_lilimem(&sentinel); return 1; } strcpy(newarg, "addword "); strcat(newarg, arg); result = cmdln_tokenize(&inargc, &inargv, inargcmax, newarg); if (result == 1 || result == 2) { /* memory error */ delete_all_lilimem(&sentinel); return 1; } /* } */ /* if/else */ /* now we have the tokens nicely arranged in inargc */ /* for (i = 0; i < inargc; i++) { */ /* printf("inargv[%d]: %s\n", i, inargv[i]); */ /* } */ /* get options */ optind = 0; while ((n_opt = getopt(inargc, inargv, "c:C:e:f:hi:l:L:o:O:p:qT:u:vVw:")) != -1) { switch(n_opt) { case 'f': if (!strcmp(optarg, "stdin")) { n_read_stdin = 1; } else { infile = canonicalize_path(optarg); if (insert_lilimem(&sentinel, (void**)&infile, "infile")) { delete_all_lilimem(&sentinel); return 1; } n_read_file = 1; } break; case 'h': if (n_remove) { printf("Removes reserved journal words\nSyntax: deleteword [-h] {word|-f infile}\nOptions: -f infile Read the words from infile\n -h prints this mini-help\n All other arguments are interpreted as words.\n"); } else { printf("Adds reserved journal words\nSyntax: addword [-h] {word|-f infile}\nOptions: -f infile Read the words from infile\n -h prints this mini-help\n All other arguments are interpreted as words.\n"); } n_just_help++; break; case 'c': /* fall through, has been taken care of in main() */ case 'C': case 'e': case 'i': case 'l': case 'L': case 'o': case 'O': case 'p': case 'q': case 'T': case 'u': case 'v': case 'V': case 'w': break; case ':': fprintf(stderr, "missing option\n"); n_cmdlinerror = 1; break; case '?': fprintf(stderr, "unknown option\n"); n_cmdlinerror = 1; break; } } /* get arguments */ /* for (i = optind; i < inargc; i++) { */ /* printf("argument %s\n", inargv[i]); */ /* } */ if (n_cmdlinerror || n_just_help) { delete_all_lilimem(&sentinel); return (n_just_help) ? 0:1; } if (connect_to_server(&n_sockfd, server_ip, port_address) != 0) { delete_all_lilimem(&sentinel); return 1; } strcpy(scrambled_passwd, passwd); if (init_dialog(n_sockfd, scrambled_passwd, srv_inbuffer)) { close(n_sockfd); delete_all_lilimem(&sentinel); return 1; } /* assemble command */ strcat(outbuffer, " -u "); strcat(outbuffer, username); if (*passwd) { strcat(outbuffer, " -w "); strcat(outbuffer, scrambled_passwd); } if (n_remove) { strcat(outbuffer, " -r "); } /* now send the command to the application server */ send_status(n_sockfd, 0, TERM_NO); numbyte = tiwrite(n_sockfd, outbuffer, TERM_YES); if (numbyte == -1) { delete_all_lilimem(&sentinel); fprintf(stderr, "could not write to refdbd\n"); close(n_sockfd); return 1; } if ((n_server_status = read_status(n_sockfd))) { delete_all_lilimem(&sentinel); fprintf(stderr, "%s\n", get_status_msg(n_server_status)); close(n_sockfd); return 1; } outbuffer[0] = '\0'; /* open data source for reading if necessary */ if (n_read_file || n_read_stdin || optind == inargc) { if (n_read_file) { infile_fd = open(infile, O_RDONLY|O_BINARY); } else { infile_fd = fileno(stdin); n_read_stdin = 1; /* not set if optind == inargc */ } if (infile_fd == -1) { send_status(n_sockfd, 112, TERM_NO); delete_all_lilimem(&sentinel); close(n_sockfd); return 1; } if ((new_outbuffer = read_tokens(infile_fd, outbuffer, &outbuf_len)) == NULL) { send_status(n_sockfd, 112, TERM_NO); delete_all_lilimem(&sentinel); close(n_sockfd); if (!n_read_stdin) { close(infile_fd); } return 1; } else { outbuffer = new_outbuffer; } if (!n_read_stdin) { close(infile_fd); } delete_lilimem(&sentinel, "infile"); } /* printf("%s\n", outbuffer); */ for (i = optind; i < inargc; i++) { /* printf("%s\n", inargv[i]); */ if ((new_outbuffer = mstrcat(outbuffer, inargv[i], &outbuf_len, 0)) == NULL) { send_status(n_sockfd, 112, TERM_NO); delete_all_lilimem(&sentinel); close(n_sockfd); return 1; } else { outbuffer = new_outbuffer; } if ((new_outbuffer = mstrcat(outbuffer, " ", &outbuf_len, 0)) == NULL) { send_status(n_sockfd, 112, TERM_NO); delete_all_lilimem(&sentinel); close(n_sockfd); return 1; } else { outbuffer = new_outbuffer; } } /* printf("%s\n", outbuffer); */ delete_lilimem(&sentinel, "inargv"); delete_lilimem(&sentinel, "newarg"); /* now send the string with the words to the application server */ send_status(n_sockfd, 0, TERM_NO); numbyte = tiwrite(n_sockfd, outbuffer, TERM_YES); if (numbyte == -1) { delete_all_lilimem(&sentinel); fprintf(stderr, "%s", get_status_msg(110)); close(n_sockfd); return 1; } if ((n_server_status = read_status(n_sockfd))) { delete_all_lilimem(&sentinel); fprintf(stderr, "%s\n", get_status_msg(n_server_status)); close(n_sockfd); return 1; } /* openpager and open_outfile are guaranteed to return a valid file/pipe - and be it stdout */ pagerfp = openpager(the_pager); do { numbyte = tread(n_sockfd, inbuffer, OUTBUF_LEN); if (numbyte == -1) { fprintf(stderr, "could not read from refdbd. Stop\n"); delete_all_lilimem(&sentinel); close(n_sockfd); closepager(pagerfp); n_broken_pipe = 0; return (1); } n_curr_trailing_z = get_trailz(inbuffer, numbyte); if (numbyte >= TERM_LEN) { if (n_curr_trailing_z >= TERM_LEN) { n_read_done++; /* send back confirmation to the server */ send_status(n_sockfd, 0, TERM_NO); } } else if (n_curr_trailing_z == numbyte && n_curr_trailing_z + n_last_trailing_z >= TERM_LEN) { n_read_done++; /* send back confirmation to the server */ send_status(n_sockfd, 0, TERM_NO); } else if (n_curr_trailing_z == numbyte) { /* terminator is still incomplete */ n_last_trailing_z += n_curr_trailing_z; continue; } /* write numbyte chars to output, unless this is the last chunk: we do not want to write the terminating \0 */ if (!n_broken_pipe) { if (n_last_trailing_z) { byte_written += fwrite(cs_term, sizeof(char), n_last_trailing_z, pagerfp); } byte_written += fwrite(inbuffer, sizeof(char), numbyte-n_curr_trailing_z, pagerfp); } /* printf("%s", inbuffer); */ } while (!n_read_done); n_broken_pipe = 0; delete_all_lilimem(&sentinel); if ((n_server_status = read_status(n_sockfd))) { delete_all_lilimem(&sentinel); fprintf(stderr, "%s\n", get_status_msg(n_server_status)); close(n_sockfd); return 1; } numbyte = tread(n_sockfd, inbuffer, OUTBUF_LEN); if (numbyte == -1) { fprintf(stderr, "%s", get_status_msg(109)); delete_all_lilimem(&sentinel); close(n_sockfd); n_broken_pipe = 0; return 1; } /* send back confirmation to the server */ send_status(n_sockfd, 0, TERM_NO); closepager(pagerfp); fprintf(stderr, "%s", inbuffer); close(n_sockfd); return (0); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ com_listword(): list reserved journal words int com_listword 0 if successful, 1 if error char *arg specifies the regexp to look for ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int com_listword (char* arg) { return listvalue(arg, "listword", "Lists reserved journal words (i.e. words which are no abbreviations). If an argument is given as a Unix regular expression, only the matching words are shown.\nSyntax: listword [-h] [unix-regexp]\nOptions: -h prints this mini-help\n All other arguments are interpreted as a Unix regular expression.\n", "could not connect", 1); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ com_addstyle(): add or remove bibliography style int com_addstyle 0 if successful, 1 if error char *arg specifies the styles to add ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int com_addstyle (char* arg) { int n_sockfd; /* file descriptor of the socket */ char *outbuffer; char *outpipe; char **inargv; /* tokens of the argument */ char *newarg; char inbuffer[COMMAND_INBUF_LEN]; char srv_inbuffer[COMMAND_INBUF_LEN] = ""; char outfile[_POSIX_PATH_MAX]; char scrambled_passwd[PASSWD_LENGTH*3+1]; size_t outbuf_len = COMMAND_INBUF_LEN; int numbyte; int inargc = 0; /* number of tokens of the argument */ int inargcmax; /* maximum number of tokens */ int result; int k; int n_opt; int n_file_open = 0; int n_file_append = 0; int n_pipe = 0; /* indicates -c switch */ int n_cmdlinerror = 0; int n_just_help = 0; int n_style_file_done = 0; int n_xml_result; int n_have_dataset = 0; int cs_status; int n_set_count = 0; int numcycles; /* number of cycles reading input */ size_t byte_written = 0; FILE *pagerfp; FILE *infp = NULL; struct lilimem sentinel; sentinel.ptr_mem = NULL; sentinel.ptr_next = NULL; sentinel.varname[0] = '\0'; outbuffer = malloc(outbuf_len); if (outbuffer == NULL) { delete_all_lilimem(&sentinel); return 1; } if (insert_lilimem(&sentinel, (void**)&outbuffer, NULL)) { delete_all_lilimem(&sentinel); return 1; } strcpy(outbuffer, "addstyle "); /* parse the argument. first we cut the argument into pieces with strtok, then we use getopt to interpret */ /* get a buffer to hold the tokens. Start with 10 tokens, increase in steps of 10 as needed */ inargc = 0; inargcmax = 10; inargv = malloc((size_t)inargcmax*sizeof(char*)); if (inargv == NULL) { return 1; } if (insert_lilimem(&sentinel, (void**)&inargv, NULL)) { return 1; } /* the following is a temporary hack to allow cmdln_tokenize to work */ newarg = malloc((size_t)(strlen(arg)+11)); if (newarg == NULL) { delete_all_lilimem(&sentinel); return 1; } if (insert_lilimem(&sentinel, (void**)&newarg, NULL)) { delete_all_lilimem(&sentinel); return 1; } strcpy(newarg, "addstyle "); strcat(newarg, arg); result = cmdln_tokenize(&inargc, &inargv, inargcmax, newarg); if (result == 1 || result == 2) { /* memory error */ delete_all_lilimem(&sentinel); return 1; } /* now we have the tokens nicely arranged in inargc */ /* for (i = 0; i < inargc; i++) { */ /* printf("inargv[%d]: %s\n", i, inargv[i]); */ /* } */ /* get options */ optind = 0; while ((n_opt = getopt(inargc, inargv, "c:C:d:e:f:hH:i:l:L:o:O:p:qrT:u:vVw:")) != -1) { switch(n_opt) { case 'c': /* printf("-c %s\n", optarg); */ outpipe = malloc(strlen(optarg)+1); if (outpipe == NULL) { delete_all_lilimem(&sentinel); return 0; } strcpy(outpipe, optarg); if (insert_lilimem(&sentinel, (void**)&outpipe, NULL)) { delete_all_lilimem(&sentinel); return 1; } n_pipe = 1; break; case 'f': /* printf("-f %s\n", optarg); */ if (!strcmp(optarg, "stdin")) { n_read_stdin = 1; } break; case 'h': printf("Adds bibliography styles\nSyntax: addstyle [-h] {file} [file1...]\nOptions: -h prints this mini-help\n All other arguments are interpreted as filenames with style specifications.\n"); n_just_help++; break; case 'o': /* printf("-o %s\n", optarg); */ strncpy(outfile, optarg, _POSIX_PATH_MAX - 1); outfile[_POSIX_PATH_MAX-1] = '\0'; /* terminate in case string got truncated */ n_file_open = 1; break; case 'O': /* printf("-O %s\n", optarg); */ strncpy(outfile, optarg, _POSIX_PATH_MAX - 1); outfile[_POSIX_PATH_MAX-1] = '\0'; /* terminate in case string got truncated */ n_file_append = 1; break; case 'C': case 'd': case 'e': case 'H': case 'i': case 'l': case 'L': case 'p': case 'q': case 'r': case 'T': case 'u': case 'v': case 'V': case 'w': break; case ':': fprintf(stderr, "missing option\n"); n_cmdlinerror = 1; break; case '?': fprintf(stderr, "unknown option\n"); n_cmdlinerror = 1; break; } } /* get arguments */ /* for (i = optind; i < inargc; i++) { */ /* printf("argument %s\n", inargv[i]); */ /* } */ if (n_cmdlinerror || n_just_help) { delete_all_lilimem(&sentinel); return (n_just_help) ? 0:1; } if (connect_to_server(&n_sockfd, server_ip, port_address) != 0) { delete_all_lilimem(&sentinel); return 1; } strcpy(scrambled_passwd, passwd); if (init_dialog(n_sockfd, scrambled_passwd, srv_inbuffer)) { close(n_sockfd); delete_all_lilimem(&sentinel); return 1; } /* assemble command */ strcat(outbuffer, " -u "); strcat(outbuffer, username); if (strlen(passwd) > 0) { strcat(outbuffer, " -w "); strcat(outbuffer, scrambled_passwd); } /* now send the command to the application server */ /* printf("%s\n", outbuffer); */ send_status(n_sockfd, 0, TERM_NO); numbyte = tiwrite(n_sockfd, outbuffer, TERM_YES); if (numbyte == -1) { delete_all_lilimem(&sentinel); fprintf(stderr, "could not write to refdbd. Stop\n"); close(n_sockfd); return 1; } /* check server status */ if ((cs_status = read_status(n_sockfd))) { fprintf(stderr, "%s\n", get_status_msg(cs_status)); return 1; } /* openpager is guaranteed to return a valid file/pipe - and be it stdout */ if (n_file_open) { pagerfp = open_outfile(outfile, 0); } else if (n_file_append) { pagerfp = open_outfile(outfile, 1); } else if (n_pipe) { pagerfp = openpager(outpipe); } else { pagerfp = openpager(the_pager); } if (n_read_stdin || optind == inargc) { infp = stdin; numcycles = 1; n_read_stdin = 1; /* not set if optind == inargc */ } else { numcycles = inargc-optind; } /* reuse result */ result = 0; for (k = 0; k < numcycles; k++) { n_set_count++; /* starts at 1 */ n_style_file_done = 0; /* try to open our target file */ if (!n_read_stdin) { /* try to open our target file */ infp = fopen(inargv[optind+k], "rb"); /* printf("%s<<\n", inargv[optind+k]); */ if (infp == NULL) { continue; } } /* runs phases 1 through 5 of transfer protocol */ n_xml_result = send_xml_data(infp, pagerfp, stderr, n_sockfd, &byte_written); if (!n_read_stdin) { fclose(infp); } if (n_xml_result != 0 && n_xml_result != 4) { if (n_file_open || n_file_append) { close_outfile(pagerfp); } else { closepager(pagerfp); } delete_all_lilimem(&sentinel); close(n_sockfd); n_broken_pipe = 0; result = 1; goto cleanup; } /* ------------------------------------------------------------ */ /* PHASE 5 */ /* signal server that this file is done */ if (k == numcycles-1) { /* this file is done, and it was the last one */ send_status(n_sockfd, 402, TERM_NO); } else { /* this file is done, but there's more to come */ send_status(n_sockfd, 404, TERM_NO); } n_have_dataset++; /* check server status, should be "chunk added successfully" */ if ((cs_status = read_status(n_sockfd)) != 403) { if (cs_status == 400) { size_t byte_written_to_inbuffer; int num_trailz; int n_read_done = 0; /* retrieve server-generated error message */ do { numbyte = tread(n_sockfd, inbuffer, OUTBUF_LEN); /* printf("phase4 server reply:%s<<\n", inbuffer); */ if (numbyte == -1) { /* timeout while reading */ fprintf(stderr, "%s", get_status_msg(109)); result = 1; goto cleanup; } /* we rely on the fact that the server reply is no more than OUTBUF_LEN in length */ if ((num_trailz = get_trailz(inbuffer, numbyte)) >= TERM_LEN) { /* if transmission ends */ n_read_done++; } /* write numbyte chars to output, unless this is the last chunk: we do not want to write the terminating \0 */ if (!n_broken_pipe) { byte_written_to_inbuffer = fwrite(inbuffer, sizeof(char), numbyte-num_trailz, pagerfp); } /* printf("%s", inbuffer); */ } while (!n_read_done); result = 1; /* goto cleanup; */ } else { fprintf(stderr, "%s\n", get_status_msg(cs_status)); result = 1; goto cleanup; } } /* end if cs_status */ /* reuse inbuffer */ /* sprintf(inbuffer, "405:%d\n", n_set_count); */ /* fwrite(inbuffer, sizeof(char), strlen(inbuffer), pagerfp); */ } /* end for */ /* we must run this code if none of the files could be opened */ if (!n_have_dataset) { send_status(n_sockfd, 401, TERM_NO); result = 1; fprintf(stderr, "no input data\n"); goto cleanup; } /* ------------------------------------------------------------ */ /* PHASE 6 */ /* fprintf(stderr, "try to read return message\n"); */ numbyte = tread(n_sockfd, inbuffer, COMMAND_INBUF_LEN); /* printf("phase6 server reply:%s<<\n", inbuffer); */ if (numbyte == -1) { fprintf(stderr, "could not read from refdbd\n"); if (n_file_open || n_file_append) { close_outfile(pagerfp); } else { closepager(pagerfp); } result = 1; goto cleanup; } if (!*inbuffer) { fprintf(stderr, "server error. Stop.\n"); if (n_file_open || n_file_append) { close_outfile(pagerfp); } else { closepager(pagerfp); } result = 1; goto cleanup; } else { size_t byte_written_to_inbuffer; byte_written_to_inbuffer = fwrite(inbuffer, sizeof(char), strlen(inbuffer), pagerfp); /* leave out the following message for the time being. With the current implementation of the XML handling code any whitespace after a element would count as another dataset */ /* sprintf(inbuffer, "%d dataset(s) sent.\n", n_chunk_count); */ /* fwrite(inbuffer, sizeof(char), strlen(inbuffer), pagerfp); */ } /* retrieve summary */ send_status(n_sockfd, 0, TERM_NO); if ((cs_status = read_status(n_sockfd)) == 0) { numbyte = tread(n_sockfd, inbuffer, COMMAND_INBUF_LEN); } /* send back confirmation to the server */ send_status(n_sockfd, 0, TERM_NO); cleanup: /* reset */ n_broken_pipe = 0; if (n_file_open || n_file_append) { close_outfile(pagerfp); fprintf(stderr, "%d byte written to %s\n", byte_written, outfile); } else { closepager(pagerfp); } fprintf(stderr, "%s\n", inbuffer); delete_all_lilimem(&sentinel); close(n_sockfd); return (0); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ com_deletestyle(): delete a bibliography style int com_deletestyle 0 if successful, 1 if error char *arg the name of the bibliography style which is to be deleted ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int com_deletestyle (char* arg) { char outbuffer[COMMAND_INBUF_LEN]; /* holds the command for the server */ char inbuffer[COMMAND_INBUF_LEN] = ""; struct simplelistvals slvals; char scrambled_passwd[PASSWD_LENGTH*3+1]; slvals.outbuffer = outbuffer; strcpy(slvals.outbuffer, "deletestyle "); slvals.n_file_open = 0; slvals.n_file_append = 0; slvals.n_pipe = 0; slvals.outfile = NULL; slvals.outpipe = NULL; if (strncmp(arg, "-h", 2) == 0) { printf("Deletes bibliography styles\nSyntax: deletestyle [-h] {unix-regexp}\nOptions: -h prints this mini-help\nThis command will delete all bibliography styles whose names match the regular expression\n"); return 0; } if (connect_to_server(&slvals.n_sockfd, server_ip, port_address) != 0) { return 1; } strcpy(scrambled_passwd, passwd); if (init_dialog(slvals.n_sockfd, scrambled_passwd, inbuffer)) { close(slvals.n_sockfd); return 1; } strcat(slvals.outbuffer, arg); strcat(slvals.outbuffer, " -u "); strcat(slvals.outbuffer, username); if (strlen(passwd) > 0) { strcat(slvals.outbuffer, " -w "); strcat(slvals.outbuffer, scrambled_passwd); } getsimplelist(&slvals, 1); close(slvals.n_sockfd); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ com_getstyle(): retrieves a bibliography style int com_getstyle 0 if successful, 1 if error char *arg the name of the bibliography style which is to be deleted ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int com_getstyle (char* arg) { int inargc = 0; int inargcmax = 0; int result; int n_opt; int i; int n_just_help = 0; int n_cmdlinerror = 0; char outbuffer[COMMAND_INBUF_LEN]; /* holds the command for the server */ char inbuffer[COMMAND_INBUF_LEN] = ""; char scrambled_passwd[PASSWD_LENGTH*3+1]; char *newarg; char **inargv; /* tokens of the argument */ struct simplelistvals slvals; struct lilimem sentinel; slvals.outbuffer = outbuffer; strcpy(slvals.outbuffer, "getstyle "); slvals.n_file_open = 0; slvals.n_file_append = 0; slvals.n_pipe = 0; slvals.outfile = NULL; slvals.outpipe = NULL; sentinel.ptr_mem = NULL; sentinel.ptr_next = NULL; sentinel.varname[0] = '\0'; /* parse the argument. first we cut the argument into pieces with strtok, then we use getopt to interpret */ /* get a buffer to hold the tokens. Start with 10 tokens, increase in steps of 10 as needed */ inargc = 0; inargcmax = 10; inargv = malloc((size_t)inargcmax*sizeof(char*)); if (inargv == NULL) { return 1; } if (insert_lilimem(&sentinel, (void**)&inargv, NULL)) { return 1; } /* the following is a temporary hack to allow cmdln_tokenize to work */ newarg = malloc((size_t)(strlen(arg)+11)); if (newarg == NULL) { delete_all_lilimem(&sentinel); return 1; } if (insert_lilimem(&sentinel, (void**)&newarg, NULL)) { delete_all_lilimem(&sentinel); return 1; } strcpy(newarg, "getstyle "); strcat(newarg, arg); result = cmdln_tokenize(&inargc, &inargv, inargcmax, newarg); if (result == 1 || result == 2) { /* memory error */ delete_all_lilimem(&sentinel); return 1; } /* now we have the tokens nicely arranged in inargc */ /* for (i = 0; i < inargc; i++) { */ /* printf("inargv[%d]: %s\n", i, inargv[i]); */ /* } */ /* get options */ optind = 0; while ((n_opt = getopt(inargc, inargv, "c:C:d:e:f:hH:i:l:L:o:O:p:qrT:u:vVw:")) != -1) { switch(n_opt) { case 'c': /* printf("-c %s\n", optarg); */ slvals.outpipe = malloc(strlen(optarg)+1); if (slvals.outpipe == NULL) { delete_all_lilimem(&sentinel); return 0; } strcpy(slvals.outpipe, optarg); if (insert_lilimem(&sentinel, (void**)&slvals.outpipe, NULL)) { delete_all_lilimem(&sentinel); return 1; } slvals.n_pipe = 1; break; case 'h': printf("Retrieves a bibliography style\nSyntax: getstyle [-c command] [-h] [-o file] [-O file] name [name1...]\nOptions: -c command pipe the output through command\n -h prints this mini-help\n -o outfile save the output in outfile (overwrite)\n -O outfile append the output to outfile\nThis command will retrieve the bibliography style(s) with the given name(s)\n"); n_just_help++; break; case 'o': /* printf("-o %s\n", optarg); */ slvals.outfile = canonicalize_path(optarg); if (insert_lilimem(&sentinel, (void**)&(slvals.outfile), NULL)) { delete_all_lilimem(&sentinel); return 1; } slvals.n_file_open = 1; break; case 'O': /* printf("-O %s\n", optarg); */ slvals.outfile = canonicalize_path(optarg); if (insert_lilimem(&sentinel, (void**)&(slvals.outfile), NULL)) { delete_all_lilimem(&sentinel); return 1; } slvals.n_file_append = 1; break; case 'C': case 'd': case 'e': case 'f': case 'H': case 'i': case 'l': case 'L': case 'p': case 'q': case 'r': case 'T': case 'u': case 'v': case 'V': case 'w': break; case ':': fprintf(stderr, "missing option\n"); n_cmdlinerror = 1; break; case '?': fprintf(stderr, "unknown option\n"); n_cmdlinerror = 1; break; } } /* get arguments */ /* for (i = optind; i < inargc; i++) { */ /* printf("argument %s\n", inargv[i]); */ /* } */ if (n_cmdlinerror || n_just_help) { delete_all_lilimem(&sentinel); return (n_just_help) ? 0:1; } if (connect_to_server(&slvals.n_sockfd, server_ip, port_address) != 0) { delete_all_lilimem(&sentinel); return 1; } strcpy(scrambled_passwd, passwd); if (init_dialog(slvals.n_sockfd, scrambled_passwd, inbuffer)) { close(slvals.n_sockfd); delete_all_lilimem(&sentinel); return 1; } if (optind < inargc) { strcat(slvals.outbuffer, "\""); /* printf("%d\n", optind); */ for (i = optind; i < inargc; i++) { strcat(slvals.outbuffer, inargv[i]); strcat(slvals.outbuffer, "\" \""); } strcpy(&slvals.outbuffer[strlen(slvals.outbuffer)-1], ""); /* remove trailing quotation mark */ } strcat(slvals.outbuffer, " -u "); strcat(slvals.outbuffer, username); if (strlen(passwd) > 0) { strcat(slvals.outbuffer, " -w "); strcat(slvals.outbuffer, scrambled_passwd); } getsimplelist(&slvals, 1); close(slvals.n_sockfd); delete_all_lilimem(&sentinel); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ postprocess_var(): checks and converts as necessary config variables int postprocess_var returns 0 if ok, 1 if error const char* varname name of the variable to check ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int postprocess_var(const char* varname) { int result; if (varname == NULL || !varname[0]) { /* make sure we have something to compare */ return 1; } /* individual treatment for each variable */ if (!strcmp(varname, "logfile")) { /* nothing to do */ return 0; } else if (!strcmp(varname, "logdest")) { n_log_dest = num_logdest(log_dest); return 0; } else if (!strcmp(varname, "loglevel")) { n_log_level = num_loglevel(log_level); return 0; } else if (!strcmp(varname, "pager")) { /* nothing to do */ return 0; } else if (!strcmp(varname, "passwd")) { if (strcmp(passwd, "*") == 0) { ask_for_passwd(passwd); } return 0; } else if (!strcmp(varname, "port")) { if (!is_port(port_address)) { fprintf(stderr, "%s is no valid port\n", port_address); if (n_verbose) { fprintf(stderr, "Port addresses below 1024 are reserved for system use. refdb should use a port higher than 1024. The server and all clients must use the same port.\n"); } return 1; } return 0; } else if (!strcmp(varname, "serverip")) { result = check_ip(server_ip); /* reuse i */ if (result > 0) { if (result==1) { fprintf(stderr, "\'%s\' cannot be resolved as a hostname\n", server_ip); } else if (result==2) { fprintf(stderr, "\'%s\' does not appear to be an IP host\n", server_ip); } else if (result==3) { fprintf(stderr, "\'%s\' does not appear to have a valid IP address\n", server_ip); } else if (result==4) { fprintf(stderr, "\'%s' has more than one network interface. Please specify one IP address\n", server_ip); } return 1; } else if (result==-1) { /* silently change 'localhost' to '127.0.0.1' */ strcpy(server_ip, "127.0.0.1"); } return 0; } else if (!strcmp(varname, "timeout")) { n_refdb_timeout = atoi(refdb_timeout); return 0; } else if (!strcmp(varname, "username")) { if (!username[0] && getlogin()) { strcpy(username, getlogin()); /* although not recommended, the login name is a good guess */ return 0; } else if (!username[0]) { return 1; } return 0; } else if (!strcmp(varname, "verbose")) { n_verbose = (verbose[0] == 't') ? 1:0; return 0; } return 1; /* should never happen */ } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ log_print(): writes a log message void log_print int priority the priority level of the log message as in syslog.h char* string a string containing the message to be logged ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ void log_print(int priority, const char* string) { /* we must have this fn in the file with main() because FILE* cannot be declared extern (??) */ time_t the_time; char timestring[256] = ""; if (n_log_dest == 0) { /* output on stderr */ fprintf(stderr, "%s\n", string); } else if (n_log_dest == 1) { /* output via syslog */ syslog(priority, "%s", string); } else { /* output in user-defined logfile */ time(&the_time); strftime(timestring, 256, "%a %b %d %H:%M:%S %Y", gmtime(&the_time)); fprintf(fp_log_file, "%d:pid=%d:%s:%s\n", priority, getpid(), timestring, string); } } refdb-1.0.2/src/readln.c000755 001750 001750 00000011126 12255427651 015657 0ustar00markusmarkus000000 000000 /* readln.c: some functions to use the readline library and to parse the retrieved string */ /* markus@mhoenicka.de 2-10-00 */ /* $Id: readln.c,v 1.5 2004/01/31 14:46:49 mhoenicka Exp $ */ /* 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ /* Todo: command_generator depends on the extern commands[] thing. Other functions may be rewritten to utilize a ptr to a commandlist to parse different command lists */ #include #include #include #include "readln.h" #include "strfncs.h" extern COMMAND commands[]; /* Execute a command line. */ int execute_line (char *line, COMMAND *commandlist) { register int i; COMMAND *command; char *word; /* Isolate the command word. */ i = 0; while (line[i] && whitespace (line[i])) i++; word = line + i; while (line[i] && !whitespace (line[i])) i++; if (line[i]) line[i++] = '\0'; command = find_command (word, commandlist); if (!command) { fprintf (stderr, "%s: No such command for refdb.\n", word); return (-1); } /* Get argument to command, if any. */ while (whitespace (line[i])) i++; word = line + i; /* Call the function. */ return ((*(command->func)) (word)); } /* Look up NAME as the name of a command, and return a pointer to that command. Return a NULL pointer if NAME isn't a command name. */ COMMAND *find_command (char *name, COMMAND *commandlist) { register int i; for (i = 0; commandlist[i].name; i++) if (strcmp (name, commandlist[i].name) == 0) return (&commandlist[i]); return ((COMMAND *)NULL); } /* **************************************************************** */ /* */ /* Interface to Readline Completion */ /* */ /* **************************************************************** */ /* Tell the GNU Readline library how to complete. We want to try to complete on command names if this is the first word in the line, or on filenames if not. */ void initialize_readline (void) { /* Allow conditional parsing of the ~/.inputrc file. */ /* rl_readline_name = "refdb-admin"; */ /* Tell the completer that we want a crack first. */ rl_attempted_completion_function = (CPPFunction *)refdb_completion; } /* Attempt to complete on the contents of TEXT. START and END bound the region of rl_line_buffer that contains the word to complete. TEXT is the word to complete. We can use the entire contents of rl_line_buffer in case we want to do some simple parsing. Return the array of matches, or NULL if there aren't any. */ char **refdb_completion (char *text, int start, int end) { char **matches; matches = (char **)NULL; /* If this word is at the start of the line, then it is a command to complete. Otherwise it is the name of a file in the current directory. */ if (start == 0) #ifdef READLINE41 matches = completion_matches (text, command_generator); #else matches = rl_completion_matches (text, (rl_compentry_func_t *)command_generator); #endif /* READLINE41 */ return (matches); } /* Generator function for command completion. STATE lets us know whether to start from scratch; without any state (i.e. STATE == 0), then we start at the top of the list. */ char *command_generator (char *text, int state) { static int list_index, len; char *name; /* If this is a new word to complete, initialize now. This includes saving the length of TEXT for efficiency, and initializing the index variable to 0. */ if (!state) { list_index = 0; len = strlen (text); } /* Return the next name which partially matches from the command list. */ while ((name = commands[list_index].name)) { list_index++; if (strncmp (name, text, len) == 0) return (strdup(name)); } /* If no names matched, then return NULL. */ return ((char *)NULL); } refdb-1.0.2/src/page.c000755 001750 001750 00000007552 12255427651 015336 0ustar00markusmarkus000000 000000 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ page.c: functions to display the output of database requests markus@mhoenicka.de 2-13-00 $Id: page.c,v 1.2 2002/12/13 20:34:49 mhoenicka Exp $ 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ #include #include #include "page.h" /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ openpager(): returns a pointer to a process which accepts our output on stdin. If the suggested process is not available, the function will return a pointer to stdout instead. FILE *openpager returns a valid writable file pointer char *pager ptr to a string with the command line which starts the custom pager +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ FILE *openpager(char *pager) { FILE *fp; /* first utter whatever is left in the stdout buffer */ fflush(stdout); if (strcmp("stdout", pager) == 0) { return (stdout); /* stdout is explicitly requested */ } /* run the pager program and provide a writable pipe to the new process */ fp = popen(pager, "w"); if (fp == NULL) { return (stdout); /* if nothing else works, stdout should */ } return (fp); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ closepager(): closes the pipe to the process with the given FILE ptr void closepager no return value FILE *fp file pointer to a process pipe which was obtained with a call to openpager() ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ void closepager(FILE *fp) { /* don't attempt to close the file associated with fp if it is stdout or, even worse, NULL */ if (fp != NULL && fp != stdout) { pclose(fp); } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ open_outfile(): returns a pointer to a file which accepts our output If the suggested file is not available, the function will return a pointer to stdout instead. FILE *open_outfile returns a valid writable file pointer char *outfile ptr to a string with the filename int append if set to 1, the file will be opened for append. If set to 0, the file will be opened for (over)write +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ FILE *open_outfile(char *outfile, int append) { FILE *fp; /* first utter whatever is left in the stdout buffer */ fflush(stdout); /* open the output file */ if (append) { fp = fopen(outfile, "ab"); } else { fp = fopen(outfile, "wb"); } if (fp == NULL) { return (stdout); /* if nothing else works, stdout should */ } return (fp); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ close_outfile(): closes an output file void close_outfile no return value FILE *fp file pointer to an output file obtained through a previous call to open_outfile() ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ void close_outfile(FILE *fp) { /* don't attempt to close the file associated with fp if it is stdout or, even worse, NULL */ if (fp != NULL && fp != stdout) { fclose(fp); } } refdb-1.0.2/src/refdb-client.c000755 001750 001750 00000067666 12255427652 016775 0ustar00markusmarkus000000 000000 /*+++++++++++++++++ refdb-client.c - functions common to all client applications markus@mhoenicka.de 2000-07-03 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ /* socket related includes */ #include #include #include #include #include #include #include #include #include #include #include "refdb.h" #include "connect.h" #include "page.h" #include "readln.h" /* for COMMAND definition */ #include "refdb-client.h" #include "linklist.h" /* linked lists, needed by cgi.h */ #include "pref.h" /* for PREFS_BUF_LEN, depends on linklist.h */ #include "enigma.h" /* for password encryption */ #include "cgi.h" /* cgi-related stuff */ #include "strfncs.h" /* mstrcat */ #include "readris.h" extern int n_verbose; extern int n_done; extern int n_broken_pipe; extern int n_abort_connect; extern int n_cgi; extern char server_ip[]; extern char port_address[]; extern char the_pager[]; extern char username[]; extern char passwd[]; extern char no_encrypt[]; extern const char cs_term[]; /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ connect_to_server(): establish a connection to the application server int connect_to_server 0 if successful, not zero if failure int *n_sockfd pointer to the variable which receives the socket file descriptor if successful char *server_ip ip address of server char *port_address port address of server ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int connect_to_server (int* n_sockfd, char* server_ip, char* port_address) { int n_len; /* length of the address structure */ struct sockaddr_in address; /* the server address */ int n_result; /* connection result */ FILE* errstream; errstream = (n_cgi) ? stdout : stderr; *n_sockfd = socket(AF_INET, SOCK_STREAM, 0); address.sin_family = AF_INET; address.sin_addr.s_addr = inet_addr(server_ip); address.sin_port = htons(atoi(port_address)); n_len = sizeof(address); n_result = connect(*n_sockfd, (struct sockaddr *)&address, n_len); if (n_result != 0) { cgi_header(CGI_PLAIN); fprintf(errstream, "could not establish server connection\n"); if (n_verbose) { fprintf(errstream, "(1) Check the settings for the server IP address and the port. You can set these either on the command line or in your init file\n(2)The refdb server may be stopped or crashed or otherwise unwilling to process the request.\n(3) The machine running the server may be down or overloaded.\n"); } } return n_result; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ init_dialog(): starts the client-server dialog int init_dialog returns 0 if ok, 1 if an error occurred int n_sockfd file descriptor of the socket of our connection char* passwd ptr to a string with the unencrypted password char* inbuffer ptr to a string that will receive the server response string must hold at least COMMAND_INBUF_LEN chars ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int init_dialog(int n_sockfd, char* passwd, char* inbuffer) { int numbyte; int cs_status; char outbuffer[16]; /* should be way enough for version numbers */ char scrambled_passwd[PASSWD_LENGTH+1]; FILE* errstream; errstream = (n_cgi) ? stdout : stderr; /* initialize string with zeros to terminate it*/ memset((void*)scrambled_passwd, (int)'\0', (size_t)(PASSWD_LENGTH+1)); /* send our protocol version to server */ sprintf(outbuffer, "%d", REFDB_PROTOCOL_VERSION); numbyte = tiwrite(n_sockfd, outbuffer, TERM_YES); if (numbyte == -1) { cgi_header(CGI_PLAIN); fprintf(errstream, "could not write to refdbd\n"); return 1; } /* read status */ if ((cs_status = read_status(n_sockfd))) { cgi_header(CGI_PLAIN); fprintf(errstream, "%s\n", get_status_msg(cs_status)); return 1; } /* read pseudo-random string for password encryption */ numbyte = tread(n_sockfd, inbuffer, COMMAND_INBUF_LEN); if (numbyte == -1) { cgi_header(CGI_PLAIN); fprintf(errstream, "could not read from refdbd\n"); return 1; } if (strlen(inbuffer) != 12) { cgi_header(CGI_PLAIN); fprintf(errstream, "server error: incorrect scramble string\n"); return 1; } /* todo: check for no_encrypt setting and skip encryption if requested */ if (*no_encrypt != 't') { if (enigma_encrypt(passwd, scrambled_passwd, inbuffer)) { cgi_header(CGI_PLAIN); fprintf(errstream, "password encryption error\n"); return 1; } numberize_passwd(passwd, scrambled_passwd); } /* strcpy(passwd, scrambled_passwd); */ return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ listvalue(): lists various things int listvalue 0 if successful, 1 if error char *arg search string; if this is a cgi request, this ptr must be cast to struct liliform* to access the linked list with form values char *command the command name char *help_string the string to display with the -h option char *err_string a string that identifies an error condition returned by the application server int n_with_summary if 1, summary will be retrieved ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int listvalue (char* arg, char* command, char* help_string, char* err_string, int n_with_summary) { struct simplelistvals slvals; struct liliform* ptr_current; char scrambled_passwd[PASSWD_LENGTH*3+1]; char inbuffer[COMMAND_INBUF_LEN] = ""; int retval; FILE* errstream; if (!command || !*command) { /* nothing to do */ return 1; } errstream = (n_cgi) ? stdout : stderr; slvals.n_file_open = 0; slvals.n_file_append = 0; slvals.n_pipe = 0; slvals.outfile = NULL; slvals.outpipe = NULL; /* get us some buffer for output */ slvals.outbuffer = malloc(strlen(arg) + strlen(command) + 128); if (slvals.outbuffer == NULL) { return 1; } slvals.outbuffer[0] = '\0'; if (!n_cgi) { if (strncmp(arg, "-h", 2) == 0) { cgi_header(CGI_PLAIN); fprintf(errstream, "%s", help_string); free(slvals.outbuffer); return 0; } } if (connect_to_server(&slvals.n_sockfd, server_ip, port_address) != 0) { cgi_header(CGI_PLAIN); fprintf(errstream, "could not connect to server\n"); free(slvals.outbuffer); return 1; } strcpy(scrambled_passwd, passwd); if (init_dialog(slvals.n_sockfd, scrambled_passwd, inbuffer)) { cgi_header(CGI_PLAIN); fprintf(errstream, "password transfer failed\n"); close(slvals.n_sockfd); free(slvals.outbuffer); return 1; } sprintf(slvals.outbuffer, "%s ", command); if (!n_cgi) { if (arg && *arg) { strcat(slvals.outbuffer, arg); } } else { ptr_current = get_liliform((struct liliform*)arg, "dbregexp"); if (ptr_current) { strcat(slvals.outbuffer, ptr_current->value); } } strcat(slvals.outbuffer, " -u "); strcat(slvals.outbuffer, username); if (strlen(passwd) > 0) { strcat(slvals.outbuffer, " -w "); strcat(slvals.outbuffer, scrambled_passwd); } if (n_cgi) { strcat(slvals.outbuffer, " -t cgi"); } retval = getsimplelist(&slvals, n_with_summary); if (!retval && err_string && *err_string && strncmp(slvals.inbuffer, err_string, strlen(err_string)) == 0) { retval = 1; } close(slvals.n_sockfd); free(slvals.outbuffer); return retval; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ getsimplelist(): convenience fn to retrieve data from the server based on a simple command, followed by data from the server, followed by an acknowledgement by the client int getsimplelist 1 if failed, 0 if ok struct simplelistvals* slvals ptr to a structure containing all necessary values to run the command and collect the data int n_with_summary if 1, the fn reads a summary from the server after the data proper are transmitted; if 2, the fn continues to read the result string even if a previous error was signalled ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int getsimplelist(struct simplelistvals* slvals, int n_with_summary) { int numbyte; int n_read_done = 0; size_t byte_written = 0; FILE *pagerfp; /* ptr to file */ FILE* errstream; int n_curr_trailing_z = 0; int n_last_trailing_z = 0; int cs_status; slvals->inbuffer[0] = '\0'; /* terminate just in case we fail and the caller checks the contents */ errstream = (n_cgi) ? stdout : stderr; send_status(slvals->n_sockfd, 0, TERM_NO); numbyte = tiwrite(slvals->n_sockfd, slvals->outbuffer, TERM_YES); if (numbyte == -1) { cgi_header(CGI_PLAIN); fprintf(errstream, "%s\n", get_status_msg(110)); return 1; } /* check server status */ /* ToDo: must continue even if createdb returns error */ cs_status = read_status(slvals->n_sockfd); if (cs_status != 0 /* success */ && cs_status != 803) { /* partial success */ cgi_header(CGI_PLAIN); fprintf(errstream, "%s\n", get_status_msg(cs_status)); if (n_with_summary != 2) { return 1; } } /* openpager and open_outfile are guaranteed to return a valid file/pipe - and be it stdout */ if (slvals->n_file_open) { pagerfp = open_outfile(slvals->outfile, 0); } else if (slvals->n_file_append) { pagerfp = open_outfile(slvals->outfile, 1); } else if (slvals->n_pipe) { pagerfp = openpager(slvals->outpipe); } else { pagerfp = openpager(the_pager); } do { numbyte = tread(slvals->n_sockfd, slvals->inbuffer, OUTBUF_LEN); if (numbyte == -1) { fprintf(stderr, "could not read from refdbd. Stop\n"); if (slvals->n_file_open || slvals->n_file_append) { close_outfile(pagerfp); } else { closepager(pagerfp); } n_broken_pipe = 0; return 1; } n_curr_trailing_z = get_trailz(slvals->inbuffer, numbyte); if (numbyte >= TERM_LEN) { if (n_curr_trailing_z >= TERM_LEN) { /* terminator is complete */ n_read_done++; /* send back confirmation to the server */ send_status(slvals->n_sockfd, 0, TERM_NO); } } else if (n_curr_trailing_z == numbyte && n_curr_trailing_z + n_last_trailing_z >= TERM_LEN) { /* terminator is complete including the previous cycle */ n_read_done++; /* send back confirmation to the server */ send_status(slvals->n_sockfd, 0, TERM_NO); } else if (n_curr_trailing_z == numbyte) { /* terminator is still incomplete */ n_last_trailing_z += n_curr_trailing_z; continue; } /* write numbyte chars to output, unless this is the last chunk: we do not want to write the terminating \0 */ if (!n_broken_pipe) { if (n_last_trailing_z) { byte_written += fwrite(cs_term, sizeof(char), n_last_trailing_z, pagerfp); } byte_written += fwrite(slvals->inbuffer, sizeof(char), numbyte-n_curr_trailing_z, pagerfp); } /* printf("%s<<\n", slvals->inbuffer); */ if (n_read_done && n_with_summary ==1) { send_status(slvals->n_sockfd, 0, TERM_NO); cs_status = read_status(slvals->n_sockfd); if (cs_status != 0 /* success */ && cs_status != 803) { /* partial success */ cgi_header(CGI_PLAIN); fprintf(errstream, "%s", get_status_msg(cs_status)); return 1; } numbyte = tread(slvals->n_sockfd, slvals->inbuffer, OUTBUF_LEN); if (numbyte == -1) { fprintf(stderr, "could not read from refdbd. Stop\n"); n_broken_pipe = 0; return 1; } send_status(slvals->n_sockfd, 0, TERM_NO); } if (!n_read_done) { n_last_trailing_z = n_curr_trailing_z; } } while (!n_read_done); if (slvals->n_file_open || slvals->n_file_append) { close_outfile(pagerfp); fprintf(errstream, "%d byte written to %s\n", byte_written, slvals->outfile); } else { closepager(pagerfp); } if (n_with_summary == 1) { fprintf(errstream, "%s", slvals->inbuffer); } /* reset */ n_broken_pipe = 0; return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ build_batchcommand(): assembles a command string for commands run in batch mode that contains only the relevant options and parameters. Must be called after getopt has dealt with all options relevant to the main program. char* build_batchcommand returns a ptr to a string containing the command string or NULL in case of an error. The returned string is allocated with malloc() and must be freed by the calling function int argc number of arguments char** argv array of strings containing the arguments int optind index into argv char* s string containing the command char* the_command string containing all command options ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* build_batchcommand(int argc, char** argv, int optind, char* s, char* the_command) { char *batchstring, *new_batchstring; size_t stringsize; stringsize = strlen(s)+2; batchstring = malloc(stringsize); if (batchstring == NULL) { return NULL; } strcpy(batchstring, s); if (*the_command) { if ((new_batchstring = mstrcat(batchstring, the_command, &stringsize, 0)) == NULL) { free(batchstring); return NULL; } else { batchstring = new_batchstring; } } if (argv[optind] && argv[optind][0]) { int i = optind; while (argv[i] && argv[i][0]) { if ((new_batchstring = mstrcat(batchstring, " ", &stringsize, 0)) == NULL) { free(batchstring); return NULL; } else { batchstring = new_batchstring; } if ((new_batchstring = mstrcat(batchstring, argv[i], &stringsize, 0)) == NULL) { free(batchstring); return NULL; } else { batchstring = new_batchstring; } i++; } } return batchstring; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ send_xml_data(): reads xml data from an input stream and sends the data chunk-wise to the server int send_xml_data returns 0 if ok, > 0 if there was an error error codes: 1 = data read error 2 = write to server error 3 = read from server error 4 = server error 5 = out of memory FILE *infp ptr to a FILE struct for the data input stream FILE *pagerfp ptr to a FILE struct for the output stream for server messages FILE *errstream ptr to a FILE struct for error messages int n_sockfd file descriptor of client/server socket connection size_t* ptr_byte_written ptr to var that will be incremented by the number of bytes written to a stream ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int send_xml_data(FILE *infp, FILE *pagerfp, FILE *errstream, int n_sockfd, size_t* ptr_byte_written) { int n_style_file_done = 0; int numbyte; int n_read_done = 0; int n_chunk_count = 0; int num_trailz; int cs_status; size_t n_result; size_t n_chunksize; char* buffer; char thebytes[11]; char inbuffer[COMMAND_INBUF_LEN]; n_chunksize = XMLPARSE_CHUNKSIZE; buffer = malloc(n_chunksize); if (buffer == NULL) { return 5; } buffer[0] = '\0'; do { /* ------------------------------------------------------------ */ /* PHASE 1 */ /* read next chunk and count the bytes */ /* the data will be parsed by expat. This can handle XML data chunk-wise, so we don't have to worry about the document structure here */ /* printf("start readstyle"); */ /* fflush(stdout); */ n_result = fread(buffer, 1, n_chunksize, infp); /* printf("end readstyle\n"); */ /* fflush(stdout); */ if (n_result < n_chunksize && !feof(infp)) { /* no more data available */ fprintf(errstream, "%s\n", get_status_msg(401)); send_status(n_sockfd, 401, TERM_NO); free(buffer); return 1; } else if (n_result < n_chunksize) { n_style_file_done++; } if (n_result > 0) { /* if chunk is not empty */ /* send length information to database server */ send_status(n_sockfd, 0, TERM_NO); sprintf(thebytes, "%d", n_result); numbyte = tiwrite(n_sockfd, thebytes, TERM_YES); /* is 10 on the safe side? */ /* printf("%s\n", thebytes); */ /* printf("%s\n", buffer); */ if (numbyte == -1) { fprintf(errstream, "could not write to refdbd. Stop\n"); free(buffer); return 2; } /* ------------------------------------------------------------ */ /* PHASE 2 */ /* wait for acknowledgement of database server */ if ((cs_status = read_status(n_sockfd))) { fprintf(errstream, "%s\n", get_status_msg(cs_status)); return 1; } /* ------------------------------------------------------------ */ /* PHASE 3 */ /* send a dataset */ numbyte = iwrite(n_sockfd, buffer, n_result); /* printf("%s\n", buffer); */ if (numbyte == -1) { fprintf(errstream, "could not write to refdbd. Stop\n"); free(buffer); return 2; } /* ------------------------------------------------------------ */ /* PHASE 4 */ /* read messages from application server */ n_read_done = 0; cs_status = read_status(n_sockfd); if (cs_status == 400) { /* retrieve server-generated error message */ do { numbyte = tread(n_sockfd, inbuffer, OUTBUF_LEN); /* printf("phase4 server reply:%s<<\n", inbuffer); */ if (numbyte == -1) { /* timeout while reading */ fprintf(errstream, "%s", get_status_msg(109)); return 3; } /* we rely on the fact that the server reply is no more than OUTBUF_LEN in length */ if ((num_trailz = get_trailz(inbuffer, numbyte)) >= TERM_LEN) { /* if transmission ends */ n_read_done++; } /* write numbyte chars to output, unless this is the last chunk: we do not want to write the terminating \0 */ if (!n_broken_pipe) { *ptr_byte_written += fwrite(inbuffer, sizeof(char), numbyte-num_trailz, pagerfp); } /* printf("%s", inbuffer); */ } while (!n_read_done); return 4; } /* else: status is 403, chunk added successfully */ n_chunk_count++; } /* else { */ /* } */ } while (!n_style_file_done); free(buffer); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ send_ris_data(): reads ris data from an input stream and sends the data set-wise to the server int send_ris_data returns 0 if ok, > 0 if there was an error error codes: 1 = data read error 2 = write to server error 3 = read from server error 4 = server error 5 = out of memory FILE *infp ptr to a FILE struct for the data input stream FILE *pagerfp ptr to a FILE struct for the output stream for server messages FILE *errstream ptr to a FILE struct for error messages int n_sockfd file descriptor of client/server socket connection char** ptr_ris_set_buffer ptr to an allocated buffer, may be realloc'd size_t* ptr_n_setlength ptr to length of ris_set_buffer int* ptr_n_setcount ptr to set counter char* default_ris ptr to default ris filename int n_cgi if 1, assume CGI data size_t* ptr_byte_written ptr to var that will be incremented by the number of bytes written to a stream ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int send_ris_data(FILE *infp, FILE *pagerfp, FILE *errstream, int n_sockfd, char** ptr_ris_set_buffer, size_t* ptr_n_setlength, int* ptr_n_setcount, char* default_ris, int n_cgi, size_t* ptr_byte_written) { int n_result; int n_read_done = 0; int n_ris_file_done = 0; int numbyte; int num_trailz; int cs_status; char thebytes[11] = ""; char inbuffer[COMMAND_INBUF_LEN]; do { /* ------------------------------------------------------------ */ /* PHASE 1 */ /* read next dataset and count the bytes */ if (!n_cgi) { (*ptr_ris_set_buffer)[0] = '\0'; *ptr_n_setlength = TERM_LEN; /* for the terminating \0's */ n_result = read_ris_set(infp, default_ris, ptr_ris_set_buffer, ptr_n_setlength, 0); if (n_result == 0) { cgi_header(CGI_PLAIN); fprintf(errstream, "%s\n", get_status_msg(401)); send_status(n_sockfd, 401, TERM_NO); return 1; } else if (n_result == 2) { n_ris_file_done++; } } else { /* if cgi, there is only one set to deal with */ n_ris_file_done++; } if (*ptr_n_setlength != TERM_LEN) { /* if dataset is not empty */ /* send length information to database server */ send_status(n_sockfd, 0, TERM_NO); sprintf(thebytes, "%d", *ptr_n_setlength); numbyte = tiwrite(n_sockfd, thebytes, TERM_YES); /* is 10 on the safe side? */ /* printf("%s\n", thebytes); */ if (numbyte == -1) { cgi_header(CGI_PLAIN); fprintf(errstream, "could not write to refdbd. Stop\n"); return 2; } /* ------------------------------------------------------------ */ /* PHASE 2 */ /* wait for acknowledgement of database server */ if ((cs_status = read_status(n_sockfd))) { fprintf(errstream, "%s\n", get_status_msg(cs_status)); return 1; } /* ------------------------------------------------------------ */ /* PHASE 3 */ /* send a dataset */ numbyte = iwrite(n_sockfd, *ptr_ris_set_buffer, *ptr_n_setlength); if (numbyte == -1) { cgi_header(CGI_PLAIN); fprintf(errstream, "could not write to refdbd. Stop\n"); return 2; } /* ------------------------------------------------------------ */ /* PHASE 4 */ /* read messages from application server */ n_read_done = 0; cs_status = read_status(n_sockfd); if (cs_status == 400 || cs_status == 407 || cs_status == 408 || cs_status == 413 || cs_status == 414 || cs_status == 702) { /* retrieve server-generated error/status message */ do { numbyte = tread(n_sockfd, inbuffer, OUTBUF_LEN); if (numbyte == -1) { cgi_header(CGI_PLAIN); fprintf(errstream, "%s", get_status_msg(109)); return 3; } /* we rely on the fact that the server reply is no more than OUTBUF_LEN in length */ if ((num_trailz = get_trailz(inbuffer, numbyte)) >= TERM_LEN) { /* if transmission ends */ n_read_done++; } /* write numbyte chars to output, unless this is the last chunk: we do not want to write the terminating \0 */ if (!n_broken_pipe) { if (!n_cgi) { *ptr_byte_written += fwrite(inbuffer, sizeof(char), numbyte-num_trailz, pagerfp); } } /* printf("%s", inbuffer); */ } while (!n_read_done); if (cs_status == 400 || cs_status == 702) { return 4; } /* else: status is 408, dataset added successfully */ } (*ptr_n_setcount)++; } else { /* we're done sending datasets */ /* send_status(n_sockfd, 402, TERM_NO); */ } } while (!n_ris_file_done); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ read_terminated_string(): reads a terminated string, usually a dataset size_t read_terminated_string returns the number of bytes written to pagerfp. In case of an error, *ptr_error is set to 1 struct simplelistvals* ptr_slvals ptr to struct with data for dialog FILE *pagerfp ptr to a FILE struct for the output stream for server messages int* ptr_error ptr to error variable ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ size_t read_terminated_string(struct simplelistvals* ptr_slvals, FILE* pagerfp, int* ptr_error) { int n_read_done = 0; int n_curr_trailing_z = 0; int n_last_trailing_z = 0; size_t byte_written = 0; int numbyte = 0; *ptr_error = 0; do { /* loop until a terminated string is complete */ /* printf("looking for a terminated string...\n"); */ if (n_curr_trailing_z) { numbyte += tread(ptr_slvals->n_sockfd, ptr_slvals->inbuffer+numbyte, TERM_LEN-n_curr_trailing_z); } else { numbyte = tread(ptr_slvals->n_sockfd, ptr_slvals->inbuffer, OUTBUF_LEN); } if (numbyte == -1) { fprintf(stderr, "%s\n", get_status_msg(109)); *ptr_error = 1; return 0; } n_curr_trailing_z = get_trailz(ptr_slvals->inbuffer, numbyte); /* printf("n_curr_trailing_z went to %d<= TERM_LEN) { if (n_curr_trailing_z >= TERM_LEN) { /* terminator is complete */ /* printf("found complete terminator\n"); */ n_last_trailing_z = 0; n_read_done++; /* send back confirmation to the server */ send_status(ptr_slvals->n_sockfd, 0, TERM_NO); } else { /* terminator is still incomplete */ /* printf("incomplete terminator, trying again\n"); */ } } else if (n_curr_trailing_z == numbyte && n_curr_trailing_z + n_last_trailing_z >= TERM_LEN) { /* printf("completed terminator\n"); */ n_last_trailing_z = 0; /* terminator is complete including the previous cycle */ n_read_done++; /* send back confirmation to the server */ send_status(ptr_slvals->n_sockfd, 0, TERM_NO); } else if (n_curr_trailing_z == numbyte) { /* terminator is still incomplete */ /* printf("incomplete terminator, trying again\n"); */ n_last_trailing_z += n_curr_trailing_z; continue; } /* write numbyte chars to output, unless this is the last chunk: we do not want to write the terminating \0 */ if (!n_broken_pipe) { if (n_last_trailing_z) { /* printf("writing n_last_trailing_z\n"); */ byte_written += fwrite(cs_term, sizeof(char), n_last_trailing_z, pagerfp); } /* printf("writing numbytes\n"); */ byte_written += fwrite(ptr_slvals->inbuffer, sizeof(char), numbyte-n_curr_trailing_z, pagerfp); } /* printf("n_read_done is %d<inbuffer, n_read_done); */ fflush(stdout); if (!n_read_done) { n_last_trailing_z = n_curr_trailing_z; } } while (!n_read_done); return byte_written; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ pipehandler(): handler for the SIGPIPE signal. Sets the global variable n_broken_pipe to non-zero. This condition can be used by a function writing to a pipe to abort further write attempts. Any function that uses n_broken_pipe should reset it to zero when it is done dealing with the broken pipe. void pipehandler int sig the received signal ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ void pipehandler(int sig) { n_broken_pipe = 1; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ inthandler(): handler for the SIGINT signal. Sets the global variable n_abort_connect to non-zero. This function can be used to make writing to and reading from the application server interruptible. Any function that uses n_abort_connect should reset it to zero when it is done. void inthandler int sig the received signal ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ void inthandler(int sig) { n_abort_connect = 1; fprintf(stderr, "aborting...\n"); } refdb-1.0.2/src/client-commands.c000644 001750 001750 00000025151 12255427651 017467 0ustar00markusmarkus000000 000000 /*+++++++++++++++++ client-commands.c - common commands for interactive clients markus@mhoenicka.de 3-7-00 $Id: client-commands.c,v 1.6.2.2 2005/07/29 21:15:34 mhoenicka Exp $ 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ #include #include #include #include "refdb.h" #include "connect.h" #include "linklist.h" #include "pref.h" #include "client-commands.h" #include "refdb-client.h" #include "readln.h" #include "strfncs.h" #include "tokenize.h" extern int n_verbose; extern int n_done; extern COMMAND commands[]; extern Prefs prefs[]; extern char readline_name[]; extern int n_oldlog_dest; extern char oldlog_file[]; extern int n_log_dest; extern FILE* fp_log_file; extern char log_dest[]; extern char log_file[]; extern int n_log_level; /* forward declarations of local functions */ static int is_valid_varname(char* varname); static void list_variables(void); static void reload_var(const char* varname); /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ com_verbose(): toggle verbose mode int com_verbose returns always 0 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int com_verbose (char *arg) { if (strncmp(arg, "-h", 2) == 0) { printf("Toggles the verbose mode on and off. If on, the error messages tend to be somewhat more explicit.\nSyntax: verbose [-h]\nOptions: -h prints this mini-help\n"); return 0; } n_verbose = !n_verbose; if (n_verbose) { printf("Switched verbose mode ON\n"); } else { printf("Switched verbose mode OFF\n"); } return (0); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ com_quit(): The user wishes to quit using this program. int com_quit returns always 0 char *arg currently not used ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int com_quit (char *arg) { if (strncmp(arg, "-h", 2) == 0) { printf("Closes the session and exits.\nSyntax: quit [-h]\nOptions: -h prints this mini-help\n"); return 0; } n_done = 1; return (0); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ com_help(): Print out help for ARG, or for all of the commands if ARG is not present. void com_help returns always 0 char *arg name of a command, or empty string. In the latter case help for all commands will be displayed ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int com_help (char *arg) { register int i; int n_printed = 0; printf("This is a command overview. To get specific information about a command, run this command with the -h option.\n"); for (i = 0; commands[i].name; i++) { if (!*arg || (strcmp (arg, commands[i].name) == 0)) { if (strlen(commands[i].name) >= 8) { printf ("%s\t\t%s.\n", commands[i].name, commands[i].doc); } else { printf ("%s\t\t\t%s.\n", commands[i].name, commands[i].doc); } n_printed++; } } if (!n_printed) { printf ("No commands match `%s'. Your choices are:\n", arg); for (i = 0; commands[i].name; i++) { /* Print in six columns. */ if (n_printed == 6) { n_printed = 0; printf ("\n"); } printf ("%s\t", commands[i].name); n_printed++; } if (n_printed) printf ("\n"); } return (0); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ com_listdb(): list databases int com_listdb 0 if successful, 1 if error char *arg search pattern for the database names. This must be a valid SQL regular expression. If this string is empty, the search will return all existing databases ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int com_listdb (char* arg) { return listvalue(arg, "listdb", "Lists the names of the available databases. If an argument is given as a SQL regular expression, only the matching databases are shown.\nSyntax: listdb [-h] [SQL-regexp]\nOptions: -h prints this mini-help\n All other arguments are interpreted as an SQL regular expression.\n", "could not connect", 1); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ com_liststyle(): list bibliography styles int com_liststyle 0 if successful, 1 if error char *arg search pattern for the bibliography names. This must be a valid SQL regular expression. If this string is empty, the search will return all existing databases ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int com_liststyle (char* arg) { return listvalue(arg, "liststyle", "Lists the names of the available bibliography styles. If an argument is given as a Unix regular expression, only the matching styles are shown.\nSyntax: liststyle [-h] [unix-regexp]\nOptions: -h prints this mini-help\n All other arguments are interpreted as a Unix regular expression.\n", "could not connect", 1); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ com_setvalue(): lists or sets configuration variables int com_setvalue returns 0 if ok, 1 if failure char* arg ptr to string with the command arguments ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int com_setvalue (char* arg) { int inargc; /* number of tokens in the command */ int inargcmax; /* maximum number of tokens */ int error; int n_varindex; char **inargv; /* tokens of the command */ char oldval[PREFS_BUF_LEN] = ""; char *stripped_arg; if (!strcmp(arg, "-h")) { fprintf(stderr, "Set a new value for a configuration variable\nSyntax: set varname varvalue\n"); return 0; } inargc = 0; inargcmax = 10; inargv = malloc((size_t)inargcmax*sizeof(char*)); if (inargv == NULL) { fprintf(stderr, "out of memory\n"); return 1; } error = string_tokenize(&inargc, &inargv, inargcmax, arg); if (error == 2) { /* no arguments, list all names and values */ list_variables(); free(inargv); return 0; } else if (error == 1) { fprintf(stderr, "out of memory\n"); free(inargv); return 1; } if ((n_varindex = is_valid_varname(inargv[0])) == -1) { fprintf(stderr, "invalid variable name\n"); free(inargv); return 1; } if (inargc == 1) { /* only variable name, show its current value */ if (strcmp(prefs[n_varindex].varname, "passwd")) { /* don't reveal password */ fprintf(stderr, "%s %s\n", prefs[n_varindex].varname, prefs[n_varindex].varvalue); } free(inargv); return 0; } else { /* at least two arguments, ignore excess arguments */ if (strlen(inargv[1]) > PREFS_BUF_LEN) { fprintf(stderr, "value string too long\n"); free(inargv); return 1; } stripped_arg = strip_quote(inargv[1]); strcpy(oldval, prefs[n_varindex].varvalue); /* save old value */ strcpy(prefs[n_varindex].varvalue, stripped_arg); /* set new value */ if (postprocess_var(prefs[n_varindex].varname)) { strcpy(prefs[n_varindex].varvalue, oldval); /* roll back */ if (postprocess_var(prefs[n_varindex].varname)) { fprintf(stderr, "could not revert to old value\n"); free(inargv); return 1; } } /* else: all fine */ } reload_var(prefs[n_varindex].varname); if (strcmp(prefs[n_varindex].varname, "passwd")) { /* don't reveal password */ fprintf(stderr, "new value of %s: %s\n", prefs[n_varindex].varname, prefs[n_varindex].varvalue); } free(inargv); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ is_valid_varname(): checks whether a variable exists static int is_valid_varname returns the index in the Prefs[] array if the variable name exists. Returns -1 if the variable name does not exist. char* varname ptr to string containing the variable name ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int is_valid_varname(char* varname) { int i = 0; if (varname == NULL || !varname[0]) { /* make sure we have something to compare */ return -1; } while (*(prefs[i].varname)) { if (!strcmp(varname, prefs[i].varname)) { return i; } i++; } return -1; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ list_variables(): displays a table of variable names and values static void list_variables returns nothing ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static void list_variables(void) { int i = 0; /* could be beefed up a bit */ while (*(prefs[i].varname)) { if (strcmp(prefs[i].varname, "passwd")) { /* don't reveal password */ fprintf(stderr, "%s %s\n", prefs[i].varname, prefs[i].varvalue); } i++; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ reload_var(): restarts things after variables were changed. The current implementation only needs to restart logging static void list_variables returns nothing const char* varname ptr to a string with the name of the changed variable ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static void reload_var(const char* varname) { if (!strcmp(varname, "logfile") || !strcmp(varname, "logdest")) { /* some log setting changed, restart */ /* finish old logging */ if (n_oldlog_dest == 2) { fclose(fp_log_file); } else if (n_oldlog_dest == 1) { closelog(); /* be nice */ } /* set up logging */ if (n_log_dest == 2) { /* use custom log file */ if ((fp_log_file = fopen(log_file, "ab")) == NULL) { n_log_dest = 1; /* fall back to syslog */ log_dest[0] = '1'; log_dest[1] = '\0'; openlog(readline_name, LOG_PID|LOG_ODELAY, LOG_USER); LOG_PRINT(LOG_WARNING, "could not open custom log file"); } } else if (n_log_dest == 1) { /* use syslog */ openlog(readline_name, LOG_PID|LOG_ODELAY, LOG_USER); } n_oldlog_dest = n_log_dest; /* create new backup copies */ } } refdb-1.0.2/src/connect.c000755 001750 001750 00000031307 12255427651 016046 0ustar00markusmarkus000000 000000 /*+++++++++++++++++ connect.c - read/write replacements with timeouts markus@mhoenicka.de 2-10-00 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ /* Parts of this file are inspired considerably by a similar file in Wget (Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.) */ #include #include #include #include #include #include #include #include "connect.h" #include "refdb.h" #include "refstat.h" extern int n_refdb_timeout; /* timeout in seconds for read/write on sockets */ extern int n_abort_connect; /* if 1, user tries to abort current connection */ const char cs_term[5] = {'\0', '\0', '\0', '\0', '\0'}; /* client-server message terminator */ /* forward declarations of local functions */ static int select_fd (int fd, int maxtime, int writep); static int get_numstatus(const char* status); /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ select_fd(): Wait for file descriptor FD to be readable, MAXTIME being the timeout in seconds. If WRITEP is non-zero, checks for FD being writable instead. static int select_fd returns 1 if FD is accessible, 0 for timeout and -1 for error in select(). int fd the file descriptor of a socket int maxtime the time in seconds that the function will wait before a timeout occurs int writep if 1, checks for fd being writable. if 0, checks for fd being readable ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int select_fd (int fd, int maxtime, int writep) { fd_set fds, exceptfds; struct timeval timeout; FD_ZERO (&fds); FD_SET (fd, &fds); FD_ZERO (&exceptfds); FD_SET (fd, &exceptfds); timeout.tv_sec = maxtime; timeout.tv_usec = 0; /* HPUX reportedly warns here. What is the correct incantation? */ return select (fd + 1, writep ? NULL : &fds, writep ? &fds : NULL, &exceptfds, &timeout); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ iread(): Read at most LEN bytes from FD, storing them to BUF. This is virtually the same as read(), but takes care of EINTR braindamage and uses select() to timeout the stale connections (a connection is stale if more than n_timeout time is spent in select() or read()). int iread the number of bytes read from fd, or -1 if timeout char *buf a pointer to a character buffer which receives the data int len the number of bytes that iread will attempt to read from fd ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int iread (int fd, char *buf, int len) { int res; int n_byte_read = 0; while (len > 0) { /* read until we have all or until timeout occurs */ do { if (n_refdb_timeout) { do { res = select_fd (fd, n_refdb_timeout, 0); } while (res == -1 && errno == EINTR && !n_abort_connect); if (n_abort_connect) { n_abort_connect = 0; return -1; } if (res <= 0) { /* Set errno to ETIMEDOUT on timeout. */ if (res == 0) /* #### Potentially evil! */ errno = ETIMEDOUT; return -1; } } res = read(fd, buf, len); /* try to read data */ } while (res == -1 && errno == EINTR); if (res <= 0) break; n_byte_read += res; buf += res; len -= res; } /* printf("%d\n", n_byte_read); */ return n_byte_read; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ tread(): Read at most LEN bytes from FD, storing them to BUF. This is virtually the same as iread(), but it checks after each success- ful read() whether a string is complete (i.e. whether the terminating sequence was received). In this case, the function returns immediately, instead of timing out, even if less byte than requested were received. int tread the number of bytes read from fd, or -1 if timeout char *buf a pointer to a character buffer which receives the data int len the number of bytes that iread will attempt to read from fd ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int tread (int fd, char *buf, int len) { int res; int n_byte_read = 0; char* buf_start; buf_start = buf; while (len > 0) { /* read until we have all, a complete string, or timeout */ do { if (n_refdb_timeout) { do { res = select_fd (fd, n_refdb_timeout, 0); } while (res == -1 && errno == EINTR && !n_abort_connect); if (n_abort_connect) { n_abort_connect = 0; return -1; } if (res <= 0) { /* Set errno to ETIMEDOUT on timeout. */ if (res == 0) /* #### Potentially evil! */ errno = ETIMEDOUT; return -1; } } res = read(fd, buf, len); /* read some data */ if (res > 0) { /* see whether we've got a complete string */ if (n_byte_read+res>= TERM_LEN && !memcmp((const void*)(buf_start+n_byte_read+res-TERM_LEN), (const void*)cs_term, TERM_LEN)) { /* if (buf[res-1] == '\0') { */ /* complete string received */ n_byte_read += res; return n_byte_read; /* get back w/o timeout */ } } } while (res == -1 && errno == EINTR); if (res <= 0) break; n_byte_read += res; buf += res; len -= res; } /* printf("%d\n", n_byte_read); */ return n_byte_read; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ iwrite(): Write LEN bytes from BUF to FD. This is similar to iread(). It makes sure that all of BUF is actually written to FD, so callers needn't bother with checking that the return value equals to LEN. Instead, you should simply check for -1. int iwrite the number of bytes actually written to fd, or -1 if timeout char *buf a pointer to a character buffer which holds the data int len the number of bytes that iwrite will attempt to write to fd ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int iwrite (int fd, const char *buf, int len) { int res = 0; int n_byte_written = 0; /* `write' may write less than LEN bytes, thus the outward loop keeps trying it until all was written, or an error occurred. The inner loop is reserved for the usual EINTR f*kage, and the innermost loop deals with the same during select(). */ while (len > 0) { do { if (n_refdb_timeout) { do { res = select_fd (fd, n_refdb_timeout, 1); } while (res == -1 && errno == EINTR && !n_abort_connect); if (n_abort_connect) { n_abort_connect = 0; return -1; } if (res <= 0) { /* Set errno to ETIMEDOUT on timeout. */ if (res == 0) /* #### Potentially evil! */ errno = ETIMEDOUT; return -1; } } res = write (fd, buf, len); /* write some data */ n_byte_written += res; } while (res == -1 && errno == EINTR); if (res <= 0) break; buf += res; len -= res; } /* printf("%d\n", n_byte_written); */ return n_byte_written; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ tiwrite(): Write bytes from BUF to FD and terminate if requested. This is similar to iwrite(). However, it determines the number of bytes to write from the passed string and adds the message terminator automatically if requested. int tiwrite the number of bytes actually written to fd, or -1 if timeout char *buf a pointer to a character buffer which holds the data int n_term if 1, send a terminator sequence after sending the buffer ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int tiwrite (int fd, const char *buf, int n_term) { size_t buf_len; int n_byte_written; int n_byte_written_total = 0; buf_len = strlen(buf); if (buf_len) { /* send buffer proper */ n_byte_written = iwrite(fd, buf, buf_len); if (n_byte_written == -1) { return -1; } else { n_byte_written_total = n_byte_written; } } if (n_term) { /* send terminator */ n_byte_written = iwrite(fd, cs_term, TERM_LEN); if (n_byte_written == -1) { return -1; } else { n_byte_written_total += n_byte_written; } } return n_byte_written_total; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_trailz(): counts the trailing \0 in a buffer int get_trailz the number of trailing \0, or -1 if buf is NULL char *buf a pointer to a buffer int numbyte offset at which the function should check the buffer (going from offset towards the start of the buffer) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int get_trailz(const char* buf, int numbyte) { int numz = 0; int i = numbyte-1; if (!buf) { return -1; } while (!buf[i] && i>=0) { numz++; i--; } return numz; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ send_status(): sends the status bytes that precede each message int send_status returns 0 if ok, 1 if error int fd file descriptor int n_status status code int n_term send terminator if 1 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int send_status(int fd, int n_status, int n_term) { int n_byte_written; /* printf("sending status %d<< term:%d\n", n_status, n_term); */ if (iwrite(fd, get_status_string(n_status), STATUS_LEN) == -1) { /* printf("error sending status %d<< term:%d\n", n_status, n_term); */ return 1; } if (n_term) { /* send terminator */ n_byte_written = iwrite(fd, cs_term, TERM_LEN); if (n_byte_written == -1) { /* printf("error sending status %d<< term:%d\n", n_status, n_term); */ return 1; } } /* printf("done sending status %d<< term:%d\n", n_status, n_term); */ return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ read_status(): reads the status bytes that precede each message int read_status returns 0 if ok, 1 if error int fd file descriptor const char* status ptr to the status message ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int read_status(int fd) { char status[STATUS_LEN+1] = {'\0', '\0', '\0', '\0'}; /* printf("receiving status...\n"); */ if (iread(fd, status, STATUS_LEN) != STATUS_LEN) { /* printf("read error, received status %s<<\n", status); */ return 1; } status[3] = '\0'; /* printf("received status %s<<\n", status); */ return get_numstatus(status); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_numstatus(): retrieves the numeric status of a status string int get_numstatus returns status number if ok, -1 if error const char* status ptr to the status string ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int get_numstatus(const char* status) { int i; for (i=0; refstat[i].n_status != 999; i++) { if (!strncmp(refstat[i].status, status, STATUS_LEN)) { return refstat[i].n_status; } } /* unknown status message - should never happen */ return 1; /* unspecified error */ } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_status_string(): retrieves the status string of a given status number const char* get_status_string returns status string if ok, "999" if error const char* status ptr to the status string ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ const char* get_status_string(int n_status) { int i; for (i=0; refstat[i].n_status != 999; i++) { if (refstat[i].n_status == n_status) { return refstat[i].status; } } /* unknown status message - should never happen */ return "999"; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_status_msg(): retrieves the status message of a given status number const char* get_status_msg returns status message if ok, empty string if error int n_status status number ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ const char* get_status_msg(int n_status) { int i; for (i=0; refstat[i].n_status != 999; i++) { if (refstat[i].n_status == n_status) { return refstat[i].msg; } } /* unknown status message - should never happen */ return "undefined error"; } refdb-1.0.2/src/tokenize.c000755 001750 001750 00000111132 12255427652 016241 0ustar00markusmarkus000000 000000 /*+++++++++++ tokenize.c: functions to split a command line into tokens and stash them into an array similar to argc/argv markus@mhoenicka.de 2-17-00 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ #include #include #include #include "strfncs.h" #include "linklist.h" #include "tokenize.h" #ifndef HAVE_ATOLL long long atoll(const char *str); #endif #ifndef HAVE_STRTOLL long long strtoll(const char *nptr, char **endptr, int base); #endif /* forward declaration of local functions */ static char* next_unescaped_char_in_string(const char* string, const char* chars); /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ cmdln_tokenize(): splits a command line into tokens and stashes them in an array similar to argc/argv. Single and double quotes are respected to group tokens. int cmdln_tokenize returns 0 if successful, 1 if out of memory, 2 if command line empty int *inargc ptr to a counter for the tokens. Should be initialized to 0 before you call this function, unless you add to an existing array. char ***ptr_inargv ptr to the array of ptrs to the token strings. This array must be allocated with malloc() before you call this function. It must be able to hold at least inargcmax string entries. If more than inargcmax tokens are found, the array grows dynamically. int inargcmax size of ***ptr_inargv array (number of entries). The array grows in increments of inargcmax, i.e. selecting a higher inargcmax reduces the number of calls to realloc(). char *inbuffer buffer holding the command line. This buffer will be modified while parsing, so keep a copy before you call this function if you need the original afterwards ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int cmdln_tokenize(int *inargc, char ***ptr_inargv, int inargcmax, char* inbuffer) { int quot0_detect = 0; int quot1_detect = 0; int inargc_increment; char *this_token; char *next_token = NULL; char *delimiter; char *eostring; char **resizedinargv; /* temporary inargv for realloc */ /* we have to take care of quotation marks. strings included in pairs of "" or '' should be treated as one argument. We keep pointers to the first occurrences of either quotation mark. If after the first call to strtok one of the quotation marks disappears, we flip a switch to modify the strtok search string in the next round of the while loop */ /* todo: honour escaping backslashes */ /* printf("inbuffer:%s<<\n", inbuffer); */ /* first we save the end of the original string */ stripwhite(inbuffer, 2, 0); eostring = &inbuffer[strlen(inbuffer)]; inargc_increment = inargcmax; /* save increment for later use */ /* in the first round we look for the command, this must not have quotes, so we ignore them for now */ this_token = inbuffer; delimiter = strpbrk(inbuffer, " ~\n\r"); if (delimiter == NULL) { /* no more whitespace detected */ next_token = NULL; } else if (*delimiter == ' ') { /* space detected */ *delimiter = '\0'; if (*(delimiter+1) == '\0') { /* if string ends here */ next_token = NULL; } else { /* if string continues */ next_token = stripwhite(delimiter+1, 1, 0); if (*next_token == '\'') { /* single quote detected */ quot0_detect++; *next_token = '\0'; next_token += 1; } else if (*next_token == '\"') { /* double quote detected */ quot1_detect++; *next_token = '\0'; next_token += 1; } } } else if (*delimiter == '\0') { /* end of string detected */ if (delimiter == inbuffer) { return 2; /* empty string detected */ } } /* printf("this %s\n", this_token); */ /* printf("next %s\n", next_token); */ while (this_token != NULL) { /* loop until string ends */ /* save token in token array */ (*ptr_inargv)[(*inargc)++] = stripwhite(this_token, 1, 0); /* printf("%s\n", this_token); */ /* check size of array and adjust if necessary */ if (*inargc == inargcmax) { inargcmax += inargc_increment; resizedinargv = (char**)realloc(*ptr_inargv, (size_t)inargcmax*sizeof(char*)); if (resizedinargv == NULL) { return 1; } else { *ptr_inargv = resizedinargv; } } /* prepare next round */ if (next_token == NULL) { /* if string ends */ this_token = NULL; } else if (quot0_detect) { /* if single quote was detected prev. */ quot0_detect--; delimiter = next_unescaped_char_in_string(next_token, "\'"); if (delimiter == NULL) { this_token = next_token; next_token = NULL; } else { this_token = next_token; *delimiter = '\0'; if (delimiter+1 == eostring) { next_token = NULL; } else { next_token = stripwhite(delimiter+1, 1, 0); if (*next_token == '\'') { quot0_detect++; next_token++; } else if (*next_token == '\"') { quot1_detect++; next_token++; } } } } else if (quot1_detect) { quot1_detect--; delimiter = next_unescaped_char_in_string(next_token, "\""); if (delimiter == NULL) { this_token = next_token; next_token = NULL; } else { this_token = next_token; *delimiter = '\0'; if (delimiter+1 == eostring) { next_token = NULL; } else { next_token = stripwhite(delimiter+1, 1, 0); if (*next_token == '\'') { quot0_detect++; next_token++; } else if (*next_token == '\"') { quot1_detect++; next_token++; } } } } else { /* no quotes detected in previous round */ delimiter = next_unescaped_char_in_string(next_token, "\"\' \n\r"); if (delimiter == NULL) { /* end of string */ this_token = next_token; next_token = NULL; } else if (*delimiter == ' ') { /* printf("space\n"); */ *delimiter = '\0'; this_token = next_token; if (*(delimiter+1) == '\0') { next_token = NULL; } else { delimiter = stripwhite(delimiter+1, 1, 0); if (*delimiter == '\'') { /* printf("single quote after space\n"); */ quot0_detect++; *delimiter = '\0'; if (delimiter+1 == eostring) { next_token = NULL; } else { next_token = stripwhite(delimiter+1, 1, 0); } } else if (*delimiter == '\"') { /* printf("double quote after space\n"); */ quot1_detect++; *delimiter = '\0'; if (delimiter+1 == eostring) { next_token = NULL; } else { next_token = stripwhite(delimiter+1, 1, 0); } } else { next_token = (delimiter == eostring) ? NULL : delimiter; } } } else if (*delimiter == '\'') { /* printf("single quote\n"); */ quot0_detect++; this_token = next_token; *delimiter = '\0'; if (delimiter+1 == eostring) { next_token = NULL; } else { next_token = stripwhite(delimiter+1, 1, 0); if (*next_token == '\'') { quot0_detect++; next_token++; } else if (*next_token == '\"') { quot1_detect++; next_token++; } } } else if (*delimiter == '\"') { /* printf("double quote\n"); */ quot1_detect++; this_token = next_token; *delimiter = '\0'; if (delimiter+1 == eostring) { next_token = NULL; } else { next_token = stripwhite(delimiter+1, 1, 0); if (*next_token == '\'') { quot0_detect++; next_token++; } else if (*next_token == '\"') { quot1_detect++; next_token++; } } } } /* printf("this %s\n", this_token); */ /* printf("next %s\n", next_token); */ } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ next_unescaped_char_in_string(): finds the next unescaped character (any of the characters in chars will do) in string. The escape char is a backslash char* next_unescaped_char_in_string returns a ptr to the character, or NULL if none was found const char* string ptr to the long string to find something in const char* chars string containing all characters to look for ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static char* next_unescaped_char_in_string(const char* string, const char* chars) { int n_have_escape = 0; char* cur; cur = (char*)string; /* loop until string ends, or until we find an appropriate character */ while (*cur) { if (*cur == '\\') { n_have_escape++; } else if (strchr(chars, (int)*cur)) { if ((n_have_escape & 1) == 0) { /* number of consecutive escape chars is even*/ return cur; } else { /* the desired character was escaped. skip and reset counter */ n_have_escape = 0; } } else { /* there was no character match and no escape character. reset counter */ n_have_escape = 0; } cur++; } return NULL; /* character not found */ } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ sql_tokenize(): splits a pseudo-SQL request into tokens. Call repeatedly and give the sqltoken.next_token of the previous iteration as an argument for inbuffer, until sqltoken.next_token is NULL. The field name separator is currently set to : (colon) char* sql_tokenize returns a pointer to the next token, or NULL if no token is found char *inbuffer buffer holding the command line. struct SQLTOKEN *ptr_sqltoken pointer to a structure which will be filled with the length and the type of the token and with the start of the following token, if any ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char *sql_tokenize(char* inbuffer, struct SQLTOKEN *ptr_sqltoken) { int i = 0; size_t j; int have_token = 0; char *this_token = NULL; char *next_token[4]; char *endtoken; if (!inbuffer || ! *inbuffer) { return NULL; } while (!have_token) { if (inbuffer[i] == '(') { have_token = 1; this_token = &inbuffer[i]; ptr_sqltoken->next_token = strchr(&inbuffer[i], (int)':'); ptr_sqltoken->type = 2; if (ptr_sqltoken->next_token != NULL) { ptr_sqltoken->length = (int)(ptr_sqltoken->next_token-&inbuffer[i]); } else { ptr_sqltoken->length = strlen(&inbuffer[i]); } } else if (inbuffer[i] == ')') { have_token = 1; this_token = &inbuffer[i]; next_token[0] = strstr(&inbuffer[i], " AND "); next_token[1] = strstr(&inbuffer[i], " OR "); next_token[2] = strstr(&inbuffer[i], " NOT "); qsort(next_token, 3, sizeof(char*), compare_ptr); ptr_sqltoken->next_token = next_token[0]; ptr_sqltoken->type = 3; if (ptr_sqltoken->next_token != NULL) { ptr_sqltoken->length = (int)(ptr_sqltoken->next_token-&inbuffer[i]); } else { ptr_sqltoken->length = strlen(&inbuffer[i]); } } else if (strncmp(&inbuffer[i], " AND ", 5) == 0) { have_token = 1; this_token = &inbuffer[i]; next_token[0] = strchr(&inbuffer[i], (int)':'); next_token[1] = strchr(&inbuffer[i], (int)'('); qsort(next_token, 2, sizeof(char*), compare_ptr); ptr_sqltoken->next_token = next_token[0]; ptr_sqltoken->type = 1; if (ptr_sqltoken->next_token != NULL) { ptr_sqltoken->length = (int)(ptr_sqltoken->next_token-&inbuffer[i]); } else { ptr_sqltoken->length = strlen(&inbuffer[i]); } } else if (strncmp(&inbuffer[i], " OR ", 4) == 0) { have_token = 1; this_token = &inbuffer[i]; next_token[0] = strchr(&inbuffer[i], (int)':'); next_token[1] = strchr(&inbuffer[i], (int)'('); qsort(next_token, 2, sizeof(char*), compare_ptr); ptr_sqltoken->next_token = next_token[0]; ptr_sqltoken->type = 1; if (ptr_sqltoken->next_token != NULL) { ptr_sqltoken->length = (int)(ptr_sqltoken->next_token-&inbuffer[i]); } else { ptr_sqltoken->length = strlen(&inbuffer[i]); } } else if (strncmp(&inbuffer[i], " NOT ", 5) == 0) { have_token = 1; this_token = &inbuffer[i]; next_token[0] = strchr(&inbuffer[i], (int)':'); next_token[1] = strchr(&inbuffer[i], (int)'('); qsort(next_token, 2, sizeof(char*), compare_ptr); ptr_sqltoken->next_token = next_token[0]; ptr_sqltoken->type = 1; if (ptr_sqltoken->next_token != NULL) { ptr_sqltoken->length = (int)(ptr_sqltoken->next_token-&inbuffer[i]); } else { ptr_sqltoken->length = strlen(&inbuffer[i]); } } else if (inbuffer[i] == ':') { size_t fieldname_len; if (strlen(&inbuffer[i]) > 5) { /* check the length of the field name. Currently only 2 or 3 are permitted */ if (inbuffer[i+3] == ':') { fieldname_len = 2; } else { fieldname_len = 3; } /* ToDo: use strcspn() if we ever allow longer field names */ if (inbuffer[i+fieldname_len+2] == '!') { if (inbuffer[i+fieldname_len+3] == '=' || inbuffer[i+fieldname_len+3] == '~') { have_token = 1; this_token = &inbuffer[i]; ptr_sqltoken->length = fieldname_len+4; } } else if (inbuffer[i+fieldname_len+2] == '=' || inbuffer[i+fieldname_len+2] == '~') { have_token = 1; this_token = &inbuffer[i]; ptr_sqltoken->length = fieldname_len+3; } else if (inbuffer[i+fieldname_len+2] == '<') { have_token = 1; this_token = &inbuffer[i]; if (inbuffer[i+fieldname_len+3] == '>' || inbuffer[i+fieldname_len+3] == '=' || inbuffer[i+fieldname_len+3] == '~') { ptr_sqltoken->length = fieldname_len+4; } else { ptr_sqltoken->length = fieldname_len+3; } } else if (inbuffer[i+fieldname_len+2] == '>') { have_token = 1; this_token = &inbuffer[i]; if (inbuffer[i+fieldname_len+3] == '=' || inbuffer[i+fieldname_len+3] == '~') { ptr_sqltoken->length = fieldname_len+4; } else { ptr_sqltoken->length = fieldname_len+3; } } } if (have_token) { ptr_sqltoken->next_token = &inbuffer[i+ptr_sqltoken->length]; ptr_sqltoken->type = 4; } } else if (inbuffer[i] == '\'') { int j = 1; have_token = 1; ptr_sqltoken->type = 0; this_token = &inbuffer[i+1]; endtoken = NULL; while (!endtoken) { endtoken = strchr(&inbuffer[i+j], (int)'\''); /* jump to next ' */ if (endtoken && *(endtoken-1) == '\\') { /* skip escaped \' */ j++; endtoken = NULL; continue; } } if (endtoken != NULL) { next_token[0] = strstr(endtoken, " AND "); next_token[1] = strstr(endtoken, " OR "); next_token[2] = strstr(endtoken, " NOT "); next_token[3] = strchr(endtoken, (int)')'); qsort(next_token, 4, sizeof(char*), compare_ptr); ptr_sqltoken->next_token = next_token[0]; if (endtoken != NULL) { ptr_sqltoken->length = (int)(endtoken-&inbuffer[i+1]); } else { ptr_sqltoken->length = strlen(&inbuffer[i]); } } } else { /* this is obviously some value */ int j = i; have_token = 1; ptr_sqltoken->type = 0; this_token = &inbuffer[i]; next_token[0] = strstr(&inbuffer[i], " AND "); next_token[1] = strstr(&inbuffer[i], " OR "); next_token[2] = strstr(&inbuffer[i], " NOT "); next_token[3] = strchr(&inbuffer[i], (int)')'); /* make sure this is not an escaped paren TODO: this is not foolproof as we could have \\) */ while (next_token[3] && *(next_token[3]) == ')' && *(next_token[3]-1) == '\\') { next_token[3] = strchr(&inbuffer[j+1], (int)')'); j++; } qsort(next_token, 4, sizeof(char*), compare_ptr); ptr_sqltoken->next_token = next_token[0]; if (ptr_sqltoken->next_token != NULL) { ptr_sqltoken->length = (int)(ptr_sqltoken->next_token-&inbuffer[i]); } else { ptr_sqltoken->length = strlen(&inbuffer[i]); } } i++; if (inbuffer[i] == '\0' && !have_token) { /* don't read past the end */ this_token = NULL; have_token = 1; ptr_sqltoken->type = 0; ptr_sqltoken->next_token = NULL; ptr_sqltoken->length = 0; } } if (this_token && ptr_sqltoken->type == 0) { /* strip escaping backslashes from values */ for (j = 0; j < ptr_sqltoken->length; j++) { if (*(this_token+j) == '\\' && (*(this_token+j+1) == '\'' || *(this_token+j+1) == '\"')) { memmove(this_token+j, this_token+j+1, ptr_sqltoken->length-j); ptr_sqltoken->length--; } } } return this_token; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ link_tokenize(): splits a link request into tokens. Call repeatedly and give the sqltoken.next_token of the previous iteration as an argument for inbuffer, until sqltoken.next_token is NULL. The field name separator is currently set to : (colon) char* link_tokenize returns a pointer to the next token, or NULL if no token is found char *inbuffer buffer holding the command line. struct SQLTOKEN *ptr_sqltoken pointer to a structure which will be filled with the length and the type of the token and with the start of the following token, if any ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char *link_tokenize(char* inbuffer, struct SQLTOKEN *ptr_sqltoken) { int i = 0; int have_token = 0; char *this_token = NULL; char *endtoken = NULL; while (!have_token) { if (inbuffer[i] == ':') { size_t fieldname_len; /* printf("here0\n"); */ if (strlen(&inbuffer[i]) > 5) { /* check the length of the field name. Currently only 2 or 3 are permitted */ if (inbuffer[i+3] == ':') { fieldname_len = 2; } else { fieldname_len = 3; } /* ToDo: use strcspn() if we ever allow longer field names */ if (inbuffer[i+fieldname_len+2] == '!') { if (inbuffer[i+fieldname_len+3] == '=') { have_token = 1; this_token = &inbuffer[i]; ptr_sqltoken->length = fieldname_len+4; } } else if (inbuffer[i+fieldname_len+2] == '=') { have_token = 1; this_token = &inbuffer[i]; ptr_sqltoken->length = fieldname_len+3; } else if (inbuffer[i+fieldname_len+2] == '<') { have_token = 1; this_token = &inbuffer[i]; if (inbuffer[i+fieldname_len+3] == '>' || inbuffer[i+fieldname_len+3] == '=') { ptr_sqltoken->length = fieldname_len+4; } else { ptr_sqltoken->length = fieldname_len+3; } } else if (inbuffer[i+fieldname_len+2] == '>') { have_token = 1; this_token = &inbuffer[i]; if (inbuffer[i+fieldname_len+3] == '=') { ptr_sqltoken->length = fieldname_len+4; } else { ptr_sqltoken->length = fieldname_len+3; } } } if (have_token) { ptr_sqltoken->next_token = &inbuffer[i+ptr_sqltoken->length]; ptr_sqltoken->type = 4; } } else if (inbuffer[i] == '\'' && inbuffer[i-1] != '\\') { char *end; /* printf("here1\n"); */ have_token = 1; ptr_sqltoken->type = 0; this_token = &inbuffer[i+1]; end = this_token; /* loop until we find an unescaped matching end quote */ while (end != NULL) { endtoken = next_unescaped_char_in_string(end, "'"); /* jump to next ' */ if (!endtoken || *(endtoken-1) != '\\') { end = NULL; } else { end = endtoken+1; } } if (endtoken != NULL) { ptr_sqltoken->next_token = strstr(endtoken, " "); if (endtoken != NULL) { ptr_sqltoken->length = (int)(endtoken-&inbuffer[i+1]); } else { ptr_sqltoken->length = strlen(&inbuffer[i]); } } } else if (inbuffer[i] == ' ') { /* do nothing, will skip */ } else { /* this is obviously some value */ /* printf("here2\n"); */ have_token = 1; ptr_sqltoken->type = 0; this_token = &inbuffer[i]; ptr_sqltoken->next_token = strstr(&inbuffer[i], " "); if (ptr_sqltoken->next_token != NULL) { ptr_sqltoken->length = (int)(ptr_sqltoken->next_token-&inbuffer[i]); } else { ptr_sqltoken->length = strlen(&inbuffer[i]); } } i++; if (inbuffer[i] == '\0' && !have_token) { /* don't read past the end */ this_token = NULL; have_token = 1; ptr_sqltoken->type = 0; ptr_sqltoken->next_token = NULL; ptr_sqltoken->length = 0; } } return this_token; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ nstrtok(): (hopefully) thread-safe replacement for strtok() first call it with the string as first argument. In subsequent calls, use previous_token+len instead. In contrast to strtok(), nstrtok() does *not* modify the string, so you have to terminate the token yourself, e.g.: strncpy(buffer, token, len); buffer[len] = '\0'; As in strtok(), the delim strings can be different in subsequent calls to nstrtok() char* nstrtok returns a pointer to the next token, or NULL if no token is found char* value the string to search in size_t* ptr_len ptr to a variable that will receive the length of a token or 0 if no token is found char* delim ptr to a string consisting of the token-delimiting characters ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* nstrtok(char* value, size_t* ptr_len, char* delim) { int delim_found; size_t i; char *eostring; char *tokenend; /* take a shortcut if the string is empty */ if (!value[0]) { *ptr_len = 0; return NULL; } eostring = &value[strlen(value)]; /* position of terminating \0 */ /* remove all delimiters at the beginning of the token */ do { delim_found = 0; for (i = 0; i < strlen(delim); i++) { if (*value == delim[i]) { delim_found++; break; } } if (delim_found) { value++; } } while (delim_found && value < eostring); if (delim_found || value == eostring) { *ptr_len = 0; return NULL; } /* now search for delimiters at the end of the token */ /* value now points to start of token */ tokenend = value; /* delim_found must be 0 now */ while (!delim_found && tokenend < eostring) { for (i = 0; i < strlen(delim); i++) { if (*tokenend == delim[i]) { delim_found++; break; } } if (!delim_found) { tokenend++; } } *ptr_len = tokenend-value; return value; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ris_strtok(): essentially the same as nstrtok() above, and all said there applies here as well. The added benefit of this function is that it peeks ahead and glues together subsequent lines that belong to the same tag, i.e. the following lines: N1 - This is a note written in two lines will be returned as a single token char* nstrtok returns a pointer to the next token, or NULL if no token is found char* value the string to search in size_t* ptr_len ptr to a variable that will receive the length of a token or 0 if no token is found char* delim ptr to a string consisting of the token-delimiting characters ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* ris_strtok(char* value, size_t* ptr_len, char* delim) { int delim_found; size_t i; char *eostring; char *tokenend; /* take a shortcut if the string is empty */ if (!value[0]) { *ptr_len = 0; return NULL; } eostring = &value[strlen(value)]; /* position of terminating \0 */ /* remove all delimiters at the beginning of the token */ do { delim_found = 0; for (i = 0; i < strlen(delim); i++) { if (*value == delim[i]) { delim_found++; break; } } if (delim_found) { value++; } } while (delim_found && value < eostring); if (delim_found || value == eostring) { *ptr_len = 0; return NULL; } /* now search for delimiters at the end of the token */ /* value now points to start of token */ tokenend = value; /* delim_found must be 0 now */ while (!delim_found && tokenend < eostring) { for (i = 0; i < strlen(delim); i++) { if (*tokenend == delim[i]) { /* check whether the next token starts with a RIS tag */ if (eostring - tokenend > 6) { if (!strncmp(tokenend+3, " - ", 4)) { delim_found++; } else { /* replace any CR preceeding the LF by a space */ if (*(tokenend-1) == '\r') { *(tokenend-1) = ' '; } } } else { delim_found++; } break; } } if (!delim_found) { tokenend++; } } *ptr_len = tokenend-value; return value; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ string_tokenize(): splits a string into tokens and stashes them in an array similar to argc/argv. This implementation relies on the fact that all printable characters except the space have ASCII values 33 and up. The tokens are assumed to be separated by whitespace, which is \t (9), \n (10), \r (13), SPC (32). Do not use this function where this coarse separation is not sufficient int string_tokenize returns 0 if successful, 1 if out of memory, 2 if string empty int *inargc ptr to a counter for the tokens. Should be initialized to 0 before you call this function, unless you add to an existing array. char ***ptr_inargv ptr to the array of ptrs to the token strings. This array must be allocated with malloc() before you call this function. It must be able to hold at least inargcmax string entries. If more than inargcmax tokens are found, the array grows dynamically. int inargcmax size of ***ptr_inargv array (number of entries). The array grows in increments of inargcmax, i.e. selecting a higher inargcmax reduces the number of calls to realloc(). char *inbuffer buffer holding the string. This buffer will be modified while parsing, so keep a copy before you call this function if you need the original afterwards ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int string_tokenize(int *inargc, char ***ptr_inargv, int inargcmax, char* inbuffer) { int num_tokens = 0; int inargc_increment; char *token; char *eof_string; char **new_inargv; inargc_increment = inargcmax; /* save increment for later use */ token = inbuffer; eof_string = &inbuffer[strlen(inbuffer)]; /* points to the terminating \0 */ while(1) { /* search for the start of a token */ while (*token < 33 && token < eof_string) { /* all whitespace has ASCII values 32 or less */ token++; } if (token == eof_string){ if (num_tokens) { return 0; } else { return 2; } } /* we obviously are at the start of a token. Save a pointer */ (*ptr_inargv)[(*inargc)++] = token; num_tokens++; /* printf("%s\n", start_token); */ /* check size of array and adjust if necessary */ if (*inargc == inargcmax) { inargcmax += inargc_increment; new_inargv = (char**)realloc(*ptr_inargv, (size_t)inargcmax*sizeof(char*)); if (new_inargv == NULL) { return 1; } else { *ptr_inargv = new_inargv; } } /* Look for the end */ while (*token > 32 && token < eof_string) { token++; } if (token == eof_string){ if (num_tokens) { return 0; } else { /* well, this should never happen */ return 2; } } else { *token = '\0'; /* terminate token */ token++; } } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ tokenize_author(): fills a STRUCT with pointers to the parts of a name If a part is missing, the corresponding ptr will point to an empty string (actually the end of the author string). Thus the calling function could just concatenate the parts without testing for their presence if this makes any sense. If you want to test for their presence, check the length The middle names are implemented as a linked list in case there is more than one (the NO researchers among us certainly remember "Triple-H" Schmidt!) char* tokenize_author returns a ptr to the surname or NULL in case of an error struct AUTHORTOKENS* ptr_atoken ptr to a struct which will receive the ptrs ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* tokenize_author(char* author, struct AUTHORTOKENS* ptr_atoken) { char* term; char* suffix; char* middle; char* the_end; if (!author) { return NULL; } /* let the_end point to an empty string */ the_end = &(author[strlen(author)]); /* skip leading spaces */ while (*author == ' ') { author++; } /* initialize the nameparts structure */ ptr_atoken->sur = author; /* always the first, always assumed to be present */ ptr_atoken->first = the_end; /* all other parts may be missing */ ptr_atoken->ptr_middlelist = malloc(sizeof(Lilistring)); if (!ptr_atoken->ptr_middlelist) { return NULL; } ptr_atoken->ptr_middlelist->ptr_next = NULL; middle = the_end; ptr_atoken->lineage = the_end; if ((term = strchr(author, (int)',')) != NULL) { *term = '\0'; ptr_atoken->first = term+1; /* first check for a suffix, starting after a second comma */ if ((suffix = strchr(ptr_atoken->first, (int)',')) != NULL) { *suffix = '\0'; ptr_atoken->lineage = suffix+1; while (*(ptr_atoken->lineage) == ' ') { ptr_atoken->lineage++; } } else { suffix = the_end; } /* suffix now points to the end of the name proper */ if (*(ptr_atoken->first)) { /* string doesn't end here */ /* skip leading spaces */ while (*(ptr_atoken->first) == ' ') { ptr_atoken->first++; } /* now there's three options: - the next char is the first initial, followed by a period - the next char is the first initial of a hyphenated double name - the next word is the full first name */ if (*(ptr_atoken->first + 1) == '.') { if (*(ptr_atoken->first + 2) == '-') { /* now we've got to find the end of the hyphenated name, remove the periods, and terminate the string appropriately */ middle = ptr_atoken->first + 3; while (*middle && *middle != ' ') { middle++; } if (*(middle-1) == '.') { *(middle-1) = '\0'; } else if (*middle == ' ') { *middle = '\0'; middle++; } memmove(ptr_atoken->first + 1, ptr_atoken->first + 2, strlen(ptr_atoken->first + 2)+1); } else { *(ptr_atoken->first + 1) = '\0'; middle = ptr_atoken->first + 2; } } else if (*(ptr_atoken->first + 1)) { /* string doesn't end here */ /* got a full first name, search for end of word */ term = ptr_atoken->first + 1; while (*term && *term != ' ') { /* we don't have to check for a comma as the suffix comma was already replaced by \0 if there was one */ term++; } if (*term) { /* found space */ *term = '\0'; middle = term + 1; } /* else: no middle name */ } if (*middle) { char* next_middle; while (middle < suffix) { /* skip leading spaces */ while (*middle == ' ') { middle++; } /* middle name could be abbreviated, so look for a dot */ if (*(middle + 1) == '.') { if (*(middle + 2) == '-') { /* now we've got to find the end of the hyphenated name, remove the periods, and terminate the string appropriately */ next_middle = middle + 3; while (*next_middle && *next_middle != ' ') { next_middle++; } if (*(next_middle-1) == '.') { *(next_middle-1) = '\0'; } else if (*next_middle == ' ') { *next_middle = '\0'; next_middle++; } memmove(middle + 1, middle + 2, strlen(middle + 2)+1); } else { *(middle + 1) = '\0'; next_middle = middle + 2; } } else { next_middle = middle; while (*next_middle && *next_middle != ' ') { next_middle++; } if (*next_middle == ' ') { *next_middle = '\0'; next_middle++; } } if (middle < suffix && *middle) { if (append_lilistring(ptr_atoken->ptr_middlelist, middle)) { return NULL; } } middle = next_middle; } } /* else: there was only a first initial */ } else { ptr_atoken->first = the_end; /* no firstname in spite of comma */ } } /* else: some cultures like India use only one name, so lastname is all we have */ /* we strip whitespace only at the ends, the starts have been taken care of before */ if (*(ptr_atoken->sur)) { stripwhite(ptr_atoken->sur, 2, 0); } if (*(ptr_atoken->first)) { stripwhite(ptr_atoken->first, 2, 0); } if (*(ptr_atoken->lineage)) { stripwhite(ptr_atoken->lineage, 2, 0); } return ptr_atoken->sur; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ clean_authortokens(): takes care of memory cleanup after a tokenized author is no longer used void clean_authortokens returns nothing struct AUTHORTOKENS* ptr_atoken ptr to a struct which holds the the ptrs to the author name parts ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ void clean_authortokens(struct AUTHORTOKENS* ptr_atoken) { if (ptr_atoken->ptr_middlelist) { delete_all_lilistring(ptr_atoken->ptr_middlelist); free(ptr_atoken->ptr_middlelist); ptr_atoken->ptr_middlelist = NULL; } return; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ string_tokenize_lili(): splits a string containing whitespace-separated numbers into tokens and stashes them into a linked list. Numeric ranges are expanded, non-number tokens are ignored. This implementation relies on the fact that all printable characters except the space have ASCII values 33 and up. The tokens are assumed to be separated by whitespace, which is \t (9), \n (10), \r (13), SPC (32). Do not use this function where this coarse separation is not sufficient int string_tokenize returns 0 if successful, 1 if out of memory, 2 if string empty Lilid *ptr_first ptr to the sentinel of a linked list that will store the numbers char *inbuffer buffer holding the string. This buffer will be modified while parsing, so keep a copy before you call this function if you need the original afterwards ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int string_tokenize_lili(Lilid *ptr_first, char *inbuffer) { int retval = -1; int num_tokens = 0; unsigned long long n_rangestart; unsigned long long n_rangeend; unsigned long long ulonglong_i; char *token; char *token_start; char *eof_string; char *rangesep; token = inbuffer; eof_string = &inbuffer[strlen(inbuffer)]; /* points to the terminating \0 */ while(retval < 0) { /* search for the start of a token */ while (*token < 33 && token < eof_string) { /* all whitespace has ASCII values 32 or less */ token++; } if (token == eof_string){ if (num_tokens) { return 0; } else { return 2; } } /* we obviously are at the start of a token. Add to list */ token_start = token; num_tokens++; /* printf("%s\n", start_token); */ /* Look for the end */ while (*token > 32 && token < eof_string) { token++; } if (token == eof_string){ if (num_tokens) { retval = 0; } else { /* well, this should never happen */ retval = 2; } } else { *token = '\0'; /* terminate token */ token++; } /* see whether token is a range */ if ((rangesep = strchr(token_start, (int)'-')) != NULL) { *rangesep = '\0'; n_rangestart = atoll(token_start); n_rangeend = atoll(rangesep+1); if (n_rangestart && n_rangeend) { for (ulonglong_i = n_rangestart+1; ulonglong_i <= n_rangeend; ulonglong_i++) { if (insert_lilid(ptr_first, ulonglong_i)) { return 1; /* out of memory */ } } } } /* reuse ulonglong_i */ ulonglong_i = atoll(token_start); if (ulonglong_i) { if (insert_lilid(ptr_first, ulonglong_i)) { return 1; /* out of memory */ } } } /* end while */ return retval; } refdb-1.0.2/src/readris.c000755 001750 001750 00000045331 12255427652 016051 0ustar00markusmarkus000000 000000 /* readris.c: functions to read RIS datasets */ /* markus@mhoenicka.de 3-11-00 */ /* 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ #include #include #include #include #include #include #include #include "refdb.h" #include "connect.h" #include "readris.h" #include "strfncs.h" #include "linklist.h" #include "tokenize.h" #define RIS_LINE_SIZE 16384 #define FILE_CHUNK_SIZE 4096 /* forward declarations of local functions */ static int wrap_citation(char* inbuffer, char** ptr_buffer, size_t *ptr_bufsize); /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ read_ris_set(): reads a dataset in RIS format from a file int read_ris_set returns 0 if failed, 1 if complete set was read, 2 if end of file was reached FILE* fp a file pointer to the file containing the dataset char* deffile the name of a file containing default RIS fields those fields will be appended unless deffile is an empty string char** ptr_inbuffer a pointer to a pointer to a buffer allocated with malloc(). The calling function is responsible for freeing the buffer after use. *ptr_inbuffer will be modified by the function size_t* bufsize a pointer to a variable which receives the buffer size *bufsize will be modified by the function int pull_in_default this should always be 0. the fn calls itself with this parameter set to 1. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int read_ris_set(FILE* fp, char* deffile, char** ptr_inbuffer, size_t* ptr_inbufsize, int pull_in_default) { int setdone = 0; int filedone = 0; size_t len_homedefault; char* linebuffer; char* result; char* newinbuf; char homedefault[_POSIX_PATH_MAX+1]; FILE* default_fp = NULL; if (deffile != NULL && *deffile) { default_fp = fopen(deffile, "rb"); if (default_fp == NULL) { strcpy(homedefault, getenv("HOME")); strcat(homedefault, "/"); len_homedefault = strlen(homedefault); strncpy(&homedefault[len_homedefault], deffile, _POSIX_PATH_MAX - len_homedefault); /* strcat(homedefault, deffile); */ default_fp = fopen(homedefault, "rb"); /* we ignore that this might fail too - the function will then proceed without the defaults */ if (default_fp == NULL) { return 0; } } } linebuffer = malloc(RIS_LINE_SIZE); if (linebuffer == NULL) { return 0; } /* pretend we start with a newline */ *linebuffer = '\n'; /* read first line and make sure that its an empty line, otherwise the dataset is no real RIS dataset */ /* NB I've disabled this check to simplify adding datasets from a GUI */ /* result = fgets(linebuffer, RIS_LINE_SIZE, fp); */ /* if (result == NULL && errno != EOF) { */ /* free(linebuffer); */ /* return 2; /\* (0) somehow there is no EOF at end of file ?? *\/ */ /* } */ /* if (result == NULL && errno == EOF) { */ /* free(linebuffer); */ /* return 2; /\* end of file *\/ */ /* } */ /* else if (!(*linebuffer == '\n' || (*linebuffer == '\r' && linebuffer[1] == '\n'))) { */ /* free(linebuffer); */ /* return 0; /\* file doesn't start with empty line *\/ */ /* } */ /* remove any additional empty lines */ while (*linebuffer == '\n' || (*linebuffer == '\r' && linebuffer[1] == '\n')) { result = fgets(linebuffer, RIS_LINE_SIZE, fp); if (result == NULL) { free(linebuffer); if (feof(fp)) { return 2; } else { return 0; } } } *ptr_inbufsize += strlen(linebuffer); newinbuf = realloc(*ptr_inbuffer, *ptr_inbufsize); if (newinbuf == NULL) { free(linebuffer); return 0; } else { *ptr_inbuffer = newinbuf; } if ((pull_in_default && strncmp(linebuffer, "TY - ", 6) != 0 && strncmp(linebuffer, "ER - ", 6) != 0) || !pull_in_default) { strcat(*ptr_inbuffer, linebuffer); } while (!setdone) { result = fgets(linebuffer, RIS_LINE_SIZE, fp); if (result == NULL && !feof(fp)) { free(linebuffer); return 0; /* filedone++; */ /* setdone++; */ } else if (result == NULL /* EOF */) { filedone++; setdone++; } else if (strncmp(linebuffer, "ER - ", 6) == 0) { /* pull in global fields if requested */ if (!pull_in_default && default_fp != NULL) { read_ris_set(default_fp, "", ptr_inbuffer, ptr_inbufsize, 1); fclose(default_fp); } setdone++; } /* remove any CR */ if ((result = strchr(linebuffer, (int)'\r')) != NULL) { *result = '\0'; } if ((pull_in_default && strncmp(linebuffer, "TY - ", 6) != 0 && strncmp(linebuffer, "ER - ", 6) != 0) || !pull_in_default) { *ptr_inbufsize += strlen(linebuffer); newinbuf = realloc(*ptr_inbuffer, *ptr_inbufsize); if (newinbuf == NULL) { free(linebuffer); return 0; } else { *ptr_inbuffer = newinbuf; } strcat(*ptr_inbuffer, linebuffer); /* printf("%s\n", linebuffer); */ } } free(linebuffer); *ptr_inbufsize += TERM_LEN; newinbuf = realloc(*ptr_inbuffer, *ptr_inbufsize); if (newinbuf == NULL) { return 0; } else { *ptr_inbuffer = newinbuf; } memset((*ptr_inbuffer) + *ptr_inbufsize - TERM_LEN, (int)'\0', TERM_LEN); if (filedone) { return 2; } else { return 1; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ add_id_from_ris(): adds the IDs from a RIS file to a provided buffer allocated with malloc() int add_id_from_ris returns 0 if successful, 1 if an error occurred or if no IDs were found FILE* infilefp ptr to an open stream with the incoming data char** ptr_buffer pointer to a buffer to which the result will be added. This pointer will be modified if it is necessary to reallocate the buffer. size_t *maxlen pointer to current length of ptr_buffer; may be modified ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int add_id_from_ris(FILE* infilefp, char** ptr_buffer, size_t *ptr_bufsize) { char* linebuffer; char* read_result; char* the_end; char* new_buffer; size_t buflen = 0; linebuffer = malloc((size_t)RIS_LINE_SIZE+1); /* we append a space */ if (linebuffer == NULL) { return 1; } /* loop over all lines in the file */ do { read_result = fgets(linebuffer, RIS_LINE_SIZE, infilefp); if (read_result != NULL) { /* see if its a line with ID and if we've got enough space left */ if (strncmp(read_result, "ID - ", 6) == 0) { /* terminate the string at the first \n or \r, if any */ the_end = read_result+6; while (*the_end != '\0') { if (*the_end == '\r' || *the_end == '\n') { *the_end = '\0'; break; } the_end++; } strcat(read_result, " "); if ((new_buffer = mstrcat(*ptr_buffer, read_result+6, ptr_bufsize, 0)) == NULL) { free(linebuffer); return 1; } else { *ptr_buffer = new_buffer; } buflen += strlen(*ptr_buffer); } } } while (read_result != NULL); free(linebuffer); if (buflen) { return 0; } else { /* no IDs found */ return 1; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ add_id_from_aux(): adds the IDs from an .aux file to a provided buffer allocated with malloc(). The result will be a whitespace-separated list int add_id_from_aux returns 0 if successful, 1 if no IDs were found, 2 if a memory problem occurred FILE* infilefp ptr to an open stream with the incoming data char** ptr_buffer pointer to a buffer to which the result will be added. This pointer will be modified if it is necessary to reallocate the ptr_buffer. size_t *ptr_bufsize pointer to current length of ptr_buffer; may be modified ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int add_id_from_aux(FILE* infilefp, char** ptr_buffer, size_t *ptr_bufsize) { char* linebuffer; char* read_result; int n_eof = 0; int n_have_id = 0; int n_result; linebuffer = malloc((size_t)RIS_LINE_SIZE+1); /* we append a space */ if (linebuffer == NULL) { return 1; } /* loop over all lines in the file */ while (!n_eof) { if ((read_result = fgets(linebuffer, RIS_LINE_SIZE, infilefp)) == NULL) { n_eof = 1; } else { if (!strncmp(linebuffer, "\\citation{", 10)) { n_result = wrap_citation(linebuffer, ptr_buffer, ptr_bufsize); if (n_result == 0) { n_have_id = 1; } else if (n_result == 2) { return 2; } /* else: improper ID, just ignore this */ } } } free(linebuffer); if (n_have_id) { (*ptr_buffer)[strlen(*ptr_buffer)-1] = '\0'; /* remove trailing comma */ return 0; } else { /* no IDs found */ return 1; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ wrap_citation(): wraps the citation ID into a whitespace-separated list static int wrap_citation returns 0 if ok, 1 if ID is malformed, 2 if a memory problem occurs char* inbuffer ptr to a string containing the citation char** ptr_buffer pointer to a buffer to which the result will be added. This pointer will be modified if it is necessary to reallocate the buffer. size_t *ptr_bufsize pointer to current length of ptr_buffer; may be modified ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int wrap_citation(char* inbuffer, char** ptr_buffer, size_t *ptr_bufsize) { char* start; char* end; char* new_buffer; if ((start = strchr(inbuffer, (int)'{')) == NULL) { fprintf(stderr, "citation without proper ID\n"); return 1; /* no ID */ } else { if (start[1] != '\0') { start = &(start[1]); } else { fprintf(stderr, "citation without proper ID\n"); return 1; /* incomplete ID string */ } } if ((end = strchr(start, (int)'}')) == NULL) { fprintf(stderr, "citation without proper ID\n"); return 1; /* incomplete ID */ } else { *end = '\0'; } /* in case of a multi-head citation, the tex citation element contains a comma-separated list of IDs. Replacing the comma with a space turns this into proper members of our whitespace-separated list */ end = start; /* reuse end */ while (*end) { if (*end == ',') { *end = ' '; } end++; } if ((new_buffer = mstrcat(*ptr_buffer, start, ptr_bufsize, 0)) == NULL) { fprintf(stderr, "out of memory\n"); return 2; } else { *ptr_buffer = new_buffer; } if ((new_buffer = mstrcat(*ptr_buffer, " ", ptr_bufsize, 0)) == NULL) { fprintf(stderr, "out of memory\n"); return 2; } else { *ptr_buffer = new_buffer; } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ read_tokens(): reads tokens from an open file. A token is a string between one or more separators on both sides. Separators are the file start, the end of file, a space, a tab, a CR, and a LF. Use it to read in whitespace-delimited lists. char* read_tokens returns NULL if an error occurs, otherwise a pointer to buffer. *buffer may get reallocated while reading the file, so it is important that after this function returns *ONLY* the return value is used to address the result and *NEVER* *buffer itself. int infilefd file descriptor of an open file with read access which contains the whitespace-delimited data to read char *buffer buffer allocated with malloc() which will received a space-separated string containing the read tokens. buffer will be reallocated as needed, therefore use *ONLY* the return value to access the data after this function returns, *NEVER* the original *buffer size_t *ptr_buffer_len pointer to a variable holding the current size of buffer. Will be modified if a realloc() is necessary ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* read_tokens(int infile_fd, char* buffer, size_t *ptr_buffer_len) { char *queue; ssize_t nread; char* token; char* next_token; char *new_buffer; char *separator; size_t token_len; int error = 0; queue = malloc((size_t)FILE_CHUNK_SIZE); if (queue == NULL) { return NULL; } do { /* loop until file is read completely */ /* read a chunk from the file */ nread = read(infile_fd, (void*)queue, FILE_CHUNK_SIZE - 1); if (nread == -1) { /* can't read from this file */ error = 1; break; } /* terminate to make a string */ queue[nread] = '\0'; next_token = queue; separator = strpbrk(next_token, " \n\r\t"); if ((separator == NULL || separator != next_token) && *ptr_buffer_len > 0) { /* eliminate the trailing space in buffer if this chunk does not start with some whitespace */ buffer[strlen(buffer) - 1] = '\0'; } do { /* loop over all tokens */ token = nstrtok(next_token, &token_len, " \n\r\t"); if (token != NULL) { token[token_len] = '\0'; /* printf("%s\n", token); */ /* append token to buffer */ if ((new_buffer = mstrcat(buffer, token, ptr_buffer_len, 0)) == NULL) { error = 1; break; } else { buffer = new_buffer; } /* append a space to the buffer */ if ((new_buffer = mstrcat(buffer, " ", ptr_buffer_len, 0)) == NULL) { error = 1; break; } else { buffer = new_buffer; } next_token = token + token_len + 1; /* printf("%s\n", buffer); */ } } while (token != NULL); } while (nread > 0 && !error); free(queue); if (error) { return NULL; } return buffer; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ risdate(): converts a RIS PY string into a year short int and an otherinfo string short int risdate returns the year or 0 if none was specified char* otherinfo_buffer will receive the other date information. Must hold up to 256 chars including the terminal \0 char* string the PY string to convert ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ short int risdate(char* otherinfo_buffer, char* string) { char* monthsep; short int year; if ((monthsep = strchr(string, (int)'/')) == NULL) { if (strlen(string) == 4) { /* have year info */ year = atoi(string); otherinfo_buffer[0] = '\0'; } else { /* no legal RIS date */ otherinfo_buffer[0] = '\0'; year = 0; } } else if (monthsep-string == 4) { /* if there is year info and more */ year = atoi(string); /* atoi should read only until the separator */ strcpy(otherinfo_buffer, string+4); } else { /* if there is no year info */ strcpy(otherinfo_buffer, string); year = 0; } return year; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ris_rpdate(): converts a RIS RP string into a status int and a date string int ris_rpdate returns -1 if an error occurred, otherwise returns the reprint status (0 = IN FILE, 1 = NOT IN FILE, 2 = ON REQUEST) char* date_buffer will receive the date. Must hold 11 chars including the terminal \0. For reprint status 0 and 1 and if an error occurred, date_buffer will be an empty string. char* rp_string the string to convert ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int ris_rpdate(char* date_buffer, char* rp_string) { int type; int provide_default = 0; char* date; char* up_string; time_t the_time; /* terminate in case we don't find a date */ date_buffer[0] = '\0'; /* need a copy for case-insensitive comparisons */ up_string = strdup(rp_string); if (up_string) { strup(up_string); if (strncmp(up_string, "IN FILE", 7) == 0) { type = 0; } else if (strncmp(up_string, "NOT IN FILE", 11) == 0) { type = 1; } else if (strncmp(up_string, "ON REQUEST", 10) == 0) { type = 2; } else { type = -1; } } else { type = -1; } free(up_string); if (type == 2) { /* on request */ if ((date = strchr(rp_string, (int)'(')) == NULL) { provide_default++; } else if (date[3] != '/' || date[6] != '/') { provide_default++; } if (provide_default) { /* lacking a better idea, use current UTC */ time(&the_time); print_risdate(&the_time, date_buffer, 4); } else { /* this is the RIS version of the Y2K issue. Don't forget to modify this code in approx 100 years */ if (atoi(date+7) < 70) { strcpy(date_buffer, "20"); } else { strcpy(date_buffer, "19"); } strncat(date_buffer, date+7, 2); /* year */ strcat(date_buffer, "-"); strncat(date_buffer, date+1, 2); /* month */ strcat(date_buffer, "-"); strncat(date_buffer, date+4, 2); /* day */ } } return type; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ print_risdate(): prints a date given as a time_t structure into a string in YYYY-MM-DD format char* print_risdate returns a ptr to the date string time_t* date ptr to a structure containing the date/time char* datestring ptr to a buffer which will receive the output The string must hold at least 12 chars int yeardigits number of digits to print for the year ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* print_risdate(time_t* date, char* datestring, int yeardigits) { struct tm *tm_ptr; char year[16]; tm_ptr = gmtime(date); if (yeardigits == 2) { /* this is currently only used by the weird RIS output */ /* the required format is ON REQUEST (MM/DD/YY) */ sprintf(year, "%04d", tm_ptr->tm_year + 1900); sprintf(datestring, "%02d/%02d/%s", tm_ptr->tm_mon + 1, tm_ptr->tm_mday, year+2); } else { sprintf(datestring, "%04d-%02d-%02d", tm_ptr->tm_year + 1900, tm_ptr->tm_mon + 1, tm_ptr->tm_mday); } return datestring; } refdb-1.0.2/src/passwd.c000644 001750 001750 00000004725 12255427651 015717 0ustar00markusmarkus000000 000000 /*+++++++++++++++++ passwd.c - functions for reading a password securely markus@mhoenicka.de 2006-09-19 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ #include #include #include #include "refdb.h" #include "passwd.h" /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ask_for_passwd(): asks user for a password. To protect the password, the characters are not displayed on the screen while the user types them. We don't even give a hint about the length of the password by not displaying '*' for each character int ask_for_password returns 0 if ok, 1 if some error occurred char* passwd ptr to a buffer that can hold a password that is PREFS_BUF_LEN byte long. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int ask_for_passwd(char* passwd) { int done = 0; int pw_len; struct termios initialrsettings; struct termios newrsettings; /* get current settings of stdin */ tcgetattr(fileno(stdin), &initialrsettings); newrsettings = initialrsettings; newrsettings.c_lflag &= ~ECHO; /* set new attributes. TCSAFLUSH discards any previously typed stuff */ if (tcsetattr(fileno(stdin), TCSAFLUSH, &newrsettings) != 0) { fprintf(stderr, "Could not set terminal attributes\n"); return 1; } while (!done) { fprintf(stderr, "Please enter your password: "); if (fgets(passwd, PASSWD_LENGTH+1, stdin) != NULL) { done = 1; } } /* reset terminal to the previous state */ tcsetattr(fileno(stdin), TCSANOW, &initialrsettings); fprintf(stderr, "\n"); /* be paranoid */ passwd[PASSWD_LENGTH] = '\0'; /* remove newline if necessary */ pw_len = strlen(passwd)-1; if (passwd[pw_len] == '\n') { passwd[pw_len] = '\0'; } return 0; } refdb-1.0.2/src/refdba.h000755 001750 001750 00000002522 12255427652 015643 0ustar00markusmarkus000000 000000 /* refdba.h: header file for refdba.c */ /* markus@mhoenicka.de 2-10-00 */ /* $Id: refdba.h,v 1.6.2.1 2005/04/15 22:45:08 mhoenicka Exp $ */ /* 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ /* The names of functions that correspond to the commands. */ int com_adduser(char* arg); int com_addstyle(char* arg); int com_addword (char* arg); int com_confserv(char *arg); int com_createdb(char *arg); int com_deletedb(char *arg); int com_deletestyle(char *arg); int com_deleteuser(char* arg); int com_deleteword (char* arg); int com_getstyle(char* arg); int com_listuser(char* arg); int com_listword(char* arg); int com_scankw(char* arg); int com_viewstat(char *arg); /* other functions */ refdb-1.0.2/src/readln.h000755 001750 001750 00000002616 12255427652 015671 0ustar00markusmarkus000000 000000 /* readln.h: header file for readln.c */ /* markus@mhoenicka.de 2-10-00 */ /* 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ /* A structure which contains information on the commands this program can understand. */ #include #include typedef struct { char *name; /* User printable name of the function. */ Function *func; /* Function to call to do the job. */ char *doc; /* Documentation for this function. */ } COMMAND; COMMAND *thecommandlist; COMMAND *find_command(char *name, COMMAND *commands); int execute_line (char *line, COMMAND *commands); char *command_generator (char *text, int state); char **refdb_completion (char *text, int start, int end); void initialize_readline (void); refdb-1.0.2/src/page.h000755 001750 001750 00000001733 12255427652 015337 0ustar00markusmarkus000000 000000 /* page.h: header for page.c */ /* markus@mhoenicka.de 2-13-00 */ /* $Id: page.h,v 1.2 2002/12/13 20:34:50 mhoenicka Exp $ */ /* 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ FILE *openpager(char *pager); void closepager(FILE *fp); FILE *open_outfile(char *outfile, int append); void close_outfile(FILE *fp); refdb-1.0.2/src/refdb-client.h000755 001750 001750 00000004476 12255427652 016770 0ustar00markusmarkus000000 000000 /* refdb-client.h: header file for refdb-client.c */ /* markus@mhoenicka.de 3-7-00 */ /* $Id: refdb-client.h,v 1.15.2.2 2006/02/05 01:31:02 mhoenicka Exp $ */ /* 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ #ifndef REFDB_CLIENT_H #define REFDB_CLIENT_H 1 #include /* required for the FILE definition */ struct simplelistvals { int n_sockfd; /* file descriptor of the socket */ int n_file_open; /* if 1, write to outfile */ int n_file_append; /* if 1, append to outfile */ int n_pipe; /* if 1, write to pipe */ char* outbuffer; /* holds the command for the server */ char inbuffer[OUTBUF_LEN+TERM_LEN]; /* holds the reply from the server */ char* outfile; /* ptr to string with output filename */ char* outpipe; /* ptr to string with pipe command */ }; int connect_to_server(int* n_sockfd, char* server_ip, char* port_address); int init_dialog(int n_sockfd, char* passwd, char* inbuffer); int listvalue (char* arg, char* command, char* help_string, char* err_string, int n_with_summary); int getsimplelist(struct simplelistvals* slvals, int n_with_summary); int send_xml_data(FILE *infp, FILE *pagerfp, FILE *errstream, int n_sockfd, size_t* ptr_byte_written); int send_ris_data(FILE *infp, FILE *pagerfp, FILE *errstream, int n_sockfd, char** ptr_ris_set_buffer, size_t* ptr_n_setlength, int* ptr_n_setcount, char* default_ris, int n_cgi, size_t* ptr_byte_written); void pipehandler(int sig); void inthandler(int sig); char* build_batchcommand(int argc, char** argv, int optind, char* s, char* the_command); size_t read_terminated_string(struct simplelistvals* ptr_slvals, FILE* pagerfp, int* ptr_error); #endif void log_print(int priority, const char* string); refdb-1.0.2/src/client-commands.h000644 001750 001750 00000002113 12255427652 017466 0ustar00markusmarkus000000 000000 /* client-commands.h: header file for client-commands.c */ /* markus@mhoenicka.de 2001-8-26 */ /* $Id: client-commands.h,v 1.3 2002/12/13 20:34:33 mhoenicka Exp $ */ /* 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int com_help(char *arg); int com_quit(char *arg); int com_verbose(char * arg); int com_listdb(char *arg); int com_liststyle (char* arg); int com_setvalue (char* arg); int postprocess_var(const char* varname); refdb-1.0.2/src/connect.h000644 001750 001750 00000004306 12255427652 016050 0ustar00markusmarkus000000 000000 /* Declarations for connect. Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. This file is stolen and modified from Wget. 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. */ #ifndef CONNECT_H #define CONNECT_H #define REFDB_PROTOCOL_VERSION 6 /* version of the client-server dialog protocol */ #define REFDB_MIN_CLIENT_PROTOCOL 6 /* the lowest client protocol version the server will talk to */ #define REFDB_MIN_SERVER_PROTOCOL 6 /* the lowest server protocol version the client will talk to */ #define COMMAND_INBUF_LEN 4096 /* length of buffer for client -> server */ #define OUTBUF_LEN 4096 /* length of buffer for server -> client */ #define PROTOCOL_LENGTH 16 /* maximum length of protocol identifier string */ /* the length of the poly-\0 sequence used to terminate a client/server message */ #define TERM_LEN 4 /* whether or not to terminate a client/server message */ #define TERM_YES 1 #define TERM_NO 0 /* the length of the status message at the begin of each message */ #define STATUS_LEN 3 /* client/server message structure */ struct refdb_status { int n_status; char status[STATUS_LEN+1]; char msg[64]; }; /* Function declarations */ int iread (int fd, char *buf, int len); int tread (int fd, char *buf, int len); int iwrite (int fd, const char *buf, int len); int tiwrite (int fd, const char *buf, int n_term); int get_trailz(const char* buf, int numbyte); int send_status(int fd, int n_status, int n_term); int read_status(int fd); const char* get_status_msg(int n_status); const char* get_status_string(int n_status); #endif /* CONNECT_H */ refdb-1.0.2/src/tokenize.h000755 001750 001750 00000003617 12255427653 016257 0ustar00markusmarkus000000 000000 /*++++++++ tokenize.h: header file for tokenize.c markus@mhoenicka.de 2-17-00 $Id: tokenize.h,v 1.5 2003/11/04 23:41:21 mhoenicka Exp $ 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ struct SQLTOKEN { size_t length; int type; /* 0 = text, 1 = logical operator, 2 = opening bracket, */ char *next_token; /* 3 = closing bracket, 4 = field denominator */ }; struct AUTHORTOKENS { char* first; /* ptr to the first name */ /* char* middle; */ /* ptr to the middle name */ Lilistring* ptr_middlelist; /* ptr to linked list with middle names */ char* sur; /* ptr to the surname */ char* lineage; /* ptr to the lineage */ }; int cmdln_tokenize(int *inargc, char ***ptr_inargv, int inargcmax, char* inbuffer); char *sql_tokenize(char* inbuffer, struct SQLTOKEN *ptr_sqltoken); char *link_tokenize(char* inbuffer, struct SQLTOKEN *ptr_sqltoken); char* nstrtok(char* value, size_t* len, char* delim); char* ris_strtok(char* value, size_t* len, char* delim); int string_tokenize(int *inargc, char ***ptr_inargv, int inargcmax, char* inbuffer); char* tokenize_author(char* authorstring, struct AUTHORTOKENS* ptr_atoken); void clean_authortokens(struct AUTHORTOKENS* ptr_atoken); int string_tokenize_lili(Lilid *ptr_first, char *inbuffer); refdb-1.0.2/src/readris.h000755 001750 001750 00000002570 12255427652 016054 0ustar00markusmarkus000000 000000 /* readris.h: header for readris.c */ /* markus@mhoenicka.de 3-11-00 */ /* $Id: readris.h,v 1.5 2003/09/28 19:39:10 mhoenicka Exp $ */ /* 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ #define RIS_LINE_SIZE 16384 int read_ris_set(FILE* fp, char* deffile, char** ptr_inbuffer, size_t* ptr_inbufsize, int pull_in_default); int add_id_from_ris(FILE* infilefp, char** ptr_buffer, size_t *ptr_bufsize); int add_id_from_aux(FILE* infilefp, char** ptr_buffer, size_t *ptr_bufsize); char* read_tokens(int infile_fd, char* buffer, size_t *ptr_buffer_len); short int risdate(char* otherinfo_buffer, char* string); int ris_rpdate(char* date_buffer, char* rp_string); char* print_risdate(time_t* date, char* datestring, int yeardigits); refdb-1.0.2/src/passwd.h000644 001750 001750 00000001510 12255427652 015712 0ustar00markusmarkus000000 000000 /*+++++++++++++++++ passwd.h - header for passwd.h markus@mhoenicka.de 2006-09-19 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int ask_for_passwd(char* passwd); refdb-1.0.2/src/refdbc.c000755 001750 001750 00000537634 12255427652 015661 0ustar00markusmarkus000000 000000 /*+++++++++++++++++ refdbc - the refdb client console application markus@mhoenicka.de 2-10-00 $Id: refdbc.c,v 1.72.2.16 2006/02/08 20:37:20 mhoenicka Exp $ 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, see ++++++++++++++++++++++++*/ /* ToDo: several fns use an ugly hack to use cmdln_tokenize. Tidy up */ /* temporary hack to include cgi features. This should be selectable via a configure switch */ #define REFDB_CGI 1 /* general includes */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include "getopt.h" /* our own stuff */ #include "refdb.h" /* common stuff for all refdb applications*/ #include "connect.h" #include "linklist.h" /* linked list for memory handling */ #include "pref.h" /* for init file, depends on linklist.h */ #include "strfncs.h" /* for is functions */ #include "readln.h" /* readline-related stuff */ #include "page.h" /* pager functions */ #include "refdb-client.h" /* stuff common to all clients */ #include "client-commands.h" /* common interactive functions */ #include "refdbc.h" /* stuff specific to this client */ #include "readris.h" /* fncs to access RIS files */ #include "connect.h" /* modified read/write for sockets */ #include "tokenize.h" /* cuts command line into tokens */ #include "cgi.h" /* cgi related stuff */ #include "passwd.h" /* securely obtain passwords */ extern const char cs_term[]; /*+ the commands array contains the user commands, the functions called, and short explanatory messages +*/ COMMAND commands[] = { { "help", com_help, "Display this text" }, { "?", com_help, "Synonym for `help'" }, { "quit", com_quit, "Quit refdbc" }, { "addlink", com_addlink, "Link notes to references, authors etc." }, { "addnote", com_addnote, "Add notes to the database" }, { "addref", com_addref, "Add references to the database" }, { "checkref", com_checkref, "Check references" }, { "countnote", com_countnote, "Counts matching notes" }, { "countref", com_countref, "Counts matching references" }, { "deletelink", com_deletelink, "Unlink notes to references, authors etc." }, { "deletenote", com_deletenote, "Delete notes from the database" }, { "deleteref", com_deleteref, "Delete references from the database" }, { "dumpref", com_dumpref, "Remove references from your personal interest list"}, { "getas", com_getas, "Get a list of series editors" }, { "getau", com_getau, "Get a list of part authors" }, { "getax", com_getax, "Get a list of any authors/editors" }, { "geted", com_geted, "Get a list of publication authors/editors" }, { "getkw", com_getkw, "Get a list of keywords" }, { "getjf", com_getjf, "Get a list of journal names (full)" }, { "getjo", com_getjo, "Get a list of journal names (abbrev)" }, { "getj1", com_getj1, "Get a list of journal names (custom abbrev1)" }, { "getj2", com_getj2, "Get a list of journal names (custom abbrev2)" }, { "getref", com_getref, "Get a list of references" }, { "getnote", com_getnote, "Get a list of notes" }, { "listdb", com_listdb, "List databases" }, { "liststyle", com_liststyle, "List bibliography styles" }, { "pickref", com_pickref, "Add references to your personal interest list"}, { "selectdb", com_selectdb, "Select a database" }, { "set", com_setvalue, "Set new value of config variable" }, { "updatenote", com_updatenote, "Update notes in the database" }, { "updateref", com_updateref, "Update references in the database" }, { "verbose", com_verbose, "Toggle verbose mode" }, { "updatejo", com_updatejo, "Update journal name synonyms" }, { "whichdb", com_whichdb, "Show info about current database" }, { (char *)NULL, (Function *)NULL, (char *)NULL } }; /* Globals */ /*+ When non-zero, this global means the user is done using this program. +*/ int n_done; /*+ this array will hold the user preferences +*/ Prefs prefs[24] = { {"serverip", ""}, {"port", ""}, {"verbose", ""}, {"pager", ""}, {"username", ""}, {"passwd", ""}, {"defaultdb", ""}, {"pdfroot", ""}, {"timeout", ""}, {"logfile", ""}, {"logdest", ""}, {"loglevel", ""}, {"autokill", ""}, {"fields", ""}, {"cssurl", ""}, {"defaultris", ""}, {"refdblib", ""}, {"reftype", ""}, {"toencoding", ""}, {"fromencoding", ""}, {"outtype", ""}, {"check_fields", ""}, {"no_encrypt", ""}, {"", ""} }; /* these are the configurable variables with the compile-time defaults */ char server_ip[PREFS_BUF_LEN] = "127.0.0.1"; /*+ default IP address of refdbd +*/ char port_address[PREFS_BUF_LEN] = "9734"; /*+ default port address of refdbd +*/ char the_pager[PREFS_BUF_LEN] = "stdout"; /*+ default "pager" (stdout)+*/ char username[PREFS_BUF_LEN] = ""; /*+ default username (emtpy) +*/ char passwd[PREFS_BUF_LEN] = "*"; /*+ default password (ask user) +*/ char refdb_timeout[PREFS_BUF_LEN] = "180"; /*+ 180 seconds default timeout +*/ char pdfroot[PREFS_BUF_LEN] = ""; /* root path for pdf or other offprint files */ char verbose[PREFS_BUF_LEN] = "f"; /*+ 1 = verbose output, 0 = terse output +*/ char log_file[PREFS_BUF_LEN] = "/var/log/refdbc.log"; /*+ default log file +*/ char log_dest[PREFS_BUF_LEN] = "1"; /*+ default log destination (0 = stderr, 1 = syslog, 2 = log_file +*/ char log_level[PREFS_BUF_LEN] = "6"; /*+ default level up to which messages are logged (0 through 7). -1 means no logging +*/ char autokill[PREFS_BUF_LEN] = "1800"; /*+ default time in seconds until the CGI app will kill itself +*/ char default_fields[PREFS_BUF_LEN] = ""; /*+ specifies additional fields which should always be displayed +*/ char check_fields[PREFS_BUF_LEN] = ""; /*+ fields which should be checked for duplicates +*/ char css_url[PREFS_BUF_LEN] = ""; /*+ specifies URL of a css stylesheet for the getref html output +*/ char default_ris[PREFS_BUF_LEN] = ""; /*+ default ris fields used in addref +*/ char refdblib[PREFS_BUF_LEN] = ""; /*+ path to shareable files +*/ char current_db[PREFS_BUF_LEN] = ""; char fromencoding[PREFS_BUF_LEN] = ""; /*+ encoding of input +*/ char toencoding[PREFS_BUF_LEN] = ""; /*+ encoding for output +*/ char reftype[PREFS_BUF_LEN] = "ris"; /* input data type (ris|risx) */ char outtype[PREFS_BUF_LEN] = ""; /* output data type (screen|html) */ char confdir[_POSIX_PATH_MAX] = ""; /* path to the config files */ char no_encrypt[PREFS_BUF_LEN] = ""; /* do not encrypt passwords if 't' */ int main_argc = 0; /* save argc for commands in batch mode */ char **main_argv = NULL; /* save argv for commands in batch mode */ #ifdef READLINE41 char* rl_readline_name; /* name used for readline history */ #else const char* rl_readline_name; /* name used for readline history */ #endif /* READLINE41 */ char readline_name[] = "refdbc"; CPPFunction* rl_attempted_completion_function; /* ptr to completer */ int n_refdb_timeout; int n_verbose = 0; /*+ do we want logorrhoeic output? +*/ int n_broken_pipe; /*+ 1 indicates that we attempted to write to a broken pipe +*/ int n_abort_connect; /*+ 1 indicates that we want to abort a connection +*/ int n_log_dest = 1; /* destination of log output */ int n_oldlog_dest = 1; /* previous destination of log output */ int n_log_level = 0; /* level of log information that will be printed */ int n_batchmode = 0; /* 1 if we're running in batch mode */ int n_read_stdin = 0; /* if 1, data try to squeeze in at stdin */ int n_cgi = 0; /* if 1, we run as a cgi app */ unsigned int n_autokill = 1800; /* numeric version of autokill */ FILE* fp_log_file = NULL; /* ptr to log file struct */ /* prototypes of local functions */ static int addref(char *arg, int update_ref); static int addnote(char *arg, int update_note); static int addlink (int n_remove, char* arg); static int getfoo(char *arg, int type); static int getref (char* arg, int send_data); static int getnote (char* arg, int send_data); static int pickref (char* arg, int n_remove); /* static int valid_argument (char *caller, char *arg); */ /* declaration of the svn version function */ const char* svn_version(void); /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ The one and only main function int main returns 0 if successful, 1 if error int argc number of arguments char** argv ptr to array of strings with the command line arguments ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int main (int argc, char** argv) { char *line, *s; char the_opt[5]; char the_cmd[32] = ""; char delayed_cgi_errmsg[64] = ""; char* request_method; char* content_length; char* cgi_data; char* orig_cgi_data; char *the_command; char *new_the_command; size_t the_command_len = 512; size_t n_content_length; int n_opt, i, j; int n_readinit = 1; /* if 1, read config file. If 0, skip config file */ int retval = 0; FILE* errstream; #ifdef REFDB_CGI struct liliform sentinel; struct liliform* ptr_current; #endif struct sigaction act, oldact, intact, oldintact, alrm, oldalrm; /* Allow conditional parsing of the ~/.inputrc file. */ rl_readline_name = readline_name; /* look for batch command. If found, don't test for CGI environment and change -h behaviour */ for (i = 0; i < argc; i++) { if (argv[i][0] == '-' && argv[i][1] == 'C') { n_batchmode = 1; break; } } #ifdef REFDB_CGI if (!n_batchmode) { n_cgi = is_cgi(&request_method, &content_length, delayed_cgi_errmsg); /* 1 if we are running as a cgi app */ } #endif /* redirect error messages correctly */ if (n_cgi) { errstream = stdout; } else { errstream = stderr; } if ((the_command = malloc(the_command_len)) == NULL) { write_err("out of memory\n"); exit (1); } the_command[0] = '\0'; /* initialize signal handler */ n_broken_pipe = 0; n_abort_connect = 0; act.sa_handler = pipehandler; sigemptyset(&act.sa_mask); act.sa_flags = 0; intact.sa_handler = inthandler; sigemptyset(&intact.sa_mask); intact.sa_flags = 0; if (sigaction(SIGPIPE, &act, &oldact) != 0 || sigaction(SIGINT, &intact, &oldintact) != 0) { write_err("initializing signal handlers failed\n"); LOG_PRINT(LOG_ERR, "could not initialize signal handlers"); exit(1); } #ifdef REFDB_CGI if (n_cgi) { alrm.sa_handler = alrmhandler; sigemptyset(&alrm.sa_mask); alrm.sa_flags = 0; if (sigaction(SIGALRM, &alrm, &oldalrm) != 0) { write_err("initializing signal handler failed\n"); LOG_PRINT(LOG_ERR, "could not initialize signal handler"); exit(1); } } #endif /* initialize the array of preference values */ prefs[0].varvalue = server_ip; prefs[1].varvalue = port_address; prefs[2].varvalue = verbose; prefs[3].varvalue = the_pager; prefs[4].varvalue = username; prefs[5].varvalue = passwd; prefs[6].varvalue = current_db; prefs[7].varvalue = pdfroot; prefs[8].varvalue = refdb_timeout; prefs[9].varvalue = log_file; prefs[10].varvalue = log_dest; prefs[11].varvalue = log_level; prefs[12].varvalue = autokill; prefs[13].varvalue = default_fields; prefs[14].varvalue = css_url; prefs[15].varvalue = default_ris; prefs[16].varvalue = refdblib; prefs[17].varvalue = reftype; prefs[18].varvalue = toencoding; prefs[19].varvalue = fromencoding; prefs[20].varvalue = outtype; prefs[21].varvalue = check_fields; prefs[22].varvalue = no_encrypt; /* look for custom config directory */ for (i = 0; i < argc; i++) { if (argv[i][0] == '-' && argv[i][1] == 'y') { strncpy(confdir, argv[i+1], _POSIX_PATH_MAX); confdir[_POSIX_PATH_MAX] = '\0'; break; } } if (!n_cgi) { /* a slimy hack to detect the -q option before we run getopt */ for (i = 0; i < argc; i++) { if (argv[i][0] == '-' && argv[i][1] == 'q') { n_readinit = 0; break; } } if (n_readinit) { /* read config file settings */ read_prefs(prefs, "refdbcrc", 0); } /* read command line settings. These may override the config file settings */ while ((n_opt = getopt(argc, argv, "aA:b:c:C:d:e:E:f:F:g:G:hi:l:L:kn:N:o:O:p:PqQr:R:s:S:t:T:u:U:vVw:xy:")) != -1) { switch (n_opt) { case 'c': strncpy(the_pager, optarg, PREFS_BUF_LEN); the_pager[PREFS_BUF_LEN-1] = '\0'; break; case 'C': strncpy(the_cmd, optarg, 31); the_cmd[31] = '\0'; /* see whether a valid command was requested */ if (!find_command(optarg, commands)) { fprintf (stderr, "%s: No such command for refdb.\n", optarg); exit (1); } /* n_batchmode was set at startup */ break; case 'd': strncpy(current_db, optarg, PREFS_BUF_LEN); current_db[PREFS_BUF_LEN-1] = '\0'; break; case 'e': strncpy(log_dest, optarg, PREFS_BUF_LEN); log_dest[PREFS_BUF_LEN-1] = '\0'; break; case 'F': strncpy(default_fields, optarg, PREFS_BUF_LEN); default_fields[PREFS_BUF_LEN-1] = '\0'; break; case 'g': strncpy(default_ris, optarg, PREFS_BUF_LEN); default_ris[PREFS_BUF_LEN-1] = '\0'; break; case 'G': strncpy(css_url, optarg, PREFS_BUF_LEN); css_url[PREFS_BUF_LEN-1] = '\0'; break; case 'h': /* if we're running in batch mode, assume the -h option pertains to the requested command. Otherwise display the generic program help message */ if (!n_batchmode) { fprintf(stderr, "Usage: refdbc [-c pager] [-C command] [-d db] [-e logdest] [-F fields] [-G url] [-h] [-i address] [-l loglevel] [-L logfile] [-p port] [-q] [-R pdfroot] [-T time] [-u name] [-v] [-V] [-w password] [-x] [-y confdir]\nOptions: -c command line of pager\n -C run command in batch mode\n -d use database db\n -e log destination (0=stderr;1=syslog;2=custom file)\n -F additional fields in reference output\n -G URL of a css stylesheet for HTML output\n -h prints this help\n -i set server IP address\n -l set log level (0<=level<=7)\n -L full path of custom log file\n -p set server port\n -q ignore init-file\n -R set pdf root directory\n -T set timeout in seconds\n -u use this username\n -v show version information\n -V switch to verbose mode\n -w set password (use '*' to be asked interactively)\n -x do not encrypt passwords\n -y look for configuration files in confdir\n"); exit (0); } else { /* pass through the -h option to the command argument list */ if ((new_the_command = mstrcat(the_command, " -h ", &the_command_len, 0)) == NULL) { fprintf(stderr, "out of memory\n"); exit (1); } else { the_command = new_the_command; } } break; case 'i': strncpy(server_ip, optarg, PREFS_BUF_LEN); server_ip[PREFS_BUF_LEN-1] = '\0'; break; case 'l': strncpy(log_level, optarg, PREFS_BUF_LEN); log_level[PREFS_BUF_LEN-1] = '\0'; break; case 'L': strncpy(log_file, optarg, PREFS_BUF_LEN); log_file[PREFS_BUF_LEN-1] = '\0'; break; case 'p': strncpy(port_address, optarg, PREFS_BUF_LEN); port_address[PREFS_BUF_LEN-1] = '\0'; break; case 'q': n_readinit = 0; break; case 'R': strncpy(pdfroot, optarg, PREFS_BUF_LEN); pdfroot[PREFS_BUF_LEN-1] = '\0'; break; case 'T': strncpy(refdb_timeout, optarg, PREFS_BUF_LEN); refdb_timeout[PREFS_BUF_LEN-1] = '\0'; break; case 'u': strncpy(username, optarg, PREFS_BUF_LEN); username[PREFS_BUF_LEN-1] = '\0'; break; case 'v': fprintf(stderr, "refdbc %s built from svn revision %s markus@mhoenicka.de\nYou may redistribute and modify this software under the terms of the GNU General Public License.\n", VERSION, svn_version()); exit (0); break; case 'V': verbose[0] = 't'; break; case 'w': strncpy(passwd, optarg, PREFS_BUF_LEN); passwd[PREFS_BUF_LEN-1] = '\0'; break; case 'x': strcpy(no_encrypt, "t"); break; case 'y': /* do nothing, this option is used before getopt runs */ break; /* now all the options that the commands will take care of */ case 'a': /* fall through, we assemble the command string */ case 'A': case 'b': case 'E': case 'f': case 'k': case 'n': case 'N': case 'o': case 'O': case 'P': case 'Q': case 'r': case 's': case 'S': case 't': case 'U': sprintf(the_opt, " -%c ", n_opt); if ((new_the_command = mstrcat(the_command, the_opt, &the_command_len, 0)) == NULL) { fprintf(stderr, "out of memory\n"); exit (1); } else { the_command = new_the_command; } if (optarg && *optarg) { if ((new_the_command = mstrcat(the_command, optarg, &the_command_len, 0)) == NULL) { fprintf(stderr, "out of memory\n"); exit (1); } else { the_command = new_the_command; } } break; case ':': fprintf(stderr, "Usage: refdbc [-c pager] [-C command] [-d db] [-e logdest] [-F fields] [-G url] [-h] [-i address] [-l loglevel] [-L logfile] [-p port] [-q] [-R pdfroot] [-T time] [-u name] [-v] [-V] [-w password] [-x] [-y confdir]\nOptions: -c command line of pager\n -C run command in batch mode\n -d use database db\n -e log destination (0=stderr;1=syslog;2=custom file)\n -F additional fields in reference output\n -G URL of a css stylesheet for HTML output\n -h prints this help\n -i set server IP address\n -l set log level (0<=level<=7)\n -L full path of custom log file\n -p set server port\n -q ignore init-file\n -R set pdf root directory\n -T set timeout in seconds\n -u use this username\n -v show version information\n -V switch to verbose mode\n -w set password (use '*' to be asked interactively)\n -x do not encrypt passwords\n -y look for configuration files in confdir\n"); exit (1); break; case '?': fprintf(stderr, "unknown option %c: use refdbc -h to display usage\n", optopt); exit (1); break; } } } else { /* if we run as cgi */ read_prefs(prefs, "refdbcgirc", 0); } /* a smart but simple hack to hide the password in the ps ax output */ for (i = 0; i < argc; i++) { if (argv[i][0] == '-' && argv[i][1] == 'w') { j = 0; while (argv[i+1][j]) { argv[i+1][j] = 'x'; j++; } break; } } /* translate some command line settings into numeric values */ postprocess_var("loglevel"); postprocess_var("logdest"); n_oldlog_dest = n_log_dest; /* keep a backup copy if changed by set */ postprocess_var("timeout"); postprocess_var("verbose"); postprocess_var("defaultris"); #ifdef REFDB_CGI if (n_cgi) { /* no killer alarm in interactive mode */ n_autokill = (unsigned int)atoi(autokill); /* this alarm will go off after n_autokill seconds and cause the CGI app to exit as it is apparently hanging */ if (n_autokill) { alarm(n_autokill); } } #endif if (n_log_dest == 2) { /* use custom log file */ if ((fp_log_file = fopen(log_file, "ab")) == NULL) { n_log_dest = 1; /* fall back to syslog */ openlog("refdbc", LOG_PID|LOG_ODELAY, LOG_USER); LOG_PRINT(LOG_WARNING, "could not open custom log file"); } } else if (n_log_dest == 1) { /* use syslog */ openlog("refdbc", LOG_PID|LOG_ODELAY, LOG_USER); } /* now report incorrect cgi input, if any */ if (delayed_cgi_errmsg[0] && n_cgi) { LOG_PRINT(LOG_ERR, delayed_cgi_errmsg); exit(1); } /* check values */ if (postprocess_var("serverip")) { LOG_PRINT(LOG_CRIT, "incorrect IP address or hostname"); exit (1); } if (postprocess_var("port")) { LOG_PRINT(LOG_CRIT, "incorrect port"); exit (1); } /* see whether we have a username */ if (!n_cgi && postprocess_var("username")) { fprintf(stderr, "incorrect username\n"); LOG_PRINT(LOG_CRIT, "incorrect username"); exit (1); } /* see whether we need a password */ if (!n_cgi) { postprocess_var("passwd"); } if (n_cgi) { /* we're running as a cgi app */ #ifdef REFDB_CGI /* make sure the output goes to where it is supposed to */ strcpy(the_pager, "stdout"); /* initialize linked list */ sentinel.name[0] = '\0'; sentinel.value = NULL; sentinel.ptr_next = NULL; /* read string from stdin and chop it */ n_content_length = atoi(content_length); cgi_data = malloc(n_content_length + 1); if (!cgi_data) { cgi_header(CGI_PLAIN); fprintf(errstream, "out of memory\n"); LOG_PRINT(LOG_WARNING, "out of memory"); exit(1); } orig_cgi_data = malloc(n_content_length + 1); if (!orig_cgi_data) { cgi_header(CGI_PLAIN); fprintf(errstream, "out of memory\n"); LOG_PRINT(LOG_WARNING, "out of memory"); free(cgi_data); exit(1); } if (fread(cgi_data, 1, n_content_length, stdin) != n_content_length) { cgi_header(CGI_PLAIN); fprintf(errstream, "could not read cgi data\n"); free(cgi_data); free(orig_cgi_data); LOG_PRINT(LOG_ERR, "could not read cgi data"); exit(1); } cgi_data[n_content_length] = '\0'; /* convert to a C-style string */ LOG_PRINT(LOG_DEBUG, cgi_data); /* keep copy of original string as decode_cgi() will modify the latter */ strcpy(orig_cgi_data, cgi_data); if (decode_cgi(cgi_data, &sentinel)) { delete_all_liliform(&sentinel); free(cgi_data); cgi_header(CGI_PLAIN); fprintf(errstream, "could not decode cgi data\n"); LOG_PRINT(LOG_ERR, "could not decode cgi data"); exit(1); } free(cgi_data); /* look for "addformat" and decide if a converter should be run. If so, use popen and write original CGI string to the file descriptor, then exit */ ptr_current = get_liliform(&sentinel, "addformat"); if (ptr_current) { if (strcmp(ptr_current->value, "bib2ris") == 0 || strcmp(ptr_current->value, "nmed2ris") == 0 || strcmp(ptr_current->value, "med2ris.pl") == 0) { FILE* ptr_file; size_t n_byte_written; char convert_cmd[_POSIX_PATH_MAX+1] = ""; /* running the external converter requires the full path of the executable. We use the current working directory and assume that the converter binaries are in the same directory, i.e. the /cgi/bin/ directory, which is a promising assumption */ if (getcwd(convert_cmd, _POSIX_PATH_MAX+1) == NULL) { cgi_header(CGI_PLAIN); fprintf(errstream, "could not obtain path\n"); LOG_PRINT(LOG_ERR, "could not obtain path"); free(orig_cgi_data); delete_all_liliform(&sentinel); exit(1); } strncat(convert_cmd, "/", _POSIX_PATH_MAX-strlen(convert_cmd)); strncat(convert_cmd, ptr_current->value, _POSIX_PATH_MAX-strlen(convert_cmd)); /* run external app in write mode */ ptr_file = popen(convert_cmd, "w"); if (ptr_file) { LOG_PRINT(LOG_DEBUG, "write data to converter"); if ((n_byte_written = fwrite((const void*)orig_cgi_data, sizeof(char), n_content_length, ptr_file)) < n_content_length) { cgi_header(CGI_PLAIN); fprintf(errstream, "could not write to converter\n"); LOG_PRINT(LOG_ERR, "could not write to converter"); free(orig_cgi_data); pclose(ptr_file); delete_all_liliform(&sentinel); exit(1); } pclose(ptr_file); free(orig_cgi_data); delete_all_liliform(&sentinel); exit(1); } else { cgi_header(CGI_PLAIN); fprintf(errstream, "could not start %s\n", ptr_current->value); LOG_PRINT(LOG_ERR, "could not start converter"); delete_all_liliform(&sentinel); free(orig_cgi_data); exit(1); } } /* else: refuse to run anything else but our known converters */ } /* fill globals */ ptr_current = get_liliform(&sentinel, "name"); if (ptr_current) { strcpy(username, ptr_current->value); } ptr_current = get_liliform(&sentinel, "passwd"); if (ptr_current) { strcpy(passwd, ptr_current->value); } ptr_current = get_liliform(&sentinel, "database"); if (ptr_current) { strcpy(current_db, ptr_current->value); } /* #ifdef dontwantthis */ /* deduce the command that should be run */ /* the get_liliform calls will return only a ptr if the name matches and the value is not NULL, i.e. only if the variable has a value */ if (get_liliform(&sentinel, "simpquery1") || get_liliform(&sentinel, "advquery")) { retval = com_getref((char*)&sentinel); /* this nasty typecast will be reversed by the called fn */ } else if (get_nliliform(&sentinel, "editid", 6)) { retval = com_getref((char*)&sentinel); } else if (get_liliform(&sentinel, "addref")) { retval = com_addref((char*)&sentinel); } else if (get_liliform(&sentinel, "deleteref")) { retval = com_deleteref((char*)&sentinel); } else if (get_liliform(&sentinel, "updateref")) { retval = com_updateref((char*)&sentinel); } else if (get_liliform(&sentinel, "selectdb")) { retval = com_selectdb((char*)&sentinel); } else if (get_liliform(&sentinel, "pickref") || get_liliform(&sentinel, "unpickref")) { retval = com_pickref((char*)&sentinel); } else if (get_liliform(&sentinel, "dbregexp")) { retval = com_listdb((char*)&sentinel); } else if (get_liliform(&sentinel, "kajquery")) { retval = getfoo((char*)&sentinel, -1); } else { delete_all_liliform(&sentinel); cgi_header(CGI_PLAIN); fprintf(errstream, "unknown command\n"); LOG_PRINT(LOG_ERR, "unknown command"); exit(1); } /* #endif */ /* test */ /* display all name/value pairs */ /* cgi_header(CGI_PLAIN); */ /* ptr_current = sentinel.ptr_next; */ /* while (ptr_current) { */ /* printf(ptr_current->name); */ /* printf("\n"); */ /* printf(ptr_current->value); */ /* printf("\n"); */ /* ptr_current = ptr_current->ptr_next; */ /* } */ /* exit(0); */ /* end test */ /* clean up */ delete_all_liliform(&sentinel); #endif } else if (n_batchmode) { /* we're running in batch mode */ main_argv = argv; main_argc = argc; s = stripwhite (the_cmd, 0, 0); if (*s) { char* batchstring; /* s contains only the command name. For a full command line, add the remainder of the argv string array */ if ((batchstring = build_batchcommand(argc, argv, optind, s, the_command)) == NULL) { LOG_PRINT(LOG_WARNING, "out of memory"); retval = 1; } else { LOG_PRINT(LOG_DEBUG, batchstring); retval = execute_line(batchstring, commands); free(batchstring); } } } else { /* we're running in interactive mode */ if (n_verbose) { fprintf(stderr, "refdbc %s markus@mhoenicka.de\nYou may redistribute and modify this software under the terms of the GNU General Public License.\nType '?' for a command overview\n", VERSION); } if (*current_db) { com_selectdb(current_db); /* fprintf(stderr, "I will try to use\n%s\nas the current database.\n", current_db); */ LOG_PRINT(LOG_INFO, current_db); } initialize_readline (); /* Bind our completer. */ /* Loop reading and executing lines until the user quits. */ for ( ; n_done == 0; ){ line = readline ("refdbc: "); if (!line) { break; } /* Remove leading and trailing whitespace from the line. Then, if there is anything left, add it to the history list and execute it. */ s = stripwhite (line, 0, 0); if (*s) { LOG_PRINT(LOG_DEBUG, s); add_history (s); retval = execute_line (s, commands); n_abort_connect = 0; /* reset just in case Ctrl-C was not used */ n_broken_pipe = 0; /* to interrupt a stalled connection, but rather randomly */ } free (line); } } exit (retval); } /* Return non-zero if ARG is a valid argument for CALLER, else print an error message and return zero. */ /* static int valid_argument (char *caller, char *arg) */ /* { */ /* if (!arg || !*arg) */ /* { */ /* fprintf (stderr, "%s: Argument required.\n", caller); */ /* return 0; */ /* } */ /* return 1; */ /* } */ /* **************************************************************** */ /* */ /* refdbc Commands */ /* */ /* **************************************************************** */ /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ com_addref(): adds references to a database int com_addref 0 if successful, 1 on error char *arg the name of the file containing the references ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int com_addref (char* arg) { return addref(arg, 0); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ com_updateref(): updates references in a database int com_updateref 0 if successful, 1 on error char *arg the name of the file containing the references ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int com_updateref (char* arg) { return addref(arg, 1); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ com_checkref(): check references int com_checkref 0 if successful, 1 on error char *arg the name of the file containing the references ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int com_checkref (char* arg) { return addref(arg, 2); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ com_deleteref(): delete a reference int com_deleteref 0 if successful, 1 if error char *arg the spec of the reference which is to be deleted ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int com_deleteref (char* arg) { char *new_outbuffer = NULL; char cmd_buffer[OUTBUF_LEN] = ""; char inbuffer[COMMAND_INBUF_LEN] = ""; char **inargv = NULL; /* tokens of the argument */ char *newarg = NULL; char* infile = NULL; char db[DBNAME_LENGTH] = ""; char scrambled_passwd[PASSWD_LENGTH*3+1] = ""; int numbyte = 0; int inargc = 0; /* number of tokens of the argument */ int inargcmax; /* maximum number of tokens */ int n_cmdlinerror = 0; int result; int n_opt; int i; int n_read_file = 0; int cs_status; size_t outbuf_len; FILE *infilefp; FILE* errstream; struct simplelistvals slvals; struct lilimem sentinel; errstream = (n_cgi) ? stdout : stderr; sentinel.ptr_mem = NULL; sentinel.ptr_next = NULL; sentinel.varname[0] = '\0'; /* get us some buffer for output */ outbuf_len = 128; /* something to start with */ slvals.outbuffer = malloc(outbuf_len); if (slvals.outbuffer == NULL) { return 1; } slvals.outbuffer[0] = '\0'; slvals.n_file_open = 0; slvals.n_file_append = 0; slvals.n_pipe = 0; slvals.outfile = NULL; slvals.outpipe = NULL; if (insert_lilimem(&sentinel, (void**)&(slvals.outbuffer), NULL)) { return 1; } strcpy(db, current_db); /* use default db if set */ strcpy(cmd_buffer, "deleteref "); /* parse the argument. first we cut the argument into pieces with strtok, then we use getopt to interpret */ /* get a buffer to hold the tokens. Start with 10 tokens, increase in steps of 10 as needed */ inargc = 0; inargcmax = 10; inargv = malloc((size_t)inargcmax*sizeof(char*)); if (inargv == NULL) { delete_all_lilimem(&sentinel); return 1; } if (insert_lilimem(&sentinel, (void**)&inargv, NULL)) { delete_all_lilimem(&sentinel); return 1; } /* the following is a temporary hack to allow cmdln_tokenize to work */ newarg = malloc((size_t)(strlen(arg)+11)); if (newarg == NULL) { delete_all_lilimem(&sentinel); return 1; } if (insert_lilimem(&sentinel, (void**)&newarg, NULL)) { delete_all_lilimem(&sentinel); return 1; } strcpy(newarg, "deleteref "); strcat(newarg, arg); result = cmdln_tokenize(&inargc, &inargv, inargcmax, newarg); if (result == 1 || result == 2) { /* memory error */ delete_all_lilimem(&sentinel); return 1; } /* } */ /* get options */ optind = 0; while ((n_opt = getopt(inargc, inargv, "aA:c:C:d:e:E:f:F:g:G:hi:kl:L:o:O:p:Pqr:R:s:S:t:T:u:U:vVw:")) != -1) { switch(n_opt) { case 'c': /* printf("-c %s\n", optarg); */ slvals.outpipe = malloc(strlen(optarg)+1); if (slvals.outpipe == NULL) { delete_all_lilimem(&sentinel); return 0; } strcpy(slvals.outpipe, optarg); if (insert_lilimem(&sentinel, (void**)&(slvals.outpipe), NULL)) { delete_all_lilimem(&sentinel); return 1; } slvals.n_pipe = 1; break; case 'd': /* printf("-d %s\n", optarg); */ strcpy(db, optarg); /* override preset db */ break; case 'f': /* printf("-f %s\n", optarg); */ if (!strcmp(optarg, "stdin")) { n_read_stdin = 1; } else { infile = canonicalize_path(optarg); if (insert_lilimem(&sentinel, (void**)&infile, NULL)) { delete_all_lilimem(&sentinel); return 1; } n_read_file = 1; } break; case 'h': printf("Deletes the specified references from the database\nSyntax: deleteref [-c command] [-d database] [-h] [-o outfile] [-O outfile] {ID|-f infile}\nOptions: -c command pipe the output through command\n -d database specify the database to work with\n -f infile Read the reference IDs from file infile\n -h prints this mini-help\n -o outfile save the output in outfile (overwrite)\n -O outfile append the output to outfile\n All other arguments are interpreted as IDs to delete.\n"); delete_all_lilimem(&sentinel); return 0; break; case 'o': /* printf("-o %s\n", optarg); */ slvals.outfile = canonicalize_path(optarg); if (insert_lilimem(&sentinel, (void**)&(slvals.outfile), NULL)) { delete_all_lilimem(&sentinel); return 1; } slvals.n_file_open = 1; break; case 'O': /* printf("-O %s\n", optarg); */ slvals.outfile = canonicalize_path(optarg); if (insert_lilimem(&sentinel, (void**)&(slvals.outfile), NULL)) { delete_all_lilimem(&sentinel); return 1; } slvals.n_file_append = 1; break; /* now all the options that main has already taken care of */ case 'a': case 'A': case 'C': /* fall through - nothing to do */ case 'e': case 'E': case 'F': case 'g': case 'G': case 'i': case 'k': case 'l': case 'L': case 'p': case 'P': case 'q': case 'r': case 'R': case 's': case 'S': case 't': case 'T': case 'u': case 'U': case 'v': case 'V': case 'w': break; case ':': fprintf(stderr, "missing option\n"); n_cmdlinerror = 1; break; case '?': fprintf(stderr, "unknown option\n"); n_cmdlinerror = 1; break; } } /* } */ /* get arguments */ /* for (i = optind; i < inargc; i++) { */ /* printf("argument %s\n", inargv[i]); */ /* } */ if (!*db) { cgi_header(CGI_PLAIN); fprintf(errstream, "Don't know which database to use. Select one with selectdb or use the -d switch with deleteref.\n"); delete_all_lilimem(&sentinel); return 1; } if (n_cmdlinerror) { delete_all_lilimem(&sentinel); return 1; } /* try to connect to server */ if (connect_to_server(&(slvals.n_sockfd), server_ip, port_address) != 0) { delete_all_lilimem(&sentinel); return 1; } strcpy(scrambled_passwd, passwd); if (init_dialog(slvals.n_sockfd, scrambled_passwd, inbuffer)) { close(slvals.n_sockfd); delete_all_lilimem(&sentinel); return 1; } if (!n_cgi) { /* prepare data */ if (n_read_file || n_read_stdin || optind == inargc) { if (n_read_file) { if ((infilefp = fopen(infile, "rb")) == NULL) { delete_all_lilimem(&sentinel); close(slvals.n_sockfd); return 1; } } else { infilefp = stdin; n_read_stdin = 1; /* not set if optind == inargc */ } result = add_id_from_ris(infilefp, &(slvals.outbuffer), &outbuf_len); if (!n_read_stdin) { fclose(infilefp); } if (result) { delete_all_lilimem(&sentinel); close(slvals.n_sockfd); return 1; } } for (i = optind; i < inargc; i++) { if ((new_outbuffer = mstrcat(slvals.outbuffer, inargv[i], &outbuf_len, 0)) == NULL) { delete_all_lilimem(&sentinel); close(slvals.n_sockfd); return 1; } else { slvals.outbuffer = new_outbuffer; } if ((new_outbuffer = mstrcat(slvals.outbuffer, " ", &outbuf_len, 0)) == NULL) { delete_all_lilimem(&sentinel); close(slvals.n_sockfd); return 1; } else { slvals.outbuffer = new_outbuffer; } } } /* assemble command */ strcat(cmd_buffer, " -u "); strcat(cmd_buffer, username); if (strlen(passwd) > 0) { strcat(cmd_buffer, " -w "); strcat(cmd_buffer, scrambled_passwd); } strcat(cmd_buffer, " -d "); strcat(cmd_buffer, db); if (n_cgi) { strcat(cmd_buffer, " -t cgi"); /* request cgi output */ } sprintf(cmd_buffer+strlen(cmd_buffer), " %d", strlen(slvals.outbuffer)+TERM_LEN); /* printf("outbuffer went to: %s<<\n", slvals.outbuffer); */ /* send command to application server */ send_status(slvals.n_sockfd, 0, TERM_NO); numbyte = tiwrite(slvals.n_sockfd, cmd_buffer, TERM_YES); LOG_PRINT(LOG_DEBUG, cmd_buffer); if (numbyte == -1) { cgi_header(CGI_PLAIN); fprintf(errstream, "could not write to refdbd. Stop\n"); close(slvals.n_sockfd); delete_all_lilimem(&sentinel); return 1; } numbyte = 0; if ((cs_status = read_status(slvals.n_sockfd)) != 0) { fprintf(errstream, "%s\n", get_status_msg(cs_status)); close(slvals.n_sockfd); delete_all_lilimem(&sentinel); return 1; } getsimplelist(&slvals, 1); close(slvals.n_sockfd); delete_all_lilimem(&sentinel); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ com_pickref(): add references to personal interest list int com_pickref 0 if successful, 1 if error char *arg the spec of the reference which is to be deleted ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int com_pickref (char* arg) { return pickref(arg, 0); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ com_dumpref(): remove references from personal interest list int com_pickref 0 if successful, 1 if error char *arg the spec of the reference which is to be deleted ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int com_dumpref (char* arg) { return pickref(arg, 1); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ pickref(): add or remove references to/from personal interest list static int pickref 0 if successful, 1 if error char *arg the spec of the reference which is to be deleted int n_remove if 0, picks, if 1, dumps ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int pickref (char* arg, int n_remove) { char *new_outbuffer = NULL; char inbuffer[COMMAND_INBUF_LEN] = ""; char cmd_buffer[OUTBUF_LEN] = ""; char listname[PREFS_BUF_LEN] = ""; char **inargv = NULL; /* tokens of the argument */ char *newarg = NULL; char* infile = NULL; char db[DBNAME_LENGTH] = ""; char scrambled_passwd[PASSWD_LENGTH*3+1] = ""; int numbyte = 0; int inargc = 0; /* number of tokens of the argument */ int inargcmax; /* maximum number of tokens */ int n_cmdlinerror = 0; int result; int n_opt; int i; int n_read_file = 0; int cs_status; size_t outbuf_len; FILE *infilefp; FILE* errstream; struct simplelistvals slvals; struct liliform* ptr_current; struct lilimem sentinel; errstream = (n_cgi) ? stdout : stderr; sentinel.ptr_mem = NULL; sentinel.ptr_next = NULL; sentinel.varname[0] = '\0'; outbuf_len = 128; /* something to start with */ slvals.outbuffer = malloc(outbuf_len); if (slvals.outbuffer == NULL) { return 1; } slvals.outbuffer[0] = '\0'; /* terminate string */ slvals.n_file_open = 0; slvals.n_file_append = 0; slvals.n_pipe = 0; slvals.outfile = NULL; slvals.outpipe = NULL; if (insert_lilimem(&sentinel, (void**)&(slvals.outbuffer), NULL)) { return 1; } strcpy(cmd_buffer, "pickref "); strcpy(db, current_db); /* use default db if set */ if (n_cgi) { /* append the ID values of all checked references to outbuffer */ if (get_liliform((struct liliform*)arg, "unpickref") != NULL) { n_remove = 1; } ptr_current = (struct liliform*)arg; while ((ptr_current = get_nliliform(ptr_current, "pickid", 6)) != NULL) { if ((new_outbuffer = mstrcat(slvals.outbuffer, &((ptr_current->name)[6]), &outbuf_len, 0)) == NULL) { delete_all_lilimem(&sentinel); return 1; } else { slvals.outbuffer = new_outbuffer; } if ((new_outbuffer = mstrcat(slvals.outbuffer, " ", &outbuf_len, 0)) == NULL) { delete_all_lilimem(&sentinel); return 1; } else { slvals.outbuffer = new_outbuffer; } /* ptr_current = ptr_current->ptr_next; */ } } else { /* not cgi */ /* if (n_batchmode) { */ /* in batchmode, the command line is already tokenized */ /* inargc = main_argc; */ /* inargv = main_argv; */ /* } */ /* else { */ /* parse the argument. first we cut the argument into pieces with strtok, then we use getopt to interpret */ /* get a buffer to hold the tokens. Start with 10 tokens, increase in steps of 10 as needed */ inargc = 0; inargcmax = 10; inargv = malloc((size_t)inargcmax*sizeof(char*)); if (inargv == NULL) { delete_all_lilimem(&sentinel); return 1; } if (insert_lilimem(&sentinel, (void**)&inargv, NULL)) { delete_all_lilimem(&sentinel); return 1; } /* the following is a temporary hack to allow cmdln_tokenize to work */ newarg = malloc((size_t)(strlen(arg)+9)); if (newarg == NULL) { delete_all_lilimem(&sentinel); return 1; } if (insert_lilimem(&sentinel, (void**)&newarg, NULL)) { delete_all_lilimem(&sentinel); return 1; } strcpy(newarg, "pickref "); strcat(newarg, arg); result = cmdln_tokenize(&inargc, &inargv, inargcmax, newarg); if (result == 1 || result == 2) { /* memory error */ delete_all_lilimem(&sentinel); return 1; } /* } */ /* get options */ optind = 0; while ((n_opt = getopt(inargc, inargv, "aA:b:c:C:d:e:E:f:F:g:G:hi:kl:L:o:O:p:Pqr:R:s:S:t:T:u:U:vVw:")) != -1) { switch(n_opt) { case 'b': strncpy(listname, optarg, PREFS_BUF_LEN); listname[PREFS_BUF_LEN-1] = '\0'; break; case 'c': /* printf("-P %s\n", optarg); */ slvals.outpipe = malloc(strlen(optarg)+1); if (slvals.outpipe == NULL) { delete_all_lilimem(&sentinel); return 0; } strcpy(slvals.outpipe, optarg); if (insert_lilimem(&sentinel, (void**)&(slvals.outpipe), NULL)) { delete_all_lilimem(&sentinel); return 1; } slvals.n_pipe = 1; break; case 'd': /* printf("-d %s\n", optarg); */ strcpy(db, optarg); /* override preset db */ break; case 'f': /* printf("-f %s\n", optarg); */ if (!strcmp(optarg, "stdin")) { n_read_stdin = 1; } else { infile = canonicalize_path(optarg); if (insert_lilimem(&sentinel, (void**)&infile, NULL)) { delete_all_lilimem(&sentinel); return 1; } n_read_file = 1; } break; case 'h': if (n_remove) { fprintf(errstream, "Removes the specified references from your personal interest list\nSyntax: dumpref [-b listname] [-c command] [-d database] [-h] {ID|-f infile}\nOptions: -b listname specify a personal list\n -c command pipe the output through command\n -d database specify the database to work with\n -f infile Read the reference IDs from file infile\n -h prints this mini-help\n -o outfile save the output in the file outfile (overwrite)\n -O outfile append the output to the file outfile\n All other arguments are interpreted as IDs to pick or to remove.\n"); } else { fprintf(errstream, "Adds the specified references from your personal interest list\nSyntax: pickref [-b listname] [-c command] [-d database] [-h] {ID|-f infile}\nOptions: -b listname specify a personal list\n -c command pipe the output through command\n -d database specify the database to work with\n -f infile Read the reference IDs from file infile\n -h prints this mini-help\n -o outfile save the output in the file outfile (overwrite)\n -O outfile append the output to the file outfile\n All other arguments are interpreted as IDs to pick or to remove.\n"); } delete_all_lilimem(&sentinel); return 0; break; case 'o': /* printf("-o %s\n", optarg); */ slvals.outfile = canonicalize_path(optarg); if (insert_lilimem(&sentinel, (void**)&(slvals.outfile), NULL)) { delete_all_lilimem(&sentinel); return 1; } slvals.n_file_open = 1; break; case 'O': /* printf("-O %s\n", optarg); */ slvals.outfile = canonicalize_path(optarg); if (insert_lilimem(&sentinel, (void**)&(slvals.outfile), NULL)) { delete_all_lilimem(&sentinel); return 1; } slvals.n_file_append = 1; break; /* now all the options that main has already taken care of */ case 'a': case 'A': case 'C': /* fall through - nothing to do */ case 'e': case 'E': case 'F': case 'g': case 'G': case 'i': case 'k': case 'l': case 'L': case 'p': case 'P': case 'q': case 'R': case 's': case 'S': case 't': case 'T': case 'u': case 'U': case 'v': case 'V': case 'w': break; case ':': fprintf(errstream, "missing option\n"); n_cmdlinerror = 1; break; case '?': fprintf(errstream, "unknown option\n"); n_cmdlinerror = 1; break; } } } /* get arguments */ /* for (i = optind; i < inargc; i++) { */ /* printf("argument %s\n", inargv[i]); */ /* } */ if (!*db) { cgi_header(CGI_PLAIN); fprintf(errstream, "Don't know which database to use. Select one with selectdb or use the -d switch with pickref.\n"); delete_all_lilimem(&sentinel); return 1; } if (n_cmdlinerror) { delete_all_lilimem(&sentinel); return 1; } if (connect_to_server(&(slvals.n_sockfd), server_ip, port_address) != 0) { delete_all_lilimem(&sentinel); return 1; } strcpy(scrambled_passwd, passwd); if (init_dialog(slvals.n_sockfd, scrambled_passwd, inbuffer)) { close(slvals.n_sockfd); delete_all_lilimem(&sentinel); return 1; } if (!n_cgi) { /* prepare data */ if (n_read_file || n_read_stdin || optind == inargc) { if (n_read_file) { if ((infilefp = fopen(infile, "rb")) == NULL) { send_status(slvals.n_sockfd, 112, TERM_NO); delete_all_lilimem(&sentinel); close(slvals.n_sockfd); return 1; } } else { infilefp = stdin; n_read_stdin = 1; /* not set if optind == inargc */ } result = add_id_from_ris(infilefp, &(slvals.outbuffer), &outbuf_len); if (!n_read_stdin) { fclose(infilefp); } if (result) { send_status(slvals.n_sockfd, 112, TERM_NO); delete_all_lilimem(&sentinel); close(slvals.n_sockfd); return 1; } } for (i = optind; i < inargc; i++) { if ((new_outbuffer = mstrcat(slvals.outbuffer, inargv[i], &outbuf_len, 0)) == NULL) { send_status(slvals.n_sockfd, 112, TERM_NO); delete_all_lilimem(&sentinel); close(slvals.n_sockfd); return 1; } else { slvals.outbuffer = new_outbuffer; } if ((new_outbuffer = mstrcat(slvals.outbuffer, " ", &outbuf_len, 0)) == NULL) { send_status(slvals.n_sockfd, 112, TERM_NO); delete_all_lilimem(&sentinel); close(slvals.n_sockfd); return 1; } else { slvals.outbuffer = new_outbuffer; } } } /* assemble command */ strcat(cmd_buffer, " -u "); strcat(cmd_buffer, username); if (strlen(passwd) > 0) { strcat(cmd_buffer, " -w "); strcat(cmd_buffer, scrambled_passwd); } if (n_remove) { strcat(cmd_buffer, " -r"); } strcat(cmd_buffer, " -d "); strcat(cmd_buffer, db); if (n_cgi) { strcat(cmd_buffer, " -t cgi "); } if (*listname) { strcat (cmd_buffer, " -b "); strcat (cmd_buffer, listname); } sprintf(cmd_buffer+strlen(cmd_buffer), " %d", strlen(slvals.outbuffer)+TERM_LEN); /* printf("outbuffer:%s<<\ncmd_buffer:%s<<\n", outbuffer, cmd_buffer); */ /* delete_all_lilimem(&sentinel); */ /* return 0; */ /* send command to application server */ send_status(slvals.n_sockfd, 0, TERM_NO); numbyte = tiwrite(slvals.n_sockfd, cmd_buffer, TERM_YES); LOG_PRINT(LOG_DEBUG, cmd_buffer); if (numbyte == -1) { fprintf(stderr, "%s\n", get_status_msg(110)); close(slvals.n_sockfd); delete_all_lilimem(&sentinel); return 1; } numbyte = 0; /* read acknowledgement from application server */ if ((cs_status = read_status(slvals.n_sockfd)) != 0) { fprintf(errstream, "%s\n", get_status_msg(cs_status)); close(slvals.n_sockfd); delete_all_lilimem(&sentinel); return 1; } getsimplelist(&slvals, 1); close(slvals.n_sockfd); delete_all_lilimem(&sentinel); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ com_selectdb(): select a database int com_selectdb 0 if successful, 1 if error char *arg the name of the database which is to be selected ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int com_selectdb (char* arg) { char outbuffer[COMMAND_INBUF_LEN]; /* holds the command for the server */ char inbuffer[COMMAND_INBUF_LEN] = ""; struct simplelistvals slvals; char scrambled_passwd[PASSWD_LENGTH*3+1] = ""; FILE* errstream; struct liliform* ptr_current; int retval = 0; errstream = (n_cgi) ? stdout : stderr; slvals.outbuffer = outbuffer; strcpy(slvals.outbuffer, "selectdb "); slvals.n_file_open = 0; slvals.n_file_append = 0; slvals.n_pipe = 0; slvals.outfile = NULL; slvals.outpipe = NULL; if (n_batchmode) { /* this does not make sense in batch mode */ cgi_header(CGI_PLAIN); fprintf(errstream, "not a valid command in batchmode. use the -d option instead\n"); return 0; } if (strncmp(arg, "-h", 2) == 0) { cgi_header(CGI_PLAIN); fprintf(errstream, "Selects the specified database as the default database\nSyntax: selectdb [-h] {db}\nOptions: -h prints this mini-help\n"); return 0; } if (connect_to_server(&slvals.n_sockfd, server_ip, port_address) != 0) { return 1; } strcpy(scrambled_passwd, passwd); if (init_dialog(slvals.n_sockfd, scrambled_passwd, inbuffer)) { close(slvals.n_sockfd); return 1; } if (n_cgi) { if ((ptr_current = get_liliform((struct liliform*)arg, "selectdb")) != NULL) { strcat(slvals.outbuffer, ptr_current->value); } } else { strcat(slvals.outbuffer, arg); } strcat(slvals.outbuffer, " -u "); strcat(slvals.outbuffer, username); if (strlen(passwd) > 0) { strcat(slvals.outbuffer, " -w "); strcat(slvals.outbuffer, scrambled_passwd); } if (n_cgi) { strcat(slvals.outbuffer, " -t cgi"); } LOG_PRINT(LOG_DEBUG, slvals.outbuffer); if ((retval = getsimplelist(&slvals, 1)) == 0) { strcpy(current_db, arg); } close(slvals.n_sockfd); return retval; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ com_getref(): view references int com_getref 0 if successful, 1 if error char *arg the spec of the reference which are to be viewed In the case of a cgi query this ptr will be cast to struct liliform* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int com_getref (char* arg) { return getref(arg, 1); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ com_countref(): count references int com_countref 0 if successful, 1 if error char *arg the spec of the reference which are to be viewed In the case of a cgi query this ptr will be cast to struct liliform* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int com_countref (char* arg) { return getref(arg, 0); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ getref(): view or count references int getref 0 if successful, 1 if error char *arg the spec of the reference which are to be viewed In the case of a cgi query this ptr will be cast to struct liliform* int send_data if set to 1, send back references (getref) if set to 0, count references (countref) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int getref (char* arg, int send_data) { char cmd_buffer[OUTBUF_LEN] = ""; char* infile; char inbuffer[COMMAND_INBUF_LEN] = ""; char format_string[MAX_FMT_LEN] = ""; char sort_string[MAX_FMT_LEN] = ""; char db[_POSIX_PATH_MAX] = ""; char pdf_root[_POSIX_PATH_MAX] = ""; char my_toencoding[PREFS_BUF_LEN] = ""; char listname[PREFS_BUF_LEN] = ""; char limit[PREFS_BUF_LEN] = ""; char namespace[PREFS_BUF_LEN] = ""; char type_string[10] = ""; char **inargv; /* tokens of the argument */ char *newarg; char *read_result; char *new_outbuffer; char scrambled_passwd[PASSWD_LENGTH*3+1] = ""; int inargc = 0; /* number of tokens of the argument */ int inargcmax; /* maximum number of tokens */ int result; int n_frequency = 0; int i; int n_opt; int n_done; int n_read_file = 0; /* indicates -f switch */ int n_cmdlinerror = 0; int numbyte; int cs_status; size_t byte_written = 0; size_t outbuf_len; FILE* infilefp; FILE* errstream; FILE* pagerfp; /* ptr to file */ struct lilimem sentinel; struct simplelistvals slvals; errstream = (n_cgi) ? stdout : stderr; /* get us some buffer for output */ outbuf_len = 256; /* something to start with */ slvals.outbuffer = malloc(outbuf_len); if (slvals.outbuffer == NULL || insert_lilimem(&sentinel, (void**)&(slvals.outbuffer), NULL)) { free(slvals.outbuffer); return 1; } slvals.outbuffer[0] = '\0'; if (!send_data) { strcpy(cmd_buffer, "countref "); } else { strcpy(cmd_buffer, "getref "); } slvals.n_file_open = 0; slvals.n_file_append = 0; slvals.n_pipe = 0; slvals.outfile = NULL; slvals.outpipe = NULL; sentinel.ptr_mem = NULL; sentinel.ptr_next = NULL; sentinel.varname[0] = '\0'; if (*pdfroot) { strcpy(pdf_root, pdfroot); } strcpy(db, current_db); /* use default db if set */ strcpy(my_toencoding, toencoding); /* use default encoding if set */ /* get a buffer to hold the tokens. Start with 10 tokens, increase in steps of 10 as needed */ inargc = 0; inargcmax = 10; inargv = malloc((size_t)inargcmax*sizeof(char*)); if (inargv == NULL) { return 1; } if (insert_lilimem(&sentinel, (void**)&inargv, NULL)) { return 1; } /* the following is a temporary hack to allow cmdln_tokenize to work */ newarg = malloc((size_t)(strlen(arg)+8)); if (newarg == NULL) { delete_all_lilimem(&sentinel); return 1; } if (insert_lilimem(&sentinel, (void**)&newarg, NULL)) { delete_all_lilimem(&sentinel); return 1; } strcpy(newarg, "getref "); strcat(newarg, arg); result = cmdln_tokenize(&inargc, &inargv, inargcmax, newarg); if (result == 1 || result == 2) { /* memory error */ delete_all_lilimem(&sentinel); return 1; } /* } */ /* now we have the tokens nicely arranged in inargc */ /* for (i = 0; i < inargc; i++) { */ /* printf("inargv[%d]: %s\n", i, inargv[i]); */ /* } */ /* return 0; */ /* get options */ optind = 0; while ((n_opt = getopt(inargc, inargv, "aA:b:c:C:d:e:E:f:F:g:G:hi:kl:L:n:N:o:O:p:PqQr:R:s:S:t:T:u:U:vVw:")) != -1) { switch(n_opt) { case 'b': strncpy(listname, optarg, PREFS_BUF_LEN); listname[PREFS_BUF_LEN-1] = '\0'; break; case 'c': /* printf("-c %s\n", optarg); */ slvals.outpipe = malloc(strlen(optarg)+1); if (slvals.outpipe == NULL) { delete_all_lilimem(&sentinel); return 0; } strcpy(slvals.outpipe, optarg); if (insert_lilimem(&sentinel, (void**)&slvals.outpipe, NULL)) { delete_all_lilimem(&sentinel); return 1; } slvals.n_pipe = 1; break; case 'd': /* printf("-d %s\n", optarg); */ strncpy(db, optarg, _POSIX_PATH_MAX - 1); /* override preset db */ db[_POSIX_PATH_MAX-1] = '\0'; /* terminate in case string got truncated */ break; case 'E': strncpy(my_toencoding, optarg, PREFS_BUF_LEN); my_toencoding[PREFS_BUF_LEN-1] = '\0'; break; case 'f': /* printf("-f %s\n", optarg); */ if (!strcmp(optarg, "stdin")) { n_read_stdin = 1; } else { infile = canonicalize_path(optarg); if (insert_lilimem(&sentinel, (void**)&infile, NULL)) { delete_all_lilimem(&sentinel); return 1; } n_read_file = 1; } break; case 'G': strncpy(css_url, optarg, PREFS_BUF_LEN); css_url[PREFS_BUF_LEN-1] = '\0'; break; case 'h': if (!send_data) { printf("Counts the references of a database search.\nSyntax: countref [-b listname] [-c command] [-d database] [-h] [-N limit:offset] {search-string|-f infile}\nSearch-string: {:XY:{<|<=|=|~|!=|<>|!~|>|>=}{string|regexp}} [AND|OR|AND NOT] [...]\nwhere XY specifies the field to search in\nOptions: -b listname limit search to the specified personal reference list\n -c command pipe the output through command\n -d database specify the database to work with\n -h prints this mini-help\n -N limit:offset specify range of datasets\n -f infile use the saved search line in file infile\n All other arguments are interpreted as the search string.\n"); } else { printf("Displays the result of a database search.\nSyntax: getref [-b listname] [-c command] [-d database] [-E encoding] [-G cssfile] [-h] [-n namespace-prefix] [-N limit:offset] [-o outfile] [-O outfile] [-R pdfroot] [-s format] [-S tag] [-t output-format] {search-string|-f infile}\nSearch-string: {:XY:{<|<=|=|~|!=|<>|!~|>|>=}{string|regexp}} [AND|OR|AND NOT] [...]\nwhere XY specifies the field to search in\nOptions: -b listname limit search to the specified personal reference list\n -c command pipe the output through command\n -d database specify the database to work with\n -E encoding set the output character encoding\n -G cssfile specify the CSS stylesheet for (x)html output\n -h prints this mini-help\n -n namespace-prefix set optional namespace prefix for XML output\n -N limit:offset specify range of datasets\n -o outfile save the output in outfile (overwrite)\n -O outfile append the output to outfile\n -R use pdfroot as root for path of pdf files\n -s format specify fields for screen or style for DocBook output\n -S tag sort output by tag ID (default) or PY\n -t output-format display as format scrn, html, xhtml, db31, db31x, db50x, teix, ris, risx, mods or bibtex\n -f infile use the saved search line in file infile\n All other arguments are interpreted as the search string.\n"); } delete_all_lilimem(&sentinel); return 0; break; case 'n': strncpy(namespace, optarg, PREFS_BUF_LEN); namespace[PREFS_BUF_LEN-1] = '\0'; break; case 'N': strncpy(limit, optarg, PREFS_BUF_LEN); limit[PREFS_BUF_LEN-1] = '\0'; break; case 'o': /* printf("-o %s\n", optarg); */ slvals.outfile = canonicalize_path(optarg); if (insert_lilimem(&sentinel, (void**)&slvals.outfile, NULL)) { delete_all_lilimem(&sentinel); return 1; } slvals.n_file_open = 1; break; case 'O': /* printf("-O %s\n", optarg); */ slvals.outfile = canonicalize_path(optarg); if (insert_lilimem(&sentinel, (void**)&slvals.outfile, NULL)) { delete_all_lilimem(&sentinel); return 1; } slvals.n_file_append = 1; break; case 'Q': n_frequency = 1; break; case 'R': strcpy(pdf_root, optarg); break; case 's': /* printf("-s %s\n", optarg); */ strncpy(format_string, optarg, MAX_FMT_LEN - 1); format_string[MAX_FMT_LEN-1] = '\0'; /* terminate in case string got truncated */ break; case 'S': /* printf("-S %s\n", optarg); */ strncpy(sort_string, optarg, MAX_FMT_LEN - 1); sort_string[MAX_FMT_LEN-1] = '\0'; /* terminate in case string got truncated */ break; case 't': /* printf("-t %s\n", optarg); */ strncpy(type_string, optarg, 9); type_string[9] = '\0'; /* terminate in case string got truncated */ break; /* now all the options that main has already taken care of */ case 'a': /* fall through - nothing to do */ case 'A': case 'C': case 'e': case 'F': case 'g': case 'i': case 'k': case 'l': case 'L': case 'p': case 'P': case 'q': case 'r': case 'T': case 'u': case 'U': case 'v': case 'V': case 'w': break; case ':': fprintf(stderr, "missing option\n"); n_cmdlinerror = 1; break; case '?': fprintf(stderr, "unknown option\n"); n_cmdlinerror = 1; break; } } /* get arguments */ /* for (i = optind; i < inargc; i++) { */ /* printf("argument %s\n", inargv[i]); */ /* } */ if (!*db) { cgi_header(CGI_PLAIN); fprintf(errstream, "Don't know which database to use. Select one with selectdb or use the -d switch with getref.Stop.\n"); delete_all_lilimem(&sentinel); return 1; } if (n_cmdlinerror) { delete_all_lilimem(&sentinel); return 1; } if (connect_to_server(&slvals.n_sockfd, server_ip, port_address) != 0) { delete_all_lilimem(&sentinel); return 1; } strcpy(scrambled_passwd, passwd); if (init_dialog(slvals.n_sockfd, scrambled_passwd, inbuffer)) { delete_all_lilimem(&sentinel); close(slvals.n_sockfd); return 1; } /* todo: read securely from a file without buffer overflows resize string as needed */ if (n_read_file || n_read_stdin || optind == inargc) { char filebuffer[COMMAND_INBUF_LEN]; if (n_read_file) { infilefp = fopen(infile, "rb"); if (infilefp == NULL) { send_status(slvals.n_sockfd, 112, TERM_NO); delete_all_lilimem(&sentinel); close(slvals.n_sockfd); return 1; } } else { infilefp = stdin; /* stdin is already open */ n_read_stdin = 1; /* not set if optind == inargc */ } while ((read_result = fgets(filebuffer, COMMAND_INBUF_LEN, infilefp)) != NULL) { if ((new_outbuffer = mstrcat(slvals.outbuffer, filebuffer, &outbuf_len, 0)) == NULL) { delete_all_lilimem(&sentinel); close(slvals.n_sockfd); if (!n_read_stdin) { /* don't close stdin */ fclose(infilefp); } return 1; } else { slvals.outbuffer = new_outbuffer; } } if (ferror(infilefp)) { send_status(slvals.n_sockfd, 112, TERM_NO); delete_all_lilimem(&sentinel); close(slvals.n_sockfd); return 1; } if (!n_read_stdin) { /* don't close stdin */ fclose(infilefp); } } else { if (optind < inargc) { int open_quote = 0; /* printf("%d\n", optind); */ for (i = optind; i < inargc; i++) { if ((new_outbuffer = mstrcat(slvals.outbuffer, inargv[i], &outbuf_len, 0)) == NULL) { delete_all_lilimem(&sentinel); close(slvals.n_sockfd); return 1; } else { slvals.outbuffer = new_outbuffer; } if (open_quote) { if ((new_outbuffer = mstrcat(slvals.outbuffer, "\'", &outbuf_len, 0)) == NULL) { delete_all_lilimem(&sentinel); close(slvals.n_sockfd); return 1; } else { slvals.outbuffer = new_outbuffer; } open_quote--; } /* the tokenizer returns a quoted item as a separate token even if there is no space between e.g. a '=' and the quoted item. To rectify this, check whether the previous item ended with a '=' or a '~' */ if (slvals.outbuffer[strlen(slvals.outbuffer)-1] != '=' && slvals.outbuffer[strlen(slvals.outbuffer)-1] != '~') { if ((new_outbuffer = mstrcat(slvals.outbuffer, " ", &outbuf_len, 0)) == NULL) { delete_all_lilimem(&sentinel); close(slvals.n_sockfd); return 1; } else { slvals.outbuffer = new_outbuffer; } } else { /* insert a quote after the '='. This will put back the quote only for items that actually were quoted */ if ((new_outbuffer = mstrcat(slvals.outbuffer, "\'", &outbuf_len, 0)) == NULL) { delete_all_lilimem(&sentinel); close(slvals.n_sockfd); return 1; } else { slvals.outbuffer = new_outbuffer; } open_quote++; } } slvals.outbuffer[strlen(slvals.outbuffer)-1] = '\0'; /* remove trailing space */ } } /* make sure there's no newlines in the string; reuse read_result */ for (read_result = slvals.outbuffer; *read_result; read_result++) { if (*read_result == '\n' || *read_result == '\r') { *read_result = ' '; } } /* assemble command string for refdbd */ strcat(cmd_buffer, " -u "); strcat(cmd_buffer, username); if (*passwd) { strcat(cmd_buffer, " -w "); strcat(cmd_buffer, scrambled_passwd); } strcat(cmd_buffer, " -d "); strcat(cmd_buffer, db); if (*format_string || *default_fields) { strcat(cmd_buffer, " -s \""); if (*format_string) { strcat(cmd_buffer, format_string); } else { strcat(cmd_buffer, default_fields); } strcat(cmd_buffer, "\""); } if (*type_string) { strcat(cmd_buffer, " -t \""); strcat(cmd_buffer, type_string); strcat(cmd_buffer, "\""); } if (*sort_string) { strcat(cmd_buffer, " -S \""); strcat(cmd_buffer, sort_string); strcat(cmd_buffer, "\""); } if (*limit) { strcat(cmd_buffer, " -N \""); strcat(cmd_buffer, limit); strcat(cmd_buffer, "\""); } if (*namespace) { strcat(cmd_buffer, " -n \""); strcat(cmd_buffer, namespace); strcat(cmd_buffer, "\""); } if (*pdf_root) { strcat(cmd_buffer, " -R "); strcat(cmd_buffer, pdf_root); } if (*my_toencoding) { strcat(cmd_buffer, " -E "); strcat(cmd_buffer, my_toencoding); } if (*listname) { strcat(cmd_buffer, " -b "); strcat(cmd_buffer, listname); } if (*css_url) { strcat(cmd_buffer, " -G "); strcat(cmd_buffer, css_url); } if (n_frequency) { strcat(cmd_buffer, " -Q "); } sprintf(cmd_buffer+strlen(cmd_buffer), " %d", strlen(slvals.outbuffer)+TERM_LEN); LOG_PRINT(LOG_DEBUG, cmd_buffer); errstream = (n_cgi) ? stdout : stderr; send_status(slvals.n_sockfd, 0, TERM_NO); numbyte = tiwrite(slvals.n_sockfd, cmd_buffer, TERM_YES); if (numbyte == -1) { cgi_header(CGI_PLAIN); fprintf(errstream, "could not write to refdbd. Stop\n"); return 1; } numbyte = 0; if ((cs_status = read_status(slvals.n_sockfd)) != 0) { fprintf(errstream, "%s\n", get_status_msg(cs_status)); close(slvals.n_sockfd); delete_all_lilimem(&sentinel); return 1; } send_status(slvals.n_sockfd, 0, TERM_NO); numbyte = tiwrite(slvals.n_sockfd, slvals.outbuffer, TERM_YES); LOG_PRINT(LOG_DEBUG, cmd_buffer); if (numbyte == -1) { cgi_header(CGI_PLAIN); fprintf(errstream, "could not write to refdbd. Stop\n"); close(slvals.n_sockfd); delete_all_lilimem(&sentinel); return 1; } /* openpager and open_outfile are guaranteed to return a valid file/pipe - and be it stdout */ if (slvals.n_file_open) { pagerfp = open_outfile(slvals.outfile, 0); } else if (slvals.n_file_append) { pagerfp = open_outfile(slvals.outfile, 1); } else if (slvals.n_pipe) { pagerfp = openpager(slvals.outpipe); } else { pagerfp = openpager(the_pager); } n_done = 0; do { /* loop until we have all requested datasets */ int n_error; cs_status = read_status(slvals.n_sockfd); if (cs_status != 402 /* last dataset */ && cs_status != 404) { /* finished dataset */ cgi_header(CGI_PLAIN); fprintf(errstream, "%s\n", get_status_msg(cs_status)); if (slvals.n_file_open || slvals.n_file_append) { close_outfile(pagerfp); } else { closepager(pagerfp); } n_broken_pipe = 0; delete_all_lilimem(&sentinel); return 1; } if (cs_status == 402) { n_done++; } byte_written += read_terminated_string(&slvals, pagerfp, &n_error); if (n_error) { delete_all_lilimem(&sentinel); if (slvals.n_file_open || slvals.n_file_append) { close_outfile(pagerfp); } else { closepager(pagerfp); } n_broken_pipe = 0; return 1; } } while (!n_done); /* printf("trying to read summary\n"); */ /* read summary */ /* send_status(slvals.n_sockfd, 0, TERM_NO); */ cs_status = read_status(slvals.n_sockfd); if (cs_status != 0 /* success */ && cs_status != 803) { /* partial success */ cgi_header(CGI_PLAIN); fprintf(errstream, "%s\n", get_status_msg(cs_status)); delete_all_lilimem(&sentinel); return 1; } numbyte = tread(slvals.n_sockfd, slvals.inbuffer, OUTBUF_LEN); if (numbyte == -1) { fprintf(stderr, "%s\n", get_status_msg(109)); n_broken_pipe = 0; delete_all_lilimem(&sentinel); return 1; } send_status(slvals.n_sockfd, 0, TERM_NO); if (slvals.n_file_open || slvals.n_file_append) { close_outfile(pagerfp); fprintf(errstream, "%d byte written to %s\n", byte_written, slvals.outfile); } else { closepager(pagerfp); } close(slvals.n_sockfd); fprintf(errstream, "%s", slvals.inbuffer); delete_all_lilimem(&sentinel); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ com_getau(): get a list of authors int com_getau 0 if successful, 1 if error char *arg the spec of the keywords that are to be retrieved ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int com_getau (char* arg) { return getfoo(arg, GETAU); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ com_getax(): get a list of any level authors int com_getax 0 if successful, 1 if error char *arg the spec of the names that are to be retrieved ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int com_getax (char* arg) { return getfoo(arg, GETAX); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ com_geted(): get a list of editors int com_getau 0 if successful, 1 if error char *arg the spec of the keywords that are to be retrieved ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int com_geted (char* arg) { return getfoo(arg, GETED); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ com_getas(): get a list of series authors int com_getau 0 if successful, 1 if error char *arg the spec of the keywords that are to be retrieved ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int com_getas (char* arg) { return getfoo(arg, GETAS); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ com_getkw(): get a list of keywords int com_getkw 0 if successful, 1 if error char *arg the spec of the keywords that are to be retrieved ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int com_getkw (char* arg) { return getfoo(arg, GETKW); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ com_getjo(): get a list of journal names int com_getjo 0 if successful, 1 if error char *arg the spec of the journals that are to be retrieved ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int com_getjo (char* arg) { return getfoo(arg, GETJO); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ com_getjf(): get a list of journal names (full) int com_getjf 0 if successful, 1 if error char *arg the spec of the journals that are to be retrieved ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int com_getjf (char* arg) { return getfoo(arg, GETJF); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ com_getj1(): get a list of journal names (custabbrev1) int com_getj1 0 if successful, 1 if error char *arg the spec of the journals that are to be retrieved ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int com_getj1 (char* arg) { return getfoo(arg, GETJ1); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ com_getj2(): get a list of journal names (custabbrev2) int com_getj2 0 if successful, 1 if error char *arg the spec of the journals that are to be retrieved ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int com_getj2 (char* arg) { return getfoo(arg, GETJ2); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ getfoo(): get a list of authors | journals | keywords int getfoo 0 if successful, 1 if error char *arg the spec of the elements that are to be retrieved int type 0 = authors, 1 = keywords, 2 = journals, 3 = journals (full) 4 = journals (custabbrev1), 5 = journals (custabbrev2), 6 = editors, 7 = series authors, 8 = any authors ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int getfoo (char* arg, int type) { char outbuffer[COMMAND_INBUF_LEN]; /* holds the command for the server */ char outfile[_POSIX_PATH_MAX] = ""; char inbuffer[COMMAND_INBUF_LEN] = ""; char db[_POSIX_PATH_MAX] = ""; char my_toencoding[PREFS_BUF_LEN] = ""; char my_format[PREFS_BUF_LEN] = ""; char limit[PREFS_BUF_LEN] = ""; char **inargv; /* tokens of the argument */ char *newarg; char scrambled_passwd[PASSWD_LENGTH*3+1] = ""; int inargc = 0; /* number of tokens of the argument */ int inargcmax; /* maximum number of tokens */ int result; int i; int n_opt; int n_cmdlinerror = 0; int n_all = 0; /* if 1, display all synonyms of a journal search */ FILE* errstream; struct lilimem sentinel; struct simplelistvals slvals; struct liliform* ptr_current; errstream = (n_cgi) ? stdout : stderr; strcpy(db, current_db); /* use default db if set */ strcpy(my_toencoding, toencoding); /* used default encoding if set */ slvals.outbuffer = outbuffer; slvals.n_file_open = 0; slvals.n_file_append = 0; slvals.n_pipe = 0; slvals.outfile = outfile; slvals.outpipe = NULL; sentinel.ptr_mem = NULL; sentinel.ptr_next = NULL; sentinel.varname[0] = '\0'; if (n_cgi) { #ifdef REFDB_CGI ptr_current = get_liliform((struct liliform*)arg, "kajqueryfield"); if (ptr_current) { if (!strcmp(ptr_current->value, "keyword")) { strcpy(slvals.outbuffer, "getkw "); if ((ptr_current = get_liliform((struct liliform*)arg, "kajquery")) != NULL) { strcat(slvals.outbuffer, ptr_current->value); } } else if (!strcmp(ptr_current->value, "author")) { strcpy(slvals.outbuffer, "getau "); if ((ptr_current = get_liliform((struct liliform*)arg, "kajquery")) != NULL) { strcat(slvals.outbuffer, ptr_current->value); } } else if (!strcmp(ptr_current->value, "editor")) { strcpy(slvals.outbuffer, "geted "); if ((ptr_current = get_liliform((struct liliform*)arg, "kajquery")) != NULL) { strcat(slvals.outbuffer, ptr_current->value); } } else if (!strcmp(ptr_current->value, "seditor")) { strcpy(slvals.outbuffer, "getas "); if ((ptr_current = get_liliform((struct liliform*)arg, "kajquery")) != NULL) { strcat(slvals.outbuffer, ptr_current->value); } } else if (!strcmp(ptr_current->value, "journalfull")) { strcpy(slvals.outbuffer, "getjf "); if ((ptr_current = get_liliform((struct liliform*)arg, "kajquery")) != NULL) { strcat(slvals.outbuffer, ptr_current->value); } } else if (!strcmp(ptr_current->value, "journalabbrev")) { strcpy(slvals.outbuffer, "getjo "); if ((ptr_current = get_liliform((struct liliform*)arg, "kajquery")) != NULL) { strcat(slvals.outbuffer, ptr_current->value); } } else if (!strcmp(ptr_current->value, "journalcustabbrev1")) { strcpy(slvals.outbuffer, "getj1 "); if ((ptr_current = get_liliform((struct liliform*)arg, "kajquery")) != NULL) { strcat(slvals.outbuffer, ptr_current->value); } } else if (!strcmp(ptr_current->value, "journalcustabbrev2")) { strcpy(slvals.outbuffer, "getj2 "); if ((ptr_current = get_liliform((struct liliform*)arg, "kajquery")) != NULL) { strcat(slvals.outbuffer, ptr_current->value); } } } #endif } else { /* not cgi */ /* if (n_batchmode) { */ /* in batchmode, the command line is already tokenized */ /* inargc = main_argc; */ /* inargv = main_argv; */ /* } */ /* else { */ /* parse the argument. first we cut the argument into tokens, then we use getopt to interpret */ /* get a buffer to hold the tokens. Start with 10 tokens, increase in steps of 10 as needed */ inargc = 0; inargcmax = 10; inargv = malloc((size_t)inargcmax*sizeof(char*)); if (inargv == NULL) { return 1; } if (insert_lilimem(&sentinel, (void**)&inargv, NULL)) { return 1; } /* the following is a temporary hack to allow cmdln_tokenize to work */ newarg = malloc((size_t)(strlen(arg)+7)); if (newarg == NULL) { delete_all_lilimem(&sentinel); return 1; } if (insert_lilimem(&sentinel, (void**)&newarg, NULL)) { delete_all_lilimem(&sentinel); return 1; } if (type == GETKW) { strcpy(newarg, "getkw "); } else if (type == GETJO) { strcpy(newarg, "getjo "); } else if (type == GETJF) { strcpy(newarg, "getjf "); } else if (type == GETJ1) { strcpy(newarg, "getj1 "); } else if (type == GETJ2) { strcpy(newarg, "getj2 "); } else if (type == GETED) { strcpy(newarg, "geted "); } else if (type == GETAS) { strcpy(newarg, "getas "); } else if (type == GETAX) { strcpy(newarg, "getax "); } else { /* default is author */ strcpy(newarg, "getau "); } strcat(newarg, arg); result = cmdln_tokenize(&inargc, &inargv, inargcmax, newarg); if (result == 1 || result == 2) { /* memory error */ delete_all_lilimem(&sentinel); return 1; } /* } */ if (type == GETKW) { strcpy(slvals.outbuffer, "getkw "); } else if (type == GETJO) { strcpy(slvals.outbuffer, "getjo "); } else if (type == GETJF) { strcpy(slvals.outbuffer, "getjf "); } else if (type == GETJ1) { strcpy(slvals.outbuffer, "getj1 "); } else if (type == GETJ2) { strcpy(slvals.outbuffer, "getj2 "); } else if (type == GETED) { strcpy(slvals.outbuffer, "geted "); } else if (type == GETAS) { strcpy(slvals.outbuffer, "getas "); } else if (type == GETAX) { strcpy(slvals.outbuffer, "getax "); } else { /* default is author */ strcpy(slvals.outbuffer, "getau "); } /* now we have the tokens nicely arranged in inargc */ /* for (i = 0; i < inargc; i++) { */ /* printf("inargv[%d]: %s\n", i, inargv[i]); */ /* } */ /* get options */ optind = 0; while ((n_opt = getopt(inargc, inargv, "aA:c:C:d:e:E:f:F:g:G:hi:kl:L:N:o:O:p:Pqr:R:s:S:t:T:u:U:vVw:")) != -1) { switch(n_opt) { case 'a': n_all = 1; break; case 'c': /* printf("-c %s\n", optarg); */ slvals.outpipe = malloc(strlen(optarg)+1); if (slvals.outpipe == NULL) { delete_all_lilimem(&sentinel); return 0; } strcpy(slvals.outpipe, optarg); if (insert_lilimem(&sentinel, (void**)&slvals.outpipe, NULL)) { delete_all_lilimem(&sentinel); return 1; } slvals.n_pipe = 1; break; case 'd': /* printf("-d %s\n", optarg); */ strncpy(db, optarg, _POSIX_PATH_MAX-1); /* override preset db */ db[_POSIX_PATH_MAX-1] = '\0'; break; case 'E': strncpy(my_toencoding, optarg, PREFS_BUF_LEN); my_toencoding[PREFS_BUF_LEN-1] = '\0'; break; case 'h': if (type == 0 || type == 6 || type == 7) { printf("Displays the result of an author search.\nSyntax: getau [-c command] [-d database] [-h] [-N limit:offset] [-o outfile] [-O outfile] {regexp}\ngeted and getas work the same way, but return a list of editors and series authors, respectively.\nOptions: -c command pipe the output through command\n -d database specify the database to work with\n -h prints this mini-help\n -N limit:offset specify the range of datasets\n -o outfile save the output in outfile (overwrite)\n -O outfile append the output to outfile\n -s format output format (freq|relfreq)\n All other arguments are interpreted as the search string/regular expression.\n"); } else if (type == 1) { printf("Displays the result of a keyword search.\nSyntax: getkw [-c command] [-d database] [-h] [-N limit:offset] [-o outfile] [-O outfile] {regexp}\nOptions: -c command pipe the output through command\n -d database specify the database to work with\n -h prints this mini-help\n -N limit:offset specify range of datasets\n -o outfile save the output in outfile (overwrite)\n -O outfile append the output to outfile\n -s format output format (freq|relfreq)\n All other arguments are interpreted as the search string/regular expression.\n"); } else { printf("Displays the result of a journal search.\nSyntax: getjo [-a] [-c command] [-d database] [-h] [-N limit:offset] [-o outfile] [-O outfile] {regexp}\ngetjf, getj1, getj2 are used the same way, but search in full journal names, custom abbreviations1, and custom abbreviations 2, respectively\nOptions: -a list all synonyms\n -c command pipe the output through command\n -d database specify the database to work with\n -h prints this mini-help\n -N limit:offset specify range of datasets\n -o outfile save the output in outfile (overwrite)\n -O outfile append the output to outfile\n -s format output format (freq|relfreq)\n All other arguments are interpreted as the search string/regular expression.\n"); } delete_all_lilimem(&sentinel); return 0; break; case 'N': strncpy(limit, optarg, PREFS_BUF_LEN); limit[PREFS_BUF_LEN-1] = '\0'; break; case 'o': /* printf("-o %s\n", optarg); */ slvals.outfile = canonicalize_path(optarg); if (insert_lilimem(&sentinel, (void**)&(slvals.outfile), NULL)) { delete_all_lilimem(&sentinel); return 1; } slvals.n_file_open = 1; break; case 'O': /* printf("-O %s\n", optarg); */ slvals.outfile = canonicalize_path(optarg); if (insert_lilimem(&sentinel, (void**)&(slvals.outfile), NULL)) { delete_all_lilimem(&sentinel); return 1; } slvals.n_file_append = 1; break; /* now all the options that main has already taken care of */ case 's': strncpy(my_format, optarg, PREFS_BUF_LEN-1); my_format[PREFS_BUF_LEN-1] = '\0'; break; case 'A': case 'C': case 'e': /* fall through - nothing to do */ case 'f': case 'F': case 'g': case 'G': case 'i': case 'k': case 'l': case 'L': case 'p': case 'P': case 'q': case 'r': case 'R': case 'S': case 't': case 'T': case 'u': case 'U': case 'v': case 'V': case 'w': break; case ':': fprintf(stderr, "missing option\n"); n_cmdlinerror = 1; break; case '?': fprintf(stderr, "unknown option\n"); n_cmdlinerror = 1; break; } } } /* get arguments */ /* for (i = optind; i < inargc; i++) { */ /* printf("argument %s\n", inargv[i]); */ /* } */ if (!*db) { fprintf(stderr, "Don't know which database to use. Select one with selectdb or use the -d switch with getau.Stop.\n"); delete_all_lilimem(&sentinel); return 1; } if (n_cmdlinerror) { delete_all_lilimem(&sentinel); return 1; } if (connect_to_server(&slvals.n_sockfd, server_ip, port_address) != 0) { delete_all_lilimem(&sentinel); return 1; } strcpy(scrambled_passwd, passwd); if (init_dialog(slvals.n_sockfd, scrambled_passwd, inbuffer)) { close(slvals.n_sockfd); delete_all_lilimem(&sentinel); return 1; } if (!n_cgi && inargc > optind) { /* only if there are arguments */ strcat(slvals.outbuffer, "\""); /* printf("%d\n", optind); */ for (i = optind; i < inargc; i++) { strcat(slvals.outbuffer, inargv[i]); strcat(slvals.outbuffer, " "); } strcpy(&slvals.outbuffer[strlen(slvals.outbuffer)-1], "\""); /* remove trailing space */ } else if (n_cgi) { strcat(slvals.outbuffer, " -t cgi"); /* request cgi output */ } if (n_all || n_cgi) { strcat(slvals.outbuffer, " -a"); } strcat(slvals.outbuffer, " -u "); strcat(slvals.outbuffer, username); if (*passwd) { strcat(slvals.outbuffer, " -w "); strcat(slvals.outbuffer, scrambled_passwd); } if (*my_format) { strcat(slvals.outbuffer, " -s "); strcat(slvals.outbuffer, my_format); } if (*my_toencoding) { strcat(slvals.outbuffer, " -E "); strcat(slvals.outbuffer, my_toencoding); } if (*limit) { strcat(slvals.outbuffer, " -N "); strcat(slvals.outbuffer, limit); } strcat(slvals.outbuffer, " -d "); strcat(slvals.outbuffer, db); LOG_PRINT(LOG_DEBUG, slvals.outbuffer); getsimplelist(&slvals, 1); close(slvals.n_sockfd); delete_all_lilimem(&sentinel); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ addref(): adds, replaces, or checks references static int addref 0 if successful, 1 on error char *arg the name(s) of the file(s) containing the references int update_ref if 1, the references will be replaced in the db; if 0, the references will be added if 2, the references will be checked w/o adding them ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int addref (char* arg, int update_ref) { char srv_inbuffer[COMMAND_INBUF_LEN] = ""; char my_fromencoding[PREFS_BUF_LEN] = ""; char scrambled_passwd[PASSWD_LENGTH*3+1] = ""; char db[_POSIX_PATH_MAX+1] = ""; /* the database name */ char my_reftype[PREFS_BUF_LEN]; /* input data type (ris|risx) */ char my_outtype[PREFS_BUF_LEN]; /* checkref output data type (screen|html) */ char format_string[MAX_FMT_LEN] = ""; /* additional fields for output */ char check_string[MAX_FMT_LEN] = ""; /* fields to check */ char set_owner[32] = ""; char outfile[_POSIX_PATH_MAX] = ""; char *ris_set_buffer = NULL; char **inargv; /* tokens of the argument */ char *newarg = NULL; int numbyte; int numcycles; /* number of cycles reading input */ int n_read_done = 0; int n_setcount = 0; int inargc = 0; /* number of tokens of the argument */ int inargcmax; /* maximum number of tokens */ int n_opt; int n_cmdlinerror = 0; int result; int n_personal = 0; int n_keep_id = 0; /* indicates -k switch */ int n_send_result; int k; int cs_status; int n_error; int num_trailz; size_t n_setlength = 1; size_t byte_written_to_inbuffer = 0; size_t byte_written = 0; FILE *pagerfp; FILE *addresultfp; /* if using output other than screen, send addresult info here */ FILE *infp = NULL; FILE* errstream; struct simplelistvals slvals; struct lilimem sentinel; struct liliform* ptr_current; errstream = (n_cgi) ? stdout : stderr; slvals.n_file_open = 0; slvals.n_file_append = 0; slvals.n_pipe = 0; slvals.outfile = outfile; slvals.outpipe = NULL; sentinel.ptr_mem = NULL; sentinel.ptr_next = NULL; sentinel.varname[0] = '\0'; strcpy(db, current_db); /* use default db if set */ strcpy(my_reftype, reftype); strcpy(my_outtype, outtype); strcpy(my_fromencoding, fromencoding); /* use default encoding if set */ if (n_cgi) { #ifdef REFDB_CGI if (update_ref) { ptr_current = get_nliliform((struct liliform*)arg, "updateid", 8); } else { ptr_current = get_liliform((struct liliform*)arg, "addref"); } if (ptr_current != NULL) { ris_set_buffer = ptr_current->value; n_setlength = strlen(ris_set_buffer) + 1; } #endif /* REFDB_CGI */ } else { /* if not cgi */ /* parse the argument. first we cut the argument into pieces with strtok, then we use getopt to interpret */ /* get a buffer to hold the tokens. Start with 10 tokens, increase in steps of 10 as needed */ inargc = 0; inargcmax = 10; inargv = malloc((size_t)inargcmax*sizeof(char*)); if (inargv == NULL) { return 1; } if (insert_lilimem(&sentinel, (void**)&inargv, NULL)) { return 1; } /* the following is a temporary hack to allow cmdln_tokenize to work */ newarg = malloc((size_t)(strlen(arg)+8)); if (newarg == NULL) { delete_all_lilimem(&sentinel); return 1; } if (insert_lilimem(&sentinel, (void**)&newarg, NULL)) { delete_all_lilimem(&sentinel); return 1; } strcpy(newarg, "addref "); strcat(newarg, arg); result = cmdln_tokenize(&inargc, &inargv, inargcmax, newarg); if (result == 1 || result == 2) { /* memory error */ delete_all_lilimem(&sentinel); return 1; } /* } */ /* now we have the tokens nicely arranged in inargc */ /* for (i = 0; i < inargc; i++) { */ /* printf("inargv[%d]: %s\n", i, inargv[i]); */ /* } */ /* get options */ optind = 0; if (update_ref == 1) { /* updateref */ while ((n_opt = getopt(inargc, inargv, "aA:c:C:d:e:E:f:F:g:G:hi:kl:L:o:O:p:Pqr:R:s:S:t:T:u:U:vVw:")) != -1) { switch(n_opt) { case 'A': strncpy(my_reftype, optarg, PREFS_BUF_LEN - 1); my_reftype[PREFS_BUF_LEN - 1] = '\0'; break; case 'c': /* printf("-c %s\n", optarg); */ slvals.outpipe = malloc(strlen(optarg)+1); if (slvals.outpipe == NULL) { delete_all_lilimem(&sentinel); return 0; } strcpy(slvals.outpipe, optarg); if (insert_lilimem(&sentinel, (void**)&slvals.outpipe, NULL)) { delete_all_lilimem(&sentinel); return 1; } slvals.n_pipe = 1; break; case 'd': /* printf("-d %s\n", optarg); */ strncpy(db, optarg, _POSIX_PATH_MAX-1); /* override preset db */ db[_POSIX_PATH_MAX-1] = '\0'; break; case 'E': strncpy(my_fromencoding, optarg, PREFS_BUF_LEN); my_fromencoding[PREFS_BUF_LEN-1] = '\0'; break; case 'f': /* printf("-f %s\n", optarg); */ if (!strcmp(optarg, "stdin")) { n_read_stdin = 1; } break; case 'G': strncpy(css_url, optarg, PREFS_BUF_LEN); css_url[PREFS_BUF_LEN-1] = '\0'; break; case 'h': delete_all_lilimem(&sentinel); fprintf(errstream, "Replaces the specified references in the database\nSyntax: updateref [-A type] [-c command] [-d database] [-E encoding] [-h] [-o outfile] [-O outfile] [-P] [-U username] {file|-f infile}\nOptions: -A type input data type (ris|risx), ris is default\n -c command pipe the output through command\n -d database specify the database to work with\n -E encoding specify the input character encoding\n -f infile Read the names of the files with the references from file infile\n -h prints this mini-help\n -o outfile save the output in outfile (overwrite)\n -O outfile append the output to outfile\n -P update only personal information (AV, N1, RP)\n -U username specify a different username than the current user\n All other arguments are interpreted as filenames.\n"); return 0; break; case 'o': /* printf("-o %s\n", optarg); */ strncpy(slvals.outfile, optarg, _POSIX_PATH_MAX - 1); slvals.outfile[_POSIX_PATH_MAX-1] = '\0'; /* terminate in case string got truncated */ slvals.n_file_open = 1; break; case 'O': /* printf("-O %s\n", optarg); */ strncpy(slvals.outfile, optarg, _POSIX_PATH_MAX - 1); slvals.outfile[_POSIX_PATH_MAX-1] = '\0'; /* terminate in case string got truncated */ slvals.n_file_append = 1; break; case 'P': n_personal = 1; break; case 'U': /* printf("-U %s\n", optarg); */ strcpy(set_owner, optarg); break; /* now all the options that main has already taken care of */ case 'a': /* fall through - nothing to do */ case 'C': case 'e': case 'F': case 'g': case 'i': case 'k': case 'l': case 'L': case 'p': case 'q': case 'r': case 'R': case 'S': case 's': case 't': case 'T': case 'u': case 'v': case 'V': case 'w': break; case ':': fprintf(errstream, "missing option\n"); n_cmdlinerror = 1; break; case '?': fprintf(errstream, "unknown option\n"); n_cmdlinerror = 1; break; } } } else if (!update_ref) { /* addref */ while ((n_opt = getopt(inargc, inargv, "aA:c:C:d:e:E:f:F:g:G:hi:kl:L:o:O:p:Pqr:R:s:S:t:T:u:U:vVw:")) != -1) { switch(n_opt) { case 'A': strncpy(my_reftype, optarg, PREFS_BUF_LEN - 1); my_reftype[PREFS_BUF_LEN - 1] = '\0'; break; case 'c': slvals.outpipe = malloc(strlen(optarg)+1); if (slvals.outpipe == NULL) { delete_all_lilimem(&sentinel); return 0; } strcpy(slvals.outpipe, optarg); if (insert_lilimem(&sentinel, (void**)&slvals.outpipe, NULL)) { delete_all_lilimem(&sentinel); return 1; } slvals.n_pipe = 1; break; case 'd': /* printf("-d %s\n", optarg); */ strcpy(db, optarg); /* override preset db */ break; case 'E': strncpy(my_fromencoding, optarg, PREFS_BUF_LEN); my_fromencoding[PREFS_BUF_LEN-1] = '\0'; break; case 'f': /* printf("-f %s\n", optarg); */ if (!strcmp(optarg, "stdin")) { n_read_stdin = 1; } break; case 'G': strncpy(css_url, optarg, PREFS_BUF_LEN); css_url[PREFS_BUF_LEN-1] = '\0'; break; case 'h': delete_all_lilimem(&sentinel); fprintf(errstream, "Adds the specified references to the database\nSyntax: addref [-A type] [-c command] [-d database] [-E encoding] [-h] [-k] [-o outfile] [-O outfile] [-U username] {file|-f infile}\nOptions: -A type input data type (ris|risx), ris is default\n -c command pipe the output through command\n -d database specify the database to work with\n -E encoding specify the input character encoding\n -f infile Read the names of the files with the references from file infile\n -h prints this mini-help\n -k keep reference ID\n -o outfile save the output in outfile (overwrite)\n -O outfile append the output to outfile\n -U username specify a different username than the current user\n All other arguments are interpreted as filenames.\n"); return 0; break; case 'k': n_keep_id = 1; break; case 'o': /* printf("-o %s\n", optarg); */ strncpy(slvals.outfile, optarg, _POSIX_PATH_MAX - 1); slvals.outfile[_POSIX_PATH_MAX-1] = '\0'; /* terminate in case string got truncated */ slvals.n_file_open = 1; break; case 'O': /* printf("-O %s\n", optarg); */ strncpy(slvals.outfile, optarg, _POSIX_PATH_MAX - 1); slvals.outfile[_POSIX_PATH_MAX-1] = '\0'; /* terminate in case string got truncated */ slvals.n_file_append = 1; break; case 'U': /* printf("-U %s\n", optarg); */ strcpy(set_owner, optarg); break; /* now all the options that main has already taken care of */ case 'a': case 'C': /* fall through - nothing to do */ case 'e': case 'F': case 'g': case 'i': case 'l': case 'L': case 'p': case 'P': case 'q': case 'r': case 'R': case 'S': case 's': case 't': case 'T': case 'u': case 'v': case 'V': case 'w': break; case ':': fprintf(errstream, "missing option\n"); n_cmdlinerror = 1; break; case '?': fprintf(errstream, "unknown option\n"); n_cmdlinerror = 1; break; } } } else { /* checkref */ while ((n_opt = getopt(inargc, inargv, "aA:c:C:d:e:E:f:F:g:G:hi:kl:L:o:O:p:Pqr:R:s:S:t:T:u:U:vVw:")) != -1) { switch(n_opt) { case 'A': /* input data type */ strncpy(my_reftype, optarg, PREFS_BUF_LEN - 1); my_reftype[PREFS_BUF_LEN - 1] = '\0'; break; case 'c': slvals.outpipe = malloc(strlen(optarg)+1); if (slvals.outpipe == NULL) { delete_all_lilimem(&sentinel); return 0; } strcpy(slvals.outpipe, optarg); if (insert_lilimem(&sentinel, (void**)&slvals.outpipe, NULL)) { delete_all_lilimem(&sentinel); return 1; } slvals.n_pipe = 1; break; case 'd': /* printf("-d %s\n", optarg); */ strcpy(db, optarg); /* override preset db */ break; case 'E': strncpy(my_fromencoding, optarg, PREFS_BUF_LEN); my_fromencoding[PREFS_BUF_LEN-1] = '\0'; break; case 'f': /* printf("-f %s\n", optarg); */ if (!strcmp(optarg, "stdin")) { n_read_stdin = 1; } break; case 'G': strncpy(css_url, optarg, PREFS_BUF_LEN); css_url[PREFS_BUF_LEN-1] = '\0'; break; case 'h': delete_all_lilimem(&sentinel); fprintf(errstream, "Checks the specified references without adding them to the database\nSyntax: checkref [-A type] [-c command] [-d database] [-E encoding] [-G cssfile] [-h] [-k] [-o outfile] [-O outfile] [-r fieldlist] [-s fieldlist] [-t output-type] [-U username] {file|-f infile}\nOptions: -A type input data type (ris|risx), ris is default\n -c command pipe the output through command\n -d database specify the database to work with\n -E encoding specify the input character encoding\n -f infile Read the names of the files with the references from file infile\n -G cssfile select the CSS stylesheet to use with the xhtml output\n -h prints this mini-help\n -k keep reference ID\n -o outfile save the output in outfile (overwrite)\n -O outfile append the output to outfile\n -r fieldlist select fields for duplicate check\n -s fieldlist select additional fields for xhtml display\n -t output-type select output type (scrn|xhtml)\n -U username specify a different username than the current user\n All other arguments are interpreted as filenames.\n"); return 0; break; case 'k': n_keep_id = 1; break; case 'o': /* printf("-o %s\n", optarg); */ strncpy(slvals.outfile, optarg, _POSIX_PATH_MAX - 1); slvals.outfile[_POSIX_PATH_MAX-1] = '\0'; /* terminate in case string got truncated */ slvals.n_file_open = 1; break; case 'O': /* printf("-O %s\n", optarg); */ strncpy(slvals.outfile, optarg, _POSIX_PATH_MAX - 1); slvals.outfile[_POSIX_PATH_MAX-1] = '\0'; /* terminate in case string got truncated */ slvals.n_file_append = 1; break; case 'r': strncpy(check_string, optarg, MAX_FMT_LEN - 1); check_string[MAX_FMT_LEN-1] = '\0'; /* terminate in case string got truncated */ break; case 's': strncpy(format_string, optarg, MAX_FMT_LEN - 1); format_string[MAX_FMT_LEN-1] = '\0'; /* terminate in case string got truncated */ break; case 't': /* output data type */ strncpy(my_outtype, optarg, PREFS_BUF_LEN - 1); my_outtype[PREFS_BUF_LEN - 1] = '\0'; break; case 'U': /* printf("-U %s\n", optarg); */ strcpy(set_owner, optarg); break; /* now all the options that main has already taken care of */ case 'a': case 'C': /* fall through - nothing to do */ case 'e': case 'F': case 'g': case 'i': case 'l': case 'L': case 'p': case 'P': case 'q': case 'R': case 'S': case 'T': case 'u': case 'v': case 'V': case 'w': break; case ':': fprintf(errstream, "missing option\n"); n_cmdlinerror = 1; break; case '?': fprintf(errstream, "unknown option\n"); n_cmdlinerror = 1; break; } } } } /* get arguments */ /* { */ /* int i; */ /* for (i = optind; i < inargc; i++) { */ /* printf("1argument %s<<\n", inargv[i]); */ /* } */ /* } */ if (!*db) { cgi_header(CGI_PLAIN); fprintf(errstream, "Don't know which database to use. Select one with selectdb or use the -d switch with addref.Stop.\n"); delete_all_lilimem(&sentinel); return 1; } if (n_cmdlinerror) { delete_all_lilimem(&sentinel); return 1; } /* try to connect to our server */ if (connect_to_server(&slvals.n_sockfd, server_ip, port_address) != 0) { delete_all_lilimem(&sentinel); return 1; } strcpy(scrambled_passwd, passwd); if (init_dialog(slvals.n_sockfd, scrambled_passwd, srv_inbuffer)) { delete_all_lilimem(&sentinel); close(slvals.n_sockfd); return 1; } if (!n_cgi) { /* get us some memory, will be realloc'd by read_ris_set() as needed */ ris_set_buffer = malloc(1); if (insert_lilimem(&sentinel, (void**)&ris_set_buffer, NULL)) { send_status(slvals.n_sockfd, 112, TERM_NO); delete_all_lilimem(&sentinel); close(slvals.n_sockfd); return 1; } } /* and more memory for client/server communication */ slvals.outbuffer = malloc(COMMAND_INBUF_LEN); if (insert_lilimem(&sentinel, (void**)&slvals.outbuffer, NULL)) { send_status(slvals.n_sockfd, 112, TERM_NO); delete_all_lilimem(&sentinel); close(slvals.n_sockfd); return 1; } if (update_ref == 1) { strcpy(slvals.outbuffer, "updateref "); } else if (update_ref == 2) { strcpy(slvals.outbuffer, "checkref "); } else { strcpy(slvals.outbuffer, "addref "); } /* assemble and send our command */ strcat(slvals.outbuffer, " -u "); strcat(slvals.outbuffer, username); if (*passwd) { strcat(slvals.outbuffer, " -w "); strcat(slvals.outbuffer, scrambled_passwd); } strcat(slvals.outbuffer, " -d "); strcat(slvals.outbuffer, db); strcat(slvals.outbuffer, " -A "); strcat(slvals.outbuffer, my_reftype); if (*set_owner) { strcat(slvals.outbuffer, " -U "); strcat(slvals.outbuffer, set_owner); } if (*my_fromencoding) { strcat(slvals.outbuffer, " -E "); strcat(slvals.outbuffer, my_fromencoding); } if (n_personal) { strcat(slvals.outbuffer, " -p"); } if (n_keep_id) { strcat(slvals.outbuffer, " -k"); } if (*my_outtype) { strcat(slvals.outbuffer, " -t "); strcat(slvals.outbuffer, my_outtype); } if (*css_url) { strcat(slvals.outbuffer, " -G "); strcat(slvals.outbuffer, css_url); } if (*format_string || *default_fields) { strcat(slvals.outbuffer, " -s \""); if (*format_string) { strcat(slvals.outbuffer, format_string); } else { strcat(slvals.outbuffer, default_fields); } strcat(slvals.outbuffer, "\""); } if (*check_string || *check_fields) { strcat(slvals.outbuffer, " -c \""); if (*check_string) { strcat(slvals.outbuffer, check_string); } else { strcat(slvals.outbuffer, check_fields); } strcat(slvals.outbuffer, "\""); } /* free(newarg); */ /* newarg = NULL; */ LOG_PRINT(LOG_DEBUG, slvals.outbuffer); send_status(slvals.n_sockfd, 0, TERM_NO); numbyte = tiwrite(slvals.n_sockfd, slvals.outbuffer, TERM_YES); /* printf("%s\n", slvals.outbuffer); */ if (numbyte == -1) { cgi_header(CGI_PLAIN); fprintf(errstream, "could not write to refdbd. Stop\n"); delete_all_lilimem(&sentinel); close(slvals.n_sockfd); return 1; } cs_status = read_status(slvals.n_sockfd); if (cs_status == 701) { /* character conversion could not be initialized */ fprintf(errstream, "%s\n", get_status_msg(701)); } else if (cs_status) { cgi_header(CGI_PLAIN); delete_all_lilimem(&sentinel); LOG_PRINT(LOG_WARNING, get_status_msg(cs_status)); close(slvals.n_sockfd); return 1; } /* openpager is guaranteed to return a valid file/pipe - and be it stdout */ if (slvals.n_file_open) { pagerfp = open_outfile(slvals.outfile, 0); } else if (slvals.n_file_append) { pagerfp = open_outfile(slvals.outfile, 1); } else if (slvals.n_pipe) { pagerfp = openpager(slvals.outpipe); } else { pagerfp = openpager(the_pager); } if (!strcmp(my_outtype, "xhtml")) { addresultfp = stderr; } else { addresultfp = pagerfp; } if (n_read_stdin || optind == inargc) { infp = stdin; numcycles = 1; n_read_stdin = 1; /* not set if optind == inargc */ } else { numcycles = inargc-optind; } /* printf("%d\n", numcycles); */ for (k = 0; k < numcycles; k++) { if (!n_read_stdin && !n_cgi) { /* try to open our target file */ infp = fopen(inargv[optind+k], "rb"); /* printf("%s<<\n", inargv[optind+k]); */ if (infp == NULL) { continue; } } /* runs phases 1 through 4 of communication protocol */ if (!strcmp(my_reftype, "ris")) { /* printf("call send_ris_data()\n"); */ n_send_result = send_ris_data(infp, addresultfp, errstream, slvals.n_sockfd, &ris_set_buffer, &n_setlength, &n_setcount, default_ris, n_cgi, &byte_written); } else { n_send_result = send_xml_data(infp, pagerfp, errstream, slvals.n_sockfd, &byte_written); } if (n_send_result) { if (!n_read_stdin) { fclose(infp); } if (slvals.n_file_open || slvals.n_file_append) { close_outfile(pagerfp); } else { closepager(pagerfp); } delete_all_lilimem(&sentinel); close(slvals.n_sockfd); n_broken_pipe = 0; return 1; } } /* end for */ /* ------------------------------------------------------------ */ /* PHASE 5 */ /* signal server that we're done */ send_status(slvals.n_sockfd, 402, TERM_NO); /* #7 */ /* check server status, should be "chunk added successfully" */ if ((cs_status = read_status(slvals.n_sockfd)) != 403) { /* #8 */ if (cs_status == 400) { n_read_done = 0; /* retrieve server-generated error message */ do { numbyte = tread(slvals.n_sockfd, slvals.inbuffer, OUTBUF_LEN); /* printf("phase4 server reply:%s<<\n", inbuffer); */ if (numbyte == -1) { /* timeout while reading */ fprintf(stderr, "%s", get_status_msg(109)); result = 1; goto cleanup; } /* we rely on the fact that the server reply is no more than OUTBUF_LEN in length */ if ((num_trailz = get_trailz(slvals.inbuffer, numbyte)) >= TERM_LEN) { /* if transmission ends */ n_read_done++; } /* write numbyte chars to output, unless this is the last chunk: we do not want to write the terminating \0 */ if (!n_broken_pipe) { byte_written_to_inbuffer += fwrite(slvals.inbuffer, sizeof(char), numbyte-num_trailz, pagerfp); } /* printf("%s", inbuffer); */ } while (!n_read_done); result = 1; /* goto cleanup; */ } else { fprintf(stderr, "%s\n", get_status_msg(cs_status)); result = 1; goto cleanup; } } /* end if cs_status */ /* read data */ byte_written_to_inbuffer = read_terminated_string(&slvals, pagerfp, &n_error); /* read summary */ send_status(slvals.n_sockfd, 0, TERM_NO); /* #9 */ cs_status = read_status(slvals.n_sockfd); /* #10 */ if (cs_status != 0 /* success */ && cs_status != 803) { /* partial success */ cgi_header(CGI_PLAIN); fprintf(errstream, "%s", get_status_msg(cs_status)); return 1; } numbyte = tread(slvals.n_sockfd, slvals.inbuffer, OUTBUF_LEN); if (numbyte == -1) { fprintf(stderr, "could not read from refdbd. Stop\n"); n_broken_pipe = 0; return 1; } send_status(slvals.n_sockfd, 0, TERM_NO); /* #11 */ /* reset */ n_broken_pipe = 0; if (slvals.n_file_open || slvals.n_file_append) { close_outfile(pagerfp); if (update_ref == 2) { fprintf(errstream, "%d byte written to %s\n", byte_written_to_inbuffer, slvals.outfile); } else { fprintf(errstream, "%d byte written to %s\n", byte_written, slvals.outfile); } } else { closepager(pagerfp); } fprintf(errstream, "%s", slvals.inbuffer); cleanup: /* printf("%s\n", inbuffer); */ delete_all_lilimem(&sentinel); close(slvals.n_sockfd); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ com_whichdb(): displays the currently selected database int com_whichdb 0 if successful, 1 on error char *arg currently not used ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int com_whichdb (char* arg) { char outbuffer[COMMAND_INBUF_LEN]; /* holds the command for the server */ char inbuffer[COMMAND_INBUF_LEN] = ""; struct simplelistvals slvals; char scrambled_passwd[PASSWD_LENGTH*3+1] = ""; if (!*current_db) { fprintf(stderr, "No default database. Select one with selectdb. Stop.\n"); return 1; } slvals.outbuffer = outbuffer; strcpy(slvals.outbuffer, "whichdb"); slvals.n_file_open = 0; slvals.n_file_append = 0; slvals.n_pipe = 0; slvals.outfile = NULL; slvals.outpipe = NULL; if (strncmp(arg, "-h", 2) == 0) { printf("Prints the name of the current database and some database information\nSyntax: whichdb [-h]\nOptions: -h prints this mini-help\n"); return 0; } if (connect_to_server(&slvals.n_sockfd, server_ip, port_address) != 0) { return 1; } strcpy(scrambled_passwd, passwd); if (init_dialog(slvals.n_sockfd, scrambled_passwd, inbuffer)) { return 1; } strcat(slvals.outbuffer, " -d "); strcat(slvals.outbuffer, current_db); strcat(slvals.outbuffer, " -u "); strcat(slvals.outbuffer, username); if (strlen(passwd) > 0) { strcat(slvals.outbuffer, " -w "); strcat(slvals.outbuffer, scrambled_passwd); } LOG_PRINT(LOG_DEBUG, slvals.outbuffer); getsimplelist(&slvals, 1); close(slvals.n_sockfd); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ com_addnote(): adds notes to a database int com_addnote 0 if successful, 1 on error char *arg the name of the file containing the notes ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int com_addnote (char* arg) { return addnote(arg, 0); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ com_updatenote(): updates notes in a database int com_updatenote 0 if successful, 1 on error char *arg the name of the file containing the notes ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int com_updatenote (char* arg) { return addnote(arg, 1); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ addnote(): adds or replaces notes to a database static int com_addnote 0 if successful, 1 on error char *arg the name(s) of the file(s) containing the notes int update_ref if 1, the notes will be replaced in the db; if 0, the notes will be added ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int addnote (char* arg, int update_note) { int n_sockfd; /* file descriptor of the socket */ char srv_inbuffer[COMMAND_INBUF_LEN] = ""; char set_owner[32] = ""; char db[_POSIX_PATH_MAX+1] = ""; /* the database name */ char outfile[_POSIX_PATH_MAX+1] = ""; /* output filename */ char scrambled_passwd[PASSWD_LENGTH*3+1] = ""; char my_fromencoding[PREFS_BUF_LEN] = ""; char *outbuffer = NULL; char *inbuffer = NULL; char *ris_set_buffer = NULL; char **inargv; /* tokens of the argument */ char *newarg = NULL; char *outpipe = NULL; int numbyte; int numcycles; /* number of cycles reading input */ int n_read_done = 0; int inargc = 0; /* number of tokens of the argument */ int inargcmax; /* maximum number of tokens */ int n_opt; int n_cmdlinerror = 0; int result; int n_personal = 0; int n_file_append = 0; /* indicates -O switch */ int n_file_open = 0; /* indicates -o switch */ int n_pipe = 0; /* indicates -c switch */ int n_keep_id = 0; /* indicates -k switch */ int n_send_result; int n_curr_trailing_z = 0; int n_last_trailing_z = 0; int k; int cs_status; size_t byte_written = 0; FILE *pagerfp; FILE *infp = NULL; FILE* errstream; struct lilimem sentinel; errstream = (n_cgi) ? stdout : stderr; sentinel.ptr_mem = NULL; sentinel.ptr_next = NULL; sentinel.varname[0] = '\0'; strcpy(db, current_db); /* use default db if set */ /* parse the argument. first we cut the argument into pieces with strtok, then we use getopt to interpret */ /* get a buffer to hold the tokens. Start with 10 tokens, increase in steps of 10 as needed */ inargc = 0; inargcmax = 10; inargv = malloc((size_t)inargcmax*sizeof(char*)); if (inargv == NULL) { return 1; } if (insert_lilimem(&sentinel, (void**)&inargv, NULL)) { return 1; } /* the following is a temporary hack to allow cmdln_tokenize to work */ newarg = malloc((size_t)(strlen(arg)+9)); if (newarg == NULL) { delete_all_lilimem(&sentinel); return 1; } if (insert_lilimem(&sentinel, (void**)&newarg, NULL)) { delete_all_lilimem(&sentinel); return 1; } strcpy(newarg, "addnote "); strcat(newarg, arg); result = cmdln_tokenize(&inargc, &inargv, inargcmax, newarg); if (result == 1 || result == 2) { /* memory error */ delete_all_lilimem(&sentinel); return 1; } /* now we have the tokens nicely arranged in inargc */ /* for (i = 0; i < inargc; i++) { */ /* printf("inargv[%d]: %s\n", i, inargv[i]); */ /* } */ /* get options */ optind = 0; if (update_note) { while ((n_opt = getopt(inargc, inargv, "aA:c:C:d:e:E:f:F:g:G:hi:kl:L:o:O:p:Pqr:R:s:S:t:T:u:U:vVw:")) != -1) { switch(n_opt) { case 'c': /* printf("-c %s\n", optarg); */ outpipe = malloc(strlen(optarg)+1); if (outpipe == NULL) { delete_all_lilimem(&sentinel); return 0; } strcpy(outpipe, optarg); if (insert_lilimem(&sentinel, (void**)&outpipe, NULL)) { delete_all_lilimem(&sentinel); return 1; } n_pipe = 1; break; case 'd': /* printf("-d %s\n", optarg); */ strncpy(db, optarg, _POSIX_PATH_MAX-1); /* override preset db */ db[_POSIX_PATH_MAX-1] = '\0'; break; case 'E': strncpy(my_fromencoding, optarg, PREFS_BUF_LEN); my_fromencoding[PREFS_BUF_LEN-1] = '\0'; break; case 'f': /* printf("-f %s\n", optarg); */ if (!strcmp(optarg, "stdin")) { n_read_stdin = 1; } break; case 'h': delete_all_lilimem(&sentinel); fprintf(errstream, "Replaces the specified notes in the database\nSyntax: updatenote [-c command] [-d database] [-E encoding] [-h] [-o outfile] [-O outfile] [-P] [-t type] [-U username] {file|-f infile}\nOptions: -c command pipe the output through command\n -d database specify the database to work with\n -E encoding specify the input character encoding\n -f infile Read the names of the files with the notes from file infile\n -g deffile read global fields from file deffile\n -h prints this mini-help\n -o outfile save the output in outfile (overwrite)\n -O outfile append the output to outfile\n -U username specify a different username than the current user\n All other arguments are interpreted as filenames.\n"); return 0; break; case 'o': /* printf("-o %s\n", optarg); */ strncpy(outfile, optarg, _POSIX_PATH_MAX - 1); outfile[_POSIX_PATH_MAX-1] = '\0'; /* terminate in case string got truncated */ n_file_open = 1; break; case 'O': /* printf("-O %s\n", optarg); */ strncpy(outfile, optarg, _POSIX_PATH_MAX - 1); outfile[_POSIX_PATH_MAX-1] = '\0'; /* terminate in case string got truncated */ n_file_append = 1; break; case 'U': /* printf("-U %s\n", optarg); */ strcpy(set_owner, optarg); break; /* now all the options that main has already taken care of */ case 'a': case 'A': case 'C': /* fall through - nothing to do */ case 'e': case 'F': case 'g': case 'G': case 'i': case 'k': case 'l': case 'L': case 'p': case 'q': case 'P': case 'r': case 'R': case 'S': case 's': case 't': case 'T': case 'u': case 'v': case 'V': case 'w': break; case ':': fprintf(errstream, "missing option\n"); n_cmdlinerror = 1; break; case '?': fprintf(errstream, "unknown option\n"); n_cmdlinerror = 1; break; } } } else { while ((n_opt = getopt(inargc, inargv, "aA:c:C:d:e:E:f:F:g:G:hi:kl:L:o:O:p:Pqr:R:s:S:t:T:u:U:vVw:")) != -1) { switch(n_opt) { case 'c': /* printf("-c %s\n", optarg); */ outpipe = malloc(strlen(optarg)+1); if (outpipe == NULL) { delete_all_lilimem(&sentinel); return 0; } strcpy(outpipe, optarg); if (insert_lilimem(&sentinel, (void**)&outpipe, NULL)) { delete_all_lilimem(&sentinel); return 1; } n_pipe = 1; break; case 'd': /* printf("-d %s\n", optarg); */ strcpy(db, optarg); /* override preset db */ break; case 'E': strncpy(my_fromencoding, optarg, PREFS_BUF_LEN); my_fromencoding[PREFS_BUF_LEN-1] = '\0'; break; case 'f': /* printf("-f %s\n", optarg); */ if (!strcmp(optarg, "stdin")) { n_read_stdin = 1; } break; case 'h': delete_all_lilimem(&sentinel); fprintf(errstream, "Adds the specified notes to the database\nSyntax: addnote [-c command] [-d database] [-E encoding] [-g deffile] [-h] [-k] [-o outfile] [-O outfile] [-U username] {file|-f infile}\nOptions: -c command pipe the output through command\n -d database specify the database to work with\n -E encoding specify the input character encoding\n -f infile Read the names of the files with the notes from file infile\n -g deffile read global fields from file deffile\n -h prints this mini-help\n -k keep note ID\n -o outfile save the output in outfile (overwrite)\n -O outfile append the output to outfile\n -U username specify a different username than the current user\n All other arguments are interpreted as filenames.\n"); return 0; break; case 'k': n_keep_id = 1; break; case 'o': /* printf("-o %s\n", optarg); */ strncpy(outfile, optarg, _POSIX_PATH_MAX - 1); outfile[_POSIX_PATH_MAX-1] = '\0'; /* terminate in case string got truncated */ n_file_open = 1; break; case 'O': /* printf("-O %s\n", optarg); */ strncpy(outfile, optarg, _POSIX_PATH_MAX - 1); outfile[_POSIX_PATH_MAX-1] = '\0'; /* terminate in case string got truncated */ n_file_append = 1; break; case 'U': /* printf("-U %s\n", optarg); */ strcpy(set_owner, optarg); break; /* now all the options that main has already taken care of */ case 'a': case 'A': case 'C': /* fall through - nothing to do */ case 'e': case 'F': case 'g': case 'G': case 'i': case 'l': case 'L': case 'p': case 'P': case 'q': case 'r': case 'R': case 'S': case 's': case 't': case 'T': case 'u': case 'v': case 'V': case 'w': break; case ':': fprintf(errstream, "missing option\n"); n_cmdlinerror = 1; break; case '?': fprintf(errstream, "unknown option\n"); n_cmdlinerror = 1; break; } } } /* get arguments */ /* { */ /* int i; */ /* for (i = optind; i < inargc; i++) { */ /* printf("1argument %s<<\n", inargv[i]); */ /* } */ /* } */ if (!*db) { fprintf(errstream, "Don't know which database to use. Select one with selectdb or use the -d switch with addnote.\n"); delete_all_lilimem(&sentinel); return 1; } if (n_cmdlinerror) { delete_all_lilimem(&sentinel); return 1; } /* try to connect to our server */ if (connect_to_server(&n_sockfd, server_ip, port_address) != 0) { delete_all_lilimem(&sentinel); return 1; } strcpy(scrambled_passwd, passwd); if (init_dialog(n_sockfd, scrambled_passwd, srv_inbuffer)) { delete_all_lilimem(&sentinel); close(n_sockfd); return 1; } /* get us some memory, will be realloc'd by read_ris_set() as needed */ ris_set_buffer = malloc(1); if (insert_lilimem(&sentinel, (void**)&ris_set_buffer, NULL)) { send_status(n_sockfd, 112, TERM_NO); delete_all_lilimem(&sentinel); close(n_sockfd); return 1; } /* and more memory for client/server communication */ inbuffer = malloc(COMMAND_INBUF_LEN); if (insert_lilimem(&sentinel, (void**)&inbuffer, NULL)) { send_status(n_sockfd, 112, TERM_NO); delete_all_lilimem(&sentinel); close(n_sockfd); return 1; } outbuffer = malloc(COMMAND_INBUF_LEN); if (insert_lilimem(&sentinel, (void**)&outbuffer, NULL)) { send_status(n_sockfd, 112, TERM_NO); delete_all_lilimem(&sentinel); close(n_sockfd); return 1; } if (update_note) { strcpy(outbuffer, "updatenote "); } else { strcpy(outbuffer, "addnote "); } /* assemble and send our command */ strcat(outbuffer, " -u "); strcat(outbuffer, username); if (*passwd) { strcat(outbuffer, " -w "); strcat(outbuffer, scrambled_passwd); } strcat(outbuffer, " -d "); strcat(outbuffer, db); if (*set_owner) { strcat(outbuffer, " -U "); strcat(outbuffer, set_owner); } if (*my_fromencoding) { strcat(outbuffer, " -E "); strcat(outbuffer, my_fromencoding); } if (n_personal) { strcat(outbuffer, " -p"); } if (n_keep_id) { strcat(outbuffer, " -k"); } /* if (*outtype) { */ /* strcat(outbuffer, " -t "); */ /* strcat(outbuffer, outtype); */ /* } */ /* free(newarg); */ /* newarg = NULL; */ LOG_PRINT(LOG_DEBUG, outbuffer); send_status(n_sockfd, 0, TERM_NO); numbyte = tiwrite(n_sockfd, outbuffer, TERM_YES); /* printf("%s\n", outbuffer); */ if (numbyte == -1) { cgi_header(CGI_PLAIN); fprintf(errstream, "could not write to refdbd. Stop\n"); delete_all_lilimem(&sentinel); close(n_sockfd); return 1; } cs_status = read_status(n_sockfd); /* todo: is a 701 possible here? */ if (cs_status == 701) { /* character conversion could not be initialized */ fprintf(errstream, "%s\n", get_status_msg(701)); } else if (cs_status) { cgi_header(CGI_PLAIN); delete_all_lilimem(&sentinel); LOG_PRINT(LOG_WARNING, get_status_msg(cs_status)); close(n_sockfd); return 1; } /* openpager is guaranteed to return a valid file/pipe - and be it stdout */ if (n_file_open) { pagerfp = open_outfile(outfile, 0); } else if (n_file_append) { pagerfp = open_outfile(outfile, 1); } else if (n_pipe) { pagerfp = openpager(outpipe); } else { pagerfp = openpager(the_pager); } if (n_read_stdin || optind == inargc) { infp = stdin; numcycles = 1; n_read_stdin = 1; /* not set if optind == inargc */ } else { numcycles = inargc-optind; } /* printf("%d\n", numcycles); */ for (k = 0; k < numcycles; k++) { if (!n_read_stdin) { /* try to open our target file */ infp = fopen(inargv[optind+k], "rb"); /* printf("%s<<\n", inargv[optind+k]); */ if (infp == NULL) { continue; } } /* runs phases 1 through 4 of communication protocol */ n_send_result = send_xml_data(infp, pagerfp, errstream, n_sockfd, &byte_written); if (n_send_result) { if (!n_read_stdin) { fclose(infp); } if (n_file_open || n_file_append) { close_outfile(pagerfp); } else { closepager(pagerfp); } delete_all_lilimem(&sentinel); close(n_sockfd); n_broken_pipe = 0; return 1; } } /* ------------------------------------------------------------ */ /* PHASE 5 */ /* signal server that we're done */ send_status(n_sockfd, 402, TERM_NO); /* check server status, should be "chunk added successfully" */ if ((cs_status = read_status(n_sockfd)) != 403) { if (cs_status == 400) { int num_trailz; int n_read_done = 0; size_t byte_written_to_inbuffer; /* retrieve server-generated error message */ do { numbyte = tread(n_sockfd, inbuffer, OUTBUF_LEN); /* printf("phase4 server reply:%s<<\n", inbuffer); */ if (numbyte == -1) { /* timeout while reading */ fprintf(stderr, "%s", get_status_msg(109)); result = 1; goto cleanup; } /* we rely on the fact that the server reply is no more than OUTBUF_LEN in length */ if ((num_trailz = get_trailz(inbuffer, numbyte)) >= TERM_LEN) { /* if transmission ends */ n_read_done++; } /* write numbyte chars to output, unless this is the last chunk: we do not want to write the terminating \0 */ if (!n_broken_pipe) { byte_written_to_inbuffer = fwrite(inbuffer, sizeof(char), numbyte-num_trailz, pagerfp); } /* printf("%s", inbuffer); */ } while (!n_read_done); result = 1; /* goto cleanup; */ } else { fprintf(stderr, "%s\n", get_status_msg(cs_status)); result = 1; goto cleanup; } } /* end if cs_status */ /* read data in loop */ do { numbyte = tread(n_sockfd, inbuffer, OUTBUF_LEN); if (numbyte == -1) { fprintf(stderr, "%s", get_status_msg(109)); if (n_file_open || n_file_append) { close_outfile(pagerfp); } else { closepager(pagerfp); } n_broken_pipe = 0; return 1; } n_curr_trailing_z = get_trailz(inbuffer, numbyte); if (numbyte >= TERM_LEN) { if (n_curr_trailing_z >= TERM_LEN) { /* terminator is complete */ n_read_done++; /* send back confirmation to the server */ send_status(n_sockfd, 0, TERM_NO); } } else if (n_curr_trailing_z == numbyte && n_curr_trailing_z + n_last_trailing_z >= TERM_LEN) { /* terminator is complete including the previous cycle */ n_read_done++; /* send back confirmation to the server */ send_status(n_sockfd, 0, TERM_NO); } else if (n_curr_trailing_z == numbyte) { /* terminator is still incomplete */ n_last_trailing_z += n_curr_trailing_z; continue; } /* write numbyte chars to output, unless this is the last chunk: we do not want to write the terminating \0 */ if (!n_broken_pipe) { if (n_last_trailing_z) { byte_written += fwrite(cs_term, sizeof(char), n_last_trailing_z, pagerfp); } byte_written += fwrite(inbuffer, sizeof(char), numbyte-n_curr_trailing_z, pagerfp); } if (!n_read_done) { n_last_trailing_z = n_curr_trailing_z; } } while (!n_read_done); /* read summary */ send_status(n_sockfd, 0, TERM_NO); cs_status = read_status(n_sockfd); if (cs_status != 0 /* success */ && cs_status != 803) { /* partial success */ cgi_header(CGI_PLAIN); fprintf(errstream, "%s", get_status_msg(cs_status)); return 1; } numbyte = tread(n_sockfd, inbuffer, OUTBUF_LEN); if (numbyte == -1) { fprintf(errstream, "could not read from refdbd. Stop\n"); n_broken_pipe = 0; return 1; } /* send back confirmation to the server */ send_status(n_sockfd, 0, TERM_NO); /* reset */ n_broken_pipe = 0; if (n_file_open || n_file_append) { close_outfile(pagerfp); fprintf(errstream, "%d byte written to %s\n", byte_written, outfile); } else { closepager(pagerfp); } fprintf(errstream, "%s", inbuffer); cleanup: /* printf("%s\n", inbuffer); */ delete_all_lilimem(&sentinel); close(n_sockfd); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ com_deletenote(): delete notes int com_deletenotes 0 if successful, 1 if error char *arg the spec of the notes which are to be deleted ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int com_deletenote (char* arg) { char *new_outbuffer = NULL; char cmd_buffer[OUTBUF_LEN] = ""; char inbuffer[COMMAND_INBUF_LEN] = ""; char **inargv = NULL; /* tokens of the argument */ char *newarg = NULL; char* infile = NULL; char db[DBNAME_LENGTH] = ""; char scrambled_passwd[PASSWD_LENGTH*3+1] = ""; int numbyte = 0; int inargc = 0; /* number of tokens of the argument */ int inargcmax; /* maximum number of tokens */ int n_cmdlinerror = 0; int result; int n_opt; int i; int n_read_file = 0; int cs_status; size_t outbuf_len; FILE *infilefp; FILE* errstream; struct simplelistvals slvals; struct lilimem sentinel; errstream = (n_cgi) ? stdout : stderr; sentinel.ptr_mem = NULL; sentinel.ptr_next = NULL; sentinel.varname[0] = '\0'; /* get us some buffer for output */ outbuf_len = 128; /* something to start with */ slvals.outbuffer = malloc(outbuf_len); if (slvals.outbuffer == NULL) { return 1; } slvals.outbuffer[0] = '\0'; slvals.n_file_open = 0; slvals.n_file_append = 0; slvals.n_pipe = 0; slvals.outfile = NULL; slvals.outpipe = NULL; if (insert_lilimem(&sentinel, (void**)&(slvals.outbuffer), NULL)) { return 1; } strcpy(db, current_db); /* use default db if set */ strcpy(cmd_buffer, "deletenote "); /* get a buffer to hold the tokens. Start with 10 tokens, increase in steps of 10 as needed */ inargc = 0; inargcmax = 10; inargv = malloc((size_t)inargcmax*sizeof(char*)); if (inargv == NULL) { delete_all_lilimem(&sentinel); return 1; } if (insert_lilimem(&sentinel, (void**)&inargv, NULL)) { delete_all_lilimem(&sentinel); return 1; } /* the following is a temporary hack to allow cmdln_tokenize to work */ newarg = malloc((size_t)(strlen(arg)+11)); if (newarg == NULL) { delete_all_lilimem(&sentinel); return 1; } if (insert_lilimem(&sentinel, (void**)&newarg, NULL)) { delete_all_lilimem(&sentinel); return 1; } strcpy(newarg, "deletenote "); strcat(newarg, arg); result = cmdln_tokenize(&inargc, &inargv, inargcmax, newarg); if (result == 1 || result == 2) { /* memory error */ delete_all_lilimem(&sentinel); return 1; } /* get options */ optind = 0; while ((n_opt = getopt(inargc, inargv, "aA:c:C:d:e:E:f:F:g:G:hi:kl:L:o:O:p:Pqr:R:s:S:t:T:u:U:vVw:")) != -1) { switch(n_opt) { case 'c': /* printf("-c %s\n", optarg); */ slvals.outpipe = malloc(strlen(optarg)+1); if (slvals.outpipe == NULL) { delete_all_lilimem(&sentinel); return 0; } strcpy(slvals.outpipe, optarg); if (insert_lilimem(&sentinel, (void**)&(slvals.outpipe), NULL)) { delete_all_lilimem(&sentinel); return 1; } slvals.n_pipe = 1; break; case 'd': /* printf("-d %s\n", optarg); */ strcpy(db, optarg); /* override preset db */ break; case 'f': /* printf("-f %s\n", optarg); */ if (!strcmp(optarg, "stdin")) { n_read_stdin = 1; } else { infile = canonicalize_path(optarg); if (insert_lilimem(&sentinel, (void**)&infile, NULL)) { delete_all_lilimem(&sentinel); return 1; } n_read_file = 1; } break; case 'h': printf("Deletes the specified notes from the database\nSyntax: deletenote [-c command] [-d database] [-h] [-o outfile] [-O outfile] {ID|-f infile}\nOptions: -c command pipe the output through command\n -d database specify the database to work with\n -f infile Read the reference IDs from file infile\n -h prints this mini-help\n -o outfile save the output in outfile (overwrite)\n -O outfile append the output to outfile\n All other arguments are interpreted as IDs to delete.\n"); delete_all_lilimem(&sentinel); return 0; break; case 'o': /* printf("-o %s\n", optarg); */ slvals.outfile = canonicalize_path(optarg); if (insert_lilimem(&sentinel, (void**)&(slvals.outfile), NULL)) { delete_all_lilimem(&sentinel); return 1; } slvals.n_file_open = 1; break; case 'O': /* printf("-O %s\n", optarg); */ slvals.outfile = canonicalize_path(optarg); if (insert_lilimem(&sentinel, (void**)&(slvals.outfile), NULL)) { delete_all_lilimem(&sentinel); return 1; } slvals.n_file_append = 1; break; /* now all the options that main has already taken care of */ case 'a': case 'A': case 'C': /* fall through - nothing to do */ case 'e': case 'E': case 'F': case 'g': case 'G': case 'i': case 'k': case 'l': case 'L': case 'p': case 'P': case 'q': case 'r': case 'R': case 's': case 'S': case 't': case 'T': case 'u': case 'U': case 'v': case 'V': case 'w': break; case ':': fprintf(stderr, "missing option\n"); n_cmdlinerror = 1; break; case '?': fprintf(stderr, "unknown option\n"); n_cmdlinerror = 1; break; } } /* get arguments */ /* for (i = optind; i < inargc; i++) { */ /* printf("argument %s\n", inargv[i]); */ /* } */ if (!*db) { fprintf(errstream, "Don't know which database to use. Select one with selectdb or use the -d switch with deletenote.\n"); delete_all_lilimem(&sentinel); return 1; } if (n_cmdlinerror) { delete_all_lilimem(&sentinel); return 1; } /* try to connect to server */ if (connect_to_server(&(slvals.n_sockfd), server_ip, port_address) != 0) { delete_all_lilimem(&sentinel); return 1; } strcpy(scrambled_passwd, passwd); if (init_dialog(slvals.n_sockfd, scrambled_passwd, inbuffer)) { close(slvals.n_sockfd); delete_all_lilimem(&sentinel); return 1; } /* prepare data */ if (n_read_file || n_read_stdin || optind == inargc) { if (n_read_file) { if ((infilefp = fopen(infile, "rb")) == NULL) { delete_all_lilimem(&sentinel); close(slvals.n_sockfd); return 1; } } else { infilefp = stdin; n_read_stdin = 1; /* not set if optind == inargc */ } result = add_id_from_ris(infilefp, &(slvals.outbuffer), &outbuf_len); if (!n_read_stdin) { fclose(infilefp); } if (result) { delete_all_lilimem(&sentinel); close(slvals.n_sockfd); return 1; } } for (i = optind; i < inargc; i++) { if ((new_outbuffer = mstrcat(slvals.outbuffer, inargv[i], &outbuf_len, 0)) == NULL) { delete_all_lilimem(&sentinel); close(slvals.n_sockfd); return 1; } else { slvals.outbuffer = new_outbuffer; } if ((new_outbuffer = mstrcat(slvals.outbuffer, " ", &outbuf_len, 0)) == NULL) { delete_all_lilimem(&sentinel); close(slvals.n_sockfd); return 1; } else { slvals.outbuffer = new_outbuffer; } } /* assemble command */ strcat(cmd_buffer, " -u "); strcat(cmd_buffer, username); if (strlen(passwd) > 0) { strcat(cmd_buffer, " -w "); strcat(cmd_buffer, scrambled_passwd); } strcat(cmd_buffer, " -d "); strcat(cmd_buffer, db); sprintf(cmd_buffer+strlen(cmd_buffer), " %d", strlen(slvals.outbuffer)+TERM_LEN); /* printf("%s\n", outbuffer); */ /* send command to application server */ send_status(slvals.n_sockfd, 0, TERM_NO); numbyte = tiwrite(slvals.n_sockfd, cmd_buffer, TERM_YES); LOG_PRINT(LOG_DEBUG, cmd_buffer); if (numbyte == -1) { cgi_header(CGI_PLAIN); fprintf(errstream, "%s\n", get_status_msg(110)); close(slvals.n_sockfd); delete_all_lilimem(&sentinel); return 1; } numbyte = 0; if ((cs_status = read_status(slvals.n_sockfd)) != 0) { fprintf(errstream, "%s\n", get_status_msg(cs_status)); close(slvals.n_sockfd); delete_all_lilimem(&sentinel); return 1; } getsimplelist(&slvals, 1); close(slvals.n_sockfd); delete_all_lilimem(&sentinel); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ com_getnote(): view extended notes int com_getnote 0 if successful, 1 if error char *arg the spec of the notes which are to be viewed ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int com_getnote (char* arg) { return getnote(arg, 1); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ com_countnote(): count notes int com_countnote 0 if successful, 1 if error char *arg the spec of the notes which are to be viewed ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int com_countnote (char* arg) { return getnote(arg, 0); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ getnote(): view notes int getnote 0 if successful, 1 if error char *arg the spec of the note which are to be viewed int send_data if set to 1, send back references (getref) if set to 0, count references (countref) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int getnote (char* arg, int send_data) { char cmd_buffer[OUTBUF_LEN] = ""; char* infile; char inbuffer[COMMAND_INBUF_LEN] = ""; char format_string[MAX_FMT_LEN] = ""; char sort_string[MAX_FMT_LEN] = ""; char db[_POSIX_PATH_MAX+1] = ""; char pdf_root[_POSIX_PATH_MAX] = ""; char type_string[10] = ""; char my_toencoding[PREFS_BUF_LEN] = ""; char limit[PREFS_BUF_LEN] = ""; char listname[PREFS_BUF_LEN] = ""; char **inargv; /* tokens of the argument */ char *newarg; char *read_result; char *new_outbuffer; char scrambled_passwd[PASSWD_LENGTH*3+1] = ""; int inargc = 0; /* number of tokens of the argument */ int inargcmax; /* maximum number of tokens */ int result; int i; int n_opt; int n_done; int n_read_file = 0; /* indicates -f switch */ int n_cmdlinerror = 0; int numbyte; int cs_status; size_t byte_written = 0; size_t outbuf_len; FILE *infilefp; FILE* errstream; FILE *pagerfp; /* ptr to file */ struct lilimem sentinel; struct simplelistvals slvals; errstream = (n_cgi) ? stdout : stderr; /* get us some buffer for output */ outbuf_len = 256; /* something to start with */ slvals.outbuffer = malloc(outbuf_len); if (slvals.outbuffer == NULL || insert_lilimem(&sentinel, (void**)&(slvals.outbuffer), NULL)) { free(slvals.outbuffer); return 1; } slvals.outbuffer[0] = '\0'; if (!send_data) { strcpy(cmd_buffer, "countnote "); } else { strcpy(cmd_buffer, "getnote "); } slvals.n_file_open = 0; slvals.n_file_append = 0; slvals.n_pipe = 0; slvals.outfile = NULL; slvals.outpipe = NULL; sentinel.ptr_mem = NULL; sentinel.ptr_next = NULL; sentinel.varname[0] = '\0'; if (*pdfroot) { strcpy(pdf_root, pdfroot); } strcpy(db, current_db); /* use default db if set */ strcpy(my_toencoding, toencoding); /* use default encoding if set */ /* parse the argument. first we cut the argument into pieces with strtok, then we use getopt to interpret */ /* get a buffer to hold the tokens. Start with 10 tokens, increase in steps of 10 as needed */ inargc = 0; inargcmax = 10; inargv = malloc((size_t)inargcmax*sizeof(char*)); if (inargv == NULL) { return 1; } if (insert_lilimem(&sentinel, (void**)&inargv, NULL)) { return 1; } /* the following is a temporary hack to allow cmdln_tokenize to work */ newarg = malloc((size_t)(strlen(arg)+9)); if (newarg == NULL) { delete_all_lilimem(&sentinel); return 1; } if (insert_lilimem(&sentinel, (void**)&newarg, NULL)) { delete_all_lilimem(&sentinel); return 1; } strcpy(newarg, "getnote "); strcat(newarg, arg); result = cmdln_tokenize(&inargc, &inargv, inargcmax, newarg); if (result == 1 || result == 2) { /* memory error */ delete_all_lilimem(&sentinel); return 1; } /* now we have the tokens nicely arranged in inargc */ /* for (i = 0; i < inargc; i++) { */ /* printf("inargv[%d]: %s\n", i, inargv[i]); */ /* } */ /* get options */ optind = 0; while ((n_opt = getopt(inargc, inargv, "aA:b:c:C:d:e:E:f:F:g:G:hi:kl:L:n:N:o:O:p:qr:R:s:S:t:T:u:U:vVw:")) != -1) { switch(n_opt) { case 'b': strncpy(listname, optarg, PREFS_BUF_LEN); listname[PREFS_BUF_LEN-1] = '\0'; break; case 'c': /* printf("-c %s\n", optarg); */ slvals.outpipe = malloc(strlen(optarg)+1); if (slvals.outpipe == NULL) { delete_all_lilimem(&sentinel); return 0; } strcpy(slvals.outpipe, optarg); if (insert_lilimem(&sentinel, (void**)&slvals.outpipe, NULL)) { delete_all_lilimem(&sentinel); return 1; } slvals.n_pipe = 1; break; case 'd': /* printf("-d %s\n", optarg); */ strncpy(db, optarg, _POSIX_PATH_MAX - 1); /* override preset db */ db[_POSIX_PATH_MAX-1] = '\0'; /* terminate in case string got truncated */ break; case 'E': strncpy(my_toencoding, optarg, PREFS_BUF_LEN); my_toencoding[PREFS_BUF_LEN-1] = '\0'; break; case 'f': /* printf("-f %s\n", optarg); */ if (!strcmp(optarg, "stdin")) { n_read_stdin = 1; } else { infile = canonicalize_path(optarg); if (insert_lilimem(&sentinel, (void**)&infile, NULL)) { delete_all_lilimem(&sentinel); return 1; } n_read_file = 1; } break; case 'h': if (!send_data) { printf("Displays the result of a database search for notes.\nSyntax: getnote [-b listname] [-c command] [-d database] [-h] [-n namespace] [-N limit:offset] {search-string|-f infile}\nSearch-string: {:XY:{<|<=|=|~|!=|<>|!~|>|>=}{string|regexp}} [AND|OR|AND NOT] [...]\nwhere XY specifies the field to search in\nOptions: -b listname limit search to the specified personal reference list\n -c command pipe the output through command\n -d database specify the database to work with\n -h prints this mini-help\n -n namespace optional namespace for XML output\n -N limit:offset specify range of datasets\n -f infile use the saved search line in file infile\n All other arguments are interpreted as the search string.\n"); } else { printf("Displays the result of a database search for notes.\nSyntax: getnote [-b listname] [-c command] [-d database] [-E encoding] [-h] [-n namespace] [-N limit:offset] [-o outfile] [-O outfile][-P] [-R pdfroot] [-s format] [-S tag] [-t output-format] {search-string|-f infile}\nSearch-string: {:XY:{<|<=|=|~|!=|<>|!~|>|>=}{string|regexp}} [AND|OR|AND NOT] [...]\nwhere XY specifies the field to search in\nOptions: -b listname limit search to the specified personal reference list\n -c command pipe the output through command\n -d database specify the database to work with\n -E encoding specify the input character encoding\n -h prints this mini-help\n -n namespace optional namespace for XML output\n -N limit:offset specify range of datasets\n -o outfile save the output in outfile (overwrite)\n -O outfile append the output to outfile\n -P limit search to personal interest list\n -R use pdfroot as root for path of pdf files\n -s format specify fields for screen or style for DocBook output\n -S tag sort output by tag ID (default) or PY\n -t output-format display as format scrn, html, xhtml, or xnote\n -f infile use the saved search line in file infile\n All other arguments are interpreted as the search string.\n"); } delete_all_lilimem(&sentinel); return 0; break; case 'N': strncpy(limit, optarg, PREFS_BUF_LEN); limit[PREFS_BUF_LEN-1] = '\0'; break; case 'o': /* printf("-o %s\n", optarg); */ slvals.outfile = canonicalize_path(optarg); if (insert_lilimem(&sentinel, (void**)&slvals.outfile, NULL)) { delete_all_lilimem(&sentinel); return 1; } slvals.n_file_open = 1; break; case 'O': /* printf("-O %s\n", optarg); */ slvals.outfile = canonicalize_path(optarg); if (insert_lilimem(&sentinel, (void**)&slvals.outfile, NULL)) { delete_all_lilimem(&sentinel); return 1; } slvals.n_file_append = 1; break; case 'R': strcpy(pdf_root, optarg); break; case 's': /* printf("-s %s\n", optarg); */ strncpy(format_string, optarg, MAX_FMT_LEN - 1); format_string[MAX_FMT_LEN-1] = '\0'; /* terminate in case string got truncated */ break; case 'S': /* printf("-S %s\n", optarg); */ strncpy(sort_string, optarg, MAX_FMT_LEN - 1); sort_string[MAX_FMT_LEN-1] = '\0'; /* terminate in case string got truncated */ break; case 't': /* printf("-t %s\n", optarg); */ strncpy(type_string, optarg, 9); type_string[9] = '\0'; /* terminate in case string got truncated */ break; /* now all the options that main has already taken care of */ case 'a': case 'A': case 'C': /* fall through */ case 'e': case 'F': case 'g': case 'G': case 'i': case 'k': case 'l': case 'L': case 'p': case 'q': case 'r': case 'T': case 'u': case 'U': case 'v': case 'V': case 'w': break; case ':': fprintf(stderr, "missing option\n"); n_cmdlinerror = 1; break; case '?': fprintf(stderr, "unknown option\n"); n_cmdlinerror = 1; break; } } /* get arguments */ /* for (i = optind; i < inargc; i++) { */ /* printf("argument %s\n", inargv[i]); */ /* } */ if (!*db) { fprintf(errstream, "Don't know which database to use. Select one with selectdb or use the -d switch with getnote\n"); delete_all_lilimem(&sentinel); return 1; } if (n_cmdlinerror) { delete_all_lilimem(&sentinel); return 1; } if (connect_to_server(&slvals.n_sockfd, server_ip, port_address) != 0) { delete_all_lilimem(&sentinel); return 1; } strcpy(scrambled_passwd, passwd); if (init_dialog(slvals.n_sockfd, scrambled_passwd, inbuffer)) { delete_all_lilimem(&sentinel); close(slvals.n_sockfd); return 1; } if (n_read_file || n_read_stdin || optind == inargc) { char filebuffer[COMMAND_INBUF_LEN]; if (n_read_file) { infilefp = fopen(infile, "rb"); if (infilefp == NULL) { send_status(slvals.n_sockfd, 112, TERM_NO); delete_all_lilimem(&sentinel); close(slvals.n_sockfd); return 1; } } else { infilefp = stdin; /* stdin is already open */ n_read_stdin = 1; /* not set if optind == inargc */ } while ((read_result = fgets(filebuffer, COMMAND_INBUF_LEN, infilefp)) != NULL) { if ((new_outbuffer = mstrcat(slvals.outbuffer, filebuffer, &outbuf_len, 0)) == NULL) { delete_all_lilimem(&sentinel); close(slvals.n_sockfd); if (!n_read_stdin) { /* don't close stdin */ fclose(infilefp); } return 1; } else { slvals.outbuffer = new_outbuffer; } } if (ferror(infilefp)) { send_status(slvals.n_sockfd, 112, TERM_NO); delete_all_lilimem(&sentinel); close(slvals.n_sockfd); return 1; } if (!n_read_stdin) { /* don't close stdin */ fclose(infilefp); } } else { if (optind < inargc) { int open_quote = 0; /* printf("%d\n", optind); */ for (i = optind; i < inargc; i++) { if ((new_outbuffer = mstrcat(slvals.outbuffer, inargv[i], &outbuf_len, 0)) == NULL) { delete_all_lilimem(&sentinel); close(slvals.n_sockfd); return 1; } else { slvals.outbuffer = new_outbuffer; } if (open_quote) { if ((new_outbuffer = mstrcat(slvals.outbuffer, "\'", &outbuf_len, 0)) == NULL) { delete_all_lilimem(&sentinel); close(slvals.n_sockfd); return 1; } else { slvals.outbuffer = new_outbuffer; } open_quote--; } /* the tokenizer returns a quoted item as a separate token even if there is no space between e.g. a '=' and the quoted item. To rectify this, check whether the previous item ended with a '=' or a '~' */ if (slvals.outbuffer[strlen(slvals.outbuffer)-1] != '=' && slvals.outbuffer[strlen(slvals.outbuffer)-1] != '~') { if ((new_outbuffer = mstrcat(slvals.outbuffer, " ", &outbuf_len, 0)) == NULL) { delete_all_lilimem(&sentinel); close(slvals.n_sockfd); return 1; } else { slvals.outbuffer = new_outbuffer; } } else { /* insert a quote after the '='. This will put back the quote only for items that actually were quoted */ if ((new_outbuffer = mstrcat(slvals.outbuffer, "\'", &outbuf_len, 0)) == NULL) { delete_all_lilimem(&sentinel); close(slvals.n_sockfd); return 1; } else { slvals.outbuffer = new_outbuffer; } open_quote++; } } slvals.outbuffer[strlen(slvals.outbuffer)-1] = '\0'; /* remove trailing space */ } } /* make sure there's no newlines in the string; reuse read_result */ for (read_result = slvals.outbuffer; *read_result; read_result++) { if (*read_result == '\n' || *read_result == '\r') { *read_result = ' '; } } /* assemble command string for refdbd */ strcat(cmd_buffer, " -u "); strcat(cmd_buffer, username); if (*passwd) { strcat(cmd_buffer, " -w "); strcat(cmd_buffer, scrambled_passwd); } strcat(cmd_buffer, " -d "); strcat(cmd_buffer, db); if (*format_string || *default_fields) { strcat(cmd_buffer, " -s \""); if (*default_fields) { strcat(cmd_buffer, default_fields); } else { strcat(cmd_buffer, format_string); } strcat(cmd_buffer, "\""); } if (*type_string) { strcat(cmd_buffer, " -t \""); strcat(cmd_buffer, type_string); strcat(cmd_buffer, "\""); } if (*sort_string) { strcat(cmd_buffer, " -S \""); strcat(cmd_buffer, sort_string); strcat(cmd_buffer, "\""); } if (*limit) { strcat(cmd_buffer, " -N \""); strcat(cmd_buffer, limit); strcat(cmd_buffer, "\""); } if (*pdf_root) { strcat(cmd_buffer, " -R "); strcat(cmd_buffer, pdf_root); } if (*my_toencoding) { strcat(cmd_buffer, " -E "); strcat(cmd_buffer, my_toencoding); } if (*css_url) { strcat(cmd_buffer, " -G "); strcat(cmd_buffer, css_url); } if (*listname) { strcat(cmd_buffer, " -b "); strcat(cmd_buffer, listname); } sprintf(cmd_buffer+strlen(cmd_buffer), " %d", strlen(slvals.outbuffer)+TERM_LEN); LOG_PRINT(LOG_DEBUG, cmd_buffer); errstream = (n_cgi) ? stdout : stderr; send_status(slvals.n_sockfd, 0, TERM_NO); numbyte = tiwrite(slvals.n_sockfd, cmd_buffer, TERM_YES); if (numbyte == -1) { cgi_header(CGI_PLAIN); fprintf(errstream, "could not write to refdbd. Stop\n"); return 1; } numbyte = 0; if ((cs_status = read_status(slvals.n_sockfd)) != 0) { fprintf(errstream, "%s\n", get_status_msg(cs_status)); close(slvals.n_sockfd); delete_all_lilimem(&sentinel); return 1; } send_status(slvals.n_sockfd, 0, TERM_NO); numbyte = tiwrite(slvals.n_sockfd, slvals.outbuffer, TERM_YES); LOG_PRINT(LOG_DEBUG, cmd_buffer); if (numbyte == -1) { cgi_header(CGI_PLAIN); fprintf(errstream, "could not write to refdbd. Stop\n"); close(slvals.n_sockfd); delete_all_lilimem(&sentinel); return 1; } /* openpager and open_outfile are guaranteed to return a valid file/pipe - and be it stdout */ if (slvals.n_file_open) { pagerfp = open_outfile(slvals.outfile, 0); } else if (slvals.n_file_append) { pagerfp = open_outfile(slvals.outfile, 1); } else if (slvals.n_pipe) { pagerfp = openpager(slvals.outpipe); } else { pagerfp = openpager(the_pager); } n_done = 0; do { /* loop until we have all requested datasets */ int n_error; cs_status = read_status(slvals.n_sockfd); if (cs_status != 402 /* last dataset */ && cs_status != 404) { /* finished dataset */ cgi_header(CGI_PLAIN); fprintf(errstream, "%s\n", get_status_msg(cs_status)); if (slvals.n_file_open || slvals.n_file_append) { close_outfile(pagerfp); } else { closepager(pagerfp); } n_broken_pipe = 0; return 1; } if (cs_status == 402) { n_done++; } byte_written += read_terminated_string(&slvals, pagerfp, &n_error); if (n_error) { delete_all_lilimem(&sentinel); if (slvals.n_file_open || slvals.n_file_append) { close_outfile(pagerfp); } else { closepager(pagerfp); } n_broken_pipe = 0; return 1; } } while (!n_done); /* read summary */ /* send_status(slvals.n_sockfd, 0, TERM_NO); */ cs_status = read_status(slvals.n_sockfd); if (cs_status != 0 /* success */ && cs_status != 803) { /* partial success */ cgi_header(CGI_PLAIN); fprintf(errstream, "%s\n", get_status_msg(cs_status)); return 1; } numbyte = tread(slvals.n_sockfd, slvals.inbuffer, OUTBUF_LEN); if (numbyte == -1) { fprintf(stderr, "%s\n", get_status_msg(109)); n_broken_pipe = 0; return 1; } send_status(slvals.n_sockfd, 0, TERM_NO); if (slvals.n_file_open || slvals.n_file_append) { close_outfile(pagerfp); fprintf(errstream, "%d byte written to %s\n", byte_written, slvals.outfile); } else { closepager(pagerfp); } close(slvals.n_sockfd); fprintf(errstream, "%s", slvals.inbuffer); delete_all_lilimem(&sentinel); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ com_addlink(): add links from notes to other objects int com_addlink 0 if successful, 1 if error char *arg the spec of the note which are to be viewed ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int com_addlink (char* arg) { return addlink(0, arg); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ com_deletelink(): remove links from notes to other objects int com_deletelink 0 if successful, 1 if error char *arg the spec of the note which are to be viewed ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int com_deletelink (char* arg) { return addlink(1, arg); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ addlink(): add or remove links from notes to other objects int addlink 0 if successful, 1 if error int n_remove if 1, links will be removed, if 0, will be added char *arg the spec of the note which are to be viewed ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int addlink (int n_remove, char* arg) { char outbuffer[COMMAND_INBUF_LEN]; /* holds the command for the server */ char* infile; char inbuffer[COMMAND_INBUF_LEN] = ""; char db[_POSIX_PATH_MAX+1] = ""; char **inargv; /* tokens of the argument */ char *newarg; char *read_result; char scrambled_passwd[PASSWD_LENGTH*3+1] = ""; int inargc = 0; /* number of tokens of the argument */ int inargcmax; /* maximum number of tokens */ int result; int i; int n_opt; int n_read_file = 0; /* indicates -f switch */ int n_cmdlinerror = 0; FILE *infilefp; FILE* errstream; struct lilimem sentinel; struct simplelistvals slvals; errstream = (n_cgi) ? stdout : stderr; slvals.outbuffer = outbuffer; strcpy(slvals.outbuffer, "addlink "); slvals.n_file_open = 0; slvals.n_file_append = 0; slvals.n_pipe = 0; slvals.outfile = NULL; slvals.outpipe = NULL; sentinel.ptr_mem = NULL; sentinel.ptr_next = NULL; sentinel.varname[0] = '\0'; strcpy(db, current_db); /* use default db if set */ /* parse the argument. first we cut the argument into pieces with strtok, then we use getopt to interpret */ /* get a buffer to hold the tokens. Start with 10 tokens, increase in steps of 10 as needed */ inargc = 0; inargcmax = 10; inargv = malloc((size_t)inargcmax*sizeof(char*)); if (inargv == NULL) { return 1; } if (insert_lilimem(&sentinel, (void**)&inargv, NULL)) { return 1; } /* the following is a temporary hack to allow cmdln_tokenize to work */ newarg = malloc((size_t)(strlen(arg)+8)); if (newarg == NULL) { delete_all_lilimem(&sentinel); return 1; } if (insert_lilimem(&sentinel, (void**)&newarg, NULL)) { delete_all_lilimem(&sentinel); return 1; } strcpy(newarg, "addlink "); strcat(newarg, arg); result = cmdln_tokenize(&inargc, &inargv, inargcmax, newarg); if (result == 1 || result == 2) { /* memory error */ delete_all_lilimem(&sentinel); return 1; } /* now we have the tokens nicely arranged in inargc */ /* for (i = 0; i < inargc; i++) { */ /* printf("inargv[%d]: %s\n", i, inargv[i]); */ /* } */ /* get options */ optind = 0; while ((n_opt = getopt(inargc, inargv, "aA:c:C:d:e:E:f:F:g:G:hi:kl:L:o:O:p:Pqr:R:s:S:t:T:u:U:vVw:")) != -1) { switch(n_opt) { case 'c': /* printf("-c %s\n", optarg); */ slvals.outpipe = malloc(strlen(optarg)+1); if (slvals.outpipe == NULL) { delete_all_lilimem(&sentinel); return 0; } strcpy(slvals.outpipe, optarg); if (insert_lilimem(&sentinel, (void**)&slvals.outpipe, NULL)) { delete_all_lilimem(&sentinel); return 1; } slvals.n_pipe = 1; break; case 'd': /* printf("-d %s\n", optarg); */ strncpy(db, optarg, _POSIX_PATH_MAX - 1); /* override preset db */ db[_POSIX_PATH_MAX-1] = '\0'; /* terminate in case string got truncated */ break; /* case 'f': */ /* if (!strcmp(optarg, "stdin")) { */ /* n_read_stdin = 1; */ /* } */ /* else { */ /* infile = canonicalize_path(optarg); */ /* if (insert_lilimem(&sentinel, (void**)&infile, NULL)) { */ /* delete_all_lilimem(&sentinel); */ /* return 1; */ /* } */ /* n_read_file = 1; */ /* } */ /* break; */ case 'h': if (n_remove) { printf("Unlinks an existing note from one or more references, keywords, periodicals, or authors.\nSyntax: deletelink [-c command] [-d database] [-h] [-o outfile] [-O outfile] :NID:|:NCK: :XY:=value [:XY:=value1...]\nNID or NCK specify a note by its ID or key, respectively\nXY is one of ID, CK (reference by ID or citekey), KW (keyword), JO|JF|J1|J2 (periodical abbreviated|full|user1|user2), AU (author name)\nOptions: -c command pipe the output through command\n -d database specify the database to work with\n -h prints this mini-help\n -o outfile save the output in outfile (overwrite)\n -O outfile append the output to outfile\n"); } else { printf("Links an existing note to one or more references, keywords, periodicals, or authors.\nSyntax: addlink [-c command] [-d database] [-h] [-o outfile] [-O outfile] :NID:|:NCK: :XY:=value [:XY:=value1...]\nNID or NCK specify a note by its ID or key, respectively\nXY is one of ID, CK (reference by ID or citekey), KW (keyword), JO|JF|J1|J2 (periodical abbreviated|full|user1|user2), AU (author name)\nOptions: -c command pipe the output through command\n -d database specify the database to work with\n -h prints this mini-help\n -o outfile save the output in outfile (overwrite)\n -O outfile append the output to outfile\n"); } delete_all_lilimem(&sentinel); return 0; break; case 'o': /* printf("-o %s\n", optarg); */ slvals.outfile = canonicalize_path(optarg); if (insert_lilimem(&sentinel, (void**)&slvals.outfile, NULL)) { delete_all_lilimem(&sentinel); return 1; } slvals.n_file_open = 1; break; case 'O': /* printf("-O %s\n", optarg); */ slvals.outfile = canonicalize_path(optarg); if (insert_lilimem(&sentinel, (void**)&slvals.outfile, NULL)) { delete_all_lilimem(&sentinel); return 1; } slvals.n_file_append = 1; break; /* now all the options that main has already taken care of */ case 'a': case 'A': case 'C': /* fall through */ case 'e': case 'E': case 'f': case 'F': case 'g': case 'G': case 'i': case 'k': case 'l': case 'L': case 'p': case 'P': case 'q': case 'R': case 's': case 'S': case 't': case 'T': case 'u': case 'U': case 'v': case 'V': case 'w': break; case ':': fprintf(stderr, "missing option\n"); n_cmdlinerror = 1; break; case '?': fprintf(stderr, "unknown option\n"); n_cmdlinerror = 1; break; } } /* get arguments */ /* for (i = optind; i < inargc; i++) { */ /* printf("argument %s\n", inargv[i]); */ /* } */ if (!*db) { fprintf(errstream, "Don't know which database to use. Select one with selectdb or use the -d switch with addlink\n"); delete_all_lilimem(&sentinel); return 1; } if (n_cmdlinerror) { delete_all_lilimem(&sentinel); return 1; } if (connect_to_server(&slvals.n_sockfd, server_ip, port_address) != 0) { delete_all_lilimem(&sentinel); return 1; } strcpy(scrambled_passwd, passwd); if (init_dialog(slvals.n_sockfd, scrambled_passwd, inbuffer)) { delete_all_lilimem(&sentinel); close(slvals.n_sockfd); return 1; } if (n_read_file || n_read_stdin) { if (!n_read_stdin) { infilefp = fopen(infile, "rb"); if (infilefp == NULL) { send_status(slvals.n_sockfd, 112, TERM_NO); delete_all_lilimem(&sentinel); close(slvals.n_sockfd); return 1; } } else { infilefp = stdin; /* stdin is already open */ } read_result = fgets(slvals.outbuffer+strlen(slvals.outbuffer), COMMAND_INBUF_LEN-strlen(slvals.outbuffer), infilefp); if (!n_read_stdin) { /* don't close stdin */ fclose(infilefp); } if (read_result == NULL) { send_status(slvals.n_sockfd, 112, TERM_NO); delete_all_lilimem(&sentinel); close(slvals.n_sockfd); return 1; } } else { if (optind < inargc) { strcat(slvals.outbuffer, "\""); /* printf("%d\n", optind); */ for (i = optind; i < inargc; i++) { /* printf("inargv[%d]: %s<<\n", i, inargv[i]); */ /* strcat(slvals.outbuffer, inargv[i]); */ /* the tokenizer returns a quoted item as a separate token even if there is no space between e.g. a '=' and the quoted item. To rectify this, check whether the previous item ended with a '=' */ if (slvals.outbuffer[strlen(slvals.outbuffer)-1] != '=') { strcat(slvals.outbuffer, inargv[i]); if (slvals.outbuffer[strlen(slvals.outbuffer)-1] != '=') { strcat(slvals.outbuffer, " "); } } else { /* quote item */ strcat(slvals.outbuffer, "\'"); /* in order to allow e.g. single quotes in journal names we must escape the string properly. It will be unescaped on the server side */ escape_chars(slvals.outbuffer + strlen(slvals.outbuffer), inargv[i], strlen(inargv[i]), "'\""); strcat(slvals.outbuffer, "\' "); } } strcpy(&slvals.outbuffer[strlen(slvals.outbuffer)-1], "\""); /* remove trailing space */ } } /* ToDo: do we need this here? */ /* make sure there's no newlines in the string; reuse read_result */ for (read_result = slvals.outbuffer; *read_result; read_result++) { if (*read_result == '\n' || *read_result == '\r') { *read_result = ' '; } } /* assemble command string for refdbd */ strcat(slvals.outbuffer, " -u "); strcat(slvals.outbuffer, username); if (*passwd) { strcat(slvals.outbuffer, " -w "); strcat(slvals.outbuffer, scrambled_passwd); } strcat(slvals.outbuffer, " -d "); strcat(slvals.outbuffer, db); if (n_remove) { strcat(slvals.outbuffer, " -r "); } LOG_PRINT(LOG_DEBUG, slvals.outbuffer); getsimplelist(&slvals, 1); /* iwrite(slvals.n_sockfd, "POS", 4); */ close(slvals.n_sockfd); delete_all_lilimem(&sentinel); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ com_updatejo(): update the journal name synonyms int com_updatejo 0 if successful, 1 if error char *arg the spec of the note which are to be viewed ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int com_updatejo (char* arg) { char outbuffer[COMMAND_INBUF_LEN]; /* holds the command for the server */ char* infile; char inbuffer[COMMAND_INBUF_LEN] = ""; char db[_POSIX_PATH_MAX+1] = ""; char **inargv; /* tokens of the argument */ char *newarg; char *read_result; char scrambled_passwd[PASSWD_LENGTH*3+1] = ""; int inargc = 0; /* number of tokens of the argument */ int inargcmax; /* maximum number of tokens */ int result; int i; int n_opt; int n_read_file = 0; /* indicates -f switch */ int n_cmdlinerror = 0; FILE *infilefp; FILE* errstream; struct lilimem sentinel; struct simplelistvals slvals; errstream = (n_cgi) ? stdout : stderr; slvals.outbuffer = outbuffer; strcpy(slvals.outbuffer, "updatejo "); slvals.n_file_open = 0; slvals.n_file_append = 0; slvals.n_pipe = 0; slvals.outfile = NULL; slvals.outpipe = NULL; sentinel.ptr_mem = NULL; sentinel.ptr_next = NULL; sentinel.varname[0] = '\0'; strcpy(db, current_db); /* use default db if set */ /* parse the argument. first we cut the argument into pieces with strtok, then we use getopt to interpret */ /* get a buffer to hold the tokens. Start with 10 tokens, increase in steps of 10 as needed */ inargc = 0; inargcmax = 10; inargv = malloc((size_t)inargcmax*sizeof(char*)); if (inargv == NULL) { return 1; } if (insert_lilimem(&sentinel, (void**)&inargv, NULL)) { return 1; } /* the following is a temporary hack to allow cmdln_tokenize to work */ newarg = malloc((size_t)(strlen(arg)+8)); if (newarg == NULL) { delete_all_lilimem(&sentinel); return 1; } if (insert_lilimem(&sentinel, (void**)&newarg, NULL)) { delete_all_lilimem(&sentinel); return 1; } strcpy(newarg, "addlink "); strcat(newarg, arg); result = cmdln_tokenize(&inargc, &inargv, inargcmax, newarg); if (result == 1 || result == 2) { /* memory error */ delete_all_lilimem(&sentinel); return 1; } /* now we have the tokens nicely arranged in inargc */ /* for (i = 0; i < inargc; i++) { */ /* printf("inargv[%d]: %s\n", i, inargv[i]); */ /* } */ /* get options */ optind = 0; while ((n_opt = getopt(inargc, inargv, "aA:c:C:d:e:E:f:F:g:G:hi:kl:L:o:O:p:Pqr:R:s:S:t:T:u:U:vVw:")) != -1) { switch(n_opt) { case 'c': /* printf("-c %s\n", optarg); */ slvals.outpipe = malloc(strlen(optarg)+1); if (slvals.outpipe == NULL) { delete_all_lilimem(&sentinel); return 0; } strcpy(slvals.outpipe, optarg); if (insert_lilimem(&sentinel, (void**)&slvals.outpipe, NULL)) { delete_all_lilimem(&sentinel); return 1; } slvals.n_pipe = 1; break; case 'd': /* printf("-d %s\n", optarg); */ strncpy(db, optarg, _POSIX_PATH_MAX - 1); /* override preset db */ db[_POSIX_PATH_MAX-1] = '\0'; /* terminate in case string got truncated */ break; /* case 'f': */ /* if (!strcmp(optarg, "stdin")) { */ /* n_read_stdin = 1; */ /* } */ /* else { */ /* infile = canonicalize_path(optarg); */ /* if (insert_lilimem(&sentinel, (void**)&infile, NULL)) { */ /* delete_all_lilimem(&sentinel); */ /* return 1; */ /* } */ /* n_read_file = 1; */ /* } */ /* break; */ case 'h': printf("Updates the synonyms of a given journal.\nSyntax: updatejo [-c command] [-d database] [-h] [-o outfile] [-O outfile] :JO:|:JF:|:J1:|:J2:=journal :XY:=name [:XY:=name1...]\nThe first argument selects the journal by its short name, full name, user abbreviation1, or user abbreviation2, respectively\nXY is one of JO|JF|J1|J2 and sets the corresponding synonym to the supplied name\nOptions: -c command pipe the output through command\n -d database specify the database to work with\n -h prints this mini-help\n -o outfile save the output in outfile (overwrite)\n -O outfile append the output to outfile\n"); delete_all_lilimem(&sentinel); return 0; break; case 'o': /* printf("-o %s\n", optarg); */ slvals.outfile = canonicalize_path(optarg); if (insert_lilimem(&sentinel, (void**)&slvals.outfile, NULL)) { delete_all_lilimem(&sentinel); return 1; } slvals.n_file_open = 1; break; case 'O': /* printf("-O %s\n", optarg); */ slvals.outfile = canonicalize_path(optarg); if (insert_lilimem(&sentinel, (void**)&slvals.outfile, NULL)) { delete_all_lilimem(&sentinel); return 1; } slvals.n_file_append = 1; break; /* now all the options that main has already taken care of */ case 'a': case 'A': case 'C': /* fall through */ case 'e': case 'E': case 'f': case 'F': case 'g': case 'G': case 'i': case 'k': case 'l': case 'L': case 'p': case 'P': case 'q': case 'R': case 's': case 'S': case 't': case 'T': case 'u': case 'U': case 'v': case 'V': case 'w': break; case ':': fprintf(stderr, "missing option\n"); n_cmdlinerror = 1; break; case '?': fprintf(stderr, "unknown option\n"); n_cmdlinerror = 1; break; } } /* get arguments */ /* for (i = optind; i < inargc; i++) { */ /* printf("argument %s\n", inargv[i]); */ /* } */ if (!*db) { fprintf(errstream, "Don't know which database to use. Select one with selectdb or use the -d switch with updatejo\n"); delete_all_lilimem(&sentinel); return 1; } if (n_cmdlinerror) { delete_all_lilimem(&sentinel); return 1; } if (connect_to_server(&slvals.n_sockfd, server_ip, port_address) != 0) { delete_all_lilimem(&sentinel); return 1; } strcpy(scrambled_passwd, passwd); if (init_dialog(slvals.n_sockfd, scrambled_passwd, inbuffer)) { delete_all_lilimem(&sentinel); close(slvals.n_sockfd); return 1; } if (n_read_file || n_read_stdin) { if (!n_read_stdin) { infilefp = fopen(infile, "rb"); if (infilefp == NULL) { send_status(slvals.n_sockfd, 112, TERM_NO); delete_all_lilimem(&sentinel); close(slvals.n_sockfd); return 1; } } else { infilefp = stdin; /* stdin is already open */ } read_result = fgets(slvals.outbuffer+strlen(slvals.outbuffer), COMMAND_INBUF_LEN-strlen(slvals.outbuffer), infilefp); if (!n_read_stdin) { /* don't close stdin */ fclose(infilefp); } if (read_result == NULL) { send_status(slvals.n_sockfd, 112, TERM_NO); delete_all_lilimem(&sentinel); close(slvals.n_sockfd); return 1; } } else { if (optind < inargc) { strcat(slvals.outbuffer, "\""); /* printf("%d\n", optind); */ for (i = optind; i < inargc; i++) { /* printf("inargv[%d]: %s<<\n", i, inargv[i]); */ /* the tokenizer returns a quoted item as a separate token even if there is no space between e.g. a '=' and the quoted item. To rectify this, check whether the previous item ended with a '=' */ if (slvals.outbuffer[strlen(slvals.outbuffer)-1] != '=') { strcat(slvals.outbuffer, inargv[i]); if (slvals.outbuffer[strlen(slvals.outbuffer)-1] != '=') { strcat(slvals.outbuffer, " "); } } else { /* quote item */ strcat(slvals.outbuffer, "\'"); /* in order to allow e.g. single quotes in journal names we must escape the string properly. It will be unescaped on the server side */ escape_chars(slvals.outbuffer + strlen(slvals.outbuffer), inargv[i], strlen(inargv[i]), "'\""); strcat(slvals.outbuffer, "\' "); } } strcpy(&slvals.outbuffer[strlen(slvals.outbuffer)-1], "\""); /* remove trailing space */ } } /* ToDo: do we need this here? */ /* make sure there's no newlines in the string; reuse read_result */ for (read_result = slvals.outbuffer; *read_result; read_result++) { if (*read_result == '\n' || *read_result == '\r') { *read_result = ' '; } } /* assemble command string for refdbd */ strcat(slvals.outbuffer, " -u "); strcat(slvals.outbuffer, username); if (*passwd) { strcat(slvals.outbuffer, " -w "); strcat(slvals.outbuffer, scrambled_passwd); } strcat(slvals.outbuffer, " -d "); strcat(slvals.outbuffer, db); LOG_PRINT(LOG_DEBUG, slvals.outbuffer); getsimplelist(&slvals, 1); close(slvals.n_sockfd); delete_all_lilimem(&sentinel); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ postprocess_var(): checks and converts as necessary config variables int postprocess_var returns 0 if ok, 1 if error const char* varname name of the variable to check ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int postprocess_var(const char* varname) { int result; char* canpath; if (varname == NULL || !varname[0]) { /* make sure we have something to compare */ return 1; } /* individual treatment for each variable */ if (!strcmp(varname, "logfile")) { /* nothing to do */ return 0; } else if (!strcmp(varname, "logdest")) { n_log_dest = num_logdest(log_dest); return 0; } else if (!strcmp(varname, "loglevel")) { n_log_level = num_loglevel(log_level); return 0; } else if (!strcmp(varname, "pager")) { /* nothing to do */ return 0; } else if (!strcmp(varname, "passwd")) { if (strcmp(passwd, "*") == 0) { ask_for_passwd(passwd); } return 0; } else if (!strcmp(varname, "port")) { if (!is_port(port_address)) { fprintf(stderr, "%s is no valid port\n", port_address); if (n_verbose) { fprintf(stderr, "Port addresses below 1024 are reserved for system use. refdb should use a port higher than 1024. The server and all clients must use the same port.\n"); } return 1; } return 0; } else if (!strcmp(varname, "serverip")) { result = check_ip(server_ip); /* reuse i */ if (result > 0) { if (result==1) { fprintf(stderr, "\'%s\' cannot be resolved as a hostname\n", server_ip); } else if (result==2) { fprintf(stderr, "\'%s\' does not appear to be an IP host\n", server_ip); } else if (result==3) { fprintf(stderr, "\'%s\' does not appear to have a valid IP address\n", server_ip); } else if (result==4) { fprintf(stderr, "\'%s' has more than one network interface. Please specify one IP address\n", server_ip); } return 1; } else if (result==-1) { /* silently change 'localhost' to '127.0.0.1' */ strcpy(server_ip, "127.0.0.1"); } return 0; } else if (!strcmp(varname, "timeout")) { n_refdb_timeout = atoi(refdb_timeout); return 0; } else if (!strcmp(varname, "username")) { if (!username[0] && getlogin()) { strcpy(username, getlogin()); /* although not recommended, the login name is a good guess */ return 0; } else if (!username[0]) { return 1; } return 0; } else if (!strcmp(varname, "verbose")) { n_verbose = (verbose[0] == 't') ? 1:0; return 0; } else if (!strcmp(varname, "defaultris")) { if (*default_ris) { canpath = canonicalize_path(default_ris); if (!canpath || strlen(canpath) >= PREFS_BUF_LEN) { if (canpath) { free(canpath); } return 0; /* do nothing, keep existing path */ } strcpy(default_ris, canpath); free(canpath); } /* else: do nothing, no file selected */ return 0; } else if (!strcmp(varname, "pdfroot")) { /* nothing to do */ return 0; } else if (!strcmp(varname, "fields")) { /* nothing to do */ return 0; } else if (!strcmp(varname, "autokill")) { /* nothing to do */ return 0; } else if (!strcmp(varname, "defaultdb")) { /* nothing to do */ return 0; } else if (!strcmp(varname, "cssurl")) { /* nothing to do */ return 0; } else if (!strcmp(varname, "toencoding")) { /* nothing to do */ return 0; } else if (!strcmp(varname, "fromencoding")) { /* nothing to do */ return 0; } return 1; /* should never happen */ } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ log_print(): writes a log message void log_print int priority the priority level of the log message as in syslog.h char* string a string containing the message to be logged ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ void log_print(int priority, const char* string) { /* we must have this fn in the file with main() because FILE* cannot be declared extern (??) */ time_t the_time; char timestring[256] = ""; if (n_log_dest == 0) { /* output on stderr */ fprintf(stderr, "%s\n", string); } else if (n_log_dest == 1) { /* output via syslog */ syslog(priority, "%s", string); } else { /* output in user-defined logfile */ time(&the_time); strftime(timestring, 256, "%a %b %d %H:%M:%S %Y", gmtime(&the_time)); fprintf(fp_log_file, "%d:pid=%d:%s:%s\n", priority, getpid(), timestring, string); } } #ifdef REFDB_CGI /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ alrmhandler(): handler for the SIGALRM signal. The app will exit. Purpose of this behaviour is to kill hanging CGI programs that could otherwise accumulate until the server dies of memory exhaustion void alrmhandler int sig the received signal ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ void alrmhandler(int sig) { LOG_PRINT(LOG_ERR, "received suicide alarm and exited"); exit(2); } #endif refdb-1.0.2/src/refdbc.h000755 001750 001750 00000003172 12255427652 015647 0ustar00markusmarkus000000 000000 /* refdbc.h: header file for refdbc.c */ /* markus@mhoenicka.de 3-8-00 */ /* 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ /* The functions that correspond to the commands. */ int com_addlink(char *arg); int com_addnote(char *arg); int com_addref(char *arg); int com_checkref(char *arg); int com_countref(char *arg); int com_countnote(char *arg); int com_updatenote(char *arg); int com_updateref(char *arg); int com_deletelink(char *arg); int com_deleteref(char *arg); int com_deletenote(char *arg); int com_dumpref (char* arg); int com_getref(char *arg); int com_getnote(char *arg); int com_getau(char *arg); int com_getax(char *arg); int com_geted(char *arg); int com_getas(char *arg); int com_getkw(char *arg); int com_getjo(char *arg); int com_getjf(char *arg); int com_getj1(char *arg); int com_getj2(char *arg); int com_pickref (char* arg); int com_selectdb(char *arg); int com_whichdb(char *arg); int com_updatejo (char* arg); /* other functions */ void alrmhandler(int sig); refdb-1.0.2/src/refdbd.c000755 001750 001750 00000265510 12271305660 015641 0ustar00markusmarkus000000 000000 /*++++++++++++++++++++ refdbd.c: refdb application server markus@mhoenicka.de 2000-10-02 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, see +++++++++++++++++++++++++*/ /* ToDo: linked list for socket descriptors looks ok, but does not have much effect as long as this app is not multithreaded. Test thoroughly again as soon as multithreading is implemented. Update: With multithreading still pending (and maybe never coming) and the new fork() way of doing things the linked list does not do much anyway. The overhead is small, so probably its best to just leave it there for the time being */ #include #include #include #include #include #include #include #include #include #include #include #include #include /* priority level definitions */ #include #include #include #include /* database abstraction layer */ #include #include "getopt.h" #include "linklist.h" #include "pref.h" /* depends on linklist.h */ #include "strfncs.h" #include "refdb.h" #include "backend.h" #include "refdbd.h" /* depends on backend.h */ #include "tokenize.h" #include "connect.h" #include "readris.h" #include "writeris.h" /* depends on backend.h */ #include "risdb.h" #include "enigma.h" /* password encryption */ #include "cgi.h" #include "dbfncs.h" #include "refdbdupdb.h" #include "refdbdgetref.h" #include "refdbdgetrefx.h" #include "backend-bibtex.h" #include "passwd.h" #ifndef HAVE_ATOLL long long atoll(const char *str); #endif Prefs prefs[26] = { {"serverip", ""}, {"timeout", ""}, {"port", ""}, {"dbsport", ""}, {"logfile", ""}, {"logdest", ""}, {"loglevel", ""}, {"remoteadmin", ""}, {"pidfile", ""}, {"refdblib", ""}, {"dbserver", ""}, {"defaultdb", ""}, {"keep_pnames", ""}, {"db_encoding", ""}, {"dbi_driverdir", ""}, {"keyword_scan", ""}, {"dbpath", ""}, {"upper_citekey", ""}, {"remoteconnect", ""}, {"in_encoding", ""}, {"nongeek_offset", ""}, {"db_timeout", ""}, {"share_default", ""}, {"main_db", ""}, {"no_encrypt", ""}, {"", ""} }; char log_file[PREFS_BUF_LEN] = "/var/log/refdbd.log"; /* custom log file */ char log_dest[PREFS_BUF_LEN] = "2"; /* log destination. 0=print on stderr, 1=use syslog, 2=use custom logfile */ char log_level[PREFS_BUF_LEN] = "6"; /* the maximum priority that actually gets sent out - priorities are from 0 (only highest importance) to 7 (send all log info). -1 means nothing gets logged */ char pid_file[PREFS_BUF_LEN] = "/var/run/refdbd.pid"; /* default pid file */ char port_address[PREFS_BUF_LEN] = "9734"; /* default port */ char refdb_timeout[PREFS_BUF_LEN] = "180"; /* 3 minutes default timeout */ char remote_admin[PREFS_BUF_LEN] = "f"; /* remote administration not allowed */ char remote_connect[PREFS_BUF_LEN] = "f"; /* remote connections not allowed */ char refdblib[PREFS_BUF_LEN] = ""; /* path to the shareable RefDB files */ char default_db[PREFS_BUF_LEN] = ""; /* default RefDB database */ char main_db[PREFS_BUF_LEN] = "refdb"; /* default main database */ char keep_pnames[PREFS_BUF_LEN] = ""; /* whether to keep periodical names */ char upper_citekey[PREFS_BUF_LEN] = ""; /* whether to uppercase citation keys */ char default_db_encoding[PREFS_BUF_LEN] = ""; /* default char encoding for new databases */ char default_input_encoding[PREFS_BUF_LEN] = "UTF-8"; /* default char encoding for input data */ char keyword_scan[PREFS_BUF_LEN] = ""; /* run automatic keyword scan if 't' */ char ng_offset[PREFS_BUF_LEN] = "1"; /* 0 for geeks, 1 for humans */ char db_timeout[PREFS_BUF_LEN] = "60000"; /* db-engine specific timeout */ char share_default[PREFS_BUF_LEN] = "public"; /* default notes sharing */ char no_decrypt[PREFS_BUF_LEN] = ""; /* skip password decryption if 't' */ char confdir[_POSIX_PATH_MAX+1] = ""; /* path to the config files */ char dbi_driver_dir[_POSIX_PATH_MAX+1] = ""; /* path to the libdbi drivers */ char the_fifo[_POSIX_PATH_MAX] = ""; /* full path of fifo for child->parent msg*/ int n_refdb_timeout; /* timeout in seconds */ int n_verbose = 0; /* do we want logorrhoeic output? */ int run = 1; /* main will exit when this is set to 0 */ int n_log_level = 6; /* numeric version of log_level */ int n_log_dest = 1; /* numeric version of log_dest */ int n_remote_admin = 0; /* if 1, allow remote administration with refdba */ int n_remote_connect = 0; /* if 1, allow remote connections */ int n_reopen_log = 0; /* if 1, the log file will be reopened */ int fd_fifo = -1; /* file descriptor of the fifo (child->parent communication) */ int parent_pid; /* process id of parent process */ int gotsignal = 0; /* used by signal handlers to circumvent select failure */ int n_abort_connect = 0; /* used to interrupt socket select/read/write */ int child_exitval = 0; /* exit value of a child process */ int gotchldsig = 0; /* set to 1 if SIGCHLD received */ int n_cgi = 0; /* if 1, data are requested for cgi output */ int nongeek_offset = 1; /* 0 for geeks, 1 for humans */ FILE* fp_log_file = NULL; /* a FILE pointer to a custom log file */ dbi_result dbi_style_res = NULL; /* used by backends to load style information */ struct db_caps* ptr_dbcaps = NULL; /* info about database engine capabilities */ /* forward declarations of local functions */ static void sig_handler (int sig); static void sighup_handler (int sig); static void sigchld_handler(int sig); static int postprocess_var(char* varname, char* string); static void free_bibinfo(struct bibinfo* ptr_biblio_info); /* declaration of the svn version function */ const char* svn_version(void); /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ the one and only main function int main int argc number of arguments char** argv ptr to array of ptrs to argument strings return codes (parent): 0 if successful, 1 if an error occurred return codes (child): 0 if successful 1 if an error occurred before starting to process the client command 2 if an error occurred during processing of the client command ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int main(int argc, char** argv) { int server_sockfd, client_sockfd; /* sockets used for client/server dialog */ int server_len; int i, j, n_opt; /* flags, result, */ int n_pipe_buf = 512; /* maximum size of atomic write to fifo. 512 is the posix value. if the OS defines a larger value, this will be used below */ int num_drivers = 0; /* number of libdbi drivers */ int n_have_requested_driver = 0; /* used to check the libdbi drivers */ int is_first_child = 1; /* will be reset after fork, for child actions that should run only once per server instance */ int n_updatedb = 0; /* if 1, update main database and exit */ int n_checkdb = 0; /* if 1, check main database and exit */ int n_nofork = 0; /* if 1, do not fork */ socklen_t client_len; struct sockaddr_in server_address; struct sockaddr_in client_address; fd_set readfds, testfds; int readinit = 1; int n_standalone = 0; /* if 0, runs as daemon; if not 0, runs as app */ size_t n_byte_written; char pid_buffer[32]; char ip_or_path[PREFS_BUF_LEN] = ""; char empty_string = '\0'; char *msg_buffer; /* buffer for log messages */ struct olili first_olili; /* ordered linked list for socket fds */ char* fifo_buffer; struct sigaction new_action, old_action; struct sigaction new_hup_action, old_hup_action; struct sigaction new_chld_action, old_chld_action; struct CLIENT_REQUEST* ptr_clrequest; dbi_driver driver; /* signal stuff */ new_action.sa_handler = sig_handler; sigemptyset(&new_action.sa_mask); new_action.sa_flags = 0; new_hup_action.sa_handler = sighup_handler; sigemptyset(&new_hup_action.sa_mask); new_hup_action.sa_flags = 0; new_chld_action.sa_handler = sigchld_handler; sigemptyset(&new_chld_action.sa_mask); new_chld_action.sa_flags = SA_NOCLDSTOP; /* ignore stopped children */ if ((sigaction(SIGINT, &new_action, &old_action) != 0) || (sigaction(SIGTERM, &new_action, &old_action) != 0)) { LOG_PRINT(LOG_CRIT, "initializing signal handler failed"); exit(1); } if (sigaction(SIGHUP, &new_hup_action, &old_hup_action) != 0) { LOG_PRINT(LOG_CRIT, "initializing signal handler failed"); exit(1); } if (sigaction(SIGCHLD, &new_chld_action, &old_chld_action) != 0) { LOG_PRINT(LOG_CRIT, "initializing signal handler failed"); exit(1); } /* initialize CLIENT_REQUEST structure (wish I had a constructor) */ if ((ptr_clrequest = new_client_request()) == NULL) { exit(1); } ptr_clrequest->ptr_optind = &optind; ptr_clrequest->argument = &empty_string; strcpy(ptr_clrequest->db_path, "/var/lib/refdb/db"); /* use the FHS value as default */ /* initialize array of init file variables */ prefs[0].varvalue = ptr_clrequest->server_ip; prefs[1].varvalue = refdb_timeout; prefs[2].varvalue = port_address; prefs[3].varvalue = ptr_clrequest->dbs_port_address; prefs[4].varvalue = log_file; prefs[5].varvalue = log_dest; prefs[6].varvalue = log_level; prefs[7].varvalue = remote_admin; prefs[8].varvalue = pid_file; prefs[9].varvalue = refdblib; prefs[10].varvalue = ptr_clrequest->dbserver; prefs[11].varvalue = default_db; prefs[12].varvalue = keep_pnames; prefs[13].varvalue = default_db_encoding; prefs[14].varvalue = dbi_driver_dir; prefs[15].varvalue = keyword_scan; prefs[16].varvalue = ptr_clrequest->db_path; prefs[17].varvalue = upper_citekey; prefs[18].varvalue = remote_connect; prefs[19].varvalue = default_input_encoding; prefs[20].varvalue = ng_offset; prefs[21].varvalue = db_timeout; prefs[22].varvalue = share_default; prefs[23].varvalue = main_db; prefs[24].varvalue = no_decrypt; *dbi_driver_dir = '\0'; /* a slimy hack to detect options before we run getopt */ j = 2; for (i = 0; i < argc; i++) { if (argv[i][0] == '-' && argv[i][1] == 'q') { readinit = 0; j--; if (!j) { break; } } if (argv[i][0] == '-' && argv[i][1] == 'y') { strncpy(confdir, argv[i+1], _POSIX_PATH_MAX); confdir[_POSIX_PATH_MAX] = '\0'; j--; if (!j) { break; } } } if (readinit) { /* -q was not used */ /* read config file settings */ read_prefs(prefs, "refdbdrc", 0); } /* read command line settings. These may override the config file settings */ while ((n_opt = getopt(argc, argv, "ab:cd:D:e:E:hi:IkKl:L:m:M:np:P:qrsS:T:u:UvVw:xy:Y:")) != -1) { switch (n_opt) { case 'a': n_updatedb = 1; break; case 'b': strncpy(ptr_clrequest->dbs_port_address, optarg, PREFS_BUF_LEN); ptr_clrequest->dbs_port_address[PREFS_BUF_LEN-1] = '\0'; break; case 'c': n_checkdb = 1; break; case 'd': strncpy(default_db, optarg, PREFS_BUF_LEN); default_db[PREFS_BUF_LEN-1] = '\0'; break; case 'D': strncpy(ptr_clrequest->dbserver, optarg, PREFS_BUF_LEN); ptr_clrequest->dbserver[PREFS_BUF_LEN-1] = '\0'; break; case 'e': strncpy(log_dest, optarg, PREFS_BUF_LEN); log_dest[PREFS_BUF_LEN-1] = '\0'; break; case 'E': strncpy(default_db_encoding, optarg, PREFS_BUF_LEN); default_db_encoding[PREFS_BUF_LEN-1] = '\0'; break; case 'h': fprintf(stderr, "Usage: refdbd [-a] [-b dbs_port] [-c] [-d database] [-D dbserver] [-e dest] [-E encoding] [-h] [-i address] [-I] [-k] [-K] [-l level] [-L file] [-m time] [-M main_db] [-p port] [-P PIDfile] [-q] [-r] [-s] [-T time] [-u] [-v] [-V] [-y confdir] [-Y driverdir]\nOptions: -a update main database and exit\n -b set database server port\n -c check connection and main database and exit\n -d set default reference database\n -D select database server (mysql|pgsql|sqlite|sqlite3)\n -e set log destination to dest (0-2)\n -h prints this help\n -i set server IP address to address\n -I allow remote connections\n -k keep periodical names when deleting references\n -K activate automatic keyword scan\n -l set the log level to level (0<=level<=7)\n -L use file as log-file (full path)\n -m set database timeout to time\n -M set name of main database\n -p set refdbd port\n -P set path to PID file\n -q ignore init-file\n -r allow remote administration\n -s run standalone, not as daemon\n -S set notes sharing (public|private)\n -T set timeout to time\n -U uppercase citation keys (for SGML)\n -v show version information\n -V switch to verbose mode\n -y look for configuration files in confdir\n -Y look for dbi drivers in driverdir\n"); free(ptr_clrequest); exit (0); break; case 'i': strncpy(ip_or_path, optarg, PREFS_BUF_LEN); ip_or_path[PREFS_BUF_LEN - 1] = '\0'; break; case 'I': strcpy(remote_connect, "t"); break; case 'k': strcpy(keep_pnames, "t"); break; case 'K': strcpy(keyword_scan, "t"); break; case 'l': strncpy(log_level, optarg, PREFS_BUF_LEN); log_level[PREFS_BUF_LEN-1] = '\0'; break; case 'L': strncpy(log_file, optarg, PREFS_BUF_LEN); log_file[PREFS_BUF_LEN-1] = '\0'; break; case 'm': strncpy(db_timeout, optarg, PREFS_BUF_LEN); db_timeout[PREFS_BUF_LEN - 1] = '\0'; break; case 'M': strncpy(main_db, optarg, PREFS_BUF_LEN); main_db[PREFS_BUF_LEN-1] = '\0'; break; case 'n': n_nofork = 1; break; case 'p': strncpy(port_address, optarg, PREFS_BUF_LEN); port_address[PREFS_BUF_LEN - 1] = '\0'; break; case 'P': strncpy(pid_file, optarg, PREFS_BUF_LEN); pid_file[PREFS_BUF_LEN-1] = '\0'; break; case 'q': readinit = 0; break; case 'r': strcpy(remote_admin, "t"); break; case 's': n_standalone = 1; break; case 'S': strncpy(share_default, optarg, PREFS_BUF_LEN); share_default[PREFS_BUF_LEN - 1] = '\0'; break; case 'T': strncpy(refdb_timeout, optarg, PREFS_BUF_LEN); refdb_timeout[PREFS_BUF_LEN - 1] = '\0'; break; case 'u': strncpy(ptr_clrequest->username, optarg, USERNAME_LENGTH); ptr_clrequest->username[USERNAME_LENGTH-1] = '\0'; break; case 'U': strcpy(upper_citekey, "t"); break; case 'v': printf("refdbd %s built from svn revision %s markus@mhoenicka.de\nYou may redistribute and modify this software under the terms of the GNU General Public License.\n", VERSION, svn_version()); free(ptr_clrequest); exit (0); break; case 'V': n_verbose = 1; break; case 'w': strncpy(ptr_clrequest->passwd, optarg, PREFS_BUF_LEN); ptr_clrequest->passwd[PREFS_BUF_LEN-1] = '\0'; /* todo: allow '*' to hide password */ break; case 'x': strcpy(no_decrypt, "t"); break; case 'y': /* do nothing here, option is used before getopt runs */ break; case 'Y': strncpy(dbi_driver_dir, optarg, _POSIX_PATH_MAX); dbi_driver_dir[_POSIX_PATH_MAX] = '\0'; break; case ':': fprintf(stderr, "Usage: refdbd [-a] [-b dbs_port] [-c] [-d database] [-D dbserver] [-e dest] [-E encoding] [-h] [-i address] [-I] [-k] [-K] [-l level] [-L file] [-m time] [-p port] [-P PIDfile] [-q] [-r] [-s] [-T time] [-u] [-v] [-V] [-x] [-y confdir] [-Y driverdir]\nOptions: -a update main database and exit\n -b set database server port\n -c check connection and main database and exit\n -D select database server (mysql|pgsql|sqlite|sqlite3)\n -e set log destination to dest (0-2)\n -h prints this help\n -i set server IP address to address\n -I allow remote connections\n -k keep periodical names when deleting references\n -K activate automatic keyword scan\n -l set the log level to level (0<=level<=7)\n -L use file as log-file (full path)\n -m set database timeout to time\n -p set refdbd port\n -P set path to PID file\n -q ignore init-file\n -r allow remote administration\n -s run standalone, not as daemon\n -S set notes sharing (public|private)\n -T set timeout to time\n -U uppercase citation keys (for SGML)\n -v show version information\n -V switch to verbose mode\n -x use unencrypted passwords\n -y look for configuration files in confdir\n -Y look for dbi drivers in driverdir\n"); free(ptr_clrequest); exit (1); break; case '?': fprintf(stderr, "unknown option %c: use refdbd -h to display usage\n", optopt); free(ptr_clrequest); exit (1); break; } } /* translate some command line settings into numeric values */ n_refdb_timeout = atoi(refdb_timeout); n_log_level = num_loglevel(log_level); n_log_dest = num_logdest(log_dest); n_remote_admin = (*remote_admin == 't') ? 1:0; n_remote_connect = (*remote_connect == 't') ? 1:0; nongeek_offset = atoi(ng_offset); ptr_clrequest->db_timeout = atoi(db_timeout); ptr_clrequest->share_default = (!strcmp(share_default, "public")) ? 1:0; /* uppercase the encoding names */ strup(default_db_encoding); strup(default_input_encoding); /* see whether we have a username */ if (postprocess_var("username", ptr_clrequest->username)) { fprintf(stderr, "incorrect username\n"); exit (1); } /* see whether we need a password */ postprocess_var("passwd", ptr_clrequest->passwd); if ((!strcmp(ptr_clrequest->dbserver, "sqlite") || !strcmp(ptr_clrequest->dbserver, "sqlite3")) && *ip_or_path) { strcpy(ptr_clrequest->db_path, ip_or_path); } else { if (*ip_or_path) { strcpy(ptr_clrequest->server_ip, ip_or_path); } i = check_ip(ptr_clrequest->server_ip); /* reuse i */ if (i > 0) { if (i==1) { fprintf(stderr, "\'%s\' cannot be resolved as a hostname\n", optarg); } else if (i==2) { fprintf(stderr, "\'%s\' does not appear to be an IP host\n", optarg); } else if (i==3) { fprintf(stderr, "\'%s\' does not appear to have a valid IP address\n", optarg); } else if (i==4) { fprintf(stderr, "\'%s' has more than one network interface. Please specify one IP address\n", optarg); } free(ptr_clrequest); exit (1); } /* else: server_ip contains either a valid IP address, or 'localhost' */ } /* end if not sqlite */ if (!n_standalone && !n_updatedb && !n_checkdb) { if (daemonize(NULL)) { /* could not start as a daemon */ LOG_PRINT(LOG_CRIT, "could not start as a daemon"); free(ptr_clrequest); exit(1); } } parent_pid = getpid(); /* write PID to pidfile */ if ((fp_log_file = fopen(pid_file, "wb")) == NULL) { /* reuse fp_log_file */ fprintf(stderr, "cannot open PID file\n"); free(ptr_clrequest); exit(1); } else { sprintf(pid_buffer, "%d", parent_pid); if ((n_byte_written = fwrite(pid_buffer, sizeof(char), strlen(pid_buffer), fp_log_file)) < strlen(pid_buffer)) { fprintf(stderr, "cannot write to PID file\n"); } fclose(fp_log_file); fp_log_file = NULL; /* reset file ptr */ } /* set up logging */ if (n_log_dest == 2) { /* use custom log file */ if ((fp_log_file = fopen(log_file, "ab")) == NULL) { n_log_dest = 1; /* fall back to syslog */ openlog("refdbd", LOG_PID|LOG_ODELAY, LOG_USER); LOG_PRINT(LOG_WARNING, "could not open custom log file"); } } else if (n_log_dest == 1) { /* use syslog */ openlog("refdbd", LOG_PID|LOG_ODELAY, LOG_USER); } /* printf("level %d; dest %d, file %s\n", n_log_level, n_log_dest, log_file); */ /* get us some buffer for log messages */ msg_buffer = malloc(MSG_BUF_SIZE); if (msg_buffer == NULL) { LOG_PRINT(LOG_CRIT, "Out of memory"); free(ptr_clrequest); exit(1); } /* check database abstraction layer */ LOG_PRINT(LOG_DEBUG, "dbi_driver_dir went to:"); LOG_PRINT(LOG_DEBUG, dbi_driver_dir); if (*dbi_driver_dir == '/') { num_drivers = my_dbi_initialize(dbi_driver_dir, &(ptr_clrequest->inst)); LOG_PRINT(LOG_DEBUG, "dbi is up using driver dir:"); LOG_PRINT(LOG_DEBUG, dbi_driver_dir); } else { num_drivers = my_dbi_initialize(NULL, &(ptr_clrequest->inst)); LOG_PRINT(LOG_DEBUG, "dbi is up using default driver dir"); } if (num_drivers < 0) { LOG_PRINT(LOG_CRIT, "Unable to initialize libdbi! Make sure you specified a valid driver directory."); my_dbi_shutdown(ptr_clrequest->inst); free(ptr_clrequest); free(msg_buffer); exit(1); } else if (num_drivers == 0) { LOG_PRINT(LOG_ERR, "Initialized libdbi, but no drivers were found!"); my_dbi_shutdown(ptr_clrequest->inst); free(ptr_clrequest); free(msg_buffer); exit(1); } driver = NULL; LOG_PRINT(LOG_INFO, "Available libdbi database drivers:"); while ((driver = my_dbi_driver_list(driver, ptr_clrequest->inst)) != NULL) { /* check whether requested driver is available */ if (!strcmp(ptr_clrequest->dbserver, dbi_driver_get_name(driver))) { n_have_requested_driver++; } LOG_PRINT(LOG_INFO, dbi_driver_get_name(driver)); } if (!n_have_requested_driver) { LOG_PRINT(LOG_ERR, "Requested libdbi driver is not present"); my_dbi_shutdown(ptr_clrequest->inst); free(ptr_clrequest); free(msg_buffer); exit(1); } LOG_PRINT(LOG_INFO, "Requested libdbi driver found:"); LOG_PRINT(LOG_INFO, ptr_clrequest->dbserver); /* check database directory */ LOG_PRINT(LOG_INFO, "Database directory:"); LOG_PRINT(LOG_INFO, ptr_clrequest->db_path); /* update or check the main database version and exit */ if (n_updatedb || n_checkdb) { int retval; if (*default_db_encoding) { strcpy(ptr_clrequest->db_encoding, default_db_encoding); } else { strcpy(ptr_clrequest->db_encoding, "UTF-8"); } retval = update_main_db(ptr_clrequest, n_updatedb); if (retval) { if (n_updatedb) { fprintf(stderr, "maintenance of main database failed\n"); } else { fprintf(stderr, "main database check failed\n"); } } my_dbi_shutdown(ptr_clrequest->inst); free(ptr_clrequest); free(msg_buffer); if (fp_log_file != NULL) { fclose(fp_log_file); /* not strictly necessary here, but it's nicer */ } exit(retval); } /* shutdown for the time being. Each child will initialize libdbi again */ my_dbi_shutdown(ptr_clrequest->inst); LOG_PRINT(LOG_INFO, "application server started"); if (ptr_clrequest->share_default) { LOG_PRINT(LOG_INFO, "share extended notes by default"); } else { LOG_PRINT(LOG_INFO, "hide extended notes by default"); } if (*default_db) { sprintf(msg_buffer, "use %s as default database", default_db); LOG_PRINT(LOG_DEBUG, msg_buffer); } /* add pid to fifo name. This way, multiple copies of refdbd can run */ sprintf(the_fifo, "%s%d", FIFO_NAME, parent_pid); sprintf(msg_buffer, "use %s as fifo", the_fifo); LOG_PRINT(LOG_DEBUG, msg_buffer); /* prepare a fifo for child->parent communication */ /*#ifdef HAVE_MKFIFO */ #ifndef __CYGWIN__ /* e.g. cygwin (1.1.7) does not implement mkfifo/named pipes */ /* we emulate a fifo with a temporary file. To be polite, this is less than perfect, but it kinda works */ /* create "fifo" if necessary and open for non-blocking read */ if (access(the_fifo, F_OK) == -1) { if (mkfifo(the_fifo, 0777) != 0) { LOG_PRINT(LOG_WARNING, "could not create fifo"); } else { fd_fifo = open(the_fifo, O_RDONLY | O_NONBLOCK); } } else { fd_fifo = open(the_fifo, O_RDONLY | O_NONBLOCK); } if (fd_fifo == -1) { LOG_PRINT(LOG_WARNING, "could not open fifo"); } #else if (access(the_fifo, F_OK) != -1) { unlink(the_fifo); /* most likely crash leftover */ } #endif /* HAVE_MKFIFO */ /* get a fifo buffer for reading data */ #ifdef PIPE_BUF n_pipe_buf = PIPE_BUF; /* this may be larger than _POSIX_PIPE_BUF */ #endif fifo_buffer = malloc(n_pipe_buf); if (fifo_buffer == NULL) { LOG_PRINT(LOG_CRIT, "Out of memory"); free(ptr_clrequest); free(msg_buffer); exit(1); } /* set up socket */ server_sockfd = socket(AF_INET, SOCK_STREAM, 0); /* printf("setting server socket to %d\n", server_sockfd); */ server_address.sin_family = AF_INET; server_address.sin_addr.s_addr = htonl(INADDR_ANY); server_address.sin_port = htons((unsigned short int)atoi(port_address)); server_len = sizeof(server_address); bind(server_sockfd, (struct sockaddr *)&server_address, server_len); listen(server_sockfd, 10); /* signal(SIGCHLD, SIG_IGN); *//* don't wait til child completes */ FD_ZERO(&readfds); FD_SET(server_sockfd, &readfds); /* initialize linked list for socket descriptors */ first_olili.fd = server_sockfd; first_olili.ptr_next = NULL; while(run) { int numbyte, numbyte1; /* number of bytes read */ int result; testfds = readfds; sprintf(msg_buffer, "server waiting n_max_fd=%d", max_olili(&first_olili)); LOG_PRINT(LOG_INFO, msg_buffer); result = select(FD_SETSIZE, &testfds, (fd_set *)0, (fd_set *)0, (struct timeval *)0); /* if select returns because of a signal, the result will be -1. This gives us a chance to test for the received signals */ if (result < 1) { if (run && gotsignal) { /* sending SIGHUP sends us here. We want to continue */ read_prefs(prefs, "refdbdrc", 0); n_refdb_timeout = atoi(refdb_timeout); n_log_level = atoi(log_level); n_log_dest = atoi(log_dest); n_reopen_log = 1; /* log file destination may have changed */ gotsignal = 0; continue; } else if (run && gotchldsig) { /* SIGCHLD */ sprintf(msg_buffer, "child exited with code %d", child_exitval); LOG_PRINT(LOG_INFO, msg_buffer); gotchldsig = 0; continue; } else if (run && !gotsignal) { LOG_PRINT(LOG_CRIT, "select failed"); free(msg_buffer); free(fifo_buffer); if (n_log_dest == 1) { closelog(); } if (fd_fifo != -1) { close(fd_fifo); unlink(the_fifo); } free(ptr_clrequest); exit(1); } else{ /* pressing Ctrl-c throws us here */ LOG_PRINT(LOG_INFO, "server exited gracefully"); free(msg_buffer); free(fifo_buffer); if (n_log_dest == 1) { closelog(); } if (fd_fifo != -1) { close(fd_fifo); unlink(the_fifo); } free(ptr_clrequest); exit(0); } } /* end if got signal */ /* loop over all reasonable file descriptors */ for (ptr_clrequest->fd = 3; ptr_clrequest->fd <= max_olili(&first_olili); ptr_clrequest->fd++) { /*#ifndef HAVE_MKFIFO*/ #ifdef __CYGWIN__ if (access(the_fifo, F_OK) != -1) { if ((fd_fifo = open(the_fifo, O_RDWR)) == -1) { /* pseudo-fifo is still open, give child a chance to finish */ sleep(1); if ((fd_fifo = open(the_fifo, O_RDWR)) != -1) { if ((numbyte = read(fd_fifo, fifo_buffer, n_pipe_buf)) > 0) { if (fifo_buffer[numbyte] != '\0') { sleep(1); if ((numbyte1 = read(fd_fifo, (void*)fifo_buffer+numbyte, n_pipe_buf)) > 0) { if (fifo_buffer[numbyte+numbyte1] != '\0') { LOG_PRINT(LOG_WARNING, "incomplete message - confserv aborted"); } else { confserv(fifo_buffer, ptr_clrequest->server_ip); } } else { LOG_PRINT(LOG_WARNING, "incomplete message - confserv aborted"); } } else { confserv(fifo_buffer, ptr_clrequest->server_ip); } close(fd_fifo); unlink(the_fifo); } } /* else: forget about it this time */ } else { /* open fifo ok */ if ((numbyte = read(fd_fifo, fifo_buffer, n_pipe_buf)) > 0) { if (fifo_buffer[numbyte-1] != '\0') { sleep(1); if ((numbyte1 = read(fd_fifo, (void*)fifo_buffer+numbyte, n_pipe_buf)) > 0) { if (fifo_buffer[numbyte+numbyte1-1] != '\0') { LOG_PRINT(LOG_WARNING, "incomplete message - confserv aborted"); } else { confserv(fifo_buffer, ptr_clrequest->server_ip); } } else { LOG_PRINT(LOG_WARNING, "incomplete message - confserv aborted"); } } else { confserv(fifo_buffer, ptr_clrequest->server_ip); } close(fd_fifo); unlink(the_fifo); } } } /* else: nothing to do */ #else if ((numbyte = read(fd_fifo, (void*)fifo_buffer, n_pipe_buf)) > 0) { /* confserv() changed some value */ if (fifo_buffer[numbyte-1] != '\0') { /* if message incomplete */ /* printf(fifo_buffer); */ sleep(1); /* give child a chance to complete the message */ if ((numbyte1 = read(fd_fifo, (void*)(fifo_buffer + numbyte), n_pipe_buf)) > 0) { /* don't use a loop to try reading indefinitely as this would hang the server if the client crashed during writing to the fifo */ if (fifo_buffer[numbyte+numbyte1-1] != '\0') { LOG_PRINT(LOG_WARNING, "incomplete message - confserv aborted"); } else { confserv(fifo_buffer, ptr_clrequest->server_ip); } } else { LOG_PRINT(LOG_WARNING, "incomplete message - confserv aborted"); } } else { confserv(fifo_buffer, ptr_clrequest->server_ip); } } /* else: no message pending */ #endif /* HAVE_MKFIFO */ if (!run) { break; } /* if some activity was detected on one of the file descriptors */ if (FD_ISSET(ptr_clrequest->fd, &testfds)) { /* this must be a client knocking on the door */ if (ptr_clrequest->fd == server_sockfd) { client_len = sizeof(client_address); client_sockfd = accept(server_sockfd, (struct sockaddr *)&client_address, &client_len); if (client_sockfd == -1) { /* accept failed */ LOG_PRINT(LOG_WARNING, "accept failed"); /* printf("errno went to %d\n", errno); */ continue; /* try another fd. Quitting here seems a bit harsh, but might be more honest */ } FD_SET(client_sockfd, &readfds); gethostname(ptr_clrequest->my_hostname, 256); strcpy(ptr_clrequest->client_ip, inet_ntoa(client_address.sin_addr)); sprintf(msg_buffer, "adding client %s on fd %d", ptr_clrequest->client_ip, client_sockfd); LOG_PRINT(LOG_INFO, msg_buffer); insert_olili(&first_olili, client_sockfd); } /* this is a real request from an existing client */ else { /* write log data to disk. otherwise the child still has all previous messages in its buffer and repeats them */ if (fp_log_file != NULL) { fflush(fp_log_file); } if (n_nofork || fork() == 0) { /* we must be child, handle request */ char format_string[MAX_FMT_LEN] = ""; char sort_string[MAX_FMT_LEN] = ""; char set_owner[PREFS_BUF_LEN] = ""; /* char db_encoding[PREFS_BUF_LEN] = ""; */ char user_host[HOSTNAME_LENGTH] = ""; char newuser_passwd[PASSWD_LENGTH+1] = ""; char wheelpos[13] = ""; /* pseudo-random string for password encryption */ char descrambled_passwd[PASSWD_LENGTH+1] = ""; char numberpasswd[PASSWD_LENGTH*3+1] = ""; char newuser_numberpasswd[PASSWD_LENGTH*3+1] = ""; char *child_msg_buffer = NULL; char *child_inbuffer = NULL; char *child_inbuffer1 = NULL; char *child_returnmsg = NULL; int n_dbi_is_up = 0; int n_client_status; int n_privatelist; /* if 1, search only personal interest list */ int n_personal; /* add only personal information */ int n_keep_id; /* keep ID of existing references in U5 */ int n_read_done; int n_malloc_failed; int n_cmdlinerror = 0; int n_inbuf_size; int n_remove; int n_readonly = 0; int retval = 0; int inargcmax; /* maximum number of tokens */ int ref_format = 0; /* format for output */ int in_format = 0; /* format for input */ int n_all = 0; /* getjournal: return all synonyms if 1 */ int n_frequency = 0; /* if 1, provide frequency info */ size_t msg_size; struct ADDRESULT* ptr_addresult; /* will hold result of addref */ struct bibinfo* ptr_biblio_info = NULL; /* bibliographic info for getref */ struct CLIENT_REQUEST* ptr_child_clrequest = NULL; Lilid id_sentinel; /* linked list for addref keyword scan */ id_sentinel.ptr_next = NULL; if ((ptr_addresult = new_addresult(1024)) == NULL || (ptr_biblio_info = new_bibinfo(format_string, sort_string)) == NULL || (ptr_child_clrequest = dup_client_request(ptr_clrequest)) == NULL) { /* out of memory */ tiwrite(ptr_child_clrequest->fd, get_status_string(801), TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); retval = 1; goto cleanup; } strcpy(ptr_child_clrequest->current_db, default_db); ptr_child_clrequest->argument = &empty_string; /* use one of the following options to debug the child process */ /* printf("child sleeps PID=%d\n", getpid()); */ /* sleep(10); */ /* alternatively you can sleep until */ /* an explicit user action (i.e., kill -CONT or "gdb, c"), */ /* using this: */ /* kill (getpid(), SIGSTOP); */ n_read_done = 0; n_inbuf_size = COMMAND_INBUF_LEN; n_malloc_failed = 0; /* get us some buffer for log messages */ child_msg_buffer = malloc(MSG_BUF_SIZE); if (child_msg_buffer == NULL) { /* out of memory */ tiwrite(ptr_child_clrequest->fd, get_status_string(801), TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); retval = 1; goto cleanup; } /* check client IP - NB we need child_msg_buf so we can't check earlier than here */ if (!n_remote_connect && strcmp(ptr_child_clrequest->client_ip, "127.0.0.1")) { retval = 1; LOG_PRINT(LOG_WARNING, "refused remote connection"); goto cleanup; } child_inbuffer = malloc((size_t)COMMAND_INBUF_LEN*sizeof(char)); if (child_inbuffer == NULL) { /* out of memory */ tiwrite(ptr_child_clrequest->fd, get_status_string(801), TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); retval = 1; goto cleanup; } child_inbuffer1 = malloc((size_t)COMMAND_INBUF_LEN*sizeof(char)); if (child_inbuffer1 == NULL) { /* out of memory */ tiwrite(ptr_child_clrequest->fd, get_status_string(801), TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); retval = 1; goto cleanup; } msg_size = MSG_BUF_SIZE; child_returnmsg = malloc(msg_size); if (child_returnmsg == NULL) { /* out of memory */ tiwrite(ptr_child_clrequest->fd, get_status_string(801), TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); retval = 1; goto cleanup; } child_returnmsg[0] = '\0'; LOG_PRINT(LOG_DEBUG, "try to read from client"); numbyte = tread(ptr_child_clrequest->fd, child_inbuffer, COMMAND_INBUF_LEN-1); if (get_trailz(child_inbuffer, numbyte) < TERM_LEN || strlen(child_inbuffer) > PROTOCOL_LENGTH) { /* if transmission incomplete or protocol version string too long */ LOG_PRINT(LOG_CRIT, get_status_msg(103)); /* invalid client request */ LOG_PRINT(LOG_CRIT, child_inbuffer); tiwrite(ptr_child_clrequest->fd, get_status_string(103), TERM_NO); retval = 1; goto cleanup; } /* child_inbuffer now contains a string that specifies the protocol version that the client wants to use. We use this information to silently adapt to the client's protocol if possible */ sprintf(child_msg_buffer, "serving client on fd %d with protocol version %s", ptr_child_clrequest->fd, child_inbuffer); LOG_PRINT(LOG_INFO, child_msg_buffer); /* save protocol identifier in client request structure */ ptr_child_clrequest->protocol = atoi(child_inbuffer); /* check protocol version */ if (ptr_child_clrequest->protocol < REFDB_MIN_CLIENT_PROTOCOL) { send_status(ptr_child_clrequest->fd, 102, TERM_NO); /* protocol versions do not match */ retval = 1; goto cleanup; } /* start of the password dialog */ randomize_wheels(wheelpos); LOG_PRINT(LOG_DEBUG, wheelpos); /* send pseudo-random string to client */ send_status(ptr_child_clrequest->fd, 0, TERM_NO); tiwrite(ptr_child_clrequest->fd, wheelpos, TERM_YES); LOG_PRINT(LOG_DEBUG, "send pseudo-random string to client"); n_client_status = read_status(ptr_child_clrequest->fd); if (n_client_status) { /* client aborted command */ LOG_PRINT(LOG_CRIT, get_status_msg(n_client_status)); retval = 1; goto cleanup; } numbyte = tread(ptr_child_clrequest->fd, child_inbuffer, COMMAND_INBUF_LEN-1); if (get_trailz(child_inbuffer, numbyte) < TERM_LEN) { /* if transmission incomplete */ /* incomplete client command */ LOG_PRINT(LOG_CRIT, get_status_msg(104)); send_status(ptr_child_clrequest->fd, 104, TERM_NO); retval = 1; goto cleanup; } /* end of the password dialog */ /* parse the client request. first we cut the request into pieces with strtok(), then we use getopt() to interpret. This code works only with GNU getopt(), not with BSD getopt() */ /* get a buffer to hold the tokens. Start with 10 tokens, increase in steps of 10 as needed */ ptr_child_clrequest->inargc = 0; inargcmax = 10; ptr_child_clrequest->inargv = malloc((size_t)inargcmax*sizeof(char*)); if (ptr_child_clrequest->inargv == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); send_status(ptr_child_clrequest->fd, 801, TERM_NO); retval = 1; goto cleanup; } LOG_PRINT(LOG_DEBUG, child_inbuffer); result = cmdln_tokenize(&(ptr_child_clrequest->inargc), &(ptr_child_clrequest->inargv), inargcmax, child_inbuffer); if (result == 1) { /* memory error */ LOG_PRINT(LOG_CRIT, get_status_msg(801)); send_status(ptr_child_clrequest->fd, 801, TERM_NO); retval = 1; goto cleanup; } else if (result == 2) { /* empty command line */ LOG_PRINT(LOG_WARNING, get_status_msg(105)); send_status(ptr_child_clrequest->fd, 105, TERM_NO); retval = 1; goto cleanup; } /* now we have the tokens nicely arranged in inargc */ /* for (i = 0; i < inargc; i++) { */ /* printf("inargv[%d]: %s\n", i, inargv[i]); */ /* } */ /* reset optional arguments */ *set_owner = '\0'; *(ptr_child_clrequest->pdfroot) = '\0'; *(ptr_child_clrequest->cgi_url) = '\0'; *(ptr_child_clrequest->passwd) = '\0'; *numberpasswd = '\0'; *(ptr_child_clrequest->username) = '\0'; strcpy(ptr_child_clrequest->current_db, default_db); *(ptr_child_clrequest->listname) = '\0'; *(ptr_child_clrequest->check_string) = '\0'; *(ptr_child_clrequest->namespace) = '\0'; *newuser_passwd = '\0'; *newuser_numberpasswd = '\0'; *user_host = '\0'; *format_string = '\0'; *sort_string = '\0'; /* strcpy(db_encoding, default_db_encoding); */ *(ptr_child_clrequest->db_encoding) = '\0'; n_privatelist = 0; n_remove = 0; n_readonly = 0; n_personal = ADDREF_UPDATE; n_keep_id = 0; n_all = 0; ref_format = 0; /* get options */ optind = 0; while ((n_opt = getopt(ptr_child_clrequest->inargc, ptr_child_clrequest->inargv, "aA:b:Bc:d:E:G:H:kn:N:o:pPQrR:s:S:t:u:U:w:W:")) != -1) { switch(n_opt) { case 'a': n_all = 1; break; case 'A': if (strcmp(optarg, "ris") == 0) { in_format = REFRIS; } else if (strcmp(optarg, "risx") == 0) { in_format = RISX; } break; case 'b': strncpy(ptr_child_clrequest->listname, optarg, PREFS_BUF_LEN); ptr_child_clrequest->listname[PREFS_BUF_LEN] = '\0'; break; case 'B': n_readonly = 1; break; case 'c': strncpy(ptr_child_clrequest->check_string, optarg, MAX_FMT_LEN-1); ptr_child_clrequest->check_string[MAX_FMT_LEN-1]='\0'; /* if string was truncated */ break; case 'd': strncpy(ptr_child_clrequest->current_db, optarg, DBNAME_LENGTH); ptr_child_clrequest->current_db[DBNAME_LENGTH] = '\0'; break; case 'E': /* used for both createdb and getref */ strncpy(ptr_child_clrequest->db_encoding, optarg, PREFS_BUF_LEN); ptr_child_clrequest->db_encoding[PREFS_BUF_LEN-1] = '\0'; strup(ptr_child_clrequest->db_encoding); break; case 'G': strncpy(ptr_child_clrequest->cgi_url, optarg, _POSIX_PATH_MAX); ptr_child_clrequest->cgi_url[_POSIX_PATH_MAX] = '\0'; break; case 'H': strncpy(user_host, optarg, HOSTNAME_LENGTH); user_host[HOSTNAME_LENGTH - 1] = '\0'; break; case 'k': n_keep_id = 1; break; case 'n': strncpy(ptr_child_clrequest->namespace, optarg, PREFS_BUF_LEN); ptr_child_clrequest->namespace[PREFS_BUF_LEN-1] = '\0'; break; case 'N': strncpy(ptr_child_clrequest->limit, optarg, PREFS_BUF_LEN); ptr_child_clrequest->limit[PREFS_BUF_LEN-1] = '\0'; break; case 'o': ptr_biblio_info->n_startnumber = (unsigned long long)atoll(optarg); break; case 'p': n_personal = ADDREF_UPDATE_PERSONAL; break; case 'P': n_privatelist = 1; break; case 'Q': n_frequency = 1; break; case 'r': n_remove = 1; break; case 'R': strncpy(ptr_child_clrequest->pdfroot, optarg, _POSIX_PATH_MAX); ptr_child_clrequest->pdfroot[_POSIX_PATH_MAX] = '\0'; break; case 's': strncpy(format_string, optarg, MAX_FMT_LEN-1); format_string[MAX_FMT_LEN-1]='\0'; /* if string was truncated */ break; case 'S': strncpy(sort_string, optarg, MAX_FMT_LEN-1); sort_string[MAX_FMT_LEN-1]='\0'; /* if string was truncated */ break; case 't': if (strcmp(optarg, "html") == 0) { ref_format = REFHTML; } else if (strcmp(optarg, "xhtml") == 0) { ref_format = REFXHTML; } else if (strcmp(optarg, "ris") == 0) { ref_format = REFRIS; } else if (strcmp(optarg, "db31") == 0) { ref_format = REFDOCBK; } else if (strcmp(optarg, "bibtex") == 0) { ref_format = REFBIBTEX; } /* ToDo: this one looks obsolete */ else if (strcmp(optarg, "dbib") == 0) { ref_format = 5; } else if (strcmp(optarg, "cgi") == 0) { ref_format = REFCGIHTML; } else if (strcmp(optarg, "cgiris") == 0) { ref_format = REFCGIRIS; } else if (strcmp(optarg, "db31x") == 0) { ref_format = REFDOCBKX; } else if (strcmp(optarg, "db50x") == 0) { ref_format = REFDOCBKX5; } else if (strcmp(optarg, "teix") == 0) { ref_format = REFTEIX; } else if (strcmp(optarg, "tei5x") == 0) { ref_format = REFTEIX5; } else if (strcmp(optarg, "rtf") == 0) { ref_format = REFRTF; } else if (strcmp(optarg, "risx") == 0) { ref_format = RISX; } else if (strcmp(optarg, "mods") == 0) { ref_format = REFMODS; } else if (strcmp(optarg, "xnote") == 0) { ref_format = XNOTE; } else if (strcmp(optarg, "citlist") == 0) { ref_format = REFCITATIONLISTX; } else { /* default is screen */ ref_format = REFSCREEN; } break; case 'u': strncpy(ptr_child_clrequest->username, optarg, USERNAME_LENGTH); ptr_child_clrequest->username[USERNAME_LENGTH - 1] = '\0'; break; case 'U': strncpy(set_owner, optarg, PREFS_BUF_LEN); set_owner[PREFS_BUF_LEN - 1] = '\0'; break; case 'w': strncpy(numberpasswd, optarg, PASSWD_LENGTH*3+1); numberpasswd[PASSWD_LENGTH*3] = '\0'; break; case 'W': strncpy(newuser_numberpasswd, optarg, PASSWD_LENGTH*3+1); newuser_numberpasswd[PASSWD_LENGTH*3] = '\0'; break; case ':': LOG_PRINT(LOG_WARNING, get_status_msg(106)); send_status(ptr_child_clrequest->fd, 106, TERM_NO); n_cmdlinerror = 1; retval = 1; goto cleanup; /* break; */ case '?': LOG_PRINT(LOG_WARNING, get_status_msg(107)); send_status(ptr_child_clrequest->fd, 107, TERM_NO); n_cmdlinerror = 1; retval = 1; goto cleanup; /* break; */ } } if (*(ptr_child_clrequest->listname) && strncmp(ptr_child_clrequest->listname, ptr_child_clrequest->username, strlen(ptr_child_clrequest->username))) { /* prefix the name with the username to put it into a separate namespace */ char prefixed_listname[PREFS_BUF_LEN+USERNAME_LENGTH+2]; strcpy(prefixed_listname, ptr_child_clrequest->username); strcat(prefixed_listname, "-"); strcat(prefixed_listname, ptr_child_clrequest->listname); /* write back result into structure member */ strcpy(ptr_child_clrequest->listname, prefixed_listname); } /* get arguments */ /* for (i = optind; i < inargc; i++) { */ /* printf("argument %s\n", inargv[i]); */ /* } */ /* set a few clrequest variables */ ptr_child_clrequest->argument = (optind < ptr_child_clrequest->inargc) ? ptr_child_clrequest->inargv[optind] : &empty_string; ptr_child_clrequest->n_cgi = (ref_format == 6 || ref_format == 7) ? 1 : 0; ptr_biblio_info->encoding = ptr_child_clrequest->db_encoding; /* descramble password */ if (*no_decrypt != 't') { denumberize_passwd(ptr_child_clrequest->passwd, numberpasswd); if (enigma_encrypt(ptr_child_clrequest->passwd, descrambled_passwd, wheelpos)) { LOG_PRINT(LOG_ERR, get_status_msg(108)); send_status(ptr_child_clrequest->fd, 108, TERM_NO); retval = 1; goto cleanup; } else { /* printf("encrypted:%s<< plain:%s<<\n", passwd, descrambled_passwd); */ strcpy(ptr_child_clrequest->passwd, descrambled_passwd); } /* descramble newuser password if there is one */ if (newuser_numberpasswd[0]) { denumberize_passwd(newuser_passwd, newuser_numberpasswd); if (enigma_encrypt(newuser_passwd, descrambled_passwd, wheelpos)) { LOG_PRINT(LOG_ERR, get_status_msg(108)); send_status(ptr_child_clrequest->fd, 108, TERM_NO); retval = 1; goto cleanup; } else { /* printf("encrypted:%s<< plain:%s<<\n", passwd, descrambled_passwd); */ strcpy(newuser_passwd, descrambled_passwd); } } } else { /* copy unencrypted passwords */ strncpy(ptr_child_clrequest->passwd, numberpasswd, PREFS_BUF_LEN); (ptr_child_clrequest->passwd)[PREFS_BUF_LEN-1] = '\0'; /* todo: ptr_child_clrequest->passwd and newuser_passwd have different maximum lenghts, they should probably be coerced to have the same length */ strncpy(newuser_passwd, newuser_numberpasswd, PASSWD_LENGTH+1); newuser_passwd[PASSWD_LENGTH] = '\0'; } /* initialize database abstraction layer. If supported by the libdbi version in use, create our own instance */ if (*dbi_driver_dir == '/') { my_dbi_initialize(dbi_driver_dir, &(ptr_child_clrequest->inst)); } else { my_dbi_initialize(NULL, &(ptr_child_clrequest->inst)); } LOG_PRINT(LOG_INFO, "dbi is up"); n_dbi_is_up++; /* check presence of main database and fiddle with version file */ { dbi_conn conn; /* libdbi connection structure */ dbi_result dbires; /* libdbi result structure */ char sql_command[] = "SELECT meta_dbversion from "MAIN_META" WHERE meta_type='refdb'"; char dbversionfile[_POSIX_PATH_MAX+1]; short int n_main_dbversion; char main_dbversion[8]; FILE* version_fp; if ((conn = connect_to_db(ptr_child_clrequest, main_db, 0)) != NULL) { /* run this only once per parent session */ if (is_first_child) { /* check version tag of main database */ dbires = dbi_conn_query(conn, sql_command); if (!dbires || !dbi_result_next_row(dbires)) { /* too old or corrupt */ LOG_PRINT(LOG_ERR, get_status_msg(203)); send_status(ptr_child_clrequest->fd, 203, TERM_NO); retval = 1; goto cleanup_db; } n_main_dbversion = dbi_result_get_short(dbires, "meta_dbversion"); if (my_dbi_conn_error_flag(conn)) { /* too old or corrupt */ LOG_PRINT(LOG_ERR, get_status_msg(203)); send_status(ptr_child_clrequest->fd, 203, TERM_NO); dbi_result_free(dbires); retval = 1; goto cleanup_db; } dbi_result_free(dbires); if (n_main_dbversion < MIN_MAIN_DB_VERSION) { LOG_PRINT(LOG_ERR, get_status_msg(206)); send_status(ptr_child_clrequest->fd, 206, TERM_NO); retval = 1; goto cleanup_db; } /* update database version file */ strncpy(dbversionfile, ptr_child_clrequest->db_path, _POSIX_PATH_MAX); dbversionfile[_POSIX_PATH_MAX] = '\0'; strncat(dbversionfile, "/DB_VERSION", _POSIX_PATH_MAX); dbversionfile[_POSIX_PATH_MAX] = '\0'; version_fp = fopen(dbversionfile, "w"); if (version_fp) { sprintf(main_dbversion, "%d", n_main_dbversion); if (fwrite(main_dbversion, strlen(main_dbversion)*sizeof(char), 1, version_fp)) { LOG_PRINT(LOG_INFO, "updated version file:"); LOG_PRINT(LOG_ERR, dbversionfile); } fclose(version_fp); } else { LOG_PRINT(LOG_ERR, "could not open version file:"); LOG_PRINT(LOG_ERR, dbversionfile); } } } else { LOG_PRINT(LOG_WARNING, get_status_msg(202)); send_status(ptr_child_clrequest->fd, 202, TERM_NO); retval = 1; goto cleanup_db; } LOG_PRINT(LOG_DEBUG, "Main database looks ok:"); LOG_PRINT(LOG_DEBUG, main_db); } /* get and initialize structure with database engine capabilities */ if ((ptr_dbcaps = new_db_caps(ptr_child_clrequest)) == NULL) { /* out of memory */ LOG_PRINT(LOG_CRIT, get_status_msg(801)); send_status(ptr_child_clrequest->fd, 801, TERM_NO); retval = 1; goto finish; } /* test for commands (still in inargv[0]) */ /*********************************************** viewstat ****/ if (strcmp((ptr_child_clrequest->inargv)[0], "viewstat") == 0) { retval = viewstat(ptr_child_clrequest); if (!retval) { strcpy(child_returnmsg, "1\n"); } else if (retval == 2) { strcpy(child_returnmsg, "0\n"); } if (retval != 1) { n_client_status = read_status(ptr_child_clrequest->fd); send_status(ptr_child_clrequest->fd, 0, TERM_NO); } } /*********************************************** listdb ****/ else if (strcmp((ptr_child_clrequest->inargv)[0], "listdb") == 0) { retval = listdb(ptr_child_clrequest, 0, ptr_addresult); if (retval != 1) { n_client_status = read_status(ptr_child_clrequest->fd); send_status(ptr_child_clrequest->fd, 0, TERM_NO); /* summary for client */ sprintf(child_returnmsg, ULLSPEC"\n", (unsigned long long)ptr_addresult->success); } } /*********************************************** listuser ****/ else if (strcmp((ptr_child_clrequest->inargv)[0], "listuser") == 0) { retval = listuser(ptr_child_clrequest, ptr_addresult); if (retval != 1) { n_client_status = read_status(ptr_child_clrequest->fd); send_status(ptr_child_clrequest->fd, 0, TERM_NO); /* summary for client */ sprintf(child_returnmsg, ULLSPEC"\n", (unsigned long long)ptr_addresult->success); } } /*********************************************** liststyle ****/ else if (strcmp((ptr_child_clrequest->inargv)[0], "liststyle") == 0) { retval = liststyle(ptr_child_clrequest, ptr_addresult); if (retval != 1) { n_client_status = read_status(ptr_child_clrequest->fd); send_status(ptr_child_clrequest->fd, 0, TERM_NO); sprintf(child_returnmsg, ULLSPEC" retrieved:"ULLSPEC" failed\n", (unsigned long long)(ptr_addresult->success), (unsigned long long)(ptr_addresult->failure)); } } /*********************************************** listword ****/ else if (strcmp((ptr_child_clrequest->inargv)[0], "listword") == 0) { retval = listword(ptr_child_clrequest, ptr_addresult); if (retval != 1) { n_client_status = read_status(ptr_child_clrequest->fd); send_status(ptr_child_clrequest->fd, 0, TERM_NO); sprintf(child_returnmsg, ULLSPEC" retrieved:"ULLSPEC" failed\n", (unsigned long long)(ptr_addresult->success), (unsigned long long)(ptr_addresult->failure)); } } /*********************************************** whichdb ****/ else if (strcmp((ptr_child_clrequest->inargv)[0], "whichdb") == 0) { retval = whichdb(ptr_child_clrequest); if (retval != 1) { n_client_status = read_status(ptr_child_clrequest->fd); send_status(ptr_child_clrequest->fd, 0, TERM_NO); /* summary for client */ strcpy(child_returnmsg, "1\n"); } } /*********************************************** createdb ****/ else if (strcmp((ptr_child_clrequest->inargv)[0], "createdb") == 0) { if (!*(ptr_child_clrequest->db_encoding)) { strcpy(ptr_child_clrequest->db_encoding, default_db_encoding); } /* test whether we have a filename argument */ if (optind == ptr_child_clrequest->inargc) { send_status(ptr_child_clrequest->fd, 111, TERM_NO); retval = 1; goto cleanup_db; } retval = createdb(ptr_child_clrequest, ptr_addresult, optind); if (retval != 1) { n_client_status = read_status(ptr_child_clrequest->fd); send_status(ptr_child_clrequest->fd, 0, TERM_NO); /* summary for client */ sprintf(child_returnmsg, ULLSPEC" created:"ULLSPEC" failed\n", (unsigned long long)ptr_addresult->success, (unsigned long long)ptr_addresult->failure); } } /*********************************************** deletedb ****/ else if (strcmp((ptr_child_clrequest->inargv)[0], "deletedb") == 0) { /* test whether we have a filename argument */ if (optind == ptr_child_clrequest->inargc) { send_status(ptr_child_clrequest->fd, 111, TERM_NO); retval = 1; goto cleanup_db; } retval = deletedb(ptr_child_clrequest, optind, ptr_addresult); if (retval != 1) { n_client_status = read_status(ptr_child_clrequest->fd); send_status(ptr_child_clrequest->fd, 0, TERM_NO); /* summary for client */ sprintf(child_returnmsg, ULLSPEC" deleted:"ULLSPEC" failed\n", (unsigned long long)ptr_addresult->success, (unsigned long long)ptr_addresult->failure); } } /*********************************************** confserv ****/ else if (strcmp((ptr_child_clrequest->inargv)[0], "confserv") == 0) { retval = child_confserv(ptr_child_clrequest, ptr_addresult); if (retval != 1) { n_client_status = read_status(ptr_child_clrequest->fd); send_status(ptr_child_clrequest->fd, 0, TERM_NO); /* summary for client */ sprintf(child_returnmsg, ULLSPEC" submitted:"ULLSPEC" failed\n", (unsigned long long)ptr_addresult->success,(unsigned long long) ptr_addresult->failure); } } /*********************************************** selectdb ****/ else if (strcmp((ptr_child_clrequest->inargv)[0], "selectdb") == 0) { retval = listdb(ptr_child_clrequest, 1, ptr_addresult); if (retval != 1) { n_client_status = read_status(ptr_child_clrequest->fd); send_status(ptr_child_clrequest->fd, 0, TERM_NO); /* summary for client */ strcpy(child_returnmsg, "1 selected\n"); } } /*********************************************** addref ****/ else if (strcmp((ptr_child_clrequest->inargv)[0], "addref") == 0) { if (!*(ptr_child_clrequest->db_encoding)) { strcpy(ptr_child_clrequest->db_encoding, default_input_encoding); } retval = addref(ptr_child_clrequest, ptr_biblio_info, set_owner, ptr_addresult, ADDREF_ADD, n_keep_id, in_format, ref_format, &id_sentinel); /* let the client know what happened */ if (retval != 1) { n_client_status = read_status(ptr_child_clrequest->fd); send_status(ptr_child_clrequest->fd, 0, TERM_NO); sprintf(child_returnmsg, ULLSPEC" added:"ULLSPEC" skipped:"ULLSPEC" failed\n", (unsigned long long)(ptr_addresult->success), (unsigned long long)(ptr_addresult->skipped), (unsigned long long)(ptr_addresult->failure)); } } /*********************************************** checkref ****/ else if (strcmp((ptr_child_clrequest->inargv)[0], "checkref") == 0) { if (!*(ptr_child_clrequest->db_encoding)) { strcpy(ptr_child_clrequest->db_encoding, default_input_encoding); } retval = addref(ptr_child_clrequest, ptr_biblio_info, set_owner, ptr_addresult, ADDREF_CHECK, n_keep_id, in_format, ref_format, &id_sentinel); /* let the client know what happened */ if (retval != 1) { n_client_status = read_status(ptr_child_clrequest->fd); send_status(ptr_child_clrequest->fd, 0, TERM_NO); sprintf(child_returnmsg, ULLSPEC" checked:"ULLSPEC" skipped:"ULLSPEC" failed\n", (unsigned long long)(ptr_addresult->success), (unsigned long long)(ptr_addresult->skipped), (unsigned long long)(ptr_addresult->failure)); } } /*********************************************** updateref ****/ else if (strcmp((ptr_child_clrequest->inargv)[0], "updateref") == 0) { if (!*(ptr_child_clrequest->db_encoding)) { strcpy(ptr_child_clrequest->db_encoding, default_input_encoding); } retval = addref(ptr_child_clrequest, ptr_biblio_info, set_owner, ptr_addresult, n_personal, n_keep_id, in_format, ref_format, &id_sentinel); /* let the client know what happened */ if (retval != 1) { n_client_status = read_status(ptr_child_clrequest->fd); send_status(ptr_child_clrequest->fd, 0, TERM_NO); sprintf(child_returnmsg, ULLSPEC" updated:"ULLSPEC" added:"ULLSPEC" skipped:"ULLSPEC" failed\n", (unsigned long long)(ptr_addresult->updated), (unsigned long long)(ptr_addresult->success), (unsigned long long)(ptr_addresult->skipped), (unsigned long long)(ptr_addresult->failure)); } } /*********************************************** deleteref ****/ else if (strcmp((ptr_child_clrequest->inargv)[0], "deleteref") == 0) { /* test whether we have a size argument */ if (optind == ptr_child_clrequest->inargc) { iwrite(ptr_child_clrequest->fd, get_status_msg(111), strlen(get_status_msg(111))); } retval = deleteref(ptr_child_clrequest, ptr_addresult); /* let the client know what happened */ if (retval != 1) { n_client_status = read_status(ptr_child_clrequest->fd); send_status(ptr_child_clrequest->fd, 0, TERM_NO); sprintf(child_returnmsg, ULLSPEC" deleted:"ULLSPEC" skipped:"ULLSPEC" failed\n", (unsigned long long)(ptr_addresult->success), (unsigned long long)(ptr_addresult->skipped), (unsigned long long)(ptr_addresult->failure)); } } /*********************************************** pickref ****/ else if (strcmp((ptr_child_clrequest->inargv)[0], "pickref") == 0) { /* test whether we have a size argument */ if (optind == ptr_child_clrequest->inargc) { send_status(ptr_child_clrequest->fd, 111, TERM_NO); retval = 1; goto cleanup_db; } retval = pickref(ptr_child_clrequest, n_remove, ptr_addresult); /* let the client know what happened */ if (retval != 1) { n_client_status = read_status(ptr_child_clrequest->fd); send_status(ptr_child_clrequest->fd, 0, TERM_NO); if (n_remove) { sprintf(child_returnmsg, ULLSPEC" dumped:"ULLSPEC" skipped:"ULLSPEC" failed\n", (unsigned long long)(ptr_addresult->success), (unsigned long long)(ptr_addresult->skipped), (unsigned long long)(ptr_addresult->failure)); } else { /* if add */ sprintf(child_returnmsg, ULLSPEC" picked:"ULLSPEC" skipped:"ULLSPEC" failed\n", (unsigned long long)(ptr_addresult->success), (unsigned long long)(ptr_addresult->skipped), (unsigned long long)(ptr_addresult->failure)); } } } /*********************************************** getref ****/ else if (strcmp((ptr_child_clrequest->inargv)[0], "getref") == 0) { retval = getref(ptr_child_clrequest, ptr_biblio_info, ref_format, n_privatelist, ptr_addresult, 1, n_frequency); if (retval != 1) { n_client_status = read_status(ptr_child_clrequest->fd); send_status(ptr_child_clrequest->fd, 0, TERM_NO); sprintf(child_returnmsg, ULLSPEC" retrieved:"ULLSPEC" failed\n", (unsigned long long)(ptr_addresult->success), (unsigned long long)(ptr_addresult->failure)); } } /*********************************************** countref ****/ else if (strcmp((ptr_child_clrequest->inargv)[0], "countref") == 0) { retval = getref(ptr_child_clrequest, ptr_biblio_info, ref_format, n_privatelist, ptr_addresult, 0, 0); if (retval != 1) { n_client_status = read_status(ptr_child_clrequest->fd); send_status(ptr_child_clrequest->fd, 0, TERM_NO); sprintf(child_returnmsg, ULLSPEC" counted\n", (unsigned long long)(ptr_addresult->success)); } } /*********************************************** getrefx ****/ else if (strcmp((ptr_child_clrequest->inargv)[0], "getrefx") == 0) { retval = getrefx(ptr_child_clrequest, ptr_biblio_info, ref_format, n_privatelist, ptr_addresult); if (retval != 1) { n_client_status = read_status(ptr_child_clrequest->fd); send_status(ptr_child_clrequest->fd, 0, TERM_NO); sprintf(child_returnmsg, ULLSPEC" retrieved:"ULLSPEC" failed\n", (unsigned long long)(ptr_addresult->success), (unsigned long long)(ptr_addresult->failure)); } } /*********************************************** addnote ****/ else if (strcmp((ptr_child_clrequest->inargv)[0], "addnote") == 0) { retval = addnote(ptr_child_clrequest, set_owner, ptr_addresult, 0, &id_sentinel); /* let the client know what happened */ if (retval != 1) { n_client_status = read_status(ptr_child_clrequest->fd); send_status(ptr_child_clrequest->fd, 0, TERM_NO); sprintf(child_returnmsg, ULLSPEC" added:"ULLSPEC" skipped:"ULLSPEC" failed\n", (unsigned long long)(ptr_addresult->success), (unsigned long long)(ptr_addresult->skipped), (unsigned long long)(ptr_addresult->failure)); } } /*********************************************** updatenote ****/ else if (strcmp((ptr_child_clrequest->inargv)[0], "updatenote") == 0) { retval = addnote(ptr_child_clrequest, set_owner, ptr_addresult, 1, &id_sentinel); /* let the client know what happened */ if (retval != 1) { n_client_status = read_status(ptr_child_clrequest->fd); send_status(ptr_child_clrequest->fd, 0, TERM_NO); sprintf(child_returnmsg, ULLSPEC" updated:"ULLSPEC" added:"ULLSPEC" skipped:"ULLSPEC" failed\n", (unsigned long long)(ptr_addresult->updated), (unsigned long long)(ptr_addresult->success), (unsigned long long)(ptr_addresult->skipped), (unsigned long long)(ptr_addresult->failure)); } } /*********************************************** deletenote ****/ else if (strcmp((ptr_child_clrequest->inargv)[0], "deletenote") == 0) { /* test whether we have an argument */ if (optind == ptr_child_clrequest->inargc) { send_status(ptr_child_clrequest->fd, 111, TERM_NO); retval = 1; goto cleanup_db; } retval = deletenote(ptr_child_clrequest, ptr_addresult); /* let the client know what happened */ if (retval != 1) { n_client_status = read_status(ptr_child_clrequest->fd); send_status(ptr_child_clrequest->fd, 0, TERM_NO); sprintf(child_returnmsg, ULLSPEC" deleted:"ULLSPEC" skipped:"ULLSPEC" failed\n", (unsigned long long)(ptr_addresult->success), (unsigned long long)(ptr_addresult->skipped), (unsigned long long)(ptr_addresult->failure)); } } /*********************************************** getnote ****/ else if (strcmp((ptr_child_clrequest->inargv)[0], "getnote") == 0) { retval = getnote(ptr_child_clrequest, ptr_biblio_info, ref_format, n_privatelist, ptr_addresult, 1 /* send data */); if (retval != 1) { n_client_status = read_status(ptr_child_clrequest->fd); send_status(ptr_child_clrequest->fd, 0, TERM_NO); sprintf(child_returnmsg, ULLSPEC" retrieved:"ULLSPEC" failed\n", (unsigned long long)(ptr_addresult->success), (unsigned long long)(ptr_addresult->failure)); } } /*********************************************** countnote ****/ else if (strcmp((ptr_child_clrequest->inargv)[0], "countnote") == 0) { retval = getnote(ptr_child_clrequest, ptr_biblio_info, ref_format, n_privatelist, ptr_addresult, 0 /* don't send data */); if (retval != 1) { n_client_status = read_status(ptr_child_clrequest->fd); send_status(ptr_child_clrequest->fd, 0, TERM_NO); sprintf(child_returnmsg, ULLSPEC" counted\n", (unsigned long long)(ptr_addresult->success)); } } /*********************************************** addlink ****/ else if (strcmp((ptr_child_clrequest->inargv)[0], "addlink") == 0) { retval = addlink(ptr_child_clrequest, set_owner, ptr_addresult, n_remove); /* let the client know what happened */ if (retval != 1) { n_client_status = read_status(ptr_child_clrequest->fd); send_status(ptr_child_clrequest->fd, 0, TERM_NO); if (n_remove) { sprintf(child_returnmsg, ULLSPEC" removed:"ULLSPEC" skipped:"ULLSPEC" failed\n", (unsigned long long)(ptr_addresult->success), (unsigned long long)(ptr_addresult->skipped), (unsigned long long)(ptr_addresult->failure)); } else { sprintf(child_returnmsg, ULLSPEC" added:"ULLSPEC" skipped:"ULLSPEC" failed\n", (unsigned long long)(ptr_addresult->success), (unsigned long long)(ptr_addresult->skipped), (unsigned long long)(ptr_addresult->failure)); } } } /*********************************************** getau *****/ else if (strcmp((ptr_child_clrequest->inargv)[0], "getau") == 0) { retval = getfoo(ptr_child_clrequest, GETAU, 0, ptr_child_clrequest->db_encoding, ptr_addresult, format_string); if (retval != 1) { n_client_status = read_status(ptr_child_clrequest->fd); send_status(ptr_child_clrequest->fd, 0, TERM_NO); /* let the client know what happened */ sprintf(child_returnmsg, ULLSPEC"\n", (unsigned long long)(ptr_addresult->success)); } } /*********************************************** getax *****/ else if (strcmp((ptr_child_clrequest->inargv)[0], "getax") == 0) { retval = getfoo(ptr_child_clrequest, GETAX, 0, ptr_child_clrequest->db_encoding, ptr_addresult, format_string); if (retval != 1) { n_client_status = read_status(ptr_child_clrequest->fd); send_status(ptr_child_clrequest->fd, 0, TERM_NO); /* let the client know what happened */ sprintf(child_returnmsg, ULLSPEC"\n", (unsigned long long)(ptr_addresult->success)); } } /*********************************************** geted *****/ else if (strcmp((ptr_child_clrequest->inargv)[0], "geted") == 0) { retval = getfoo(ptr_child_clrequest, GETED, 0, ptr_child_clrequest->db_encoding, ptr_addresult, format_string); if (retval != 1) { n_client_status = read_status(ptr_child_clrequest->fd); send_status(ptr_child_clrequest->fd, 0, TERM_NO); /* let the client know what happened */ sprintf(child_returnmsg, ULLSPEC"\n", (unsigned long long)(ptr_addresult->success)); } } /*********************************************** getas *****/ else if (strcmp((ptr_child_clrequest->inargv)[0], "getas") == 0) { retval = getfoo(ptr_child_clrequest, GETAS, 0, ptr_child_clrequest->db_encoding, ptr_addresult, format_string); if (retval != 1) { n_client_status = read_status(ptr_child_clrequest->fd); send_status(ptr_child_clrequest->fd, 0, TERM_NO); /* let the client know what happened */ sprintf(child_returnmsg, ULLSPEC"\n", (unsigned long long)(ptr_addresult->success)); } } /*********************************************** getkw *****/ else if (strcmp((ptr_child_clrequest->inargv)[0], "getkw") == 0) { retval = getfoo(ptr_child_clrequest, GETKW, 0, ptr_child_clrequest->db_encoding, ptr_addresult, format_string); if (retval != 1) { n_client_status = read_status(ptr_child_clrequest->fd); send_status(ptr_child_clrequest->fd, 0, TERM_NO); /* let the client know what happened */ sprintf(child_returnmsg, ULLSPEC"\n", (unsigned long long)(ptr_addresult->success)); } } /*********************************************** getjo *****/ else if (strcmp((ptr_child_clrequest->inargv)[0], "getjo") == 0) { retval = getfoo(ptr_child_clrequest, GETJO, n_all, ptr_child_clrequest->db_encoding, ptr_addresult, format_string); if (retval != 1) { n_client_status = read_status(ptr_child_clrequest->fd); send_status(ptr_child_clrequest->fd, 0, TERM_NO); /* let the client know what happened */ sprintf(child_returnmsg, ULLSPEC"\n", (unsigned long long)(ptr_addresult->success)); } } /*********************************************** getjf *****/ else if (strcmp((ptr_child_clrequest->inargv)[0], "getjf") == 0) { retval = getfoo(ptr_child_clrequest, GETJF, n_all, ptr_child_clrequest->db_encoding, ptr_addresult, format_string); if (retval != 1) { n_client_status = read_status(ptr_child_clrequest->fd); send_status(ptr_child_clrequest->fd, 0, TERM_NO); /* let the client know what happened */ sprintf(child_returnmsg, ULLSPEC"\n", (unsigned long long)(ptr_addresult->success)); } } /*********************************************** getj1 *****/ else if (strcmp((ptr_child_clrequest->inargv)[0], "getj1") == 0) { retval = getfoo(ptr_child_clrequest, GETJ1, n_all, ptr_child_clrequest->db_encoding, ptr_addresult, format_string); if (retval != 1) { n_client_status = read_status(ptr_child_clrequest->fd); send_status(ptr_child_clrequest->fd, 0, TERM_NO); /* let the client know what happened */ sprintf(child_returnmsg, ULLSPEC"\n", (unsigned long long)(ptr_addresult->success)); } } /*********************************************** getj2 *****/ else if (strcmp((ptr_child_clrequest->inargv)[0], "getj2") == 0) { retval = getfoo(ptr_child_clrequest, GETJ2, n_all, ptr_child_clrequest->db_encoding, ptr_addresult, format_string); if (retval != 1) { n_client_status = read_status(ptr_child_clrequest->fd); send_status(ptr_child_clrequest->fd, 0, TERM_NO); /* let the client know what happened */ sprintf(child_returnmsg, ULLSPEC"\n", (unsigned long long)(ptr_addresult->success)); } } /*********************************************** updatejo ****/ else if (strcmp((ptr_child_clrequest->inargv)[0], "updatejo") == 0) { retval = updatejo(ptr_child_clrequest, ptr_addresult); /* let the client know what happened */ if (retval != 1) { n_client_status = read_status(ptr_child_clrequest->fd); send_status(ptr_child_clrequest->fd, 0, TERM_NO); sprintf(child_returnmsg, ULLSPEC" updated:"ULLSPEC" skipped:"ULLSPEC" failed\n", (unsigned long long)(ptr_addresult->success), (unsigned long long)(ptr_addresult->skipped), (unsigned long long)(ptr_addresult->failure)); } } /*********************************************** adduser ****/ else if (strcmp((ptr_child_clrequest->inargv)[0], "adduser") == 0) { retval = adduser(ptr_child_clrequest, user_host, newuser_passwd, n_remove, n_readonly, ptr_addresult); if (retval != 1) { n_client_status = read_status(ptr_child_clrequest->fd); send_status(ptr_child_clrequest->fd, 0, TERM_NO); /* let the client know what happened */ if (n_remove) { sprintf(child_returnmsg, ULLSPEC" removed:"ULLSPEC" failed\n", (unsigned long long)(ptr_addresult->success), (unsigned long long)(ptr_addresult->failure)); } else { sprintf(child_returnmsg, ULLSPEC" added:"ULLSPEC" failed\n", (unsigned long long)(ptr_addresult->success), (unsigned long long)(ptr_addresult->failure)); } } } /*********************************************** addword ****/ else if (strcmp((ptr_child_clrequest->inargv)[0], "addword") == 0) { retval = addword(ptr_child_clrequest, n_remove, ptr_addresult); if (retval != 1) { n_client_status = read_status(ptr_child_clrequest->fd); send_status(ptr_child_clrequest->fd, 0, TERM_NO); /* command summary */ if (n_remove) { sprintf(child_returnmsg, ULLSPEC" removed:"ULLSPEC" failed\n", (unsigned long long)ptr_addresult->success, (unsigned long long)ptr_addresult->failure); } else { sprintf(child_returnmsg, ULLSPEC" added:"ULLSPEC" failed\n", (unsigned long long)ptr_addresult->success, (unsigned long long)ptr_addresult->failure); } } } /*********************************************** getbib ****/ else if (strcmp((ptr_child_clrequest->inargv)[0], "getbib") == 0) { /* printf("child sleeps PID=%d\n", getpid()); */ /* sleep(10); */ retval = getbib(ptr_child_clrequest, ptr_biblio_info, ref_format, ptr_addresult); if (retval != 1) { /* let the client know what happened, add 256 chars for command summary */ if (ptr_addresult->msg && strlen(ptr_addresult->msg)+256 > MSG_BUF_SIZE) { child_returnmsg = (char*)realloc(child_returnmsg, strlen(ptr_addresult->msg)+16); } if (!child_returnmsg) { /* todo: do something intelligent here */ tiwrite(ptr_child_clrequest->fd, get_status_msg(801), TERM_YES); retval = 1; } else { if (ptr_addresult->msg && *(ptr_addresult->msg)) { sprintf(child_returnmsg, "getbib error: %s\n", ptr_addresult->msg); } } n_client_status = read_status(ptr_child_clrequest->fd); send_status(ptr_child_clrequest->fd, 0, TERM_NO); sprintf(&(child_returnmsg[strlen(child_returnmsg)]), ULLSPEC" retrieved:"ULLSPEC" failed:"ULLSPEC" not found\n", (unsigned long long)(ptr_addresult->success), (unsigned long long)(ptr_addresult->failure), (unsigned long long)(ptr_addresult->skipped)); } } /*********************************************** gettexbib ****/ else if (strcmp((ptr_child_clrequest->inargv)[0], "gettexbib") == 0) { retval = gettexbib(ptr_child_clrequest, ptr_biblio_info, ptr_addresult); /* let the client know what happened */ if (retval != 1) { n_client_status = read_status(ptr_child_clrequest->fd); send_status(ptr_child_clrequest->fd, 0, TERM_NO); sprintf(child_returnmsg, ULLSPEC" retrieved:"ULLSPEC" failed\n", (unsigned long long)(ptr_addresult->success), (unsigned long long)(ptr_addresult->failure)); } } /*********************************************** addstyle ****/ else if (strcmp((ptr_child_clrequest->inargv)[0], "addstyle") == 0) { retval = addstyle(ptr_child_clrequest, ptr_addresult); /* let the client know what happened */ if (retval != 1) { n_client_status = read_status(ptr_child_clrequest->fd); send_status(ptr_child_clrequest->fd, 0, TERM_NO); sprintf(child_returnmsg, ULLSPEC" added:"ULLSPEC" failed\n", (unsigned long long)(ptr_addresult->success), (unsigned long long)(ptr_addresult->failure)); } } /*********************************************** deletestyle ****/ else if (strcmp((ptr_child_clrequest->inargv)[0], "deletestyle") == 0) { retval = deletestyle(ptr_child_clrequest, ptr_addresult); /* let the client know what happened */ if (retval != 1) { n_client_status = read_status(ptr_child_clrequest->fd); send_status(ptr_child_clrequest->fd, 0, TERM_NO); sprintf(child_returnmsg, ULLSPEC" deleted:"ULLSPEC" skipped:"ULLSPEC" failed\n", (unsigned long long)(ptr_addresult->success), (unsigned long long)(ptr_addresult->skipped), (unsigned long long)(ptr_addresult->failure)); } } /*********************************************** getstyle ****/ else if (strcmp((ptr_child_clrequest->inargv)[0], "getstyle") == 0) { retval = getstyle(ptr_child_clrequest, ptr_addresult); if (retval != 1) { n_client_status = read_status(ptr_child_clrequest->fd); send_status(ptr_child_clrequest->fd, 0, TERM_NO); sprintf(child_returnmsg, ULLSPEC" retrieved:"ULLSPEC" failed:"ULLSPEC" not found\n", (unsigned long long)ptr_addresult->success, (unsigned long long)ptr_addresult->failure, (unsigned long long)ptr_addresult->skipped); } } /*********************************************** scankw ****/ else if (strcmp((ptr_child_clrequest->inargv)[0], "scankw") == 0) { /* we don't really do anything here. The keyword scan runs after the client/server dialog is done */ send_status(ptr_child_clrequest->fd, 0, TERM_NO); sprintf(child_returnmsg, "408:%s\n", ptr_child_clrequest->current_db); tiwrite(ptr_child_clrequest->fd, child_returnmsg, TERM_YES); n_client_status = read_status(ptr_child_clrequest->fd); send_status(ptr_child_clrequest->fd, 0, TERM_NO); strcpy(child_returnmsg, "1\n"); } /*********************************************** unknown ****/ else { send_status(ptr_child_clrequest->fd, 800, TERM_NO); snprintf(child_returnmsg, 256, "841:%s", (ptr_child_clrequest->inargv)[0]); LOG_PRINT(LOG_DEBUG, child_returnmsg); snprintf(child_returnmsg, 256, "841:%s\n", (ptr_child_clrequest->inargv)[0]); tiwrite(ptr_child_clrequest->fd, child_returnmsg, TERM_YES); /* return error in any case */ retval = 1; } /*******************************************************/ /* end of client dialog */ /*******************************************************/ finish: if (retval != 1) { LOG_PRINT(LOG_DEBUG, "command processing done, finish dialog now"); /* finish dialog with client */ if (child_returnmsg) { if (*child_returnmsg) { tiwrite(ptr_child_clrequest->fd, "999:", TERM_NO); } tiwrite(ptr_child_clrequest->fd, child_returnmsg, TERM_YES); } else { tiwrite(ptr_child_clrequest->fd, "no luck today", TERM_YES); } /* wait for receipt from client, reuse result for client status */ if ((result = read_status(ptr_child_clrequest->fd))) { LOG_PRINT(LOG_WARNING, get_status_msg(result)); } /* run post-dialog code here. All of this stuff will be invisible to the client */ if ((!strcmp((ptr_child_clrequest->inargv)[0], "addref") || !strcmp((ptr_child_clrequest->inargv)[0], "updateref")) && keyword_scan[0] == 't') { run_keyword_scan(ptr_child_clrequest, &id_sentinel, 0); } else if ((!strcmp((ptr_child_clrequest->inargv)[0], "addnote") || !strcmp((ptr_child_clrequest->inargv)[0], "updatenote")) && keyword_scan[0] == 't') { run_keyword_scan(ptr_child_clrequest, &id_sentinel, 1); } else if (!strcmp((ptr_child_clrequest->inargv)[0], "scankw")) { run_keyword_scan(ptr_child_clrequest, NULL, 2); } delete_all_lilid(&id_sentinel); } cleanup_db: /* clean up database abstraction layer */ if (n_dbi_is_up) { my_dbi_shutdown(ptr_child_clrequest->inst); } /* function checks ptr_dbcaps == NULL */ free_db_caps(ptr_dbcaps); cleanup: if (ptr_child_clrequest->inargv) { free(ptr_child_clrequest->inargv); } if (child_inbuffer) { free(child_inbuffer); } if (child_inbuffer1) { free(child_inbuffer1); } if (child_returnmsg) { free(child_returnmsg); } free_addresult(ptr_addresult); free(ptr_biblio_info); if (retval == 1) { /* take a break to let the clients finish reading the error code */ sleep(1); } close(ptr_child_clrequest->fd); FD_CLR(ptr_child_clrequest->fd, &readfds); sprintf(child_msg_buffer, "child finished client on fd %d", ptr_child_clrequest->fd); LOG_PRINT(LOG_INFO, child_msg_buffer); free(child_msg_buffer); /* write log data to disk */ if (fp_log_file != NULL) { fflush(fp_log_file); } free_client_request(ptr_child_clrequest); if (!n_nofork) { if (fd_fifo != -1) { close(fd_fifo); } if (n_log_dest == 1) { closelog(); } exit (retval); /* child is done and leaves stage */ } else { /* didn't fork, clean up "parent" stuff */ delete_olili(&first_olili, client_sockfd); /* the next child will know it is not the first one */ is_first_child = 0; } } else { /* we're parent, close client connection */ close(ptr_clrequest->fd); FD_CLR(ptr_clrequest->fd, &readfds); sprintf(msg_buffer, "parent removing client on fd %d", ptr_clrequest->fd); LOG_PRINT(LOG_INFO, msg_buffer); /* decrease n_max_fd to minimize loops */ delete_olili(&first_olili, ptr_clrequest->fd); /* the next child will know it is not the first one */ is_first_child = 0; } /* end if fork() */ } /* end: if (fd == server_sockfd) */ } /* end: if (FD_ISSET(fd, &testfds)) */ } /* end: for() */ } /* end: while(run) */ LOG_PRINT(LOG_INFO, "server exited gracefully"); free(fifo_buffer); if (fp_log_file != NULL) { fclose(fp_log_file); /* not strictly necessary here, but it's nicer */ } if (fd_fifo != -1) { close(fd_fifo); unlink(the_fifo); } free_client_request(ptr_clrequest); /* duh */ exit (0); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ sig_handler(): handler for signals that are supposed to stop the server static void sig_handler has no return value ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static void sig_handler (int sig) { run = 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ sighup_handler(): handler for signals that are supposed to reread the config file static void sighup_handler has no return value ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static void sighup_handler (int sig) { gotsignal = 1; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ sigchld_handler(): handler for signals that tell us a child is done static void sigchld_handler has no return value ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static void sigchld_handler(int sig) { int status; gotchldsig = 1; if (waitpid(-1, &status, WNOHANG) >= 0) { /* non-blocking wait */ if (WIFEXITED(status)) { child_exitval = WEXITSTATUS(status); /* set global for logging */ } } /* else: ignore failure */ } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ log_print(): writes a log message void log_print int priority the priority level of the log message as in syslog.h const char* string a string containing the message to be logged ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ void log_print(int priority, const char* string) { /* we must have this fn in refdbd.c because FILE* fp_log_file cannot be declared extern (??) */ time_t the_time; char timestring[256]; FILE* new_fp_log_file; if (n_log_dest == 0) { /* output on stderr */ fprintf(stderr, "%s\n", string); } else if (n_log_dest == 1) { /* output via syslog */ if (n_reopen_log) { openlog("refdbd", LOG_PID|LOG_ODELAY, LOG_USER); n_reopen_log = 0; LOG_PRINT(LOG_INFO, "reopened log file"); } syslog(priority, "%s", string); } else { /* output in user-defined logfile */ if (n_reopen_log) { /* log filename or destination has changed*/ n_reopen_log = 0; /* reset switch; must be done before we recursively call LOG_PRINT */ if ((new_fp_log_file = fopen(log_file, "ab")) == NULL) { n_log_dest = 1; /* fall back to syslog */ openlog("refdbd", LOG_PID|LOG_ODELAY, LOG_USER); fclose(fp_log_file); LOG_PRINT(LOG_WARNING, "could not open custom log file"); } else { fclose(fp_log_file); fp_log_file = new_fp_log_file; LOG_PRINT(LOG_INFO, "reopened log file"); } } time(&the_time); strftime(timestring, 256, "%a %b %d %H:%M:%S %Y", gmtime(&the_time)); fprintf(fp_log_file, "%d:pid=%d:%s:%s\n", priority, getpid(), timestring, string); /* use this only to debug crashes */ /* fflush(fp_log_file); */ } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ new_client_request(): creates a CLIENT_REQUEST structure struct CLIENT_REQUEST* new_client_request returns the new structure or NULL if there was an error ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ struct CLIENT_REQUEST* new_client_request(void) { struct CLIENT_REQUEST* ptr_clrequest; if ((ptr_clrequest = malloc(sizeof(struct CLIENT_REQUEST))) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } else { initialize_client_request(ptr_clrequest); return ptr_clrequest; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ initialize_client_request(): initializes a CLIENT_REQUEST structure int initialize_client_request returns 0 struct CLIENT_REQUEST* ptr_clrequest ptr to an existing CLIENT_REQUEST structure ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int initialize_client_request(struct CLIENT_REQUEST* ptr_clrequest) { ptr_clrequest->fd = 0; ptr_clrequest->n_cgi = 0; ptr_clrequest->inargc = 0; ptr_clrequest->inargv = NULL; ptr_clrequest->username[0] = '\0'; ptr_clrequest->passwd[0] = '\0'; strcpy(ptr_clrequest->server_ip, "localhost"); strcpy(ptr_clrequest->dbs_port_address, "3306"); strcpy(ptr_clrequest->dbserver, "sqlite3"); /* most likely default engine */ ptr_clrequest->current_db[0] = '\0'; ptr_clrequest->db_path[0] = '\0'; ptr_clrequest->pdfroot[0] = '\0'; ptr_clrequest->cgi_url[0] = '\0'; ptr_clrequest->limit[0] = '\0'; ptr_clrequest->inst = NULL; /* always return success */ return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ dup_client_request(): duplicates a CLIENT_REQUEST structure struct CLIENT_REQUEST* dup_client_request returns the duplicate or NULL if there was an error struct CLIENT_REQUEST* ptr_clrequest ptr to an existing CLIENT_REQUEST structure ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ struct CLIENT_REQUEST* dup_client_request(struct CLIENT_REQUEST* ptr_clrequest) { struct CLIENT_REQUEST* ptr_new_clrequest; if (!ptr_clrequest) { return NULL; } if ((ptr_new_clrequest = malloc(sizeof(struct CLIENT_REQUEST))) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } /* start with an identical copy */ memcpy((void*)ptr_new_clrequest, (const void*)ptr_clrequest, sizeof(struct CLIENT_REQUEST)); /* initialize client-provided values */ ptr_new_clrequest->n_cgi = 0; ptr_new_clrequest->inargc = 0; ptr_new_clrequest->inargv = NULL; ptr_new_clrequest->username[0] = '\0'; ptr_new_clrequest->passwd[0] = '\0'; return ptr_new_clrequest; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ free_client_request(): frees a CLIENT_REQUEST structure int initialize_client_request returns 0 if ok, 1 if invalid ptr struct CLIENT_REQUEST* ptr_clrequest ptr to an existing CLIENT_REQUEST structure ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int free_client_request(struct CLIENT_REQUEST* ptr_clrequest) { if (ptr_clrequest) { free(ptr_clrequest); return 0; } else { return 1; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ new_addresult(): creates and initializes an ADDRESULT structure struct ADDRESULT* new_addresult returns a pointer to a structure if ok, NULL if failed size_t msg_len length of the message buffer. The function will allocate and initialize a string buffer of the requested length ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ struct ADDRESULT* new_addresult(size_t msg_len) { struct ADDRESULT* ptr_addresult; if ((ptr_addresult = malloc(sizeof(struct ADDRESULT))) == NULL) { return NULL; } ptr_addresult->success = 0; ptr_addresult->failure = 0; ptr_addresult->updated = 0; ptr_addresult->skipped = 0; ptr_addresult->msg_len = msg_len; if (msg_len == 0) { ptr_addresult->msg = NULL; } else { if ((ptr_addresult->msg = malloc(msg_len)) == NULL) { free(ptr_addresult); return NULL; } *(ptr_addresult->msg) = '\0'; /* turn buffer into empty string */ } return ptr_addresult; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ free_addresult(): frees the memory allocated for an ADDRESULT structure void free_addresult struct ADDRESULT* ptr_addresult ptr to the structure to be freed ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ void free_addresult(struct ADDRESULT* ptr_addresult) { if (ptr_addresult) { if (ptr_addresult->msg) { free(ptr_addresult->msg); } free(ptr_addresult); } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ new_bibinfo(): creates and initializes a bibinfo structure struct bibinfo* new_bibinfo returns a pointer to a structure if ok, NULL if failed char* format_string ptr to a string containing format info char* sort_string ptr to a string containing sort info ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ struct bibinfo* new_bibinfo(char* format_string, char* sort_string) { struct bibinfo* ptr_biblio_info; if ((ptr_biblio_info = malloc(sizeof(struct bibinfo))) == NULL) { return NULL; } ptr_biblio_info->format_string = format_string; ptr_biblio_info->sort_string = sort_string; ptr_biblio_info->xreflabel = NULL; ptr_biblio_info->entry_id = NULL; ptr_biblio_info->is_subseq = 0; ptr_biblio_info->n_refdb_id = 0; ptr_biblio_info->year_unique_suffix = NULL; ptr_biblio_info->n_startnumber = 1; return ptr_biblio_info; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ free_bibinfo(): frees the memory allocated for a bibinfo structure void free_bibinfo struct bibinfo* ptr_biblioinfo ptr to the structure to be freed ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static void free_bibinfo(struct bibinfo* ptr_biblio_info) { if (ptr_biblio_info) { free(ptr_biblio_info); } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ postprocess_var(): checks and converts as necessary config variables int postprocess_var returns 0 if ok, 1 if error char* varname name of the variable to check char* string ptr to the string to modify or check ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int postprocess_var(char* varname, char* string) { if (varname == NULL || !varname[0]) { /* make sure we have something to compare */ return 1; } /* individual treatment for each variable */ if (!strcmp(varname, "passwd")) { if (strcmp(string, "*") == 0) { ask_for_passwd(string); } return 0; } else if (!strcmp(varname, "username")) { if (!*string && getlogin()) { strcpy(string, getlogin()); /* although not recommended, the login name is a good guess */ } else if (!*string) { /* provide a dummy name */ strcpy(string, "root"); } return 0; } return 1; /* should never happen */ } refdb-1.0.2/src/refdbdref.c000755 001750 001750 00000254100 12255427652 016337 0ustar00markusmarkus000000 000000 /*++++++++++++++++++++++ refdbdref.c: refdb application server, reference handling functions markus@mhoenicka.de 2-10-00 $Id: refdbdref.c,v 1.65.2.24 2006/02/08 20:43:11 mhoenicka Exp $ 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, see ++++++++++++++++++++++++*/ #include #include #include #include #include /* priority level definitions */ #include #include /* the xml parser header file */ #include #include #include #include "strfncs.h" #include "refdb.h" #include "connect.h" #include "backend.h" #include "linklist.h" #include "refdbd.h" /* depends on backend.h */ #include "tokenize.h" #include "readris.h" #include "writeris.h" /* depends on backend.h */ #include "risdb.h" #include "dbfncs.h" #include "xmlhandler.h" #include "risxhandler.h" #include "authorinfo.h" #include "risdata.h" #include "refdbdgetref.h" #include "noteshandler.h" #include "backend-html.h" #include "refdbdcheckref.h" /* some globals */ extern char server_ip[]; /* the IP address of the database server */ extern char refdblib[]; /* location of shareable data */ extern int n_log_level; /* numeric version of log_level */ extern int nongeek_offset; /* :-) */ extern char cs_term[]; extern char upper_citekey[]; extern char main_db[]; /* forward declaration of local functions */ static unsigned long long read_ris_data(struct CLIENT_REQUEST* ptr_clrequest, struct ADDRESULT* ptr_addresult, dbi_conn conn, dbi_conn conn_refdb, int replace_ref, int n_keep_id, const char* the_user, Lilid* ptr_sentinel, iconv_t conv_descriptor, int iconv_init_status); static int real_run_keyword_scan(struct CLIENT_REQUEST* ptr_clrequest, Lilid* ptr_sentinel, int mode, int* ptr_insert); static int is_journal(dbi_conn conn, const char* field, const char* quoted_name); /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ update_meta(): updates the meta information in a reference database int update_meta returns 1 if failed, 0 if successful dbi_conn conn connection to a database struct CLIENT_REQUEST* ptr_clrequest ptr to structure with client info ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int update_meta(dbi_conn conn, struct CLIENT_REQUEST* ptr_clrequest) { dbi_result dbires; char date_buffer[24]; char sql_command[128]; time_t the_time; time(&the_time); strftime(date_buffer, 24, "%Y-%m-%d %H:%M:%S", gmtime(&the_time)); if (!strcmp(my_dbi_conn_get_cap(conn, "multiple_db"), "f")) { sprintf(sql_command, "UPDATE t_meta SET meta_modify_date='%s' WHERE meta_type='risx'", date_buffer); } else { sprintf(sql_command, "UPDATE %s.t_meta SET meta_modify_date='%s' WHERE meta_type='risx'", ptr_clrequest->current_db, date_buffer); } LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { /* treat as non-critical */ LOG_PRINT(LOG_WARNING, "updating t_meta failed"); return 1; } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ whichdb(): implements the client command whichdb int whichdb returns 1 if failed, 0 if successful struct CLIENT_REQUEST* ptr_clrequest ptr to structure with client info ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int whichdb(struct CLIENT_REQUEST* ptr_clrequest) { dbi_conn conn; dbi_driver driver; dbi_result dbires; char create_date[64]; char modify_date[64]; char* return_msg; const char* db_encoding; unsigned long long numrefs; unsigned long long maxid; unsigned long long numnotes; unsigned long long maxnid; int numbyte; time_t the_time; /* get some memory for a return message */ return_msg = malloc((size_t)512); if (return_msg == NULL) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } /* connect to database server*/ if ((conn = connect_to_db(ptr_clrequest, NULL, 0)) == NULL) { send_status(ptr_clrequest->fd, 204, TERM_NO); LOG_PRINT(LOG_WARNING, get_status_msg(204)); free(return_msg); return 1; } driver = dbi_conn_get_driver(conn); db_encoding = dbi_conn_get_encoding(conn); /* the following functions return 0 in case of an error. We do not check as the subsequent functions will fail if there is a general problem with the database */ numrefs = get_reference_count(conn, &maxid, 0 /* istemp */); numnotes = get_notes_count(conn, &maxnid, 0 /* istemp */); dbires = dbi_conn_query(conn, "SELECT meta_app,meta_type,meta_version,meta_dbversion,meta_create_date,meta_modify_date FROM t_meta WHERE meta_type='risx'"); if (!dbires || !dbi_result_next_row(dbires)) { send_status(ptr_clrequest->fd, 207, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(207)); if (dbires) { dbi_result_free(dbires); } dbi_conn_close(conn); free(return_msg); return 1; } the_time = dbi_result_get_datetime(dbires, "meta_create_date"); if (my_dbi_conn_error_flag(conn) == 0) { if (the_time) { strftime(create_date, 64, "%Y-%m-%d %H:%M:%S", gmtime(&the_time)); } else { strcpy(create_date, "nd"); } } else { strcpy(create_date, "nd"); } the_time = dbi_result_get_datetime(dbires, "meta_modify_date"); if (my_dbi_conn_error_flag(conn) == 0) { if (the_time) { strftime(modify_date, 64, "%Y-%m-%d %H:%M:%S", gmtime(&the_time)); } else { strcpy(modify_date, "nd"); } } else { strcpy(modify_date, "nd"); } /* The returned integers are quads (8byte) */ sprintf(return_msg, "Current database: %s\nNumber of references: "ULLSPEC"\nHighest reference ID: "ULLSPEC"\nNumber of notes: "ULLSPEC"\nHighest note ID: "ULLSPEC"\nEncoding: %s\nDatabase type: %s\nDatabase version: %d\nDatabase server: %s\nCreated: %s UTC\nCreated by %s version: %s\nLast modified: %s UTC\n", ptr_clrequest->current_db, (unsigned long long)numrefs, (unsigned long long)maxid, (unsigned long long)numnotes, (unsigned long long)maxnid, db_encoding, dbi_result_get_string(dbires, "meta_type"),dbi_result_get_short(dbires, "meta_dbversion"), dbi_driver_get_name(driver), create_date, dbi_result_get_string(dbires, "meta_app"), dbi_result_get_string(dbires, "meta_version"), modify_date); dbi_result_free(dbires); send_status(ptr_clrequest->fd, 0, TERM_NO); numbyte = tiwrite(ptr_clrequest->fd, return_msg, TERM_YES); if (numbyte == -1) { LOG_PRINT(LOG_WARNING, "Cannot write to client"); } free(return_msg); dbi_conn_close(conn); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ addref(): implements the client commands addref, updateref, checkref int addref returns 1 if failed, 0 if successful struct CLIENT_REQUEST* ptr_clrequest ptr to structure with client info struct bibinfo* ptr_biblio_info ptr to structure with bibliographic info this function uses only the encoding information therein char *set_owner the username of the owner of new/updated references if different from *username struct ADDRESULT* addresult this structure will be filled in with the number of (un-)successfully added/updated references int replace_ref if ADDREF_UPDATE, ref will be updated according to ID field if ADDREF_ADD, ref will be added, ignoring an ID field if ADDREF_UPDATE_PERSONAL, only the personal settings (N1, AV, RP) will be updated according to the ID field if ADDREF_CHECK, ref will be added to temporary tables and checked int n_keep_id if 1, any existing reference ID will be saved in U5 int informat input format (REFRIS|REFRISX) int outformat output format (REFSCREEN|REFXHTML) Lilid* ptr_sentinel ptr to linked list that will receive all added ID values ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int addref(struct CLIENT_REQUEST* ptr_clrequest, struct bibinfo* ptr_biblio_info, char* set_owner, struct ADDRESULT* ptr_addresult, int replace_ref, int n_keep_id, int informat, int outformat, Lilid* ptr_sentinel) { dbi_conn conn; dbi_conn conn_refdb = NULL; XML_Parser p; int numbyte; /* number of bytes written */ unsigned long long ullresult; /* result value of processing a RIS set */ int intresult; /* result value of processing a risx dataset */ int retval = 0; /* be optimistic */ int iconv_init_status = 0; /* indicates iconv initialization problem */ size_t return_msg_len = 512; char *the_user; /* name (either set_owner or username) */ char *return_msg; /* string to hold a return message for the client */ const char *db_encoding; /* encoding of database */ struct addrisx_data ardata; struct lilimem sentinel; struct renderinfo rendinfo; sentinel.ptr_mem = NULL; sentinel.ptr_next = NULL; sentinel.varname[0] = '\0'; ardata.msgpool = NULL; ardata.ptr_ainfo = NULL; /* if set_owner is set, use it, otherwise use username as owner */ if (set_owner && *set_owner) { the_user = set_owner; } else { the_user = ptr_clrequest->username; } /* get some memory for a return message */ return_msg = malloc(return_msg_len); if (return_msg == NULL || insert_lilimem(&sentinel, (void**)&return_msg, NULL)) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } /* connect to database server*/ if ((conn = connect_to_db(ptr_clrequest, NULL, 0)) == NULL) { send_status(ptr_clrequest->fd, 204, TERM_NO); LOG_PRINT(LOG_WARNING, get_status_msg(204)); delete_all_lilimem(&sentinel); return 1; } /* get the database encoding */ db_encoding = dbi_conn_get_encoding(conn); /* if we need to convert, create a conversion descriptor for iconv() */ if (db_encoding && strcmp(db_encoding, informat == RISX ? "UTF-8" : ptr_clrequest->db_encoding)) { char to_encoding[64]; if (!strcmp(db_encoding, "US-ASCII")) { strcpy(to_encoding, "ASCII//TRANSLIT"); } else { snprintf(to_encoding, 64, "%s//TRANSLIT", db_encoding); } ardata.conv_descriptor = iconv_open(to_encoding, informat == RISX ? "UTF-8" : ptr_clrequest->db_encoding); if (ardata.conv_descriptor == (iconv_t)(-1)) { ardata.conv_descriptor = NULL; LOG_PRINT(LOG_WARNING, "cannot set conversion descriptor (input/database):"); LOG_PRINT(LOG_DEBUG, ptr_clrequest->db_encoding); LOG_PRINT(LOG_DEBUG, db_encoding); iconv_init_status = 701; } else { LOG_PRINT(LOG_DEBUG, "input encoding is:"); LOG_PRINT(LOG_DEBUG, ptr_clrequest->db_encoding); } } else { ardata.conv_descriptor = NULL; LOG_PRINT(LOG_DEBUG, "no character encoding conversion required"); } LOG_PRINT(LOG_DEBUG, "database encoding is:"); LOG_PRINT(LOG_DEBUG, db_encoding); if (!strcmp(my_dbi_conn_get_cap(conn, "multiple_db"), "f")) { /* pgsql, sqlite, sqlite3 need another connection to retrieve values from the refdb database */ conn_refdb = connect_to_db(ptr_clrequest, main_db, 0); if (conn_refdb == NULL) { send_status(ptr_clrequest->fd, 202, TERM_NO); LOG_PRINT(LOG_WARNING, get_status_msg(202)); dbi_conn_close(conn); delete_all_lilimem(&sentinel); if (ardata.conv_descriptor) { iconv_close(ardata.conv_descriptor); } return 1; } } /* else: do nothing for other drivers */ if (replace_ref == ADDREF_CHECK) { /* create temporary tables */ if (create_temporary_tables(conn, ptr_clrequest)) { send_status(ptr_clrequest->fd, 242, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(242)); retval = 1; goto Finish; } } /* fill in invariant elements of structure. We'll later abuse the functions that create the getref output. Only a part of the info of the renderinfo struct will actually be used, so we have a couple of empty or NULL members here */ rendinfo.ptr_biblio_info = ptr_biblio_info; rendinfo.ref_format = outformat; rendinfo.nuse_citestyle = 0; rendinfo.database = ptr_clrequest->current_db; rendinfo.dbname = NULL; rendinfo.username = ptr_clrequest->username; rendinfo.pdfroot = ptr_clrequest->pdfroot; rendinfo.cgi_url = ptr_clrequest->cgi_url; rendinfo.ptr_clrequest = ptr_clrequest; rendinfo.ptr_ref = &return_msg; rendinfo.ptr_ref_len = &return_msg_len; rendinfo.javascript = 0; if (informat == RISX) { while (1) { /* leave with break */ /* create the parser instance */ p = XML_ParserCreate(NULL); if (!p) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); retval = 1; goto Finish; } /* initialize "global" handler data */ ardata.msgpool_len = 512; ardata.msgpool = malloc(ardata.msgpool_len); if (!ardata.msgpool || insert_lilimem(&sentinel, (void**)&(ardata.msgpool), NULL)) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); retval = 1; goto Finish; } ardata.ptr_ainfo = new_authorinfo(); if (!ardata.ptr_ainfo) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); retval = 1; goto Finish; } *(ardata.msgpool) = '\0'; *(ardata.real_citekey) = '\0'; *(ardata.type) = '\0'; strncpy(ardata.username, the_user, 16); ardata.username[15] = '\0'; ardata.ptr_clrequest = ptr_clrequest; ardata.ptr_id_sentinel = ptr_sentinel; ardata.ptr_first = NULL; ardata.ptr_risdata = NULL; ardata.nmem_error = 0; ardata.ndb_error = 0; ardata.n_skip = 0; ardata.depth = 0; ardata.depth_adjust = 0; ardata.set_count = 0; ardata.added_count = 0; ardata.skipped_count = 0; ardata.updated_count = 0; ardata.failed_count = 0; ardata.authorpos = 0; ardata.replace_ref = replace_ref; ardata.create_new = 1; ardata.n_user_id = 0; ardata.conn = conn; ardata.conn_refdb = conn_refdb; ardata.driver = dbi_conn_get_driver(conn); ardata.drivername = dbi_driver_get_name(ardata.driver); /* register our handlers. these handlers will be called whenever expat finds a start- or endtag or character data */ XML_SetElementHandler(p, risx_start_handler, risx_end_handler); XML_SetCharacterDataHandler(p, risx_char_handler); /* make pointer to "global data" available for handlers */ XML_SetUserData(p, (void*)&ardata); send_status(ptr_clrequest->fd, iconv_init_status, TERM_NO); intresult = read_xml(ptr_clrequest->fd, p, ptr_addresult); XML_ParserFree(p); /* do something intelligent in the case of a parse or mem error */ if (!intresult || ardata.ndb_error || ardata.nmem_error) { if (strcmp(my_dbi_conn_get_cap(ardata.conn, "transaction"), "t")) { /* we have to delete the junk reference manually */ delete_ref_by_id(ardata.n_refdb_id, conn, ptr_clrequest, ptr_addresult); } else { my_dbi_conn_rollback(ardata.conn); } my_dbi_conn_unlock(ardata.conn); } /* send messages to client */ /* send_status(ptr_clrequest->fd, 400, TERM_NO); */ if (replace_ref != ADDREF_CHECK) { numbyte = tiwrite(ptr_clrequest->fd, ardata.msgpool, TERM_NO); if (numbyte == -1) { LOG_PRINT(LOG_INFO, "timeout while writing"); retval = 1; goto Finish; } } ptr_addresult->success += ardata.added_count; ptr_addresult->failure += ardata.failed_count; ptr_addresult->updated += ardata.updated_count; ptr_addresult->skipped += ardata.skipped_count; if (!intresult) { /* error */ retval = 1; goto Finish; } else if (intresult == -1) { /* we're done */ break; } } /* end while */ } else { /* ris */ ullresult = read_ris_data(ptr_clrequest, ptr_addresult, conn, conn_refdb, replace_ref, n_keep_id, the_user, ptr_sentinel, ardata.conv_descriptor, iconv_init_status); if (!ullresult) { /* error */ retval = 1; goto Finish; } if (replace_ref != ADDREF_CHECK) { /* terminate whatever was sent so far */ /* numbyte = tiwrite(ptr_clrequest->fd, "", TERM_YES); /\* end of #8 *\/ */ /* if (numbyte == -1) { */ /* LOG_PRINT(LOG_INFO, "timeout while writing"); */ /* retval = 1; */ /* goto Finish; */ /* } */ } } /* html output starts here */ if (outformat == REFXHTML) { rendinfo.javascript = 1; /* request javascript support */ if ((retval = prepare_render_html(&rendinfo)) != 0) { send_status(ptr_clrequest->fd, retval, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(retval)); goto Finish; } else { numbyte = tiwrite(ptr_clrequest->fd, return_msg, TERM_NO); if (numbyte == -1) { LOG_PRINT(LOG_INFO, "timeout while writing"); retval = 1; goto Finish; } } } else { /* no header required for screen output */ } if (replace_ref == ADDREF_CHECK) { /* check references for duplicates */ /* printf("start check\n"); */ retval = check_references(ptr_clrequest, &rendinfo, conn, outformat); /* printf("end check, retval went to %d\n", retval); */ if (retval) { LOG_PRINT(LOG_WARNING, get_status_msg(retval)); numbyte = tiwrite(ptr_clrequest->fd, get_status_msg(retval), TERM_NO); } } if (outformat == REFXHTML) { /* reset buffer string */ *return_msg = '\0'; if ((retval = finish_render_html(&rendinfo)) != 0) { send_status(ptr_clrequest->fd, retval, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(retval)); goto Finish; } else { numbyte = tiwrite(ptr_clrequest->fd, return_msg, TERM_NO); if (numbyte == -1) { LOG_PRINT(LOG_INFO, "timeout while writing"); retval = 1; goto Finish; } } } else { /* no footer required for screen output */ } /* terminate output */ numbyte = tiwrite(ptr_clrequest->fd, "", TERM_YES); if (numbyte == -1) { LOG_PRINT(LOG_INFO, "timeout while writing"); retval = 1; } Finish: if (replace_ref != ADDREF_CHECK && (ptr_addresult->success || ptr_addresult->updated)) { /* database was changed, update meta info */ update_meta(conn, ptr_clrequest); } if (conn_refdb) { dbi_conn_close(conn_refdb); } dbi_conn_close(conn); delete_all_lilimem(&sentinel); free_authorinfo(ardata.ptr_ainfo); if (ardata.conv_descriptor) { iconv_close(ardata.conv_descriptor); } return retval; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ read_ris_data(): reads RIS data from the client static unsigned long long read_ris_data returns 0 if failed, >0 if successful struct CLIENT_REQUEST* ptr_clrequest ptr to structure with client info struct ADDRESULT* addresult this structure will be filled in with the number of (un-)successfully added/updated references dbi_conn conn connection to reference database dbi_conn conn_refdb connection to shared database int replace_ref if ADDREF_UPDATE, ref will be updated according to ID field if ADDREF_ADD, ref will be added, ignoring an ID field if ADDREF_UPDATE_PERSONAL, only the personal settings (N1, AV, RP) will be updated according to the ID field if ADDREF_CHECK, ref will be added to temporary tables and checked int n_keep_id if 1, any existing reference ID will be saved in U5 char *the_user the username of the owner of new/updated references Lilid* ptr_sentinel ptr to linked list that will receive all added ID values iconv_t conv_descriptor conversion descriptor for iconv() ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static unsigned long long read_ris_data(struct CLIENT_REQUEST* ptr_clrequest, struct ADDRESULT* ptr_addresult, dbi_conn conn, dbi_conn conn_refdb, int replace_ref, int n_keep_id, const char* the_user, Lilid* ptr_sentinel, iconv_t conv_descriptor, int iconv_init_status) { int numbyte; int n_requested_bufsize; /* buffer size a client requests to transfer data */ int result; /* result value of processing a RIS set */ int cs_status; unsigned long long set_count = 0; /* counter for datasets */ char inbuffer[COMMAND_INBUF_LEN]; /* buffer for client commands */ char return_msg[256]; char *ris_set; /* pointer to a string containing a RIS dataset */ char *new_ris_set; /* pointer used during reallocation of *ris_set */ char *msg_pool; /* collects messages during RIS parsing */ size_t msg_pool_len; ris_set = malloc((size_t)1); if (ris_set == NULL) { /* out of memory */ send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 0; } *ris_set = '\0'; msg_pool_len = 256; msg_pool = malloc(msg_pool_len); if (msg_pool == NULL) { /* out of memory */ send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(ris_set); return 0; } send_status(ptr_clrequest->fd, iconv_init_status, TERM_NO); /* loop until the client requests a buffer size of zero indicating that he's done sending datasets */ do { /* ------------------------------------------------------------ */ /* PHASE 1 */ /* see how much memory we'll need */ /* printf("phase 1\n"); */ cs_status = read_status(ptr_clrequest->fd); if (cs_status == 402) { /* client is done sending data */ send_status(ptr_clrequest->fd, 403, TERM_NO); /* #8 */ LOG_PRINT(LOG_INFO, get_status_msg(403)); free(ris_set); free(msg_pool); /* printf("leaving after 402\n"); */ break; } /* see how much memory we'll need */ numbyte = tread(ptr_clrequest->fd, inbuffer, 10); if (numbyte == -1) { LOG_PRINT(LOG_INFO, get_status_msg(109)); free(ris_set); free(msg_pool); return 0; } /* the size of the chunk the client wants to send */ n_requested_bufsize = atoi(inbuffer); /* printf("inbuffer: %s\nbufsize: %d\n", inbuffer, n_requested_bufsize); */ /* ------------------------------------------------------------ */ /* PHASE 2 */ /* send back reply */ /* printf("phase 2\n"); */ /* try to get a buffer large enough to hold the reference if n_requested_bufsize == 0, then this command equals free() */ new_ris_set = (char*)realloc(ris_set, (size_t)n_requested_bufsize); if (new_ris_set == NULL && n_requested_bufsize) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(ris_set); free(msg_pool); return 0; } else { ris_set = new_ris_set; } *ris_set = '\0'; /* read the data proper unless size was zero (= end of transmission) */ if (n_requested_bufsize) { size_t inlength; size_t outlength; char* my_ris_set = NULL; /* this ptr will be modified by iconv() */ char* my_ris_set_start = NULL; /* records initial state of my_elvalue */ const char* my_instring = NULL; /* this ptr will be modified by iconv() */ /* acknowledge that we have a buffer ready, let them data come... */ send_status(ptr_clrequest->fd, 0, TERM_NO); /* ------------------------------------------------------------ */ /* PHASE 3 */ /* read dataset */ /* printf("phase 3\n"); */ numbyte = iread(ptr_clrequest->fd, ris_set, n_requested_bufsize); /* printf("requested: %d\nread: %d\n", n_requested_bufsize, numbyte); */ if (numbyte == -1) { LOG_PRINT(LOG_INFO, get_status_msg(109)); free(ris_set); free(msg_pool); return 0; } /* run a character encoding conversion if required */ if (conv_descriptor && numbyte) { inlength = numbyte - TERM_LEN; /* with the encodings supported by our database engines, the converted string can't be longer than six times the input string */ outlength = 6*inlength; if ((my_ris_set = malloc(outlength)) == NULL) { ptr_addresult->failure++; send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(msg_pool); return 0; } /* keep start of the converted string */ my_ris_set_start = my_ris_set; /* variable will be modified by iconv, so don't use original */ my_instring = (const char*)ris_set; /* now actually do the conversion */ if (iconv(conv_descriptor, &my_instring, &inlength, &my_ris_set, &outlength) == (size_t)(-1)) { if (errno == EILSEQ) { sprintf(return_msg, "iconv: invalid input character sequence\n"); LOG_PRINT(LOG_WARNING, "iconv: invalid input character sequence"); } else if (errno == E2BIG) { sprintf(return_msg, "iconv: output buffer too small\n"); LOG_PRINT(LOG_WARNING, "iconv: output buffer too small"); } else if (errno == EINVAL) { sprintf(return_msg, "iconv: incomplete input character\n"); LOG_PRINT(LOG_WARNING, "iconv: incomplete input character"); } /* according to man iconv there are no other error codes */ /* phase 4 */ send_status(ptr_clrequest->fd, 702, TERM_NO); numbyte = tiwrite(ptr_clrequest->fd, return_msg, TERM_YES); if (numbyte == -1) { LOG_PRINT(LOG_INFO, get_status_msg(110)); free(ris_set); free(msg_pool); return 0; } LOG_PRINT(LOG_CRIT, get_status_msg(702)); free(ris_set); free(msg_pool); return 0; } /* else: conversion went ok. We free the original string and replace it with the converted copy */ if (ris_set) { free(ris_set); } ris_set = my_ris_set_start; } /* else: no conversion required */ /* ------------------------------------------------------------ */ /* PHASE 4 */ /* send back message */ /* printf("phase 4\n"); */ /* split reference into lines and squeeze contents into database */ /* printf("entering process_ris_set()\n"); */ *msg_pool = '\0'; /* reset */ result = process_ris_set(ris_set, conn, conn_refdb, replace_ref, (char*)the_user, ptr_clrequest, n_keep_id, ptr_sentinel, set_count, &msg_pool, &msg_pool_len); /* printf("leaving process_ris_set()\n"); */ if (result == 1) { ptr_addresult->success++; /* sprintf(return_msg, "Adding input set %d successful\n", set_count + nongeek_offset); */ send_status(ptr_clrequest->fd, 408, TERM_NO); if (*msg_pool) { numbyte = tiwrite(ptr_clrequest->fd, msg_pool, TERM_NO); if (numbyte == -1) { LOG_PRINT(LOG_INFO, get_status_msg(110)); free(ris_set); free(msg_pool); return 0; } } sprintf(return_msg, "408:"ULLSPEC"\n", (unsigned long long)(set_count + nongeek_offset)); LOG_PRINT(LOG_INFO, "dataset added successfully"); numbyte = tiwrite(ptr_clrequest->fd, return_msg, TERM_YES); if (numbyte == -1) { LOG_PRINT(LOG_INFO, get_status_msg(110)); free(ris_set); free(msg_pool); return 0; } } else if (result == 2) { ptr_addresult->updated++; /* sprintf(return_msg, "Updating input set %d successful\n", set_count + nongeek_offset); */ send_status(ptr_clrequest->fd, 413, TERM_NO); if (*msg_pool) { numbyte = tiwrite(ptr_clrequest->fd, msg_pool, TERM_NO); if (numbyte == -1) { LOG_PRINT(LOG_INFO, get_status_msg(110)); free(ris_set); free(msg_pool); return 0; } } sprintf(return_msg, "413:"ULLSPEC"\n", (unsigned long long)(set_count + nongeek_offset)); LOG_PRINT(LOG_INFO, "dataset updated successfully"); numbyte = tiwrite(ptr_clrequest->fd, return_msg, TERM_YES); if (numbyte == -1) { LOG_PRINT(LOG_INFO, get_status_msg(110)); free(ris_set); free(msg_pool); return 0; } } else if (result == 3) { ptr_addresult->skipped++; send_status(ptr_clrequest->fd, 407, TERM_NO); if (*msg_pool) { numbyte = tiwrite(ptr_clrequest->fd, msg_pool, TERM_NO); if (numbyte == -1) { LOG_PRINT(LOG_INFO, get_status_msg(110)); free(ris_set); free(msg_pool); return 0; } } sprintf(return_msg, "407:"ULLSPEC"\n", (unsigned long long)(set_count + nongeek_offset)); LOG_PRINT(LOG_INFO, "skipped processing dataset"); numbyte = tiwrite(ptr_clrequest->fd, return_msg, TERM_YES); if (numbyte == -1) { LOG_PRINT(LOG_INFO, get_status_msg(110)); free(ris_set); free(msg_pool); return 0; } } else { ptr_addresult->failure++; send_status(ptr_clrequest->fd, 414, TERM_NO); if (*msg_pool) { numbyte = tiwrite(ptr_clrequest->fd, msg_pool, TERM_NO); if (numbyte == -1) { LOG_PRINT(LOG_INFO, get_status_msg(110)); free(ris_set); free(msg_pool); return 0; } } sprintf(return_msg, "414:"ULLSPEC"\n", (unsigned long long)(set_count + nongeek_offset)); LOG_PRINT(LOG_WARNING, "failed processing dataset"); numbyte = tiwrite(ptr_clrequest->fd, return_msg, TERM_YES); if (numbyte == -1) { LOG_PRINT(LOG_INFO, get_status_msg(110)); free(ris_set); free(msg_pool); return 0; } } set_count++; } } while (n_requested_bufsize); /* ris_set should be deallocated by now due to a realloc(0) call */ /* printf("leaving at end\n"); */ return set_count; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ run_keyword_scan(): scans datasets for keywords after adding (dispatcher for real_run_keyword_scan()) int run_keyword_scan returns 1 if failed, 0 if successful struct CLIENT_REQUEST* ptr_clrequest ptr to structure with client info Lilid* ptr_sentinel ptr to linked list with ID values to check or NULL if all references in the database should be scanned int mode 0 = reference entries 1 = note entries 2 = both ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int run_keyword_scan(struct CLIENT_REQUEST* ptr_clrequest, Lilid* ptr_sentinel, int mode) { int retval; int n_insert = 0; /* number of inserts that actually ran */ dbi_conn conn; if (!mode) { /* check only references */ retval = real_run_keyword_scan(ptr_clrequest, ptr_sentinel, 0, &n_insert); } else if (mode == 1) { /* check only notes */ retval = real_run_keyword_scan(ptr_clrequest, ptr_sentinel, 1, &n_insert); } else { /* check both references and notes */ retval = real_run_keyword_scan(ptr_clrequest, ptr_sentinel, 0, &n_insert); if (!retval) { retval = real_run_keyword_scan(ptr_clrequest, ptr_sentinel, 1, &n_insert); } } if (n_insert) { /* connect to database server*/ if ((conn = connect_to_db(ptr_clrequest, NULL, 0)) == NULL) { LOG_PRINT(LOG_ERR, get_status_msg(205)); return 1; } update_meta(conn, ptr_clrequest); dbi_conn_close(conn); } return retval; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ real_run_keyword_scan(): scans datasets for keywords after adding int real_run_keyword_scan returns 1 if failed, 0 if successful struct CLIENT_REQUEST* ptr_clrequest ptr to structure with client info Lilid* ptr_sentinel ptr to linked list with ID values to check or NULL if all references in the database should be scanned int mode 0 = reference entries 1 = note entries int* ptr_insert ptr to insert counter ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int real_run_keyword_scan(struct CLIENT_REQUEST* ptr_clrequest, Lilid* ptr_sentinel, int mode, int* ptr_insert) { int i; unsigned long long keyword_id; unsigned long long xref_id; size_t sql_cmd_len = 1024; char *sql_command; char *new_sql_command; char id_buffer[21] = ""; const char *item; const char *item_kw; const char scanfields[2][5][19] = { {"refdb_abstract", "refdb_title", "refdb_booktitle", "refdb_title_series", ""}, {"note_title", "note_content", ""}}; dbi_conn conn; dbi_result dbires; dbi_result dbires1; dbi_result dbires2; dbi_result dbires_kwlist; Lilid *ptr_curr; if ((sql_command = malloc(sql_cmd_len)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return 1; } /* connect to database server*/ if ((conn = connect_to_db(ptr_clrequest, NULL, 0)) == NULL) { LOG_PRINT(LOG_ERR, get_status_msg(205)); free(sql_command); return 1; } /* get a list of all existing keywords */ strcpy(sql_command, "SELECT * FROM t_keyword"); LOG_PRINT(LOG_DEBUG, sql_command); dbires_kwlist = dbi_conn_query(conn, sql_command); if (!dbires_kwlist) { LOG_PRINT(LOG_WARNING, "keyword query error"); free(sql_command); dbi_conn_close(conn); return 1; } if (dbi_result_get_numrows(dbires_kwlist) < 1) { /* nothing to do */ free(sql_command); dbi_conn_close(conn); return 0; } if (ptr_sentinel) { /* we have a list of IDs to scan */ if (!mode) { strcpy(sql_command, "SELECT refdb_id,refdb_abstract,refdb_title,refdb_booktitle,refdb_title_series FROM t_refdb WHERE refdb_id IN ("); } else { strcpy(sql_command, "SELECT note_id,note_title,note_content FROM t_note WHERE note_id IN ("); } ptr_curr = ptr_sentinel; /* loop over all references to scan */ while ((ptr_curr = get_next_lilid(ptr_curr)) != NULL) { sprintf(id_buffer, ULLSPEC",", (unsigned long long)(ptr_curr->value)); if ((new_sql_command = mstrcat(sql_command, id_buffer, &sql_cmd_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(sql_command); dbi_result_free(dbires_kwlist); dbi_conn_close(conn); return 1; } else { sql_command = new_sql_command; } } if (*id_buffer) { /* overwrite trailing comma with closing bracket */ if ((new_sql_command = mstrcat(sql_command, ")", &sql_cmd_len, 1)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(sql_command); dbi_result_free(dbires_kwlist); dbi_conn_close(conn); return 1; } else { sql_command = new_sql_command; } } else { /* no IDs found */ free(sql_command); LOG_PRINT(LOG_INFO, "no IDs found for keyword scan"); dbi_result_free(dbires_kwlist); dbi_conn_close(conn); return 0; } } else { /* scan all IDs in the database */ if (!mode) { strcpy(sql_command, "SELECT refdb_id,refdb_abstract,refdb_title,refdb_booktitle,refdb_title_series FROM t_refdb WHERE refdb_id>0"); } else { strcpy(sql_command, "SELECT note_id,note_title,note_content FROM t_note WHERE note_id>0"); } } LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { LOG_PRINT(LOG_WARNING, "reference query error"); free(sql_command); dbi_result_free(dbires_kwlist); dbi_conn_close(conn); return 1; } /* loop over all IDs in our result set */ while (dbi_result_next_row(dbires)) { xref_id = my_dbi_result_get_idval(dbires, (mode) ? "note_id":"refdb_id"); /* rewind keyword list */ dbi_result_first_row(dbires_kwlist); /* loop over all keywords */ while (dbi_result_next_row(dbires_kwlist)) { item_kw = my_dbi_result_get_string(dbires_kwlist, "keyword_name"); keyword_id = my_dbi_result_get_idval(dbires_kwlist, "keyword_id"); if (item_kw && *item_kw) { /* loop over fields to scan */ i = 0; while (scanfields[mode][i][0]) { item = my_dbi_result_get_string(dbires, scanfields[mode][i]); if (item && *item && strstr(item, item_kw)) { /* check for existing entry in t_xkeyword */ sprintf(sql_command, "SELECT keyword_id FROM t_xkeyword WHERE keyword_id="ULLSPEC" AND xkeyword_type=\'%s\' AND xref_id="ULLSPEC, (unsigned long long)keyword_id, (mode) ? "NOTE":"REFERENCE", (unsigned long long)xref_id); LOG_PRINT(LOG_DEBUG, sql_command); dbires1 = dbi_conn_query(conn, sql_command); if (!dbires1) { LOG_PRINT(LOG_WARNING, "select error"); free(sql_command); dbi_result_free(dbires); dbi_result_free(dbires_kwlist); dbi_conn_close(conn); return 1; } if (!dbi_result_next_row(dbires1)) { sprintf(sql_command, "INSERT INTO t_xkeyword (keyword_id,xref_id,xkeyword_type) VALUES ("ULLSPEC","ULLSPEC",\'%s\')", (unsigned long long)keyword_id, (unsigned long long)xref_id, (mode)? "NOTE":"REFERENCE"); LOG_PRINT(LOG_DEBUG, sql_command); dbires2 = dbi_conn_query(conn, sql_command); if (!dbires2) { LOG_PRINT(LOG_WARNING, "insert error"); free(sql_command); dbi_result_free(dbires); dbi_result_free(dbires_kwlist); dbi_conn_close(conn); return 1; } *ptr_insert++; dbi_result_free(dbires2); if (!mode) { sprintf(sql_command, "noticed keyword %s in reference %s:"ULLSPEC, item_kw, ptr_clrequest->current_db, (unsigned long long)xref_id); } else { sprintf(sql_command, "noticed keyword %s in note %s:"ULLSPEC, item_kw, ptr_clrequest->current_db, (unsigned long long)xref_id); } LOG_PRINT(LOG_INFO, sql_command); /* jump out as we don't have to scan further fields - the keyword has been added anyway */ dbi_result_free(dbires1); break; } dbi_result_free(dbires1); } i++; } /* end loop over all fields */ } /* end if keyword */ } /* end loop over all keywords */ } dbi_result_free(dbires); free(sql_command); dbi_result_free(dbires_kwlist); dbi_conn_close(conn); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ deleteref(): implements the client command deleteref int deleteref returns >0 if failed, 0 if successful struct CLIENT_REQUEST* ptr_clrequest ptr to structure with client info struct ADDRESULT* ptr_addresult structure to hold number of successful and failed deleterefs ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int deleteref(struct CLIENT_REQUEST* ptr_clrequest, struct ADDRESULT* ptr_addresult) { dbi_conn conn; int numbyte; /* number of bytes written */ int error; int retval = 0; int cs_status; size_t n_bufsize; char buffer[64]; char* id_list; char* new_msg; const char* drivername; struct lilimem sentinel; Lilid id_sentinel; Lilid *ptr_curr; sentinel.ptr_mem = NULL; sentinel.ptr_next = NULL; sentinel.varname[0] = '\0'; id_sentinel.ptr_next = NULL; n_bufsize = atoi(ptr_clrequest->argument); /* try to allocate the amount the client requested */ id_list = malloc(n_bufsize); if (id_list == NULL || insert_lilimem(&sentinel, (void**)&id_list, NULL)) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } /* send acknowledgement to client */ send_status(ptr_clrequest->fd, 0, TERM_NO); if ((cs_status = read_status(ptr_clrequest->fd)) != 0) { LOG_PRINT(LOG_INFO, get_status_msg(112)); delete_all_lilimem(&sentinel); return 1; } /* read id list from client */ numbyte = tread(ptr_clrequest->fd, id_list, n_bufsize); if (numbyte == -1) { LOG_PRINT(LOG_INFO, get_status_msg(109)); delete_all_lilimem(&sentinel); return 1; } /* split id_list into tokens */ error = string_tokenize_lili(&id_sentinel, id_list); if (error == 2) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); delete_all_lilid(&id_sentinel); delete_all_lilimem(&sentinel); return 1; } else if (error == 1) { send_status(ptr_clrequest->fd, 412, TERM_NO); delete_all_lilid(&id_sentinel); delete_all_lilimem(&sentinel); return 1; } /* connect to database server*/ if ((conn = connect_to_db(ptr_clrequest, NULL, 0)) == NULL) { send_status(ptr_clrequest->fd, 204, TERM_NO); LOG_PRINT(LOG_WARNING, get_status_msg(204)); delete_all_lilid(&id_sentinel); delete_all_lilimem(&sentinel); return 1; } drivername = dbi_driver_get_name(dbi_conn_get_driver(conn)); ptr_curr = &id_sentinel; /* loop over arguments */ while ((ptr_curr = get_next_lilid(ptr_curr)) != NULL) { if ((retval = delete_ref_by_id(ptr_curr->value, conn, ptr_clrequest, ptr_addresult)) != 0) { sprintf(buffer, "420:"ULLSPEC"\n", (unsigned long long)ptr_curr->value); if ((new_msg = mstrcat(ptr_addresult->msg, buffer, &(ptr_addresult->msg_len), 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } else { ptr_addresult->msg = new_msg; } } } /* end while */ if (conn && ptr_addresult->success) { update_meta(conn, ptr_clrequest); } dbi_conn_close(conn); delete_all_lilid(&id_sentinel); delete_all_lilimem(&sentinel); send_status(ptr_clrequest->fd, 0, TERM_NO); numbyte = tiwrite(ptr_clrequest->fd, ptr_addresult->msg, TERM_YES); if (numbyte == -1) { LOG_PRINT(LOG_INFO, get_status_msg(110)); retval = 1; } return retval; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ delete_ref_by_id(): deletes a reference by its ID value int delete_ref_by_id returns 0 if failed, 1 if successful unsigned long long idval ID value of the reference to be deleted dbi_conn conn database connection struct CLIENT_REQUEST* ptr_clrequest ptr to structure with client info struct ADDRESULT* ptr_addresult structure to hold number of successful and failed deleterefs ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int delete_ref_by_id(unsigned long long idval, dbi_conn conn, struct CLIENT_REQUEST* ptr_clrequest, struct ADDRESULT* ptr_addresult) { char sql_command[640]; /* fixed length is ok here since only IDs are appended to the query strings, and the length of an ID is limited by the database */ char periodical_id[32] = ""; /* will hold the ID until used */ char* new_msg; int result; unsigned long long n_id = 0; unsigned long long n_xid = 0; unsigned long long n_periodical_id = 0; dbi_result dbires; dbi_result dbires_user; dbi_result dbires_note; /* The general procedure to remove a reference is as follows: Remove the entry in the main table t_refdb. Query the author, keyword, user crosslink tables for authors, keywords, users used by this reference. Find out whether these authors, keywords, users are used by any other datasets. If not, delete them from the authors, keywords, users data tables. In both cases, delete the entries in the crosslink tables */ /* If the db server supports it, start a transaction. We want one transaction per reference */ if (my_dbi_conn_begin(conn)) { LOG_PRINT(LOG_WARNING, get_status_msg(227)); return 227; } /* lock the tables we'll write to to prevent concurrent writes from different clients */ if (my_dbi_conn_lock(conn, 0 /* lock regular tables */)) { LOG_PRINT(LOG_WARNING, get_status_msg(228)); return 228; } sprintf(sql_command, "SELECT refdb_id FROM t_refdb WHERE refdb_type != \'DUMMY\' AND refdb_id="ULLSPEC, (unsigned long long)idval); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { my_dbi_conn_unlock(conn); my_dbi_conn_rollback(conn); LOG_PRINT(LOG_WARNING, get_status_msg(234)); return 234; } if (dbi_result_get_numrows(dbires) == 0) { /* ID does not exist - nothing to do */ ptr_addresult->skipped++; dbi_result_free(dbires); my_dbi_conn_unlock(conn); my_dbi_conn_commit(conn); /* add message, reuse sql_command */ sprintf(sql_command, "417:"ULLSPEC"\n", (unsigned long long)idval); if ((new_msg = mstrcat(ptr_addresult->msg, sql_command, &(ptr_addresult->msg_len), 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { ptr_addresult->msg = new_msg; } return 417; } dbi_result_free(dbires); /* find user id and xuser id entries which we might have to remove */ sprintf(sql_command, "SELECT t_user.user_id, t_user.user_name, t_xuser.xuser_id FROM t_user INNER JOIN t_xuser ON t_user.user_id=t_xuser.user_id WHERE t_xuser.refdb_id="ULLSPEC, (unsigned long long)idval); LOG_PRINT(LOG_DEBUG, sql_command); dbires_user = dbi_conn_query(conn, sql_command); if (!dbires_user) { my_dbi_conn_unlock(conn); my_dbi_conn_rollback(conn); LOG_PRINT(LOG_WARNING, get_status_msg(234)); return 234; } if (dbi_result_get_numrows(dbires_user) > 0) { if (dbi_result_next_row(dbires_user) == 0) { dbi_result_free(dbires_user); my_dbi_conn_unlock(conn); my_dbi_conn_rollback(conn); LOG_PRINT(LOG_WARNING, get_status_msg(234)); return 234; } /* save for later use */ n_id = my_dbi_result_get_idval(dbires_user, "user_id"); n_xid = my_dbi_result_get_idval(dbires_user, "xuser_id"); } /* check whether the reference has been picked by other users */ sprintf(sql_command, "SELECT DISTINCT t_user.user_id,t_user.user_name FROM t_user INNER JOIN t_note ON t_user.user_id=t_note.note_user_id INNER JOIN t_xnote ON t_xnote.note_id=t_note.note_id WHERE t_xnote.xref_id="ULLSPEC" AND t_xnote.xnote_type='REFERENCE'", (unsigned long long)idval); LOG_PRINT(LOG_DEBUG, sql_command); dbires_note = dbi_conn_query(conn, sql_command); if (!dbires_note) { dbi_result_free(dbires_user); my_dbi_conn_unlock(conn); my_dbi_conn_rollback(conn); LOG_PRINT(LOG_WARNING, get_status_msg(234)); return 234; } if (dbi_result_get_numrows(dbires_note) > 0) { int used_by_other = 1; if (dbi_result_next_row(dbires_note) == 0) { dbi_result_free(dbires_user); dbi_result_free(dbires_note); my_dbi_conn_unlock(conn); my_dbi_conn_rollback(conn); LOG_PRINT(LOG_WARNING, get_status_msg(234)); return 234; } if (dbi_result_get_numrows(dbires_note) == 1) { if (!strcmp(ptr_clrequest->username, my_dbi_result_get_string(dbires_user, "user_name"))) { used_by_other--; } } if (used_by_other) { /* dataset is used by at least one other user, refuse to delete it */ ptr_addresult->failure++; dbi_result_free(dbires_user); dbi_result_free(dbires_note); my_dbi_conn_unlock(conn); my_dbi_conn_rollback(conn); /* send message to client, reuse sql_command */ sprintf(sql_command, "423:"ULLSPEC"\n", (unsigned long long)idval); if ((new_msg = mstrcat(ptr_addresult->msg, sql_command, &(ptr_addresult->msg_len), 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { ptr_addresult->msg = new_msg; } return 423; } /* else: reference is only in lists owned by the reference owner */ } /* retrieve periodical_id for later use */ sprintf(sql_command, "SELECT refdb_periodical_id FROM t_refdb WHERE refdb_id="ULLSPEC, (unsigned long long)idval); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { dbi_result_free(dbires_user); my_dbi_conn_unlock(conn); my_dbi_conn_rollback(conn); LOG_PRINT(LOG_WARNING, get_status_msg(234)); return 234; } if (dbi_result_next_row(dbires) != 0) { if ((n_periodical_id = my_dbi_result_get_idval(dbires, "refdb_periodical_id")) != 0) { sprintf(periodical_id, ULLSPEC, (unsigned long long)n_periodical_id); /* save ID */ } } dbi_result_free(dbires); /* search orphans in t_keyword */ result = remove_keyword_entries(idval, conn, 0); if (result) { /* send message to client, reuse sql_command */ sprintf(sql_command, "229:"ULLSPEC"\n", (unsigned long long)idval); if ((new_msg = mstrcat(ptr_addresult->msg, sql_command, &(ptr_addresult->msg_len), 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { ptr_addresult->msg = new_msg; } dbi_result_free(dbires_user); my_dbi_conn_unlock(conn); my_dbi_conn_rollback(conn); return 229; } /* search orphans in t_author */ result = remove_author_entries(idval, conn); if (result) { /* send message to client, reuse sql_command */ sprintf(sql_command, "230:"ULLSPEC"\n", (unsigned long long)idval); if ((new_msg = mstrcat(ptr_addresult->msg, sql_command, &(ptr_addresult->msg_len), 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { ptr_addresult->msg = new_msg; } dbi_result_free(dbires_user); my_dbi_conn_unlock(conn); my_dbi_conn_rollback(conn); return 230; } /* search orphans in t_link */ result = remove_ulink_entries(idval, NULL, conn, 0 /* reference */); if (result) { /* send message to client, reuse sql_command */ sprintf(sql_command, "259:"ULLSPEC"\n", (unsigned long long)idval); if ((new_msg = mstrcat(ptr_addresult->msg, sql_command, &(ptr_addresult->msg_len), 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { ptr_addresult->msg = new_msg; } dbi_result_free(dbires_user); my_dbi_conn_unlock(conn); my_dbi_conn_rollback(conn); return 259; } /* remove orphans in t_xnote */ result = remove_xnote_entries(0 /* any note */, idval, conn, 0 /*ref*/); if (result != 0 && result != 4) { /* send message to client, reuse sql_command */ sprintf(sql_command, "245:"ULLSPEC"\n", (unsigned long long)idval); if ((new_msg = mstrcat(ptr_addresult->msg, sql_command, &(ptr_addresult->msg_len), 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { ptr_addresult->msg = new_msg; } dbi_result_free(dbires_user); my_dbi_conn_unlock(conn); my_dbi_conn_rollback(conn); return 245; } /* search orphans in t_periodical */ if (n_periodical_id) { result = remove_periodical_entries(n_periodical_id, conn); if (result) { /* send message to client, reuse sql_command */ sprintf(sql_command, "231:"ULLSPEC"\n", (unsigned long long)idval); if ((new_msg = mstrcat(ptr_addresult->msg, sql_command, &(ptr_addresult->msg_len), 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { ptr_addresult->msg = new_msg; } dbi_result_free(dbires_user); my_dbi_conn_unlock(conn); my_dbi_conn_rollback(conn); return 231; } } /* delete entry in main table */ sprintf(sql_command, "DELETE FROM t_refdb WHERE refdb_id="ULLSPEC, (unsigned long long)idval); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { /* send message to client, reuse sql_command */ sprintf(sql_command, "248:"ULLSPEC"\n", (unsigned long long)idval); if ((new_msg = mstrcat(ptr_addresult->msg, sql_command, &(ptr_addresult->msg_len), 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { ptr_addresult->msg = new_msg; } dbi_result_free(dbires_user); my_dbi_conn_unlock(conn); my_dbi_conn_rollback(conn); LOG_PRINT(LOG_WARNING, get_status_msg(248)); return 248; } dbi_result_free(dbires); /* search orphans in t_user. The query returning dbires_user ran above. The loop should run only once */ /* delete entry in xuser table */ sprintf(sql_command, "DELETE FROM t_xuser WHERE xuser_id="ULLSPEC, (unsigned long long)n_xid); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { /* send message to client, reuse sql_command */ sprintf(sql_command, "234:"ULLSPEC"\n", (unsigned long long)idval); if ((new_msg = mstrcat(ptr_addresult->msg, sql_command, &(ptr_addresult->msg_len), 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { ptr_addresult->msg = new_msg; } dbi_result_free(dbires_user); my_dbi_conn_unlock(conn); my_dbi_conn_rollback(conn); LOG_PRINT(LOG_WARNING, get_status_msg(234)); return 234; } dbi_result_free(dbires); /* delete entry in user table */ result = remove_user_entries(n_id, conn); if (result != 0 && result != 4) { /* send message to client, reuse sql_command */ sprintf(sql_command, "234:"ULLSPEC"\n", (unsigned long long)idval); if ((new_msg = mstrcat(ptr_addresult->msg, sql_command, &(ptr_addresult->msg_len), 0)) == NULL) { dbi_result_free(dbires_user); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { ptr_addresult->msg = new_msg; } dbi_result_free(dbires_user); my_dbi_conn_unlock(conn); my_dbi_conn_rollback(conn); LOG_PRINT(LOG_WARNING, get_status_msg(234)); return 234; } dbi_result_free(dbires_user); ptr_addresult->success++; /* send message to client, reuse sql_command */ sprintf(sql_command, "419:"ULLSPEC"\n", (unsigned long long)idval); if ((new_msg = mstrcat(ptr_addresult->msg, sql_command, &(ptr_addresult->msg_len), 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { ptr_addresult->msg = new_msg; } my_dbi_conn_unlock(conn); my_dbi_conn_commit(conn); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ pickref(): implements the client command pickref int pickref returns >0 if failed, 0 if successful struct CLIENT_REQUEST* ptr_clrequest ptr to structure with client info int n_remove if 1, remove from personal interest list. if 0, add to list struct ADDRESULT* ptr_addresult structure to hold number of successful and failed pickrefs ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int pickref(struct CLIENT_REQUEST* ptr_clrequest, int n_remove, struct ADDRESULT* ptr_addresult) { dbi_conn conn; dbi_result dbires; dbi_result dbires1; int error = 0; int numrows; int numbyte; /* number of bytes written */ int n_bufsize; int cs_status; int retval = 0; int result; unsigned long long n_user_id = 0; size_t sql_cmd_len; /* length of the sql_command buffer */ char *sql_command; /* a buffer for the sql commands we got to piece together */ char *new_msg; char *id_list; /* the list of IDs that the client sends in */ char *quoted_listname; char *quoted_user; const char *drivername; /* name of the libdbi driver */ struct lilimem sentinel; Lilid id_sentinel; Lilid *ptr_curr; /* initialize linked lists */ sentinel.ptr_mem = NULL; sentinel.ptr_next = NULL; sentinel.varname[0] = '\0'; id_sentinel.ptr_next = NULL; /* allocate memory */ sql_cmd_len = 256; sql_command = malloc(sql_cmd_len); if (sql_command == NULL || insert_lilimem(&sentinel, (void**)&sql_command, NULL)) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } n_bufsize = atoi(ptr_clrequest->argument); /* try to allocate the amount the client requested */ id_list = malloc(n_bufsize); if (id_list == NULL || insert_lilimem(&sentinel, (void**)&id_list, NULL)) { delete_all_lilimem(&sentinel); send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } /* send acknowledgement to client */ send_status(ptr_clrequest->fd, 0, TERM_NO); /* read id list from client */ if ((cs_status = read_status(ptr_clrequest->fd)) != 0) { LOG_PRINT(LOG_INFO, get_status_msg(112)); delete_all_lilimem(&sentinel); return 1; } numbyte = tread(ptr_clrequest->fd, id_list, n_bufsize); if (numbyte == -1) { delete_all_lilimem(&sentinel); LOG_PRINT(LOG_ERR, get_status_msg(109)); return 1; } /* split id_list into tokens */ error = string_tokenize_lili(&id_sentinel, id_list); if (error == 2) { delete_all_lilimem(&sentinel); delete_all_lilid(&id_sentinel); send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } else if (error == 1) { delete_all_lilimem(&sentinel); delete_all_lilid(&id_sentinel); send_status(ptr_clrequest->fd, 412, TERM_NO); LOG_PRINT(LOG_INFO, get_status_msg(412)); return 2; } /* connect to database server*/ if ((conn = connect_to_db(ptr_clrequest, NULL, 0)) == NULL) { delete_all_lilid(&id_sentinel); delete_all_lilimem(&sentinel); send_status(ptr_clrequest->fd, 204, TERM_NO); LOG_PRINT(LOG_WARNING, get_status_msg(204)); return 1; } /* The general procedure to pick a reference is: check whether there is an entry in t_xuser for the current user pointing to this refdb_id. If yes and we shall add, we're done. If yes and we shall remove, do so. If no entry is found: If we shall remove, we're done, if we shall add, do so. Personal reference lists are implemented as notes. We also have to add the user to t_user if he's not already there. And upon removing entries from t_xuser we have to check whether we remove the last reference to the user in t_user. If so, we have to kick him out */ /* If the db server supports it, start a transaction. We want one transaction per reference */ if (my_dbi_conn_begin(conn)) { send_status(ptr_clrequest->fd, 227, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(227)); retval = 1; goto Finish; } /* lock the tables we'll write to to prevent concurrent writes from different clients */ if (my_dbi_conn_lock(conn, 0 /* lock regular tables */)) { send_status(ptr_clrequest->fd, 228, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(228)); retval = 1; goto Finish; } /* get the user_id for the current user */ quoted_user = strdup(ptr_clrequest->username); if (!quoted_user || !dbi_conn_quote_string(conn, "ed_user)) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); my_dbi_conn_unlock(conn); my_dbi_conn_rollback(conn); retval = 1; goto Finish; } sprintf(sql_command, "SELECT user_id FROM t_user WHERE user_name=%s", quoted_user); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { send_status(ptr_clrequest->fd, 234, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(234)); my_dbi_conn_unlock(conn); my_dbi_conn_rollback(conn); retval = 1; goto Finish; } if (dbi_result_get_numrows(dbires) == 0) { if (!n_remove) { /* create an entry for the current user in t_user */ sprintf(sql_command, "INSERT INTO t_user (user_name) VALUES (%s)", quoted_user); LOG_PRINT(LOG_DEBUG, sql_command); dbires1 = dbi_conn_query(conn, sql_command); if (!dbires1) { send_status(ptr_clrequest->fd, 233, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(233)); dbi_result_free(dbires); my_dbi_conn_unlock(conn); my_dbi_conn_rollback(conn); retval = 1; goto Finish; } dbi_result_free(dbires1); /* retrieve the generated user_id in t_user */ drivername = dbi_driver_get_name(dbi_conn_get_driver(conn)); if (!strcmp(my_dbi_conn_get_cap(conn, "named_seq"), "f")) { n_user_id = dbi_conn_sequence_last(conn, NULL); } else { n_user_id = dbi_conn_sequence_last(conn, "t_user_user_id_seq"); } } } else { /* numrows > 0 */ /* retrieve the user_id from t_user */ if (dbi_result_next_row(dbires) != 0) { n_user_id = (unsigned long long)my_dbi_result_get_idval(dbires, "user_id"); } else { send_status(ptr_clrequest->fd, 234, TERM_NO); LOG_PRINT(LOG_WARNING, get_status_msg(234)); dbi_result_free(dbires); my_dbi_conn_unlock(conn); my_dbi_conn_rollback(conn); retval = 1; goto Finish; } } free(quoted_user); dbi_result_free(dbires); /*----------------------------------------------------------------*/ /* remove entries */ if (n_remove) { /* remove entries one by one to get exact status reports */ ptr_curr = &id_sentinel; /* loop over arguments */ while ((ptr_curr = get_next_lilid(ptr_curr)) != NULL) { result = dump_one_reference(conn, ptr_curr->value, n_user_id, ptr_clrequest->listname, ptr_clrequest->username, ptr_addresult); if (result == 234 || result == 262 || result == 267) { send_status(ptr_clrequest->fd, result, TERM_NO); LOG_PRINT(LOG_WARNING, get_status_msg(result)); retval = 1; goto Finish; } else if (result == 801) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); my_dbi_conn_unlock(conn); my_dbi_conn_rollback(conn); retval = 1; goto Finish; } /* else: ok */ } my_dbi_conn_unlock(conn); my_dbi_conn_commit(conn); /* see whether personal reference list is empty */ if (*(ptr_clrequest->listname)) { quoted_listname = strdup(ptr_clrequest->listname); if (!quoted_listname || !dbi_conn_quote_string(conn, "ed_listname)) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); my_dbi_conn_unlock(conn); my_dbi_conn_rollback(conn); retval = 1; goto Finish; } if (*upper_citekey == 't') { strup(quoted_listname); } sprintf(sql_command, "SELECT xnote_id FROM t_xnote INNER JOIN t_note ON t_note.note_id=t_xnote.note_id WHERE t_note.note_key=%s", quoted_listname); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { send_status(ptr_clrequest->fd, 234, TERM_NO); LOG_PRINT(LOG_WARNING, get_status_msg(234)); my_dbi_conn_unlock(conn); my_dbi_conn_rollback(conn); retval = 1; goto Finish; } numrows = dbi_result_get_numrows(dbires); if (!numrows) { /* list contains no references */ struct ADDRESULT* p_dummy_addresult; if ((p_dummy_addresult = new_addresult(512)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } if (remove_personal_list(conn, quoted_listname, ptr_clrequest, p_dummy_addresult)) { /* error */ sprintf(sql_command, "264:%s\n", quoted_listname); if ((new_msg = mstrcat(ptr_addresult->msg, sql_command, &(ptr_addresult->msg_len), 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { ptr_addresult->msg = new_msg; } } else { sprintf(sql_command, "265:%s\n", quoted_listname); if ((new_msg = mstrcat(ptr_addresult->msg, sql_command, &(ptr_addresult->msg_len), 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { ptr_addresult->msg = new_msg; } } free_addresult(p_dummy_addresult); } dbi_result_free(dbires); } } /*----------------------------------------------------------------*/ /* add entries */ else { /* if (!n_remove) */ /* add entries one by one to get exact status reports */ ptr_curr = &id_sentinel; /* loop over arguments */ while ((ptr_curr = get_next_lilid(ptr_curr)) != NULL) { result = pick_one_reference(conn, ptr_curr->value, n_user_id, ptr_clrequest->listname, ptr_clrequest->username, ptr_addresult); if (result == 234 || result == 262 || result == 266) { send_status(ptr_clrequest->fd, result, TERM_NO); LOG_PRINT(LOG_WARNING, get_status_msg(result)); retval = 1; goto Finish; } else if (result == 801) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); my_dbi_conn_unlock(conn); my_dbi_conn_rollback(conn); retval = 1; goto Finish; } /* else: ok */ } my_dbi_conn_unlock(conn); my_dbi_conn_commit(conn); } /* send report to client */ send_status(ptr_clrequest->fd, 0, TERM_NO); numbyte = tiwrite(ptr_clrequest->fd, ptr_addresult->msg, TERM_YES); if (numbyte == -1) { LOG_PRINT(LOG_INFO, get_status_msg(110)); retval = 1; } Finish: if (conn && ptr_addresult->success) { update_meta(conn, ptr_clrequest); } dbi_conn_close(conn); delete_all_lilid(&id_sentinel); delete_all_lilimem(&sentinel); return retval; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ pick_one_reference(): adds one reference to a personal reference list when calling this function, the tables which are going to be modified should be locked by the calling function int pick_one_reference returns >0 if failed, 0 if successful dbi_conn conn connection structure unsigned long long n_ref_id ID of the reference to be picked unsigned long long n_user_id ID of the current user const char *listname name of the personal reference list const char *username name of the current user struct ADDRESULT* ptr_addresult structure to hold number of successful and failed pickrefs ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int pick_one_reference(dbi_conn conn, unsigned long long n_ref_id, unsigned long long n_user_id, const char *listname, const char *username, struct ADDRESULT* ptr_addresult) { int result; unsigned long long n_list_id; unsigned long long n_list_owner_id; char refdb_citekey[256] = ""; char sql_command[1024]; char full_listname[PREFS_BUF_LEN+USERNAME_LENGTH+2] = ""; char *quoted_listname; char *new_msg; dbi_result dbires; /* make sure the target exists */ sprintf(sql_command, "SELECT refdb_id, refdb_citekey FROM t_refdb WHERE refdb_id="ULLSPEC, (unsigned long long)n_ref_id); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { return 234; } if (!dbi_result_next_row(dbires)) { /* target ID missing */ dbi_result_free(dbires); /* reuse sql_command */ sprintf(sql_command, "412:"ULLSPEC"\n", (unsigned long long)n_ref_id); ptr_addresult->skipped++; if ((new_msg = mstrcat(ptr_addresult->msg, sql_command, &(ptr_addresult->msg_len), 0)) == NULL) { return 801; } else { ptr_addresult->msg = new_msg; } return 0; } else { strcpy(refdb_citekey, dbi_result_get_string(dbires, "refdb_citekey")); } dbi_result_free(dbires); /* check for existing note representing the personal list */ if (!*listname) { quoted_listname = malloc(strlen(username)*2+2); if (quoted_listname) { sprintf(quoted_listname, "%s-%s", username, username); strcpy(full_listname, quoted_listname); /* preserve for later use */ } } else { quoted_listname = strdup(listname); } if (!quoted_listname || !dbi_conn_quote_string(conn, "ed_listname)) { return 801; } /* uppercase string if citation keys are expected in uppercase */ if (*upper_citekey == 't') { strup(quoted_listname); strup(full_listname); /* initialized to empty string if not used */ } sprintf(sql_command, "SELECT note_id, note_user_id FROM t_note WHERE note_key=%s", quoted_listname); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(quoted_listname); LOG_PRINT(LOG_DEBUG, "dbires went to NULL"); return 234; } if (dbi_result_next_row(dbires)) { /* note already exists, check user id */ n_list_owner_id = my_dbi_result_get_idval(dbires, "note_user_id"); /* sprintf(sql_command, "n_list_owner_id went to %lld", n_list_owner_id); */ LOG_PRINT(LOG_DEBUG, sql_command); if (n_list_owner_id != n_user_id) { /* we're not owner of this list */ free(quoted_listname); LOG_PRINT(LOG_DEBUG, "not owner of this list"); sprintf(sql_command, "266:%s:%s\n", (*listname)?listname:full_listname, username); if ((new_msg = mstrcat(ptr_addresult->msg, sql_command, &(ptr_addresult->msg_len), 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { ptr_addresult->msg = new_msg; } return 266; } /* we own this list. retrieve ID */ n_list_id = my_dbi_result_get_idval(dbires, "note_id"); /* sprintf(sql_command, "n_list_id went to %lld", n_list_id); */ LOG_PRINT(LOG_DEBUG, sql_command); } else { /* note does not yet exist. Create a new one */ n_list_id = create_personal_list(conn, (*listname)?(char*)listname:full_listname, n_user_id, username); /* sprintf(sql_command, "new n_list_id went to %lld", n_list_id); */ LOG_PRINT(LOG_DEBUG, sql_command); if (!n_list_id) { free(quoted_listname); sprintf(sql_command, "262:%s\n", (*listname)?listname:full_listname); if ((new_msg = mstrcat(ptr_addresult->msg, sql_command, &(ptr_addresult->msg_len), 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { ptr_addresult->msg = new_msg; } return 262; } /* else: was created ok */ sprintf(sql_command, "263:%s\n", (*listname)?listname:full_listname); if ((new_msg = mstrcat(ptr_addresult->msg, sql_command, &(ptr_addresult->msg_len), 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { ptr_addresult->msg = new_msg; } } dbi_result_free(dbires); /* insert new link */ /* function will quote ptr_curr->value */ result = insert_link("REFERENCE", refdb_citekey, conn, n_list_id); /* printf("my_type: %s<< ptr_curr->value: %s<<\n", my_type, ptr_curr->value); */ /* reuse sql_command */ if (!result) { /* ok */ sprintf(sql_command, "421:%s -> %s:%s\n", quoted_listname, "REFERENCE", refdb_citekey); ptr_addresult->success++; } else if (result == 7) { /* link already exists */ sprintf(sql_command, "418:%s -> %s:%s\n", quoted_listname, "REFERENCE", refdb_citekey); ptr_addresult->skipped++; } else { /* other errors */ sprintf(sql_command, "414:%s -> %s:%s\n", quoted_listname, "REFERENCE", refdb_citekey); ptr_addresult->failure++; } if ((new_msg = mstrcat(ptr_addresult->msg, sql_command, &(ptr_addresult->msg_len), 0)) == NULL) { free(quoted_listname); return 801; } else { ptr_addresult->msg = new_msg; } free(quoted_listname); /* success */ return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ dump_one_reference(): removes one reference from a personal reference list when calling this function, the tables which are going to be modified should be locked by the calling function int dump_one_reference returns >0 if failed, 0 if successful dbi_conn conn connection structure unsigned long long n_ref_id ID of the reference to be picked unsigned long long n_user_id ID of the current user const char *listname name of the personal reference list const char *username name of the current user struct ADDRESULT* ptr_addresult structure to hold number of successful and failed pickrefs ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int dump_one_reference(dbi_conn conn, unsigned long long n_ref_id, unsigned long long n_user_id, const char *listname, const char *username, struct ADDRESULT* ptr_addresult) { int retval = 0; int retcode = 0; unsigned long long n_list_id; unsigned long long n_list_owner_id; unsigned long long n_xnote_id; char sql_command[1024]; char *quoted_listname; char *new_msg; dbi_result dbires; /* strategy check existence and ownership of list find link to reference in list if not found, return if found, remove link */ if (!*listname) { /* if no listname is specified, it defaults to the current users main list */ quoted_listname = malloc(strlen(username)*2+2); if (quoted_listname) { sprintf(quoted_listname, "%s-%s", username, username); } } else { quoted_listname = strdup(listname); } if (!quoted_listname || !dbi_conn_quote_string(conn, "ed_listname)) { return 801; } if (*upper_citekey == 't') { strup(quoted_listname); } /* check whether we own the list at all */ sprintf(sql_command, "SELECT note_id, note_user_id FROM t_note WHERE note_key=%s", quoted_listname); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(quoted_listname); return 234; } if (dbi_result_next_row(dbires)) { /* note exists, check user id */ n_list_owner_id = my_dbi_result_get_idval(dbires, "note_user_id"); if (n_list_owner_id != n_user_id) { /* we're not owner of this list */ sprintf(sql_command, "266:%s:%s\n", quoted_listname, username); free(quoted_listname); if ((new_msg = mstrcat(ptr_addresult->msg, sql_command, &(ptr_addresult->msg_len), 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { ptr_addresult->msg = new_msg; } return 266; } /* we own this list. retrieve ID */ n_list_id = my_dbi_result_get_idval(dbires, "note_id"); } else { /* list does not exist */ sprintf(sql_command, "267:%s:%s\n", quoted_listname, username); free(quoted_listname); if ((new_msg = mstrcat(ptr_addresult->msg, sql_command, &(ptr_addresult->msg_len), 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { ptr_addresult->msg = new_msg; } return 267; } dbi_result_free(dbires); /* find note crosslink entry for this reference */ sprintf(sql_command, "SELECT t_xnote.xnote_id FROM t_xnote INNER JOIN t_note ON t_note.note_id=t_xnote.note_id WHERE t_note.note_key=%s AND t_xnote.xref_id="ULLSPEC" AND t_note.note_user_id="ULLSPEC, quoted_listname, (unsigned long long)n_ref_id, (unsigned long long)n_user_id); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { return 234; } if (!dbi_result_next_row(dbires)) { ptr_addresult->skipped++; dbi_result_free(dbires); return 0; } n_xnote_id = my_dbi_result_get_idval(dbires, "xnote_id"); if (!n_xnote_id) { ptr_addresult->failure++; dbi_result_free(dbires); return 234; } /* remove link to reference from the list */ sprintf(sql_command, "DELETE FROM t_xnote WHERE xnote_id="ULLSPEC, (unsigned long long)n_xnote_id); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { return 234; } if (!dbi_result_get_numrows_affected(dbires)) { retval = 417; } else { /* successfully deleted */ retval = 419; } dbi_result_free(dbires); /* todo: now if the user has personal data but has no longer picked the ref, find orphans in t_xuser and t_xlink and t_link */ /* see if ref is attached to any other list of the same user */ sprintf(sql_command, "SELECT t_note.note_key FROM t_note INNER JOIN t_xnote ON t_note.note_id=t_xnote.note_id WHERE t_xnote.xref_id="ULLSPEC" AND t_note.note_user_id="ULLSPEC, (unsigned long long)n_ref_id, (unsigned long long)n_user_id); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { return 234; } if (!dbi_result_next_row(dbires)) { /* ref is not picked in another list. Remove personal data. Start with ulinks as that code relies on xuser entries */ retcode = remove_ulink_entries(n_ref_id, username, conn, 0 /* reference */); retcode = remove_xuser_entries(n_ref_id, (char*)username, conn); } dbi_result_free(dbires); /* todo: check retcode */ if (retval == 417) { sprintf(sql_command, "417:"ULLSPEC":%s\n", (unsigned long long)n_ref_id, username); ptr_addresult->skipped++; } else { /* successfully deleted */ sprintf(sql_command, "419:%s->"ULLSPEC":%s\n", quoted_listname, (unsigned long long)n_ref_id, username); ptr_addresult->success++; } free(quoted_listname); if ((new_msg = mstrcat(ptr_addresult->msg, sql_command, &(ptr_addresult->msg_len), 0)) == NULL) { return 801; } else { ptr_addresult->msg = new_msg; } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ updatejo(): implements the client command updatejo int updatejo returns 1 if failed, 0 if successful struct CLIENT_REQUEST* ptr_clrequest ptr to structure with client info struct ADDRESULT* addresult this structure will be filled in with the number of (un-)successfully added/updated references ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int updatejo(struct CLIENT_REQUEST* ptr_clrequest, struct ADDRESULT* ptr_addresult) { dbi_conn conn; dbi_result dbires; dbi_driver driver; char **inargv; /* tokens of the client request */ int inargc; /* number of tokens of the client request */ int inargcmax; /* maximum number of tokens of the client request */ size_t len; int retval = 0; int havefirst = 0; int error = 0; /* codes: 0 = no error, 1 = out of memory, 2 = subselect failed */ int syn_count = 0; /* counter for synonyms changed */ size_t buffer_len; /* these are the allocated lengths of the buffers */ size_t sql_command_len; size_t return_msg_len; char *return_msg; char *sql_command; /* these are ptrs to the buffers and temporary ptrs */ char *buffer; char *new_buffer; char *token; char *newtoken; char *stripped_token; char *quoted_token; char *eostring; char journal_val[256] = ""; /* name of journal*/ char journal_field[23] = ""; /* t_periodical field name of synonym */ char field_buffer[10]; char jo[256] = ""; char jf[256] = ""; char j1[256] = ""; char j2[256] = ""; struct SQLTOKEN sqltoken; struct lilimem sentinel; Liliform *ptr_curr; Liliform syn_sentinel; ptr_addresult->success = 0; ptr_addresult->failure = 0; ptr_addresult->updated = 0; ptr_addresult->skipped = 0; sentinel.ptr_mem = NULL; sentinel.ptr_next = NULL; sentinel.varname[0] = '\0'; syn_sentinel.ptr_next = NULL; syn_sentinel.name[0] = '\0'; syn_sentinel.value = NULL; /* get buffer to analyze the request */ inargc = 0; inargcmax = 10; inargv = malloc((size_t)inargcmax*sizeof(char*)); if (inargv == NULL || insert_lilimem(&sentinel, (void**)&inargv, NULL)) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } /* get buffer to assemble the SQL queries */ sql_command_len = 4096; sql_command = malloc(sql_command_len); if (sql_command == NULL || insert_lilimem(&sentinel, (void**)&sql_command, NULL)) { delete_all_lilimem(&sentinel); send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } *sql_command = '\0'; /* start with an empty string */ /* get a buffer to hold tokens */ buffer_len = 4096; buffer = malloc(buffer_len); if (buffer == NULL || insert_lilimem(&sentinel, (void**)&buffer, NULL)) { delete_all_lilimem(&sentinel); send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } *buffer = '\0'; /* start with an empty string */ /* yet another buffer */ return_msg_len = 4096; return_msg = malloc(return_msg_len); if (return_msg == NULL || insert_lilimem(&sentinel, (void**)&return_msg, NULL)) { delete_all_lilimem(&sentinel); send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } *return_msg = '\0'; /* start with an empty string */ eostring = ptr_clrequest->argument + strlen(ptr_clrequest->argument); /* connect to the database */ if ((conn = connect_to_db(ptr_clrequest, NULL, 0)) == NULL) { send_status(ptr_clrequest->fd, 204, TERM_NO); LOG_PRINT(LOG_WARNING, get_status_msg(204)); delete_all_lilimem(&sentinel); return 1; } driver = dbi_conn_get_driver(conn); token = ptr_clrequest->argument; newtoken = token; /* printf("%s\n", token); */ /* general strategy: scan the command string for items and add all of them except the first to a linked list. Then walk through the linked list to assemble the update query */ /* loop as long as we find more tokens */ while (newtoken != NULL) { token = link_tokenize(newtoken, &sqltoken); newtoken = sqltoken.next_token; /* printf("token:%s< buffer_len) { new_buffer = (char*)realloc(buffer, (size_t)sqltoken.length); if (new_buffer == NULL) { /* out of memory */ error = 1; break; } else { buffer = new_buffer; buffer_len = sqltoken.length; } } strncpy(buffer, token, sqltoken.length); buffer[sqltoken.length] ='\0'; if (sqltoken.type == 4) { /*----------------------------------------------------------------*/ /* target fields */ if (strncmp(token, ":JF:", 4) == 0 || /* journal full */ strncmp(token, ":JO:", 4) == 0 || /* journal abbrev */ strncmp(token, ":JA:", 4) == 0 || /* journal abbrev */ strncmp(token, ":J1:", 4) == 0 || /* journal custabbrev1 */ strncmp(token, ":J2:", 4) == 0) { /* journal custabbrev2 */ strcpy(field_buffer, buffer); field_buffer[4] = '\0'; /* terminate string */ /* obtain the token after the '=' */ token = link_tokenize(newtoken, &sqltoken); newtoken = sqltoken.next_token; if (token != NULL) { strncpy(buffer, token, sqltoken.length); buffer[sqltoken.length] ='\0'; /* terminate string */ len = 0; token = nstrtok(buffer, &len, " "); if (token != NULL) { /* printf("token went to: %s<<\n", token); */ memmove(buffer, token, sqltoken.length); buffer[sqltoken.length] ='\0'; /* terminate string */ len = 0; token = nstrtok(buffer, &len, " "); if (token != NULL) { quoted_token = malloc(strlen(token)+1); if (!quoted_token) { error = 1; break; } stripped_token = strip_quote(token); unescape_chars(quoted_token, stripped_token, strlen(stripped_token)); /* printf("quoted_token went to: %s<<\n", quoted_token); */ if (!havefirst) { if (!strcmp(field_buffer, ":JF:")) { strcpy(journal_field, "periodical_name"); } else if (!strcmp(field_buffer, ":JO:") || !strcmp(field_buffer, ":JA:")) { strcpy(journal_field, "periodical_abbrev"); } else if (!strcmp(field_buffer, ":J1:")) { strcpy(journal_field, "periodical_custabbrev1"); } else { strcpy(journal_field, "periodical_custabbrev2"); } if (dbi_conn_quote_string(conn, "ed_token) == 0) { error = 1; break; } strncpy(journal_val, quoted_token, 255); journal_val[255] = '\0'; /* printf("key:%s<skipped++; } } /* if (sqltoken.type != 4) / else */ } /* if (token != NULL) */ } /* while (newtoken != NULL) */ if (error || !*journal_field || !*journal_val) { if (error == 1) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); } else { send_status(ptr_clrequest->fd, 417, TERM_NO); LOG_PRINT(LOG_INFO, get_status_msg(417)); } retval = 1; goto Finish; } /* loop over all synonyms. If the same synonym is specified more than once, the last value prevails */ ptr_curr = &syn_sentinel; while ((ptr_curr = get_next_liliform(ptr_curr)) != NULL) { /* strcpy is sufficient as ptr_curr->value is already checked for length */ quoted_token = mstrdup(ptr_curr->value); if (!quoted_token) { error = 1; break; } if (dbi_conn_quote_string(conn, "ed_token) == 0) { error = 1; break; } if (!strcmp(ptr_curr->name, ":JO:")) { strcpy(jo, quoted_token); } else if (!strcmp(ptr_curr->name, ":JF:")) { strcpy(jf, quoted_token); } else if (!strcmp(ptr_curr->name, ":J1:")) { strcpy(j1, quoted_token); } else if (!strcmp(ptr_curr->name, ":J2:")) { strcpy(j2, quoted_token); } free(quoted_token); } if (error) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); retval = 1; goto Finish; } /* assemble query string */ strcpy(sql_command, "UPDATE t_periodical SET "); if (*jf) { sprintf(sql_command + strlen(sql_command), "periodical_name=%s, ", jf); syn_count++; sprintf(return_msg, "425:%s:%s\n", journal_val, jf); } if (*jo) { sprintf(sql_command + strlen(sql_command), "periodical_abbrev=%s, ", jo); syn_count++; sprintf(return_msg+strlen(return_msg), "425:%s:%s\n", journal_val, jo); } if (*j1) { sprintf(sql_command + strlen(sql_command), "periodical_custabbrev1=%s, ", j1); syn_count++; sprintf(return_msg+strlen(return_msg), "425:%s:%s\n", journal_val, j1); } if (*j2) { sprintf(sql_command + strlen(sql_command), "periodical_custabbrev2=%s, ", j2); syn_count++; sprintf(return_msg+strlen(return_msg), "425:%s:%s\n", journal_val, j2); } /* remove trailing comma */ sprintf(sql_command + strlen(sql_command) - 2, " WHERE %s=%s", journal_field, journal_val); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { error = 1; goto Finish; } ptr_addresult->success += syn_count; Finish: if (ptr_addresult->success) { /* database was changed, update meta info */ update_meta(conn, ptr_clrequest); } /* send back result message */ if (!error) { send_status(ptr_clrequest->fd, 0, TERM_NO); } else { send_status(ptr_clrequest->fd, 260, TERM_NO); } tiwrite(ptr_clrequest->fd, return_msg, TERM_YES); dbi_conn_close(conn); delete_all_lilimem(&sentinel); delete_all_liliform(&syn_sentinel); return retval; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ is_journal(): checks whether journal exists int is_journal returns 0 = not found, 1 = journal exists, -1: error dbi_conn conn connection to database const char* field field to check const char* quoted_name periodical name (properly escaped and quoted) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int is_journal(dbi_conn conn, const char* field, const char* quoted_name) { unsigned long long result; char sql_command[512]; dbi_result dbires; snprintf(sql_command, 512, "SELECT periodical_id FROM t_periodical WHERE %s=%s", field, quoted_name); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { LOG_PRINT(LOG_ERR, get_status_msg(234)); return -1; } result = dbi_result_get_numrows(dbires); if (!result) { return 0; } else if (result == DBI_ROW_ERROR) { LOG_PRINT(LOG_ERR, get_status_msg(234)); return -1; } else { return 1; } } refdb-1.0.2/src/refdbda.c000755 001750 001750 00000253321 12255427652 016007 0ustar00markusmarkus000000 000000 /*++++++++++++++++++++ refdbda.c: refdb application server, administrative functions markus@mhoenicka.de 6-5-00 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, see +++++++++++++++++++++++++*/ #include #include #include #include #include /* for umask */ #include #include #include #include /* for strftime */ #include /* for log10 */ #include #include #include #include "backend.h" #include "refdb.h" #include "linklist.h" #include "refdbd.h" /* depends on backend.h */ #include "tokenize.h" #include "strfncs.h" #include "connect.h" #include "cgi.h" #include "dbfncs.h" /* these are defined in refdbd.c */ extern char server_ip[]; extern char log_file[]; extern char log_dest[]; extern char log_level[]; extern char port_address[]; extern char dbs_port_address[]; extern char refdb_timeout[]; extern char refdblib[]; extern char the_fifo[]; extern char pid_file[]; extern char cs_term[]; extern char main_db[]; extern char force_dbcheck[]; extern int n_log_level; extern int n_log_dest; extern int n_refdb_timeout; extern int n_reopen_log; extern int n_remote_admin; extern int run; extern int parent_pid; extern int fd_fifo; /* forward declarations of local functions */ static int is_reference_database(struct CLIENT_REQUEST* ptr_clrequest, dbi_conn conn, const char* dbname); static int daemon_started_by_init(void); static int daemon_started_by_inetd(void); static long limit_open(void); void log_dberror(dbi_conn Conn, void *user_argument); /* declaration of the svn version function */ const char* svn_version(void); /* additional types */ #ifndef HAVE_SOCKLEN_T # define socklen_t int #endif /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ child_confserv(): configures the application server (child process) this fn sends the changes to the parent process via a FIFO/named pipe (via a temp file in Cygwin). int child_confserv returns 0 if ok, >0 if error struct CLIENT_REQUEST* ptr_clrequest ptr to structure with client info struct ADDRESULT* ptr_addresult ptr to struct with counters ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int child_confserv(struct CLIENT_REQUEST* ptr_clrequest, struct ADDRESULT* ptr_addresult) { char outbuffer[OUTBUF_LEN]; int fd_fifo = 0; int retval; if (!n_remote_admin) { send_status(ptr_clrequest->fd, 0, TERM_NO); tiwrite(ptr_clrequest->fd, "703\n", TERM_YES); ptr_addresult->failure++; return 2; } /* check our access rights */ retval = is_refdb_admin(ptr_clrequest, ptr_addresult); if (!retval) { /* unauthorized attempt likely */ send_status(ptr_clrequest->fd, 0, TERM_NO); tiwrite(ptr_clrequest->fd, ptr_addresult->msg, TERM_YES); ptr_addresult->failure++; return 2; } else if (retval == -1) { /* connection failed */ send_status(ptr_clrequest->fd, 202, TERM_NO); LOG_PRINT(LOG_WARNING, get_status_msg(202)); return 1; } /* we have to treat ping separately as it should not create a temp file or use the FIFO */ if (ptr_clrequest->inargc == *(ptr_clrequest->ptr_optind)+1 && strcmp(ptr_clrequest->inargv[*(ptr_clrequest->ptr_optind)], "ping") == 0) { send_status(ptr_clrequest->fd, 0, TERM_NO); sprintf(&(ptr_addresult->msg[strlen(ptr_addresult->msg)]), "707:parent %d:child %d\n", parent_pid, getpid()); tiwrite(ptr_clrequest->fd, ptr_addresult->msg, TERM_YES); ptr_addresult->success++; return 0; } #ifdef HAVE_MKFIFO if (fd_fifo != -1) { close(fd_fifo); /* this is still open for reading */ if ((fd_fifo = open(the_fifo, O_WRONLY)) == -1) { LOG_PRINT(LOG_WARNING, get_status_msg(839)); send_status(ptr_clrequest->fd, 839, TERM_NO); ptr_addresult->failure++; return 1; } } else { LOG_PRINT(LOG_WARNING, get_status_msg(839)); send_status(ptr_clrequest->fd, 839, TERM_NO); ptr_addresult->failure++; return 1; } #else if (access(the_fifo, F_OK) != -1) { /* old file still exists */ LOG_PRINT(LOG_WARNING, get_status_msg(839)); send_status(ptr_clrequest->fd, 839, TERM_NO); ptr_addresult->failure++; return 1; } else { /* create a temp file with exclusive rights */ if ((fd_fifo = open(the_fifo, O_WRONLY|O_CREAT|O_EXCL, S_IRUSR|S_IWUSR)) == -1) { LOG_PRINT(LOG_WARNING, get_status_msg(839)); send_status(ptr_clrequest->fd, 839, TERM_NO); ptr_addresult->failure++; return 1; } } #endif /* HAVE_MKFIFO */ /* the inargv array should have one or two entries: a command and an optional argument */ if (ptr_clrequest->inargc == *(ptr_clrequest->ptr_optind)) { /* no argument given */ LOG_PRINT(LOG_WARNING, get_status_msg(301)); send_status(ptr_clrequest->fd, 301, TERM_NO); ptr_addresult->failure++; return 1; } if (ptr_clrequest->inargc == *(ptr_clrequest->ptr_optind)+1) { /* one argument */ if (strcmp(ptr_clrequest->inargv[*(ptr_clrequest->ptr_optind)], "stop") == 0) { if (write(fd_fifo, "1stop", 6) == -1) { LOG_PRINT(LOG_WARNING, get_status_msg(840)); send_status(ptr_clrequest->fd, 840, TERM_NO); ptr_addresult->failure++; return 1; } else { sprintf(&(ptr_addresult->msg[strlen(ptr_addresult->msg)]), "708:%d:%d\n", parent_pid, getpid()); ptr_addresult->success++; LOG_PRINT(LOG_INFO, get_status_msg(708)); } } else { LOG_PRINT(LOG_WARNING, get_status_msg(301)); send_status(ptr_clrequest->fd, 301, TERM_NO); ptr_addresult->failure++; return 1; } } else { /* more than one argument, use first two */ if (strcmp(ptr_clrequest->inargv[*(ptr_clrequest->ptr_optind)], "serverip") == 0) { strcpy(ptr_clrequest->server_ip, ptr_clrequest->inargv[*(ptr_clrequest->ptr_optind)+1]); sprintf(outbuffer, "2serverip %s", ptr_clrequest->server_ip); if (write(fd_fifo, outbuffer, strlen(outbuffer) + 1) == -1) { LOG_PRINT(LOG_WARNING, get_status_msg(840)); send_status(ptr_clrequest->fd, 840, TERM_NO); ptr_addresult->failure++; return 1; } else { sprintf(outbuffer, "709:%s", ptr_clrequest->server_ip); LOG_PRINT(LOG_INFO, outbuffer); sprintf(&(ptr_addresult->msg[strlen(ptr_addresult->msg)]), "709:%s\n", ptr_clrequest->server_ip); ptr_addresult->success++; } } else if (strcmp(ptr_clrequest->inargv[*(ptr_clrequest->ptr_optind)], "timeout") == 0) { strcpy(refdb_timeout, ptr_clrequest->inargv[*(ptr_clrequest->ptr_optind)+1]); n_refdb_timeout = atoi(refdb_timeout); sprintf(outbuffer, "2timeout %s", refdb_timeout); if (write(fd_fifo, outbuffer, strlen(outbuffer) + 1) == -1) { LOG_PRINT(LOG_WARNING, get_status_msg(840)); send_status(ptr_clrequest->fd, 840, TERM_NO); ptr_addresult->failure++; return 1; } else { sprintf(outbuffer, "710:%d", n_refdb_timeout); LOG_PRINT(LOG_INFO, outbuffer); sprintf(&(ptr_addresult->msg[strlen(ptr_addresult->msg)]), "710:%d\n", n_refdb_timeout); ptr_addresult->success++; } } else if (strcmp(ptr_clrequest->inargv[*(ptr_clrequest->ptr_optind)], "logfile") == 0) { strcpy(log_file, ptr_clrequest->inargv[*(ptr_clrequest->ptr_optind)+1]); sprintf(outbuffer, "2logfile %s", log_file); if (write(fd_fifo, outbuffer, strlen(outbuffer) + 1) == -1) { LOG_PRINT(LOG_WARNING, get_status_msg(840)); send_status(ptr_clrequest->fd, 840, TERM_NO); ptr_addresult->failure++; return 1; } else { sprintf(outbuffer, "711:%s", log_file); LOG_PRINT(LOG_INFO, outbuffer); sprintf(&(ptr_addresult->msg[strlen(ptr_addresult->msg)]), "711:%s\n", log_file); ptr_addresult->success++; } } else if (strcmp(ptr_clrequest->inargv[*(ptr_clrequest->ptr_optind)], "logdest") == 0) { strcpy(log_dest, ptr_clrequest->inargv[*(ptr_clrequest->ptr_optind)+1]); n_log_dest = atoi(log_dest); sprintf(outbuffer, "2logdest %s", log_dest); if (write(fd_fifo, outbuffer, strlen(outbuffer) + 1) == -1) { LOG_PRINT(LOG_WARNING, get_status_msg(840)); send_status(ptr_clrequest->fd, 840, TERM_NO); ptr_addresult->failure++; return 1; } else { sprintf(outbuffer, "712:%d", n_log_dest); LOG_PRINT(LOG_INFO, outbuffer); sprintf(&(ptr_addresult->msg[strlen(ptr_addresult->msg)]), "712:%d\n", n_log_dest); ptr_addresult->success++; } } else if (strcmp(ptr_clrequest->inargv[*(ptr_clrequest->ptr_optind)], "loglevel") == 0) { strcpy(log_level, ptr_clrequest->inargv[*(ptr_clrequest->ptr_optind)+1]); n_log_level = atoi(log_level); sprintf(outbuffer, "2loglevel %s", log_level); if (write(fd_fifo, outbuffer, strlen(outbuffer) + 1) == -1) { LOG_PRINT(LOG_WARNING, get_status_msg(840)); send_status(ptr_clrequest->fd, 840, TERM_NO); ptr_addresult->failure++; return 1; } else { sprintf(outbuffer, "713:%d", n_log_level); LOG_PRINT(LOG_INFO, outbuffer); sprintf(&(ptr_addresult->msg[strlen(ptr_addresult->msg)]), "713:%d\n", n_log_level); ptr_addresult->success++; } } else { LOG_PRINT(LOG_WARNING, get_status_msg(301)); send_status(ptr_clrequest->fd, 301, TERM_NO); ptr_addresult->failure++; return 1; } } close(fd_fifo); /* send report to client */ send_status(ptr_clrequest->fd, 0, TERM_NO); tiwrite(ptr_clrequest->fd, ptr_addresult->msg, TERM_YES); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ confserv(): configures the application server (parent process) void confserv char* command ptr to string with the command ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ void confserv(char *command, char* server_ip) { char outbuffer[OUTBUF_LEN]; /* the command buffer should have one or two entries: a command and an optional argument */ if (*command == '1') { /* one argument */ if (strncmp(command + 1, "stop", 4) == 0) { run = 0; LOG_PRINT(LOG_INFO, "application server stopped"); } } else { /* more than one argument, use first two */ if (strncmp(command + 1, "serverip", 8) == 0) { strcpy(server_ip, command + 10); sprintf(outbuffer, "set serverip to %s", server_ip); LOG_PRINT(LOG_INFO, outbuffer); } else if (strncmp(command + 1, "timeout", 7) == 0) { strcpy(refdb_timeout, command + 9); n_refdb_timeout = atoi(refdb_timeout); sprintf(outbuffer, "set timeout to %d seconds", n_refdb_timeout); LOG_PRINT(LOG_INFO, outbuffer); } else if (strncmp(command + 1, "logfile", 7) == 0) { strcpy(log_file, command + 9); sprintf(outbuffer, "set logfile to %s", log_file); LOG_PRINT(LOG_INFO, outbuffer); n_reopen_log = 1; /* signal the log fn to open new log file */ } else if (strncmp(command + 1, "logdest", 7) == 0) { strcpy(log_dest, command + 9); n_log_dest = atoi(log_dest); sprintf(outbuffer, "set logdest to %d", n_log_dest); LOG_PRINT(LOG_INFO, outbuffer); } else if (strncmp(command + 1, "loglevel", 8) == 0) { strcpy(log_level, command + 10); n_log_level = atoi(log_level); sprintf(outbuffer, "set loglevel to %d", n_log_level); LOG_PRINT(LOG_INFO, outbuffer); } } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ connect_to_db(): establishes a connection with the SQL database server dbi_conn connect_to_db Returns connection ptr if successful, NULL if failed struct CLIENT_REQUEST* ptr_clrequest ptr to structure with connection info const char* special_db ptr to string containing the name of a special database to connect to if the latter is different from the one in ptr_clrequest int nocheck if 1, don't verify the database is a RefDB database ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ dbi_conn connect_to_db(struct CLIENT_REQUEST* ptr_clrequest, const char* special_db, int nocheck) { dbi_conn conn; char *my_db; LOG_PRINT(LOG_DEBUG, ptr_clrequest->server_ip); LOG_PRINT(LOG_DEBUG, ptr_clrequest->username); LOG_PRINT(LOG_DEBUG, ptr_clrequest->passwd); LOG_PRINT(LOG_DEBUG, ptr_clrequest->current_db); LOG_PRINT(LOG_DEBUG, ptr_clrequest->dbs_port_address); LOG_PRINT(LOG_DEBUG, ptr_clrequest->dbserver); LOG_PRINT(LOG_DEBUG, ptr_clrequest->db_path); LOG_PRINT(LOG_DEBUG, ptr_clrequest->db_encoding); conn = my_dbi_conn_new(ptr_clrequest->dbserver, ptr_clrequest->inst); if (!conn) { LOG_PRINT(LOG_WARNING, "creating database connection structure failed"); LOG_PRINT(LOG_WARNING, "check your libdbi installation"); return NULL; } my_db = (special_db && *special_db) ? (char*)special_db : ((*(ptr_clrequest->current_db)) ? ptr_clrequest->current_db : main_db); LOG_PRINT(LOG_DEBUG, my_db); /* common driver options */ dbi_conn_set_option(conn, "username", ptr_clrequest->username); dbi_conn_set_option(conn, "password", (ptr_clrequest->passwd && *(ptr_clrequest->passwd)) ? ptr_clrequest->passwd : ""); /* connect to refdb unless a specific reference database is requested special_db overrides ptr_clrequest->current_db */ dbi_conn_set_option(conn, "dbname", my_db); dbi_conn_set_option(conn, "encoding", "auto"); dbi_conn_set_option_numeric(conn, "port", atoi(ptr_clrequest->dbs_port_address)); /* driver-specific options */ if (!strcmp(ptr_clrequest->dbserver, "mysql")) { dbi_conn_set_option_numeric(conn, "compression", 1); dbi_conn_set_option(conn, "host", ptr_clrequest->server_ip); dbi_conn_set_option_numeric(conn, "mysql_include_trailing_null", 1); } else if (!strcmp(ptr_clrequest->dbserver, "pgsql")) { /* don't set host if we want to connect locally */ if (strcmp(ptr_clrequest->server_ip, "localhost")) { dbi_conn_set_option(conn, "host", ptr_clrequest->server_ip); } } else if (!strcmp(ptr_clrequest->dbserver, "sqlite")) { dbi_conn_set_option(conn, "sqlite_dbdir", ptr_clrequest->db_path); dbi_conn_set_option_numeric(conn, "sqlite_timeout", ptr_clrequest->db_timeout); } else if (!strcmp(ptr_clrequest->dbserver, "sqlite3")) { dbi_conn_set_option(conn, "sqlite3_dbdir", ptr_clrequest->db_path); dbi_conn_set_option(conn, "encoding", "UTF-8"); dbi_conn_set_option_numeric(conn, "sqlite3_timeout", ptr_clrequest->db_timeout); } if (dbi_conn_connect(conn) < 0) { /* -1 and -2 indicate errors */ const char* errmsg = NULL; LOG_PRINT(LOG_WARNING, "failed to connect to database server using database:"); LOG_PRINT(LOG_WARNING, my_db); dbi_conn_error(conn, &errmsg); if (errmsg) { LOG_PRINT(LOG_WARNING, errmsg); } dbi_conn_close(conn); return NULL; } if (!nocheck && strcmp(my_db, main_db) && !is_reference_database(NULL, conn, my_db)) { /* if ((!strcmp(force_dbcheck, "t") || !nocheck) && strcmp(my_db, MAIN_DB) && !is_reference_database(NULL, conn, my_db)) { */ LOG_PRINT(LOG_WARNING, "does not appear to be a RefDB reference database:"); LOG_PRINT(LOG_WARNING, my_db); dbi_conn_close(conn); return NULL; } /* register dbi error handler */ dbi_conn_error_handler(conn, log_dberror, NULL); LOG_PRINT(LOG_DEBUG, "connected to database server using database:"); LOG_PRINT(LOG_DEBUG, my_db); return conn; } void log_dberror(dbi_conn conn, void *user_argument) { const char *msg; dbi_conn_error(conn, &msg); LOG_PRINT(LOG_DEBUG, msg); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ viewstat(): executes client command viewstat int viewstat returns 0 if ok, 1 if memory error, 2 if other error struct CLIENT_REQUEST* ptr_clrequest ptr to structure with client info ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int viewstat(struct CLIENT_REQUEST* ptr_clrequest) { dbi_conn conn; /* libdbi connection structure */ dbi_driver driver; /* libdbi driver structure */ dbi_result dbires; /* libdbi result structure */ char* outbuffer; /* ptr to a buffer for output */ short int dbversioninfo = 0; char sql_command[64]; char db_version[VERSIONSTRING_LENGTH]; /* get a buffer to hold output data */ if ((outbuffer = malloc((size_t)OUTBUF_LEN)) == NULL) { /* out of memory */ LOG_PRINT(LOG_CRIT, get_status_msg(801)); send_status(ptr_clrequest->fd, 801, TERM_NO); return 1; } /* connect to the database */ if ((conn = connect_to_db(ptr_clrequest, NULL, 0)) != NULL) { driver = dbi_conn_get_driver(conn); sprintf(sql_command, "SELECT meta_dbversion FROM t_meta WHERE meta_type='refdb'"); dbires = dbi_conn_query(conn, sql_command); LOG_PRINT(LOG_DEBUG, sql_command); if (dbires) { if (dbi_result_next_row(dbires)) { dbversioninfo = dbi_result_get_short_idx(dbires, 1); /* 1-base index */ } dbi_result_free(dbires); } else { /* could not retrieve reference database metadata */ LOG_PRINT(LOG_ERR, get_status_msg(208)); send_status(ptr_clrequest->fd, 208, TERM_NO); free(outbuffer); return 2; } /* obtain database server version info */ dbi_conn_get_engine_version_string(conn, db_version); sprintf(outbuffer, "You are served by: %s %s\nSVN revision: %s\nClient IP: %s\nConnected via %s driver (%s)\nto: %s\ndb version: %d\nserverip: %s\ntimeout: %s\ndbs_port: %s\nlogfile: %s\nlogdest: %s\nloglevel: %s\nremoteadmin: %s\npidfile: %s\n", PACKAGE, VERSION, svn_version(), ptr_clrequest->client_ip, dbi_driver_get_name(driver), dbi_driver_get_version(driver), db_version, dbversioninfo, ptr_clrequest->server_ip, refdb_timeout, ptr_clrequest->dbs_port_address, log_file, log_dest, log_level, (n_remote_admin) ? "on" : "off", pid_file); /* all fine */ send_status(ptr_clrequest->fd, 0, TERM_NO); tiwrite(ptr_clrequest->fd, outbuffer, TERM_YES); dbi_conn_close(conn); } else { /* access denied to reference database */ LOG_PRINT(LOG_WARNING, get_status_msg(204)); send_status(ptr_clrequest->fd, 204, TERM_NO); free(outbuffer); return 2; } free(outbuffer); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ listdb(): implements the client commands listdb and selectdb int listdb returns 0 if ok, 1 if error struct CLIENT_REQUEST* ptr_clrequest ptr to structure with client info int select if 1, answers selectdb command, if 0, answers listdb command ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int listdb(struct CLIENT_REQUEST* ptr_clrequest, int select, struct ADDRESULT* ptr_addresult) { char* new_msg; const char* dbname; char message[128]; dbi_conn conn; dbi_result dbires; /* connect to the database */ if ((conn = connect_to_db(ptr_clrequest, NULL, 0)) != NULL) { if (*(ptr_clrequest->argument)) { /* this will list the databases that match the provided pattern */ dbires = dbi_conn_get_db_list(conn, ptr_clrequest->argument); } else { /* this will list all databases */ dbires = dbi_conn_get_db_list(conn, NULL); } if (select) { /* selectdb */ if (dbi_result_next_row(dbires)) { /* this is just to prevent problems if the SQL server allows longer database names than we expect */ dbname = dbi_result_get_string_idx(dbires, 1); /* 1-based index */ if (dbname) { if (is_reference_database(ptr_clrequest, NULL, dbname)) { snprintf(message, 128, "240:%s\n", dbname); if ((new_msg = mstrcat(ptr_addresult->msg, message, &(ptr_addresult->msg_len), 0)) == NULL) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_INFO, get_status_msg(801)); dbi_result_free(dbires); dbi_conn_close(conn); return 1; } else { ptr_addresult->msg = new_msg; } } else { /* is not a reference database */ send_status(ptr_clrequest->fd, 225, TERM_NO); LOG_PRINT(LOG_INFO, get_status_msg(225)); dbi_result_free(dbires); dbi_conn_close(conn); return 1; } } else { /* database does not exist */ send_status(ptr_clrequest->fd, 226, TERM_NO); LOG_PRINT(LOG_INFO, get_status_msg(226)); dbi_result_free(dbires); dbi_conn_close(conn); return 1; } } else { /* database does not exist */ send_status(ptr_clrequest->fd, 226, TERM_NO); LOG_PRINT(LOG_INFO, get_status_msg(226)); dbi_result_free(dbires); dbi_conn_close(conn); return 1; } } else { /* listdb */ while (dbi_result_next_row(dbires)) { dbname = dbi_result_get_string_idx(dbires, 1); if (dbname) { if (is_reference_database(ptr_clrequest, NULL, dbname)) { snprintf(message, 128, "%s\n", dbname); if ((new_msg = mstrcat(ptr_addresult->msg, message, &(ptr_addresult->msg_len), 0)) == NULL) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_INFO, get_status_msg(801)); dbi_result_free(dbires); dbi_conn_close(conn); return 1; } else { ptr_addresult->msg = new_msg; } ptr_addresult->success++; } } } } dbi_result_free(dbires); dbi_conn_close(conn); send_status(ptr_clrequest->fd, 0, TERM_NO); tiwrite(ptr_clrequest->fd, ptr_addresult->msg, TERM_YES); } else { LOG_PRINT(LOG_WARNING, get_status_msg(202)); send_status(ptr_clrequest->fd, 202, TERM_NO); return 1; } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ is_reference_database(): checks whether a database is a RefDB reference database int is_reference_database returns 1 if the database is a RefDB database, 0 if not struct CLIENT_REQUEST* ptr_clrequest ptr to structure with client info set to NULL if using conn dbi_conn conn optional existing connection to database. Overrides ptr_clrequest. Set to NULL if not used const char* dbname ptr to a string containing the database name ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int is_reference_database(struct CLIENT_REQUEST* ptr_clrequest, dbi_conn conn, const char* dbname) { dbi_conn conn_ref; dbi_result dbires; char sql_command[128]; const char* app; const char* type; int retval = 0; int close_conn_ref = 0; short int dbversion; if (conn) { conn_ref = conn; /* legal as conn and conn_ref are pointers */ } else { if ((conn_ref = connect_to_db(ptr_clrequest, dbname, 1)) == NULL) { /* can't access */ return 0; } close_conn_ref++; } sprintf(sql_command, "SELECT meta_app,meta_type,meta_dbversion FROM t_meta WHERE meta_type='risx'"); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn_ref, sql_command); if (!dbires) { goto Finish; } if (!dbi_result_next_row(dbires)) { goto Finish; } app = dbi_result_get_string(dbires, "meta_app"); type = dbi_result_get_string(dbires, "meta_type"); dbversion = dbi_result_get_short(dbires, "meta_dbversion"); if (!strcmp(app, "refdb") && (!strcmp(type, "ris") || !strcmp(type, "risx")) && dbversion >= MIN_DB_VERSION) { retval = 1; } Finish: if (close_conn_ref) { dbi_conn_close(conn_ref); } return retval; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ listuser(): implements the client command listuser int listuser returns 0 if ok, >0 if error struct CLIENT_REQUEST* ptr_clrequest ptr to structure with client info struct ADDRESULT* ptr_addresult ptr to struct with counters ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int listuser(struct CLIENT_REQUEST* ptr_clrequest, struct ADDRESULT* ptr_addresult) { dbi_conn conn; dbi_result dbires; dbi_driver driver; char sql_command[256]; const char* username; char* myarg; char* new_msg; /* connect to the database */ if ((conn = connect_to_db(ptr_clrequest, ptr_clrequest->current_db, 0)) != NULL) { driver = dbi_conn_get_driver(conn); if (ptr_clrequest->argument && *(ptr_clrequest->argument)) { myarg = strdup(ptr_clrequest->argument); } else { myarg = strdup(my_dbi_driver_get_cap(driver, "listall")); /* list all if no argument is specified */ } if (!myarg) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); dbi_conn_close(conn); return 1; } /* escape any characters that the database server cannot digest */ if (dbi_conn_quote_string(conn, &myarg) == 0) { dbi_conn_close(conn); free(myarg); send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } snprintf(sql_command, 256, "SELECT DISTINCT user_name FROM t_user WHERE user_name %s %s", my_dbi_conn_get_cap(conn, "rlike"), myarg); dbires = dbi_conn_query(conn, sql_command); LOG_PRINT(LOG_DEBUG, sql_command); if (dbires) { while (dbi_result_next_row(dbires)) { username = dbi_result_get_string(dbires, "user_name"); if (username) { /* reuse sql_command */ sprintf(sql_command, "%s\n", username); if ((new_msg = mstrcat(ptr_addresult->msg, sql_command, &(ptr_addresult->msg_len), 0)) == NULL) { dbi_conn_close(conn); free(myarg); send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } else { ptr_addresult->msg = new_msg; } ptr_addresult->success++; } } dbi_result_free(dbires); } else { /* select failed */ dbi_conn_close(conn); free(myarg); send_status(ptr_clrequest->fd, 234, TERM_NO); LOG_PRINT(LOG_DEBUG, get_status_msg(234)); return 1; } dbi_conn_close(conn); free(myarg); /* send back result to client */ send_status(ptr_clrequest->fd, 0, TERM_NO); tiwrite(ptr_clrequest->fd, ptr_addresult->msg, TERM_YES); return 0; } else { send_status(ptr_clrequest->fd, 204, TERM_NO); LOG_PRINT(LOG_WARNING, get_status_msg(204)); return 1; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ listword(): implements the client command listword int listword returns 0 if ok, >0 if error struct CLIENT_REQUEST* ptr_clrequest ptr to structure with client info struct ADDRESULT* ptr_addresult ptr to struct with counters ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int listword(struct CLIENT_REQUEST* ptr_clrequest, struct ADDRESULT* ptr_addresult) { dbi_conn conn; dbi_result dbires; dbi_driver driver; char sql_command[512]; const char* wordname; char* myarg; /* connect to the database */ if ((conn = connect_to_db(ptr_clrequest, NULL, 0)) != NULL) { driver = dbi_conn_get_driver(conn); if (ptr_clrequest->argument && *(ptr_clrequest->argument)) { myarg = strdup(ptr_clrequest->argument); } else { myarg = strdup(my_dbi_driver_get_cap(driver, "listall")); /* list all if no argument is specified */ } if (!myarg) { dbi_conn_close(conn); send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } /* escape any characters that the database server cannot digest */ if (dbi_conn_quote_string(conn, &myarg) == 0) { dbi_conn_close(conn); free(myarg); send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } snprintf(sql_command, 512, "SELECT DISTINCT name FROM t_journal_words WHERE name %s %s", my_dbi_conn_get_cap(conn, "rlike"), myarg); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (dbires) { send_status(ptr_clrequest->fd, 0, TERM_NO); while (dbi_result_next_row(dbires)) { wordname = dbi_result_get_string(dbires, "name"); if (wordname) { tiwrite(ptr_clrequest->fd, wordname, TERM_NO); tiwrite(ptr_clrequest->fd, "\n", TERM_NO); ptr_addresult->success++; } else { ptr_addresult->failure++; } } dbi_result_free(dbires); /* terminate message */ tiwrite(ptr_clrequest->fd, "", TERM_YES); } else { /* select failed */ dbi_conn_close(conn); free(myarg); send_status(ptr_clrequest->fd, 234, TERM_NO); LOG_PRINT(LOG_DEBUG, get_status_msg(234)); return 1; } dbi_conn_close(conn); free(myarg); return 0; } else { send_status(ptr_clrequest->fd, 204, TERM_NO); LOG_PRINT(LOG_WARNING, get_status_msg(204)); return 1; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ createdb(): implements the client command createdb int createdb returns 2 if error, 0 if successful struct CLIENT_REQUEST* ptr_clrequest ptr to structure with client info const char* db_encoding name of the character encoding to use ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int createdb(struct CLIENT_REQUEST* ptr_clrequest, struct ADDRESULT* ptr_addresult, int optind) { int result; char* new_msg; char message[128]; /* loop over all filename arguments */ for (; optind < ptr_clrequest->inargc; optind++) { result = real_createdb(ptr_clrequest, ptr_clrequest->inargv[optind], ptr_addresult); if (result == 1) { ptr_addresult->failure++; /* message is already in place */ send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } else if (result) { ptr_addresult->failure++; /* message is already in place */ } else { ptr_addresult->success++; snprintf(message, 128, "235:%s\n", ptr_clrequest->inargv[optind]); if ((new_msg = mstrcat(ptr_addresult->msg, message, &(ptr_addresult->msg_len), 0)) == NULL) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } else { ptr_addresult->msg = new_msg; } } } send_status(ptr_clrequest->fd, 0, TERM_NO); tiwrite(ptr_clrequest->fd, ptr_addresult->msg, TERM_YES); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ real_createdb(): creates a database int real_createdb returns 1 if mem error, 2 if other error, 0 if successful struct CLIENT_REQUEST* ptr_clrequest ptr to structure with client info const char* dbname ptr to string with the database name ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int real_createdb(struct CLIENT_REQUEST* ptr_clrequest, const char* dbname, struct ADDRESULT* ptr_addresult) { dbi_conn conn = NULL; dbi_result dbires; int error; int retval = 0; char date_buffer[24]; char message[128] = ""; char *sql_command = NULL; char *new_msg; const char *drivername; time_t the_time; /* it is not necessary to quote database names */ /* connect to the main database */ if ((conn = connect_to_db(ptr_clrequest, main_db, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(202)); snprintf(message, 128, "202:%s\n", dbname); retval = 2; goto finish; } drivername = dbi_driver_get_name(dbi_conn_get_driver(conn)); /* allocate a buffer to assemble the sql command (give some extra byte for the command and encoding strings */ sql_command = malloc((size_t)(strlen(dbname) + 256)); if (sql_command == NULL) { /* malloc failed */ LOG_PRINT(LOG_CRIT, get_status_msg(801)); snprintf(message, 128, "801:%s\n", dbname); retval = 1; goto finish; } /* create a new database. There is no such SQL command for sqlite. sqlite will create the database for us as soon as we try to access it */ if (strcmp(drivername, "sqlite") && strcmp(drivername, "sqlite3")) { const char* encoding_string; encoding_string = my_dbi_conn_get_cap(conn, "encoding"); /* assemble sql command */ if (*encoding_string) { if (ptr_clrequest->db_encoding && *(ptr_clrequest->db_encoding)) { sprintf(sql_command, "CREATE DATABASE %s %s '%s'", dbname, encoding_string, dbi_driver_encoding_from_iana(dbi_conn_get_driver(conn), ptr_clrequest->db_encoding)); } else { /* use default encoding of db server */ sprintf(sql_command, "CREATE DATABASE %s", dbname); } } else { if (ptr_clrequest->db_encoding && *(ptr_clrequest->db_encoding)) { LOG_PRINT(LOG_WARNING, "database engine does not support per-database character encodings, used default encoding instead"); } /* db engine does not support database-based encodings */ sprintf(sql_command, "CREATE DATABASE %s", dbname); } LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (dbires == NULL) { LOG_PRINT(LOG_ERR, get_status_msg(209)); snprintf(message, 128, "209:%s\n", dbname); retval = 2; goto finish; } dbi_result_free(dbires); } else if (ptr_clrequest->db_encoding && *(ptr_clrequest->db_encoding)) { /* if sqlite */ LOG_PRINT(LOG_WARNING, "database engine does not support per-database character encodings, used default encoding instead"); } /* end if not sqlite */ /* now we have to create the tables */ if (!strcmp(my_dbi_conn_get_cap(conn, "multiple_db"), "t")) { /* we switch over to the new database */ error = dbi_conn_select_db(conn, dbname); if (error) { LOG_PRINT(LOG_WARNING, get_status_msg(204)); snprintf(message, 128, "204:%s\n", dbname); retval = 2; goto finish; } /* if (!strcmp(drivername, "mysql")) { */ if ((error = create_tables_mysql(conn, ptr_clrequest, 0)) != 0) { /* function provides log message */ snprintf(message, 128, "%d:%s\n", error, dbname); retval = 2; goto finish; } } else { /* we need a new connection to the fresh database */ dbi_conn_close(conn); /* do not check the database as it is brand new */ if ((conn = connect_to_db(ptr_clrequest, dbname, 1)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(204)); snprintf(message, 128, "204:%s\n", dbname); retval = 2; goto finish; } if (!strcmp(drivername, "pgsql")) { if ((error = create_tables_pgsql(conn, ptr_clrequest, 0)) != 0) { /* function provides log message */ snprintf(message, 128, "%d:%s\n", error, dbname); retval = 2; goto finish; } } else if (!strcmp(drivername, "sqlite")) { if ((error = create_tables_sqlite(conn, ptr_clrequest, 0)) != 0) { /* function provides log message */ snprintf(message, 128, "%d:%s\n", error, dbname); retval = 2; goto finish; } } else if (!strcmp(drivername, "sqlite3")) { if ((error = create_tables_sqlite3(conn, ptr_clrequest, 0)) != 0) { /* function provides log message */ snprintf(message, 128, "%d:%s\n", error, dbname); retval = 2; goto finish; } } /* else: should never happen */ } /* insert the meta data */ time(&the_time); strftime(date_buffer, 24, "%Y-%m-%d %H:%M:%S", gmtime(&the_time)); sprintf(sql_command, "INSERT INTO t_meta (meta_app,meta_type,meta_version,meta_dbversion,meta_create_date,meta_modify_date) VALUES (\'%s\', \'risx\', \'%s\', \'%d\', \'%s\', \'%s\')", PACKAGE, VERSION, DB_VERSION, date_buffer, date_buffer); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { LOG_PRINT(LOG_ERR, get_status_msg(210)); snprintf(message, 128, "210:%s\n", dbname); retval = 2; goto finish; } dbi_result_free(dbires); finish: if (*message) { if ((new_msg = mstrcat(ptr_addresult->msg, message, &(ptr_addresult->msg_len), 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); retval = 1; } else { ptr_addresult->msg = new_msg; } } /* cleanup */ dbi_conn_close(conn); free(sql_command); return retval; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ deletedb(): implements the client command deletedb int deletedb returns 0 if failed, 1 if successful struct CLIENT_REQUEST* ptr_clrequest ptr to structure with client info int optind index for inargv struct ADDRESULT* ptr_addresult ptr to struct with counters ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int deletedb(struct CLIENT_REQUEST* ptr_clrequest, int optind, struct ADDRESULT* ptr_addresult) { dbi_conn conn; dbi_result dbires; int error; char* sql_command; char* dbname; char* new_msg; const char* drivername; /* it is not necessary to quote the database name */ /* allocate a buffer to assemble the sql command. We require _POSIX_PATH_MAX for the sqlite driver, but this will be more than enough for database names of other drivers */ sql_command = malloc((size_t)_POSIX_PATH_MAX); if (sql_command == NULL) { /* malloc failed */ send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } /* connect to main database */ if ((conn = connect_to_db(ptr_clrequest, NULL, 0)) == NULL) { send_status(ptr_clrequest->fd, 202, TERM_NO); LOG_PRINT(LOG_WARNING, get_status_msg(202)); return 1; } drivername = dbi_driver_get_name(dbi_conn_get_driver(conn)); for (; optind < ptr_clrequest->inargc; optind++) { dbname = ptr_clrequest->inargv[optind]; error = 0; if (!strcmp(drivername, "sqlite") || !strcmp(drivername, "sqlite3")) { /* sqlite has no SQL way to drop databases. Try to remove the database file from the file system manually */ strcpy(sql_command, ptr_clrequest->db_path); if (sql_command[strlen(sql_command)-1] != '/') { strcat(sql_command, "/"); } strcat(sql_command, dbname); if (unlink(sql_command)) { /* todo: ERRNO contains reason of failure */ sprintf(sql_command, "249:%s\n", dbname); if ((new_msg = mstrcat(ptr_addresult->msg, sql_command, &(ptr_addresult->msg_len), 0)) == NULL) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(sql_command); return 1; } else { ptr_addresult->msg = new_msg; } error++; } } else { /* other databases */ /* assemble sql command */ strcpy(sql_command, "DROP DATABASE "); strcat(sql_command, dbname); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); /* Postgres does not set numrows_affected for DROP statements so we can't check easily whether the database was dropped */ if (!dbires || (strcmp(drivername, "pgsql") && !dbi_result_get_numrows_affected(dbires))) { sprintf(sql_command, "249:%s\n", dbname); if ((new_msg = mstrcat(ptr_addresult->msg, sql_command, &(ptr_addresult->msg_len), 0)) == NULL) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(sql_command); return 1; } else { ptr_addresult->msg = new_msg; } error++; } else { dbi_result_free(dbires); } if (!strcmp(drivername, "pgsql")) { /* With PostgreSQL we keep a group to manage access rights for each database. When dropping the database we drop the group too. This does not affect the existence of the users contained in this group */ if (is_group_pgsql(conn, dbname, 0 /* read/write */) == 1) { sprintf(sql_command, "DROP GROUP %suser", ptr_clrequest->argument); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires /*dbi_conn_error_flag(conn)*/) { sprintf(sql_command, "250:%s\n", dbname); if ((new_msg = mstrcat(ptr_addresult->msg, sql_command, &(ptr_addresult->msg_len), 0)) == NULL) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(sql_command); return 1; } else { ptr_addresult->msg = new_msg; } } else { dbi_result_free(dbires); } } if (is_group_pgsql(conn, dbname, 1 /* read-only */) == 1) { sprintf(sql_command, "DROP GROUP %sruser", ptr_clrequest->argument); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires /*dbi_conn_error_flag(conn)*/) { sprintf(sql_command, "250:%s\n", dbname); if ((new_msg = mstrcat(ptr_addresult->msg, sql_command, &(ptr_addresult->msg_len), 0)) == NULL) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(sql_command); return 1; } else { ptr_addresult->msg = new_msg; } } else { dbi_result_free(dbires); } } } /* end if pgsql */ } /* end if other databases */ if (error) { ptr_addresult->failure++; } else { sprintf(sql_command, "251:%s\n", dbname); if ((new_msg = mstrcat(ptr_addresult->msg, sql_command, &(ptr_addresult->msg_len), 0)) == NULL) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(sql_command); return 1; } else { ptr_addresult->msg = new_msg; } ptr_addresult->success++; } } /* end for */ dbi_conn_close(conn); send_status(ptr_clrequest->fd, 0, TERM_NO); tiwrite(ptr_clrequest->fd, ptr_addresult->msg, TERM_YES); free(sql_command); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ adduser(): implements the client command adduser int adduser returns 1 if mem error, 2 if other error, 0 if successful struct CLIENT_REQUEST* ptr_clrequest ptr to structure with client info char *user_host string containing the name of the host from which username will access the database. This is actually the host on which the refdbd runs that username will use to access the database. if user_host is NULL, it will be set to localhost char *newuser_passwd string with the password for new users int n_remove if 0, access will be granted. if 1, access will be revoked int n_readonly if 0, user will have read/write access. If 1, user will have read-only access struct ADDRESULT* ptr_addresult ptr to structure receiving the result ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int adduser(struct CLIENT_REQUEST* ptr_clrequest, char *user_host, char *newuser_passwd, int n_remove, int n_readonly, struct ADDRESULT* ptr_addresult) { dbi_conn conn; dbi_result dbires; int nread_done = 0; int inbuffer_len; int numbyte; int nhave_refdb; int n_host_regex = 0; int n_user_regex = 0; int n_client_status; size_t token_size; char *sql_command; char *inbuffer; char *new_inbuffer; char *token; char *userathost; char *new_msg; const char *item; const char *drivername; char localhost[] = "localhost"; char message[128] = ""; struct lilimem sentinel; sentinel.ptr_mem = NULL; sentinel.ptr_next = NULL; sentinel.varname[0] = '\0'; sql_command = malloc(1024); if (sql_command == NULL || insert_lilimem(&sentinel, (void**)&sql_command, NULL)) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } inbuffer_len = (size_t)COMMAND_INBUF_LEN; inbuffer = malloc(inbuffer_len); if (inbuffer == NULL || insert_lilimem(&sentinel, (void**)&inbuffer, NULL)) { delete_all_lilimem(&sentinel); send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } /* connect to the main database */ if ((conn = connect_to_db(ptr_clrequest, NULL, 0)) != NULL) { /* see what driver we use */ drivername = dbi_driver_get_name(dbi_conn_get_driver(conn)); if (!strcmp(drivername, "sqlite") || !strcmp(drivername, "sqlite3")) { /* driver does not support SQL-based access control */ send_status(ptr_clrequest->fd, 224, TERM_NO); LOG_PRINT(LOG_WARNING, "999:access control not supported"); dbi_conn_close(conn); delete_all_lilimem(&sentinel); return 1; } /* send back confirmation to the client */ send_status(ptr_clrequest->fd, 0, TERM_NO); /* read from client and increase buffer size until we have all arguments */ if ((n_client_status = read_status(ptr_clrequest->fd))) { delete_all_lilimem(&sentinel); LOG_PRINT(LOG_WARNING, get_status_msg(n_client_status)); return 1; } while (!nread_done) { numbyte = tread(ptr_clrequest->fd, inbuffer, COMMAND_INBUF_LEN-1); if (get_trailz(inbuffer, numbyte) == TERM_LEN) { /* if transmission complete */ nread_done = 1; } else { inbuffer_len += (size_t)COMMAND_INBUF_LEN; if ((new_inbuffer = (char*)realloc(inbuffer, inbuffer_len)) == NULL) { delete_all_lilimem(&sentinel); send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); dbi_conn_close(conn); return 0; } else { inbuffer = new_inbuffer; } } } /* +++++++++++++++++++++++++++++++++++++++++++++++++++++ */ /* mysql */ /* mysqld keeps authentication information in the mysql database. These data are used for all user databases. Therefore we need only one entry to allow access to the database server, and entries per database to allow access to the databases themselves */ if (!strcmp(drivername, "mysql")) { int create_new = 0; char lockstring[64]; struct VERSIONINFO ver; /* obtain database server version info */ if (my_dbi_conn_get_versioninfo(conn, &ver)) { send_status(ptr_clrequest->fd, 205, TERM_NO); LOG_PRINT(LOG_ERR, get_status_msg(205)); dbi_conn_close(conn); delete_all_lilimem(&sentinel); return 1; } /* MySQL 4.0.2 introduced new privileges "LOCK TABLES" and "CREATE TEMPORARY TABLES". As older versions will barf at it, add them only if we use a newer version */ if (!n_readonly && ((ver.major == 4 && ver.minor == 0 && ver.minuscule >=2) || (ver.major == 4 && ver.minor > 0) || ver.major > 4)) { strcpy(lockstring, ",LOCK TABLES, CREATE TEMPORARY TABLES"); } else if (n_readonly && ((ver.major == 4 && ver.minor == 0 && ver.minuscule >=2) || (ver.major == 4 && ver.minor > 0) || ver.major > 4)){ strcpy(lockstring, ",LOCK TABLES "); } else { strcpy(lockstring, " "); } /* use localhost if no host was specified */ if (!*user_host) { strcat(ptr_addresult->msg, "236\n"); LOG_PRINT(LOG_INFO, get_status_msg(236)); user_host = localhost; } /* select mysql database */ if (dbi_conn_select_db(conn, "mysql") == -1) { send_status(ptr_clrequest->fd, 205, TERM_NO); LOG_PRINT(LOG_ERR, get_status_msg(205)); dbi_conn_close(conn); delete_all_lilimem(&sentinel); return 1; } /* see whether the host info is a SQL regexp */ if (strchr(user_host, (int)'%') || strchr(user_host, (int)'_')) { n_host_regex = 1; } else { n_host_regex = 0; } token = inbuffer; token_size = -1; userathost = malloc(USERNAME_LENGTH + HOSTNAME_LENGTH + 16); if (userathost == NULL || insert_lilimem(&sentinel, (void**)&userathost, NULL)) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } do { token = nstrtok(token + token_size + 1, &token_size, " "); if (token != NULL) { token[token_size] = '\0'; /* see whether the user info is a SQL regexp */ if (strchr(token, (int)'%') || strchr(token, (int)'_')) { n_user_regex = 1; } else { n_user_regex = 0; } if (n_remove) { if (n_user_regex || n_host_regex) { sprintf(sql_command, "REVOKE ALL ON %s.* FROM \'%s\'@\'%s\'", ptr_clrequest->current_db, token, user_host); } else { sprintf(sql_command, "REVOKE ALL ON %s.* FROM %s@%s", ptr_clrequest->current_db, token, user_host); } } else { /* check whether the given user/host combo exists in User table */ sprintf(sql_command, "SELECT User FROM user WHERE User LIKE \'%s\' AND Host LIKE \'%s\'", token, user_host); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { ptr_addresult->failure++; LOG_PRINT(LOG_WARNING, get_status_msg(234)); snprintf(message, 128, "234:%s@%s:%s\n", token, user_host, ptr_clrequest->current_db); if ((new_msg = mstrcat(ptr_addresult->msg, message, &(ptr_addresult->msg_len), 0)) == NULL) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } else { ptr_addresult->msg = new_msg; } continue; } if (!dbi_result_get_numrows(dbires) && !n_user_regex) { /* user does not exist yet and does not contain regexp */ create_new++; } dbi_result_free(dbires); /* check whether this host/user combo has access rights to refdb. If not, create as well */ /* reset variables */ nhave_refdb = 0; sprintf(sql_command, "SELECT User,Db FROM db WHERE User=\'%s\' AND Host=\'%s\' AND Db=\'%s\'", token, user_host, main_db); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { ptr_addresult->failure++; LOG_PRINT(LOG_WARNING, get_status_msg(234)); snprintf(message, 128, "234:%s@%s:%s\n", token, user_host, ptr_clrequest->current_db); if ((new_msg = mstrcat(ptr_addresult->msg, message, &(ptr_addresult->msg_len), 0)) == NULL) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } else { ptr_addresult->msg = new_msg; } continue; } while (dbi_result_next_row(dbires)) { item = dbi_result_get_string_idx(dbires, 2); if (!strcmp(item, main_db)) { nhave_refdb = 1; } } dbi_result_free(dbires); if (n_user_regex || n_host_regex) { sprintf(userathost, "\'%s\'@\'%s\'", token, user_host); } else { sprintf(userathost, "%s@%s", token, user_host); } if (!nhave_refdb || (newuser_passwd && *newuser_passwd)) { /* user does not have access rights to refdb */ if (newuser_passwd && *newuser_passwd) { /* if the user doesn't exist yet, this command will create a new user with the given password. If the user already exists, the password will be changed to the one given */ if (!n_readonly) { sprintf(sql_command, "GRANT SELECT, INSERT, UPDATE, DELETE%s ON %s.* TO %s IDENTIFIED BY \'%s\'", lockstring, main_db, userathost, newuser_passwd); } else { sprintf(sql_command, "GRANT SELECT%s ON %s.* TO %s IDENTIFIED BY \'%s\'", lockstring, main_db, userathost, newuser_passwd); } } else if (create_new) { /* avoid possible security risk: we provide a default password to avoid creating users with no passwords */ if (!n_readonly) { sprintf(sql_command, "GRANT SELECT, INSERT, UPDATE, DELETE%s ON %s.* TO %s IDENTIFIED BY \'refdb\'", lockstring, main_db, userathost); } else { sprintf(sql_command, "GRANT SELECT%s ON %s.* TO %s IDENTIFIED BY \'refdb\'", lockstring, main_db, userathost); } } else { /* the user already exists and we don't touch the password */ if (!n_readonly) { sprintf(sql_command, "GRANT SELECT, INSERT, UPDATE, DELETE%s ON %s.* TO %s", lockstring, main_db, userathost); } else { sprintf(sql_command, "GRANT SELECT%s ON %s.* TO %s", lockstring, main_db, userathost); } } LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { ptr_addresult->failure++; LOG_PRINT(LOG_WARNING, get_status_msg(223)); snprintf(message, 128, "223:%s@%s:%s\n", token, user_host, ptr_clrequest->current_db); if ((new_msg = mstrcat(ptr_addresult->msg, message, &(ptr_addresult->msg_len), 0)) == NULL) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } else { ptr_addresult->msg = new_msg; } continue; } dbi_result_free(dbires); } /* now handle the requested database. Users need CREATE and DROP privileges for temp tables during bibliography creation*/ if (n_user_regex || n_host_regex) { if (!n_readonly) { sprintf(sql_command, "GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP%s ON %s.* TO \'%s\'@\'%s\'", lockstring, ptr_clrequest->current_db, token, user_host); } else { sprintf(sql_command, "GRANT SELECT%s ON %s.* TO \'%s\'@\'%s\'", lockstring, ptr_clrequest->current_db, token, user_host); } } else { if (!n_readonly) { sprintf(sql_command, "GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP%s ON %s.* TO %s@%s", lockstring, ptr_clrequest->current_db, token, user_host); } else { sprintf(sql_command, "GRANT SELECT%s ON %s.* TO %s@%s", lockstring, ptr_clrequest->current_db, token, user_host); } } } LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { ptr_addresult->failure++; if (!n_remove) { LOG_PRINT(LOG_WARNING, get_status_msg(223)); snprintf(message, 128, "223:%s@%s:%s\n", token, user_host, ptr_clrequest->current_db); } else { LOG_PRINT(LOG_WARNING, get_status_msg(239)); snprintf(message, 128, "239:%s@%s:%s\n", token, user_host, ptr_clrequest->current_db); } } else { ptr_addresult->success++; dbi_result_free(dbires); if (!n_remove) { if (user_host && *user_host) { snprintf(message, 127, "237:%s@%s:%s", token, user_host, ptr_clrequest->current_db); } else { snprintf(message, 127, "237:%s:%s", token, ptr_clrequest->current_db); } LOG_PRINT(LOG_INFO, message); strcat(message, "\n"); } else { if (user_host && *user_host) { snprintf(message, 127, "238:%s@%s:%s", token, user_host, ptr_clrequest->current_db); } else { snprintf(message, 127, "238:%s:%s", token, ptr_clrequest->current_db); } LOG_PRINT(LOG_INFO, message); strcat(message, "\n"); } } if ((new_msg = mstrcat(ptr_addresult->msg, message, &(ptr_addresult->msg_len), 0)) == NULL) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } else { ptr_addresult->msg = new_msg; } } } while (token != NULL); /* reloading permission tables is not necessary when using the GRANT/REVOKE syntax. Thus quoth the manual, but seeing is believing */ strcpy(sql_command, "FLUSH PRIVILEGES"); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); } /* +++++++++++++++++++++++++++++++++++++++++++++++++++++ */ /* pgsql */ else if (!strcmp(drivername, "pgsql")) { /* PostgreSQL knows users and groups. Access is granted to tables (and other stuff we don't use here). The system tables that hold the user and group information are accessible through connections to any existing database (at least for the superuser, that is). Each new refdb database creates a read/write group and a read-only group and grants access for these groups. We simply add users to or remove them from these groups. Same for the groups refdbuser/refdbruser which allow access to the common database refdb */ token = inbuffer; token_size = -1; /* loop over all usernames */ /* ToDo: this loop is inefficient. Better construct a comma-separated list of users and pass this as an argument to a single ALTER GROUP command */ do { token = nstrtok(token + token_size + 1, &token_size, " "); if (token != NULL) { token[token_size] = '\0'; if (n_remove) { /* the current implementation removes only the group membership for the given database. Users will still have access to the refdb database. */ /* ToDo: maybe a client command switch can be used to force removal from group refdbuser */ if (!n_readonly) { sprintf(sql_command, "ALTER GROUP %suser DROP USER %s", ptr_clrequest->current_db, token); } else { sprintf(sql_command, "ALTER GROUP %sruser DROP USER %s", ptr_clrequest->current_db, token); } LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { ptr_addresult->failure++; LOG_PRINT(LOG_WARNING, get_status_msg(239)); snprintf(message, 128, "239:%s@%s:%s\n", token, user_host, ptr_clrequest->current_db); } else { ptr_addresult->success++; dbi_result_free(dbires); LOG_PRINT(LOG_WARNING, get_status_msg(238)); if (user_host && *user_host) { snprintf(message, 128, "238:%s@%s:%s\n", token, user_host, ptr_clrequest->current_db); } else { snprintf(message, 128, "238:%s:%s\n", token, ptr_clrequest->current_db); } } if ((new_msg = mstrcat(ptr_addresult->msg, message, &(ptr_addresult->msg_len), 0)) == NULL) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } else { ptr_addresult->msg = new_msg; } } else { /* add new user */ if (is_user_pgsql(conn, token) != 1) { sprintf(sql_command, "CREATE USER %s WITH PASSWORD \'%s\'", token, (*newuser_passwd) ? newuser_passwd : "refdb"); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { ptr_addresult->failure++; LOG_PRINT(LOG_WARNING, get_status_msg(223)); snprintf(message, 128, "223:%s@%s:%s\n", token, user_host, ptr_clrequest->current_db); if ((new_msg = mstrcat(ptr_addresult->msg, message, &(ptr_addresult->msg_len), 0)) == NULL) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } else { ptr_addresult->msg = new_msg; } continue; } dbi_result_free(dbires); } /* Add user to the group refdbuser */ /* Adding users that already are members will not cause an error. Checking membership would be extremely tedious as the user list is implemented as an array instead of using a separate table */ if (!n_readonly) { sprintf(sql_command, "ALTER GROUP %suser ADD USER %s", main_db, token); } else { sprintf(sql_command, "ALTER GROUP %sruser ADD USER %s", main_db, token); } LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { ptr_addresult->failure++; LOG_PRINT(LOG_WARNING, get_status_msg(223)); snprintf(message, 128, "223:%s@%s:%s\n", token, user_host, ptr_clrequest->current_db); if ((new_msg = mstrcat(ptr_addresult->msg, message, &(ptr_addresult->msg_len), 0)) == NULL) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } else { ptr_addresult->msg = new_msg; } continue; } dbi_result_free(dbires); /* now handle the requested database and add the user to the group user */ if (!n_readonly) { sprintf(sql_command, "ALTER GROUP %suser ADD USER %s", ptr_clrequest->current_db, token); } else { sprintf(sql_command, "ALTER GROUP %sruser ADD USER %s", ptr_clrequest->current_db, token); } LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { ptr_addresult->failure++; LOG_PRINT(LOG_WARNING, get_status_msg(239)); snprintf(message, 128, "239:%s@%s:%s\n", token, user_host, ptr_clrequest->current_db); } else { ptr_addresult->success++; dbi_result_free(dbires); if (user_host && *user_host) { snprintf(message, 127, "238:%s@%s:%s", token, user_host, ptr_clrequest->current_db); } else { snprintf(message, 127, "238:%s:%s", token, ptr_clrequest->current_db); } LOG_PRINT(LOG_INFO, message); strcat(message, "\n"); } if ((new_msg = mstrcat(ptr_addresult->msg, message, &(ptr_addresult->msg_len), 0)) == NULL) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } else { ptr_addresult->msg = new_msg; } } /* end if n_remove */ } /* end if token != NULL */ } while (token != NULL); /* end loop over all usernames */ } dbi_conn_close(conn); } else { send_status(ptr_clrequest->fd, 202, TERM_NO); LOG_PRINT(LOG_WARNING, get_status_msg(202)); return 1; } send_status(ptr_clrequest->fd, 0, TERM_NO); tiwrite(ptr_clrequest->fd, ptr_addresult->msg, TERM_YES); delete_all_lilimem(&sentinel); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ addword(): implements the client command addword int addword returns >0 if failed, 0 if successful struct CLIENT_REQUEST* ptr_clrequest ptr to structure with client info int n_remove if 0, access wil be granted. if 1, access will be revoked struct ADDRESULT* ptr_addresult ptr to struct with counters ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int addword(struct CLIENT_REQUEST* ptr_clrequest, int n_remove, struct ADDRESULT* ptr_addresult) { dbi_conn conn; dbi_result dbires; dbi_driver driver; int nread_done = 0; int inbuffer_len; size_t token_size; int numbyte; int n_client_status; char message[512]; char* new_msg; char* sql_command; char* inbuffer; char* new_inbuffer; char* token; char* mytoken; struct lilimem sentinel; sentinel.ptr_mem = NULL; sentinel.ptr_next = NULL; sentinel.varname[0] = '\0'; sql_command = malloc(1024); if (sql_command == NULL || insert_lilimem(&sentinel, (void**)&sql_command, NULL)) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } inbuffer_len = (size_t)COMMAND_INBUF_LEN; inbuffer = malloc(inbuffer_len); if (inbuffer == NULL || insert_lilimem(&sentinel, (void**)&inbuffer, NULL)) { delete_all_lilimem(&sentinel); send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } /* connect to the database */ if ((conn = connect_to_db(ptr_clrequest, NULL, 0)) != NULL) { send_status(ptr_clrequest->fd, 0, TERM_NO); /* read from client and increase buffer size until we have all arguments */ if ((n_client_status = read_status(ptr_clrequest->fd))) { delete_all_lilimem(&sentinel); LOG_PRINT(LOG_WARNING, get_status_msg(n_client_status)); return 1; } while (!nread_done) { numbyte = tread(ptr_clrequest->fd, inbuffer, COMMAND_INBUF_LEN-1); if (get_trailz(inbuffer, numbyte) >= TERM_LEN) { /* if transmission complete */ nread_done = 1; } else { inbuffer_len += (size_t)COMMAND_INBUF_LEN; if ((new_inbuffer = (char*)realloc(inbuffer, inbuffer_len)) == NULL) { delete_all_lilimem(&sentinel); dbi_conn_close(conn); send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } else { inbuffer = new_inbuffer; } } } /* end while(!nread_done) */ /* printf("%s\n", inbuffer); */ token = inbuffer; token_size = -1; do { token = nstrtok(token + token_size + 1, &token_size, " "); if (token != NULL) { token[token_size] = '\0'; /* make sure we have uppercase words only */ mytoken = strdup(token); if (!mytoken) { ptr_addresult->failure++; send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } strup(mytoken); driver = dbi_conn_get_driver(conn); /* escape any characters that the database server cannot digest */ if (dbi_conn_quote_string(conn, &mytoken) == 0) { free(mytoken); ptr_addresult->failure++; send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } if (n_remove) { sprintf(sql_command, "DELETE FROM t_journal_words WHERE name %s %s", my_dbi_conn_get_cap(conn, "rlike"), mytoken); } else { sprintf(sql_command, "INSERT INTO t_journal_words (name) VALUES (%s)", mytoken); } LOG_PRINT(LOG_DEBUG, sql_command); free(mytoken); dbires = dbi_conn_query(conn, sql_command); if (!dbires || !dbi_result_get_numrows_affected(dbires)) { if (n_remove) { sprintf(message, "420:%s\n", token); } else { sprintf(message, "414:%s\n", token); } if ((new_msg = mstrcat(ptr_addresult->msg, message, &(ptr_addresult->msg_len), 0)) == NULL) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } else { ptr_addresult->msg = new_msg; } ptr_addresult->failure++; } else { dbi_result_free(dbires); if (n_remove) { sprintf(message, "419:%s\n", token); } else { sprintf(message, "408:%s\n", token); } if ((new_msg = mstrcat(ptr_addresult->msg, message, &(ptr_addresult->msg_len), 0)) == NULL) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } else { ptr_addresult->msg = new_msg; } ptr_addresult->success++; } } } while (token != NULL); dbi_conn_close(conn); } else { /* send back error to the client */ send_status(ptr_clrequest->fd, 202, TERM_NO); LOG_PRINT(LOG_WARNING, get_status_msg(202)); delete_all_lilimem(&sentinel); return 1; } /* send back report to client */ send_status(ptr_clrequest->fd, 0, TERM_NO); tiwrite(ptr_clrequest->fd, ptr_addresult->msg, TERM_YES); delete_all_lilimem(&sentinel); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ getfoo(): implements the client commands getau, getkw, and getjo int getfoo returns 0 if ok, > 0 if error struct CLIENT_REQUEST* ptr_clrequest ptr to structure with client info int type the type of user command 0 = getau, 1 = getkw, 2 = getjo, 3 = getjf, 4 = getj1, 5 = getj2 6 = geted, 7 = getas, 8 = getax int all if 1, return all synonyms of a journal name query char* db_encoding output encoding struct ADDRESULT* ptr_addresult ptr to struct that receives counts char* format_string ptr to string containing formatting hints ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int getfoo(struct CLIENT_REQUEST* ptr_clrequest, int type, int all, char* db_encoding, struct ADDRESULT* ptr_addresult, char* format_string) { int n_sql_command_len; int rel_frequency; int n_leadingspaces; unsigned long long refcount; unsigned long long frequency; unsigned long long periodical_id; char buffer[512]; char limitstring[128] = ""; char *sql_command; char *myarg; char spaces[] = " "; /* ulonglong is 19 digits max */ char* leadingspace; const char *foostring; dbi_conn conn; dbi_result dbires; dbi_result dbires1; dbi_driver driver; /* connect to the database */ if ((conn = connect_to_db(ptr_clrequest, NULL, 0)) != NULL) { driver = dbi_conn_get_driver(conn); /* get reference count for later use */ refcount = get_reference_count(conn, NULL, 0 /* istemp */); if (ptr_clrequest->argument && *(ptr_clrequest->argument)) { myarg = malloc(strlen(ptr_clrequest->argument)+1); unescape_chars(myarg, ptr_clrequest->argument, strlen(ptr_clrequest->argument)); } else { myarg = strdup(my_dbi_driver_get_cap(driver, "listall")); /* list all if no argument is specified */ } if (!myarg) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); dbi_conn_close(conn); return 1; } /* escape any characters that the database server cannot digest */ if (dbi_conn_quote_string(conn, &myarg) == 0) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); dbi_conn_close(conn); free(myarg); return 1; } n_sql_command_len = 512+strlen(myarg); sql_command = malloc(n_sql_command_len); if (sql_command == NULL) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); dbi_conn_close(conn); free(myarg); return 1; } if (*(ptr_clrequest->limit)) { char *colon; colon = strchr(ptr_clrequest->limit, (int)':'); if (!colon) { snprintf(limitstring, 128, " LIMIT %s ", ptr_clrequest->limit); } else { *colon = '\0'; snprintf(limitstring, 128, " LIMIT %s OFFSET %s ", ptr_clrequest->limit, colon+1); } } /* assemble query */ if (type == GETAU) { sprintf(sql_command, "SELECT DISTINCT t_author.author_name, t_author.author_lastname, t_author.author_firstname, t_author.author_middlename, t_author.author_suffix, t_xauthor.xauthor_role, t_xauthor.author_id FROM t_author INNER JOIN t_xauthor ON t_author.author_id=t_xauthor.author_id WHERE t_xauthor.xauthor_type=%s AND t_author.author_name %s %s ORDER BY t_author.author_name%s", get_author_type_string(driver, 1), my_dbi_conn_get_cap(conn, "rlike"), myarg, limitstring); } else if (type == GETKW) { sprintf(sql_command, "SELECT DISTINCT keyword_name, keyword_id FROM t_keyword WHERE keyword_name %s %s ORDER BY keyword_name%s", my_dbi_conn_get_cap(conn, "rlike"), myarg, limitstring); } else if (type == GETJO) { sprintf(sql_command, "SELECT DISTINCT periodical_abbrev, periodical_id, periodical_name, periodical_custabbrev1, periodical_custabbrev2 FROM t_periodical WHERE periodical_abbrev %s %s ORDER BY periodical_abbrev,periodical_name,periodical_custabbrev1,periodical_custabbrev2%s", my_dbi_conn_get_cap(conn, "rlike"), myarg, limitstring); } else if (type == GETJF) { sprintf(sql_command, "SELECT DISTINCT periodical_name, periodical_id, periodical_abbrev, periodical_custabbrev1, periodical_custabbrev2 FROM t_periodical WHERE periodical_name %s %s ORDER BY periodical_abbrev,periodical_name,periodical_custabbrev1,periodical_custabbrev2%s", my_dbi_conn_get_cap(conn, "rlike"), myarg, limitstring); } else if (type == GETJ1) { sprintf(sql_command, "SELECT DISTINCT periodical_custabbrev1, periodical_id, periodical_name, periodical_abbrev, periodical_custabbrev2 FROM t_periodical WHERE periodical_custabbrev1 %s %s ORDER BY periodical_abbrev,periodical_name,periodical_custabbrev1,periodical_custabbrev2%s", my_dbi_conn_get_cap(conn, "rlike"), myarg, limitstring); } else if (type == GETJ2) { sprintf(sql_command, "SELECT DISTINCT periodical_custabbrev2, periodical_id, periodical_name, periodical_abbrev, periodical_custabbrev1 FROM t_periodical WHERE periodical_custabbrev2 %s %s ORDER BY periodical_abbrev,periodical_name,periodical_custabbrev1,periodical_custabbrev2%s", my_dbi_conn_get_cap(conn, "rlike"), myarg, limitstring); } else if (type == GETED) { sprintf(sql_command, "SELECT DISTINCT t_author.author_name, t_author.author_lastname, t_author.author_firstname, t_author.author_middlename, t_author.author_suffix, t_xauthor.xauthor_role, t_xauthor.author_id FROM t_author, t_xauthor WHERE t_author.author_id=t_xauthor.author_id AND t_xauthor.xauthor_type=%s AND t_author.author_name %s %s ORDER BY t_author.author_name%s", get_author_type_string(driver, 2), my_dbi_conn_get_cap(conn, "rlike"), myarg, limitstring); } else if (type == GETAS) { sprintf(sql_command, "SELECT DISTINCT t_author.author_name, t_author.author_lastname, t_author.author_firstname, t_author.author_middlename, t_author.author_suffix, t_xauthor.xauthor_role, t_xauthor.author_id FROM t_author, t_xauthor WHERE t_author.author_id=t_xauthor.author_id AND t_xauthor.xauthor_type=%s AND t_author.author_name %s %s ORDER BY t_author.author_name%s", get_author_type_string(driver, 3), my_dbi_conn_get_cap(conn, "rlike"), myarg, limitstring); } else if (type == GETAX) { sprintf(sql_command, "SELECT DISTINCT t_author.author_name, t_author.author_lastname, t_author.author_firstname, t_author.author_middlename, t_author.author_suffix, t_xauthor.xauthor_role, t_xauthor.author_id FROM t_author, t_xauthor WHERE t_author.author_id=t_xauthor.author_id AND t_author.author_name %s %s ORDER BY t_author.author_name%s", my_dbi_conn_get_cap(conn, "rlike"), myarg, limitstring); } free(myarg); /* send query */ LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { send_status(ptr_clrequest->fd, 234, TERM_NO); LOG_PRINT(LOG_WARNING, get_status_msg(234)); dbi_conn_close(conn); free(sql_command); return 1; } free(sql_command); /* send results to client */ send_status(ptr_clrequest->fd, 0, TERM_NO); /* see whether frequency data were requested */ if (format_string && (!strcmp(format_string, "freq") || !strcmp(format_string, "relfreq"))) { if (type == GETAU || type == GETED || type == GETAS || type == GETAX) { while ((foostring = get_extended_author(dbires, 0 /* is_temp */, &frequency)) != NULL) { /* compute the leading space required to align the output */ n_leadingspaces = (refcount) ? (int)log10(refcount):0; leadingspace = spaces+19-n_leadingspaces+((frequency) ? (int)log10(frequency):0); ptr_addresult->success++; if (!strcmp(format_string,"relfreq")) { rel_frequency = calculate_relative_frequency(frequency, refcount); sprintf(buffer, "%d:%s\n", rel_frequency, foostring); } else { sprintf(buffer, "%s"ULLSPEC":%s\n", leadingspace, (unsigned long long)frequency, foostring); } tiwrite(ptr_clrequest->fd, buffer, TERM_NO); } } else if (type == GETKW) { while ((foostring = get_extended_keyword(dbires, 0 /* is_temp */, &frequency)) != NULL) { /* compute the leading space required to align the output */ n_leadingspaces = (refcount) ? (int)log10(refcount):0; leadingspace = spaces+19-n_leadingspaces+((frequency) ? (int)log10(frequency):0); ptr_addresult->success++; if (!strcmp(format_string,"relfreq")) { rel_frequency = calculate_relative_frequency(frequency, refcount); sprintf(buffer, "%d:%s\n", rel_frequency, foostring); } else { sprintf(buffer, "%s"ULLSPEC":%s\n", leadingspace, (unsigned long long)frequency, foostring); } tiwrite(ptr_clrequest->fd, buffer, TERM_NO); } } else /* if (type == GETJX) */ { while (dbi_result_next_row(dbires)) { ptr_addresult->success++; periodical_id = my_dbi_result_get_idval_idx(dbires, 2); sprintf(buffer, "SELECT count(*) FROM t_refdb WHERE t_refdb.refdb_periodical_id="ULLSPEC, (unsigned long long)periodical_id); LOG_PRINT(LOG_DEBUG, buffer); dbires1 = dbi_conn_query(dbi_result_get_conn(dbires), buffer); if (!dbires1) { continue; } if (dbi_result_next_row(dbires1)) { frequency = my_dbi_result_get_idval_idx(dbires1, 1); if (dbi_conn_error_flag(dbi_result_get_conn(dbires))) { dbi_result_free(dbires1); continue; } dbi_result_free(dbires1); } else { dbi_result_free(dbires1); frequency = 0; } /* compute the leading space required to align the output */ n_leadingspaces = (refcount) ? (int)log10(refcount):0; leadingspace = spaces+19-n_leadingspaces+((frequency) ? (int)log10(frequency):0); if (!all) { foostring = dbi_result_get_string_idx(dbires, 1); /* 1-base index */ if (foostring) { if (!strcmp(format_string,"relfreq")) { rel_frequency = calculate_relative_frequency(frequency, refcount); sprintf(buffer, "%d:%s\n", rel_frequency, foostring); } else { sprintf(buffer, "%s"ULLSPEC":%s\n", leadingspace, (unsigned long long)frequency, foostring); } tiwrite(ptr_clrequest->fd, buffer, TERM_NO); } } else { /* display all synonyms. If one is missing, we still print the colon to indicate which one is missing */ if (!strcmp(format_string,"relfreq")) { rel_frequency = calculate_relative_frequency(frequency, refcount); sprintf(buffer, "%d:\n", rel_frequency); } else { sprintf(buffer, ULLSPEC":\n", (unsigned long long)frequency); } tiwrite(ptr_clrequest->fd, buffer, TERM_NO); foostring = dbi_result_get_string_idx(dbires, 1); /* 1-base index */ if (foostring) { tiwrite(ptr_clrequest->fd, foostring, TERM_NO); } tiwrite(ptr_clrequest->fd, ":", TERM_NO); foostring = dbi_result_get_string_idx(dbires, 3); /* 1-base index */ if (foostring) { tiwrite(ptr_clrequest->fd, foostring, TERM_NO); } tiwrite(ptr_clrequest->fd, ":", TERM_NO); foostring = dbi_result_get_string_idx(dbires, 4); /* 1-base index */ if (foostring) { tiwrite(ptr_clrequest->fd, foostring, TERM_NO); } tiwrite(ptr_clrequest->fd, ":", TERM_NO); foostring = dbi_result_get_string_idx(dbires, 5); /* 1-base index */ if (foostring) { tiwrite(ptr_clrequest->fd, foostring, TERM_NO); } } } /* end while */ } } else { /* no frequency data requested */ while (dbi_result_next_row(dbires)) { ptr_addresult->success++; if (!all) { foostring = dbi_result_get_string_idx(dbires, 1); /* 1-base index */ if (foostring) { tiwrite(ptr_clrequest->fd, foostring, TERM_NO); } } else { /* display all synonyms. If one is missing, we still print the colon to indicate which one is missing */ foostring = dbi_result_get_string_idx(dbires, 1); /* 1-base index */ if (foostring) { tiwrite(ptr_clrequest->fd, foostring, TERM_NO); } tiwrite(ptr_clrequest->fd, ":", TERM_NO); foostring = dbi_result_get_string_idx(dbires, 3); /* 1-base index */ if (foostring) { tiwrite(ptr_clrequest->fd, foostring, TERM_NO); } tiwrite(ptr_clrequest->fd, ":", TERM_NO); foostring = dbi_result_get_string_idx(dbires, 4); /* 1-base index */ if (foostring) { tiwrite(ptr_clrequest->fd, foostring, TERM_NO); } tiwrite(ptr_clrequest->fd, ":", TERM_NO); foostring = dbi_result_get_string_idx(dbires, 5); /* 1-base index */ if (foostring) { tiwrite(ptr_clrequest->fd, foostring, TERM_NO); } tiwrite(ptr_clrequest->fd, "|", TERM_NO); } tiwrite(ptr_clrequest->fd, "\n", TERM_NO); } /* end while */ } /* end if */ /* terminate output */ iwrite(ptr_clrequest->fd, cs_term, TERM_LEN); dbi_result_free(dbires); dbi_conn_close(conn); } else { /* connection failed */ send_status(ptr_clrequest->fd, 204, TERM_NO); LOG_PRINT(LOG_WARNING, get_status_msg(204)); return 1; } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ is_refdb_admin(): tests whether a user is likely to be a refdbd administrator. We test whether the user has read access to a system table readable only for database administrators int is_refdb_admin returns 0 if access is denied. returns 1 if access is allowed. If a database error occurs other than denial of access, it will also return 0. If the database engine does not support access control, this function always returns 1 returns -1 if there was a connection problem struct CLIENT_REQUEST* ptr_clrequest ptr to structure with client info struct ADDRESULT* ptr_addresult ptr to struct with counters ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int is_refdb_admin(struct CLIENT_REQUEST* ptr_clrequest, struct ADDRESULT* ptr_addresult) { dbi_conn conn; dbi_result dbires; const char *drivername; /* connect to database server */ if ((conn = connect_to_db(ptr_clrequest, NULL, 0)) == NULL) { return -1; } drivername = dbi_driver_get_name(dbi_conn_get_driver(conn)); /* try to access a system table that only db administrators may access */ if (!strcmp(drivername, "mysql")) { dbires = dbi_conn_query(conn, "SELECT User FROM mysql.user"); } else if (!strcmp(drivername, "pgsql")) { dbires = dbi_conn_query(conn, "SELECT * FROM pg_shadow"); } else { /* no access control */ sprintf(ptr_addresult->msg, "704\n"); dbi_conn_close(conn); return 1; } if (!dbires) { sprintf(ptr_addresult->msg, "705:%s", ptr_clrequest->username); LOG_PRINT(LOG_WARNING, ptr_addresult->msg); sprintf(ptr_addresult->msg, "705:%s\n", ptr_clrequest->username); dbi_conn_close(conn); return 0; } dbi_result_free(dbires); dbi_conn_close(conn); sprintf(ptr_addresult->msg, "705:%s\n", ptr_clrequest->username); return 1; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ daemonize(): puts the process properly into the background int daemonize returns 1 in case of an error, 0 if all went fine char* progname optional string containing the name of the program ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int daemonize(char* progname) { /* this whole fn is more or less stolen from the libslack package */ /* libslack - http://libslack.org/ */ /* Copyright (C) 1999-2001 raf (GPL) */ pid_t pid; long nopen; int fd; /* ** Don't setup a daemon-friendly process context ** if started by init(8) or inetd(8). */ if (!(daemon_started_by_init() || daemon_started_by_inetd())) { /* ** Background the process. ** Lose process group leadership. */ if ((pid = fork()) == -1) { return 1; } if (pid) { exit(0); } /* Become a process session leader. */ setsid(); #ifndef NO_EXTRA_SVR4_FORK #ifdef SVR4 /* ** Lose process session leadership ** to prevent gaining a controlling ** terminal in SVR4. */ if ((pid = fork()) == -1) { return 1; } if (pid) { exit(0); } #endif #endif } /* Enter the root directory to prevent hampering umounts. */ if (chdir(ROOT_DIR) == -1) { return 1; } /* Clear umask to enable explicit file modes. */ umask(0); /* ** We need to close all open file descriptors. Check how ** many file descriptors we have (If indefinite, a usable ** number (1024) will be returned). */ if ((nopen = limit_open()) == -1) { return 1; } /* ** Close all open file descriptors. If started by inetd, ** we don't close stdin, stdout and stderr. ** Don't forget to open any future tty devices with O_NOCTTY ** so as to prevent gaining a controlling terminal ** (not necessary with SVR4). */ if (daemon_started_by_inetd()) { for (fd = 0; fd < nopen; ++fd) { switch (fd) { case STDIN_FILENO: case STDOUT_FILENO: case STDERR_FILENO: break; default: close(fd); } } } else { for (fd = 0; fd < nopen; ++fd) { close(fd); } /* ** Open stdin, stdout and stderr to /dev/null just in case some ** code buried in a library somewhere expects them to be open. */ if ((fd = open("/dev/null", O_RDWR)) == -1) { return 1; } /* ** This is only needed for very strange (hypothetical) ** POSIX implementations where STDIN_FILENO != 0 or ** STDOUT_FILE != 1 or STERR_FILENO != 2 (yeah, right). */ if (fd != STDIN_FILENO) { if (dup2(fd, STDIN_FILENO) == -1) { return 1; } close(fd); } if (dup2(STDIN_FILENO, STDOUT_FILENO) == -1) { return 1; } if (dup2(STDIN_FILENO, STDERR_FILENO) == -1) { return 1; } } /* ToDo: deal with this later */ /* Place our process id in the file system and lock it. */ /* if (name) */ /* { */ /* int rc; */ /* ptry(pthread_mutex_lock(&g.lock)) */ /* rc = daemon_pidfile(name); */ /* ptry(pthread_mutex_unlock(&g.lock)) */ /* return rc; */ /* } */ return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ daemon_started_by_init(): returns true if the daemon was started by init(8) static int daemon_started_by_init returns 1 if the daemon was started by init returns 0 if the daemon was started by any other means ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int daemon_started_by_init(void) { /* this code also taken from libslack */ /* static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; */ static int rc = -1; if (rc == -1) { /* ptry(pthread_mutex_lock(&lock)) */ if (rc == -1) { rc = (getppid() == 1); } /* ptry(pthread_mutex_unlock(&lock)) */ } return rc; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ daemon_started_by_inetd(): returns true if the daemon was started by inetd(8) static int daemon_started_by_inetd returns 1 if the daemon was started by intetd. returns 0 otherwise. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int daemon_started_by_inetd(void) { /* this code also taken from libslack */ /* static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; */ static int rc = -1; if (rc == -1) { /* socklen_t is not available on all platforms (OSX). We define it as 'int' at the top of this file if it is missing */ socklen_t optlen = (socklen_t)sizeof(int); int optval; /* ptry(pthread_mutex_lock(&lock)) */ if (rc == -1) { rc = (getsockopt(STDIN_FILENO, SOL_SOCKET, SO_TYPE, &optval, &optlen) == 0); } /* ptry(pthread_mutex_unlock(&lock)) */ } return rc; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ limit_open(): Returns the maximum number of files that a process can have open at any time. If indeterminate, a usable guess (1024) is returned. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static long limit_open(void) { long value; if ((value = sysconf(_SC_OPEN_MAX)) == -1) { return 1024L; /* educated guess */ } return value; } refdb-1.0.2/src/refdbdbib.c000755 001750 001750 00000326775 12255427652 016341 0ustar00markusmarkus000000 000000 /*++++++++++++++++++++++ refdbdbib.c: refdb application server, bibliography functions markus@mhoenicka.de 2000-02-12 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, see ++++++++++++++++++++++++*/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "backend.h" #include "linklist.h" #include "refdb.h" #include "refdbd.h" /* depends on backend.h */ #include "tokenize.h" #include "strfncs.h" #include "connect.h" #include "xmlhelper.h" #include "backend-dbib.h" #include "backend-rtfbib.h" #include "xmlhandler.h" #include "xmlout.h" #include "dbfncs.h" /* globals */ extern char server_ip[]; extern char main_db[]; extern int n_log_level; extern const char cs_term[]; /* forward declarations of local functions */ static int send_stylespec(int fd, dbi_conn conn, char* format_string, int n_ref_format); static int append_return_msg(struct ADDRESULT *ptr_addresult, int n_status, const char* entry_id, dbi_conn conn); static int sort_entries_asis(dbi_conn conn, struct CLIENT_REQUEST* ptr_clrequest, struct ADDRESULT* ptr_addresult, const char* table_name); static int fill_in_authoryear_info(struct BIBCONNS* ptr_bibconns, dbi_result dbires, dbi_result dbires_cit, struct CLIENT_REQUEST* ptr_clrequest, struct ADDRESULT* ptr_addresult, struct bibinfo* biblio_info, const char* table_name, char* pubtype, struct mset* ptr_mset_sentinel, unsigned long long* nref_counter, struct xmlindent* ptr_indent, int n_ref_format); static void close_dbi_connections(struct BIBCONNS* ptr_bibconns, const char* drivername); static int write_bibstyle_info(int fd, const char* bibliofirstindent, const char* biblioblockindent, const char* fontsize, int type); /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ getbib(): executes client command getbib int getbib returns 0 on success and 1 on error struct CLIENT_REQUEST* ptr_clrequest ptr to structure with client info struct bibinfo* biblio_info ptr to a structure containing formatting information int n_ref_format requested output format: REFDOCBK, REFDOCBKX, REFTEIX struct ADDRESULT* ptr_addresult ptr to a structure that will receive the result of the command (number of successful and failed references) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int getbib(struct CLIENT_REQUEST* ptr_clrequest, struct bibinfo* ptr_biblio_info, int n_ref_format, struct ADDRESULT* ptr_addresult) { XML_Parser p; struct getbib_data gbdata; struct simple_elstack *ptr_sfirst; /* start of the simple element stack */ dbi_result dbires; dbi_result dbires1 = NULL; dbi_result dbires_intext; dbi_result dbires_cit; int nmem_error; int ndb_error; int n_writeresult; int citation_count; /* counter for citations in id handler */ int xref_count; /* counter for xrefs in id handler */ int nis_numeric = 0; /* 1 for numeric in-text citation, 0 for author/year */ int n_currpos; int n_is_subseq = 0; int n_client_status; int retval = 0; int n_status; int n_send_result; size_t inbuffer_len; size_t sql_command_len; size_t outbuffer_len; size_t curr_multi_id_len; size_t result_len; short int n_pubyear; short int title_as_author; unsigned long long nref_counter; unsigned long long n_id; unsigned long long ndb_notfound = 0; /* number of refs not found */ char xreflabel[128]; char sql_command1[512]; char intext_string[8] = "INTEXTS"; char table_name[] = "getbibtemp"; char *curr_multi_id = NULL; char *sql_command = NULL; char *inbuffer = NULL; char *outbuffer = NULL; char *id_string = NULL; char *myjournal = NULL; const char *sql_errmsg = NULL; const char *drivername; char *prev_authorconcat = NULL; const char *bibsequence = NULL; const char *intextsequence = NULL; const char* item = NULL; const char* db_encoding = NULL; struct BIBCONNS bibconns; struct lilimem sentinel; Lilifstring notfound_first; Lilifstring notformatted_first; iconv_t conv_descriptor = NULL; struct xmlindent xindent; sentinel.ptr_mem = NULL; sentinel.ptr_next = NULL; sentinel.varname[0] = '\0'; /*initialize xindent. DocBook starts with a bibliography, TEI starts with a div/listBibl */ initialize_xmlindent(&xindent, (n_ref_format == REFTEIX5) ? 2*INDENT_INC:INDENT_INC, indent_notbelow_dbib, is_entry_dbib); notfound_first.ptr_next = NULL; *(notfound_first.token) = '\0'; notformatted_first.ptr_next = NULL; *(notformatted_first.token) = '\0'; ptr_biblio_info->entry_id = NULL; ptr_biblio_info->xreflabel = xreflabel; bibconns.conn = NULL; /* connection to the default reference database */ bibconns.conn_refdb = NULL; /* connection to refdb */ bibconns.conn_source = NULL; /* connection to source reference database */ nref_counter = ptr_biblio_info->n_startnumber - 1; /* numbering starts here */ sql_command_len = 8192; sql_command = malloc(sql_command_len); if (sql_command == NULL || insert_lilimem(&sentinel, (void**)&sql_command, NULL)) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } outbuffer_len = 8192; outbuffer = malloc(outbuffer_len); if (outbuffer == NULL || insert_lilimem(&sentinel, (void**)&outbuffer, NULL)) { delete_all_lilimem(&sentinel); send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } *outbuffer = '\0'; curr_multi_id_len = 1024; curr_multi_id = malloc(curr_multi_id_len); if (curr_multi_id == NULL || insert_lilimem(&sentinel, (void**)&curr_multi_id, NULL)) { delete_all_lilimem(&sentinel); send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } *curr_multi_id = '\0'; inbuffer_len = (size_t)COMMAND_INBUF_LEN; inbuffer = malloc(inbuffer_len); if (inbuffer == NULL || insert_lilimem(&sentinel, (void**)&inbuffer, NULL)) { /* malloc failed */ delete_all_lilimem(&sentinel); send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } /* initialize "globals" */ nmem_error = 0; ndb_error = 0; ptr_sfirst = NULL; citation_count = 0; xref_count = 0; /* create the parser instance */ p = XML_ParserCreate(NULL); if (!p) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); delete_all_lilimem(&sentinel); return 1; } /* register our handlers. these handlers will be called whenever expat finds a start- or endtag or character data */ XML_SetElementHandler(p, id_start_handler, id_end_handler); XML_SetCharacterDataHandler(p, id_char_handler); /* connect to the default reference database as provided by the client */ if ((bibconns.conn = connect_to_db(ptr_clrequest, NULL, 0)) == NULL) { /* if database server connect failed */ send_status(ptr_clrequest->fd, 204, TERM_NO); LOG_PRINT(LOG_WARNING, get_status_msg(204)); retval = 1; goto Finish; } drivername = dbi_driver_get_name(dbi_conn_get_driver(bibconns.conn)); /* connect to the refdb database */ if (!strcmp(my_dbi_conn_get_cap(bibconns.conn, "multiple_db"), "t")) { /* reuse the existing connection */ bibconns.conn_refdb = bibconns.conn; } else { bibconns.conn_refdb = connect_to_db(ptr_clrequest, main_db, 0); if (!bibconns.conn_refdb) { send_status(ptr_clrequest->fd, 202, TERM_NO); LOG_PRINT(LOG_WARNING, get_status_msg(202)); retval = 1; goto Finish; } } /* get the database encoding */ db_encoding = dbi_conn_get_encoding(bibconns.conn); /* if we need to convert, create a conversion descriptor for iconv() */ if (db_encoding && *(ptr_biblio_info->encoding) && strcmp(db_encoding, ptr_biblio_info->encoding)) { char to_encoding[64]; if (!strcmp(ptr_biblio_info->encoding, "US-ASCII")) { strcpy(to_encoding, "ASCII//TRANSLIT"); } else { snprintf(to_encoding, 64, "%s//TRANSLIT", ptr_biblio_info->encoding); } conv_descriptor = iconv_open(to_encoding, !strcmp(db_encoding, "US-ASCII") ? "ASCII" : db_encoding); if (conv_descriptor == (iconv_t)(-1)) { LOG_PRINT(LOG_WARNING, get_status_msg(701)); send_status(ptr_clrequest->fd, 701, TERM_NO); retval = 1; goto Finish; } else { LOG_PRINT(LOG_DEBUG, "database encoding is:"); LOG_PRINT(LOG_DEBUG, db_encoding); } } else { conv_descriptor = NULL; LOG_PRINT(LOG_DEBUG, "no character encoding conversion required"); } LOG_PRINT(LOG_DEBUG, "output encoding is:"); LOG_PRINT(LOG_DEBUG, ptr_biblio_info->encoding); myjournal = strdup(ptr_biblio_info->format_string); if (!myjournal || insert_lilimem(&sentinel, (void**)&myjournal, NULL)) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); send_status(ptr_clrequest->fd, 801, TERM_NO); retval = 1; goto Finish; } if (dbi_conn_quote_string(bibconns.conn_refdb, &myjournal) == 0) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); send_status(ptr_clrequest->fd, 801, TERM_NO); retval = 1; goto Finish; } /* send the style specification first */ n_send_result = send_stylespec(ptr_clrequest->fd, bibconns.conn_refdb, myjournal, n_ref_format); if (n_send_result != 0 && n_send_result != 241) { /* write error */ retval = 1; goto Finish; } n_client_status = read_status(ptr_clrequest->fd); if (n_client_status != 0) { LOG_PRINT(LOG_INFO, get_status_msg(112)); retval = 1; goto Finish; } /* create a temporary table for sorting the result */ /* both MySQL and PostgreSQL use separate namespaces per connection so it is safe to reuse the same table name */ /* the columns mean : */ /* dbname the name of the database the ref is taken from orig_id the numeric ID of the entry in the reference database entry_id the ID string as taken from the foo.id.xml file article_title the title of the work author_concat the concatenated author string periodical the journal name volume issue startpage pubyear citation_pos position of the citation in the document, 0-based, identical for all references of a multiple citation xref_pos position of the reference within a citation, 0-based and thus 0 for all references which are not part of a multiple citation multi_id ID string of the multiple citation a ref is part of, if any sorted_pos position of the ref in the bibliography after sorting author_abbrevlist the proper et al.-like string year_uni_suffix the unique suffix for the pubyear, if any */ if (!strcmp(ptr_clrequest->dbserver, "mysql")) { sprintf(sql_command, "CREATE TEMPORARY TABLE %s (id BIGINT NOT NULL AUTO_INCREMENT," "dbname VARCHAR(64)," "orig_id BIGINT," "entry_id TEXT," "article_title TEXT," "author_concat TEXT," "periodical VARCHAR(255)," "volume VARCHAR(255)," "issue VARCHAR(255)," "startpage VARCHAR(255)," "pubyear SMALLINT," "monthday VARCHAR(16)," "citation_pos INT," "xref_pos INT," "multi_id TEXT," "sorted_pos INT DEFAULT 1," "author_abbrevlist TEXT," "year_uni_suffix VARCHAR(16)," "title_as_author SMALLINT DEFAULT 0," "citekey VARCHAR(255)," "PRIMARY KEY (id))", table_name); } else if (!strcmp(ptr_clrequest->dbserver, "pgsql")) { sprintf(sql_command, "CREATE TEMPORARY TABLE %s (id BIGSERIAL," "dbname VARCHAR(64)," "orig_id BIGINT," "entry_id TEXT," "article_title TEXT," "author_concat TEXT," "periodical VARCHAR(255)," "volume VARCHAR(255)," "issue VARCHAR(255)," "startpage VARCHAR(255)," "pubyear SMALLINT," "monthday VARCHAR(16)," "citation_pos INTEGER," "xref_pos INTEGER," "multi_id TEXT," "sorted_pos INTEGER DEFAULT 1," "author_abbrevlist TEXT," "year_uni_suffix VARCHAR(16)," "title_as_author SMALLINT DEFAULT 0," "citekey VARCHAR(255)," "PRIMARY KEY (id))", table_name); } else if (!strcmp(ptr_clrequest->dbserver, "sqlite")) { sprintf(sql_command, "CREATE TEMPORARY TABLE %s (id INTEGER PRIMARY KEY," "dbname VARCHAR(64)," "orig_id INTEGER," "entry_id TEXT," "article_title TEXT," "author_concat TEXT," "periodical TEXT," "volume TEXT," "issue TEXT," "startpage TEXT," "pubyear SMALLINT," "monthday TEXT," "citation_pos INTEGER," "xref_pos INTEGER," "multi_id TEXT," "sorted_pos INTEGER DEFAULT 1," "author_abbrevlist TEXT," "title_as_author SMALLINT DEFAULT 0," "citekey TEXT," "year_uni_suffix TEXT)", table_name); } else if (!strcmp(ptr_clrequest->dbserver, "sqlite3")) { sprintf(sql_command, "CREATE TEMPORARY TABLE %s (id INTEGER PRIMARY KEY," "dbname VARCHAR(64)," "orig_id BIGINT," "entry_id TEXT," "article_title TEXT," "author_concat TEXT," "periodical TEXT," "volume TEXT," "issue TEXT," "startpage TEXT," "pubyear SMALLINT," "monthday TEXT," "citation_pos INTEGER," "xref_pos INTEGER," "multi_id TEXT," "sorted_pos INTEGER DEFAULT 1," "author_abbrevlist TEXT," "title_as_author SMALLINT DEFAULT 0," "citekey TEXT," "year_uni_suffix TEXT)", table_name); } LOG_PRINT(LOG_DEBUG, sql_command); /* the temporary table will be created in the default database */ dbires = dbi_conn_query(bibconns.conn, sql_command); if (!dbires) { dbi_conn_error(bibconns.conn, &sql_errmsg); if (sql_errmsg) { send_status(ptr_clrequest->fd, 242, TERM_NO); LOG_PRINT(LOG_WARNING, (char*)sql_errmsg); } else { send_status(ptr_clrequest->fd, 242, TERM_NO); LOG_PRINT(LOG_WARNING, get_status_msg(242)); } retval = 1; goto Finish; } dbi_result_free(dbires); dbires = NULL; /* make data available for handlers */ gbdata.ptr_default_db = ptr_clrequest->current_db; gbdata.conn = bibconns.conn; /* connection to the temp table db */ gbdata.conn_refdb = bibconns.conn_refdb; /* connection to the style db */ gbdata.ptr_citation_count = &citation_count; gbdata.ptr_xref_count = &xref_count; gbdata.ptr_table_name = table_name; gbdata.ptr_curr_multi_id = curr_multi_id; gbdata.quoted_journal = myjournal; gbdata.ptr_cmid_len = &curr_multi_id_len; gbdata.ptr_sfirst = ptr_sfirst; gbdata.ptr_nmem_error = &nmem_error; gbdata.ptr_ndb_error = &ndb_error; gbdata.ptr_ndb_notfound = &(ptr_addresult->skipped); gbdata.ptr_clrequest = ptr_clrequest; gbdata.ptr_notfound_first = ¬found_first; gbdata.ptr_found_first = NULL; /* not used here */ XML_SetUserData(p, (void*)&gbdata); /* tell client that we're ready for XML data */ send_status(ptr_clrequest->fd, 0, TERM_NO); /* read XML data from client */ if (!read_xml(ptr_clrequest->fd, p, ptr_addresult)) { /* error */ dbi_conn_error(bibconns.conn, &sql_errmsg); LOG_PRINT(LOG_WARNING, (char*)sql_errmsg); sprintf(sql_command, "DROP TABLE %s", table_name); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(bibconns.conn, sql_command); if (!dbires) { LOG_PRINT(LOG_WARNING, get_status_msg(243)); } dbi_result_free(dbires); dbires = NULL; delete_idlist(ptr_sfirst); retval = 1; goto Finish; } else if (nmem_error) { retval = 1; goto Finish; } else if (ndb_error) { dbi_conn_error(bibconns.conn, &sql_errmsg); LOG_PRINT(LOG_WARNING, (char*)sql_errmsg); retval = 1; goto Finish; } n_client_status = read_status(ptr_clrequest->fd); if (n_client_status != 0) { LOG_PRINT(LOG_INFO, get_status_msg(112)); retval = 1; goto Finish; } /* see how the references should be sorted */ if (!strcmp(my_dbi_conn_get_cap(bibconns.conn_refdb, "multiple_db"), "t")) { sprintf(sql_command, "SELECT BIBLIOSEQUENCE,INTEXTSEQUENCE from %s.CITSTYLE where JOURNAL=%s", main_db, myjournal); } else { sprintf(sql_command, "SELECT BIBLIOSEQUENCE,INTEXTSEQUENCE from CITSTYLE where JOURNAL=%s", myjournal); } LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(bibconns.conn_refdb, sql_command); /* todo: figure out what to do with append_return_msg and such we have to send: - style data - the bibliographic data proper - an error list - a command summary */ if (!dbires || dbi_result_next_row(dbires) == 0) { if (dbires) { dbi_result_free(dbires); dbires = NULL; } send_status(ptr_clrequest->fd, 241, TERM_NO); dbi_conn_error(bibconns.conn_refdb, &sql_errmsg); LOG_PRINT(LOG_WARNING, sql_errmsg); retval = 1; goto Finish; } /* this is the sequence of the entries in the bibliography */ bibsequence = dbi_result_get_string(dbires, "BIBLIOSEQUENCE"); if (!bibsequence || !strcmp(bibsequence, "ERROR")) { send_status(ptr_clrequest->fd, 241, TERM_NO); dbi_conn_error(bibconns.conn_refdb, &sql_errmsg); LOG_PRINT(LOG_WARNING, sql_errmsg); dbi_result_free(dbires); dbires = NULL; retval = 1; goto Finish; } /* this is the sequence of references in a multiple citation */ intextsequence = dbi_result_get_string(dbires, "INTEXTSEQUENCE"); if (!intextsequence || !strcmp(intextsequence, "ERROR")) { send_status(ptr_clrequest->fd, 241, TERM_NO); dbi_conn_error(bibconns.conn_refdb, &sql_errmsg); LOG_PRINT(LOG_WARNING, sql_errmsg); dbi_result_free(dbires); dbires = NULL; retval = 1; goto Finish; } if (strcmp(bibsequence, "BASIS") == 0) { /* sort the entries according to their appearance in the document */ if ((n_status = sort_entries_asis(bibconns.conn, ptr_clrequest, ptr_addresult, table_name)) != 0) { send_status(ptr_clrequest->fd, n_status, TERM_NO); append_return_msg(ptr_addresult, n_status, NULL, bibconns.conn); dbi_result_free(dbires); dbires = NULL; retval = 1; goto Finish; } /* now do the real query. We have to take care of the fact that the sorting order, although "ASIS", may be affected by the sorting order of multiple in-text citations */ if (strcmp(intextsequence, "ASIS") == 0) { sprintf(sql_command, "SELECT dbname, orig_id, author_concat, pubyear, article_title, periodical, volume, issue, startpage, entry_id, year_uni_suffix, sorted_pos, title_as_author FROM %s WHERE sorted_pos>0 ORDER BY id", table_name); } else if (strcmp(intextsequence, "AUTHORDATE") == 0) { sprintf(sql_command, "SELECT dbname, orig_id, author_concat, pubyear, article_title, periodical, volume, issue, startpage, entry_id, year_uni_suffix, sorted_pos, title_as_author FROM %s WHERE sorted_pos>0 ORDER BY citation_pos, author_concat, pubyear, monthday, periodical, volume, issue, startpage", table_name); } else if (strcmp(intextsequence, "CITEKEY") == 0) { sprintf(sql_command, "SELECT dbname, orig_id, author_concat, pubyear, article_title, periodical, volume, issue, startpage, entry_id, year_uni_suffix, sorted_pos, title_as_author FROM %s WHERE sorted_pos>0 ORDER BY citation_pos, citekey, author_concat, pubyear, monthday, periodical, volume, issue, startpage", table_name); } else if (strcmp(intextsequence, "DATEASC") == 0) { sprintf(sql_command, "SELECT dbname, orig_id, author_concat, pubyear, article_title, periodical, volume, issue, startpage, entry_id, year_uni_suffix, sorted_pos, title_as_author FROM %s WHERE sorted_pos>0 ORDER BY citation_pos, pubyear, monthday, author_concat, periodical, volume, issue, startpage", table_name); } else if (strcmp(intextsequence, "DATEDESC") == 0) { sprintf(sql_command, "SELECT dbname, orig_id, author_concat, pubyear, article_title, periodical, volume, issue, startpage, entry_id, year_uni_suffix, sorted_pos, title_as_author FROM %s WHERE sorted_pos>0 ORDER BY citation_pos, pubyear DESC, monthday DESC, author_concat, periodical, volume, issue, startpage", table_name); } } else if (strcmp(bibsequence, "BAUTHORDATE") == 0) { sprintf(sql_command, "SELECT DISTINCT dbname, orig_id, upper(author_concat), pubyear, article_title, periodical, volume, issue, startpage, entry_id, year_uni_suffix, sorted_pos, monthday, title_as_author FROM %s ORDER BY upper(author_concat), pubyear, monthday, volume, issue, article_title, periodical, startpage", table_name); } else if (strcmp(bibsequence, "BCITEKEY") == 0) { sprintf(sql_command, "SELECT DISTINCT dbname, orig_id, author_concat, pubyear, article_title, periodical, volume, issue, startpage, entry_id, year_uni_suffix, sorted_pos, monthday, title_as_author, citekey FROM %s ORDER BY citekey, author_concat, pubyear, monthday, volume, issue, article_title, periodical, startpage", table_name); } else if (strcmp(bibsequence, "BDATEASC") == 0) { sprintf(sql_command, "SELECT DISTINCT dbname, orig_id, author_concat, pubyear, article_title, periodical, volume, issue, startpage, entry_id, year_uni_suffix, sorted_pos, monthday, title_as_author FROM %s ORDER BY pubyear, monthday, author_concat, volume, issue, article_title, periodical, startpage", table_name); } else if (strcmp(bibsequence, "BDATEDESC") == 0) { sprintf(sql_command, "SELECT DISTINCT dbname, orig_id, author_concat, pubyear, article_title, periodical, volume, issue, startpage, entry_id, year_uni_suffix, sorted_pos, monthday, title_as_author FROM %s ORDER BY pubyear DESC, monthday DESC, author_concat, volume, issue, article_title, periodical, startpage", table_name); } dbi_result_free(dbires); dbires = NULL; LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(bibconns.conn, sql_command); if (!dbires) { send_status(ptr_clrequest->fd, 234, TERM_NO); dbi_conn_error(bibconns.conn_refdb, &sql_errmsg); LOG_PRINT(LOG_WARNING, sql_errmsg); retval = 1; goto Finish; } /* retrieve basic information about the bibliography style from CITSTYLE into ptr_result */ if (!strcmp(my_dbi_conn_get_cap(bibconns.conn_refdb, "multiple_db"), "t")) { sprintf(sql_command1, "SELECT ID, CITSEPARATOR, FOLLOWING, PRECEEDING, RANGESEPARATOR, INTEXTSEQUENCE, STYLE from %s.CITSTYLE where JOURNAL=%s", main_db, myjournal); } else { sprintf(sql_command1, "SELECT ID, CITSEPARATOR, FOLLOWING, PRECEEDING, RANGESEPARATOR, INTEXTSEQUENCE, STYLE from CITSTYLE where JOURNAL=%s", myjournal); } LOG_PRINT(LOG_DEBUG, sql_command1); dbires_cit = dbi_conn_query(bibconns.conn_refdb, sql_command1); if (!dbires_cit || dbi_result_next_row(dbires_cit) == 0) { if (dbires_cit) { dbi_result_free(dbires_cit); dbires_cit = NULL; } send_status(ptr_clrequest->fd, 234, TERM_NO); dbi_conn_error(bibconns.conn_refdb, &sql_errmsg); LOG_PRINT(LOG_WARNING, sql_errmsg); dbi_result_free(dbires); dbires = NULL; retval = 1; goto Finish; } /* decide whether this is a numeric citation */ /* find the first position in the intext citation; if it is refnumber, don't hassle with the following */ if (!strcmp(my_dbi_conn_get_cap(bibconns.conn_refdb, "multiple_db"), "t")) { sprintf(sql_command1, "SELECT %s.POSITIONS.TYPE FROM %s.POSITIONS INNER JOIN %s.REFSTYLE ON %s.POSITIONS.REFSTYLEID=%s.REFSTYLE.ID INNER JOIN %s.CITSTYLE ON %s.REFSTYLE.CITSTYLEID=%s.CITSTYLE.ID WHERE %s.POSITIONS.POS=0 AND %s.REFSTYLE.PUBTYPE='INTEXT' AND %s.CITSTYLE.JOURNAL=%s", main_db, main_db, main_db, main_db, main_db, main_db, main_db, main_db, main_db, main_db, main_db, myjournal); } else { sprintf(sql_command1, "SELECT POSITIONS.TYPE FROM POSITIONS INNER JOIN REFSTYLE ON POSITIONS.REFSTYLEID=REFSTYLE.ID INNER JOIN CITSTYLE ON REFSTYLE.CITSTYLEID=CITSTYLE.ID WHERE POSITIONS.POS=0 AND REFSTYLE.PUBTYPE='INTEXT' AND CITSTYLE.JOURNAL=%s", myjournal); } LOG_PRINT(LOG_DEBUG, sql_command1); dbires_intext = dbi_conn_query(bibconns.conn_refdb, sql_command1); if (!dbires_intext) { send_status(ptr_clrequest->fd, 234, TERM_NO); dbi_conn_error(bibconns.conn_refdb, &sql_errmsg); LOG_PRINT(LOG_WARNING, sql_errmsg); dbi_result_free(dbires_cit); dbires_cit = NULL; dbi_result_free(dbires); dbires_cit = NULL; retval = 1; goto Finish; } if (dbi_result_next_row(dbires_intext) != 0) { item = dbi_result_get_string_idx(dbires_intext, 1/*POSITIONS.TYPE*/); /* citekey-based citation styles are treated as numeric */ if (strcmp(item, "REFNUMBER") == 0 || strcmp(item, "CITEKEY") == 0) { nis_numeric = 1; } } else { /* pretend numeric */ nis_numeric = 1; } dbi_result_free(dbires_intext); dbires_intext = NULL; if (!nis_numeric) { /* only useful for author/year style */ if ((n_status = fill_in_authoryear_info(&bibconns, dbires, dbires_cit, ptr_clrequest, ptr_addresult, ptr_biblio_info, table_name, intext_string, NULL /* don't need bibliomsets */, &nref_counter, &xindent, n_ref_format)) != 0) { send_status(ptr_clrequest->fd, n_status, TERM_NO); dbi_result_free(dbires_cit); dbires_cit = NULL; dbi_result_free(dbires); dbires = NULL; retval = 1; goto Finish; } dbi_result_free(dbires); dbires = NULL; /* reuse previous query string */ LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(bibconns.conn, sql_command); if (!dbires) { dbi_result_free(dbires_cit); dbires_cit = NULL; send_status(ptr_clrequest->fd, 234, TERM_NO); dbi_conn_error(bibconns.conn_refdb, &sql_errmsg); LOG_PRINT(LOG_WARNING, sql_errmsg); retval = 1; goto Finish; } } dbi_result_free(dbires_cit); dbires_cit = NULL; /* output actually starts here */ /* create doctype line etc */ if (n_ref_format == REFRTF) { if ((n_status = prepare_render_rtfbib(&outbuffer, &outbuffer_len, ptr_biblio_info, bibconns.conn_refdb)) != 0) { send_status(ptr_clrequest->fd, n_status, TERM_NO); append_return_msg(ptr_addresult, n_status, NULL, bibconns.conn); retval = 1; dbi_result_free(dbires); dbires = NULL; goto Finish; } } else { if ((n_status = prepare_render_dbib(&outbuffer, &outbuffer_len, ptr_biblio_info, bibconns.conn_refdb, n_ref_format, ptr_clrequest->namespace)) != 0) { send_status(ptr_clrequest->fd, n_status, TERM_NO); append_return_msg(ptr_addresult, n_status, NULL, bibconns.conn); retval = 1; dbi_result_free(dbires); dbires = NULL; goto Finish; } } /* loop over all distinct references for the actual formatting */ while (dbi_result_next_row(dbires)) { /* the following loop has already run if !nis_numeric */ if (nis_numeric) { nref_counter++; /* will start at 1 as is common in bibliographies */ id_string = my_dbi_result_get_string_copy(dbires, "entry_id"); if (!id_string || !strcmp(id_string, "ERROR") || insert_lilimem(&sentinel, (void**)&id_string, "id_string")) { ptr_addresult->failure++; append_return_msg(ptr_addresult, 234, id_string, bibconns.conn); goto FinishLoop; } sprintf(sql_command1, "UPDATE %s SET sorted_pos="ULLSPEC" WHERE entry_id='%s'", table_name, (unsigned long long)nref_counter, id_string); LOG_PRINT(LOG_DEBUG, sql_command1); dbires1 = dbi_conn_query(bibconns.conn, sql_command1); if (!dbires1) { ptr_addresult->failure++; append_return_msg(ptr_addresult, 234, id_string, bibconns.conn); goto FinishLoop; } dbi_result_free(dbires1); dbires1 = NULL; delete_lilimem(&sentinel, "id_string"); } /* 0 refdb_id ID - 1 refdb_type TY - 2 refdb_pubyear PY - (partial) 3 refdb_startpage SP - 4 refdb_endpage EP - 5 refdb_abstract N2 - 6 refdb_title TI - 7 refdb_volume VL - 8 refdb_issue CP - 9 refdb_booktitle BT - 10 refdb_city CY - 11 refdb_publisher PB - 12 refdb_title_series T3 - 13 refdb_address AD - deleted 14 refdb_url UR - 14 refdb_issn SN - 15 refdb_periodical_id JO - (indirect) 16 refdb_pyother_info PY - (partial) 17 refdb_secyear Y2 - (partial) 18 refdb_secother_info Y2 - (partial) 19 refdb_user1 U1 - 20 refdb_user2 U2 - 21 refdb_user3 U3 - 22 refdb_user4 U4 - 23 refdb_user5 U5 - */ item = dbi_result_get_string(dbires, "dbname"); n_id = my_dbi_result_get_idval(dbires, "orig_id"); /* printf("about to format %qu<<\n", n_id); */ if (!strcmp(my_dbi_conn_get_cap(bibconns.conn, "multiple_db"), "t")) { sprintf(sql_command, "SELECT %s.t_refdb.refdb_id, %s.t_refdb.refdb_type, %s.t_refdb.refdb_pubyear, %s.t_refdb.refdb_startpage, %s.t_refdb.refdb_endpage, %s.t_refdb.refdb_abstract, %s.t_refdb.refdb_title, %s.t_refdb.refdb_volume, %s.t_refdb.refdb_issue, %s.t_refdb.refdb_booktitle, %s.t_refdb.refdb_city, %s.t_refdb.refdb_publisher, %s.t_refdb.refdb_title_series, %s.t_refdb.refdb_address, %s.t_refdb.refdb_issn, %s.t_refdb.refdb_periodical_id, %s.t_refdb.refdb_pyother_info, %s.t_refdb.refdb_secyear, %s.t_refdb.refdb_secother_info, %s.t_refdb.refdb_user1, %s.t_refdb.refdb_user2, %s.t_refdb.refdb_user3, %s.t_refdb.refdb_user4, %s.t_refdb.refdb_user5, %s.t_refdb.refdb_typeofwork, %s.t_refdb.refdb_area, %s.t_refdb.refdb_ostype, %s.t_refdb.refdb_degree, %s.t_refdb.refdb_runningtime, %s.t_refdb.refdb_classcodeintl, %s.t_refdb.refdb_classcodeus, %s.t_refdb.refdb_senderemail, %s.t_refdb.refdb_recipientemail, %s.t_refdb.refdb_mediatype, %s.t_refdb.refdb_numvolumes, %s.t_refdb.refdb_edition, %s.t_refdb.refdb_computer, %s.t_refdb.refdb_conferencelocation, %s.t_refdb.refdb_registrynum, %s.t_refdb.refdb_classification, %s.t_refdb.refdb_section, %s.t_refdb.refdb_pamphletnum, %s.t_refdb.refdb_chapternum, %s.t_refdb.refdb_citekey FROM %s.t_refdb WHERE %s.t_refdb.refdb_id="ULLSPEC, item, item, item, item, item, item, item, item, item, item, item, item, item, item, item, item, item, item, item, item, item, item, item, item, item, item, item, item, item, item, item, item, item, item, item, item, item, item, item, item, item, item, item, item, item, item, (unsigned long long)n_id); /* reuse existing connection */ bibconns.conn_source = bibconns.conn; } else { /* get new connection to source reference database */ bibconns.conn_source = connect_to_db(ptr_clrequest, item, 0); if (!bibconns.conn_source) { ptr_addresult->failure++; send_status(ptr_clrequest->fd, 204, TERM_NO); append_return_msg(ptr_addresult, 204, id_string, bibconns.conn); dbi_result_free(dbires); dbires = NULL; retval = 1; goto Finish; } sprintf(sql_command, "SELECT refdb_id, refdb_type, refdb_pubyear, refdb_startpage, refdb_endpage, refdb_abstract, refdb_title, refdb_volume, refdb_issue, refdb_booktitle, refdb_city, refdb_publisher, refdb_title_series, refdb_address, refdb_issn, refdb_periodical_id, refdb_pyother_info, refdb_secyear, refdb_secother_info, refdb_user1, refdb_user2, refdb_user3, refdb_user4, refdb_user5, refdb_typeofwork, refdb_area, refdb_ostype, refdb_degree, refdb_runningtime, refdb_classcodeintl, refdb_classcodeus, refdb_senderemail, refdb_recipientemail, refdb_mediatype, refdb_numvolumes, refdb_edition, refdb_computer, refdb_conferencelocation, refdb_registrynum, refdb_classification, refdb_section, refdb_pamphletnum, refdb_chapternum, refdb_citekey FROM t_refdb WHERE refdb_id="ULLSPEC, (unsigned long long)n_id); } LOG_PRINT(LOG_DEBUG, sql_command); dbires1 = dbi_conn_query(bibconns.conn_source, sql_command); if (!dbires1 || dbi_result_next_row(dbires1) == 0) { if (dbires1) { dbi_result_free(dbires1); dbires1 = NULL; } ptr_addresult->failure++; append_return_msg(ptr_addresult, 234, id_string, bibconns.conn); goto FinishLoop; } ptr_biblio_info->entry_id = my_dbi_result_get_string_copy(dbires, "entry_id"); if (!ptr_biblio_info->entry_id || !strcmp(ptr_biblio_info->entry_id, "ERROR") || insert_lilimem(&sentinel, (void**)&(ptr_biblio_info->entry_id), "id_string")) { ptr_addresult->failure++; append_return_msg(ptr_addresult, 234, id_string, bibconns.conn); goto FinishLoop; } ptr_biblio_info->year_unique_suffix = dbi_result_get_string(dbires, "year_uni_suffix"); /* compare current string with the string of the previous iteration */ /* we have to work around a MySQL peculiarity as it returns NULL if the string is empty */ /* item = my_dbi_result_get_string_copy(dbires, "author_concat"); */ item = my_dbi_result_get_string_copy_idx(dbires, 3); /* printf("author_concat went to: %s<<\n", item); */ if ((!item && my_dbi_conn_error_flag(bibconns.conn)) || (item && !strcmp(item, "ERROR"))) { ptr_addresult->failure++; append_return_msg(ptr_addresult, 234, id_string, bibconns.conn); goto FinishLoop; } n_currpos = dbi_result_get_int(dbires, "sorted_pos"); if ((!n_currpos && my_dbi_conn_error_flag(bibconns.conn))) { ptr_addresult->failure++; append_return_msg(ptr_addresult, 234, id_string, bibconns.conn); goto FinishLoop; } n_pubyear = dbi_result_get_short(dbires, "pubyear"); if ((!n_pubyear && my_dbi_conn_error_flag(bibconns.conn))) { ptr_addresult->failure++; append_return_msg(ptr_addresult, 234, id_string, bibconns.conn); goto FinishLoop; } /* empty authorlists are never treated as subseq. Both the current and the previous authorlist may be NULL */ n_is_subseq = check_is_subseq(item, table_name, n_currpos, n_pubyear, bibconns.conn); if (n_is_subseq == -1) { ptr_addresult->failure++; append_return_msg(ptr_addresult, 234, id_string, bibconns.conn); goto FinishLoop; } ptr_biblio_info->is_subseq = n_is_subseq; /* free memory */ if (prev_authorconcat) { free(prev_authorconcat); } /* keep the current string so we can compare it in the next iteration */ prev_authorconcat = (char*)item; item = dbi_result_get_string(dbires, "dbname"); title_as_author = dbi_result_get_short(dbires, "title_as_author"); /* todo: break instead of exit on error? */ if (n_ref_format == REFRTF) { if ((n_status = render_rtfbib(&outbuffer, &outbuffer_len, &bibconns, dbires1 /* reference info */, item /* database */, ptr_biblio_info, ptr_clrequest->username, ptr_clrequest->pdfroot, nref_counter, title_as_author)) != 0) { send_status(ptr_clrequest->fd, n_status, TERM_NO); append_return_msg(ptr_addresult, n_status, id_string, bibconns.conn); ptr_addresult->failure++; goto FinishLoop; } } else { if ((n_status = render_dbib(&outbuffer, &outbuffer_len, &bibconns, dbires1 /* reference info */, item /* database */, ptr_biblio_info, ptr_clrequest->username, ptr_clrequest->pdfroot, nref_counter, title_as_author, ptr_clrequest->namespace, &xindent, n_ref_format)) != 0) { send_status(ptr_clrequest->fd, n_status, TERM_NO); append_return_msg(ptr_addresult, n_status, id_string, bibconns.conn); ptr_addresult->failure++; goto FinishLoop; } } /* run a character encoding conversion if required */ if (conv_descriptor && *outbuffer) { size_t inlength; size_t outlength; size_t orig_outlength; char* my_outbuffer = NULL; /* this ptr will be modified by iconv() */ char* my_outbuffer_start = NULL; /* records initial state of outbuffer */ const char* my_instring = NULL; /* this ptr will be modified by iconv() */ inlength = strlen(outbuffer); /* with the encodings supported by our database engines, the converted string can't be longer than six times the input string */ outlength = 6*inlength; orig_outlength = outlength; if ((my_outbuffer = malloc(outlength)) == NULL) { send_status(ptr_clrequest->fd, 801, TERM_NO); append_return_msg(ptr_addresult, 801, id_string, bibconns.conn); ptr_addresult->failure++; dbi_result_free(dbires1); dbires1 = NULL; dbi_result_free(dbires); dbires1 = NULL; retval = 1; goto Finish; } /* keep start of the converted string */ my_outbuffer_start = my_outbuffer; /* variable will be modified by iconv, so don't use original */ my_instring = (const char*)outbuffer; /* now actually do the conversion */ if (iconv(conv_descriptor, &my_instring, &inlength, &my_outbuffer, &outlength) == (size_t)(-1)) { if (errno == EILSEQ) { LOG_PRINT(LOG_WARNING, "iconv: invalid input character sequence"); } else if (errno == E2BIG) { LOG_PRINT(LOG_WARNING, "iconv: output buffer too small"); } else if (errno == EINVAL) { LOG_PRINT(LOG_WARNING, "iconv: incomplete input character"); } send_status(ptr_clrequest->fd, 702, TERM_NO); append_return_msg(ptr_addresult, 702, id_string, bibconns.conn); ptr_addresult->failure++; goto FinishLoop; } /* else: conversion went ok. We free the original string and replace it with the converted copy */ if (outbuffer) { free(outbuffer); } outbuffer = my_outbuffer_start; outbuffer_len = orig_outlength; result_len = (size_t)(my_outbuffer - my_outbuffer_start); } /* else: no conversion required */ else { result_len = strlen(outbuffer); } /* send ok status, then the terminated result string */ send_status(ptr_clrequest->fd, 404, TERM_NO); iwrite(ptr_clrequest->fd, outbuffer, result_len); iwrite(ptr_clrequest->fd, cs_term, TERM_LEN); ptr_addresult->success++; /* this label is targeted if something goes wrong with a particular reference, without having to abandon the whole formatting process */ FinishLoop: /* reset buffer string */ outbuffer[0] = '\0'; delete_lilimem(&sentinel, "id_string"); if (dbires1) { dbi_result_free(dbires1); dbires1 = NULL; } if (strcmp(my_dbi_conn_get_cap(bibconns.conn_source, "multiple_db"), "t")) { dbi_conn_close(bibconns.conn_source); bibconns.conn_source = NULL; } n_client_status = read_status(ptr_clrequest->fd); if (n_client_status) { /* client aborted */ dbi_result_free(dbires); dbires = NULL; retval = 1; goto Finish; } } /* end loop over all distinct references */ if (n_ref_format == REFRTF) { if ((n_status = finish_render_rtfbib(&outbuffer, &outbuffer_len, &bibconns, ptr_biblio_info, table_name, ptr_clrequest)) != 0) { send_status(ptr_clrequest->fd, n_status, TERM_NO); append_return_msg(ptr_addresult, n_status, NULL, bibconns.conn); dbi_result_free(dbires); dbires = NULL; retval = 1; goto Finish; } } else { if ((n_status = finish_render_dbib(&outbuffer, &outbuffer_len, &bibconns, ptr_biblio_info, table_name, ptr_clrequest, &xindent, n_ref_format)) != 0) { send_status(ptr_clrequest->fd, n_status, TERM_NO); append_return_msg(ptr_addresult, n_status, NULL, bibconns.conn); dbi_result_free(dbires); dbires = NULL; retval = 1; goto Finish; } } /* run a character encoding conversion if required */ if (conv_descriptor && *outbuffer) { size_t inlength; size_t outlength; size_t orig_outlength; char* my_outbuffer = NULL; /* this ptr will be modified by iconv() */ char* my_outbuffer_start = NULL; /* records initial state of outbuffer */ const char* my_instring = NULL; /* this ptr will be modified by iconv() */ inlength = strlen(outbuffer); /* with the encodings supported by our database engines, the converted string can't be longer than six times the input string */ outlength = 6*inlength; orig_outlength = outlength; if ((my_outbuffer = malloc(outlength)) == NULL) { send_status(ptr_clrequest->fd, 801, TERM_NO); append_return_msg(ptr_addresult, 801, id_string, bibconns.conn); ptr_addresult->failure++; dbi_result_free(dbires); dbires = NULL; retval = 1; goto Finish; } /* keep start of the converted string */ my_outbuffer_start = my_outbuffer; /* variable will be modified by iconv, so don't use original */ my_instring = (const char*)outbuffer; /* now actually do the conversion */ if (iconv(conv_descriptor, &my_instring, &inlength, &my_outbuffer, &outlength) == (size_t)(-1)) { if (errno == EILSEQ) { LOG_PRINT(LOG_WARNING, "iconv: invalid input character sequence"); } else if (errno == E2BIG) { LOG_PRINT(LOG_WARNING, "iconv: output buffer too small"); } else if (errno == EINVAL) { LOG_PRINT(LOG_WARNING, "iconv: incomplete input character"); } send_status(ptr_clrequest->fd, 702, TERM_NO); append_return_msg(ptr_addresult, 702, id_string, bibconns.conn); ptr_addresult->failure++; goto Finish; } /* else: conversion went ok. We free the original string and replace it with the converted copy */ if (outbuffer) { free(outbuffer); } outbuffer = my_outbuffer_start; outbuffer_len = orig_outlength; result_len = (size_t)(my_outbuffer - my_outbuffer_start); } /* else: no conversion required */ else { result_len = strlen(outbuffer); } /* send ok status, then the terminated result string */ send_status(ptr_clrequest->fd, 402, TERM_NO); iwrite(ptr_clrequest->fd, outbuffer, result_len); n_writeresult = iwrite(ptr_clrequest->fd, cs_term, TERM_LEN); /* send_status(ptr_clrequest->fd, 402, TERM_NO); */ /* n_writeresult = tiwrite(ptr_clrequest->fd, outbuffer, TERM_YES); */ /* todo: test */ /* printf("client sleeps for 5sec\n"); */ /* sleep(5); */ /* end test */ /* printf("n_writeresult=%d<<\n", n_writeresult); */ /* todo: switch on after debugging */ /* remove the temporary table */ sprintf(sql_command, "DROP TABLE %s", table_name); LOG_PRINT(LOG_DEBUG, sql_command); dbires1 = dbi_conn_query(bibconns.conn, sql_command); if (!dbires1) { append_return_msg(ptr_addresult, 243, NULL, bibconns.conn); } else { dbi_result_free(dbires1); dbires1 = NULL; } dbi_result_free(dbires); dbires = NULL; Finish: close_dbi_connections(&bibconns, drivername); ptr_addresult->success = nref_counter - ptr_biblio_info->n_startnumber + 1; if (ndb_notfound) { Lilifstring* ptr_curr; char buffer[260]; char* msg_temp; if (!ptr_addresult->msg) { ptr_addresult->msg = malloc(256); /* something to start with */ if (ptr_addresult->msg) { *(ptr_addresult->msg) = '\0'; ptr_addresult->msg_len = 256; } } if (ptr_addresult->msg) { if ((msg_temp = mstrcat(ptr_addresult->msg, "Couldn't find these references:", &(ptr_addresult->msg_len), 0)) != NULL) { ptr_addresult->msg = msg_temp; } ptr_curr = ¬found_first; /* todo: write each ref on it's own line with a numerical prefix */ while ((ptr_curr = get_next_lilifstring(ptr_curr))) { sprintf(buffer, " %s", ptr_curr->token); if ((msg_temp = mstrcat(ptr_addresult->msg, buffer, &(ptr_addresult->msg_len), 0)) == NULL) { break; } else { ptr_addresult->msg = msg_temp; } } } /* clean up linked list */ delete_all_lilifstring(¬found_first); } /* end if ndb_notfound */ delete_all_lilimem(&sentinel); if (prev_authorconcat) { free(prev_authorconcat); } if (conv_descriptor) { iconv_close(conv_descriptor); } /* printf("retval went to %d, success went to %qu<<\n", retval, ptr_addresult->success); */ return retval; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ close_dbi_connections(): closes open connections in getbib() void close_dbi_connections struct BIBCONNS ptr_bibconns ptr to structure with connections const char* drivername ptr to string containing the dbi driver name ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static void close_dbi_connections(struct BIBCONNS* ptr_bibconns, const char* drivername) { if (ptr_bibconns->conn) { if (!strcmp(my_dbi_conn_get_cap(ptr_bibconns->conn, "multiple_db"), "t")) { dbi_conn_close(ptr_bibconns->conn); } else { /* printf("free conn\n"); */ dbi_conn_close(ptr_bibconns->conn); if (ptr_bibconns->conn_refdb) { /* printf("free conn_refdb\n"); */ dbi_conn_close(ptr_bibconns->conn_refdb); } if (ptr_bibconns->conn_source) { /* printf("free conn_source\n"); */ dbi_conn_close(ptr_bibconns->conn_source); } } } return; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ sort_entries_asis(): sorts refentries in a temporary table according to the original sequence in the document int sort_entries_asis returns 0 if ok, >0 if error dbi_conn conn dbi connection to the temporary table struct CLIENT_REQUEST* ptr_ptr_clrequest ptr to client request structure struct ADDRESULT* ptr_addresult ptr to structure that receives success info const char* table_name ptr to string containing the name of the temporary table to query ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int sort_entries_asis(dbi_conn conn, struct CLIENT_REQUEST* ptr_clrequest, struct ADDRESULT* ptr_addresult, const char* table_name) { char *id_string; char sql_command[256]; char sql_command1[256]; int n_mydistinct; unsigned long long n_id; dbi_result dbires; dbi_result dbires1; dbi_result dbires2; /* this is surprisingly the most difficult case. We have to sort by id, but then we can't use DISTINCT to filter out duplicates. Instead we retrieve a DISTINCT list of orig_ids and feed a second query with these. We retrieve all entries for each orig_id and sort them by id. The first of each will be assigned a sorted_pos value of 1 while all subsequent will be assigned 0. Finally we can retrieve all rows with a sorted_pos value greater 0 and sort this by id */ sprintf(sql_command, "SELECT DISTINCT entry_id FROM %s", table_name); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { append_return_msg(ptr_addresult, 234, NULL, conn); return 234; } /* loop over all distinct original IDs */ while (dbi_result_next_row(dbires)) { id_string = my_dbi_result_get_string_copy(dbires, "entry_id"); if (!id_string || !strcmp(id_string, "ERROR")) { append_return_msg(ptr_addresult, 234, NULL, conn); dbi_result_free(dbires); if (id_string) { free(id_string); } return 234; } sprintf(sql_command1, "SELECT id FROM %s where entry_id='%s' ORDER BY id ASC", table_name, id_string); LOG_PRINT(LOG_DEBUG, sql_command1); dbires1 = dbi_conn_query(conn, sql_command1); if (!dbires1) { append_return_msg(ptr_addresult, 234, NULL, conn); dbi_result_free(dbires); free(id_string); return 234; } n_mydistinct = 1; while (dbi_result_next_row(dbires1)) { n_id = my_dbi_result_get_idval(dbires1, "id"); /* set sorted_pos of the first copy to 1, of all subsequent copies to zero */ if (n_mydistinct) { sprintf(sql_command1, "UPDATE %s SET sorted_pos=1 WHERE id="ULLSPEC, table_name, (unsigned long long)n_id); n_mydistinct--; } else { sprintf(sql_command1, "UPDATE %s SET sorted_pos=0 WHERE id="ULLSPEC, table_name, (unsigned long long)n_id); } dbires2 = dbi_conn_query(conn, sql_command1); LOG_PRINT(LOG_DEBUG, sql_command1); if (!dbires2) { append_return_msg(ptr_addresult, 234, NULL, conn); dbi_result_free(dbires1); dbi_result_free(dbires); free(id_string); return 234; } dbi_result_free(dbires2); } /* end while sorted IDs */ dbi_result_free(dbires1); free(id_string); } /* end while distinct original IDs */ dbi_result_free(dbires); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ fill_in_authoryear_info(): fills info for author/year citation styles into a temporary table with reference info int fill_in_authoryear_info returns 0 if ok, >0 if error struct BIBCONNS* ptr_bibconns ptr to struct with connections dbi_result dbires result of a query containing all distinct references of the temporary table struct CLIENT_REQUEST* ptr_clrequest ptr to client request structure struct ADDRESULT* ptr_addresult ptr to structure that receives success info struct bibinfo* biblio_info ptr to structure containing info for formatting entries const char* table_name ptr to string containing the name of the temporary table to query struct mset* ptr_mset_sentinel ptr to bibliomset relation argument stack unsigned long long* nref_counter ptr to a reference counter struct xmlindent* ptr_indent indentation information int n_ref_format format of output type (REFXX) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int fill_in_authoryear_info(struct BIBCONNS* ptr_bibconns, dbi_result dbires, dbi_result dbires_cit, struct CLIENT_REQUEST* ptr_clrequest, struct ADDRESULT* ptr_addresult, struct bibinfo* biblio_info, const char* table_name, char* pubtype, struct mset* ptr_mset_sentinel, unsigned long long* nref_counter, struct xmlindent* ptr_indent, int n_ref_format) { int n_pubyear; int unique_count; size_t authorlist_buffer_len = 0; size_t sql_command_len = 0; int n_status; short title_as_author; char *id_string; char *authorlist_buffer; char *sql_command; char *new_sql_command; char suffix[17] = ""; const char *item; const char *drivername; dbi_result dbires1; dbi_result dbires2; dbi_result dbires3; drivername = dbi_driver_get_name(dbi_conn_get_driver(ptr_bibconns->conn)); sql_command_len = 1024; sql_command = malloc(sql_command_len); if (sql_command == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } /* loop over all distinct references to fill in the sorted_pos and the author_abbrevlist column */ while (dbi_result_next_row(dbires)) { (*nref_counter)++; /* will start at 1 as is common in bibliographies */ id_string = my_dbi_result_get_string_copy(dbires, "entry_id"); if (!id_string || !strcmp(id_string, "ERROR")) { append_return_msg(ptr_addresult, 234, NULL, ptr_bibconns->conn); if (id_string) { free(id_string); } free(sql_command); return 234; } sprintf(sql_command, "UPDATE %s SET sorted_pos="ULLSPEC" WHERE sorted_pos>0 AND entry_id='%s'", table_name, (unsigned long long)(*nref_counter), id_string); LOG_PRINT(LOG_DEBUG, sql_command); dbires1 = dbi_conn_query(ptr_bibconns->conn, sql_command); if (!dbires1) { append_return_msg(ptr_addresult, 234, NULL, ptr_bibconns->conn); free(id_string); free(sql_command); return 1; } dbi_result_free(dbires1); /* retrieve author information and format as a subseq in-text citation, fill into column */ biblio_info->n_refdb_id = my_dbi_result_get_idval(dbires, "orig_id"); biblio_info->entry_id = id_string; authorlist_buffer_len = 1; authorlist_buffer = malloc(authorlist_buffer_len); if (authorlist_buffer == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(id_string); free(sql_command); return 801; } authorlist_buffer[0] = '\0'; item = dbi_result_get_string(dbires, "dbname"); /* errflag = my_dbi_conn_error_flag(conn); */ /* printf("errflag2=%d\n", errflag); */ if (!strcmp(my_dbi_conn_get_cap(ptr_bibconns->conn, "multiple_db"), "t")) { ptr_bibconns->conn_source = ptr_bibconns->conn; /* make sure */ } else { /* need a connection to the source database */ ptr_bibconns->conn_source = connect_to_db(ptr_clrequest, item, 0); if (!ptr_bibconns->conn_source) { LOG_PRINT(LOG_WARNING, get_status_msg(204)); free(id_string); free(authorlist_buffer); free(sql_command); return 204; } } title_as_author = dbi_result_get_short(dbires, "title_as_author"); if ((n_status = format_entry(&authorlist_buffer, &authorlist_buffer_len, pubtype, ptr_bibconns, dbires_cit, NULL /* authorlist only */, item, ptr_clrequest->username, 0, ptr_mset_sentinel, biblio_info, title_as_author, ptr_clrequest->namespace, ptr_indent, n_ref_format, ptr_clrequest->pdfroot)) != 0) { append_return_msg(ptr_addresult, n_status, NULL, ptr_bibconns->conn); free(id_string); free(authorlist_buffer); free(sql_command); return n_status; } /* printf("authorlist_buffer:%s<< len:%d\n", authorlist_buffer, authorlist_buffer_len); */ if (strcmp(my_dbi_conn_get_cap(ptr_bibconns->conn, "multiple_db"), "t")) { dbi_conn_close(ptr_bibconns->conn_source); ptr_bibconns->conn_source = NULL; } if (dbi_conn_quote_string(ptr_bibconns->conn, &authorlist_buffer) == 0) { append_return_msg(ptr_addresult, 801, NULL, ptr_bibconns->conn); free(id_string); free(authorlist_buffer); free(sql_command); return 801; } /* authorlist_buffer_len is no longer valid at this point */ /* increase buffer size if necessary */ if (strlen(authorlist_buffer)+256 > sql_command_len) { sql_command_len = strlen(authorlist_buffer)+256; new_sql_command = (char*)realloc(sql_command, sql_command_len); if (!new_sql_command) { append_return_msg(ptr_addresult, 801, NULL, NULL); free(id_string); free(authorlist_buffer); free(sql_command); return 801; } else { sql_command = new_sql_command; } } sprintf(sql_command, "UPDATE %s SET author_abbrevlist=%s WHERE entry_id='%s'", table_name, authorlist_buffer, biblio_info->entry_id); LOG_PRINT(LOG_DEBUG, sql_command); dbires1 = dbi_conn_query(ptr_bibconns->conn, sql_command); if (!dbires1) { append_return_msg(ptr_addresult, 241, NULL, ptr_bibconns->conn); free(id_string); free(authorlist_buffer); free(sql_command); return 241; } dbi_result_free(dbires1); free(id_string); free(authorlist_buffer); } /* end loop over all distinct references */ /* select all unique author_abbrevlists */ sprintf(sql_command, "SELECT DISTINCT author_abbrevlist,pubyear, sorted_pos FROM %s WHERE sorted_pos>0 ORDER BY sorted_pos", table_name); LOG_PRINT(LOG_DEBUG, sql_command); dbires1 = dbi_conn_query(ptr_bibconns->conn, sql_command); if (!dbires1) { append_return_msg(ptr_addresult, 234, NULL, ptr_bibconns->conn); free(sql_command); return 234; } /* loop over all abbrevlists */ while (dbi_result_next_row(dbires1)) { item = my_dbi_result_get_string_copy(dbires1, "author_abbrevlist"); n_pubyear = dbi_result_get_ushort(dbires1, "pubyear"); /* quote item */ if (dbi_conn_quote_string(ptr_bibconns->conn, (char**)&item) == 0) { append_return_msg(ptr_addresult, 241, NULL, ptr_bibconns->conn); free(sql_command); free((char*)item); return 241; } /* increase buffer size if necessary */ if (strlen(item)+256 > sql_command_len) { sql_command_len = strlen(item)+256; new_sql_command = (char*)realloc(sql_command, sql_command_len); if (!new_sql_command) { append_return_msg(ptr_addresult, 801, NULL, NULL); dbi_result_free(dbires1); free(sql_command); free((char*)item); return 801; } else { sql_command = new_sql_command; } } sprintf(sql_command, "SELECT DISTINCT entry_id,sorted_pos FROM %s WHERE author_abbrevlist=%s AND pubyear=%d AND sorted_pos>0 ORDER BY sorted_pos", table_name, item, n_pubyear); LOG_PRINT(LOG_DEBUG, sql_command); free((char*)item); dbires2 = dbi_conn_query(ptr_bibconns->conn, sql_command); if (!dbires2) { append_return_msg(ptr_addresult, 234, NULL, ptr_bibconns->conn); dbi_result_free(dbires1); free(sql_command); return 234; } if (dbi_result_get_numrows(dbires2) > 1) { /* more than one entry with identical author/year combo */ /* add a unique suffix to each entry */ unique_count = 1; /* todo: was 0 */ *suffix = '\0'; /* reset suffix to empty string */ while (dbi_result_next_row(dbires2)) { if (unique_count > 0) { if (increment_suffix(suffix, 16, 0)) { append_return_msg(ptr_addresult, 804, NULL, ptr_bibconns->conn); dbi_result_free(dbires2); dbi_result_free(dbires1); free(sql_command); return 804; } /* printf("suffix went to %s<<\n", suffix); */ id_string = my_dbi_result_get_string_copy(dbires2, "entry_id"); if (!id_string || !strcmp(id_string, "ERROR")) { append_return_msg(ptr_addresult, 234, NULL, ptr_bibconns->conn); dbi_result_free(dbires2); dbi_result_free(dbires1); if (id_string) { free(id_string); } free(sql_command); return 234; } sprintf(sql_command, "UPDATE %s SET year_uni_suffix='%s' WHERE entry_id='%s'", table_name, suffix, id_string); LOG_PRINT(LOG_DEBUG, sql_command); dbires3 = dbi_conn_query(ptr_bibconns->conn, sql_command); if (!dbires3) { append_return_msg(ptr_addresult, 241, NULL, ptr_bibconns->conn); dbi_result_free(dbires2); dbi_result_free(dbires1); free(id_string); free(sql_command); return 241; } dbi_result_free(dbires3); free(id_string); } unique_count++; } } dbi_result_free(dbires2); } dbi_result_free(dbires1); free(sql_command); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ getid(): retrieve id and database from an (uppercased) id string will also retrieve id for multiple citations The id string format is: [dbname-]IDcitekey char* getid returns the id part of the string or NULL if the string is not a valid refdb citation string char* idstring the string to be examined char** db ptr to a string ptr. This will be filled in with a ptr to the database part of the idstring. This will be NULL if the string is invalid or if no database is specified int* type ptr to an int that will be set according to the id type 0=regular citation 1=first in citation with multiple xrefs ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* getid(char* idstring, char** db, int* type) { char* start_refdb; char* start_id; int n_speclen; /* length of the ID or whatever string */ *type = 0; /* try to find either "-ID", "ID", or "IM" */ /* start with "-ID" to prevent finding database names containing "ID" */ start_refdb = strstr(idstring, "-ID"); if (start_refdb == NULL) { start_refdb = strstr(idstring, "ID"); if (start_refdb == NULL) { /* the IM stuff is a free form link name that never carries a database name, so looking for IM alone is sufficient */ start_refdb = strstr(idstring, "IM"); if (start_refdb == NULL) { *db = NULL; return NULL; /* not a refdb citation string */ } else { (*type)++; n_speclen = 2; } } else { n_speclen = 2; } } else { n_speclen = 3; } if (start_refdb == idstring) { *db = NULL; /* no database specified (will use default)*/ start_id = idstring+n_speclen; } else { *(start_refdb) = '\0'; *db = idstring; /* database specified */ start_id = start_refdb+n_speclen; } /* if (!*type) { */ /* id sanity check will discard all non-numeric characters after ID */ /* end_string = start_id + strlen(start_id); */ /* stop_id = start_id; */ /* while (stop_id <= end_string) { */ /* if (!isdigit((int)(*stop_id))) { */ /* break; */ /* } */ /* stop_id++; */ /* } */ /* *stop_id = '\0'; */ /* } */ /* else do nothing: the multiple citation id may be non-numeric */ if (!(*start_id)) { return NULL; } else { return start_id; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_bibtex_id(): retrieve id and database from a bibtex id string The id string format is: [dbname:]citekey char* get_bibtex_id returns the id part of the string or NULL if the string is not a valid refdb citation string char* idstring the string to be examined char** db ptr to a string ptr. This will be filled in with a ptr to the database part of the idstring. This will be NULL if the string is invalid or if no database is specified ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* get_bibtex_id(char* idstring, char** db) { char* start_refdb; char* start_id; /* try to find a colon */ start_refdb = strchr(idstring, (int)':'); if (start_refdb == NULL) { /* no database part */ *db = NULL; if (*idstring == '\0') { /* empty string, no id either */ return NULL; } return idstring; } else { *(start_refdb) = '\0'; *db = idstring; /* database specified */ start_id = start_refdb+1; return start_id; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ addstyle(): implements the client command addstyle int addstyle returns 0 if ok, 1 if failed struct CLIENT_REQUEST* ptr_clrequest ptr to structure with client info struct ADDRESULT* addresult this structure will be filled in with the number of (un-)successfully added/updated styles ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int addstyle(struct CLIENT_REQUEST* ptr_clrequest, struct ADDRESULT* ptr_addresult) { XML_Parser p; dbi_conn conn; char *return_msg = NULL; /* string to hold a return message for the client */ int nmem_error; int ndb_error; int read_xml_res; /* result of read_xml */ int depth; /* the current depth of the element stack */ int depth_adjust; /* 0 if citestyle, 1 if styleset */ int position; /* position of an element in PUBTYPE or INTEXTDEF */ int set_count; /* number of finished CITESTYLE elements */ unsigned int citstyle_id; /* id of the current CITSTYLE element */ unsigned int refstyle_id; /* id of the current REFSTYLE element */ unsigned int separator_id; /* id of the current SEPARATORS element */ struct elstack *ptr_first; /* start of the element stack */ char the_journal[256]; /* current journal name */ struct addstyle_data asdata; /* get some memory for a return message */ return_msg = malloc((size_t)256); if (return_msg == NULL) { /* out of memory */ send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } /* connect to database server*/ if ((conn = connect_to_db(ptr_clrequest, NULL, 0)) == NULL) { /* access denied to reference database */ LOG_PRINT(LOG_WARNING, get_status_msg(204)); send_status(ptr_clrequest->fd, 204, TERM_NO); free(return_msg); return 1; } /* this global should not be reset in the loop */ set_count = 0; send_status(ptr_clrequest->fd, 0, TERM_NO); while (1) { /* leave with return or break */ /* initialize "globals" */ nmem_error = 0; ndb_error = 0; citstyle_id = 0; refstyle_id = 0; separator_id = 0; ptr_first = NULL; depth_adjust = 0; depth = 0; position = 0; asdata.ptr_nmem_error = &nmem_error; asdata.ptr_ndb_error = &ndb_error; asdata.ptr_depth = &depth; asdata.ptr_depth_adjust = &depth_adjust; asdata.ptr_position = &position; asdata.ptr_set_count = &set_count; asdata.ptr_citstyle_id = &citstyle_id; asdata.ptr_refstyle_id = &refstyle_id; asdata.ptr_separator_id = &separator_id; asdata.ptr_first = ptr_first; asdata.the_journal = the_journal; asdata.conn = conn; asdata.ptr_addresult = ptr_addresult; /* create the parser instance */ p = XML_ParserCreate(NULL); if (!p) { /* out of memory */ LOG_PRINT(LOG_CRIT, get_status_msg(801)); send_status(ptr_clrequest->fd, 801, TERM_NO); dbi_conn_close(conn); free(return_msg); return 2; } /* register our handlers. these handlers will be called whenever expat finds a start- or endtag or character data */ XML_SetElementHandler(p, start_handler, end_handler); XML_SetCharacterDataHandler(p, char_handler); /* make pointer to "global data" available for handlers */ XML_SetUserData(p, (void*)&asdata); read_xml_res = read_xml(ptr_clrequest->fd, p, ptr_addresult); XML_ParserFree(p); if (read_xml_res == 0 || read_xml_res == 2) { /* error */ delete_list(ptr_first); ptr_addresult->failure += 1; /* try to remove the data that already went into the db */ remove_style(conn, citstyle_id); if (read_xml_res == 0) { break; } /* else: try next */ /* dbi_conn_close(conn); */ /* return 2; */ } else if (read_xml_res == -1) { /* we're done */ break; } } /* send report to client */ /* send_status(ptr_clrequest->fd, 0, TERM_NO); */ tiwrite(ptr_clrequest->fd, ptr_addresult->msg, TERM_YES); ptr_addresult->success = set_count; dbi_conn_close(conn); free(return_msg); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ deletestyle(): implements the client command deletestyle int deletestyle returns >0 if failed, 0 if successful struct CLIENT_REQUEST* ptr_clrequest ptr to structure with client info struct ADDRESULT* addresult this structure will be filled in with the number of (un-)successfully deleted styles ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ int deletestyle(struct CLIENT_REQUEST* ptr_clrequest, struct ADDRESULT* ptr_addresult) { dbi_conn conn; dbi_result dbires; dbi_driver driver; unsigned int n_id; char* sql_command = NULL; char* myarg; char* new_msg; struct lilimem sentinel; sentinel.ptr_mem = NULL; sentinel.ptr_next = NULL; sentinel.varname[0] = '\0'; /* get some memory for sql commands */ sql_command = malloc((size_t)512); if (sql_command == NULL || insert_lilimem(&sentinel, (void**)&sql_command, NULL)) { delete_all_lilimem(&sentinel); send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } /* connect to database server*/ if ((conn = connect_to_db(ptr_clrequest, NULL, 0)) == NULL) { /* printf("connect_to_db failed\n"); */ send_status(ptr_clrequest->fd, 202, TERM_NO); LOG_PRINT(LOG_WARNING, get_status_msg(202)); delete_all_lilimem(&sentinel); return 1; } driver = dbi_conn_get_driver(conn); myarg = strdup(ptr_clrequest->argument); if (!myarg || insert_lilimem(&sentinel, (void**)&myarg, NULL)) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); delete_all_lilimem(&sentinel); dbi_conn_close(conn); return 1; } if (dbi_conn_quote_string(conn, &myarg) == 0) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); delete_all_lilimem(&sentinel); dbi_conn_close(conn); return 1; } sprintf(sql_command, "SELECT ID,JOURNAL FROM CITSTYLE WHERE JOURNAL %s %s", my_dbi_conn_get_cap(conn, "rlike"), myarg); dbires = dbi_conn_query(conn, sql_command); LOG_PRINT(LOG_DEBUG, sql_command); if (!dbires) { send_status(ptr_clrequest->fd, 234, TERM_NO); LOG_PRINT(LOG_WARNING, get_status_msg(234)); delete_all_lilimem(&sentinel); dbi_conn_close(conn); return 1; } *sql_command = '\0'; if (!dbi_result_get_numrows(dbires)) { sprintf(sql_command, "417:%s\n", ptr_clrequest->argument); ptr_addresult->skipped++; if ((new_msg = mstrcat(ptr_addresult->msg, sql_command, &(ptr_addresult->msg_len), 0)) == NULL) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); delete_all_lilimem(&sentinel); dbi_conn_close(conn); return 1; } else { ptr_addresult->msg = new_msg; } } else { while (dbi_result_next_row(dbires)) { char *stylename; n_id = my_dbi_result_get_int_idval(dbires, "ID"); stylename = my_dbi_result_get_string_copy(dbires, "JOURNAL"); if (!remove_style(conn, n_id)) { sprintf(sql_command, "419:%u:%s\n", n_id, (stylename) ? stylename:""); ptr_addresult->success++; } else { sprintf(sql_command, "420:%u:%s\n", n_id, (stylename) ? stylename:""); ptr_addresult->failure++; } if (stylename) { free(stylename); } if ((new_msg = mstrcat(ptr_addresult->msg, sql_command, &(ptr_addresult->msg_len), 0)) == NULL) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); delete_all_lilimem(&sentinel); dbi_conn_close(conn); return 1; } else { ptr_addresult->msg = new_msg; } } } /* send back report to client */ send_status(ptr_clrequest->fd, 0, TERM_NO); tiwrite(ptr_clrequest->fd, ptr_addresult->msg, TERM_YES); dbi_conn_close(conn); delete_all_lilimem(&sentinel); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ liststyle(): implements the client command liststyle int liststyle returns 0 if ok, >0 if failed struct CLIENT_REQUEST* ptr_clrequest ptr to structure with client info struct ADDRESULT* addresult structure with counters ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int liststyle(struct CLIENT_REQUEST* ptr_clrequest, struct ADDRESULT* ptr_addresult) { char sql_command[256]; const char* journal; const char* drivername; char *myarg; dbi_conn conn; dbi_result dbires; dbi_driver driver; /* connect to the database */ if ((conn = connect_to_db(ptr_clrequest, main_db, 0)) != NULL) { driver = dbi_conn_get_driver(conn); drivername = dbi_driver_get_name(dbi_conn_get_driver(conn)); if (ptr_clrequest->argument && *(ptr_clrequest->argument)) { myarg = strdup(ptr_clrequest->argument); } else { myarg = strdup(my_dbi_driver_get_cap(driver, "listall")); /* list all if no argument */ } if (!myarg) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); send_status(ptr_clrequest->fd, 801, TERM_NO); return 1; } if (dbi_conn_quote_string(conn, &myarg) == 0) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); send_status(ptr_clrequest->fd, 801, TERM_NO); dbi_conn_close(conn); return 1; } sprintf(sql_command, "SELECT JOURNAL FROM CITSTYLE WHERE JOURNAL %s %s", my_dbi_conn_get_cap(conn, "rlike"), myarg); free(myarg); dbires = dbi_conn_query(conn, sql_command); LOG_PRINT(LOG_DEBUG, sql_command); if (dbires) { send_status(ptr_clrequest->fd, 0, TERM_NO); while (dbi_result_next_row(dbires)) { journal = my_dbi_result_get_string_idx(dbires, 1); if (journal) { tiwrite(ptr_clrequest->fd, journal, TERM_NO); tiwrite(ptr_clrequest->fd, "\n", TERM_NO); ptr_addresult->success++; } else { ptr_addresult->failure++; } } dbi_result_free(dbires); tiwrite(ptr_clrequest->fd, "", TERM_YES); } dbi_conn_close(conn); } else { LOG_PRINT(LOG_WARNING, get_status_msg(202)); send_status(ptr_clrequest->fd, 202, TERM_NO); return 1; } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ getstyle(): implements the client command getstyle int getstyle returns 0 if ok, 1 if mem error, 2 if other error struct CLIENT_REQUEST* ptr_clrequest ptr to structure with client info struct ADDRESULT* ptr_addresult ptr to struct which receives the number of styles ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int getstyle(struct CLIENT_REQUEST* ptr_clrequest, struct ADDRESULT* ptr_addresult) { char header[80]; char *sql_command; const char *encoding; dbi_conn conn; dbi_result dbires; dbi_result dbires_ref; dbi_driver driver; int n_have_styleset = 0; unsigned int citstyle_id; unsigned int refstyle_id; Lilimem sentinel; Liliform attr_sentinel; sentinel.ptr_mem = NULL; sentinel.ptr_next = NULL; sentinel.varname[0] = '\0'; attr_sentinel.ptr_next = NULL; attr_sentinel.name[0] = '\0'; attr_sentinel.value = NULL; if ((sql_command = malloc(1024)) == NULL || insert_lilimem(&sentinel, (void**)&sql_command, NULL)) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); send_status(ptr_clrequest->fd, 801, TERM_NO); return 1; } /* strategy to get styles: - write header with container start markup - loop over all journal names - write style info - loop over all publication types - write style info - write citstyle info - write footer with container end markup */ send_status(ptr_clrequest->fd, 000, TERM_NO); /* connect to main database */ if ((conn = connect_to_db(ptr_clrequest, main_db, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(202)); return 1; } driver = dbi_conn_get_driver(conn); /* assemble processing instruction */ encoding = dbi_conn_get_encoding(conn); snprintf(header, 80, "\n", encoding); /* write processing instruction */ if (tiwrite(ptr_clrequest->fd, header, TERM_NO) == -1) { LOG_PRINT(LOG_WARNING, get_status_msg(110)); delete_all_lilimem(&sentinel); dbi_conn_close(conn); return 1; } /* write doctype line */ if (ptr_clrequest->inargc - *(ptr_clrequest->ptr_optind) > 0) { /* write STYLESET element*/ n_have_styleset++; if (tiwrite(ptr_clrequest->fd, DOCTYPE_STYLESET, TERM_NO) == -1) { LOG_PRINT(LOG_WARNING, get_status_msg(110)); delete_all_lilimem(&sentinel); dbi_conn_close(conn); return 2; } iwrite_elstart(ptr_clrequest, "STYLESET", NULL, 0); } else { /* no tokens found */ LOG_PRINT(LOG_WARNING, get_status_msg(111)); delete_all_lilimem(&sentinel); dbi_conn_close(conn); return 2; } /* loop over all requested styles */ for (; *(ptr_clrequest->ptr_optind) < ptr_clrequest->inargc; (*(ptr_clrequest->ptr_optind))++) { sprintf(sql_command, "SELECT ID,JOURNAL,AUTHOR,COMMENT,URL,CITSEPARATOR,FOLLOWING,PRECEEDING,RANGESEPARATOR,BIBLIOTITLE,INTEXTSEQUENCE,BIBLIOSEQUENCE,BIBLIOFIRSTINDENT,BIBLIOBLOCKINDENT,FONTSIZE,STYLE,JANABBREV,FEBABBREV,MARABBREV,APRABBREV,MAYABBREV,JUNABBREV,JULABBREV,AUGABBREV,SEPABBREV,OCTABBREV,NOVABBREV,DECABBREV,JANFULL,FEBFULL,MARFULL,APRFULL,MAYFULL,JUNFULL,JULFULL,AUGFULL,SEPFULL,OCTFULL,NOVFULL,DECFULL,JANTHREELET,FEBTHREELET,MARTHREELET,APRTHREELET,MAYTHREELET,JUNTHREELET,JULTHREELET,AUGTHREELET,SEPTHREELET,OCTTHREELET,NOVTHREELET,DECTHREELET FROM CITSTYLE WHERE JOURNAL='%s'", (ptr_clrequest->inargv)[*(ptr_clrequest->ptr_optind)]); dbires = dbi_conn_query(conn, sql_command); LOG_PRINT(LOG_DEBUG, sql_command); if (dbires) { while (dbi_result_next_row(dbires)) { /* should run only once */ citstyle_id = my_dbi_result_get_int_idval(dbires, "ID"); /* start citestyle */ iwrite_elstart(ptr_clrequest, "CITESTYLE", NULL, 0); /* output style name */ iwrite_element(ptr_clrequest, "STYLENAME", NULL, my_dbi_result_get_string(dbires, "JOURNAL")); /* output style author */ iwrite_element(ptr_clrequest, "AUTHOR", NULL, my_dbi_result_get_string(dbires, "AUTHOR")); /* output style comment */ iwrite_element(ptr_clrequest, "COMMENT", NULL, my_dbi_result_get_string(dbires, "COMMENT")); /* output style url */ iwrite_element(ptr_clrequest, "URL", NULL, my_dbi_result_get_string(dbires, "URL")); /* start refstyle block */ iwrite_elstart(ptr_clrequest, "REFSTYLE", NULL, 0); /* loop over all publication types */ sprintf(sql_command, "SELECT ID,PUBTYPE FROM REFSTYLE WHERE CITSTYLEID=%u AND PUBTYPE!=\'INTEXT\' AND PUBTYPE!=\'AUTHORONLY\' AND PUBTYPE!=\'YEARONLY\'", citstyle_id); dbires_ref = dbi_conn_query(conn, sql_command); LOG_PRINT(LOG_DEBUG, sql_command); if (dbires_ref) { while (dbi_result_next_row(dbires_ref)) { refstyle_id = my_dbi_result_get_int_idval(dbires_ref, "ID"); iwrite_pubtype(ptr_clrequest, my_dbi_result_get_string(dbires_ref, "PUBTYPE"), citstyle_id, conn); } } dbi_result_free(dbires_ref); /* end refstyle block */ iwrite_elend(ptr_clrequest, "REFSTYLE"); /* begin citstyle block */ if (insert_liliform(&attr_sentinel, "INTEXTSEQUENCE", (char*)my_dbi_result_get_string(dbires, "INTEXTSEQUENCE"))) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); ptr_addresult->failure++; break; } if (insert_liliform(&attr_sentinel, "STYLE", (char*)my_dbi_result_get_string(dbires, "STYLE"))) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); delete_all_liliform(&attr_sentinel); ptr_addresult->failure++; break; } iwrite_elstart(ptr_clrequest, "CITSTYLE", &attr_sentinel, 0); delete_all_liliform(&attr_sentinel); /* preceeding */ iwrite_element(ptr_clrequest, "PRECEEDING", NULL, my_dbi_result_get_string(dbires, "PRECEEDING")); /* following */ iwrite_element(ptr_clrequest, "FOLLOWING", NULL, my_dbi_result_get_string(dbires, "FOLLOWING")); /* citseparator */ iwrite_element(ptr_clrequest, "CITSEPARATOR", NULL, my_dbi_result_get_string(dbires, "CITSEPARATOR")); /* rangeseparator */ iwrite_element(ptr_clrequest, "RANGESEPARATOR", NULL, my_dbi_result_get_string(dbires, "RANGESEPARATOR")); /* intextdef */ iwrite_pubtype(ptr_clrequest, "INTEXTDEF", citstyle_id, conn); /* authoronly */ iwrite_pubtype(ptr_clrequest, "AUTHORONLY", citstyle_id, conn); /* yearonly */ iwrite_pubtype(ptr_clrequest, "YEARONLY", citstyle_id, conn); /* end citstyle block */ iwrite_elend(ptr_clrequest, "CITSTYLE"); /* begin bibstyle block */ if (insert_liliform(&attr_sentinel, "BIBLIOSEQUENCE", (char*)my_dbi_result_get_string(dbires, "BIBLIOSEQUENCE"))) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); delete_all_liliform(&attr_sentinel); ptr_addresult->failure++; break; } if (insert_liliform(&attr_sentinel, "BIBLIOFIRSTINDENT", (char*)my_dbi_result_get_string(dbires, "BIBLIOFIRSTINDENT"))) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); delete_all_liliform(&attr_sentinel); ptr_addresult->failure++; break; } if (insert_liliform(&attr_sentinel, "BIBLIOBLOCKINDENT", (char*)my_dbi_result_get_string(dbires, "BIBLIOBLOCKINDENT"))) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); delete_all_liliform(&attr_sentinel); ptr_addresult->failure++; break; } if (insert_liliform(&attr_sentinel, "FONTSIZE", (char*)my_dbi_result_get_string(dbires, "FONTSIZE"))) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); delete_all_liliform(&attr_sentinel); ptr_addresult->failure++; break; } iwrite_elstart(ptr_clrequest, "BIBSTYLE", &attr_sentinel, 0); delete_all_liliform(&attr_sentinel); /* bibliotitle */ iwrite_element(ptr_clrequest, "BIBLIOTITLE", NULL, my_dbi_result_get_string(dbires, "BIBLIOTITLE")); /* months block */ iwrite_months(ptr_clrequest, dbires); /* end bibstyle block */ iwrite_elend(ptr_clrequest, "BIBSTYLE"); /* end citestyle */ iwrite_elend(ptr_clrequest, "CITESTYLE"); } dbi_result_free(dbires); ptr_addresult->success++; } /* end if style exists */ else { ptr_addresult->skipped++; } } /* end for loop over all tokens */ dbi_conn_close(conn); if (n_have_styleset) { tiwrite(ptr_clrequest->fd, "\n", TERM_YES); } delete_all_lilimem(&sentinel); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ read_xml() reads XML data from a client connection and sends them to an XML parser int read_xml returns 0 if failed, 1 if ok, -1 if ok and the client signals that no more files will be sent, 2 if failed but more files are to come int fd file descriptor for output XML_Parser p the XML parser struct ADDRESULT* ptr_addresult pointer to a structure that will receive some result information ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int read_xml(int fd, XML_Parser p, struct ADDRESULT* ptr_addresult) { int numbyte; int n_requested_bufsize; int n_parse_error = 0; int chunk_count = 0; int cs_status; char return_msg[256]; char inbuffer[COMMAND_INBUF_LEN]; /* buffer for client commands */ char* style_set = NULL; char* new_style_set; style_set = malloc((size_t)1); if (style_set == NULL) { /* out of memory */ send_status(fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 0; } /* loop until the client requests a buffer size of zero indicating that he's done sending datasets */ do { /* ------------------------------------------------------------ */ /* PHASE 1 */ /* see how much memory we'll need */ cs_status = read_status(fd); if (cs_status == 402 || cs_status == 404) { /* dataset is done, let parser finish */ LOG_PRINT(LOG_INFO, get_status_msg(cs_status)); if (! XML_Parse(p, style_set, 0, 1)) { send_status(fd, 400, TERM_NO); LOG_PRINT(LOG_WARNING, "XML parse error"); sprintf(return_msg, "Parse error at line "ULLSPEC":\n%s\n", (unsigned long long)XML_GetCurrentLineNumber(p), XML_ErrorString(XML_GetErrorCode(p))); tiwrite(fd, return_msg, TERM_YES); if (cs_status == 404) { return 2; } else { return 0; } } free(style_set); send_status(fd, 403, TERM_NO); LOG_PRINT(LOG_INFO, get_status_msg(403)); if (cs_status == 404) { return 1; /* dataset is done, but there's more to come */ } else { /* 402 */ return -1; /* last dataset is done */ } } else if (cs_status) { LOG_PRINT(LOG_WARNING, get_status_msg(cs_status)); free(style_set); return 0; } /* client sends the number of bytes he wants to transmit */ numbyte = tread(fd, inbuffer, 10); if (numbyte == -1) { LOG_PRINT(LOG_WARNING, get_status_msg(109)); free(style_set); return 0; } /* the size of the chunk the client wants to send */ n_requested_bufsize = atoi(inbuffer); /* printf("inbuffer: %s\nbufsize: %d\n", inbuffer, n_requested_bufsize); */ /* ------------------------------------------------------------ */ /* PHASE 2 */ /* send back reply */ /* try to get a buffer large enough to hold the reference if n_requested_bufsize == 0, then this command equals free() */ /* do explicit free() to allow debugging with efence */ if (n_requested_bufsize) { new_style_set = (char*)realloc(style_set, (size_t)n_requested_bufsize); } else { free(style_set); new_style_set = NULL; } if (new_style_set == NULL && n_requested_bufsize) { send_status(fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(style_set); return 0; } else { style_set = new_style_set; } /* read the data proper unless size was zero (= end of transmission) */ if (n_requested_bufsize) { /* acknowledge that we have a buffer ready, let them data come... */ send_status(fd, 0, TERM_NO); /* ------------------------------------------------------------ */ /* PHASE 3 */ /* read dataset */ numbyte = iread(fd, style_set, n_requested_bufsize); /* printf("requested: %d\nread: %d\n%c%c%c%c%c\n", n_requested_bufsize, numbyte, style_set[0], style_set[1], style_set[2], style_set[3], style_set[4]); */ if (numbyte == -1) { LOG_PRINT(LOG_WARNING, get_status_msg(109)); free(style_set); return 0; } /* ------------------------------------------------------------ */ /* PHASE 4 */ /* send back message */ /* split style into elements and squeeze contents into database */ if (! XML_Parse(p, style_set, numbyte, 0)) { send_status(fd, 400, TERM_NO); LOG_PRINT(LOG_WARNING, "XML parse error"); sprintf(return_msg, "Parse error at line "ULLSPEC" column "ULLSPEC":\n%s\n", (unsigned long long)XML_GetCurrentLineNumber(p), (unsigned long long)XML_GetCurrentColumnNumber(p), XML_ErrorString(XML_GetErrorCode(p))); tiwrite(fd, return_msg, TERM_YES); ptr_addresult->failure++; free(style_set); return 0; } else { /* ptr_addresult->success++; */ send_status(fd, 403, TERM_NO); LOG_PRINT(LOG_INFO, get_status_msg(403)); } chunk_count++; } else { /* client is done sending data, let parser close */ if (! XML_Parse(p, style_set, 0, 1)) { send_status(fd, 400, TERM_NO); LOG_PRINT(LOG_WARNING, "XML parse error"); sprintf(return_msg, "Parse error at line "ULLSPEC":\n%s\n", (unsigned long long)XML_GetCurrentLineNumber(p), XML_ErrorString(XML_GetErrorCode(p))); tiwrite(fd, return_msg, TERM_YES); n_parse_error = 1; } } } while (n_requested_bufsize); if (style_set) { free(style_set); } if (n_parse_error) { return 0; } else { return 1; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ remove_style(): removes a style specification from the database int remove_style returns 0 if successful, >0 in case of an error dbi_conn conn ptr to a structure holding the dbi connection information unsigned int n_id the ID in CITSTYLE which is to be removed ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int remove_style(dbi_conn conn, unsigned int n_id) { char sql_command[256]; int error_count = 0; unsigned int n_id1; unsigned int n_id2; dbi_result dbires; dbi_result dbires1; dbi_result dbires2; if (!n_id) { return 1; } sprintf(sql_command, "SELECT ID FROM REFSTYLE WHERE CITSTYLEID=%u", n_id); dbires = dbi_conn_query(conn, sql_command); LOG_PRINT(LOG_DEBUG, sql_command); if (!dbires) { return 1; } while (dbi_result_next_row(dbires)) { n_id1 = my_dbi_result_get_int_idval(dbires, "ID"); if (!n_id1) { error_count++; dbi_result_free(dbires); continue; } sprintf(sql_command, "SELECT SEPARATORS.ID FROM SEPARATORS INNER JOIN POSITIONS ON POSITIONS.SEPARATORID=SEPARATORS.ID WHERE POSITIONS.REFSTYLEID=%u", n_id1); dbires1 = dbi_conn_query(conn, sql_command); LOG_PRINT(LOG_DEBUG, sql_command); if (!dbires1) { error_count++; dbi_result_free(dbires); continue; } while (dbi_result_next_row(dbires1)) { n_id2 = my_dbi_result_get_int_idval_idx(dbires1, 1); if (!n_id2) { error_count++; dbi_result_free(dbires); continue; } sprintf(sql_command, "DELETE FROM SEPARATORS WHERE ID=%u", n_id2); dbires2 = dbi_conn_query(conn, sql_command); LOG_PRINT(LOG_DEBUG, sql_command); if (!dbires2) { error_count++; } else { dbi_result_free(dbires2); } } sprintf(sql_command, "DELETE FROM POSITIONS WHERE REFSTYLEID=%u", n_id1); dbires2 = dbi_conn_query(conn, sql_command); LOG_PRINT(LOG_DEBUG, sql_command); if (!dbires2) { error_count++; } dbi_result_free(dbires2); sprintf(sql_command, "DELETE FROM REFSTYLE WHERE ID=%u", n_id1); dbires2 = dbi_conn_query(conn, sql_command); LOG_PRINT(LOG_DEBUG, sql_command); if (!dbires2) { error_count++; } dbi_result_free(dbires2); dbi_result_free(dbires1); } sprintf(sql_command, "DELETE FROM CITSTYLE WHERE ID=%u", n_id); dbires1 = dbi_conn_query(conn, sql_command); LOG_PRINT(LOG_DEBUG, sql_command); if (!dbires1) { error_count++; } dbi_result_free(dbires1); dbi_result_free(dbires); /* printf("done remove_style()\n"); */ return error_count; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ check_is_subseq(): checks whether a citation is the first or a subsequent in the document int check_is_subseq returns -1 in case of an error, 0 if first, 1 if subsequent const char* author_concat ptr to the author_concat const char* table_name name of the table that contains author_concat data int n_currpos current position of citation int n_pubyear publication year dbi_conn conn ptr to an existing connection to the refdb database ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int check_is_subseq(const char* author_concat, const char* table_name, int n_currpos, short int n_pubyear, dbi_conn conn) { char* author_concat_q; char* sql_command; int n_is_subseq = 0; dbi_result dbires; if (!author_concat || !*author_concat) { /* nothing to do */ return 0; } if ((author_concat_q = strdup(author_concat)) == NULL || dbi_conn_quote_string(conn, &author_concat_q) == 0) { return -1; } if ((sql_command = malloc(strlen(author_concat_q)+256)) == NULL) { free(author_concat_q); return -1; } sprintf(sql_command, "SELECT id FROM %s WHERE sorted_pos>0 AND sorted_pos < %d AND author_concat=%s AND pubyear=%d", table_name, n_currpos, author_concat_q, n_pubyear); free(author_concat_q); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); free(sql_command); if (!dbires) { return -1; } if (dbi_result_get_numrows(dbires)) { n_is_subseq = 1; } else { n_is_subseq = 0; } dbi_result_free(dbires); return n_is_subseq; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ send_stylespec(): sends a style specification to the client; the DSSSL driver file contains code for both html and print; the xsl driver file needs postprocessing to insert the proper path to a stylesheet static int send_stylespec returns 0 if successful, >0 if error int fd file descriptor for output dbi_conn conn ptr to an existing connection to the refdb database char* format_string name of the style to retrieve (properly quoted please) int n_ref_format requested output format: REFDOCBK, REFDOCBKX, REFTEIX ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int send_stylespec(int fd, dbi_conn conn, char* format_string, int n_ref_format) { dbi_result dbires_ref; dbi_result dbires_cit; int numbyte; /* number of bytes read or written */ unsigned int i; /* guess what */ int haverow; unsigned int n_id; size_t sql_command_len = 2048; char *sql_command; /* buffer for assembling SQL commands */ char outbuffer[512]; /* buffer for assembling output */ const char *item; const char *item_pubtype; const char *drivername; const char *bibliofirstindent; const char *biblioblockindent; const char *fontsize; /* this array of strings contains part of the variable names in the output file (the column names in the database) */ char tags[][50] = { "AUTHORLISTSTYLE", "EDITORLISTSTYLE", "SEDITORLISTSTYLE", "ALLALISTSTYLE", "AUTHORLISTALTERNATESTYLE", "EDITORLISTALTERNATESTYLE", "SEDITORLISTALTERNATESTYLE", "ALLALISTALTERNATESTYLE", "PUBDATESTYLE", "PUBDATESECSTYLE", "PUBDATEALLSTYLE", "TITLESTYLE", "BOOKTITLESTYLE", "SERIESTITLESTYLE", "ALLTITLESTYLE", "JOURNALNAMESTYLE", "VOLUMESTYLE", "ISSUESTYLE", "PAGESSTYLE", "PUBLISHERSTYLE", "PUBPLACESTYLE", "REFNUMBERSTYLE", "AUTHORLISTABBREVIATEFIRSTSTYLE", "AUTHORLISTABBREVIATESUBSEQSTYLE", "EDITORLISTABBREVIATEFIRSTSTYLE", "EDITORLISTABBREVIATESUBSEQSTYLE", "SEDITORLISTABBREVIATEFIRSTSTYLE", "SEDITORLISTABBREVIATESUBSEQSTYLE", "ALLALISTABBREVIATEFIRSTSTYLE", "ALLALISTABBREVIATESUBSEQSTYLE", "AUTHORLISTAUTHORNAMESNAMEFIRSTINITIALSTYLE", "EDITORLISTAUTHORNAMESNAMEFIRSTINITIALSTYLE", "SEDITORLISTAUTHORNAMESNAMEFIRSTINITIALSTYLE", "ALLALISTAUTHORNAMESNAMEFIRSTINITIALSTYLE", "AUTHORLISTAUTHORNAMESNAMEOTHERINITIALSTYLE", "EDITORLISTAUTHORNAMESNAMEOTHERINITIALSTYLE", "SEDITORLISTAUTHORNAMESNAMEOTHERINITIALSTYLE", "ALLALISTAUTHORNAMESNAMEOTHERINITIALSTYLE", "SERIALSTYLE", "ADDRESSSTYLE", "USERDEF1STYLE", "USERDEF2STYLE", "USERDEF3STYLE", "USERDEF4STYLE", "USERDEF5STYLE", "ABSTRACTSTYLE", "TYPEOFWORKSTYLE", "AREASTYLE", "OSTYPESTYLE", "DEGREESTYLE", "RUNNINGTIMESTYLE", "CLASSCODEINTLSTYLE", "CLASSCODEUSSTYLE", "SENDEREMAILSTYLE", "RECIPIENTEMAILSTYLE", "MEDIATYPESTYLE", "NUMVOLUMESSTYLE", "EDITIONSTYLE", "COMPUTERSTYLE", "CONFERENCELOCATIONSTYLE", "REGISTRYNUMSTYLE", "CLASSIFICATIONSTYLE", "SECTIONSTYLE", "PAMPHLETNUMSTYLE", "CHAPTERNUMSTYLE", "NOTESSTYLE", "LINK0STYLE", "LINK1STYLE", "LINK2STYLE", "LINK3STYLE", "LINK4STYLE", "PAGESPAGERANGESTYLE", "CITEKEYSTYLE"}; if ((sql_command = malloc(sql_command_len)) == NULL) { return 801; } drivername = dbi_driver_get_name(dbi_conn_get_driver(conn)); /* read style elements from the citestyle table */ if (!strcmp(my_dbi_conn_get_cap(conn, "multiple_db"), "t")) { sprintf(sql_command, "SELECT ID, STYLE, BIBLIOFIRSTINDENT, BIBLIOBLOCKINDENT, FONTSIZE FROM %s.CITSTYLE WHERE JOURNAL=%s", main_db, format_string); } else { sprintf(sql_command, "SELECT ID, STYLE, BIBLIOFIRSTINDENT, BIBLIOBLOCKINDENT, FONTSIZE FROM CITSTYLE WHERE JOURNAL=%s", format_string); } dbires_cit = dbi_conn_query(conn, sql_command); LOG_PRINT(LOG_DEBUG, sql_command); if (!dbires_cit || dbi_result_next_row(dbires_cit) == 0) { free(sql_command); LOG_PRINT(LOG_WARNING, get_status_msg(241)); send_status(fd, 241, TERM_NO); return 241; } /* NULL check will be done later */ bibliofirstindent = dbi_result_get_string(dbires_cit, "BIBLIOFIRSTINDENT"); biblioblockindent = dbi_result_get_string(dbires_cit, "BIBLIOBLOCKINDENT"); fontsize = dbi_result_get_string(dbires_cit, "FONTSIZE"); /* now retrieve the styles for individual publication types */ n_id = my_dbi_result_get_int_idval(dbires_cit, "ID"); if (!strcmp(my_dbi_conn_get_cap(conn, "multiple_db"), "t")) { sprintf(sql_command, "SELECT PUBTYPE, QSTYLE, XSTYLE, YSTYLE, ZSTYLE, QALTERNATESTYLE, XALTERNATESTYLE, YALTERNATESTYLE, ZALTERNATESTYLE, PUBDATESTYLE, PUBDATESECSTYLE, PUBDATEALLSTYLE, TITLESTYLE, BOOKTITLESTYLE, SERIESTITLESTYLE, ALLTITLESTYLE, JOURNALNAMESTYLE, VOLUMESTYLE, ISSUESTYLE, PAGESSTYLE, PUBLISHERSTYLE, PUBPLACESTYLE, REFNUMBERSTYLE, QABBREVIATEFIRSTSTYLE, QABBREVIATESUBSEQSTYLE, XABBREVIATEFIRSTSTYLE, XABBREVIATESUBSEQSTYLE, YABBREVIATEFIRSTSTYLE, YABBREVIATESUBSEQSTYLE, ZABBREVIATEFIRSTSTYLE, ZABBREVIATESUBSEQSTYLE, QAUTHORNAMESNAMEFIRSTINITIALSTYLE, XAUTHORNAMESNAMEFIRSTINITIALSTYLE, YAUTHORNAMESNAMEFIRSTINITIALSTYLE, ZAUTHORNAMESNAMEFIRSTINITIALSTYLE, QAUTHORNAMESNAMEOTHERINITIALSTYLE, XAUTHORNAMESNAMEOTHERINITIALSTYLE, YAUTHORNAMESNAMEOTHERINITIALSTYLE, ZAUTHORNAMESNAMEOTHERINITIALSTYLE, SERIALSTYLE, ADDRESSSTYLE, USERDEF1STYLE, USERDEF2STYLE, USERDEF3STYLE, USERDEF4STYLE, USERDEF5STYLE, NOTESSTYLE, ABSTRACTSTYLE, TYPEOFWORKSTYLE, AREASTYLE, OSTYPESTYLE, DEGREESTYLE, RUNNINGTIMESTYLE, CLASSCODEINTLSTYLE, CLASSCODEUSSTYLE, SENDEREMAILSTYLE, RECIPIENTEMAILSTYLE, MEDIATYPESTYLE, NUMVOLUMESSTYLE, EDITIONSTYLE, COMPUTERSTYLE, CONFERENCELOCATIONSTYLE, REGISTRYNUMSTYLE, CLASSIFICATIONSTYLE, SECTIONSTYLE, PAMPHLETNUMSTYLE, CHAPTERNUMSTYLE, LINK0STYLE, LINK1STYLE, LINK2STYLE, LINK3STYLE, LINK4STYLE, PAGESPAGERANGESTYLE, CITEKEYSTYLE FROM %s.REFSTYLE WHERE %s.REFSTYLE.CITSTYLEID=%u", main_db, main_db, n_id); } else { sprintf(sql_command, "SELECT PUBTYPE, QSTYLE, XSTYLE, YSTYLE, ZSTYLE, QALTERNATESTYLE, XALTERNATESTYLE, YALTERNATESTYLE, ZALTERNATESTYLE, PUBDATESTYLE, PUBDATESECSTYLE, PUBDATEALLSTYLE, TITLESTYLE, BOOKTITLESTYLE, SERIESTITLESTYLE, ALLTITLESTYLE, JOURNALNAMESTYLE, VOLUMESTYLE, ISSUESTYLE, PAGESSTYLE, PUBLISHERSTYLE, PUBPLACESTYLE, REFNUMBERSTYLE, QABBREVIATEFIRSTSTYLE, QABBREVIATESUBSEQSTYLE, XABBREVIATEFIRSTSTYLE, XABBREVIATESUBSEQSTYLE, YABBREVIATEFIRSTSTYLE, YABBREVIATESUBSEQSTYLE, ZABBREVIATEFIRSTSTYLE, ZABBREVIATESUBSEQSTYLE, QAUTHORNAMESNAMEFIRSTINITIALSTYLE, XAUTHORNAMESNAMEFIRSTINITIALSTYLE, YAUTHORNAMESNAMEFIRSTINITIALSTYLE, ZAUTHORNAMESNAMEFIRSTINITIALSTYLE, QAUTHORNAMESNAMEOTHERINITIALSTYLE, XAUTHORNAMESNAMEOTHERINITIALSTYLE, YAUTHORNAMESNAMEOTHERINITIALSTYLE, ZAUTHORNAMESNAMEOTHERINITIALSTYLE, SERIALSTYLE, ADDRESSSTYLE, USERDEF1STYLE, USERDEF2STYLE, USERDEF3STYLE, USERDEF4STYLE, USERDEF5STYLE, NOTESSTYLE, ABSTRACTSTYLE, TYPEOFWORKSTYLE, AREASTYLE, OSTYPESTYLE, DEGREESTYLE, RUNNINGTIMESTYLE, CLASSCODEINTLSTYLE, CLASSCODEUSSTYLE, SENDEREMAILSTYLE, RECIPIENTEMAILSTYLE, MEDIATYPESTYLE, NUMVOLUMESSTYLE, EDITIONSTYLE, COMPUTERSTYLE, CONFERENCELOCATIONSTYLE, REGISTRYNUMSTYLE, CLASSIFICATIONSTYLE, SECTIONSTYLE, PAMPHLETNUMSTYLE, CHAPTERNUMSTYLE, LINK0STYLE, LINK1STYLE, LINK2STYLE, LINK3STYLE, LINK4STYLE, PAGESPAGERANGESTYLE, CITEKEYSTYLE FROM REFSTYLE WHERE REFSTYLE.CITSTYLEID=%u", n_id); } dbires_ref = dbi_conn_query(conn, sql_command); LOG_PRINT(LOG_DEBUG, sql_command); if (!dbires_ref) { dbi_result_free(dbires_cit); free(sql_command); LOG_PRINT(LOG_WARNING, get_status_msg(241)); send_status(fd, 241, TERM_NO); return 241; } free(sql_command); /* output starts here */ if (n_ref_format == REFDOCBK) { sprintf(outbuffer, "\n\n]>\n\n\n\n", STYLESHEET_HTML_NAME, STYLESHEET_HTML_PUBID, STYLESHEET_PRINT_NAME, STYLESHEET_PRINT_PUBID, STYLESHEET_HTML_ID, STYLESHEET_HTML_BASENAME); } else { sprintf(outbuffer, "\n\n\n"); } send_status(fd, 402, TERM_NO); numbyte = tiwrite(fd, outbuffer, TERM_NO); /* printf("outbuffer:%s<<\n", outbuffer); */ if (numbyte == -1) { dbi_result_free(dbires_cit); dbi_result_free(dbires_ref); LOG_PRINT(LOG_WARNING, get_status_msg(110)); return 110; } /* loop over all publication types */ while (dbi_result_next_row(dbires_ref)) { item_pubtype = dbi_result_get_string_idx(dbires_ref, 1); /* 1-base index */ /* LOG_PRINT(LOG_DEBUG, item_pubtype); */ /* loop over all columns except pubtype which is a constant prefix */ for (i = 1; i < dbi_result_get_numfields(dbires_ref); i++) { item = dbi_result_get_string_idx(dbires_ref, i+1); /* 1-base index */ if (item && *item) { /* LOG_PRINT(LOG_DEBUG, item); */ if (!strcmp(tags[i-1], "AUTHORLISTALTERNATESTYLE") ||!strcmp(tags[i-1], "EDITORLISTALTERNATESTYLE") ||!strcmp(tags[i-1], "SEDITORLISTALTERNATESTYLE") ||!strcmp(tags[i-1], "ALLALISTALTERNATESTYLE")) { item++; /* skip leading "A" */ } /* we assemble the variable name from the publication type and the column name. The variable value is the value of the column */ if (n_ref_format == REFDOCBK) { sprintf(outbuffer, "(define %s%s \"%s\")\n", item_pubtype, tags[i-1], item); } else { sprintf(outbuffer, "%s\n", item_pubtype, tags[i-1], item); } numbyte = tiwrite(fd, outbuffer, TERM_NO); /* printf("outbuffer:%s<<\n", outbuffer); */ if (numbyte == -1) { dbi_result_free(dbires_cit); dbi_result_free(dbires_ref); LOG_PRINT(LOG_WARNING, get_status_msg(110)); return 110; } } /* end if */ } /* end for */ } /* end while */ if (n_ref_format == REFDOCBK) { if (write_bibstyle_info(fd, bibliofirstindent, biblioblockindent, fontsize, 1 /* DSSSL */)) { dbi_result_free(dbires_cit); dbi_result_free(dbires_ref); return 110; } sprintf(outbuffer, "\n\n\n\n", STYLESHEET_PRINT_ID, STYLESHEET_PRINT_BASENAME); } else { if (write_bibstyle_info(fd, bibliofirstindent, biblioblockindent, fontsize, 0 /* XSLT */)) { dbi_result_free(dbires_cit); dbi_result_free(dbires_ref); return 110; } strcpy(outbuffer, ""); } if (n_ref_format == REFDOCBK) { numbyte = tiwrite(fd, outbuffer, TERM_NO); /* printf("outbuffer:%s<<\n", outbuffer); */ if (numbyte == -1) { dbi_result_free(dbires_cit); dbi_result_free(dbires_ref); LOG_PRINT(LOG_WARNING, get_status_msg(110)); return 110; } } else { /* xsl stylesheet is done here */ dbi_result_free(dbires_cit); dbi_result_free(dbires_ref); numbyte = tiwrite(fd, outbuffer, TERM_YES); /* printf("outbuffer:%s<<\n", outbuffer); */ if (numbyte == -1) { LOG_PRINT(LOG_WARNING, get_status_msg(110)); return 110; } return 0; } /* rewind. we can't jump to the first row and then use next_row as this would skip the first row. Instead we use next_row at the bottom of the while loop */ haverow = dbi_result_first_row(dbires_ref); /* loop over all publication types */ while (haverow) { item_pubtype = dbi_result_get_string_idx(dbires_ref, 1); /* 1-base index */ /* LOG_PRINT(LOG_DEBUG, item_pubtype); */ /* loop over all columns except pubtype which is a constant prefix*/ for (i = 1; i < dbi_result_get_numfields(dbires_ref); i++) { item = dbi_result_get_string_idx(dbires_ref, i+1); /* 1-base index */ if (item && *item) { /* LOG_PRINT(LOG_DEBUG, item); */ if (!strcmp(tags[i-1], "AUTHORLISTALTERNATESTYLE") ||!strcmp(tags[i-1], "EDITORLISTALTERNATESTYLE") ||!strcmp(tags[i-1], "SEDITORLISTALTERNATESTYLE") ||!strcmp(tags[i-1], "ALLALISTALTERNATESTYLE")) { item++; /* skip leading "A" */ } /* we assemble the variable name from the publication type and the column name. The variable value is the value of the column */ sprintf(outbuffer, "(define %s%s \"%s\")\n", item_pubtype, tags[i-1], item); numbyte = tiwrite(fd, outbuffer, TERM_NO); /* printf("outbuffer:%s<<\n", outbuffer); */ if (numbyte == -1) { dbi_result_free(dbires_cit); dbi_result_free(dbires_ref); LOG_PRINT(LOG_WARNING, get_status_msg(110)); return 110; } } /* end if */ } /* end for */ haverow = dbi_result_next_row(dbires_ref); } /* end while */ if (write_bibstyle_info(fd, bibliofirstindent, biblioblockindent, fontsize, 1 /* DSSSL */)) { dbi_result_free(dbires_cit); dbi_result_free(dbires_ref); LOG_PRINT(LOG_WARNING, get_status_msg(110)); return 110; } dbi_result_free(dbires_cit); dbi_result_free(dbires_ref); sprintf(outbuffer, "\n\n\n\n\n", STYLESHEET_HTML_BASENAME, STYLESHEET_HTML_NAME, STYLESHEET_PRINT_BASENAME, STYLESHEET_PRINT_NAME); numbyte = tiwrite(fd, outbuffer, TERM_YES); /* printf("outbuffer:%s<<\n", outbuffer); */ if (numbyte == -1) { LOG_PRINT(LOG_WARNING, get_status_msg(110)); return 110; } /* printf("done writing style spec\n"); */ return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ write_bibstyle_info() writes bibliography style info as part of a xslt/dsssl driver file static int write_bibstyle_info returns 1 in case of an error, 0 if successful int fd file descriptor to write data to const char* bibliofirstindent ptr to string containing bibliofirstindent info const char* biblioblockindent ptr to string containing biblioblockindent info const char* fontsize ptr to string containing fontsize info int type 0 = xslt output 1 = dsssl output ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int write_bibstyle_info(int fd, const char* bibliofirstindent, const char* biblioblockindent, const char* fontsize, int type) { char outbuffer[512]; int numbyte; /* todo: check string lengths or use mstrcat et al. */ *outbuffer = '\0'; if (!type) { /* XSLT */ strcpy(outbuffer, ""); if (bibliofirstindent) { sprintf(outbuffer+strlen(outbuffer), "%s", bibliofirstindent); } if (biblioblockindent) { sprintf(outbuffer+strlen(outbuffer), "%s", biblioblockindent); } if (fontsize) { if (is_real_number(fontsize)) { sprintf(outbuffer+strlen(outbuffer), "%s", fontsize); } else { sprintf(outbuffer+strlen(outbuffer), "%s", fontsize); } } strcat(outbuffer, "\n"); } else { /* DSSSL */ strcpy(outbuffer, "(define %stylesheet% #f)\n"); if (bibliofirstindent) { sprintf(&(outbuffer[strlen(outbuffer)]), "(define refdb-text-indent %s)\n", bibliofirstindent); } else { strcat(outbuffer, "(define refdb-text-indent #f)\n"); } if (biblioblockindent) { sprintf(&(outbuffer[strlen(outbuffer)]), "(define refdb-start-indent %s)\n", biblioblockindent); } else { strcat(outbuffer, "(define refdb-start-indent #f)\n"); } if (fontsize) { sprintf(&(outbuffer[strlen(outbuffer)]), "(define refdb-font-size %s)\n", fontsize); } else { strcat(outbuffer, "(define refdb-font-size #f)\n"); } } numbyte = tiwrite(fd, outbuffer, TERM_NO); /* printf("outbuffer:%s<<\n", outbuffer); */ if (numbyte == -1) { LOG_PRINT(LOG_WARNING, get_status_msg(110)); return 1; } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ append_return_msg() assembles a message from a given static part and a dbi error message static int append_return_msg returns 1 in case of an error, 0 if successful struct ADDRESULT *ptr_addresult ptr to a structure with add info int n_status number of status message const char* entry_id optional ptr to string denoting the reference that caused the error dbi_conn conn ptr to an existing connection to the database server ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int append_return_msg(struct ADDRESULT *ptr_addresult, int n_status, const char* entry_id, dbi_conn conn) { char* new_msg; char buffer[512]; /* error status + ref_id + database_name*/ if (entry_id && *entry_id) { sprintf(buffer, "%s:%s\n", get_status_string(n_status), entry_id); if ((new_msg = mstrcat(ptr_addresult->msg, buffer, &(ptr_addresult->msg_len), 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } else { ptr_addresult->msg = new_msg; } LOG_PRINT(LOG_WARNING, buffer); } else { if ((new_msg = mstrcat(ptr_addresult->msg, (char*)get_status_msg(n_status), &(ptr_addresult->msg_len), 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } else { ptr_addresult->msg = new_msg; } LOG_PRINT(LOG_WARNING, get_status_msg(n_status)); } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ indent_notbelow_dbib(): checks whether or not to indent below the current element int indent_notbelow_dbib returns 1 if not to indent, 0 if to indent const char* name ptr to element name ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int indent_notbelow_dbib(const char* name) { if (!strcmp(name, "bibliomset")) { return 1; } else { return 0; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ is_entry_dbib(): checks whether an element starts a new entry int is_entry_dbib returns 1 if entry starts, 0 if not const char* name ptr to element name ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int is_entry_dbib(const char* name) { if (!strcmp(name, "bibliomixed")) { return 1; } else { return 0; } } refdb-1.0.2/src/risdb.c000755 001750 001750 00000414177 12255427652 015533 0ustar00markusmarkus000000 000000 /*+++++++++++++++++++++++++++++ risdb.c: functions to write RIS datasets to a database markus@mhoenicka.de 3-26-00 $Id: risdb.c,v 1.44.2.13 2005/11/03 20:40:19 mhoenicka Exp $ 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, see ++++++++++++++++++++++++++*/ /* ToDo: think about consolidating int variables that are used as switches */ #include #include #include #include /* priority levels of log messages */ #include #include #include /* for getpid() */ #include /* for getpid() */ #include #include "linklist.h" #include "strfncs.h" #include "refdb.h" #include "refdbd.h" #include "risdb.h" #include "tokenize.h" #include "readris.h" #include "connect.h" #include "dbfncs.h" #include "authorinfo.h" #include "risdata.h" extern int n_log_level; /* level up to which messages are logged */ extern int nongeek_offset; extern char keep_pnames[]; extern char upper_citekey[]; extern char main_db[]; /* forward declarations of local functions */ static char* dotify_journal(char* journal, dbi_conn conn, dbi_conn conn_refdb); static unsigned long long find_journal(int level, struct PERIODICAL_INFO* ptr_perinfo, dbi_conn conn, int replace_ref); static char* strip_oddchars(char* string); static int update_user_field(const char* fieldvalue, unsigned long long n_refdb_id, unsigned long long n_user_id, dbi_conn conn, dbi_driver driver, const char* query_stub, const char* errmsg); static int check_filelink(const char* url); /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ dotify_journal(): adds periods after abbreviated names in JO/JA The modified string finally ends up in the same location as the passed string. This is ok as the modification in no case increases the length of the string more than 1 char (it will actually decrease the length of the string if it contains trailing or leading or consecutive whitespace). Each token will be compared with a wordlist in refdb. If a match is found, a space is used as separator. If no match is found, the word is considered an abbreviation and gets a dot appended. static char* dotify_journal returns pointer to the modified string. Returns NULL if the argument is NULL or an empty string or if we're out of memory. char* journal pointer to the string containing the abbreviated journal. IMPORTANT: The array holding the abbreviated journal must be allocated to have one char more than the length of the string incl the terminating \0 (i.e. strlen(JA) + 2). dbi_conn conn pointer to a data structure for a previously established database connection. The caller is responsible to establish this connection and to take it down again after this function returns. dbi_conn conn_refdb database connection to refdb, used by some drivers ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static char* dotify_journal(char* journal, dbi_conn conn, dbi_conn conn_refdb) { char *dest; char *start_token; char *end_string; char *mytoken; char *local_journal; char *sql_command; const char *drivername; size_t token_len; dbi_result dbires = NULL; /* take a shortcut home if no journal is specified */ if (journal == NULL || !*journal) { return NULL; } dest = malloc(strlen(journal)+2); if (dest == NULL) { return NULL; } sql_command = malloc(356); /* 100 sql command + 255 token + 1 \0 */ if (sql_command == NULL) { free(dest); return NULL; } /* printf("in: %s", journal); */ dest[0] = '\0'; /* terminate string */ drivername = dbi_driver_get_name(dbi_conn_get_driver(conn)); local_journal = stripwhite(journal, 0, 0); end_string = local_journal+strlen(local_journal); start_token = nstrtok(local_journal, &token_len, ".- \t"); while (start_token != NULL) { start_token[token_len] = '\0'; strcat(dest, start_token); if (start_token[strlen(start_token)-1] != '.') { /* check whether the token is likely to be an abbreviation */ mytoken = strdup(start_token); if (!mytoken) { free(dest); return NULL; } strup(mytoken); /* convert token to uppercase */ if (dbi_conn_quote_string(conn, &mytoken) == 0) { free(dest); free(mytoken); return NULL; } if (token_len < 255) { if (!strcmp(my_dbi_conn_get_cap(conn, "multiple_db"), "t")) { sprintf(sql_command, "SELECT name FROM %s.t_journal_words WHERE name=%s", main_db, mytoken); } else { sprintf(sql_command, "SELECT name FROM t_journal_words WHERE name=%s", mytoken); } free(mytoken); LOG_PRINT(LOG_DEBUG, sql_command); if (!strcmp(my_dbi_conn_get_cap(conn, "multiple_db"), "t")) { dbires = dbi_conn_query(conn, sql_command); } else { dbires = dbi_conn_query(conn_refdb, sql_command); } /* the following test will also fail if an unknown driver is used */ if (!dbires) { LOG_PRINT(LOG_WARNING, "error in t_journal_words query"); } else { if (dbi_result_get_numrows(dbires) > 0 || start_token[token_len-1] == '.') { strcat(dest, " "); } else { strcat(dest, "."); } } } else { /* such a long token is not allowed as it exceeds the maximum length of the JO/JA field. We just make sure to avoid a segfault */ strcat(dest, " "); free(mytoken); } if (dbires) { dbi_result_free(dbires); } } /* else: period is already in place, nothing to do */ start_token += token_len+1; if (start_token >= end_string) { start_token = NULL; } else { start_token = nstrtok(start_token, &token_len, ".- \t"); } } stripwhite(dest, 2, 0); /* strip trailing space, if any */ /* printf(" out: %s\n", dest); */ strcpy(journal, dest); free(dest); free(sql_command); return journal; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ process_ris_set(): adds a given RIS dataset to the database int process_ris_set returns 0 if failed, 1 if successfully added, 2 if successfully replaced 3 if skipped char* set string holding a RIS dataset dbi_conn conn pointer to a data structure for a previously established database session. The caller is responsible to establish this connection and to take it down again after this function returns. dbi_conn conn_refdb optional ptr to a database session for refdb (used by some dbi drivers) int replace_ref if ADDREF_UPDATE, ref will be updated according to ID field if ADDREF_ADD, ref will be added, ignoring an ID field if ADDREF_UPDATE_PERSONAL, only the personal settings (N1, AV, RP) will be updated according to the ID field if ADDREF_CHECK, ref will be added to temporary tables and checked char *set_owner string denoting the user who adds/owns this reference int fd file descriptor of socket int n_keep_id if 1, any existing reference ID will be saved in U5 Lilid* ptr_id_sentinel ptr to linked list. This fn will add the ID of the current dataset to this list if adding the set was successful unsigned long long set_count number of current dataset char** ptr_msg_pool pointer to string receiving status messages size_t* ptr_msg_pool_len ptr to length of *ptr_msg_pool ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int process_ris_set(char* set, dbi_conn conn, dbi_conn conn_refdb, int replace_ref, char* set_owner, struct CLIENT_REQUEST* ptr_clrequest, int n_keep_id, Lilid* ptr_id_sentinel, unsigned long long set_count, char** ptr_msg_pool, size_t* ptr_msg_pool_len) { char* token = NULL; /* one line of the original RIS file - starts with tag */ char* sql_command = NULL; /* buffer to assemble query */ char *buffer; /* buffer for assembling strings */ char *real_citekey; /* copy of citekey, for preprocessing the contents */ char date_buffer[11] = ""; /* buffer to hold the date information of PY*/ char otherinfo_buffer[256] = ""; /* buffer to hold the other information of PY */ char first_author[256] = ""; /* buffer to hold first author of a ref */ char type[7] = "GEN"; /* the reference type */ char prefix[] = TEMP_TABLE_NAME_PREFIX; const char *drivername = NULL; /* name of the libdbi driver */ const char *citekey = NULL; /* new citation key */ char* new_msgpool; /* used to reallocate *msg_pool */ size_t sql_cmd_len; /* currently allocated length of sql_command */ /* int error; */ /* error switch */ unsigned long long n_refdb_id = 0; /* ID of the reference */ unsigned long long n_periodical_id = 0; /* periodical_id of a search result */ unsigned long long n_user_id = 0; /* user_id of a search result */ int result; int string_len; /* length of a temporary string */ size_t token_len; /* length of a token */ int part_xauthor_pos = 0; /* the position of an author in the author list */ int publication_xauthor_pos = 0; /* the position of an author in the author list */ int series_xauthor_pos = 0; /* the position of an author in the author list */ int rp_type; /* reprint type 0=IN FILE, 1=NOT IN FILE, 2=ON REQUEST */ int year_type; /* type of year info 0=PY, 1=Y1 */ int create_new = 1; /* if 1, we create a new dataset; if 0, we update */ int have_rp = 0; /* if remains 0, dataset did not contain a RP field */ int have_py = 0; /* if remains 0, dataset did not contain a PY field */ int n_have_citekey = 0; /* if 1, dataset contains citekey */ int retval = 0; int nis_dummy = 0; /* will be 1 if dataset is a dummy */ short int year = 0; /* the year */ short int year2 = 0; /* the secondary year */ dbi_driver driver; dbi_result dbires; struct lilimem sentinel; struct PERIODICAL_INFO perinfo; /* periodical name synonyms */ struct AUTHOR_INFO* ptr_ainfo; struct RISDATA* ptr_risdata; struct ADDRESULT addresult; sentinel.ptr_mem = NULL; sentinel.ptr_next = NULL; sentinel.varname[0] = '\0'; perinfo.full = NULL; perinfo.abbrev = NULL; perinfo.custabbrev1 = NULL; perinfo.custabbrev2 = NULL; driver = dbi_conn_get_driver(conn); drivername = dbi_driver_get_name(driver); /* fix prefix */ if (replace_ref != ADDREF_CHECK) { *prefix = '\0'; } /* get a buffer to assemble queries */ sql_cmd_len = 4096; /* enough for inserting all 4 journal columns */ sql_command = malloc(sql_cmd_len); /* big enough for replace_ref search */ if (sql_command == NULL || insert_lilimem(&sentinel, (void**)&sql_command, "sql_command")) { if ((new_msgpool = mstrcat(*ptr_msg_pool, "801\n", ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 0; } /* another buffer to assemble strings */ buffer = malloc(512); if (buffer == NULL || insert_lilimem(&sentinel, (void**)&buffer, "buffer")) { if ((new_msgpool = mstrcat(*ptr_msg_pool, "801\n", ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 0; } /* another buffer for the citation key */ real_citekey = malloc(256); if (real_citekey == NULL || insert_lilimem(&sentinel, (void**)&real_citekey, "real_citekey")) { if ((new_msgpool = mstrcat(*ptr_msg_pool, "801\n", ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 0; } *real_citekey = '\0'; ptr_ainfo = new_authorinfo(); if (ptr_ainfo == NULL || insert_lilimem(&sentinel, (void**)&ptr_ainfo, "ptr_ainfo")) { sprintf(sql_command, "801:"ULLSPEC"\n", (unsigned long long)set_count); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } LOG_PRINT(LOG_CRIT, get_status_msg(801)); delete_all_lilimem(&sentinel); return 0; } ptr_risdata = new_risdata(); if (ptr_risdata == NULL) { sprintf(sql_command, "801:"ULLSPEC"\n", (unsigned long long)set_count); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } LOG_PRINT(LOG_CRIT, get_status_msg(801)); delete_all_lilimem(&sentinel); return 0; } /* If the db server supports it, start a transaction. We want one transaction per reference */ if (my_dbi_conn_begin(conn)) { sprintf(sql_command, "227:"ULLSPEC"\n", (unsigned long long)set_count); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } LOG_PRINT(LOG_ERR, get_status_msg(227)); delete_all_lilimem(&sentinel); free_risdata(ptr_risdata); return 0; } /* lock the tables we'll write to to prevent concurrent writes from different clients */ if (my_dbi_conn_lock(conn, replace_ref)) { sprintf(sql_command, "228:"ULLSPEC"\n", (unsigned long long)set_count); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } LOG_PRINT(LOG_ERR, get_status_msg(228)); delete_all_lilimem(&sentinel); free_risdata(ptr_risdata); return 0; } /* sanity check: scan dataset for a TY string */ token = strstr(set, "TY - "); if (token == NULL) { sprintf(sql_command, "233:"ULLSPEC"\n", (unsigned long long)set_count); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } LOG_PRINT(LOG_ERR, get_status_msg(233)); delete_all_lilimem(&sentinel); free_risdata(ptr_risdata); return 0; } /* scan dataset for ID */ token = strstr(set, "ID - "); if (token != NULL) { /* if dataset has an ID string */ string_len = strcspn(token, "\n"); if (string_len > 261) { /* largest reasonable citekey, 255+6 for tag */ sprintf(sql_command, "410:"ULLSPEC"\n", (unsigned long long)set_count); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } LOG_PRINT(LOG_ERR, get_status_msg(410)); retval = 1; goto cleanup; } /* two cases: either a numeric ID or an alphanumeric citekey */ strncpy(buffer, token+6, string_len-6); buffer[string_len-6] = '\0'; if (buffer[strlen(buffer)-1] == '\r') { /* cgi data have \r\n */ buffer[strlen(buffer)-1] = '\0'; } if (is_number(buffer)) { /* ID field contains numeric ID */ if (string_len > 26) { /* largest 8byte-integer, 20+6 for tag */ sprintf(sql_command, "410:"ULLSPEC"\n", (unsigned long long)set_count); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } LOG_PRINT(LOG_ERR, get_status_msg(410)); retval = 1; goto cleanup; } sprintf(sql_command, "SELECT refdb_id, refdb_citekey FROM t_%srefdb WHERE refdb_id=%s", prefix, buffer); } else { /* ID field contains citekey */ char *new_buffer; n_have_citekey = 1; if ((new_buffer = preprocess_citekey_copy(buffer, 255)) == NULL) { return 0; } else { free(buffer); buffer = new_buffer; } sprintf(sql_command, "SELECT refdb_id, refdb_citekey FROM t_%srefdb WHERE refdb_citekey=\'%s\'", prefix, buffer); } /* search for existing entry */ LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { sprintf(sql_command, "410:"ULLSPEC"\n", (unsigned long long)set_count); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } LOG_PRINT(LOG_ERR, get_status_msg(410)); retval = 1; goto cleanup; } /* we have to consider these cases: - addref: entry with same ID or citekey doesn't exist-> add - addref: entry with same ID/citekey exists-> error - updateref: entry with same ID/citekey doesn't exist-> add - updateref: entry with same ID/citekey exists-> update */ if (dbi_result_next_row(dbires)) { /* requested ID exists */ if (replace_ref != ADDREF_ADD && replace_ref != ADDREF_CHECK) { create_new = 0; n_refdb_id = my_dbi_result_get_idval(dbires, "refdb_id"); set_risdata_field(ptr_risdata, "citekey", my_dbi_result_get_string(dbires, "refdb_citekey"), conn); } else { /* we're supposed to add */ if (n_have_citekey) {/* we can't add lest we overwrite existing data */ LOG_PRINT(LOG_INFO, "refused to overwrite existing dataset"); /* sprintf(sql_command, "citekey %s already exists, please try again\n", buffer); */ sprintf(sql_command, "407:"ULLSPEC":%s\n", (unsigned long long)(set_count + nongeek_offset), buffer); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } retval = 2; my_dbi_conn_rollback(conn); goto cleanup; } else { /* ignore numerical ID and assign a new one */ LOG_PRINT(LOG_INFO, "ignore numerical ID"); /* sprintf(sql_command, "ID %s ignored, I have assigned a new one\n", buffer); */ sprintf(sql_command, "409:"ULLSPEC"%s\n", (unsigned long long)(set_count + nongeek_offset), buffer); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } } } } else { /* requested ID could not be found */ if (replace_ref == ADDREF_UPDATE) { create_new = 1; } else if (replace_ref == ADDREF_UPDATE_PERSONAL) { dbi_result_free(dbires); LOG_PRINT(LOG_WARNING, "ID not found"); if (is_number(buffer)) { /* ID field contains numeric ID */ sprintf(sql_command, "410:"ULLSPEC":%s\n", (unsigned long long)(set_count + nongeek_offset), buffer); } else { sprintf(sql_command, "411:"ULLSPEC":%s\n", (unsigned long long)(set_count + nongeek_offset), buffer); } if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } retval = 1; goto cleanup; } else if (!n_have_citekey) { /* if add, ignore numerical ID and assign a new one */ LOG_PRINT(LOG_INFO, "ignore numerical ID"); sprintf(sql_command, "409:"ULLSPEC"%s\n", (unsigned long long)(set_count + nongeek_offset), buffer); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } } } dbi_result_free(dbires); } else { /* no ID string */ if (replace_ref == ADDREF_UPDATE) { create_new = 1; /* if no ID string, simply add the dataset */ } else if (replace_ref == ADDREF_UPDATE_PERSONAL){ LOG_PRINT(LOG_WARNING, "ID missing"); sprintf(sql_command, "412:"ULLSPEC"\n", (unsigned long long)(set_count + nongeek_offset)); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } retval = 1; goto cleanup; } /* else: add will assign new ID anyway */ } /* if we're replacing, first remove the existing entry as far as necessary */ if (!create_new && replace_ref != ADDREF_UPDATE_PERSONAL) { /* sprintf(sql_command, "try to replace reference "ULLSPEC"\n", (unsigned long long)n_refdb_id); */ /* tiwrite(ptr_clrequest->fd, sql_command, TERM_NO); */ /* search orphans in t_keyword */ /* printf("orphans in t_keyword\n"); */ result = remove_keyword_entries(n_refdb_id, conn, 0); if (result) { sprintf(sql_command, "229:"ULLSPEC"\n", (unsigned long long)(set_count + nongeek_offset)); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } retval = 1; goto cleanup; } /* search orphans in t_author */ result = remove_author_entries(n_refdb_id, conn); if (result) { sprintf(sql_command, "230:"ULLSPEC"\n", (unsigned long long)(set_count + nongeek_offset)); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } retval = 1; goto cleanup; } /* search orphans in t_xuser */ result = remove_xuser_entries(n_refdb_id, set_owner, conn); if (result != 0 && result != 4) { sprintf(sql_command, "253:"ULLSPEC"\n", (unsigned long long)(set_count + nongeek_offset)); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } retval = 1; goto cleanup; } /* search orphans in t_ulink */ result = remove_ulink_entries(n_refdb_id, /*set_owner*/NULL, conn, 0 /* reference */); if (result != 0 && result != 4) { sprintf(sql_command, "253:"ULLSPEC"\n", (unsigned long long)(set_count + nongeek_offset)); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } retval = 1; goto cleanup; } /* search orphans in t_periodical */ sprintf(sql_command, "SELECT refdb_periodical_id FROM t_%srefdb WHERE refdb_id="ULLSPEC, prefix, (unsigned long long)n_refdb_id); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { sprintf(sql_command, "231:"ULLSPEC"\n", (unsigned long long)(set_count + nongeek_offset)); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } retval = 1; goto cleanup; } while (dbi_result_next_row(dbires)) { n_periodical_id = my_dbi_result_get_idval(dbires, "refdb_periodical_id"); if (n_periodical_id != 0 && my_dbi_conn_error_flag(conn) == 0) { if (remove_periodical_entries(n_periodical_id, conn)) { sprintf(sql_command, "231:"ULLSPEC"\n", (unsigned long long)(set_count + nongeek_offset)); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } retval = 1; goto cleanup; } } } /* end while */ dbi_result_free(dbires); /* reset all values in t_refdb, keep citekey */ sprintf(sql_command, "UPDATE t_%srefdb SET refdb_type=NULL, refdb_pubyear=NULL, refdb_secyear=NULL, refdb_startpage=NULL, refdb_endpage=NULL, refdb_abstract=NULL, refdb_title=NULL, refdb_volume=NULL, refdb_issue=NULL, refdb_booktitle=NULL, refdb_city=NULL, refdb_publisher=NULL, refdb_title_series=NULL, refdb_address=NULL, refdb_issn=NULL, refdb_pyother_info=NULL, refdb_secother_info=NULL, refdb_periodical_id=NULL, refdb_user1=NULL, refdb_user2=NULL, refdb_user3=NULL, refdb_user4=NULL, refdb_user5=NULL, refdb_typeofwork=NULL, refdb_area=NULL, refdb_ostype=NULL, refdb_degree=NULL, refdb_runningtime=NULL, refdb_classcodeintl=NULL, refdb_classcodeus=NULL, refdb_senderemail=NULL, refdb_recipientemail=NULL, refdb_mediatype=NULL, refdb_numvolumes=NULL, refdb_edition=NULL, refdb_computer=NULL, refdb_conferencelocation=NULL, refdb_registrynum=NULL, refdb_classification=NULL, refdb_section=NULL, refdb_pamphletnum=NULL, refdb_chapternum=NULL WHERE refdb_id="ULLSPEC, prefix, (unsigned long long)n_refdb_id); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { sprintf(sql_command, "232:"ULLSPEC"\n", (unsigned long long)(set_count + nongeek_offset)); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } LOG_PRINT(LOG_WARNING, get_status_msg(232)); retval = 1; goto cleanup; } dbi_result_free(dbires); } /* start inserting the new data */ if (create_new) { /* if my_hostname is too long, the db will chop off the string which is ok */ sprintf(sql_command, "INSERT INTO t_%srefdb (refdb_type,refdb_citekey) VALUES (\'DUMMY\',\'DUMMY%s%d\')", prefix, ptr_clrequest->my_hostname, getpid()); /* insert a new empty dataset into the main table to start with */ LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { sprintf(sql_command, "233:"ULLSPEC"\n", (unsigned long long)(set_count + nongeek_offset)); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } LOG_PRINT(LOG_WARNING, get_status_msg(233)); retval = 1; goto cleanup; } /* retrieve refdb_id of newly created dataset */ if (!strcmp(my_dbi_conn_get_cap(conn, "named_seq"), "f")) { n_refdb_id = dbi_conn_sequence_last(conn, NULL); } else { sprintf(sql_command, "t_%srefdb_refdb_id_seq", prefix); n_refdb_id = dbi_conn_sequence_last(conn, sql_command); } /* sprintf(sql_command, "try to add set as reference "ULLSPEC"\n", (unsigned long long)n_refdb_id); */ /* tiwrite(ptr_clrequest->fd, sql_command, TERM_NO); */ dbi_result_free(dbires); } /* save the refdb ID in our risdata struct */ ptr_risdata->n_id = n_refdb_id; /* create user and xuser entries */ result = insert_user(set_owner, n_refdb_id, &n_user_id, conn, drivername, replace_ref, 0); if (result) { sprintf(sql_command, "233:"ULLSPEC"\n", (unsigned long long)(set_count + nongeek_offset)); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } LOG_PRINT(LOG_WARNING, get_status_msg(233)); retval = 1; goto cleanup; } /* else: all fine */ /* cut reference into pieces */ token = ris_strtok(set, &token_len, "\n"); while (token != NULL) { if (token[token_len-1] == '\r') { /* cgi data have \r\n */ token[token_len-1] = '\0'; } token[token_len] = '\0'; /* ignore empty tag lines */ if (!token[6]) { token = ris_strtok(token + token_len + 1, &token_len, "\n"); continue; } /* printf("token went to %s<<\n", token); */ /* ------------------------------------------------------------ */ if (strncmp("RP - ", token, 6) == 0) { /* reprint status */ if ((rp_type = ris_rpdate(date_buffer, &token[6])) != -1) { have_rp++; result = update_reprint(rp_type, n_refdb_id, n_user_id, conn, date_buffer, replace_ref); if (result) { sprintf(sql_command, "233:"ULLSPEC"\n", (unsigned long long)(set_count + nongeek_offset)); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } LOG_PRINT(LOG_WARNING, get_status_msg(233)); retval = 1; goto cleanup; } } } /* ------------------------------------------------------------ */ else if (strncmp("AB - ", token, 6) == 0 || strncmp("N1 - ", token, 6) == 0) { /* notes */ result = update_notes(&token[6], n_refdb_id, n_user_id, conn, driver, replace_ref); if (result) { sprintf(sql_command, "233:"ULLSPEC"\n", (unsigned long long)(set_count + nongeek_offset)); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } LOG_PRINT(LOG_WARNING, get_status_msg(233)); retval = 1; goto cleanup; } /* else: all fine */ } /* ------------------------------------------------------------ */ else if (strncmp("AV - ", token, 6) == 0) { /* availability */ result = update_avail(&token[6], n_refdb_id, n_user_id, conn, driver, replace_ref); if (result) { sprintf(sql_command, "233:"ULLSPEC"\n", (unsigned long long)(set_count + nongeek_offset)); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } LOG_PRINT(LOG_WARNING, get_status_msg(233)); retval = 1; goto cleanup; } /* else: all fine */ } /* ------------------------------------------------------------ */ else if (strncmp("L1 - ", token, 6) == 0 || strncmp("L2 - ", token, 6) == 0 || strncmp("L3 - ", token, 6) == 0 || strncmp("L4 - ", token, 6) == 0) { int n_type = 0; if (!strncmp("L1 - ", token, 6)) { n_type = 1; } else if (!strncmp("L2 - ", token, 6)) { n_type = 2; } else if (!strncmp("L3 - ", token, 6)) { n_type = 3; } else if (!strncmp("L4 - ", token, 6)) { n_type = 4; } result = insert_ulink(&token[6], n_type, n_refdb_id, conn, driver, drivername, n_user_id, 0 /* reference */, replace_ref); /* result = set_risdata_field(ptr_risdata, tofield, &token[6], conn); */ if (result == 1) { sprintf(sql_command, "233:"ULLSPEC"\n", (unsigned long long)(set_count + nongeek_offset)); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } LOG_PRINT(LOG_WARNING, get_status_msg(233)); retval = 1; goto cleanup; } /* else: all fine */ } else if (replace_ref != ADDREF_UPDATE_PERSONAL) { /* ------------------------------------------------------------ */ if (strncmp("TY - ", token, 6) == 0) { /* reference type */ if (!strcmp(&token[6], "DUMMY")) { nis_dummy = 1; } else if (!strstr(REFTYPES, &token[6])) { sprintf(sql_command, "426:%s->GEN\n", &token[6]); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } /* change type to default */ strcpy(type, "GEN"); } else { nis_dummy = 0; /* save the type for later checks */ strncpy(type, &token[6], 6); type[6] = '\0'; } result = set_risdata_field(ptr_risdata, "type", type, conn); if (result) { sprintf(sql_command, "233:"ULLSPEC"\n", (unsigned long long)(set_count + nongeek_offset)); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } LOG_PRINT(LOG_WARNING, get_status_msg(233)); retval = 1; goto cleanup; } /* else: all fine */ } /* ------------------------------------------------------------ */ else if (strncmp("AU - ", token, 6) == 0 || strncmp("A1 - ", token, 6) == 0 || strncmp("ED - ", token, 6) == 0 || strncmp("A2 - ", token, 6) == 0 || strncmp("A3 - ", token, 6) == 0) { int author_type = 0; struct AUTHORTOKENS atokens; Lilistring* ptr_middle; /* reset the structure */ reset_authorinfo(ptr_ainfo); /* author/editor/author series */ strncpy(ptr_ainfo->name, &token[6], 255); (ptr_ainfo->name)[255] = '\0'; /* tokenize author string */ if (!tokenize_author(&token[6], &atokens)) { sprintf(sql_command, "233:"ULLSPEC"\n", (unsigned long long)(set_count + nongeek_offset)); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } LOG_PRINT(LOG_WARNING, get_status_msg(233)); retval = 1; goto cleanup; } if (*atokens.first) { strncpy(ptr_ainfo->firstname, atokens.first, 255); (ptr_ainfo->firstname)[255] = '\0'; } if (atokens.ptr_middlelist) { ptr_middle = atokens.ptr_middlelist; while ((ptr_middle = get_next_lilistring(ptr_middle)) != NULL) { strncat(ptr_ainfo->middlename, ptr_middle->token, 255-strlen(ptr_ainfo->middlename)); strncat(ptr_ainfo->middlename, " ", 255-strlen(ptr_ainfo->middlename)); } stripwhite(ptr_ainfo->middlename, 2, 0); } if (*atokens.sur) { strncpy(ptr_ainfo->lastname, atokens.sur, 255); (ptr_ainfo->lastname)[255] = '\0'; } if (*atokens.lineage) { strncpy(ptr_ainfo->suffix, atokens.lineage, 255); (ptr_ainfo->suffix)[255] = '\0'; } /* if we have name parts, assemble the full string again to normalize it */ if (*atokens.first || atokens.ptr_middlelist || *atokens.sur || *atokens.lineage) { char* temp_author; int n_error = 0; temp_author = assemble_full_author(ptr_ainfo, &n_error); if (temp_author) { /* truncate author string */ strncpy(ptr_ainfo->name, temp_author, 255); (ptr_ainfo->name)[255] = '\0'; free(temp_author); } } clean_authortokens(&atokens); /* try to untangle the RIS braindeadness related to the orthogonal concepts of author type and author role */ if (strncmp("AU - ", token, 6) == 0 || strncmp("A1 - ", token, 6) == 0) { /* keep a copy of the first author for the citation key */ if (!*first_author) { strncpy(first_author, &token[6], 255); first_author[255] = '\0'; } strcpy(ptr_ainfo->role, "author"); /* two options: author of part and author of publication */ if (has_part_data(type)) { author_type = 1; /* part author */ result = insert_author(ptr_ainfo, author_type, part_xauthor_pos, n_refdb_id, conn, driver, drivername, replace_ref); } else { author_type = 2; /* publication author */ result = insert_author(ptr_ainfo, author_type, publication_xauthor_pos, n_refdb_id, conn, driver, drivername, replace_ref); } } else if (strncmp("A2 - ", token, 6) == 0 || strncmp("ED - ", token, 6) == 0) { /* this is usually an editor */ strcpy(ptr_ainfo->role, "editor"); author_type = 2; result = insert_author(ptr_ainfo, author_type, publication_xauthor_pos, n_refdb_id, conn, driver, drivername, replace_ref); } else if (strncmp("A3 - ", token, 6) == 0) { /* this is always an editor */ strcpy(ptr_ainfo->role, "editor"); author_type = 3; result = insert_author(ptr_ainfo, 3 /*series editor*/, series_xauthor_pos, n_refdb_id, conn, driver, drivername, replace_ref); } if (result) { sprintf(sql_command, "233:"ULLSPEC"\n", (unsigned long long)(set_count + nongeek_offset)); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } LOG_PRINT(LOG_WARNING, get_status_msg(233)); retval = 1; goto cleanup; } /* increment author counter */ if (author_type == 1) { part_xauthor_pos++; } else if (author_type == 2) { publication_xauthor_pos++; } else { series_xauthor_pos++; } } /* ------------------------------------------------------------ */ else if (strncmp("PY - ", token, 6) == 0 || strncmp("Y1 - ", token, 6) == 0 || strncmp("Y2 - ", token, 6) == 0) { /* use separate year variables for primary and secondary year */ if (strncmp("Y2 - ", token, 6) != 0) { have_py++; year_type = 0; /* publication year */ year = risdate(otherinfo_buffer, &token[6]); result = set_risdata_dateinfo(ptr_risdata, year_type, year, otherinfo_buffer, conn); } else { year_type = 1; /* publication year */ year2 = risdate(otherinfo_buffer, &token[6]); result = set_risdata_dateinfo(ptr_risdata, year_type, year2, otherinfo_buffer, conn); } if (result) { sprintf(sql_command, "233:"ULLSPEC"\n", (unsigned long long)(set_count + nongeek_offset)); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } LOG_PRINT(LOG_WARNING, get_status_msg(233)); retval = 1; goto cleanup; } /* else: all fine */ } /* ------------------------------------------------------------ */ else if (strncmp("SP - ", token, 6) == 0) { /* start page number */ result = set_risdata_field(ptr_risdata, "startpage", &token[6], conn); if (result) { sprintf(sql_command, "233:"ULLSPEC"\n", (unsigned long long)(set_count + nongeek_offset)); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } LOG_PRINT(LOG_WARNING, get_status_msg(233)); retval = 1; goto cleanup; } /* else: all fine */ } /* ------------------------------------------------------------ */ else if (strncmp("EP - ", token, 6) == 0) { /* end page number */ result = set_risdata_field(ptr_risdata, "endpage", &token[6], conn); if (result) { sprintf(sql_command, "233:"ULLSPEC"\n", (unsigned long long)(set_count + nongeek_offset)); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } LOG_PRINT(LOG_WARNING, get_status_msg(233)); retval = 1; goto cleanup; } /* else: all fine */ } /* ------------------------------------------------------------ */ else if (strncmp("KW - ", token, 6) == 0) { /* keyword */ result = insert_keyword(&token[6], n_refdb_id, conn, driver, drivername, 0, replace_ref); if (result) { sprintf(sql_command, "233:"ULLSPEC"\n", (unsigned long long)(set_count + nongeek_offset)); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } LOG_PRINT(LOG_WARNING, get_status_msg(233)); retval = 1; goto cleanup; } /* else: all fine */ } /* ------------------------------------------------------------ */ else if (strncmp("TI - ", token, 6) == 0 || strncmp("T1 - ", token, 6) == 0 || strncmp("CT - ", token, 6) == 0) { if (token[token_len-1] == '.') { /* trim trailing period */ token[token_len-1] = '\0'; } if (has_part_data(type)) { /* part title */ result = set_risdata_field(ptr_risdata, "title", &token[6], conn); } else { /* publication title */ result = set_risdata_field(ptr_risdata, "booktitle", &token[6], conn); } if (result == 1) { sprintf(sql_command, "233:"ULLSPEC"\n", (unsigned long long)(set_count + nongeek_offset)); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } LOG_PRINT(LOG_WARNING, get_status_msg(233)); retval = 1; goto cleanup; } /* else: all fine */ } /* ------------------------------------------------------------ */ else if (strncmp("BT - ", token, 6) == 0 || strncmp("T2 - ", token, 6) == 0) { /* book title */ result = set_risdata_field(ptr_risdata, "booktitle", &token[6], conn); if (result) { sprintf(sql_command, "233:"ULLSPEC"\n", (unsigned long long)(set_count + nongeek_offset)); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } LOG_PRINT(LOG_WARNING, get_status_msg(233)); retval = 1; goto cleanup; } /* else: all fine */ } /* ------------------------------------------------------------ */ else if (strncmp("T3 - ", token, 6) == 0) { /* title series, in COMP and PAT: doi */ if (!strcmp(type, "COMP") || !strcmp(type, "PAT")) { result = insert_ulink(&token[6], 5 /* doi */, n_refdb_id, conn, driver, drivername, n_user_id, 0 /* reference */, replace_ref); } else { result = set_risdata_field(ptr_risdata, "title_series", &token[6], conn); } if (result) { sprintf(sql_command, "233:"ULLSPEC"\n", (unsigned long long)(set_count + nongeek_offset)); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } LOG_PRINT(LOG_WARNING, get_status_msg(233)); retval = 1; goto cleanup; } /* else: all fine */ } /* ------------------------------------------------------------ */ else if (strncmp("JF - ", token, 6) == 0) { /* journal full name */ perinfo.full = strdup(&token[6]); if (perinfo.full == NULL || insert_lilimem(&sentinel, (void**)&(perinfo.full), "journal_full")) { sprintf(sql_command, "233:"ULLSPEC"\n", (unsigned long long)(set_count + nongeek_offset)); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } LOG_PRINT(LOG_WARNING, get_status_msg(233)); retval = 1; goto cleanup; } /* escape any characters that the database server cannot digest */ if (dbi_conn_quote_string(conn, &(perinfo.full)) == 0) { sprintf(sql_command, "801:"ULLSPEC"\n", (unsigned long long)(set_count + nongeek_offset)); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } LOG_PRINT(LOG_CRIT, get_status_msg(801)); retval = 1; goto cleanup; } } else if (strncmp("J1 - ", token, 6) == 0) { /* journal custom abbreviation 1 */ perinfo.custabbrev1 = strdup(&token[6]); if (perinfo.custabbrev1 == NULL || insert_lilimem(&sentinel, (void**)&(perinfo.custabbrev1), "journal_custabbrev1")) { sprintf(sql_command, "233:"ULLSPEC"\n", (unsigned long long)(set_count + nongeek_offset)); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } LOG_PRINT(LOG_WARNING, get_status_msg(233)); retval = 1; goto cleanup; } if (dbi_conn_quote_string(conn, &(perinfo.custabbrev1)) == 0) { sprintf(sql_command, "801:"ULLSPEC"\n", (unsigned long long)(set_count + nongeek_offset)); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } LOG_PRINT(LOG_CRIT, get_status_msg(801)); retval = 1; goto cleanup; } } else if (strncmp("J2 - ", token, 6) == 0) { /* journal custom abbreviation 2 */ perinfo.custabbrev2 = strdup(&token[6]); if (perinfo.custabbrev2 == NULL || insert_lilimem(&sentinel, (void**)&(perinfo.custabbrev2), "journal_custabbrev2")) { sprintf(sql_command, "233:"ULLSPEC"\n", (unsigned long long)(set_count + nongeek_offset)); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } LOG_PRINT(LOG_WARNING, get_status_msg(233)); retval = 1; goto cleanup; } if (dbi_conn_quote_string(conn, &(perinfo.custabbrev2)) == 0) { sprintf(sql_command, "801:"ULLSPEC"\n", (unsigned long long)(set_count + nongeek_offset)); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } LOG_PRINT(LOG_CRIT, get_status_msg(801)); retval = 1; goto cleanup; } } else if (strncmp("JO - ", token, 6) == 0 || strncmp("JA - ", token, 6) == 0) { /* journal abbreviation */ perinfo.abbrev = malloc(strlen(&token[6]) + 2); /* Allocate one char extra to leave space for an additional period when the string is dotified */ if (perinfo.abbrev == NULL || insert_lilimem(&sentinel, (void**)&(perinfo.abbrev), "journal_abbrev")) { sprintf(sql_command, "233:"ULLSPEC"\n", (unsigned long long)(set_count + nongeek_offset)); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } LOG_PRINT(LOG_WARNING, get_status_msg(233)); retval = 1; goto cleanup; } strcpy(perinfo.abbrev, &token[6]); /* add periods, use the connection to conn_refdb if necessary */ dotify_journal(perinfo.abbrev, conn, conn_refdb); if (dbi_conn_quote_string(conn, &(perinfo.abbrev)) == 0) { sprintf(sql_command, "801:"ULLSPEC"\n", (unsigned long long)(set_count + nongeek_offset)); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } LOG_PRINT(LOG_CRIT, get_status_msg(801)); retval = 1; goto cleanup; } } /* ------------------------------------------------------------ */ else if (strncmp("VL - ", token, 6) == 0) { /* volume number */ /* in BOOK and CHAP entries this is the edition */ if (!strcmp(type, "BOOK") || !strcmp(type, "CHAP") || !strcmp(type, "ART") || !strcmp(type, "ADVS") || !strcmp(type, "MUSIC") || !strcmp(type, "NEWS")) { result = set_risdata_field(ptr_risdata, "edition", &token[6], conn); } else { result = set_risdata_field(ptr_risdata, "volume", &token[6], conn); } if (result) { sprintf(sql_command, "233:"ULLSPEC"\n", (unsigned long long)(set_count + nongeek_offset)); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } LOG_PRINT(LOG_WARNING, get_status_msg(233)); retval = 1; goto cleanup; } /* else: all fine */ } /* ------------------------------------------------------------ */ else if (strncmp("CY - ", token, 6) == 0) { /* city of publication */ result = set_risdata_field(ptr_risdata, "city", &token[6], conn); if (result) { sprintf(sql_command, "233:"ULLSPEC"\n", (unsigned long long)(set_count + nongeek_offset)); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } LOG_PRINT(LOG_WARNING, get_status_msg(233)); retval = 1; goto cleanup; } /* else: all fine */ } /* ------------------------------------------------------------ */ else if (strncmp("PB - ", token, 6) == 0) { /* publisher */ result = set_risdata_field(ptr_risdata, "publisher", &token[6], conn); if (result) { sprintf(sql_command, "233:"ULLSPEC"\n", (unsigned long long)(set_count + nongeek_offset)); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } LOG_PRINT(LOG_WARNING, get_status_msg(233)); retval = 1; goto cleanup; } /* else: all fine */ } /* ------------------------------------------------------------ */ else if (strncmp("CP - ", token, 6) == 0 || strncmp("IS - ", token, 6) == 0 || strncmp("ET - ", token, 6) == 0) { /* chapter number or issue. ET goes here too although this is not part of the RIS spec as of RefMan 8.01. However, Endnote seems to use it for edition or something */ /* MPCT, SOUND, and VIDEO use this field for doi */ /* to add more confusion, BOOK uses IS to store VL. We also move CHAP's IS (which here means chapter number) to */ if (!strncmp("IS - ", token, 6) && (!strcmp(type, "MPCT") || !strcmp(type, "SOUND") || !strcmp(type, "VIDEO"))) { result = insert_ulink(&token[6], 5 /* doi */, n_refdb_id, conn, driver, drivername, n_user_id, 0 /* reference */, replace_ref); } else if (!strcmp(type, "BOOK") || !strcmp(type, "ADVS") || !strcmp(type, "MUSIC") || !strcmp(type, "NEWS")) { result = set_risdata_field(ptr_risdata, "volume", &token[6], conn); } else if (!strcmp(type, "CHAP")) { result = set_risdata_field(ptr_risdata, "chapternum", &token[6], conn); } else { result = set_risdata_field(ptr_risdata, "issue", &token[6], conn); } if (result) { sprintf(sql_command, "233:"ULLSPEC"\n", (unsigned long long)(set_count + nongeek_offset)); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } LOG_PRINT(LOG_WARNING, get_status_msg(233)); retval = 1; goto cleanup; } /* else: all fine */ } /* ------------------------------------------------------------ */ else if (strncmp("N2 - ", token, 6) == 0) { /* abstract */ result = set_risdata_field(ptr_risdata, "abstract", &token[6], conn); if (result) { sprintf(sql_command, "233:"ULLSPEC"\n", (unsigned long long)(set_count + nongeek_offset)); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } LOG_PRINT(LOG_WARNING, get_status_msg(233)); retval = 1; goto cleanup; } /* else: all fine */ } /* ------------------------------------------------------------ */ else if (strncmp("SN - ", token, 6) == 0) { /* ISBN/ISSN */ result = set_risdata_field(ptr_risdata, "issn", &token[6], conn); if (result == 1) { sprintf(sql_command, "233:"ULLSPEC"\n", (unsigned long long)(set_count + nongeek_offset)); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } LOG_PRINT(LOG_WARNING, get_status_msg(233)); retval = 1; goto cleanup; } /* else: all fine */ } /* ------------------------------------------------------------ */ else if (strncmp("AD - ", token, 6) == 0) { /* address */ result = set_risdata_field(ptr_risdata, "address", &token[6], conn); if (result) { sprintf(sql_command, "233:"ULLSPEC"\n", (unsigned long long)(set_count + nongeek_offset)); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } LOG_PRINT(LOG_WARNING, get_status_msg(233)); retval = 1; goto cleanup; } /* else: all fine */ } /* ------------------------------------------------------------ */ else if (strncmp("U1 - ", token, 6) == 0 || strncmp("U2 - ", token, 6) == 0 || strncmp("U3 - ", token, 6) == 0 || strncmp("U4 - ", token, 6) == 0 || strncmp("U5 - ", token, 6) == 0 || strncmp("M1 - ", token, 6) == 0 || strncmp("M2 - ", token, 6) == 0 || strncmp("M3 - ", token, 6) == 0) { char tofield[11]; if (!strncmp("U1 - ", token, 6)) { strcpy(tofield, "user1"); } else if (!strncmp("U2 - ", token, 6)) { strcpy(tofield, "user2"); } else if (!strncmp("U3 - ", token, 6)) { strcpy(tofield, "user3"); } else if (!strncmp("U4 - ", token, 6)) { strcpy(tofield, "user4"); } else if (!strncmp("U5 - ", token, 6)) { strcpy(tofield, "user5"); } else if (!strncmp("M1 - ", token, 6)) { strcpy(tofield, "misc1"); } else if (!strncmp("M2 - ", token, 6)) { if (!strcmp(type, "ADVS")) { strcpy(tofield, "doi"); } else { strcpy(tofield, "misc2"); } } else if (!strncmp("M3 - ", token, 6)) { if (strcmp(type, "ADVS") && strcmp(type, "COMP") && strcmp(type, "MPCT") && strcmp(type, "PAT") && strcmp(type, "SOUND") && strcmp(type, "VIDEO")) { strcpy(tofield, "doi"); } else if (!strcmp(type, "ADVS") || !strcmp(type, "COMP") || !strcmp(type, "MPCT") || !strcmp(type, "SOUND") || !strcmp(type, "VIDEO")) { strcpy(tofield, "mediatype"); } else if (!strcmp(type, "PAT")) { strcpy(tofield, "typeofwork"); } } if (!strcmp(tofield, "doi")) { result = insert_ulink(&token[6], 5 /* doi */, n_refdb_id, conn, driver, drivername, n_user_id, 0 /* reference */, replace_ref); } else { result = set_risdata_field(ptr_risdata, tofield, &token[6], conn); } if (result) { sprintf(sql_command, "233:"ULLSPEC"\n", (unsigned long long)(set_count + nongeek_offset)); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } LOG_PRINT(LOG_WARNING, get_status_msg(233)); retval = 1; goto cleanup; } /* else: all fine */ } /* ------------------------------------------------------------ */ else if (strncmp("UR - ", token, 6) == 0) { /* URL */ result = insert_ulink(&token[6], 0 /* url */, n_refdb_id, conn, driver, drivername, n_user_id, 0 /* reference */, replace_ref); if (result) { sprintf(sql_command, "233:"ULLSPEC"\n", (unsigned long long)(set_count + nongeek_offset)); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } LOG_PRINT(LOG_WARNING, get_status_msg(233)); retval = 1; goto cleanup; } /* else: all fine */ } /* ------------------------------------------------------------ */ else if (strncmp("ID - ", token, 6) == 0) { /* use ID value as citekey if non-numeric */ if (n_have_citekey) { char *new_citekey; strncpy(real_citekey, &token[6], 255); real_citekey[255] = '\0'; /* terminate string just in case */ if ((new_citekey = preprocess_citekey_copy(real_citekey, 255)) == NULL) { return 0; } else { real_citekey = new_citekey; } result = set_risdata_field(ptr_risdata, "citekey", real_citekey, conn); if (result) { sprintf(sql_command, "233:"ULLSPEC"\n", (unsigned long long)(set_count + nongeek_offset)); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } LOG_PRINT(LOG_WARNING, get_status_msg(233)); retval = 1; goto cleanup; } /* else: all fine */ } } /* ------------------------------------------------------------ */ else if (strncmp("ER - ", token, 6) != 0) { /* reuse sql_command to assemble log message */ sprintf(sql_command, "unknown token:%s<<%d:%d:%d:%d:%d:%d<<\n", token, (int)token[0], (int)token[1], (int)token[2], (int)token[3], (int)token[4], (int)token[5]); LOG_PRINT(LOG_WARNING, sql_command); } } /* end if not update personal */ token = ris_strtok(token + token_len + 1, &token_len, "\n"); } /* ------------------------------------------------------------ */ /* insert journal information */ result = insert_periodical(&perinfo, n_refdb_id, replace_ref, nis_dummy, conn, drivername); if (result) { sprintf(sql_command, "233:"ULLSPEC"\n", (unsigned long long)(set_count + nongeek_offset)); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } LOG_PRINT(LOG_WARNING, get_status_msg(233)); retval = 1; goto cleanup; } /* else: all fine */ /* ------------------------------------------------------------ */ /* insert default RP if none was specified */ if (replace_ref != ADDREF_UPDATE_PERSONAL && !have_rp && !nis_dummy) { /* set a default reprint status if none was specified */ result = update_reprint(1 /* not in file */, n_refdb_id, n_user_id, conn, NULL, replace_ref); if (result) { sprintf(sql_command, "233:"ULLSPEC"\n", (unsigned long long)(set_count + nongeek_offset)); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } LOG_PRINT(LOG_WARNING, get_status_msg(233)); retval = 1; goto cleanup; } } /* ------------------------------------------------------------ */ /* insert a default pubyear if none was specified */ if (replace_ref != ADDREF_UPDATE_PERSONAL && !have_py && !nis_dummy) { /* set a default publication year if none was specified */ result = set_risdata_dateinfo(ptr_risdata, 0 /* primary */, 0 /* default */, NULL, conn); if (result) { sprintf(sql_command, "233:"ULLSPEC"\n", (unsigned long long)(set_count + nongeek_offset)); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } LOG_PRINT(LOG_WARNING, get_status_msg(233)); retval = 1; goto cleanup; } /* else: all fine */ } /* ------------------------------------------------------------ */ /* insert a default citekey if none was specified */ if (!n_have_citekey && create_new) { citekey = get_unique_citekey(conn, first_author, year, 0 /* refs */, replace_ref); if (citekey && set_risdata_field(ptr_risdata, "citekey", citekey, conn) != 0) { if (citekey) { free((char*)citekey); } sprintf(sql_command, "233:"ULLSPEC"\n", (unsigned long long)(set_count + nongeek_offset)); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } LOG_PRINT(LOG_WARNING, get_status_msg(233)); retval = 1; goto cleanup; } strcpy(real_citekey, citekey); free((char*)citekey); } if (insert_lilid(ptr_id_sentinel, n_refdb_id)) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); } if (*real_citekey) { /* still empty if we update the reference */ sprintf(sql_command, "406:"ULLSPEC":%s:"ULLSPEC"\n", (unsigned long long)(set_count + nongeek_offset), real_citekey, n_refdb_id); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } LOG_PRINT(LOG_WARNING, sql_command); } if (replace_ref != ADDREF_UPDATE_PERSONAL) { /* now write the collected t_refdb data to the database */ result = commit_risdata_fields(ptr_risdata, conn, replace_ref); if (result) { sprintf(sql_command, "233:"ULLSPEC"\n", (unsigned long long)(set_count + nongeek_offset)); if ((new_msgpool = mstrcat(*ptr_msg_pool, sql_command, ptr_msg_pool_len, 0)) == NULL) { return 0; } else { *ptr_msg_pool = new_msgpool; } LOG_PRINT(LOG_WARNING, get_status_msg(233)); retval = 1; } /* else: all fine */ } cleanup: if (retval == 1) { if (strcmp(my_dbi_conn_get_cap(conn, "transaction"), "t")) { /* we have to delete the junk reference manually */ if (n_refdb_id) { /* if no id, no dataset was added anyway */ delete_ref_by_id(n_refdb_id, conn, ptr_clrequest, &addresult); } } else { my_dbi_conn_rollback(conn); } my_dbi_conn_unlock(conn); delete_all_lilimem(&sentinel); free_risdata(ptr_risdata); return 0; } else { my_dbi_conn_commit(conn); } my_dbi_conn_unlock(conn); delete_all_lilimem(&sentinel); free_risdata(ptr_risdata); if (retval == 2) { return 3; } else if (create_new == 1) { return 1; /* successfully added */ } else { return 2; /* successfully updated */ } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_unique_citekey(): creates a unique citekey for a given reference or note const char* get_unique_citekey returns a citekey string in an allocated buffer that the calling function has to free or NULL if some error occurs dbi_conn conn ptr to current database connection structure const char* first_author ptr to string with first author int year the publication year. If 0, don't use year info int type 0 = references 1 = notes int replace_ref indicates the context of the operation ADDREF_ADD = add data ADDREF_UPDATE = replace data ADDREF_UPDATE_PERSONAL = update personal data ADDREF_CHECK = add to temporary tables ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ const char* get_unique_citekey(dbi_conn conn, const char* first_author, int year, int type, int replace_ref) { char *citekey; char *new_citekey; char *sep; const char *my_author; char anonymous[] = "Anonymous"; char yearstring[5] = ""; /* add no year info if no year is provided */ char citekey_base[256] = ""; char sql_command[1024] = ""; char suffix[12] = ""; char prefix[] = TEMP_TABLE_NAME_PREFIX; int n_authorlen; int n_unique = 0; dbi_result dbires; if ((citekey = malloc(CITEKEY_BASE_LENGTH+26)) == NULL) { LOG_PRINT(LOG_ERR, get_status_msg(801)); return NULL; } /* fix insert */ if (replace_ref != ADDREF_CHECK) { *prefix = '\0'; } if (!first_author || !*first_author) { my_author = anonymous; } else { my_author = first_author; } sep = strchr(my_author, (int)','); if (sep) { /* first name ends at comma */ n_authorlen = (sep-my_author > CITEKEY_BASE_LENGTH) ? CITEKEY_BASE_LENGTH : sep-my_author; } else { /* no comma, so use full name */ n_authorlen = strlen(my_author); n_authorlen = (n_authorlen > CITEKEY_BASE_LENGTH) ? CITEKEY_BASE_LENGTH : n_authorlen; } strncpy(citekey_base, my_author, n_authorlen); /* leave space for year and suffix */ citekey_base[n_authorlen] = '\0'; /* terminate just in case */ /* remove any unwanted characters and uppercase string */ /* leave room for year and up to 15 aabb characters */ if ((new_citekey = preprocess_citekey_copy(citekey_base, CITEKEY_BASE_LENGTH)) == NULL) { return NULL; } if (year > 0 && year < 10000) { sprintf(yearstring, "%hd", year); } strcat(new_citekey, yearstring); /* suffix is empty string when the loop starts */ while (!n_unique) { strcpy(citekey, new_citekey); strcat(citekey, suffix); /* now check whether the citekey already exists */ if (!type) { sprintf(sql_command, "SELECT refdb_id FROM t_%srefdb WHERE refdb_citekey=\'%s\'", prefix, citekey); } else { sprintf(sql_command, "SELECT note_id FROM t_note WHERE note_key=\'%s\'", citekey); } LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { LOG_PRINT(LOG_WARNING, "Search ID failed"); free(new_citekey); free(citekey); return NULL; } if (dbi_result_next_row(dbires) == 0) { /* citekey doesn't exist */ n_unique++; } else { /* increment suffix */ if (increment_suffix(suffix, 11, (*upper_citekey == 't') ? 1:0)) { free(citekey); free(new_citekey); return NULL; } } } /* end while */ free(new_citekey); return citekey; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ find_journal(): matches strings against entries in t_periodical to find existing entries static int find_journal returns the ID of a t_periodical set if a match is found; returns 0 if no match is found or if an error occurs int level indicates in which field to search (0 = journal_name, ... 3 = journal_custabbrev) struct PERIODICAL_INFO* ptr_perinfo ptr to struct containing ptrs to properly quoted strings of the journal name synonyms names must be < 256 chars dbi_conn conn ptr to current database connection structure int replace_ref indicates the context of the operation ADDREF_ADD = add data ADDREF_UPDATE = replace data ADDREF_UPDATE_PERSONAL = update personal data ADDREF_CHECK = add to temporary tables ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static unsigned long long find_journal(int level, struct PERIODICAL_INFO* ptr_perinfo, dbi_conn conn, int replace_ref) { char sql_command[512]; char prefix[] = TEMP_TABLE_NAME_PREFIX; unsigned long long periodical_id; /* the ID of a match in t_periodical */ dbi_result dbires; /* fix insert */ if (replace_ref != ADDREF_CHECK) { *prefix = '\0'; } /* search for existing entry in descending order of importance */ if (ptr_perinfo->full != NULL && level == 0) { sprintf(sql_command, "SELECT periodical_id FROM t_%speriodical WHERE periodical_name=", prefix); strcat(sql_command, ptr_perinfo->full); } else if (ptr_perinfo->abbrev != NULL && level == 1) { sprintf(sql_command, "SELECT periodical_id FROM t_%speriodical WHERE periodical_abbrev=", prefix); strcat(sql_command, ptr_perinfo->abbrev); } else if (ptr_perinfo->custabbrev1 != NULL && level == 2) { sprintf(sql_command, "SELECT periodical_id FROM t_%speriodical WHERE periodical_custabbrev1=", prefix); strcat(sql_command, ptr_perinfo->custabbrev1); } else if (ptr_perinfo->custabbrev2 != NULL && level == 3) { /* journal_custabbrev2 != NULL */ sprintf(sql_command, "SELECT periodical_id FROM t_%speriodical WHERE periodical_custabbrev2=", prefix); strcat(sql_command, ptr_perinfo->custabbrev2); } else { return 0; } LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { LOG_PRINT(LOG_WARNING, "connect failed"); return 0; } if (!dbi_result_next_row(dbires)) { dbi_result_free(dbires); return 0; } else { periodical_id = my_dbi_result_get_idval(dbires, "periodical_id"); dbi_result_free(dbires); return periodical_id; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ insert_periodical(): inserts periodical info into t_periodical and t_refdb int insert_periodical returns 0 if ok, >0 if error error codes: 1 = out of memory 2 = insert JX failed 3 = driver not supported 4 = select from t_periodical failed 5 = read from t_periodical failed 6 = update JF failed 7 = update JO failed 8 = update J1 failed 9 = update J2 failed 10 = update periodical failed struct PERIODICAL_INFO* ptr_perinfo unsigned long long id id of the row to update int replace_ref indicates the context of the operation ADDREF_ADD = add data ADDREF_UPDATE = replace data ADDREF_UPDATE_PERSONAL = update personal data ADDREF_CHECK = add to temporary tables int nis_dummy if 1, dataset is a dummy dbi_conn conn the database connection const char* drivername name of database driver ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int insert_periodical(struct PERIODICAL_INFO* ptr_perinfo, unsigned long long n_refdb_id, int replace_ref, int nis_dummy, dbi_conn conn, const char* drivername) { int n_jformats_avail = 0; int i; int is_first = 0; unsigned long long n_periodical_id; char* sql_command; char prefix[] = TEMP_TABLE_NAME_PREFIX; size_t sql_cmd_len = 2048; dbi_result dbires; dbi_result dbires1; if (!(sql_command = malloc(sql_cmd_len))) { LOG_PRINT(LOG_WARNING, "malloc failed"); return 1; } /* fix insert */ if (replace_ref != ADDREF_CHECK) { *prefix = '\0'; } /* check which information is available. We do this rather here than in the main loop because a malformed RIS file (e.g. with two JO entries) would lead to erroneous counts */ n_jformats_avail += (ptr_perinfo->full != NULL) ? 1 : 0; n_jformats_avail += (ptr_perinfo->abbrev != NULL) ? 1 : 0; n_jformats_avail += (ptr_perinfo->custabbrev1 != NULL) ? 1 : 0; n_jformats_avail += (ptr_perinfo->custabbrev2 != NULL) ? 1 : 0; if (replace_ref != ADDREF_UPDATE_PERSONAL && n_jformats_avail > 0 && !nis_dummy) { /* set the periodical information from what we intermediately gathered */ i = 0; n_periodical_id = 0L; /* loop over all available journal items and try to find a match in t_periodical */ while (i < 4 && n_periodical_id == 0L) { n_periodical_id = find_journal(i, ptr_perinfo, conn, replace_ref); i++; } /* if no match was found, we insert a new entry into t_periodical */ if (n_periodical_id == 0L) { sprintf(sql_command, "INSERT INTO t_%speriodical (", prefix); is_first = 1; if (ptr_perinfo->full != NULL) { strcat(sql_command, "periodical_name"); is_first = 0; /* use colon for next item */ } if (ptr_perinfo->abbrev != NULL) { if (is_first) { strcat(sql_command, "periodical_abbrev"); is_first = 0; /* use colon for next item */ } else { strcat(sql_command, ", periodical_abbrev"); } } if (ptr_perinfo->custabbrev1 != NULL) { if (is_first) { strcat(sql_command, "periodical_custabbrev1"); is_first = 0; /* use colon for next item */ } else { strcat(sql_command, ", periodical_custabbrev1"); } } if (ptr_perinfo->custabbrev2 != NULL) { if (is_first) { strcat(sql_command, "periodical_custabbrev2"); } else { strcat(sql_command, ", periodical_custabbrev2"); } } strcat(sql_command, ") VALUES ("); is_first = 1; if (ptr_perinfo->full != NULL) { strcat(sql_command, ptr_perinfo->full); is_first = 0; /* use colon for next item */ } if (ptr_perinfo->abbrev != NULL) { if (is_first) { strcat(sql_command, ptr_perinfo->abbrev); is_first = 0; /* use colon for next item */ } else { strcat(sql_command, ","); strcat(sql_command, ptr_perinfo->abbrev); } } if (ptr_perinfo->custabbrev1 != NULL) { if (is_first) { strcat(sql_command, ptr_perinfo->custabbrev1); is_first = 0; /* use colon for next item */ } else { strcat(sql_command, ","); strcat(sql_command, ptr_perinfo->custabbrev1); } } if (ptr_perinfo->custabbrev2 != NULL) { if (is_first) { strcat(sql_command, ptr_perinfo->custabbrev2); } else { strcat(sql_command, ","); strcat(sql_command, ptr_perinfo->custabbrev2); } } strcat(sql_command, ")"); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { LOG_PRINT(LOG_WARNING, "insert JX failed"); free(sql_command); return 2; } if (!strcmp(my_dbi_conn_get_cap(conn, "named_seq"), "f")) { n_periodical_id = dbi_conn_sequence_last(conn, NULL); } else { sprintf(sql_command, "t_%speriodical_periodical_id_seq", prefix); n_periodical_id = dbi_conn_sequence_last(conn, sql_command); } dbi_result_free(dbires); } else { /* we have a matching entry in t_periodical. See whether we can fill in any missing information */ sprintf(sql_command, "SELECT periodical_name, periodical_abbrev, periodical_custabbrev1, periodical_custabbrev2 FROM t_%speriodical WHERE periodical_id="ULLSPEC, prefix, (unsigned long long)n_periodical_id); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { LOG_PRINT(LOG_WARNING, "select from t_periodical failed"); free(sql_command); return 4; } if (!dbi_result_next_row(dbires)) { dbi_result_free(dbires); LOG_PRINT(LOG_WARNING, "read from t_periodical failed"); free(sql_command); return 5; } else { if (/* dbi_result_get_string(dbires, "periodical_name") != NULL */ /* && */ptr_perinfo->full != NULL) { sprintf(sql_command, "UPDATE t_%speriodical SET periodical_name=%s WHERE periodical_id = "ULLSPEC, prefix, ptr_perinfo->full, (unsigned long long)n_periodical_id); LOG_PRINT(LOG_DEBUG, sql_command); dbires1 = dbi_conn_query(conn, sql_command); if (!dbires1) { dbi_result_free(dbires); LOG_PRINT(LOG_WARNING, "update JF failed"); free(sql_command); return 6; } dbi_result_free(dbires1); } if (/* dbi_result_get_string(dbires, "periodical_abbrev") && */ptr_perinfo->abbrev != NULL) { sprintf(sql_command, "UPDATE t_%speriodical SET periodical_abbrev=%s WHERE periodical_id = "ULLSPEC, prefix, ptr_perinfo->abbrev, (unsigned long long)n_periodical_id); LOG_PRINT(LOG_DEBUG, sql_command); dbires1 = dbi_conn_query(conn, sql_command); if (!dbires1) { dbi_result_free(dbires); LOG_PRINT(LOG_WARNING, "update JO failed"); free(sql_command); return 7; } dbi_result_free(dbires1); } if (/* dbi_result_get_string(dbires, "periodical_custabbrev1") != NULL */ /* && */ptr_perinfo->custabbrev1 != NULL) { sprintf(sql_command, "UPDATE t_%speriodical SET periodical_custabbrev1=%s WHERE periodical_id = "ULLSPEC, prefix, ptr_perinfo->custabbrev1, (unsigned long long)n_periodical_id); LOG_PRINT(LOG_DEBUG, sql_command); dbires1 = dbi_conn_query(conn, sql_command); if (!dbires1) { dbi_result_free(dbires); LOG_PRINT(LOG_WARNING, "update J1 failed"); free(sql_command); return 8; } dbi_result_free(dbires1); } if (/* dbi_result_get_string(dbires, "periodical_custabbrev2") != NULL */ /* && */ptr_perinfo->custabbrev2 != NULL) { sprintf(sql_command, "UPDATE t_%speriodical SET periodical_custabbrev2=%s WHERE periodical_id = "ULLSPEC, prefix, ptr_perinfo->custabbrev2, (unsigned long long)n_periodical_id); LOG_PRINT(LOG_DEBUG, sql_command); dbires1 = dbi_conn_query(conn, sql_command); if (!dbires1) { dbi_result_free(dbires); LOG_PRINT(LOG_WARNING, "update J2 failed"); free(sql_command); return 9; } dbi_result_free(dbires1); } dbi_result_free(dbires); } } /* finally create entry in t_refdb table */ sprintf(sql_command, "UPDATE t_%srefdb SET refdb_periodical_id="ULLSPEC" WHERE refdb_id = "ULLSPEC, prefix, (unsigned long long)n_periodical_id, (unsigned long long)n_refdb_id); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { LOG_PRINT(LOG_WARNING, "update periodical failed"); free(sql_command); return 10; } dbi_result_free(dbires); } free(sql_command); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ insert_user(): checks for a user in the database and creates an entry if the user doesn't exist yet int insert_user returns 0 if ok, >0 if error error codes: 1 = search user failed 2 = insert t_user failed 3 = insert t_xuser failed 4 = username too long 5 = other 6 = query t_xuser failed 7 = pick reference failed 8 = out of memory const char* set_owner name of user who owns the data unsigned long long n_refdb_id reference ID unsigned long long* ptr_n_user_id user ID (value will be updated) dbi_conn conn the database connection const char* drivername name of database driver int replace_ref indicates the context of the operation ADDREF_ADD = add data ADDREF_UPDATE = replace data ADDREF_UPDATE_PERSONAL = update personal data ADDREF_CHECK = add to temporary tables int mode 0 = reference entry 1 = note entry ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int insert_user(const char* set_owner, unsigned long long n_refdb_id, unsigned long long* ptr_n_user_id, dbi_conn conn, const char* drivername, int replace_ref, int mode) { char sql_command[256]; char prefix[] = TEMP_TABLE_NAME_PREFIX; int nhave_xuser = 1; dbi_result dbires; dbi_result dbires1; if (!set_owner || !*set_owner) { /* nothing to do */ return 0; } else if (strlen(set_owner) > DBUSER_LENGTH) { LOG_PRINT(LOG_WARNING, "username too long"); return 4; } /* fix insert */ if (replace_ref != ADDREF_CHECK) { *prefix = '\0'; } /* create user and xuser entries */ /* search for existing entry */ sprintf(sql_command, "SELECT user_id FROM t_%suser WHERE user_name=\'%s\'", prefix, set_owner); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { LOG_PRINT(LOG_WARNING, "search user failed"); return 1; } if (!dbi_result_next_row(dbires) || (*ptr_n_user_id = my_dbi_result_get_idval(dbires, "user_id")) == 0) { /* requested user not found */ sprintf(sql_command, "INSERT INTO t_%suser (user_name) VALUES (\'%s\')", prefix, set_owner); LOG_PRINT(LOG_DEBUG, sql_command); dbires1 = dbi_conn_query(conn, sql_command); if (!dbires1) { dbi_result_free(dbires); LOG_PRINT(LOG_WARNING, "insert user failed"); return 2; } /* retrieve user_id of newly created user entry */ if (!strcmp(my_dbi_conn_get_cap(conn, "named_seq"), "f")) { *ptr_n_user_id = dbi_conn_sequence_last(conn, NULL); } else { sprintf(sql_command, "t_%suser_user_id_seq", prefix); *ptr_n_user_id = dbi_conn_sequence_last(conn, sql_command); } dbi_result_free(dbires1); } if (!mode && (replace_ref == ADDREF_UPDATE || replace_ref == ADDREF_UPDATE_PERSONAL)) { sprintf(sql_command, "SELECT user_id FROM t_xuser WHERE user_id="ULLSPEC" AND refdb_id="ULLSPEC, (unsigned long long)(*ptr_n_user_id), (unsigned long long)n_refdb_id); LOG_PRINT(LOG_DEBUG, sql_command); dbires1 = dbi_conn_query(conn, sql_command); if (!dbires1) { dbi_result_free(dbires); LOG_PRINT(LOG_WARNING, "query t_xuser failed"); return 6; } if (!dbi_result_next_row(dbires1)) { /* requested entry missing */ nhave_xuser = 0; } dbi_result_free(dbires1); } if (!mode && (replace_ref == ADDREF_ADD || replace_ref == ADDREF_CHECK || !nhave_xuser)) { int result; struct ADDRESULT* ptr_dummy_addresult = new_addresult(512); if (!ptr_dummy_addresult) { return 8; } /* create entry in xuser table */ sprintf(sql_command, "INSERT INTO t_%sxuser (user_id, refdb_id) VALUES ("ULLSPEC","ULLSPEC")", prefix, (unsigned long long)(*ptr_n_user_id), (unsigned long long)n_refdb_id); LOG_PRINT(LOG_DEBUG, sql_command); dbires1 = dbi_conn_query(conn, sql_command); if (!dbires1) { free(ptr_dummy_addresult); dbi_result_free(dbires); LOG_PRINT(LOG_WARNING, "insert into t_xuser failed"); return 3; } dbi_result_free(dbires1); if (replace_ref != ADDREF_CHECK) { /* add the ref to the default personal reference list */ result = pick_one_reference(conn, n_refdb_id, *ptr_n_user_id, "" /* use default list */, set_owner, ptr_dummy_addresult); /* todo: should the message in ptr_dummy_addresult->msg be passed to the calling function? */ if (result) { free_addresult(ptr_dummy_addresult); dbi_result_free(dbires); return 7; } } free_addresult(ptr_dummy_addresult); } dbi_result_free(dbires); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ update_reprint(): updates the reprint info in the t_xuser table int update_reprint returns 0 if ok, 1 if error int rp_type type of reprint 0=in file, 1=not in file, 2=on request unsigned long long n_refdb_id reference ID unsigned long long n_user_id user id dbi_conn conn the database connection const char* date_buffer ptr to buffer holding date for on request type int replace_ref indicates the context of the operation ADDREF_ADD = add data ADDREF_UPDATE = replace data ADDREF_UPDATE_PERSONAL = update personal data ADDREF_CHECK = add to temporary tables ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int update_reprint(int rp_type, unsigned long long n_refdb_id, unsigned long long n_user_id, dbi_conn conn, const char* date_buffer, int replace_ref) { char sql_command[512]; char buffer[128]; char prefix[] = TEMP_TABLE_NAME_PREFIX; dbi_result dbires; /* fix insert */ if (replace_ref != ADDREF_CHECK) { *prefix = '\0'; } sprintf(sql_command, "UPDATE t_%sxuser SET xuser_reprint = \'", prefix); if (rp_type == 0) { strcat(sql_command, "IN FILE"); } else if (rp_type == 1) { strcat(sql_command, "NOT IN FILE"); } else { strcat(sql_command, "ON REQUEST"); } sprintf(buffer, "\' WHERE refdb_id="ULLSPEC" AND user_id="ULLSPEC, (unsigned long long)n_refdb_id, (unsigned long long)n_user_id); strcat(sql_command, buffer); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { LOG_PRINT(LOG_WARNING, "update RP failed"); return 1; } dbi_result_free(dbires); if (rp_type == 2 && date_buffer && *date_buffer) { /* on request */ sprintf(sql_command, "UPDATE t_%sxuser SET xuser_date = \'", prefix); strcat(sql_command, date_buffer); sprintf(buffer, "\' WHERE refdb_id="ULLSPEC" AND user_id="ULLSPEC, (unsigned long long)n_refdb_id, (unsigned long long)n_user_id); strcat(sql_command, buffer); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { LOG_PRINT(LOG_WARNING, "update RP failed"); return 1; } dbi_result_free(dbires); } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ update_notes(): updates the notes info in the t_xuser table int update_notes returns 0 if ok, 1 if malloc error, 2 if db error const char* notes the notes string unsigned long long n_refdb_id reference ID unsigned long long n_user_id user id dbi_conn conn the database connection dbi_driver driver ptr to database driver int replace_ref indicates the context of the operation ADDREF_ADD = add data ADDREF_UPDATE = replace data ADDREF_UPDATE_PERSONAL = update personal data ADDREF_CHECK = add to temporary tables ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int update_notes(const char* notes, unsigned long long n_refdb_id, unsigned long long n_user_id, dbi_conn conn, dbi_driver driver, int replace_ref) { char prefix[] = TEMP_TABLE_NAME_PREFIX; char sql_command[64]; /* fix insert */ if (replace_ref != ADDREF_CHECK) { *prefix = '\0'; } sprintf(sql_command, "UPDATE t_%sxuser SET xuser_notes=", prefix); return update_user_field(notes, n_refdb_id, n_user_id, conn, driver, sql_command, "update AB failed"); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ update_avail(): updates the availability info in the t_xuser table int update_avail returns 0 if ok, 1 if malloc error, 2 if db error const char* avail the availability string unsigned long long n_refdb_id reference ID unsigned long long n_user_id user id dbi_conn conn the database connection dbi_driver driver ptr to database driver int replace_ref indicates the context of the operation ADDREF_ADD = add data ADDREF_UPDATE = replace data ADDREF_UPDATE_PERSONAL = update personal data ADDREF_CHECK = add to temporary tables ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int update_avail(const char* avail, unsigned long long n_refdb_id, unsigned long long n_user_id, dbi_conn conn, dbi_driver driver, int replace_ref) { char prefix[] = TEMP_TABLE_NAME_PREFIX; char sql_command[64]; /* fix insert */ if (replace_ref != ADDREF_CHECK) { *prefix = '\0'; } sprintf(sql_command, "UPDATE t_%sxuser SET xuser_avail=", prefix); return update_user_field(avail, n_refdb_id, n_user_id, conn, driver, sql_command, "update AV failed"); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ update_user_field(): updates info in the t_xuser table static int update_user_field returns 0 if ok, 1 if malloc error, 2 if db error const char* fieldvalue the value string unsigned long long n_refdb_id reference ID unsigned long long n_user_id user id dbi_conn conn the database connection dbi_driver driver ptr to database driver const char* query_stub beginning of query string const char* errmsg error message for database error ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int update_user_field(const char* fieldvalue, unsigned long long n_refdb_id, unsigned long long n_user_id, dbi_conn conn, dbi_driver driver, const char* query_stub, const char* errmsg) { char* sql_command; char* new_sql_command; char* escape_buffer; char buffer[128]; size_t sql_cmd_len = 4096; dbi_result dbires; if (!fieldvalue || !*fieldvalue) { /* nothing to do */ return 0; } if (!(sql_command = malloc(sql_cmd_len))) { LOG_PRINT(LOG_WARNING, "malloc failed"); return 1; } strcpy(sql_command, query_stub); escape_buffer = strdup(fieldvalue); if (!escape_buffer) { LOG_PRINT(LOG_WARNING, "malloc failed"); free(sql_command); return 1; } /* escape any characters that the database server cannot digest */ if (dbi_conn_quote_string(conn, &escape_buffer) == 0) { LOG_PRINT(LOG_WARNING, "out of memory"); return 1; } /* use mstrcat as notes length is not limited */ if ((new_sql_command = mstrcat(sql_command, escape_buffer, &sql_cmd_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, "malloc failed"); free(escape_buffer); free(sql_command); return 1; } else { sql_command = new_sql_command; } free(escape_buffer); sprintf(buffer, " WHERE refdb_id="ULLSPEC" AND user_id="ULLSPEC, (unsigned long long)n_refdb_id, (unsigned long long)n_user_id); if ((new_sql_command = mstrcat(sql_command, buffer, &sql_cmd_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, "malloc failed"); return 1; } else { sql_command = new_sql_command; } LOG_PRINT(LOG_DEBUG, sql_command); /* now send query */ dbires = dbi_conn_query(conn, sql_command); free(sql_command); if (!dbires) { LOG_PRINT(LOG_WARNING, errmsg); return 2; } dbi_result_free(dbires); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ insert_author(): inserts author info into t_author and t_xauthor tables int insert_author returns 0 if ok, >0 if error error codes: 1 = malloc failed 2 = query AU failed 3 = insert AU failed 4 = driver not supported 5 = insert AU x failed struct AUTHOR_INFO* ptr_ainfo ptr to structure with the name parts int author_type 1 = primary, 2 = secondary, 3 = tertiary int xauthor_pos position of author in the authorlist unsigned long long n_refdb_id reference ID dbi_conn conn the database connection dbi_driver driver ptr to database driver const char* drivername name of database driver int replace_ref indicates the context of the operation ADDREF_ADD = add data ADDREF_UPDATE = replace data ADDREF_UPDATE_PERSONAL = update personal data ADDREF_CHECK = add to temporary tables ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int insert_author(struct AUTHOR_INFO* ptr_ainfo, int author_type, int xauthor_pos, unsigned long long n_refdb_id, dbi_conn conn, dbi_driver driver, const char* drivername, int replace_ref) { char* sql_command; char* new_sql_command; char cropped_author[256]; char buffer[128]; char prefix[] = TEMP_TABLE_NAME_PREFIX; char* escape_buffer; size_t sql_cmd_len = 512; unsigned long long n_author_id; dbi_result dbires; dbi_result dbires1; /* todo: continue here */ if (ptr_ainfo && *(ptr_ainfo->name)) { /* make sure author doesn't exceed length limit */ strncpy(cropped_author, ptr_ainfo->name, 255); cropped_author[255] = '\0'; } else { /* nothing to do */ return 0; } if (!(sql_command = malloc(sql_cmd_len))) { LOG_PRINT(LOG_WARNING, "malloc failed"); return 1; } /* fix insert */ if (replace_ref != ADDREF_CHECK) { *prefix = '\0'; } /* first search for existing entry */ sprintf(sql_command, "SELECT author_id FROM t_%sauthor WHERE author_name=", prefix); escape_buffer = strdup(cropped_author); if (escape_buffer == NULL) { LOG_PRINT(LOG_WARNING, "malloc failed"); free(sql_command); return 1; } /* escape any characters that the database server cannot digest */ if (dbi_conn_quote_string(conn, &escape_buffer) == 0) { LOG_PRINT(LOG_WARNING, "out of memory"); free(sql_command); free(escape_buffer); return 1; } if ((new_sql_command = mstrcat(sql_command, escape_buffer, &sql_cmd_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, "malloc failed"); free(sql_command); free(escape_buffer); return 1; } else { sql_command = new_sql_command; } LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { LOG_PRINT(LOG_WARNING, "query AU failed"); free(sql_command); free(escape_buffer); return 2; } if (dbi_result_next_row(dbires) == 0) { char* another_escape_buffer; /* next create entry in author table, if necessary */ sprintf(sql_command, "INSERT INTO t_%sauthor (author_name, author_lastname, author_firstname, author_middlename, author_suffix) VALUES (", prefix); if ((new_sql_command = mstrcat(sql_command, escape_buffer, &sql_cmd_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, "malloc failed"); free(sql_command); free(escape_buffer); return 1; } else { sql_command = new_sql_command; } if ((new_sql_command = mstrcat(sql_command, ",", &sql_cmd_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, "malloc failed"); free(sql_command); free(escape_buffer); return 1; } else { sql_command = new_sql_command; } /* lastname ---------------------------------------------------- */ if (*(ptr_ainfo->lastname)) { another_escape_buffer = strdup(ptr_ainfo->lastname); if (another_escape_buffer == NULL) { LOG_PRINT(LOG_WARNING, "malloc failed"); free(sql_command); free(escape_buffer); return 1; } /* escape any characters that the database server cannot digest */ if (dbi_conn_quote_string(conn, &another_escape_buffer) == 0) { LOG_PRINT(LOG_WARNING, "out of memory"); free(sql_command); free(escape_buffer); free(another_escape_buffer); return 1; } if ((new_sql_command = mstrcat(sql_command, another_escape_buffer, &sql_cmd_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, "malloc failed"); free(sql_command); free(escape_buffer); free(another_escape_buffer); return 1; } else { sql_command = new_sql_command; } free(another_escape_buffer); } else { if ((new_sql_command = mstrcat(sql_command, "NULL", &sql_cmd_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, "malloc failed"); free(sql_command); free(escape_buffer); free(another_escape_buffer); return 1; } else { sql_command = new_sql_command; } } if ((new_sql_command = mstrcat(sql_command, ",", &sql_cmd_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, "malloc failed"); free(sql_command); free(escape_buffer); return 1; } else { sql_command = new_sql_command; } /* firstname ---------------------------------------------------- */ if (*(ptr_ainfo->firstname)) { another_escape_buffer = strdup(ptr_ainfo->firstname); if (another_escape_buffer == NULL) { LOG_PRINT(LOG_WARNING, "malloc failed"); free(sql_command); free(escape_buffer); return 1; } /* escape any characters that the database server cannot digest */ if (dbi_conn_quote_string(conn, &another_escape_buffer) == 0) { LOG_PRINT(LOG_WARNING, "out of memory"); free(sql_command); free(escape_buffer); free(another_escape_buffer); return 1; } if ((new_sql_command = mstrcat(sql_command, another_escape_buffer, &sql_cmd_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, "malloc failed"); free(sql_command); free(escape_buffer); free(another_escape_buffer); return 1; } else { sql_command = new_sql_command; } free(another_escape_buffer); } else { if ((new_sql_command = mstrcat(sql_command, "NULL", &sql_cmd_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, "malloc failed"); free(sql_command); free(escape_buffer); free(another_escape_buffer); return 1; } else { sql_command = new_sql_command; } } if ((new_sql_command = mstrcat(sql_command, ",", &sql_cmd_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, "malloc failed"); free(sql_command); free(escape_buffer); return 1; } else { sql_command = new_sql_command; } /* middlename ---------------------------------------------------- */ if (*(ptr_ainfo->middlename)) { another_escape_buffer = strdup(ptr_ainfo->middlename); if (another_escape_buffer == NULL) { LOG_PRINT(LOG_WARNING, "malloc failed"); free(sql_command); free(escape_buffer); return 1; } /* escape any characters that the database server cannot digest */ if (dbi_conn_quote_string(conn, &another_escape_buffer) == 0) { LOG_PRINT(LOG_WARNING, "out of memory"); free(sql_command); free(escape_buffer); free(another_escape_buffer); return 1; } if ((new_sql_command = mstrcat(sql_command, another_escape_buffer, &sql_cmd_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, "malloc failed"); free(sql_command); free(escape_buffer); free(another_escape_buffer); return 1; } else { sql_command = new_sql_command; } free(another_escape_buffer); } else { if ((new_sql_command = mstrcat(sql_command, "NULL", &sql_cmd_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, "malloc failed"); free(sql_command); free(escape_buffer); free(another_escape_buffer); return 1; } else { sql_command = new_sql_command; } } if ((new_sql_command = mstrcat(sql_command, ",", &sql_cmd_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, "malloc failed"); free(sql_command); free(escape_buffer); return 1; } else { sql_command = new_sql_command; } /* suffix ---------------------------------------------------- */ if (*(ptr_ainfo->suffix)) { another_escape_buffer = strdup(ptr_ainfo->suffix); if (another_escape_buffer == NULL) { LOG_PRINT(LOG_WARNING, "malloc failed"); free(sql_command); free(escape_buffer); return 1; } /* escape any characters that the database server cannot digest */ if (dbi_conn_quote_string(conn, &another_escape_buffer) == 0) { LOG_PRINT(LOG_WARNING, "out of memory"); free(sql_command); free(escape_buffer); free(another_escape_buffer); return 1; } if ((new_sql_command = mstrcat(sql_command, another_escape_buffer, &sql_cmd_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, "malloc failed"); free(sql_command); free(escape_buffer); free(another_escape_buffer); return 1; } else { sql_command = new_sql_command; } free(another_escape_buffer); } else { if ((new_sql_command = mstrcat(sql_command, "NULL", &sql_cmd_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, "malloc failed"); free(sql_command); free(escape_buffer); free(another_escape_buffer); return 1; } else { sql_command = new_sql_command; } } if ((new_sql_command = mstrcat(sql_command, ")", &sql_cmd_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, "malloc failed"); free(sql_command); free(escape_buffer); return 1; } else { sql_command = new_sql_command; } LOG_PRINT(LOG_DEBUG, sql_command); dbires1 = dbi_conn_query(conn, sql_command); if (!dbires1) { LOG_PRINT(LOG_WARNING, "insert AU failed"); free(sql_command); free(escape_buffer); return 3; } dbi_result_free(dbires1); if (!strcmp(my_dbi_conn_get_cap(conn, "named_seq"), "f")) { n_author_id = dbi_conn_sequence_last(conn, NULL); } else { sprintf(sql_command, "t_%sauthor_author_id_seq", prefix); n_author_id = dbi_conn_sequence_last(conn, sql_command); } } else { n_author_id = my_dbi_result_get_idval(dbires, "author_id"); } dbi_result_free(dbires); free(escape_buffer); /* finally create entry in author xref table */ sprintf(sql_command, "INSERT INTO t_%sxauthor (author_id, refdb_id, xauthor_type, xauthor_position, xauthor_role) VALUES (", prefix); escape_buffer = strdup(ptr_ainfo->role); if (escape_buffer == NULL) { LOG_PRINT(LOG_WARNING, "malloc failed"); free(sql_command); return 1; } /* escape any characters that the database server cannot digest */ if (dbi_conn_quote_string(conn, &escape_buffer) == 0) { LOG_PRINT(LOG_WARNING, "out of memory"); free(sql_command); free(escape_buffer); return 1; } sprintf(buffer, ULLSPEC", "ULLSPEC", %s, %d, %s)", (unsigned long long)n_author_id, (unsigned long long)n_refdb_id, get_author_type_string(driver, author_type), xauthor_pos, escape_buffer); strcat(sql_command, buffer); free(escape_buffer); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { LOG_PRINT(LOG_WARNING, "insert AU x failed"); free(sql_command); return 5; } dbi_result_free(dbires); free(sql_command); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ update_dateinfo(): updates pubyear and otherinfo fields int update dateinfo returns 0 if ok, >0 if error error codes: 1 = malloc failed 2 = update YX failed 3 = update YX (other) failed int year_type 0 = primary, 1 = secondary int year the year const char* otherinfo string containing otherinfo unsigned long long n_refdb_id reference ID dbi_conn conn the database connection dbi_driver driver ptr to database driver ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int update_dateinfo(int date_type, int year, const char* otherinfo, unsigned long long n_refdb_id, dbi_conn conn, dbi_driver driver) { char cropped_otherinfo[256]; char* sql_command; char* escape_buffer; size_t sql_cmd_len = 512; dbi_result dbires; if (otherinfo && *otherinfo) { strncpy(cropped_otherinfo, otherinfo, 255); cropped_otherinfo[255] = '\0'; } else { cropped_otherinfo[0] = '\0'; } if (!(sql_command = malloc(sql_cmd_len))) { LOG_PRINT(LOG_WARNING, "malloc failed"); return 1; } if (!date_type) { sprintf(sql_command, "UPDATE t_refdb SET refdb_pubyear=%hd WHERE refdb_id="ULLSPEC, year, (unsigned long long)n_refdb_id); } else { sprintf(sql_command, "UPDATE t_refdb SET refdb_secyear=%hd WHERE refdb_id="ULLSPEC, year, (unsigned long long)n_refdb_id); } LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { LOG_PRINT(LOG_WARNING, "update YX failed"); free(sql_command); return 2; } dbi_result_free(dbires); if (!*cropped_otherinfo) { /* we're done */ free(sql_command); return 0; } escape_buffer = strdup(cropped_otherinfo); if (escape_buffer == NULL) { free(sql_command); LOG_PRINT(LOG_WARNING, "malloc failed"); return 1; } /* escape any characters that the database server cannot digest */ if (dbi_conn_quote_string(conn, &escape_buffer) == 0) { LOG_PRINT(LOG_WARNING, "out of memory"); free(sql_command); free(escape_buffer); return 1; } if (!date_type) { sprintf(sql_command, "UPDATE t_refdb SET refdb_pyother_info=%s WHERE refdb_id="ULLSPEC, escape_buffer, (unsigned long long)n_refdb_id); } else { sprintf(sql_command, "UPDATE t_refdb SET refdb_secother_info=%s WHERE refdb_id="ULLSPEC, escape_buffer, (unsigned long long)n_refdb_id); } free(escape_buffer); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_WARNING, "update YX (other) failed"); return 3; } dbi_result_free(dbires); free(sql_command); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ insert_keyword(): inserts keyword info into t_keyword and t_xkeyword int insert_keyword returns 0 if ok, >0 if error error codes: 1 = malloc failed 2 = query KW failed 3 = insert KW failed 4 = driver not supported 5 = insert KW x failed const char* keyword string containing keyword unsigned long long n_xref_id reference or note ID dbi_conn conn the database connection dbi_driver driver ptr to database driver const char* drivername name of database driver int mode 0 = reference 1 = note int replace_ref indicates the context of the operation ADDREF_ADD = add data ADDREF_UPDATE = replace data ADDREF_UPDATE_PERSONAL = update personal data ADDREF_CHECK = add to temporary tables ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int insert_keyword(const char* keyword, unsigned long long n_xref_id, dbi_conn conn, dbi_driver driver, const char* drivername, int mode, int replace_ref) { char* sql_command; char* new_sql_command; char* escape_buffer; char cropped_keyword[256]; char prefix[] = TEMP_TABLE_NAME_PREFIX; size_t sql_cmd_len = 512; unsigned long long n_keyword_id; dbi_result dbires; dbi_result dbires1; if (!keyword || !*keyword) { /* we're done */ return 0; } if (!(sql_command = malloc(sql_cmd_len))) { LOG_PRINT(LOG_WARNING, "malloc failed"); return 1; } /* fix insert */ if (replace_ref != ADDREF_CHECK) { *prefix = '\0'; } strncpy(cropped_keyword, keyword, 255); cropped_keyword[255] = '\0'; /* first search for existing entry */ sprintf(sql_command, "SELECT keyword_id FROM t_%skeyword WHERE keyword_name=", prefix); escape_buffer = strdup(keyword); if (escape_buffer == NULL) { LOG_PRINT(LOG_WARNING, "malloc failed"); free(sql_command); return 1; } /* escape any characters that the database server cannot digest */ if (dbi_conn_quote_string(conn, &escape_buffer) == 0) { LOG_PRINT(LOG_WARNING, "out of memory"); return 1; } if ((new_sql_command = mstrcat(sql_command, escape_buffer, &sql_cmd_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, "malloc failed"); free(escape_buffer); free(sql_command); return 1; } else { sql_command = new_sql_command; } LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { LOG_PRINT(LOG_WARNING, "query KW failed"); return 2; } if (dbi_result_next_row(dbires) == 0) { /* next create entry in keyword table, if necessary */ sprintf(sql_command, "INSERT INTO t_%skeyword (keyword_name) VALUES (", prefix); if ((new_sql_command = mstrcat(sql_command, escape_buffer, &sql_cmd_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, "malloc failed"); free(escape_buffer); free(sql_command); return 1; } else { sql_command = new_sql_command; } if ((new_sql_command = mstrcat(sql_command, ")", &sql_cmd_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, "malloc failed"); free(escape_buffer); free(sql_command); return 1; } else { sql_command = new_sql_command; } LOG_PRINT(LOG_DEBUG, sql_command); dbires1 = dbi_conn_query(conn, sql_command); if (!dbires1) { LOG_PRINT(LOG_WARNING, "insert KW failed"); free(escape_buffer); free(sql_command); return 3; } dbi_result_free(dbires1); if (!strcmp(my_dbi_conn_get_cap(conn, "named_seq"), "f")) { n_keyword_id = dbi_conn_sequence_last(conn, NULL); } else { sprintf(sql_command, "t_%skeyword_keyword_id_seq", prefix); n_keyword_id = dbi_conn_sequence_last(conn, sql_command); } } else { n_keyword_id = my_dbi_result_get_idval(dbires, "keyword_id"); } dbi_result_free(dbires); free(escape_buffer); /* finally create entry in keyword xref table */ sprintf(sql_command, "INSERT INTO t_%sxkeyword (keyword_id, xref_id, xkeyword_type) VALUES ("ULLSPEC", "ULLSPEC", \'%s\')", prefix, (unsigned long long)n_keyword_id, (unsigned long long)n_xref_id, (mode) ? "NOTE":"REFERENCE"); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); free(sql_command); if (!dbires) { LOG_PRINT(LOG_WARNING, "insert KW x failed"); return 5; } dbi_result_free(dbires); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ insert_ulink(): inserts url info into t_link and t_xlink int insert_ulink returns 0 if ok, >0 if error error codes: 1 = malloc failed 2 = query UR failed 3 = insert UR failed 4 = driver not supported 5 = insert UR x failed const char* ulink string containing keyword int type 0 = URL, 1 = PDF, 2 = FULLTEXT 3 = RELATED 4 = IMAGE 5 = DOI unsigned long long n_xref_id reference or note ID dbi_conn conn the database connection dbi_driver driver ptr to database driver const char* drivername name of database driver unsigned long long n_user_id ID of reference owner. This is used only for L1-L4 links and only if these use the protocol file://. These links are assumed to point to a local repository owned by the user. Only these are supposed to be updated if replace_ref is ADDREF_UPDATE_PERSONAL int mode 0 = reference 1 = note int replace_ref indicates the context of the operation ADDREF_ADD = add data ADDREF_UPDATE = replace data ADDREF_UPDATE_PERSONAL = update personal data ADDREF_CHECK = add to temporary tables ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int insert_ulink(const char* ulink, int type, unsigned long long n_xref_id, dbi_conn conn, dbi_driver driver, const char* drivername, unsigned long long n_user_id, int mode, int replace_ref) { char* sql_command; char* new_sql_command; char* escape_buffer; /* char cropped_ulink[256]; */ char type_string[9]; char prefix[] = TEMP_TABLE_NAME_PREFIX; size_t sql_cmd_len = 512; int is_filelink = 0; unsigned long long n_ulink_id; dbi_result dbires; dbi_result dbires1; if (!ulink || !*ulink) { /* we're done */ return 0; } if (!(sql_command = malloc(sql_cmd_len))) { LOG_PRINT(LOG_WARNING, "malloc failed"); return 1; } /* fix insert */ if (replace_ref != ADDREF_CHECK) { *prefix = '\0'; } /* strncpy(cropped_ulink, ulink, 255); */ /* cropped_ulink[255] = '\0'; */ if (!type) { strcpy(type_string, "URL"); } else if (type == 1) { strcpy(type_string, "PDF"); is_filelink = check_filelink(ulink); } else if (type == 2) { strcpy(type_string, "FULLTEXT"); is_filelink = check_filelink(ulink); } else if (type == 3) { strcpy(type_string, "RELATED"); is_filelink = check_filelink(ulink); } else if (type == 4) { strcpy(type_string, "IMAGE"); is_filelink = check_filelink(ulink); } else if (type == 5) { strcpy(type_string, "DOI"); } if ((type > 0 && type < 5) || replace_ref != ADDREF_UPDATE_PERSONAL) { /* first search for existing entry */ sprintf(sql_command, "SELECT link_id FROM t_%slink WHERE link_url=", prefix); escape_buffer = strdup(ulink); if (escape_buffer == NULL) { LOG_PRINT(LOG_WARNING, "malloc failed"); free(sql_command); return 1; } /* escape any characters that the database server cannot digest */ if (dbi_conn_quote_string(conn, &escape_buffer) == 0) { LOG_PRINT(LOG_WARNING, "out of memory"); return 1; } if ((new_sql_command = mstrcat(sql_command, escape_buffer, &sql_cmd_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, "malloc failed"); free(escape_buffer); free(sql_command); return 1; } else { sql_command = new_sql_command; } LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { const char* errmsg; dbi_conn_error(conn, &errmsg); LOG_PRINT(LOG_WARNING, "query UR failed"); LOG_PRINT(LOG_DEBUG, errmsg); return 2; } if (dbi_result_next_row(dbires) == 0) { /* next create entry in link table, if necessary */ sprintf(sql_command, "INSERT INTO t_%slink (link_url) VALUES (", prefix); if ((new_sql_command = mstrcat(sql_command, escape_buffer, &sql_cmd_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, "malloc failed"); free(escape_buffer); free(sql_command); return 1; } else { sql_command = new_sql_command; } if ((new_sql_command = mstrcat(sql_command, ")", &sql_cmd_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, "malloc failed"); free(escape_buffer); free(sql_command); return 1; } else { sql_command = new_sql_command; } LOG_PRINT(LOG_DEBUG, sql_command); dbires1 = dbi_conn_query(conn, sql_command); if (!dbires1) { LOG_PRINT(LOG_WARNING, "insert UR failed"); free(escape_buffer); free(sql_command); return 3; } dbi_result_free(dbires1); if (!strcmp(my_dbi_conn_get_cap(conn, "named_seq"), "f")) { n_ulink_id = dbi_conn_sequence_last(conn, NULL); } else { sprintf(sql_command, "t_%slink_link_id_seq", prefix); n_ulink_id = dbi_conn_sequence_last(conn, sql_command); } } else { n_ulink_id = my_dbi_result_get_idval(dbires, "link_id"); } dbi_result_free(dbires); free(escape_buffer); /* finally create entry in ulink xref table */ /* printf("is_filelink went to %d; n_user_id was "ULLSPEC"\n", is_filelink, n_user_id); */ if (is_filelink && n_user_id) { sprintf(sql_command, "INSERT INTO t_%sxlink (link_id, xref_id, user_id, xlink_type, xlink_source) VALUES ("ULLSPEC", "ULLSPEC", "ULLSPEC", \'%s\', \'%s\')", prefix, (unsigned long long)n_ulink_id, (unsigned long long)n_xref_id, (unsigned long long)n_user_id, type_string, (mode) ? "NOTE":"REFERENCE"); } else { sprintf(sql_command, "INSERT INTO t_%sxlink (link_id, xref_id, xlink_type, xlink_source) VALUES ("ULLSPEC", "ULLSPEC", \'%s\', \'%s\')", prefix, (unsigned long long)n_ulink_id, (unsigned long long)n_xref_id, type_string, (mode) ? "NOTE":"REFERENCE"); } LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); free(sql_command); if (!dbires) { LOG_PRINT(LOG_WARNING, "insert UR x failed"); return 5; } dbi_result_free(dbires); } /* end if either L1-L4 or not update personal */ return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ check_filelink(): checks whether an URL uses the file:// protocol int check_filelink returns 1 if the URL starts with file:// 0 if not const char* url ptr to URL ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int check_filelink(const char* url) { if (!url || !*url) { return 0; } if (!strncmp(url, "file://", 7)) { return 1; } else { return 0; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ remove_keyword_entries(): removes keyword entries associated with a particular dataset int remove_keyword_entries returns 0 if ok, > 0 if error error codes: 1 = select from t_xkeyword failed 2 = delete from t_keyword failed 3 = delete from t_xkeyword failed 4 = delete from t_xnote failed unsigned long long ref_id reference ID dbi_conn conn the database connection int mode 0 = reference entry 1 = note entry ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int remove_keyword_entries(unsigned long long ref_id, dbi_conn conn, int mode) { char sql_command[256]; unsigned long long n_keyword_id; /* keyword_id of a search result */ unsigned long long n_xkeyword_id; /* xkeyword_id of a search result */ unsigned long long numrows; dbi_result dbires; dbi_result dbires1; dbi_result dbires2; sprintf(sql_command, "SELECT keyword_id, xkeyword_id FROM t_xkeyword WHERE xkeyword_type=\'%s\' AND xref_id="ULLSPEC, (mode) ? "NOTE":"REFERENCE", (unsigned long long)ref_id); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { LOG_PRINT(LOG_WARNING, "select from t_xkeyword failed"); return 1; } while (dbi_result_next_row(dbires)) { n_keyword_id = my_dbi_result_get_idval(dbires, "keyword_id"); n_xkeyword_id = my_dbi_result_get_idval(dbires, "xkeyword_id"); sprintf(sql_command, "SELECT xkeyword_id FROM t_xkeyword WHERE keyword_id="ULLSPEC, (unsigned long long)n_keyword_id); LOG_PRINT(LOG_DEBUG, sql_command); dbires1 = dbi_conn_query(conn, sql_command); if (!dbires1) { dbi_result_free(dbires); LOG_PRINT(LOG_WARNING, "select from t_xkeyword failed"); return 1; } numrows = dbi_result_get_numrows(dbires1); if (numrows == 1) { /* if no other reference uses this keyword */ int result; /* delete entry in keyword table */ sprintf(sql_command, "DELETE FROM t_keyword WHERE keyword_id="ULLSPEC, (unsigned long long)n_keyword_id); LOG_PRINT(LOG_DEBUG, sql_command); dbires2 = dbi_conn_query(conn, sql_command); if (!dbires2) { dbi_result_free(dbires); dbi_result_free(dbires1); LOG_PRINT(LOG_WARNING, "delete from t_keyword failed"); return 2; } dbi_result_free(dbires2); /* remove orphans in t_xnote */ result = remove_xnote_entries(0 /* any note */, n_keyword_id, conn, 2 /*keyword*/); if (result != 0 && result != 4) { dbi_result_free(dbires1); dbi_result_free(dbires); return 4; } } /* delete entry in xkeyword table */ sprintf(sql_command, "DELETE FROM t_xkeyword WHERE xkeyword_id="ULLSPEC, (unsigned long long)n_xkeyword_id); LOG_PRINT(LOG_DEBUG, sql_command); dbires2 = dbi_conn_query(conn, sql_command); if (!dbires2) { dbi_result_free(dbires); dbi_result_free(dbires1); LOG_PRINT(LOG_WARNING, "delete from t_xkeyword failed"); return 3; } dbi_result_free(dbires2); dbi_result_free(dbires1); } dbi_result_free(dbires); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ remove_ulink_entries(): removes ulink entries associated with a particular dataset int remove_ulink_entries returns 0 if ok, > 0 if error error codes: 1 = select from t_xlink failed 2 = delete from t_link failed 3 = delete from t_xlink failed unsigned long long ref_id reference ID const char* set_owner name of dataset owner (may be NULL to remove all) dbi_conn conn the database connection int mode 0 = reference entry 1 = note entry ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int remove_ulink_entries(unsigned long long ref_id, const char* set_owner, dbi_conn conn, int mode) { char sql_command[256]; unsigned long long n_ulink_id; /* ulink_id of a search result */ unsigned long long n_xulink_id; /* xulink_id of a search result */ unsigned long long numrows; dbi_result dbires; dbi_result dbires1; dbi_result dbires2; if (set_owner && *set_owner) { sprintf(sql_command, "SELECT link_id, xlink_id FROM t_xlink INNER JOIN t_user ON t_xlink.user_id=t_user.user_id WHERE xlink_source=\'%s\' AND xref_id="ULLSPEC" AND t_user.user_name='%s'", (mode) ? "NOTE":"REFERENCE", (unsigned long long)ref_id, set_owner); } else { sprintf(sql_command, "SELECT link_id, xlink_id FROM t_xlink WHERE xlink_source=\'%s\' AND xref_id="ULLSPEC, (mode) ? "NOTE":"REFERENCE", (unsigned long long)ref_id); } LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { LOG_PRINT(LOG_WARNING, "select from t_xlink failed"); return 1; } while (dbi_result_next_row(dbires)) { n_ulink_id = my_dbi_result_get_idval(dbires, "link_id"); n_xulink_id = my_dbi_result_get_idval(dbires, "xlink_id"); sprintf(sql_command, "SELECT xlink_id FROM t_xlink WHERE link_id="ULLSPEC, (unsigned long long)n_ulink_id); LOG_PRINT(LOG_DEBUG, sql_command); dbires1 = dbi_conn_query(conn, sql_command); if (!dbires1) { dbi_result_free(dbires); LOG_PRINT(LOG_WARNING, "select from t_xlink failed"); return 1; } numrows = dbi_result_get_numrows(dbires1); if (numrows == 1) { /* if no other reference uses this link */ /* delete entry in link table */ sprintf(sql_command, "DELETE FROM t_link WHERE link_id="ULLSPEC, (unsigned long long)n_ulink_id); LOG_PRINT(LOG_DEBUG, sql_command); dbires2 = dbi_conn_query(conn, sql_command); if (!dbires2) { dbi_result_free(dbires); dbi_result_free(dbires1); LOG_PRINT(LOG_WARNING, "delete from t_link failed"); return 2; } dbi_result_free(dbires2); /* remove orphans in t_xnote */ /* result = remove_xnote_entries(n_keyword_id, conn, 2 /\*keyword*\/); */ /* if (result != 0 && result != 4) { */ /* dbi_result_free(dbires1); */ /* dbi_result_free(dbires); */ /* return 4; */ /* } */ } /* delete entry in xlink table */ sprintf(sql_command, "DELETE FROM t_xlink WHERE xlink_id="ULLSPEC, (unsigned long long)n_xulink_id); LOG_PRINT(LOG_DEBUG, sql_command); dbires2 = dbi_conn_query(conn, sql_command); if (!dbires2) { dbi_result_free(dbires); dbi_result_free(dbires1); LOG_PRINT(LOG_WARNING, "delete from t_xlink failed"); return 3; } dbi_result_free(dbires2); dbi_result_free(dbires1); } /* end while */ dbi_result_free(dbires); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ remove_author_entries(): removes author entries associated with a particular dataset int remove_author_entries returns 0 if ok, > 0 if error error codes: 1 = select from t_xauthor failed 2 = delete from t_author failed 3 = delete from t_xauthor failed 4 = remove from t_xnote failed unsigned long long ref_id reference id dbi_conn conn the database connection ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int remove_author_entries(unsigned long long ref_id, dbi_conn conn) { char sql_command[256]; unsigned long long n_author_id; /* author_id of a search result */ unsigned long long n_xauthor_id; /* xauthor_id of a search result */ unsigned long long numrows; dbi_result dbires; dbi_result dbires1; dbi_result dbires2; sprintf(sql_command, "SELECT author_id, xauthor_id FROM t_xauthor WHERE refdb_id="ULLSPEC, (unsigned long long)ref_id); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { LOG_PRINT(LOG_WARNING, "select from t_xauthor failed"); return 1; } while (dbi_result_next_row(dbires)) { n_author_id = my_dbi_result_get_idval(dbires, "author_id"); n_xauthor_id = my_dbi_result_get_idval(dbires, "xauthor_id"); sprintf(sql_command, "SELECT xauthor_id FROM t_xauthor WHERE author_id="ULLSPEC, (unsigned long long)n_author_id); LOG_PRINT(LOG_DEBUG, sql_command); dbires1 = dbi_conn_query(conn, sql_command); if (!dbires1) { dbi_result_free(dbires); LOG_PRINT(LOG_WARNING, "select from t_xauthor failed"); return 1; } numrows = dbi_result_get_numrows(dbires1); if (numrows == 1) { /* if no other reference uses this author */ int result; /* delete entry in author table */ sprintf(sql_command, "DELETE FROM t_author WHERE author_id="ULLSPEC, (unsigned long long)n_author_id); LOG_PRINT(LOG_DEBUG, sql_command); dbires2 = dbi_conn_query(conn, sql_command); if (!dbires2) { dbi_result_free(dbires1); dbi_result_free(dbires); LOG_PRINT(LOG_WARNING, "delete from t_author failed"); return 2; } dbi_result_free(dbires2); /* remove orphans in t_xnote */ result = remove_xnote_entries(0 /* any note */, n_author_id, conn, 1 /*author*/); if (result != 0 && result != 4) { dbi_result_free(dbires1); dbi_result_free(dbires); return 4; } } /* delete entry in xauthor table */ sprintf(sql_command, "DELETE FROM t_xauthor WHERE xauthor_id="ULLSPEC, (unsigned long long)n_xauthor_id); LOG_PRINT(LOG_DEBUG, sql_command); dbires2 = dbi_conn_query(conn, sql_command); if (!dbires2) { dbi_result_free(dbires1); dbi_result_free(dbires); LOG_PRINT(LOG_WARNING, "delete from t_xauthor failed"); return 3; } dbi_result_free(dbires2); dbi_result_free(dbires1); } dbi_result_free(dbires); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ remove_user_entries(): removes the user entry associated with a particular dataset if it is an orphan int remove_user_entries returns 0 if ok, > 0 if error error codes: 1 = select from t_user failed 2 = select from t_note failed 3 = delete from t_user failed 4 = not an orphan unsigned long long user_id id of the user to be deleted dbi_conn conn the database connection ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int remove_user_entries(unsigned long long user_id, dbi_conn conn) { char sql_command[256]; unsigned long long numrows; dbi_result dbires; /* select all xuser and note entries of the given user; if there are none, the user is an orphan and can safely be deleted */ sprintf(sql_command, "SELECT xuser_id FROM t_xuser WHERE user_id="ULLSPEC, (unsigned long long)user_id); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { LOG_PRINT(LOG_WARNING, "select from t_xuser failed"); return 1; } numrows = dbi_result_get_numrows(dbires); dbi_result_free(dbires); sprintf(sql_command, "SELECT note_id FROM t_note WHERE note_user_id="ULLSPEC, (unsigned long long)user_id); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { LOG_PRINT(LOG_WARNING, "select from t_note failed"); return 2; } numrows += dbi_result_get_numrows(dbires); dbi_result_free(dbires); if (!numrows) { /* no other note or reference belong to this user */ /* delete entry in t_user table */ sprintf(sql_command, "DELETE FROM t_user WHERE user_id="ULLSPEC, (unsigned long long)user_id); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { return 3; } dbi_result_free(dbires); return 0; } return 4; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ remove_xuser_entries(): removes the xuser entry associated with a particular dataset and a particular user int remove_xuser_entries returns 0 if ok, > 0 if error error codes: 1 = select from t_xuser failed 3 = delete from t_xuser failed 4 = no entry found unsigned long long ref_id reference id char* set_owner name of the user who owns the dataset. If NULL, all entries regarding the reference ID will be removed dbi_conn conn the database connection ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int remove_xuser_entries(unsigned long long ref_id, char* set_owner, dbi_conn conn) { char sql_command[256]; unsigned long long n_xuser_id = 0; /* xid of set_owner regarding current ref */ dbi_result dbires; dbi_result dbires1; if (set_owner && *set_owner) { sprintf(sql_command, "SELECT xuser_id FROM t_xuser INNER JOIN t_user ON t_xuser.user_id=t_user.user_id WHERE t_user.user_name=\'%s\' AND t_xuser.refdb_id="ULLSPEC, set_owner, (unsigned long long)ref_id); } else { sprintf(sql_command, "SELECT xuser_id FROM t_xuser, t_user WHERE t_xuser.refdb_id="ULLSPEC, (unsigned long long)ref_id); } LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { LOG_PRINT(LOG_WARNING, "select from t_xuser failed"); return 1; } while (dbi_result_next_row(dbires)) { n_xuser_id = my_dbi_result_get_idval(dbires, "xuser_id"); /* delete entry in xuser table */ sprintf(sql_command, "DELETE FROM t_xuser WHERE xuser_id="ULLSPEC, (unsigned long long)n_xuser_id); LOG_PRINT(LOG_DEBUG, sql_command); dbires1 = dbi_conn_query(conn, sql_command); if (!dbires1) { dbi_result_free(dbires); LOG_PRINT(LOG_WARNING, "delete from t_xnote failed"); return 3; } dbi_result_free(dbires1); } dbi_result_free(dbires); if (n_xuser_id) { return 0; } else { return 4; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ remove_xnote_entries(): removes xnote entries associated with a particular dataset int remove_xnote_entries returns 0 if ok, > 0 if error error codes: 1 = select from t_xnote failed 3 = delete from t_xnote failed 4 = no entry found unsigned long long note_id note id, or 0 if all notes should be considered unsigned long long xref_id link target id, or 0 if all targets should be considered dbi_conn conn the database connection int mode 0 = reference entry 1 = author entry 2 = keyword entry 3 = periodical entry 4 = all entries ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int remove_xnote_entries(unsigned long long note_id, unsigned long long xref_id, dbi_conn conn, int mode) { char sql_command[256]; char mode_string[4][11] = { "REFERENCE", "AUTHOR", "KEYWORD", "PERIODICAL"}; unsigned long long n_xnote_id = 0; /* xnote_id of a search result */ dbi_result dbires; dbi_result dbires1; if (mode == 4) { sprintf(sql_command, "SELECT xnote_id FROM t_xnote WHERE note_id="ULLSPEC, (unsigned long long)xref_id); } else if (note_id) { sprintf(sql_command, "SELECT xnote_id FROM t_xnote WHERE note_id="ULLSPEC" AND xnote_type=\'%s\' AND xref_id="ULLSPEC, (unsigned long long)note_id, mode_string[mode], (unsigned long long)xref_id); } else { sprintf(sql_command, "SELECT xnote_id FROM t_xnote WHERE xnote_type=\'%s\' AND xref_id="ULLSPEC, mode_string[mode], (unsigned long long)xref_id); } LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { LOG_PRINT(LOG_WARNING, "select from t_xnote failed"); return 1; } while (dbi_result_next_row(dbires)) { n_xnote_id = my_dbi_result_get_idval(dbires, "xnote_id"); /* delete entry in xnote table */ sprintf(sql_command, "DELETE FROM t_xnote WHERE xnote_id="ULLSPEC, (unsigned long long)n_xnote_id); LOG_PRINT(LOG_DEBUG, sql_command); dbires1 = dbi_conn_query(conn, sql_command); if (!dbires1) { dbi_result_free(dbires); LOG_PRINT(LOG_WARNING, "delete from t_xnote failed"); return 3; } dbi_result_free(dbires1); } dbi_result_free(dbires); if (n_xnote_id) { return 0; } else { return 4; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ remove_periodical_entries(): removes periodical entries associated with a particular dataset int remove_periodical_entries returns 0 if ok, nonzero if error unsigned long long n_periodical_id ID value of the periodical dbi_conn conn the database connection ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int remove_periodical_entries(unsigned long long n_periodical_id, dbi_conn conn) { char sql_command[256]; unsigned long long numrows; dbi_result dbires; dbi_result dbires1; /* check whether we should keep the t_periodical entries */ if (*keep_pnames == 't') { return 0; /* nothing to do, we're done */ } sprintf(sql_command, "SELECT refdb_id FROM t_refdb WHERE refdb_periodical_id="ULLSPEC, (unsigned long long)n_periodical_id); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { LOG_PRINT(LOG_WARNING, "select from t_refdb failed"); dbi_result_free(dbires); return 1; } numrows = dbi_result_get_numrows(dbires); if (numrows <= 1) { /* if no other reference uses this periodical */ int result; /* delete entry in periodical table */ sprintf(sql_command, "DELETE FROM t_periodical WHERE periodical_id="ULLSPEC, (unsigned long long)n_periodical_id); LOG_PRINT(LOG_DEBUG, sql_command); dbires1 = dbi_conn_query(conn, sql_command); if (!dbires1) { LOG_PRINT(LOG_WARNING, "delete from t_periodical failed"); dbi_result_free(dbires); return 1; } dbi_result_free(dbires1); /* remove orphans in t_xnote */ result = remove_xnote_entries(0 /* any note */, n_periodical_id, conn, 3 /*periodical*/); if (result != 0 && result != 4) { dbi_result_free(dbires); return 4; } } dbi_result_free(dbires); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ strip_oddchars(): removes unwanted characters from strings char* strip_oddchars returns ptr to the input string char* string pointer to string to be modified ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static char* strip_oddchars(char* string) { /* The following character sequences are no good candidates for citation keys. Nevertheless, they may show up from author names imported from bibtex bibliographies. We also don't want spaces or quotation marks and such */ /* Accents that may be immediately followed by a letter ( before creating key strip the backslash and the next char) 1. grave \`o 2. acute \'o 3. circumflex \^o 4. umlaut \"o 5. tilde \~o 6. macron \=o 7. dot \.o Accents requering an intervening space ( before creating key strip the backslash and 2 next chars) 8. cedilla \c o 9. underdot \d o 10. underbar \b o 11. hacek \v o 12. breve \u o 13. tie \t oo 14. Hun \H o Foreign letters ( before creating key strip the backslash only) 15. \AE 16. \ae 17. \OE 18. \oe 19. \AA 20. \aa 21. \O 22. \o 23. \L 24. \l 25. \ss 26. \i 27. \j The list is taken from "A Gentle Introduction to TeX" by Michael Doob (thanks Alexander) */ char *thechar; thechar = string; while (*thechar) { if (!strncmp(thechar, "\\`", 2) || !strncmp(thechar, "\\'", 2) || !strncmp(thechar, "\\^", 2) || !strncmp(thechar, "\\\"", 2) || !strncmp(thechar, "\\~", 2) || !strncmp(thechar, "\\=", 2) || !strncmp(thechar, "\\.", 2)) { /* remove backslash and following character */ remove_substring(thechar, 2); } else if (!strncmp(thechar, "\\c ", 3) || !strncmp(thechar, "\\d ", 3) || !strncmp(thechar, "\\b ", 3) || !strncmp(thechar, "\\v ", 3) || !strncmp(thechar, "\\u ", 3) || !strncmp(thechar, "\\t ", 3) || !strncmp(thechar, "\\H ", 3)) { /* remove backslash and two following characters */ remove_substring(thechar, 3); } else if (!strncmp(thechar, "\\AE", 3) || !strncmp(thechar, "\\ae", 3) || !strncmp(thechar, "\\OE", 3) || !strncmp(thechar, "\\oe", 3) || !strncmp(thechar, "\\AA", 3) || !strncmp(thechar, "\\aa", 3) || !strncmp(thechar, "\\O", 2) || !strncmp(thechar, "\\o", 2) || !strncmp(thechar, "\\L", 2) || !strncmp(thechar, "\\l", 2) || !strncmp(thechar, "\\ss", 3) || !strncmp(thechar, "\\i", 2) || !strncmp(thechar, "\\j", 2)) { /* remove backslash only */ remove_substring(thechar, 1); } else if ((*thechar == '\'') || (*thechar == '\"') || (*thechar == '&') || (*thechar == '<') || (*thechar == '>') || (*thechar == ':') || (*thechar == '(') || (*thechar == ')') || (*thechar == '?') || (*thechar == ' ')) { /* remove offending character */ remove_substring(thechar, 1); } else if ((unsigned char)(*thechar) > 127) { /* remove offending character */ remove_substring(thechar, 1); } else if (!strncmp(thechar, "-ID", 3)) { /* replace dash with an underscore */ *thechar = '_'; } else { thechar++; } } return string; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ preprocess_citekey_copy(): removes unwanted characters from a string and returns a cleaned version in an allocated buffer The calling function is responsible for freeing the buffer again char* preprocess_citekey returns ptr to an allocated buffer containing the cleaned string const char* string pointer to string to be analyzed size_t n_maxlen maximum length, sans \0, of the returned string If 0, the string length is not limited ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* preprocess_citekey_copy(const char* string, size_t n_maxlen) { iconv_t conv_descriptor = NULL; size_t inlength; size_t outlength; size_t orig_outlength; char* my_outbuffer = NULL; /* this ptr will be modified by iconv() */ char* my_outbuffer_start = NULL; /* records initial state of outbuffer */ const char* my_instring = NULL; /* this ptr will be modified by iconv() */ /* try to transliterate odd characters instead of discarding them */ /* we may have to obtain the input character encoding, assume UTF-8 for now */ conv_descriptor = iconv_open("ASCII//TRANSLIT", "UTF-8"); if (conv_descriptor == (iconv_t)(-1)) { my_outbuffer_start = (char*)string; LOG_PRINT(LOG_WARNING, get_status_msg(701)); goto postprocess; } inlength = strlen(string)+1; outlength = 6*inlength; orig_outlength = outlength; if ((my_outbuffer = malloc(outlength)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); iconv_close(conv_descriptor); return 0; } my_outbuffer_start = my_outbuffer; my_instring = (const char*)string; /* printf("calling iconv here with string length %d, outlength %d\n", inlength, outlength); */ if (iconv(conv_descriptor, &my_instring, &inlength, &my_outbuffer, &outlength) == (size_t)(-1)) { if (errno == EILSEQ) { LOG_PRINT(LOG_WARNING, "iconv: invalid input character sequence"); } else if (errno == E2BIG) { LOG_PRINT(LOG_WARNING, "iconv: output buffer too small"); } else if (errno == EINVAL) { LOG_PRINT(LOG_WARNING, "iconv: incomplete input character"); } my_outbuffer_start = (char*)string; LOG_PRINT(LOG_WARNING, get_status_msg(701)); goto postprocess; } /* else { */ /* printf("iconv returned success\n"); */ /* } */ postprocess: if (conv_descriptor) { iconv_close(conv_descriptor); } /* printf("outbuffer went to: %s<<\n", my_outbuffer_start); */ strip_oddchars(my_outbuffer_start); if (*upper_citekey == 't') { strup(my_outbuffer_start); } /* truncate string if requested */ if (n_maxlen && strlen(my_outbuffer_start) >= n_maxlen) { my_outbuffer_start[n_maxlen] = '\0'; } return my_outbuffer_start; } refdb-1.0.2/src/writeris.c000755 001750 001750 00000015714 12255427652 016272 0ustar00markusmarkus000000 000000 /* writeris.c: functions to write RIS datasets and to create DocBook bibliography entries */ /* markus@mhoenicka.de 4-28-00 */ /* 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ #include #include #include #include #include #include "refdb.h" #include "linklist.h" #include "refdbd.h" /* depends on dbi.h */ #include "backend.h" #include "writeris.h" #include "strfncs.h" #include "xmlhelper.h" #include "backend-scrn.h" #include "backend-ris.h" #include "backend-risx.h" #include "backend-db31.h" #include "backend-teix.h" #include "backend-bibtex.h" /* depends on refdbd.h */ #include "backend-html.h" #include "backend-dbib.h" #include "backend-citationlistx.h" #include "backend-mods.h" /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ render_ref(): formats the result of a query int render_ref returns 0 if successful, > 0 if failed struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int render_ref(struct renderinfo* ptr_rendinfo) { int retval; if (ptr_rendinfo->ref_format == REFRIS || ptr_rendinfo->ref_format == REFCGIRIS) { /* RIS or cgi-ris*/ retval = render_ris(ptr_rendinfo); } else if (ptr_rendinfo->ref_format == RISX) { /* RISX */ retval = render_risx(ptr_rendinfo); } else if (ptr_rendinfo->ref_format == REFMODS) { /* MODS */ retval = render_mods(ptr_rendinfo); } else if (ptr_rendinfo->ref_format == REFDOCBK || ptr_rendinfo->ref_format == REFDOCBKX) { /* DocBook < 5 */ retval = render_db31(ptr_rendinfo); } else if (ptr_rendinfo->ref_format == REFDOCBKX5) { /* DocBook >= 5 */ retval = render_db50(ptr_rendinfo); } else if (ptr_rendinfo->ref_format == REFTEIX) { /* TEI P4 XML */ retval = render_teix(ptr_rendinfo); } else if (ptr_rendinfo->ref_format == REFTEIX5) { /* TEI P5 XML */ retval = render_teix5(ptr_rendinfo); } else if (ptr_rendinfo->ref_format == REFBIBTEX) { /* bibtex */ retval = render_bibtex(ptr_rendinfo); } else if (ptr_rendinfo->ref_format == REFHTML || ptr_rendinfo->ref_format == REFXHTML || ptr_rendinfo->ref_format == REFCGIHTML) { /* (x)html or cgi*/ retval = render_html(ptr_rendinfo, 0 /* permanent tables */); } else if (ptr_rendinfo->ref_format == REFCITATIONLISTX) { /* citationlistx */ retval = render_citationlistx(ptr_rendinfo); } else { /* screen output; make this default, just in case */ retval = render_scrn(ptr_rendinfo); } return retval; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ prepare_render(): writes a header for the output of a query int prepare_render returns 0 if successful, > 0 if failed struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int prepare_render(struct renderinfo* ptr_rendinfo) { int retval; if (ptr_rendinfo->ref_format == REFRIS || ptr_rendinfo->ref_format == REFCGIRIS) { retval = prepare_render_ris(ptr_rendinfo); } else if (ptr_rendinfo->ref_format == REFDOCBK || ptr_rendinfo->ref_format == REFDOCBKX) { retval = prepare_render_db31(ptr_rendinfo); } else if (ptr_rendinfo->ref_format == REFDOCBKX5) { /* DocBook >= 5 */ retval = prepare_render_db50(ptr_rendinfo); } else if (ptr_rendinfo->ref_format == RISX) { /* RISX */ retval = prepare_render_risx(ptr_rendinfo); } else if (ptr_rendinfo->ref_format == REFMODS) { /* MODS */ retval = prepare_render_mods(ptr_rendinfo); } else if (ptr_rendinfo->ref_format == REFTEIX) { /* TEI P 4XML */ retval = prepare_render_teix(ptr_rendinfo); } else if (ptr_rendinfo->ref_format == REFTEIX5) { /* TEI P5 XML */ retval = prepare_render_teix5(ptr_rendinfo); } else if (ptr_rendinfo->ref_format == REFBIBTEX) { retval = prepare_render_bibtex(ptr_rendinfo); } else if (ptr_rendinfo->ref_format == REFHTML /* plain html/xhtml */ || ptr_rendinfo->ref_format == REFXHTML /* or html via cgi */ || ptr_rendinfo->ref_format == REFCGIHTML) { retval = prepare_render_html(ptr_rendinfo); } else if (ptr_rendinfo->ref_format == REFCITATIONLISTX) { /* citationlistx */ retval = prepare_render_citationlistx(ptr_rendinfo); } else { /* default */ retval = prepare_render_scrn(ptr_rendinfo); } return retval; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ finish_render(): writes a footer for the output of a query int finish_render returns 0 if successful, > 0 if failed struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int finish_render(struct renderinfo* ptr_rendinfo) { int retval = 0; if(ptr_rendinfo->ref_format == REFRIS || ptr_rendinfo->ref_format == REFCGIRIS) { retval = finish_render_ris(ptr_rendinfo); } else if(ptr_rendinfo->ref_format == REFDOCBK || ptr_rendinfo->ref_format == REFDOCBKX) { retval = finish_render_db31(ptr_rendinfo); } else if (ptr_rendinfo->ref_format == REFDOCBKX5) { /* DocBook >= 5 */ retval = finish_render_db50(ptr_rendinfo); } else if (ptr_rendinfo->ref_format == REFTEIX) { retval = finish_render_teix(ptr_rendinfo); } else if (ptr_rendinfo->ref_format == REFTEIX5) { /* TEI P5 XML */ retval = finish_render_teix5(ptr_rendinfo); } else if(ptr_rendinfo->ref_format == RISX) { retval = finish_render_risx(ptr_rendinfo); } else if(ptr_rendinfo->ref_format == REFMODS) { retval = finish_render_mods(ptr_rendinfo); } else if(ptr_rendinfo->ref_format == REFBIBTEX) { retval = finish_render_bibtex(ptr_rendinfo); } else if (ptr_rendinfo->ref_format == REFHTML || ptr_rendinfo->ref_format == REFXHTML || ptr_rendinfo->ref_format == REFCGIHTML) { /* html or cgi */ retval = finish_render_html(ptr_rendinfo); } else if (ptr_rendinfo->ref_format == REFCITATIONLISTX) { /* citationlistx */ retval = finish_render_citationlistx(ptr_rendinfo); } else if (ptr_rendinfo->ref_format != 5) { /* default */ retval = finish_render_scrn(ptr_rendinfo); } return retval; } refdb-1.0.2/src/backend.c000755 001750 001750 00000516234 12271305660 016004 0ustar00markusmarkus000000 000000 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ backend.c defines the functions to access the database search output markus@mhoenicka.de 6-19-00 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ #include #include #include #include #include /* for log() */ #include #include "refdb.h" #include "linklist.h" #include "refdbd.h" #include "backend.h" #include "strfncs.h" #include "dbfncs.h" #include "risdb.h" #include "authorinfo.h" #include "connect.h" #include "readris.h" #include "rtfhelper.h" /* globals */ extern int n_log_level; extern dbi_result dbi_style_res; extern char main_db[]; /* this string array is used for author queries. MySQL uses an enum field, pgsql and others use an int field to store the author type */ const char author_type_string[2][3][14] = { {"\'part\'", "\'publication\'", "\'set\'"}, {"1", "2", "3"} }; /* this is the javascript code used to pop up the tooltips in the xhtml output of the checkref command */ char checkref_javascript[] = "\n"; /* forward declaration of local functions */ static const char* real_get_periodical(dbi_result dbires, int is_temp, unsigned long long* ptr_frequency); /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ assemble_header(): assembles various html, xhtml, and XML headers struct renderinfo* ptr_rendinfo ptr to a structure containing information how the stuff is to be rendered ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* assemble_header(struct renderinfo* ptr_rendinfo) { /* see whether the client specified a character encoding */ char enc_string[PREFS_BUF_LEN+80]; char* my_script; char* header; size_t header_len = 1024; if (ptr_rendinfo->javascript == 1) { header_len += strlen(checkref_javascript); my_script = checkref_javascript; } else { /* ptr to an empty string */ my_script = &checkref_javascript[strlen(checkref_javascript)]; } if ((header = malloc(header_len)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } *header = '\0'; switch (ptr_rendinfo->ref_format) { case REFHTML: /* fall through */ case REFXHTML: /* html/xhtml output */ if (*(ptr_rendinfo->ptr_biblio_info->encoding)) { if (ptr_rendinfo->ref_format == REFHTML) { snprintf(enc_string, PREFS_BUF_LEN+80, "\n", ptr_rendinfo->ptr_biblio_info->encoding); } else { /* XHTML, need to close meta tag for XML */ snprintf(enc_string, PREFS_BUF_LEN+80, "\n", ptr_rendinfo->ptr_biblio_info->encoding); } } else { /* should never happen */ *enc_string = '\0'; } if (*(ptr_rendinfo->cgi_url)) { if (ptr_rendinfo->ref_format == REFHTML) { snprintf(header, header_len, "\n\n\n%s%s reference list\n\n\n\n\n

refdb reference list

\n", enc_string, PACKAGE, PACKAGE, VERSION, ptr_rendinfo->cgi_url); } else { /* REFXHTML */ snprintf(header, header_len, "\n\n%s%s reference list\n%s\n\n

refdb reference list

\n", ptr_rendinfo->ptr_biblio_info->encoding, enc_string, PACKAGE, PACKAGE, VERSION, ptr_rendinfo->cgi_url, my_script); } } else { /* don't use css */ if (ptr_rendinfo->ref_format == REFHTML) { snprintf(header, header_len, "\n\n\n%s%s reference list\n\n\n\n

refdb reference list

\n", enc_string, PACKAGE, PACKAGE, VERSION); } else { /* REFXHTML */ snprintf(header, header_len, "\n\n%s%s reference list%s\n\n

refdb reference list

\n", ptr_rendinfo->ptr_biblio_info->encoding, enc_string, PACKAGE, PACKAGE, VERSION, my_script); } } break; case RISX: /* risx output */ if (*(ptr_rendinfo->ptr_clrequest->namespace)) { snprintf(header, header_len, "\n", ptr_rendinfo->ptr_biblio_info->encoding); } else { snprintf(header, header_len, "\n%s", ptr_rendinfo->ptr_biblio_info->encoding, RISX_PUBID); } break; case REFMODS: /* MODS output */ snprintf(header, header_len, "\n", ptr_rendinfo->ptr_biblio_info->encoding); break; case XNOTE: /* xnote output */ snprintf(header, header_len, "\n%s", ptr_rendinfo->ptr_biblio_info->encoding, XNOTE_PUBID); break; case REFCITATIONLISTX: /* citationlistx output */ snprintf(header, header_len, "\n%s", ptr_rendinfo->ptr_biblio_info->encoding, CITATIONLISTX_PUBID); break; /* default: */ /* empty string */ } return header; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ add_root_to_link(): inserts pdfroot into a link. The returned string is malloc()'ed and must be freed by the calling function char* add_root_to_link(): returns a malloc()'ed string, or NULL if something goes wrong. One likely reason for the latter is if the link is not relative, or does not use the file:// protocol const char* link ptr to string containing the link const char* pdfroot ptr to string containing the pdfroot ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* add_root_to_link(const char* link, const char* pdfroot) { char* full_link = NULL; if (!link || !*link) { return NULL; } if (!pdfroot /* no pdfroot available */ || strlen(link) < 7 /* too short */ || !strncmp(link, "file:///", 8) /* not a relative path */ || strncmp(link, "file://", 7)) { /* not the appropriate protocol */ /* return a copy of link */ if ((full_link = strdup(link)) == NULL) { return NULL; } } else { /* insert pdfroot after protocol specifier */ if ((full_link = malloc(strlen(link)+strlen(pdfroot)+1)) == NULL) { return NULL; } strcpy(full_link, link); /* move part after protocol specifier out of the way, including the terminating NULL byte */ memmove(full_link+strlen(pdfroot)+7, full_link+7, strlen(full_link+7)+1); /* insert pdfroot into the gap */ memcpy(full_link+7, pdfroot, strlen(pdfroot)); } return full_link; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ has_part_data(): returns true if a reference type may have part data int has_part_data returns 1 if the type has part data, 0 if not const char* type ptr to a string containing the reference type to check ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int has_part_data(const char* type) { if (!type) { return 0; } if (!strcmp(type, "ABST") || !strcmp(type, "CHAP") || !strcmp(type, "CASE") || !strcmp(type, "CONF") || !strcmp(type, "GEN") || !strcmp(type, "INPR") || !strcmp(type, "UNPB") || !strcmp(type, "JOUR") || !strcmp(type, "JFULL") || !strcmp(type, "MGZN") || !strcmp(type, "NEWS") || !strcmp(type, "SER")) { return 1; } else { return 0; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ has_set_data(): returns true if a reference type may have set data int has_set_data returns 1 if the type has set data, 0 if not const char* type ptr to a string containing the reference type to check ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int has_set_data(const char* type) { if (!type) { return 0; } if (!strcmp(type, "BOOK") || !strcmp(type, "CHAP") || !strcmp(type, "CONF") || !strcmp(type, "DATA") || !strcmp(type, "GEN") || !strcmp(type, "MPCT") || !strcmp(type, "MUSIC") || !strcmp(type, "REPORT") || !strcmp(type, "SER") || !strcmp(type, "SOUND") || !strcmp(type, "VIDEO")) { return 1; } else { return 0; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ has_periodical_data(): returns true if a reference type has periodical data int has_periodical_data returns 1 if the type has periodical data, 0 if not const char* type ptr to a string containing the reference type to check ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int has_periodical_data(const char* type) { if (!type) { return 0; } if (!strcmp(type, "ABST") || !strcmp(type, "CONF") || !strcmp(type, "GEN") || !strcmp(type, "INPR") || !strcmp(type, "UNPB") || !strcmp(type, "JOUR") || !strcmp(type, "JFULL") || !strcmp(type, "MGZN") || !strcmp(type, "NEWS")) { return 1; } else { return 0; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ has_chapter_data(): returns true if a reference type has something similar to chapter data int has_chapter_data returns 1 if the type has periodical data, 0 if not const char* type ptr to a string containing the reference type to check ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int has_chapter_data(const char* type) { if (!type) { return 0; } if (!strcmp(type, "CASE") || !strcmp(type, "CHAP") || !strcmp(type, "CONF") || !strcmp(type, "GEN")) { return 1; } else { return 0; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_reference_count(): retrieves the number of references in a database unsigned long long get_reference_count returns the number of references in the current database, and places the highest ID in the provided counter dbi_conn conn database connection unsigned long long* ptr_max_id will be set to the highest reference ID if non-NULL int n_istemp if 1, use temporary tables as data source ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ unsigned long long get_reference_count(dbi_conn conn, unsigned long long* ptr_max_id, int n_istemp) { unsigned long long numrefs; char sql_command[128]; char prefix[] = TEMP_TABLE_NAME_PREFIX; dbi_result dbires; /* fix the insert */ if (!n_istemp) { *prefix = '\0'; } /* SQL functions must be aliased for the sqlite/sqlite3 column type magic to work */ sprintf(sql_command, "SELECT COUNT(*) AS CNT, MAX(refdb_id) AS MX FROM t_%srefdb WHERE refdb_type!='DUMMY'", prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires || !dbi_result_next_row(dbires)) { return 0; } numrefs = my_dbi_result_get_idval_idx(dbires, 1); /* 1-base index */ if (ptr_max_id) { *ptr_max_id = my_dbi_result_get_idval_idx(dbires, 2); } dbi_result_free(dbires); return numrefs; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_notes_count(): retrieves the number of notes in a database unsigned long long get_notes_count returns the number of notes in the current database, and places the highest ID in the provided counter dbi_conn conn database connection unsigned long long* ptr_max_id will be set to the highest note ID if non-NULL int n_istemp if 1, use temporary tables as data source ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ unsigned long long get_notes_count(dbi_conn conn, unsigned long long* ptr_max_id, int n_istemp) { unsigned long long numnotes; char sql_command[128]; char prefix[] = TEMP_TABLE_NAME_PREFIX; dbi_result dbires; /* fix the insert */ if (!n_istemp) { *prefix = '\0'; } /* SQL functions must be aliased for the sqlite/sqlite3 column type magic to work */ sprintf(sql_command, "SELECT COUNT(*) AS CNT, MAX(note_id) AS MX FROM t_%snote", prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires || !dbi_result_next_row(dbires)) { return 0; } numnotes = my_dbi_result_get_idval_idx(dbires, 1); /* 1-base index */ if (ptr_max_id) { *ptr_max_id = my_dbi_result_get_idval_idx(dbires, 2); } dbi_result_free(dbires); return numnotes; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ calculate_relative_frequency(): calculates a measure of the frequency of a keyword, authorname or whatever int calculate_relative_frequency returns the relative frequency unsigned long long frequency the number of occurrences of the item in the database unsigned long long refcount the total number of references in the database ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int calculate_relative_frequency(unsigned long long frequency, unsigned long long refcount) { if (!frequency || !refcount || refcount == 1) { return 0; } else { /* using log stretches the available span more evenly over several orders of magnitude. The resulting values are supposed to be between 0 (item appears only on one or a few references) to 9 (item appears in just about every reference) */ return (int)(10*(log((double)frequency)/log((double)refcount))); } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_refdb_note_id(): retrieves the note_id element from a note query char* get_refdb_note_id returns a pointer to a string containing the note_id element dbi_result dbires database query result, pointing to the current dataset char* id ptr to string that will receive the id. Must be long enough for the representation of an unsigned long long number ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* get_refdb_note_id(dbi_result dbires, char* id) { unsigned long long n_id; dbi_error_flag errflag; n_id = my_dbi_result_get_idval(dbires, "note_id"); errflag = my_dbi_conn_error_flag(dbi_result_get_conn(dbires)); if (n_id == 0 || errflag) { /* all IDs > 0 so this must be an error */ return NULL; } else { sprintf(id, ULLSPEC, (unsigned long long)n_id); return id; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_refdb_note_key(): retrieves the note_key element from a note query char* get_refdb_note_key returns a pointer to a string containing the note_key element dbi_result dbires database query result, pointing to the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ const char* get_refdb_note_key(dbi_result dbires) { const char* result; result = dbi_result_get_string(dbires, "note_key"); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else { return result; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_refdb_note_user_name(): retrieves the user_name element from a note query char* get_refdb_note_user_name returns a pointer to a string containing the user_name element dbi_result dbires database query result, pointing to the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ const char* get_refdb_note_user_name(dbi_result dbires) { const char* result; result = dbi_result_get_string(dbires, "user_name"); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else { return result; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_refdb_note_title_copy(): retrieves the title element from a note query char* get_refdb_note_title_copy returns a pointer to a string containing the note_title element. The string is allocated and must be freed by the caller dbi_result dbires database query result, pointing to the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* get_refdb_note_title_copy(dbi_result dbires) { return my_dbi_result_get_string_copy(dbires, "note_title"); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_refdb_note_content_copy(): retrieves the content element from a note query char* get_refdb_note_content_copy returns a pointer to a string containing the note_content element. The string is allocated and must be freed by the caller dbi_result dbires database query result, pointing to the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* get_refdb_note_content_copy(dbi_result dbires) { return my_dbi_result_get_string_copy(dbires, "note_content"); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_refdb_note_content_type(): retrieves the content_type element from a note query char* get_refdb_content_type returns a pointer to a string containing the content_type element dbi_result dbires database query result, pointing to the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ const char* get_refdb_note_content_type(dbi_result dbires) { const char* result; result = dbi_result_get_string(dbires, "note_content_type"); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else { return result; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_refdb_note_content_xmllang(): retrieves the content_xmllang element from a note query char* get_refdb_content_xmllang returns a pointer to a string containing the content_xmllang element dbi_result dbires database query result, pointing to the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ const char* get_refdb_note_content_xmllang(dbi_result dbires) { const char* result; result = dbi_result_get_string(dbires, "note_content_xmllang"); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else { return result; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_refdb_note_date(): retrieves the note_date element from a note query char* get_refdb_note_date returns a pointer to a string containing the note_date element dbi_result dbires database query result, pointing to the current dataset char* date string that receives the date. Must be >= 256 byte int mode 0 = string 1 = notex representation ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* get_refdb_note_date(dbi_result dbires, char* date, int mode) { time_t the_time; the_time = dbi_result_get_datetime(dbires, "note_date"); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires)) == 0) { if (the_time) { if (!mode) { strftime(date, 256, "%a %b %d %Y", gmtime(&the_time)); } else { strftime(date, 256, "%Y-%m-%d", gmtime(&the_time)); } } else { strcpy(date, "nd"); } return date; } else { return NULL; /* have no date */ } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_refdb_note_share(): retrieves the share attribute from a note query char* get_refdb_note_share returns 1 if public, 0 if private, -1 if not set by user dbi_result dbires database query result, pointing to the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ short int get_refdb_note_share(dbi_result dbires) { short int result; result = dbi_result_get_short(dbires, "note_share"); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return 0; /* be paranoid in case of an error */ } else { return result; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ request_notes_by_ref(): requests all notes that are associated to a given reference dbi_result request_notes_by_ref returns a pointer to a dbi result structure which contains the notes dbi_conn conn the connection int mode 1 = reference entry 2 = keyword entry 4 = author entry 8 = periodical entry const char* user name of current user int share 1=share by default, 0=hide by default int include_lists 0=ignore reference lists 1=include reference lists ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ dbi_result request_notes_by_ref(dbi_conn conn, unsigned long long n_id, int mode, const char* user, int share, int include_lists) { int nis_first = 1; char* sql_command; char* sql_chunk; const char* drivername; char userspec[512]; char namespec[512]; dbi_result dbires; dbi_driver driver; driver = dbi_conn_get_driver(conn); drivername = dbi_driver_get_name(driver); sql_command = malloc(4096); if (sql_command == NULL) { return NULL; } sql_chunk = malloc(2048); if (sql_chunk == NULL) { free(sql_command); return NULL; } *sql_command = '\0'; /* assemble substring which selects the notes based on the share settings */ if (share) { snprintf(userspec, 512, "(t_user.user_name=\'%s\' OR (t_user.user_name!=\'%s\' AND t_note.note_share!=0))", user, user); } else { snprintf(userspec, 512, "(t_user.user_name=\'%s\' OR (t_user.user_name!=\'%s\' AND t_note.note_share=1))", user, user); } /* assemble substring which selects the notes based on the note key to exclude reference lists */ if (!include_lists) { size_t namelen; namelen = strlen(user); snprintf(namespec, 512, " AND NOT (%s(t_note.note_key%s1%s %zd)=\'%s\') ", my_dbi_driver_get_cap(driver, "substring"), my_dbi_driver_get_cap(driver, "substring_from"), my_dbi_driver_get_cap(driver, "substring_for"), namelen, user); } else { *namespec = 0; } if (!strcmp(my_dbi_driver_get_cap(driver, "union"), "t")) { if (mode & REFERENCE) { sprintf(sql_chunk, "SELECT DISTINCT t_note.note_id, t_note.note_key, t_note.note_title, t_note.note_user_id, t_note.note_date, t_note.note_content, t_note.note_content_type, t_note.note_content_xmllang FROM t_note INNER JOIN t_xnote ON t_note.note_id=t_xnote.note_id INNER JOIN t_refdb ON t_xnote.xref_id=t_refdb.refdb_id INNER JOIN t_user ON t_note.note_user_id=t_user.user_id WHERE %s AND t_refdb.refdb_id="ULLSPEC" AND t_xnote.xnote_type=\'REFERENCE\'%s", userspec, (unsigned long long)n_id, namespec); strcat(sql_command, sql_chunk); nis_first = 0; } if (mode & KEYWORD) { sprintf(sql_chunk, "SELECT DISTINCT t_note.note_id, t_note.note_key, t_note.note_title, t_note.note_user_id, t_note.note_date, t_note.note_content, t_note.note_content_type, t_note.note_content_xmllang FROM t_note INNER JOIN t_xnote ON t_note.note_id=t_xnote.note_id INNER JOIN t_user ON t_note.note_user_id=t_user.user_id INNER JOIN t_keyword ON t_xnote.xref_id=t_keyword.keyword_id INNER JOIN t_xkeyword ON t_xkeyword.keyword_id=t_keyword.keyword_id INNER JOIN t_refdb ON t_xkeyword.xref_id=t_refdb.refdb_id WHERE %s AND t_refdb.refdb_id="ULLSPEC" AND t_xnote.xnote_type=\'KEYWORD\'%s", userspec, (unsigned long long)n_id, namespec); if (!nis_first) { strcat(sql_command, " UNION "); } strcat(sql_command, sql_chunk); nis_first = 0; } if (mode & AUTHOR) { sprintf(sql_chunk, "SELECT DISTINCT t_note.note_id, t_note.note_key, t_note.note_title, t_note.note_user_id, t_note.note_date, t_note.note_content, t_note.note_content_type, t_note.note_content_xmllang FROM t_note INNER JOIN t_xnote ON t_note.note_id=t_xnote.note_id INNER JOIN t_user ON t_note.note_user_id=t_user.user_id INNER JOIN t_author ON t_xnote.xref_id=t_author.author_id INNER JOIN t_xauthor ON t_xauthor.author_id=t_author.author_id INNER JOIN t_refdb ON t_xauthor.refdb_id=t_refdb.refdb_id WHERE %s AND t_refdb.refdb_id="ULLSPEC" AND t_xnote.xnote_type=\'AUTHOR\'%s", userspec, (unsigned long long)n_id, namespec); if (!nis_first) { strcat(sql_command, " UNION "); } strcat(sql_command, sql_chunk); nis_first = 0; } if (mode & PERIODICAL) { sprintf(sql_chunk, "SELECT DISTINCT t_note.note_id, t_note.note_key, t_note.note_title, t_note.note_user_id, t_note.note_date, t_note.note_content, t_note.note_content_type, t_note.note_content_xmllang FROM t_note INNER JOIN t_xnote ON t_note.note_id=t_xnote.note_id INNER JOIN t_periodical ON t_xnote.xref_id=t_periodical.periodical_id INNER JOIN t_refdb ON t_refdb.refdb_periodical_id=t_periodical.periodical_id INNER JOIN t_user ON t_note.note_user_id=t_user.user_id WHERE %s AND t_refdb.refdb_id="ULLSPEC" AND t_xnote.xnote_type=\'PERIODICAL\'%s", userspec, (unsigned long long)n_id, namespec); if (!nis_first) { strcat(sql_command, " UNION "); } strcat(sql_command, sql_chunk); } } else { /* if the db engine does not support UNION, emulate UNION with SELECT INTO temptable */ if (!strcmp(drivername, "mysql")) { /* mysql */ strcpy(sql_command, "CREATE TEMPORARY TABLE t_noteunion \ (note_id BIGINT, \ note_key VARCHAR(255), \ note_title VARCHAR(255), \ note_content BLOB, \ note_content_type VARCHAR(255), \ note_content_xmllang VARCHAR(255), \ note_user_id BIGINT, \ note_date DATETIME)"); } else if (!strcmp(drivername, "pgsql")) { /* pgsql */ strcpy(sql_command, "CREATE TEMPORARY TABLE t_noteunion \ (note_id BIGSERIAL, \ note_key VARCHAR(255) UNIQUE, \ note_title VARCHAR(255), \ note_content TEXT, \ note_content_type VARCHAR(255), \ note_content_xmllang VARCHAR(255), \ note_user_id BIGINT, \ note_date DATE)"); } else if (!strcmp(drivername, "sqlite")) { /* sqlite */ strcpy(sql_command, "CREATE TEMPORARY TABLE t_noteunion \ (note_id INTEGER, \ note_key TEXT, \ note_title TEXT, \ note_content_type TEXT, \ note_content_xmllang TEXT, \ note_user_id INTEGER, \ note_date DATE, \ note_content TEXT)"); } else if (!strcmp(drivername, "sqlite3")) { /* sqlite3 */ strcpy(sql_command, "CREATE TEMPORARY TABLE t_noteunion \ (note_id BIGINT, \ note_key TEXT, \ note_title TEXT, \ note_content_type TEXT, \ note_content_xmllang TEXT, \ note_user_id BIGINT, \ note_date DATE, \ note_content TEXT)"); } /* else: will be caught earlier */ LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { LOG_PRINT(LOG_WARNING, "create temporary table failed"); free(sql_command); free(sql_chunk); return NULL; } /* now collect the data in the temporary table */ if (mode & REFERENCE) { sprintf(sql_chunk, "INSERT INTO t_noteunion (note_id, note_key, note_title, note_user_id, note_date, note_content, note_content_type, note_content_xmllang) SELECT DISTINCT t_note.note_id, t_note.note_key, t_note.note_title, t_note.note_user_id, t_note.note_date, t_note.note_content, t_note.note_content_type, t_note.note_content_xmllang FROM t_note INNER JOIN t_xnote ON t_note.note_id=t_xnote.note_id INNER JOIN t_user ON t_note.note_user_id=t_user.user_id INNER JOIN t_refdb ON t_xnote.xref_id=t_refdb.refdb_id WHERE %s AND t_refdb.refdb_id="ULLSPEC" AND t_xnote.xnote_type=\'REFERENCE\'%s", userspec, (unsigned long long)n_id, namespec); LOG_PRINT(LOG_DEBUG, sql_chunk); dbires = dbi_conn_query(conn, sql_chunk); if (!dbires) { LOG_PRINT(LOG_WARNING, "insert into temporary table failed"); /* free(sql_command); */ /* free(sql_chunk); */ /* return NULL; */ } } if (mode & KEYWORD) { sprintf(sql_chunk, "INSERT INTO t_noteunion (note_id, note_key, note_title, note_user_id, note_date, note_content, note_content_type, note_content_xmllang) SELECT DISTINCT t_note.note_id, t_note.note_key, t_note.note_title, t_note.note_user_id, t_note.note_date, t_note.note_content FROM t_note INNER JOIN t_xnote ON t_note.note_id=t_xnote.note_id INNER JOIN t_user ON t_note.note_user_id=t_user.user_id INNER JOIN t_keyword ON t_xnote.xref_id=t_keyword.keyword_id INNER JOIN t_xkeyword ON t_xkeyword.keyword_id=t_keyword.keyword_id INNER JOIN t_refdb ON t_xkeyword.xref_id=t_refdb.refdb_id WHERE %s AND t_refdb.refdb_id="ULLSPEC" AND t_xnote.xnote_type=\'KEYWORD\'%s", userspec, (unsigned long long)n_id, namespec); LOG_PRINT(LOG_DEBUG, sql_chunk); dbires = dbi_conn_query(conn, sql_chunk); if (!dbires) { LOG_PRINT(LOG_WARNING, "insert into temporary table failed"); /* free(sql_command); */ /* free(sql_chunk); */ /* return NULL; */ } } if (mode & AUTHOR) { sprintf(sql_chunk, "INSERT INTO t_noteunion (note_id, note_key, note_title, note_user_id, note_date, note_content, note_content_type, note_content_xmllang) SELECT DISTINCT t_note.note_id, t_note.note_key, t_note.note_title, t_note.note_user_id, t_note.note_date, t_note.note_content, t_note.note_content_type, t_note.note_content_xmllang FROM t_note INNER JOIN t_xnote ON t_note.note_id=t_xnote.note_id INNER JOIN t_author ON t_xnote.xref_id=t_author.author_id INNER JOIN t_xauthor ON t_xauthor.author_id=t_author.author_id INNER JOIN t_refdb ON t_xauthor.refdb_id=t_refdb.refdb_id INNER JOIN t_user ON t_note.note_user_id=t_user.user_id WHERE %s AND t_refdb.refdb_id="ULLSPEC" AND t_xnote.xnote_type=\'AUTHOR\'%s", userspec, (unsigned long long)n_id, namespec); LOG_PRINT(LOG_DEBUG, sql_chunk); dbires = dbi_conn_query(conn, sql_chunk); if (!dbires) { LOG_PRINT(LOG_WARNING, "insert into temporary table failed"); /* free(sql_command); */ /* free(sql_chunk); */ /* return NULL; */ } } if (mode & PERIODICAL) { sprintf(sql_chunk, "INSERT INTO t_noteunion (note_id, note_key, note_title, note_user_id, note_date, note_content, note_content_type, note_content_xmllang) SELECT DISTINCT t_note.note_id, t_note.note_key, t_note.note_title, t_note.note_user_id, t_note.note_date, t_note.note_content, t_note.note_content_type, t_note.note_content_xmllang FROM t_note INNER JOIN t_xnote ON t_note.note_id=t_xnote.note_id INNER JOIN t_periodical ON t_xnote.xref_id=t_periodical.periodical_id INNER JOIN t_refdb ON t_refdb.refdb_periodical_id=t_periodical.periodical_id INNER JOIN t_user ON t_note.note_user_id=t_user.user_id WHERE %s AND t_refdb.refdb_id="ULLSPEC" AND t_xnote.xnote_type=\'PERIODICAL\'%s", userspec, (unsigned long long)n_id, namespec); LOG_PRINT(LOG_DEBUG, sql_chunk); dbires = dbi_conn_query(conn, sql_chunk); if (!dbires) { LOG_PRINT(LOG_WARNING, "insert into temporary table failed"); /* free(sql_command); */ /* free(sql_chunk); */ /* return NULL; */ } } /* now retrieve the datasets again */ sprintf(sql_command, "SELECT DISTINCT note_id, note_key, note_title, note_user_id, note_date, note_content, note_content_type, note_content_xmllang FROM t_noteunion"); } free(sql_chunk); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); /* if (!dbires) { */ /* begin weird hack */ /* sprintf(sql_command, "SELECT refdb_id FROM t_refdb where refdb_id=-1"); */ /* LOG_PRINT(LOG_DEBUG, sql_command); */ /* dbires = dbi_conn_query(conn, sql_command); */ /* end weird hack */ /* return NULL; */ /* } */ free(sql_command); return dbires; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ free_request_notes_by_ref(): cleans up the resources used by a previous call to request_notes_by_ref int free_request_notes_by_ref returns 0 on success and 1 if an error occurs dbi_conn conn the connection ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int free_request_notes_by_ref(dbi_conn conn) { dbi_result dbires; char sql_command[23]; /* check whether we used a temporary table. If yes, drop it */ if (strcmp(my_dbi_driver_get_cap(dbi_conn_get_driver(conn), "union"), "t")) { /* get rid of the temporary table */ strcpy(sql_command, "DROP TABLE t_noteunion"); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { LOG_PRINT(LOG_WARNING, "drop temporary table failed"); return 1; } } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ request_links(): prepares the retrieval of links dbi_result request_links returns a pointer to a dbi result structure which contains the links dbi_conn conn the connection int mode 0 = reference entry 1 = keyword entry 2 = author entry 3 = periodical entry ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ dbi_result request_links(dbi_conn conn, unsigned long long n_id, int mode) { char* sql_command; char linktype[4][11] = {"REFERENCE", "KEYWORD", "AUTHOR", "PERIODICAL"}; dbi_result dbires; sql_command = malloc(512); if (sql_command == NULL) { return NULL; } if (!mode) { /* link to refererence. Need citation key */ sprintf(sql_command, "SELECT t_refdb.refdb_citekey FROM t_refdb INNER JOIN t_xnote ON t_refdb.refdb_id=t_xnote.xref_id INNER JOIN t_note ON t_xnote.note_id= t_note.note_id WHERE t_xnote.xnote_type='\%s\' AND t_note.note_id="ULLSPEC, linktype[mode], (unsigned long long)n_id); } else if (mode == 1) { /* link to keyword. Need keyword name */ sprintf(sql_command, "SELECT t_keyword.keyword_name FROM t_keyword INNER JOIN t_xnote ON t_keyword.keyword_id=t_xnote.xref_id INNER JOIN t_note ON t_xnote.note_id= t_note.note_id WHERE t_xnote.xnote_type='\%s\' AND t_note.note_id="ULLSPEC, linktype[mode], (unsigned long long)n_id); } else if (mode == 2) { /* link to author. Need author name */ sprintf(sql_command, "SELECT t_author.author_name FROM t_author INNER JOIN t_xnote ON t_author.author_id=t_xnote.xref_id INNER JOIN t_note ON t_xnote.note_id= t_note.note_id WHERE t_xnote.xnote_type='\%s\' AND t_note.note_id="ULLSPEC, linktype[mode], (unsigned long long)n_id); } else /* if (mode == 3) */ { /* link to periodical. Need one of the periodical names */ sprintf(sql_command, "SELECT t_periodical.periodical_name,t_periodical.periodical_abbrev,t_periodical.periodical_custabbrev1,t_periodical.periodical_custabbrev2 FROM t_periodical INNER JOIN t_xnote ON t_periodical.periodical_id=t_xnote.xref_id INNER JOIN t_note ON t_xnote.note_id=t_note.note_id WHERE t_xnote.xnote_type='\%s\' AND t_note.note_id="ULLSPEC, linktype[mode], (unsigned long long)n_id); } LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); free(sql_command); if (!dbires) { return NULL; } return dbires; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_link(): retrieves a link char* get_link returns a pointer to a string containing the link dbi_result dbires database query result, pointing to the current dataset int *ptr_mode pointer to an integer to request the link type. This argument is currently ignored for all but periodical links. Initialize *ptr_mode to one of: 0 = reference entry 1 = keyword entry 2 = author entry 3 = periodical entry For successfully retrieved periodical entries, *ptr_mode will be updated to reflect the type of the periodical name used: 0 = full name, 1 = abbreviated name, 2 = custom abbreviation 1, 3 = custom abbreviation 2 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ const char* get_link(dbi_result dbires, int *ptr_mode) { const char* result = NULL; int i = 1; /* index into a dbi result, starts at 1 */ if (dbi_result_next_row(dbires)) { if (*ptr_mode == 3) { /* periodical links require special treatment as we don't know in advance which periodical names are available */ while (i < 5 && (!result || !*result)) { result = dbi_result_get_string_idx(dbires, i); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else if (result && *result) { *ptr_mode = i-1; return result; } i++; } return NULL; } else { result = dbi_result_get_string_idx(dbires, 1); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else { return result; } } } else { return NULL; } } /* 0 refdb_id ID - (if numeric) 1 refdb_type TY - 2 refdb_pubyear PY - (partial) 3 refdb_startpage SP - 4 refdb_endpage EP - 5 refdb_abstract N2 - 6 refdb_title TI - 7 refdb_volume VL - 8 refdb_issue CP - 9 refdb_booktitle BT - 10 refdb_city CY - 11 refdb_publisher PB - 12 refdb_title_series T3 - 13 refdb_address AD - 14 refdb_url UR - 15 refdb_issn SN - 16 refdb_periodical_id JO - (indirect) 17 refdb_pyother_info PY - (partial) 18 refdb_secyear Y2 - (partial) 19 refdb_secother_info Y2 - (partial) 20 refdb_user1 U1 - 21 refdb_user2 U2 - 22 refdb_user3 U3 - 23 refdb_user4 U4 - 24 refdb_user5 U5 - 28 refdb_citekey ID - (if non-numeric) */ /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_refdb_id(): retrieves the refdb_id element from a query result char* get_refdb_id returns a pointer to a string containing the refdb_id element dbi_result dbires database query result, pointing to the current dataset char* id ptr to string that will receive the id. Must be long enough for the representation of an unsigned long long number ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* get_refdb_id(dbi_result dbires, char* id) { unsigned long long n_id; dbi_error_flag errflag; n_id = my_dbi_result_get_idval(dbires, "refdb_id"); errflag = my_dbi_conn_error_flag(dbi_result_get_conn(dbires)); if (n_id == 0 || errflag) { /* all IDs > 0 so this must be an error */ return NULL; } else { sprintf(id, ULLSPEC, (unsigned long long)n_id); return id; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_refdb_citekey(): retrieves the refdb_citekey element from a query result char* get_refdb_citekey returns a pointer to a string containing the refdb_citekey element dbi_result dbires database query result, pointing to the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ const char* get_refdb_citekey(dbi_result dbires) { const char* result; result = dbi_result_get_string(dbires, "refdb_citekey"); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else { return result; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_refdb_type(): retrieves the refdb_type element from a query result char* get_refdb_type returns a pointer to a string containing the refdb_type element dbi_result dbires database query result, pointing to the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ const char* get_refdb_type(dbi_result dbires) { const char* result; result = dbi_result_get_string(dbires, "refdb_type"); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else { return result; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_refdb_pubyear(): retrieves the refdb_pubyear element from a query result char* get_refdb_pubyear returns a pointer to a string containing the refdb_pubyear element dbi_result dbires database query result, pointing to the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* get_refdb_pubyear(dbi_result dbires, char* year) { int n_year; n_year = dbi_result_get_short(dbires, "refdb_pubyear"); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires)) == 0) { if (n_year != 0) { sprintf(year, "%hd", n_year); } else { strcpy(year, "nd"); } return year; } else { return NULL; /* have no year */ } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_refdb_startpage(): retrieves the refdb_startpage element from a query result char* get_refdb_startpage returns a pointer to a string containing the refdb_startpage element dbi_result dbires database query result, pointing to the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ const char* get_refdb_startpage(dbi_result dbires) { const char* result; result = dbi_result_get_string(dbires, "refdb_startpage"); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else { return result; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_refdb_endpage(): retrieves the refdb_endpage element from a query result char* get_refdb_endpage returns a pointer to a string containing the refdb_endpage element dbi_result dbires database query result, pointing to the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ const char* get_refdb_endpage(dbi_result dbires) { const char* result; result = dbi_result_get_string(dbires, "refdb_endpage"); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else { return result; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_refdb_abstract_copy(): retrieves the refdb_abstract element from a query result char* get_refdb_abstract_copy returns a pointer to a string containing the refdb_abstract element. The string is allocated and must be freed by the caller dbi_result dbires database query result, pointing to the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* get_refdb_abstract_copy(dbi_result dbires) { return my_dbi_result_get_string_copy(dbires, "refdb_abstract"); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_refdb_title_copy(): retrieves the refdb_title element from a query result char* get_refdb_title_copy returns a pointer to a string containing the refdb_title element. The string is allocated and must be freed by the caller dbi_result dbires database query result, pointing to the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* get_refdb_title_copy(dbi_result dbires) { return my_dbi_result_get_string_copy(dbires, "refdb_title"); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_refdb_volume(): retrieves the refdb_volume element from a query result char* get_refdb_volume returns a pointer to a string containing the refdb_volume element dbi_result dbires database query result, pointing to the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ const char* get_refdb_volume(dbi_result dbires) { const char* result; result = dbi_result_get_string(dbires, "refdb_volume"); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else { return result; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_refdb_issue(): retrieves the refdb_issue element from a query result char* get_refdb_issue returns a pointer to a string containing the refdb_issue element dbi_result dbires database query result, pointing to the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ const char* get_refdb_issue(dbi_result dbires) { const char* result; result = dbi_result_get_string(dbires, "refdb_issue"); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else { return result; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_refdb_booktitle_copy(): retrieves the refdb_booktitle element from a query result char* get_refdb_booktitle_copy returns a pointer to a string containing the refdb_booktitle element. The string is allocated and must be freed by the caller dbi_result dbires database query result, pointing to the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* get_refdb_booktitle_copy(dbi_result dbires) { return my_dbi_result_get_string_copy(dbires, "refdb_booktitle"); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_refdb_city(): retrieves the refdb_city element from a query result char* get_refdb_city returns a pointer to a string containing the refdb_city element dbi_result dbires database query result, pointing to the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ const char* get_refdb_city(dbi_result dbires) { const char* result; result = dbi_result_get_string(dbires, "refdb_city"); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else { return result; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_refdb_publisher(): retrieves the refdb_publisher element from a query result char* get_refdb_publisher returns a pointer to a string containing the refdb_publisher element dbi_result dbires database query result, pointing to the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ const char* get_refdb_publisher(dbi_result dbires) { const char* result; result = dbi_result_get_string(dbires, "refdb_publisher"); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else { return result; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_refdb_title_series_copy(): retrieves the refdb_title_series element from a query result char* get_refdb_title_series_copy returns a pointer to a string containing the refdb_title_series element. The string is allocated and must be freed by the caller dbi_result dbires database query result, pointing to the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* get_refdb_title_series_copy(dbi_result dbires) { return my_dbi_result_get_string_copy(dbires, "refdb_title_series"); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_refdb_address_copy(): retrieves the refdb_address element from a query result char* get_refdb_address_copy returns a pointer to a string containing the refdb_address element. The string is allocated and must be freed by the caller dbi_result dbires database query result, pointing to the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* get_refdb_address_copy(dbi_result dbires) { return my_dbi_result_get_string_copy(dbires, "refdb_address"); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_refdb_url_copy(): retrieves the refdb_url element from a query result char* get_refdb_url_copy returns a pointer to a string containing the refdb_url element. The string is allocated and must be freed by the caller dbi_result dbires database query result, pointing to the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ /* char* get_refdb_url_copy(dbi_result dbires) { */ /* return my_dbi_result_get_string_copy(dbires, "refdb_url"); */ /* } */ /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_refdb_issn(): retrieves the refdb_issn element from a query result char* get_refdb_issn returns a pointer to a string containing the refdb_issn element dbi_result dbires database query result, pointing to the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ const char* get_refdb_issn(dbi_result dbires) { const char* result; result = dbi_result_get_string(dbires, "refdb_issn"); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else { return result; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_refdb_pyother_info(): retrieves the refdb_pyother_info element from a query result char* get_refdb_pyother_info returns a pointer to a string containing the refdb_pyother_info element dbi_result dbires database query result, pointing to the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ const char* get_refdb_pyother_info(dbi_result dbires) { const char* result; result = dbi_result_get_string(dbires, "refdb_pyother_info"); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else { return result; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_refdb_secyear(): retrieves the refdb_secyear element from a query result char* get_refdb_secyear returns a pointer to a string containing the refdb_secyear element dbi_result dbires database query result, pointing to the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* get_refdb_secyear(dbi_result dbires, char* year) { int n_year; n_year = dbi_result_get_short(dbires, "refdb_secyear"); if (n_year != 0 && my_dbi_conn_error_flag(dbi_result_get_conn(dbires)) == 0) { sprintf(year, "%hd", n_year); return year; } else { return NULL; /* have no year */ } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_refdb_secother_info(): retrieves the refdb_secother_info element from a query result char* get_refdb_secother_info returns a pointer to a string containing the refdb_secother_info element dbi_result dbires database query result, pointing to the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ const char* get_refdb_secother_info(dbi_result dbires) { const char* result; result = dbi_result_get_string(dbires, "refdb_secother_info"); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else { return result; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_refdb_user(): retrieves refdb_user elements from a query result char* get_refdb_user returns a pointer to a string containing the refdb_user element dbi_result dbires database query result, pointing to the current dataset int n_fieldno number of user field to retrieve (1-5) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ const char* get_refdb_user(dbi_result dbires, int n_fieldno) { switch(n_fieldno) { case 1: return get_refdb_user1(dbires); break; case 2: return get_refdb_user2(dbires); break; case 3: return get_refdb_user3(dbires); break; case 4: return get_refdb_user4(dbires); break; case 5: return get_refdb_user5(dbires); break; default: return NULL; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_refdb_user1(): retrieves the refdb_user1 element from a query result char* get_refdb_user1 returns a pointer to a string containing the refdb_user1 element dbi_result dbires database query result, pointing to the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ const char* get_refdb_user1(dbi_result dbires) { const char* result; result = dbi_result_get_string(dbires, "refdb_user1"); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else { return result; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_refdb_user2(): retrieves the refdb_user2 element from a query result char* get_refdb_user1 returns a pointer to a string containing the refdb_user2 element dbi_result dbires database query result, pointing to the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ const char* get_refdb_user2(dbi_result dbires) { const char* result; result = dbi_result_get_string(dbires, "refdb_user2"); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else { return result; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_refdb_user3(): retrieves the refdb_user3 element from a query result char* get_refdb_user3 returns a pointer to a string containing the refdb_user3 element dbi_result dbires database query result, pointing to the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ const char* get_refdb_user3(dbi_result dbires) { const char* result; result = dbi_result_get_string(dbires, "refdb_user3"); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else { return result; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_refdb_user4(): retrieves the refdb_user4 element from a query result char* get_refdb_user4 returns a pointer to a string containing the refdb_user1 element dbi_result dbires database query result, pointing to the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ const char* get_refdb_user4(dbi_result dbires) { const char* result; result = dbi_result_get_string(dbires, "refdb_user4"); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else { return result; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_refdb_user5(): retrieves the refdb_user5 element from a query result char* get_refdb_user5 returns a pointer to a string containing the refdb_user5 element dbi_result dbires database query result, pointing to the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ const char* get_refdb_user5(dbi_result dbires) { const char* result; result = dbi_result_get_string(dbires, "refdb_user5"); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else { return result; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_refdb_typeofwork(): retrieves the refdb_typeofwork element from a query result char* get_refdb_typeofwork returns a pointer to a string containing the refdb_typeofwork element dbi_result dbires database query result, pointing to the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ const char* get_refdb_typeofwork(dbi_result dbires) { const char* result; result = dbi_result_get_string(dbires, "refdb_typeofwork"); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else { return result; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_refdb_area(): retrieves the refdb_area element from a query result char* get_refdb_area returns a pointer to a string containing the refdb_area element dbi_result dbires database query result, pointing to the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ const char* get_refdb_area(dbi_result dbires) { const char* result; result = dbi_result_get_string(dbires, "refdb_area"); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else { return result; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_refdb_ostype(): retrieves the refdb_ostype element from a query result char* get_refdb_ostype returns a pointer to a string containing the refdb_ostype element dbi_result dbires database query result, pointing to the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ const char* get_refdb_ostype(dbi_result dbires) { const char* result; result = dbi_result_get_string(dbires, "refdb_ostype"); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else { return result; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_refdb_degree(): retrieves the refdb_degree element from a query result char* get_refdb_degree returns a pointer to a string containing the refdb_degree element dbi_result dbires database query result, pointing to the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ const char* get_refdb_degree(dbi_result dbires) { const char* result; result = dbi_result_get_string(dbires, "refdb_degree"); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else { return result; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_refdb_runningtime(): retrieves the refdb_runningtime element from a query result char* get_refdb_runningtime returns a pointer to a string containing the refdb_runningtime element dbi_result dbires database query result, pointing to the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ const char* get_refdb_runningtime(dbi_result dbires) { const char* result; result = dbi_result_get_string(dbires, "refdb_runningtime"); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else { return result; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_refdb_classcodeintl(): retrieves the refdb_classcodeintl element from a query result char* get_refdb_classcodeintl returns a pointer to a string containing the refdb_classcodeintl element dbi_result dbires database query result, pointing to the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ const char* get_refdb_classcodeintl(dbi_result dbires) { const char* result; result = dbi_result_get_string(dbires, "refdb_classcodeintl"); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else { return result; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_refdb_classcodeus(): retrieves the refdb_classcodeus element from a query result char* get_refdb_classcodeus returns a pointer to a string containing the refdb_classcodeus element dbi_result dbires database query result, pointing to the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ const char* get_refdb_classcodeus(dbi_result dbires) { const char* result; result = dbi_result_get_string(dbires, "refdb_classcodeus"); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else { return result; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_refdb_senderemail(): retrieves the refdb_senderemail element from a query result char* get_refdb_senderemail returns a pointer to a string containing the refdb_senderemail element dbi_result dbires database query result, pointing to the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ const char* get_refdb_senderemail(dbi_result dbires) { const char* result; result = dbi_result_get_string(dbires, "refdb_senderemail"); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else { return result; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_refdb_recipientemail(): retrieves the refdb_recipientemail element from a query result char* get_refdb_recipientemail returns a pointer to a string containing the refdb_recipientemail element dbi_result dbires database query result, pointing to the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ const char* get_refdb_recipientemail(dbi_result dbires) { const char* result; result = dbi_result_get_string(dbires, "refdb_recipientemail"); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else { return result; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_refdb_mediatype(): retrieves the refdb_mediatype element from a query result char* get_refdb_mediatype returns a pointer to a string containing the refdb_mediatype element dbi_result dbires database query result, pointing to the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ const char* get_refdb_mediatype(dbi_result dbires) { const char* result; result = dbi_result_get_string(dbires, "refdb_mediatype"); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else { return result; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_refdb_numvolumes(): retrieves the refdb_numvolumes element from a query result char* get_refdb_numvolumes returns a pointer to a string containing the refdb_numvolumes element dbi_result dbires database query result, pointing to the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ const char* get_refdb_numvolumes(dbi_result dbires) { const char* result; result = dbi_result_get_string(dbires, "refdb_numvolumes"); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else { return result; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_refdb_doi(): retrieves the refdb_doi element from a query result char* get_refdb_doi returns a pointer to a string containing the refdb_doi element dbi_result dbires database query result, pointing to the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ const char* get_refdb_doi(dbi_result dbires) { const char* result; result = dbi_result_get_string(dbires, "refdb_doi"); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else { return result; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_refdb_edition(): retrieves the refdb_edition element from a query result char* get_refdb_edition returns a pointer to a string containing the refdb_edition element dbi_result dbires database query result, pointing to the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ const char* get_refdb_edition(dbi_result dbires) { const char* result; result = dbi_result_get_string(dbires, "refdb_edition"); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else { return result; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_refdb_computer(): retrieves the refdb_computer element from a query result char* get_refdb_computer returns a pointer to a string containing the refdb_computer element dbi_result dbires database query result, pointing to the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ const char* get_refdb_computer(dbi_result dbires) { const char* result; result = dbi_result_get_string(dbires, "refdb_computer"); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else { return result; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_refdb_conferencelocation(): retrieves the refdb_conferencelocation element from a query result char* get_refdb_conferencelocation returns a pointer to a string containing the refdb_conferencelocation element dbi_result dbires database query result, pointing to the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ const char* get_refdb_conferencelocation(dbi_result dbires) { const char* result; result = dbi_result_get_string(dbires, "refdb_conferencelocation"); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else { return result; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_refdb_registrynum(): retrieves the refdb_registrynum element from a query result char* get_refdb_registrynum returns a pointer to a string containing the refdb_registrynum element dbi_result dbires database query result, pointing to the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ const char* get_refdb_registrynum(dbi_result dbires) { const char* result; result = dbi_result_get_string(dbires, "refdb_registrynum"); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else { return result; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_refdb_classification(): retrieves the refdb_classification element from a query result char* get_refdb_classification returns a pointer to a string containing the refdb_classification element dbi_result dbires database query result, pointing to the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ const char* get_refdb_classification(dbi_result dbires) { const char* result; result = dbi_result_get_string(dbires, "refdb_classification"); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else { return result; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_refdb_section(): retrieves the refdb_section element from a query result char* get_refdb_section returns a pointer to a string containing the refdb_section element dbi_result dbires database query result, pointing to the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ const char* get_refdb_section(dbi_result dbires) { const char* result; result = dbi_result_get_string(dbires, "refdb_section"); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else { return result; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_refdb_pamphletnum(): retrieves the refdb_pamphletnum element from a query result char* get_refdb_pamphletnum returns a pointer to a string containing the refdb_ element dbi_result dbires database query result, pointing to the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ const char* get_refdb_pamphletnum(dbi_result dbires) { const char* result; result = dbi_result_get_string(dbires, "refdb_pamphletnum"); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else { return result; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_refdb_chapternum(): retrieves the refdb_chapternum element from a query result char* get_refdb_chapternum returns a pointer to a string containing the refdb_ element dbi_result dbires database query result, pointing to the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ const char* get_refdb_chapternum(dbi_result dbires) { const char* result; result = dbi_result_get_string(dbires, "refdb_chapternum"); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else { return result; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_notes_copy(): retrieves the xuser_notes element from a query result char* get_notes_copy returns a pointer to a string containing the xuser_notes element. The string is allocated and must be freed by the caller dbi_result dbires database query result, pointing to the current dataset char* username ptr to string with the current username, or NULL if the search should not be restricted to the current user ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* get_notes_copy(dbi_result dbires, char* username) { char* sql_command; const char* notes = NULL; unsigned long long n_id; dbi_result dbires1; n_id = my_dbi_result_get_idval(dbires, "refdb_id"); if (n_id == 0) { /* all IDs >=1 so this must be an error */ return NULL; } sql_command = malloc(256); if (sql_command == NULL) { return NULL; } if (username != NULL) { sprintf(sql_command, "SELECT t_xuser.xuser_notes FROM t_xuser INNER JOIN t_user ON t_xuser.user_id=t_user.user_id WHERE t_user.user_name=\'%s\' AND t_xuser.refdb_id="ULLSPEC, username, (unsigned long long)n_id); } else { /* use the first entry regardless of which user */ sprintf(sql_command, "SELECT t_xuser.xuser_notes FROM t_xuser INNER JOIN t_user ON t_xuser.user_id=t_user.user_id WHERE t_xuser.refdb_id="ULLSPEC, (unsigned long long)n_id); } LOG_PRINT(LOG_DEBUG, sql_command); dbires1 = dbi_conn_query(dbi_result_get_conn(dbires), sql_command); free(sql_command); if (!dbires1) { return NULL; } if (dbi_result_next_row(dbires1)) { /* the result string will be an allocated copy that we have to free */ notes = my_dbi_result_get_string_copy(dbires1, "xuser_notes"); } dbi_result_free(dbires1); /* notes will still be NULL if result contains zero rows */ return (char*)notes; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_reprint(): retrieves the xuser_reprint element and related elements from a query result struct REPRINT get_reprint returns a structure which points to strings containing the xuser_reprint and xuser_date elements. If the previous search with request_reprint() was limited to the current user, this function will return the reprint status of this user. Otherwise it will search for the first user that has the reference in file. If no one has it in file, it will search for the first user that has it on request. If there is still no match, it will return any "NOT IN FILE" field. In case of an error, one or both REPRINT structure members are NULL dbi_result dbires database query result, pointing to the current dataset struct REPRINT* ptr_reprint ptr to structure which will receive the result char* username ptr to string with username or NULL if search should not be limited to a particular user ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ struct REPRINT* get_reprint(dbi_result dbires, struct REPRINT* ptr_reprint, char* username, int yeardigits) { char* sql_command; const char* xuser_reprint; const char* xuser_avail; int num_rows; unsigned long long n_id; time_t reprint_date; dbi_conn conn; dbi_result dbires1; sql_command = malloc(256); if (sql_command == NULL) { return NULL; } n_id = my_dbi_result_get_idval(dbires, "refdb_id"); if (n_id == 0) { /* all IDs > 0, so this must be an error */ free(sql_command); return NULL; } conn = dbi_result_get_conn(dbires); if (username != NULL) { sprintf(sql_command, "SELECT t_xuser.xuser_reprint, t_xuser.xuser_date, t_xuser.xuser_avail FROM t_xuser INNER JOIN t_user ON t_xuser.user_id=t_user.user_id WHERE t_user.user_name=\'%s\' AND t_xuser.refdb_id="ULLSPEC, username, (unsigned long long)n_id); } else { sprintf(sql_command, "SELECT t_xuser.xuser_reprint, t_xuser.xuser_date, t_xuser.xuser_avail FROM t_xuser WHERE t_xuser.refdb_id="ULLSPEC, (unsigned long long)n_id); } LOG_PRINT(LOG_DEBUG, sql_command); dbires1 = dbi_conn_query(conn, sql_command); free(sql_command); if (!dbires1) { return NULL; } /* check how many rows. If > 1, search for first entry IN FILE, or ON REQUEST if the former is not found. Assemble string from the user_reprint and user_date columns */ /* set defaults */ (ptr_reprint->reprint)[0] = '\0'; (ptr_reprint->date)[0] = '\0'; (ptr_reprint->avail)[0] = '\0'; if ((num_rows = dbi_result_get_numrows(dbires1)) > 1) { /* find first entry IN FILE */ while (dbi_result_next_row(dbires1)) { xuser_reprint = dbi_result_get_string_idx(dbires1, 1); if (!xuser_reprint || my_dbi_conn_error_flag(conn)) { continue; } if (strncmp(xuser_reprint, "IN FILE", 7) == 0) { strcpy(ptr_reprint->reprint, xuser_reprint); reprint_date = dbi_result_get_datetime_idx(dbires1, 2); if (reprint_date && !my_dbi_conn_error_flag(conn)) { print_risdate(&reprint_date, ptr_reprint->date, yeardigits); } xuser_avail = dbi_result_get_string_idx(dbires1, 3); if (xuser_avail && !my_dbi_conn_error_flag(conn)) { strcpy(ptr_reprint->avail, xuser_avail); } return ptr_reprint; /* the first IN FILE entry */ } } /* end while */ /* rewind... */ dbi_result_first_row(dbires1); while (dbi_result_next_row(dbires1)) { xuser_reprint = dbi_result_get_string_idx(dbires1, 1); if (!xuser_reprint || my_dbi_conn_error_flag(conn)) { continue; } if (strncmp(xuser_reprint, "ON REQUEST", 10) == 0) { strcpy(ptr_reprint->reprint, xuser_reprint); reprint_date = dbi_result_get_datetime_idx(dbires1, 2); if (reprint_date && !my_dbi_conn_error_flag(conn)) { print_risdate(&reprint_date, ptr_reprint->date, yeardigits); } xuser_avail = dbi_result_get_string_idx(dbires1, 3); if (xuser_avail && !my_dbi_conn_error_flag(conn)) { strcpy(ptr_reprint->avail, xuser_avail); } return ptr_reprint; /* the first ON REQUEST entry */ } } /* end while */ /* rewind... */ dbi_result_first_row(dbires1); if (dbi_result_next_row(dbires1)) { xuser_reprint = dbi_result_get_string_idx(dbires1, 1); if (xuser_reprint && !my_dbi_conn_error_flag(conn)) { strcpy(ptr_reprint->reprint, xuser_reprint); } reprint_date = dbi_result_get_datetime_idx(dbires1, 2); if (reprint_date && !my_dbi_conn_error_flag(conn)) { print_risdate(&reprint_date, ptr_reprint->date, yeardigits); } xuser_avail = dbi_result_get_string_idx(dbires1, 3); if (xuser_avail && !my_dbi_conn_error_flag(conn)) { strcpy(ptr_reprint->avail, xuser_avail); } return ptr_reprint; /* the first NOT IN FILE entry */ } else { return ptr_reprint; /* have nothing */ } } else if (num_rows == 1) { if (dbi_result_next_row(dbires1)) { xuser_reprint = dbi_result_get_string_idx(dbires1, 1); if (xuser_reprint && !my_dbi_conn_error_flag(conn)) { strcpy(ptr_reprint->reprint, xuser_reprint); } reprint_date = dbi_result_get_datetime_idx(dbires1, 2); if (reprint_date && !my_dbi_conn_error_flag(conn)) { print_risdate(&reprint_date, ptr_reprint->date, yeardigits); } xuser_avail = dbi_result_get_string_idx(dbires1, 3); if (xuser_avail && !my_dbi_conn_error_flag(conn)) { strcpy(ptr_reprint->avail, xuser_avail); } return ptr_reprint; /* the first NOT IN FILE entry */ } else { return ptr_reprint; /* have nothing */ } } else { return ptr_reprint; /* have nothing */ } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_periodical(): prepares the retrieval of periodical from a given database char* get_periodical returns the periodical string or NULL if an error occurred dbi_result dbires database query result, pointing to the current dataset char* periodical ptr to string that will receive the result. Must hold at least 256 characters. const char* db string holding the database to search in, or NULL if the current database should be used int type indicates which periodical name is to be retrieved. 0=name, 1=custabbrev1, 2=custabbrev2, 3=abbrev, 4=the first existing name in the order name, abbrev, custabbrev1, custabbrev2 int* errcode ptr to an int that will receive the error code (0 = no error, 1 = nothing found, 2 = memory error, 3 = database server error) int is_temp if 1, query temporary table for a dupcheck if 2, query temporary tables, but use frequency in permanent tables if 0, query permanent tables unsigned long long n_id ID of the dataset unsigned long long* ptr_frequency will be set to the frequency of the periodical in the database unless NULL ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* get_periodical(dbi_conn conn, char* periodical, const char* db, int type, int* errcode, int is_temp, unsigned long long n_id, unsigned long long* ptr_frequency) { char prefix[] = TEMP_TABLE_NAME_PREFIX; char *sql_command; char *dbstring = NULL; const char *item; const char *drivername; int i; dbi_result dbires1; /* fix the insert */ if (!is_temp) { *prefix = '\0'; } drivername = dbi_driver_get_name(dbi_conn_get_driver(conn)); sql_command = malloc(1024); if (sql_command == NULL) { *errcode = 2; return NULL; } if (!n_id) { *errcode = 1; return NULL; } /* never use db argument with pgsql driver */ if (db && *db && !strcmp(my_dbi_conn_get_cap(conn, "multiple_db"), "t")) { dbstring = malloc(strlen(db)+2); if (dbstring == NULL) { *errcode = 2; return NULL; } sprintf(dbstring, "%s.", db); } else { /* this is weird but simplifies the free() calls further down */ dbstring = malloc(1); if (dbstring == NULL) { *errcode = 2; return NULL; } dbstring[0] = '\0'; } if (type == 4) { /* we try all periodical names in a fixed order and return the first one we can find, or NULL if we don't find anything */ for (i = 0; i < 4; i++) { switch (i) { case 0: /* first try name */ sprintf(sql_command, "SELECT %st_%speriodical.periodical_name, %st_%speriodical.periodical_id FROM %st_%speriodical INNER JOIN %st_%srefdb ON %st_%srefdb.refdb_periodical_id=%st_%speriodical.periodical_id WHERE %st_%srefdb.refdb_id="ULLSPEC, dbstring, prefix, dbstring, prefix, dbstring, prefix, dbstring, prefix, dbstring, prefix, dbstring, prefix, dbstring, prefix, (unsigned long long)n_id); break; case 1: /* then try abbrev */ sprintf(sql_command, "SELECT %st_%speriodical.periodical_abbrev, %st_%speriodical.periodical_id FROM %st_%speriodical INNER JOIN %st_%srefdb ON %st_%srefdb.refdb_periodical_id=%st_%speriodical.periodical_id WHERE %st_%srefdb.refdb_id="ULLSPEC, dbstring, prefix, dbstring, prefix, dbstring, prefix, dbstring, prefix, dbstring, prefix, dbstring, prefix, dbstring, prefix, (unsigned long long)n_id); break; case 2: /* then try custabbrev1 */ sprintf(sql_command, "SELECT %st_%speriodical.periodical_custabbrev1, %st_%speriodical.periodical_id FROM %st_%speriodical INNER JOIN %st_%srefdb ON %st_%srefdb.refdb_periodical_id=%st_%speriodical.periodical_id WHERE %st_%srefdb.refdb_id="ULLSPEC, dbstring, prefix, dbstring, prefix, dbstring, prefix, dbstring, prefix, dbstring, prefix, dbstring, prefix, dbstring, prefix, (unsigned long long)n_id); break; case 3: /* finally try custabbrev2 */ sprintf(sql_command, "SELECT %st_%speriodical.periodical_custabbrev2, %st_%speriodical.periodical_id FROM %st_%speriodical INNER JOIN %st_%srefdb ON %st_%srefdb.refdb_periodical_id=%st_%speriodical.periodical_id WHERE %st_%srefdb.refdb_id="ULLSPEC, dbstring, prefix, dbstring, prefix, dbstring, prefix, dbstring, prefix, dbstring, prefix, dbstring, prefix, dbstring, prefix, (unsigned long long)n_id); break; default: LOG_PRINT(LOG_CRIT, "hope you never see this"); return NULL; } LOG_PRINT(LOG_DEBUG, sql_command); dbires1 = dbi_conn_query(conn, sql_command); if (!dbires1) { *errcode = 3; free(sql_command); free(dbstring); return NULL; } item = real_get_periodical(dbires1, is_temp, ptr_frequency); if (item && *item) { /* we're done, copy string into provided buffer and return it */ *errcode = 0; strcpy(periodical, item); dbi_result_free(dbires1); free(sql_command); free(dbstring); return periodical; } } /* end for */ if (i == 4) { /* nothing found */ *errcode = 1; free(sql_command); free(dbstring); return NULL; } } else { if (!type) { sprintf(sql_command, "SELECT %st_%speriodical.periodical_name, %st_%speriodical.periodical_id FROM %st_%speriodical INNER JOIN %st_%srefdb ON %st_%srefdb.refdb_periodical_id=%st_%speriodical.periodical_id WHERE %st_%srefdb.refdb_id="ULLSPEC, dbstring, prefix, dbstring, prefix, dbstring, prefix, dbstring, prefix, dbstring, prefix, dbstring, prefix, dbstring, prefix, (unsigned long long)n_id); } else if (type == 1) { sprintf(sql_command, "SELECT %st_%speriodical.periodical_custabbrev1, %st_%speriodical.periodical_id FROM %st_%speriodical INNER JOIN %st_%srefdb ON %st_%srefdb.refdb_periodical_id=%st_%speriodical.periodical_id WHERE %st_%srefdb.refdb_id="ULLSPEC, dbstring, prefix, dbstring, prefix, dbstring, prefix, dbstring, prefix, dbstring, prefix, dbstring, prefix, dbstring, prefix, (unsigned long long)n_id); } else if (type == 2) { sprintf(sql_command, "SELECT %st_%speriodical.periodical_custabbrev2, %st_%speriodical.periodical_id FROM %st_%speriodical INNER JOIN %st_%srefdb ON %st_%srefdb.refdb_periodical_id=%st_%speriodical.periodical_id WHERE %st_%srefdb.refdb_id="ULLSPEC, dbstring, prefix, dbstring, prefix, dbstring, prefix, dbstring, prefix, dbstring, prefix, dbstring, prefix, dbstring, prefix, (unsigned long long)n_id); } else if (type == 3) { sprintf(sql_command, "SELECT %st_%speriodical.periodical_abbrev, %st_%speriodical.periodical_id FROM %st_%speriodical INNER JOIN %st_%srefdb ON %st_%srefdb.refdb_periodical_id=%st_%speriodical.periodical_id WHERE %st_%srefdb.refdb_id="ULLSPEC, dbstring, prefix, dbstring, prefix, dbstring, prefix, dbstring, prefix, dbstring, prefix, dbstring, prefix, dbstring, prefix, (unsigned long long)n_id); } LOG_PRINT(LOG_DEBUG, sql_command); dbires1 = dbi_conn_query(conn, sql_command); free(sql_command); free(dbstring); if (!dbires1) { *errcode = 3; return NULL; } item = real_get_periodical(dbires1, is_temp, ptr_frequency); if (!item) { *errcode = 1; dbi_result_free(dbires1); return NULL; } else { *errcode = 0; strcpy(periodical, item); dbi_result_free(dbires1); return periodical; } } /* we should never arrive here - just to silence the compiler warning */ return NULL; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ real_get_periodical(): retrieves the periodical from a query result char* real_get_periodical returns a pointer to a string containing the periodical dbi_result dbires database query result, pointing to the current dataset int is_temp if 1, query temporary table for a dupcheck if 2, query temporary tables, but use frequency in permanent tables if 0, query permanent tables unsigned long long* ptr_frequency will be set to the frequency of the periodical in the database unless NULL ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static const char* real_get_periodical(dbi_result dbires, int is_temp, unsigned long long* ptr_frequency) { const char* result; char prefix[] = TEMP_TABLE_NAME_PREFIX; char sql_command[256]; unsigned long long periodical_id; unsigned long long periodical_num; dbi_result dbires1; /* fix the insert */ if (is_temp == 0 || is_temp == 2) { *prefix = '\0'; } if (dbi_result_next_row(dbires)) { result = dbi_result_get_string_idx(dbires, 1); if (ptr_frequency) { periodical_id = my_dbi_result_get_idval_idx(dbires, 2); sprintf(sql_command, "SELECT count(*) FROM t_%srefdb WHERE t_%srefdb.refdb_periodical_id="ULLSPEC, prefix, prefix, (unsigned long long)periodical_id); LOG_PRINT(LOG_DEBUG, sql_command); dbires1 = dbi_conn_query(dbi_result_get_conn(dbires), sql_command); if (!dbires1) { *ptr_frequency = 0; return NULL; } if (dbi_result_next_row(dbires1)) { periodical_num = my_dbi_result_get_idval_idx(dbires1, 1); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { dbi_result_free(dbires1); *ptr_frequency = 0; return NULL; } dbi_result_free(dbires1); *ptr_frequency = periodical_num; return result; } else { dbi_result_free(dbires1); *ptr_frequency = 0; return NULL; } } if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else { return result; } } else { return NULL; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ request_authors(): prepares the retrieval of authors from the currently selected database dbi_result request_authors returns a query result which contains the authors dbi_conn conn connection to the database server int type 1 = part author, 2 = publication author, 3 = set author, 4 = first available, 0 = all of them const char* role ptr to a string with contributor role, or NULL const char* db ptr to a string with the database name or NULL if the current database should be used int is_temp if 1, query temporary table for a dupcheck if 2, query temporary tables, but use frequency in permanent tables if 0, query permanent tables unsigned long long n_id id of the dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ dbi_result request_authors(dbi_conn conn, int type, const char* role, const char* db, int is_temp, unsigned long long n_id) { char* sql_command; char* dbstring; char* type_clause; char* role_clause; const char* drivername; char prefix[] = TEMP_TABLE_NAME_PREFIX; unsigned long long num_authors = 0; int i = 1; dbi_result dbires = NULL; dbi_driver driver = NULL; if (type == 4) { /* recursively call ourselves with all possible author types */ while (i < 4 && !num_authors) { dbires = request_authors(conn, i, role, db, is_temp, n_id); if (dbires) { num_authors = get_num_authors(dbires); if (!num_authors && i < 3) { clean_request(dbires); } } i++; } return dbires; } else { /* fix the insert */ if (!is_temp) { *prefix = '\0'; } /* never use db argument with pgsql */ if (db && *db && !strcmp(my_dbi_conn_get_cap(conn, "multiple_db"), "t")) { dbstring = malloc(strlen(db)+2); if (dbstring == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } sprintf(dbstring, "%s.", db); } else { /* this is weird but simplifies the free() calls further down */ dbstring = malloc(1); if (dbstring == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } *dbstring = '\0'; } if ((type_clause = malloc(64+strlen(dbstring)+strlen(prefix))) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(dbstring); return NULL; } else { *type_clause = '\0'; } if ((role_clause = malloc(64+strlen(dbstring)+strlen(prefix)+((role) ? strlen(role):0))) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(dbstring); return NULL; } else { *role_clause = '\0'; } if (type != 0) { sprintf(type_clause, " %st_%sxauthor.xauthor_type=%s AND ", dbstring, prefix, get_author_type_string(driver, type)); } if (role && *role) { sprintf(role_clause, " %st_%sxauthor.xauthor_role=\'%s\' AND ", dbstring, prefix, role); } driver = dbi_conn_get_driver(conn); drivername = dbi_driver_get_name(driver); sql_command = malloc(1024); if (sql_command == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(type_clause); free(role_clause); return NULL; } sprintf(sql_command, "SELECT %st_%sauthor.author_name,%st_%sauthor.author_lastname,%st_%sauthor.author_firstname,%st_%sauthor.author_middlename,%st_%sauthor.author_suffix,%st_%sxauthor.xauthor_role, %st_%sxauthor.author_id FROM %st_%sauthor INNER JOIN %st_%sxauthor ON %st_%sauthor.author_id=%st_%sxauthor.author_id WHERE %s %s %st_%sxauthor.refdb_id="ULLSPEC" ORDER BY t_%sxauthor.xauthor_position", dbstring, prefix, dbstring, prefix, dbstring, prefix, dbstring, prefix, dbstring, prefix, dbstring, prefix, dbstring, prefix, dbstring, prefix, dbstring, prefix, dbstring, prefix, dbstring, prefix, type_clause, role_clause, dbstring, prefix, (unsigned long long)n_id, prefix); LOG_PRINT(LOG_DEBUG, sql_command); free(type_clause); free(role_clause); dbires = dbi_conn_query(conn, sql_command); free(sql_command); free(dbstring); return dbires; } /* end if type==4 */ } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_num_authors(): retrieves the number of authors int get_num_authors returns the number of requested authors dbi_result dbires database query result, pointing to the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ unsigned long long get_num_authors(dbi_result dbires) { return dbi_result_get_numrows(dbires); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_author(): retrieves an author char* get_author returns a pointer to a string containing the author dbi_result dbires database query result, pointing to the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ const char* get_author(dbi_result dbires) { const char* result; if (dbi_result_next_row(dbires)) { result = dbi_result_get_string_idx(dbires, 1); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else { return result; } } else { return NULL; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_author_parts(): retrieves an author's name parts struct AUTHOR_INFO* get_author_parts returns a pointer to a struct containing the author name parts dbi_result dbires database query result, pointing to the current dataset struct AUTHOR_INFO* ptr_ainfo ptr to a structure that will receive the result ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ struct AUTHOR_INFO* get_author_parts(dbi_result dbires, struct AUTHOR_INFO* ptr_ainfo) { const char* result; /* start with a clean struct */ ptr_ainfo->name[0] = '\0'; ptr_ainfo->lastname[0] = '\0'; ptr_ainfo->firstname[0] = '\0'; ptr_ainfo->middlename[0] = '\0'; ptr_ainfo->suffix[0] = '\0'; ptr_ainfo->role[0] = '\0'; if (dbi_result_next_row(dbires)) { /* full name */ result = dbi_result_get_string_idx(dbires, 1); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else if (result) { strcpy(ptr_ainfo->name, result); } /* last name */ result = dbi_result_get_string_idx(dbires, 2); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else if (result) { strcpy(ptr_ainfo->lastname, result); } /* first name */ result = dbi_result_get_string_idx(dbires, 3); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else if (result) { strcpy(ptr_ainfo->firstname, result); } /* middle name */ result = dbi_result_get_string_idx(dbires, 4); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else if (result) { strcpy(ptr_ainfo->middlename, result); } /* suffix */ result = dbi_result_get_string_idx(dbires, 5); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else if (result) { strcpy(ptr_ainfo->suffix, result); } /* role */ result = dbi_result_get_string_idx(dbires, 6); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else if (result) { strcpy(ptr_ainfo->role, result); } } else { return NULL; } return ptr_ainfo; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_extended_author(): retrieves an author along with its frequency char* get_extended_author returns a pointer to a string containing the author dbi_result dbires database query result, pointing to the current dataset int is_temp if 1, query temporary table for a dupcheck if 2, query temporary tables, but use frequency in permanent tables if 0, query permanent tables unsigned long long* ptr_frequency ptr to an integer that will be set to the frequency of the author in the database ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ const char* get_extended_author(dbi_result dbires, int is_temp, unsigned long long* ptr_frequency) { const char* result; char sql_command[128]; char prefix[] = TEMP_TABLE_NAME_PREFIX; unsigned long long author_id; unsigned long long author_num; dbi_result dbires1; /* fix the insert */ if (is_temp == 0 || is_temp == 2) { *prefix = '\0'; } if (dbi_result_next_row(dbires)) { result = dbi_result_get_string_idx(dbires, 1); author_id = my_dbi_result_get_idval_idx(dbires, 7); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } /* retrieve frequency information */ sprintf(sql_command, "SELECT count(*) FROM t_%sxauthor WHERE author_id="ULLSPEC, prefix, (unsigned long long)author_id); LOG_PRINT(LOG_DEBUG, sql_command); dbires1 = dbi_conn_query(dbi_result_get_conn(dbires), sql_command); if (!dbires1) { *ptr_frequency = 0; return NULL; } if (dbi_result_next_row(dbires1)) { author_num = my_dbi_result_get_idval_idx(dbires1, 1); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { dbi_result_free(dbires1); *ptr_frequency = 0; return NULL; } dbi_result_free(dbires1); *ptr_frequency = author_num; return result; } else { dbi_result_free(dbires1); *ptr_frequency = 0; return NULL; } } else { *ptr_frequency = 0; return NULL; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_extended_author_parts(): retrieves an author's name parts including the frequency struct AUTHOR_INFO* get_extended_author_parts returns a pointer to a struct containing the author name parts dbi_result dbires database query result, pointing to the current dataset struct AUTHOR_INFO* ptr_ainfo ptr to a structure that will receive the result int is_temp if 1, query temporary table for a dupcheck if 2, query temporary tables, but use frequency in permanent tables if 0, query permanent tables unsigned long long* ptr_frequency ptr to an integer that will be set to the frequency of the author in the database ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ struct AUTHOR_INFO* get_extended_author_parts(dbi_result dbires, struct AUTHOR_INFO* ptr_ainfo, int is_temp, unsigned long long* ptr_frequency) { const char* result; char prefix[] = TEMP_TABLE_NAME_PREFIX; char sql_command[128]; unsigned long long author_id; unsigned long long author_num; dbi_result dbires1; /* fix the insert */ if (is_temp == 0 || is_temp == 2) { *prefix = '\0'; } /* start with a clean struct */ ptr_ainfo->name[0] = '\0'; ptr_ainfo->lastname[0] = '\0'; ptr_ainfo->firstname[0] = '\0'; ptr_ainfo->middlename[0] = '\0'; ptr_ainfo->suffix[0] = '\0'; ptr_ainfo->role[0] = '\0'; if (dbi_result_next_row(dbires)) { /* full name */ result = dbi_result_get_string_idx(dbires, 1); author_id = my_dbi_result_get_idval_idx(dbires, 7); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else if (result) { strcpy(ptr_ainfo->name, result); } /* last name */ result = dbi_result_get_string_idx(dbires, 2); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else if (result) { strcpy(ptr_ainfo->lastname, result); } /* first name */ result = dbi_result_get_string_idx(dbires, 3); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else if (result) { strcpy(ptr_ainfo->firstname, result); } /* middle name */ result = dbi_result_get_string_idx(dbires, 4); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else if (result) { strcpy(ptr_ainfo->middlename, result); } /* suffix */ result = dbi_result_get_string_idx(dbires, 5); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else if (result) { strcpy(ptr_ainfo->suffix, result); } /* role */ result = dbi_result_get_string_idx(dbires, 6); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else if (result) { strcpy(ptr_ainfo->role, result); } /* retrieve frequency information */ sprintf(sql_command, "SELECT count(*) FROM t_%sxauthor WHERE author_id="ULLSPEC, prefix, (unsigned long long)author_id); LOG_PRINT(LOG_DEBUG, sql_command); dbires1 = dbi_conn_query(dbi_result_get_conn(dbires), sql_command); if (!dbires1) { *ptr_frequency = 0; return NULL; } if (dbi_result_next_row(dbires1)) { author_num = my_dbi_result_get_idval_idx(dbires1, 1); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { dbi_result_free(dbires1); *ptr_frequency = 0; return NULL; } dbi_result_free(dbires1); *ptr_frequency = author_num; return ptr_ainfo; } else { dbi_result_free(dbires1); *ptr_frequency = 0; return NULL; } } else { *ptr_frequency = 0; return NULL; } return ptr_ainfo; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ request_keywords(): prepares the retrieval of keywords dbi_result request_keywords returns a pointer to a dbi result structure which contains the keywords dbi_result dbires database query result, pointing to the current dataset (used only to retrieve the connection) int is_temp if 1, query temporary table for a dupcheck if 2, query temporary tables, but use frequency in permanent tables if 0, query permanent tables int is_temp if 1, query temporary table for a dupcheck ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ dbi_result request_keywords(dbi_conn conn, unsigned long long n_id, int mode, int is_temp) { char* sql_command; char keytype[2][10] = {"REFERENCE", "NOTE"}; char prefix[] = TEMP_TABLE_NAME_PREFIX; dbi_result dbires; sql_command = malloc(512); if (sql_command == NULL) { return NULL; } /* fix the insert */ if (!is_temp) { *prefix = '\0'; } /* NB sorting the keywords is not strictly necessary but it simplifies roundtrip addref/getref analyses */ sprintf(sql_command, "SELECT t_%skeyword.keyword_name, t_%skeyword.keyword_id FROM t_%skeyword INNER JOIN t_%sxkeyword ON t_%skeyword.keyword_id=t_%sxkeyword.keyword_id WHERE t_%sxkeyword.xkeyword_type=\'%s\' AND t_%sxkeyword.xref_id="ULLSPEC" ORDER BY t_%skeyword.keyword_name", prefix, prefix, prefix, prefix, prefix, prefix, prefix, keytype[mode], prefix, (unsigned long long)n_id, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); free(sql_command); if (!dbires) { return NULL; } return dbires; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_keyword(): retrieves a keyword char* get_keyword returns a pointer to a string containing the keyword dbi_result dbires database query result, pointing to the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ const char* get_keyword(dbi_result dbires) { const char* result; if (dbi_result_next_row(dbires)) { result = dbi_result_get_string_idx(dbires, 1); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else { return result; } } else { return NULL; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_extended_keyword(): retrieves a keyword along with its frequency char* get_extended_keyword returns a pointer to a string containing the keyword dbi_result dbires database query result, pointing to the current dataset int is_temp if 1, query temporary table for a dupcheck if 2, query temporary tables, but use frequency in permanent tables if 0, query permanent tables unsigned long long* ptr_frequency ptr to an integer that will be set to the frequency of the keyword in the database ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ const char* get_extended_keyword(dbi_result dbires, int is_temp, unsigned long long* ptr_frequency) { const char* result; char sql_command[128]; char prefix[] = TEMP_TABLE_NAME_PREFIX; unsigned long long keyword_id; unsigned long long keyword_num; dbi_result dbires1; /* fix the insert */ if (is_temp == 0 || is_temp == 2) { *prefix = '\0'; } if (dbi_result_next_row(dbires)) { result = dbi_result_get_string_idx(dbires, 1); keyword_id = my_dbi_result_get_idval_idx(dbires, 2); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } /* retrieve frequency information */ sprintf(sql_command, "SELECT count(*) FROM t_%sxkeyword WHERE keyword_id="ULLSPEC, prefix, (unsigned long long)keyword_id); LOG_PRINT(LOG_DEBUG, sql_command); dbires1 = dbi_conn_query(dbi_result_get_conn(dbires), sql_command); if (!dbires1) { *ptr_frequency = 0; return NULL; } if (dbi_result_next_row(dbires1)) { keyword_num = my_dbi_result_get_idval_idx(dbires1, 1); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { dbi_result_free(dbires1); *ptr_frequency = 0; return NULL; } dbi_result_free(dbires1); *ptr_frequency = keyword_num; return result; } else { dbi_result_free(dbires1); *ptr_frequency = 0; return NULL; } } else { *ptr_frequency = 0; return NULL; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_num_keywords(): retrieves the number of keywords int get_num_keywords returns the number of requested keywords dbi_result dbires database query result, pointing to the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ unsigned long long get_num_keywords(dbi_result dbires) { return dbi_result_get_numrows(dbires); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ request_ulinks(): prepares the retrieval of ulinks dbi_result request_ulinks returns a pointer to a dbi result structure which contains the ulinks dbi_result dbires database query result, pointing to the current dataset (used only to retrieve the connection) int mode 0 = reference entry 1 = note entry int type 0 = URL, 1 = PDF, 2 = FULLTEXT 3 = RELATED 4 = IMAGE 5 = DOI int is_temp if 1, query temporary table for a dupcheck const char* username name of user. If NULL or empty, all links will be retrieved. If given, only the links of that user and all links not associated with a user will be retrieved. The name "NULL" (don't confuse with a NULL pointer) will retrieve only those links that are not owned by a particular user (but then don't allow "NULL" as a username!) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ dbi_result request_ulinks(dbi_conn conn, unsigned long long n_id, int mode, int type, int is_temp, const char* username) { char* sql_command; char keymode[2][10] = {"REFERENCE", "NOTE"}; char keytype[6][10] = {"URL", "PDF", "FULLTEXT", "RELATED", "IMAGE", "DOI"}; char prefix[] = TEMP_TABLE_NAME_PREFIX; dbi_result dbires; sql_command = malloc(512); if (sql_command == NULL) { return NULL; } /* fix the insert */ if (!is_temp) { *prefix = '\0'; } if (username && !strcmp(username, "NULL")) { /* only those not owned by a particular user */ sprintf(sql_command, "SELECT DISTINCT t_%slink.link_url FROM t_%slink INNER JOIN t_%sxlink ON t_%slink.link_id=t_%sxlink.link_id WHERE t_%sxlink.xlink_type=\'%s\' AND t_%sxlink.xlink_source=\'%s\' AND t_%sxlink.xref_id="ULLSPEC" AND t_%sxlink.user_id=0" , prefix, prefix, prefix, prefix, prefix, prefix, keytype[type], prefix, keymode[mode], prefix, (unsigned long long)n_id, prefix); } else if (username && *username) { /* those owned by a particular user, and all not owned by one */ /* NB the order of t_user and t_link in the FROM clause is critical in PostgreSQL */ if (!type || type == 5) { /* URL and DOI are always public */ sprintf(sql_command, "SELECT DISTINCT t_%slink.link_url FROM t_%suser,t_%slink INNER JOIN t_%sxlink ON t_%slink.link_id=t_%sxlink.link_id WHERE t_%sxlink.xlink_type=\'%s\' AND t_%sxlink.xlink_source=\'%s\' AND t_%sxlink.xref_id="ULLSPEC" AND t_%sxlink.user_id=0" , prefix, prefix, prefix, prefix, prefix, prefix, prefix, keytype[type], prefix, keymode[mode], prefix, (unsigned long long)n_id, prefix); } else { /* we really mean private */ sprintf(sql_command, "SELECT DISTINCT t_%slink.link_url FROM t_%suser,t_%slink INNER JOIN t_%sxlink ON t_%slink.link_id=t_%sxlink.link_id WHERE t_%sxlink.xlink_type=\'%s\' AND t_%sxlink.xlink_source=\'%s\' AND t_%sxlink.xref_id="ULLSPEC" AND (t_%sxlink.user_id=t_%suser.user_id AND t_%suser.user_name=\'%s\')" , prefix, prefix, prefix, prefix, prefix, prefix, prefix, keytype[type], prefix, keymode[mode], prefix, (unsigned long long)n_id, prefix, prefix, prefix, username); } } else { /* all */ sprintf(sql_command, "SELECT DISTINCT t_%slink.link_url FROM t_%slink INNER JOIN t_%sxlink ON t_%slink.link_id=t_%sxlink.link_id WHERE t_%sxlink.xlink_type=\'%s\' AND t_%sxlink.xlink_source=\'%s\' AND t_%sxlink.xref_id="ULLSPEC, prefix, prefix, prefix, prefix, prefix, prefix, keytype[type], prefix, keymode[mode], prefix, (unsigned long long)n_id); } LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); free(sql_command); if (!dbires) { return NULL; } return dbires; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_ulink(): retrieves an ulink char* get_ulink returns a pointer to a string containing the ulink dbi_result dbires database query result, pointing to the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ const char* get_ulink(dbi_result dbires) { const char* result; if (dbi_result_next_row(dbires)) { result = my_dbi_result_get_string_idx(dbires, 1); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else { return result; } } else { return NULL; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ request_users(): prepares the retrieval of users of the currently selected database dbi_result request_users returns a query result which contains the users dbi_conn conn connection to database server const char* db ptr to a string with the database name or NULL if the current database should be used int is_temp if 1, query temporary table for a dupcheck unsigned long long n_id id of the dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ dbi_result request_users(dbi_conn conn, const char* db, int is_temp, unsigned long long n_id) { char prefix[] = TEMP_TABLE_NAME_PREFIX; char *sql_command; char *dbstring; const char *drivername; dbi_result dbires; dbi_driver driver; driver = dbi_conn_get_driver(conn); drivername = dbi_driver_get_name(driver); sql_command = malloc(1024); if (sql_command == NULL) { return NULL; } /* fix the insert */ if (!is_temp) { *prefix = '\0'; } /* never use db argument with pgsql */ if (db && *db && !strcmp(my_dbi_conn_get_cap(conn, "multiple_db"), "t")) { dbstring = malloc(strlen(db)+2); if (dbstring == NULL) { return NULL; } sprintf(dbstring, "%s.", db); } else { /* this is weird but simplifies the free() calls further down */ dbstring = malloc(1); if (dbstring == NULL) { return NULL; } dbstring[0] = '\0'; } sprintf(sql_command, "SELECT %st_%suser.user_name FROM %st_%suser INNER JOIN %st_%sxuser ON %st_%suser.user_id=%st_%sxuser.user_id WHERE %st_%sxuser.refdb_id="ULLSPEC, dbstring, prefix, dbstring, prefix, dbstring, prefix, dbstring, prefix, dbstring, prefix, dbstring, prefix, (unsigned long long)n_id); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); free(sql_command); free(dbstring); return dbires; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_user(): retrieves an user char* get_user returns a pointer to a string containing the user dbi_result dbires database query result, pointing to the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ const char* get_user(dbi_result dbires) { const char* result; if (dbi_result_next_row(dbires)) { result = dbi_result_get_string_idx(dbires, 1); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else { return result; } } else { return NULL; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ clean_request() frees the dbi result data structure after a request is finished void clean_request dbi_result dbires database query result, pointing to the current dataset ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ void clean_request(dbi_result dbires) { dbi_result_free(dbires); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ my_dbi_result_get_string_copy(): retrieves a given field which is either a string or a binary string from a query result char* my_dbi_result_get_string_copy returns a pointer to a string containing the requested field element, or NULL in case something went wrong. The returned string must be freed by the calling function dbi_result dbires database query result, pointing to the current dataset const char* fieldname name of the field to retrieve ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* my_dbi_result_get_string_copy(dbi_result dbires, const char* fieldname) { const char* result; char* myresult; unsigned short n_field_type; size_t n_stringsize; n_field_type = dbi_result_get_field_type(dbires, fieldname); if (n_field_type == DBI_TYPE_BINARY) { /* binary strings are returned without a terminating \0 so we have to bend over backwards to treat it as a normal string */ result = (const char*)dbi_result_get_binary(dbires, fieldname); if (!result || my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else { n_stringsize = dbi_result_get_field_length(dbires, fieldname); /* need one extra byte for a terminating \0 */ myresult = malloc(n_stringsize+1); if (myresult == NULL) { return NULL; } memcpy(myresult, result, n_stringsize); myresult[n_stringsize] = '\0'; /* terminate string */ return myresult; } } else if (n_field_type == DBI_TYPE_STRING) { result = dbi_result_get_string_copy(dbires, fieldname); if (my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else { return (char*)result; } } else { /* should never happen */ return NULL; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ my_dbi_result_get_string_copy_idx(): retrieves a given field which is either a string or a binary string from a query result char* my_dbi_result_get_string_copy_idx returns a pointer to a string containing the requested field element, or NULL in case something went wrong. The returned string must be freed by the calling function dbi_result dbires database query result, pointing to the current dataset unsigned int idx index of field to retrieve (1-base) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* my_dbi_result_get_string_copy_idx(dbi_result dbires, unsigned int idx) { const char* result; char* myresult; unsigned short n_field_type; size_t n_stringsize; /* char debug_msg[128]; */ n_field_type = dbi_result_get_field_type_idx(dbires, idx); /* sprintf(debug_msg, "n_field_type went to %d", n_field_type); */ /* LOG_PRINT(LOG_DEBUG, debug_msg); */ if (n_field_type == DBI_TYPE_BINARY) { /* binary strings are returned without a terminating \0 so we have to bend over backwards to treat it as a normal string */ result = (const char*)dbi_result_get_binary_idx(dbires, idx); if (!result || my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { return NULL; } else { n_stringsize = dbi_result_get_field_length_idx(dbires, idx); /* need one extra byte for a terminating \0 */ myresult = malloc(n_stringsize+1); if (myresult == NULL) { return NULL; } memcpy(myresult, result, n_stringsize); myresult[n_stringsize] = '\0'; /* terminate string */ return myresult; } } else if (n_field_type == DBI_TYPE_STRING) { result = dbi_result_get_string_copy_idx(dbires, idx); /* if (!result) { */ /* LOG_PRINT(LOG_DEBUG, "result went to NULL"); */ /* } */ if (!result || my_dbi_conn_error_flag(dbi_result_get_conn(dbires))) { /* sprintf(debug_msg, "error flag went to %d, idx was %d", my_dbi_conn_error_flag(dbi_result_get_conn(dbires)), idx); */ /* LOG_PRINT(LOG_DEBUG, debug_msg); */ return NULL; } else { return (char*)result; } } else { /* should never happen */ return NULL; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ my_dbi_result_get_binary_copy(): retrieves a given field which is a binary string from a query result char* my_dbi_result_get_binary_copy returns a pointer to a string containing the requested field element, or NULL in case something went wrong. The returned string must be freed by the calling function dbi_result Result database query result, pointing to the current dataset const char* fieldname name of the field to retrieve ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* my_dbi_result_get_binary_copy(dbi_result Result, const char* fieldname) { /* this is a helper function that should be dropped if libdbi accepts the patch for dbi_result_get_binary. The issue is whether or not a terminating \0 is returned by the dbi function or not. This implementation is necessary if dbi does *not* return the \0 */ size_t n_stringsize; char *myresult; const char *result; const char *errstring; dbi_conn conn; conn = dbi_result_get_conn(Result); result = (const char*)dbi_result_get_binary(Result, fieldname); if (my_dbi_conn_error_flag(conn)) { dbi_conn_error(conn, &errstring); LOG_PRINT(LOG_WARNING, errstring); return NULL; } n_stringsize = dbi_result_get_field_length(Result, fieldname); /* need one extra byte for a terminating \0 */ myresult = malloc(n_stringsize+1); if (myresult == NULL) { LOG_PRINT(LOG_WARNING, "out of memory"); return NULL; } memcpy(myresult, result, n_stringsize); myresult[n_stringsize] = '\0'; /* terminate string */ return myresult; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ my_dbi_result_get_string(): retrieves a given TEXT field const char* my_dbi_result_get_string returns a pointer to a string containing the requested field element, or NULL in case something went wrong. dbi_result Result database query result, pointing to the current dataset const char* fieldname name of the field to retrieve ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ const char* my_dbi_result_get_string(dbi_result Result, const char* fieldname) { const char* result; unsigned short n_field_type; /* this kludgy function is necessary because MySQL treats TEXT fields as binary data */ n_field_type = dbi_result_get_field_type(Result, fieldname); if (n_field_type == DBI_TYPE_BINARY) { /* this implementation assumes that binary strings are returned by the mysql driver including a trailing \0 */ result = (const char*)dbi_result_get_binary(Result, fieldname); if (!result && my_dbi_conn_error_flag(dbi_result_get_conn(Result))) { return NULL; } else { return result; } } else if (n_field_type == DBI_TYPE_STRING) { result = dbi_result_get_string(Result, fieldname); if (my_dbi_conn_error_flag(dbi_result_get_conn(Result))) { return NULL; } else { return result; } } else { /* should never happen */ return NULL; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ my_dbi_result_get_string_idx(): retrieves a given TEXT field const char* my_dbi_result_get_string_idx returns a pointer to a string containing the requested field element, or NULL in case something went wrong. dbi_result Result database query result, pointing to the current dataset unsigned int idx index of the field to retrieve (1-based) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ const char* my_dbi_result_get_string_idx(dbi_result Result, unsigned int idx) { const char* result; unsigned short n_field_type; /* this kludgy function is necessary because MySQL treats TEXT fields as binary data */ n_field_type = dbi_result_get_field_type_idx(Result, idx); if (n_field_type == DBI_TYPE_BINARY) { /* this implementation assumes that binary strings are returned by the mysql driver including a trailing \0 */ result = (const char*)dbi_result_get_binary_idx(Result, idx); if (!result || my_dbi_conn_error_flag(dbi_result_get_conn(Result))) { return NULL; } else { return result; } } else if (n_field_type == DBI_TYPE_STRING) { result = dbi_result_get_string_idx(Result, idx); if (my_dbi_conn_error_flag(dbi_result_get_conn(Result))) { return NULL; } else { return result; } } else { /* should never happen */ return NULL; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_author_type_string(): returns a string that denotes the author type depending on the driver const char* get_author_type_string returns a ptr to the result string or NULL in case of an unsupported driver dbi_driver driver ptr to a database driver structure int type 1 = primary author, 2 = secondary author, 3 = tertiary author ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ const char* get_author_type_string(dbi_driver driver, int type) { if (!strcmp(my_dbi_driver_get_cap(driver, "enum"), "t")) { return author_type_string[0][type-1]; } else { return author_type_string[1][type-1]; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ is_in_list(): checks from a query result whether a given reference is in the personal reference list of a given user int is_in_list returns 1 if the reference is in the list, 0 if not, -1 if some error occurs dbi_result dbires database query result, pointing to the current dataset char* username ptr to string with a username ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int is_in_list(dbi_result dbires, char* username) { char *sql_command; char *quoted_username; unsigned long long n_id; dbi_result dbires1; dbi_conn conn; sql_command = malloc(256); if (sql_command == NULL) { return -1; } conn = dbi_result_get_conn(dbires); quoted_username = mstrdup(username); if (!quoted_username) { free(sql_command); return -1; } if (dbi_conn_quote_string(conn, "ed_username) == 0) { free(quoted_username); free(sql_command); return -1; } n_id = my_dbi_result_get_idval(dbires, "refdb_id"); if (username != NULL && !my_dbi_conn_error_flag(conn)) { sprintf(sql_command, "SELECT t_xuser.xuser_id FROM t_xuser INNER JOIN t_user ON t_xuser.user_id=t_user.user_id WHERE t_user.user_name=%s AND t_xuser.refdb_id="ULLSPEC, quoted_username, (unsigned long long)n_id); } else { free(quoted_username); free(sql_command); return -1; /* should never happen */ } free(quoted_username); LOG_PRINT(LOG_DEBUG, sql_command); dbires1 = dbi_conn_query(dbi_result_get_conn(dbires), sql_command); free(sql_command); if (!dbires1) { return -1; } if (dbi_result_next_row(dbires1)) { dbi_result_free(dbires1); return 1; } else { dbi_result_free(dbires1); return 0; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ sgml_entitize() replaces special characters with entities. The replacement is done according to an array of char/string pairs that has to be provided by the calling function. One source for entities and their Unicode equivalents: http://www.w3.org/TR/2000/WD-MathML2-20000211/bycodes.html char* sgml_entitize returns a pointer to the converted string. This may be different from the original value of the passed pointer, so after calling this function only the returned value should be used. The function also modifies the value of the passed pointer to buffer. If the function is successful, the return value and the current value of the passed pointer will be identical. The return value is NULL if an error occurred. In this case, the current value of the passed pointer can still be used to access the converted string as it was before the error. The buffer will be reallocated if needed, and the allocated length equals the length of the resulting string. char** buffer pointer to a pointer to the string that will be entitized int n_ref_format REF* type (see outformats.h) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* sgml_entitize(char** buffer, int n_ref_format) { int numents = 0; int i = 0; char *new_buffer; char *token, *the_end; struct charent* the_ents; struct charent sgml_ents[7] = { /* lookup table for sgml */ {"&", 1, "&"}, {"<", 1, "<"}, {">", 1, ">"}, {{226, 128, 148, 0}, 3, "—"}, /* 0x2014 */ {{226, 128, 152, 0}, 3, "‘"}, /* 0x2018 */ {{226, 128, 153, 0}, 3, "’"}, /* 0x2019 */ {"", 0, ""} }; struct charent xml_ents[7] = { /* lookup table for xml */ {"&", 1, "&"}, {"<", 1, "<"}, {">", 1, ">"}, {"", 0, ""} }; switch (n_ref_format) { case REFRTF: /* for RTF output, replace input buffer with escaped version */ new_buffer = rtf_escape_string(*buffer); if (new_buffer) { free(*buffer); *buffer = new_buffer; return new_buffer; } else { return NULL; } break; case REFDOCBKX: case REFTEIX: case RISX: case REFXHTML: case XNOTE: case REFCITATIONLISTX: case REFMODS: case REFDOCBKX5: case REFTEIX5: the_ents = xml_ents; break; default: the_ents = sgml_ents; break; } while (the_ents[i].len != 0) { numents = count_the_flowers(*buffer, the_ents[i].letter, the_ents[i].len); /* printf("numents for %s went to %d\n", the_ents[i].letter, numents); */ if (numents > 0) { if ((new_buffer = realloc(*buffer, strlen(*buffer) + ((strlen(the_ents[i].entity))*(numents+1)))) == NULL) { return NULL; } else { *buffer = new_buffer; } token = strstr(*buffer, the_ents[i].letter); the_end = &((*buffer)[strlen(*buffer)-1]); while (token != NULL) { char* next_amp; char* next_sc; char* next_sp; /* printf("token went to:%d< the_end) ? NULL:strstr(token+the_ents[i].len, the_ents[i].letter); } } i++; } return *buffer; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ load_style(): loads the style information for a particular publication type dbi_result load_style returns query result if ok, NULL if an error occurred const char* pubtype ptr to string with the publication type unsigned int citstyle_id the ID of the citation style dbi_conn conn database connection ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ dbi_result load_style(const char* pubtype, unsigned int citstyle_id, dbi_conn conn) { char* sql_command; const char *drivername; /* get memory for sql command buffer */ sql_command = malloc(8192); if (!sql_command) { LOG_PRINT(LOG_WARNING, "out of memory"); return NULL; } drivername = dbi_driver_get_name(dbi_conn_get_driver(conn)); /* 1 ID 2 AUTHORLISTSTYLE 3 EDITORLISTSTYLE 4 SEDITORLISTSTYLE 5 ALLALISTSTYLE 6 AUTHORLISTALTERNATESTYLE 7 EDITORLISTALTERNATESTYLE 8 SEDITORLISTALTERNATESTYLE 9 ALLALISTALTERNATESTYLE 10 AUTHORLISTALTERNATETEXT 11 EDITORLISTALTERNATETEXT 12 SEDITORLISTALTERNATETEXT 13 ALLALISTALTERNATETEXT 14 AUTHORLISTABBREVIATEFIRST 15 EDITORLISTABBREVIATEFIRST 16 SEDITORLISTABBREVIATEFIRST 17 ALLALISTABBREVIATEFIRST 18 AUTHORLISTABBREVIATESUBSEQ 19 EDITORLISTABBREVIATESUBSEQ 20 SEDITORLISTABBREVIATESUBSEQ 21 ALLALISTABBREVIATESUBSEQ 22 AUTHORLISTABBREVIATEFIRSTMAXAUTHOR 23 EDITORLISTABBREVIATEFIRSTMAXAUTHOR 24 SEDITORLISTABBREVIATEFIRSTMAXAUTHOR 25 ALLALISTABBREVIATEFIRSTMAXAUTHOR 26 AUTHORLISTABBREVIATESUBSEQMAXAUTHOR 27 EDITORLISTABBREVIATESUBSEQMAXAUTHOR 28 SEDITORLISTABBREVIATESUBSEQMAXAUTHOR 29 ALLALISTABBREVIATESUBSEQMAXAUTHOR 30 AUTHORLISTABBREVIATEFIRSTDISPLAYAUTHOR 31 EDITORLISTABBREVIATEFIRSTDISPLAYAUTHOR 32 SEDITORLISTABBREVIATEFIRSTDISPLAYAUTHOR 33 ALLALISTABBREVIATEFIRSTDISPLAYAUTHOR 34 AUTHORLISTABBREVIATESUBSEQDISPLAYAUTHOR 35 EDITORLISTABBREVIATESUBSEQDISPLAYAUTHOR 36 SEDITORLISTABBREVIATESUBSEQDISPLAYAUTHOR 37 ALLALISTABBREVIATESUBSEQDISPLAYAUTHOR 38 AUTHORLISTAEMPTY 39 EDITORLISTAEMPTY 40 SEDITORLISTAEMPTY 41 ALLALISTAEMPTY 42 AUTHORLISTASAME 43 EDITORLISTASAME 44 SEDITORLISTASAME 45 ALLALISTASAME 46 AUTHORLISTPRECEEDING 47 EDITORLISTPRECEEDING 48 SEDITORLISTPRECEEDING 49 ALLALISTPRECEEDING 50 AUTHORLISTFOLLOWING 51 EDITORLISTFOLLOWING 52 SEDITORLISTFOLLOWING 53 ALLALISTFOLLOWING 54 AUTHORLISTAUTHORSEPSTWOSEPS 55 EDITORLISTAUTHORSEPSTWOSEPS 56 SEDITORLISTAUTHORSEPSTWOSEPS 57 ALLALISTAUTHORSEPSTWOSEPS 58 AUTHORLISTAUTHORSEPSTHREESEPSTHREESEPSEACH 59 EDITORLISTAUTHORSEPSTHREESEPSTHREESEPSEACH 60 SEDITORLISTAUTHORSEPSTHREESEPSTHREESEPSEACH 61 ALLALISTAUTHORSEPSTHREESEPSTHREESEPSEACH 62 AUTHORLISTAUTHORSEPSTHREESEPSTHREESEPSLAST 63 EDITORLISTAUTHORSEPSTHREESEPSTHREESEPSLAST 64 SEDITORLISTAUTHORSEPSTHREESEPSTHREESEPSLAST 65 ALLALISTAUTHORSEPSTHREESEPSTHREESEPSLAST 66 AUTHORLISTAUTHORNAMESNAMEFIRSTNAMEORDER 67 EDITORLISTAUTHORNAMESNAMEFIRSTNAMEORDER 68 SEDITORLISTAUTHORNAMESNAMEFIRSTNAMEORDER 69 ALLALISTAUTHORNAMESNAMEFIRSTNAMEORDER 70 AUTHORLISTAUTHORNAMESNAMEFIRSTINITIALSTYLE 71 EDITORLISTAUTHORNAMESNAMEFIRSTINITIALSTYLE 72 SEDITORLISTAUTHORNAMESNAMEFIRSTINITIALSTYLE 73 ALLALISTAUTHORNAMESNAMEFIRSTINITIALSTYLE 74 AUTHORLISTAUTHORNAMESNAMEFIRSTUPPERCASE 75 EDITORLISTAUTHORNAMESNAMEFIRSTUPPERCASE 76 SEDITORLISTAUTHORNAMESNAMEFIRSTUPPERCASE 77 ALLALISTAUTHORNAMESNAMEFIRSTUPPERCASE 78 AUTHORLISTAUTHORNAMESNAMEOTHERNAMEORDER 79 EDITORLISTAUTHORNAMESNAMEOTHERNAMEORDER 80 SEDITORLISTAUTHORNAMESNAMEOTHERNAMEORDER 81 ALLALISTAUTHORNAMESNAMEOTHERNAMEORDER 82 AUTHORLISTAUTHORNAMESNAMEOTHERINITIALSTYLE 83 EDITORLISTAUTHORNAMESNAMEOTHERINITIALSTYLE 84 SEDITORLISTAUTHORNAMESNAMEOTHERINITIALSTYLE 85 ALLALISTAUTHORNAMESNAMEOTHERINITIALSTYLE 86 AUTHORLISTAUTHORNAMESNAMEOTHERUPPERCASE 87 EDITORLISTAUTHORNAMESNAMEOTHERUPPERCASE 88 SEDITORLISTAUTHORNAMESNAMEOTHERUPPERCASE 89 ALLALISTAUTHORNAMESNAMEOTHERUPPERCASE 90 AUTHORLISTTEXTTEXTSINGLEPRECEEDING 91 EDITORLISTTEXTTEXTSINGLEPRECEEDING 92 SEDITORLISTTEXTTEXTSINGLEPRECEEDING 93 ALLALISTTEXTTEXTSINGLEPRECEEDING 94 AUTHORLISTTEXTTEXTSINGLEFOLLOWING 95 EDITORLISTTEXTTEXTSINGLEFOLLOWING 96 SEDITORLISTTEXTTEXTSINGLEFOLLOWING 97 ALLALISTTEXTTEXTSINGLEFOLLOWING 98 AUTHORLISTTEXTTEXTMULTIPLEPRECEEDING 99 EDITORLISTTEXTTEXTMULTIPLEPRECEEDING 100 SEDITORLISTTEXTTEXTMULTIPLEPRECEEDING 101 ALLALISTTEXTTEXTMULTIPLEPRECEEDING 102 AUTHORLISTTEXTTEXTMULTIPLEFOLLOWING 103 EDITORLISTTEXTTEXTMULTIPLEFOLLOWING 104 SEDITORLISTTEXTTEXTMULTIPLEFOLLOWING 105 ALLALISTTEXTTEXTMULTIPLEFOLLOWING 106 AUTHORLISTTEXTEDTEXTSINGLEPRECEEDING 107 EDITORLISTTEXTEDTEXTSINGLEPRECEEDING 108 SEDITORLISTTEXTEDTEXTSINGLEPRECEEDING 109 ALLALISTTEXTEDTEXTSINGLEPRECEEDING 110 AUTHORLISTTEXTEDTEXTSINGLEFOLLOWING 111 EDITORLISTTEXTEDTEXTSINGLEFOLLOWING 112 SEDITORLISTTEXTEDTEXTSINGLEFOLLOWING 113 ALLALISTTEXTEDTEXTSINGLEFOLLOWING 114 AUTHORLISTTEXTEDTEXTMULTIPLEPRECEEDING 115 EDITORLISTTEXTEDTEXTMULTIPLEPRECEEDING 116 SEDITORLISTTEXTEDTEXTMULTIPLEPRECEEDING 117 ALLALISTTEXTEDTEXTMULTIPLEPRECEEDING 118 AUTHORLISTTEXTEDTEXTMULTIPLEFOLLOWING 119 EDITORLISTTEXTEDTEXTMULTIPLEFOLLOWING 120 SEDITORLISTTEXTEDTEXTMULTIPLEFOLLOWING 121 ALLALISTTEXTEDTEXTMULTIPLEFOLLOWING 122 PUBDATEPRECEEDING 123 PUBDATEFOLLOWING 124 PUBDATEFORMAT 125 PUBDATESEQUENCE 126 PUBDATEMONTHFORMAT 127 PUBDATEDAYFORMAT 128 PUBDATEYEARFORMAT 129 PUBDATEPADLEADINGZERO 130 PUBDATESTYLE 131 PUBDATESECPRECEEDING 132 PUBDATESECFOLLOWING 133 PUBDATESECFORMAT 134 PUBDATESECSEQUENCE 135 PUBDATESECMONTHFORMAT 136 PUBDATESECDAYFORMAT 137 PUBDATESECYEARFORMAT 138 PUBDATESECPADLEADINGZERO 139 PUBDATESECSTYLE 140 PUBDATEALLPRECEEDING 141 PUBDATEALLFOLLOWING 142 PUBDATEALLFORMAT 143 PUBDATEALLSEQUENCE 144 PUBDATEALLMONTHFORMAT 145 PUBDATEALLDAYFORMAT 146 PUBDATEALLYEARFORMAT 147 PUBDATEALLPADLEADINGZERO 148 PUBDATEALLSTYLE 149 TITLEPRECEEDING 150 TITLEFOLLOWING 151 TITLECASE 152 TITLESTYLE 153 BOOKTITLEPRECEEDING 154 BOOKTITLEFOLLOWING 155 BOOKTITLECASE 156 BOOKTITLESTYLE 157 SERIESTITLEPRECEEDING 158 SERIESTITLEFOLLOWING 159 SERIESTITLECASE 160 SERIESTITLESTYLE 161 ALLTITLEPRECEEDING 162 ALLTITLEFOLLOWING 163 ALLTITLECASE 164 ALLTITLESTYLE 165 JOURNALNAMEPRECEEDING 166 JOURNALNAMEFOLLOWING 167 JOURNALNAMECASE 168 JOURNALNAMEDEFAULTTEXT 169 JOURNALNAMEALTERNATETEXT 170 JOURNALNAMEPUNCTUATION 171 JOURNALNAMESTYLE 172 VOLUMEPRECEEDING 173 VOLUMEFOLLOWING 174 VOLUMESTYLE 175 ISSUEPRECEEDING 176 ISSUEFOLLOWING 177 ISSUESTYLE 178 PAGESSTYLE 179 PAGESSINGLEPAGEPRECEEDING 180 PAGESSINGLEPAGEFOLLOWING 181 PAGESPAGERANGEPRECEEDING 182 PAGESPAGERANGEFOLLOWING 183 PAGESPAGERANGETYPE 184 PUBLISHERPRECEEDING 185 PUBLISHERFOLLOWING 186 PUBLISHERSTYLE 187 PUBPLACEPRECEEDING 188 PUBPLACEFOLLOWING 189 PUBPLACESTYLE 190 PAGESPRECEEDING 191 PAGESFOLLOWING 192 REFNUMBERPRECEEDING 193 REFNUMBERFOLLOWING 194 REFNUMBERSTYLE 195 PUBDATEFIRSTSEP 196 PUBDATESECONDSEP 197 PUBDATESECFIRSTSEP 198 PUBDATESECSECONDSEP 199 PUBDATEALLFIRSTSEP 200 PUBDATEALLSECONDSEP 201 PAGESPAGERANGERANGESEPARATOR 202 SERIALPRECEEDING 203 SERIALFOLLOWING 204 SERIALSTYLE 205 ADDRESSPRECEEDING 206 ADDRESSFOLLOWING 207 ADDRESSSTYLE 208 USERDEF1PRECEEDING 209 USERDEF1FOLLOWING 210 USERDEF1STYLE 211 USERDEF2PRECEEDING 212 USERDEF2FOLLOWING 213 USERDEF2STYLE 214 USERDEF3PRECEEDING 215 USERDEF3FOLLOWING 216 USERDEF3STYLE 217 USERDEF4PRECEEDING 218 USERDEF4FOLLOWING 219 USERDEF4STYLE 220 USERDEF5PRECEEDING 221 USERDEF5FOLLOWING 222 USERDEF5STYLE 232 NOTESPRECEEDING 233 NOTESFOLLOWING 234 NOTESSTYLE 235 ABSTRACTPRECEEDING 236 ABSTRACTFOLLOWING 237 ABSTRACTSTYLE TYPEOFWORKPRECEEDING TYPEOFWORKFOLLOWING TYPEOFWORKSTYLE AREAPRECEEDING AREAFOLLOWING AREASTYLE OSTYPEPRECEEDING OSTYPEFOLLOWING OSTYPESTYLE DEGREEPRECEEDING DEGREEFOLLOWING DEGREESTYLE RUNNINGTIMEPRECEEDING RUNNINGTIMEFOLLOWING RUNNINGTIMESTYLE CLASSCODEINTLPRECEEDING CLASSCODEINTLFOLLOWING CLASSCODEINTLSTYLE CLASSCODEUSPRECEEDING CLASSCODEUSFOLLOWING CLASSCODEUSSTYLE SENDEREMAILPRECEEDING SENDEREMAILFOLLOWING SENDEREMAILSTYLE RECIPIENTEMAILPRECEEDING RECIPIENTEMAILFOLLOWING RECIPIENTEMAILSTYLE MEDIATYPEPRECEEDING MEDIATYPEFOLLOWING MEDIATYPESTYLE NUMVOLUMESPRECEEDING NUMVOLUMESFOLLOWING NUMVOLUMESSTYLE EDITIONPRECEEDING EDITIONFOLLOWING EDITIONSTYLE COMPUTERPRECEEDING COMPUTERFOLLOWING COMPUTERSTYLE CONFERENCELOCATIONPRECEEDING CONFERENCELOCATIONFOLLOWING CONFERENCELOCATIONSTYLE REGISTRYNUMPRECEEDING REGISTRYNUMFOLLOWING REGISTRYNUMSTYLE CLASSIFICATIONPRECEEDING CLASSIFICATIONFOLLOWING CLASSIFICATIONSTYLE SECTIONPRECEEDING SECTIONFOLLOWING SECTIONSTYLE PAMPHLETNUMPRECEEDING PAMPHLETNUMFOLLOWING PAMPHLETNUMSTYLE CHAPTERNUMPRECEEDING CHAPTERNUMFOLLOWING CHAPTERNUMSTYLE 238 LINK0PRECEEDING 239 LINK0FOLLOWING 240 LINK0STYLE 241 LINK1PRECEEDING 242 LINK1FOLLOWING 243 LINK1STYLE 244 LINK2PRECEEDING 245 LINK2FOLLOWING 246 LINK2STYLE 247 LINK3PRECEEDING 248 LINK3FOLLOWING 249 LINK3STYLE 250 LINK4PRECEEDING 251 LINK4FOLLOWING 252 LINK4STYLE 253 CITEKEYPRECEEDING 254 CITEKEYFOLLOWING 255 CITEKEYSTYLE */ /* now retrieve matching style information from REFSTYLE into*/ if (!strcmp(my_dbi_conn_get_cap(conn, "multiple_db"), "t")) { sprintf(sql_command, "SELECT ID, QSTYLE, XSTYLE, YSTYLE, ZSTYLE, QALTERNATESTYLE, XALTERNATESTYLE, YALTERNATESTYLE, ZALTERNATESTYLE, QALTERNATETEXT, XALTERNATETEXT, YALTERNATETEXT, ZALTERNATETEXT, QABBREVIATEFIRST, XABBREVIATEFIRST, YABBREVIATEFIRST, ZABBREVIATEFIRST, QABBREVIATESUBSEQ, XABBREVIATESUBSEQ, YABBREVIATESUBSEQ, ZABBREVIATESUBSEQ, QABBREVIATEFIRSTMAXAUTHOR, XABBREVIATEFIRSTMAXAUTHOR, YABBREVIATEFIRSTMAXAUTHOR, ZABBREVIATEFIRSTMAXAUTHOR, QABBREVIATESUBSEQMAXAUTHOR, XABBREVIATESUBSEQMAXAUTHOR, YABBREVIATESUBSEQMAXAUTHOR, ZABBREVIATESUBSEQMAXAUTHOR, QABBREVIATEFIRSTDISPLAYAUTHOR, XABBREVIATEFIRSTDISPLAYAUTHOR, YABBREVIATEFIRSTDISPLAYAUTHOR, ZABBREVIATEFIRSTDISPLAYAUTHOR, QABBREVIATESUBSEQDISPLAYAUTHOR, XABBREVIATESUBSEQDISPLAYAUTHOR, YABBREVIATESUBSEQDISPLAYAUTHOR, ZABBREVIATESUBSEQDISPLAYAUTHOR, QAEMPTY, XAEMPTY, YAEMPTY, ZAEMPTY, QASAME, XASAME, YASAME, ZASAME, QPRECEEDING, XPRECEEDING, YPRECEEDING, ZPRECEEDING, QFOLLOWING, XFOLLOWING, YFOLLOWING, ZFOLLOWING, QAUTHORSEPSTWOSEPS, XAUTHORSEPSTWOSEPS, YAUTHORSEPSTWOSEPS, ZAUTHORSEPSTWOSEPS, QAUTHORSEPSTHREESEPSTHREESEPSEACH, XAUTHORSEPSTHREESEPSTHREESEPSEACH, YAUTHORSEPSTHREESEPSTHREESEPSEACH, ZAUTHORSEPSTHREESEPSTHREESEPSEACH, QAUTHORSEPSTHREESEPSTHREESEPSLAST, XAUTHORSEPSTHREESEPSTHREESEPSLAST, YAUTHORSEPSTHREESEPSTHREESEPSLAST, ZAUTHORSEPSTHREESEPSTHREESEPSLAST, QAUTHORNAMESNAMEFIRSTNAMEORDER, XAUTHORNAMESNAMEFIRSTNAMEORDER, YAUTHORNAMESNAMEFIRSTNAMEORDER, ZAUTHORNAMESNAMEFIRSTNAMEORDER, QAUTHORNAMESNAMEFIRSTINITIALSTYLE, XAUTHORNAMESNAMEFIRSTINITIALSTYLE, YAUTHORNAMESNAMEFIRSTINITIALSTYLE, ZAUTHORNAMESNAMEFIRSTINITIALSTYLE, QAUTHORNAMESNAMEFIRSTUPPERCASE, XAUTHORNAMESNAMEFIRSTUPPERCASE, YAUTHORNAMESNAMEFIRSTUPPERCASE, ZAUTHORNAMESNAMEFIRSTUPPERCASE, QAUTHORNAMESNAMEOTHERNAMEORDER, XAUTHORNAMESNAMEOTHERNAMEORDER, YAUTHORNAMESNAMEOTHERNAMEORDER, ZAUTHORNAMESNAMEOTHERNAMEORDER, QAUTHORNAMESNAMEOTHERINITIALSTYLE, XAUTHORNAMESNAMEOTHERINITIALSTYLE, YAUTHORNAMESNAMEOTHERINITIALSTYLE, ZAUTHORNAMESNAMEOTHERINITIALSTYLE, QAUTHORNAMESNAMEOTHERUPPERCASE, XAUTHORNAMESNAMEOTHERUPPERCASE, YAUTHORNAMESNAMEOTHERUPPERCASE, ZAUTHORNAMESNAMEOTHERUPPERCASE, QTEXTTEXTSINGLEPRECEEDING, XTEXTTEXTSINGLEPRECEEDING, YTEXTTEXTSINGLEPRECEEDING, ZTEXTTEXTSINGLEPRECEEDING, QTEXTTEXTSINGLEFOLLOWING, XTEXTTEXTSINGLEFOLLOWING, YTEXTTEXTSINGLEFOLLOWING, ZTEXTTEXTSINGLEFOLLOWING, QTEXTTEXTMULTIPLEPRECEEDING, XTEXTTEXTMULTIPLEPRECEEDING, YTEXTTEXTMULTIPLEPRECEEDING, ZTEXTTEXTMULTIPLEPRECEEDING, QTEXTTEXTMULTIPLEFOLLOWING, XTEXTTEXTMULTIPLEFOLLOWING, YTEXTTEXTMULTIPLEFOLLOWING, ZTEXTTEXTMULTIPLEFOLLOWING, QTEXTEDTEXTSINGLEPRECEEDING, XTEXTEDTEXTSINGLEPRECEEDING, YTEXTEDTEXTSINGLEPRECEEDING, ZTEXTEDTEXTSINGLEPRECEEDING, QTEXTEDTEXTSINGLEFOLLOWING, XTEXTEDTEXTSINGLEFOLLOWING, YTEXTEDTEXTSINGLEFOLLOWING, ZTEXTEDTEXTSINGLEFOLLOWING, QTEXTEDTEXTMULTIPLEPRECEEDING, XTEXTEDTEXTMULTIPLEPRECEEDING, YTEXTEDTEXTMULTIPLEPRECEEDING, ZTEXTEDTEXTMULTIPLEPRECEEDING, QTEXTEDTEXTMULTIPLEFOLLOWING, XTEXTEDTEXTMULTIPLEFOLLOWING, YTEXTEDTEXTMULTIPLEFOLLOWING, ZTEXTEDTEXTMULTIPLEFOLLOWING, PUBDATEPRECEEDING, PUBDATEFOLLOWING, PUBDATEFORMAT, PUBDATESEQUENCE, PUBDATEMONTHFORMAT, PUBDATEDAYFORMAT, PUBDATEYEARFORMAT, PUBDATEPADLEADINGZERO, PUBDATESTYLE, PUBDATESECPRECEEDING, PUBDATESECFOLLOWING, PUBDATESECFORMAT, PUBDATESECSEQUENCE, PUBDATESECMONTHFORMAT, PUBDATESECDAYFORMAT, PUBDATESECYEARFORMAT, PUBDATESECPADLEADINGZERO, PUBDATESECSTYLE, PUBDATEALLPRECEEDING, PUBDATEALLFOLLOWING, PUBDATEALLFORMAT, PUBDATEALLSEQUENCE, PUBDATEALLMONTHFORMAT, PUBDATEALLDAYFORMAT, PUBDATEALLYEARFORMAT, PUBDATEALLPADLEADINGZERO, PUBDATEALLSTYLE, TITLEPRECEEDING, TITLEFOLLOWING, TITLECASE, TITLESTYLE, BOOKTITLEPRECEEDING, BOOKTITLEFOLLOWING, BOOKTITLECASE, BOOKTITLESTYLE, SERIESTITLEPRECEEDING, SERIESTITLEFOLLOWING, SERIESTITLECASE, SERIESTITLESTYLE, ALLTITLEPRECEEDING, ALLTITLEFOLLOWING, ALLTITLECASE, ALLTITLESTYLE, JOURNALNAMEPRECEEDING, JOURNALNAMEFOLLOWING, JOURNALNAMECASE, JOURNALNAMEDEFAULTTEXT, JOURNALNAMEALTERNATETEXT, JOURNALNAMEPUNCTUATION, JOURNALNAMESTYLE, VOLUMEPRECEEDING, VOLUMEFOLLOWING, VOLUMESTYLE, ISSUEPRECEEDING, ISSUEFOLLOWING, ISSUESTYLE, PAGESSTYLE, PAGESSINGLEPAGEPRECEEDING, PAGESSINGLEPAGEFOLLOWING, PAGESPAGERANGEPRECEEDING, PAGESPAGERANGEFOLLOWING, PAGESPAGERANGETYPE, PUBLISHERPRECEEDING, PUBLISHERFOLLOWING, PUBLISHERSTYLE, PUBPLACEPRECEEDING, PUBPLACEFOLLOWING, PUBPLACESTYLE, PAGESPRECEEDING, PAGESFOLLOWING, REFNUMBERPRECEEDING, REFNUMBERFOLLOWING, REFNUMBERSTYLE, PUBDATEFIRSTSEP, PUBDATESECONDSEP, PUBDATESECFIRSTSEP, PUBDATESECSECONDSEP, PUBDATEALLFIRSTSEP, PUBDATEALLSECONDSEP, PAGESPAGERANGERANGESEPARATOR, SERIALPRECEEDING, SERIALFOLLOWING, SERIALSTYLE, ADDRESSPRECEEDING, ADDRESSFOLLOWING, ADDRESSSTYLE, USERDEF1PRECEEDING, USERDEF1FOLLOWING, USERDEF1STYLE, USERDEF2PRECEEDING, USERDEF2FOLLOWING, USERDEF2STYLE, USERDEF3PRECEEDING, USERDEF3FOLLOWING, USERDEF3STYLE, USERDEF4PRECEEDING, USERDEF4FOLLOWING, USERDEF4STYLE, USERDEF5PRECEEDING, USERDEF5FOLLOWING, USERDEF5STYLE, NOTESPRECEEDING, NOTESFOLLOWING, NOTESSTYLE, ABSTRACTPRECEEDING, ABSTRACTFOLLOWING, ABSTRACTSTYLE, TYPEOFWORKPRECEEDING, TYPEOFWORKFOLLOWING, TYPEOFWORKSTYLE, AREAPRECEEDING, AREAFOLLOWING, AREASTYLE, OSTYPEPRECEEDING, OSTYPEFOLLOWING, OSTYPESTYLE, DEGREEPRECEEDING, DEGREEFOLLOWING, DEGREESTYLE, RUNNINGTIMEPRECEEDING, RUNNINGTIMEFOLLOWING, RUNNINGTIMESTYLE, CLASSCODEINTLPRECEEDING, CLASSCODEINTLFOLLOWING, CLASSCODEINTLSTYLE, CLASSCODEUSPRECEEDING, CLASSCODEUSFOLLOWING, CLASSCODEUSSTYLE, SENDEREMAILPRECEEDING, SENDEREMAILFOLLOWING, SENDEREMAILSTYLE, RECIPIENTEMAILPRECEEDING, RECIPIENTEMAILFOLLOWING, RECIPIENTEMAILSTYLE, MEDIATYPEPRECEEDING, MEDIATYPEFOLLOWING, MEDIATYPESTYLE, NUMVOLUMESPRECEEDING, NUMVOLUMESFOLLOWING, NUMVOLUMESSTYLE, EDITIONPRECEEDING, EDITIONFOLLOWING, EDITIONSTYLE, COMPUTERPRECEEDING, COMPUTERFOLLOWING, COMPUTERSTYLE, CONFERENCELOCATIONPRECEEDING, CONFERENCELOCATIONFOLLOWING, CONFERENCELOCATIONSTYLE, REGISTRYNUMPRECEEDING, REGISTRYNUMFOLLOWING, REGISTRYNUMSTYLE, CLASSIFICATIONPRECEEDING, CLASSIFICATIONFOLLOWING, CLASSIFICATIONSTYLE, SECTIONPRECEEDING, SECTIONFOLLOWING, SECTIONSTYLE, PAMPHLETNUMPRECEEDING, PAMPHLETNUMFOLLOWING, PAMPHLETNUMSTYLE, CHAPTERNUMPRECEEDING, CHAPTERNUMFOLLOWING, CHAPTERNUMSTYLE, LINK0PRECEEDING, LINK0FOLLOWING, LINK0STYLE, LINK1PRECEEDING, LINK1FOLLOWING, LINK1STYLE, LINK2PRECEEDING, LINK2FOLLOWING, LINK2STYLE, LINK3PRECEEDING, LINK3FOLLOWING, LINK3STYLE, LINK4PRECEEDING, LINK4FOLLOWING, LINK4STYLE, CITEKEYPRECEEDING, CITEKEYFOLLOWING, CITEKEYSTYLE from %s.REFSTYLE where PUBTYPE='%s' and CITSTYLEID=%u", main_db, pubtype, citstyle_id); } else { sprintf(sql_command, "SELECT ID, QSTYLE, XSTYLE, YSTYLE, ZSTYLE, QALTERNATESTYLE, XALTERNATESTYLE, YALTERNATESTYLE, ZALTERNATESTYLE, QALTERNATETEXT, XALTERNATETEXT, YALTERNATETEXT, ZALTERNATETEXT, QABBREVIATEFIRST, XABBREVIATEFIRST, YABBREVIATEFIRST, ZABBREVIATEFIRST, QABBREVIATESUBSEQ, XABBREVIATESUBSEQ, YABBREVIATESUBSEQ, ZABBREVIATESUBSEQ, QABBREVIATEFIRSTMAXAUTHOR, XABBREVIATEFIRSTMAXAUTHOR, YABBREVIATEFIRSTMAXAUTHOR, ZABBREVIATEFIRSTMAXAUTHOR, QABBREVIATESUBSEQMAXAUTHOR, XABBREVIATESUBSEQMAXAUTHOR, YABBREVIATESUBSEQMAXAUTHOR, ZABBREVIATESUBSEQMAXAUTHOR, QABBREVIATEFIRSTDISPLAYAUTHOR, XABBREVIATEFIRSTDISPLAYAUTHOR, YABBREVIATEFIRSTDISPLAYAUTHOR, ZABBREVIATEFIRSTDISPLAYAUTHOR, QABBREVIATESUBSEQDISPLAYAUTHOR, XABBREVIATESUBSEQDISPLAYAUTHOR, YABBREVIATESUBSEQDISPLAYAUTHOR, ZABBREVIATESUBSEQDISPLAYAUTHOR, QAEMPTY, XAEMPTY, YAEMPTY, ZAEMPTY, QASAME, XASAME, YASAME, ZASAME, QPRECEEDING, XPRECEEDING, YPRECEEDING, ZPRECEEDING, QFOLLOWING, XFOLLOWING, YFOLLOWING, ZFOLLOWING, QAUTHORSEPSTWOSEPS, XAUTHORSEPSTWOSEPS, YAUTHORSEPSTWOSEPS, ZAUTHORSEPSTWOSEPS, QAUTHORSEPSTHREESEPSTHREESEPSEACH, XAUTHORSEPSTHREESEPSTHREESEPSEACH, YAUTHORSEPSTHREESEPSTHREESEPSEACH, ZAUTHORSEPSTHREESEPSTHREESEPSEACH, QAUTHORSEPSTHREESEPSTHREESEPSLAST, XAUTHORSEPSTHREESEPSTHREESEPSLAST, YAUTHORSEPSTHREESEPSTHREESEPSLAST, ZAUTHORSEPSTHREESEPSTHREESEPSLAST, QAUTHORNAMESNAMEFIRSTNAMEORDER, XAUTHORNAMESNAMEFIRSTNAMEORDER, YAUTHORNAMESNAMEFIRSTNAMEORDER, ZAUTHORNAMESNAMEFIRSTNAMEORDER, QAUTHORNAMESNAMEFIRSTINITIALSTYLE, XAUTHORNAMESNAMEFIRSTINITIALSTYLE, YAUTHORNAMESNAMEFIRSTINITIALSTYLE, ZAUTHORNAMESNAMEFIRSTINITIALSTYLE, QAUTHORNAMESNAMEFIRSTUPPERCASE, XAUTHORNAMESNAMEFIRSTUPPERCASE, YAUTHORNAMESNAMEFIRSTUPPERCASE, ZAUTHORNAMESNAMEFIRSTUPPERCASE, QAUTHORNAMESNAMEOTHERNAMEORDER, XAUTHORNAMESNAMEOTHERNAMEORDER, YAUTHORNAMESNAMEOTHERNAMEORDER, ZAUTHORNAMESNAMEOTHERNAMEORDER, QAUTHORNAMESNAMEOTHERINITIALSTYLE, XAUTHORNAMESNAMEOTHERINITIALSTYLE, YAUTHORNAMESNAMEOTHERINITIALSTYLE, ZAUTHORNAMESNAMEOTHERINITIALSTYLE, QAUTHORNAMESNAMEOTHERUPPERCASE, XAUTHORNAMESNAMEOTHERUPPERCASE, YAUTHORNAMESNAMEOTHERUPPERCASE, ZAUTHORNAMESNAMEOTHERUPPERCASE, QTEXTTEXTSINGLEPRECEEDING, XTEXTTEXTSINGLEPRECEEDING, YTEXTTEXTSINGLEPRECEEDING, ZTEXTTEXTSINGLEPRECEEDING, QTEXTTEXTSINGLEFOLLOWING, XTEXTTEXTSINGLEFOLLOWING, YTEXTTEXTSINGLEFOLLOWING, ZTEXTTEXTSINGLEFOLLOWING, QTEXTTEXTMULTIPLEPRECEEDING, XTEXTTEXTMULTIPLEPRECEEDING, YTEXTTEXTMULTIPLEPRECEEDING, ZTEXTTEXTMULTIPLEPRECEEDING, QTEXTTEXTMULTIPLEFOLLOWING, XTEXTTEXTMULTIPLEFOLLOWING, YTEXTTEXTMULTIPLEFOLLOWING, ZTEXTTEXTMULTIPLEFOLLOWING, QTEXTEDTEXTSINGLEPRECEEDING, XTEXTEDTEXTSINGLEPRECEEDING, YTEXTEDTEXTSINGLEPRECEEDING, ZTEXTEDTEXTSINGLEPRECEEDING, QTEXTEDTEXTSINGLEFOLLOWING, XTEXTEDTEXTSINGLEFOLLOWING, YTEXTEDTEXTSINGLEFOLLOWING, ZTEXTEDTEXTSINGLEFOLLOWING, QTEXTEDTEXTMULTIPLEPRECEEDING, XTEXTEDTEXTMULTIPLEPRECEEDING, YTEXTEDTEXTMULTIPLEPRECEEDING, ZTEXTEDTEXTMULTIPLEPRECEEDING, QTEXTEDTEXTMULTIPLEFOLLOWING, XTEXTEDTEXTMULTIPLEFOLLOWING, YTEXTEDTEXTMULTIPLEFOLLOWING, ZTEXTEDTEXTMULTIPLEFOLLOWING, PUBDATEPRECEEDING, PUBDATEFOLLOWING, PUBDATEFORMAT, PUBDATESEQUENCE, PUBDATEMONTHFORMAT, PUBDATEDAYFORMAT, PUBDATEYEARFORMAT, PUBDATEPADLEADINGZERO, PUBDATESTYLE, PUBDATESECPRECEEDING, PUBDATESECFOLLOWING, PUBDATESECFORMAT, PUBDATESECSEQUENCE, PUBDATESECMONTHFORMAT, PUBDATESECDAYFORMAT, PUBDATESECYEARFORMAT, PUBDATESECPADLEADINGZERO, PUBDATESECSTYLE, PUBDATEALLPRECEEDING, PUBDATEALLFOLLOWING, PUBDATEALLFORMAT, PUBDATEALLSEQUENCE, PUBDATEALLMONTHFORMAT, PUBDATEALLDAYFORMAT, PUBDATEALLYEARFORMAT, PUBDATEALLPADLEADINGZERO, PUBDATEALLSTYLE, TITLEPRECEEDING, TITLEFOLLOWING, TITLECASE, TITLESTYLE, BOOKTITLEPRECEEDING, BOOKTITLEFOLLOWING, BOOKTITLECASE, BOOKTITLESTYLE, SERIESTITLEPRECEEDING, SERIESTITLEFOLLOWING, SERIESTITLECASE, SERIESTITLESTYLE, ALLTITLEPRECEEDING, ALLTITLEFOLLOWING, ALLTITLECASE, ALLTITLESTYLE, JOURNALNAMEPRECEEDING, JOURNALNAMEFOLLOWING, JOURNALNAMECASE, JOURNALNAMEDEFAULTTEXT, JOURNALNAMEALTERNATETEXT, JOURNALNAMEPUNCTUATION, JOURNALNAMESTYLE, VOLUMEPRECEEDING, VOLUMEFOLLOWING, VOLUMESTYLE, ISSUEPRECEEDING, ISSUEFOLLOWING, ISSUESTYLE, PAGESSTYLE, PAGESSINGLEPAGEPRECEEDING, PAGESSINGLEPAGEFOLLOWING, PAGESPAGERANGEPRECEEDING, PAGESPAGERANGEFOLLOWING, PAGESPAGERANGETYPE, PUBLISHERPRECEEDING, PUBLISHERFOLLOWING, PUBLISHERSTYLE, PUBPLACEPRECEEDING, PUBPLACEFOLLOWING, PUBPLACESTYLE, PAGESPRECEEDING, PAGESFOLLOWING, REFNUMBERPRECEEDING, REFNUMBERFOLLOWING, REFNUMBERSTYLE, PUBDATEFIRSTSEP, PUBDATESECONDSEP, PUBDATESECFIRSTSEP, PUBDATESECSECONDSEP, PUBDATEALLFIRSTSEP, PUBDATEALLSECONDSEP, PAGESPAGERANGERANGESEPARATOR, SERIALPRECEEDING, SERIALFOLLOWING, SERIALSTYLE, ADDRESSPRECEEDING, ADDRESSFOLLOWING, ADDRESSSTYLE, USERDEF1PRECEEDING, USERDEF1FOLLOWING, USERDEF1STYLE, USERDEF2PRECEEDING, USERDEF2FOLLOWING, USERDEF2STYLE, USERDEF3PRECEEDING, USERDEF3FOLLOWING, USERDEF3STYLE, USERDEF4PRECEEDING, USERDEF4FOLLOWING, USERDEF4STYLE, USERDEF5PRECEEDING, USERDEF5FOLLOWING, USERDEF5STYLE, NOTESPRECEEDING, NOTESFOLLOWING, NOTESSTYLE, ABSTRACTPRECEEDING, ABSTRACTFOLLOWING, ABSTRACTSTYLE, TYPEOFWORKPRECEEDING, TYPEOFWORKFOLLOWING, TYPEOFWORKSTYLE, AREAPRECEEDING, AREAFOLLOWING, AREASTYLE, OSTYPEPRECEEDING, OSTYPEFOLLOWING, OSTYPESTYLE, DEGREEPRECEEDING, DEGREEFOLLOWING, DEGREESTYLE, RUNNINGTIMEPRECEEDING, RUNNINGTIMEFOLLOWING, RUNNINGTIMESTYLE, CLASSCODEINTLPRECEEDING, CLASSCODEINTLFOLLOWING, CLASSCODEINTLSTYLE, CLASSCODEUSPRECEEDING, CLASSCODEUSFOLLOWING, CLASSCODEUSSTYLE, SENDEREMAILPRECEEDING, SENDEREMAILFOLLOWING, SENDEREMAILSTYLE, RECIPIENTEMAILPRECEEDING, RECIPIENTEMAILFOLLOWING, RECIPIENTEMAILSTYLE, MEDIATYPEPRECEEDING, MEDIATYPEFOLLOWING, MEDIATYPESTYLE, NUMVOLUMESPRECEEDING, NUMVOLUMESFOLLOWING, NUMVOLUMESSTYLE, EDITIONPRECEEDING, EDITIONFOLLOWING, EDITIONSTYLE, COMPUTERPRECEEDING, COMPUTERFOLLOWING, COMPUTERSTYLE, CONFERENCELOCATIONPRECEEDING, CONFERENCELOCATIONFOLLOWING, CONFERENCELOCATIONSTYLE, REGISTRYNUMPRECEEDING, REGISTRYNUMFOLLOWING, REGISTRYNUMSTYLE, CLASSIFICATIONPRECEEDING, CLASSIFICATIONFOLLOWING, CLASSIFICATIONSTYLE, SECTIONPRECEEDING, SECTIONFOLLOWING, SECTIONSTYLE, PAMPHLETNUMPRECEEDING, PAMPHLETNUMFOLLOWING, PAMPHLETNUMSTYLE, CHAPTERNUMPRECEEDING, CHAPTERNUMFOLLOWING, CHAPTERNUMSTYLE, LINK0PRECEEDING, LINK0FOLLOWING, LINK0STYLE, LINK1PRECEEDING, LINK1FOLLOWING, LINK1STYLE, LINK2PRECEEDING, LINK2FOLLOWING, LINK2STYLE, LINK3PRECEEDING, LINK3FOLLOWING, LINK3STYLE, LINK4PRECEEDING, LINK4FOLLOWING, LINK4STYLE, CITEKEYPRECEEDING, CITEKEYFOLLOWING, CITEKEYSTYLE from REFSTYLE where PUBTYPE='%s' and CITSTYLEID=%u", pubtype, citstyle_id); } LOG_PRINT(LOG_DEBUG, sql_command); dbi_style_res = dbi_conn_query(conn, sql_command); if (!dbi_style_res) { dbi_conn_error(conn, (const char**)&sql_command); LOG_PRINT(LOG_WARNING, "CITSTYLE select failed"); LOG_PRINT(LOG_WARNING, sql_command); free(sql_command); return NULL; } if (dbi_result_next_row(dbi_style_res) == 0) { /* there is no style for this citation type. Try the generic type instead */ dbi_result_free(dbi_style_res); if (!strcmp(my_dbi_conn_get_cap(conn, "multiple_db"), "t")) { sprintf(sql_command, "SELECT ID, QSTYLE, XSTYLE, YSTYLE, ZSTYLE, QALTERNATESTYLE, XALTERNATESTYLE, YALTERNATESTYLE, ZALTERNATESTYLE, QALTERNATETEXT, XALTERNATETEXT, YALTERNATETEXT, ZALTERNATETEXT, QABBREVIATEFIRST, XABBREVIATEFIRST, YABBREVIATEFIRST, ZABBREVIATEFIRST, QABBREVIATESUBSEQ, XABBREVIATESUBSEQ, YABBREVIATESUBSEQ, ZABBREVIATESUBSEQ, QABBREVIATEFIRSTMAXAUTHOR, XABBREVIATEFIRSTMAXAUTHOR, YABBREVIATEFIRSTMAXAUTHOR, ZABBREVIATEFIRSTMAXAUTHOR, QABBREVIATESUBSEQMAXAUTHOR, XABBREVIATESUBSEQMAXAUTHOR, YABBREVIATESUBSEQMAXAUTHOR, ZABBREVIATESUBSEQMAXAUTHOR, QABBREVIATEFIRSTDISPLAYAUTHOR, XABBREVIATEFIRSTDISPLAYAUTHOR, YABBREVIATEFIRSTDISPLAYAUTHOR, ZABBREVIATEFIRSTDISPLAYAUTHOR, QABBREVIATESUBSEQDISPLAYAUTHOR, XABBREVIATESUBSEQDISPLAYAUTHOR, YABBREVIATESUBSEQDISPLAYAUTHOR, ZABBREVIATESUBSEQDISPLAYAUTHOR, QAEMPTY, XAEMPTY, YAEMPTY, ZAEMPTY, QASAME, XASAME, YASAME, ZASAME, QPRECEEDING, XPRECEEDING, YPRECEEDING, ZPRECEEDING, QFOLLOWING, XFOLLOWING, YFOLLOWING, ZFOLLOWING, QAUTHORSEPSTWOSEPS, XAUTHORSEPSTWOSEPS, YAUTHORSEPSTWOSEPS, ZAUTHORSEPSTWOSEPS, QAUTHORSEPSTHREESEPSTHREESEPSEACH, XAUTHORSEPSTHREESEPSTHREESEPSEACH, YAUTHORSEPSTHREESEPSTHREESEPSEACH, ZAUTHORSEPSTHREESEPSTHREESEPSEACH, QAUTHORSEPSTHREESEPSTHREESEPSLAST, XAUTHORSEPSTHREESEPSTHREESEPSLAST, YAUTHORSEPSTHREESEPSTHREESEPSLAST, ZAUTHORSEPSTHREESEPSTHREESEPSLAST, QAUTHORNAMESNAMEFIRSTNAMEORDER, XAUTHORNAMESNAMEFIRSTNAMEORDER, YAUTHORNAMESNAMEFIRSTNAMEORDER, ZAUTHORNAMESNAMEFIRSTNAMEORDER, QAUTHORNAMESNAMEFIRSTINITIALSTYLE, XAUTHORNAMESNAMEFIRSTINITIALSTYLE, YAUTHORNAMESNAMEFIRSTINITIALSTYLE, ZAUTHORNAMESNAMEFIRSTINITIALSTYLE, QAUTHORNAMESNAMEFIRSTUPPERCASE, XAUTHORNAMESNAMEFIRSTUPPERCASE, YAUTHORNAMESNAMEFIRSTUPPERCASE, ZAUTHORNAMESNAMEFIRSTUPPERCASE, QAUTHORNAMESNAMEOTHERNAMEORDER, XAUTHORNAMESNAMEOTHERNAMEORDER, YAUTHORNAMESNAMEOTHERNAMEORDER, ZAUTHORNAMESNAMEOTHERNAMEORDER, QAUTHORNAMESNAMEOTHERINITIALSTYLE, XAUTHORNAMESNAMEOTHERINITIALSTYLE, YAUTHORNAMESNAMEOTHERINITIALSTYLE, ZAUTHORNAMESNAMEOTHERINITIALSTYLE, QAUTHORNAMESNAMEOTHERUPPERCASE, XAUTHORNAMESNAMEOTHERUPPERCASE, YAUTHORNAMESNAMEOTHERUPPERCASE, ZAUTHORNAMESNAMEOTHERUPPERCASE, QTEXTTEXTSINGLEPRECEEDING, XTEXTTEXTSINGLEPRECEEDING, YTEXTTEXTSINGLEPRECEEDING, ZTEXTTEXTSINGLEPRECEEDING, QTEXTTEXTSINGLEFOLLOWING, XTEXTTEXTSINGLEFOLLOWING, YTEXTTEXTSINGLEFOLLOWING, ZTEXTTEXTSINGLEFOLLOWING, QTEXTTEXTMULTIPLEPRECEEDING, XTEXTTEXTMULTIPLEPRECEEDING, YTEXTTEXTMULTIPLEPRECEEDING, ZTEXTTEXTMULTIPLEPRECEEDING, QTEXTTEXTMULTIPLEFOLLOWING, XTEXTTEXTMULTIPLEFOLLOWING, YTEXTTEXTMULTIPLEFOLLOWING, ZTEXTTEXTMULTIPLEFOLLOWING, QTEXTEDTEXTSINGLEPRECEEDING, XTEXTEDTEXTSINGLEPRECEEDING, YTEXTEDTEXTSINGLEPRECEEDING, ZTEXTEDTEXTSINGLEPRECEEDING, QTEXTEDTEXTSINGLEFOLLOWING, XTEXTEDTEXTSINGLEFOLLOWING, YTEXTEDTEXTSINGLEFOLLOWING, ZTEXTEDTEXTSINGLEFOLLOWING, QTEXTEDTEXTMULTIPLEPRECEEDING, XTEXTEDTEXTMULTIPLEPRECEEDING, YTEXTEDTEXTMULTIPLEPRECEEDING, ZTEXTEDTEXTMULTIPLEPRECEEDING, QTEXTEDTEXTMULTIPLEFOLLOWING, XTEXTEDTEXTMULTIPLEFOLLOWING, YTEXTEDTEXTMULTIPLEFOLLOWING, ZTEXTEDTEXTMULTIPLEFOLLOWING, PUBDATEPRECEEDING, PUBDATEFOLLOWING, PUBDATEFORMAT, PUBDATESEQUENCE, PUBDATEMONTHFORMAT, PUBDATEDAYFORMAT, PUBDATEYEARFORMAT, PUBDATEPADLEADINGZERO, PUBDATESTYLE, PUBDATESECPRECEEDING, PUBDATESECFOLLOWING, PUBDATESECFORMAT, PUBDATESECSEQUENCE, PUBDATESECMONTHFORMAT, PUBDATESECDAYFORMAT, PUBDATESECYEARFORMAT, PUBDATESECPADLEADINGZERO, PUBDATESECSTYLE, PUBDATEALLPRECEEDING, PUBDATEALLFOLLOWING, PUBDATEALLFORMAT, PUBDATEALLSEQUENCE, PUBDATEALLMONTHFORMAT, PUBDATEALLDAYFORMAT, PUBDATEALLYEARFORMAT, PUBDATEALLPADLEADINGZERO, PUBDATEALLSTYLE, TITLEPRECEEDING, TITLEFOLLOWING, TITLECASE, TITLESTYLE, BOOKTITLEPRECEEDING, BOOKTITLEFOLLOWING, BOOKTITLECASE, BOOKTITLESTYLE, SERIESTITLEPRECEEDING, SERIESTITLEFOLLOWING, SERIESTITLECASE, SERIESTITLESTYLE, ALLTITLEPRECEEDING, ALLTITLEFOLLOWING, ALLTITLECASE, ALLTITLESTYLE, JOURNALNAMEPRECEEDING, JOURNALNAMEFOLLOWING, JOURNALNAMECASE, JOURNALNAMEDEFAULTTEXT, JOURNALNAMEALTERNATETEXT, JOURNALNAMEPUNCTUATION, JOURNALNAMESTYLE, VOLUMEPRECEEDING, VOLUMEFOLLOWING, VOLUMESTYLE, ISSUEPRECEEDING, ISSUEFOLLOWING, ISSUESTYLE, PAGESSTYLE, PAGESSINGLEPAGEPRECEEDING, PAGESSINGLEPAGEFOLLOWING, PAGESPAGERANGEPRECEEDING, PAGESPAGERANGEFOLLOWING, PAGESPAGERANGETYPE, PUBLISHERPRECEEDING, PUBLISHERFOLLOWING, PUBLISHERSTYLE, PUBPLACEPRECEEDING, PUBPLACEFOLLOWING, PUBPLACESTYLE, PAGESPRECEEDING, PAGESFOLLOWING, REFNUMBERPRECEEDING, REFNUMBERFOLLOWING, REFNUMBERSTYLE, PUBDATEFIRSTSEP, PUBDATESECONDSEP, PUBDATESECFIRSTSEP, PUBDATESECSECONDSEP, PUBDATEALLFIRSTSEP, PUBDATEALLSECONDSEP, PAGESPAGERANGERANGESEPARATOR, SERIALPRECEEDING, SERIALFOLLOWING, SERIALSTYLE, ADDRESSPRECEEDING, ADDRESSFOLLOWING, ADDRESSSTYLE, USERDEF1PRECEEDING, USERDEF1FOLLOWING, USERDEF1STYLE, USERDEF2PRECEEDING, USERDEF2FOLLOWING, USERDEF2STYLE, USERDEF3PRECEEDING, USERDEF3FOLLOWING, USERDEF3STYLE, USERDEF4PRECEEDING, USERDEF4FOLLOWING, USERDEF4STYLE, USERDEF5PRECEEDING, USERDEF5FOLLOWING, USERDEF5STYLE, NOTESPRECEEDING, NOTESFOLLOWING, NOTESSTYLE, ABSTRACTPRECEEDING, ABSTRACTFOLLOWING, ABSTRACTSTYLE, TYPEOFWORKPRECEEDING, TYPEOFWORKFOLLOWING, TYPEOFWORKSTYLE, AREAPRECEEDING, AREAFOLLOWING, AREASTYLE, OSTYPEPRECEEDING, OSTYPEFOLLOWING, OSTYPESTYLE, DEGREEPRECEEDING, DEGREEFOLLOWING, DEGREESTYLE, RUNNINGTIMEPRECEEDING, RUNNINGTIMEFOLLOWING, RUNNINGTIMESTYLE, CLASSCODEINTLPRECEEDING, CLASSCODEINTLFOLLOWING, CLASSCODEINTLSTYLE, CLASSCODEUSPRECEEDING, CLASSCODEUSFOLLOWING, CLASSCODEUSSTYLE, SENDEREMAILPRECEEDING, SENDEREMAILFOLLOWING, SENDEREMAILSTYLE, RECIPIENTEMAILPRECEEDING, RECIPIENTEMAILFOLLOWING, RECIPIENTEMAILSTYLE, MEDIATYPEPRECEEDING, MEDIATYPEFOLLOWING, MEDIATYPESTYLE, NUMVOLUMESPRECEEDING, NUMVOLUMESFOLLOWING, NUMVOLUMESSTYLE, EDITIONPRECEEDING, EDITIONFOLLOWING, EDITIONSTYLE, COMPUTERPRECEEDING, COMPUTERFOLLOWING, COMPUTERSTYLE, CONFERENCELOCATIONPRECEEDING, CONFERENCELOCATIONFOLLOWING, CONFERENCELOCATIONSTYLE, REGISTRYNUMPRECEEDING, REGISTRYNUMFOLLOWING, REGISTRYNUMSTYLE, CLASSIFICATIONPRECEEDING, CLASSIFICATIONFOLLOWING, CLASSIFICATIONSTYLE, SECTIONPRECEEDING, SECTIONFOLLOWING, SECTIONSTYLE, PAMPHLETNUMPRECEEDING, PAMPHLETNUMFOLLOWING, PAMPHLETNUMSTYLE, CHAPTERNUMPRECEEDING, CHAPTERNUMFOLLOWING, CHAPTERNUMSTYLE, LINK0PRECEEDING, LINK0FOLLOWING, LINK0STYLE, LINK1PRECEEDING, LINK1FOLLOWING, LINK1STYLE, LINK2PRECEEDING, LINK2FOLLOWING, LINK2STYLE, LINK3PRECEEDING, LINK3FOLLOWING, LINK3STYLE, LINK4PRECEEDING, LINK4FOLLOWING, LINK4STYLE, CITEKEYPRECEEDING, CITEKEYFOLLOWING, CITEKEYSTYLE from %s.REFSTYLE where PUBTYPE='GEN' and CITSTYLEID=%u", main_db, citstyle_id); } else { sprintf(sql_command, "SELECT ID, QSTYLE, XSTYLE, YSTYLE, ZSTYLE, QALTERNATESTYLE, XALTERNATESTYLE, YALTERNATESTYLE, ZALTERNATESTYLE, QALTERNATETEXT, XALTERNATETEXT, YALTERNATETEXT, ZALTERNATETEXT, QABBREVIATEFIRST, XABBREVIATEFIRST, YABBREVIATEFIRST, ZABBREVIATEFIRST, QABBREVIATESUBSEQ, XABBREVIATESUBSEQ, YABBREVIATESUBSEQ, ZABBREVIATESUBSEQ, QABBREVIATEFIRSTMAXAUTHOR, XABBREVIATEFIRSTMAXAUTHOR, YABBREVIATEFIRSTMAXAUTHOR, ZABBREVIATEFIRSTMAXAUTHOR, QABBREVIATESUBSEQMAXAUTHOR, XABBREVIATESUBSEQMAXAUTHOR, YABBREVIATESUBSEQMAXAUTHOR, ZABBREVIATESUBSEQMAXAUTHOR, QABBREVIATEFIRSTDISPLAYAUTHOR, XABBREVIATEFIRSTDISPLAYAUTHOR, YABBREVIATEFIRSTDISPLAYAUTHOR, ZABBREVIATEFIRSTDISPLAYAUTHOR, QABBREVIATESUBSEQDISPLAYAUTHOR, XABBREVIATESUBSEQDISPLAYAUTHOR, YABBREVIATESUBSEQDISPLAYAUTHOR, ZABBREVIATESUBSEQDISPLAYAUTHOR, QAEMPTY, XAEMPTY, YAEMPTY, ZAEMPTY, QASAME, XASAME, YASAME, ZASAME, QPRECEEDING, XPRECEEDING, YPRECEEDING, ZPRECEEDING, QFOLLOWING, XFOLLOWING, YFOLLOWING, ZFOLLOWING, QAUTHORSEPSTWOSEPS, XAUTHORSEPSTWOSEPS, YAUTHORSEPSTWOSEPS, ZAUTHORSEPSTWOSEPS, QAUTHORSEPSTHREESEPSTHREESEPSEACH, XAUTHORSEPSTHREESEPSTHREESEPSEACH, YAUTHORSEPSTHREESEPSTHREESEPSEACH, ZAUTHORSEPSTHREESEPSTHREESEPSEACH, QAUTHORSEPSTHREESEPSTHREESEPSLAST, XAUTHORSEPSTHREESEPSTHREESEPSLAST, YAUTHORSEPSTHREESEPSTHREESEPSLAST, ZAUTHORSEPSTHREESEPSTHREESEPSLAST, QAUTHORNAMESNAMEFIRSTNAMEORDER, XAUTHORNAMESNAMEFIRSTNAMEORDER, YAUTHORNAMESNAMEFIRSTNAMEORDER, ZAUTHORNAMESNAMEFIRSTNAMEORDER, QAUTHORNAMESNAMEFIRSTINITIALSTYLE, XAUTHORNAMESNAMEFIRSTINITIALSTYLE, YAUTHORNAMESNAMEFIRSTINITIALSTYLE, ZAUTHORNAMESNAMEFIRSTINITIALSTYLE, QAUTHORNAMESNAMEFIRSTUPPERCASE, XAUTHORNAMESNAMEFIRSTUPPERCASE, YAUTHORNAMESNAMEFIRSTUPPERCASE, ZAUTHORNAMESNAMEFIRSTUPPERCASE, QAUTHORNAMESNAMEOTHERNAMEORDER, XAUTHORNAMESNAMEOTHERNAMEORDER, YAUTHORNAMESNAMEOTHERNAMEORDER, ZAUTHORNAMESNAMEOTHERNAMEORDER, QAUTHORNAMESNAMEOTHERINITIALSTYLE, XAUTHORNAMESNAMEOTHERINITIALSTYLE, YAUTHORNAMESNAMEOTHERINITIALSTYLE, ZAUTHORNAMESNAMEOTHERINITIALSTYLE, QAUTHORNAMESNAMEOTHERUPPERCASE, XAUTHORNAMESNAMEOTHERUPPERCASE, YAUTHORNAMESNAMEOTHERUPPERCASE, ZAUTHORNAMESNAMEOTHERUPPERCASE, QTEXTTEXTSINGLEPRECEEDING, XTEXTTEXTSINGLEPRECEEDING, YTEXTTEXTSINGLEPRECEEDING, ZTEXTTEXTSINGLEPRECEEDING, QTEXTTEXTSINGLEFOLLOWING, XTEXTTEXTSINGLEFOLLOWING, YTEXTTEXTSINGLEFOLLOWING, ZTEXTTEXTSINGLEFOLLOWING, QTEXTTEXTMULTIPLEPRECEEDING, XTEXTTEXTMULTIPLEPRECEEDING, YTEXTTEXTMULTIPLEPRECEEDING, ZTEXTTEXTMULTIPLEPRECEEDING, QTEXTTEXTMULTIPLEFOLLOWING, XTEXTTEXTMULTIPLEFOLLOWING, YTEXTTEXTMULTIPLEFOLLOWING, ZTEXTTEXTMULTIPLEFOLLOWING, QTEXTEDTEXTSINGLEPRECEEDING, XTEXTEDTEXTSINGLEPRECEEDING, YTEXTEDTEXTSINGLEPRECEEDING, ZTEXTEDTEXTSINGLEPRECEEDING, QTEXTEDTEXTSINGLEFOLLOWING, XTEXTEDTEXTSINGLEFOLLOWING, YTEXTEDTEXTSINGLEFOLLOWING, ZTEXTEDTEXTSINGLEFOLLOWING, QTEXTEDTEXTMULTIPLEPRECEEDING, XTEXTEDTEXTMULTIPLEPRECEEDING, YTEXTEDTEXTMULTIPLEPRECEEDING, ZTEXTEDTEXTMULTIPLEPRECEEDING, QTEXTEDTEXTMULTIPLEFOLLOWING, XTEXTEDTEXTMULTIPLEFOLLOWING, YTEXTEDTEXTMULTIPLEFOLLOWING, ZTEXTEDTEXTMULTIPLEFOLLOWING, PUBDATEPRECEEDING, PUBDATEFOLLOWING, PUBDATEFORMAT, PUBDATESEQUENCE, PUBDATEMONTHFORMAT, PUBDATEDAYFORMAT, PUBDATEYEARFORMAT, PUBDATEPADLEADINGZERO, PUBDATESTYLE, PUBDATESECPRECEEDING, PUBDATESECFOLLOWING, PUBDATESECFORMAT, PUBDATESECSEQUENCE, PUBDATESECMONTHFORMAT, PUBDATESECDAYFORMAT, PUBDATESECYEARFORMAT, PUBDATESECPADLEADINGZERO, PUBDATESECSTYLE, PUBDATEALLPRECEEDING, PUBDATEALLFOLLOWING, PUBDATEALLFORMAT, PUBDATEALLSEQUENCE, PUBDATEALLMONTHFORMAT, PUBDATEALLDAYFORMAT, PUBDATEALLYEARFORMAT, PUBDATEALLPADLEADINGZERO, PUBDATEALLSTYLE, TITLEPRECEEDING, TITLEFOLLOWING, TITLECASE, TITLESTYLE, BOOKTITLEPRECEEDING, BOOKTITLEFOLLOWING, BOOKTITLECASE, BOOKTITLESTYLE, SERIESTITLEPRECEEDING, SERIESTITLEFOLLOWING, SERIESTITLECASE, SERIESTITLESTYLE, ALLTITLEPRECEEDING, ALLTITLEFOLLOWING, ALLTITLECASE, ALLTITLESTYLE, JOURNALNAMEPRECEEDING, JOURNALNAMEFOLLOWING, JOURNALNAMECASE, JOURNALNAMEDEFAULTTEXT, JOURNALNAMEALTERNATETEXT, JOURNALNAMEPUNCTUATION, JOURNALNAMESTYLE, VOLUMEPRECEEDING, VOLUMEFOLLOWING, VOLUMESTYLE, ISSUEPRECEEDING, ISSUEFOLLOWING, ISSUESTYLE, PAGESSTYLE, PAGESSINGLEPAGEPRECEEDING, PAGESSINGLEPAGEFOLLOWING, PAGESPAGERANGEPRECEEDING, PAGESPAGERANGEFOLLOWING, PAGESPAGERANGETYPE, PUBLISHERPRECEEDING, PUBLISHERFOLLOWING, PUBLISHERSTYLE, PUBPLACEPRECEEDING, PUBPLACEFOLLOWING, PUBPLACESTYLE, PAGESPRECEEDING, PAGESFOLLOWING, REFNUMBERPRECEEDING, REFNUMBERFOLLOWING, REFNUMBERSTYLE, PUBDATEFIRSTSEP, PUBDATESECONDSEP, PUBDATESECFIRSTSEP, PUBDATESECSECONDSEP, PUBDATEALLFIRSTSEP, PUBDATEALLSECONDSEP, PAGESPAGERANGERANGESEPARATOR, SERIALPRECEEDING, SERIALFOLLOWING, SERIALSTYLE, ADDRESSPRECEEDING, ADDRESSFOLLOWING, ADDRESSSTYLE, USERDEF1PRECEEDING, USERDEF1FOLLOWING, USERDEF1STYLE, USERDEF2PRECEEDING, USERDEF2FOLLOWING, USERDEF2STYLE, USERDEF3PRECEEDING, USERDEF3FOLLOWING, USERDEF3STYLE, USERDEF4PRECEEDING, USERDEF4FOLLOWING, USERDEF4STYLE, USERDEF5PRECEEDING, USERDEF5FOLLOWING, USERDEF5STYLE, NOTESPRECEEDING, NOTESFOLLOWING, NOTESSTYLE, ABSTRACTPRECEEDING, ABSTRACTFOLLOWING, ABSTRACTSTYLE, TYPEOFWORKPRECEEDING, TYPEOFWORKFOLLOWING, TYPEOFWORKSTYLE, AREAPRECEEDING, AREAFOLLOWING, AREASTYLE, OSTYPEPRECEEDING, OSTYPEFOLLOWING, OSTYPESTYLE, DEGREEPRECEEDING, DEGREEFOLLOWING, DEGREESTYLE, RUNNINGTIMEPRECEEDING, RUNNINGTIMEFOLLOWING, RUNNINGTIMESTYLE, CLASSCODEINTLPRECEEDING, CLASSCODEINTLFOLLOWING, CLASSCODEINTLSTYLE, CLASSCODEUSPRECEEDING, CLASSCODEUSFOLLOWING, CLASSCODEUSSTYLE, SENDEREMAILPRECEEDING, SENDEREMAILFOLLOWING, SENDEREMAILSTYLE, RECIPIENTEMAILPRECEEDING, RECIPIENTEMAILFOLLOWING, RECIPIENTEMAILSTYLE, MEDIATYPEPRECEEDING, MEDIATYPEFOLLOWING, MEDIATYPESTYLE, NUMVOLUMESPRECEEDING, NUMVOLUMESFOLLOWING, NUMVOLUMESSTYLE, EDITIONPRECEEDING, EDITIONFOLLOWING, EDITIONSTYLE, COMPUTERPRECEEDING, COMPUTERFOLLOWING, COMPUTERSTYLE, CONFERENCELOCATIONPRECEEDING, CONFERENCELOCATIONFOLLOWING, CONFERENCELOCATIONSTYLE, REGISTRYNUMPRECEEDING, REGISTRYNUMFOLLOWING, REGISTRYNUMSTYLE, CLASSIFICATIONPRECEEDING, CLASSIFICATIONFOLLOWING, CLASSIFICATIONSTYLE, SECTIONPRECEEDING, SECTIONFOLLOWING, SECTIONSTYLE, PAMPHLETNUMPRECEEDING, PAMPHLETNUMFOLLOWING, PAMPHLETNUMSTYLE, CHAPTERNUMPRECEEDING, CHAPTERNUMFOLLOWING, CHAPTERNUMSTYLE, LINK0PRECEEDING, LINK0FOLLOWING, LINK0STYLE, LINK1PRECEEDING, LINK1FOLLOWING, LINK1STYLE, LINK2PRECEEDING, LINK2FOLLOWING, LINK2STYLE, LINK3PRECEEDING, LINK3FOLLOWING, LINK3STYLE, LINK4PRECEEDING, LINK4FOLLOWING, LINK4STYLE, CITEKEYPRECEEDING, CITEKEYFOLLOWING, CITEKEYSTYLE from REFSTYLE where PUBTYPE='GEN' and CITSTYLEID=%u", citstyle_id); } LOG_PRINT(LOG_DEBUG, sql_command); dbi_style_res = dbi_conn_query(conn, sql_command); if (!dbi_style_res) { LOG_PRINT(LOG_WARNING, "CITSTYLE select failed"); free(sql_command); return NULL; } if (dbi_result_next_row(dbi_style_res) == 0) { LOG_PRINT(LOG_WARNING, "no CITSTYLE found"); dbi_result_free(dbi_style_res); dbi_style_res = NULL; free(sql_command); return NULL; } } return dbi_style_res; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ unload_style(): frees the memory used by load_style(). If no memory was allocated previously this function will do nothing instead of crash void unload_style has no return value ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ void unload_style(void) { if (dbi_style_res != NULL) { dbi_result_free(dbi_style_res); dbi_style_res = NULL; } } refdb-1.0.2/src/backend-scrn.c000755 001750 001750 00000114476 12255427651 016760 0ustar00markusmarkus000000 000000 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ backend-scrn.c defines the screen output backend of refdbd markus@mhoenicka.de 6-20-00 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ #include #include /* for definitions of log message priorities */ #include #include "refdb.h" #include "linklist.h" #include "refdbd.h" #include "backend.h" #include "backend-scrn.h" #include "writenote.h" #include "strfncs.h" #include "dbfncs.h" #include "connect.h" #ifndef HAVE_ATOLL long long atoll(const char *str); #endif /* some globals */ extern int n_log_level; /* numeric version of log_level */ /* forward declaration of local functions */ static char* print_field_scrn(const char* item, struct renderinfo* ptr_rendinfo, const char* start_string); static int add_partdata_scrn(char** ptr_buffer, size_t* ptr_buffer_len, struct renderinfo* ptr_rendinfo); static int add_setdata_scrn(char** ptr_buffer, size_t* ptr_buffer_len, struct renderinfo* ptr_rendinfo); /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ prepare_render_scrn(): writes a header for the screen output of a query int prepare_render_scrn returns 0 if successful, >0 if failed struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int prepare_render_scrn(struct renderinfo* ptr_rendinfo) { /* we just make sure that we start with a clean string */ (*(ptr_rendinfo->ptr_ref))[0] = '\0'; return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ finish_render_scrn(): writes a footer for the screen output of a query int finish_render_scrn returns 0 if successful, >0 if failed struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int finish_render_scrn(struct renderinfo* ptr_rendinfo) { /* nothing to do here */ return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ render_scrn() renders a RIS dataset for screen display int render_scrn returns 0 if successful, >0 if failed struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int render_scrn(struct renderinfo* ptr_rendinfo) { int errcode; /* receives error code for periodical requests */ int nhave_booktitle = 0; int render_res; int retval = 0; size_t buffer_len = 4096; char have_author = 0; char have_editor = 0; char id[32] = ""; char avail_type[6]; char date_buffer[256]; char* item; char* new_ref; char* buffer; const char* citem; const char* type; struct REPRINT reprint; struct AUTHOR_INFO ainfo; dbi_result dbires; dbi_result orig_dbires; dbi_conn conn; if ((buffer = malloc(buffer_len)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); retval = 801; goto cleanup; } *buffer = '\0'; if ((type = get_refdb_type(ptr_rendinfo->dbires)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(234)); retval = 234; goto cleanup; } conn = dbi_result_get_conn(ptr_rendinfo->dbires); /*----------------------------------------------------------------*/ /* ID */ get_refdb_id(ptr_rendinfo->dbires, id); if (is_in_list(ptr_rendinfo->dbires, ptr_rendinfo->username) == 1) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "ID*:", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); retval = 801; goto cleanup; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } else { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "ID:", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); retval = 801; goto cleanup; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } if (*id) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), id, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); retval = 801; goto cleanup; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } else { /* reference has no ID */ LOG_PRINT(LOG_WARNING, get_status_msg(234)); retval = 234; /* this is bad and will hopefully never happen */ goto cleanup; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "\n", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); retval = 801; goto cleanup; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } /*----------------------------------------------------------------*/ /* citation key */ citem = get_refdb_citekey(ptr_rendinfo->dbires); if (citem && *citem) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "Key: ", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); retval = 801; goto cleanup; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), (char*)citem, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); retval = 801; goto cleanup; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "\n", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); retval = 801; goto cleanup; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } /*----------------------------------------------------------------*/ /* the part apparatus (analytic) */ if (has_part_data(type)) { if ((retval = add_partdata_scrn(&buffer, &buffer_len, ptr_rendinfo)) != 0) { goto cleanup; } else { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), buffer, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); retval = 801; goto cleanup; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } *buffer = '\0'; } /*----------------------------------------------------------------*/ /* the publication apparatus (monographic) */ if (has_chapter_data(type)) { /* use a verbal separator to start the monographic data */ if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "in: ", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } /*----------------------------------------------------------------*/ /* authors */ /* request authors */ dbires = request_authors(conn, 2 /* publication */, NULL /* all roles */, NULL, 0, my_dbi_result_get_idval(ptr_rendinfo->dbires, "refdb_id")); if (dbires == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(234)); return 234; } /* fetch all authors */ while (get_author_parts(dbires, &ainfo) != NULL) { char role[70] = ""; /* role is 64, and then some */ have_author++; if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), ainfo.name, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { clean_request(dbires); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } /* printf("role went to %s<<\n", ainfo.role); */ if (have_author > 1 && *(ainfo.role) && strcmp(ainfo.role, "author")) { /* sprintf(role, "(%s)", ainfo.role); */ /* if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), role, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { */ /* clean_request(dbires); */ /* LOG_PRINT(LOG_CRIT, get_status_msg(801)); */ /* return 801; */ /* } */ /* else { */ /* *(ptr_rendinfo->ptr_ref) = new_ref; */ /* } */ } else if (strcmp(ainfo.role, "author")){ have_editor++; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), ", ", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { clean_request(dbires); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } clean_request(dbires); if (have_editor) { if (have_editor == 1) { new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "(ed.)\n", ptr_rendinfo->ptr_ref_len, 2); } else { new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "(eds.)\n", ptr_rendinfo->ptr_ref_len, 2); } if (new_ref == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } else { if (!has_chapter_data(type) && !has_periodical_data(type)) { if (have_author) { /* eliminate the trailing comma after the last author */ new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "\n", ptr_rendinfo->ptr_ref_len, 2); } else { new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "\n", ptr_rendinfo->ptr_ref_len, 0); } if (new_ref == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } } if (has_periodical_data(type)) { /*----------------------------------------------------------------*/ /* periodical */ citem = get_periodical(dbi_result_get_conn(ptr_rendinfo->dbires), date_buffer, NULL, 4, &errcode, 0, my_dbi_result_get_idval(ptr_rendinfo->dbires, "refdb_id"), NULL /* no frequency required */); if (citem == NULL && errcode != 1) { return 234; } else if (!errcode) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), (char*)citem, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), " ", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } /*----------------------------------------------------------------*/ /* book title */ item = get_refdb_booktitle_copy(ptr_rendinfo->dbires); if (item != NULL) { nhave_booktitle++; if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), (char*)item, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { /* book title */ free(item); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } free(item); /* insert a space to separate the title from the volume/issue info */ if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), " ", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { free(item); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } /*----------------------------------------------------------------*/ /* edition */ citem = get_refdb_edition(ptr_rendinfo->dbires); if (citem != NULL) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "(", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), (char*)citem, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { /* edition */ LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), ".ed)", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } /*----------------------------------------------------------------*/ /* volume */ citem = get_refdb_volume(ptr_rendinfo->dbires); if (citem != NULL) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), (char*)citem, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { /* volume */ LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } /*----------------------------------------------------------------*/ /* issue */ citem = get_refdb_issue(ptr_rendinfo->dbires); if (citem != NULL) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "(", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), (char*)citem, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { /* issue */ LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), ")", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } /*----------------------------------------------------------------*/ /* startpage */ citem = get_refdb_startpage(ptr_rendinfo->dbires); if (citem != NULL) { if (strcmp(type, "BOOK") == 0 || strcmp(type, "SER") == 0 || strcmp(type, "THES") == 0 || strcmp(type, "RPRT") == 0 || strcmp(type, "CHAP") == 0) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "pp. ", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } else { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), ":", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), (char*)citem, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { /* start page */ LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } /*----------------------------------------------------------------*/ /* endpage */ citem = get_refdb_endpage(ptr_rendinfo->dbires); if (citem != NULL) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "-", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), (char*)citem, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { /* end page */ LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } /*----------------------------------------------------------------*/ /* pubyear */ if (get_refdb_pubyear(ptr_rendinfo->dbires, date_buffer) != NULL) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), " (", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } /* year */ if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), date_buffer, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), ")", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } /*----------------------------------------------------------------*/ /* set data */ if (has_set_data(type)) { if ((retval = add_setdata_scrn(&buffer, &buffer_len, ptr_rendinfo)) != 0) { goto cleanup; } else if (*buffer) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), ", part of: ", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); retval = 801; goto cleanup; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), buffer, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); retval = 801; goto cleanup; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } *buffer = '\0'; } /*----------------------------------------------------------------*/ /* abstract */ if (strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "N2") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "AB") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "ALL") != NULL) { if ((item = get_refdb_abstract_copy(ptr_rendinfo->dbires)) != NULL) { if (print_field_scrn(item, ptr_rendinfo, "\nABSTRACT: ") == NULL) { free(item); return 801; } free(item); } } /*----------------------------------------------------------------*/ /* address */ if (strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "AD") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "ALL") != NULL) { if ((item = get_refdb_address_copy(ptr_rendinfo->dbires)) != NULL) { if (print_field_scrn(item, ptr_rendinfo, "\nADDRESS: ") == NULL) { free(item); return 801; } free(item); } } /*----------------------------------------------------------------*/ /* reprint, availability */ if (strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "RP") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "ALL") != NULL) { if (get_reprint(ptr_rendinfo->dbires, &reprint, ptr_rendinfo->username, 4) != NULL &&reprint.reprint != NULL && *(reprint.reprint)) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "\nREPRINT: ", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), reprint.reprint, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if (reprint.date != NULL && *(reprint.date)) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), " (", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), reprint.date, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), ")", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } } if (reprint.avail != NULL && *(reprint.avail)) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), ": ", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } /* copy the relevant part of reprint.avail so we can safely uppercase it */ strncpy(avail_type, reprint.avail, 5); avail_type[5] = '\0'; if (strncmp(strup(avail_type), "PATH:", 5) == 0) { if (*(ptr_rendinfo->pdfroot)) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), ptr_rendinfo->pdfroot, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), reprint.avail+5, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } else { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), reprint.avail, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } } } /*----------------------------------------------------------------*/ /* ISBN/ISSN */ if (strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "SN") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "ALL") != NULL) { citem = get_refdb_issn(ptr_rendinfo->dbires); if (print_field_scrn(citem, ptr_rendinfo, "\nISSN: ") == NULL) { return 801; } } /*----------------------------------------------------------------*/ /* URL, L1 through L4, DOI */ if (strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "UR") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "LX") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "DOI") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "ALL") != NULL) { int i; char link_tag[12]; /* loop over all link types */ for (i=0; i<6;i++) { if (!i) { strcpy(link_tag, "\nURL: "); } else if (i == 1) { strcpy(link_tag, "\nPDF: "); } else if (i == 2) { strcpy(link_tag, "\nFULLTEXT: "); } else if (i == 3) { strcpy(link_tag, "\nRELATED: "); } else if (i == 4) { strcpy(link_tag, "\nIMAGE: "); } else if (i == 5) { strcpy(link_tag, "\nDOI: "); } dbires = request_ulinks(conn, my_dbi_result_get_idval(ptr_rendinfo->dbires, "refdb_id"), 0 /* ref entry */, i /* link type */, 0 /* is_temp */, ptr_rendinfo->username); if (dbires == NULL) { return 234; } while ((citem = get_ulink(dbires)) != NULL) { char* full_link; if (i>0 && i<5) { full_link = add_root_to_link(citem, ptr_rendinfo->pdfroot); } else { full_link = strdup(citem); } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), link_tag, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); clean_request(dbires); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), full_link, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); clean_request(dbires); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } free(full_link); } /* end while */ clean_request(dbires); } /* end for */ } /*----------------------------------------------------------------*/ /* publisher */ if (strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "PB") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "ALL") != NULL) { citem = get_refdb_publisher(ptr_rendinfo->dbires); if (print_field_scrn(citem, ptr_rendinfo, "\nPUBLISHER: ") == NULL) { return 801; } } /*----------------------------------------------------------------*/ /* city */ if (strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "CY") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "ALL") != NULL) { citem = get_refdb_city(ptr_rendinfo->dbires); if (print_field_scrn(citem, ptr_rendinfo, "\nCITY: ") == NULL) { return 801; } } /*----------------------------------------------------------------*/ /* user fields */ if (strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "U1") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "ALL") != NULL) { citem = get_refdb_user1(ptr_rendinfo->dbires); if (print_field_scrn(citem, ptr_rendinfo, "\nUSER1: ") == NULL) { return 801; } } if (strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "U2") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "ALL") != NULL) { citem = get_refdb_user2(ptr_rendinfo->dbires); if (print_field_scrn(citem, ptr_rendinfo, "\nUSER2: ") == NULL) { return 801; } } if (strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "U3") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "ALL") != NULL) { citem = get_refdb_user3(ptr_rendinfo->dbires); if (print_field_scrn(citem, ptr_rendinfo, "\nUSER3: ") == NULL) { return 801; } } if (strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "U4") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "ALL") != NULL) { citem = get_refdb_user4(ptr_rendinfo->dbires); if (print_field_scrn(citem, ptr_rendinfo, "\nUSER4: ") == NULL) { return 801; } } if (strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "U5") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "ALL") != NULL) { citem = get_refdb_user5(ptr_rendinfo->dbires); if (print_field_scrn(citem, ptr_rendinfo, "\nUSER5: ") == NULL) { return 801; } } /*----------------------------------------------------------------*/ /* misc fields */ if (strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "MX") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "ALL") != NULL) { citem = get_refdb_typeofwork(ptr_rendinfo->dbires); if (print_field_scrn(citem, ptr_rendinfo, "\nTYPE OF WORK: ") == NULL) { return 801; } citem = get_refdb_area(ptr_rendinfo->dbires); if (print_field_scrn(citem, ptr_rendinfo, "\nAREA: ") == NULL) { return 801; } citem = get_refdb_ostype(ptr_rendinfo->dbires); if (print_field_scrn(citem, ptr_rendinfo, "\nOS TYPE: ") == NULL) { return 801; } citem = get_refdb_degree(ptr_rendinfo->dbires); if (print_field_scrn(citem, ptr_rendinfo, "\nDEGREE: ") == NULL) { return 801; } citem = get_refdb_runningtime(ptr_rendinfo->dbires); if (print_field_scrn(citem, ptr_rendinfo, "\nRUNNING TIME: ") == NULL) { return 801; } citem = get_refdb_classcodeintl(ptr_rendinfo->dbires); if (print_field_scrn(citem, ptr_rendinfo, "\nCLASSCODE (INTL): ") == NULL) { return 801; } citem = get_refdb_classcodeus(ptr_rendinfo->dbires); if (print_field_scrn(citem, ptr_rendinfo, "\nCLASSCODE (US): ") == NULL) { return 801; } citem = get_refdb_senderemail(ptr_rendinfo->dbires); if (print_field_scrn(citem, ptr_rendinfo, "\nEMAIL (SENDER): ") == NULL) { return 801; } citem = get_refdb_recipientemail(ptr_rendinfo->dbires); if (print_field_scrn(citem, ptr_rendinfo, "\nEMAIL (RECIPIENT): ") == NULL) { return 801; } citem = get_refdb_mediatype(ptr_rendinfo->dbires); if (print_field_scrn(citem, ptr_rendinfo, "\nMEDIA TYPE: ") == NULL) { return 801; } citem = get_refdb_numvolumes(ptr_rendinfo->dbires); if (print_field_scrn(citem, ptr_rendinfo, "\nNUMBER OF VOLUMES: ") == NULL) { return 801; } citem = get_refdb_computer(ptr_rendinfo->dbires); if (print_field_scrn(citem, ptr_rendinfo, "\nCOMPUTER: ") == NULL) { return 801; } citem = get_refdb_conferencelocation(ptr_rendinfo->dbires); if (print_field_scrn(citem, ptr_rendinfo, "\nCONFERENCE LOCATION: ") == NULL) { return 801; } citem = get_refdb_registrynum(ptr_rendinfo->dbires); if (print_field_scrn(citem, ptr_rendinfo, "\nREGISTRY NUMBER: ") == NULL) { return 801; } citem = get_refdb_classification(ptr_rendinfo->dbires); if (print_field_scrn(citem, ptr_rendinfo, "\nCLASSIFICATION: ") == NULL) { return 801; } citem = get_refdb_section(ptr_rendinfo->dbires); if (print_field_scrn(citem, ptr_rendinfo, "\nSECTION: ") == NULL) { return 801; } citem = get_refdb_pamphletnum(ptr_rendinfo->dbires); if (print_field_scrn(citem, ptr_rendinfo, "\nPAMPHLET NUMBER: ") == NULL) { return 801; } citem = get_refdb_chapternum(ptr_rendinfo->dbires); if (print_field_scrn(citem, ptr_rendinfo, "\nCHAPTER NUMBER: ") == NULL) { return 801; } } /*----------------------------------------------------------------*/ /* the notes */ /* first the note which is attached to the reference */ if (strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "N1") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "ALL") != NULL) { if ((item = get_notes_copy(ptr_rendinfo->dbires, ptr_rendinfo->username)) != NULL) { if (print_field_scrn(item, ptr_rendinfo, "\nNOTES: ") == NULL) { free(item); return 801; } free(item); } } /* then look for additional notes linked with the record, keywords, authors, or periodicals */ if (strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "NX") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "ALL") != NULL) { /* see whether to include reference lists */ if (strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "NL") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "ALL") != NULL) { if ((dbires = request_notes_by_ref(dbi_result_get_conn(ptr_rendinfo->dbires), atoll(id), REFERENCE|KEYWORD|AUTHOR|PERIODICAL, ptr_rendinfo->username, (ptr_rendinfo->ptr_clrequest)->share_default, 1/* include lists */)) == NULL) { /* printf("request_notes_by_ref() failed\n"); */ free_request_notes_by_ref(dbi_result_get_conn(ptr_rendinfo->dbires)); return 234; } } else { if ((dbires = request_notes_by_ref(dbi_result_get_conn(ptr_rendinfo->dbires), atoll(id), REFERENCE|KEYWORD|AUTHOR|PERIODICAL, ptr_rendinfo->username, (ptr_rendinfo->ptr_clrequest)->share_default, 0/* exclude lists */)) == NULL) { /* printf("request_notes_by_ref() failed\n"); */ free_request_notes_by_ref(dbi_result_get_conn(ptr_rendinfo->dbires)); return 234; } } /* save original query result. This is legal as dbi_result is a pointer in disguise */ orig_dbires = ptr_rendinfo->dbires; ptr_rendinfo->dbires = dbires; while (dbi_result_next_row(ptr_rendinfo->dbires) != 0) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "\nXNOTE:\n", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free_request_notes_by_ref(dbi_result_get_conn(ptr_rendinfo->dbires)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((render_res = render_note(ptr_rendinfo)) != 0) { ptr_rendinfo->dbires = orig_dbires; clean_request(dbires); free_request_notes_by_ref(dbi_result_get_conn(ptr_rendinfo->dbires)); return render_res; } } clean_request(dbires); free_request_notes_by_ref(dbi_result_get_conn(orig_dbires)); ptr_rendinfo->dbires = orig_dbires; } /* finish with an empty line */ if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "\n\n", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } cleanup: free(buffer); return retval; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ add_partdata_scrn(): writes part data into a buffer static int add_partdata_scrn returns 0 if ok or an error code > 0 char** ptr_buffer ptr to a buffer that will receive the output. The buffer will be reallocated as needed size_t* ptr_buffer_len ptr to the length of buffer. Will be updated if buffer is reallocated struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered dbi_conn conn connection to the database ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int add_partdata_scrn(char** ptr_buffer, size_t* ptr_buffer_len, struct renderinfo* ptr_rendinfo) { int n_have_author = 0; char* item; char* new_buffer; const char* citem; dbi_conn conn; dbi_result dbires; conn = dbi_result_get_conn(ptr_rendinfo->dbires); /*----------------------------------------------------------------*/ /* authors */ /* request authors */ dbires = request_authors(conn, 1, NULL /* all roles */, NULL, 0, my_dbi_result_get_idval(ptr_rendinfo->dbires, "refdb_id")); if (dbires == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(234)); return 234; } /* fetch all authors */ while ((citem = get_author(dbires)) != NULL) { n_have_author = 1; if ((new_buffer = mstrcat(*ptr_buffer, (char*)citem, ptr_buffer_len, 0)) == NULL) { clean_request(dbires); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *ptr_buffer = new_buffer; } if ((new_buffer = mstrcat(*ptr_buffer, ", ", ptr_buffer_len, 0)) == NULL) { clean_request(dbires); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *ptr_buffer = new_buffer; } } clean_request(dbires); if (n_have_author) { /* eliminate the trailing comma after the last author */ new_buffer = mstrcat(*ptr_buffer, "\n", ptr_buffer_len, 2); } else { new_buffer = mstrcat(*ptr_buffer, "\n", ptr_buffer_len, 0); } if (new_buffer == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *ptr_buffer = new_buffer; } /*----------------------------------------------------------------*/ /* title */ item = get_refdb_title_copy(ptr_rendinfo->dbires); if (item != NULL) { if ((new_buffer = mstrcat(*ptr_buffer, item, ptr_buffer_len, 0)) == NULL) { /* title */ LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(item); return 801; } else { *ptr_buffer = new_buffer; } free(item); if ((new_buffer = mstrcat(*ptr_buffer, "\n", ptr_buffer_len, 0)) == NULL) { free(item); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *ptr_buffer = new_buffer; } } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ add_setdata_scrn(): writes set data into a buffer static int add_setdata_scrn returns 0 if ok or an error code > 0 char** ptr_buffer ptr to a buffer that will receive the output. The buffer will be reallocated as needed size_t* ptr_buffer_len ptr to the length of buffer. Will be updated if buffer is reallocated struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered dbi_conn conn connection to the database ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int add_setdata_scrn(char** ptr_buffer, size_t* ptr_buffer_len, struct renderinfo* ptr_rendinfo) { int n_have_author = 0; char* item; char* new_buffer; const char* citem; dbi_conn conn; dbi_result dbires; conn = dbi_result_get_conn(ptr_rendinfo->dbires); /*----------------------------------------------------------------*/ /* authors */ /* request authors */ dbires = request_authors(conn, 3 /* set editors */, NULL /* all roles */, NULL, 0, my_dbi_result_get_idval(ptr_rendinfo->dbires, "refdb_id")); if (dbires == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(234)); return 234; } /* fetch all authors */ while ((citem = get_author(dbires)) != NULL) { n_have_author++; if ((new_buffer = mstrcat(*ptr_buffer, (char*)citem, ptr_buffer_len, 0)) == NULL) { clean_request(dbires); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *ptr_buffer = new_buffer; } if ((new_buffer = mstrcat(*ptr_buffer, ", ", ptr_buffer_len, 0)) == NULL) { clean_request(dbires); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *ptr_buffer = new_buffer; } } clean_request(dbires); if (n_have_author) { /* eliminate the trailing comma after the last author */ if (n_have_author == 1) { new_buffer = mstrcat(*ptr_buffer, "(ed.): ", ptr_buffer_len, 2); } else { new_buffer = mstrcat(*ptr_buffer, "(eds.): ", ptr_buffer_len, 2); } if (new_buffer == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *ptr_buffer = new_buffer; } } /*----------------------------------------------------------------*/ /* title */ item = get_refdb_title_series_copy(ptr_rendinfo->dbires); if (item != NULL) { if ((new_buffer = mstrcat(*ptr_buffer, item, ptr_buffer_len, 0)) == NULL) { /* title */ LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(item); return 801; } else { *ptr_buffer = new_buffer; } free(item); if ((new_buffer = mstrcat(*ptr_buffer, "\n", ptr_buffer_len, 0)) == NULL) { free(item); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *ptr_buffer = new_buffer; } } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ print_field_scrn(): writes simple field contents to HTML output static char* print_field_scrn returns a ptr to the modified string. Due to reallocation this may be different from the ptr passed to this function in the ptr_rendinfo structure which is also updated accordingly const char* item ptr to the contents of the field to write struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered const char* start_string ptr to a string to be printed before the field contents ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static char* print_field_scrn(const char* item, struct renderinfo* ptr_rendinfo, const char* start_string) { char* new_ref; if (item != NULL) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), (char*)start_string, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), (char*)item, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } return *(ptr_rendinfo->ptr_ref); } refdb-1.0.2/src/backend-ris.c000755 001750 001750 00000066627 12255427651 016614 0ustar00markusmarkus000000 000000 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ backend-ris.c defines the RIS output backend of refdbd markus@mhoenicka.de 6-21-00 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ #include #include /* for definitions of log message priorities */ #include #include #include "refdb.h" #include "linklist.h" #include "backend.h" #include "backend-ris.h" #include "strfncs.h" #include "refdbd.h" #include "cgi.h" #include "dbfncs.h" #include "connect.h" extern char refdblib[]; /* location of shareable files */ extern int n_log_level; /* numeric version of log_level */ /* forward declaration of local functions */ char* print_field_ris(const char* item, struct renderinfo* ptr_rendinfo, const char* start_string); /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ prepare_render_ris(): writes a header for the ris output of a query int prepare_render_ris returns 0 if successful, > 0 if failed struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int prepare_render_ris(struct renderinfo* ptr_rendinfo) { /* we just make sure that we start with a clean string */ (*(ptr_rendinfo->ptr_ref))[0] = '\0'; return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ finish_render_ris(): writes a footer for the ris output of a query int finish_render_ris returns 0 if successful, > 0 if failed struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int finish_render_ris(struct renderinfo* ptr_rendinfo) { int n_cgi; char* new_ref; char* html_foot; n_cgi = (ptr_rendinfo->ref_format == 7) ? 1:0; if (n_cgi) { html_foot = load_html("refdbq_foot", refdblib); if (!html_foot) { LOG_PRINT(LOG_WARNING, get_status_msg(802)); return 802; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), html_foot, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { free(html_foot); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } free(html_foot); } /* else: nothing to do */ return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ render_ris() renders a RIS dataset for RIS export int render_ris returns 0 if successful,> 0 if failed struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int render_ris(struct renderinfo* ptr_rendinfo) { int i; int n_cgi; int errcode; /* receives error code for periodical requests */ char have_pubyear = 0; const char* item; const char* type; char id[32] = ""; char* new_ref; char date_buffer[256]; struct REPRINT reprint; dbi_result dbires; dbi_conn conn; conn = dbi_result_get_conn(ptr_rendinfo->dbires); n_cgi = (ptr_rendinfo->ref_format == 7) ? 1:0; if (get_refdb_id(ptr_rendinfo->dbires, id) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(234)); return 234; } if (n_cgi) { /* misuse date_buffer */ sprintf(date_buffer, "
", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ print_field_ris(): writes simple field contents to HTML output char* print_field_ris returns a ptr to the modified string. Due to reallocation this may be different from the ptr passed to this function in the ptr_rendinfo structure which is also updated accordingly const char* item ptr to the contents of the field to write struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered const char* start_string ptr to a string to be printed before the field contents ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* print_field_ris(const char* item, struct renderinfo* ptr_rendinfo, const char* start_string) { char* new_ref; if (item != NULL) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), (char*)start_string, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), (char*)item, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } return *(ptr_rendinfo->ptr_ref); } refdb-1.0.2/src/dbfncs.c000644 001750 001750 00000313133 12255427651 015651 0ustar00markusmarkus000000 000000 /*++++++++++++++++++++ dbfncs.c: refdb database-specific support functions markus@mhoenicka.de 2002-08-06 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, see +++++++++++++++++++++++++*/ #include #include #include #include #include "linklist.h" #include "refdb.h" #include "refdbd.h" #include "strfncs.h" #include "dbfncs.h" #include "connect.h" /* global variables */ extern int n_log_level; extern char main_db[]; extern struct db_caps* ptr_dbcaps; /* forward declarations of static functions */ static int my_dbi_conn_transaction(dbi_conn conn, int trans_type); static int set_cap_versioninfo(dbi_conn conn, const char* drivername); /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ new_db_caps(): creates and initializes a new db_caps struct struct db_caps* new_db_caps returns a ptr to the struct if successful NULL if out of memory struct CLIENT_REQUEST* ptr_clrequest ptr to structure with client info ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ struct db_caps* new_db_caps(struct CLIENT_REQUEST* ptr_clrequest) { struct db_caps* ptr_caps; if ((ptr_caps = malloc(sizeof(struct db_caps))) == NULL) { return NULL; } strcpy(ptr_caps->defval, "f"); if (!strcmp(ptr_clrequest->dbserver, "mysql")) { /* these settings should work for 3.23.19 and later. We'll check the database engine version at runtime and fill in more appropriate values if we're using a newer version. Some settings (like transactions) are not supported by older versions, but do not cause an error */ strcpy(ptr_caps->multiple_db, "t"); strcpy(ptr_caps->sql_enum, "t"); strcpy(ptr_caps->rlike, "RLIKE BINARY"); strcpy(ptr_caps->not_rlike, "NOT RLIKE BINARY"); strcpy(ptr_caps->transaction, "t"); strcpy(ptr_caps->localhost, "localhost"); strcpy(ptr_caps->encoding, ""); strcpy(ptr_caps->groups, "f"); strcpy(ptr_caps->admin_systable, "mysql.user"); strcpy(ptr_caps->listall, ".*"); strcpy(ptr_caps->bigint, "t"); strcpy(ptr_caps->sql_union, "f"); strcpy(ptr_caps->named_seq, "f"); strcpy(ptr_caps->charlength, "CHAR_LENGTH"); strcpy(ptr_caps->substring, "SUBSTRING"); strcpy(ptr_caps->substring_from, " FROM "); strcpy(ptr_caps->substring_for, " FOR "); strcpy(ptr_caps->sql_except, "f"); strcpy(ptr_caps->unix_regexp, "t"); ptr_caps->has_versioninfo = 0; } else if (!strcmp(ptr_clrequest->dbserver, "pgsql")) { strcpy(ptr_caps->multiple_db, "f"); strcpy(ptr_caps->sql_enum, "f"); strcpy(ptr_caps->rlike, "~"); strcpy(ptr_caps->not_rlike, "!~"); strcpy(ptr_caps->transaction, "t"); strcpy(ptr_caps->localhost, ""); strcpy(ptr_caps->encoding, "WITH ENCODING ="); strcpy(ptr_caps->groups, "t"); strcpy(ptr_caps->admin_systable, "pg_shadow"); strcpy(ptr_caps->listall, ".*"); strcpy(ptr_caps->bigint, "t"); strcpy(ptr_caps->sql_union, "t"); strcpy(ptr_caps->named_seq, "t"); strcpy(ptr_caps->charlength, "CHAR_LENGTH"); strcpy(ptr_caps->substring, "SUBSTRING"); strcpy(ptr_caps->substring_from, " FROM "); strcpy(ptr_caps->substring_for, " FOR "); strcpy(ptr_caps->sql_except, "t"); strcpy(ptr_caps->unix_regexp, "t"); ptr_caps->has_versioninfo = 1; } else if (!strcmp(ptr_clrequest->dbserver, "sqlite")) { strcpy(ptr_caps->multiple_db, "f"); strcpy(ptr_caps->sql_enum, "f"); strcpy(ptr_caps->rlike, "LIKE"); strcpy(ptr_caps->not_rlike, "NOT LIKE"); strcpy(ptr_caps->transaction, "t"); strcpy(ptr_caps->localhost, "NA"); strcpy(ptr_caps->encoding, ""); strcpy(ptr_caps->groups, "NA"); strcpy(ptr_caps->admin_systable, "NA"); strcpy(ptr_caps->listall, "%"); strcpy(ptr_caps->bigint, "f"); strcpy(ptr_caps->sql_union, "t"); strcpy(ptr_caps->named_seq, "f"); strcpy(ptr_caps->charlength, "LENGTH"); strcpy(ptr_caps->substring, "SUBSTR"); strcpy(ptr_caps->substring_from, ","); strcpy(ptr_caps->substring_for, ","); strcpy(ptr_caps->sql_except, "t"); strcpy(ptr_caps->unix_regexp, "f"); ptr_caps->has_versioninfo = 1; } else if (!strcmp(ptr_clrequest->dbserver, "sqlite3")) { strcpy(ptr_caps->multiple_db, "f"); strcpy(ptr_caps->sql_enum, "f"); strcpy(ptr_caps->rlike, "LIKE"); strcpy(ptr_caps->not_rlike, "NOT LIKE"); strcpy(ptr_caps->transaction, "t"); strcpy(ptr_caps->localhost, "NA"); strcpy(ptr_caps->encoding, ""); strcpy(ptr_caps->groups, "NA"); strcpy(ptr_caps->admin_systable, "NA"); strcpy(ptr_caps->listall, "%"); strcpy(ptr_caps->bigint, "t"); strcpy(ptr_caps->sql_union, "t"); strcpy(ptr_caps->named_seq, "f"); strcpy(ptr_caps->charlength, "LENGTH"); strcpy(ptr_caps->substring, "SUBSTR"); strcpy(ptr_caps->substring_from, ","); strcpy(ptr_caps->substring_for, ","); strcpy(ptr_caps->sql_except, "t"); strcpy(ptr_caps->unix_regexp, "f"); ptr_caps->has_versioninfo = 1; } else { LOG_PRINT(LOG_WARNING, "unknown libdbi driver requested"); free(ptr_caps); return NULL; } return ptr_caps; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ free_db_caps(): frees the memory of a db_caps struct free_db_caps returns nothing struct db_caps* ptr_caps ptr to a db_caps structure ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ void free_db_caps(struct db_caps* ptr_caps) { if (ptr_caps) { free(ptr_caps); } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ create_tables_mysql(): creates MySQL-specific reference data tables int create_tables_mysql returns >0 if error, 0 if successful dbi_conn conn database connection structure struct CLIENT_REQUEST* ptr_clrequest ptr to structure with client info int is_temp if nonzero, create a temporary table, otherwise a permanent table ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int create_tables_mysql(dbi_conn conn, struct CLIENT_REQUEST* ptr_clrequest, int is_temp) { char* sql_command; char temporary[] = TEMP_TABLE_SPECIFIER; char prefix[] = TEMP_TABLE_NAME_PREFIX; size_t sql_command_len = 2048; dbi_result dbires; /* get us some memory for the query strings */ if ((sql_command = malloc(sql_command_len)) == NULL) { return 801; } /* fix the inserts */ if (!is_temp) { *temporary = '\0'; *prefix = '\0'; } /* create the metadata table */ snprintf(sql_command, sql_command_len, "CREATE %sTABLE t_%smeta (" "meta_app VARCHAR(20)," "meta_type VARCHAR(20)," "meta_version VARCHAR(20)," "meta_dbversion SMALLINT," "meta_create_date DATETIME," "meta_modify_date DATETIME)", temporary, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(211)); return 211; } dbi_result_free(dbires); /* create the main table */ /* Version issue: later versions support something like: refdb_id INT NOT NULL PRIMARY KEY AUTO_INCREMENT without a separate PRIMARY KEY statement */ /* using a DATE field for refdb_pubyear is not possible as MySQL < 3.23 does not allow to store dates like 2000-00-00, i.e. when only the year is known */ /* refdb_periodical_id is actually a FOREIGN KEY, but MySQL does not support this so a simple INT has to do the trick */ /* todo: the next incarnation of the internal representation of reference data might use properties, i.e. key-value pairs in a separate table, instead of a wealth of (mostly empty) special-purpose columns */ snprintf(sql_command, sql_command_len, "CREATE %sTABLE t_%srefdb (" "refdb_id BIGINT NOT NULL AUTO_INCREMENT," "refdb_citekey VARCHAR(255)," "refdb_type VARCHAR(6)," "refdb_pubyear SMALLINT NOT NULL," "refdb_secyear SMALLINT NOT NULL," "refdb_startpage VARCHAR(255)," "refdb_endpage VARCHAR(255)," "refdb_abstract MEDIUMTEXT," "refdb_title TEXT," /* part title */ "refdb_volume VARCHAR(255)," "refdb_issue VARCHAR(255)," "refdb_booktitle TEXT," /* publication title */ "refdb_city VARCHAR(255)," "refdb_publisher VARCHAR(255)," "refdb_title_series TEXT," /* set title */ "refdb_address TEXT," "refdb_issn VARCHAR(255)," "refdb_pyother_info VARCHAR(255)," "refdb_secother_info VARCHAR(255)," "refdb_periodical_id BIGINT," "refdb_user1 VARCHAR(255)," "refdb_user2 VARCHAR(255)," "refdb_user3 VARCHAR(255)," "refdb_user4 VARCHAR(255)," "refdb_user5 VARCHAR(255)," "refdb_typeofwork VARCHAR(255)," "refdb_area VARCHAR(255)," "refdb_ostype VARCHAR(255)," "refdb_degree VARCHAR(255)," "refdb_runningtime VARCHAR(255)," "refdb_classcodeintl VARCHAR(255)," "refdb_classcodeus VARCHAR(255)," "refdb_senderemail VARCHAR(255)," "refdb_recipientemail VARCHAR(255)," "refdb_mediatype VARCHAR(255)," "refdb_numvolumes VARCHAR(255)," "refdb_edition VARCHAR(255)," "refdb_computer VARCHAR(255)," "refdb_conferencelocation VARCHAR(255)," "refdb_registrynum VARCHAR(255)," "refdb_classification VARCHAR(255)," "refdb_section VARCHAR(255)," "refdb_pamphletnum VARCHAR(255)," "refdb_chapternum VARCHAR(255)," "KEY (refdb_pubyear)," "UNIQUE (refdb_citekey)," "PRIMARY KEY (refdb_id))", temporary, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(212)); return 212; } dbi_result_free(dbires); /* create the author table */ snprintf(sql_command, sql_command_len, "CREATE %sTABLE t_%sauthor (" "author_id BIGINT NOT NULL AUTO_INCREMENT," "author_name VARCHAR(255) NOT NULL," "author_lastname VARCHAR(255)," "author_firstname VARCHAR(255)," "author_middlename VARCHAR(255)," "author_suffix VARCHAR(255)," "PRIMARY KEY (author_id)," "KEY (author_name(7)))", temporary, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(213)); return 213; } dbi_result_free(dbires); /* create the keyword table */ snprintf(sql_command, sql_command_len, "CREATE %sTABLE t_%skeyword (" "keyword_id BIGINT NOT NULL AUTO_INCREMENT," "keyword_name VARCHAR(255) NOT NULL," "PRIMARY KEY (keyword_id)," "KEY (keyword_name(10)))", temporary, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(214)); return 214; } dbi_result_free(dbires); /* create the periodical table */ snprintf(sql_command, sql_command_len, "CREATE %sTABLE t_%speriodical (" "periodical_id BIGINT NOT NULL AUTO_INCREMENT," "periodical_name VARCHAR(255) NOT NULL," "periodical_abbrev VARCHAR(255) NOT NULL," "periodical_custabbrev1 VARCHAR(255) NOT NULL," "periodical_custabbrev2 VARCHAR(255) NOT NULL," "PRIMARY KEY (periodical_id)," "KEY (periodical_name(20))," "KEY (periodical_abbrev(5))," "KEY (periodical_custabbrev1(5))," "KEY (periodical_custabbrev2(5)))", temporary, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(215)); return 215; } dbi_result_free(dbires); /* create the notes table */ snprintf(sql_command, sql_command_len, "CREATE %sTABLE t_%snote (" "note_id BIGINT NOT NULL AUTO_INCREMENT," "note_key VARCHAR(255)," "note_title VARCHAR(255)," "note_content TEXT," "note_content_type VARCHAR(255)," "note_content_xmllang VARCHAR(255)," "note_user_id BIGINT," "note_date DATE," "note_share SMALLINT," "KEY (note_title)," "KEY (note_user_id)," "KEY (note_date)," "UNIQUE (note_key)," "PRIMARY KEY (note_id))", temporary, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(216)); return 216; } dbi_result_free(dbires); /* create the user table */ /* the user_name length limit is imposed by MySQL, don't know about PostgreSQL */ snprintf(sql_command, sql_command_len, "CREATE %sTABLE t_%suser (" "user_id BIGINT NOT NULL AUTO_INCREMENT," "user_name VARCHAR(16) NOT NULL," "PRIMARY KEY (user_id)," "KEY (user_name(8)))", temporary, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(217)); return 217; } dbi_result_free(dbires); /* create the links table */ snprintf(sql_command, sql_command_len, "CREATE %sTABLE t_%slink (" "link_id BIGINT NOT NULL AUTO_INCREMENT," "link_url TEXT NOT NULL," "PRIMARY KEY (link_id)," "KEY (link_url(16)))", temporary, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(257)); return 257; } dbi_result_free(dbires); /* create the author xtable */ snprintf(sql_command, sql_command_len, "CREATE %sTABLE t_%sxauthor (" "xauthor_id BIGINT NOT NULL AUTO_INCREMENT," "author_id BIGINT NOT NULL," "refdb_id BIGINT NOT NULL," "xauthor_type ENUM('part', 'publication', 'set')," "xauthor_role VARCHAR(64)," "xauthor_position INT," "PRIMARY KEY (xauthor_id)," "KEY (author_id)," "KEY (refdb_id))", temporary, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(218)); return 218; } dbi_result_free(dbires); /* create the keyword xtable */ snprintf(sql_command, sql_command_len, "CREATE %sTABLE t_%sxkeyword (" "xkeyword_id BIGINT NOT NULL AUTO_INCREMENT," "keyword_id BIGINT NOT NULL," "xref_id BIGINT NOT NULL," "xkeyword_type ENUM(\"REFERENCE\",\"NOTE\")," "PRIMARY KEY (xkeyword_id)," "KEY (keyword_id)," "KEY (xref_id))", temporary, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(219)); return 219; } dbi_result_free(dbires); /* create the user xtable */ snprintf(sql_command, sql_command_len, "CREATE %sTABLE t_%sxuser (" "xuser_id BIGINT NOT NULL AUTO_INCREMENT," "user_id BIGINT NOT NULL," "refdb_id BIGINT NOT NULL," "xuser_reprint ENUM(\"IN FILE\",\"NOT IN FILE\",\"ON REQUEST\")," "xuser_date DATE," "xuser_avail VARCHAR(255)," "xuser_notes MEDIUMTEXT," "PRIMARY KEY (xuser_id)," "KEY (user_id)," "KEY (refdb_id))", temporary, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(220)); return 220; } dbi_result_free(dbires); /* create the notes xtable */ snprintf(sql_command, sql_command_len, "CREATE %sTABLE t_%sxnote (" "xnote_id BIGINT NOT NULL AUTO_INCREMENT," "note_id BIGINT NOT NULL," "xref_id BIGINT NOT NULL," "xnote_type ENUM(\"REFERENCE\",\"KEYWORD\",\"AUTHOR\",\"PERIODICAL\")," "PRIMARY KEY (xnote_id)," "KEY (note_id)," "KEY (xref_id)," "KEY (xnote_type))", temporary, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(221)); return 221; } dbi_result_free(dbires); /* create the link xtable */ snprintf(sql_command, sql_command_len, "CREATE %sTABLE t_%sxlink (" "xlink_id BIGINT NOT NULL AUTO_INCREMENT," "link_id BIGINT NOT NULL," "xref_id BIGINT NOT NULL," "user_id BIGINT DEFAULT 0," "xlink_type ENUM(\"URL\",\"PDF\",\"FULLTEXT\",\"RELATED\", \"IMAGE\", \"DOI\")," "xlink_source ENUM(\"REFERENCE\",\"NOTE\")," "PRIMARY KEY (xlink_id)," "KEY (link_id)," "KEY (xref_id))", temporary, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(258)); return 258; } dbi_result_free(dbires); free(sql_command); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ create_xdup_tables_mysql(): creates MySQL-specific duplicate check tables int create_xdup_tables_mysql returns >0 if error, 0 if successful dbi_conn conn database connection structure ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int create_xdup_tables_mysql(dbi_conn conn) { char* sql_command; size_t sql_command_len = 512; dbi_result dbires; /* get us some memory for the query strings */ if ((sql_command = malloc(sql_command_len)) == NULL) { return 801; } sprintf(sql_command, "CREATE TEMPORARY TABLE t_temp_xdup (" "xdup_id BIGINT NOT NULL AUTO_INCREMENT," "xdup_type ENUM (\"TITLE\",\"LOCATION\",\"AUTHOR\",\'CITEKEY\',\'KEYWORD\',\'PERIODICAL\')," "match_type ENUM (\"IDENT\",\"CASE\",\"LIKE\",\"ABBREV\")," "temp_refdb_id BIGINT," "refdb_id BIGINT," "value_name TEXT," "temp_value_name TEXT," "value_name_2 TEXT," "temp_value_name_2 TEXT," "value_name_3 TEXT," "temp_value_name_3 TEXT," "PRIMARY KEY (xdup_id))"); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); free(sql_command); if (!dbires) { LOG_PRINT(LOG_ERR, get_status_msg(268)); return 268; } dbi_result_free(dbires); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ create_tables_pgsql(): creates PostgreSQL-specific reference data tables int create_tables_pgsql returns >0 if error, 0 if successful dbi_conn conn database connection structure struct CLIENT_REQUEST* ptr_clrequest ptr to structure with client info int is_temp if nonzero, create a temporary table, otherwise a permanent table ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int create_tables_pgsql(dbi_conn conn, struct CLIENT_REQUEST* ptr_clrequest, int is_temp) { char* sql_command; char buffer[512]; char temporary[] = TEMP_TABLE_SPECIFIER; char prefix[] = TEMP_TABLE_NAME_PREFIX; size_t sql_command_len = 2048; dbi_result dbires; /* get us some memory for the query strings */ if ((sql_command = malloc(sql_command_len)) == NULL) { return 801; } /* fix the inserts */ if (!is_temp) { *temporary = '\0'; *prefix = '\0'; } /* create the metadata table */ snprintf(sql_command, sql_command_len, "CREATE %sTABLE t_%smeta (" "meta_app VARCHAR(20)," "meta_type VARCHAR(20)," "meta_version VARCHAR(20)," "meta_dbversion SMALLINT," "meta_create_date TIMESTAMP," "meta_modify_date TIMESTAMP)", temporary, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(211)); return 211; } dbi_result_free(dbires); /* create the main table */ /* using a DATE field for refdb_pubyear is not possible as MySQL < 3.23 does not allow to store dates like 2000-00-00, i.e. when only the year is known */ /* refdb_periodical_id is actually a FOREIGN KEY, but MySQL does not support this so a simple INT has to do the trick */ /* this will implicitly create a SEQUENCE t_refdb_refdb_id_seq */ snprintf(sql_command, sql_command_len, "CREATE %sTABLE t_%srefdb (" "refdb_id BIGSERIAL," "refdb_citekey VARCHAR(255) UNIQUE," "refdb_type VARCHAR(6)," "refdb_pubyear SMALLINT," "refdb_secyear SMALLINT," "refdb_startpage VARCHAR(255)," "refdb_endpage VARCHAR(255)," "refdb_abstract TEXT," "refdb_title TEXT," "refdb_volume VARCHAR(255)," "refdb_issue VARCHAR(255)," "refdb_booktitle TEXT," "refdb_city VARCHAR(255)," "refdb_publisher VARCHAR(255)," "refdb_title_series TEXT," "refdb_address TEXT," "refdb_issn VARCHAR(255)," "refdb_pyother_info VARCHAR(255)," "refdb_secother_info VARCHAR(255)," "refdb_periodical_id BIGINT," "refdb_user1 VARCHAR(255)," "refdb_user2 VARCHAR(255)," "refdb_user3 VARCHAR(255)," "refdb_user4 VARCHAR(255)," "refdb_user5 VARCHAR(255)," "refdb_typeofwork VARCHAR(255)," "refdb_area VARCHAR(255)," "refdb_ostype VARCHAR(255)," "refdb_degree VARCHAR(255)," "refdb_runningtime VARCHAR(255)," "refdb_classcodeintl VARCHAR(255)," "refdb_classcodeus VARCHAR(255)," "refdb_senderemail VARCHAR(255)," "refdb_recipientemail VARCHAR(255)," "refdb_mediatype VARCHAR(255)," "refdb_numvolumes VARCHAR(255)," "refdb_edition VARCHAR(255)," "refdb_computer VARCHAR(255)," "refdb_conferencelocation VARCHAR(255)," "refdb_registrynum VARCHAR(255)," "refdb_classification VARCHAR(255)," "refdb_section VARCHAR(255)," "refdb_pamphletnum VARCHAR(255)," "refdb_chapternum VARCHAR(255)," "PRIMARY KEY (refdb_id))", temporary, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(212)); return 212; } dbi_result_free(dbires); /* create the periodical index */ snprintf(sql_command, sql_command_len, "CREATE INDEX i_%spubyear ON t_%srefdb (refdb_pubyear)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(212)); return 212; } dbi_result_free(dbires); /* create the author table */ /* this will implicitly create a SEQUENCE t_author_author_id_seq */ snprintf(sql_command, sql_command_len, "CREATE %sTABLE t_%sauthor (" "author_id BIGSERIAL," "author_name VARCHAR(255) NOT NULL," "author_lastname VARCHAR(255)," "author_firstname VARCHAR(255)," "author_middlename VARCHAR(255)," "author_suffix VARCHAR(255)," "PRIMARY KEY (author_id))", temporary, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(213)); return 213; } dbi_result_free(dbires); /* create the author_name index */ snprintf(sql_command, sql_command_len, "CREATE INDEX i_%sauthor_name ON t_%sauthor (author_name)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(213)); return 213; } dbi_result_free(dbires); /* create the keyword table */ /* this will implicitly create a SEQUENCE t_keyword_keyword_id_seq */ snprintf(sql_command, sql_command_len, "CREATE %sTABLE t_%skeyword (" "keyword_id BIGSERIAL," "keyword_name VARCHAR(255) NOT NULL," "PRIMARY KEY (keyword_id))", temporary, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(214)); return 214; } dbi_result_free(dbires); /* create the keyword_name index */ snprintf(sql_command, sql_command_len, "CREATE INDEX i_%skeyword_name ON t_%skeyword (keyword_name)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(214)); return 214; } dbi_result_free(dbires); /* create the periodical table */ /* this will implicitly create a SEQUENCE t_periodical_periodical_id_seq */ snprintf(sql_command, sql_command_len, "CREATE %sTABLE t_%speriodical (" "periodical_id BIGSERIAL," "periodical_name VARCHAR(255)," "periodical_abbrev VARCHAR(255)," "periodical_custabbrev1 VARCHAR(255)," "periodical_custabbrev2 VARCHAR(255)," "PRIMARY KEY (periodical_id))", temporary, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(215)); return 215; } dbi_result_free(dbires); /* create the t_periodical indices */ snprintf(sql_command, sql_command_len, "CREATE INDEX i_%speriodical_name ON t_%speriodical (periodical_name)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(215)); return 215; } dbi_result_free(dbires); snprintf(sql_command, sql_command_len, "CREATE INDEX i_%speriodical_abbrev ON t_%speriodical (periodical_abbrev)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(215)); return 215; } dbi_result_free(dbires); snprintf(sql_command, sql_command_len, "CREATE INDEX i_%speriodical_custabbrev1 ON t_%speriodical (periodical_custabbrev1)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(215)); return 215; } dbi_result_free(dbires); snprintf(sql_command, sql_command_len, "CREATE INDEX i%s_periodical_custabbrev2 ON t_%speriodical (periodical_custabbrev2)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(215)); return 215; } dbi_result_free(dbires); /* create the notes table */ /* this will implicitly create a SEQUENCE t_note_note_id_seq */ snprintf(sql_command, sql_command_len, "CREATE %sTABLE t_%snote (" "note_id BIGSERIAL," "note_key VARCHAR(255) UNIQUE," "note_title VARCHAR(255)," "note_content TEXT," "note_content_type VARCHAR(255)," "note_content_xmllang VARCHAR(255)," "note_user_id BIGINT," "note_date DATE," "note_share SMALLINT," "PRIMARY KEY (note_id))", temporary, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(216)); return 216; } dbi_result_free(dbires); /* create the t_note indexes */ snprintf(sql_command, sql_command_len, "CREATE INDEX i_%snote_title ON t_%snote (note_title)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(216)); return 216; } dbi_result_free(dbires); snprintf(sql_command, sql_command_len, "CREATE INDEX i_%snote_note_user_id ON t_%snote (note_user_id)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(216)); return 216; } dbi_result_free(dbires); snprintf(sql_command, sql_command_len, "CREATE INDEX i_%snote_date ON t_%snote (note_date)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(216)); return 216; } dbi_result_free(dbires); /* create the user table */ /* the user_name length limit is imposed by MySQL, don't know about PostgreSQL */ /* this will implicitly create a SEQUENCE t_user_user_id_seq */ snprintf(sql_command, sql_command_len, "CREATE %sTABLE t_%suser (" "user_id BIGSERIAL," "user_name VARCHAR(16) NOT NULL," "PRIMARY KEY (user_id))", temporary, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(217)); return 217; } dbi_result_free(dbires); /* create user_name index */ snprintf(sql_command, sql_command_len, "CREATE INDEX i_%suser_name ON t_%suser (user_name)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(217)); return 217; } dbi_result_free(dbires); /* create the link table */ /* this will implicitly create a SEQUENCE t_link_link_id_seq */ snprintf(sql_command, sql_command_len, "CREATE %sTABLE t_%slink (" "link_id BIGSERIAL," "link_url TEXT NOT NULL," "PRIMARY KEY (link_id))", temporary, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(257)); return 257; } dbi_result_free(dbires); /* create link_url index */ snprintf(sql_command, sql_command_len, "CREATE INDEX i_%slink_url ON t_%slink (link_url)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(257)); return 257; } dbi_result_free(dbires); /* create the author xtable */ /* this will implicitly create a SEQUENCE t_xauthor_xauthor_id_seq */ snprintf(sql_command, sql_command_len, "CREATE %sTABLE t_%sxauthor (" "xauthor_id BIGSERIAL," "author_id BIGINT NOT NULL," "refdb_id BIGINT NOT NULL," "xauthor_type SMALLINT DEFAULT 1," "xauthor_role VARCHAR(64)," "xauthor_position INTEGER," "PRIMARY KEY (xauthor_id))", temporary, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(218)); return 218; } dbi_result_free(dbires); /* create x_author indices */ snprintf(sql_command, sql_command_len, "CREATE INDEX i_%sxauthor_author_id ON t_%sxauthor (author_id)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(218)); return 218; } dbi_result_free(dbires); snprintf(sql_command, sql_command_len, "CREATE INDEX i_%sxauthor_refdb_id ON t_%sxauthor (refdb_id)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(218)); return 218; } dbi_result_free(dbires); /* create the keyword xtable */ /* this will implicitly create a SEQUENCE t_xkeyword_xkeyword_id_seq */ snprintf(sql_command, sql_command_len, "CREATE %sTABLE t_%sxkeyword (" "xkeyword_id BIGSERIAL," "keyword_id BIGINT NOT NULL," "xkeyword_type VARCHAR(11) DEFAULT \'REFERENCE\'," "xref_id BIGINT NOT NULL," "PRIMARY KEY (xkeyword_id))", temporary, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(219)); return 219; } dbi_result_free(dbires); /* create x_keyword indices */ snprintf(sql_command, sql_command_len, "CREATE INDEX i_%sxkeyword_keyword_id ON t_%sxkeyword (keyword_id)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(219)); return 219; } dbi_result_free(dbires); snprintf(sql_command, sql_command_len, "CREATE INDEX i_%sxkeyword_xref_id ON t_%sxkeyword (xref_id)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(219)); return 219; } dbi_result_free(dbires); /* create the user xtable */ /* this will implicitly create a SEQUENCE t_xuser_xuser_id_seq */ snprintf(sql_command, sql_command_len, "CREATE %sTABLE t_%sxuser (" "xuser_id BIGSERIAL," "user_id BIGINT NOT NULL," "refdb_id BIGINT NOT NULL," "xuser_reprint VARCHAR(11) DEFAULT \'NOT IN FILE\'," "xuser_date DATE," "xuser_avail VARCHAR(255)," "xuser_notes TEXT," "PRIMARY KEY (xuser_id))", temporary, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(220)); return 220; } dbi_result_free(dbires); /* create x_user indices */ snprintf(sql_command, sql_command_len, "CREATE INDEX i_%sxuser_user_id ON t_%sxuser (user_id)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(220)); return 220; } dbi_result_free(dbires); snprintf(sql_command, sql_command_len, "CREATE INDEX i_%sxuser_refdb_id ON t_%sxuser (refdb_id)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(220)); return 220; } dbi_result_free(dbires); /* create the notes xtable */ /* this will implicitly create a SEQUENCE t_xnote_xnote_id_seq */ snprintf(sql_command, sql_command_len, "CREATE %sTABLE t_%sxnote (" "xnote_id BIGSERIAL," "note_id BIGINT NOT NULL," "xref_id BIGINT NOT NULL," "xnote_type VARCHAR(11) DEFAULT \'REFERENCE\'," "PRIMARY KEY (xnote_id))", temporary, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(221)); return 221; } dbi_result_free(dbires); /* create x_note indices */ snprintf(sql_command, sql_command_len, "CREATE INDEX i_%sxnote_note_id ON t_%sxnote (note_id)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(221)); return 221; } dbi_result_free(dbires); snprintf(sql_command, sql_command_len, "CREATE INDEX i_%sxnote_xref_id ON t_%sxnote (xref_id)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(221)); return 221; } dbi_result_free(dbires); snprintf(sql_command, sql_command_len, "CREATE INDEX i_%sxnote_xnote_type ON t_%sxnote (xnote_type)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(221)); return 221; } dbi_result_free(dbires); /* create the links xtable */ /* this will implicitly create a SEQUENCE t_xlink_xlink_id_seq */ snprintf(sql_command, sql_command_len, "CREATE %sTABLE t_%sxlink (" "xlink_id BIGSERIAL," "link_id BIGINT NOT NULL," "xref_id BIGINT NOT NULL," "user_id BIGINT DEFAULT 0," "xlink_type VARCHAR(11) DEFAULT \'URL\'," "xlink_source VARCHAR(11) DEFAULT \'REFERENCE\'," "PRIMARY KEY (xlink_id))", temporary, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(258)); return 258; } dbi_result_free(dbires); /* create x_link indices */ snprintf(sql_command, sql_command_len, "CREATE INDEX i_%sxlink_link_id ON t_%sxlink (link_id)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(258)); return 258; } dbi_result_free(dbires); snprintf(sql_command, sql_command_len, "CREATE INDEX i_%sxlink_xref_id ON t_%sxlink (xref_id)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(258)); return 258; } dbi_result_free(dbires); snprintf(sql_command, sql_command_len, "CREATE INDEX i_%sxlink_xlink_type ON t_%sxlink (xlink_type)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(258)); return 258; } dbi_result_free(dbires); snprintf(sql_command, sql_command_len, "CREATE INDEX i_%sxlink_xlink_source ON t_%sxlink (xlink_source)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(258)); return 258; } dbi_result_free(dbires); /* create user permissions */ if (!is_temp) { /* PostgreSQL uses table-based permissions, so it is easier to create them here than in adduser. We grant read/write permissions to a group "user" and read permissions to "ruser" here, whereas adduser just adds users to/removes from this group */ /* ptr_clrequest->argument contains the database name */ if (is_group_pgsql(conn, ptr_clrequest->argument, 0 /* read/write */) != 1) { sprintf(buffer, "CREATE GROUP %suser", ptr_clrequest->argument); LOG_PRINT(LOG_DEBUG, buffer); dbires = dbi_conn_query(conn, buffer); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(222)); return 222; } dbires = dbi_conn_query(conn, sql_command); } sprintf(buffer, "GRANT SELECT, INSERT, UPDATE, DELETE ON t_meta, t_refdb, t_author, t_keyword, t_periodical, t_user, t_note, t_link, t_xauthor, t_xkeyword, t_xuser, t_xnote, t_xlink, t_refdb_refdb_id_seq, t_author_author_id_seq, t_keyword_keyword_id_seq, t_periodical_periodical_id_seq, t_user_user_id_seq, t_note_note_id_seq, t_link_link_id_seq, t_xauthor_xauthor_id_seq, t_xkeyword_xkeyword_id_seq, t_xuser_xuser_id_seq, t_xnote_xnote_id_seq, t_xlink_xlink_id_seq TO GROUP %suser", ptr_clrequest->argument); LOG_PRINT(LOG_DEBUG, buffer); dbires = dbi_conn_query(conn, buffer); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(223)); return 223; } dbi_result_free(dbires); if (is_group_pgsql(conn, ptr_clrequest->argument, 1 /* read-only */) != 1) { sprintf(buffer, "CREATE GROUP %sruser", ptr_clrequest->argument); LOG_PRINT(LOG_DEBUG, buffer); dbires = dbi_conn_query(conn, buffer); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(222)); return 222; } dbires = dbi_conn_query(conn, sql_command); } sprintf(buffer, "GRANT SELECT ON t_meta, t_refdb, t_author, t_keyword, t_periodical, t_user, t_note, t_link, t_xauthor, t_xkeyword, t_xuser, t_xnote, t_xlink, t_refdb_refdb_id_seq, t_author_author_id_seq, t_keyword_keyword_id_seq, t_periodical_periodical_id_seq, t_user_user_id_seq, t_note_note_id_seq, t_link_link_id_seq, t_xauthor_xauthor_id_seq, t_xkeyword_xkeyword_id_seq, t_xuser_xuser_id_seq, t_xnote_xnote_id_seq, t_xlink_xlink_id_seq TO GROUP %sruser", ptr_clrequest->argument); LOG_PRINT(LOG_DEBUG, buffer); dbires = dbi_conn_query(conn, buffer); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(223)); return 223; } dbi_result_free(dbires); } free(sql_command); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ create_xdup_tables_pgsql(): creates PostgreSQL-specific duplicate check tables int create_xdup_tables_pgsql returns >0 if error, 0 if successful dbi_conn conn database connection structure ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int create_xdup_tables_pgsql(dbi_conn conn) { char* sql_command; size_t sql_command_len = 512; dbi_result dbires; /* get us some memory for the query strings */ if ((sql_command = malloc(sql_command_len)) == NULL) { return 801; } sprintf(sql_command, "CREATE TEMPORARY TABLE t_temp_xdup (" "xdup_id BIGSERIAL," "xdup_type VARCHAR(10)," "match_type VARCHAR(10)," "temp_refdb_id BIGINT," "refdb_id BIGINT," "value_name TEXT," "temp_value_name TEXT," "value_name_2 TEXT," "temp_value_name_2 TEXT," "value_name_3 TEXT," "temp_value_name_3 TEXT," "PRIMARY KEY (xdup_id))"); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); free(sql_command); if (!dbires) { LOG_PRINT(LOG_ERR, get_status_msg(268)); return 268; } dbi_result_free(dbires); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ create_tables_sqlite(): creates SQLite-specific reference data tables int create_tables_sqlite returns >0 if error, 0 if successful dbi_conn conn database connection structure struct CLIENT_REQUEST* ptr_clrequest ptr to structure with client info int is_temp if nonzero, create a temporary table, otherwise a permanent table ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int create_tables_sqlite(dbi_conn conn, struct CLIENT_REQUEST* ptr_clrequest, int is_temp) { char* sql_command; char temporary[] = TEMP_TABLE_SPECIFIER; char prefix[] = TEMP_TABLE_NAME_PREFIX; size_t sql_command_len = 2048; dbi_result dbires; /* get us some memory for the query strings */ if ((sql_command = malloc(sql_command_len)) == NULL) { return 801; } /* fix the inserts */ if (!is_temp) { *temporary = '\0'; *prefix = '\0'; } /* create the metadata table */ snprintf(sql_command, sql_command_len, "CREATE %sTABLE t_%smeta (" "meta_app VARCHAR(20)," "meta_type VARCHAR(20)," "meta_version VARCHAR(20)," "meta_dbversion SMALLINT," "meta_create_date DATETIME," "meta_modify_date DATETIME)", temporary, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(211)); return 211; } dbi_result_free(dbires); /* create the main table */ snprintf(sql_command, sql_command_len, "CREATE %sTABLE t_%srefdb (" "refdb_id INTEGER PRIMARY KEY," "refdb_citekey TEXT UNIQUE," "refdb_type TEXT," "refdb_pubyear SMALLINT," "refdb_secyear SMALLINT," "refdb_startpage TEXT," "refdb_endpage TEXT," "refdb_abstract TEXT," "refdb_title TEXT," "refdb_volume TEXT," "refdb_issue TEXT," "refdb_booktitle TEXT," "refdb_city TEXT," "refdb_publisher TEXT," "refdb_title_series TEXT," "refdb_address TEXT," "refdb_issn TEXT," "refdb_pyother_info TEXT," "refdb_secother_info TEXT," "refdb_periodical_id INTEGER," "refdb_user1 TEXT," "refdb_user2 TEXT," "refdb_user3 TEXT," "refdb_user4 TEXT," "refdb_user5 TEXT," "refdb_typeofwork TEXT," "refdb_area TEXT," "refdb_ostype TEXT," "refdb_degree TEXT," "refdb_runningtime TEXT," "refdb_classcodeintl TEXT," "refdb_classcodeus TEXT," "refdb_senderemail TEXT," "refdb_recipientemail TEXT," "refdb_mediatype TEXT," "refdb_numvolumes TEXT," "refdb_edition TEXT," "refdb_computer TEXT," "refdb_conferencelocation TEXT," "refdb_registrynum TEXT," "refdb_classification TEXT," "refdb_section TEXT," "refdb_pamphletnum TEXT," "refdb_chapternum TEXT)", temporary, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(212)); return 212; } dbi_result_free(dbires); /* create the main table indexes */ snprintf(sql_command, sql_command_len, "CREATE INDEX i_%srefdb_pubyear ON t_%srefdb (refdb_pubyear)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(212)); return 212; } dbi_result_free(dbires); snprintf(sql_command, sql_command_len, "CREATE UNIQUE INDEX i_%srefdb_citekey ON t_%srefdb (refdb_citekey)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(212)); return 212; } dbi_result_free(dbires); /* create the author table */ snprintf(sql_command, sql_command_len, "CREATE %sTABLE t_%sauthor (" "author_id INTEGER PRIMARY KEY," "author_name TEXT NOT NULL," "author_lastname TEXT," "author_firstname TEXT," "author_middlename TEXT," "author_suffix TEXT)", temporary, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(213)); return 213; } dbi_result_free(dbires); /* create t_author table index */ snprintf(sql_command, sql_command_len, "CREATE INDEX i_%sauthor_name ON t_%sauthor (author_name)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(213)); return 213; } dbi_result_free(dbires); /* create the keyword table */ snprintf(sql_command, sql_command_len, "CREATE %sTABLE t_%skeyword (" "keyword_id INTEGER PRIMARY KEY," "keyword_name TEXT NOT NULL)", temporary, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(214)); return 214; } dbi_result_free(dbires); /* create t_keyword table index */ snprintf(sql_command, sql_command_len, "CREATE INDEX i_%skeyword_name ON t_%skeyword (keyword_name)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(214)); return 214; } dbi_result_free(dbires); /* create the periodical table */ snprintf(sql_command, sql_command_len, "CREATE %sTABLE t_%speriodical (" "periodical_id INTEGER PRIMARY KEY," "periodical_name TEXT," "periodical_abbrev TEXT," "periodical_custabbrev1 TEXT," "periodical_custabbrev2 TEXT)", temporary, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(215)); return 215; } dbi_result_free(dbires); /* create t_periodical table indexes */ snprintf(sql_command, sql_command_len, "CREATE INDEX i_%speriodical_name ON t_%speriodical (periodical_name)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(215)); return 215; } dbi_result_free(dbires); snprintf(sql_command, sql_command_len, "CREATE INDEX i_%speriodical_abbrev ON t_%speriodical (periodical_abbrev)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(215)); return 215; } dbi_result_free(dbires); snprintf(sql_command, sql_command_len, "CREATE INDEX i_%speriodical_custabbrev1 ON t_%speriodical (periodical_custabbrev1)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(215)); return 215; } dbi_result_free(dbires); snprintf(sql_command, sql_command_len, "CREATE INDEX i_%speriodical_custabbrev2 ON t_%speriodical (periodical_custabbrev2)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(215)); return 215; } dbi_result_free(dbires); /* create the notes table */ snprintf(sql_command, sql_command_len, "CREATE %sTABLE t_%snote (" "note_id INTEGER PRIMARY KEY," "note_key TEXT UNIQUE," "note_title TEXT," "note_content_type TEXT," "note_content_xmllang TEXT," "note_user_id INTEGER," "note_date DATE," "note_share SMALLINT," "note_content TEXT)", temporary, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(216)); return 216; } dbi_result_free(dbires); /* create t_note table indexes */ snprintf(sql_command, sql_command_len, "CREATE INDEX i_%snote_title ON t_%snote (note_title)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(216)); return 216; } dbi_result_free(dbires); snprintf(sql_command, sql_command_len, "CREATE INDEX i_%snote_note_userid ON t_%snote (note_user_id)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(216)); return 216; } dbi_result_free(dbires); snprintf(sql_command, sql_command_len, "CREATE INDEX i_%snote_date ON t_%snote (note_date)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(216)); return 216; } dbi_result_free(dbires); /* create the user table */ snprintf(sql_command, sql_command_len, "CREATE %sTABLE t_%suser (" "user_id INTEGER PRIMARY KEY," "user_name TEXT NOT NULL)", temporary, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(217)); return 217; } dbi_result_free(dbires); /* create t_user table index */ snprintf(sql_command, sql_command_len, "CREATE INDEX i_%suser_name ON t_%suser (user_name)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(217)); return 217; } dbi_result_free(dbires); /* create the link table */ snprintf(sql_command, sql_command_len, "CREATE %sTABLE t_%slink (" "link_id INTEGER PRIMARY KEY," "link_url TEXT NOT NULL)", temporary, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(257)); return 257; } dbi_result_free(dbires); /* create t_link table index */ snprintf(sql_command, sql_command_len, "CREATE INDEX i_%slink_url ON t_%slink (link_url)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(257)); return 257; } dbi_result_free(dbires); /* create the author xtable */ snprintf(sql_command, sql_command_len, "CREATE %sTABLE t_%sxauthor (" "xauthor_id INTEGER PRIMARY KEY," "author_id INTEGER NOT NULL," "refdb_id INTEGER NOT NULL," "xauthor_type SMALLINT DEFAULT 1," "xauthor_role TEXT," "xauthor_position INTEGER)", temporary, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(218)); return 218; } dbi_result_free(dbires); /* create t_xauthor table indexes */ snprintf(sql_command, sql_command_len, "CREATE INDEX i_%sxauthor_autid ON t_%sxauthor (author_id)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(218)); return 218; } dbi_result_free(dbires); snprintf(sql_command, sql_command_len, "CREATE INDEX i_%sxauthor_refid ON t_%sxauthor (refdb_id)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(218)); return 218; } dbi_result_free(dbires); /* create the keyword xtable */ snprintf(sql_command, sql_command_len, "CREATE %sTABLE t_%sxkeyword (" "xkeyword_id INTEGER PRIMARY KEY," "xkeyword_type TEXT," "keyword_id INTEGER NOT NULL," "xref_id INTEGER NOT NULL)", temporary, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { LOG_PRINT(LOG_ERR, get_status_msg(219)); return 219; } dbi_result_free(dbires); /* create t_xkeyword table indexes */ snprintf(sql_command, sql_command_len, "CREATE INDEX i_%sxkeyword_kwid ON t_%sxkeyword (keyword_id)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(219)); return 219; } dbi_result_free(dbires); snprintf(sql_command, sql_command_len, "CREATE INDEX i_%sxkeyword_xrefid ON t_%sxkeyword (xref_id)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(219)); return 219; } dbi_result_free(dbires); /* create the user xtable */ snprintf(sql_command, sql_command_len, "CREATE %sTABLE t_%sxuser (" "xuser_id INTEGER PRIMARY KEY," "user_id INTEGER NOT NULL," "refdb_id INTEGER NOT NULL," "xuser_reprint TEXT DEFAULT \'NOT IN FILE\'," "xuser_date DATE," "xuser_avail TEXT," "xuser_notes TEXT)", temporary, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(220)); return 220; } dbi_result_free(dbires); /* create t_xuser table indexes */ snprintf(sql_command, sql_command_len, "CREATE INDEX i_%sxuser_userid ON t_%sxuser (user_id)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(220)); return 220; } dbi_result_free(dbires); snprintf(sql_command, sql_command_len, "CREATE INDEX i_%sxuser_refid ON t_%sxuser (refdb_id)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(220)); return 220; } dbi_result_free(dbires); /* create the notes xtable */ snprintf(sql_command, sql_command_len, "CREATE %sTABLE t_%sxnote (" "xnote_id INTEGER PRIMARY KEY," "note_id INTEGER NOT NULL," "xref_id INTEGER NOT NULL," "xnote_type TEXT DEFAULT \'REFERENCE\')", temporary, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(221)); return 221; } dbi_result_free(dbires); /* create t_xnote table indexes */ snprintf(sql_command, sql_command_len, "CREATE INDEX i_%sxnote_noteid ON t_%sxnote (note_id)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(221)); return 221; } dbi_result_free(dbires); snprintf(sql_command, sql_command_len, "CREATE INDEX i_%sxnote_xrefid ON t_%sxnote (xref_id)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(221)); return 221; } dbi_result_free(dbires); snprintf(sql_command, sql_command_len, "CREATE INDEX i_%sxnote_xnotetype ON t_%sxnote (xnote_type)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(221)); return 221; } dbi_result_free(dbires); /* create the links xtable */ snprintf(sql_command, sql_command_len, "CREATE %sTABLE t_%sxlink (" "xlink_id INTEGER PRIMARY KEY," "link_id INTEGER NOT NULL," "xref_id INTEGER NOT NULL," "user_id INTEGER DEFAULT 0," "xlink_type TEXT DEFAULT \'URL\'," "xlink_source TEXT DEFAULT \'REFERENCE\')", temporary, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(258)); return 258; } dbi_result_free(dbires); /* create t_xlink table indexes */ snprintf(sql_command, sql_command_len, "CREATE INDEX i_%sxlink_linkid ON t_%sxlink (link_id)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(258)); return 258; } dbi_result_free(dbires); snprintf(sql_command, sql_command_len, "CREATE INDEX i_%sxlink_xrefid ON t_%sxlink (xref_id)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(258)); return 258; } dbi_result_free(dbires); snprintf(sql_command, sql_command_len, "CREATE INDEX i_%sxlink_xlinktype ON t_%sxlink (xlink_type)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(258)); return 258; } dbi_result_free(dbires); snprintf(sql_command, sql_command_len, "CREATE INDEX i_%sxlink_xlinksource ON t_%sxlink (xlink_source)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(258)); return 258; } dbi_result_free(dbires); free(sql_command); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ create_xdup_tables_sqlite(): creates SQLite-specific duplicate check tables int create_xdup_tables_sqlite returns >0 if error, 0 if successful dbi_conn conn database connection structure ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int create_xdup_tables_sqlite(dbi_conn conn) { char* sql_command; size_t sql_command_len = 512; dbi_result dbires; /* get us some memory for the query strings */ if ((sql_command = malloc(sql_command_len)) == NULL) { return 801; } sprintf(sql_command, "CREATE TEMPORARY TABLE t_temp_xdup (" "xdup_id INTEGER PRIMARY KEY," "xdup_type VARCHAR(10)," "match_type VARCHAR(10)," "temp_refdb_id INTEGER," "refdb_id INTEGER," "value_name TEXT," "temp_value_name TEXT," "value_name_2 TEXT," "temp_value_name_2 TEXT," "value_name_3 TEXT," "temp_value_name_3 TEXT)"); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); free(sql_command); if (!dbires) { LOG_PRINT(LOG_ERR, get_status_msg(268)); return 268; } dbi_result_free(dbires); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ create_tables_sqlite3(): creates SQLite3-specific reference data tables int create_tables_sqlite3 returns >0 if error, 0 if successful struct CLIENT_REQUEST* ptr_clrequest ptr to structure with client info int is_temp if nonzero, create a temporary table, otherwise a permanent table ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int create_tables_sqlite3(dbi_conn conn, struct CLIENT_REQUEST* ptr_clrequest, int is_temp) { char* sql_command; char temporary[] = TEMP_TABLE_SPECIFIER; char prefix[] = TEMP_TABLE_NAME_PREFIX; size_t sql_command_len = 2048; dbi_result dbires; /* get us some memory for the query strings */ if ((sql_command = malloc(sql_command_len)) == NULL) { return 801; } /* fix the inserts */ if (!is_temp) { *temporary = '\0'; *prefix = '\0'; } /* create the metadata table */ snprintf(sql_command, sql_command_len, "CREATE %sTABLE t_%smeta (" "meta_app VARCHAR(20)," "meta_type VARCHAR(20)," "meta_version VARCHAR(20)," "meta_dbversion SMALLINT," "meta_create_date DATETIME," "meta_modify_date DATETIME)", temporary, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(211)); return 211; } dbi_result_free(dbires); /* create the main table */ snprintf(sql_command, sql_command_len, "CREATE %sTABLE t_%srefdb (" "refdb_id INTEGER PRIMARY KEY," "refdb_citekey TEXT UNIQUE," "refdb_type TEXT," "refdb_pubyear SMALLINT," "refdb_secyear SMALLINT," "refdb_startpage TEXT," "refdb_endpage TEXT," "refdb_abstract TEXT," "refdb_title TEXT," "refdb_volume TEXT," "refdb_issue TEXT," "refdb_booktitle TEXT," "refdb_city TEXT," "refdb_publisher TEXT," "refdb_title_series TEXT," "refdb_address TEXT," "refdb_issn TEXT," "refdb_pyother_info TEXT," "refdb_secother_info TEXT," "refdb_periodical_id BIGINT," "refdb_user1 TEXT," "refdb_user2 TEXT," "refdb_user3 TEXT," "refdb_user4 TEXT," "refdb_user5 TEXT," "refdb_typeofwork TEXT," "refdb_area TEXT," "refdb_ostype TEXT," "refdb_degree TEXT," "refdb_runningtime TEXT," "refdb_classcodeintl TEXT," "refdb_classcodeus TEXT," "refdb_senderemail TEXT," "refdb_recipientemail TEXT," "refdb_mediatype TEXT," "refdb_numvolumes TEXT," "refdb_edition TEXT," "refdb_computer TEXT," "refdb_conferencelocation TEXT," "refdb_registrynum TEXT," "refdb_classification TEXT," "refdb_section TEXT," "refdb_pamphletnum TEXT," "refdb_chapternum TEXT)", temporary, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(212)); return 212; } dbi_result_free(dbires); /* create the main table indexes */ snprintf(sql_command, sql_command_len, "CREATE INDEX i_%srefdb_pubyear ON t_%srefdb (refdb_pubyear)" , prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(212)); return 212; } dbi_result_free(dbires); snprintf(sql_command, sql_command_len, "CREATE UNIQUE INDEX i_%srefdb_citekey ON t_%srefdb (refdb_citekey)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(212)); return 212; } dbi_result_free(dbires); /* create the author table */ snprintf(sql_command, sql_command_len, "CREATE %sTABLE t_%sauthor (" "author_id INTEGER PRIMARY KEY," "author_name TEXT NOT NULL," "author_lastname TEXT," "author_firstname TEXT," "author_middlename TEXT," "author_suffix TEXT)", temporary, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(213)); return 213; } dbi_result_free(dbires); /* create t_author table index */ snprintf(sql_command, sql_command_len, "CREATE INDEX i_%sauthor_name ON t_%sauthor (author_name)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(213)); return 213; } dbi_result_free(dbires); /* create the keyword table */ snprintf(sql_command, sql_command_len, "CREATE %sTABLE t_%skeyword (" "keyword_id INTEGER PRIMARY KEY," "keyword_name TEXT NOT NULL)", temporary, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(214)); return 214; } dbi_result_free(dbires); /* create t_keyword table index */ snprintf(sql_command, sql_command_len, "CREATE INDEX i_%skeyword_name ON t_%skeyword (keyword_name)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(214)); return 214; } dbi_result_free(dbires); /* create the periodical table */ snprintf(sql_command, sql_command_len, "CREATE %sTABLE t_%speriodical (" "periodical_id INTEGER PRIMARY KEY," "periodical_name TEXT," "periodical_abbrev TEXT," "periodical_custabbrev1 TEXT," "periodical_custabbrev2 TEXT)", temporary, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(215)); return 215; } dbi_result_free(dbires); /* create t_periodical table indexes */ snprintf(sql_command, sql_command_len, "CREATE INDEX i_%speriodical_name ON t_%speriodical (periodical_name)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(215)); return 215; } dbi_result_free(dbires); snprintf(sql_command, sql_command_len, "CREATE INDEX i_%speriodical_abbrev ON t_%speriodical (periodical_abbrev)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(215)); return 215; } dbi_result_free(dbires); snprintf(sql_command, sql_command_len, "CREATE INDEX i_%speriodical_custabbrev1 ON t_%speriodical (periodical_custabbrev1)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(215)); return 215; } dbi_result_free(dbires); snprintf(sql_command, sql_command_len, "CREATE INDEX i_%speriodical_custabbrev2 ON t_%speriodical (periodical_custabbrev2)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(215)); return 215; } dbi_result_free(dbires); /* create the notes table */ snprintf(sql_command, sql_command_len, "CREATE %sTABLE t_%snote (" "note_id INTEGER PRIMARY KEY," "note_key TEXT UNIQUE," "note_title TEXT," "note_content_type TEXT," "note_content_xmllang TEXT," "note_user_id BIGINT," "note_date DATE," "note_share SMALLINT," "note_content TEXT)" , temporary, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(216)); return 216; } dbi_result_free(dbires); /* create t_note table indexes */ snprintf(sql_command, sql_command_len, "CREATE INDEX i_%snote_title ON t_%snote (note_title)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(216)); return 216; } dbi_result_free(dbires); snprintf(sql_command, sql_command_len, "CREATE INDEX i_%snote_note_userid ON t_%snote (note_user_id)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(216)); return 216; } dbi_result_free(dbires); snprintf(sql_command, sql_command_len, "CREATE INDEX i_%snote_date ON t_%snote (note_date)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(216)); return 216; } dbi_result_free(dbires); /* create the user table */ snprintf(sql_command, sql_command_len, "CREATE %sTABLE t_%suser (" "user_id INTEGER PRIMARY KEY," "user_name TEXT NOT NULL)", temporary, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(217)); return 217; } dbi_result_free(dbires); /* create t_user table index */ snprintf(sql_command, sql_command_len, "CREATE INDEX i_%suser_name ON t_%suser (user_name)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(217)); return 217; } dbi_result_free(dbires); /* create the link table */ snprintf(sql_command, sql_command_len, "CREATE %sTABLE t_%slink (" "link_id INTEGER PRIMARY KEY," "link_url TEXT NOT NULL)", temporary, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(257)); return 257; } dbi_result_free(dbires); /* create t_link table index */ snprintf(sql_command, sql_command_len, "CREATE INDEX i_%slink_url ON t_%slink (link_url)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(257)); return 257; } dbi_result_free(dbires); /* create the author xtable */ snprintf(sql_command, sql_command_len, "CREATE %sTABLE t_%sxauthor (" "xauthor_id INTEGER PRIMARY KEY," "author_id BIGINT NOT NULL," "refdb_id BIGINT NOT NULL," "xauthor_type SMALLINT DEFAULT 1," "xauthor_role TEXT," "xauthor_position INTEGER)", temporary, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(218)); return 218; } dbi_result_free(dbires); /* create t_xauthor table indexes */ snprintf(sql_command, sql_command_len, "CREATE INDEX i_%sxauthor_autid ON t_%sxauthor (author_id)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(218)); return 218; } dbi_result_free(dbires); snprintf(sql_command, sql_command_len, "CREATE INDEX i_%sxauthor_refid ON t_%sxauthor (refdb_id)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(218)); return 218; } dbi_result_free(dbires); /* create the keyword xtable */ snprintf(sql_command, sql_command_len, "CREATE %sTABLE t_%sxkeyword (" "xkeyword_id INTEGER PRIMARY KEY," "xkeyword_type TEXT," "keyword_id BIGINT NOT NULL," "xref_id BIGINT NOT NULL)", temporary, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(219)); return 219; } dbi_result_free(dbires); /* create t_xkeyword table indexes */ snprintf(sql_command, sql_command_len, "CREATE INDEX i_%sxkeyword_kwid ON t_%sxkeyword (keyword_id)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(219)); return 219; } dbi_result_free(dbires); snprintf(sql_command, sql_command_len, "CREATE INDEX i_%sxkeyword_xrefid ON t_%sxkeyword (xref_id)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(219)); return 219; } dbi_result_free(dbires); /* create the user xtable */ snprintf(sql_command, sql_command_len, "CREATE %sTABLE t_%sxuser (" "xuser_id INTEGER PRIMARY KEY," "user_id BIGINT NOT NULL," "refdb_id BIGINT NOT NULL," "xuser_reprint TEXT DEFAULT \'NOT IN FILE\'," "xuser_date DATE," "xuser_avail TEXT," "xuser_notes TEXT)", temporary, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(220)); return 220; } dbi_result_free(dbires); /* create t_xuser table indexes */ snprintf(sql_command, sql_command_len, "CREATE INDEX i_%sxuser_userid ON t_%sxuser (user_id)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(220)); return 220; } dbi_result_free(dbires); snprintf(sql_command, sql_command_len, "CREATE INDEX i_%sxuser_refid ON t_%sxuser (refdb_id)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(220)); return 220; } dbi_result_free(dbires); /* create the notes xtable */ snprintf(sql_command, sql_command_len, "CREATE %sTABLE t_%sxnote (" "xnote_id INTEGER PRIMARY KEY," "note_id BIGINT NOT NULL," "xref_id BIGINT NOT NULL," "xnote_type TEXT DEFAULT \'REFERENCE\')", temporary, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(221)); return 221; } dbi_result_free(dbires); /* create t_xnote table indexes */ snprintf(sql_command, sql_command_len, "CREATE INDEX i_%sxnote_noteid ON t_%sxnote (note_id)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(221)); return 221; } dbi_result_free(dbires); snprintf(sql_command, sql_command_len, "CREATE INDEX i_%sxnote_xrefid ON t_%sxnote (xref_id)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(221)); return 221; } dbi_result_free(dbires); snprintf(sql_command, sql_command_len, "CREATE INDEX i_%sxnote_xnotetype ON t_%sxnote (xnote_type)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(221)); return 221; } dbi_result_free(dbires); /* create the links xtable */ snprintf(sql_command, sql_command_len, "CREATE %sTABLE t_%sxlink (" "xlink_id INTEGER PRIMARY KEY," "link_id BIGINT NOT NULL," "xref_id BIGINT NOT NULL," "user_id BIGINT DEFAULT 0," "xlink_type TEXT DEFAULT \'URL\'," "xlink_source TEXT DEFAULT \'REFERENCE\')", temporary, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(258)); return 258; } dbi_result_free(dbires); /* create t_xlink table indexes */ snprintf(sql_command, sql_command_len, "CREATE INDEX i_%sxlink_linkid ON t_%sxlink (link_id)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(258)); return 258; } dbi_result_free(dbires); snprintf(sql_command, sql_command_len, "CREATE INDEX i_%sxlink_xrefid ON t_%sxlink (xref_id)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(258)); return 258; } dbi_result_free(dbires); snprintf(sql_command, sql_command_len, "CREATE INDEX i_%sxlink_xlinktype ON t_%sxlink (xlink_type)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(258)); return 258; } dbi_result_free(dbires); snprintf(sql_command, sql_command_len, "CREATE INDEX i_%sxlink_xlinksource ON t_%sxlink (xlink_source)", prefix, prefix); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_ERR, get_status_msg(258)); return 258; } dbi_result_free(dbires); free(sql_command); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ create_xdup_tables_sqlite3(): creates SQLite3-specific duplicate check tables int create_xdup_tables_sqlite3 returns >0 if error, 0 if successful dbi_conn conn database connection structure ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int create_xdup_tables_sqlite3(dbi_conn conn) { char* sql_command; size_t sql_command_len = 512; dbi_result dbires; /* get us some memory for the query strings */ if ((sql_command = malloc(sql_command_len)) == NULL) { return 801; } sprintf(sql_command, "CREATE TEMPORARY TABLE t_temp_xdup (" "xdup_id INTEGER PRIMARY KEY," "xdup_type VARCHAR(10)," "match_type VARCHAR(10)," "temp_refdb_id BIGINT," "refdb_id BIGINT," "value_name TEXT," "temp_value_name TEXT," "value_name_2 TEXT," "temp_value_name_2 TEXT," "value_name_3 TEXT," "temp_value_name_3 TEXT)"); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); free(sql_command); if (!dbires) { LOG_PRINT(LOG_ERR, get_status_msg(268)); return 268; } dbi_result_free(dbires); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ is_user_pgsql(): checks whether a user exists int is_user_pgsql returns 1 if the user exists, 0 if the user doesn't exist, -1 if an error occurs dbi_conn conn connection to the database to query const char* username ptr to string with the name of the user ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int is_user_pgsql(dbi_conn conn, const char* username) { char sql_command[256]; dbi_result dbires; /* The PostgreSQL system table pg_user contains a list of users */ sprintf(sql_command, "SELECT usename FROM pg_user WHERE usename=\'%s\'", username); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { return -1; } if (dbi_result_get_numrows(dbires)) { dbi_result_free(dbires); return 1; } else { dbi_result_free(dbires); return 0; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ is_group_pgsql(): checks whether a group exists int is_group_pgsql returns 1 if the group exists, 0 if the group doesn't exist, -1 if an error occurs dbi_conn conn connection to the database to query const char* dbname ptr to string with the name of the database related to the group int is_readonly if 1, checks for a read-only group. If 0, checks for a read/write group ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int is_group_pgsql(dbi_conn conn, const char* dbname, int is_readonly) { char sql_command[256]; dbi_result dbires; /* The PostgreSQL system table pg_group contains a list of groups */ if (!is_readonly) { sprintf(sql_command, "SELECT groname FROM pg_group WHERE groname=\'%suser\'", dbname); } else { sprintf(sql_command, "SELECT groname FROM pg_group WHERE groname=\'%sruser\'", dbname); } LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { return -1; } if (dbi_result_get_numrows(dbires)) { dbi_result_free(dbires); return 1; } else { dbi_result_free(dbires); return 0; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ create_temporary_tables(): creates temporary tables for checking refs int create_temporary tables returns >0 if error, 0 if successful dbi_conn conn database connection structure struct CLIENT_REQUEST* ptr_clrequest ptr to structure with client info ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int create_temporary_tables(dbi_conn conn, struct CLIENT_REQUEST* ptr_clrequest) { const char *drivername; drivername = dbi_driver_get_name(dbi_conn_get_driver(conn)); if (!strcmp(drivername, "mysql")) { return create_tables_mysql(conn, ptr_clrequest, 1 /* temporary */); } else if (!strcmp(drivername, "pgsql")) { return create_tables_pgsql(conn, ptr_clrequest, 1 /* temporary */); } if (!strcmp(drivername, "sqlite")) { return create_tables_sqlite(conn, ptr_clrequest, 1 /* temporary */); } if (!strcmp(drivername, "sqlite3")) { return create_tables_sqlite3(conn, ptr_clrequest, 1 /* temporary */); } else { return 1; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ my_dbi_conn_transaction(): deals with starting/ending transactions static int my_dbi_conn_transaction returns 0 if ok, 1 if error dbi_conn conn database connection int trans_type 0 is "BEGIN", 1 is "COMMIT", 2 is "ROLLBACK" ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int my_dbi_conn_transaction(dbi_conn conn, int trans_type) { const char *drivername; char sql_command[2][3][14] = { {"BEGIN WORK", "COMMIT WORK", "ROLLBACK WORK"}, {"BEGIN", "COMMIT", "ROLLBACK"} }; dbi_result dbires; drivername = dbi_driver_get_name(dbi_conn_get_driver(conn)); if (!strcmp(drivername, "pgsql")) { dbires = dbi_conn_query(conn, sql_command[0][trans_type]); LOG_PRINT(LOG_DEBUG, sql_command[0][trans_type]); if (!dbires) { return 1; } dbi_result_free(dbires); } else { /* SQLite and MySQL */ /* MySQL supports transactions only in transaction-safe tables (InnoDB, BDB) but the transaction-related commands do not cause errors in the other table types. Therefore it safe to use them anyway, even if they don't have the desired effect. The non-transaction-safe tables work in auto-commit mode, i.e. each command is committed immediately. Rollbacks do not have any effect in this case */ dbires = dbi_conn_query(conn, sql_command[1][trans_type]); LOG_PRINT(LOG_DEBUG, sql_command[1][trans_type]); if (!dbires) { return 1; } dbi_result_free(dbires); } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ my_dbi_conn_begin(): begin a transaction int my_dbi_conn_begin returns 0 if ok, 1 if error dbi_conn conn database connection ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int my_dbi_conn_begin(dbi_conn conn) { return my_dbi_conn_transaction(conn, 0); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ my_dbi_conn_commit(): commits a transaction int my_dbi_conn_commit returns 0 if ok, 1 if error dbi_conn conn database connection ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int my_dbi_conn_commit(dbi_conn conn) { return my_dbi_conn_transaction(conn, 1); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ my_dbi_conn_rollback(): ends a transaction and discards all changes int my_dbi_conn_rollback returns 0 if ok, 1 if error dbi_conn conn database connection ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int my_dbi_conn_rollback(dbi_conn conn) { return my_dbi_conn_transaction(conn, 2); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ my_dbi_conn_lock(): locks reference database tables int my_dbi_conn_lock returns 0 if ok, 1 if error dbi_conn conn database connection int replace_ref indicates the context of the operation 0 = add data 1 = replace data 2 = update personal data 3 = add to temporary tables ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int my_dbi_conn_lock(dbi_conn conn, int replace_ref) { const char *drivername; char prefix[] = TEMP_TABLE_NAME_PREFIX; dbi_result dbires; /* fix insert */ if (replace_ref != 3) { *prefix = '\0'; } drivername = dbi_driver_get_name(dbi_conn_get_driver(conn)); if (!strcmp(drivername, "mysql")) { char* sql_command; if ((sql_command = malloc(512)) == NULL) { return 1; } sprintf(sql_command, "LOCK TABLES t_%srefdb WRITE, t_%sauthor WRITE, t_%skeyword WRITE, t_%speriodical WRITE, t_%suser WRITE, t_%sxauthor WRITE, t_%sxkeyword WRITE, t_%sxuser WRITE, t_%snote WRITE, t_%sxnote WRITE, t_%slink WRITE, t_%sxlink WRITE, %s.t_journal_words WRITE", prefix, prefix, prefix, prefix, prefix, prefix, prefix, prefix, prefix, prefix, prefix, prefix, main_db); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); free(sql_command); if (!dbires) { return 1; } dbi_result_free(dbires); } else if (!strcmp(drivername, "pgsql")) { int i; char sql_command[64]; const char tables[12][13] = { "refdb", "author", "keyword", "periodical", "user", "xauthor", "xkeyword", "xuser", "note", "xnote", "link", "xlink" }; for (i = 0; i < 12; i++) { sprintf(sql_command, "LOCK TABLE t_%s%s IN SHARE MODE", prefix, tables[i]); dbires = dbi_conn_query(conn, sql_command); LOG_PRINT(LOG_DEBUG, sql_command); if (!dbires) { return 1; } dbi_result_free(dbires); } } /* else: sqlite does not support table locking */ return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ my_dbi_conn_lock_note(): locks notes database tables int my_dbi_conn_lock_note returns 0 if ok, 1 if error dbi_conn conn database connection ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int my_dbi_conn_lock_note(dbi_conn conn) { const char *drivername; dbi_result dbires; drivername = dbi_driver_get_name(dbi_conn_get_driver(conn)); if (!strcmp(drivername, "mysql")) { char* sql_command; if ((sql_command = malloc(256)) == NULL) { return 1; } strcpy(sql_command, "LOCK TABLES t_keyword WRITE, t_user WRITE, t_xkeyword WRITE, t_xuser WRITE, t_note WRITE, t_xnote WRITE, t_periodical WRITE, t_author WRITE, t_refdb WRITE, t_link WRITE, t_xlink WRITE"); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); free(sql_command); if (!dbires) { return 1; } dbi_result_free(dbires); } else if (!strcmp(drivername, "pgsql")) { int i; char sql_command[64]; const char tables[8][13] = { "t_keyword", "t_user", "t_xkeyword", "t_xuser", "t_note", "t_xnote", "t_link", "t_xlink" }; for (i = 0; i < 8; i++) { sprintf(sql_command, "LOCK TABLE %s IN SHARE MODE", tables[i]); dbires = dbi_conn_query(conn, sql_command); LOG_PRINT(LOG_DEBUG, sql_command); if (!dbires) { return 1; } dbi_result_free(dbires); } } /* else: sqlite does not support table locking */ return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ my_dbi_conn_unlock(): unlocks locked tables int my_dbi_conn_unlock returns 0 if ok, 1 if error dbi_conn conn database connection ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int my_dbi_conn_unlock(dbi_conn conn) { dbi_result dbires; const char *drivername; drivername = dbi_driver_get_name(dbi_conn_get_driver(conn)); if (!strcmp(drivername, "mysql")) { dbires = dbi_conn_query(conn, "UNLOCK TABLES"); LOG_PRINT(LOG_DEBUG, "UNLOCK TABLES"); if (!dbires) { return 1; } dbi_result_free(dbires); } /* else: pgsql unlocks when a transaction is finished, */ /* sqlite does not support lock/unlock */ return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ my_dbi_conn_get_cap(): returns a driver capability const char* my_dbi_conn_get_cap returns a capability string or NULL on error dbi_conn conn database connection const char* cap string containing the name of the requested capability ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ const char* my_dbi_conn_get_cap(dbi_conn conn, const char* cap) { dbi_driver driver; const char *drivername; driver = dbi_conn_get_driver(conn); drivername = dbi_driver_get_name(driver); /* check whether we already have the version-specific information */ if (!ptr_dbcaps->has_versioninfo) { set_cap_versioninfo(conn, drivername); } return my_dbi_driver_get_cap(driver, cap); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ my_dbi_driver_get_cap(): returns a driver capability const char* my_dbi_driver_get_cap returns a capability string or NULL on error dbi_driver database driver const char* cap string containing the name of the requested capability ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ const char* my_dbi_driver_get_cap(dbi_driver driver, const char* cap) { if (!strcmp(cap, "multiple_db")) { return ptr_dbcaps->multiple_db; } else if (!strcmp(cap, "enum")) { return ptr_dbcaps->sql_enum; } else if (!strcmp(cap, "rlike")) { return ptr_dbcaps->rlike; } else if (!strcmp(cap, "not_rlike")) { return ptr_dbcaps->not_rlike; } else if (!strcmp(cap, "transaction")) { return ptr_dbcaps->transaction; } else if (!strcmp(cap, "localhost")) { return ptr_dbcaps->localhost; } else if (!strcmp(cap, "encoding")) { return ptr_dbcaps->encoding; } else if (!strcmp(cap, "groups")) { return ptr_dbcaps->groups; } else if (!strcmp(cap, "admin_systable")) { return ptr_dbcaps->admin_systable; } else if (!strcmp(cap, "listall")) { return ptr_dbcaps->listall; } else if (!strcmp(cap, "bigint")) { return ptr_dbcaps->bigint; } else if (!strcmp(cap, "union")) { return ptr_dbcaps->sql_union; } else if (!strcmp(cap, "named_seq")) { return ptr_dbcaps->named_seq; } else if (!strcmp(cap, "charlength")) { return ptr_dbcaps->charlength; } else if (!strcmp(cap, "substring")) { return ptr_dbcaps->substring; } else if (!strcmp(cap, "substring_from")) { return ptr_dbcaps->substring_from; } else if (!strcmp(cap, "substring_for")) { return ptr_dbcaps->substring_for; } else if (!strcmp(cap, "except")) { return ptr_dbcaps->sql_except; } else { return ptr_dbcaps->defval; } /* unknown cap */ return NULL; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ my_dbi_result_get_idval(): returns an id value by field name. Takes care of the fact that some db servers do not support ulonglongs unsigned long long my_dbi_result_get_idval returns an id value dbi_result dbires result of a previous query const char* fieldname name of the field to retrieve ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ unsigned long long my_dbi_result_get_idval(dbi_result dbires, const char* fieldname) { dbi_conn conn; unsigned int the_uint; unsigned long long the_ulonglong; conn = dbi_result_get_conn(dbires); if (!strcmp(my_dbi_conn_get_cap(conn, "bigint"), "f")) { /* database server does not support long long ints, retrieve as long int instead and cast */ the_uint = dbi_result_get_uint(dbires, fieldname); /* sprintf(buffer, "ulong: u %u<< lu %lu<< llu %llu", the_ulong, the_ulong, the_ulong); */ /* LOG_PRINT(LOG_DEBUG, buffer); */ return (unsigned long long)the_uint; } else { the_ulonglong = dbi_result_get_ulonglong(dbires, fieldname); /* sprintf(buffer, "ulonglong: u %u<< lu %lu<< llu %llu", the_ulonglong, the_ulonglong, the_ulonglong); */ /* LOG_PRINT(LOG_DEBUG, buffer); */ return the_ulonglong; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ my_dbi_result_get_idval_idx(): returns an id value by index. Takes care of the fact that some db servers do not support ulonglongs unsigned long long my_dbi_result_get_idval_idx returns an id value dbi_result dbires result of a previous query unsigned int idx index of field to query ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ unsigned long long my_dbi_result_get_idval_idx(dbi_result dbires, unsigned int idx) { dbi_conn conn; conn = dbi_result_get_conn(dbires); if (!strcmp(my_dbi_conn_get_cap(conn, "bigint"), "f")) { /* database server does not support long long ints, retrieve as long int instead and cast */ return (unsigned long long)dbi_result_get_uint_idx(dbires, idx); } else { return dbi_result_get_ulonglong_idx(dbires, idx); } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ my_dbi_result_get_int_idval(): returns an id value (4-byte integer) by field name. unsigned int my_dbi_result_get_int_idval returns an id value dbi_result dbires result of a previous query const char* fieldname name of the field to retrieve ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ unsigned int my_dbi_result_get_int_idval(dbi_result dbires, const char* fieldname) { dbi_conn conn; unsigned int field_attrib; unsigned int the_uint; unsigned long long the_ulonglong; conn = dbi_result_get_conn(dbires); field_attrib = dbi_result_get_field_attrib(dbires, fieldname, DBI_INTEGER_SIZE4, DBI_INTEGER_SIZE4); /* printf("field_type went to %d\n", (int)field_type); */ if (field_attrib) { /* value is a 4-byte integer */ the_uint = dbi_result_get_uint(dbires, fieldname); /* sprintf(buffer, "ulong: u %u<< lu %lu<< llu %llu", the_ulong, the_ulong, the_ulong); */ /* LOG_PRINT(LOG_DEBUG, buffer); */ return the_uint; } else { /* value is an 8-byte integer. Cast to uint */ the_ulonglong = dbi_result_get_ulonglong(dbires, fieldname); /* sprintf(buffer, "ulonglong: u %u<< lu %lu<< llu %llu", the_ulonglong, the_ulonglong, the_ulonglong); */ /* LOG_PRINT(LOG_DEBUG, buffer); */ return (unsigned int)the_ulonglong; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ my_dbi_result_get_int_idval_idx(): returns an id value (4-byte integer) by index. unsigned int my_dbi_result_get_int_idval_idx returns an id value dbi_result dbires result of a previous query unsigned int idx index of the field to retrieve ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ unsigned int my_dbi_result_get_int_idval_idx(dbi_result dbires, unsigned int idx) { dbi_conn conn; unsigned int field_attrib; unsigned int the_uint; unsigned long long the_ulonglong; conn = dbi_result_get_conn(dbires); field_attrib = dbi_result_get_field_attrib_idx(dbires, idx, DBI_INTEGER_SIZE4, DBI_INTEGER_SIZE4); /* printf("field_type went to %d\n", (int)field_type); */ if (field_attrib) { /* value is a 4-byte integer */ the_uint = dbi_result_get_uint_idx(dbires, idx); /* sprintf(buffer, "ulong: u %u<< lu %lu<< llu %llu", the_ulong, the_ulong, the_ulong); */ /* LOG_PRINT(LOG_DEBUG, buffer); */ return the_uint; } else { /* value is an 8-byte integer. Cast to uint */ the_ulonglong = dbi_result_get_ulonglong_idx(dbires, idx); /* sprintf(buffer, "ulonglong: u %u<< lu %lu<< llu %llu", the_ulonglong, the_ulonglong, the_ulonglong); */ /* LOG_PRINT(LOG_DEBUG, buffer); */ return (unsigned int)the_ulonglong; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ my_dbi_conn_get_versioninfo(): retrieves the version info of a db engine int my_dbi_conn_get_versioninfo returns 0 if ok, 1 if error dbi_conn conn connection to a database engine struct VERSIONINFO* ptr_ver ptr to struct to receive version info ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int my_dbi_conn_get_versioninfo(dbi_conn conn, struct VERSIONINFO* ptr_ver) { char* versioninfo = NULL; char sql_command[] = "SELECT VERSION()"; dbi_result dbires; ptr_ver->major = 0; ptr_ver->minor = 0; ptr_ver->minuscule = 0; dbires = dbi_conn_query(conn, sql_command); LOG_PRINT(LOG_DEBUG, sql_command); if (dbires) { if (dbi_result_next_row(dbires)) { versioninfo = dbi_result_get_string_copy_idx(dbires, 1); /* 1-base index */ } dbi_result_free(dbires); } if (versioninfo) { if (parse_versioninfo(versioninfo, ptr_ver)) { return 1; } free(versioninfo); /* printf("major: %d minor: %d minuscule: %d\n", ver.major, ver.minor, ver.minuscule); */ } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ set_cap_versioninfo(): sets version-specific info in dbcaps structure static int set_cap_versioninfo returns 0 if ok, 1 if error dbi_conn conn connection to a database engine const char* drivername name of db driver ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int set_cap_versioninfo(dbi_conn conn, const char* drivername) { struct VERSIONINFO ver; /* try only once */ ptr_dbcaps->has_versioninfo = 1; if (my_dbi_conn_get_versioninfo(conn, &ver)) { return 1; } if (!strcmp(drivername, "mysql")) { if (ver.major >= 4) { /* 4.0 and later */ strcpy(ptr_dbcaps->sql_union, "t"); } if ((ver.major == 4 && ver.minor > 0) || ver.major > 4) { /* 4.1 and later */ strcpy(ptr_dbcaps->encoding, "CHARACTER SET"); } } /* else: nothing to do */ return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ my_dbi_initialize(): wrapper for libdbi 1.0 vs. pre-1.0 migration int my_dbi_initialize returns the number of drivers loaded, or -1 in case of an error const char *driverdir the path of the directory that contains the drivers, or NULL to use the compile-time default dbi_inst *pInst pointer to instance handle. Will be updated if the function is successful ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int my_dbi_initialize(const char *driverdir, dbi_inst *pInst) { #if !defined (LIBDBI_LIB_CURRENT) || LIBDBI_LIB_CURRENT < 2 return dbi_initialize(driverdir); #else return dbi_initialize_r(driverdir, pInst); #endif } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ my_dbi_shutdown(): wrapper for libdbi 1.0 vs. pre-1.0 migration void my_dbi_shutdown dbi_inst Inst instance handle ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ void my_dbi_shutdown(dbi_inst Inst) { #if !defined (LIBDBI_LIB_CURRENT) || LIBDBI_LIB_CURRENT < 2 dbi_shutdown(); #else dbi_shutdown_r(Inst); #endif } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ my_dbi_driver_list(): wrapper for libdbi 1.0 vs. pre-1.0 migration dbi_driver my_dbi_driver_list returns the next driver in the driver list, or NULL if no more are available dbi_driver Current the driver last retrieved with this function, or NULL to retrieve the first driver dbi_inst Inst instance handle ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ dbi_driver my_dbi_driver_list(dbi_driver Current, dbi_inst Inst) { #if !defined (LIBDBI_LIB_CURRENT) || LIBDBI_LIB_CURRENT < 2 return dbi_driver_list(Current); #else return dbi_driver_list_r(Current, Inst); #endif } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ my_dbi_conn_new(): wrapper for libdbi 1.0 vs. pre-1.0 migration dbi_conn my_dbi_conn_new returns a connection instance if successful, or NULL in case of an error const char *name name of the driver to use dbi_inst Inst instance handle ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ dbi_conn my_dbi_conn_new(const char *name, dbi_inst Inst) { #if !defined (LIBDBI_LIB_CURRENT) || LIBDBI_LIB_CURRENT < 2 return dbi_conn_new(name); #else return dbi_conn_new_r(name, Inst); #endif } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ my_dbi_conn_error_flag(): wrapper for libdbi 1.0 vs. pre-1.0 migration int my_dbi_conn_error_flag returns 0 if there was no error or a nonzero error code if the last operation of the connection failed dbi_conn Conn the connection ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int my_dbi_conn_error_flag(dbi_conn Conn) { #if !defined (LIBDBI_LIB_CURRENT) || LIBDBI_LIB_CURRENT < 2 return dbi_conn_error_flag(Conn); #else return dbi_conn_error(Conn, NULL); #endif } refdb-1.0.2/src/backend-risx.c000644 001750 001750 00000146101 12255427651 016763 0ustar00markusmarkus000000 000000 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ backend-risx.c defines the risx output backend of refdbd markus@mhoenicka.de 2003-03-25 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ #include #include /* for definitions of log message priorities */ #include #include #include "refdb.h" #include "linklist.h" #include "tokenize.h" #include "backend.h" #include "backend-risx.h" #include "strfncs.h" #include "refdbd.h" #include "cgi.h" #include "dbfncs.h" #include "risdb.h" #include "authorinfo.h" #include "xmlhelper.h" #include "connect.h" extern char refdblib[]; /* location of shareable files */ extern int n_log_level; /* numeric version of log_level */ /* forward declaration of local functions */ static char* add_authors_risx(char** ptr_buffer, size_t* ptr_buffer_len, dbi_conn conn, int type, struct renderinfo* ptr_rendinfo, int* nhave_buffer_data, struct xmlindent* ptr_indent, unsigned long long refcount); static char* add_pubinfo_risx(char** ptr_buffer, size_t* ptr_buffer_len, dbi_conn conn, struct renderinfo* ptr_rendinfo, int* ptr_nhave_buffer_data, struct xmlindent* ptr_indent); static char* add_pubdate_risx(char** ptr_buffer, size_t* ptr_buffer_len, dbi_conn conn, int type, struct renderinfo* ptr_rendinfo, int* ptr_nhave_buffer_data, struct xmlindent* ptr_indent); static char* add_reprint_risx(char** ptr_buffer, size_t* ptr_buffer_len, dbi_conn conn, struct renderinfo* ptr_rendinfo, char* username, int* ptr_nhave_buffer_data, struct xmlindent* ptr_indent); static int indent_notbelow_risx(const char* name); static int is_entry_risx(const char* name); /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ prepare_render_risx(): writes a header for the risx output of a query int prepare_render_risx returns 0 if successful, > 0 if failed struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int prepare_render_risx(struct renderinfo* ptr_rendinfo) { char* new_ref; char* header; char ns[PREFS_BUF_LEN+128]; if ((header = assemble_header(ptr_rendinfo)) == NULL) { return 801; } new_ref = mstrcpy(*(ptr_rendinfo->ptr_ref), header, ptr_rendinfo->ptr_ref_len); free(header); if (new_ref == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if (*(ptr_rendinfo->ptr_clrequest->namespace)) { sprintf(ns, "<%s:ris xmlns:%s=\"http://refdb.sourceforge.net/ns/risx\">\n", ptr_rendinfo->ptr_clrequest->namespace, ptr_rendinfo->ptr_clrequest->namespace); } else { strcpy(ns, "\n"); } new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), ns, ptr_rendinfo->ptr_ref_len, 0); if (new_ref == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } *(ptr_rendinfo->ptr_ref) = new_ref; return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ finish_render_risx(): writes a footer for the risx output of a query int finish_render_risx returns 0 if successful,>0 if failed struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int finish_render_risx(struct renderinfo* ptr_rendinfo) { char* new_ref; char ns[PREFS_BUF_LEN+32]; if (*(ptr_rendinfo->ptr_clrequest->namespace)) { sprintf(ns, "\n\n", ptr_rendinfo->ptr_clrequest->namespace); } else { strcpy(ns, "\n\n"); } new_ref = mstrcpy(*(ptr_rendinfo->ptr_ref), ns, ptr_rendinfo->ptr_ref_len); if (new_ref == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } *(ptr_rendinfo->ptr_ref) = new_ref; return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ render_risx() renders a RIS dataset for RISX export int render_risx returns 0 if successful, >0 if failed struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int render_risx(struct renderinfo* ptr_rendinfo) { int errcode; /* receives error code for periodical requests */ int nhave_buffer_data = 0; /* 1 if buffer contains real data */ size_t buffer_len; unsigned long long frequency; unsigned long long refcount; const char* item; const char* item1; char id[32] = ""; char type[7] = "JOUR"; char empty_string[1] = ""; char date_buffer[256]; char* new_ref; char* buffer; dbi_result dbires; dbi_conn conn; struct xmlindent xindent; /*initialize xindent */ initialize_xmlindent(&xindent, 2, indent_notbelow_risx, is_entry_risx); conn = dbi_result_get_conn(ptr_rendinfo->dbires); if (get_refdb_id(ptr_rendinfo->dbires, id) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(234)); return 234; } /* get reference count for later use */ refcount = get_reference_count(dbi_result_get_conn(ptr_rendinfo->dbires), NULL, 0 /* istemp */); /*----------------------------------------------------------------*/ /* start entry with type, id, and citekey attributes */ item = get_refdb_type(ptr_rendinfo->dbires); if (item && *item) { strncpy(type, item, 6); type[6] = '\0'; } item1 = get_refdb_citekey(ptr_rendinfo->dbires); if (print_elstart_x(ptr_rendinfo->ptr_ref, ptr_rendinfo->ptr_ref_len, "entry", "type", item, "id", id, "citekey", item1, NULL, NULL, NULL, NULL, 0, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { return 801; } /* get some memory for the part/publication/set stuff */ buffer_len = 4096; if ((buffer = malloc(buffer_len)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } *buffer = '\0'; /*----------------------------------------------------------------*/ /* the part apparatus (analytic) */ if (has_part_data(type)) { if (print_elstart_x(&buffer, &buffer_len, "part", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer); return 801; } /* part title */ item = get_refdb_title_copy(ptr_rendinfo->dbires); if (item != NULL) { if (print_element_x(item, &buffer, &buffer_len, "title", "type", "full", NULL, NULL, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer); free((char*)item); return 801; } free((char*)item); } else { if (print_element_x(empty_string, &buffer, &buffer_len, "title", "type", "full", NULL, NULL, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer); free((char*)item); return 801; } } nhave_buffer_data = 1; if (add_authors_risx(&buffer, &buffer_len, conn, 1 /* part authors */, ptr_rendinfo, &nhave_buffer_data, &xindent, refcount) == NULL) { free(buffer); return 801; } if (print_elend_x(&buffer, &buffer_len, "part", &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer); return 801; } if (nhave_buffer_data) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), buffer, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(buffer); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } } /*----------------------------------------------------------------*/ /* the publication apparatus (monographic) */ nhave_buffer_data = 0; *buffer = '\0'; if (print_elstart_x(&buffer, &buffer_len, "publication", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer); return 801; } if (has_periodical_data(type)) { int rel_frequency; char freqbuffer[64]; /*----------------------------------------------------------------*/ /* journal (full)*/ if ((item = get_periodical(conn, date_buffer, NULL, 0, &errcode, 0, my_dbi_result_get_idval(ptr_rendinfo->dbires, "refdb_id"), &frequency)) != NULL && *item) { rel_frequency = calculate_relative_frequency(frequency, refcount); snprintf(freqbuffer, 64, "%d", rel_frequency); nhave_buffer_data = 1; if (ptr_rendinfo->frequency) { if (print_element_x(item, &buffer, &buffer_len, "title", "type", "full", "relfreq", freqbuffer, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer); return 801; } } else { if (print_element_x(item, &buffer, &buffer_len, "title", "type", "full", NULL, NULL, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer); return 801; } } } /*----------------------------------------------------------------*/ /* journal (abbrev)*/ if ((item = get_periodical(conn, date_buffer, NULL, 3, &errcode, 0, my_dbi_result_get_idval(ptr_rendinfo->dbires, "refdb_id"), &frequency)) != NULL && *item) { rel_frequency = calculate_relative_frequency(frequency, refcount); snprintf(freqbuffer, 64, "%d", rel_frequency); nhave_buffer_data = 1; if (ptr_rendinfo->frequency) { if (print_element_x(item, &buffer, &buffer_len, "title", "type", "abbrev", "relfreq", freqbuffer, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer); return 801; } } else { if (print_element_x(item, &buffer, &buffer_len, "title", "type", "abbrev", NULL, NULL, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer); return 801; } } } /*----------------------------------------------------------------*/ /* journal (custabbrev1) */ if ((item = get_periodical(conn, date_buffer, NULL, 1, &errcode, 0, my_dbi_result_get_idval(ptr_rendinfo->dbires, "refdb_id"), &frequency)) != NULL && *item) { rel_frequency = calculate_relative_frequency(frequency, refcount); snprintf(freqbuffer, 64, "%d", rel_frequency); nhave_buffer_data = 1; if (ptr_rendinfo->frequency) { if (print_element_x(item, &buffer, &buffer_len, "title", "type", "user1", "relfreq", freqbuffer, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer); return 801; } } else { if (print_element_x(item, &buffer, &buffer_len, "title", "type", "user1", NULL, NULL, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer); return 801; } } } /*----------------------------------------------------------------*/ /* journal (custabbrev2)*/ if ((item = get_periodical(conn, date_buffer, NULL, 2, &errcode, 0, my_dbi_result_get_idval(ptr_rendinfo->dbires, "refdb_id"), &frequency)) != NULL && *item) { rel_frequency = calculate_relative_frequency(frequency, refcount); snprintf(freqbuffer, 64, "%d", rel_frequency); nhave_buffer_data = 1; if (ptr_rendinfo->frequency) { if (print_element_x(item, &buffer, &buffer_len, "title", "type", "user2", "relfreq", freqbuffer, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer); return 801; } } else { if (print_element_x(item, &buffer, &buffer_len, "title", "type", "user2", NULL, NULL, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer); return 801; } } } } /* end if has periodical data */ item = NULL; /* booktitle is self-explanatory except for CONF where it translates to the conference title which belongs to pubinfo */ if (strcmp(type, "CONF")) { item = get_refdb_booktitle_copy(ptr_rendinfo->dbires); if (item != NULL) { if (print_element_x(item, &buffer, &buffer_len, "title", "type", "full", NULL, NULL, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer); free((char*)item); return 801; } free((char*)item); } } if (add_authors_risx(&buffer, &buffer_len, conn, 2, ptr_rendinfo, &nhave_buffer_data, &xindent, refcount) == NULL) { free(buffer); return 801; } /* pubinfo stuff */ if (add_pubinfo_risx(&buffer, &buffer_len, conn, ptr_rendinfo, &nhave_buffer_data, &xindent) == NULL) { free(buffer); return 801; } if (print_elend_x(&buffer, &buffer_len, "publication", &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer); return 801; } if (nhave_buffer_data) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), buffer, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(buffer); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } /*----------------------------------------------------------------*/ /* the set apparatus (series) */ nhave_buffer_data = 0; *buffer = '\0'; if (print_elstart_x(&buffer, &buffer_len, "set", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer); return 801; } /* set title */ if ((item = get_refdb_title_series_copy(ptr_rendinfo->dbires)) != NULL) { nhave_buffer_data = 1; if (print_element_x(item, &buffer, &buffer_len, "title", "type", "full", NULL, NULL, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free((char*)item); return 801; } free((char*)item); } if (add_authors_risx(&buffer, &buffer_len, conn, 3, ptr_rendinfo, &nhave_buffer_data, &xindent, refcount) == NULL) { free(buffer); return 801; } if (print_elend_x(&buffer, &buffer_len, "set", &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer); return 801; } if (nhave_buffer_data) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), buffer, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(buffer); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } /* loop over all users */ dbires = request_users(conn, NULL, 0, my_dbi_result_get_idval(ptr_rendinfo->dbires, "refdb_id")); if (dbires == NULL) { return 234; } /* fetch users */ while ((item1 = get_user(dbires)) != NULL) { int i; /* libinfo */ nhave_buffer_data = 0; *buffer = '\0'; if (print_elstart_x(&buffer, &buffer_len, "libinfo", "user", item1, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer); clean_request(dbires); return 801; } /*----------------------------------------------------------------*/ /* notes */ /* current user is in ptr_rendinfo->username */ if ((item = get_notes_copy(ptr_rendinfo->dbires, (char*)item1)) != NULL) { nhave_buffer_data = 1; if (print_element_x(item, &buffer, &buffer_len, "notes", NULL, NULL, NULL, NULL, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer); free((char*)item); clean_request(dbires); return 801; } free((char*)item); } /* reprint stuff */ if (add_reprint_risx(&buffer, &buffer_len, conn, ptr_rendinfo, (char*)item1, &nhave_buffer_data, &xindent) == NULL) { free(buffer); return 801; } /* L1 through L4. libinfo links are owned by a particular user */ /* loop over all link types that may be owned by a user*/ for (i=1; i<5;i++) { char ulink_type[10]; dbi_result dbires; dbires = request_ulinks(conn, my_dbi_result_get_idval(ptr_rendinfo->dbires, "refdb_id"), 0 /* ref entry */, i /* link type */, 0 /* is_temp */, item1); if (dbires == NULL) { return 801; } while ((item = get_ulink(dbires)) != NULL) { if (i == 1) { strcpy(ulink_type, "pdf"); } else if (i == 2) { strcpy(ulink_type, "fulltext"); } else if (i == 3) { strcpy(ulink_type, "related"); } else if (i == 4) { strcpy(ulink_type, "image"); } if (print_element_x(item, &buffer, &buffer_len, "link", "type", ulink_type, NULL, NULL, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { clean_request(dbires); return 801; } } clean_request(dbires); } /* end for */ if (print_elend_x(&buffer, &buffer_len, "libinfo", &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer); return 801; } if (nhave_buffer_data) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), buffer, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(buffer); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } } /* end while */ clean_request(dbires); /* contents */ nhave_buffer_data = 0; *buffer = '\0'; if (print_elstart_x(&buffer, &buffer_len, "contents", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer); return 801; } /*----------------------------------------------------------------*/ /* abstract */ if ((item = get_refdb_abstract_copy(ptr_rendinfo->dbires)) != NULL) { nhave_buffer_data = 1; if (print_element_x(item, &buffer, &buffer_len, "abstract", NULL, NULL, NULL, NULL, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free((char*)item); free(buffer); return 801; } free((char*)item); } /*----------------------------------------------------------------*/ /* keywords */ dbires = request_keywords(conn, my_dbi_result_get_idval(ptr_rendinfo->dbires, "refdb_id"), 0, 0); if (dbires == NULL) { return 234; } /* fetch all keywords of this article */ while ((item = get_extended_keyword(dbires, 0 /* not temp */, &frequency)) != NULL) { int rel_frequency; char freqbuffer[64]; rel_frequency = calculate_relative_frequency(frequency, refcount); snprintf(freqbuffer, 64, "%d", rel_frequency); nhave_buffer_data = 1; if (ptr_rendinfo->frequency) { if (print_element_x(item, &buffer, &buffer_len, "keyword", "relfreq", freqbuffer, NULL, NULL, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer); clean_request(dbires); return 801; } } else { if (print_element_x(item, &buffer, &buffer_len, "keyword", NULL, NULL, NULL, NULL, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer); clean_request(dbires); return 801; } } } clean_request(dbires); if (print_elend_x(&buffer, &buffer_len, "contents", &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer); return 801; } if (nhave_buffer_data) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), buffer, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(buffer); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } free(buffer); /*----------------------------------------------------------------*/ /* The End */ if (print_elend_x(ptr_rendinfo->ptr_ref, ptr_rendinfo->ptr_ref_len, "entry", &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { return 801; } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ add_authors_risx() prints out risx authors static char* add_authors_risx returns ptr to the buffer if successful, NULL if failed char** ptr_buffer ptr to ptr to buffer that will receive the output size_t* ptr_buffer_len ptr to var holding size of *ptr_buffer dbi_conn conn connection to database int type 1=primary author, 2=editor, 3=series editor struct renderinfo* ptr_renderinfo ptr to struct with render information int* ptr_nhave_buffer_data ptr to var which will be set to non-zero if *ptr_buffer receives data struct xmlindent* ptr_indent ptr to struct with indent info unsigned long long refcount total number of refs in the database ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static char* add_authors_risx(char** ptr_buffer, size_t* ptr_buffer_len, dbi_conn conn, int type, struct renderinfo* ptr_rendinfo, int* ptr_nhave_buffer_data, struct xmlindent* ptr_indent, unsigned long long refcount) { unsigned long long frequency; dbi_result dbires; char* entitize_buf; const char* item; struct AUTHOR_INFO* ptr_ainfo; if ((ptr_ainfo = new_authorinfo()) == NULL) { return NULL; } dbires = request_authors(conn, type, NULL /* all roles */, NULL, 0, my_dbi_result_get_idval(ptr_rendinfo->dbires, "refdb_id")); if (dbires == NULL) { free_authorinfo(ptr_ainfo); return NULL; } /* fetch author parts */ while (get_extended_author_parts(dbires, ptr_ainfo, 0 /* not temp */, &frequency)) { int rel_frequency; char freqbuffer[64]; rel_frequency = calculate_relative_frequency(frequency, refcount); snprintf(freqbuffer, 64, "%d", rel_frequency); if (ptr_rendinfo->frequency) { if (print_elstart_x(ptr_buffer, ptr_buffer_len, "author", "role", ptr_ainfo->role, "relfreq", freqbuffer, NULL, NULL, NULL, NULL, NULL, NULL, 0, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { clean_request(dbires); free_authorinfo(ptr_ainfo); return NULL; } } else { if (print_elstart_x(ptr_buffer, ptr_buffer_len, "author", "role", ptr_ainfo->role, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { clean_request(dbires); free_authorinfo(ptr_ainfo); return NULL; } } /* see whether we've got parts or only one author string */ if (!*(ptr_ainfo->lastname) && !*(ptr_ainfo->firstname) && !*(ptr_ainfo->middlename) && !*(ptr_ainfo->suffix)) { if ((entitize_buf = mstrdup(ptr_ainfo->name)) == NULL) { clean_request(dbires); free_authorinfo(ptr_ainfo); return NULL; } if (sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { clean_request(dbires); free(entitize_buf); free_authorinfo(ptr_ainfo); return NULL; } if (print_element_x(entitize_buf, ptr_buffer, ptr_buffer_len, "name", NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { clean_request(dbires); free(entitize_buf); free_authorinfo(ptr_ainfo); return NULL; } free(entitize_buf); } else { /* if have nameparts */ if (*(ptr_ainfo->lastname)) { *ptr_nhave_buffer_data = 1; if ((entitize_buf = mstrdup(ptr_ainfo->lastname)) == NULL) { clean_request(dbires); free_authorinfo(ptr_ainfo); return NULL; } if (sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { free(entitize_buf); free_authorinfo(ptr_ainfo); return NULL; } if (print_element_x(entitize_buf, ptr_buffer, ptr_buffer_len, "lastname", NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { clean_request(dbires); free(entitize_buf); free_authorinfo(ptr_ainfo); return NULL; } free(entitize_buf); } if (*(ptr_ainfo->firstname)) { *ptr_nhave_buffer_data = 1; if ((entitize_buf = mstrdup(ptr_ainfo->firstname)) == NULL) { clean_request(dbires); free_authorinfo(ptr_ainfo); return NULL; } if (sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { free(entitize_buf); free_authorinfo(ptr_ainfo); return NULL; } if (print_element_x(entitize_buf, ptr_buffer, ptr_buffer_len, "firstname", NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { clean_request(dbires); free_authorinfo(ptr_ainfo); return NULL; } free(entitize_buf); } if (*(ptr_ainfo->middlename)) { *ptr_nhave_buffer_data = 1; for (item = strtok(ptr_ainfo->middlename, " "); item; item = strtok(NULL, " ")) { if ((entitize_buf = mstrdup((char*)item)) == NULL) { clean_request(dbires); free_authorinfo(ptr_ainfo); return NULL; } if (sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { free(entitize_buf); free_authorinfo(ptr_ainfo); return NULL; } if (print_element_x(entitize_buf, ptr_buffer, ptr_buffer_len, "middlename", NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { clean_request(dbires); free_authorinfo(ptr_ainfo); return NULL; } free(entitize_buf); } /* end while */ } if (*(ptr_ainfo->suffix)) { *ptr_nhave_buffer_data = 1; if ((entitize_buf = mstrdup(ptr_ainfo->suffix)) == NULL) { clean_request(dbires); free_authorinfo(ptr_ainfo); return NULL; } if (sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { free(entitize_buf); free_authorinfo(ptr_ainfo); return NULL; } if (print_element_x(entitize_buf, ptr_buffer, ptr_buffer_len, "suffix", NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { clean_request(dbires); free_authorinfo(ptr_ainfo); return NULL; } free(entitize_buf); } } if (print_elend_x(ptr_buffer, ptr_buffer_len, "author", ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { clean_request(dbires); free_authorinfo(ptr_ainfo); return NULL; } } /* end while */ clean_request(dbires); free_authorinfo(ptr_ainfo); return *ptr_buffer; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ add_pubinfo_risx() prints out risx pubinfo static char* add_pubinfo_risx returns ptr to the buffer if successful, NULL if failed char** ptr_buffer ptr to ptr to buffer that will receive the output size_t* ptr_buffer_len ptr to var holding size of *ptr_buffer dbi_conn conn connection to database struct renderinfo* ptr_renderinfo ptr to struct with render information int* ptr_nhave_buffer_data ptr to var which will be set to non-zero if *ptr_buffer receives data struct xmlindent* ptr_indent ptr to struct with indent info ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static char* add_pubinfo_risx(char** ptr_buffer, size_t* ptr_buffer_len, dbi_conn conn, struct renderinfo* ptr_rendinfo, int* ptr_nhave_buffer_data, struct xmlindent* ptr_indent) { char* buffer1; char* new_ref; const char* type; const char* item; size_t buffer1_len; int nhave_data = 0; int i; /* printf("in add_pubinfo_risx\n"); */ /* get some memory for the pubinfo stuff */ buffer1_len = 4096; if ((buffer1 = malloc(buffer1_len)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } *buffer1 = '\0'; if ((type = get_refdb_type(ptr_rendinfo->dbires)) == NULL) { free(buffer1); return NULL; } if (print_elstart_x(&buffer1, &buffer1_len, "pubinfo", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } if (add_pubdate_risx(&buffer1, &buffer1_len, conn, 1 /* primary */, ptr_rendinfo, &nhave_data, ptr_indent) == NULL) { free(buffer1); return NULL; } if (add_pubdate_risx(&buffer1, &buffer1_len, conn, 2 /* secondary */, ptr_rendinfo, &nhave_data, ptr_indent) == NULL) { free(buffer1); return NULL; } /*----------------------------------------------------------------*/ /* volume */ if ((item = get_refdb_volume(ptr_rendinfo->dbires)) != NULL) { nhave_data = 1; if (print_element_x(item, &buffer1, &buffer1_len, "volume", NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } } else { if ((item = get_refdb_edition(ptr_rendinfo->dbires)) != NULL && *item) { nhave_data = 1; if (print_element_x(item, &buffer1, &buffer1_len, "volume", NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } } } /*----------------------------------------------------------------*/ /* issue */ if ((item = get_refdb_issue(ptr_rendinfo->dbires)) != NULL) { nhave_data = 1; if (print_element_x(item, &buffer1, &buffer1_len, "issue", NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } } else if ((item = get_refdb_chapternum(ptr_rendinfo->dbires)) != NULL && *item) { nhave_data = 1; if (print_element_x(item, &buffer1, &buffer1_len, "issue", NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } } /*----------------------------------------------------------------*/ /* conference title */ if (!strcmp(type, "CONF")) { item = get_refdb_booktitle_copy(ptr_rendinfo->dbires); if (item != NULL) { if (print_element_x(item, &buffer1, &buffer1_len, "conftitle", NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); free((char*)item); return NULL; } free((char*)item); } } /*----------------------------------------------------------------*/ /* start page */ if ((item = get_refdb_startpage(ptr_rendinfo->dbires)) != NULL) { nhave_data = 1; if (print_element_x(item, &buffer1, &buffer1_len, "startpage", NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } } /*----------------------------------------------------------------*/ /* end page */ if ((item = get_refdb_endpage(ptr_rendinfo->dbires)) != NULL) { nhave_data = 1; if (print_element_x(item, &buffer1, &buffer1_len, "endpage", NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } } /*----------------------------------------------------------------*/ /* city */ if ((item = get_refdb_city(ptr_rendinfo->dbires)) != NULL) { nhave_data = 1; if (print_element_x(item, &buffer1, &buffer1_len, "city", NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } } /*----------------------------------------------------------------*/ /* publisher */ if ((item = get_refdb_publisher(ptr_rendinfo->dbires)) != NULL) { nhave_data = 1; if (print_element_x(item, &buffer1, &buffer1_len, "publisher", NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } } /*----------------------------------------------------------------*/ /* ISBN/ISSN */ if ((item = get_refdb_issn(ptr_rendinfo->dbires)) != NULL) { nhave_data = 1; if (print_element_x(item, &buffer1, &buffer1_len, "serial", NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } } /*----------------------------------------------------------------*/ /* address */ if ((item = get_refdb_address_copy(ptr_rendinfo->dbires)) != NULL) { nhave_data = 1; if (print_element_x(item, &buffer1, &buffer1_len, "address", NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free((char*)item); free(buffer1); return NULL; } free((char*)item); } /*----------------------------------------------------------------*/ /* user1 */ if ((item = get_refdb_user1(ptr_rendinfo->dbires)) != NULL) { nhave_data = 1; if (print_element_x(item, &buffer1, &buffer1_len, "userdef", "type", "1", NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } } /*----------------------------------------------------------------*/ /* user2 */ if ((item = get_refdb_user2(ptr_rendinfo->dbires)) != NULL) { nhave_data = 1; if (print_element_x(item, &buffer1, &buffer1_len, "userdef", "type", "2", NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } } /*----------------------------------------------------------------*/ /* user3 */ if ((item = get_refdb_user3(ptr_rendinfo->dbires)) != NULL) { nhave_data = 1; if (print_element_x(item, &buffer1, &buffer1_len, "userdef", "type", "3", NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } } /*----------------------------------------------------------------*/ /* user4 */ if ((item = get_refdb_user4(ptr_rendinfo->dbires)) != NULL) { nhave_data = 1; if (print_element_x(item, &buffer1, &buffer1_len, "userdef", "type", "4", NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } } /*----------------------------------------------------------------*/ /* user5 */ if ((item = get_refdb_user5(ptr_rendinfo->dbires)) != NULL) { nhave_data = 1; if (print_element_x(item, &buffer1, &buffer1_len, "userdef", "type", "5", NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } } /*----------------------------------------------------------------*/ /* misc fields */ if ((item = get_refdb_typeofwork(ptr_rendinfo->dbires)) != NULL && *item) { nhave_data = 1; if (!strcmp(type, "THES")) { if (print_element_x(item, &buffer1, &buffer1_len, "misc", "type", "2", NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } } else if (!strcmp(type, "PAT")) { if (print_element_x(item, &buffer1, &buffer1_len, "misc", "type", "3", NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } } else { if (print_element_x(item, &buffer1, &buffer1_len, "misc", "type", "1", NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } } } if ((item = get_refdb_area(ptr_rendinfo->dbires)) != NULL && *item) { nhave_data = 1; if (print_element_x(item, &buffer1, &buffer1_len, "misc", "type", "1", NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } } if ((item = get_refdb_ostype(ptr_rendinfo->dbires)) != NULL && *item) { nhave_data = 1; if (print_element_x(item, &buffer1, &buffer1_len, "misc", "type", "2", NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } } if ((item = get_refdb_degree(ptr_rendinfo->dbires)) != NULL && *item) { nhave_data = 1; if (print_element_x(item, &buffer1, &buffer1_len, "misc", "type", "1", NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } } if ((item = get_refdb_runningtime(ptr_rendinfo->dbires)) != NULL && *item) { nhave_data = 1; if (print_element_x(item, &buffer1, &buffer1_len, "misc", "type", "2", NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } } if ((item = get_refdb_classcodeintl(ptr_rendinfo->dbires)) != NULL && *item) { nhave_data = 1; if (print_element_x(item, &buffer1, &buffer1_len, "misc", "type", "1", NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } } if ((item = get_refdb_classcodeus(ptr_rendinfo->dbires)) != NULL && *item) { nhave_data = 1; if (print_element_x(item, &buffer1, &buffer1_len, "misc", "type", "2", NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } } if ((item = get_refdb_senderemail(ptr_rendinfo->dbires)) != NULL && *item) { nhave_data = 1; if (print_element_x(item, &buffer1, &buffer1_len, "misc", "type", "1", NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } } if ((item = get_refdb_recipientemail(ptr_rendinfo->dbires)) != NULL && *item) { nhave_data = 1; if (print_element_x(item, &buffer1, &buffer1_len, "misc", "type", "2", NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } } if ((item = get_refdb_mediatype(ptr_rendinfo->dbires)) != NULL && *item) { nhave_data = 1; if (!strcmp(type, "MAP")) { if (print_element_x(item, &buffer1, &buffer1_len, "misc", "type", "2", NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } } else if (!strcmp(type, "ELEC") || !strcmp(type, "JOUR")) { if (print_element_x(item, &buffer1, &buffer1_len, "misc", "type", "1", NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } } else { if (print_element_x(item, &buffer1, &buffer1_len, "misc", "type", "3", NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } } } if ((item = get_refdb_numvolumes(ptr_rendinfo->dbires)) != NULL && *item) { nhave_data = 1; if (print_element_x(item, &buffer1, &buffer1_len, "misc", "type", "1", NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } } if ((item = get_refdb_computer(ptr_rendinfo->dbires)) != NULL && *item) { nhave_data = 1; if (print_element_x(item, &buffer1, &buffer1_len, "misc", "type", "1", NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } } if ((item = get_refdb_conferencelocation(ptr_rendinfo->dbires)) != NULL && *item) { nhave_data = 1; if (print_element_x(item, &buffer1, &buffer1_len, "misc", "type", "2", NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } } if ((item = get_refdb_registrynum(ptr_rendinfo->dbires)) != NULL && *item) { nhave_data = 1; if (print_element_x(item, &buffer1, &buffer1_len, "misc", "type", "1", NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } } if ((item = get_refdb_classification(ptr_rendinfo->dbires)) != NULL && *item) { nhave_data = 1; if (print_element_x(item, &buffer1, &buffer1_len, "misc", "type", "1", NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } } if ((item = get_refdb_section(ptr_rendinfo->dbires)) != NULL && *item) { nhave_data = 1; if (print_element_x(item, &buffer1, &buffer1_len, "misc", "type", "2", NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } } if ((item = get_refdb_pamphletnum(ptr_rendinfo->dbires)) != NULL && *item) { nhave_data = 1; if (print_element_x(item, &buffer1, &buffer1_len, "misc", "type", "1", NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } } /*----------------------------------------------------------------*/ /* URL, L1 through L4. Pubinfo links are not owned by a particular user */ /* loop over all link types */ for (i=0; i<6;i++) { char ulink_type[10]; dbi_result dbires; dbires = request_ulinks(conn, my_dbi_result_get_idval(ptr_rendinfo->dbires, "refdb_id"), 0 /* ref entry */, i /* link type */, 0 /* is_temp */, "NULL"); if (dbires == NULL) { return NULL; } while ((item = get_ulink(dbires)) != NULL) { nhave_data = 1; if (i == 0) { strcpy(ulink_type, "url"); } else if (i == 1) { strcpy(ulink_type, "pdf"); } else if (i == 2) { strcpy(ulink_type, "fulltext"); } else if (i == 3) { strcpy(ulink_type, "related"); } else if (i == 4) { strcpy(ulink_type, "image"); } else if (i == 5) { strcpy(ulink_type, "doi"); } if (print_element_x(item, &buffer1, &buffer1_len, "link", "type", ulink_type, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { clean_request(dbires); return NULL; } } clean_request(dbires); } /* end for */ if (print_elend_x(&buffer1, &buffer1_len, "pubinfo", ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } if (nhave_data) { /* promote have_data upstream */ *ptr_nhave_buffer_data = 1; if ((new_ref = mstrcat(*ptr_buffer, buffer1, ptr_buffer_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(buffer1); return NULL; } else { *ptr_buffer = new_ref; } } free(buffer1); return *ptr_buffer; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ add_pubdate_risx() prints out risx pubdate static char* add_pubdate_risx returns ptr to the buffer if successful, NULL if failed char** ptr_buffer ptr to ptr to buffer that will receive the output size_t* ptr_buffer_len ptr to var holding size of *ptr_buffer dbi_conn conn connection to database int type 1=primary, 2=secondary struct renderinfo* ptr_renderinfo ptr to struct with render information int* ptr_nhave_buffer_data ptr to var which will be set to non-zero if *ptr_buffer receives data struct xmlindent* ptr_indent ptr to struct with indent info ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static char* add_pubdate_risx(char** ptr_buffer, size_t* ptr_buffer_len, dbi_conn conn, int type, struct renderinfo* ptr_rendinfo, int* ptr_nhave_buffer_data, struct xmlindent* ptr_indent) { char date_buffer[256] = ""; char* buffer1; char* new_ref; char* slash; const char* item; size_t buffer1_len; int nhave_data = 0; int nhave_year = 0; int nhave_other = 0; char* slashes[3] = {NULL, NULL, NULL}; /* only the first three slashes are relevant, if at all */ /* printf("in add_pubdate_risx\n"); */ /* get some memory for the pubinfo stuff */ buffer1_len = 4096; if ((buffer1 = malloc(buffer1_len)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } *buffer1 = '\0'; if (type == 1) { if (print_elstart_x(&buffer1, &buffer1_len, "pubdate", "type", "primary", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } item = get_refdb_pyother_info(ptr_rendinfo->dbires); } else { if (print_elstart_x(&buffer1, &buffer1_len, "pubdate", "type", "secondary", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } item = get_refdb_secother_info(ptr_rendinfo->dbires); } if (item && *item) { int i = 0; /* printf("item went to:%s<<\n", item); */ nhave_other++; slash = strchr(item, (int)'/'); /* fill the slashes array with up to three slashes. Only the first three may be relevant, as the others would be part of the otherinfo string */ while (slash != NULL && i < 3) { slashes[i] = slash; i++; if (*(slash+1)) { slash = strchr(slash+1, (int)'/'); } else { break; } } } /*----------------------------------------------------------------*/ /* pubyear */ if (type == 1) { if (get_refdb_pubyear(ptr_rendinfo->dbires, date_buffer) != NULL && strcmp(date_buffer, "nd")) { nhave_year = 1; } } else { if (get_refdb_secyear(ptr_rendinfo->dbires, date_buffer) != NULL && strcmp(date_buffer, "nd")) { nhave_year = 1; } } /* printf("date_buffer went to:%s<<\n", date_buffer); */ if (nhave_year || nhave_other) { /* printf("nhave_year=%d || nhave_other+%d went to TRUE\n", nhave_year, nhave_other); */ nhave_data++; if (print_elstart_x(&buffer1, &buffer1_len, "date", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } if (nhave_year) { if (print_element_x(date_buffer, &buffer1, &buffer1_len, "year", NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } } if (nhave_other) { /* parse "other" string */ if (slashes[0] && slashes[1] && slashes[1]-slashes[0] > 1) { /* have month */ *(slashes[1]) = '\0'; if (print_element_x(slashes[0]+1, &buffer1, &buffer1_len, "month", NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } } if (slashes[1] && ((slashes[2] && slashes[2]-slashes[1] > 1) || (!slashes[2] && *(slashes[1]+1) != '\0' && (*(slashes[1]+2) == '\0' || *(slashes[1]+3) == '\0')))) { /* have day */ if (slashes[2]) { *(slashes[2]) = '\0'; } if (print_element_x(slashes[1]+1, &buffer1, &buffer1_len, "day", NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } } if (! (slashes[2] && *(slashes[2]+1))) { nhave_other = 0; } } /* printf("finish pubyear\n"); */ if (print_elend_x(&buffer1, &buffer1_len, "date", ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } } /* printf("now I'm here\n"); */ /*----------------------------------------------------------------*/ /* pubyear - other information */ if (nhave_other) { nhave_data = 1; if (print_element_x(slashes[2]+1, &buffer1, &buffer1_len, "otherinfo", NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } } /* printf("finish pubyearother\n"); */ if (print_elend_x(&buffer1, &buffer1_len, "pubdate", ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } if (nhave_data) { if ((new_ref = mstrcat(*ptr_buffer, buffer1, ptr_buffer_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(buffer1); return NULL; } else { *ptr_buffer = new_ref; } } if (nhave_data) { (*ptr_nhave_buffer_data)++; } free(buffer1); return *ptr_buffer; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ add_reprint_risx() prints out risx reprint info static char* add_reprint_risx returns ptr to the buffer if successful, NULL if failed char** ptr_buffer ptr to ptr to buffer that will receive the output size_t* ptr_buffer_len ptr to var holding size of *ptr_buffer dbi_conn conn connection to database struct renderinfo* ptr_renderinfo ptr to struct with render information char* username name of user int* ptr_nhave_buffer_data ptr to var which will be set to non-zero if *ptr_buffer receives data struct xmlindent* ptr_indent ptr to struct with indent info ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static char* add_reprint_risx(char** ptr_buffer, size_t* ptr_buffer_len, dbi_conn conn, struct renderinfo* ptr_rendinfo, char* username, int* ptr_nhave_buffer_data, struct xmlindent* ptr_indent) { struct REPRINT reprint; char attribute[10]; size_t path_skip = 0; if (get_reprint(ptr_rendinfo->dbires, &reprint, username, 4) && reprint.reprint != NULL && *(reprint.reprint)) { *ptr_nhave_buffer_data = 1; if (!strcmp(reprint.reprint, "NOT IN FILE")) { strcpy(attribute, "NOTINFILE"); } else if (!strcmp(reprint.reprint, "ON REQUEST")) { strcpy(attribute, "ONREQUEST"); } else { strcpy(attribute, "INFILE"); } if (!strcmp(attribute, "ONREQUEST") && reprint.date != NULL) { char year[5]; char month[3]; char day[3]; strncpy(year, reprint.date, 4); year[4] = '\0'; strncpy(month, reprint.date+5, 2); month[2] = '\0'; strncpy(day, reprint.date+8, 2); day[2] = '\0'; if (print_elstart_x(ptr_buffer, ptr_buffer_len, "reprint", "status", attribute, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { return NULL; } if (print_elstart_x(ptr_buffer, ptr_buffer_len, "date", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { return NULL; } if (print_element_x(year, ptr_buffer, ptr_buffer_len, "year", NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { return NULL; } if (print_element_x(month, ptr_buffer, ptr_buffer_len, "month", NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { return NULL; } if (print_element_x(day, ptr_buffer, ptr_buffer_len, "day", NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { return NULL; } if (print_elend_x(ptr_buffer, ptr_buffer_len, "date", ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { return NULL; } if (print_elend_x(ptr_buffer, ptr_buffer_len, "reprint", ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { return NULL; } } else { if (print_element_x("", ptr_buffer, ptr_buffer_len, "reprint", "status", attribute, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { return NULL; } } } if (reprint.avail != NULL && *(reprint.avail)) { if (!strncmp(reprint.avail, "PATH:", 5)) { strcpy(attribute, "useroot"); path_skip = 5; } else { strcpy(attribute, "full"); } if (print_element_x(reprint.avail+path_skip, ptr_buffer, ptr_buffer_len, "availability", "type", attribute, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { return NULL; } } return *ptr_buffer; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ indent_notbelow_risx(): checks whether or not to indent below the current element static int indent_notbelow returns 1 if not to indent, 0 if to indent const char* name ptr to element name ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int indent_notbelow_risx(const char* name) { if (!strcmp(name, "date")) { return 1; } else { return 0; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ is_entry_risx(): checks whether an element starts a new entry static int is_entry_risx returns 1 if entry starts, 0 if not const char* name ptr to element name ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int is_entry_risx(const char* name) { if (!strcmp(name, "entry")) { return 1; } else { return 0; } } refdb-1.0.2/src/backend-mods.c000644 001750 001750 00000135143 12255427651 016744 0ustar00markusmarkus000000 000000 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ backend-mods.c defines the MODS output backend of refdbd markus@mhoenicka.de 2007-03-13 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ #include #include /* for definitions of log message priorities */ #include #include #include "refdb.h" #include "linklist.h" #include "tokenize.h" #include "backend.h" #include "backend-mods.h" #include "strfncs.h" #include "refdbd.h" #include "dbfncs.h" #include "risdb.h" #include "authorinfo.h" #include "xmlhelper.h" #include "connect.h" extern char refdblib[]; /* location of shareable files */ extern int n_log_level; /* numeric version of log_level */ /* forward declaration of local functions */ static char* add_authors_mods(char** ptr_buffer, size_t* ptr_buffer_len, dbi_conn conn, int type, struct renderinfo* ptr_rendinfo, int* nhave_buffer_data, struct xmlindent* ptr_indent); static char* add_type_mods(char* ristype, char** ptr_buffer, size_t* ptr_buffer_len, dbi_conn conn, struct renderinfo* ptr_rendinfo, int* nhave_buffer_data, struct xmlindent* ptr_indent); static char* add_origininfo_mods(char* ristype, int level, char** ptr_buffer, size_t* ptr_buffer_len, dbi_conn conn, struct renderinfo* ptr_rendinfo, int* ptr_nhave_buffer_data, struct xmlindent* ptr_indent); static char* add_partinfo_mods(char** ptr_buffer, size_t* ptr_buffer_len, dbi_conn conn, struct renderinfo* ptr_rendinfo, int* ptr_nhave_buffer_data, struct xmlindent* ptr_indent); static char* add_location_mods(char** ptr_buffer, size_t* ptr_buffer_len, dbi_conn conn, struct renderinfo* ptr_rendinfo, int* ptr_nhave_buffer_data, struct xmlindent* ptr_indent); static char* add_pubdate_mods(char** ptr_buffer, size_t* ptr_buffer_len, dbi_conn conn, int type, struct renderinfo* ptr_rendinfo, int* ptr_nhave_buffer_data, struct xmlindent* ptr_indent); static char* add_reprint_mods(char** ptr_buffer, size_t* ptr_buffer_len, dbi_conn conn, struct renderinfo* ptr_rendinfo, char* username, int* ptr_nhave_buffer_data, struct xmlindent* ptr_indent); static int indent_notbelow_mods(const char* name); static int is_entry_mods(const char* name); /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ prepare_render_mods(): writes a header for the mods output of a query int prepare_render_mods returns 0 if successful, > 0 if failed struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int prepare_render_mods(struct renderinfo* ptr_rendinfo) { char* new_ref; char* header; char ns[PREFS_BUF_LEN+128]; if ((header = assemble_header(ptr_rendinfo)) == NULL) { return 801; } new_ref = mstrcpy(*(ptr_rendinfo->ptr_ref), header, ptr_rendinfo->ptr_ref_len); free(header); if (new_ref == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if (*(ptr_rendinfo->ptr_clrequest->namespace)) { sprintf(ns, "<%s:modsCollection xmlns:%s=\"http://www.loc.gov/mods/v3\">\n", ptr_rendinfo->ptr_clrequest->namespace, ptr_rendinfo->ptr_clrequest->namespace); } else { strcpy(ns, "\n"); } new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), ns, ptr_rendinfo->ptr_ref_len, 0); if (new_ref == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } *(ptr_rendinfo->ptr_ref) = new_ref; return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ finish_render_mods(): writes a footer for the mods output of a query int finish_render_mods returns 0 if successful,>0 if failed struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int finish_render_mods(struct renderinfo* ptr_rendinfo) { char* new_ref; char ns[PREFS_BUF_LEN+32]; if (*(ptr_rendinfo->ptr_clrequest->namespace)) { sprintf(ns, "\n\n", ptr_rendinfo->ptr_clrequest->namespace); } else { strcpy(ns, "\n\n"); } new_ref = mstrcpy(*(ptr_rendinfo->ptr_ref), ns, ptr_rendinfo->ptr_ref_len); if (new_ref == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } *(ptr_rendinfo->ptr_ref) = new_ref; return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ render_mods() renders a RIS dataset for MODS export int render_mods returns 0 if successful, >0 if failed struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int render_mods(struct renderinfo* ptr_rendinfo) { int errcode; /* receives error code for periodical requests */ int nhave_buffer_data = 0; /* 1 if buffer contains real data */ int nhave_analytic = 0; /* 1 if reference has analytical data */ size_t buffer_len; const char* item; const char* item1; char id[32] = ""; char type[7] = "JOUR"; char empty_string[1] = ""; char date_buffer[256]; char* new_ref; char* buffer; dbi_result dbires = NULL; dbi_conn conn; struct xmlindent xindent; /*initialize xindent */ initialize_xmlindent(&xindent, 2, indent_notbelow_mods, is_entry_mods); conn = dbi_result_get_conn(ptr_rendinfo->dbires); if (get_refdb_id(ptr_rendinfo->dbires, id) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(234)); return 234; } /*----------------------------------------------------------------*/ /* start mods entry with the citekey attribute */ item = get_refdb_type(ptr_rendinfo->dbires); if (item && *item) { strncpy(type, item, 6); type[6] = '\0'; } item1 = get_refdb_citekey(ptr_rendinfo->dbires); if (print_elstart_x(ptr_rendinfo->ptr_ref, ptr_rendinfo->ptr_ref_len, "mods", "ID", item1, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { return 801; } /* add the RIS type for debugging purposes */ sprintf(date_buffer, "\n", type); if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), date_buffer, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(buffer); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } /* get some memory for the part/publication/set stuff */ buffer_len = 4096; if ((buffer = malloc(buffer_len)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } *buffer = '\0'; /*----------------------------------------------------------------*/ /* the part apparatus (analytic) */ /* only these types are supposed to have analytic information */ if (has_part_data(type)) { /* part title */ item = get_refdb_title_copy(ptr_rendinfo->dbires); if (item != NULL) { if (print_elstart_x(&buffer, &buffer_len, "titleInfo", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer); return 801; } if (print_element_x(item, &buffer, &buffer_len, "title", NULL, NULL, NULL, NULL, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer); free((char*)item); return 801; } free((char*)item); } else { if (print_element_x(empty_string, &buffer, &buffer_len, "title", NULL, NULL, NULL, NULL, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer); free((char*)item); return 801; } } if (print_elend_x(&buffer, &buffer_len, "titleInfo", &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer); return 801; } nhave_buffer_data = 1; if (add_authors_mods(&buffer, &buffer_len, conn, 1 /* part */, ptr_rendinfo, &nhave_buffer_data, &xindent) == NULL) { free(buffer); return 801; } /* type */ if (add_type_mods(type, &buffer, &buffer_len, conn, ptr_rendinfo, &nhave_buffer_data, &xindent) == NULL) { free(buffer); return 801; } if (add_origininfo_mods(type, 0 /* monographic */, &buffer, &buffer_len, conn, ptr_rendinfo, &nhave_buffer_data, &xindent) == NULL) { free(buffer); return 801; } /* write out part info */ if (nhave_buffer_data) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), buffer, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(buffer); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } nhave_analytic++; } /*----------------------------------------------------------------*/ /* the publication apparatus (monographic) */ nhave_buffer_data = 0; *buffer = '\0'; if (nhave_analytic) { if (print_elstart_x(&buffer, &buffer_len, "relatedItem", "type", "host", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer); return 801; } } if (has_periodical_data(type)) { /*----------------------------------------------------------------*/ /* journal (full)*/ if ((item = get_periodical(conn, date_buffer, NULL, 0, &errcode, 0, my_dbi_result_get_idval(ptr_rendinfo->dbires, "refdb_id"), NULL /* no frequency required */)) != NULL && *item) { nhave_buffer_data = 1; if (print_elstart_x(&buffer, &buffer_len, "titleInfo", "type", "uniform", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer); return 801; } if (print_element_x(item, &buffer, &buffer_len, "title", NULL, NULL, NULL, NULL, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer); return 801; } if (print_elend_x(&buffer, &buffer_len, "titleInfo", &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer); return 801; } } /*----------------------------------------------------------------*/ /* journal (abbrev)*/ if ((item = get_periodical(conn, date_buffer, NULL, 3, &errcode, 0, my_dbi_result_get_idval(ptr_rendinfo->dbires, "refdb_id"), NULL /* no frequency required */)) != NULL && *item) { nhave_buffer_data = 1; if (print_elstart_x(&buffer, &buffer_len, "titleInfo", "type", "abbreviated", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer); return 801; } if (print_element_x(item, &buffer, &buffer_len, "title", NULL, NULL, NULL, NULL, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer); return 801; } if (print_elend_x(&buffer, &buffer_len, "titleInfo", &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer); return 801; } } } item = get_refdb_booktitle_copy(ptr_rendinfo->dbires); if (item != NULL) { if (print_elstart_x(&buffer, &buffer_len, "titleInfo", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer); return 801; } if (print_element_x(item, &buffer, &buffer_len, "title", NULL, NULL, NULL, NULL, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer); free((char*)item); return 801; } free((char*)item); if (print_elend_x(&buffer, &buffer_len, "titleInfo", &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer); return 801; } } if (add_authors_mods(&buffer, &buffer_len, conn, 2 /* publication */, ptr_rendinfo, &nhave_buffer_data, &xindent) == NULL) { free(buffer); return 801; } if (add_origininfo_mods(type, 1 /* monographic */, &buffer, &buffer_len, conn, ptr_rendinfo, &nhave_buffer_data, &xindent) == NULL) { free(buffer); return 801; } if (add_partinfo_mods(&buffer, &buffer_len, conn, ptr_rendinfo, &nhave_buffer_data, &xindent) == NULL) { free(buffer); return 801; } if (nhave_buffer_data) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), buffer, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(buffer); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } /*----------------------------------------------------------------*/ /* the set apparatus (series) */ nhave_buffer_data = 0; *buffer = '\0'; if (print_elstart_x(&buffer, &buffer_len, "relatedItem", "type", "host", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer); return 801; } /* set title */ if ((item = get_refdb_title_series_copy(ptr_rendinfo->dbires)) != NULL) { nhave_buffer_data = 1; if (print_elstart_x(&buffer, &buffer_len, "titleInfo", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer); return 801; } if (print_element_x(item, &buffer, &buffer_len, "title", NULL, NULL, NULL, NULL, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free((char*)item); return 801; } free((char*)item); if (print_elend_x(&buffer, &buffer_len, "titleInfo", &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer); return 801; } } if (add_authors_mods(&buffer, &buffer_len, conn, 3 /* set */, ptr_rendinfo, &nhave_buffer_data, &xindent) == NULL) { free(buffer); return 801; } if (print_elend_x(&buffer, &buffer_len, "relatedItem", &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer); return 801; } if (nhave_buffer_data) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), buffer, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(buffer); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } nhave_buffer_data = 0; *buffer = '\0'; if (nhave_analytic) { if (print_elend_x(&buffer, &buffer_len, "relatedItem", &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer); return 801; } nhave_buffer_data = 1; } /*----------------------------------------------------------------*/ /* ISBN/ISSN */ if ((item = get_refdb_issn(ptr_rendinfo->dbires)) != NULL) { nhave_buffer_data = 1; if (has_periodical_data(type)) { if (print_element_x(item, &buffer, &buffer_len, "identifier", "type", "issn", NULL, NULL, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer); return 801; } } else { if (print_element_x(item, &buffer, &buffer_len, "identifier", "type", "isbn", NULL, NULL, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer); return 801; } } } if (add_location_mods(&buffer, &buffer_len, conn, ptr_rendinfo, &nhave_buffer_data, &xindent) == NULL) { free(buffer); return 801; } if (nhave_buffer_data) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), buffer, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(buffer); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } nhave_buffer_data = 0; *buffer = '\0'; /*----------------------------------------------------------------*/ /* abstract */ if ((item = get_refdb_abstract_copy(ptr_rendinfo->dbires)) != NULL) { nhave_buffer_data = 1; if (print_element_x(item, &buffer, &buffer_len, "abstract", NULL, NULL, NULL, NULL, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free((char*)item); free(buffer); return 801; } free((char*)item); } /*----------------------------------------------------------------*/ /* notes */ if ((item = get_notes_copy(ptr_rendinfo->dbires, ptr_rendinfo->username)) != NULL) { nhave_buffer_data = 1; if (print_element_x(item, &buffer, &buffer_len, "notes", NULL, NULL, NULL, NULL, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer); free((char*)item); clean_request(dbires); return 801; } free((char*)item); } /*----------------------------------------------------------------*/ /* keywords */ dbires = request_keywords(conn, my_dbi_result_get_idval(ptr_rendinfo->dbires, "refdb_id"), 0, 0); if (dbires == NULL) { return 234; } while ((item = get_keyword(dbires)) != NULL) { nhave_buffer_data = 1; if (print_elstart_x(&buffer, &buffer_len, "subject", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer); return 801; } if (print_element_x(item, &buffer, &buffer_len, "topic", NULL, NULL, NULL, NULL, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer); clean_request(dbires); return 801; } if (print_elend_x(&buffer, &buffer_len, "subject", &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer); return 801; } } clean_request(dbires); if (nhave_buffer_data) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), buffer, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(buffer); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } free(buffer); /*----------------------------------------------------------------*/ /* The End */ if (print_elend_x(ptr_rendinfo->ptr_ref, ptr_rendinfo->ptr_ref_len, "mods", &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { return 801; } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ add_authors_mods() prints out mods authors static char* add_authors_mods returns ptr to the buffer if successful, NULL if failed char** ptr_buffer ptr to ptr to buffer that will receive the output size_t* ptr_buffer_len ptr to var holding size of *ptr_buffer dbi_conn conn connection to database int type 1=part author, 2=publication author, 3=series editor struct renderinfo* ptr_renderinfo ptr to struct with render information int* ptr_nhave_buffer_data ptr to var which will be set to non-zero if *ptr_buffer receives data struct xmlindent* ptr_indent ptr to struct with indent info ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static char* add_authors_mods(char** ptr_buffer, size_t* ptr_buffer_len, dbi_conn conn, int type, struct renderinfo* ptr_rendinfo, int* ptr_nhave_buffer_data, struct xmlindent* ptr_indent) { dbi_result dbires; char* entitize_buf; struct AUTHOR_INFO* ptr_ainfo; if ((ptr_ainfo = new_authorinfo()) == NULL) { return NULL; } dbires = request_authors(conn, type, NULL /* all roles */, NULL, 0, my_dbi_result_get_idval(ptr_rendinfo->dbires, "refdb_id")); if (dbires == NULL) { free_authorinfo(ptr_ainfo); return NULL; } /* fetch author parts */ while (get_author_parts(dbires, ptr_ainfo)) { char nametype[11]; /* enough to hold 'conference' */ if (!*(ptr_ainfo->lastname) && !*(ptr_ainfo->firstname) && !*(ptr_ainfo->middlename) && !*(ptr_ainfo->suffix)) { strcpy(nametype, "corporate"); } else { strcpy(nametype, "personal"); } if (print_elstart_x(ptr_buffer, ptr_buffer_len, "name", "type", nametype, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { clean_request(dbires); free_authorinfo(ptr_ainfo); return NULL; } /* see whether we've got parts or only one author string */ if (!*(ptr_ainfo->lastname) && !*(ptr_ainfo->firstname) && !*(ptr_ainfo->middlename) && !*(ptr_ainfo->suffix)) { if ((entitize_buf = mstrdup(ptr_ainfo->name)) == NULL) { clean_request(dbires); free_authorinfo(ptr_ainfo); return NULL; } if (sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { clean_request(dbires); free(entitize_buf); free_authorinfo(ptr_ainfo); return NULL; } if (print_element_x(entitize_buf, ptr_buffer, ptr_buffer_len, "namePart", NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { clean_request(dbires); free(entitize_buf); free_authorinfo(ptr_ainfo); return NULL; } free(entitize_buf); } else { /* if have nameparts */ if (*(ptr_ainfo->lastname)) { *ptr_nhave_buffer_data = 1; if ((entitize_buf = mstrdup(ptr_ainfo->lastname)) == NULL) { clean_request(dbires); free_authorinfo(ptr_ainfo); return NULL; } if (sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { free(entitize_buf); free_authorinfo(ptr_ainfo); return NULL; } if (print_element_x(entitize_buf, ptr_buffer, ptr_buffer_len, "namePart", "type", "family", NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { clean_request(dbires); free(entitize_buf); free_authorinfo(ptr_ainfo); return NULL; } free(entitize_buf); } if (*(ptr_ainfo->firstname)) { char full_firstname[514]; /* some extra for space and \0 */ if (*(ptr_ainfo->middlename)) { snprintf(full_firstname, 514, "%s %s", ptr_ainfo->firstname, ptr_ainfo->middlename); } else { strncpy(full_firstname, ptr_ainfo->firstname, 514); } *ptr_nhave_buffer_data = 1; if ((entitize_buf = mstrdup(full_firstname)) == NULL) { clean_request(dbires); free_authorinfo(ptr_ainfo); return NULL; } if (sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { free(entitize_buf); free_authorinfo(ptr_ainfo); return NULL; } /* MODS does not distinguish between first and middle names. We have to add all middle names to the firstname */ if (print_element_x(entitize_buf, ptr_buffer, ptr_buffer_len, "namePart", "type", "given", NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { clean_request(dbires); free_authorinfo(ptr_ainfo); return NULL; } free(entitize_buf); } /* if (*(ptr_ainfo->suffix)) { */ /* *ptr_nhave_buffer_data = 1; */ /* if ((entitize_buf = mstrdup(ptr_ainfo->suffix)) == NULL) { */ /* clean_request(dbires); */ /* free_authorinfo(ptr_ainfo); */ /* return NULL; */ /* } */ /* if (sgml_entitize(&entitize_buf, NULL) == NULL) { */ /* free(entitize_buf); */ /* free_authorinfo(ptr_ainfo); */ /* return NULL; */ /* } */ /* if (print_element_x(entitize_buf, ptr_buffer, ptr_buffer_len, "suffix", NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { */ /* clean_request(dbires); */ /* free_authorinfo(ptr_ainfo); */ /* return NULL; */ /* } */ /* free(entitize_buf); */ /* } */ } /* author role */ if (print_elstart_x(ptr_buffer, ptr_buffer_len, "role", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { clean_request(dbires); free_authorinfo(ptr_ainfo); return NULL; } if (*(ptr_ainfo->role)) { if ((entitize_buf = mstrdup(ptr_ainfo->role)) == NULL) { clean_request(dbires); free_authorinfo(ptr_ainfo); return NULL; } if (sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { free(entitize_buf); free_authorinfo(ptr_ainfo); return NULL; } } else { switch (type) { case 1: entitize_buf = strdup("author"); break; case 2: entitize_buf = strdup("editor"); break; case 3: entitize_buf = strdup("series editor"); break; } } if (print_element_x(entitize_buf, ptr_buffer, ptr_buffer_len, "roleTerm", "type", "text", NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { clean_request(dbires); free_authorinfo(ptr_ainfo); free(entitize_buf); return NULL; } free(entitize_buf); if (print_elend_x(ptr_buffer, ptr_buffer_len, "role", ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { clean_request(dbires); free_authorinfo(ptr_ainfo); return NULL; } if (print_elend_x(ptr_buffer, ptr_buffer_len, "name", ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { clean_request(dbires); free_authorinfo(ptr_ainfo); return NULL; } } /* end while */ clean_request(dbires); free_authorinfo(ptr_ainfo); return *ptr_buffer; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ add_type_mods() prints out mods resource type static char* add_authors_mods returns ptr to the buffer if successful, NULL if failed char* ristype ptr to RIS type char** ptr_buffer ptr to ptr to buffer that will receive the output size_t* ptr_buffer_len ptr to var holding size of *ptr_buffer dbi_conn conn connection to database struct renderinfo* ptr_renderinfo ptr to struct with render information int* ptr_nhave_buffer_data ptr to var which will be set to non-zero if *ptr_buffer receives data struct xmlindent* ptr_indent ptr to struct with indent info ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static char* add_type_mods(char* ristype, char** ptr_buffer, size_t* ptr_buffer_len, dbi_conn conn, struct renderinfo* ptr_rendinfo, int* ptr_nhave_buffer_data, struct xmlindent* ptr_indent) { char buf[25]; if (!strcmp(ristype, "SOUND")) { strcpy(buf, "sound recording"); } else if (!strcmp(ristype, "VIDEO") || !strcmp(ristype, "MPCT")) { strcpy(buf, "moving image"); } else if (!strcmp(ristype, "SLIDE")) { strcpy(buf, "still image"); } else if (!strcmp(ristype, "ART")) { strcpy(buf, "three dimensional object"); } else if (!strcmp(ristype, "COMP") || !strcmp(ristype, "DATA")) { strcpy(buf, "software, multimedia"); } else if (!strcmp(ristype, "MAP")) { strcpy(buf, "cartographic"); } else { strcpy(buf, "text"); } if (print_element_x(buf, ptr_buffer, ptr_buffer_len, "typeOfResource", NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { return NULL; } return *ptr_buffer; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ add_origininfo_mods() prints out mods origin info static char* add_origininfo_mods returns ptr to the buffer if successful, NULL if failed char* ristype ptr to RIS type int level 0=analytic|1=monographic|2=series char** ptr_buffer ptr to ptr to buffer that will receive the output size_t* ptr_buffer_len ptr to var holding size of *ptr_buffer dbi_conn conn connection to database struct renderinfo* ptr_renderinfo ptr to struct with render information int* ptr_nhave_buffer_data ptr to var which will be set to non-zero if *ptr_buffer receives data struct xmlindent* ptr_indent ptr to struct with indent info ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static char* add_origininfo_mods(char* ristype, int level, char** ptr_buffer, size_t* ptr_buffer_len, dbi_conn conn, struct renderinfo* ptr_rendinfo, int* ptr_nhave_buffer_data, struct xmlindent* ptr_indent) { char* buffer1; char* new_ref; const char* item; size_t buffer1_len; int nhave_data = 0; /* printf("in add_origininfo_mods\n"); */ /* get some memory for the origininfo stuff */ buffer1_len = 4096; if ((buffer1 = malloc(buffer1_len)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } *buffer1 = '\0'; if (print_elstart_x(&buffer1, &buffer1_len, "originInfo", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } if (level == 1) { /*----------------------------------------------------------------*/ /* city */ if ((item = get_refdb_city(ptr_rendinfo->dbires)) != NULL) { nhave_data = 1; if (print_elstart_x(&buffer1, &buffer1_len, "place", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } if (print_element_x(item, &buffer1, &buffer1_len, "placeTerm", "type", "text", NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } if (print_elend_x(&buffer1, &buffer1_len, "place", ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } } /*----------------------------------------------------------------*/ /* publisher */ if ((item = get_refdb_publisher(ptr_rendinfo->dbires)) != NULL) { nhave_data = 1; if (print_element_x(item, &buffer1, &buffer1_len, "publisher", NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } } /*----------------------------------------------------------------*/ /* date */ if (add_pubdate_mods(&buffer1, &buffer1_len, conn, 1 /* primary */, ptr_rendinfo, &nhave_data, ptr_indent) == NULL) { free(buffer1); return NULL; } else { nhave_data = 1; } } /*----------------------------------------------------------------*/ /* issuance */ if (level == 0) { if (print_element_x("monographic", &buffer1, &buffer1_len, "issuance", "type", "text", NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } } else if (level == 1 && (!strcmp(ristype, "ABST") || !strcmp(ristype, "JFULL") || !strcmp(ristype, "JOUR") || !strcmp(ristype, "MGZN") || !strcmp(ristype, "NEWS"))) { if (print_element_x("continuing", &buffer1, &buffer1_len, "issuance", "type", "text", NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } } else { if (print_element_x("monographic", &buffer1, &buffer1_len, "issuance", "type", "text", NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } } if (print_elend_x(&buffer1, &buffer1_len, "originInfo", ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } if (nhave_data) { /* promote have_data upstream */ *ptr_nhave_buffer_data = 1; if ((new_ref = mstrcat(*ptr_buffer, buffer1, ptr_buffer_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(buffer1); return NULL; } else { *ptr_buffer = new_ref; } } free(buffer1); return *ptr_buffer; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ add_partinfo_mods() prints out mods part info static char* add_partinfo_mods returns ptr to the buffer if successful, NULL if failed char** ptr_buffer ptr to ptr to buffer that will receive the output size_t* ptr_buffer_len ptr to var holding size of *ptr_buffer dbi_conn conn connection to database struct renderinfo* ptr_renderinfo ptr to struct with render information int* ptr_nhave_buffer_data ptr to var which will be set to non-zero if *ptr_buffer receives data struct xmlindent* ptr_indent ptr to struct with indent info ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static char* add_partinfo_mods(char** ptr_buffer, size_t* ptr_buffer_len, dbi_conn conn, struct renderinfo* ptr_rendinfo, int* ptr_nhave_buffer_data, struct xmlindent* ptr_indent) { char date_buffer[256] = ""; char* buffer1; char* new_ref; const char* item; size_t buffer1_len; int nhave_data = 0; int nhave_year = 0; int i; /* printf("in add_pubinfo_mods\n"); */ /* get some memory for the pubinfo stuff */ buffer1_len = 4096; if ((buffer1 = malloc(buffer1_len)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } *buffer1 = '\0'; if (print_elstart_x(&buffer1, &buffer1_len, "part", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } /*----------------------------------------------------------------*/ /* volume */ if ((item = get_refdb_volume(ptr_rendinfo->dbires)) != NULL) { nhave_data = 1; if (print_elstart_x(&buffer1, &buffer1_len, "detail", "type", "volume", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } if (print_element_x(item, &buffer1, &buffer1_len, "number", NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } if (print_elend_x(&buffer1, &buffer1_len, "detail", ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } } /*----------------------------------------------------------------*/ /* issue */ if ((item = get_refdb_issue(ptr_rendinfo->dbires)) != NULL) { nhave_data = 1; if (print_elstart_x(&buffer1, &buffer1_len, "detail", "type", "issue", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } if (print_element_x(item, &buffer1, &buffer1_len, "number", NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } if (print_elend_x(&buffer1, &buffer1_len, "detail", ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } } /*----------------------------------------------------------------*/ /* start and end page */ if ((item = get_refdb_startpage(ptr_rendinfo->dbires)) != NULL) { nhave_data = 1; if (print_elstart_x(&buffer1, &buffer1_len, "extent", "unit", "page", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } if (print_element_x(item, &buffer1, &buffer1_len, "start", NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } if ((item = get_refdb_endpage(ptr_rendinfo->dbires)) != NULL) { if (print_element_x(item, &buffer1, &buffer1_len, "end", NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } } if (print_elend_x(&buffer1, &buffer1_len, "extent", ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } } /*----------------------------------------------------------------*/ /* date */ if (get_refdb_pubyear(ptr_rendinfo->dbires, date_buffer) != NULL && strcmp(date_buffer, "nd")) { nhave_year = 1; } if (nhave_year) { /* printf("nhave_year=%d || nhave_other+%d went to TRUE\n", nhave_year, nhave_other); */ nhave_data++; if (print_element_x(date_buffer, &buffer1, &buffer1_len, "date", NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } } /*----------------------------------------------------------------*/ /* URL, L1 through L4, DOI */ /* loop over all link types */ for (i=0; i<6;i++) { char ulink_type[10]; dbi_result dbires; dbires = request_ulinks(conn, my_dbi_result_get_idval(ptr_rendinfo->dbires, "refdb_id"), 0 /* ref entry */, i /* link type */, 0 /* is_temp */, ptr_rendinfo->username); if (dbires == NULL) { return NULL; } while ((item = get_ulink(dbires)) != NULL) { char* full_link; if (i>0 && i<5) { full_link = add_root_to_link(item, ptr_rendinfo->pdfroot); } else { full_link = (char*)item; } if (i == 5) { /* render doi as identifier */ if (print_element_x(item, &buffer1, &buffer1_len, "identifier", "type", "doi", NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { clean_request(dbires); return NULL; } nhave_data++; } /* render other links as location */ else if (i != 3) { if (print_elstart_x(&buffer1, &buffer1_len, "location", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } if (print_element_x((const char*)full_link, &buffer1, &buffer1_len, "url", "access", "raw object", NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { clean_request(dbires); return NULL; } nhave_data++; if (print_elend_x(&buffer1, &buffer1_len, "location", ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } } else if (i == 3) { /* related item */ if (print_elstart_x(&buffer1, &buffer1_len, "location", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } if (print_element_x((const char*)full_link, &buffer1, &buffer1_len, "note", "related", ulink_type, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { clean_request(dbires); return NULL; } nhave_data++; if (print_elend_x(&buffer1, &buffer1_len, "location", ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } } if (i>0 && i<5) { free(full_link); } } clean_request(dbires); } /* end for */ if (print_elend_x(&buffer1, &buffer1_len, "part", ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } if (nhave_data) { /* promote have_data upstream */ *ptr_nhave_buffer_data = 1; if ((new_ref = mstrcat(*ptr_buffer, buffer1, ptr_buffer_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(buffer1); return NULL; } else { *ptr_buffer = new_ref; } } free(buffer1); return *ptr_buffer; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ add_location_mods() prints out mods location info static char* add_location_mods returns ptr to the buffer if successful, NULL if failed char** ptr_buffer ptr to ptr to buffer that will receive the output size_t* ptr_buffer_len ptr to var holding size of *ptr_buffer dbi_conn conn connection to database struct renderinfo* ptr_renderinfo ptr to struct with render information int* ptr_nhave_buffer_data ptr to var which will be set to non-zero if *ptr_buffer receives data struct xmlindent* ptr_indent ptr to struct with indent info ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static char* add_location_mods(char** ptr_buffer, size_t* ptr_buffer_len, dbi_conn conn, struct renderinfo* ptr_rendinfo, int* ptr_nhave_buffer_data, struct xmlindent* ptr_indent) { char* buffer1; char* new_ref; const char* item; size_t buffer1_len; int nhave_data = 0; int i; /* printf("in add_pubinfo_mods\n"); */ /* get some memory for the pubinfo stuff */ buffer1_len = 4096; if ((buffer1 = malloc(buffer1_len)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } *buffer1 = '\0'; if (print_elstart_x(&buffer1, &buffer1_len, "location", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } /* reprint stuff */ if (add_reprint_mods(&buffer1, &buffer1_len, conn, ptr_rendinfo, ptr_rendinfo->username, &nhave_data, ptr_indent) == NULL) { free(buffer1); return NULL; } /*----------------------------------------------------------------*/ /* URL, L1 through L4 */ /* loop over all link types */ for (i=0; i<5;i++) { char ulink_type[10]; dbi_result dbires; dbires = request_ulinks(conn, my_dbi_result_get_idval(ptr_rendinfo->dbires, "refdb_id"), 0 /* ref entry */, i /* link type */, 0 /* is_temp */, ptr_rendinfo->username); if (dbires == NULL) { return NULL; } while ((item = get_ulink(dbires)) != NULL) { if (i == 0) { strcpy(ulink_type, "url"); } else if (i == 1) { strcpy(ulink_type, "pdf"); } else if (i == 2) { strcpy(ulink_type, "fulltext"); } else if (i == 3) { strcpy(ulink_type, "related"); } else if (i == 4) { strcpy(ulink_type, "image"); } if (print_element_x(item, &buffer1, &buffer1_len, "url", "note", ulink_type, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { clean_request(dbires); return NULL; } nhave_data++; } clean_request(dbires); } /* end for */ if (print_elend_x(&buffer1, &buffer1_len, "location", ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } if (nhave_data) { /* promote have_data upstream */ *ptr_nhave_buffer_data = 1; if ((new_ref = mstrcat(*ptr_buffer, buffer1, ptr_buffer_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(buffer1); return NULL; } else { *ptr_buffer = new_ref; } } free(buffer1); return *ptr_buffer; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ add_pubdate_mods() prints out mods pubdate static char* add_pubdate_mods returns ptr to the buffer if successful, NULL if failed char** ptr_buffer ptr to ptr to buffer that will receive the output size_t* ptr_buffer_len ptr to var holding size of *ptr_buffer dbi_conn conn connection to database int type 1=primary, 2=secondary struct renderinfo* ptr_renderinfo ptr to struct with render information int* ptr_nhave_buffer_data ptr to var which will be set to non-zero if *ptr_buffer receives data struct xmlindent* ptr_indent ptr to struct with indent info ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static char* add_pubdate_mods(char** ptr_buffer, size_t* ptr_buffer_len, dbi_conn conn, int type, struct renderinfo* ptr_rendinfo, int* ptr_nhave_buffer_data, struct xmlindent* ptr_indent) { char date_buffer[256] = ""; char* buffer1; char* new_ref; size_t buffer1_len; int nhave_data = 0; int nhave_year = 0; /* printf("in add_pubdate_mods\n"); */ /* get some memory for the pubinfo stuff */ buffer1_len = 4096; if ((buffer1 = malloc(buffer1_len)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } *buffer1 = '\0'; /*----------------------------------------------------------------*/ /* pubyear */ if (type == 1) { if (get_refdb_pubyear(ptr_rendinfo->dbires, date_buffer) != NULL && strcmp(date_buffer, "nd")) { nhave_year = 1; } } else { if (get_refdb_secyear(ptr_rendinfo->dbires, date_buffer) != NULL && strcmp(date_buffer, "nd")) { nhave_year = 1; } } /* printf("date_buffer went to:%s<<\n", date_buffer); */ if (nhave_year) { /* printf("nhave_year=%d || nhave_other+%d went to TRUE\n", nhave_year, nhave_other); */ nhave_data++; if (print_element_x(date_buffer, &buffer1, &buffer1_len, "dateIssued", NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(buffer1); return NULL; } } if (nhave_data) { if ((new_ref = mstrcat(*ptr_buffer, buffer1, ptr_buffer_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(buffer1); return NULL; } else { *ptr_buffer = new_ref; } } if (nhave_data) { (*ptr_nhave_buffer_data)++; } free(buffer1); return *ptr_buffer; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ add_reprint_mods() prints out mods reprint info static char* add_reprint_mods returns ptr to the buffer if successful, NULL if failed char** ptr_buffer ptr to ptr to buffer that will receive the output size_t* ptr_buffer_len ptr to var holding size of *ptr_buffer dbi_conn conn connection to database struct renderinfo* ptr_renderinfo ptr to struct with render information char* username name of user int* ptr_nhave_buffer_data ptr to var which will be set to non-zero if *ptr_buffer receives data struct xmlindent* ptr_indent ptr to struct with indent info ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static char* add_reprint_mods(char** ptr_buffer, size_t* ptr_buffer_len, dbi_conn conn, struct renderinfo* ptr_rendinfo, char* username, int* ptr_nhave_buffer_data, struct xmlindent* ptr_indent) { struct REPRINT reprint; char attribute[10]; size_t path_skip = 0; if (get_reprint(ptr_rendinfo->dbires, &reprint, username, 4) && reprint.reprint != NULL && *(reprint.reprint)) { if (reprint.avail != NULL && *(reprint.avail)) { *ptr_nhave_buffer_data = 1; if (!strncmp(reprint.avail, "PATH:", 5)) { strcpy(attribute, "useroot"); path_skip = 5; } else { strcpy(attribute, "full"); } if (print_element_x(reprint.avail+path_skip, ptr_buffer, ptr_buffer_len, "physicalLocation", "type", attribute, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { return NULL; } } } return *ptr_buffer; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ indent_notbelow_mods(): checks whether or not to indent below the current element static int indent_notbelow returns 1 if not to indent, 0 if to indent const char* name ptr to element name ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int indent_notbelow_mods(const char* name) { if (!strcmp(name, "date")) { return 1; } else { return 0; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ is_entry_mods(): checks whether an element starts a new entry static int is_entry_mods returns 1 if entry starts, 0 if not const char* name ptr to element name ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int is_entry_mods(const char* name) { if (!strcmp(name, "entry")) { return 1; } else { return 0; } } refdb-1.0.2/src/backend-db31.c000755 001750 001750 00000153715 12255427651 016543 0ustar00markusmarkus000000 000000 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ backend-db31.c defines the DocBook V.3.1 output backend of refdbd markus@mhoenicka.de 6-22-00 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ #include #include #include /* for definitions of log message priorities */ #include #include "refdb.h" #include "backend.h" #include "backend-db31.h" #include "strfncs.h" #include "linklist.h" #include "tokenize.h" #include "refdbd.h" #include "dbfncs.h" #include "risdb.h" #include "authorinfo.h" #include "connect.h" /* for get_status_msg() */ #include "xmlhelper.h" /* some globals */ extern int n_log_level; /* numeric version of log_level */ /* forward declarations of local functions */ static char* add_author_db(struct renderinfo* ptr_rendinfo, struct AUTHOR_INFO* ptr_ainfo, char** ptr_chunk_buf, size_t* ptr_chunk_buf_len, struct xmlindent* ptr_indent, int n_ref_format); static char* add_author_info_db(struct renderinfo* ptr_rendinfo, int author_type, int n_refdb_id, char** ptr_chunk_buf, size_t* ptr_chunk_buf_len, struct xmlindent* ptr_indent, int n_ref_format); static char* add_analytic_db(struct renderinfo* ptr_rendinfo, int n_refdb_id, char **ptr_chunk_buf, size_t *ptr_chunk_buf_len, const char* type, struct xmlindent* ptr_indent, int n_ref_format); static char* add_monogr_db(struct renderinfo* ptr_rendinfo, int n_refdb_id, char **ptr_chunk_buf, size_t *ptr_chunk_buf_len, const char* type, struct xmlindent* ptr_indent, int n_ref_format); static char* add_series_db(struct renderinfo* ptr_rendinfo, int n_refdb_id, char **ptr_chunk_buf, size_t *ptr_chunk_buf_len, const char* type, struct xmlindent* ptr_indent, int n_ref_format); static char* add_notes_db(struct renderinfo* ptr_rendinfo, int n_refdb_id, char **ptr_chunk_buf, size_t *ptr_chunk_buf_len, struct xmlindent* ptr_indent); static char* add_abstract_db(struct renderinfo* ptr_rendinfo, int n_refdb_id, char **ptr_chunk_buf, size_t *ptr_chunk_buf_len, struct xmlindent* ptr_indent); static char* add_biblioids_db(struct renderinfo* ptr_rendinfo, int n_refdb_id, char **ptr_chunk_buf, size_t *ptr_chunk_buf_len, const char* type, struct xmlindent* ptr_indent); static int indent_notbelow_db(const char* name); static int is_entry_db(const char* name); /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ prepare_render_db31(): writes a header for the docbook output of a query int prepare_render_db31 returns 0 if successful,>0 if failed struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int prepare_render_db31(struct renderinfo* ptr_rendinfo) { /* ToDo: control with format_string whether or not to include the document type declaration. For the time being the declaration does go in but is commented out */ if (ptr_rendinfo->ref_format == REFDOCBK) { /* SGML */ strcpy(*(ptr_rendinfo->ptr_ref), "\n\nBibliography\n"); } else if (ptr_rendinfo->ref_format == REFDOCBKX) { /* XML */ char encodingstring[64] = ""; /* todo: is this enough? */ if (*((ptr_rendinfo->ptr_biblio_info)->encoding)) { sprintf(encodingstring, " encoding=\"%s\"", (ptr_rendinfo->ptr_biblio_info)->encoding); } if (*(ptr_rendinfo->ptr_clrequest->namespace)) { sprintf(*(ptr_rendinfo->ptr_ref), "\n<%s:bibliography xmlns=\"http://docbook.org/ns/docbook\">\n <%s:title>Bibliography\n", encodingstring, ptr_rendinfo->ptr_clrequest->namespace, ptr_rendinfo->ptr_clrequest->namespace, ptr_rendinfo->ptr_clrequest->namespace); } else { sprintf(*(ptr_rendinfo->ptr_ref), " -->\n\nBibliography\n", encodingstring); } } else { /* we have a problem */ LOG_PRINT(LOG_WARNING, get_status_msg(302)); return 302; } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ finish_render_db31(): writes a footer for the docbook output of a query int finish_render_ris returns 0 if successful, >0 if failed struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int finish_render_db31(struct renderinfo* ptr_rendinfo) { char* new_ref; char ns[PREFS_BUF_LEN+32]; if (*(ptr_rendinfo->ptr_clrequest->namespace)) { sprintf(ns, "\n\n", ptr_rendinfo->ptr_clrequest->namespace); } else { strcpy(ns, "\n\n"); } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), ns, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } *(ptr_rendinfo->ptr_ref) = new_ref; return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ render_db31() renders a RIS dataset for DocBook V.3.1 export int render_db31 returns 0 if successful, >0 if not struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int render_db31(struct renderinfo* ptr_rendinfo) { char *new_ref; /* used for reallocating buffer ref */ char *chunk; char *chunk_buf; const char *item; /* pointer to string for all db requests */ const char *type; size_t chunk_buf_len; unsigned long long n_refdb_id; dbi_conn conn; struct xmlindent xindent; initialize_xmlindent(&xindent, 2, indent_notbelow_db, is_entry_db); /* rendering bibliographic information takes up to three levels of information: analytic: author and title of the article or chapter monographic: name of the journal/book, vol/issue/page info, editors series: series title, series editors */ chunk_buf_len = 1024; if ((chunk_buf = malloc(chunk_buf_len)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } conn = dbi_result_get_conn(ptr_rendinfo->dbires); if ((type = get_refdb_type(ptr_rendinfo->dbires)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(234)); free(chunk_buf); return 234; } n_refdb_id = my_dbi_result_get_idval(ptr_rendinfo->dbires, "refdb_id"); if ((ptr_rendinfo->ptr_biblio_info)->entry_id != NULL) { if (print_elstart_x(ptr_rendinfo->ptr_ref, ptr_rendinfo->ptr_ref_len, "biblioentry", "id", (ptr_rendinfo->ptr_biblio_info)->entry_id, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(chunk_buf); return 801; } } else { if (print_elstart_x(ptr_rendinfo->ptr_ref, ptr_rendinfo->ptr_ref_len, "biblioentry", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(chunk_buf); return 801; } } item = get_refdb_citekey(ptr_rendinfo->dbires); if (item && *item) { if (print_element_x(item, ptr_rendinfo->ptr_ref, ptr_rendinfo->ptr_ref_len, "abbrev", NULL, NULL, NULL, NULL, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(chunk_buf); return 801; } } if (has_part_data(type)) { chunk = add_analytic_db(ptr_rendinfo, n_refdb_id, &chunk_buf, &chunk_buf_len, type, &xindent, REFDOCBKX); if (chunk && *chunk) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), chunk, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(chunk_buf); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } } chunk = add_monogr_db(ptr_rendinfo, n_refdb_id, &chunk_buf, &chunk_buf_len, type, &xindent, REFDOCBKX); if (chunk && *chunk) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), chunk, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(chunk_buf); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } if (has_set_data(type)) { chunk = add_series_db(ptr_rendinfo, n_refdb_id, &chunk_buf, &chunk_buf_len, type, &xindent, REFDOCBKX); if (chunk && *chunk) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), chunk, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(chunk_buf); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } } /* add notes and abstract if requested */ /* notes */ if (strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "N1") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "ALL") != NULL) { chunk = add_notes_db(ptr_rendinfo, n_refdb_id, &chunk_buf, &chunk_buf_len, &xindent); if (chunk && *chunk) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), chunk, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(chunk_buf); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } } /*----------------------------------------------------------------*/ /* isbn/issn */ if (has_periodical_data(type)) { chunk = add_biblioids_db(ptr_rendinfo, n_refdb_id, &chunk_buf, &chunk_buf_len, "issn", &xindent); } else { chunk = add_biblioids_db(ptr_rendinfo, n_refdb_id, &chunk_buf, &chunk_buf_len, "isbn", &xindent); } if (chunk && *chunk) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), chunk, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(chunk_buf); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } /*----------------------------------------------------------------*/ /* abstract */ if (strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "N2") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "AB") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "ALL") != NULL) { chunk = add_abstract_db(ptr_rendinfo, n_refdb_id, &chunk_buf, &chunk_buf_len, &xindent); if (chunk && *chunk) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), chunk, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(chunk_buf); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } } /* finish bibliography entry */ if (print_elend_x(ptr_rendinfo->ptr_ref, ptr_rendinfo->ptr_ref_len, "biblioentry", &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(chunk_buf); return 801; } free(chunk_buf); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ prepare_render_db50(): writes a header for the docbook output of a query int prepare_render_db50 returns 0 if successful,>0 if failed struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int prepare_render_db50(struct renderinfo* ptr_rendinfo) { char encodingstring[64] = ""; /* todo: is this enough? */ if (*((ptr_rendinfo->ptr_biblio_info)->encoding)) { sprintf(encodingstring, " encoding=\"%s\"", (ptr_rendinfo->ptr_biblio_info)->encoding); } if (*(ptr_rendinfo->ptr_clrequest->namespace)) { sprintf(*(ptr_rendinfo->ptr_ref), "\n<%s:bibliography xmlns:%s=\"http://docbook.org/ns/docbook\">\n<%s:title>Bibliography\n", encodingstring, ptr_rendinfo->ptr_clrequest->namespace, ptr_rendinfo->ptr_clrequest->namespace, ptr_rendinfo->ptr_clrequest->namespace, ptr_rendinfo->ptr_clrequest->namespace); } else { /* always define the default namespace */ sprintf(*(ptr_rendinfo->ptr_ref), "\n\nBibliography\n", encodingstring); } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ finish_render_db50(): writes a footer for the docbook output of a query int finish_render_ris returns 0 if successful, >0 if failed struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int finish_render_db50(struct renderinfo* ptr_rendinfo) { char* new_ref; char ns[PREFS_BUF_LEN+32]; if (*(ptr_rendinfo->ptr_clrequest->namespace)) { sprintf(ns, "\n\n", ptr_rendinfo->ptr_clrequest->namespace); } else { strcpy(ns, "\n\n"); } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), ns, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } *(ptr_rendinfo->ptr_ref) = new_ref; return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ render_db50() renders a RIS dataset for DocBook V.5.0 export int render_db50 returns 0 if successful, >0 if not struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int render_db50(struct renderinfo* ptr_rendinfo) { char *new_ref; /* used for reallocating buffer ref */ char *chunk; char *chunk_buf; const char *item; /* pointer to string for all db requests */ const char *type; size_t chunk_buf_len; unsigned long long n_refdb_id; dbi_conn conn; struct xmlindent xindent; /*initialize xindent */ initialize_xmlindent(&xindent, 2, indent_notbelow_db, is_entry_db); /* rendering bibliographic information takes up to three levels of information: analytic: author and title of the article or chapter monographic: name of the journal/book, vol/issue/page info, editors series: series title, series editors */ chunk_buf_len = 1024; if ((chunk_buf = malloc(chunk_buf_len)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } conn = dbi_result_get_conn(ptr_rendinfo->dbires); if ((type = get_refdb_type(ptr_rendinfo->dbires)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(234)); free(chunk_buf); return 234; } n_refdb_id = my_dbi_result_get_idval(ptr_rendinfo->dbires, "refdb_id"); item = get_refdb_citekey(ptr_rendinfo->dbires); if (item && *item) { if (print_elstart_x(ptr_rendinfo->ptr_ref, ptr_rendinfo->ptr_ref_len, "biblioentry", "xml:id", item, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(chunk_buf); return 801; } if (print_element_x(item, ptr_rendinfo->ptr_ref, ptr_rendinfo->ptr_ref_len, "abbrev", NULL, NULL, NULL, NULL, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(chunk_buf); return 801; } } else { if (print_elstart_x(ptr_rendinfo->ptr_ref, ptr_rendinfo->ptr_ref_len, "biblioentry", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(chunk_buf); return 801; } } if (has_part_data(type)) { chunk = add_analytic_db(ptr_rendinfo, n_refdb_id, &chunk_buf, &chunk_buf_len, type, &xindent, REFDOCBKX5); if (chunk && *chunk) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), chunk, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(chunk_buf); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } } chunk = add_monogr_db(ptr_rendinfo, n_refdb_id, &chunk_buf, &chunk_buf_len, type, &xindent, REFDOCBKX5); if (chunk && *chunk) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), chunk, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(chunk_buf); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } if (has_set_data(type)) { chunk = add_series_db(ptr_rendinfo, n_refdb_id, &chunk_buf, &chunk_buf_len, type, &xindent, REFDOCBKX5); if (chunk && *chunk) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), chunk, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(chunk_buf); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } } /* add notes and abstract if requested */ /* notes */ if (strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "N1") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "ALL") != NULL) { chunk = add_notes_db(ptr_rendinfo, n_refdb_id, &chunk_buf, &chunk_buf_len, &xindent); if (chunk && *chunk) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), chunk, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(chunk_buf); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } } /*----------------------------------------------------------------*/ /* isbn/issn */ if (has_periodical_data(type)) { chunk = add_biblioids_db(ptr_rendinfo, n_refdb_id, &chunk_buf, &chunk_buf_len, "issn", &xindent); } else { chunk = add_biblioids_db(ptr_rendinfo, n_refdb_id, &chunk_buf, &chunk_buf_len, "isbn", &xindent); } if (chunk && *chunk) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), chunk, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(chunk_buf); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } /*----------------------------------------------------------------*/ /* doi */ chunk = add_biblioids_db(ptr_rendinfo, n_refdb_id, &chunk_buf, &chunk_buf_len, "doi", &xindent); if (chunk && *chunk) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), chunk, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(chunk_buf); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } /*----------------------------------------------------------------*/ /* abstract */ if (strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "N2") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "AB") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "ALL") != NULL) { chunk = add_abstract_db(ptr_rendinfo, n_refdb_id, &chunk_buf, &chunk_buf_len, &xindent); if (chunk && *chunk) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), chunk, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(chunk_buf); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } } /* finish bibliography entry */ if (print_elend_x(ptr_rendinfo->ptr_ref, ptr_rendinfo->ptr_ref_len, "biblioentry", &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(chunk_buf); return 801; } free(chunk_buf); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ add_analytic_db() adds analytic level info to a DocBook bibliography static char* add_analytic_db returns ptr to ref if successful, NULL if not struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered int n_refdb_id ID of the current dataset char **ptr_chunk_buf ptr to an allocated string, may be resized size_t *ptr_chunk_buf_len ptr to length of ptr_chunk_buf const char* type ptr to string holding the type of the current dataset struct xmlindent* ptr_indent ptr to structure with indentation info int n_ref_format reference type (REFDOCBKX|REFDOCBKX5) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static char* add_analytic_db(struct renderinfo* ptr_rendinfo, int n_refdb_id, char **ptr_chunk_buf, size_t *ptr_chunk_buf_len, const char* type, struct xmlindent* ptr_indent, int n_ref_format) { int n_have_data = 0; /* set to 1 if we have some data */ char *new_ref; char *entitize_buf; char *author_buf; char *author_result; const char *item; size_t author_buf_len = 1024; **ptr_chunk_buf = '\0'; if ((author_buf = malloc(author_buf_len)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } /* start analytic information */ if (print_elstart_x(ptr_chunk_buf, ptr_chunk_buf_len, "biblioset", "relation", "analytic", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(author_buf); return NULL; } /* add authors, if any */ author_result = add_author_info_db(ptr_rendinfo, 1 /* part */, n_refdb_id, &author_buf, &author_buf_len, ptr_indent, n_ref_format); if (!author_result) { free(author_buf); return NULL; } else if (*author_result) { n_have_data++; if ((new_ref = mstrcat(*ptr_chunk_buf, author_result, ptr_chunk_buf_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(author_buf); return NULL; } else { *ptr_chunk_buf = new_ref; } } free(author_buf); /* get the article or chapter title */ item = get_refdb_title_copy(ptr_rendinfo->dbires); if (item != NULL && *item) { n_have_data++; if ((entitize_buf = mstrdup((char*)item)) == NULL) { free((char*)item); return NULL; } if (sgml_entitize(&entitize_buf, n_ref_format) == NULL) { free((char*)item); free(entitize_buf); return NULL; } if (print_element_x(entitize_buf, ptr_chunk_buf, ptr_chunk_buf_len, "title", NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free((char*)item); free(entitize_buf); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } free(entitize_buf); free((char*)item); } /* finish analytic information */ if (print_elend_x(ptr_chunk_buf, ptr_chunk_buf_len, "biblioset", ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } if (!n_have_data) { **ptr_chunk_buf = '\0'; } return *ptr_chunk_buf; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ add_monogr_db() adds monography level info to a DocBook bibliography static char* add_monogr_db returns ptr to ref if successful, NULL if not struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered int n_refdb_id ID of the current dataset char **ptr_chunk_buf ptr to an allocated string, may be resized size_t *ptr_chunk_buf_len ptr to length of ptr_chunk_buf const char* type ptr to string holding the type of the current dataset struct xmlindent* ptr_indent ptr to structure with indentation info int n_ref_format reference type (REFDOCBKX|REFDOCBKX5) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static char* add_monogr_db(struct renderinfo* ptr_rendinfo, int n_refdb_id, char **ptr_chunk_buf, size_t *ptr_chunk_buf_len, const char* type, struct xmlindent* ptr_indent, int n_ref_format) { int n_have_data = 0; /* set to 1 if we have some data */ int i; int errcode; /* receives error code for periodical requests */ char periodical[256]; char *new_ref; char *entitize_buf; char *author_buf; char *author_result; const char *item; char journaltype[4][12] = {"name", "custabbrev1", "custabbrev2", "abbrev"}; size_t author_buf_len; dbi_conn conn; **ptr_chunk_buf = '\0'; author_buf_len = 1024; if ((author_buf = malloc(author_buf_len)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } conn = dbi_result_get_conn(ptr_rendinfo->dbires); /* start monographic information */ if (print_elstart_x(ptr_chunk_buf, ptr_chunk_buf_len, "biblioset", "relation", "monogr", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(author_buf); return NULL; } /* authors and editors */ author_result = add_author_info_db(ptr_rendinfo, 2, n_refdb_id, &author_buf, &author_buf_len, ptr_indent, n_ref_format); if (!author_result) { free(author_buf); return NULL; } else if (*author_result) { n_have_data++; if ((new_ref = mstrcat(*ptr_chunk_buf, author_result, ptr_chunk_buf_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(author_buf); return NULL; } else { *ptr_chunk_buf = new_ref; } } free(author_buf); if (has_periodical_data(type)) { /* journal information, if any */ for (i = 0; i < 4; i++) { /* request journal */ item = get_periodical(conn, periodical, /*ptr_rendinfo->database*/NULL, i, &errcode, 0, my_dbi_result_get_idval(ptr_rendinfo->dbires, "refdb_id"), NULL /* no frequency required */); if (item != NULL) { if (!*item) { continue; } if ((entitize_buf = mstrdup((char*)item)) == NULL) { return NULL; } if (sgml_entitize(&entitize_buf, n_ref_format) == NULL) { free(entitize_buf); return NULL; } if (print_elstart_x(ptr_chunk_buf, ptr_chunk_buf_len, "biblioset", "relation", journaltype[i], NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } if (print_element_x(entitize_buf, ptr_chunk_buf, ptr_chunk_buf_len, "title", NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(entitize_buf); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } free(entitize_buf); if (print_elend_x(ptr_chunk_buf, ptr_chunk_buf_len, "biblioset", ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } n_have_data++; } } } /* end if has periodical data */ /* monographic title */ item = get_refdb_booktitle_copy(ptr_rendinfo->dbires); if (item != NULL) { if ((entitize_buf = mstrdup((char*)item)) == NULL) { free((char*)item); return NULL; } if (sgml_entitize(&entitize_buf, n_ref_format) == NULL) { free((char*)item); free(entitize_buf); return NULL; } if (print_elstart_x(ptr_chunk_buf, ptr_chunk_buf_len, "biblioset", "relation", "booktitle", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } if (print_element_x(entitize_buf, ptr_chunk_buf, ptr_chunk_buf_len, "title", NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(entitize_buf); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } free(entitize_buf); if (print_elend_x(ptr_chunk_buf, ptr_chunk_buf_len, "biblioset", ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } free((char*)item); n_have_data++; } /* publisher and city */ if (strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "PB") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "ALL") != NULL) { if ((item = get_refdb_publisher(ptr_rendinfo->dbires)) != NULL) { if (print_elstart_x(ptr_chunk_buf, ptr_chunk_buf_len, "publisher", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } if ((entitize_buf = mstrdup((char*)item)) == NULL) { return NULL; } if (sgml_entitize(&entitize_buf, n_ref_format) == NULL) { free(entitize_buf); return NULL; } if (print_element_x(entitize_buf, ptr_chunk_buf, ptr_chunk_buf_len, "publishername", NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } free(entitize_buf); if (strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "CY") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "ALL") != NULL) { /* pubplace - use only if publisher is known */ if ((item = get_refdb_city(ptr_rendinfo->dbires)) != NULL) { if ((entitize_buf = mstrdup((char*)item)) == NULL) { return NULL; } if (sgml_entitize(&entitize_buf, n_ref_format) == NULL) { free(entitize_buf); return NULL; } if (print_element_x(entitize_buf, ptr_chunk_buf, ptr_chunk_buf_len, "address", NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } free(entitize_buf); } } if (print_elend_x(ptr_chunk_buf, ptr_chunk_buf_len, "publisher", ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } n_have_data++; } } /* volume/edition (VL) */ if ((item = get_refdb_volume(ptr_rendinfo->dbires)) != NULL || (item = get_refdb_edition(ptr_rendinfo->dbires)) != NULL) { char voledtag[10] = "volumenum"; if ((entitize_buf = mstrdup((char*)item)) == NULL) { return NULL; } if (sgml_entitize(&entitize_buf, n_ref_format) == NULL) { free(entitize_buf); return NULL; } if (!strcmp(type, "ADVS") | !strcmp(type, "ART") | !strcmp(type, "CHAP") | !strcmp(type, "BOOK") | !strcmp(type, "CTLG") | !strcmp(type, "COMP") | !strcmp(type, "MAP") | !strcmp(type, "MUSIC") | !strcmp(type, "NEWS") | !strcmp(type, "PAMP") | !strcmp(type, "SER")) { strncpy(voledtag, "edition", 7); voledtag[7]='\0'; } if (print_element_x(entitize_buf, ptr_chunk_buf, ptr_chunk_buf_len, voledtag, NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(entitize_buf); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } free(entitize_buf); n_have_data++; } /* issue */ if ((item = get_refdb_issue(ptr_rendinfo->dbires)) != NULL) { if ((entitize_buf = mstrdup((char*)item)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } if (sgml_entitize(&entitize_buf, n_ref_format) == NULL) { free(entitize_buf); return NULL; } if (print_element_x(entitize_buf, ptr_chunk_buf, ptr_chunk_buf_len, "issuenum", NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(entitize_buf); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } free(entitize_buf); n_have_data++; } /* start page */ if ((item = get_refdb_startpage(ptr_rendinfo->dbires)) != NULL) { char* entitized_endpage; size_t entitize_buf_len; if ((entitize_buf = mstrdup((char*)item)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } if (sgml_entitize(&entitize_buf, n_ref_format) == NULL) { free(entitize_buf); return NULL; } entitize_buf_len = strlen(entitize_buf); /* end page */ if ((item = get_refdb_endpage(ptr_rendinfo->dbires)) != NULL) { if ((entitized_endpage = mstrdup((char*)item)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } if (sgml_entitize(&entitized_endpage, n_ref_format) == NULL) { free(entitize_buf); free(entitized_endpage); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } if ((new_ref = mstrcat(entitize_buf, "-", &entitize_buf_len, 0)) == NULL) { free(entitize_buf); free(entitized_endpage); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } else { entitize_buf = new_ref; } if ((new_ref = mstrcat(entitize_buf, entitized_endpage, &entitize_buf_len, 0)) == NULL) { free(entitize_buf); free(entitized_endpage); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } else { entitize_buf = new_ref; } free(entitized_endpage); } if (print_element_x(entitize_buf, ptr_chunk_buf, ptr_chunk_buf_len, "pagenums", NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free((char*)item); free(entitize_buf); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } free(entitize_buf); n_have_data++; } /* publication date, reuse periodical */ if ((item = get_refdb_pubyear(ptr_rendinfo->dbires, periodical)) != NULL) { if (print_element_x(periodical, ptr_chunk_buf, ptr_chunk_buf_len, "pubdate", NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free((char*)item); free(entitize_buf); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } n_have_data++; } /* finish monographic information */ if (print_elend_x(ptr_chunk_buf, ptr_chunk_buf_len, "biblioset", ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } if (!n_have_data) { **ptr_chunk_buf = '\0'; } return *ptr_chunk_buf; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ add_series_db() adds series level info to a DocBook bibliography static char* add_series_db returns ptr to ref if successful, NULL if not struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered int n_refdb_id ID of the current dataset char **ptr_chunk_buf ptr to an allocated string, may be resized size_t *ptr_chunk_buf_len ptr to length of ptr_chunk_buf const char* type ptr to string holding the type of the current dataset struct xmlindent* ptr_indent ptr to structure with indentation info int n_ref_format reference type (REFDOCBKX|REFDOCBKX5) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static char* add_series_db(struct renderinfo* ptr_rendinfo, int n_refdb_id, char **ptr_chunk_buf, size_t *ptr_chunk_buf_len, const char* type, struct xmlindent* ptr_indent, int n_ref_format) { int n_have_data = 0; /* set to 1 if we have some data */ char *new_ref; char *entitize_buf; char *author_buf; char *author_result; const char *item; size_t author_buf_len; **ptr_chunk_buf = '\0'; author_buf_len = 1024; if ((author_buf = malloc(author_buf_len)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } /* start series info */ if (print_elstart_x(ptr_chunk_buf, ptr_chunk_buf_len, "biblioset", "relation", "series", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(author_buf); return NULL; } /* add editors, if any */ author_result = add_author_info_db(ptr_rendinfo, 3 /* set editors */, n_refdb_id, &author_buf, &author_buf_len, ptr_indent, n_ref_format); if (!author_result) { free(author_buf); return NULL; } else if (*author_result) { n_have_data++; if ((new_ref = mstrcat(*ptr_chunk_buf, author_result, ptr_chunk_buf_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(author_buf); return NULL; } else { *ptr_chunk_buf = new_ref; } } free(author_buf); /* series title, if any */ item = get_refdb_title_series_copy(ptr_rendinfo->dbires); if (item && *item) { n_have_data++; if ((entitize_buf = mstrdup((char*)item)) == NULL) { free((char*)item); return NULL; } if (sgml_entitize(&entitize_buf, n_ref_format) == NULL) { free((char*)item); free(entitize_buf); return NULL; } if (print_element_x(entitize_buf, ptr_chunk_buf, ptr_chunk_buf_len, "title", NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free((char*)item); free(entitize_buf); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } free(entitize_buf); free((char*)item); n_have_data++; } /* finish series information */ if (print_elend_x(ptr_chunk_buf, ptr_chunk_buf_len, "biblioset", ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } if (!n_have_data) { **ptr_chunk_buf = '\0'; } return *ptr_chunk_buf; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ add_notes_db() adds notes info to a DocBook bibliography static char* add_notes_db returns ptr to ref if successful, NULL if not struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered int n_refdb_id ID of the current dataset char **ptr_chunk_buf ptr to an allocated string, may be resized size_t *ptr_chunk_buf_len ptr to length of ptr_chunk_buf struct xmlindent* ptr_indent ptr to structure with indentation info ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static char* add_notes_db(struct renderinfo* ptr_rendinfo, int n_refdb_id, char **ptr_chunk_buf, size_t *ptr_chunk_buf_len, struct xmlindent* ptr_indent) { int n_have_data = 0; /* set to 1 if we have some data */ char *entitize_buf; const char *item; **ptr_chunk_buf = '\0'; /* note of current user, if any */ item = get_notes_copy(ptr_rendinfo->dbires, ptr_rendinfo->username); if (item && *item) { n_have_data++; if ((entitize_buf = mstrdup((char*)item)) == NULL) { free((char*)item); return NULL; } if (sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { free((char*)item); free(entitize_buf); return NULL; } if (print_element_x(entitize_buf, ptr_chunk_buf, ptr_chunk_buf_len, "bibliomisc", "role", "annotation", NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(entitize_buf); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } free(entitize_buf); } if (!n_have_data) { **ptr_chunk_buf = '\0'; } return *ptr_chunk_buf; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ add_abstract_db() adds abstract to a DocBook bibliography static char* add_abstract_db returns ptr to ref if successful, NULL if not struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered int n_refdb_id ID of the current dataset char **ptr_chunk_buf ptr to an allocated string, may be resized size_t *ptr_chunk_buf_len ptr to length of ptr_chunk_buf struct xmlindent* ptr_indent ptr to structure with indentation info ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static char* add_abstract_db(struct renderinfo* ptr_rendinfo, int n_refdb_id, char **ptr_chunk_buf, size_t *ptr_chunk_buf_len, struct xmlindent* ptr_indent) { int n_have_data = 0; /* set to 1 if we have some data */ char *entitize_buf; const char *item; **ptr_chunk_buf = '\0'; /* abstract, if any */ item = get_refdb_abstract_copy(ptr_rendinfo->dbires); if (item != NULL) { n_have_data++; if ((entitize_buf = mstrdup((char*)item)) == NULL) { free((char*)item); return NULL; } if (sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { free((char*)item); free(entitize_buf); return NULL; } if (print_elstart_x(ptr_chunk_buf, ptr_chunk_buf_len, "abstract", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(entitize_buf); return NULL; } if (print_element_x(entitize_buf, ptr_chunk_buf, ptr_chunk_buf_len, "para", NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free((char*)item); free(entitize_buf); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } free(entitize_buf); free((char*)item); } if (!n_have_data) { **ptr_chunk_buf = '\0'; } return *ptr_chunk_buf; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ add_biblioids_db() adds isbn/issn/doi to a DocBook bibliography static char* add_biblioids_db returns ptr to ref if successful, NULL if not struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered int n_refdb_id ID of the current dataset char **ptr_chunk_buf ptr to an allocated string, may be resized size_t *ptr_chunk_buf_len ptr to length of ptr_chunk_buf const char* type type of biblioid (doi/issn/isbn) struct xmlindent* ptr_indent ptr to structure with indentation info ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static char* add_biblioids_db(struct renderinfo* ptr_rendinfo, int n_refdb_id, char **ptr_chunk_buf, size_t *ptr_chunk_buf_len, const char* type, struct xmlindent* ptr_indent) { int n_have_data = 0; /* set to 1 if we have some data */ char *entitize_buf; const char *item; dbi_result dbires; **ptr_chunk_buf = '\0'; /* get identifier */ if (!strcmp(type, "doi") && ptr_rendinfo->ref_format == REFDOCBKX5) { dbires = request_ulinks(dbi_result_get_conn(ptr_rendinfo->dbires), n_refdb_id, 0 /* ref entry */, 5 /* link type */, 0 /* is_temp */, NULL); if (dbires == NULL) { return NULL; } while ((item = get_ulink(dbires)) != NULL) { if ((entitize_buf = mstrdup((char*)item)) == NULL) { free((char*)item); return NULL; } if (sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { free((char*)item); free(entitize_buf); return NULL; } if (print_element_x(entitize_buf, ptr_chunk_buf, ptr_chunk_buf_len, "biblioid", "class", "doi", NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(entitize_buf); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } n_have_data++; free(entitize_buf); } clean_request(dbires); } else { item = get_refdb_issn(ptr_rendinfo->dbires); if (item != NULL) { if ((entitize_buf = mstrdup((char*)item)) == NULL) { free((char*)item); return NULL; } if (sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { free((char*)item); free(entitize_buf); return NULL; } if (ptr_rendinfo->ref_format == REFDOCBKX5) { /* DocBook >= 5 */ if (print_element_x(entitize_buf, ptr_chunk_buf, ptr_chunk_buf_len, "biblioid", "class", type, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(entitize_buf); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } } else { if (!strcmp(type, "isbn")) { if (print_element_x(entitize_buf, ptr_chunk_buf, ptr_chunk_buf_len, "isbn", NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(entitize_buf); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } } else { if (print_element_x(entitize_buf, ptr_chunk_buf, ptr_chunk_buf_len, "issn", NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(entitize_buf); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } } } n_have_data++; free(entitize_buf); } } if (!n_have_data) { **ptr_chunk_buf = '\0'; } return *ptr_chunk_buf; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ add_author_db(): adds an author in DocBook format static char* add_author_db returns a pointer to authorstring struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered struct AUTHOR_INFO* ptr_ainfo ptr to a structure with the name parts char **ptr_chunk_buf ptr to an allocated string, may be resized size_t *ptr_chunk_buf_len ptr to length of ptr_chunk_buf struct xmlindent* ptr_indent ptr to structure with indentation info int n_ref_format reference type (REFDOCBKX|REFDOCBKX5) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static char* add_author_db(struct renderinfo* ptr_rendinfo, struct AUTHOR_INFO* ptr_ainfo, char** ptr_chunk_buf, size_t* ptr_chunk_buf_len, struct xmlindent* ptr_indent, int n_ref_format) { char* item; char* entitize_buf = NULL; **ptr_chunk_buf = '\0'; /* start with empty string */ if (!ptr_ainfo) { return *ptr_chunk_buf; } /* ToDo: check for corporate name */ if (!*(ptr_ainfo->lastname) && !*(ptr_ainfo->firstname) && !*(ptr_ainfo->middlename) && !*(ptr_ainfo->suffix)) { if ((entitize_buf = mstrdup(ptr_ainfo->name)) == NULL) { return NULL; } if (sgml_entitize(&entitize_buf, n_ref_format) == NULL) { free(entitize_buf); return NULL; } if (*(ptr_ainfo->role)) { if (print_element_x(entitize_buf, ptr_chunk_buf, ptr_chunk_buf_len, "corpauthor", "role", ptr_ainfo->role, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(entitize_buf); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } } else { if (print_element_x(entitize_buf, ptr_chunk_buf, ptr_chunk_buf_len, "corpauthor", NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(entitize_buf); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } } free(entitize_buf); } else { /* have name parts */ if (*(ptr_ainfo->role)) { if (print_elstart_x(ptr_chunk_buf, ptr_chunk_buf_len, "author", "role", ptr_ainfo->role, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(entitize_buf); return NULL; } } else { if (print_elstart_x(ptr_chunk_buf, ptr_chunk_buf_len, "author", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(entitize_buf); return NULL; } } if (n_ref_format == REFDOCBKX5) { if (print_elstart_x(ptr_chunk_buf, ptr_chunk_buf_len, "personname", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(entitize_buf); return NULL; } } if (*(ptr_ainfo->firstname)) { if ((entitize_buf = mstrdup(ptr_ainfo->firstname)) == NULL) { return NULL; } if (sgml_entitize(&entitize_buf, n_ref_format) == NULL) { free(entitize_buf); return NULL; } if (print_element_x(entitize_buf, ptr_chunk_buf, ptr_chunk_buf_len, "firstname", NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(entitize_buf); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } free(entitize_buf); } if (*(ptr_ainfo->middlename)) { for (item = strtok(ptr_ainfo->middlename, " "); item; item = strtok(NULL, " ")) { if ((entitize_buf = mstrdup(item)) == NULL) { return NULL; } if (sgml_entitize(&entitize_buf, n_ref_format) == NULL) { free(entitize_buf); return NULL; } if (print_element_x(entitize_buf, ptr_chunk_buf, ptr_chunk_buf_len, "othername", "role", "mi", NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(entitize_buf); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } free(entitize_buf); } } if (*(ptr_ainfo->lastname)) { if ((entitize_buf = mstrdup(ptr_ainfo->lastname)) == NULL) { return NULL; } if (sgml_entitize(&entitize_buf, n_ref_format) == NULL) { free(entitize_buf); return NULL; } if (print_element_x(entitize_buf, ptr_chunk_buf, ptr_chunk_buf_len, "surname", NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(entitize_buf); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } free(entitize_buf); } if (*(ptr_ainfo->suffix)) { if ((entitize_buf = mstrdup(ptr_ainfo->suffix)) == NULL) { return NULL; } if (sgml_entitize(&entitize_buf, n_ref_format) == NULL) { free(entitize_buf); return NULL; } if (print_element_x(entitize_buf, ptr_chunk_buf, ptr_chunk_buf_len, "lineage", NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(entitize_buf); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } free(entitize_buf); } if (n_ref_format == REFDOCBKX5) { if (print_elend_x(ptr_chunk_buf, ptr_chunk_buf_len, "personname", ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } } if (print_elend_x(ptr_chunk_buf, ptr_chunk_buf_len, "author", ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } } return *ptr_chunk_buf; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ add_author_info_db() adds author info to a DocBook bibliography static char* add_author_info_db returns ptr to ref if successful, NULL if not struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered int author_type 1=part 2=publication 3=set int n_refdb_id ID of the current dataset char** ptr_chunk_buf ptr to a buffer to receive output size_t* ptr_chunk_buf_len ptr to length of string struct xmlindent* ptr_indent ptr to structure with indentation info int n_ref_format reference type (REFDOCBKX|REFDOCBKX5) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static char* add_author_info_db(struct renderinfo* ptr_rendinfo, int author_type, int n_refdb_id, char** ptr_chunk_buf, size_t* ptr_chunk_buf_len, struct xmlindent* ptr_indent, int n_ref_format) { int nis_first = 1; size_t author_buf_len = 512; char *new_ref; char *dbauthor; char *author_buf; dbi_conn conn; dbi_result dbires; struct AUTHOR_INFO ainfo; if ((author_buf = malloc(author_buf_len)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } **ptr_chunk_buf = '\0'; conn = dbi_result_get_conn(ptr_rendinfo->dbires); /* get authors */ dbires = request_authors(conn, author_type, NULL /* all roles */, NULL, 0, n_refdb_id); if (dbires == NULL) { return NULL; } /* get buffer to assemble the docbook author output */ dbauthor = malloc((size_t)2048); /* fixed length ok afaik */ if (dbauthor == NULL) { clean_request(dbires); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } /* fetch all authors of this article */ while (get_author_parts(dbires, &ainfo) != NULL) { char* authorchunk; /* begin authorgroup element */ if (nis_first) { nis_first--; if (print_elstart_x(ptr_chunk_buf, ptr_chunk_buf_len, "authorgroup", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); clean_request(dbires); free(dbauthor); return NULL; } } authorchunk = add_author_db(ptr_rendinfo, &ainfo, &author_buf, &author_buf_len, ptr_indent, n_ref_format); if (authorchunk && *authorchunk) { if ((new_ref = mstrcat(*ptr_chunk_buf, authorchunk, ptr_chunk_buf_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(author_buf); return NULL; } else { *ptr_chunk_buf = new_ref; } } } free(dbauthor); free(author_buf); clean_request(dbires); /* close authorgroup element only if it was started previously */ if (!nis_first) { if (print_elend_x(ptr_chunk_buf, ptr_chunk_buf_len, "authorgroup", ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } } else { **ptr_chunk_buf = '\0'; } /* if there was no author info, chunk_buf is returned as an empty string */ return *ptr_chunk_buf; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ indent_notbelow_db(): checks whether or not to indent below the current element static int indent_notbelow_db returns 1 if not to indent, 0 if to indent const char* name ptr to element name ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int indent_notbelow_db(const char* name) { if (!strcmp(name, "date")) { return 1; } else { return 0; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ is_entry_db(): checks whether an element starts a new entry static int is_entry_db returns 1 if entry starts, 0 if not const char* name ptr to element name ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int is_entry_db(const char* name) { if (strstr(name, "biblioentry")) { return 1; } else { return 0; } } refdb-1.0.2/src/backend-teix.c000644 001750 001750 00000131176 12255427651 016755 0ustar00markusmarkus000000 000000 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ backend-teix.c defines the TEI XML output backend of refdbd markus@mhoenicka.de 2002-08-27 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ #include #include #include /* for definitions of log message priorities */ #include #include "refdb.h" #include "backend.h" #include "backend-teix.h" #include "strfncs.h" #include "linklist.h" #include "refdbd.h" #include "dbfncs.h" #include "risdb.h" #include "authorinfo.h" #include "connect.h" /* for get_status_msg() */ #include "xmlhelper.h" /* some globals */ extern int n_log_level; /* numeric version of log_level */ /* forward declarations of local functions */ static char* add_author_info_teix(struct renderinfo* ptr_rendinfo, int author_type, int n_refdb_id, char** ptr_chunk_buf, size_t* ptr_chunk_buf_len, struct xmlindent* ptr_indent, int n_ref_format); static char* add_analytic_teix(struct renderinfo* ptr_rendinfo, int n_refdb_id, char **ptr_chunk_buf, size_t *ptr_chunk_buf_len, const char* type, struct xmlindent* ptr_indent, int n_ref_format); static char* add_monogr_teix(struct renderinfo* ptr_rendinfo, int n_refdb_id, char **ptr_chunk_buf, size_t *ptr_chunk_buf_len, const char* type, struct xmlindent* ptr_indent, int n_ref_format); static char* add_series_teix(struct renderinfo* ptr_rendinfo, int n_refdb_id, char **ptr_chunk_buf, size_t *ptr_chunk_buf_len, const char* type, struct xmlindent* ptr_indent, int n_ref_format); static char* add_notes_teix(struct renderinfo* ptr_rendinfo, int n_refdb_id, char **ptr_chunk_buf, size_t *ptr_chunk_buf_len, struct xmlindent* ptr_indent); static char* add_abstract_teix(struct renderinfo* ptr_rendinfo, int n_refdb_id, char **ptr_chunk_buf, size_t *ptr_chunk_buf_len, struct xmlindent* ptr_indent); static int indent_notbelow_teix(const char* name); static int is_entry_teix(const char* name); /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ prepare_render_teix(): writes a header for the TEI XML P4 output of a query int prepare_render_teix returns 0 if successful, >0 if failed struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int prepare_render_teix(struct renderinfo* ptr_rendinfo) { char encodingstring[64] = ""; /* todo: is this enough? */ if (*((ptr_rendinfo->ptr_biblio_info)->encoding)) { sprintf(encodingstring, " encoding=\"%s\"", (ptr_rendinfo->ptr_biblio_info)->encoding); } if (*(ptr_rendinfo->ptr_clrequest->namespace)) { sprintf(*(ptr_rendinfo->ptr_ref), "\n<%s:listBibl xmlns:%s=\"http://www.tei-c.org/ns/1.0\">\n <%s:head>Bibliography\n", encodingstring, ptr_rendinfo->ptr_clrequest->namespace, ptr_rendinfo->ptr_clrequest->namespace, ptr_rendinfo->ptr_clrequest->namespace, ptr_rendinfo->ptr_clrequest->namespace); } else { sprintf(*(ptr_rendinfo->ptr_ref), "\n\nBibliography\n", encodingstring); } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ finish_render_teix(): writes a footer for the TEI XML P4 output of a query int finish_render_ris returns 0 if successful, >0 if failed struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int finish_render_teix(struct renderinfo* ptr_rendinfo) { char* new_ref; char ns[PREFS_BUF_LEN+32]; if (*(ptr_rendinfo->ptr_clrequest->namespace)) { sprintf(ns, "\n\n", ptr_rendinfo->ptr_clrequest->namespace); } else { strcpy(ns, "\n\n"); } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), ns, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } *(ptr_rendinfo->ptr_ref) = new_ref; return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ render_teix() renders a RIS dataset for TEI XML P4 export int render_teix returns 0 if successful, >0 if not struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int render_teix(struct renderinfo* ptr_rendinfo) { char *new_ref; /* used for reallocating buffer ref */ char *chunk; char *chunk_buf; const char *type; size_t chunk_buf_len; unsigned long long n_refdb_id; dbi_conn conn; struct xmlindent xindent; /*initialize xindent */ initialize_xmlindent(&xindent, 2, indent_notbelow_teix, is_entry_teix); /* rendering bibliographic information takes up to three levels of information: analytic: author and title of the article or chapter monographic: name of the journal/book, vol/issue/page info, editors series: series title, series editors */ chunk_buf_len = 1024; if ((chunk_buf = malloc(chunk_buf_len)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } conn = dbi_result_get_conn(ptr_rendinfo->dbires); if ((type = get_refdb_type(ptr_rendinfo->dbires)) == NULL) { free(chunk_buf); LOG_PRINT(LOG_WARNING, get_status_msg(234)); return 234; } n_refdb_id = my_dbi_result_get_idval(ptr_rendinfo->dbires, "refdb_id"); if ((ptr_rendinfo->ptr_biblio_info)->entry_id != NULL) { if (print_elstart_x(ptr_rendinfo->ptr_ref, ptr_rendinfo->ptr_ref_len, "biblStruct", "id", (ptr_rendinfo->ptr_biblio_info)->entry_id, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(chunk_buf); return 801; } } else { if (print_elstart_x(ptr_rendinfo->ptr_ref, ptr_rendinfo->ptr_ref_len, "biblStruct", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(chunk_buf); return 801; } } if (has_part_data(type)) { chunk = add_analytic_teix(ptr_rendinfo, n_refdb_id, &chunk_buf, &chunk_buf_len, type, &xindent, REFTEIX); if (chunk && *chunk) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), chunk, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(chunk_buf); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } } chunk = add_monogr_teix(ptr_rendinfo, n_refdb_id, &chunk_buf, &chunk_buf_len, type, &xindent, REFTEIX); if (chunk && *chunk) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), chunk, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(chunk_buf); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } if (has_set_data(type)) { chunk = add_series_teix(ptr_rendinfo, n_refdb_id, &chunk_buf, &chunk_buf_len, type, &xindent, REFTEIX); if (chunk && *chunk) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), chunk, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(chunk_buf); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } } /* add notes and abstract if requested */ /* notes */ if (strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "N1") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "ALL") != NULL) { chunk = add_notes_teix(ptr_rendinfo, n_refdb_id, &chunk_buf, &chunk_buf_len, &xindent); if (chunk && *chunk) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), chunk, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(chunk_buf); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } } /*----------------------------------------------------------------*/ /* abstract */ if (strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "N2") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "AB") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "ALL") != NULL) { chunk = add_abstract_teix(ptr_rendinfo, n_refdb_id, &chunk_buf, &chunk_buf_len, &xindent); if (chunk && *chunk) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), chunk, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(chunk_buf); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } } /* finish bibliography entry */ if (print_elend_x(ptr_rendinfo->ptr_ref, ptr_rendinfo->ptr_ref_len, "biblStruct", &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(chunk_buf); return 801; } free(chunk_buf); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ prepare_render_teix5(): writes a header for the TEI P5 XML output of a query int prepare_render_teix returns 0 if successful, >0 if failed struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int prepare_render_teix5(struct renderinfo* ptr_rendinfo) { char encodingstring[64] = ""; /* todo: is this enough? */ if (*((ptr_rendinfo->ptr_biblio_info)->encoding)) { sprintf(encodingstring, " encoding=\"%s\"", (ptr_rendinfo->ptr_biblio_info)->encoding); } if (*(ptr_rendinfo->ptr_clrequest->namespace)) { sprintf(*(ptr_rendinfo->ptr_ref), "\n<%s:listBibl xmlns:%s=\"http://www.tei-c.org/ns/1.0\">\n <%s:head>Bibliography\n", encodingstring, ptr_rendinfo->ptr_clrequest->namespace, ptr_rendinfo->ptr_clrequest->namespace, ptr_rendinfo->ptr_clrequest->namespace, ptr_rendinfo->ptr_clrequest->namespace); } else { sprintf(*(ptr_rendinfo->ptr_ref), "\n\nBibliography\n", encodingstring); } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ finish_render_teix5(): writes a footer for the TEI XML P5 output of a query int finish_render_ris returns 0 if successful, >0 if failed struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int finish_render_teix5(struct renderinfo* ptr_rendinfo) { char* new_ref; char ns[PREFS_BUF_LEN+32]; if (*(ptr_rendinfo->ptr_clrequest->namespace)) { sprintf(ns, "\n\n", ptr_rendinfo->ptr_clrequest->namespace); } else { strcpy(ns, "\n\n"); } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), ns, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } *(ptr_rendinfo->ptr_ref) = new_ref; return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ render_teix5() renders a RIS dataset for TEI XML P5 export int render_teix returns 0 if successful, >0 if not struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int render_teix5(struct renderinfo* ptr_rendinfo) { char *new_ref; /* used for reallocating buffer ref */ char *chunk; char *chunk_buf; const char *type; size_t chunk_buf_len; unsigned long long n_refdb_id; dbi_conn conn; struct xmlindent xindent; /*initialize xindent */ initialize_xmlindent(&xindent, 2, indent_notbelow_teix, is_entry_teix); /* rendering bibliographic information takes up to three levels of information: analytic: author and title of the article or chapter monographic: name of the journal/book, vol/issue/page info, editors series: series title, series editors */ chunk_buf_len = 1024; if ((chunk_buf = malloc(chunk_buf_len)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } conn = dbi_result_get_conn(ptr_rendinfo->dbires); if ((type = get_refdb_type(ptr_rendinfo->dbires)) == NULL) { free(chunk_buf); LOG_PRINT(LOG_WARNING, get_status_msg(234)); return 234; } n_refdb_id = my_dbi_result_get_idval(ptr_rendinfo->dbires, "refdb_id"); if ((ptr_rendinfo->ptr_biblio_info)->entry_id != NULL) { if (print_elstart_x(ptr_rendinfo->ptr_ref, ptr_rendinfo->ptr_ref_len, "biblStruct", "id", (ptr_rendinfo->ptr_biblio_info)->entry_id, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(chunk_buf); return 801; } } else { if (print_elstart_x(ptr_rendinfo->ptr_ref, ptr_rendinfo->ptr_ref_len, "biblStruct", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(chunk_buf); return 801; } } if (has_part_data(type)) { chunk = add_analytic_teix(ptr_rendinfo, n_refdb_id, &chunk_buf, &chunk_buf_len, type, &xindent, REFTEIX5); if (chunk && *chunk) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), chunk, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(chunk_buf); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } } chunk = add_monogr_teix(ptr_rendinfo, n_refdb_id, &chunk_buf, &chunk_buf_len, type, &xindent, REFTEIX5); if (chunk && *chunk) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), chunk, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(chunk_buf); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } if (has_set_data(type)) { chunk = add_series_teix(ptr_rendinfo, n_refdb_id, &chunk_buf, &chunk_buf_len, type, &xindent, REFTEIX5); if (chunk && *chunk) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), chunk, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(chunk_buf); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } } /* add notes and abstract if requested */ /* notes */ if (strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "N1") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "ALL") != NULL) { chunk = add_notes_teix(ptr_rendinfo, n_refdb_id, &chunk_buf, &chunk_buf_len, &xindent); if (chunk && *chunk) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), chunk, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(chunk_buf); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } } /*----------------------------------------------------------------*/ /* abstract */ if (strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "N2") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "AB") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "ALL") != NULL) { chunk = add_abstract_teix(ptr_rendinfo, n_refdb_id, &chunk_buf, &chunk_buf_len, &xindent); if (chunk && *chunk) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), chunk, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(chunk_buf); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } } /* finish bibliography entry */ if (print_elend_x(ptr_rendinfo->ptr_ref, ptr_rendinfo->ptr_ref_len, "biblStruct", &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(chunk_buf); return 801; } free(chunk_buf); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ add_analytic_teix() adds analytic level info to a TEI XML bibliography static char* add_analytic_teix returns ptr to ref if successful, NULL if not struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered int n_refdb_id ID of the current dataset char **ptr_chunk_buf ptr to an allocated string, may be resized size_t *ptr_chunk_buf_len ptr to length of ptr_chunk_buf const char* type ptr to string containing reference type struct xmlindent* ptr_indent ptr to structure with indentation info int n_ref_format REFTEIX or REFTEIX5 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static char* add_analytic_teix(struct renderinfo* ptr_rendinfo, int n_refdb_id, char **ptr_chunk_buf, size_t *ptr_chunk_buf_len, const char* type, struct xmlindent* ptr_indent, int n_ref_format) { int n_have_data = 0; /* set to 1 if we have some data */ char *new_ref; char *entitize_buf; char *author_buf; char *author_result; const char *item; size_t author_buf_len; **ptr_chunk_buf = '\0'; author_buf_len = 1024; if ((author_buf = malloc(author_buf_len)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } /* start analytic information */ if (print_elstart_x(ptr_chunk_buf, ptr_chunk_buf_len, "analytic", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(author_buf); return NULL; } /* add authors, if any */ author_result = add_author_info_teix(ptr_rendinfo, 1, n_refdb_id, &author_buf, &author_buf_len, ptr_indent, n_ref_format); if (!author_result) { free(author_buf); return NULL; } else if (*author_result) { n_have_data++; if ((new_ref = mstrcat(*ptr_chunk_buf, author_result, ptr_chunk_buf_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(author_buf); return NULL; } else { *ptr_chunk_buf = new_ref; } } free(author_buf); /* get the article or book title */ item = get_refdb_title_copy(ptr_rendinfo->dbires); if (item != NULL && *item) { n_have_data++; if ((entitize_buf = mstrdup((char*)item)) == NULL) { free((char*)item); return NULL; } if (sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { free((char*)item); free(entitize_buf); return NULL; } if (print_element_x(entitize_buf, ptr_chunk_buf, ptr_chunk_buf_len, "title", "level", "a", NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free((char*)item); free(entitize_buf); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } free(entitize_buf); free((char*)item); } /* finish analytic information */ if (print_elend_x(ptr_chunk_buf, ptr_chunk_buf_len, "analytic", ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } if (!n_have_data) { **ptr_chunk_buf = '\0'; } return *ptr_chunk_buf; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ add_monogr_teix() adds monography level info to a TEI XML bibliography static char* add_monogr_teix returns ptr to ref if successful, NULL if not struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered int n_refdb_id ID of the current dataset char **ptr_chunk_buf ptr to an allocated string, may be resized size_t *ptr_chunk_buf_len ptr to length of ptr_chunk_buf const char* type ptr to string containing reference type struct xmlindent* ptr_indent ptr to structure with indentation info int n_ref_format REFTEIX or REFTEIX5 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static char* add_monogr_teix(struct renderinfo* ptr_rendinfo, int n_refdb_id, char **ptr_chunk_buf, size_t *ptr_chunk_buf_len, const char* type, struct xmlindent* ptr_indent, int n_ref_format) { int n_have_data = 0; /* set to 1 if we have some data */ int i; int errcode; /* receives error code for periodical requests */ char periodical[256]; char *new_ref; char *entitize_buf; char *author_buf; char *author_result; const char *item; size_t author_buf_len; dbi_conn conn; **ptr_chunk_buf = '\0'; author_buf_len = 1024; if ((author_buf = malloc(author_buf_len)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } conn = dbi_result_get_conn(ptr_rendinfo->dbires); /* start monographic information */ if (print_elstart_x(ptr_chunk_buf, ptr_chunk_buf_len, "monogr", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(author_buf); return NULL; } /* add editors, if any */ author_result = add_author_info_teix(ptr_rendinfo, 2, n_refdb_id, &author_buf, &author_buf_len, ptr_indent, n_ref_format); if (!author_result) { free(author_buf); return NULL; } else if (*author_result) { n_have_data++; if ((new_ref = mstrcat(*ptr_chunk_buf, author_result, ptr_chunk_buf_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(author_buf); return NULL; } else { *ptr_chunk_buf = new_ref; } } free(author_buf); if (has_periodical_data(type)) { /* journal information, if any */ for (i = 0; i < 4; i++) { /* request journal */ item = get_periodical(conn, periodical, /*ptr_rendinfo->database*/NULL, i, &errcode, 0, my_dbi_result_get_idval(ptr_rendinfo->dbires, "refdb_id"), NULL /* no frequency required */); if (item != NULL) { if (!*item) { continue; } if ((entitize_buf = mstrdup((char*)item)) == NULL) { return NULL; } if (sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { free(entitize_buf); return NULL; } /* if ((new_ref = mstrcat(*ptr_chunk_buf, journaltype[i], ptr_chunk_buf_len, 0)) == NULL) { */ /* free(entitize_buf); */ /* LOG_PRINT(LOG_CRIT, get_status_msg(801)); */ /* return NULL; */ /* } */ /* else { */ /* *ptr_chunk_buf = new_ref; */ /* } */ if (print_element_x(entitize_buf, ptr_chunk_buf, ptr_chunk_buf_len, "title", "level", "j", NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(entitize_buf); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } free(entitize_buf); n_have_data++; } } } /* monographic title */ item = get_refdb_booktitle_copy(ptr_rendinfo->dbires); if (item != NULL) { if ((entitize_buf = mstrdup((char*)item)) == NULL) { free((char*)item); return NULL; } if (sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { free((char*)item); free(entitize_buf); return NULL; } if (print_element_x(entitize_buf, ptr_chunk_buf, ptr_chunk_buf_len, "title", "level", "m", NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(entitize_buf); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } free(entitize_buf); free((char*)item); n_have_data++; } if (print_elstart_x(ptr_chunk_buf, ptr_chunk_buf_len, "imprint", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } /* ISBN/ISSN */ if (strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "SN") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "ALL") != NULL) { if ((item = get_refdb_issn(ptr_rendinfo->dbires)) != NULL) { if ((entitize_buf = mstrdup((char*)item)) == NULL) { return NULL; } if (sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { free(entitize_buf); return NULL; } if (print_element_x(entitize_buf, ptr_chunk_buf, ptr_chunk_buf_len, "idno", "type", "isbn", NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(entitize_buf); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } free(entitize_buf); n_have_data++; } } /* volume/issue info */ if ((item = get_refdb_volume(ptr_rendinfo->dbires)) != NULL) { if ((entitize_buf = mstrdup((char*)item)) == NULL) { return NULL; } if (sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { free(entitize_buf); return NULL; } /* volume */ if (print_element_x(entitize_buf, ptr_chunk_buf, ptr_chunk_buf_len, "biblScope", "type", "vol", NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(entitize_buf); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } free(entitize_buf); n_have_data++; } /* issue */ if ((item = get_refdb_issue(ptr_rendinfo->dbires)) != NULL) { if ((entitize_buf = mstrdup((char*)item)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } if (sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { free(entitize_buf); return NULL; } if (print_element_x(entitize_buf, ptr_chunk_buf, ptr_chunk_buf_len, "biblScope", "type", "issue", NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(entitize_buf); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } free(entitize_buf); n_have_data++; } /* pages */ if ((item = get_refdb_startpage(ptr_rendinfo->dbires)) != NULL) { char* entitized_endpage; size_t entitize_buf_len; if ((entitize_buf = mstrdup((char*)item)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } if (sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { free(entitize_buf); return NULL; } entitize_buf_len = strlen(entitize_buf); /* end page */ if ((item = get_refdb_endpage(ptr_rendinfo->dbires)) != NULL) { if ((entitized_endpage = mstrdup((char*)item)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } if (sgml_entitize(&entitized_endpage, ptr_rendinfo->ref_format) == NULL) { free(entitize_buf); free(entitized_endpage); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } if ((new_ref = mstrcat(entitize_buf, "-", &entitize_buf_len, 0)) == NULL) { free(entitize_buf); free(entitized_endpage); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } else { entitize_buf = new_ref; } if ((new_ref = mstrcat(entitize_buf, entitized_endpage, &entitize_buf_len, 0)) == NULL) { free(entitize_buf); free(entitized_endpage); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } else { entitize_buf = new_ref; } free(entitized_endpage); } if (print_element_x(entitize_buf, ptr_chunk_buf, ptr_chunk_buf_len, "biblScope", "type", "pages", NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free((char*)item); free(entitize_buf); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } free(entitize_buf); n_have_data++; } /* reuse periodical buffer for date*/ if ((item = get_refdb_pubyear(ptr_rendinfo->dbires, periodical)) != NULL) { if (print_element_x(periodical, ptr_chunk_buf, ptr_chunk_buf_len, "date", NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free((char*)item); free(entitize_buf); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } n_have_data++; } /* publisher and city */ if (strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "PB") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "ALL") != NULL) { if ((item = get_refdb_publisher(ptr_rendinfo->dbires)) != NULL) { if ((entitize_buf = mstrdup((char*)item)) == NULL) { return NULL; } if (sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { free(entitize_buf); return NULL; } if (print_element_x(entitize_buf, ptr_chunk_buf, ptr_chunk_buf_len, "publisher", NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } free(entitize_buf); if (strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "CY") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "ALL") != NULL) { /* pubplace - use only if publisher is known */ if ((item = get_refdb_city(ptr_rendinfo->dbires)) != NULL) { if ((entitize_buf = mstrdup((char*)item)) == NULL) { return NULL; } if (sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { free(entitize_buf); return NULL; } if (print_element_x(entitize_buf, ptr_chunk_buf, ptr_chunk_buf_len, "pubplace", NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } free(entitize_buf); } } n_have_data++; } } if (print_elend_x(ptr_chunk_buf, ptr_chunk_buf_len, "imprint", ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } /* finish monographic information */ if (print_elend_x(ptr_chunk_buf, ptr_chunk_buf_len, "monogr", ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } if (!n_have_data) { **ptr_chunk_buf = '\0'; } return *ptr_chunk_buf; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ add_series_teix() adds series level info to a TEI XML bibliography static char* add_series_teix returns ptr to ref if successful, NULL if not struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered int n_refdb_id ID of the current dataset char **ptr_chunk_buf ptr to an allocated string, may be resized size_t *ptr_chunk_buf_len ptr to length of ptr_chunk_buf const char* type ptr to string containing reference type struct xmlindent* ptr_indent ptr to structure with indentation info int n_ref_format REFTEIX or REFTEIX5 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static char* add_series_teix(struct renderinfo* ptr_rendinfo, int n_refdb_id, char **ptr_chunk_buf, size_t *ptr_chunk_buf_len, const char* type, struct xmlindent* ptr_indent, int n_ref_format) { int n_have_data = 0; /* set to 1 if we have some data */ char *new_ref; char *entitize_buf; char *author_buf; char *author_result; const char *item; size_t author_buf_len; **ptr_chunk_buf = '\0'; author_buf_len = 1024; if ((author_buf = malloc(author_buf_len)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } /* start series info */ if (print_elstart_x(ptr_chunk_buf, ptr_chunk_buf_len, "series", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(author_buf); return NULL; } /* add editors, if any */ author_result = add_author_info_teix(ptr_rendinfo, 3, n_refdb_id, &author_buf, &author_buf_len, ptr_indent, n_ref_format); if (!author_result) { free(author_buf); return NULL; } else if (*author_result) { n_have_data++; if ((new_ref = mstrcat(*ptr_chunk_buf, author_result, ptr_chunk_buf_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(author_buf); return NULL; } else { *ptr_chunk_buf = new_ref; } } free(author_buf); /* series title, if any */ item = get_refdb_title_series_copy(ptr_rendinfo->dbires); if (item != NULL) { if ((entitize_buf = mstrdup((char*)item)) == NULL) { free((char*)item); return NULL; } if (sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { free((char*)item); free(entitize_buf); return NULL; } if (print_element_x(entitize_buf, ptr_chunk_buf, ptr_chunk_buf_len, "title", "level", "s", NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free((char*)item); free(entitize_buf); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } free(entitize_buf); free((char*)item); n_have_data++; } /* finish series information */ if (print_elend_x(ptr_chunk_buf, ptr_chunk_buf_len, "series", ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } if (!n_have_data) { **ptr_chunk_buf = '\0'; } return *ptr_chunk_buf; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ add_author_info_teix() adds author info to a TEI XML bibliography static char* add_author_info_teix returns ptr to ref if successful, NULL if not struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered int author_type 1=author 2=editor 3=series editor int n_refdb_id ID of the current dataset struct xmlindent* ptr_indent ptr to structure with indentation info int n_ref_format REFTEIX or REFTEIX5 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static char* add_author_info_teix(struct renderinfo* ptr_rendinfo, int author_type, int n_refdb_id, char** ptr_chunk_buf, size_t* ptr_chunk_buf_len, struct xmlindent* ptr_indent, int n_ref_format) { int n_have_data = 0; char *entitize_buf; char *item; char author_start[3][9] = {"author", "editor", "editor"}; dbi_conn conn; dbi_result dbires; struct AUTHOR_INFO ainfo; **ptr_chunk_buf = '\0'; conn = dbi_result_get_conn(ptr_rendinfo->dbires); /* get authors */ dbires = request_authors(conn, author_type, NULL /* all roles */, NULL, 0, n_refdb_id); if (dbires == NULL) { return NULL; } /* fetch all authors of this article */ while ((get_author_parts(dbires, &ainfo)) != NULL) { if (!*(ainfo.lastname) && !*(ainfo.firstname) && !*(ainfo.middlename) && !*(ainfo.suffix)) { if (*(ainfo.name)) { n_have_data++; if (print_elstart_x(ptr_chunk_buf, ptr_chunk_buf_len, "author", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); clean_request(dbires); return NULL; } if ((entitize_buf = mstrdup(ainfo.name)) == NULL) { clean_request(dbires); return NULL; } if (sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { clean_request(dbires); free(entitize_buf); return NULL; } if (print_element_x(entitize_buf, ptr_chunk_buf, ptr_chunk_buf_len, "orgName", NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(entitize_buf); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } free(entitize_buf); if (print_elend_x(ptr_chunk_buf, ptr_chunk_buf_len, "author", ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } } } else { if (print_elstart_x(ptr_chunk_buf, ptr_chunk_buf_len, author_start[author_type-1], NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); clean_request(dbires); return NULL; } if (print_elstart_x(ptr_chunk_buf, ptr_chunk_buf_len, "persName", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); clean_request(dbires); return NULL; } if (*(ainfo.firstname)) { n_have_data++; if ((entitize_buf = mstrdup(ainfo.firstname)) == NULL) { clean_request(dbires); return NULL; } if (sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { clean_request(dbires); free(entitize_buf); return NULL; } if (n_ref_format == REFTEIX5) { if (print_element_x(entitize_buf, ptr_chunk_buf, ptr_chunk_buf_len, "forename", NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(entitize_buf); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } } else { if (print_element_x(entitize_buf, ptr_chunk_buf, ptr_chunk_buf_len, "foreName", NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(entitize_buf); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } } free(entitize_buf); } if (*(ainfo.middlename)) { n_have_data++; for (item = strtok(ainfo.middlename, " "); item; item = strtok(NULL, " ")) { if ((entitize_buf = mstrdup(item)) == NULL) { clean_request(dbires); return NULL; } if (sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { clean_request(dbires); free(entitize_buf); return NULL; } if (print_element_x(entitize_buf, ptr_chunk_buf, ptr_chunk_buf_len, "addName", NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(entitize_buf); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } free(entitize_buf); } } if (*(ainfo.lastname)) { n_have_data++; if ((entitize_buf = mstrdup(ainfo.lastname)) == NULL) { clean_request(dbires); return NULL; } if (sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { clean_request(dbires); free(entitize_buf); return NULL; } if (print_element_x(entitize_buf, ptr_chunk_buf, ptr_chunk_buf_len, "surname", NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(entitize_buf); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } free(entitize_buf); } if (*(ainfo.suffix)) { n_have_data++; if ((entitize_buf = mstrdup(ainfo.firstname)) == NULL) { clean_request(dbires); return NULL; } if (sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { clean_request(dbires); free(entitize_buf); return NULL; } if (print_element_x(entitize_buf, ptr_chunk_buf, ptr_chunk_buf_len, "genName", NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(entitize_buf); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } free(entitize_buf); } if (print_elend_x(ptr_chunk_buf, ptr_chunk_buf_len, "persName", ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } if (print_elend_x(ptr_chunk_buf, ptr_chunk_buf_len, author_start[author_type-1], ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } } } if (!n_have_data) { **ptr_chunk_buf = '\0'; } clean_request(dbires); /* if there was no author info, chunk_buf is returned unaltered */ return *ptr_chunk_buf; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ add_notes_teix() adds notes info to a TEI bibliography static char* add_notes_teix returns ptr to ref if successful, NULL if not struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered int n_refdb_id ID of the current dataset char **ptr_chunk_buf ptr to an allocated string, may be resized size_t *ptr_chunk_buf_len ptr to length of ptr_chunk_buf struct xmlindent* ptr_indent ptr to structure with indentation info ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static char* add_notes_teix(struct renderinfo* ptr_rendinfo, int n_refdb_id, char **ptr_chunk_buf, size_t *ptr_chunk_buf_len, struct xmlindent* ptr_indent) { int n_have_data = 0; /* set to 1 if we have some data */ char *entitize_buf; const char *item; **ptr_chunk_buf = '\0'; /* note of current user, if any */ item = get_notes_copy(ptr_rendinfo->dbires, ptr_rendinfo->username); if (item && *item) { n_have_data++; if ((entitize_buf = mstrdup((char*)item)) == NULL) { free((char*)item); return NULL; } if (sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { free((char*)item); free(entitize_buf); return NULL; } if (print_element_x(entitize_buf, ptr_chunk_buf, ptr_chunk_buf_len, "note", "type", "annotation", NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(entitize_buf); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } } if (!n_have_data) { **ptr_chunk_buf = '\0'; } return *ptr_chunk_buf; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ add_abstract_teix() adds abstract to a TEI bibliography static char* add_abstract_db returns ptr to ref if successful, NULL if not struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered int n_refdb_id ID of the current dataset char **ptr_chunk_buf ptr to an allocated string, may be resized size_t *ptr_chunk_buf_len ptr to length of ptr_chunk_buf struct xmlindent* ptr_indent ptr to structure with indentation info ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static char* add_abstract_teix(struct renderinfo* ptr_rendinfo, int n_refdb_id, char **ptr_chunk_buf, size_t *ptr_chunk_buf_len, struct xmlindent* ptr_indent) { int n_have_data = 0; /* set to 1 if we have some data */ char *entitize_buf; const char *item; **ptr_chunk_buf = '\0'; /* abstract, if any */ item = get_refdb_abstract_copy(ptr_rendinfo->dbires); if (item != NULL) { n_have_data++; if ((entitize_buf = mstrdup((char*)item)) == NULL) { free((char*)item); return NULL; } if (sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { free((char*)item); free(entitize_buf); return NULL; } if (print_element_x(entitize_buf, ptr_chunk_buf, ptr_chunk_buf_len, "abstract", NULL, NULL, NULL, NULL, ptr_indent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free((char*)item); free(entitize_buf); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } free(entitize_buf); free((char*)item); } if (!n_have_data) { **ptr_chunk_buf = '\0'; } return *ptr_chunk_buf; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ indent_notbelow_teix(): checks whether or not to indent below the current element static int indent_notbelow_teix returns 1 if not to indent, 0 if to indent const char* name ptr to element name ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int indent_notbelow_teix(const char* name) { if (!strcmp(name, "date")) { return 1; } else { return 0; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ is_entry_teix(): checks whether an element starts a new entry static int is_entry_teix returns 1 if entry starts, 0 if not const char* name ptr to element name ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int is_entry_teix(const char* name) { if (!strcmp(name, "biblStruct")) { return 1; } else { return 0; } } refdb-1.0.2/src/backend-bibtex.c000755 001750 001750 00000140571 12255427650 017262 0ustar00markusmarkus000000 000000 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ backend-bibtex.c defines the bibtex backend of refdbd markus@mhoenicka.de 8-8-00 $Id: backend-bibtex.c,v 1.16.2.12 2006/04/10 21:03:02 mhoenicka Exp $ 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ #include #include /* for definitions of log message priorities */ #include #include /* database abstraction layer */ #include "refdb.h" #include "connect.h" #include "linklist.h" #include "backend.h" #include "strfncs.h" #include "tokenize.h" #include "refdbd.h" /* for struct ADDRESULT */ #include "xmlhelper.h" #include "backend-bibtex.h" #include "backend-dbib.h" #include "dbfncs.h" /* some globals */ extern int n_log_level; /* numeric version of log_level */ extern char main_db[]; /* the style information if load_style() was successful */ extern dbi_result dbi_style_res; extern char cs_term[]; /* forward declarations of local functions */ static char* bibtexify_author(char** ptr_bibauthor, char* author); static char* print_field_bibtex(const char* item, struct renderinfo* ptr_rendinfo, const char* start_string); static int add_partdata_bibtex(char** ptr_buffer, size_t* ptr_buffer_len, struct renderinfo* ptr_rendinfo); static int add_setdata_bibtex(char** ptr_buffer, size_t* ptr_buffer_len, struct renderinfo* ptr_rendinfo); /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ prepare_render_bibtex(): writes a header for the bibtex output of a query int prepare_render_bibtex returns 0 if successful, >0 if not struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int prepare_render_bibtex(struct renderinfo* ptr_rendinfo) { /* we just make sure that we start with a clean string */ (*(ptr_rendinfo->ptr_ref))[0] = '\0'; return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ finish_render_bibtex(): writes a footer for the bibtex output of a query int finish_render_bibtex returns 0 if successful, >0 if failed struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int finish_render_bibtex(struct renderinfo* ptr_rendinfo) { char* new_ref; if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "\n", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } *(ptr_rendinfo->ptr_ref) = new_ref; return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ render_bibtex() renders a RIS dataset for bibtex output int render_bibtex returns 0 if successful, >0 if failed struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int render_bibtex(struct renderinfo* ptr_rendinfo) { int nperiodical_type; int sql_command_len; int i; /* what the hell is this? */ int errcode; /* receives error code when retrieving periodical */ int n_multiple_db = 0; /* if 1, driver supports multiple databases per conn */ int retval = 0; unsigned int n_id; size_t buffer_len = 4096; char have_author = 0; char *new_ref; char *bibauthor; char *sql_command; /* buffer for assembling SQL queries */ char *quoted_journal; const char *item; const char *drivername; const char *type; const char *thesistype = NULL; char date_buffer[256]; char role[2][7] = {"author", "editor"}; char* buffer; dbi_result dbires; dbi_result dbirescit; struct BIBCONNS bibconns; dbi_driver driver; bibconns.conn = NULL; bibconns.conn_refdb = NULL; bibconns.conn_source = NULL; if ((buffer = malloc(buffer_len)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); retval = 801; goto cleanup; } *buffer = '\0'; if ((type = get_refdb_type(ptr_rendinfo->dbires)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(234)); retval = 234; goto cleanup; } if (!strcmp(type, "THES")) { thesistype = get_refdb_degree(ptr_rendinfo->dbires); } bibconns.conn = dbi_result_get_conn(ptr_rendinfo->dbires); bibconns.conn_source = bibconns.conn; driver = dbi_conn_get_driver(bibconns.conn); drivername = dbi_driver_get_name(driver); if (ptr_rendinfo->nuse_citestyle) { sql_command_len = 512; sql_command = malloc(sql_command_len); if (!sql_command) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } /* retrieve basic information about the bibliography style from CITSTYLE into ptr_result */ quoted_journal = mstrdup((ptr_rendinfo->ptr_biblio_info)->format_string); if (!dbi_conn_quote_string(bibconns.conn, "ed_journal)) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(sql_command); return 801; } /* db capability: multiple databases per connection */ if (!strcmp(my_dbi_conn_get_cap(bibconns.conn, "multiple_db"), "t")) { bibconns.conn_refdb = bibconns.conn; n_multiple_db = 1; sprintf(sql_command, "SELECT ID FROM %s.CITSTYLE WHERE JOURNAL=%s", main_db, quoted_journal); } else { sprintf(sql_command, "SELECT ID FROM CITSTYLE WHERE JOURNAL=%s", quoted_journal); /* need another connection to the database refdb */ if ((bibconns.conn_refdb = connect_to_db(ptr_rendinfo->ptr_clrequest, main_db, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(202)); free(sql_command); return 202; } } free(quoted_journal); dbirescit = dbi_conn_query(bibconns.conn_refdb, sql_command); LOG_PRINT(LOG_DEBUG, sql_command); free(sql_command); if (!dbirescit) { LOG_PRINT(LOG_WARNING, get_status_msg(234)); if (!n_multiple_db) { dbi_conn_close(bibconns.conn_refdb); } return 234; } if (dbi_result_next_row(dbirescit)) { n_id = my_dbi_result_get_int_idval(dbirescit, "ID"); if (!load_style(type, n_id, bibconns.conn_refdb)) { LOG_PRINT(LOG_WARNING, get_status_msg(842)); if (!n_multiple_db) { dbi_conn_close(bibconns.conn_refdb); } return 842; } } else { LOG_PRINT(LOG_WARNING, get_status_msg(269)); if (!n_multiple_db) { dbi_conn_close(bibconns.conn_refdb); } return 269; } LOG_PRINT(LOG_DEBUG, "style information loaded"); } /* the first entries should always fit, don't hassle with mstrcat() */ /*----------------------------------------------------------------*/ /* type */ /* the bibtex backend uses the following mapping between RIS types and bibtex types */ /* ABST @misc ADVS @misc ART @misc BILL @misc BOOK @book CASE @misc CHAP @incollection COMP @misc CONF @inproceedings CTLG @misc DATA @misc ELEC @misc GEN @misc HEAR @proceedings ICOMM @misc INPR @misc JFULL @article JOUR @article MAP @misc MGZN @article MPCT @misc MUSIC @misc NEWS @misc PAMP @misc PAT @misc PCOMM @misc RPRT @techreport SER @book SLIDE @misc SOUND @misc STAT @misc THES @phdthesis (could be mastersthesis as well, ambiguous!) UNBILL@misc UNPB @unpublished VIDEO @misc */ if (strcmp(type, "JOUR") == 0 || strcmp(type, "JFULL") == 0 || strcmp(type, "MGZN") == 0) { /* LOG_PRINT(LOG_DEBUG, "start JOUR"); */ strcat(*(ptr_rendinfo->ptr_ref), "@ARTICLE{ "); /* LOG_PRINT(LOG_DEBUG, "done JOUR"); */ } else if (strcmp(type, "BOOK") == 0 || strcmp(type, "SER") == 0) { strcat(*(ptr_rendinfo->ptr_ref), "@BOOK{ "); } else if (strcmp(type, "CHAP") == 0) { strcat(*(ptr_rendinfo->ptr_ref), "@INCOLLECTION{ "); } else if (strcmp(type, "THES") == 0) { if (thesistype && !strcmp(thesistype, "masters")) { strcat(*(ptr_rendinfo->ptr_ref), "@MASTERSTHESIS{ "); } else { strcat(*(ptr_rendinfo->ptr_ref), "@PHDTHESIS{ "); } } else if (strcmp(type, "CONF") == 0) { strcat(*(ptr_rendinfo->ptr_ref), "@INPROCEEDINGS{ "); } else if (strcmp(type, "HEAR") == 0) { strcat(*(ptr_rendinfo->ptr_ref), "@PROCEEDINGS{ "); } else if (strcmp(type, "RPRT") == 0) { strcat(*(ptr_rendinfo->ptr_ref), "@TECHREPORT{ "); } else if (strcmp(type, "UNPB") == 0) { strcat(*(ptr_rendinfo->ptr_ref), "@UNPUBLISHED{ "); } else { strcat(*(ptr_rendinfo->ptr_ref), "@MISC{ "); } /*----------------------------------------------------------------*/ /* ID */ /* if (ptr_rendinfo->dbname) { */ /* strcat(*(ptr_rendinfo->ptr_ref), ptr_rendinfo->dbname); */ /* strcat(*(ptr_rendinfo->ptr_ref), "-ID"); */ /* } */ /* else { */ /* strcat(*(ptr_rendinfo->ptr_ref), "ID"); */ /* } */ /* get_refdb_id(ptr_rendinfo->dbires, id); */ /* if (*id) { */ /* strcat(*(ptr_rendinfo->ptr_ref), id); */ /* ID */ /* strcat(*(ptr_rendinfo->ptr_ref), ",\n"); */ item = get_refdb_citekey(ptr_rendinfo->dbires); if (item && *item) { /* the citation format is: [dbname:]citekey */ if (ptr_rendinfo->dbname) { strcat(*(ptr_rendinfo->ptr_ref), ptr_rendinfo->dbname); strcat(*(ptr_rendinfo->ptr_ref), ":"); } strcat(*(ptr_rendinfo->ptr_ref), item); /* citekey */ strcat(*(ptr_rendinfo->ptr_ref), ",\n"); } else { unload_style(); /* will do no harm if load_style() was not called so we don't have to wrap it with a conditional each time */ if (!n_multiple_db) { dbi_conn_close(bibconns.conn_refdb); } return 234; } /*----------------------------------------------------------------*/ /* pubyear */ item = get_refdb_pubyear(ptr_rendinfo->dbires, date_buffer); if (item != NULL) { strcat(*(ptr_rendinfo->ptr_ref), " YEAR = {"); strcat(*(ptr_rendinfo->ptr_ref), date_buffer); /* year */ strcat(*(ptr_rendinfo->ptr_ref), "},\n"); } /*----------------------------------------------------------------*/ /* the part apparatus (analytic) */ if (has_part_data(type)) { if ((retval = add_partdata_bibtex(&buffer, &buffer_len, ptr_rendinfo)) != 0) { goto cleanup; } else { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), buffer, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); retval = 801; goto cleanup; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } *buffer = '\0'; } /*----------------------------------------------------------------*/ /* the publication apparatus (monographic) */ /*----------------------------------------------------------------*/ /* authors */ /* we loop here to first create authors and then editors if needed */ for (i = 0; i < 2; i++) { have_author = 0; dbires = request_authors(bibconns.conn, 2 /* publication */, role[i], NULL, 0, my_dbi_result_get_idval(ptr_rendinfo->dbires, "refdb_id")); if (!dbires) { unload_style(); if (!n_multiple_db) { dbi_conn_close(bibconns.conn_refdb); } LOG_PRINT(LOG_WARNING, get_status_msg(234)); return 234; } /* we're done if there are no authors or editors to list */ if (dbi_result_get_numrows(dbires) == 0) { clean_request(dbires); continue; } if (i == 0) { /* authors */ new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), " AUTHOR = {", ptr_rendinfo->ptr_ref_len, 0); } else { /* editors */ new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), " EDITOR = {", ptr_rendinfo->ptr_ref_len, 0); } if (new_ref == NULL) { clean_request(dbires); unload_style(); if (!n_multiple_db) { dbi_conn_close(bibconns.conn_refdb); } LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } /* fetch all authors */ while ((item = get_author(dbires)) != NULL) { have_author = 1; /* at least one author is present */ if (bibtexify_author(&bibauthor, (char*)item) == NULL) { clean_request(dbires); unload_style(); if (!n_multiple_db) { dbi_conn_close(bibconns.conn_refdb); } return 801; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), bibauthor, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { clean_request(dbires); free(bibauthor); unload_style(); if (!n_multiple_db) { dbi_conn_close(bibconns.conn_refdb); } LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { free(bibauthor); *(ptr_rendinfo->ptr_ref) = new_ref; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), " and ", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { clean_request(dbires); unload_style(); if (!n_multiple_db) { dbi_conn_close(bibconns.conn_refdb); } LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } clean_request(dbires); if (have_author) { /* eliminate the trailing and after the last author */ if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "},\n", ptr_rendinfo->ptr_ref_len, 5)) == NULL) { unload_style(); LOG_PRINT(LOG_CRIT, get_status_msg(801)); if (!n_multiple_db) { dbi_conn_close(bibconns.conn_refdb); } return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } else { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), ",\n", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { unload_style(); LOG_PRINT(LOG_CRIT, get_status_msg(801)); if (!n_multiple_db) { dbi_conn_close(bibconns.conn_refdb); } return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } } if (has_periodical_data(type)) { /*----------------------------------------------------------------*/ /* periodical */ if (ptr_rendinfo->nuse_citestyle) { /* do some formatting */ if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), " JOURNAL = {", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { unload_style(); LOG_PRINT(LOG_CRIT, get_status_msg(801)); if (!n_multiple_db) { dbi_conn_close(bibconns.conn_refdb); } return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((new_ref = format_journalname(ptr_rendinfo->ptr_ref, ptr_rendinfo->ptr_ref_len, &bibconns, ptr_rendinfo->dbires, dbi_style_res, ptr_rendinfo->database, 3/* bibtex */, NULL, NULL, REFBIBTEX, 0 /* not title as author */)) == NULL) { LOG_PRINT(LOG_WARNING, "JOURNALNAME formatting failed"); unload_style(); if (!n_multiple_db) { dbi_conn_close(bibconns.conn_refdb); } return 801; } } else { /* plain output */ char* escaped_item; nperiodical_type = 4; /* this retrieves the first available periodical name in the order full-abbrev-cust1-cust2. This may not always be what we want so this should be beefed up somehow */ /* fetch journal of this article */ if ((item = get_periodical(bibconns.conn, date_buffer, NULL, nperiodical_type, &errcode, 0, my_dbi_result_get_idval(ptr_rendinfo->dbires, "refdb_id"), NULL /* no frequency required */)) != NULL) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), " JOURNAL = {", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((escaped_item = escape_latex_chars_copy(item, strlen(item))) == NULL) { unload_style(); LOG_PRINT(LOG_CRIT, get_status_msg(801)); if (!n_multiple_db) { dbi_conn_close(bibconns.conn_refdb); } return 801; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), escaped_item, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; free(escaped_item); } } } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "},\n", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { unload_style(); LOG_PRINT(LOG_CRIT, get_status_msg(801)); if (!n_multiple_db) { dbi_conn_close(bibconns.conn_refdb); } return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } /*----------------------------------------------------------------*/ /* publication title */ item = get_refdb_booktitle_copy(ptr_rendinfo->dbires); if (item != NULL) { char titlestring[16] = " TITLE = {"; if (has_chapter_data(type)) { strcpy(titlestring, " BOOKTITLE = {"); } if (print_field_bibtex(item, ptr_rendinfo, titlestring) == NULL) { free((void*)item); clean_request(dbires); return 801; } free((void*)item); } /*----------------------------------------------------------------*/ /* edition */ item = get_refdb_edition(ptr_rendinfo->dbires); if (item != NULL) { if (print_field_bibtex(item, ptr_rendinfo, " EDITION = {") == NULL) { clean_request(dbires); return 801; } } /*----------------------------------------------------------------*/ /* volume */ item = get_refdb_volume(ptr_rendinfo->dbires); if (item != NULL) { if (print_field_bibtex(item, ptr_rendinfo, " VOLUME = {") == NULL) { clean_request(dbires); return 801; } } /*----------------------------------------------------------------*/ /* issue */ item = get_refdb_issue(ptr_rendinfo->dbires); if (item != NULL) { if (print_field_bibtex(item, ptr_rendinfo, " NUMBER = {") == NULL) { clean_request(dbires); return 801; } } /*----------------------------------------------------------------*/ /* set data */ if (has_set_data(type)) { if ((retval = add_setdata_bibtex(&buffer, &buffer_len, ptr_rendinfo)) != 0) { goto cleanup; } else { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), buffer, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); retval = 801; goto cleanup; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } *buffer = '\0'; } /* we're done using the style info. unload and close conn */ unload_style(); if (!n_multiple_db) { dbi_conn_close(bibconns.conn_refdb); } /*----------------------------------------------------------------*/ /* startpage, endpage */ item = get_refdb_startpage(ptr_rendinfo->dbires); if (item != NULL) { char* escaped_item; if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), " PAGES = {", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((escaped_item = escape_latex_chars_copy(item, strlen(item))) == NULL) { unload_style(); LOG_PRINT(LOG_CRIT, get_status_msg(801)); if (!n_multiple_db) { dbi_conn_close(bibconns.conn_refdb); } return 801; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), escaped_item, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { /* start page */ LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; free(escaped_item); } item = get_refdb_endpage(ptr_rendinfo->dbires); if (item != NULL) { char* escaped_item; if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "-", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((escaped_item = escape_latex_chars_copy(item, strlen(item))) == NULL) { unload_style(); LOG_PRINT(LOG_CRIT, get_status_msg(801)); if (!n_multiple_db) { dbi_conn_close(bibconns.conn_refdb); } return 801; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), escaped_item, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { /* end page */ LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; free(escaped_item); } } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "},\n", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } /*----------------------------------------------------------------*/ /* publisher, school, institution */ item = get_refdb_publisher(ptr_rendinfo->dbires); if (item != NULL) { char pubfield[20]; if (strcmp(type, "THES") == 0) { strcpy(pubfield, " SCHOOL = {"); } else if (strcmp(type, "RPRT") == 0) { strcpy(pubfield, " INSTITUTION = {"); } else { strcpy(pubfield, " PUBLISHER = {"); } if (print_field_bibtex(item, ptr_rendinfo, pubfield) == NULL) { clean_request(dbires); return 801; } } /*----------------------------------------------------------------*/ /* URL, L1 through L4, DOI */ /* loop over all link types */ for (i=0; i<6;i++) { dbires = request_ulinks(bibconns.conn, my_dbi_result_get_idval(ptr_rendinfo->dbires, "refdb_id"), 0 /* ref entry */, i /* link type */, 0 /* is_temp */, ptr_rendinfo->username); if (dbires == NULL) { return 234; } while ((item = get_ulink(dbires)) != NULL) { char* full_link = NULL; /* currently all types are rendered as URL, but this might need a change later */ if (i>0 && i<5) { full_link = add_root_to_link(item, ptr_rendinfo->pdfroot); } if (i == 0) { /* UR */ if (print_field_bibtex(item, ptr_rendinfo, " URL = { ") == NULL) { clean_request(dbires); return 801; } } else if (i == 1 && full_link) { /* L1 */ if (print_field_bibtex(full_link, ptr_rendinfo, " URL = { ") == NULL) { clean_request(dbires); free(full_link); return 801; } free(full_link); } else if (i == 2 && full_link) { /* L2 */ if (print_field_bibtex(full_link, ptr_rendinfo, " URL = { ") == NULL) { clean_request(dbires); free(full_link); return 801; } free(full_link); } else if (i == 3 && full_link) { /* L3 */ if (print_field_bibtex(full_link, ptr_rendinfo, " URL = { ") == NULL) { clean_request(dbires); free(full_link); return 801; } free(full_link); } else if (i == 4 && full_link) { /* L4 */ if (print_field_bibtex(full_link, ptr_rendinfo, " URL = { ") == NULL) { clean_request(dbires); free(full_link); return 801; } free(full_link); } else if (i == 5) { /* DOI */ if (print_field_bibtex(item, ptr_rendinfo, " DOI = { ") == NULL) { clean_request(dbires); return 801; } } } clean_request(dbires); } /* end for */ /*----------------------------------------------------------------*/ /* user-defined fields */ /* loop over all field types */ for (i=1;i<6;i++) { char keystring[16]; item = get_refdb_user(ptr_rendinfo->dbires, i); if (!item || !*item) { continue; } sprintf(keystring, " USER%d = {", i); if (print_field_bibtex(item, ptr_rendinfo, keystring) == NULL) { return 801; } } /*----------------------------------------------------------------*/ /* misc fields */ item = get_refdb_typeofwork(ptr_rendinfo->dbires); if (item != NULL) { if (print_field_bibtex(item, ptr_rendinfo, " TYPE = {") == NULL) { clean_request(dbires); return 801; } } item = get_refdb_area(ptr_rendinfo->dbires); if (item != NULL) { if (print_field_bibtex(item, ptr_rendinfo, " AREA = {") == NULL) { clean_request(dbires); return 801; } } item = get_refdb_ostype(ptr_rendinfo->dbires); if (item != NULL) { if (print_field_bibtex(item, ptr_rendinfo, " OSTYPE = {") == NULL) { clean_request(dbires); return 801; } } item = get_refdb_runningtime(ptr_rendinfo->dbires); if (item != NULL) { if (print_field_bibtex(item, ptr_rendinfo, " RUNNINGTIME = {") == NULL) { clean_request(dbires); return 801; } } item = get_refdb_classcodeintl(ptr_rendinfo->dbires); if (item != NULL) { if (print_field_bibtex(item, ptr_rendinfo, " CLASSCODEINTL = {") == NULL) { clean_request(dbires); return 801; } } item = get_refdb_classcodeus(ptr_rendinfo->dbires); if (item != NULL) { if (print_field_bibtex(item, ptr_rendinfo, " CLASSCODEUS = {") == NULL) { clean_request(dbires); return 801; } } item = get_refdb_senderemail(ptr_rendinfo->dbires); if (item != NULL) { if (print_field_bibtex(item, ptr_rendinfo, " SENDEREMAIL = {") == NULL) { clean_request(dbires); return 801; } } item = get_refdb_recipientemail(ptr_rendinfo->dbires); if (item != NULL) { if (print_field_bibtex(item, ptr_rendinfo, " RECIPIENTEMAIL = {") == NULL) { clean_request(dbires); return 801; } } item = get_refdb_mediatype(ptr_rendinfo->dbires); if (item != NULL) { if (print_field_bibtex(item, ptr_rendinfo, " HOWPUBLISHED = {") == NULL) { clean_request(dbires); return 801; } } item = get_refdb_numvolumes(ptr_rendinfo->dbires); if (item != NULL) { if (print_field_bibtex(item, ptr_rendinfo, " NUMBEROFVOLUMES = {") == NULL) { clean_request(dbires); return 801; } } item = get_refdb_computer(ptr_rendinfo->dbires); if (item != NULL) { if (print_field_bibtex(item, ptr_rendinfo, " COMPUTER = {") == NULL) { clean_request(dbires); return 801; } } item = get_refdb_conferencelocation(ptr_rendinfo->dbires); if (item != NULL) { if (print_field_bibtex(item, ptr_rendinfo, " CONFERENCELOCATION = {") == NULL) { clean_request(dbires); return 801; } } item = get_refdb_registrynum(ptr_rendinfo->dbires); if (item != NULL) { if (print_field_bibtex(item, ptr_rendinfo, " REGISTRYNUMBER = {") == NULL) { clean_request(dbires); return 801; } } item = get_refdb_classification(ptr_rendinfo->dbires); if (item != NULL) { if (print_field_bibtex(item, ptr_rendinfo, " CLASSIFICATION = {") == NULL) { clean_request(dbires); return 801; } } item = get_refdb_section(ptr_rendinfo->dbires); if (item != NULL) { if (print_field_bibtex(item, ptr_rendinfo, " SECTION = {") == NULL) { clean_request(dbires); return 801; } } item = get_refdb_pamphletnum(ptr_rendinfo->dbires); if (item != NULL) { if (print_field_bibtex(item, ptr_rendinfo, " PAMPHLETNUMBER = {") == NULL) { clean_request(dbires); return 801; } } item = get_refdb_chapternum(ptr_rendinfo->dbires); if (item != NULL) { if (print_field_bibtex(item, ptr_rendinfo, " CHAPTERNUMBER = {") == NULL) { clean_request(dbires); return 801; } } unload_style(); /* eliminate the trailing comma and finish with an empty line */ if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "\n}\n", ptr_rendinfo->ptr_ref_len, 2)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } /* printf("%s\n", ref); */ cleanup: free(buffer); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ add_partdata_bibtex(): writes part data into a buffer static int add_partdata_bibtex returns 0 if ok or an error code > 0 char** ptr_buffer ptr to a buffer that will receive the output. The buffer will be reallocated as needed size_t* ptr_buffer_len ptr to the length of buffer. Will be updated if buffer is reallocated struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered dbi_conn conn connection to the database ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int add_partdata_bibtex(char** ptr_buffer, size_t* ptr_buffer_len, struct renderinfo* ptr_rendinfo) { int n_have_author = 0; char* item; char* new_buffer; char *bibauthor; const char* citem; dbi_conn conn; dbi_result dbires; conn = dbi_result_get_conn(ptr_rendinfo->dbires); /*----------------------------------------------------------------*/ /* authors */ /* request authors */ dbires = request_authors(conn, 1, NULL /* all roles */, NULL, 0, my_dbi_result_get_idval(ptr_rendinfo->dbires, "refdb_id")); if (dbires == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(234)); return 234; } if (dbi_result_get_numrows(dbires) > 0) { if ((new_buffer = mstrcat(*ptr_buffer, " AUTHOR = {", ptr_buffer_len, 0)) == NULL) { clean_request(dbires); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *ptr_buffer = new_buffer; } /* fetch all authors */ while ((citem = get_author(dbires)) != NULL) { n_have_author = 1; if (bibtexify_author(&bibauthor, (char*)citem) == NULL) { clean_request(dbires); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } if ((new_buffer = mstrcat(*ptr_buffer, bibauthor, ptr_buffer_len, 0)) == NULL) { clean_request(dbires); free(bibauthor); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *ptr_buffer = new_buffer; free(bibauthor); } if ((new_buffer = mstrcat(*ptr_buffer, " and ", ptr_buffer_len, 0)) == NULL) { clean_request(dbires); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *ptr_buffer = new_buffer; } } clean_request(dbires); if (n_have_author) { /* eliminate the trailing and after the last author */ if ((new_buffer = mstrcat(*ptr_buffer, "},\n", ptr_buffer_len, 5)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *ptr_buffer = new_buffer; } } } /* end if have authors */ /*----------------------------------------------------------------*/ /* title */ item = get_refdb_title_copy(ptr_rendinfo->dbires); if (item != NULL) { char* escaped_item; if ((new_buffer = mstrcat(*ptr_buffer, " TITLE = {", ptr_buffer_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *ptr_buffer = new_buffer; } if ((escaped_item = escape_latex_chars_copy(item, strlen(item))) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } /* no longer required as we have an escaped copy */ free(item); if ((new_buffer = mstrcat(*ptr_buffer, escaped_item, ptr_buffer_len, 0)) == NULL) { /* title */ LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(escaped_item); return 801; } else { *ptr_buffer = new_buffer; } free(escaped_item); if ((new_buffer = mstrcat(*ptr_buffer, "},\n", ptr_buffer_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *ptr_buffer = new_buffer; } } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ add_setdata_bibtex(): writes set data into a buffer static int add_setdata_bibtex returns 0 if ok or an error code > 0 char** ptr_buffer ptr to a buffer that will receive the output. The buffer will be reallocated as needed size_t* ptr_buffer_len ptr to the length of buffer. Will be updated if buffer is reallocated struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered dbi_conn conn connection to the database ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int add_setdata_bibtex(char** ptr_buffer, size_t* ptr_buffer_len, struct renderinfo* ptr_rendinfo) { int n_have_author = 0; char* item; char* new_buffer; char *bibauthor; const char* citem; dbi_conn conn; dbi_result dbires; conn = dbi_result_get_conn(ptr_rendinfo->dbires); /*----------------------------------------------------------------*/ /* authors */ /* request authors */ dbires = request_authors(conn, 3 /* set editors */, NULL /* all roles */, NULL, 0, my_dbi_result_get_idval(ptr_rendinfo->dbires, "refdb_id")); if (dbires == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(234)); return 234; } if (dbi_result_get_numrows(dbires) > 0) { if ((new_buffer = mstrcat(*ptr_buffer, " EDITOR = {", ptr_buffer_len, 0)) == NULL) { clean_request(dbires); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *ptr_buffer = new_buffer; } /* fetch all authors */ while ((citem = get_author(dbires)) != NULL) { n_have_author++; if (bibtexify_author(&bibauthor, (char*)citem) == NULL) { clean_request(dbires); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } if ((new_buffer = mstrcat(*ptr_buffer, bibauthor, ptr_buffer_len, 0)) == NULL) { clean_request(dbires); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *ptr_buffer = new_buffer; } if ((new_buffer = mstrcat(*ptr_buffer, " and ", ptr_buffer_len, 0)) == NULL) { clean_request(dbires); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *ptr_buffer = new_buffer; } } clean_request(dbires); if (n_have_author) { /* eliminate the trailing comma after the last author */ new_buffer = mstrcat(*ptr_buffer, "},\n", ptr_buffer_len, 5); if (new_buffer == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *ptr_buffer = new_buffer; } } } /*----------------------------------------------------------------*/ /* title */ item = get_refdb_title_series_copy(ptr_rendinfo->dbires); if (item != NULL) { char* escaped_item; if ((new_buffer = mstrcat(*ptr_buffer, " SERIES = {", ptr_buffer_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *ptr_buffer = new_buffer; } if ((escaped_item = escape_latex_chars_copy(item, strlen(item))) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } /* no longer required as we have an escaped copy */ free(item); if ((new_buffer = mstrcat(*ptr_buffer, escaped_item, ptr_buffer_len, 0)) == NULL) { /* title */ LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(escaped_item); return 801; } else { *ptr_buffer = new_buffer; } free(escaped_item); if ((new_buffer = mstrcat(*ptr_buffer, "},\n", ptr_buffer_len, 0)) == NULL) { free(item); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *ptr_buffer = new_buffer; } } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ print_field_bibtex(): writes simple field contents to bibtex output char* print_field_bibtex returns a ptr to the modified string. Due to reallocation this may be different from the ptr passed to this function in the ptr_rendinfo structure which is also updated accordingly const char* item ptr to the contents of the field to write struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered const char* start_string ptr to a string to be printed before the field contents ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static char* print_field_bibtex(const char* item, struct renderinfo* ptr_rendinfo, const char* start_string) { char* new_ref; if (item != NULL) { char* escaped_item; if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), (char*)start_string, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((escaped_item = escape_latex_chars_copy(item, strlen(item))) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), escaped_item, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } else { *(ptr_rendinfo->ptr_ref) = new_ref; free(escaped_item); } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "},\n", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } return *(ptr_rendinfo->ptr_ref); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ gettexbib(): executes client command gettexbib int gettexbib returns 0 on success and 1 on error struct CLIENT_REQUEST* ptr_clrequest ptr to structure with client info struct bibinfo* ptr_biblio_info ptr to a structure containing formatting information struct ADDRESULT* ptr_addresult ptr to a structure that will receive the result of the command (number of successful and failed references) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int gettexbib(struct CLIENT_REQUEST* ptr_clrequest, struct bibinfo* ptr_biblio_info, struct ADDRESULT* ptr_addresult) { int numbyte; /* number of bytes written */ int not_done = 1; int cs_status; size_t n_bufsize; size_t nsql_command_len = 4096; /* should be enough */ size_t buffer_len = 4096; char *sql_command = NULL; char *id_list = NULL; char *token = NULL; char *token_start = NULL; char *eof_string = NULL; char *dbstring; char *idstring; char *the_db; char *drivername; char *buffer; char prev_db[DBNAME_LENGTH] = ""; dbi_conn conn; /* dbi_result dbires; */ struct lilimem sentinel; struct renderinfo rendinfo; rendinfo.username = ptr_clrequest->username; rendinfo.database = ptr_clrequest->current_db; rendinfo.ptr_biblio_info = ptr_biblio_info; rendinfo.ref_format = -1; rendinfo.nuse_citestyle = 1; rendinfo.pdfroot = NULL; rendinfo.ptr_clrequest = ptr_clrequest; sentinel.ptr_mem = NULL; sentinel.ptr_next = NULL; sentinel.varname[0] = '\0'; ptr_addresult->success = 0; ptr_addresult->failure = 0; n_bufsize = (size_t)atoi(ptr_clrequest->argument); id_list = malloc(n_bufsize); if (id_list == NULL || insert_lilimem(&sentinel, (void**)&id_list, NULL)) { delete_all_lilimem(&sentinel); send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } sql_command = malloc(nsql_command_len); if (sql_command == NULL || insert_lilimem(&sentinel, (void**)&sql_command, NULL)) { delete_all_lilimem(&sentinel); send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } /* fill in variable elements of structure */ buffer = malloc(buffer_len); if (buffer == NULL || insert_lilimem(&sentinel, (void**)&(buffer), NULL)) { delete_all_lilimem(&sentinel); send_status(ptr_clrequest->fd, 801, TERM_NO); /* #2 error */ LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } buffer[0] = '\0'; rendinfo.ptr_ref_len = &buffer_len; rendinfo.ptr_ref = &buffer; /* send acknowledgement to client */ send_status(ptr_clrequest->fd, 0, TERM_NO); /* #2 ok */ /* status is always 0 */ cs_status = read_status(ptr_clrequest->fd); /* #3 */ /* read whitespace-separated id list from client*/ numbyte = tread(ptr_clrequest->fd, id_list, n_bufsize); if (numbyte == -1) { LOG_PRINT(LOG_INFO, get_status_msg(109)); delete_all_lilimem(&sentinel); return 1; } token = id_list; eof_string = &id_list[strlen(id_list)]; /* ptr to end of string */ /* connect to database server*/ if ((conn = connect_to_db(ptr_clrequest, NULL, 0)) == NULL) { send_status(ptr_clrequest->fd, 204, TERM_NO); /* #4 error */ LOG_PRINT(LOG_WARNING, get_status_msg(204)); delete_all_lilimem(&sentinel); return 1; } /* keep a copy of drivername as we may have to switch connections */ drivername = mstrdup((char*)dbi_driver_get_name(dbi_conn_get_driver(conn))); if (drivername == NULL || insert_lilimem(&sentinel, (void**)&drivername, NULL)) { delete_all_lilimem(&sentinel); send_status(ptr_clrequest->fd, 801, TERM_NO); /* #4 error */ LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } /* create a "header" if necessary */ /* prepare_render resets sql_command */ prepare_render_bibtex(&rendinfo); while (not_done) { /* search for the start of a token */ while (*token < 33 && token < eof_string) { /* all whitespace has ASCII values 32 or less */ token++; } if (token == eof_string){ break; } token_start = token; /* save start of token */ /* Look for the end */ while (*token > 32 && token < eof_string) { token++; } if (token == eof_string){ not_done = 0; } else { *token = '\0'; /* terminate token */ token++; } /* start test */ idstring = get_bibtex_id(token_start, &dbstring); /* retrieve database and id parts */ if (idstring == NULL) { continue; /* invalid ID string, try the next one */ } /* dbstring = NULL; */ /* idstring = token_start; */ /* end test */ if (dbstring == NULL) { the_db = ptr_clrequest->current_db; } else { the_db = dbstring; } /* prepare query string */ sprintf(sql_command, "SELECT DISTINCT t_refdb.refdb_id, t_refdb.refdb_citekey, t_refdb.refdb_type, t_refdb.refdb_pubyear, t_refdb.refdb_startpage, t_refdb.refdb_endpage, t_refdb.refdb_abstract, t_refdb.refdb_title, t_refdb.refdb_volume, t_refdb.refdb_issue, t_refdb.refdb_booktitle, t_refdb.refdb_city, t_refdb.refdb_publisher, t_refdb.refdb_title_series, t_refdb.refdb_address, t_refdb.refdb_issn, t_refdb.refdb_periodical_id, t_refdb.refdb_pyother_info, t_refdb.refdb_secyear, t_refdb.refdb_secother_info, t_refdb.refdb_user1, t_refdb.refdb_user2, t_refdb.refdb_user3, t_refdb.refdb_user4, t_refdb.refdb_user5, t_refdb.refdb_typeofwork, t_refdb.refdb_area, t_refdb.refdb_ostype, t_refdb.refdb_degree, t_refdb.refdb_runningtime, t_refdb.refdb_classcodeintl, t_refdb.refdb_classcodeus, t_refdb.refdb_senderemail, t_refdb.refdb_recipientemail, t_refdb.refdb_mediatype, t_refdb.refdb_numvolumes, t_refdb.refdb_edition, t_refdb.refdb_computer, t_refdb.refdb_conferencelocation, t_refdb.refdb_registrynum, t_refdb.refdb_classification, t_refdb.refdb_section, t_refdb.refdb_pamphletnum, t_refdb.refdb_chapternum FROM t_refdb WHERE t_refdb.refdb_citekey='%s'", idstring); if (!strcmp(my_dbi_conn_get_cap(conn, "multiple_db"), "t")) { /* change the database if necessary. The string comparison is presumably faster than a forced db switch in each cycle */ if (strcmp(prev_db, the_db)) { if (dbi_conn_select_db(conn, the_db)) { send_status(ptr_clrequest->fd, 204, TERM_NO); /* #4 error */ LOG_PRINT(LOG_WARNING, get_status_msg(204)); dbi_conn_close(conn); delete_all_lilimem(&sentinel); return 1; } } strcpy(prev_db, the_db); /* save current db for next cycle */ } else { if (strcmp(prev_db, the_db)) { dbi_conn_close(conn); if ((conn = connect_to_db(ptr_clrequest, the_db, 0)) == NULL) { send_status(ptr_clrequest->fd, 204, TERM_NO); /* #4 error */ LOG_PRINT(LOG_WARNING, get_status_msg(204)); delete_all_lilimem(&sentinel); return 1; } } strcpy(prev_db, the_db); /* save current db for next cycle */ } LOG_PRINT(LOG_DEBUG, sql_command); rendinfo.dbires = dbi_conn_query(conn, sql_command); if (!rendinfo.dbires) { send_status(ptr_clrequest->fd, 234, TERM_NO); /* #4 error */ LOG_PRINT(LOG_ERR, get_status_msg(234)); dbi_conn_close(conn); delete_all_lilimem(&sentinel); return 1; } /* fetch all articles we're interested in */ while (dbi_result_next_row(rendinfo.dbires)) { int cs_status; /* fill in variable elements of structure */ /* todo: what's this? why -1?*/ rendinfo.nref_counter = -1; rendinfo.database = the_db; rendinfo.dbname = dbstring; if ((cs_status = render_bibtex(&rendinfo)) != 0) { if (cs_status == 801 || cs_status == 269 || cs_status == 842) { send_status(ptr_clrequest->fd, cs_status, TERM_NO); /* #4 error */ LOG_PRINT(LOG_ERR, get_status_msg(cs_status)); dbi_result_free(rendinfo.dbires); dbi_conn_close(conn); delete_all_lilimem(&sentinel); return 1; } else { ptr_addresult->failure++; } } ptr_addresult->success++; /* send ok status, then the terminated result string */ send_status(ptr_clrequest->fd, 404, TERM_NO); /* #4 ok, more to come */ iwrite(ptr_clrequest->fd, buffer, strlen(buffer)); iwrite(ptr_clrequest->fd, cs_term, TERM_LEN); /* reset buffer string */ buffer[0] = '\0'; /* read client response */ cs_status = read_status(ptr_clrequest->fd); /* #5 */ if (cs_status) { break; } } /* end while */ } /* end while have more tokens */ /* create a "footer" if necessary */ /* fill in variable elements of structure */ if ((cs_status = finish_render_bibtex(&rendinfo)) != 0) { send_status(ptr_clrequest->fd, cs_status, TERM_NO); /* #4/#6 */ LOG_PRINT(LOG_ERR, get_status_msg(cs_status)); dbi_result_free(rendinfo.dbires); dbi_conn_close(conn); delete_all_lilimem(&sentinel); return 1; } send_status(ptr_clrequest->fd, 402, TERM_NO); /* #4/#6 */ tiwrite(ptr_clrequest->fd, buffer, TERM_YES); dbi_conn_close(conn); delete_all_lilimem(&sentinel); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ bibtexify_author(): output authorname in BibTeX-compatible form as F. M. Last lineage static char* bibtexify_author returns a ptr to the converted string or NULL if an error occurs char** ptr_bibauthor ptr to a ptr to a string buffer. This fn will allocate the memory needed for the converted string and assign it to *ptr_bibauthor. The calling function is responsible to free this memory unless the return value is NULL. char* author ptr to the authorname to convert ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static char* bibtexify_author(char** ptr_bibauthor, char* author) { int nauthor_len; char* escaped_item; struct AUTHORTOKENS atoken; Lilistring* ptr_middle; if (author == NULL) { return NULL; } nauthor_len = strlen(author); if (tokenize_author(author, &atoken) == NULL) { return NULL; } /* escaping may double the length, plus periods, commas, spaces */ *ptr_bibauthor = malloc(2*nauthor_len+11); if (*ptr_bibauthor == NULL) { return NULL; } (*ptr_bibauthor)[0] = '\0'; /* terminate string */ if ((escaped_item = escape_latex_chars_copy(atoken.sur, strlen(atoken.sur))) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } strcat(*ptr_bibauthor, escaped_item); free(escaped_item); if (*atoken.lineage) { strcat(*ptr_bibauthor, ", "); if ((escaped_item = escape_latex_chars_copy(atoken.lineage, strlen(atoken.lineage))) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } strcat(*ptr_bibauthor, escaped_item); free(escaped_item); } if (*atoken.first) { strcat(*ptr_bibauthor, ", "); if ((escaped_item = escape_latex_chars_copy(atoken.first, strlen(atoken.first))) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } strcat(*ptr_bibauthor, escaped_item); free(escaped_item); if (*(atoken.first+1) == '\0') { strcat(*ptr_bibauthor, "."); } } if (atoken.ptr_middlelist) { ptr_middle = atoken.ptr_middlelist; while ((ptr_middle = get_next_lilistring(ptr_middle)) != NULL) { strcat(*ptr_bibauthor, " "); if ((escaped_item = escape_latex_chars_copy(ptr_middle->token, strlen(ptr_middle->token))) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } strcat(*ptr_bibauthor, escaped_item); free(escaped_item); if (*(ptr_middle->token+1) == '\0') { strcat(*ptr_bibauthor, "."); } } } clean_authortokens(&atoken); return *ptr_bibauthor; } refdb-1.0.2/src/backend-html.c000755 001750 001750 00000173462 12255427651 016757 0ustar00markusmarkus000000 000000 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ backend-html.c defines the screen output backend of refdbd markus@mhoenicka.de 9-5-00 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ #include #include /* for definitions of log message priorities */ #include #include #include "refdb.h" #include "linklist.h" #include "backend.h" #include "backend-html.h" #include "writenote.h" #include "strfncs.h" #include "refdbd.h" #include "cgi.h" #include "dbfncs.h" #include "connect.h" extern char refdblib[]; /* location of shareable files */ extern int n_log_level; /* numeric version of log_level */ /* forward declaration of local functions */ static char* print_field_html(const char* item, struct renderinfo* ptr_rendinfo, const char* start_string); static int add_partdata_html(char** ptr_buffer, size_t* ptr_buffer_len, struct renderinfo* ptr_rendinfo, int n_istemp, unsigned long long refcount); static int add_setdata_html(char** ptr_buffer, size_t* ptr_buffer_len, struct renderinfo* ptr_rendinfo, int n_istemp, unsigned long long refcount); static int add_author_info_html(char** ptr_buffer, size_t* ptr_buffer_len, int type, struct renderinfo* ptr_rendinfo, int n_istemp, unsigned long long refcount); /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ prepare_render_html(): writes a header for the html output of a query int prepare_render_html returns 0 if successful, >0 if failed struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int prepare_render_html(struct renderinfo* ptr_rendinfo) { char* new_ref; char* header; if ((header = assemble_header(ptr_rendinfo)) == NULL) { return 801; } if ((new_ref = mstrcpy(*(ptr_rendinfo->ptr_ref), header, ptr_rendinfo->ptr_ref_len)) == NULL) { free(header); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; free(header); } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ finish_render_html(): writes a footer for the html output of a query int finish_render_html returns 0 if successful, >0 if failed struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int finish_render_html(struct renderinfo* ptr_rendinfo) { int n_cgi; char* new_ref; char* html_foot; n_cgi = (ptr_rendinfo->ref_format == 6) ? 1:0; if (n_cgi) { html_foot = load_html("refdbq_foot", refdblib); if (!html_foot) { LOG_PRINT(LOG_ERR, get_status_msg(802)); return 802; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), html_foot, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { free(html_foot); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } free(html_foot); } else { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "\n\n", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ render_html() renders a RIS dataset for html output int render_html returns 0 if successful, >0 if failed struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered int n_istemp if 0, retrieve data from permanent tables if 1, retrieve data from temporary tables if 2, retrieve data from temporary tables, but compute frequency data from the permanent tables ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int render_html(struct renderinfo* ptr_rendinfo, int n_istemp) { int n_cgi; int errcode; /* receives error code for periodical requests */ int nhave_booktitle = 0; int nhave_para = 0; int render_res; int retval = 0; unsigned long long refcount; unsigned long long frequency; size_t buffer_len = 4096; char have_page = 0; const char* item; char id[32] = ""; char* new_ref; const char* type; char* avail; char *entitize_buf; char date_buffer[256]; char href_buffer[20]; char hr_buffer[10]; char* buffer; dbi_result dbires; dbi_conn conn; struct REPRINT reprint; n_cgi = (ptr_rendinfo->ref_format == REFCGIHTML) ? 1:0; if (ptr_rendinfo->ref_format == REFXHTML) { strcpy(hr_buffer, "
\n"); } else { strcpy(hr_buffer, "
\n"); } if ((buffer = malloc(buffer_len)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); retval = 801; goto cleanup; } *buffer = '\0'; if ((type = get_refdb_type(ptr_rendinfo->dbires)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(234)); retval = 234; goto cleanup; } conn = dbi_result_get_conn(ptr_rendinfo->dbires); if (n_cgi) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "
\n", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } else { /* finish div */ if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "\n", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } /* printf("%s\n", *(ptr_rendinfo->ptr_ref)); */ cleanup: free(buffer); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ add_partdata_html(): writes part data into a buffer static int add_partdata_scrn returns 0 if ok or an error code > 0 char** ptr_buffer ptr to a buffer that will receive the output. The buffer will be reallocated as needed size_t* ptr_buffer_len ptr to the length of buffer. Will be updated if buffer is reallocated struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered int n_istemp if 0, retrieve data from permanent tables if 1, retrieve data from temporary tables if 2, retrieve data from temporary tables, but compute frequency data from the permanent tables unsigned long long refcount total number of refs in the database ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int add_partdata_html(char** ptr_buffer, size_t* ptr_buffer_len, struct renderinfo* ptr_rendinfo, int n_istemp, unsigned long long refcount) { char* item; char* new_buffer; int result; /*----------------------------------------------------------------*/ /* authors */ if ((result = add_author_info_html(ptr_buffer, ptr_buffer_len, 1 /* part */, ptr_rendinfo, n_istemp, refcount)) != 0) { return result; } /*----------------------------------------------------------------*/ /* title */ item = get_refdb_title_copy(ptr_rendinfo->dbires); if (item != NULL) { if ((new_buffer = mstrcat(*ptr_buffer, "", ptr_buffer_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *ptr_buffer = new_buffer; } if ((new_buffer = mstrcat(*ptr_buffer, item, ptr_buffer_len, 0)) == NULL) { /* title */ LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(item); return 801; } else { *ptr_buffer = new_buffer; } free(item); if ((new_buffer = mstrcat(*ptr_buffer, "\n", ptr_buffer_len, 0)) == NULL) { free(item); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *ptr_buffer = new_buffer; } } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ add_setdata_html(): writes set data into a buffer static int add_setdata_html returns 0 if ok or an error code > 0 char** ptr_buffer ptr to a buffer that will receive the output. The buffer will be reallocated as needed size_t* ptr_buffer_len ptr to the length of buffer. Will be updated if buffer is reallocated struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered int n_istemp if 0, retrieve data from permanent tables if 1, retrieve data from temporary tables if 2, retrieve data from temporary tables, but compute frequency data from the permanent tables unsigned long long refcount total number of refs in the database ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int add_setdata_html(char** ptr_buffer, size_t* ptr_buffer_len, struct renderinfo* ptr_rendinfo, int n_istemp, unsigned long long refcount) { char* item; char* new_buffer; int result; /*----------------------------------------------------------------*/ /* authors */ if ((result = add_author_info_html(ptr_buffer, ptr_buffer_len, 3 /* set */, ptr_rendinfo, n_istemp, refcount)) != 0) { return result; } /*----------------------------------------------------------------*/ /* title */ item = get_refdb_title_series_copy(ptr_rendinfo->dbires); if (item != NULL) { if ((new_buffer = mstrcat(*ptr_buffer, "", ptr_buffer_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *ptr_buffer = new_buffer; } if ((new_buffer = mstrcat(*ptr_buffer, item, ptr_buffer_len, 0)) == NULL) { /* title */ LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(item); return 801; } else { *ptr_buffer = new_buffer; } free(item); if ((new_buffer = mstrcat(*ptr_buffer, "\n", ptr_buffer_len, 0)) == NULL) { free(item); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *ptr_buffer = new_buffer; } } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ add_author_info_html(): writes author data into a buffer static int add_author_info_html returns 0 if ok or an error code > 0 char** ptr_buffer ptr to a buffer that will receive the output. The buffer will be reallocated as needed size_t* ptr_buffer_len ptr to the length of buffer. Will be updated if buffer is reallocated int type 1=part authors, 2=publication authors, 3=set authors struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered int n_istemp if 0, retrieve data from permanent tables if 1, retrieve data from temporary tables if 2, retrieve data from temporary tables, but compute frequency data from the permanent tables unsigned long long refcount total number of refs in the database ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int add_author_info_html(char** ptr_buffer, size_t* ptr_buffer_len, int type, struct renderinfo* ptr_rendinfo, int n_istemp, unsigned long long refcount) { int n_have_author = 0; unsigned long long frequency; char* new_buffer; char* entitize_buf; struct AUTHOR_INFO ainfo; dbi_conn conn; dbi_result dbires; conn = dbi_result_get_conn(ptr_rendinfo->dbires); /* request authors */ dbires = request_authors(conn, type , NULL /* all roles */, NULL, 0, my_dbi_result_get_idval(ptr_rendinfo->dbires, "refdb_id")); if (dbires == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(234)); return 234; } if (dbi_result_get_numrows(dbires)) { if ((new_buffer = mstrcat(*ptr_buffer, "

", ptr_buffer_len, 0)) == NULL) { clean_request(dbires); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *ptr_buffer = new_buffer; } } /* fetch all authors */ while (get_extended_author_parts(dbires, &ainfo, n_istemp, &frequency) != NULL) { n_have_author = 1; int rel_frequency; char buffer[64]; rel_frequency = calculate_relative_frequency(frequency, refcount); sprintf(buffer, "", (*(ainfo.role)) ? ainfo.role:"author", rel_frequency); if ((entitize_buf = strdup(ainfo.name)) == NULL || sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } if ((new_buffer = mstrcat(*ptr_buffer, buffer, ptr_buffer_len, 0)) == NULL) { clean_request(dbires); free(entitize_buf); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *ptr_buffer = new_buffer; } if ((new_buffer = mstrcat(*ptr_buffer, entitize_buf, ptr_buffer_len, 0)) == NULL) { clean_request(dbires); free(entitize_buf); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *ptr_buffer = new_buffer; } free(entitize_buf); if ((new_buffer = mstrcat(*ptr_buffer, "; ", ptr_buffer_len, 0)) == NULL) { clean_request(dbires); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *ptr_buffer = new_buffer; } } clean_request(dbires); if (n_have_author) { /* eliminate the trailing comma after the last author */ new_buffer = mstrcat(*ptr_buffer, "

\n", ptr_buffer_len, 2); if (new_buffer == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *ptr_buffer = new_buffer; } } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ print_field_html(): writes simple field contents to HTML output char* print_field_html returns a ptr to the modified string. Due to reallocation this may be different from the ptr passed to this function in the ptr_rendinfo structure which is also updated accordingly const char* item ptr to the contents of the field to write struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered const char* start_string ptr to a string to be printed before the field contents ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static char* print_field_html(const char* item, struct renderinfo* ptr_rendinfo, const char* start_string) { char* new_ref; if (item != NULL) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), (char*)start_string, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), (char*)item, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "

\n", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } return *(ptr_rendinfo->ptr_ref); } refdb-1.0.2/src/backend-dbib.c000755 001750 001750 00000312131 12255427651 016677 0ustar00markusmarkus000000 000000 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ backend-dbib.c defines the DocBook V.3.1 bibliography output backend of refdbd markus@mhoenicka.de 2001-01-10 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ #include #include #include #include #include #include "refdb.h" #include "linklist.h" #include "refdbd.h" #include "backend.h" #include "xmlhelper.h" #include "backend-dbib.h" #include "strfncs.h" #include "dbfncs.h" #include "connect.h" #include "mset.h" extern int n_log_level; extern char main_db[]; extern dbi_result dbi_style_res; /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ prepare_render_dbib(): writes a header for the docbook output of a query int prepare_render_dbib returns 0 if ok, >0 if error char** ptr_ref ptr to a ptr to a buffer created with malloc which will receive the output. The calling function must allocate the buffer with at least 4096 byte. This function will reallocate the buffer as needed. *ptr will be updated whenever a realloc is necessary. The calling function is responsible for freeing the memory again. size_t* ptr_ref_len pointer to variable holding current length of ref struct bibinfo* ptr_biblio_info ptr to a structure containing formatting information dbi_conn conn the connection to the refdb database. int n_ref_format requested output format: REFDOCBK, REFDOCBKX, REFTEIX const char* ns string containing an optional namespace prefix ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int prepare_render_dbib(char** ptr_ref, size_t* ptr_ref_len, struct bibinfo* ptr_biblio_info, dbi_conn conn, int n_ref_format, const char* ns) { char *sql_command = NULL; char *item = NULL; char *myjournal = NULL; const char *drivername; const char* db_encoding; dbi_result dbires_cit; /* printf("start prepare_render_dbib\n"); */ drivername = dbi_driver_get_name(dbi_conn_get_driver(conn)); myjournal = strdup(ptr_biblio_info->format_string); if (!myjournal) { return 801; } if (dbi_conn_quote_string(conn, &myjournal) == 0) { free(myjournal); return 801; } sql_command = malloc(60+strlen(myjournal)); if (!sql_command) { free(myjournal); return 801; } /* get the database encoding */ if (!*(ptr_biblio_info->encoding)) { db_encoding = dbi_conn_get_encoding(conn); } else { db_encoding = (const char*)ptr_biblio_info->encoding; } if (!strcmp(my_dbi_conn_get_cap(conn, "multiple_db"), "t")) { sprintf(sql_command, "SELECT BIBLIOTITLE FROM %s.CITSTYLE WHERE JOURNAL=%s", main_db, myjournal); } else { sprintf(sql_command, "SELECT BIBLIOTITLE FROM CITSTYLE WHERE JOURNAL=%s", myjournal); } free(myjournal); LOG_PRINT(LOG_DEBUG, sql_command); dbires_cit = dbi_conn_query(conn, sql_command); free(sql_command); if (!dbires_cit || dbi_result_next_row(dbires_cit) == 0) { return 234; } item = my_dbi_result_get_string_copy_idx(dbires_cit, 1); if (item && !my_dbi_conn_error_flag(conn)) { /* as specified in the style */ if (sgml_entitize(&item, n_ref_format) == NULL) { free(item); return 801; } /* assemble the header */ /* - the bibliography must not have a doctype line if it is included as an external entity */ /* - the initial indentation level depends on how many levels we add with the following strings. Adapt initialize_xmlindent() in refdbdbib.c accordingly */ if (n_ref_format == REFDOCBK) { sprintf(*ptr_ref, "\n\n%s\n", item); } else if (n_ref_format == REFDOCBKX) { sprintf(*ptr_ref, "\n\n%s\n", db_encoding, item); } else if (n_ref_format == REFDOCBKX5) { if (ns && *ns) { sprintf(*ptr_ref, "\n\n<%s:bibliography role=\"refdb\" xmlns:%s=\"http://docbook.org/ns/docbook\" xmlns:xl=\"http://www.w3.org/1999/xlink\">\n<%s:title>%s\n", db_encoding, ns, ns, ns, item, ns); } else { sprintf(*ptr_ref, "\n\n\n%s\n", db_encoding, item); } } else if (n_ref_format == REFTEIX) { sprintf(*ptr_ref, "\n\n\n%s\n", db_encoding, item); } else if (n_ref_format == REFTEIX5) { if (ns && *ns) { sprintf(*ptr_ref, "\n\n<%s:div type=\"chapter\" xmlns:%s=\"http://www.tei-c.org/ns/1.0\">\n<%s:head><%s:title>%s\n<%s:listBibl rend=\"refdb\">\n\n", db_encoding, ns, ns, ns, ns, item, ns, ns, ns); } else { sprintf(*ptr_ref, "\n\n
\n%s\n\n", db_encoding, item); } } } else { /* leave out title as none was specified */ if (n_ref_format == REFDOCBK) { strcpy(*ptr_ref, "\n\n"); } else if (n_ref_format == REFDOCBKX) { sprintf(*ptr_ref, "\n\n", db_encoding); } else if (n_ref_format == REFDOCBKX5) { if (ns && *ns) { sprintf(*ptr_ref, "\n\n<%s:bibliography role=\"refdb\" xmlns:%s=\"http://docbook.org/ns/docbook\" xmlns:xl=\"http://www.w3.org/1999/xlink\">\n", db_encoding, ns, ns); } else { sprintf(*ptr_ref, "\n\n\n", db_encoding); } } else if (n_ref_format == REFTEIX) { sprintf(*ptr_ref, "\n\n\n", db_encoding); } else if (n_ref_format == REFTEIX5) { if (ns && *ns) { sprintf(*ptr_ref, "\n\n<%s:div type=\"chapter\" xmlns:%s=\"http://www.tei-c.org/ns/1.0\">\n<%s:listBibl rend=\"refdb\">\n", db_encoding, ns, ns, ns); } else { sprintf(*ptr_ref, "\n\n
\n<%s:listBibl rend=\"refdb\">\n", db_encoding, ns, ns); } } } if (item) { free(item); } /* printf("end prepare_render_dbib\n"); */ return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ finish_render_dbib(): writes a footer for the docbook output of a query This may include extra bibliomixed elements for multiple citation labels int finish_render_dbib returns 0 successful, >0 if failed char** ptr_ref ptr to a ptr to a buffer created with malloc which will receive the output. The calling function must allocate the buffer with at least 4096 byte. This function will reallocate the buffer as needed. *ptr will be updated whenever a realloc is necessary. The calling function is responsible for freeing the memory again. size_t* ptr_ref_len pointer to variable holding current length of ref struct BIBCONNS* ptr_bibconns ptr to struct with dbi connections struct bibinfo* ptr_biblio_info ptr to struct with additional bibliographic info char* table_name ptr to a string containing the name of the temporary table in refdbvar which holds the info about which IDs to render struct CLIENT_REQUEST ptr_clrequest ptr to structure with client info struct xmlindent* ptr_indent ptr to indentation info int n_ref_format requested output format: REFDOCBK, REFDOCBKX, REFTEIX ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int finish_render_dbib(char** ptr_ref, size_t* ptr_ref_len, struct BIBCONNS* ptr_bibconns, struct bibinfo* ptr_biblio_info, char* table_name, struct CLIENT_REQUEST* ptr_clrequest, struct xmlindent* ptr_indent, int n_ref_format) { char *new_ref; char *sql_command; char *myjournal; char intext_string[] = "INTEXT"; char *item_rangesep; const char *item_intextseq; const char *item_multi_id; const char *item_entry_id; const char *drivername; const char *author_concat; char *item_preceeding; char *item_following; char *item_citsep; const char *item_dbname; int sql_command_len; int nis_first; int ndo_range = 0; /* if 1, contract ranges of consecutive numeric in-text citations */ int nis_range = 0; /* if 1, the current row is the endpoint of a range */ int n_skip; int n_xrefloop_rowpos; int n_consec; int n_multiple_db = 0; /* if 1, conn allows multiple databases */ int n_is_subseq = 0; int n_currpos; int n_status; int n_prev_inline = 0; short int n_pubyear; short int title_as_author; unsigned long long ncurr_sorted_pos; unsigned long long n_sorted_pos1 = 0; unsigned long long n_citation_pos; unsigned long long n_sorted_pos; unsigned long long n_orig_id; struct lilimem sentinel; struct mset* ptr_mset_sentinel; /* we need quite a few database queries here */ dbi_result dbires; dbi_result dbires1; dbi_result dbires2; dbi_result dbires3; /* initialize linked lists and stacks */ sentinel.ptr_mem = NULL; sentinel.ptr_next = NULL; sentinel.varname[0] = '\0'; if ((ptr_mset_sentinel = new_mset_stack()) == NULL) { return 801; } drivername = dbi_driver_get_name(dbi_conn_get_driver(ptr_bibconns->conn_refdb)); sql_command_len = 4096; sql_command = malloc(sql_command_len); if (!sql_command || insert_lilimem(&sentinel, (void**)&sql_command, "sql_command")) { clear_mset_stack(ptr_mset_sentinel); return 801; } myjournal = strdup(ptr_biblio_info->format_string); if (!myjournal || insert_lilimem(&sentinel, (void**)&myjournal, "myjournal")) { delete_all_lilimem(&sentinel); clear_mset_stack(ptr_mset_sentinel); return 801; } if (dbi_conn_quote_string(ptr_bibconns->conn_refdb, &myjournal) == 0) { delete_all_lilimem(&sentinel); clear_mset_stack(ptr_mset_sentinel); return 801; } /* get basic formatting info */ if (!strcmp(my_dbi_conn_get_cap(ptr_bibconns->conn_refdb, "multiple_db"), "t")) { n_multiple_db = 1; sprintf(sql_command, "SELECT ID, CITSEPARATOR, FOLLOWING, PRECEEDING, RANGESEPARATOR, INTEXTSEQUENCE, STYLE from %s.CITSTYLE where JOURNAL=%s", main_db, myjournal); } else { sprintf(sql_command, "SELECT ID, CITSEPARATOR, FOLLOWING, PRECEEDING, RANGESEPARATOR, INTEXTSEQUENCE, STYLE from CITSTYLE where JOURNAL=%s", myjournal); } dbires = dbi_conn_query(ptr_bibconns->conn_refdb, sql_command); LOG_PRINT(LOG_DEBUG, sql_command); if (!dbires || dbi_result_next_row(dbires) == 0) { delete_all_lilimem(&sentinel); clear_mset_stack(ptr_mset_sentinel); return 241; } /* see whether we should contract consecutive numerical citations */ item_rangesep = my_dbi_result_get_string_copy(dbires, "RANGESEPARATOR"); if (item_rangesep && my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { if (item_rangesep) { free(item_rangesep); } item_rangesep = NULL; } if (item_rangesep && insert_lilimem(&sentinel, (void**)&item_rangesep, "item_rangesep")) { delete_all_lilimem(&sentinel); clear_mset_stack(ptr_mset_sentinel); return 801; } if (item_rangesep && sgml_entitize(&item_rangesep, n_ref_format) == NULL) { delete_all_lilimem(&sentinel); clear_mset_stack(ptr_mset_sentinel); return 801; } if (item_rangesep && *item_rangesep) { ndo_range = 1; } item_intextseq = dbi_result_get_string(dbires, "INTEXTSEQUENCE"); if (item_intextseq && my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { item_intextseq = NULL; } item_preceeding = my_dbi_result_get_string_copy(dbires, "PRECEEDING"); if (item_preceeding && my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { if (item_preceeding) { free(item_preceeding); } item_preceeding = NULL; } if (item_preceeding && insert_lilimem(&sentinel, (void**)&item_preceeding, "item_preceeding")) { delete_all_lilimem(&sentinel); clear_mset_stack(ptr_mset_sentinel); return 801; } if (item_preceeding && sgml_entitize(&item_preceeding, n_ref_format) == NULL) { delete_all_lilimem(&sentinel); clear_mset_stack(ptr_mset_sentinel); return 801; } item_following = my_dbi_result_get_string_copy(dbires, "FOLLOWING"); if (item_following && my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { if (item_following) { free(item_following); } item_following = NULL; } if (item_following && insert_lilimem(&sentinel, (void**)&item_following, "item_following")) { delete_all_lilimem(&sentinel); clear_mset_stack(ptr_mset_sentinel); return 801; } if (item_following && sgml_entitize(&item_following, n_ref_format) == NULL) { delete_all_lilimem(&sentinel); clear_mset_stack(ptr_mset_sentinel); return 801; } item_citsep = my_dbi_result_get_string_copy(dbires, "CITSEPARATOR"); if (item_citsep && my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { if (item_citsep) { free(item_citsep); } item_citsep = NULL; } if (item_citsep && insert_lilimem(&sentinel, (void**)&item_citsep, "item_citsep")) { delete_all_lilimem(&sentinel); clear_mset_stack(ptr_mset_sentinel); return 801; } if (item_citsep && sgml_entitize(&item_citsep, n_ref_format) == NULL) { delete_all_lilimem(&sentinel); clear_mset_stack(ptr_mset_sentinel); return 801; } /* select all datasets in temp table with an xref_pos == 1. This gives us a list of all citation_pos with multiple citations. Walk through this list and create a bibliomset element for each citation, containing all xrefs of that citation. Use the sorted_pos column for numeric citations */ sprintf(sql_command, "SELECT DISTINCT dbname, orig_id, author_concat, pubyear, article_title, periodical, volume, issue, startpage, entry_id, citation_pos, xref_pos, multi_id, sorted_pos, title_as_author, citekey FROM %s WHERE xref_pos=1 ORDER BY citation_pos", table_name); LOG_PRINT(LOG_DEBUG, sql_command); dbires1 = dbi_conn_query(ptr_bibconns->conn, sql_command); if (!dbires1) { delete_all_lilimem(&sentinel); dbi_result_free(dbires); clear_mset_stack(ptr_mset_sentinel); return 234; } if (n_ref_format == REFTEIX5) { if (print_elstart_x(ptr_ref, ptr_ref_len, "bibl", "rend", "multixref", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0 /* not empty */, ptr_indent, ptr_clrequest->namespace) == NULL) { delete_all_lilimem(&sentinel); dbi_result_free(dbires); dbi_result_free(dbires1); clear_mset_stack(ptr_mset_sentinel); return 801; } } else { if (print_elstart_x(ptr_ref, ptr_ref_len, "bibliomixed", "role", "multixref", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0 /* not empty */, ptr_indent, ptr_clrequest->namespace) == NULL) { delete_all_lilimem(&sentinel); dbi_result_free(dbires); dbi_result_free(dbires1); clear_mset_stack(ptr_mset_sentinel); return 801; } } /* loop over all citation_pos with more than one xref */ while (dbi_result_next_row(dbires1)) { nis_first = 1; /* reset runonce flag for each cycle */ n_citation_pos = my_dbi_result_get_idval(dbires1, "citation_pos"); /* request all xrefs of this citation and sort them according to the required format */ if (strcmp(item_intextseq, "ASIS") == 0) { sprintf(sql_command, "SELECT DISTINCT dbname, orig_id, author_concat, pubyear, article_title, periodical, volume, issue, startpage, entry_id, citation_pos, xref_pos, multi_id, sorted_pos, year_uni_suffix, title_as_author FROM %s WHERE citation_pos="ULLSPEC" ORDER BY xref_pos", table_name, (unsigned long long)n_citation_pos); } else if (strcmp(item_intextseq, "AUTHORDATE") == 0) { sprintf(sql_command, "SELECT DISTINCT dbname, orig_id, author_concat, pubyear, article_title, periodical, volume, issue, startpage, entry_id, citation_pos, xref_pos, multi_id, sorted_pos, year_uni_suffix, title_as_author FROM %s WHERE citation_pos="ULLSPEC" ORDER BY author_concat, pubyear, periodical, volume, issue, startpage", table_name, (unsigned long long)n_citation_pos); } else if (strcmp(item_intextseq, "CITEKEY") == 0) { sprintf(sql_command, "SELECT DISTINCT dbname, orig_id, author_concat, pubyear, article_title, periodical, volume, issue, startpage, entry_id, citation_pos, xref_pos, multi_id, sorted_pos, year_uni_suffix, title_as_author, citekey FROM %s WHERE citation_pos="ULLSPEC" ORDER BY citekey, author_concat, pubyear, periodical, volume, issue, startpage", table_name, (unsigned long long)n_citation_pos); } else if (strcmp(item_intextseq, "DATEASC") == 0) { sprintf(sql_command, "SELECT DISTINCT dbname, orig_id, author_concat, pubyear, article_title, periodical, volume, issue, startpage, entry_id, citation_pos, xref_pos, multi_id, sorted_pos, year_uni_suffix, title_as_author FROM %s WHERE citation_pos="ULLSPEC" ORDER BY pubyear, author_concat, periodical, volume, issue, startpage", table_name, (unsigned long long)n_citation_pos); } else if (strcmp(item_intextseq, "DATEDESC") == 0) { sprintf(sql_command, "SELECT DISTINCT dbname, orig_id, author_concat, pubyear, article_title, periodical, volume, issue, startpage, entry_id, citation_pos, xref_pos, multi_id, sorted_pos, year_uni_suffix, title_as_author FROM %s WHERE citation_pos="ULLSPEC" ORDER BY pubyear DESC, author_concat, periodical, volume, issue, startpage", table_name, (unsigned long long)n_citation_pos); } LOG_PRINT(LOG_DEBUG, sql_command); dbires2 = dbi_conn_query(ptr_bibconns->conn, sql_command); if (!dbires2) { delete_all_lilimem(&sentinel); dbi_result_free(dbires); dbi_result_free(dbires1); clear_mset_stack(ptr_mset_sentinel); return 234; } n_xrefloop_rowpos = 0; /* now do the real formatting by pulling all xrefs for the current citation*/ while (dbi_result_next_row(dbires2)) { item_multi_id = my_dbi_result_get_string_copy(dbires2, "multi_id"); if (item_multi_id && my_dbi_conn_error_flag(ptr_bibconns->conn)) { item_multi_id = NULL; } else if (item_multi_id && insert_lilimem(&sentinel, (void**)&item_multi_id, "item_multi_id")) { item_multi_id = NULL; } item_entry_id = my_dbi_result_get_string_copy(dbires2, "entry_id"); if (item_entry_id && my_dbi_conn_error_flag(ptr_bibconns->conn)) { item_entry_id = NULL; } else if (item_entry_id && insert_lilimem(&sentinel, (void**)&item_entry_id, "item_entry_id")) { item_entry_id = NULL; } item_dbname = dbi_result_get_string(dbires2, "dbname"); if (item_dbname && my_dbi_conn_error_flag(ptr_bibconns->conn)) { item_dbname = NULL; } if (!item_multi_id || !item_entry_id || !item_dbname) { delete_all_lilimem(&sentinel); dbi_result_free(dbires); dbi_result_free(dbires1); dbi_result_free(dbires2); clear_mset_stack(ptr_mset_sentinel); return 234; } n_sorted_pos = my_dbi_result_get_idval(dbires2, "sorted_pos"); if (n_sorted_pos == 0 && my_dbi_conn_error_flag(ptr_bibconns->conn)) { delete_all_lilimem(&sentinel); dbi_result_free(dbires); dbi_result_free(dbires1); dbi_result_free(dbires2); clear_mset_stack(ptr_mset_sentinel); return 234; } n_orig_id = my_dbi_result_get_idval(dbires2, "orig_id"); if (n_orig_id == 0 && my_dbi_conn_error_flag(ptr_bibconns->conn)) { delete_all_lilimem(&sentinel); dbi_result_free(dbires); dbi_result_free(dbires1); dbi_result_free(dbires2); clear_mset_stack(ptr_mset_sentinel); return 234; } ptr_biblio_info->year_unique_suffix = dbi_result_get_string(dbires2, "year_uni_suffix"); /* start with the code that appears in front of all xrefs */ if (nis_first) { nis_first = 0; /* run only once */ /* the additional information will be encoded in a bibliomset element. relation=endtermtarget is a label to indicate the processing app that this should not be rendered directly */ if (n_ref_format == REFDOCBKX5) { if (print_elstart_x(ptr_ref, ptr_ref_len, "bibliomset", "relation", "endtermtarget", "xml:id", item_multi_id, NULL, NULL, NULL, NULL, NULL, NULL, 0 /* not empty */, ptr_indent, ptr_clrequest->namespace) == NULL) { delete_all_lilimem(&sentinel); dbi_result_free(dbires); dbi_result_free(dbires1); dbi_result_free(dbires2); clear_mset_stack(ptr_mset_sentinel); return 801; } } else if (n_ref_format == REFTEIX5) { if (print_elstart_x(ptr_ref, ptr_ref_len, "seg", "type", "endtermtarget", "xml:id", item_multi_id, NULL, NULL, NULL, NULL, NULL, NULL, 0 /* not empty */, ptr_indent, ptr_clrequest->namespace) == NULL) { delete_all_lilimem(&sentinel); dbi_result_free(dbires); dbi_result_free(dbires1); dbi_result_free(dbires2); clear_mset_stack(ptr_mset_sentinel); return 801; } } else { if (print_elstart_x(ptr_ref, ptr_ref_len, "bibliomset", "relation", "endtermtarget", "id", item_multi_id, NULL, NULL, NULL, NULL, NULL, NULL, 0 /* not empty */, ptr_indent, ptr_clrequest->namespace) == NULL) { delete_all_lilimem(&sentinel); dbi_result_free(dbires); dbi_result_free(dbires1); dbi_result_free(dbires2); clear_mset_stack(ptr_mset_sentinel); return 801; } } n_prev_inline = inline_xmlindent(ptr_indent, 1); /* format the citations as the value of the bibliomset element. The in-text citation can retrieve this string with the endterm attribute */ /* preceeding */ if (item_preceeding) { if ((new_ref = mstrcat(*ptr_ref, item_preceeding, ptr_ref_len, 0)) == NULL) { delete_all_lilimem(&sentinel); dbi_result_free(dbires); dbi_result_free(dbires1); dbi_result_free(dbires2); clear_mset_stack(ptr_mset_sentinel); return 234; } else { *ptr_ref = new_ref; } } } else { /* if not first cycle in this loop */ if (nis_range) { /* printf("print range\n"); */ /* range separator */ if ((new_ref = mstrcat(*ptr_ref, item_rangesep, ptr_ref_len, 0)) == NULL) { delete_all_lilimem(&sentinel); dbi_result_free(dbires); dbi_result_free(dbires1); dbi_result_free(dbires2); clear_mset_stack(ptr_mset_sentinel); return 801; } else { *ptr_ref = new_ref; } nis_range = 0; /* reset */ } else if (item_citsep) { /* citation separator */ if ((new_ref = mstrcat(*ptr_ref, item_citsep, ptr_ref_len, 0)) == NULL) { delete_all_lilimem(&sentinel); dbi_result_free(dbires); dbi_result_free(dbires1); dbi_result_free(dbires2); clear_mset_stack(ptr_mset_sentinel); return 801; } else { *ptr_ref = new_ref; } } } /* retrieve dataset */ /* 0 refdb_id ID - (if numeric) 1 refdb_type TY - 2 refdb_pubyear PY - (partial) 3 refdb_startpage SP - 4 refdb_endpage EP - 5 refdb_abstract N2 - 6 refdb_title TI - 7 refdb_volume VL - 8 refdb_issue CP - 9 refdb_booktitle BT - 10 refdb_city CY - 11 refdb_publisher PB - 12 refdb_title_series T3 - 13 refdb_address AD - 14 refdb_issn SN - 15 refdb_periodical_id JO - (indirect) 16 refdb_pyother_info PY - (partial) 17 refdb_secyear Y2 - (partial) 18 refdb_secother_info Y2 - (partial) 19 refdb_user1 U1 - 20 refdb_user2 U2 - 21 refdb_user3 U3 - 22 refdb_user4 U4 - 23 refdb_user5 U5 - 24 refdb_typeofwork .. - 25 refdb_area .. - 26 refdb_ostype .. - 27 refdb_degree .. - 28 refdb_runningtime .. - 29 refdb_classcodeintl .. - 30 refdb_classcodeus .. - 31 refdb_senderemail .. - 32 refdb_recipientemail .. - 33 refdb_mediatype .. - 34 refdb_numvolumes .. - 35 refdb_edition .. - 36 refdb_computer .. - 37 refdb_conferencelocation .. - 38 refdb_registrynum .. - 39 refdb_classification .. - 40 refdb_section .. - 41 refdb_pamphletnum .. - 42 refdb_chapternum .. - 43 refdb_citekey ID - (if non-numeric) */ if (n_multiple_db) { sprintf(sql_command, "SELECT %s.t_refdb.refdb_id, %s.t_refdb.refdb_type, %s.t_refdb.refdb_pubyear, %s.t_refdb.refdb_startpage, %s.t_refdb.refdb_endpage, %s.t_refdb.refdb_abstract, %s.t_refdb.refdb_title, %s.t_refdb.refdb_volume, %s.t_refdb.refdb_issue, %s.t_refdb.refdb_booktitle, %s.t_refdb.refdb_city, %s.t_refdb.refdb_publisher, %s.t_refdb.refdb_title_series, %s.t_refdb.refdb_address, %s.t_refdb.refdb_issn, %s.t_refdb.refdb_periodical_id, %s.t_refdb.refdb_pyother_info, %s.t_refdb.refdb_secyear, %s.t_refdb.refdb_secother_info, %s.t_refdb.refdb_user1, %s.t_refdb.refdb_user2, %s.t_refdb.refdb_user3, %s.t_refdb.refdb_user4, %s.t_refdb.refdb_user5, %s.t_refdb.refdb_typeofwork, %s.t_refdb.refdb_area, %s.t_refdb.refdb_ostype, %s.t_refdb.refdb_degree, %s.t_refdb.refdb_runningtime, %s.t_refdb.refdb_classcodeintl, %s.t_refdb.refdb_classcodeus, %s.t_refdb.refdb_senderemail, %s.t_refdb.refdb_recipientemail, %s.t_refdb.refdb_mediatype, %s.t_refdb.refdb_numvolumes, %s.t_refdb.refdb_edition, %s.t_refdb.refdb_computer, %s.t_refdb.refdb_conferencelocation, %s.t_refdb.refdb_registrynum, %s.t_refdb.refdb_classification, %s.t_refdb.refdb_section, %s.t_refdb.refdb_pamphletnum, %s.t_refdb.refdb_chapternum, %s.t_refdb.refdb_citekey FROM %s.t_refdb WHERE %s.t_refdb.refdb_id="ULLSPEC, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, (unsigned long long)n_orig_id); ptr_bibconns->conn_source = ptr_bibconns->conn; /* make sure */ } else { sprintf(sql_command, "SELECT refdb_id, refdb_type, refdb_pubyear, refdb_startpage, refdb_endpage, refdb_abstract, refdb_title, refdb_volume, refdb_issue, refdb_booktitle, refdb_city, refdb_publisher, refdb_title_series, refdb_address, refdb_issn, refdb_periodical_id, refdb_pyother_info, refdb_secyear, refdb_secother_info, refdb_user1, refdb_user2, refdb_user3, refdb_user4, refdb_user5, refdb_typeofwork, refdb_area, refdb_ostype, refdb_degree, refdb_runningtime, refdb_classcodeintl, refdb_classcodeus, refdb_senderemail, refdb_recipientemail, refdb_mediatype, refdb_numvolumes, refdb_edition, refdb_computer, refdb_conferencelocation, refdb_registrynum, refdb_classification, refdb_section, refdb_pamphletnum, refdb_chapternum, refdb_citekey FROM t_refdb WHERE refdb_id="ULLSPEC, (unsigned long long)n_orig_id); /* need a connection to item_dbname */ ptr_bibconns->conn_source = connect_to_db(ptr_clrequest, item_dbname, 0); if (!ptr_bibconns->conn_source) { delete_all_lilimem(&sentinel); dbi_result_free(dbires); dbi_result_free(dbires1); dbi_result_free(dbires2); clear_mset_stack(ptr_mset_sentinel); return 204; } } LOG_PRINT(LOG_DEBUG, sql_command); dbires3 = dbi_conn_query(ptr_bibconns->conn_source, sql_command); if (!dbires3 || dbi_result_next_row(dbires3) == 0) { delete_all_lilimem(&sentinel); dbi_result_free(dbires); dbi_result_free(dbires1); dbi_result_free(dbires2); clear_mset_stack(ptr_mset_sentinel); return 234; } /* item_entry_id checked for non-NULL above */ ptr_biblio_info->entry_id = item_entry_id; ptr_biblio_info->n_refdb_id = my_dbi_result_get_idval(dbires3, "refdb_id"); author_concat = my_dbi_result_get_string(dbires2, "author_concat"); n_currpos = dbi_result_get_int(dbires2, "sorted_pos"); n_pubyear = dbi_result_get_short(dbires2, "pubyear"); n_is_subseq = check_is_subseq(author_concat, table_name, n_currpos, n_pubyear, ptr_bibconns->conn); if (n_is_subseq == -1) { delete_all_lilimem(&sentinel); dbi_result_free(dbires); dbi_result_free(dbires1); dbi_result_free(dbires2); dbi_result_free(dbires3); clear_mset_stack(ptr_mset_sentinel); return 234; } ptr_biblio_info->is_subseq = n_is_subseq; title_as_author = dbi_result_get_short(dbires2, "title_as_author"); /* if we are supposed to display consecutive sequences of numerical citations as a numerical range, we have to format the first in a possible series and then look ahead if at least two more citations are consecutive (as defined by their sorted order in the bibliography) */ if (ndo_range) { if ((n_status = format_entry(ptr_ref, ptr_ref_len, intext_string, ptr_bibconns, dbires, dbires3, item_dbname, ptr_clrequest->username, n_sorted_pos, ptr_mset_sentinel, ptr_biblio_info, title_as_author, ptr_clrequest->namespace, ptr_indent, n_ref_format, ptr_clrequest->pdfroot)) != 0) { delete_all_lilimem(&sentinel); dbi_result_free(dbires); dbi_result_free(dbires1); dbi_result_free(dbires2); dbi_result_free(dbires3); clear_mset_stack(ptr_mset_sentinel); return n_status; } ncurr_sorted_pos = n_sorted_pos; n_skip = 0; /* look ahead if this is the start of consecutive numbers */ do { n_consec = dbi_result_next_row(dbires2); if (n_consec != 0) { n_sorted_pos1 = my_dbi_result_get_idval(dbires2, "sorted_pos"); if (my_dbi_conn_error_flag(ptr_bibconns->conn)) { /* ToDo: drop out here? */ LOG_PRINT(LOG_WARNING, "temp table access error: sorted_pos unknown"); } } ncurr_sorted_pos++; n_skip++; } while (n_consec != 0 && n_sorted_pos1 == ncurr_sorted_pos); /* several possibilities: */ /* n_skip == 1: either no more entries or not a consecutive number */ /* n_skip == 2: two consecutive numbers, third one does not exist or is not consecutive */ /* n_skip > 2: at least three consecutive numbers */ /* either no consecutive numbers or only two. Two numbers are not displayed as a range */ if (n_skip < 3) { /* no n_xrefloop_rowpos correction here, as it will be incremented by one anyway at the end of the loop */ dbi_result_seek_row(dbires2, n_xrefloop_rowpos + 1); } /* at least three consecutive numbers. The next reference to be formatted is the last one of the range. Adjust n_xrefloop_rowpos accordingly */ else { dbi_result_seek_row(dbires2, n_xrefloop_rowpos + n_skip - 1); /* this will be incremented by one later */ n_xrefloop_rowpos += n_skip - 2; nis_range = 1; } } /* don't use ranges. We have to format each entry */ else { if ((n_status = format_entry(ptr_ref, ptr_ref_len, intext_string, ptr_bibconns, dbires, dbires3, item_dbname, ptr_clrequest->username, n_sorted_pos, ptr_mset_sentinel, ptr_biblio_info, title_as_author, ptr_clrequest->namespace, ptr_indent, n_ref_format, ptr_clrequest->pdfroot)) != 0) { delete_all_lilimem(&sentinel); dbi_result_free(dbires); dbi_result_free(dbires1); dbi_result_free(dbires2); dbi_result_free(dbires3); clear_mset_stack(ptr_mset_sentinel); return n_status; } } /* end if use ranges */ dbi_result_free(dbires3); n_xrefloop_rowpos++; delete_lilimem(&sentinel, "item_entry_id"); delete_lilimem(&sentinel, "item_multi_id"); if (!n_multiple_db) { dbi_conn_close(ptr_bibconns->conn_source); ptr_bibconns->conn_source = NULL; } } /* end loop over all xrefs of this citation */ if ((new_ref = set_mset(ptr_mset_sentinel, "", ptr_ref, ptr_ref_len, ptr_clrequest->namespace, ptr_indent, n_ref_format)) == NULL) { delete_all_lilimem(&sentinel); dbi_result_free(dbires); dbi_result_free(dbires1); dbi_result_free(dbires2); clear_mset_stack(ptr_mset_sentinel); return 801; } else { *ptr_ref = new_ref; } /* following */ if (item_following) { if ((new_ref = mstrcat(*ptr_ref, item_following, ptr_ref_len, 0)) == NULL) { delete_all_lilimem(&sentinel); dbi_result_free(dbires); dbi_result_free(dbires1); dbi_result_free(dbires2); clear_mset_stack(ptr_mset_sentinel); return 801; } else { *ptr_ref = new_ref; } } if (n_ref_format == REFTEIX5) { if (print_elend_x(ptr_ref, ptr_ref_len, "seg", ptr_indent, ptr_clrequest->namespace) == NULL) { delete_all_lilimem(&sentinel); dbi_result_free(dbires); dbi_result_free(dbires1); dbi_result_free(dbires2); clear_mset_stack(ptr_mset_sentinel); return 801; } } else { if (print_elend_x(ptr_ref, ptr_ref_len, "bibliomset", ptr_indent, ptr_clrequest->namespace) == NULL) { delete_all_lilimem(&sentinel); dbi_result_free(dbires); dbi_result_free(dbires1); dbi_result_free(dbires2); clear_mset_stack(ptr_mset_sentinel); return 801; } } dbi_result_free(dbires2); inline_xmlindent(ptr_indent, n_prev_inline); } /* end loop over all citations */ dbi_result_free(dbires); dbi_result_free(dbires1); delete_all_lilimem(&sentinel); if (n_ref_format == REFTEIX5) { if (print_elend_x(ptr_ref, ptr_ref_len, "bibl", ptr_indent, ptr_clrequest->namespace) == NULL) { clear_mset_stack(ptr_mset_sentinel); return 801; } if (print_elend_x(ptr_ref, ptr_ref_len, "listBibl", ptr_indent, ptr_clrequest->namespace) == NULL) { clear_mset_stack(ptr_mset_sentinel); return 801; } if (print_elend_x(ptr_ref, ptr_ref_len, "div", ptr_indent, ptr_clrequest->namespace) == NULL) { clear_mset_stack(ptr_mset_sentinel); return 801; } } else { if (print_elend_x(ptr_ref, ptr_ref_len, "bibliomixed", ptr_indent, ptr_clrequest->namespace) == NULL) { clear_mset_stack(ptr_mset_sentinel); return 801; } if (print_elend_x(ptr_ref, ptr_ref_len, "bibliography", ptr_indent, ptr_clrequest->namespace) == NULL) { clear_mset_stack(ptr_mset_sentinel); return 801; } } clear_mset_stack(ptr_mset_sentinel); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ render_dbib() renders a RIS dataset for DocBook V.3.1 bibliography int render_dbib returns 0 if successful, >0 if failed char** ptr_ref ptr to a ptr to a buffer created with malloc which will receive the output. The calling function must allocate the buffer with at least 4096 byte. This function will reallocate the buffer as needed. *ptr will be updated whenever a realloc is necessary. The calling function is responsible for freeing the memory again. size_t* ptr_ref_len pointer to a variable holding the current size of ref. Will be updated accordingly. struct BIBCONNS* ptr_bibconns ptr to structure with database connections dbi_result dbires pointer to a dbi result structure holding the RIS dataset const char* database ptr to a string with the database name of the current query struct bibinfo* ptr_biblio_info ptr to struct with additional bibliographic info char* username ptr to string with the current username char* pdfroot ptr to string with the root path for PDF offprints int nref_counter counter for datasets, used for numeric citation style and if the bibliography needs to be numbered short title_as_author if yes, the reference has no authors and the style wants the title to be printed instead const char* ns optional namespace prefix struct xmlindent* ptr_indent ptr to indentation info int n_ref_format requested output format: REFDOCBK, REFDOCBKX, REFTEIX ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int render_dbib(char** ptr_ref, size_t* ptr_ref_len, struct BIBCONNS* ptr_bibconns, dbi_result dbires, const char* database, struct bibinfo* ptr_biblio_info, char* username, char* pdfroot, int nref_counter, short title_as_author, const char* ns, struct xmlindent* ptr_indent, int n_ref_format) { int i; /* the tried-and-true counter */ int sql_command_len; int n_status; int n_prev_inline; char *new_ref; /* used for reallocating buffer ref */ char *sql_command; /* buffer for assembling SQL queries */ char *buffer; char *myjournal; char *item_preceeding; char *item_following; const char *drivername; char empty_string[1] = ""; char bmset_buffer[256] = ""; char id_string[7]; char format_spec[5][12] = {"INTEXT", "INTEXTS", "AUTHORONLY", "AUTHORONLYS", "YEARONLY"}; char bibliomset_endstring[6][5] = {"-X", "-S", "-A", "-Q", "-Y"}; char role_string[5][13] = {"intext", "intextsq", "authoronly", "authoronlysq", "yearonly"}; dbi_result dbires_cit; /* dbi_conn conn; */ struct lilimem sentinel; struct mset* ptr_mset_sentinel; switch (n_ref_format) { case REFDOCBKX5: case REFTEIX5: strcpy(id_string, "xml:id"); break; default: strcpy(id_string, "id"); break; } sentinel.ptr_mem = NULL; sentinel.ptr_next = NULL; sentinel.varname[0] = '\0'; if ((ptr_mset_sentinel = new_mset_stack()) == NULL) { return 801; } /* printf("now in render_dbib for %s\n", ptr_biblio_info->entry_id); */ drivername = dbi_driver_get_name(dbi_conn_get_driver(ptr_bibconns->conn_refdb)); /* get memory for sql command buffer */ sql_command_len = 1024; sql_command = malloc(sql_command_len); if (!sql_command || insert_lilimem(&sentinel, (void**)&sql_command, "sql_command")) { clear_mset_stack(ptr_mset_sentinel); return 801; } /* ToDo: check for string overflow */ myjournal = strdup(ptr_biblio_info->format_string); if (!myjournal || insert_lilimem(&sentinel, (void**)&myjournal, "myjournal")) { delete_all_lilimem(&sentinel); clear_mset_stack(ptr_mset_sentinel); return 801; } if (dbi_conn_quote_string(ptr_bibconns->conn_refdb, &myjournal) == 0) { delete_all_lilimem(&sentinel); clear_mset_stack(ptr_mset_sentinel); return 801; } /* retrieve basic information about the bibliography style from CITSTYLE into ptr_result */ if (!strcmp(my_dbi_conn_get_cap(ptr_bibconns->conn_refdb, "multiple_db"), "t")) { sprintf(sql_command, "SELECT ID, CITSEPARATOR, FOLLOWING, PRECEEDING, RANGESEPARATOR, INTEXTSEQUENCE, STYLE, JANFULL, FEBFULL, MARFULL, APRFULL, MAYFULL, JUNFULL, JULFULL, AUGFULL, SEPFULL, OCTFULL, NOVFULL, DECFULL, JANABBREV, FEBABBREV, MARABBREV, APRABBREV, MAYABBREV, JUNABBREV, JULABBREV, AUGABBREV, SEPABBREV, OCTABBREV, NOVABBREV, DECABBREV, JANTHREELET, FEBTHREELET, MARTHREELET, APRTHREELET, MAYTHREELET, JUNTHREELET, JULTHREELET, AUGTHREELET, SEPTHREELET, OCTTHREELET, NOVTHREELET, DECTHREELET from %s.CITSTYLE where JOURNAL=%s", main_db, myjournal); } else { sprintf(sql_command, "SELECT ID, CITSEPARATOR, FOLLOWING, PRECEEDING, RANGESEPARATOR, INTEXTSEQUENCE, STYLE, JANFULL, FEBFULL, MARFULL, APRFULL, MAYFULL, JUNFULL, JULFULL, AUGFULL, SEPFULL, OCTFULL, NOVFULL, DECFULL, JANABBREV, FEBABBREV, MARABBREV, APRABBREV, MAYABBREV, JUNABBREV, JULABBREV, AUGABBREV, SEPABBREV, OCTABBREV, NOVABBREV, DECABBREV, JANTHREELET, FEBTHREELET, MARTHREELET, APRTHREELET, MAYTHREELET, JUNTHREELET, JULTHREELET, AUGTHREELET, SEPTHREELET, OCTTHREELET, NOVTHREELET, DECTHREELET from CITSTYLE where JOURNAL=%s", myjournal); } LOG_PRINT(LOG_DEBUG, sql_command); dbires_cit = dbi_conn_query(ptr_bibconns->conn_refdb, sql_command); if (!dbires_cit || dbi_result_next_row(dbires_cit) == 0) { delete_all_lilimem(&sentinel); clear_mset_stack(ptr_mset_sentinel); return 234; } item_preceeding = my_dbi_result_get_string_copy(dbires_cit, "PRECEEDING"); if (item_preceeding && my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { if (item_preceeding) { free(item_preceeding); } item_preceeding = NULL; } if (item_preceeding && insert_lilimem(&sentinel, (void**)&item_preceeding, "item_preceeding")) { delete_all_lilimem(&sentinel); clear_mset_stack(ptr_mset_sentinel); return 801; } item_following = my_dbi_result_get_string_copy(dbires_cit, "FOLLOWING"); if (item_following && my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { if (item_following) { free(item_following); } item_following = NULL; } if (item_following && insert_lilimem(&sentinel, (void**)&item_following, "item_following")) { delete_all_lilimem(&sentinel); clear_mset_stack(ptr_mset_sentinel); return 801; } /* find out reference type */ buffer = (char*)get_refdb_type(dbires); if (!buffer) { delete_all_lilimem(&sentinel); dbi_result_free(dbires_cit); clear_mset_stack(ptr_mset_sentinel); return 244; } /* The id attribute of bibliomixed is used to match the bibliography entry with the citation(s) in the text. The role attribute of bibliomixed is used by the stylesheet to pick the proper formatting rules */ if (n_ref_format == REFTEIX5) { if (print_elstart_x(ptr_ref, ptr_ref_len, "bibl", id_string, ptr_biblio_info->entry_id, "rend", buffer, NULL, NULL, NULL, NULL, NULL, NULL, 0 /* not empty */, ptr_indent, ns) == NULL) { delete_all_lilimem(&sentinel); dbi_result_free(dbires_cit); clear_mset_stack(ptr_mset_sentinel); return 244; } } else { if (print_elstart_x(ptr_ref, ptr_ref_len, "bibliomixed", id_string, ptr_biblio_info->entry_id, "role", buffer, NULL, NULL, NULL, NULL, NULL, NULL, 0 /* not empty */, ptr_indent, ns) == NULL) { delete_all_lilimem(&sentinel); dbi_result_free(dbires_cit); clear_mset_stack(ptr_mset_sentinel); return 244; } } /* this loop creates a couple of bibliomset elements which can be targeted from the SGML document by link elements. They provide: - id="IDxyz:X": contains the standard in-text citation - id="IDxyz:S": contains the in-text citation for subsequent citations - id="IDxyz:A": contains the standard author-only in-text citation - id="IDxyz:Q": contains the author-only in-text citation (subsequent) - id="IDxyz:Y": contains the year-only in-text citation */ /* printf("here intext contents start for %s\n", ptr_biblio_info->entry_id); */ for (i = 0; i < 5; i++) { sprintf(bmset_buffer, "%s%s", ptr_biblio_info->entry_id, bibliomset_endstring[i]); if (n_ref_format == REFTEIX5) { if (print_elstart_x(ptr_ref, ptr_ref_len, "seg", "type", role_string[i], id_string, bmset_buffer, NULL, NULL, NULL, NULL, NULL, NULL, 0 /* not empty */, ptr_indent, ns) == NULL) { delete_all_lilimem(&sentinel); dbi_result_free(dbires_cit); clear_mset_stack(ptr_mset_sentinel); return 801; } } else { if (print_elstart_x(ptr_ref, ptr_ref_len, "bibliomset", "role", role_string[i], id_string, bmset_buffer, NULL, NULL, NULL, NULL, NULL, NULL, 0 /* not empty */, ptr_indent, ns) == NULL) { delete_all_lilimem(&sentinel); dbi_result_free(dbires_cit); clear_mset_stack(ptr_mset_sentinel); return 801; } } n_prev_inline = inline_xmlindent(ptr_indent, 1); if (i < 2 || i > 3) { /* all but the author-onlies */ if (item_preceeding && *item_preceeding) { /* CITSTYLE PRECEEDING */ if ((new_ref = mstrcat(*ptr_ref, (char*)item_preceeding, ptr_ref_len, 0)) == NULL) { delete_all_lilimem(&sentinel); dbi_result_free(dbires_cit); clear_mset_stack(ptr_mset_sentinel); return 801; } else { *ptr_ref = new_ref; } } } if ((n_status = format_entry(ptr_ref, ptr_ref_len, format_spec[i], ptr_bibconns, dbires_cit, dbires, database, username, nref_counter, ptr_mset_sentinel, ptr_biblio_info, title_as_author, ns, ptr_indent, n_ref_format, pdfroot)) != 0) { dbi_result_free(dbires_cit); delete_all_lilimem(&sentinel); clear_mset_stack(ptr_mset_sentinel); return n_status; } if ((new_ref = set_mset(ptr_mset_sentinel, empty_string, ptr_ref, ptr_ref_len, ns, ptr_indent, n_ref_format)) == NULL) { dbi_result_free(dbires_cit); delete_all_lilimem(&sentinel); clear_mset_stack(ptr_mset_sentinel); return 801; } else { *ptr_ref = new_ref; } if (i < 2 || i > 3) { if (item_following && *(item_following)) { /* CITSTYLE FOLLOWING */ if (sgml_entitize(&item_following, n_ref_format) == NULL) { delete_all_lilimem(&sentinel); dbi_result_free(dbires_cit); clear_mset_stack(ptr_mset_sentinel); return 801; } if ((new_ref = mstrcat(*ptr_ref, item_following, ptr_ref_len, 0)) == NULL) { dbi_result_free(dbires_cit); delete_all_lilimem(&sentinel); clear_mset_stack(ptr_mset_sentinel); return 801; } else { *ptr_ref = new_ref; } } } if (n_ref_format == REFTEIX5) { if (print_elend_x(ptr_ref, ptr_ref_len, "seg", ptr_indent, ns) == NULL) { dbi_result_free(dbires_cit); delete_all_lilimem(&sentinel); clear_mset_stack(ptr_mset_sentinel); return 801; } } else { if (print_elend_x(ptr_ref, ptr_ref_len, "bibliomset", ptr_indent, ns) == NULL) { dbi_result_free(dbires_cit); delete_all_lilimem(&sentinel); clear_mset_stack(ptr_mset_sentinel); return 801; } } inline_xmlindent(ptr_indent, n_prev_inline); } /* end for */ /* printf("here the real bibliography contents start for %s\n", ptr_biblio_info->entry_id); */ /* here the real bibliography contents start */ sprintf(bmset_buffer, "%s-b", ptr_biblio_info->entry_id); if (n_ref_format == REFTEIX5) { if (print_elstart_x(ptr_ref, ptr_ref_len, "seg", "type", "bibliography", id_string, bmset_buffer, NULL, NULL, NULL, NULL, NULL, NULL, 0 /* not empty */, ptr_indent, ns) == NULL) { dbi_result_free(dbires_cit); delete_all_lilimem(&sentinel); clear_mset_stack(ptr_mset_sentinel); return 801; } } else { if (print_elstart_x(ptr_ref, ptr_ref_len, "bibliomset", "role", "bibliography", id_string, bmset_buffer, NULL, NULL, NULL, NULL, NULL, NULL, 0 /* not empty */, ptr_indent, ns) == NULL) { dbi_result_free(dbires_cit); delete_all_lilimem(&sentinel); clear_mset_stack(ptr_mset_sentinel); return 801; } } n_prev_inline = inline_xmlindent(ptr_indent, 1); if ((n_status = format_entry(ptr_ref, ptr_ref_len, buffer, ptr_bibconns, dbires_cit, dbires, database, username, nref_counter, ptr_mset_sentinel, ptr_biblio_info, title_as_author, ns, ptr_indent, n_ref_format, pdfroot)) != 0) { /* format bibliography entry body according to PUBTYPE */ dbi_result_free(dbires_cit); delete_all_lilimem(&sentinel); clear_mset_stack(ptr_mset_sentinel); return n_status; } if ((new_ref = set_mset(ptr_mset_sentinel, empty_string, ptr_ref, ptr_ref_len, ns, ptr_indent, n_ref_format)) == NULL) { dbi_result_free(dbires_cit); delete_all_lilimem(&sentinel); clear_mset_stack(ptr_mset_sentinel); return 801; } else { *ptr_ref = new_ref; } if ((new_ref = set_mset(ptr_mset_sentinel, empty_string, ptr_ref, ptr_ref_len, ns, ptr_indent, n_ref_format)) == NULL) { dbi_result_free(dbires_cit); delete_all_lilimem(&sentinel); clear_mset_stack(ptr_mset_sentinel); return 801; } else { *ptr_ref = new_ref; } if (n_ref_format == REFTEIX5) { if (print_elend_x(ptr_ref, ptr_ref_len, "seg", ptr_indent, ns) == NULL) { dbi_result_free(dbires_cit); delete_all_lilimem(&sentinel); clear_mset_stack(ptr_mset_sentinel); return 801; } } else { if (print_elend_x(ptr_ref, ptr_ref_len, "bibliomset", ptr_indent, ns) == NULL) { dbi_result_free(dbires_cit); delete_all_lilimem(&sentinel); clear_mset_stack(ptr_mset_sentinel); return 801; } } inline_xmlindent(ptr_indent, n_prev_inline); if (n_ref_format == REFTEIX5) { if (print_elend_x(ptr_ref, ptr_ref_len, "bibl", ptr_indent, ns) == NULL) { dbi_result_free(dbires_cit); delete_all_lilimem(&sentinel); clear_mset_stack(ptr_mset_sentinel); return 801; } } else { if (print_elend_x(ptr_ref, ptr_ref_len, "bibliomixed", ptr_indent, ns) == NULL) { dbi_result_free(dbires_cit); delete_all_lilimem(&sentinel); clear_mset_stack(ptr_mset_sentinel); return 801; } } dbi_result_free(dbires_cit); delete_all_lilimem(&sentinel); clear_mset_stack(ptr_mset_sentinel); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ format_entry(): formats a bibliography entry in DocBook cooked biblio format int format_entry returns 0 if successful, >0 if failed char** ptr_ref ptr to a ptr to a buffer created with malloc which will receive the output. The calling function must allocate the buffer with at least one byte. This function will reallocate the buffer as needed. *ptr will be updated whenever a realloc is necessary. The calling function is responsible for freeing the memory again. size_t* ptr_ref_len ptr to an int holding the current length of ref. Will be modified if ref is reallocated. char* pubtype ptr to a string containing the pubtype to format struct BIBCONNS* ptr_bibconns ptr to structure with database connections dbi_result dbires_cit ptr to a dbi result structure containing the current citation style info dbi_result dbires ptr to a dbi result structure containing the current reference. If this is NULL, only the authorlist will be formatted using the database and ID info in biblio_info const char* database ptr to string containing the current reference database const char* username ptr to string containing the current user int nref_counter number of reference (to be displayed in bibliography) struct mset* ptr_mset_sentinel ptr to the bibliomset relation attribute stack struct bibinfo* ptr_biblio_info ptr to struct with additional bibliographic info short title_as_author if > 0, the reference has no authors and the style wants the title to be printed instead const char* ns optional namespace prefix struct xmlindent* ptr_indent indentation information int n_ref_format requested output format: REFDOCBK, REFDOCBKX, REFTEIX const char* pdfroot optional path prefix for file:// links ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int format_entry(char** ptr_ref, size_t* ptr_ref_len, char* pubtype, struct BIBCONNS* ptr_bibconns, dbi_result dbires_cit, dbi_result dbires, const char* database, const char* username, int nref_counter, struct mset* ptr_mset_sentinel, struct bibinfo* ptr_biblio_info, short title_as_author, const char* ns, struct xmlindent* ptr_indent, int n_ref_format, const char* pdfroot) { int error = 0; size_t nref_buffer_len; int n_intext = 0; /* 0 = bibliography, 1 = intext, 2 = intext subseq */ int n_status; int errflag; unsigned int n_id; unsigned int n_refstyle_id; unsigned int n_separator_id; short my_title_as_author; char *new_ref; char *ref_buffer; char *new_ref_buffer; char *sql_command; const char *alternatetext; const char *item_type; const char *drivername; char mset_string[10] = ""; dbi_result dbires_pos; dbi_result dbires_ref; /* printf("format_entry(): title_as_author went to %d<<\n", title_as_author); */ drivername = dbi_driver_get_name(dbi_conn_get_driver(ptr_bibconns->conn_refdb)); /* get memory for sql command buffer */ sql_command = malloc(8192); if (!sql_command) { return 801; } /* get memory for the buffer */ nref_buffer_len = 1024; ref_buffer = malloc(nref_buffer_len); if (!ref_buffer) { free(sql_command); return 801; } ref_buffer[0] = '\0'; /* terminate */ /* printf("pubtype went to:%s\n", pubtype); */ if (!strcmp(pubtype, "INTEXTS")) { pubtype[6] = '\0'; n_intext = 2; } else if (!strcmp(pubtype, "INTEXT")) { n_intext = 1; } else if (!strcmp(pubtype, "AUTHORONLYS")) { pubtype[10] = '\0'; n_intext = 2; } else if (!strcmp(pubtype, "AUTHORONLY")) { n_intext = 1; } else if (!strcmp(pubtype, "YEARONLY")) { n_intext = 1; } n_id = my_dbi_result_get_int_idval(dbires_cit, "ID"); if ((dbires_ref = load_style(pubtype, n_id, ptr_bibconns->conn_refdb)) == NULL) { free(sql_command); free(ref_buffer); return 241; } if (title_as_author) { if (!strcmp(pubtype, "BOOK")) { my_title_as_author = 2; } else if (!strcmp(pubtype, "NEWS")) { alternatetext = my_dbi_result_get_string_idx(dbires_ref, AUTHORLISTALTERNATETEXT); if (alternatetext && !strcmp(alternatetext, "JOURNALNAME")) { my_title_as_author = 5; } else { my_title_as_author = 1; } } else { my_title_as_author = 1; } } else { my_title_as_author = 0; } /* only need authorlist (used for finding citations with same author/year) */ if (!dbires) { if ((n_status = format_authorlist(ptr_ref, ptr_ref_len, ptr_bibconns, dbires, dbi_style_res, 4 /* first available */, database, 1, ptr_biblio_info, my_title_as_author, ns, ptr_indent, n_ref_format)) != 0) { error = 1; } else { /* *ptr_ref = new_ref; */ } free(sql_command); free(ref_buffer); unload_style(); return n_status; } n_refstyle_id = my_dbi_result_get_int_idval(dbi_style_res, "ID"); if ((errflag = my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) != 0) { /* ToDo: jump out here? */ LOG_PRINT(LOG_WARNING, get_status_msg(241)); free(sql_command); free(ref_buffer); unload_style(); return 241; } if (!strcmp(my_dbi_conn_get_cap(ptr_bibconns->conn_refdb, "multiple_db"), "t")) { sprintf(sql_command, "SELECT TYPE, SEPARATORID, POS FROM %s.POSITIONS WHERE REFSTYLEID=%u ORDER BY POS ASC", main_db, n_refstyle_id); } else { sprintf(sql_command, "SELECT TYPE, SEPARATORID, POS FROM POSITIONS WHERE REFSTYLEID=%u ORDER BY POS ASC", n_refstyle_id); } LOG_PRINT(LOG_DEBUG, sql_command); dbires_pos = dbi_conn_query(ptr_bibconns->conn_refdb, sql_command); if (!dbires_pos) { LOG_PRINT(LOG_WARNING, get_status_msg(241)); dbi_result_free(dbires_pos); unload_style(); free(sql_command); free(ref_buffer); return 241; } /* walk through all positions and format the elements */ while (dbi_result_next_row(dbires_pos)) { item_type = dbi_result_get_string(dbires_pos, "TYPE"); /* n_separator_id = my_dbi_result_get_idval(dbi_style_res, "SEPARATORID"); */ n_separator_id = dbi_result_get_uint(dbires_pos, "SEPARATORID"); if (!item_type || !*item_type) { continue; } /* printf("in format_entry loop, item_type=%s; pubtype=%s<<\n", item_type, pubtype); */ /* the following code uses a buffer to format the bits and pieces. this buffer will only be appended to the result string if the bits and pieces are not empty. */ /*---------------------------------------------------------------*/ if (strcmp(item_type, "REFNUMBER") == 0) { /* if (!nformat_spec) { */ if ((new_ref_buffer = set_mset(ptr_mset_sentinel, "", &ref_buffer, &nref_buffer_len, ns, ptr_indent, n_ref_format)) == NULL) { error = 801; break; } ref_buffer = new_ref_buffer; if ((new_ref_buffer = format_refnumber(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, nref_counter, n_intext, ns, ptr_indent, n_ref_format)) == NULL) { error = 805; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "CITEKEY") == 0) { /* if (!nformat_spec) { */ if ((new_ref_buffer = set_mset(ptr_mset_sentinel, "", &ref_buffer, &nref_buffer_len, ns, ptr_indent, n_ref_format)) == NULL) { error = 801; break; } ref_buffer = new_ref_buffer; if ((new_ref_buffer = format_citekey(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, ns, ptr_indent, n_ref_format)) == NULL) { error = 805; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ /* part author list */ else if (strcmp(item_type, "AUTHORLIST") == 0) { if (!n_intext) { if (strcmp(pubtype, "BOOK") == 0) { strcpy(mset_string, "book"); } else if (strcmp(pubtype, "CHAP") == 0) { strcpy(mset_string, "chapter"); } else { strcpy(mset_string, "article"); } } else { /* strcpy(mset_string, "intext"); */ mset_string[0] = '\0'; } if ((new_ref_buffer = set_mset(ptr_mset_sentinel, mset_string, &ref_buffer, &nref_buffer_len, ns, ptr_indent, n_ref_format)) == NULL) { error = 801; break; } ref_buffer = new_ref_buffer; if ((n_status = format_authorlist(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, 1 /* part authors */, database, n_intext, ptr_biblio_info, title_as_author, ns, ptr_indent, n_ref_format)) != 0) { error = n_status; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ /* publication author list */ else if (strcmp(item_type, "EDITORLIST") == 0) { if (!n_intext) { strcpy(mset_string, "book"); } else { /* strcpy(mset_string, "intext"); */ mset_string[0] = '\0'; } if ((new_ref_buffer = set_mset(ptr_mset_sentinel, mset_string, &ref_buffer, &nref_buffer_len, ns, ptr_indent, n_ref_format)) == NULL) { error = 801; break; } ref_buffer = new_ref_buffer; if ((n_status = format_authorlist(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, 2 /* publication authors */, database, n_intext, ptr_biblio_info, 0 /* never use title */, ns, ptr_indent, n_ref_format)) != 0) { error = n_status; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ /* set author list */ else if (strcmp(item_type, "SEDITORLIST") == 0) { if (!n_intext) { strcpy(mset_string, "series"); } else { /* strcpy(mset_string, "intext"); */ mset_string[0] = '\0'; } if ((new_ref_buffer = set_mset(ptr_mset_sentinel, mset_string, &ref_buffer, &nref_buffer_len, ns, ptr_indent, n_ref_format)) == NULL) { error = 801; break; } ref_buffer = new_ref_buffer; if ((n_status = format_authorlist(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, 3 /* set authors */, database, n_intext, ptr_biblio_info, 0 /* never use title */, ns, ptr_indent, n_ref_format)) != 0) { error = n_status; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "ALLALIST") == 0) { if (!n_intext) { strcpy(mset_string, "all"); } else { /* strcpy(mset_string, "intext"); */ mset_string[0] = '\0'; } if ((new_ref_buffer = set_mset(ptr_mset_sentinel, mset_string, &ref_buffer, &nref_buffer_len, ns, ptr_indent, n_ref_format)) == NULL) { error = 801; break; } ref_buffer = new_ref_buffer; if ((n_status = format_authorlist(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, 4 /* first available */, database, n_intext, ptr_biblio_info, 0 /* never use title */, ns, ptr_indent, n_ref_format)) != 0) { error = n_status; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "PUBDATE") == 0) { if (!n_intext) { if (strcmp(pubtype, "BOOK") == 0) { strcpy(mset_string, "book"); } else if (strcmp(pubtype, "CHAP") == 0) { strcpy(mset_string, "book"); } else { strcpy(mset_string, "article"); } } else { /* strcpy(mset_string, "intext"); */ *mset_string = '\0'; } if ((new_ref_buffer = set_mset(ptr_mset_sentinel, mset_string, &ref_buffer, &nref_buffer_len, ns, ptr_indent, n_ref_format)) == NULL) { error = 801; break; } ref_buffer = new_ref_buffer; if ((new_ref_buffer = format_pubdate(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, dbires_cit, 0, n_intext, ptr_biblio_info->year_unique_suffix, ns, ptr_indent, n_ref_format)) == NULL) { error = 809; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "PUBDATESEC") == 0) { if (!n_intext) { if (strcmp(pubtype, "BOOK") == 0) { strcpy(mset_string, "book"); } else if (strcmp(pubtype, "CHAP") == 0) { strcpy(mset_string, "book"); } else { strcpy(mset_string, "article"); } } else { /* strcpy(mset_string, "intext"); */ *mset_string = '\0'; } if ((new_ref_buffer = set_mset(ptr_mset_sentinel, mset_string, &ref_buffer, &nref_buffer_len, ns, ptr_indent, n_ref_format)) == NULL) { error = 801; break; } ref_buffer = new_ref_buffer; if ((new_ref_buffer = format_pubdate(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, dbires_cit, 1, n_intext, NULL, ns, ptr_indent, n_ref_format)) == NULL) { error = 810; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "TITLE") == 0 && my_title_as_author != 1) { if ((new_ref_buffer = format_title(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, 1, n_intext, 0 /* not title as author */, ns, ptr_indent, n_ref_format)) == NULL) { error = 811; break; } if (ref_buffer[0]) { /* set mset only if we have some title contents */ if (!n_intext) { if (strcmp(pubtype, "CHAP") == 0 /* todo: is this the correct fix? */ || strcmp(pubtype, "CASE") == 0) { strcpy(mset_string, "chapter"); } else { strcpy(mset_string, "article"); } } else { strcpy(mset_string, "intext"); } if ((new_ref = set_mset(ptr_mset_sentinel, mset_string, ptr_ref, ptr_ref_len, ns, ptr_indent, n_ref_format)) == NULL) { error = 801; break; } *ptr_ref = new_ref; if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "BOOKTITLE") == 0 && my_title_as_author != 2) { if ((new_ref_buffer = format_title(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, 2, n_intext, 0 /* not title as author */, ns, ptr_indent, n_ref_format)) == NULL) { error = 812; break; } if (ref_buffer[0]) { /* set mset only if we have some title contents */ if (!n_intext) { strcpy(mset_string, "book"); } else { strcpy(mset_string, "intext"); } if ((new_ref = set_mset(ptr_mset_sentinel, mset_string, ptr_ref, ptr_ref_len, ns, ptr_indent, n_ref_format)) == NULL) { error = 801; break; } *ptr_ref = new_ref; if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "SERIESTITLE") == 0 && my_title_as_author != 3) { if ((new_ref_buffer = format_title(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, 3, n_intext, 0 /* not title as author */, ns, ptr_indent, n_ref_format)) == NULL) { error = 813; break; } if (ref_buffer[0]) { /* set mset only if we have some title contents */ if (!n_intext) { strcpy(mset_string, "series"); } else { strcpy(mset_string, "intext"); } if ((new_ref = set_mset(ptr_mset_sentinel, mset_string, ptr_ref, ptr_ref_len, ns, ptr_indent, n_ref_format)) == NULL) { error = 801; break; } *ptr_ref = new_ref; if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "ALLTITLE") == 0) { /* if (!n_intext) { */ if ((new_ref_buffer = format_title(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, 4, n_intext, 0 /* not title as author */, ns, ptr_indent, n_ref_format)) == NULL) { error = 813; break; } ref_buffer = new_ref_buffer; if (ref_buffer[0]) { /* set mset only if we have some title contents */ strcpy(mset_string, "all"); /* does this make sense? */ if ((new_ref = set_mset(ptr_mset_sentinel, mset_string, ptr_ref, ptr_ref_len, ns, ptr_indent, n_ref_format)) == NULL) { error = 801; break; } *ptr_ref = new_ref; if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "JOURNALNAME") == 0 && my_title_as_author != 5) { /* printf("my_title_as_author went to %d\n", my_title_as_author); */ if (!n_intext) { strcpy(mset_string, "journal"); } else { strcpy(mset_string, "intext"); } if ((new_ref_buffer = set_mset(ptr_mset_sentinel, mset_string, &ref_buffer, &nref_buffer_len, ns, ptr_indent, n_ref_format)) == NULL) { error = 801; break; } ref_buffer = new_ref_buffer; if ((new_ref_buffer = format_journalname(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, database, n_intext, ns, ptr_indent, n_ref_format, 0 /* not title as author */)) == NULL) { error = 814; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "VOLUME") == 0) { if (!n_intext) { strcpy(mset_string, "article"); } else { strcpy(mset_string, "intext"); } if ((new_ref_buffer = set_mset(ptr_mset_sentinel, mset_string, &ref_buffer, &nref_buffer_len, ns, ptr_indent, n_ref_format)) == NULL) { error = 801; break; } ref_buffer = new_ref_buffer; if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_VOLUME, VOLUMEPRECEEDING, VOLUMEFOLLOWING, "volumenum", ns, ptr_indent, n_ref_format)) == NULL) { error = 815; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "ISSUE") == 0) { if (!n_intext) { strcpy(mset_string, "article"); } else { strcpy(mset_string, "intext"); } if ((new_ref_buffer = set_mset(ptr_mset_sentinel, mset_string, &ref_buffer, &nref_buffer_len, ns, ptr_indent, n_ref_format)) == NULL) { error = 801; break; } ref_buffer = new_ref_buffer; if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_ISSUE, ISSUEPRECEEDING, ISSUEFOLLOWING, "issuenum", ns, ptr_indent, n_ref_format)) == NULL) { error = 816; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "PAGES") == 0) { if (!n_intext) { if (strcmp(pubtype, "CHAP") == 0) { strcpy(mset_string, "chapter"); } else { strcpy(mset_string, "article"); } } else { strcpy(mset_string, "intext"); } if ((new_ref_buffer = set_mset(ptr_mset_sentinel, mset_string, &ref_buffer, &nref_buffer_len, ns, ptr_indent, n_ref_format)) == NULL) { error = 801; break; } ref_buffer = new_ref_buffer; if ((new_ref_buffer = format_pages(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, ns, ptr_indent, n_ref_format)) == NULL) { error = 817; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "PUBLISHER") == 0) { if (!n_intext) { if (strcmp(pubtype, "CHAP") == 0 || strcmp(pubtype, "BOOK") == 0) { strcpy(mset_string, "book"); } else { strcpy(mset_string, "journal"); } } else { strcpy(mset_string, "intext"); } if ((new_ref_buffer = set_mset(ptr_mset_sentinel, mset_string, &ref_buffer, &nref_buffer_len, ns, ptr_indent, n_ref_format)) == NULL) { error = 801; break; } ref_buffer = new_ref_buffer; if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_PUBLISHER, PUBLISHERPRECEEDING, PUBLISHERFOLLOWING, "publishername", ns, ptr_indent, n_ref_format)) == NULL) { error = 818; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "PUBPLACE") == 0) { if (!n_intext) { if (strcmp(pubtype, "CHAP") == 0 || strcmp(pubtype, "BOOK") == 0) { strcpy(mset_string, "book"); } else { strcpy(mset_string, "journal"); } } else { strcpy(mset_string, "intext"); } if ((new_ref_buffer = set_mset(ptr_mset_sentinel, mset_string, &ref_buffer, &nref_buffer_len, ns, ptr_indent, n_ref_format)) == NULL) { error = 801; break; } ref_buffer = new_ref_buffer; if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_CITY, PUBPLACEPRECEEDING, PUBPLACEFOLLOWING, "city", ns, ptr_indent, n_ref_format)) == NULL) { error = 819; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "SERIAL") == 0) { char elname[16]; if (!n_intext) { if (strcmp(pubtype, "CHAP") == 0 || strcmp(pubtype, "BOOK") == 0) { strcpy(mset_string, "book"); strcpy(elname, "isbn"); } else { strcpy(mset_string, "journal"); strcpy(elname, "issn"); } } else { strcpy(mset_string, "intext"); } if ((new_ref_buffer = set_mset(ptr_mset_sentinel, mset_string, &ref_buffer, &nref_buffer_len, ns, ptr_indent, n_ref_format)) == NULL) { error = 801; break; } ref_buffer = new_ref_buffer; if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_ISSN, SERIALPRECEEDING, SERIALFOLLOWING, elname, ns, ptr_indent, n_ref_format)) == NULL) { error = 820; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "ADDRESS") == 0) { if (!n_intext) { if (strcmp(pubtype, "CHAP") == 0 || strcmp(pubtype, "BOOK") == 0) { strcpy(mset_string, "book"); } else { strcpy(mset_string, "journal"); } } else { strcpy(mset_string, "intext"); } if ((new_ref_buffer = set_mset(ptr_mset_sentinel, mset_string, &ref_buffer, &nref_buffer_len, ns, ptr_indent, n_ref_format)) == NULL) { error = 801; break; } ref_buffer = new_ref_buffer; if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_ADDRESS, ADDRESSPRECEEDING, ADDRESSFOLLOWING, "address", ns, ptr_indent, n_ref_format)) == NULL) { error = 821; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strncmp(item_type, "USERDEF", 7) == 0) { if (!n_intext) { if (strcmp(pubtype, "CHAP") == 0 || strcmp(pubtype, "BOOK") == 0) { strcpy(mset_string, "book"); } else { strcpy(mset_string, "journal"); } } else { strcpy(mset_string, "intext"); } if ((new_ref_buffer = set_mset(ptr_mset_sentinel, mset_string, &ref_buffer, &nref_buffer_len, ns, ptr_indent, n_ref_format)) == NULL) { error = 801; break; } ref_buffer = new_ref_buffer; if (item_type[7] == '1') { if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_USER1, USERDEF1PRECEEDING, USERDEF1FOLLOWING, "userdef1", ns, ptr_indent, n_ref_format)) == NULL) { error = 823; break; } } else if (item_type[7] == '2') { if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_USER2, USERDEF2PRECEEDING, USERDEF2FOLLOWING, "userdef2", ns, ptr_indent, n_ref_format)) == NULL) { error = 824; break; } } else if (item_type[7] == '3') { if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_USER3, USERDEF3PRECEEDING, USERDEF3FOLLOWING, "userdef3", ns, ptr_indent, n_ref_format)) == NULL) { error = 825; break; } } else if (item_type[7] == '4') { if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_USER4, USERDEF4PRECEEDING, USERDEF4FOLLOWING, "userdef4", ns, ptr_indent, n_ref_format)) == NULL) { error = 826; break; } } else if (item_type[7] == '5') { if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_USER5, USERDEF5PRECEEDING, USERDEF5FOLLOWING, "userdef5", ns, ptr_indent, n_ref_format)) == NULL) { error = 827; break; } } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strncmp(item_type, "LINK", 4) == 0) { if (!n_intext) { if (strcmp(pubtype, "CHAP") == 0 || strcmp(pubtype, "BOOK") == 0) { strcpy(mset_string, "book"); } else { strcpy(mset_string, "journal"); } } else { strcpy(mset_string, "intext"); } if ((new_ref_buffer = set_mset(ptr_mset_sentinel, mset_string, &ref_buffer, &nref_buffer_len, ns, ptr_indent, n_ref_format)) == NULL) { error = 801; break; } ref_buffer = new_ref_buffer; if (item_type[4] == '0') { if ((new_ref_buffer = format_ulink(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, 0 /*LINK0*/, n_intext, LINK0PRECEEDING, LINK0FOLLOWING, ns, ptr_indent, n_ref_format, pdfroot)) == NULL) { error = 831; break; } } else if (item_type[4] == '1') { if ((new_ref_buffer = format_ulink(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, 1 /*LINK1*/, n_intext, LINK1PRECEEDING, LINK1FOLLOWING, ns, ptr_indent, n_ref_format, pdfroot)) == NULL) { error = 831; break; } } else if (item_type[4] == '2') { if ((new_ref_buffer = format_ulink(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, 2 /*LINK2*/, n_intext, LINK2PRECEEDING, LINK2FOLLOWING, ns, ptr_indent, n_ref_format, pdfroot)) == NULL) { error = 832; break; } } else if (item_type[4] == '3') { if ((new_ref_buffer = format_ulink(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, 3 /*LINK3*/, n_intext, LINK3PRECEEDING, LINK3FOLLOWING, ns, ptr_indent, n_ref_format, pdfroot)) == NULL) { error = 833; break; } } else if (item_type[4] == '4') { if ((new_ref_buffer = format_ulink(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, 4 /*LINK4*/, n_intext, LINK4PRECEEDING, LINK4FOLLOWING, ns, ptr_indent, n_ref_format, pdfroot)) == NULL) { error = 834; break; } } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "ABSTRACT") == 0) { if (!n_intext) { if (strcmp(pubtype, "CHAP") == 0 || strcmp(pubtype, "BOOK") == 0) { strcpy(mset_string, "book"); } else { strcpy(mset_string, "journal"); } } else { strcpy(mset_string, "intext"); } if ((new_ref_buffer = set_mset(ptr_mset_sentinel, mset_string, &ref_buffer, &nref_buffer_len, ns, ptr_indent, n_ref_format)) == NULL) { error = 801; break; } ref_buffer = new_ref_buffer; if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_ABSTRACT, ABSTRACTPRECEEDING, ABSTRACTFOLLOWING, "abstract", ns, ptr_indent, n_ref_format)) == NULL) { error = 835; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "TYPEOFWORK") == 0) { if (!n_intext) { if (strcmp(pubtype, "CHAP") == 0 || strcmp(pubtype, "BOOK") == 0) { strcpy(mset_string, "book"); } else { strcpy(mset_string, "journal"); } } else { strcpy(mset_string, "intext"); } if ((new_ref_buffer = set_mset(ptr_mset_sentinel, mset_string, &ref_buffer, &nref_buffer_len, ns, ptr_indent, n_ref_format)) == NULL) { error = 801; break; } ref_buffer = new_ref_buffer; if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_TYPEOFWORK, TYPEOFWORKPRECEEDING, TYPEOFWORKFOLLOWING, "typeofwork", ns, ptr_indent, n_ref_format)) == NULL) { error = 835; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "AREA") == 0) { if (!n_intext) { if (strcmp(pubtype, "CHAP") == 0 || strcmp(pubtype, "BOOK") == 0) { strcpy(mset_string, "book"); } else { strcpy(mset_string, "journal"); } } else { strcpy(mset_string, "intext"); } if ((new_ref_buffer = set_mset(ptr_mset_sentinel, mset_string, &ref_buffer, &nref_buffer_len, ns, ptr_indent, n_ref_format)) == NULL) { error = 801; break; } ref_buffer = new_ref_buffer; if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_AREA, AREAPRECEEDING, AREAFOLLOWING, "area", ns, ptr_indent, n_ref_format)) == NULL) { error = 835; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "OSTYPE") == 0) { if (!n_intext) { if (strcmp(pubtype, "CHAP") == 0 || strcmp(pubtype, "BOOK") == 0) { strcpy(mset_string, "book"); } else { strcpy(mset_string, "journal"); } } else { strcpy(mset_string, "intext"); } if ((new_ref_buffer = set_mset(ptr_mset_sentinel, mset_string, &ref_buffer, &nref_buffer_len, ns, ptr_indent, n_ref_format)) == NULL) { error = 801; break; } ref_buffer = new_ref_buffer; if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_OSTYPE, OSTYPEPRECEEDING, OSTYPEFOLLOWING, "ostype", ns, ptr_indent, n_ref_format)) == NULL) { error = 835; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "DEGREE") == 0) { if (!n_intext) { if (strcmp(pubtype, "CHAP") == 0 || strcmp(pubtype, "BOOK") == 0) { strcpy(mset_string, "book"); } else { strcpy(mset_string, "journal"); } } else { strcpy(mset_string, "intext"); } if ((new_ref_buffer = set_mset(ptr_mset_sentinel, mset_string, &ref_buffer, &nref_buffer_len, ns, ptr_indent, n_ref_format)) == NULL) { error = 801; break; } ref_buffer = new_ref_buffer; if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_DEGREE, DEGREEPRECEEDING, DEGREEFOLLOWING, "degree", ns, ptr_indent, n_ref_format)) == NULL) { error = 835; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "RUNNINGTIME") == 0) { if (!n_intext) { if (strcmp(pubtype, "CHAP") == 0 || strcmp(pubtype, "BOOK") == 0) { strcpy(mset_string, "book"); } else { strcpy(mset_string, "journal"); } } else { strcpy(mset_string, "intext"); } if ((new_ref_buffer = set_mset(ptr_mset_sentinel, mset_string, &ref_buffer, &nref_buffer_len, ns, ptr_indent, n_ref_format)) == NULL) { error = 801; break; } ref_buffer = new_ref_buffer; if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_RUNNINGTIME, RUNNINGTIMEPRECEEDING, RUNNINGTIMEFOLLOWING, "runningtime", ns, ptr_indent, n_ref_format)) == NULL) { error = 835; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "CLASSCODEINTL") == 0) { if (!n_intext) { if (strcmp(pubtype, "CHAP") == 0 || strcmp(pubtype, "BOOK") == 0) { strcpy(mset_string, "book"); } else { strcpy(mset_string, "journal"); } } else { strcpy(mset_string, "intext"); } if ((new_ref_buffer = set_mset(ptr_mset_sentinel, mset_string, &ref_buffer, &nref_buffer_len, ns, ptr_indent, n_ref_format)) == NULL) { error = 801; break; } ref_buffer = new_ref_buffer; if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_CLASSCODEINTL, CLASSCODEINTLPRECEEDING, CLASSCODEINTLFOLLOWING, "classcodeintl", ns, ptr_indent, n_ref_format)) == NULL) { error = 835; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "CLASSCODEUS") == 0) { if (!n_intext) { if (strcmp(pubtype, "CHAP") == 0 || strcmp(pubtype, "BOOK") == 0) { strcpy(mset_string, "book"); } else { strcpy(mset_string, "journal"); } } else { strcpy(mset_string, "intext"); } if ((new_ref_buffer = set_mset(ptr_mset_sentinel, mset_string, &ref_buffer, &nref_buffer_len, ns, ptr_indent, n_ref_format)) == NULL) { error = 801; break; } ref_buffer = new_ref_buffer; if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_CLASSCODEUS, CLASSCODEUSPRECEEDING, CLASSCODEUSFOLLOWING, "classcodeus", ns, ptr_indent, n_ref_format)) == NULL) { error = 835; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "SENDEREMAIL") == 0) { if (!n_intext) { if (strcmp(pubtype, "CHAP") == 0 || strcmp(pubtype, "BOOK") == 0) { strcpy(mset_string, "book"); } else { strcpy(mset_string, "journal"); } } else { strcpy(mset_string, "intext"); } if ((new_ref_buffer = set_mset(ptr_mset_sentinel, mset_string, &ref_buffer, &nref_buffer_len, ns, ptr_indent, n_ref_format)) == NULL) { error = 801; break; } ref_buffer = new_ref_buffer; if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_SENDEREMAIL, SENDEREMAILPRECEEDING, SENDEREMAILFOLLOWING, "senderemail", ns, ptr_indent, n_ref_format)) == NULL) { error = 835; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "RECIPIENTEMAIL") == 0) { if (!n_intext) { if (strcmp(pubtype, "CHAP") == 0 || strcmp(pubtype, "BOOK") == 0) { strcpy(mset_string, "book"); } else { strcpy(mset_string, "journal"); } } else { strcpy(mset_string, "intext"); } if ((new_ref_buffer = set_mset(ptr_mset_sentinel, mset_string, &ref_buffer, &nref_buffer_len, ns, ptr_indent, n_ref_format)) == NULL) { error = 801; break; } ref_buffer = new_ref_buffer; if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_RECIPIENTEMAIL, RECIPIENTEMAILPRECEEDING, RECIPIENTEMAILFOLLOWING, "recipientemail", ns, ptr_indent, n_ref_format)) == NULL) { error = 835; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "MEDIATYPE") == 0) { if (!n_intext) { if (strcmp(pubtype, "CHAP") == 0 || strcmp(pubtype, "BOOK") == 0) { strcpy(mset_string, "book"); } else { strcpy(mset_string, "journal"); } } else { strcpy(mset_string, "intext"); } if ((new_ref_buffer = set_mset(ptr_mset_sentinel, mset_string, &ref_buffer, &nref_buffer_len, ns, ptr_indent, n_ref_format)) == NULL) { error = 801; break; } ref_buffer = new_ref_buffer; if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_MEDIATYPE, MEDIATYPEPRECEEDING, MEDIATYPEFOLLOWING, "mediatype", ns, ptr_indent, n_ref_format)) == NULL) { error = 835; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "NUMVOLUMES") == 0) { if (!n_intext) { if (strcmp(pubtype, "CHAP") == 0 || strcmp(pubtype, "BOOK") == 0) { strcpy(mset_string, "book"); } else { strcpy(mset_string, "journal"); } } else { strcpy(mset_string, "intext"); } if ((new_ref_buffer = set_mset(ptr_mset_sentinel, mset_string, &ref_buffer, &nref_buffer_len, ns, ptr_indent, n_ref_format)) == NULL) { error = 801; break; } ref_buffer = new_ref_buffer; if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_NUMVOLUMES, NUMVOLUMESPRECEEDING, NUMVOLUMESFOLLOWING, "numvolumes", ns, ptr_indent, n_ref_format)) == NULL) { error = 835; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "EDITION") == 0) { if (!n_intext) { if (strcmp(pubtype, "CHAP") == 0 || strcmp(pubtype, "BOOK") == 0) { strcpy(mset_string, "book"); } else { strcpy(mset_string, "journal"); } } else { strcpy(mset_string, "intext"); } if ((new_ref_buffer = set_mset(ptr_mset_sentinel, mset_string, &ref_buffer, &nref_buffer_len, ns, ptr_indent, n_ref_format)) == NULL) { error = 801; break; } ref_buffer = new_ref_buffer; if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_EDITION, EDITIONPRECEEDING, EDITIONFOLLOWING, "edition", ns, ptr_indent, n_ref_format)) == NULL) { error = 835; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "COMPUTER") == 0) { if (!n_intext) { if (strcmp(pubtype, "CHAP") == 0 || strcmp(pubtype, "BOOK") == 0) { strcpy(mset_string, "book"); } else { strcpy(mset_string, "journal"); } } else { strcpy(mset_string, "intext"); } if ((new_ref_buffer = set_mset(ptr_mset_sentinel, mset_string, &ref_buffer, &nref_buffer_len, ns, ptr_indent, n_ref_format)) == NULL) { error = 801; break; } ref_buffer = new_ref_buffer; if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_COMPUTER, COMPUTERPRECEEDING, COMPUTERFOLLOWING, "computer", ns, ptr_indent, n_ref_format)) == NULL) { error = 835; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "CONFERENCELOCATION") == 0) { if (!n_intext) { if (strcmp(pubtype, "CHAP") == 0 || strcmp(pubtype, "BOOK") == 0) { strcpy(mset_string, "book"); } else { strcpy(mset_string, "journal"); } } else { strcpy(mset_string, "intext"); } if ((new_ref_buffer = set_mset(ptr_mset_sentinel, mset_string, &ref_buffer, &nref_buffer_len, ns, ptr_indent, n_ref_format)) == NULL) { error = 801; break; } ref_buffer = new_ref_buffer; if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_CONFERENCELOCATION, CONFERENCELOCATIONPRECEEDING, CONFERENCELOCATIONFOLLOWING, "conferencelocation", ns, ptr_indent, n_ref_format)) == NULL) { error = 835; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "REGISTRYNUM") == 0) { if (!n_intext) { if (strcmp(pubtype, "CHAP") == 0 || strcmp(pubtype, "BOOK") == 0) { strcpy(mset_string, "book"); } else { strcpy(mset_string, "journal"); } } else { strcpy(mset_string, "intext"); } if ((new_ref_buffer = set_mset(ptr_mset_sentinel, mset_string, &ref_buffer, &nref_buffer_len, ns, ptr_indent, n_ref_format)) == NULL) { error = 801; break; } ref_buffer = new_ref_buffer; if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_REGISTRYNUM, REGISTRYNUMPRECEEDING, REGISTRYNUMFOLLOWING, "registrynum", ns, ptr_indent, n_ref_format)) == NULL) { error = 835; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "CLASSIFICATION") == 0) { if (!n_intext) { if (strcmp(pubtype, "CHAP") == 0 || strcmp(pubtype, "BOOK") == 0) { strcpy(mset_string, "book"); } else { strcpy(mset_string, "journal"); } } else { strcpy(mset_string, "intext"); } if ((new_ref_buffer = set_mset(ptr_mset_sentinel, mset_string, &ref_buffer, &nref_buffer_len, ns, ptr_indent, n_ref_format)) == NULL) { error = 801; break; } ref_buffer = new_ref_buffer; if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_CLASSIFICATION, CLASSIFICATIONPRECEEDING, CLASSIFICATIONFOLLOWING, "classification", ns, ptr_indent, n_ref_format)) == NULL) { error = 835; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "SECTION") == 0) { if (!n_intext) { if (strcmp(pubtype, "CHAP") == 0 || strcmp(pubtype, "BOOK") == 0) { strcpy(mset_string, "book"); } else { strcpy(mset_string, "journal"); } } else { strcpy(mset_string, "intext"); } if ((new_ref_buffer = set_mset(ptr_mset_sentinel, mset_string, &ref_buffer, &nref_buffer_len, ns, ptr_indent, n_ref_format)) == NULL) { error = 801; break; } ref_buffer = new_ref_buffer; if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_SECTION, SECTIONPRECEEDING, SECTIONFOLLOWING, "section", ns, ptr_indent, n_ref_format)) == NULL) { error = 835; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "PAMPHLETNUM") == 0) { if (!n_intext) { if (strcmp(pubtype, "CHAP") == 0 || strcmp(pubtype, "BOOK") == 0) { strcpy(mset_string, "book"); } else { strcpy(mset_string, "journal"); } } else { strcpy(mset_string, "intext"); } if ((new_ref_buffer = set_mset(ptr_mset_sentinel, mset_string, &ref_buffer, &nref_buffer_len, ns, ptr_indent, n_ref_format)) == NULL) { error = 801; break; } ref_buffer = new_ref_buffer; if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_PAMPHLETNUM, PAMPHLETNUMPRECEEDING, PAMPHLETNUMFOLLOWING, "pamphletnum", ns, ptr_indent, n_ref_format)) == NULL) { error = 835; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "CHAPTERNUM") == 0) { if (!n_intext) { if (strcmp(pubtype, "CHAP") == 0 || strcmp(pubtype, "BOOK") == 0) { strcpy(mset_string, "book"); } else { strcpy(mset_string, "journal"); } } else { strcpy(mset_string, "intext"); } if ((new_ref_buffer = set_mset(ptr_mset_sentinel, mset_string, &ref_buffer, &nref_buffer_len, ns, ptr_indent, n_ref_format)) == NULL) { error = 801; break; } ref_buffer = new_ref_buffer; if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_CHAPTERNUM, CHAPTERNUMPRECEEDING, CHAPTERNUMFOLLOWING, "chapternum", ns, ptr_indent, n_ref_format)) == NULL) { error = 835; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "NOTES") == 0) { if (!n_intext) { if (strcmp(pubtype, "CHAP") == 0) { strcpy(mset_string, "chapter"); } else { strcpy(mset_string, "article"); } } else { strcpy(mset_string, "intext"); } if ((new_ref_buffer = set_mset(ptr_mset_sentinel, mset_string, &ref_buffer, &nref_buffer_len, ns, ptr_indent, n_ref_format)) == NULL) { error = 801; break; } ref_buffer = new_ref_buffer; if ((new_ref_buffer = format_notes(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, username, ns, ptr_indent, n_ref_format)) == NULL) { error = 836; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "SEPARATOR") == 0) { if ((new_ref_buffer = format_separator(ref_buffer, &nref_buffer_len, ptr_bibconns, n_separator_id, n_ref_format)) == NULL) { error = 837; break; } ref_buffer = new_ref_buffer; if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } } /* end while */ strcpy(mset_string, ""); if ((new_ref = set_mset(ptr_mset_sentinel, mset_string, ptr_ref, ptr_ref_len, ns, ptr_indent, n_ref_format)) == NULL) { error = 801; } *ptr_ref = new_ref; dbi_result_free(dbires_pos); unload_style(); free(sql_command); free(ref_buffer); return error; } refdb-1.0.2/src/backend-dbiba.c000755 001750 001750 00000520510 12255427651 017042 0ustar00markusmarkus000000 000000 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ backend-dbiba.c defines the DocBook V.3.1 bibliography output backend of refdbd (helper functions) markus@mhoenicka.de 2001-01-18 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ #include #include #include #include #include /* for isdigit() */ #include /* for MAX_INT */ #include "refdb.h" #include "backend.h" #include "xmlhelper.h" #include "strfncs.h" #include "linklist.h" #include "refdbd.h" #include "backend-dbib.h" #include "tokenize.h" #include "dbfncs.h" #include "risdb.h" #include "authorinfo.h" #include "connect.h" #include "mset.h" #include "backend-rtfbib.h" #include "rtfhelper.h" extern int n_log_level; extern char main_db[]; /* forward declarations of local functions */ static char* arabic_to_roman(char* roman, const char* arabic); static int format_authorname(char** ptr_ref, size_t* ptr_ref_len, struct AUTHOR_INFO* ptr_ainfo, const char* authorsep, const char* nameorder, const char* initialstyle, const char* author_upper, int nis_intext, int type, const char* ns, struct xmlindent* ptr_indent, int n_ref_format, int* ptr_trailing_dot); static char* format_day(char* ref, size_t* ptr_ref_len, const char* day, const char* dayformat, const char* pad); static char* format_firstmiddlename(char** ptr_ref, size_t* ptr_ref_len, struct AUTHOR_INFO* ptr_ainfo, const char* author_upper, const char* initialstyle, int nis_intext, int type, const char* ns, struct xmlindent* ptr_indent, int n_ref_format, int* ptr_trailing_dot); static char* format_lastname(char** ptr_ref, size_t* ptr_ref_len, char* lastname, const char* author_upper, int nis_intext, int type, const char* ns, struct xmlindent* ptr_indent, int* ptr_trailing_dot, int n_ref_format); static char* format_month(char* ref, size_t* ptr_ref_len, const char* month, const char* monthformat, const char* pad, dbi_result dbirescit); static char* format_year(char* ref, size_t* ptr_ref_len, unsigned short n_year, const char* yearformat, const char* pad, const char* unique_suffix); static char* normalize_pages(char* new_endpage, const char* startpage, const char* endpage, const char* format); /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ format_refnumber(): formats the refnumber part of a bibliography entry as a DocBook bibliomixed text char* format_refnumber returns ptr to the buffer if successful, NULL if failed char** ptr_ref ptr to a ptr to a buffer created with malloc which will receive the output. The calling function must allocate the buffer with at least 4096 byte. This function will reallocate the buffer as needed. *ptr will be updated whenever a realloc is necessary. The calling function is responsible for freeing the memory again. size_t* ptr_ref_len ptr to an int holding the current length of ref. Will be modified if ref is reallocated. struct BIBCONNS* ptr_bibconns ptr to structure with database connections dbi_result dbires ptr to a dbi result structure containing the current reference dbi_result dbires_ref ptr to a row containing the pubtype style int nref_counter number of current dataset in bibliography sequence int n_intext_subseq will not be used unless pubtype=INTEXT. Set to 1 to format the intext citation for subsequent citations of the same publication. Set to 0 to format the first citation const char* ns optional namespace prefix struct xmlindent* ptr_indent indentation information int n_ref_format requested output format: REFDOCBK, REFDOCBKX, REFTEIX ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* format_refnumber(char** ptr_ref, size_t* ptr_ref_len, struct BIBCONNS* ptr_bibconns, dbi_result dbires, dbi_result dbires_ref, int nref_counter, int n_intext_subseq, const char* ns, struct xmlindent* ptr_indent, int n_ref_format) { char* new_ref; char* item; char buffer[16]; /* dbi_conn conn; */ /* conn = dbi_result_get_conn(dbires_ref); */ if (n_ref_format == REFTEIX5) { if (print_elstart_x(ptr_ref, ptr_ref_len, "abbr", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0 /* not empty */, ptr_indent, ns) == NULL) { return NULL; } } else if (n_ref_format == REFRTF) { if (print_rtf_format(ptr_ref, ptr_ref_len, "REFNUMBER", dbires_ref, 1 /* start group */) == NULL) { return NULL; } } else { if (print_elstart_x(ptr_ref, ptr_ref_len, "abbrev", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0 /* not empty */, ptr_indent, ns) == NULL) { return NULL; } } /* get the result string in an allocated buffer */ item = my_dbi_result_get_string_copy_idx(dbires_ref, REFNUMBERPRECEEDING); if (item && *item && !my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { /* preceeding */ if (sgml_entitize(&item, n_ref_format) == NULL) { free(item); return NULL; } if ((new_ref = mstrcat(*ptr_ref, item, ptr_ref_len, 0)) == NULL) { free(item); return NULL; } else { *ptr_ref = new_ref; } } if (item) { free(item); } sprintf(buffer, "%d", nref_counter); if ((new_ref = mstrcat(*ptr_ref, buffer, ptr_ref_len, 0)) == NULL) { return NULL; } else { *ptr_ref = new_ref; } item = my_dbi_result_get_string_copy_idx(dbires_ref, REFNUMBERFOLLOWING); if (item && *item && !my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { /* following */ if (sgml_entitize(&item, n_ref_format) == NULL) { free(item); return NULL; } if ((new_ref = mstrcat(*ptr_ref, item, ptr_ref_len, 0)) == NULL) { free(item); return NULL; } else { *ptr_ref = new_ref; } } if (item) { free(item); } if (n_ref_format == REFTEIX5) { if (print_elend_x(ptr_ref, ptr_ref_len, "abbr", ptr_indent, ns) == NULL) { return NULL; } } else if (n_ref_format == REFRTF) { if (print_rtf_end_group(ptr_ref, ptr_ref_len) == NULL) { return NULL; } } else { if (print_elend_x(ptr_ref, ptr_ref_len, "abbrev", ptr_indent, ns) == NULL) { return NULL; } } return *ptr_ref; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ format_citekey(): formats the citekey part of a bibliography entry as a DocBook bibliomixed text char* format_citekey returns ptr to the buffer if successful, NULL if failed char** ptr_ref ptr to a ptr to a buffer created with malloc which will receive the output. The calling function must allocate the buffer with at least 4096 byte. This function will reallocate the buffer as needed. *ptr will be updated whenever a realloc is necessary. The calling function is responsible for freeing the memory again. size_t* ptr_ref_len ptr to an int holding the current length of ref. Will be modified if ref is reallocated. struct BIBCONNS* ptr_bibconns ptr to structure with database connections dbi_result dbires ptr to a dbi result structure containing the current reference dbi_result dbires_ref ptr to a row containing the pubtype style int n_intext_subseq will not be used unless pubtype=INTEXT. Set to 1 to format the intext citation for subsequent citations of the same publication. Set to 0 to format the first citation const char* ns optional namespace prefix struct xmlindent* ptr_indent indentation information int n_ref_format requested output format: REFDOCBK, REFDOCBKX, REFTEIX ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* format_citekey(char** ptr_ref, size_t* ptr_ref_len, struct BIBCONNS* ptr_bibconns, dbi_result dbires, dbi_result dbires_ref, int n_intext_subseq, const char* ns, struct xmlindent* ptr_indent, int n_ref_format) { char* new_ref; char* item; if (n_ref_format == REFTEIX5) { if (print_elstart_x(ptr_ref, ptr_ref_len, "abbr", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0 /* not empty */, ptr_indent, ns) == NULL) { return NULL; } } else if (n_ref_format == REFRTF) { if (print_rtf_format(ptr_ref, ptr_ref_len, "CITEKEY", dbires_ref, 1 /* start group */) == NULL) { return NULL; } } else { if (print_elstart_x(ptr_ref, ptr_ref_len, "abbrev", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0 /* not empty */, ptr_indent, ns) == NULL) { return NULL; } } /* get the result string in an allocated buffer */ item = my_dbi_result_get_string_copy_idx(dbires_ref, CITEKEYPRECEEDING); if (item && *item && !my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { /* preceeding */ if (sgml_entitize(&item, n_ref_format) == NULL) { free(item); return NULL; } if ((new_ref = mstrcat(*ptr_ref, item, ptr_ref_len, 0)) == NULL) { free(item); return NULL; } else { *ptr_ref = new_ref; } } if (item) { free(item); } /* get citation key */ item = my_dbi_result_get_string_copy_idx(dbires, REFDB_CITEKEY); if (item && *item && !my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { /* preceeding */ if (sgml_entitize(&item, n_ref_format) == NULL) { free(item); return NULL; } if ((new_ref = mstrcat(*ptr_ref, item, ptr_ref_len, 0)) == NULL) { free(item); return NULL; } else { *ptr_ref = new_ref; } } if (item) { free(item); } item = my_dbi_result_get_string_copy_idx(dbires_ref, CITEKEYFOLLOWING); if (item && *item && !my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { /* following */ if (sgml_entitize(&item, n_ref_format) == NULL) { free(item); return NULL; } if ((new_ref = mstrcat(*ptr_ref, item, ptr_ref_len, 0)) == NULL) { free(item); return NULL; } else { *ptr_ref = new_ref; } } if (item) { free(item); } if (n_ref_format == REFTEIX5) { if (print_elend_x(ptr_ref, ptr_ref_len, "abbr", ptr_indent, ns) == NULL) { return NULL; } } else if (n_ref_format == REFRTF) { if (print_rtf_end_group(ptr_ref, ptr_ref_len) == NULL) { return NULL; } } else { if (print_elend_x(ptr_ref, ptr_ref_len, "abbrev", ptr_indent, ns) == NULL) { return NULL; } } return *ptr_ref; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ format_authorlist(): formats the author/editor/seditorlist part of a bibliography entry as a DocBook bibliomixed text int format_authorlist returns 0 if successful, >0 if failed char** ptr_ref ptr to a ptr to a buffer created with malloc which will receive the output. This function will reallocate the buffer as needed. *ptr will be updated whenever a realloc is necessary. The calling function is responsible for freeing the memory again. size_t* ptr_ref_len ptr to an int holding the current length of ref. Will be modified if ref is reallocated. struct BIBCONNS* ptr_bibconns ptr to struct with dbi connections dbi_result dbires ptr to a dbi result structure containing the current reference. This may be NULL if the refdb_id is provided in the ptr_biblio_info structure dbi_result dbires_ref ptr to a dbi result structure containing the pubtype style int type 1=part authors, 2=publication authors, 3=series authors 4=first available const char* database ptr to string containing the database with the author data int n_intext 0 = bibliography citation; 1 = intext citation; 2 = intext citation subsequent struct bibinfo* ptr_biblio_info ptr to struct with additional bibliographic info short title_as_author if >0 the reference has no authors and the style expects the title to be printed instead 1=title, 2=booktitle const char* ns optional namespace prefix struct xmlindent* ptr_indent indentation information (XML only, use NULL otherwise) int n_ref_format requested output format: REFDOCBK, REFDOCBKX, REFTEIX, REFRTF ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int format_authorlist(char** ptr_ref, size_t* ptr_ref_len, struct BIBCONNS* ptr_bibconns, dbi_result dbires, dbi_result dbires_ref, int type, const char* database, int n_intext, struct bibinfo* ptr_biblio_info, short title_as_author, const char* ns, struct xmlindent* ptr_indent, int n_ref_format) { int num_authors; int nauthor_count = 0; int nauthor_max; int nauthor_display; int nhave_content = 0; int n_status; int n_have_editor = 0; int must_free_dbires = 0; int n_trailing_dot = 0; unsigned long long n_id; const char *authorsep; const char *nameorder; const char *initialstyle; const char *author_upper; const char *citem; const char *alternatetext = NULL; char *author_anonymous = NULL; char *author_preceeding = NULL; char *author_following = NULL; char *alist_preceeding = NULL; char *new_ref; char *item; char *item1; char *the_refdb_id; char id[32] = ""; struct AUTHOR_INFO ainfo; dbi_result dbires_author; enum refdb_col n_preceeding_index; enum refdb_col n_following_index; enum refdb_col n_abbreviate_first_index; enum refdb_col n_abbreviate_max_first_index; enum refdb_col n_abbreviate_display_first_index; enum refdb_col n_abbreviate_subseq_index; enum refdb_col n_abbreviate_max_subseq_index; enum refdb_col n_abbreviate_display_subseq_index; enum refdb_col n_authorempty_index; enum refdb_col n_alternatetext_index; enum refdb_col n_asame_index; enum refdb_col n_twoseps_index; enum refdb_col n_threesepseach_index; enum refdb_col n_threesepslast_index; enum refdb_col n_namefirstorder_index; enum refdb_col n_namefirstinitial_index; enum refdb_col n_namefirstupper_index; enum refdb_col n_nameotherorder_index; enum refdb_col n_nameotherinitial_index; enum refdb_col n_nameotherupper_index; enum refdb_col n_singlepreceeding_index; enum refdb_col n_singlefollowing_index; enum refdb_col n_multiplepreceeding_index; enum refdb_col n_multiplefollowing_index; enum refdb_col n_edsinglepreceeding_index; enum refdb_col n_edsinglefollowing_index; enum refdb_col n_edmultiplepreceeding_index; enum refdb_col n_edmultiplefollowing_index; enum refdb_col n_my_singlepreceeding_index; enum refdb_col n_my_singlefollowing_index; enum refdb_col n_my_multiplepreceeding_index; enum refdb_col n_my_multiplefollowing_index; /* printf("start format_authorlist(), type went to %d\n", type); */ /* map the database query result columns to index variables according to the type of authorlist */ if (type == 1) { /* part authors */ n_preceeding_index = AUTHORLISTPRECEEDING; n_following_index = AUTHORLISTFOLLOWING; n_abbreviate_first_index = AUTHORLISTABBREVIATEFIRST; n_abbreviate_max_first_index = AUTHORLISTABBREVIATEFIRSTMAXAUTHOR; n_abbreviate_display_first_index = AUTHORLISTABBREVIATEFIRSTDISPLAYAUTHOR; n_abbreviate_subseq_index = AUTHORLISTABBREVIATESUBSEQ; n_abbreviate_max_subseq_index = AUTHORLISTABBREVIATESUBSEQMAXAUTHOR; n_abbreviate_display_subseq_index = AUTHORLISTABBREVIATESUBSEQDISPLAYAUTHOR; n_authorempty_index = AUTHORLISTAEMPTY; n_alternatetext_index = AUTHORLISTALTERNATETEXT; n_asame_index = AUTHORLISTASAME; n_twoseps_index = AUTHORLISTAUTHORSEPSTWOSEPS; n_threesepseach_index = AUTHORLISTAUTHORSEPSTHREESEPSTHREESEPSEACH; n_threesepslast_index = AUTHORLISTAUTHORSEPSTHREESEPSTHREESEPSLAST; n_namefirstorder_index = AUTHORLISTAUTHORNAMESNAMEFIRSTNAMEORDER; n_namefirstinitial_index = AUTHORLISTAUTHORNAMESNAMEFIRSTINITIALSTYLE; n_namefirstupper_index = AUTHORLISTAUTHORNAMESNAMEFIRSTUPPERCASE; n_nameotherorder_index = AUTHORLISTAUTHORNAMESNAMEOTHERNAMEORDER; n_nameotherinitial_index = AUTHORLISTAUTHORNAMESNAMEOTHERINITIALSTYLE; n_nameotherupper_index = AUTHORLISTAUTHORNAMESNAMEOTHERUPPERCASE; n_singlepreceeding_index = AUTHORLISTTEXTTEXTSINGLEPRECEEDING; n_singlefollowing_index = AUTHORLISTTEXTTEXTSINGLEFOLLOWING; n_multiplepreceeding_index = AUTHORLISTTEXTTEXTMULTIPLEPRECEEDING; n_multiplefollowing_index = AUTHORLISTTEXTTEXTMULTIPLEFOLLOWING; n_edsinglepreceeding_index = AUTHORLISTTEXTEDTEXTSINGLEPRECEEDING; n_edsinglefollowing_index = AUTHORLISTTEXTEDTEXTSINGLEFOLLOWING; n_edmultiplepreceeding_index = AUTHORLISTTEXTEDTEXTMULTIPLEPRECEEDING; n_edmultiplefollowing_index = AUTHORLISTTEXTEDTEXTMULTIPLEFOLLOWING; } else if (type == 2) { /* publication authors */ n_preceeding_index = EDITORLISTPRECEEDING; n_following_index = EDITORLISTFOLLOWING; n_abbreviate_first_index = EDITORLISTABBREVIATEFIRST; n_abbreviate_max_first_index = EDITORLISTABBREVIATEFIRSTMAXAUTHOR; n_abbreviate_display_first_index = EDITORLISTABBREVIATEFIRSTDISPLAYAUTHOR; n_abbreviate_subseq_index = EDITORLISTABBREVIATESUBSEQ; n_abbreviate_max_subseq_index = EDITORLISTABBREVIATESUBSEQMAXAUTHOR; n_abbreviate_display_subseq_index = EDITORLISTABBREVIATESUBSEQDISPLAYAUTHOR; n_authorempty_index = EDITORLISTAEMPTY; n_alternatetext_index = EDITORLISTALTERNATETEXT; n_asame_index = EDITORLISTASAME; n_twoseps_index = EDITORLISTAUTHORSEPSTWOSEPS; n_threesepseach_index = EDITORLISTAUTHORSEPSTHREESEPSTHREESEPSEACH; n_threesepslast_index = EDITORLISTAUTHORSEPSTHREESEPSTHREESEPSLAST; n_namefirstorder_index = EDITORLISTAUTHORNAMESNAMEFIRSTNAMEORDER; n_namefirstinitial_index = EDITORLISTAUTHORNAMESNAMEFIRSTINITIALSTYLE; n_namefirstupper_index = EDITORLISTAUTHORNAMESNAMEFIRSTUPPERCASE; n_nameotherorder_index = EDITORLISTAUTHORNAMESNAMEOTHERNAMEORDER; n_nameotherinitial_index = EDITORLISTAUTHORNAMESNAMEOTHERINITIALSTYLE; n_nameotherupper_index = EDITORLISTAUTHORNAMESNAMEOTHERUPPERCASE; n_singlepreceeding_index = EDITORLISTTEXTTEXTSINGLEPRECEEDING; n_singlefollowing_index = EDITORLISTTEXTTEXTSINGLEFOLLOWING; n_multiplepreceeding_index = EDITORLISTTEXTTEXTMULTIPLEPRECEEDING; n_multiplefollowing_index = EDITORLISTTEXTTEXTMULTIPLEFOLLOWING; n_edsinglepreceeding_index = EDITORLISTTEXTEDTEXTSINGLEPRECEEDING; n_edsinglefollowing_index = EDITORLISTTEXTEDTEXTSINGLEFOLLOWING; n_edmultiplepreceeding_index = EDITORLISTTEXTEDTEXTMULTIPLEPRECEEDING; n_edmultiplefollowing_index = EDITORLISTTEXTEDTEXTMULTIPLEFOLLOWING; } else if (type == 3) { /* series authors */ n_preceeding_index = SEDITORLISTPRECEEDING; n_following_index = SEDITORLISTFOLLOWING; n_abbreviate_first_index = SEDITORLISTABBREVIATEFIRST; n_abbreviate_max_first_index = SEDITORLISTABBREVIATEFIRSTMAXAUTHOR; n_abbreviate_display_first_index = SEDITORLISTABBREVIATEFIRSTDISPLAYAUTHOR; n_abbreviate_subseq_index = SEDITORLISTABBREVIATESUBSEQ; n_abbreviate_max_subseq_index = SEDITORLISTABBREVIATESUBSEQMAXAUTHOR; n_abbreviate_display_subseq_index = SEDITORLISTABBREVIATESUBSEQDISPLAYAUTHOR; n_authorempty_index = SEDITORLISTAEMPTY; n_alternatetext_index = SEDITORLISTALTERNATETEXT; n_asame_index = SEDITORLISTASAME; n_twoseps_index = SEDITORLISTAUTHORSEPSTWOSEPS; n_threesepseach_index = SEDITORLISTAUTHORSEPSTHREESEPSTHREESEPSEACH; n_threesepslast_index = SEDITORLISTAUTHORSEPSTHREESEPSTHREESEPSLAST; n_namefirstorder_index = SEDITORLISTAUTHORNAMESNAMEFIRSTNAMEORDER; n_namefirstinitial_index = SEDITORLISTAUTHORNAMESNAMEFIRSTINITIALSTYLE; n_namefirstupper_index = SEDITORLISTAUTHORNAMESNAMEFIRSTUPPERCASE; n_nameotherorder_index = SEDITORLISTAUTHORNAMESNAMEOTHERNAMEORDER; n_nameotherinitial_index = SEDITORLISTAUTHORNAMESNAMEOTHERINITIALSTYLE; n_nameotherupper_index = SEDITORLISTAUTHORNAMESNAMEOTHERUPPERCASE; n_singlepreceeding_index = SEDITORLISTTEXTTEXTSINGLEPRECEEDING; n_singlefollowing_index = SEDITORLISTTEXTTEXTSINGLEFOLLOWING; n_multiplepreceeding_index = SEDITORLISTTEXTTEXTMULTIPLEPRECEEDING; n_multiplefollowing_index = SEDITORLISTTEXTTEXTMULTIPLEFOLLOWING; n_edsinglepreceeding_index = SEDITORLISTTEXTEDTEXTSINGLEPRECEEDING; n_edsinglefollowing_index = SEDITORLISTTEXTEDTEXTSINGLEFOLLOWING; n_edmultiplepreceeding_index = SEDITORLISTTEXTEDTEXTMULTIPLEPRECEEDING; n_edmultiplefollowing_index = SEDITORLISTTEXTEDTEXTMULTIPLEFOLLOWING; } else { /* allalist */ n_preceeding_index = ALLALISTPRECEEDING; n_following_index = ALLALISTFOLLOWING; n_abbreviate_first_index = ALLALISTABBREVIATEFIRST; n_abbreviate_max_first_index = ALLALISTABBREVIATEFIRSTMAXAUTHOR; n_abbreviate_display_first_index = ALLALISTABBREVIATEFIRSTDISPLAYAUTHOR; n_abbreviate_subseq_index = ALLALISTABBREVIATESUBSEQ; n_abbreviate_max_subseq_index = ALLALISTABBREVIATESUBSEQMAXAUTHOR; n_abbreviate_display_subseq_index = ALLALISTABBREVIATESUBSEQDISPLAYAUTHOR; n_authorempty_index = ALLALISTAEMPTY; n_alternatetext_index = ALLALISTALTERNATETEXT; n_asame_index = ALLALISTASAME; n_twoseps_index = ALLALISTAUTHORSEPSTWOSEPS; n_threesepseach_index = ALLALISTAUTHORSEPSTHREESEPSTHREESEPSEACH; n_threesepslast_index = ALLALISTAUTHORSEPSTHREESEPSTHREESEPSLAST; n_namefirstorder_index = ALLALISTAUTHORNAMESNAMEFIRSTNAMEORDER; n_namefirstinitial_index = ALLALISTAUTHORNAMESNAMEFIRSTINITIALSTYLE; n_namefirstupper_index = ALLALISTAUTHORNAMESNAMEFIRSTUPPERCASE; n_nameotherorder_index = ALLALISTAUTHORNAMESNAMEOTHERNAMEORDER; n_nameotherinitial_index = ALLALISTAUTHORNAMESNAMEOTHERINITIALSTYLE; n_nameotherupper_index = ALLALISTAUTHORNAMESNAMEOTHERUPPERCASE; n_singlepreceeding_index = ALLALISTTEXTTEXTSINGLEPRECEEDING; n_singlefollowing_index = ALLALISTTEXTTEXTSINGLEFOLLOWING; n_multiplepreceeding_index = ALLALISTTEXTTEXTMULTIPLEPRECEEDING; n_multiplefollowing_index = ALLALISTTEXTTEXTMULTIPLEFOLLOWING; n_edsinglepreceeding_index = ALLALISTTEXTEDTEXTSINGLEPRECEEDING; n_edsinglefollowing_index = ALLALISTTEXTEDTEXTSINGLEFOLLOWING; n_edmultiplepreceeding_index = ALLALISTTEXTEDTEXTMULTIPLEPRECEEDING; n_edmultiplefollowing_index = ALLALISTTEXTEDTEXTMULTIPLEFOLLOWING; } /* initialize struct */ *(ainfo.name) = '\0'; *(ainfo.lastname) = '\0'; *(ainfo.firstname) = '\0'; *(ainfo.middlename) = '\0'; *(ainfo.suffix) = '\0'; /* ToDo: fix the n_id/id/the_refdb_id/whatever kludge */ if (dbires) { n_id = my_dbi_result_get_idval(dbires, "refdb_id"); if (!n_id) { return 244; } sprintf(id, ULLSPEC, (unsigned long long)n_id); the_refdb_id = id; } else { sprintf(id, ULLSPEC, (unsigned long long)(ptr_biblio_info->n_refdb_id)); the_refdb_id = id; n_id = ptr_biblio_info->n_refdb_id; } /* conn = dbi_result_get_conn(dbires_ref); */ if ((!n_intext && ptr_biblio_info->is_subseq) || (n_intext == 2)) { citem = dbi_result_get_string_idx(dbires_ref, n_abbreviate_max_subseq_index); if (citem && *citem && !my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { nauthor_max = atoi((char*)citem); nauthor_max = (nauthor_max < 1) ? 1 : nauthor_max; } else { nauthor_max = INT_MAX; } citem = dbi_result_get_string_idx(dbires_ref, n_abbreviate_display_subseq_index); if (citem && *citem && !my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { nauthor_display = atoi((char*)citem); nauthor_display = (nauthor_display < 1) ? 1 : nauthor_display; } else { nauthor_display = INT_MAX; } } else { citem = dbi_result_get_string_idx(dbires_ref, n_abbreviate_max_first_index); if (citem && *citem && !my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { nauthor_max = atoi((char*)citem); nauthor_max = (nauthor_max < 1) ? 1 : nauthor_max; } else { nauthor_max = INT_MAX; } citem = dbi_result_get_string_idx(dbires_ref, n_abbreviate_display_first_index); if (citem && *citem && !my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { nauthor_display = atoi((char*)citem); nauthor_display = (nauthor_display < 1) ? 1 : nauthor_display; } else { nauthor_display = INT_MAX; } } /* check for subsequent reference of same author(s) */ if ((!n_intext && ptr_biblio_info->is_subseq) || (n_intext == 2)) { item = my_dbi_result_get_string_copy_idx(dbires_ref, n_asame_index); if (item && !*item && !my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { free(item); return 0; /* ASAME is empty string -> suppress authorlist */ } else if (item) { item1 = my_dbi_result_get_string_copy_idx(dbires_ref, n_preceeding_index); if (item1 && *item1 && !my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { /* preceeding */ if (sgml_entitize(&item1, n_ref_format) == NULL) { free(item); free(item1); return 801; } if ((new_ref = mstrcat(*ptr_ref, item1, ptr_ref_len, 0)) == NULL) { free(item1); free(item); return 801; } else { *ptr_ref = new_ref; } } if (item1) { /* found, but empty */ free(item1); } item1 = my_dbi_result_get_string_copy_idx(dbires_ref, n_singlepreceeding_index); if (item1 && *item1 && !my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { /* textpreceeding */ if (sgml_entitize(&item1, n_ref_format) == NULL) { free(item1); free(item); return 801; } if ((new_ref = mstrcat(*ptr_ref, item1, ptr_ref_len, 0)) == NULL) { free(item1); free(item); return 801; } else { *ptr_ref = new_ref; } } if (item1) { /* found but empty */ free(item1); } /* item contains asame */ if (sgml_entitize(&item, n_ref_format) == NULL) { free(item); return 801; } if ((new_ref = mstrcat(*ptr_ref, item, ptr_ref_len, 0)) == NULL) { free(item); return 801; } else { *ptr_ref = new_ref; } free(item); nhave_content = 1; /* reuse item */ item = my_dbi_result_get_string_copy_idx(dbires_ref, n_following_index); if (item && *item && !my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { /* following */ if (sgml_entitize(&item, n_ref_format) == NULL) { free(item); return 801; } if ((new_ref = mstrcat(*ptr_ref, item, ptr_ref_len, 0)) == NULL) { free(item); return 801; } else { *ptr_ref = new_ref; } } if (item) { free(item); } return 0; } /* else: ASAME undefined, process authorlist as usual */ } /* end if is_subseq */ if ((dbires_author = request_authors(ptr_bibconns->conn_source, type, NULL /* all roles */, database, 0, n_id)) != NULL) { while (get_author_parts(dbires_author, &ainfo) != NULL) { if (!strcmp(ainfo.role, "editor")) { n_have_editor++; } } dbi_result_free(dbires_author); } if (n_have_editor) { n_my_singlepreceeding_index = n_edsinglepreceeding_index; n_my_singlefollowing_index = n_edsinglefollowing_index; n_my_multiplepreceeding_index = n_edmultiplepreceeding_index; n_my_multiplefollowing_index = n_edmultiplefollowing_index; } else { n_my_singlepreceeding_index = n_singlepreceeding_index; n_my_singlefollowing_index = n_singlefollowing_index; n_my_multiplepreceeding_index = n_multiplepreceeding_index; n_my_multiplefollowing_index = n_multiplefollowing_index; } alist_preceeding = my_dbi_result_get_string_copy_idx(dbires_ref, n_preceeding_index); if (alist_preceeding && *alist_preceeding && !my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { /* preceeding */ if (sgml_entitize(&alist_preceeding, n_ref_format) == NULL) { free(alist_preceeding); return 801; } /* this will be used later only if we insert some author data */ } /* todo: check whether authors have a role attribute of editor, set preceeding and following indexes appropriately */ if ((dbires_author = request_authors(ptr_bibconns->conn_source, type, NULL /* all roles */, database, 0, n_id)) != NULL) { /* depending on the total number of authors we need different preceedings and followings */ num_authors = dbi_result_get_numrows(dbires_author); /* fprintf(stderr, "num_authors went to %d<<\n", num_authors); */ if (num_authors > 1) { author_preceeding = my_dbi_result_get_string_copy_idx(dbires_ref, n_my_multiplepreceeding_index); if (author_preceeding && my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { free(author_preceeding); author_preceeding = NULL; } author_following = my_dbi_result_get_string_copy_idx(dbires_ref, n_my_multiplefollowing_index); if (author_following && my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { free(author_following); author_following = NULL; } } else if (num_authors == 0) { char sql_command[1024]; alternatetext = my_dbi_result_get_string_idx(dbires_ref, n_alternatetext_index); if (alternatetext && my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { alternatetext = NULL; } /* printf("alternatetext went to %s<<\n", alternatetext); */ /* if (title_as_author) { */ if (alternatetext && strcmp(alternatetext, "AEMPTY")) { /* use title here if style requires it */ /* todo: use alternatetext here */ if (!dbires) { /* when asking only for the authorlist, we don't have a result with the contents of t_refdb */ sprintf(sql_command, "SELECT refdb_id, refdb_type, refdb_pubyear, refdb_startpage, refdb_endpage, refdb_abstract, refdb_title, refdb_volume, refdb_issue, refdb_booktitle, refdb_city, refdb_publisher, refdb_title_series, refdb_address, refdb_issn, refdb_periodical_id, refdb_pyother_info, refdb_secyear, refdb_secother_info, refdb_user1, refdb_user2, refdb_user3, refdb_user4, refdb_user5, refdb_typeofwork, refdb_area, refdb_ostype, refdb_degree, refdb_runningtime, refdb_classcodeintl, refdb_classcodeus, refdb_senderemail, refdb_recipientemail, refdb_mediatype, refdb_numvolumes, refdb_edition, refdb_computer, refdb_conferencelocation, refdb_registrynum, refdb_classification, refdb_section, refdb_pamphletnum, refdb_chapternum, refdb_citekey FROM t_refdb WHERE refdb_id="ULLSPEC, (unsigned long long)n_id); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(ptr_bibconns->conn_source, sql_command); if (!dbires || dbi_result_next_row(dbires) == 0) { /* todo: exit gracefully */ LOG_PRINT(LOG_WARNING, "retrieve title instead of author failed"); } must_free_dbires++; } if (dbires) { const char* reftype; reftype = my_dbi_result_get_string_idx(dbires, REFDB_TYPE); /* returns 0 if type==NULL */ if (has_part_data(reftype)) { title_as_author = 1; } else { title_as_author = 2; } } else { title_as_author = 0; } } else { /* use AEMPTY instead of title */ author_anonymous = my_dbi_result_get_string_copy_idx(dbires_ref, n_authorempty_index); if (author_anonymous && *author_anonymous && !my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { if (sgml_entitize(&author_anonymous, n_ref_format) == NULL) { free(author_anonymous); free(alist_preceeding); clean_request(dbires_author); return 801; } author_preceeding = my_dbi_result_get_string_copy_idx(dbires_ref, n_my_singlepreceeding_index); if (author_preceeding && my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { free(author_preceeding); author_preceeding = NULL; } author_following = my_dbi_result_get_string_copy_idx(dbires_ref, n_my_singlefollowing_index); if (author_following && my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { free(author_following); author_following = NULL; } } else { /* no authors, go home */ if (author_anonymous) { free(author_anonymous); } clean_request(dbires_author); if (alist_preceeding) { free(alist_preceeding); } return 0; } } /* end if title as author */ } else { /* num_authors == 1 */ author_preceeding = my_dbi_result_get_string_copy_idx(dbires_ref, n_my_singlepreceeding_index); if (author_preceeding && my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { free(author_preceeding); author_preceeding = NULL; } author_following = my_dbi_result_get_string_copy_idx(dbires_ref, n_my_singlefollowing_index); if (author_following && my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { free(author_following); author_following = NULL; } } /* list preceeding */ if (alist_preceeding && *alist_preceeding) { /* preceeding */ if ((new_ref = mstrcat(*ptr_ref, alist_preceeding, ptr_ref_len, 0)) == NULL) { free(alist_preceeding); if (author_anonymous) { free(author_anonymous); } if (author_following) { free(author_following); } clean_request(dbires_author); return 801; } else { *ptr_ref = new_ref; } } if (alist_preceeding) { free(alist_preceeding); } /* text preceeding */ if (author_preceeding && *author_preceeding) { /* preceeding */ if (sgml_entitize(&author_preceeding, n_ref_format) == NULL) { free(author_preceeding); if (author_anonymous) { free(author_anonymous); } if (author_following) { free(author_following); } clean_request(dbires_author); return 801; } if ((new_ref = mstrcat(*ptr_ref, author_preceeding, ptr_ref_len, 0)) == NULL) { free(author_preceeding); if (author_following) { free(author_following); } clean_request(dbires_author); return 801; } else { *ptr_ref = new_ref; } } if (author_preceeding) { free(author_preceeding); } if (author_anonymous) { strncpy(ainfo.name, author_anonymous, 255); ainfo.name[255] = '\0'; nhave_content = 1; authorsep = NULL; nameorder = dbi_result_get_string_idx(dbires_ref, n_namefirstorder_index); initialstyle = dbi_result_get_string_idx(dbires_ref, n_namefirstinitial_index); author_upper = dbi_result_get_string_idx(dbires_ref, n_namefirstupper_index); if ((n_status = format_authorname(ptr_ref, ptr_ref_len, &ainfo, authorsep, nameorder, initialstyle, author_upper, n_intext, type, ns, ptr_indent, n_ref_format, &n_trailing_dot)) != 0) { clean_request(dbires_author); free(author_anonymous); if (author_following) { free(author_following); } return n_status; } free(author_anonymous); } else if (title_as_author) { /* todo: kosherize output of format_title under these conditions */ if (n_ref_format == REFTEIX5) { if (print_elstart_x(ptr_ref, ptr_ref_len, "persName", "type", "author", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0 /* not empty */, ptr_indent, ns) == NULL) { return 801; } } else if (n_ref_format == REFRTF) { if (title_as_author == 1) { if (print_rtf_format(ptr_ref, ptr_ref_len, "AUTHORLISTALTERNATE", dbires_ref, 1 /* start group */) == NULL) { return 801; } } else { if (print_rtf_format(ptr_ref, ptr_ref_len, "EDITORLISTALTERNATE", dbires_ref, 1 /* start group */) == NULL) { return 801; } } } else { if (print_elstart_x(ptr_ref, ptr_ref_len, "bibliomset", "relation", "author", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0 /* not empty */, ptr_indent, ns) == NULL) { return 801; } } /* todo: distinguish between title and periodical name */ if (!strcmp(alternatetext, "JOURNALNAME")) { if ((new_ref = format_journalname(ptr_ref, ptr_ref_len, ptr_bibconns, dbires, dbires_ref, database, n_intext, ns, ptr_indent, n_ref_format, 1 /* title_as_author */)) == NULL) { free(alist_preceeding); clean_request(dbires_author); return 801; } else { *ptr_ref = new_ref; } } else { if ((new_ref = format_title(ptr_ref, ptr_ref_len, ptr_bibconns, dbires, dbires_ref, title_as_author, n_intext, 1 /* title as author */, ns, ptr_indent, n_ref_format)) == NULL) { free(alist_preceeding); clean_request(dbires_author); return 801; } else { *ptr_ref = new_ref; } } if (n_ref_format == REFTEIX5) { if (print_elend_x(ptr_ref, ptr_ref_len, "persName", ptr_indent, ns) == NULL) { return 801; } } else if (n_ref_format == REFRTF) { if (print_rtf_end_group(ptr_ref, ptr_ref_len) == NULL) { return 801; } } else { if (print_elend_x(ptr_ref, ptr_ref_len, "bibliomset", ptr_indent, ns) == NULL) { return 801; } } nhave_content = 1; if (must_free_dbires) { dbi_result_free(dbires); } } else { /* regular author/editor */ while (get_author_parts(dbires_author, &ainfo) != NULL) { /* increment counter, so first author will be 1 */ nauthor_count++; nhave_content = 1; /* we may need different formats for the first, the last, and the inbetween authors */ if (nauthor_count == 1) { authorsep = NULL; nameorder = dbi_result_get_string_idx(dbires_ref, n_namefirstorder_index); initialstyle = dbi_result_get_string_idx(dbires_ref, n_namefirstinitial_index); author_upper = dbi_result_get_string_idx(dbires_ref, n_namefirstupper_index); } else if (nauthor_count == num_authors) { if (num_authors > 2) { authorsep = my_dbi_result_get_string_idx(dbires_ref, n_threesepslast_index); } else { authorsep = my_dbi_result_get_string_idx(dbires_ref, n_twoseps_index); } nameorder = dbi_result_get_string_idx(dbires_ref, n_nameotherorder_index); initialstyle = dbi_result_get_string_idx(dbires_ref, n_nameotherinitial_index); author_upper = dbi_result_get_string_idx(dbires_ref, n_nameotherupper_index); } else { authorsep = my_dbi_result_get_string_idx(dbires_ref, n_threesepseach_index); nameorder = dbi_result_get_string_idx(dbires_ref, n_nameotherorder_index); initialstyle = dbi_result_get_string_idx(dbires_ref, n_nameotherinitial_index); author_upper = dbi_result_get_string_idx(dbires_ref, n_nameotherupper_index); } /* if we don't want to display all authors, we'll display something like 'et.al' instead and exit the loop */ if (nauthor_count > nauthor_display && num_authors > nauthor_max) { if ((!n_intext && ptr_biblio_info->is_subseq) || (n_intext == 2)) { new_ref = *ptr_ref; item = my_dbi_result_get_string_copy_idx(dbires_ref, n_abbreviate_subseq_index); if (item && *item && !my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { if (n_ref_format == REFTEIX5) { if (print_elstart_x(ptr_ref, ptr_ref_len, "seg", "type", "etal", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0 /* not empty */, ptr_indent, ns) == NULL) { clean_request(dbires_author); free(item); if (author_following) { free(author_following); } return 801; } } else if (n_ref_format == REFRTF) { if (type == 1) { if (print_rtf_format(ptr_ref, ptr_ref_len, "AUTHORLIST", dbires_ref, 1 /* start group */) == NULL) { return 801; } } else if (type == 2) { if (print_rtf_format(ptr_ref, ptr_ref_len, "EDITORLIST", dbires_ref, 1 /* start group */) == NULL) { return 801; } } else if (type == 3) { if (print_rtf_format(ptr_ref, ptr_ref_len, "SEDITORLIST", dbires_ref, 1 /* start group */) == NULL) { return 801; } } else { if (print_rtf_format(ptr_ref, ptr_ref_len, "ALLALIST", dbires_ref, 1 /* start group */) == NULL) { return 801; } } } else { if (print_elstart_x(ptr_ref, ptr_ref_len, "bibliomset", "relation", "etal", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0 /* not empty */, ptr_indent, ns) == NULL) { clean_request(dbires_author); free(item); if (author_following) { free(author_following); } return 801; } } if (sgml_entitize(&item, n_ref_format) == NULL) { clean_request(dbires_author); free(item); if (author_following) { free(author_following); } return 801; } if ((new_ref = mstrcat(*ptr_ref, item, ptr_ref_len, 0)) == NULL) { clean_request(dbires_author); free(item); if (author_following) { free(author_following); } return 801; } else { *ptr_ref = new_ref; } if (n_ref_format == REFTEIX5) { if (print_elend_x(ptr_ref, ptr_ref_len, "seg", ptr_indent, ns) == NULL) { clean_request(dbires_author); if (author_following) { free(author_following); } free(item); return 801; } } else if (n_ref_format == REFRTF) { if (print_rtf_end_group(ptr_ref, ptr_ref_len) == NULL) { return 801; } } else { if (print_elend_x(ptr_ref, ptr_ref_len, "bibliomset", ptr_indent, ns) == NULL) { clean_request(dbires_author); if (author_following) { free(author_following); } free(item); return 801; } } } if (item) { free(item); } } else { /* not subseq */ new_ref = *ptr_ref; item = my_dbi_result_get_string_copy_idx(dbires_ref, n_abbreviate_first_index); if (item && *item && !my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { if (n_ref_format == REFTEIX5) { if (print_elstart_x(ptr_ref, ptr_ref_len, "seg", "type", "etal", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0 /* not empty */, ptr_indent, ns) == NULL) { clean_request(dbires_author); free(item); if (author_following) { free(author_following); } return 801; } } else if (n_ref_format == REFRTF) { if (type == 1) { if (print_rtf_format(ptr_ref, ptr_ref_len, "AUTHORLIST", dbires_ref, 1 /* start group */) == NULL) { return 801; } } else if (type == 2) { if (print_rtf_format(ptr_ref, ptr_ref_len, "EDITORLIST", dbires_ref, 1 /* start group */) == NULL) { return 801; } } else if (type == 3) { if (print_rtf_format(ptr_ref, ptr_ref_len, "SEDITORLIST", dbires_ref, 1 /* start group */) == NULL) { return 801; } } else { if (print_rtf_format(ptr_ref, ptr_ref_len, "ALLALIST", dbires_ref, 1 /* start group */) == NULL) { return 801; } } } else { if (print_elstart_x(ptr_ref, ptr_ref_len, "bibliomset", "relation", "etal", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0 /* not empty */, ptr_indent, ns) == NULL) { clean_request(dbires_author); free(item); if (author_following) { free(author_following); } return 801; } } if (sgml_entitize(&item, n_ref_format) == NULL) { clean_request(dbires_author); free(item); if (author_following) { free(author_following); } return 801; } if ((new_ref = mstrcat(*ptr_ref, item, ptr_ref_len, 0)) == NULL) { clean_request(dbires_author); free(item); if (author_following) { free(author_following); } return 801; } else { *ptr_ref = new_ref; } if (n_ref_format == REFTEIX5) { if (print_elend_x(ptr_ref, ptr_ref_len, "seg", ptr_indent, ns) == NULL) { clean_request(dbires_author); if (author_following) { free(author_following); } return 801; } } else if (n_ref_format == REFRTF) { if (print_rtf_end_group(ptr_ref, ptr_ref_len) == NULL) { return 801; } } else { if (print_elend_x(ptr_ref, ptr_ref_len, "bibliomset", ptr_indent, ns) == NULL) { clean_request(dbires_author); if (author_following) { free(author_following); } return 801; } } } if (item) { free(item); } } *ptr_ref = new_ref; break; } if ((n_status = format_authorname(ptr_ref, ptr_ref_len, &ainfo, authorsep, nameorder, initialstyle, author_upper, n_intext, type, ns, ptr_indent, n_ref_format, &n_trailing_dot)) != 0) { clean_request(dbires_author); if (author_following) { free(author_following); } return n_status; } /* *ptr_ref = new_ref; */ } /* end while have authors */ } /* end if have author_anonymous */ clean_request(dbires_author); } /* end if author query ok */ /* text following */ if (author_following && *author_following) { /* following */ if (sgml_entitize(&author_following, n_ref_format) == NULL) { free(author_following); return 801; } if (n_trailing_dot && *author_following == '.') { if ((new_ref = mstrcat(*ptr_ref, author_following+1, ptr_ref_len, 0)) == NULL) { free(author_following); return 801; } else { *ptr_ref = new_ref; } } else { if ((new_ref = mstrcat(*ptr_ref, author_following, ptr_ref_len, 0)) == NULL) { free(author_following); return 801; } else { *ptr_ref = new_ref; } } if (author_following[strlen(author_following)-1] == '.') { n_trailing_dot++; } } if (author_following) { free(author_following); } item = my_dbi_result_get_string_copy_idx(dbires_ref, n_following_index); if (item && *item) { /* following */ if (sgml_entitize(&item, n_ref_format) == NULL) { free(item); return 801; } /* skip period if the last author ended with a period */ if (*item == '.' && n_trailing_dot) { /* skip period */ if ((new_ref = mstrcat(*ptr_ref, item +1, ptr_ref_len, 0)) == NULL) { free(item); return 801; } else { *ptr_ref = new_ref; } } else { if ((new_ref = mstrcat(*ptr_ref, item, ptr_ref_len, 0)) == NULL) { free(item); return 801; } else { *ptr_ref = new_ref; } } } if (item) { free(item); } /* printf("end format_authorlist():%s\n", *ptr_ref); */ if (!nhave_content) { (*ptr_ref)[0] = '\0'; /* return empty string if no real content */ } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ format_pubdate(): formats the pubdate/pubdatesec part of a bibliography entry as a DocBook bibliomixed text char* format_pubdate returns ptr to the buffer if successful, NULL if failed char** ptr_ref ptr to a ptr to a buffer created with malloc which will receive the output. The calling function must allocate the buffer with at least 4096 byte. This function will reallocate the buffer as needed. *ptr will be updated whenever a realloc is necessary. The calling function is responsible for freeing the memory again. size_t* ptr_ref_len ptr to an int holding the current length of ref. Will be modified if ref is reallocated. struct BIBCONNS* ptr_bibconns ptr to structure with database connections dbi_result dbires ptr to a dbi result structure containing the current reference dbi_result dbires_ref ptr to a dbi result structure containing the reference style dbi_result dbires_cit ptr to a dbi result structure containing the current citation style info int type 0 = pubdate, 1 = pubdatesec, 2 = pubdateall int n_intext 0 = bibliography citation; 1 = intext citation; 2 = intext citation subsequent char* year_unique_suffix ptr to a string with a unique suffix for pubyear const char* ns optional namespace prefix struct xmlindent* ptr_indent indentation information int n_ref_format requested output format: REFDOCBK, REFDOCBKX, REFTEIX ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* format_pubdate(char** ptr_ref, size_t* ptr_ref_len, struct BIBCONNS* ptr_bibconns, dbi_result dbires, dbi_result dbires_ref, dbi_result dbires_cit, int type, int n_intext, const char* year_unique_suffix, const char* ns, struct xmlindent* ptr_indent, int n_ref_format) { char* new_ref; char pubdaterole[28]; char year_buffer[32]; char dummy_year[] = "nd"; char *item; char *item_dateother; char *item_firstsep; char *item_secondsep; const char *citem; const char *item_yearformat; const char *item_monthformat; const char *item_dayformat; const char *item_pad; const char *item_sequence; const char *item_format; const char default_sequence[] = "Y"; /* defaults are taken from citestylex.dtd. Be aware of code duplication which is bad per se */ const char default_yearformat[] = "FOURDIGIT"; const char default_pad[] = "NN"; const char default_monthformat[] = "ARABICMONTH"; const char default_dayformat[] = "ARABICDAY"; enum refdbref_col n_date_index; enum refdbref_col n_dateother_index; int nhave_content = 0; unsigned int n_pubyear = 0; enum refdb_col n_preceeding_index; enum refdb_col n_following_index; enum refdb_col n_format_index; enum refdb_col n_sequence_index; enum refdb_col n_firstsep_index; enum refdb_col n_secondsep_index; enum refdb_col n_yearformat_index; enum refdb_col n_monthformat_index; enum refdb_col n_dayformat_index; enum refdb_col n_pad_index; /* dbi_conn conn; */ struct lilimem sentinel; sentinel.ptr_mem = NULL; sentinel.ptr_next = NULL; sentinel.varname[0] = '\0'; /* set indices according to pubdate type */ if (type == 1) { n_date_index = REFDB_SECYEAR; n_dateother_index = REFDB_SECOTHER_INFO; n_preceeding_index = PUBDATESECPRECEEDING; n_following_index = PUBDATESECFOLLOWING; n_format_index = PUBDATESECFORMAT; n_sequence_index = PUBDATESECSEQUENCE; n_firstsep_index = PUBDATESECFIRSTSEP; n_secondsep_index = PUBDATESECSECONDSEP; n_yearformat_index = PUBDATESECYEARFORMAT; n_monthformat_index = PUBDATESECMONTHFORMAT; n_dayformat_index = PUBDATESECDAYFORMAT; n_pad_index = PUBDATESECPADLEADINGZERO; strcpy(pubdaterole, "secondary"); } else if (type == 2) { n_preceeding_index = PUBDATEALLPRECEEDING; n_following_index = PUBDATEALLFOLLOWING; n_format_index = PUBDATEALLFORMAT; n_sequence_index = PUBDATEALLSEQUENCE; n_firstsep_index = PUBDATEALLFIRSTSEP; n_secondsep_index = PUBDATEALLSECONDSEP; n_yearformat_index = PUBDATEALLYEARFORMAT; n_monthformat_index = PUBDATEALLMONTHFORMAT; n_dayformat_index = PUBDATEALLDAYFORMAT; n_pad_index = PUBDATEALLPADLEADINGZERO; strcpy(pubdaterole, "all"); } else { /* 0 */ n_date_index = REFDB_PUBYEAR; n_dateother_index = REFDB_PYOTHER_INFO; n_preceeding_index = PUBDATEPRECEEDING; n_following_index = PUBDATEFOLLOWING; n_format_index = PUBDATEFORMAT; n_sequence_index = PUBDATESEQUENCE; n_firstsep_index = PUBDATEFIRSTSEP; n_secondsep_index = PUBDATESECONDSEP; n_yearformat_index = PUBDATEYEARFORMAT; n_monthformat_index = PUBDATEMONTHFORMAT; n_dayformat_index = PUBDATEDAYFORMAT; n_pad_index = PUBDATEPADLEADINGZERO; strcpy(pubdaterole, "primary"); } /* printf("in format_pubdate. year_unique_suffix=%s; type=%d, n_intext=%d<<\n", year_unique_suffix, type, n_intext); */ /* conn = dbi_result_get_conn(dbires); */ if (type == 2) { /* first try pubdate, then pubdatesec */ n_pubyear = dbi_result_get_ushort_idx(dbires, REFDB_PUBYEAR); if (!n_pubyear/* && my_dbi_conn_error_flag(ptr_bibconns->conn_source) */) { /* reference has no pubdate data */ citem = my_dbi_result_get_string_idx(dbires, REFDB_PYOTHER_INFO); if (!citem || !*citem) { /* reference has no pubdate data */ return *ptr_ref; } else { n_dateother_index = REFDB_SECOTHER_INFO; } n_pubyear = dbi_result_get_ushort_idx(dbires, REFDB_SECYEAR); } else { n_date_index = REFDB_PUBYEAR; n_dateother_index = REFDB_PYOTHER_INFO; } } else { /* use only requested date */ n_pubyear = dbi_result_get_ushort_idx(dbires, n_date_index); if (!n_pubyear/* && my_dbi_conn_error_flag(ptr_bibconns->conn_source) */) { /* reference has no pubdate data */ return *ptr_ref; } } item = my_dbi_result_get_string_copy_idx(dbires_ref, n_preceeding_index); if (item && *item && !my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { /* preceeding */ if (sgml_entitize(&item, n_ref_format) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item); return NULL; } if ((new_ref = mstrcat(*ptr_ref, item, ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } else { *ptr_ref = new_ref; } } if (item) { free(item); } if (n_ref_format == REFTEIX5) { if (print_elstart_x(ptr_ref, ptr_ref_len, "date", "rend", pubdaterole, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0 /* not empty */, ptr_indent, ns) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } } else if (n_ref_format == REFRTF) { if (print_rtf_format(ptr_ref, ptr_ref_len, "PUBDATE", dbires_ref, 1 /* start group */) == NULL) { return NULL; } } else { if (print_elstart_x(ptr_ref, ptr_ref_len, "pubdate", "role", pubdaterole, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0 /* not empty */, ptr_indent, ns) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } } item_dateother = my_dbi_result_get_string_copy_idx(dbires, n_dateother_index); if (item_dateother && *item_dateother && !my_dbi_conn_error_flag(ptr_bibconns->conn_source)) { if (sgml_entitize(&item_dateother, n_ref_format) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item_dateother); return NULL; } else { if (insert_lilimem(&sentinel, (void**)&item_dateother, "item_dateother")) { delete_all_lilimem(&sentinel); return NULL; } } } else if (item_dateother && *item_dateother) { free(item_dateother); item_dateother = NULL; } item_format = dbi_result_get_string_idx(dbires_ref, n_format_index); /* switch on formatting if the attribute is either missing or set to "YES". To disable formatting, the attribute has to be set to "NO" explicitly */ if (!item_format || strcmp(item_format, "YES") == 0) { /* do some formatting here */ item_sequence = dbi_result_get_string_idx(dbires_ref, n_sequence_index); if (!item_sequence) { item_sequence = default_sequence; } item_yearformat = dbi_result_get_string_idx(dbires_ref, n_yearformat_index); if (!item_yearformat) { item_yearformat = default_yearformat; } item_pad = dbi_result_get_string_idx(dbires_ref, n_pad_index); if (!item_pad) { item_pad = default_pad; } item_monthformat = dbi_result_get_string_idx(dbires_ref, n_monthformat_index); if (!item_monthformat) { item_monthformat = default_monthformat; } item_dayformat = dbi_result_get_string_idx(dbires_ref, n_dayformat_index); if (!item_dayformat) { item_dayformat = default_dayformat; } item_firstsep = my_dbi_result_get_string_copy_idx(dbires_ref, n_firstsep_index); if (item_firstsep && *item_firstsep && !my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { if (sgml_entitize(&item_firstsep, n_ref_format) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item_firstsep); return NULL; } else { if (insert_lilimem(&sentinel, (void**)&item_firstsep, "item_firstsep")) { delete_all_lilimem(&sentinel); return NULL; } } } else if (item_firstsep) { free(item_firstsep); item_firstsep = NULL; } item_secondsep = my_dbi_result_get_string_copy_idx(dbires_ref, n_secondsep_index); if (item_secondsep && *item_secondsep && !my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { if (sgml_entitize(&item_secondsep, n_ref_format) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item_secondsep); return NULL; } else { if (insert_lilimem(&sentinel, (void**)&item_secondsep, "item_secondsep")) { delete_all_lilimem(&sentinel); return NULL; } } } else if (item_secondsep) { free(item_secondsep); item_secondsep = NULL; } /* printf("item_sequence went to %s<<\n", item_sequence); */ if (item_sequence && strcmp(item_sequence, "Y") == 0) { if (n_pubyear) { nhave_content = 1; if ((new_ref = format_year(*ptr_ref, ptr_ref_len, n_pubyear, item_yearformat, item_pad, year_unique_suffix)) == NULL) { delete_all_lilimem(&sentinel); return NULL; } else { *ptr_ref = new_ref; } } else { /* insert dummy pubdate */ /* we do not increment nhave_content here. If the missing pubdate is all we "have", the whole element should be omitted */ if ((new_ref = mstrcat(*ptr_ref, dummy_year, ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); delete_all_lilimem(&sentinel); return NULL; } else { *ptr_ref = new_ref; } } } else if (item_sequence && strcmp(item_sequence, "DM") == 0) { if (item_dateother && *item_dateother) { nhave_content = 1; if ((new_ref = format_day(*ptr_ref, ptr_ref_len, item_dateother, item_dayformat, item_pad)) == NULL) { delete_all_lilimem(&sentinel); return NULL; } else { *ptr_ref = new_ref; } /* firstsep goes in here */ if (item_firstsep && *item_firstsep) { if ((new_ref = mstrcat(*ptr_ref, item_firstsep, ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); delete_all_lilimem(&sentinel); return NULL; } else { *ptr_ref = new_ref; } } if ((new_ref = format_month(*ptr_ref, ptr_ref_len, item_dateother, item_monthformat, item_pad, dbires_cit)) == NULL) { delete_all_lilimem(&sentinel); return NULL; } else { *ptr_ref = new_ref; } } } else if (item_sequence && strcmp(item_sequence, "MD") == 0) { if (item_dateother && *item_dateother) { nhave_content = 1; if ((new_ref = format_month(*ptr_ref, ptr_ref_len, item_dateother, item_monthformat, item_pad, dbires_cit)) == NULL) { delete_all_lilimem(&sentinel); return NULL; } else { *ptr_ref = new_ref; } /* firstsep goes in here */ if (item_firstsep && *item_firstsep) { if ((new_ref = mstrcat(*ptr_ref, item_firstsep, ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); delete_all_lilimem(&sentinel); return NULL; } else { *ptr_ref = new_ref; } } if ((new_ref = format_day(*ptr_ref, ptr_ref_len, item_dateother, item_dayformat, item_pad)) == NULL) { delete_all_lilimem(&sentinel); return NULL; } else { *ptr_ref = new_ref; } } } else if (item_sequence && strcmp(item_sequence, "MY") == 0) { if (item_dateother && *item_dateother) { nhave_content = 1; if ((new_ref = format_month(*ptr_ref, ptr_ref_len, item_dateother, item_monthformat, item_pad, dbires_cit)) == NULL) { delete_all_lilimem(&sentinel); return NULL; } else { *ptr_ref = new_ref; } } /* firstsep goes in here */ if (item_firstsep && *item_firstsep) { if ((new_ref = mstrcat(*ptr_ref, item_firstsep, ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); delete_all_lilimem(&sentinel); return NULL; } else { *ptr_ref = new_ref; } } if (n_pubyear) { nhave_content = 1; if ((new_ref = format_year(*ptr_ref, ptr_ref_len, n_pubyear, item_yearformat, item_pad, year_unique_suffix)) == NULL) { delete_all_lilimem(&sentinel); return NULL; } else { *ptr_ref = new_ref; } } else { /* insert dummy pubdate */ if ((new_ref = mstrcat(*ptr_ref, dummy_year, ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); delete_all_lilimem(&sentinel); return NULL; } else { *ptr_ref = new_ref; } } } else if (item_sequence && strcmp(item_sequence, "DMY") == 0) { if (item_dateother && *item_dateother) { nhave_content = 1; if ((new_ref = format_day(*ptr_ref, ptr_ref_len, item_dateother, item_dayformat, item_pad)) == NULL) { delete_all_lilimem(&sentinel); return NULL; } else { *ptr_ref = new_ref; } } /* firstsep goes in here */ if (item_firstsep && *item_firstsep) { if ((new_ref = mstrcat(*ptr_ref, item_firstsep, ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); delete_all_lilimem(&sentinel); return NULL; } else { *ptr_ref = new_ref; } } if (item_dateother && *item_dateother) { if ((new_ref = format_month(*ptr_ref, ptr_ref_len, item_dateother, item_monthformat, item_pad, dbires_cit)) == NULL) { delete_all_lilimem(&sentinel); return NULL; } else { *ptr_ref = new_ref; } } /* secondsep goes in here */ if (item_secondsep && *item_secondsep) { if ((new_ref = mstrcat(*ptr_ref, item_secondsep, ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); delete_all_lilimem(&sentinel); return NULL; } else { *ptr_ref = new_ref; } } if (n_pubyear) { if ((new_ref = format_year(*ptr_ref, ptr_ref_len, n_pubyear, item_yearformat, item_pad, year_unique_suffix)) == NULL) { delete_all_lilimem(&sentinel); return NULL; } else { *ptr_ref = new_ref; } } else { /* insert dummy pubdate */ if ((new_ref = mstrcat(*ptr_ref, dummy_year, ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); delete_all_lilimem(&sentinel); return NULL; } else { *ptr_ref = new_ref; } } } else if (item_sequence && strcmp(item_sequence, "MDY") == 0) { if (item_dateother && *item_dateother) { nhave_content = 1; if ((new_ref = format_month(*ptr_ref, ptr_ref_len, item_dateother, item_monthformat, item_pad, dbires_cit)) == NULL) { delete_all_lilimem(&sentinel); return NULL; } else { *ptr_ref = new_ref; } } /* firstsep goes in here */ if (item_firstsep && *item_firstsep) { if ((new_ref = mstrcat(*ptr_ref, item_firstsep, ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); delete_all_lilimem(&sentinel); return NULL; } else { *ptr_ref = new_ref; } } if (item_dateother && *item_dateother) { if ((new_ref = format_day(*ptr_ref, ptr_ref_len, item_dateother, item_dayformat, item_pad)) == NULL) { delete_all_lilimem(&sentinel); return NULL; } else { *ptr_ref = new_ref; } } /* secondsep goes in here */ if (item_secondsep && *item_secondsep) { if ((new_ref = mstrcat(*ptr_ref, item_secondsep, ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); delete_all_lilimem(&sentinel); return NULL; } else { *ptr_ref = new_ref; } } if (n_pubyear) { if ((new_ref = format_year(*ptr_ref, ptr_ref_len, n_pubyear, item_yearformat, item_pad, year_unique_suffix)) == NULL) { delete_all_lilimem(&sentinel); return NULL; } else { *ptr_ref = new_ref; } } else { /* insert dummy pubdate */ if ((new_ref = mstrcat(*ptr_ref, dummy_year, ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); delete_all_lilimem(&sentinel); return NULL; } else { *ptr_ref = new_ref; } } } else if (item_sequence && strcmp(item_sequence, "YMD") == 0) { if (n_pubyear) { if ((new_ref = format_year(*ptr_ref, ptr_ref_len, n_pubyear, item_yearformat, item_pad, year_unique_suffix)) == NULL) { delete_all_lilimem(&sentinel); return NULL; } else { *ptr_ref = new_ref; } } else { /* insert dummy pubdate */ if ((new_ref = mstrcat(*ptr_ref, dummy_year, ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); delete_all_lilimem(&sentinel); return NULL; } else { *ptr_ref = new_ref; } } /* firstsep goes in here */ if (item_firstsep && *item_firstsep) { if ((new_ref = mstrcat(*ptr_ref, item_firstsep, ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); delete_all_lilimem(&sentinel); return NULL; } else { *ptr_ref = new_ref; } } if (item_dateother && *item_dateother) { nhave_content = 1; if ((new_ref = format_month(*ptr_ref, ptr_ref_len, item_dateother, item_monthformat, item_pad, dbires_cit)) == NULL) { delete_all_lilimem(&sentinel); return NULL; } else { *ptr_ref = new_ref; } } /* secondsep goes in here */ if (item_secondsep && *item_secondsep) { if ((new_ref = mstrcat(*ptr_ref, item_secondsep, ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); delete_all_lilimem(&sentinel); return NULL; } else { *ptr_ref = new_ref; } } if (item_dateother && *item_dateother) { if ((new_ref = format_day(*ptr_ref, ptr_ref_len, item_dateother, item_dayformat, item_pad)) == NULL) { delete_all_lilimem(&sentinel); return NULL; } else { *ptr_ref = new_ref; } } } } else if (n_pubyear) { /* no formatting */ nhave_content = 1; sprintf(year_buffer, "%d", n_pubyear); if ((new_ref = mstrcat(*ptr_ref, year_buffer, ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); delete_all_lilimem(&sentinel); return NULL; } else { *ptr_ref = new_ref; } } else { /* insert dummy pubdate */ if ((new_ref = mstrcat(*ptr_ref, dummy_year, ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); delete_all_lilimem(&sentinel); return NULL; } else { *ptr_ref = new_ref; } } delete_all_lilimem(&sentinel); if (n_ref_format == REFTEIX5) { if (print_elend_x(ptr_ref, ptr_ref_len, "date", ptr_indent, ns) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } } else if (n_ref_format == REFRTF) { if (print_rtf_end_group(ptr_ref, ptr_ref_len) == NULL) { return NULL; } } else { if (print_elend_x(ptr_ref, ptr_ref_len, "pubdate", ptr_indent, ns) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } } item = my_dbi_result_get_string_copy_idx(dbires_ref, n_following_index); if (item && *item && !my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { /* following */ if (sgml_entitize(&item, n_ref_format) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item); return NULL; } if ((new_ref = mstrcat(*ptr_ref, item, ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item); return NULL; } else { *ptr_ref = new_ref; } } if (item) { free(item); } /* printf("done with format_pubdate. ptr_ref=%s<<\n", *ptr_ref); */ if (!nhave_content) { (*ptr_ref)[0] ='\0'; } return *ptr_ref; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ format_title(): formats the title/booktitle/seriestitle part of a bibliography entry as a DocBook bibliomixed text char* format_title returns ptr to the buffer if successful, NULL if failed char** ptr_ref ptr to a ptr to a buffer created with malloc which will receive the output. The calling function must allocate the buffer with at least 4096 byte. This function will reallocate the buffer as needed. *ptr will be updated whenever a realloc is necessary. The calling function is responsible for freeing the memory again. size_t* ptr_ref_len ptr to an int holding the current length of ref. Will be modified if ref is reallocated. dbi_result dbires ptr to a dbi result structure containing the current reference dbi_result dbires_ref ptr to a dbi result structure containing the reference style int type 1=title (part), 2=booktitle (pub), 3=seriestitle (series), 4=alltitle (any) int n_intext 0 = bibliography citation; 1 = intext citation; 2 = intext citation subsequent int n_title_as_author if >0, title is printed instead of authors const char* ns optional namespace prefix struct xmlindent* ptr_indent indentation information int n_ref_format requested output format: REFDOCBK, REFDOCBKX, REFTEIX ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* format_title(char** ptr_ref, size_t* ptr_ref_len, struct BIBCONNS* ptr_bibconns, dbi_result dbires, dbi_result dbires_ref, int type, int n_intext, int n_title_as_author, const char* ns, struct xmlindent* ptr_indent, int n_ref_format) { char* new_ref; char role[7]; char roleatt[6] = "role"; char *item; char *real_item_title = NULL; const char *citem; const char *item_title; const char *item_titlebook; const char *item_titleseries; int n_title_index = 0; int nhave_content = 0; int nhave_punctuation = 0; enum refdb_col n_preceeding_index; enum refdb_col n_following_index; int n_uplow = 0; /* 0=asis, 1=uppercase, 2=lowercase, 3=initialcaps */ /* printf("start format_title. title_as_author=%d\n", n_title_as_author); */ /* set a few parameters based on title type */ switch (type) { case 1: n_title_index = REFDB_TITLE; n_preceeding_index = TITLEPRECEEDING; n_following_index = TITLEFOLLOWING; citem = dbi_result_get_string_idx(dbires_ref, TITLECASE); if (citem && strcmp(citem, "UPPER") == 0) { n_uplow = 1; } else if (citem && strcmp(citem, "LOWER") == 0) { n_uplow = 2; } else if (citem && strcmp(citem, "ICAPS") == 0) { n_uplow = 3; } if (n_ref_format == REFTEIX5) { strcpy(role, "a"); strcpy(roleatt, "level"); } else { strcpy(role, "JOUR"); } break; default: /* same as booktitle, fall through */ case 2: n_title_index = REFDB_BOOKTITLE; n_preceeding_index = BOOKTITLEPRECEEDING; n_following_index = BOOKTITLEFOLLOWING; citem = dbi_result_get_string_idx(dbires_ref, BOOKTITLECASE); if (citem && strcmp(citem, "UPPER") == 0) { n_uplow = 1; } else if (citem && strcmp(citem, "LOWER") == 0) { n_uplow = 2; } else if (citem && strcmp(citem, "ICAPS") == 0) { n_uplow = 3; } if (n_ref_format == REFTEIX5) { strcpy(role, "m"); strcpy(roleatt, "level"); } else { strcpy(role, "BOOK"); } break; case 3: n_title_index = REFDB_TITLE_SERIES; n_preceeding_index = SERIESTITLEPRECEEDING; n_following_index = SERIESTITLEFOLLOWING; citem = dbi_result_get_string_idx(dbires_ref, SERIESTITLECASE); if (citem && strcmp(citem, "UPPER") == 0) { n_uplow = 1; } else if (citem && strcmp(citem, "LOWER") == 0) { n_uplow = 2; } else if (citem && strcmp(citem, "ICAPS") == 0) { n_uplow = 3; } if (n_ref_format == REFTEIX5) { strcpy(role, "s"); strcpy(roleatt, "level"); } else { strcpy(role, "SERIES"); } break; case 4: item_title = my_dbi_result_get_string_idx(dbires, REFDB_TITLE); if (item_title && my_dbi_conn_error_flag(ptr_bibconns->conn_source)) { item_title = NULL; } item_titlebook = my_dbi_result_get_string_idx(dbires, REFDB_BOOKTITLE); if (item_titlebook && my_dbi_conn_error_flag(ptr_bibconns->conn_source)) { item_titlebook = NULL; } item_titleseries = my_dbi_result_get_string_idx(dbires, REFDB_TITLE_SERIES); if (item_titleseries && my_dbi_conn_error_flag(ptr_bibconns->conn_source)) { item_titleseries = NULL; } if (item_title && *item_title) { n_title_index = REFDB_TITLE; } else if (item_titlebook && *item_titlebook) { n_title_index = REFDB_BOOKTITLE; } else if (item_titleseries && *item_titleseries) { n_title_index = REFDB_TITLE_SERIES; } n_preceeding_index = ALLTITLEPRECEEDING; n_following_index = ALLTITLEFOLLOWING; citem = dbi_result_get_string_idx(dbires_ref, ALLTITLECASE); if (citem && strcmp(citem, "UPPER") == 0) { n_uplow = 1; } else if (citem && strcmp(citem, "LOWER") == 0) { n_uplow = 2; } else if (citem && strcmp(citem, "ICAPS") == 0) { n_uplow = 3; } if (n_ref_format == REFTEIX5) { strcpy(roleatt, "level"); } strcpy(role, "ALL"); break; } if (!n_title_index) { /* no title data available */ goto Finish; } /* now assemble the string */ real_item_title = my_dbi_result_get_string_copy_idx(dbires, n_title_index); if (real_item_title && *real_item_title && !my_dbi_conn_error_flag(ptr_bibconns->conn_source)) { /* reference has title data */ nhave_content = 1; item = my_dbi_result_get_string_copy_idx(dbires_ref, n_preceeding_index); if (item && *item && !my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { /* preceeding */ if (sgml_entitize(&item, n_ref_format) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item); free(real_item_title); return NULL; } if ((new_ref = mstrcat(*ptr_ref, item, ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item); free(real_item_title); return NULL; } else { *ptr_ref = new_ref; } } if (item) { free(item); } /* all types go into a title element. */ if (n_title_as_author) { if (n_ref_format == REFRTF) { /* todo: formatting should have already been set by the author code */ /* if (type == 1) { */ /* if (print_rtf_format(ptr_ref, ptr_ref_len, "TITLE", dbires_ref, 1 /\* start group *\/) == NULL) { */ /* return NULL; */ /* } */ /* } */ /* else if (type == 2) { */ /* if (print_rtf_format(ptr_ref, ptr_ref_len, "BOOKTITLE", dbires_ref, 1 /\* start group *\/) == NULL) { */ /* return NULL; */ /* } */ /* } */ /* else if (type == 3) { */ /* if (print_rtf_format(ptr_ref, ptr_ref_len, "SERIESTITLE", dbires_ref, 1 /\* start group *\/) == NULL) { */ /* return NULL; */ /* } */ /* } */ /* else { */ /* if (print_rtf_format(ptr_ref, ptr_ref_len, "ALLTITLE", dbires_ref, 1 /\* start group *\/) == NULL) { */ /* return NULL; */ /* } */ /* } */ } else { if (print_elstart_x(ptr_ref, ptr_ref_len, "title", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0 /* not empty */, ptr_indent, ns) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(real_item_title); return NULL; } } } else { if (n_ref_format == REFRTF) { if (type == 1) { if (print_rtf_format(ptr_ref, ptr_ref_len, "TITLE", dbires_ref, 1 /* start group */) == NULL) { return NULL; } } else if (type == 2) { if (print_rtf_format(ptr_ref, ptr_ref_len, "BOOKTITLE", dbires_ref, 1 /* start group */) == NULL) { return NULL; } } else if (type == 3) { if (print_rtf_format(ptr_ref, ptr_ref_len, "SERIESTITLE", dbires_ref, 1 /* start group */) == NULL) { return NULL; } } else { if (print_rtf_format(ptr_ref, ptr_ref_len, "ALLTITLE", dbires_ref, 1 /* start group */) == NULL) { return NULL; } } } else { if (print_elstart_x(ptr_ref, ptr_ref_len, "title", roleatt, role, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0 /* not empty */, ptr_indent, ns) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(real_item_title); return NULL; } } } if (n_uplow == 1) { /* want uppercase */ strup(real_item_title); } else if (n_uplow == 2) { /* want lowercase */ strdn(real_item_title); } else if (n_uplow == 3) { /* initial caps */ stricap(real_item_title); } /* else: leave as is */ if (sgml_entitize(&real_item_title, n_ref_format) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(real_item_title); return NULL; } if ((new_ref = mstrcat(*ptr_ref, real_item_title, ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(real_item_title); return NULL; } else { *ptr_ref = new_ref; } /* check for trailing punctuation */ if (real_item_title[strlen(real_item_title) - 1] == '?' || real_item_title[strlen(real_item_title) - 1] == '!' || real_item_title[strlen(real_item_title) - 1] == '.') { nhave_punctuation++; } free(real_item_title); real_item_title = NULL; if (n_ref_format == REFRTF) { if (!n_title_as_author) { if (print_rtf_end_group(ptr_ref, ptr_ref_len) == NULL) { return NULL; } } } else { if (print_elend_x(ptr_ref, ptr_ref_len, "title", ptr_indent, ns) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } } item = my_dbi_result_get_string_copy_idx(dbires_ref, n_following_index); if (item && *item && !my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { /* following */ if (sgml_entitize(&item, n_ref_format) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item); return NULL; } /* skip period if title ended with some sort of punctuation */ if (nhave_punctuation && *item == '.') { if ((new_ref = mstrcat(*ptr_ref, item+1, ptr_ref_len, 0)) == NULL) { free(item); return NULL; } else { *ptr_ref = new_ref; } } else { if ((new_ref = mstrcat(*ptr_ref, item, ptr_ref_len, 0)) == NULL) { free(item); return NULL; } else { *ptr_ref = new_ref; } } } if (item) { free(item); } } /* else: no title found */ /* else { */ /* printf("no title found\n"); */ /* } */ if (real_item_title) { free(real_item_title); } /* printf("end format_title:%s\n", *ref); */ Finish: if (!nhave_content) { (*ptr_ref)[0] = '\0'; } return *ptr_ref; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ format_ulink(): formats the url/link part of a bibliography entry as a DocBook bibliomixed text char* format_ulink returns ptr to the buffer if successful, NULL if failed char** ptr_ref ptr to a ptr to a buffer created with malloc which will receive the output. The calling function must allocate the buffer with at least 4096 byte. This function will reallocate the buffer as needed. *ptr will be updated whenever a realloc is necessary. The calling function is responsible for freeing the memory again. size_t* ptr_ref_len ptr to an int holding the current length of ref. Will be modified if ref is reallocated. dbi_result dbires ptr to a dbi result structure containing the current reference dbi_result dbires_ref ptr to a dbi result structure containing the reference style int type 0=url, 1=pdf, 2=fulltext, 3=related, 4=image int n_intext 0 = bibliography citation; 1 = intext citation; 2 = intext citation subsequent int n_preceeding_index the index of the preceeding stuff in dbires_ref int n_following_index the index of the following stuff in dbires_ref const char* ns optional namespace prefix struct xmlindent* ptr_indent indentation information int n_ref_format requested output format: REFDOCBK, REFDOCBKX, REFTEIX const char* pdfroot optional path prefix for file:// links ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* format_ulink(char** ptr_ref, size_t* ptr_ref_len, struct BIBCONNS* ptr_bibconns, dbi_result dbires, dbi_result dbires_ref, int type, int n_intext, int n_preceeding_index, int n_following_index, const char* ns, struct xmlindent* ptr_indent, int n_ref_format, const char* pdfroot) { char* new_ref; char role_string[16]; char *preceeding; char *following; char *entitize_string; const char *citem; dbi_result dbires_ulink; /* printf("start format_ulink, preceeding:%d; following:%d\n", n_preceeding_index, n_following_index); */ dbires_ulink = request_ulinks(ptr_bibconns->conn, my_dbi_result_get_idval(dbires, "refdb_id"), 0 /* ref entry */, type /* link type */, 0 /* is_temp */, NULL /* todo: use only user's own links? */); if (dbires_ulink == NULL) { LOG_PRINT(LOG_DEBUG, "requesting links failed"); return NULL; } if (!dbi_result_get_numrows(dbires_ulink)) { /* return unaltered string */ return *ptr_ref; } preceeding = my_dbi_result_get_string_copy_idx(dbires_ref, n_preceeding_index); if (preceeding && *preceeding && !my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { /* preceeding */ if (sgml_entitize(&preceeding, n_ref_format) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(preceeding); return NULL; } } following = my_dbi_result_get_string_copy_idx(dbires_ref, n_following_index); if (following && *following && !my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { /* following */ if (sgml_entitize(&following, n_ref_format) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(following); if (preceeding) { free(preceeding); } return NULL; } } if (n_ref_format == REFRTF) { char linktype[6]; snprintf(linktype, 6, "LINK%d", type); if (print_rtf_format(ptr_ref, ptr_ref_len, linktype, dbires_ref, 1 /* start group */) == NULL) { return NULL; } } else if (n_ref_format != REFTEIX5) { if (print_elstart_x(ptr_ref, ptr_ref_len, "bibliomisc", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0 /* not empty */, ptr_indent, ns) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } } while ((citem = get_ulink(dbires_ulink)) != NULL) { if (preceeding) { if ((new_ref = mstrcat(*ptr_ref, preceeding, ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(preceeding); if (following) { free(following); } return NULL; } else { *ptr_ref = new_ref; } } if (type > 0 && type < 5) { entitize_string = add_root_to_link(citem, pdfroot); } else { entitize_string = strdup(citem); } if (entitize_string == NULL || sgml_entitize(&entitize_string, n_ref_format) == NULL) { if (preceeding) { free(preceeding); } if (following) { free(following); } return NULL; } if (!type) { strncpy(role_string, "url", 16); } else if (type == 1) { strncpy(role_string, "pdf", 16); } else if (type == 2) { strncpy(role_string, "fulltext", 16); } else if (type == 3) { strncpy(role_string, "related", 16); } else if (type == 4) { strncpy(role_string, "image", 16); } if (n_ref_format == REFDOCBKX5) { if (print_element_x(entitize_string, ptr_ref, ptr_ref_len, "link", "xl:role", role_string, "xl:href", entitize_string, ptr_indent, ns) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); if (preceeding) { free(preceeding); } if (following) { free(following); } return NULL; } } else if (n_ref_format == REFRTF) { /* todo: create hyperlink */ if (print_rtf_string(entitize_string, ptr_ref, ptr_ref_len) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); if (preceeding) { free(preceeding); } if (following) { free(following); } return NULL; } } else if (n_ref_format == REFTEIX5) { if (print_element_x(entitize_string, ptr_ref, ptr_ref_len, "seg", "type", "ulink", NULL, NULL, ptr_indent, ns) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); if (preceeding) { free(preceeding); } if (following) { free(following); } return NULL; } } else { if (print_element_x(entitize_string, ptr_ref, ptr_ref_len, "ulink", "role", role_string, "url", entitize_string, ptr_indent, ns) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); if (preceeding) { free(preceeding); } if (following) { free(following); } return NULL; } } free(entitize_string); if (following) { if ((new_ref = mstrcat(*ptr_ref, following, ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(following); if (preceeding) { free(preceeding); } return NULL; } else { *ptr_ref = new_ref; } } } /* end while */ clean_request(dbires_ulink); if (preceeding) { free(preceeding); } if (following) { free(following); } if (n_ref_format == REFRTF) { if (print_rtf_end_group(ptr_ref, ptr_ref_len) == NULL) { return NULL; } } else if (n_ref_format != REFTEIX5) { if (print_elend_x(ptr_ref, ptr_ref_len, "bibliomisc", ptr_indent, ns) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } } /* printf("end format_ulink:%s\n", *ref); */ return *ptr_ref; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ format_journalname(): formats the journalname part of a bibliography entry as a DocBook bibliomixed text char* format_journalname returns ptr to the buffer if successful, NULL if failed char** ptr_ref ptr to a ptr to a buffer created with malloc which will receive the output. The calling function must allocate the buffer with at least 4096 byte. This function will reallocate the buffer as needed. *ptr will be updated whenever a realloc is necessary. The calling function is responsible for freeing the memory again. size_t* ptr_ref_len ptr to an int holding the current length of ref. Will be modified if ref is reallocated. struct BIBCONNS* ptr_bibconns ptr to structure with database connections dbi_result dbires ptr to a dbi result structure containing the current reference dbi_result dbires_ref ptr to a dbi result structure containing the pubtype style const char* database ptr to a string containing the database name of the current reference int n_intext 0 = bibliography citation; 1 = intext citation; 2 = intext citation subsequent; 3 = bibtex output const char* ns optional namespace prefix struct xmlindent* ptr_indent indentation information int n_ref_format requested output format: REFDOCBK, REFDOCBKX, REFTEIX int n_title_as_author if nonzero, journal name is used instead of authorname ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* format_journalname(char** ptr_ref, size_t* ptr_ref_len, struct BIBCONNS* ptr_bibconns, dbi_result dbires, dbi_result dbires_ref, const char* database, int n_intext, const char* ns, struct xmlindent* ptr_indent, int n_ref_format, int n_title_as_author) { int nhave_content = 0; int nhave_trailing_dot = 0; int errcode; /* receives error code for periodical requests */ char *new_ref; char *period; char periodical[256] = ""; char *item; const char *citem; char *mod_periodical; /* try the first choice of the periodical name */ citem = dbi_result_get_string_idx(dbires_ref, JOURNALNAMEDEFAULTTEXT); if (citem && strcmp(citem, "ABBREV") == 0) { item = get_periodical(ptr_bibconns->conn_source, periodical, database, 3, &errcode, 0, my_dbi_result_get_idval(dbires, "refdb_id"), NULL /* no frequency required */); if (item == NULL && errcode != 1) { return NULL; /* db error */ } } else if (citem && strcmp(citem, "FULL") == 0) { item = get_periodical(ptr_bibconns->conn_source, periodical, database, 0, &errcode, 0, my_dbi_result_get_idval(dbires, "refdb_id"), NULL /* no frequency required */); if (item == NULL && errcode != 1) { return NULL; /* db error */ } } else if (citem && strcmp(citem, "USERONE") == 0) { item = get_periodical(ptr_bibconns->conn_source, periodical, database, 1, &errcode, 0, my_dbi_result_get_idval(dbires, "refdb_id"), NULL /* no frequency required */); if (item == NULL && errcode != 1) { return NULL; /* db error */ } } else if (citem && strcmp(citem, "USERTWO") == 0) { item = get_periodical(ptr_bibconns->conn_source, periodical, database, 2, &errcode, 0, my_dbi_result_get_idval(dbires, "refdb_id"), NULL /* no frequency required */); if (item == NULL && errcode != 1) { return NULL; /* db error */ } } if (!*periodical) { /* try the second choice */ citem = dbi_result_get_string_idx(dbires_ref, JOURNALNAMEALTERNATETEXT); if (citem && strcmp(citem, "AABBREV") == 0) { item = get_periodical(ptr_bibconns->conn_source, periodical, database, 3, &errcode, 0, my_dbi_result_get_idval(dbires, "refdb_id"), NULL /* no frequency required */); if (item == NULL && errcode != 1) { return NULL; /* db error */ } } else if (citem && strcmp(citem, "AFULL") == 0) { item = get_periodical(ptr_bibconns->conn_source, periodical, database, 0, &errcode, 0, my_dbi_result_get_idval(dbires, "refdb_id"), NULL /* no frequency required */); if (item == NULL && errcode != 1) { return NULL; /* db error */ } } else if (citem && strcmp(citem, "AUSERONE") == 0) { item = get_periodical(ptr_bibconns->conn_source, periodical, database, 1, &errcode, 0, my_dbi_result_get_idval(dbires, "refdb_id"), NULL /* no frequency required */); if (item == NULL && errcode != 1) { return NULL; /* db error */ } } else if (citem && strcmp(citem, "AUSERTWO") == 0) { item = get_periodical(ptr_bibconns->conn_source, periodical, database, 2, &errcode, 0, my_dbi_result_get_idval(dbires, "refdb_id"), NULL /* no frequency required */); if (item == NULL && errcode != 1) { return NULL; /* db error */ } } } if (!*periodical) { /* (*ptr_ref)[0] = '\0'; */ return *ptr_ref; /* no periodical specified */ } /* reference has periodical data */ nhave_content = 1; if (!n_title_as_author) { item = my_dbi_result_get_string_copy_idx(dbires_ref, JOURNALNAMEPRECEEDING); if (item && *item && !my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { /* preceeding */ if (n_intext != 3) { if (sgml_entitize(&item, n_ref_format) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item); return NULL; } if ((new_ref = mstrcat(*ptr_ref, item, ptr_ref_len, 0)) == NULL) { free(item); LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } else { *ptr_ref = new_ref; } } else { char* escaped_item; if ((escaped_item = escape_latex_chars_copy(item, strlen(item))) == NULL) { free(item); LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } if ((new_ref = mstrcat(*ptr_ref, escaped_item, ptr_ref_len, 0)) == NULL) { free(item); free(escaped_item); LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } else { *ptr_ref = new_ref; free(escaped_item); } } } if (item) { free(item); } } /* end if not n_title_as_author */ if (n_intext != 3) { if (n_ref_format == REFTEIX5) { if (print_elstart_x(ptr_ref, ptr_ref_len, "title", "level", "m", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0 /* not empty */, ptr_indent, ns) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } } else if (n_ref_format == REFRTF) { if (print_rtf_format(ptr_ref, ptr_ref_len, "JOURNALNAME", dbires_ref, 1 /* start group */) == NULL) { return NULL; } } else { if (print_elstart_x(ptr_ref, ptr_ref_len, "title", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0 /* not empty */, ptr_indent, ns) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } } } /* do some formatting */ mod_periodical = malloc(strlen(periodical)*2); /* extra spaces */ if (!mod_periodical) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } strcpy(mod_periodical, periodical); citem = dbi_result_get_string_idx(dbires_ref, JOURNALNAMEPUNCTUATION); if (citem && strcmp(citem, "SPACE") == 0) { /* replace all periods with spaces */ while ((period = strchr(mod_periodical, (int)'.')) != NULL) { *period = ' '; } /* remove trailing space, if any */ if (mod_periodical[strlen(mod_periodical) - 1] == ' ') { mod_periodical[strlen(mod_periodical) - 1] = '\0'; } } else if (citem && strcmp(citem, "PERIODSPACE") == 0) { /* insert a space after each period */ period = mod_periodical; while((period = strchr(period, (int)'.')) != NULL) { /* don't add a space if this is the last word */ if (*(period+1) != '\0') { replace_char_string(period, ". ", 1); period++; } else { break; } } } /* else: database already contains the periodonly format */ /* handle the case requirements */ citem = dbi_result_get_string_idx(dbires_ref, JOURNALNAMECASE); if (citem && strcmp(citem, "UPPER") == 0) { strup(mod_periodical); } else if (citem && strcmp(citem, "LOWER") == 0) { strdn(mod_periodical); } else if (citem && strcmp(citem, "ICAPS") == 0) { stricap(mod_periodical); } /* else: asis needs no changes */ /* see whether journal name ends with a period */ if (mod_periodical[strlen(mod_periodical)-1] == '.') { nhave_trailing_dot++; } if (n_intext != 3) { /* not bibtex */ if (sgml_entitize(&mod_periodical, n_ref_format) == NULL) { free(mod_periodical); return NULL; } if ((new_ref = mstrcat(*ptr_ref, mod_periodical, ptr_ref_len, 0)) == NULL) { free(mod_periodical); LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } else { *ptr_ref = new_ref; } } else { /* bibtex */ char* escaped_item; if ((escaped_item = escape_latex_chars_copy(mod_periodical, strlen(mod_periodical))) == NULL) { free(mod_periodical); LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } if ((new_ref = mstrcat(*ptr_ref, escaped_item, ptr_ref_len, 0)) == NULL) { free(mod_periodical); free(escaped_item); LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } else { *ptr_ref = new_ref; free(escaped_item); } } free(mod_periodical); if (n_ref_format == REFRTF) { if (print_rtf_end_group(ptr_ref, ptr_ref_len) == NULL) { return NULL; } } else if (n_intext != 3) { if (print_elend_x(ptr_ref, ptr_ref_len, "title", ptr_indent, ns) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } } if (!n_title_as_author) { item = my_dbi_result_get_string_copy_idx(dbires_ref, JOURNALNAMEFOLLOWING); if (item && *item && !my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { /* following */ if (n_intext != 3) { if (sgml_entitize(&item, n_ref_format) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item); return NULL; } /* skip dot if there is already one */ if (nhave_trailing_dot && *item == '.') { if ((new_ref = mstrcat(*ptr_ref, item+1, ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } else { *ptr_ref = new_ref; } } else { if ((new_ref = mstrcat(*ptr_ref, item, ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } else { *ptr_ref = new_ref; } } } else { char* escaped_item; if ((escaped_item = escape_latex_chars_copy(item, strlen(item))) == NULL) { free(item); LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } /* skip dot if there is already one */ if (nhave_trailing_dot && *escaped_item == '.') { if ((new_ref = mstrcat(*ptr_ref, escaped_item+1, ptr_ref_len, 0)) == NULL) { free(item); free(escaped_item); LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } else { *ptr_ref = new_ref; free(escaped_item); } } else { if ((new_ref = mstrcat(*ptr_ref, escaped_item, ptr_ref_len, 0)) == NULL) { free(item); free(escaped_item); LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } else { *ptr_ref = new_ref; free(escaped_item); } } } } if (item) { free(item); } } /* end if not n_title_as_author */ if (!nhave_content) { (*ptr_ref)[0] = '\0'; } return *ptr_ref; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ format_simple(): formats a simple part of a bibliography entry as a DocBook bibliomixed text char* format_simple returns ptr to the buffer if successful, NULL if failed char** ptr_ref ptr to a ptr to a buffer created with malloc which will receive the output. The calling function must allocate the buffer with at least 4096 byte. This function will reallocate the buffer as needed. *ptr will be updated whenever a realloc is necessary. The calling function is responsible for freeing the memory again. size_t* ptr_ref_len ptr to an int holding the current length of ref. Will be modified if ref is reallocated. dbi_result dbires ptr to a dbi result structure containing the current reference dbi_result dbires_ref ptr to a dbi result structure containing the reference style int n_intext 0 = bibliography citation; 1 = intext citation; 2 = intext citation subsequent int n_item_index the index of the requested contents in dbires int n_preceeding_index the index of the preceeding stuff in dbires_ref int n_following_index the index of the following stuff in dbires_ref const char* elname the name of the element that receives the output const char* ns optional namespace prefix struct xmlindent* ptr_indent indentation information int n_ref_format requested output format: REFDOCBK, REFDOCBKX, REFTEIX ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* format_simple(char** ptr_ref, size_t* ptr_ref_len, struct BIBCONNS* ptr_bibconns, dbi_result dbires, dbi_result dbires_ref, int n_intext, int n_item_index, int n_preceeding_index, int n_following_index, const char* elname, const char* ns, struct xmlindent* ptr_indent, int n_ref_format) { int nhave_content = 0; char *new_ref; char *item_simple; char *item; item_simple = my_dbi_result_get_string_copy_idx(dbires, n_item_index); if (item_simple && *item_simple && !my_dbi_conn_error_flag(ptr_bibconns->conn_source)) { /* reference has requested data */ nhave_content = 1; if (sgml_entitize(&item_simple, n_ref_format) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item_simple); return NULL; } LOG_PRINT(LOG_DEBUG, elname); /* some elements need some special care */ item = my_dbi_result_get_string_copy_idx(dbires_ref, n_preceeding_index); if (item && *item && !my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { /* preceeding */ if (sgml_entitize(&item, n_ref_format) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item); free(item_simple); return NULL; } if ((new_ref = mstrcat(*ptr_ref, item, ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item); free(item_simple); return NULL; } else { *ptr_ref = new_ref; } } if (item) { free(item); } if (!strcmp(elname, "city")) { if (n_ref_format == REFTEIX5) { if (print_elstart_x(ptr_ref, ptr_ref_len, "seg", "type", "pubplace", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0 /* not empty */, ptr_indent, ns) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item_simple); return NULL; } } else if (n_ref_format == REFRTF) { if (print_rtf_format(ptr_ref, ptr_ref_len, "PUBPLACE", dbires_ref, 1 /* start group */) == NULL) { return NULL; } } else { if (print_elstart_x(ptr_ref, ptr_ref_len, "address", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0 /* not empty */, ptr_indent, ns) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item_simple); return NULL; } if (print_elstart_x(ptr_ref, ptr_ref_len, "city", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0 /* not empty */, ptr_indent, ns) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item_simple); return NULL; } } } /* obsolete? */ /* else if (!strcmp(elname, "ulink")) { */ /* if (n_ref_format == REFTEIX5) { */ /* if (print_elstart_x(ptr_ref, ptr_ref_len, "seg", "type", "ulink", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0 /\* not empty *\/, ptr_indent, ns) == NULL) { */ /* LOG_PRINT(LOG_WARNING, get_status_msg(801)); */ /* free(item_simple); */ /* return NULL; */ /* } */ /* } */ /* else if (n_ref_format == REFRTF) { */ /* /\* todo: insert RTF stuff *\/ */ /* } */ /* else { */ /* if (print_elstart_x(ptr_ref, ptr_ref_len, "bibliomisc", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0 /\* not empty *\/, ptr_indent, ns) == NULL) { */ /* LOG_PRINT(LOG_WARNING, get_status_msg(801)); */ /* free(item_simple); */ /* return NULL; */ /* } */ /* if (print_elstart_x(ptr_ref, ptr_ref_len, "ulink", "url", item_simple, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0 /\* not empty *\/, ptr_indent, ns) == NULL) { */ /* LOG_PRINT(LOG_WARNING, get_status_msg(801)); */ /* free(item_simple); */ /* return NULL; */ /* } */ /* } */ /* } */ else if (!strcmp(elname, "userdef1") || !strcmp(elname, "userdef2") || !strcmp(elname, "userdef3") || !strcmp(elname, "userdef4") || !strcmp(elname, "userdef5") /* || !strcmp(elname, "link0") */ /* || !strcmp(elname, "link1") */ /* || !strcmp(elname, "link2") */ /* || !strcmp(elname, "link3") */ /* || !strcmp(elname, "link4") */ || !strcmp(elname, "typeofwork") || !strcmp(elname, "area") || !strcmp(elname, "ostype") || !strcmp(elname, "degree") || !strcmp(elname, "runningtime") || !strcmp(elname, "classcodeintl") || !strcmp(elname, "classcodeus") || !strcmp(elname, "senderemail") || !strcmp(elname, "recipientemail") || !strcmp(elname, "mediatype") || !strcmp(elname, "numvolumes") || !strcmp(elname, "edition") || !strcmp(elname, "computer") || !strcmp(elname, "conferencelocation") || !strcmp(elname, "registrynum") || !strcmp(elname, "classification") || !strcmp(elname, "section") || !strcmp(elname, "pamphletnum") || !strcmp(elname, "chapternum") ) { if (n_ref_format == REFTEIX5) { if (print_elstart_x(ptr_ref, ptr_ref_len, "seg", "type", elname, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0 /* not empty */, ptr_indent, ns) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item_simple); return NULL; } } else if (n_ref_format == REFRTF) { char* ucelname; if ((ucelname = strdup(elname)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item_simple); return NULL; } strup(ucelname); if (print_rtf_format(ptr_ref, ptr_ref_len, ucelname, dbires_ref, 1 /* start group */) == NULL) { return NULL; } free(ucelname); } else { if (print_elstart_x(ptr_ref, ptr_ref_len, "bibliomset", "role", elname, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0 /* not empty */, ptr_indent, ns) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item_simple); return NULL; } } } else if (!strcmp(elname, "volumenum")) { if (n_ref_format == REFTEIX5) { if (print_elstart_x(ptr_ref, ptr_ref_len, "seg", "type", "volume", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0 /* not empty */, ptr_indent, ns) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item_simple); return NULL; } } else if (n_ref_format == REFRTF) { /* todo: insert RTF stuff */ if (print_rtf_format(ptr_ref, ptr_ref_len, "VOLUME", dbires_ref, 1 /* start group */) == NULL) { return NULL; } } else { if (print_elstart_x(ptr_ref, ptr_ref_len, elname, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0 /* not empty */, ptr_indent, ns) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item_simple); return NULL; } } } else if (!strcmp(elname, "issuenum")) { if (n_ref_format == REFTEIX5) { if (print_elstart_x(ptr_ref, ptr_ref_len, "seg", "type", "issue", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0 /* not empty */, ptr_indent, ns) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item_simple); return NULL; } } else if (n_ref_format == REFRTF) { /* todo: insert RTF stuff */ if (print_rtf_format(ptr_ref, ptr_ref_len, "ISSUE", dbires_ref, 1 /* start group */) == NULL) { return NULL; } } else { if (print_elstart_x(ptr_ref, ptr_ref_len, elname, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0 /* not empty */, ptr_indent, ns) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item_simple); return NULL; } } } else if (!strcmp(elname, "publishername")) { if (n_ref_format == REFTEIX5) { if (print_elstart_x(ptr_ref, ptr_ref_len, "seg", "type", "publisher", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0 /* not empty */, ptr_indent, ns) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item_simple); return NULL; } } else if (n_ref_format == REFRTF) { /* todo: insert RTF stuff */ if (print_rtf_format(ptr_ref, ptr_ref_len, "PUBLISHER", dbires_ref, 1 /* start group */) == NULL) { return NULL; } } else { if (print_elstart_x(ptr_ref, ptr_ref_len, elname, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0 /* not empty */, ptr_indent, ns) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item_simple); return NULL; } } } else { if (n_ref_format == REFRTF) { char* ucelname; if ((ucelname = strdup(elname)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item_simple); return NULL; } strup(ucelname); if (print_rtf_format(ptr_ref, ptr_ref_len, ucelname, dbires_ref, 1 /* start group */) == NULL) { return NULL; } free(ucelname); } else if (print_elstart_x(ptr_ref, ptr_ref_len, elname, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0 /* not empty */, ptr_indent, ns) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item_simple); return NULL; } } if ((new_ref = mstrcat(*ptr_ref, item_simple, ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item_simple); return NULL; } else { *ptr_ref = new_ref; } if (n_ref_format == REFRTF) { if (print_rtf_end_group(ptr_ref, ptr_ref_len) == NULL) { return NULL; } } else { if (!strcmp(elname, "city")) { if (n_ref_format == REFTEIX5) { if (print_elend_x(ptr_ref, ptr_ref_len, "seg", ptr_indent, ns) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item_simple); return NULL; } } else { if (print_elend_x(ptr_ref, ptr_ref_len, "city", ptr_indent, ns) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item_simple); return NULL; } if (print_elend_x(ptr_ref, ptr_ref_len, "address", ptr_indent, ns) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item_simple); return NULL; } } } else if (!strcmp(elname, "ulink")) { if (n_ref_format == REFTEIX5) { if (print_elend_x(ptr_ref, ptr_ref_len, "seg", ptr_indent, ns) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item_simple); return NULL; } } else { if (print_elend_x(ptr_ref, ptr_ref_len, "ulink", ptr_indent, ns) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item_simple); return NULL; } if (print_elend_x(ptr_ref, ptr_ref_len, "bibliomisc", ptr_indent, ns) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item_simple); return NULL; } } } else if (!strcmp(elname, "userdef1") || !strcmp(elname, "userdef2") || !strcmp(elname, "userdef3") || !strcmp(elname, "userdef4") || !strcmp(elname, "userdef5") /* || !strcmp(elname, "link0") */ /* || !strcmp(elname, "link1") */ /* || !strcmp(elname, "link2") */ /* || !strcmp(elname, "link3") */ /* || !strcmp(elname, "link4") */ || !strcmp(elname, "typeofwork") || !strcmp(elname, "area") || !strcmp(elname, "ostype") || !strcmp(elname, "degree") || !strcmp(elname, "runningtime") || !strcmp(elname, "classcodeintl") || !strcmp(elname, "classcodeus") || !strcmp(elname, "senderemail") || !strcmp(elname, "recipientemail") || !strcmp(elname, "mediatype") || !strcmp(elname, "numvolumes") || !strcmp(elname, "edition") || !strcmp(elname, "computer") || !strcmp(elname, "conferencelocation") || !strcmp(elname, "registrynum") || !strcmp(elname, "classification") || !strcmp(elname, "section") || !strcmp(elname, "pamphletnum") || !strcmp(elname, "chapternum") ) { if (n_ref_format == REFTEIX5) { if (print_elend_x(ptr_ref, ptr_ref_len, "seg", ptr_indent, ns) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item_simple); return NULL; } } else { if (print_elend_x(ptr_ref, ptr_ref_len, "bibliomset", ptr_indent, ns) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item_simple); return NULL; } } } else if (!strcmp(elname, "volumenum")) { if (n_ref_format == REFTEIX5) { if (print_elend_x(ptr_ref, ptr_ref_len, "seg", ptr_indent, ns) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item_simple); return NULL; } } else { if (print_elend_x(ptr_ref, ptr_ref_len, elname, ptr_indent, ns) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item_simple); return NULL; } } } else if (!strcmp(elname, "issuenum")) { if (n_ref_format == REFTEIX5) { if (print_elend_x(ptr_ref, ptr_ref_len, "seg", ptr_indent, ns) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item_simple); return NULL; } } else { if (print_elend_x(ptr_ref, ptr_ref_len, elname, ptr_indent, ns) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item_simple); return NULL; } } } else if (!strcmp(elname, "publishername")) { if (n_ref_format == REFTEIX5) { if (print_elend_x(ptr_ref, ptr_ref_len, "seg", ptr_indent, ns) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item_simple); return NULL; } } else { if (print_elend_x(ptr_ref, ptr_ref_len, elname, ptr_indent, ns) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item_simple); return NULL; } } } else { if (print_elend_x(ptr_ref, ptr_ref_len, elname, ptr_indent, ns) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item_simple); return NULL; } } } /* end if not RTF */ item = my_dbi_result_get_string_copy_idx(dbires_ref, n_following_index); if (item && *item && !my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { /* following */ if (sgml_entitize(&item, n_ref_format) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item); free(item_simple); return NULL; } if ((new_ref = mstrcat(*ptr_ref, item, ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item); free(item_simple); return NULL; } else { *ptr_ref = new_ref; } } if (item) { free(item); } } if (item_simple) { free(item_simple); } if (!nhave_content) { (*ptr_ref)[0] = '\0'; } return *ptr_ref; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ format_pages(): formats the pages part of a bibliography entry as a DocBook bibliomixed text char* format_pages returns ptr to the buffer if successful, NULL if failed char** ptr_ref ptr to a ptr to a buffer created with malloc which will receive the output. The calling function must allocate the buffer with at least 4096 byte. This function will reallocate the buffer as needed. *ptr will be updated whenever a realloc is necessary. The calling function is responsible for freeing the memory again. size_t* ptr_ref_len ptr to an int holding the current length of ref. Will be modified if ref is reallocated. struct BIBCONNS* ptr_bibconns ptr to structure with database connections dbi_result dbires ptr to a dbi result structure containing the current reference dbi_result dbires_ref ptr to a dbi result structure containing the reference style int n_intext 0 = bibliography citation; 1 = intext citation; 2 = intext citation subsequent const char* ns optional namespace prefix struct xmlindent* ptr_indent indentation information int n_ref_format requested output format: REFDOCBK, REFDOCBKX, REFTEIX ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* format_pages(char** ptr_ref, size_t* ptr_ref_len, struct BIBCONNS* ptr_bibconns, dbi_result dbires, dbi_result dbires_ref, int n_intext, const char* ns, struct xmlindent* ptr_indent, int n_ref_format) { int nhave_content = 0; char *new_ref; char new_endpage[256]; char *item_sp; char *item_ep; char *item; const char *item_type; struct lilimem sentinel; /* dbi_conn conn; */ /* conn = dbi_result_get_conn(dbires_ref); */ sentinel.ptr_mem = NULL; sentinel.ptr_next = NULL; sentinel.varname[0] = '\0'; item_sp = my_dbi_result_get_string_copy_idx(dbires, REFDB_STARTPAGE); if (item_sp && my_dbi_conn_error_flag(ptr_bibconns->conn_source)) { free(item_sp); item_sp = NULL; } else if (item_sp) { if (insert_lilimem(&sentinel, (void**)&item_sp, NULL)) { return NULL; } } item_ep = my_dbi_result_get_string_copy_idx(dbires, REFDB_ENDPAGE); if (item_ep && my_dbi_conn_error_flag(ptr_bibconns->conn_source)) { free(item_ep); item_ep = NULL; } else if (item_ep) { if (insert_lilimem(&sentinel, (void**)&item_ep, NULL)) { delete_all_lilimem(&sentinel); return NULL; } } if (item_sp && *item_sp) { /* reference has at least start page data */ nhave_content = 1; item = my_dbi_result_get_string_copy_idx(dbires_ref, PAGESPRECEEDING); if (item && *item && !my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { /* preceeding */ if (sgml_entitize(&item, n_ref_format) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item); delete_all_lilimem(&sentinel); return NULL; } if ((new_ref = mstrcat(*ptr_ref, item, ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item); delete_all_lilimem(&sentinel); return NULL; } else { *ptr_ref = new_ref; } } if (item) { free(item); } /* if we only have the start page or the format says to only use the start page, forget about the end page */ item_type = dbi_result_get_string_idx(dbires_ref, PAGESPAGERANGETYPE); if (!item_ep || !*item_ep || (item_type && strcmp(item_type, "STARTONLY") == 0)) { item = my_dbi_result_get_string_copy_idx(dbires_ref, PAGESSINGLEPAGEPRECEEDING); if (item && *item && !my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { if (sgml_entitize(&item, n_ref_format) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item); delete_all_lilimem(&sentinel); return NULL; } if ((new_ref = mstrcat(*ptr_ref, item, ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item); delete_all_lilimem(&sentinel); return NULL; } else { *ptr_ref = new_ref; } } if (item) { free(item); } if (n_ref_format == REFTEIX5) { if (print_elstart_x(ptr_ref, ptr_ref_len, "seg", "type", "pages", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0 /* not empty */, ptr_indent, ns) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); delete_all_lilimem(&sentinel); return NULL; } } else if (n_ref_format == REFRTF) { /* todo: insert RTF stuff */ if (print_rtf_format(ptr_ref, ptr_ref_len, "PAGES", dbires_ref, 1 /* start group */) == NULL) { return NULL; } } else { if (print_elstart_x(ptr_ref, ptr_ref_len, "pagenums", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0 /* not empty */, ptr_indent, ns) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); delete_all_lilimem(&sentinel); return NULL; } } if (sgml_entitize(&item_sp, n_ref_format) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); delete_all_lilimem(&sentinel); return NULL; } if ((new_ref = mstrcat(*ptr_ref, item_sp, ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); delete_all_lilimem(&sentinel); return NULL; } else { *ptr_ref = new_ref; } if (n_ref_format == REFTEIX5) { if (print_elend_x(ptr_ref, ptr_ref_len, "seg", ptr_indent, ns) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); delete_all_lilimem(&sentinel); return NULL; } } else if (n_ref_format == REFRTF) { if (print_rtf_end_group(ptr_ref, ptr_ref_len) == NULL) { return NULL; } } else { if (print_elend_x(ptr_ref, ptr_ref_len, "pagenums", ptr_indent, ns) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); delete_all_lilimem(&sentinel); return NULL; } } item = my_dbi_result_get_string_copy_idx(dbires_ref, PAGESSINGLEPAGEFOLLOWING); if (item && *item & !my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { if (sgml_entitize(&item, n_ref_format) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item); delete_all_lilimem(&sentinel); return NULL; } if ((new_ref = mstrcat(*ptr_ref, item, ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item); delete_all_lilimem(&sentinel); return NULL; } else { *ptr_ref = new_ref; } } if (item) { free(item); } } /* we have both start- and end-pages and we're supposed to render both */ else if (item_ep && *item_ep) { item = my_dbi_result_get_string_copy_idx(dbires_ref, PAGESPAGERANGEPRECEEDING); if (item && *item && !my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { if (sgml_entitize(&item, n_ref_format) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item); delete_all_lilimem(&sentinel); return NULL; } if ((new_ref = mstrcat(*ptr_ref, item, ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item); delete_all_lilimem(&sentinel); return NULL; } else { *ptr_ref = new_ref; } } if (item) { free(item); } if (n_ref_format == REFTEIX5) { if (print_elstart_x(ptr_ref, ptr_ref_len, "seg", "type", "pages", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0 /* not empty */, ptr_indent, ns) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); delete_all_lilimem(&sentinel); return NULL; } } else if (n_ref_format == REFRTF) { if (print_rtf_format(ptr_ref, ptr_ref_len, "PAGES", dbires_ref, 1 /* start group */) == NULL) { return NULL; } } else { if (print_elstart_x(ptr_ref, ptr_ref_len, "pagenums", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0 /* not empty */, ptr_indent, ns) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); delete_all_lilimem(&sentinel); return NULL; } } if (sgml_entitize(&item_sp, n_ref_format) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); delete_all_lilimem(&sentinel); return NULL; } if ((new_ref = mstrcat(*ptr_ref, item_sp, ptr_ref_len, 0)) == NULL) { return NULL; } else { *ptr_ref = new_ref; } /* if RANGESEPARATOR is defined, use it (even if it is the empty string) otherwise use a dash */ item = my_dbi_result_get_string_copy_idx(dbires_ref, PAGESPAGERANGERANGESEPARATOR); if (item && *item && !my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { if (sgml_entitize(&item, n_ref_format) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item); delete_all_lilimem(&sentinel); return NULL; } if ((new_ref = mstrcat(*ptr_ref, item, ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item); delete_all_lilimem(&sentinel); return NULL; } else { *ptr_ref = new_ref; } } else { if ((new_ref = mstrcat(*ptr_ref, "-", ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); delete_all_lilimem(&sentinel); return NULL; } else { *ptr_ref = new_ref; } } if (item) { free(item); } if ((new_ref = mstrcat(*ptr_ref, normalize_pages(new_endpage, item_sp, item_ep, item_type), ptr_ref_len, 0)) == NULL) { delete_all_lilimem(&sentinel); return NULL; } else { *ptr_ref = new_ref; } if (n_ref_format == REFTEIX5) { if (print_elend_x(ptr_ref, ptr_ref_len, "seg", ptr_indent, ns) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); delete_all_lilimem(&sentinel); return NULL; } } else if (n_ref_format == REFRTF) { /* todo: insert RTF stuff */ if (print_rtf_end_group(ptr_ref, ptr_ref_len) == NULL) { return NULL; } } else { if (print_elend_x(ptr_ref, ptr_ref_len, "pagenums", ptr_indent, ns) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); delete_all_lilimem(&sentinel); return NULL; } } item = my_dbi_result_get_string_copy_idx(dbires_ref, PAGESPAGERANGEFOLLOWING); if (item && *item && !my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { if (sgml_entitize(&item, n_ref_format) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item); delete_all_lilimem(&sentinel); return NULL; } if ((new_ref = mstrcat(*ptr_ref, item, ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item); delete_all_lilimem(&sentinel); return NULL; } else { *ptr_ref = new_ref; } } if (item) { free(item); } } /* else: no endpage data available */ item = my_dbi_result_get_string_copy_idx(dbires_ref, PAGESFOLLOWING); if (item && *item && !my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { /* following */ if (sgml_entitize(&item, n_ref_format) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item); delete_all_lilimem(&sentinel); return NULL; } if ((new_ref = mstrcat(*ptr_ref, item, ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item); delete_all_lilimem(&sentinel); return NULL; } else { *ptr_ref = new_ref; } } if (item) { free(item); } } delete_all_lilimem(&sentinel); if (!nhave_content) { (*ptr_ref)[0] = '\0'; } return *ptr_ref; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ format_notes(): formats the notes part of a bibliography entry as a DocBook bibliomixed text char* format_notes returns NULL on error, ptr to ref if ok. ref may be reallocated during the rendering, so it is essential that upon return of this function *ONLY* the returned pointer is used to address the result and *NOT* the original pointer which may be invalid. char** ptr_ref ptr to a ptr to a malloc()'ed string that will receive the output *ptr_ref will be reallocated if necessary size_t* ptr_ref_len ptr to an int holding the current length of ref. Will be modified if ref is reallocated. struct BIBCONNS* ptr_bibconns ptr to structure with database connections dbi_result dbires ptr to a dbi result structure containing the current reference dbi_result dbires_ref ptr to a dbi result structure containing the reference style const char* username ptr to string with the current user const char* ns optional namespace prefix struct xmlindent* ptr_indent indentation information int n_ref_format requested output format: REFDOCBK, REFDOCBKX, REFTEIX ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* format_notes(char** ptr_ref, size_t* ptr_ref_len, struct BIBCONNS* ptr_bibconns, dbi_result dbires, dbi_result dbires_ref, const char* username, const char* ns, struct xmlindent* ptr_indent, int n_ref_format) { int nhave_content = 0; char *new_ref; char *item; char *item_notes; item_notes = get_notes_copy(dbires, (char*)username); if (item_notes && *item_notes) { nhave_content = 1; item = my_dbi_result_get_string_copy_idx(dbires_ref, NOTESPRECEEDING); if (item && *item && !my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { /* preceeding */ if (sgml_entitize(&item, n_ref_format) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item); free(item_notes); return NULL; } if ((new_ref = mstrcat(*ptr_ref, item, ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item); free(item_notes); return NULL; } else { *ptr_ref = new_ref; } } if (item) { free(item); } if (n_ref_format == REFTEIX5) { if (print_elstart_x(ptr_ref, ptr_ref_len, "seg", "type", "notes", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0 /* not empty */, ptr_indent, ns) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item_notes); return NULL; } } else if (n_ref_format == REFRTF) { if (print_rtf_format(ptr_ref, ptr_ref_len, "NOTES", dbires_ref, 1 /* start group */) == NULL) { return NULL; } } else { if (print_elstart_x(ptr_ref, ptr_ref_len, "bibliomset", "role", "notes", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0 /* not empty */, ptr_indent, ns) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item_notes); return NULL; } } if (sgml_entitize(&item_notes, n_ref_format) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item_notes); return NULL; } if ((new_ref = mstrcat(*ptr_ref, item_notes, ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item_notes); return NULL; } else { *ptr_ref = new_ref; } if (n_ref_format == REFTEIX5) { if (print_elend_x(ptr_ref, ptr_ref_len, "seg", ptr_indent, ns) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item_notes); return NULL; } } else if (n_ref_format == REFRTF) { if (print_rtf_end_group(ptr_ref, ptr_ref_len) == NULL) { return NULL; } } else { if (print_elend_x(ptr_ref, ptr_ref_len, "bibliomset", ptr_indent, ns) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item_notes); return NULL; } } item = my_dbi_result_get_string_copy_idx(dbires_ref, NOTESFOLLOWING); if (item && *item && !my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { /* following */ if (sgml_entitize(&item, n_ref_format) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item); free(item_notes); return NULL; } if ((new_ref = mstrcat(*ptr_ref, item, ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item); free(item_notes); return NULL; } else { *ptr_ref = new_ref; } } if (item) { free(item); } } if (item_notes) { free(item_notes); } if (!nhave_content) { (*ptr_ref)[0] = '\0'; } return *ptr_ref; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ format_separator(): formats the separator part of a bibliography entry as a DocBook bibliomixed text char* format_separator returns NULL on error, ptr to ref if ok. ref may be reallocated during the rendering, so it is essential that upon return of this function *ONLY* the returned pointer is used to address the result and *NOT* the original pointer which may be invalid. char* ref ptr to an malloc()'ed string that will receive the output ref will be reallocated if necessary size_t* ptr_ref_len ptr to an int holding the current length of ref. Will be modified if ref is reallocated. struct BIBCONNS* ptr_bibconns ptr to structure with database connections unsigned int separator_id the ID of the separator int n_ref_format REFXX type of output ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* format_separator(char* ref, size_t* ptr_ref_len, struct BIBCONNS* ptr_bibconns, unsigned int n_separator_id, int n_ref_format) { int nhave_content = 0; char *new_ref; char *item; const char* drivername; char sql_command[256]; dbi_result dbires_sep; drivername = dbi_driver_get_name(dbi_conn_get_driver(ptr_bibconns->conn_refdb)); if (!strcmp(my_dbi_conn_get_cap(ptr_bibconns->conn_refdb, "multiple_db"), "t")) { sprintf(sql_command, "SELECT VALUE from %s.SEPARATORS where ID=%u", main_db, n_separator_id); } else { sprintf(sql_command, "SELECT VALUE from SEPARATORS where ID=%u", n_separator_id); } LOG_PRINT(LOG_DEBUG, sql_command); dbires_sep = dbi_conn_query(ptr_bibconns->conn_refdb, sql_command); if (!dbires_sep) { LOG_PRINT(LOG_WARNING, "SEPARATORS select failed"); return NULL; } if (dbi_result_next_row(dbires_sep) == 0) { LOG_PRINT(LOG_WARNING, "SEPARATORS select failed"); dbi_result_free(dbires_sep); return NULL; } item = my_dbi_result_get_string_copy(dbires_sep, "VALUE"); if (item && *item && !my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { nhave_content = 1; if (sgml_entitize(&item, n_ref_format) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(item); dbi_result_free(dbires_sep); return NULL; } if ((new_ref = mstrcat(ref, item, ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); dbi_result_free(dbires_sep); free(item); return NULL; } else { ref = new_ref; } } if (item) { free(item); } dbi_result_free(dbires_sep); /* printf("end separators\n"); */ if (!nhave_content) { ref[0] = '\0'; } return ref; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ format_year(): formats the year part of a pubdate in a bibliography entry static char* format_year returns NULL on error, ptr to ref if ok. ref may be reallocated during the rendering, so it is essential that upon return of this function *ONLY* the returned pointer is used to address the result and *NOT* the original pointer which may be invalid. char* ref ptr to an malloc()'ed string that will receive the output ref will be reallocated if necessary size_t* ptr_ref_len ptr to an int holding the current length of ref. Will be modified if ref is reallocated. unsigned short n_year the publication year const char* yearformat ptr to a string containing the formatting info const char* pad ptr to a string containing the padding info const char* unique_suffix ptr to a string which makes the year unique ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static char* format_year(char* ref, size_t* ptr_ref_len, unsigned short n_year, const char* yearformat, const char* pad, const char* unique_suffix) { char* new_ref; char the_year[32] = ""; char year_string[32]; /* printf("in format_year: year=%s; unique_suffix=%s<<\n", year, unique_suffix); */ /* fflush(stdout); */ sprintf(year_string, "%d", n_year); if (yearformat && strcmp(yearformat, "FOURDIGIT") == 0) { if (strcmp(pad, "YY") == 0) { /* yes I know there will be a Y10k problem... */ strcpy(the_year, "0000"); strcpy(the_year+(4-strlen(year_string)), year_string); } else { strcpy(the_year, year_string); } } else if (yearformat && strcmp(yearformat, "TWODIGIT") == 0) { if (strcmp(pad, "YY") == 0) { if (strlen(year_string) == 1) { strcpy(the_year, "00"); strcpy(the_year+1, year_string); } else { /* take only last two digits */ strncpy(the_year, year_string+strlen(year_string)-2, 2); the_year[2] = '\0'; } } else { if (strlen(year_string) == 1) { strcpy(the_year, year_string); } else { /* take only last two digits */ strncpy(the_year, year_string+strlen(year_string)-2, 2); the_year[2] = '\0'; } } } else if (yearformat && strcmp(yearformat, "ROMANYEAR") == 0) { arabic_to_roman(the_year, year_string); } if (unique_suffix && *unique_suffix) { strcat(the_year, unique_suffix); } if ((new_ref = mstrcat(ref, the_year, ptr_ref_len, 0)) == NULL) { return NULL; } else { ref = new_ref; } /* printf("done with format_year. ref=%s<<\n", ref); */ return ref; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ format_month(): formats the month part of a pubdate in a bibliography entry staticchar* format_month returns NULL on error, ptr to ref if ok. ref may be reallocated during the rendering, so it is essential that upon return of this function *ONLY* the returned pointer is used to address the result and *NOT* the original pointer which may be invalid. char* ref ptr to an malloc()'ed string that will receive the output ref will be reallocated if necessary size_t* ptr_ref_len ptr to an int holding the current length of ref. Will be modified if ref is reallocated. const char* month ptr to a string containing the RIS PY /MM/DD/otherinfo part const char* monthformat ptr to a string containing the formatting info const char* pad ptr to a string containing the padding info dbi_result dbires_cit ptr to a dbi result structure containing the citation style ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static char* format_month(char* ref, size_t* ptr_ref_len, const char* month, const char* monthformat, const char* pad, dbi_result dbires_cit) { char* slash; char* new_ref; char* monthstring; const char* item_full; const char* item_abbrev; const char* item_threelet; dbi_conn conn; char the_month[3]; char fullmonth[12][9] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"}; char threelettermonth[12][4] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; /* ToDo: dunno if the following abbreviations are correct */ char abbrevmonth[12][6] = {"Jan.", "Feb.", "March", "April", "May", "June", "July", "Aug.", "Sept.", "Oct.", "Nov.", "Dec."}; char romanmonth[12][10] = {"I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X", "XI", "XII"}; int i = 0; int month_len; int n_month; char* slashes[3] = {NULL, NULL, NULL}; /* only the first three slashes are relevant, if at all */ conn = dbi_result_get_conn(dbires_cit); slash = strchr(month, (int)'/'); /* fill the slashes array with up to three slashes. Only the first three may be relevant, as the others would be part of the otherinfo string */ while (slash != NULL && i < 3) { slashes[i] = slash; i++; if (*(slash+1)) { slash = strchr(slash+1, (int)'/'); } else { break; } } /* we need at least two slashes to extract the month. This can be a one- or two-digit number. If its longer or shorter, we can't safely handle it */ if (slashes[0] && slashes[1]) { month_len = slashes[1] - slashes[0]; if (month_len == 2) { if (strcmp(pad, "YY") == 0) { the_month[0] = '0'; the_month[1] = *(slashes[0]+1); the_month[2] = '\0'; } else { the_month[0] = *(slashes[0]+1); the_month[1] = '\0'; } } else if (month_len == 3 && *(slashes[0]+1) == '0' && strcmp(pad, "NN") == 0) { the_month[0] = *(slashes[0]+2); the_month[1] = '\0'; } else if (month_len == 3) { strncpy(the_month, slashes[0]+1, 2); the_month[2] = '\0'; } else { /* month was not existent or improperly formatted */ return ref; } /* sanity test */ n_month = atoi(the_month); if (n_month < 1 || n_month > 12) { return ref; } item_full = dbi_result_get_string_idx(dbires_cit, n_month + JANFULL - 1); if (item_full && my_dbi_conn_error_flag(conn)) { item_full = NULL; } item_abbrev = dbi_result_get_string_idx(dbires_cit, n_month + JANABBREV - 1); if (item_abbrev && my_dbi_conn_error_flag(conn)) { item_abbrev = NULL; } item_threelet = dbi_result_get_string_idx(dbires_cit, n_month + JANTHREELET - 1); if (item_threelet && my_dbi_conn_error_flag(conn)) { item_threelet = NULL; } /* do the actual formatting */ /* ptr_cit_row points to the result of a query for citstyle stuff */ if (strcmp(monthformat, "FULL") == 0) { monthstring = (item_full && *item_full) ? (char*)item_full : fullmonth[n_month-1]; if ((new_ref = mstrcat(ref, monthstring, ptr_ref_len, 0)) == NULL) { return NULL; } else { ref = new_ref; } } else if (strcmp(monthformat, "ABBREVDOT") == 0) { monthstring = (item_abbrev && *item_abbrev) ? (char*)item_abbrev : abbrevmonth[n_month-1]; if ((new_ref = mstrcat(ref, monthstring, ptr_ref_len, 0)) == NULL) { return NULL; } else { ref = new_ref; } } else if (strcmp(monthformat, "THREELETTER") == 0) { monthstring = (item_threelet && *item_threelet) ? (char*)item_threelet : threelettermonth[n_month-1]; if ((new_ref = mstrcat(ref, monthstring, ptr_ref_len, 0)) == NULL) { return NULL; } else { ref = new_ref; } } else if (strcmp(monthformat, "ARABICMONTH") == 0) { if ((new_ref = mstrcat(ref, the_month, ptr_ref_len, 0)) == NULL) { return NULL; } else { ref = new_ref; } } else if (strcmp(monthformat, "ROMANMONTH") == 0) { if ((new_ref = mstrcat(ref, romanmonth[n_month-1], ptr_ref_len, 0)) == NULL) { return NULL; } else { ref = new_ref; } } } return ref; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ format_day(): formats the day part of a pubdate in a bibliography entry static char* format_day returns NULL on error, ptr to ref if ok. ref may be reallocated during the rendering, so it is essential that upon return of this function *ONLY* the returned pointer is used to address the result and *NOT* the original pointer which may be invalid. char* ref ptr to an malloc()'ed string that will receive the output ref will be reallocated if necessary size_t* ptr_ref_len ptr to an int holding the current length of ref. Will be modified if ref is reallocated. const char* day ptr to a string containing the RIS PY /MM/DD/otherinfo part const char* dayformat ptr to a string containing the formatting info const char* pad ptr to a string containing the padding info ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static char* format_day(char* ref, size_t* ptr_ref_len, const char* day, const char* dayformat, const char* pad) { char* slash; char* new_ref; char the_day[3]; char romanday[31][7] = {"i", "ii", "iii", "iv", "v", "vi", "vii", "viii", "ix", "x", "xi", "xii", "xiii", "xiv", "xv", "xvi", "xvii", "xviii", "xix", "xx", "xxi", "xxii", "xxiii", "xxiv", "xxv", "xxvi", "xxvii", "xxviii", "xxix", "xxx", "xxxi"}; char* slashes[3] = {NULL, NULL, NULL}; /* only the first three slashes are relevant, if at all */ int i = 0; int day_len; int n_day; slash = strchr(day, (int)'/'); /* fill the slashes array with up to three slashes. Only the first three may be relevant, as the others would be part of the otherinfo string */ while (slash != NULL && i < 3) { slashes[i] = slash; i++; if (*(slash+1)) { slash = strchr(slash+1, (int)'/'); } else { break; } } /* for the day we need the second and third slash. Between them may be a one- or two-digit number. Anything smaller or larger cannot be formatted safely */ if (slashes[1] && slashes[2]) { day_len = slashes[2] - slashes[1]; if (day_len == 2) { if (strcmp(pad, "YY") == 0) { the_day[0] = '0'; the_day[1] = *(slashes[1]+1); the_day[2] = '\0'; } else { the_day[0] = *(slashes[1]+1); the_day[1] = '\0'; } } else if (day_len == 3 && *(slashes[1]+1) == '0' && strcmp(pad, "NN") == 0) { the_day[0] = *(slashes[1]+2); the_day[1] = '\0'; } else if (day_len == 3) { strncpy(the_day, slashes[1]+1, 2); the_day[2] = '\0'; } else { /* day was not existent or improperly formatted */ return ref; } /* sanity test */ n_day = atoi(the_day); if (n_day < 1 || n_day > 31) { return ref; } /* do the actual formatting */ if (strcmp(dayformat, "ARABICDAY") == 0) { if ((new_ref = mstrcat(ref, the_day, ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } else { ref = new_ref; } } else if (strcmp(dayformat, "ROMANDAY") == 0) { if ((new_ref = mstrcat(ref, romanday[n_day-1], ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } else { ref = new_ref; } } } return ref; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ arabic_to_roman(): converts an arabic number between 0 and 3999 (incl) to a roman numeral static char* arabic_to_roman returns the result string (roman) char* roman ptr to a buffer which receives the roman output. The buffer must hold at least 16 chars (incl. '\0') const char* arabic ptr to a buffer containing the arabic number to convert ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static char* arabic_to_roman(char* roman, const char* arabic) { int len; char romandigit[4][3][2] = { {{'I', '\0'}, {'V', '\0'}, {'X', '\0'}}, {{'X', '\0'}, {'L', '\0'}, {'C', '\0'}}, {{'C', '\0'}, {'D', '\0'}, {'M', '\0'}}, {{'M', '\0'}, {'\0', '\0'}, {'\0', '\0'}} }; /* start with a clean string */ *roman = '\0'; /* give up if the number cannot be nicely formatted */ if (atoi(arabic) >= 4000) { return roman; } /* the romandigit array contains 4 sets of strings for the values of 1, 5, and 10 times 1, 10, 100, and 1000. We simply walk through the arabic string from left to right (i.e. 1000s, 100s, 10s, 1s) and assemble the roman string by translating the digit into a series of roman digits, following the usual subtraction and addition rules. The algorithm silently discards all non-numeric characters including minus signs */ /* a good source for the rules for roman numerals can be found at: */ /* http://netdirect.net/~charta/Roman_numerals.html */ while((len = strlen(arabic)) > 0) { switch (*arabic) { case '1': strcat(roman, romandigit[len-1][0]); break; case '2': strcat(roman, romandigit[len-1][0]); strcat(roman, romandigit[len-1][0]); break; case '3': strcat(roman, romandigit[len-1][0]); strcat(roman, romandigit[len-1][0]); strcat(roman, romandigit[len-1][0]); break; case '4': strcat(roman, romandigit[len-1][0]); strcat(roman, romandigit[len-1][1]); break; case '5': strcat(roman, romandigit[len-1][1]); break; case '6': strcat(roman, romandigit[len-1][1]); strcat(roman, romandigit[len-1][0]); break; case '7': strcat(roman, romandigit[len-1][1]); strcat(roman, romandigit[len-1][0]); strcat(roman, romandigit[len-1][0]); break; case '8': strcat(roman, romandigit[len-1][1]); strcat(roman, romandigit[len-1][0]); strcat(roman, romandigit[len-1][0]); strcat(roman, romandigit[len-1][0]); break; case '9': strcat(roman, romandigit[len-1][0]); strcat(roman, romandigit[len-1][2]); break; } arabic++; } return roman; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ normalize_pages(): formats endpage according to the format spec static char* normalize_pages returns the normalized endpage string char* new_endpage ptr to a buffer large enough to receive the modified endpage. Should hold at least 256 chars (incl \0) const char* startpage ptr to a buffer containing the startpage const char* endpage ptr to a buffer containing the original endpage const char* format ptr to a buffer containing the formatting instructions ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static char* normalize_pages(char* new_endpage, const char* startpage, const char* endpage, const char* format) { int n_startpage; int n_endpage; int n_testpage; int i; char my_startpage[256]; char my_endpage[256]; char startpage_leading_slack[256]; char endpage_leading_slack[256]; char endpage_trailing_slack[256]; char* ptr_start_start; char* ptr_end_start; char* ptr_start; char* ptr_end; char* ptr_end_end; if (!startpage || !endpage) { return NULL; } /* ToDo: this algorithm currently drops all non-numeric information in the page strings. This is not good for e.g. Am.J.Physiol. which uses the page numbers to denote the subdivision (e.g. H1223 for a paper in the heart and circulation section). The algorithm should be extended to leave those non-numeric parts alone */ ptr_start_start = strpbrk(startpage, "123456789"); ptr_end_start = strpbrk(endpage, "123456789"); /* if the strings don't contain numbers, we just leave them as they are */ if (!ptr_start_start || !ptr_end_start) { return (char*)endpage; } strncpy(startpage_leading_slack, startpage, ptr_start_start - startpage); startpage_leading_slack[ptr_start_start - startpage] = '\0'; strncpy(endpage_leading_slack, endpage, ptr_end_start - endpage); endpage_leading_slack[ptr_end_start - endpage] = '\0'; /* find the end of the number in the string */ i = 0; while (ptr_end_start[i] != '\0' && isdigit((int)ptr_end_start[i])) { i++; } strcpy(endpage_trailing_slack, &ptr_end_start[i]); /* may be empty string */ /* atoi and then sprintf removes any trailing slack */ n_startpage = atoi(ptr_start_start); if (n_startpage < 0) { return (char*)endpage; /* don't even try any formatting here */ } else { sprintf(my_startpage, "%d", n_startpage); } n_endpage = atoi(ptr_end_start); if (n_endpage < 0) { return (char*)endpage; /* don't try any formatting here */ } else { sprintf(my_endpage, "%d", n_endpage); } /* if the endpage is not fully qualified (i.e. the numeric value is smaller than the value of startpage), we have to expand it. We simply use the cropped startpage string as a template and overwrite whatever part is specified in the cropped endpage string*/ if (n_startpage > n_endpage) { strcpy(new_endpage, my_startpage); strcpy(new_endpage+strlen(my_startpage)-strlen(my_endpage), my_endpage); n_endpage = atoi(new_endpage); /* now we have to correct the endpage string if e.g. start=99, end=3. So far we get 93 which is dead wrong. We need 103 instead */ n_testpage = n_endpage; i = 10; while (n_startpage > n_testpage) { n_testpage = n_endpage + i; i *= 10; } n_endpage = n_testpage; sprintf(new_endpage, "%d", n_endpage); } else { strcpy(new_endpage, my_endpage); } /* if either the startpage or the endpage contained leading slack, we have to add it back here */ if (*endpage_leading_slack) { strcat(endpage_leading_slack, new_endpage); strcpy(new_endpage, endpage_leading_slack); } else if (*startpage_leading_slack) { strcat(startpage_leading_slack, new_endpage); strcpy(new_endpage, startpage_leading_slack); } /* try abbreviating numbers only if there is no leading slack. In the latter case we always use the full format */ if (!(*endpage_leading_slack || *startpage_leading_slack)) { /* this format uses the minimum number of digits necessary to unambiguously denote the endpage */ if (format && strcmp(format, "ABBREV") == 0) { strcpy(my_endpage, new_endpage); ptr_start = my_startpage; ptr_end = my_endpage; /* walk from left to right through startpage and expanded endpage until the digits differ */ while (*ptr_end != '\0') { if (*ptr_start != *ptr_end) { break; } ptr_start++; ptr_end++; } strcpy(new_endpage, ptr_end); } /* this format uses one (1-9) or two digits (> 10) or at least two digits (> 100) to render the endpage */ else if (format && strcmp(format, "TWODIGIT") == 0) { if (strlen(new_endpage) > 2) { strcpy(my_endpage, new_endpage); ptr_start = my_startpage; ptr_end = my_endpage; ptr_end_end = my_endpage + strlen(my_endpage); /* take as many digits as are different between start and end, but take at least two digits */ while (ptr_end_end - ptr_end > 2) { if (*ptr_start != *ptr_end) { break; } ptr_start++; ptr_end++; } strcpy(new_endpage, ptr_end); } /* else: one or two-digit string is still in new_endpage, needs no modification */ } /* ToDo: this format appears odd to me and needs some more research to find out about the rules. A brief web search made me feel it is best to use full citation style here. Only Reference Manager claims that Chicago style is different from full, but the examples given are inconsistent. */ /* else if (format && strcmp(format, "CHICAGO") == 0) { */ /* } */ /* full means the endpage is rendered with at least as many digits as the startpage, nothing gets abbreviated. Nothing to do, expanded endpage is still in new_endpage */ /* if (format && strcmp(format, "FULL") == 0) { */ /* } */ } /* else: with leading slack, assume "FULL" which means nothing to do */ return strcat(new_endpage, endpage_trailing_slack); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ format_authorname(): converts a RIS author into a sequence of DocBook or TEI elements static int format_authorname returns 0 if successful, >0 if failed char** ptr_ref ptr to a ptr to a buffer created with malloc which will receive the output. The calling function must allocate the buffer with at least one byte. This function will reallocate the buffer as needed. *ptr will be updated whenever a realloc is necessary. The calling function is responsible for freeing the memory again. size_t* ptr_ref_len ptr to an int containing the allocated length of res will be updated accordingly if ref is reallocated const AUTHOR_INFO* ptr_ainfo ptr to struct with author name parts const char* authorsep ptr to a buffer containing the separator that should appear right before the current author const char* nameorder ptr to a string containing the name order info const char* initialstyle ptr to a string containing the initials style const char* author_upper ptr to a string containing the upper/lowercase info int nis_intext 1 if we format an in-text citation; 0 if bibliography int type 1=part author 2=publication author 3=series author 4=first available 0=all const char* ns optional namespace prefix struct xmlindent* ptr_indent indentation information int n_ref_format requested output format: REFDOCBK, REFDOCBKX, REFTEIX int* ptr_trailing_dot ptr to an int which will be set to non-zero if the last name part ended with a period ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int format_authorname(char** ptr_ref, size_t* ptr_ref_len, struct AUTHOR_INFO* ptr_ainfo, const char* authorsep, const char* nameorder, const char* initialstyle, const char* author_upper, int nis_intext, int type, const char* ns, struct xmlindent* ptr_indent, int n_ref_format, int* ptr_trailing_dot) { char elname[16]; char attname[16]; char* new_ref; char* entitize_buf; /* buffer for replacing &<> with sgml entities */ /* printf("in format_authorname; author:%s; authorsep:%s; nameorder:%s; initialstyle:%s; author_upper:%s; nis_intext:%d<<\n", author, authorsep, nameorder, initialstyle, author_upper, author_preceeding, author_following, nis_intext); */ if (!ptr_ainfo) { return 234; } /* assemble string */ if (authorsep && *authorsep) { /* have separator string */ if ((entitize_buf = mstrdup((char*)authorsep)) == NULL) { return 801; } if (sgml_entitize(&entitize_buf, n_ref_format) == NULL) { free(entitize_buf); return 801; } if ((new_ref = mstrcat(*ptr_ref, entitize_buf, ptr_ref_len, 0)) == NULL) { free(entitize_buf); return 801; } else { *ptr_ref = new_ref; } free(entitize_buf); } /* set wrapper element and attribute */ switch (n_ref_format) { /* case REFDOCBKX5: */ /* strcpy(elname, "personname"); */ /* strcpy(attname, "role"); */ /* break; */ case REFTEIX5: strcpy(elname, "persName"); strcpy(attname, "type"); break; default: strcpy(elname, "bibliomset"); strcpy(attname, "relation"); break; } if (n_ref_format == REFRTF) { /* todo: does RTF need something here? */ } else { /* wrap bibliomset around the name parts */ switch (type) { case 1: /* fall through */ case 4: if (print_elstart_x(ptr_ref, ptr_ref_len, elname, attname, "author", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0 /* not empty */, ptr_indent, ns) == NULL) { return 801; } break; case 2: if (print_elstart_x(ptr_ref, ptr_ref_len, elname, attname, "editor", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0 /* not empty */, ptr_indent, ns) == NULL) { return 801; } break; case 3: if (print_elstart_x(ptr_ref, ptr_ref_len, elname, attname, "seditor", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0 /* not empty */, ptr_indent, ns) == NULL) { return 801; } break; default: break; } } if (nameorder && strcmp(nameorder, "FIRSTMIDDLELAST") == 0) { if ((new_ref = format_firstmiddlename(ptr_ref, ptr_ref_len, ptr_ainfo, author_upper, initialstyle, nis_intext, type, ns, ptr_indent, n_ref_format, ptr_trailing_dot)) == NULL) { return 801; } else { *ptr_ref = new_ref; } if ((*(ptr_ainfo->firstname) || *(ptr_ainfo->middlename)) && (*(ptr_ainfo->lastname) || *(ptr_ainfo->name))) { if ((new_ref = mstrcat(*ptr_ref, " ", ptr_ref_len, 0)) == NULL) { return 801; } else { *ptr_ref = new_ref; } } if ((new_ref = format_lastname(ptr_ref, ptr_ref_len, *(ptr_ainfo->lastname) ? ptr_ainfo->lastname : ptr_ainfo->name, author_upper, nis_intext, type, ns, ptr_indent, ptr_trailing_dot, n_ref_format)) == NULL) { return 801; } else { *ptr_ref = new_ref; } } else if (nameorder && (strcmp(nameorder, "LASTCOMMAFIRSTMIDDLE") == 0 || strcmp(nameorder, "LASTCOMMASPCFIRSTMIDDLE") == 0)) { char sep[3]; /* quick and dirty strcmp */ if (nameorder[9] == 'F') { strcpy(sep, ","); } else { strcpy(sep, ", "); } if ((new_ref = format_lastname(ptr_ref, ptr_ref_len, *(ptr_ainfo->lastname) ? ptr_ainfo->lastname : ptr_ainfo->name, author_upper, nis_intext, type, ns, ptr_indent, ptr_trailing_dot, n_ref_format)) == NULL) { return 801; } else { *ptr_ref = new_ref; } if ((*(ptr_ainfo->lastname) || *(ptr_ainfo->name)) && (*(ptr_ainfo->firstname) || *ptr_ainfo->middlename)) { if ((new_ref = mstrcat(*ptr_ref, sep, ptr_ref_len, 0)) == NULL) { return 801; } else { *ptr_ref = new_ref; } } if ((new_ref = format_firstmiddlename(ptr_ref, ptr_ref_len, ptr_ainfo, author_upper, initialstyle, nis_intext, type, ns, ptr_indent, n_ref_format, ptr_trailing_dot)) == NULL) { return 801; } else { *ptr_ref = new_ref; } } else if (nameorder && strcmp(nameorder, "LASTFIRSTMIDDLE") == 0) { if ((new_ref = format_lastname(ptr_ref, ptr_ref_len, *(ptr_ainfo->lastname) ? ptr_ainfo->lastname : ptr_ainfo->name, author_upper, nis_intext, type, ns, ptr_indent, ptr_trailing_dot, n_ref_format)) == NULL) { return 801; } else { *ptr_ref = new_ref; } if ((*(ptr_ainfo->lastname) || *(ptr_ainfo->name)) && (*(ptr_ainfo->firstname) || *(ptr_ainfo->middlename))) { if ((new_ref = mstrcat(*ptr_ref, " ", ptr_ref_len, 0)) == NULL) { return 801; } else { *ptr_ref = new_ref; } } if ((new_ref = format_firstmiddlename(ptr_ref, ptr_ref_len, ptr_ainfo, author_upper, initialstyle, nis_intext, type, ns, ptr_indent, n_ref_format, ptr_trailing_dot)) == NULL) { return 801; } else { *ptr_ref = new_ref; } } else if (nameorder && strcmp(nameorder, "LAST") == 0) { if ((new_ref = format_lastname(ptr_ref, ptr_ref_len, *(ptr_ainfo->lastname) ? ptr_ainfo->lastname : ptr_ainfo->name, author_upper, nis_intext, type, ns, ptr_indent, ptr_trailing_dot, n_ref_format)) == NULL) { return 801; } else { *ptr_ref = new_ref; } } if (*(ptr_ainfo->suffix)) { if ((entitize_buf = mstrdup(ptr_ainfo->suffix)) == NULL) { return 801; } if (sgml_entitize(&entitize_buf, n_ref_format) == NULL) { free(entitize_buf); return 801; } if (n_ref_format == REFTEIX5) { if (print_element_x(entitize_buf, ptr_ref, ptr_ref_len, "name", "type", "lineage", NULL, NULL, ptr_indent, ns) == NULL) { free(entitize_buf); return 801; } } else if (n_ref_format == REFRTF) { if (print_rtf_string(entitize_buf, ptr_ref, ptr_ref_len) == NULL) { free(entitize_buf); return 801; } } else if (n_ref_format == REFDOCBKX5) { /* insert a space before the lineage or honorific */ if ((new_ref = mstrcat(*ptr_ref, " ", ptr_ref_len, 0)) == NULL) { free(entitize_buf); return 801; } else { *ptr_ref = new_ref; } if ((new_ref = mstrcat(*ptr_ref, entitize_buf, ptr_ref_len, 0)) == NULL) { free(entitize_buf); return 801; } else { *ptr_ref = new_ref; } } else { if (print_element_x(entitize_buf, ptr_ref, ptr_ref_len, "lineage", NULL, NULL, NULL, NULL, ptr_indent, ns) == NULL) { free(entitize_buf); return 801; } } free(entitize_buf); } if (n_ref_format == REFRTF) { /* todo: does RTF need something here? */ } /* end bibliomset wrap around the name parts */ else if (print_elend_x(ptr_ref, ptr_ref_len, elname, ptr_indent, ns) == NULL) { return 801; } /* printf("done format_authorname\n"); */ return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ format_lastname(): appends a surname as a docbook element to a string static char* format_lastname returns a pointer to the modified string char* format_lastname returns ptr to the buffer if successful, NULL if failed char** ptr_ref ptr to a ptr to a buffer created with malloc which will receive the output. The calling function must allocate the buffer with at least one byte. This function will reallocate the buffer as needed. *ptr will be updated whenever a realloc is necessary. The calling function is responsible for freeing the memory again. size_t* ptr_ref_len ptr to length of *ptr_ref char* lastname ptr to a string containing the lastname const char* author_upper ptr to a string containing the upper/lowercase information int nis_intext 1 if we format an in-text citation; 0 if bibliography int type 1=part author 2=publication author 3=series author 4=first available 0=all const char* ns optional namespace prefix struct xmlindent* ptr_indent indentation information int* ptr_trailing_dot ptr to int which will be set to nonzero if the lastname ended with a period int n_ref_format REFXX output type ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static char* format_lastname(char** ptr_ref, size_t* ptr_ref_len, char* lastname, const char* author_upper, int nis_intext, int type, const char* ns, struct xmlindent* ptr_indent, int* ptr_trailing_dot, int n_ref_format) { char* entitize_buf; /* buffer for replacing &<> with sgml entities */ char* new_ref; if (lastname && *lastname) { /* reset trailing dot indicator */ *ptr_trailing_dot = 0; if (lastname[strlen(lastname)-1] == '.') { *ptr_trailing_dot++; } if (author_upper && (strcmp(author_upper, "LASTNAME") == 0 || strcmp(author_upper, "ALL") == 0)) { strup(lastname); } if ((entitize_buf = mstrdup(lastname)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } if (sgml_entitize(&entitize_buf, n_ref_format) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(entitize_buf); return NULL; } if (n_ref_format == REFDOCBKX5) { if ((new_ref = mstrcat(*ptr_ref, entitize_buf, ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(entitize_buf); return NULL; } else { *ptr_ref = new_ref; } } else if (n_ref_format == REFRTF) { if (print_rtf_string(entitize_buf, ptr_ref, ptr_ref_len) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(entitize_buf); return NULL; } } else { if (print_element_x(entitize_buf, ptr_ref, ptr_ref_len, "surname", NULL, NULL, NULL, NULL, ptr_indent, ns) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(entitize_buf); return NULL; } } } return *ptr_ref; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ format_firstmiddlename(): appends a firstname/middlename combo as a docbook element to a string static char* format_firstmiddlename returns ptr to the buffer if successful, NULL if failed char** ptr_ref ptr to a ptr to a buffer created with malloc which will receive the output. The calling function must allocate the buffer with at least one byte. This function will reallocate the buffer as needed. *ptr will be updated whenever a realloc is necessary. The calling function is responsible for freeing the memory again. size_t* ptr_ref_len ptr to an int containing the allocated length of res will be updated accordingly if ref is reallocated struct AUTHOR_INFO* ptr_ainfo ptr to struct with name parts const char* author_upper ptr to a string containing the upper/lowercase information const char* initialstyle ptr to a string containing the initial style information int nis_intext 1 if we format an in-text citation; 0 if bibliography int type 1=part author 2=publication author 3=series author 4=first available 0=all const char* ns optional namespace prefix struct xmlindent* ptr_indent indentation information int n_ref_format requested output format: REFDOCBK, REFDOCBKX, REFTEIX int* ptr_trailing_dot ptr to int which will be set to nonzero if the last name component ended with a period ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static char* format_firstmiddlename(char** ptr_ref, size_t* ptr_ref_len, struct AUTHOR_INFO* ptr_ainfo, const char* author_upper, const char* initialstyle, int nis_intext, int type, const char* ns, struct xmlindent* ptr_indent, int n_ref_format, int* ptr_trailing_dot) { char* new_ref; char* entitize_buf; /* buffer for replacing &<> with sgml entities */ if (*(ptr_ainfo->firstname)) { /* reset trailing dot indicator */ *ptr_trailing_dot = 0; if (author_upper && strcmp(author_upper, "ALL") == 0) { strup(ptr_ainfo->firstname); } if (n_ref_format == REFTEIX5) { if (print_elstart_x(ptr_ref, ptr_ref_len, "forename", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0 /* not empty */, ptr_indent, ns) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } } else if (n_ref_format == REFRTF) { /* todo: insert RTF stuff */ } else if (n_ref_format != REFDOCBKX5) { if (print_elstart_x(ptr_ref, ptr_ref_len, "firstname", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0 /* not empty */, ptr_indent, ns) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } } if ((entitize_buf = mstrdup(ptr_ainfo->firstname)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } /* see whether we need the initial or the full name */ if (initialstyle && (strcmp(initialstyle, "F.SPCM.") == 0 || strcmp(initialstyle, "F.M.") == 0 || strcmp(initialstyle, "FM") == 0 || strcmp(initialstyle, "FSPCM") == 0)) { if (strlen(entitize_buf) > 0) { *(entitize_buf + 1) = '\0'; } } if (sgml_entitize(&entitize_buf, n_ref_format) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(entitize_buf); return NULL; } if ((new_ref = mstrcat(*ptr_ref, entitize_buf, ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(entitize_buf); return NULL; } else { *ptr_ref = new_ref; } free(entitize_buf); if (initialstyle && (strcmp(initialstyle, "F.SPCM.") == 0 || strcmp(initialstyle, "F.M.") == 0)) { *ptr_trailing_dot = 1; if ((new_ref = mstrcat(*ptr_ref, ".", ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } else { *ptr_ref = new_ref; } } if (n_ref_format == REFTEIX5) { if (print_elend_x(ptr_ref, ptr_ref_len, "forename", ptr_indent, ns) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } } else if (n_ref_format == REFRTF) { /* todo: insert RTF stuff */ } else if (n_ref_format != REFDOCBKX5) { if (print_elend_x(ptr_ref, ptr_ref_len, "firstname", ptr_indent, ns) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } } } if (*(ptr_ainfo->middlename)) { char* item; /* reset trailing dot indicator */ *ptr_trailing_dot = 0; for (item = strtok(ptr_ainfo->middlename, " "); item; item = strtok(NULL, " ")) { if (initialstyle && (strcmp(initialstyle, "F.SPCM.") == 0 || strcmp(initialstyle, "FIRSTSPCMIDDLE") == 0 || strcmp(initialstyle, "FIRSTSPCM.") == 0 || strcmp(initialstyle, "FIRSTSPCM") == 0 || strcmp(initialstyle, "FSPCM") == 0)) { if ((new_ref = mstrcat(*ptr_ref, " ", ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } else { *ptr_ref = new_ref; } } if (n_ref_format == REFTEIX5) { if (print_elstart_x(ptr_ref, ptr_ref_len, "name", "type", "othername", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0 /* not empty */, ptr_indent, ns) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } } else if (n_ref_format == REFRTF) { /* todo: insert RTF stuff */ } else if (n_ref_format != REFDOCBKX5) { if (print_elstart_x(ptr_ref, ptr_ref_len, "othername", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0 /* not empty */, ptr_indent, ns) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } } if ((entitize_buf = mstrdup(item)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } if (author_upper && strcmp(author_upper, "ALL") == 0) { strup(entitize_buf); } /* see whether we need the initial or the full name */ if (initialstyle && (strcmp(initialstyle, "F.SPCM.") == 0 || strcmp(initialstyle, "F.M.") == 0 || strcmp(initialstyle, "FM") == 0 || strcmp(initialstyle, "FIRSTSPCM.") == 0 || strcmp(initialstyle, "FIRSTSPCM") == 0 || strcmp(initialstyle, "FSPCM") == 0)) { if (strlen(entitize_buf) > 0) { *(entitize_buf + 1) = '\0'; } } if (sgml_entitize(&entitize_buf, n_ref_format) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(entitize_buf); return NULL; } if ((new_ref = mstrcat(*ptr_ref, entitize_buf, ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(entitize_buf); return NULL; } else { *ptr_ref = new_ref; } free(entitize_buf); if (initialstyle && (strcmp(initialstyle, "F.SPCM.") == 0 || strcmp(initialstyle, "F.M.") == 0 || strcmp(initialstyle, "FIRSTSPCM.") == 0)) { *ptr_trailing_dot = 1; if ((new_ref = mstrcat(*ptr_ref, ".", ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } else { *ptr_ref = new_ref; } } if (n_ref_format == REFTEIX5) { if (print_elend_x(ptr_ref, ptr_ref_len, "name", ptr_indent, ns) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } } else if (n_ref_format == REFRTF) { /* todo: insert RTF stuff */ } else if (n_ref_format != REFDOCBKX5) { if (print_elend_x(ptr_ref, ptr_ref_len, "othername", ptr_indent, ns) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } } } /* end for */ } /* end if have middlename */ return *ptr_ref; } refdb-1.0.2/src/backend-citationlistx.c000644 001750 001750 00000013420 12255427650 020670 0ustar00markusmarkus000000 000000 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ backend-citationlistx.c defines the citationlistx output backend of refdbd markus@mhoenicka.de 2006-02-19 $Id: backend-citationlistx.c,v 1.1.2.1 2006/02/22 20:50:14 mhoenicka Exp $ 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ #include #include /* for definitions of log message priorities */ #include #include #include "refdb.h" #include "linklist.h" #include "backend.h" #include "backend-citationlistx.h" #include "strfncs.h" #include "refdbd.h" #include "cgi.h" #include "dbfncs.h" #include "connect.h" extern char refdblib[]; /* location of shareable files */ extern int n_log_level; /* numeric version of log_level */ /* forward declaration of local functions */ static char* print_citation(const char* item, struct renderinfo* ptr_rendinfo); /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ prepare_render_citationlistx(): writes a header for the citationlistx output of a query int prepare_render_citationlistx returns 0 if successful, > 0 if failed struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int prepare_render_citationlistx(struct renderinfo* ptr_rendinfo) { char* new_ref; char* header; if ((header = assemble_header(ptr_rendinfo)) == NULL) { return 801; } new_ref = mstrcpy(*(ptr_rendinfo->ptr_ref), header, ptr_rendinfo->ptr_ref_len); free(header); if (new_ref == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "\n", ptr_rendinfo->ptr_ref_len, 0); if (new_ref == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } *(ptr_rendinfo->ptr_ref) = new_ref; return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ finish_render_citationlistx(): writes a footer for the citationlistx output of a query int finish_render_citationlistx returns 0 if successful, > 0 if failed struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int finish_render_citationlistx(struct renderinfo* ptr_rendinfo) { char* new_ref; new_ref = mstrcpy(*(ptr_rendinfo->ptr_ref), "\n\n", ptr_rendinfo->ptr_ref_len); if (new_ref == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } *(ptr_rendinfo->ptr_ref) = new_ref; return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ render_citationlistx() renders a RIS dataset for citationlistx export int render_citationlistx returns 0 if successful,> 0 if failed struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int render_citationlistx(struct renderinfo* ptr_rendinfo) { const char* item; char id[32] = ""; dbi_conn conn; conn = dbi_result_get_conn(ptr_rendinfo->dbires); if (get_refdb_id(ptr_rendinfo->dbires, id) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(234)); return 234; } item = get_refdb_citekey(ptr_rendinfo->dbires); if (item && *item) { if (print_citation(item, ptr_rendinfo) == NULL) { return 801; } } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ print_citation(): writes citationlistx CITATION element char* print_citation returns a ptr to the modified string. Due to reallocation this may be different from the ptr passed to this function in the ptr_rendinfo structure which is also updated accordingly const char* item ptr to the citation key to write struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static char* print_citation(const char* item, struct renderinfo* ptr_rendinfo) { char* new_ref; if (item != NULL) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "ID", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), (char*)item, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "\n", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return NULL; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } return *(ptr_rendinfo->ptr_ref); } refdb-1.0.2/src/backend-rtfbib.c000644 001750 001750 00000220775 12255427651 017260 0ustar00markusmarkus000000 000000 /*++++++++++++++++++++ backend-rtfbib.c: refdb rtf bibliography functions markus@mhoenicka.de 2008-01-27 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, see +++++++++++++++++++++++++*/ #include #include #include #include #include "linklist.h" #include "refdb.h" #include "refdbd.h" #include "backend.h" #include "strfncs.h" #include "dbfncs.h" #include "xmlhelper.h" /* for backend-dbib.h */ #include "backend-dbib.h" #include "backend-rtfbib.h" #include "rtfhelper.h" extern int n_log_level; extern char main_db[]; extern dbi_result dbi_style_res; /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ prepare_render_rtfbib(): writes a header for the rtf output of a bib query int prepare_render_rtfbib returns 0 if ok, >0 if error char** ptr_ref ptr to a ptr to a buffer created with malloc which will receive the output. The calling function must allocate the buffer with at least 4096 byte. This function will reallocate the buffer as needed. *ptr will be updated whenever a realloc is necessary. The calling function is responsible for freeing the memory again. size_t* ptr_ref_len pointer to variable holding current length of ref struct bibinfo* ptr_biblio_info ptr to a structure containing formatting information dbi_conn conn the connection to the refdb database. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int prepare_render_rtfbib(char** ptr_ref, size_t* ptr_ref_len, struct bibinfo* ptr_biblio_info, dbi_conn conn) { char *sql_command = NULL; char *item = NULL; char *new_ref = NULL; char *myjournal = NULL; const char *drivername; const char* db_encoding; dbi_result dbires_cit; /* printf("start prepare_render_rtfbib\n"); */ drivername = dbi_driver_get_name(dbi_conn_get_driver(conn)); myjournal = strdup(ptr_biblio_info->format_string); if (!myjournal) { return 801; } if (dbi_conn_quote_string(conn, &myjournal) == 0) { free(myjournal); return 801; } sql_command = malloc(60+strlen(myjournal)); if (!sql_command) { free(myjournal); return 801; } /* get the database encoding */ if (!*(ptr_biblio_info->encoding)) { db_encoding = dbi_conn_get_encoding(conn); } else { db_encoding = (const char*)ptr_biblio_info->encoding; } /* write header */ if (!print_rtf_header(ptr_ref, ptr_ref_len)) { free(myjournal); free(sql_command); return 801; } if (!strcmp(my_dbi_conn_get_cap(conn, "multiple_db"), "t")) { sprintf(sql_command, "SELECT BIBLIOTITLE FROM %s.CITSTYLE WHERE JOURNAL=%s", main_db, myjournal); } else { sprintf(sql_command, "SELECT BIBLIOTITLE FROM CITSTYLE WHERE JOURNAL=%s", myjournal); } free(myjournal); LOG_PRINT(LOG_DEBUG, sql_command); dbires_cit = dbi_conn_query(conn, sql_command); free(sql_command); if (!dbires_cit || dbi_result_next_row(dbires_cit) == 0) { return 234; } item = my_dbi_result_get_string_copy_idx(dbires_cit, 1); if (item && !my_dbi_conn_error_flag(conn)) { /* as specified in the style */ /* assemble the header */ if ((new_ref = mstrcat(*ptr_ref,"\\sectd\n{\\s26\\sb440\\sa60\\f0\\fs28\\b ", ptr_ref_len, 0)) == NULL) { return 801; } else { *ptr_ref = new_ref; } if ((new_ref = mstrcat(*ptr_ref, item, ptr_ref_len, 0)) == NULL) { return 801; } else { *ptr_ref = new_ref; } if ((new_ref = mstrcat(*ptr_ref, "\\par}\n", ptr_ref_len, 0)) == NULL) { return 801; } else { *ptr_ref = new_ref; } } if (item) { free(item); } /* printf("end prepare_render_dbib\n"); */ return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ finish_render_rtfbib(): writes a footer for the rtf output of a query int finish_render_rtfbib returns 0 successful, >0 if failed char** ptr_ref ptr to a ptr to a buffer created with malloc which will receive the output. The calling function must allocate the buffer with at least 4096 byte. This function will reallocate the buffer as needed. *ptr will be updated whenever a realloc is necessary. The calling function is responsible for freeing the memory again. size_t* ptr_ref_len pointer to variable holding current length of ref struct BIBCONNS* ptr_bibconns ptr to struct with dbi connections struct bibinfo* ptr_biblio_info ptr to struct with additional bibliographic info char* table_name ptr to a string containing the name of the temporary table in refdbvar which holds the info about which IDs to render struct CLIENT_REQUEST ptr_clrequest ptr to structure with client info ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int finish_render_rtfbib(char** ptr_ref, size_t* ptr_ref_len, struct BIBCONNS* ptr_bibconns, struct bibinfo* ptr_biblio_info, char* table_name, struct CLIENT_REQUEST* ptr_clrequest) { char *new_ref; char *sql_command; char *myjournal; char intext_string[] = "INTEXT"; char *item_rangesep; char *my_multi_id = NULL; const char *item_intextseq; const char *item_multi_id; const char *item_entry_id; const char *drivername; const char *author_concat; char *item_preceeding; char *item_following; char *item_citsep; const char *item_dbname; int sql_command_len; int nis_first; int ndo_range = 0; /* if 1, contract ranges of consecutive numeric in-text citations */ int nis_range = 0; /* if 1, the current row is the endpoint of a range */ int n_skip; int n_xrefloop_rowpos; int n_consec; int n_multiple_db = 0; /* if 1, conn allows multiple databases */ int n_is_subseq = 0; int n_currpos; int n_status; short int n_pubyear; short int title_as_author; unsigned long long ncurr_sorted_pos; unsigned long long n_sorted_pos1 = 0; unsigned long long n_citation_pos; unsigned long long n_sorted_pos; unsigned long long n_orig_id; struct lilimem sentinel; /* we need quite a few database queries here */ dbi_result dbires; dbi_result dbires1; dbi_result dbires2; dbi_result dbires3; /* initialize linked lists and stacks */ sentinel.ptr_mem = NULL; sentinel.ptr_next = NULL; sentinel.varname[0] = '\0'; drivername = dbi_driver_get_name(dbi_conn_get_driver(ptr_bibconns->conn_refdb)); sql_command_len = 4096; sql_command = malloc(sql_command_len); if (!sql_command || insert_lilimem(&sentinel, (void**)&sql_command, "sql_command")) { return 801; } myjournal = strdup(ptr_biblio_info->format_string); if (!myjournal || insert_lilimem(&sentinel, (void**)&myjournal, "myjournal")) { delete_all_lilimem(&sentinel); return 801; } if (dbi_conn_quote_string(ptr_bibconns->conn_refdb, &myjournal) == 0) { delete_all_lilimem(&sentinel); return 801; } /* get basic formatting info */ if (!strcmp(my_dbi_conn_get_cap(ptr_bibconns->conn_refdb, "multiple_db"), "t")) { n_multiple_db = 1; sprintf(sql_command, "SELECT ID, CITSEPARATOR, FOLLOWING, PRECEEDING, RANGESEPARATOR, INTEXTSEQUENCE, STYLE from %s.CITSTYLE where JOURNAL=%s", main_db, myjournal); } else { sprintf(sql_command, "SELECT ID, CITSEPARATOR, FOLLOWING, PRECEEDING, RANGESEPARATOR, INTEXTSEQUENCE, STYLE from CITSTYLE where JOURNAL=%s", myjournal); } dbires = dbi_conn_query(ptr_bibconns->conn_refdb, sql_command); LOG_PRINT(LOG_DEBUG, sql_command); if (!dbires || dbi_result_next_row(dbires) == 0) { delete_all_lilimem(&sentinel); return 241; } /* see whether we should contract consecutive numerical citations */ item_rangesep = my_dbi_result_get_string_copy(dbires, "RANGESEPARATOR"); if (item_rangesep && my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { if (item_rangesep) { free(item_rangesep); } item_rangesep = NULL; } if (item_rangesep && insert_lilimem(&sentinel, (void**)&item_rangesep, "item_rangesep")) { delete_all_lilimem(&sentinel); return 801; } if (item_rangesep && sgml_entitize(&item_rangesep, REFRTF) == NULL) { delete_all_lilimem(&sentinel); return 801; } if (item_rangesep && *item_rangesep) { ndo_range = 1; } item_intextseq = dbi_result_get_string(dbires, "INTEXTSEQUENCE"); if (item_intextseq && my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { item_intextseq = NULL; } item_preceeding = my_dbi_result_get_string_copy(dbires, "PRECEEDING"); if (item_preceeding && my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { if (item_preceeding) { free(item_preceeding); } item_preceeding = NULL; } if (item_preceeding && insert_lilimem(&sentinel, (void**)&item_preceeding, "item_preceeding")) { delete_all_lilimem(&sentinel); return 801; } if (item_preceeding && sgml_entitize(&item_preceeding, REFRTF) == NULL) { delete_all_lilimem(&sentinel); return 801; } item_following = my_dbi_result_get_string_copy(dbires, "FOLLOWING"); if (item_following && my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { if (item_following) { free(item_following); } item_following = NULL; } if (item_following && insert_lilimem(&sentinel, (void**)&item_following, "item_following")) { delete_all_lilimem(&sentinel); return 801; } if (item_following && sgml_entitize(&item_following, REFRTF) == NULL) { delete_all_lilimem(&sentinel); return 801; } item_citsep = my_dbi_result_get_string_copy(dbires, "CITSEPARATOR"); if (item_citsep && my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { if (item_citsep) { free(item_citsep); } item_citsep = NULL; } if (item_citsep && insert_lilimem(&sentinel, (void**)&item_citsep, "item_citsep")) { delete_all_lilimem(&sentinel); return 801; } if (item_citsep && sgml_entitize(&item_citsep, REFRTF) == NULL) { delete_all_lilimem(&sentinel); return 801; } /* select all datasets in temp table with an xref_pos == 1. This gives us a list of all citation_pos with multiple citations. Walk through this list and create a bibliomset element for each citation, containing all xrefs of that citation. Use the sorted_pos column for numeric citations */ sprintf(sql_command, "SELECT DISTINCT dbname, orig_id, author_concat, pubyear, article_title, periodical, volume, issue, startpage, entry_id, citation_pos, xref_pos, multi_id, sorted_pos, title_as_author, citekey FROM %s WHERE xref_pos=1 ORDER BY citation_pos", table_name); LOG_PRINT(LOG_DEBUG, sql_command); dbires1 = dbi_conn_query(ptr_bibconns->conn, sql_command); if (!dbires1) { delete_all_lilimem(&sentinel); dbi_result_free(dbires); return 234; } /* if (print_rtf_start_group(ptr_ref, ptr_ref_len) == NULL) { */ /* delete_all_lilimem(&sentinel); */ /* dbi_result_free(dbires); */ /* dbi_result_free(dbires1); */ /* return 801; */ /* } */ /* loop over all citation_pos with more than one xref */ while (dbi_result_next_row(dbires1)) { nis_first = 1; /* reset runonce flag for each cycle */ n_citation_pos = my_dbi_result_get_idval(dbires1, "citation_pos"); /* request all xrefs of this citation and sort them according to the required format */ if (strcmp(item_intextseq, "ASIS") == 0) { sprintf(sql_command, "SELECT DISTINCT dbname, orig_id, author_concat, pubyear, article_title, periodical, volume, issue, startpage, entry_id, citation_pos, xref_pos, multi_id, sorted_pos, year_uni_suffix, title_as_author FROM %s WHERE citation_pos="ULLSPEC" ORDER BY xref_pos", table_name, (unsigned long long)n_citation_pos); } else if (strcmp(item_intextseq, "AUTHORDATE") == 0) { sprintf(sql_command, "SELECT DISTINCT dbname, orig_id, author_concat, pubyear, article_title, periodical, volume, issue, startpage, entry_id, citation_pos, xref_pos, multi_id, sorted_pos, year_uni_suffix, title_as_author FROM %s WHERE citation_pos="ULLSPEC" ORDER BY author_concat, pubyear, periodical, volume, issue, startpage", table_name, (unsigned long long)n_citation_pos); } else if (strcmp(item_intextseq, "CITEKEY") == 0) { sprintf(sql_command, "SELECT DISTINCT dbname, orig_id, author_concat, pubyear, article_title, periodical, volume, issue, startpage, entry_id, citation_pos, xref_pos, multi_id, sorted_pos, year_uni_suffix, title_as_author, citekey FROM %s WHERE citation_pos="ULLSPEC" ORDER BY citekey, author_concat, pubyear, periodical, volume, issue, startpage", table_name, (unsigned long long)n_citation_pos); } else if (strcmp(item_intextseq, "DATEASC") == 0) { sprintf(sql_command, "SELECT DISTINCT dbname, orig_id, author_concat, pubyear, article_title, periodical, volume, issue, startpage, entry_id, citation_pos, xref_pos, multi_id, sorted_pos, year_uni_suffix, title_as_author FROM %s WHERE citation_pos="ULLSPEC" ORDER BY pubyear, author_concat, periodical, volume, issue, startpage", table_name, (unsigned long long)n_citation_pos); } else if (strcmp(item_intextseq, "DATEDESC") == 0) { sprintf(sql_command, "SELECT DISTINCT dbname, orig_id, author_concat, pubyear, article_title, periodical, volume, issue, startpage, entry_id, citation_pos, xref_pos, multi_id, sorted_pos, year_uni_suffix, title_as_author FROM %s WHERE citation_pos="ULLSPEC" ORDER BY pubyear DESC, author_concat, periodical, volume, issue, startpage", table_name, (unsigned long long)n_citation_pos); } LOG_PRINT(LOG_DEBUG, sql_command); dbires2 = dbi_conn_query(ptr_bibconns->conn, sql_command); if (!dbires2) { delete_all_lilimem(&sentinel); dbi_result_free(dbires); dbi_result_free(dbires1); return 234; } n_xrefloop_rowpos = 0; /* now do the real formatting by pulling all xrefs for the current citation*/ while (dbi_result_next_row(dbires2)) { item_multi_id = my_dbi_result_get_string_copy(dbires2, "multi_id"); if (item_multi_id && my_dbi_conn_error_flag(ptr_bibconns->conn)) { item_multi_id = NULL; } else if (item_multi_id && insert_lilimem(&sentinel, (void**)&item_multi_id, "item_multi_id")) { item_multi_id = NULL; } if (!my_multi_id && item_multi_id) { my_multi_id = strdup(item_multi_id); } item_entry_id = my_dbi_result_get_string_copy(dbires2, "entry_id"); if (item_entry_id && my_dbi_conn_error_flag(ptr_bibconns->conn)) { item_entry_id = NULL; } else if (item_entry_id && insert_lilimem(&sentinel, (void**)&item_entry_id, "item_entry_id")) { item_entry_id = NULL; } item_dbname = dbi_result_get_string(dbires2, "dbname"); if (item_dbname && my_dbi_conn_error_flag(ptr_bibconns->conn)) { item_dbname = NULL; } if (!item_multi_id || !item_entry_id || !item_dbname) { delete_all_lilimem(&sentinel); dbi_result_free(dbires); dbi_result_free(dbires1); dbi_result_free(dbires2); return 234; } n_sorted_pos = my_dbi_result_get_idval(dbires2, "sorted_pos"); if (n_sorted_pos == 0 && my_dbi_conn_error_flag(ptr_bibconns->conn)) { delete_all_lilimem(&sentinel); dbi_result_free(dbires); dbi_result_free(dbires1); dbi_result_free(dbires2); return 234; } n_orig_id = my_dbi_result_get_idval(dbires2, "orig_id"); if (n_orig_id == 0 && my_dbi_conn_error_flag(ptr_bibconns->conn)) { delete_all_lilimem(&sentinel); dbi_result_free(dbires); dbi_result_free(dbires1); dbi_result_free(dbires2); return 234; } ptr_biblio_info->year_unique_suffix = dbi_result_get_string(dbires2, "year_uni_suffix"); /* start with the code that appears in front of all xrefs */ if (nis_first) { nis_first = 0; /* run only once */ if (print_rtf_control_word("v", ptr_ref, ptr_ref_len, NOPARAM, 0 /* no group start */) == NULL) { delete_all_lilimem(&sentinel); dbi_result_free(dbires); dbi_result_free(dbires1); dbi_result_free(dbires2); return 801; } if (print_rtf_bmstart(item_multi_id, ptr_ref, ptr_ref_len) == NULL) { delete_all_lilimem(&sentinel); dbi_result_free(dbires); dbi_result_free(dbires1); dbi_result_free(dbires2); return 801; } /* format the citations as the value of the bibliomset element. The in-text citation can retrieve this string with the endterm attribute */ /* preceeding */ if (item_preceeding) { if ((new_ref = mstrcat(*ptr_ref, item_preceeding, ptr_ref_len, 0)) == NULL) { delete_all_lilimem(&sentinel); dbi_result_free(dbires); dbi_result_free(dbires1); dbi_result_free(dbires2); return 234; } else { *ptr_ref = new_ref; } } } else { /* if not first cycle in this loop */ if (nis_range) { /* printf("print range\n"); */ /* range separator */ if ((new_ref = mstrcat(*ptr_ref, item_rangesep, ptr_ref_len, 0)) == NULL) { delete_all_lilimem(&sentinel); dbi_result_free(dbires); dbi_result_free(dbires1); dbi_result_free(dbires2); return 801; } else { *ptr_ref = new_ref; } nis_range = 0; /* reset */ } else if (item_citsep) { /* citation separator */ if ((new_ref = mstrcat(*ptr_ref, item_citsep, ptr_ref_len, 0)) == NULL) { delete_all_lilimem(&sentinel); dbi_result_free(dbires); dbi_result_free(dbires1); dbi_result_free(dbires2); return 801; } else { *ptr_ref = new_ref; } } } /* retrieve dataset */ /* 0 refdb_id ID - (if numeric) 1 refdb_type TY - 2 refdb_pubyear PY - (partial) 3 refdb_startpage SP - 4 refdb_endpage EP - 5 refdb_abstract N2 - 6 refdb_title TI - 7 refdb_volume VL - 8 refdb_issue CP - 9 refdb_booktitle BT - 10 refdb_city CY - 11 refdb_publisher PB - 12 refdb_title_series T3 - 13 refdb_address AD - 14 refdb_issn SN - 15 refdb_periodical_id JO - (indirect) 16 refdb_pyother_info PY - (partial) 17 refdb_secyear Y2 - (partial) 18 refdb_secother_info Y2 - (partial) 19 refdb_user1 U1 - 20 refdb_user2 U2 - 21 refdb_user3 U3 - 22 refdb_user4 U4 - 23 refdb_user5 U5 - 24 refdb_typeofwork .. - 25 refdb_area .. - 26 refdb_ostype .. - 27 refdb_degree .. - 28 refdb_runningtime .. - 29 refdb_classcodeintl .. - 30 refdb_classcodeus .. - 31 refdb_senderemail .. - 32 refdb_recipientemail .. - 33 refdb_mediatype .. - 34 refdb_numvolumes .. - 35 refdb_edition .. - 36 refdb_computer .. - 37 refdb_conferencelocation .. - 38 refdb_registrynum .. - 39 refdb_classification .. - 40 refdb_section .. - 41 refdb_pamphletnum .. - 42 refdb_chapternum .. - 43 refdb_citekey ID - (if non-numeric) */ if (n_multiple_db) { sprintf(sql_command, "SELECT %s.t_refdb.refdb_id, %s.t_refdb.refdb_type, %s.t_refdb.refdb_pubyear, %s.t_refdb.refdb_startpage, %s.t_refdb.refdb_endpage, %s.t_refdb.refdb_abstract, %s.t_refdb.refdb_title, %s.t_refdb.refdb_volume, %s.t_refdb.refdb_issue, %s.t_refdb.refdb_booktitle, %s.t_refdb.refdb_city, %s.t_refdb.refdb_publisher, %s.t_refdb.refdb_title_series, %s.t_refdb.refdb_address, %s.t_refdb.refdb_issn, %s.t_refdb.refdb_periodical_id, %s.t_refdb.refdb_pyother_info, %s.t_refdb.refdb_secyear, %s.t_refdb.refdb_secother_info, %s.t_refdb.refdb_user1, %s.t_refdb.refdb_user2, %s.t_refdb.refdb_user3, %s.t_refdb.refdb_user4, %s.t_refdb.refdb_user5, %s.t_refdb.refdb_typeofwork, %s.t_refdb.refdb_area, %s.t_refdb.refdb_ostype, %s.t_refdb.refdb_degree, %s.t_refdb.refdb_runningtime, %s.t_refdb.refdb_classcodeintl, %s.t_refdb.refdb_classcodeus, %s.t_refdb.refdb_senderemail, %s.t_refdb.refdb_recipientemail, %s.t_refdb.refdb_mediatype, %s.t_refdb.refdb_numvolumes, %s.t_refdb.refdb_edition, %s.t_refdb.refdb_computer, %s.t_refdb.refdb_conferencelocation, %s.t_refdb.refdb_registrynum, %s.t_refdb.refdb_classification, %s.t_refdb.refdb_section, %s.t_refdb.refdb_pamphletnum, %s.t_refdb.refdb_chapternum, %s.t_refdb.refdb_citekey FROM %s.t_refdb WHERE %s.t_refdb.refdb_id="ULLSPEC, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, item_dbname, (unsigned long long)n_orig_id); ptr_bibconns->conn_source = ptr_bibconns->conn; /* make sure */ } else { sprintf(sql_command, "SELECT refdb_id, refdb_type, refdb_pubyear, refdb_startpage, refdb_endpage, refdb_abstract, refdb_title, refdb_volume, refdb_issue, refdb_booktitle, refdb_city, refdb_publisher, refdb_title_series, refdb_address, refdb_issn, refdb_periodical_id, refdb_pyother_info, refdb_secyear, refdb_secother_info, refdb_user1, refdb_user2, refdb_user3, refdb_user4, refdb_user5, refdb_typeofwork, refdb_area, refdb_ostype, refdb_degree, refdb_runningtime, refdb_classcodeintl, refdb_classcodeus, refdb_senderemail, refdb_recipientemail, refdb_mediatype, refdb_numvolumes, refdb_edition, refdb_computer, refdb_conferencelocation, refdb_registrynum, refdb_classification, refdb_section, refdb_pamphletnum, refdb_chapternum, refdb_citekey FROM t_refdb WHERE refdb_id="ULLSPEC, (unsigned long long)n_orig_id); /* need a connection to item_dbname */ ptr_bibconns->conn_source = connect_to_db(ptr_clrequest, item_dbname, 0); if (!ptr_bibconns->conn_source) { delete_all_lilimem(&sentinel); dbi_result_free(dbires); dbi_result_free(dbires1); dbi_result_free(dbires2); return 204; } } LOG_PRINT(LOG_DEBUG, sql_command); dbires3 = dbi_conn_query(ptr_bibconns->conn_source, sql_command); if (!dbires3 || dbi_result_next_row(dbires3) == 0) { delete_all_lilimem(&sentinel); dbi_result_free(dbires); dbi_result_free(dbires1); dbi_result_free(dbires2); return 234; } /* item_entry_id checked for non-NULL above */ ptr_biblio_info->entry_id = item_entry_id; ptr_biblio_info->n_refdb_id = my_dbi_result_get_idval(dbires3, "refdb_id"); author_concat = my_dbi_result_get_string(dbires2, "author_concat"); n_currpos = dbi_result_get_int(dbires2, "sorted_pos"); n_pubyear = dbi_result_get_short(dbires2, "pubyear"); n_is_subseq = check_is_subseq(author_concat, table_name, n_currpos, n_pubyear, ptr_bibconns->conn); if (n_is_subseq == -1) { delete_all_lilimem(&sentinel); dbi_result_free(dbires); dbi_result_free(dbires1); dbi_result_free(dbires2); dbi_result_free(dbires3); return 234; } ptr_biblio_info->is_subseq = n_is_subseq; title_as_author = dbi_result_get_short(dbires2, "title_as_author"); /* if we are supposed to display consecutive sequences of numerical citations as a numerical range, we have to format the first in a possible series and then look ahead if at least two more citations are consecutive (as defined by their sorted order in the bibliography) */ if (ndo_range) { if ((n_status = format_rtf_entry(ptr_ref, ptr_ref_len, intext_string, ptr_bibconns, dbires, dbires3, item_dbname, ptr_clrequest->username, n_sorted_pos, ptr_biblio_info, title_as_author, ptr_clrequest->pdfroot)) != 0) { delete_all_lilimem(&sentinel); dbi_result_free(dbires); dbi_result_free(dbires1); dbi_result_free(dbires2); dbi_result_free(dbires3); return n_status; } ncurr_sorted_pos = n_sorted_pos; n_skip = 0; /* look ahead if this is the start of consecutive numbers */ do { n_consec = dbi_result_next_row(dbires2); if (n_consec != 0) { n_sorted_pos1 = my_dbi_result_get_idval(dbires2, "sorted_pos"); if (my_dbi_conn_error_flag(ptr_bibconns->conn)) { /* ToDo: drop out here? */ LOG_PRINT(LOG_WARNING, "temp table access error: sorted_pos unknown"); } } ncurr_sorted_pos++; n_skip++; } while (n_consec != 0 && n_sorted_pos1 == ncurr_sorted_pos); /* several possibilities: */ /* n_skip == 1: either no more entries or not a consecutive number */ /* n_skip == 2: two consecutive numbers, third one does not exist or is not consecutive */ /* n_skip > 2: at least three consecutive numbers */ /* either no consecutive numbers or only two. Two numbers are not displayed as a range */ if (n_skip < 3) { /* no n_xrefloop_rowpos correction here, as it will be incremented by one anyway at the end of the loop */ dbi_result_seek_row(dbires2, n_xrefloop_rowpos + 1); } /* at least three consecutive numbers. The next reference to be formatted is the last one of the range. Adjust n_xrefloop_rowpos accordingly */ else { dbi_result_seek_row(dbires2, n_xrefloop_rowpos + n_skip - 1); /* this will be incremented by one later */ n_xrefloop_rowpos += n_skip - 2; nis_range = 1; } } /* don't use ranges. We have to format each entry */ else { if ((n_status = format_rtf_entry(ptr_ref, ptr_ref_len, intext_string, ptr_bibconns, dbires, dbires3, item_dbname, ptr_clrequest->username, n_sorted_pos, ptr_biblio_info, title_as_author, ptr_clrequest->pdfroot)) != 0) { delete_all_lilimem(&sentinel); dbi_result_free(dbires); dbi_result_free(dbires1); dbi_result_free(dbires2); dbi_result_free(dbires3); return n_status; } } /* end if use ranges */ dbi_result_free(dbires3); n_xrefloop_rowpos++; delete_lilimem(&sentinel, "item_entry_id"); delete_lilimem(&sentinel, "item_multi_id"); if (!n_multiple_db) { dbi_conn_close(ptr_bibconns->conn_source); ptr_bibconns->conn_source = NULL; } } /* end loop over all xrefs of this citation */ /* following */ if (item_following) { if ((new_ref = mstrcat(*ptr_ref, item_following, ptr_ref_len, 0)) == NULL) { delete_all_lilimem(&sentinel); dbi_result_free(dbires); dbi_result_free(dbires1); dbi_result_free(dbires2); return 801; } else { *ptr_ref = new_ref; } } if (print_rtf_bmend(my_multi_id, ptr_ref, ptr_ref_len) == NULL) { delete_all_lilimem(&sentinel); dbi_result_free(dbires); dbi_result_free(dbires1); dbi_result_free(dbires2); return 801; } free(my_multi_id); my_multi_id = NULL; if (print_rtf_control_word("v", ptr_ref, ptr_ref_len, 0, 0 /* no group start */) == NULL) { delete_all_lilimem(&sentinel); dbi_result_free(dbires); dbi_result_free(dbires1); dbi_result_free(dbires2); return 801; } if (print_rtf_control_word("par", ptr_ref, ptr_ref_len, NOPARAM, 0 /* no group start */) == NULL) { delete_all_lilimem(&sentinel); dbi_result_free(dbires); dbi_result_free(dbires1); dbi_result_free(dbires2); return 801; } dbi_result_free(dbires2); } /* end loop over all citations */ dbi_result_free(dbires); dbi_result_free(dbires1); delete_all_lilimem(&sentinel); /* if (print_rtf_end_group(ptr_ref, ptr_ref_len) == NULL) { */ /* return 801; */ /* } */ if ((new_ref = mstrcat(*ptr_ref, "}\n", ptr_ref_len, 0)) == NULL) { return 801; } else { *ptr_ref = new_ref; } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ render_rtfbib() renders a RIS dataset for RTF bibliography int render_rtfbib returns 0 if successful, >0 if failed char** ptr_ref ptr to a ptr to a buffer created with malloc which will receive the output. The calling function must allocate the buffer with at least 4096 byte. This function will reallocate the buffer as needed. *ptr will be updated whenever a realloc is necessary. The calling function is responsible for freeing the memory again. size_t* ptr_ref_len pointer to a variable holding the current size of ref. Will be updated accordingly. struct BIBCONNS* ptr_bibconns ptr to structure with database connections dbi_result dbires pointer to a dbi result structure holding the RIS dataset const char* database ptr to a string with the database name of the current query struct bibinfo* ptr_biblio_info ptr to struct with additional bibliographic info char* username ptr to string with the current username char* pdfroot ptr to string with the root path for PDF offprints int nref_counter counter for datasets, used for numeric citation style and if the bibliography needs to be numbered short title_as_author if yes, the reference has no authors and the style wants the title to be printed instead ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int render_rtfbib(char** ptr_ref, size_t* ptr_ref_len, struct BIBCONNS* ptr_bibconns, dbi_result dbires, const char* database, struct bibinfo* ptr_biblio_info, char* username, char* pdfroot, int nref_counter, short title_as_author) { int i; /* the tried-and-true counter */ int sql_command_len; int n_status; char *sql_command; /* buffer for assembling SQL queries */ char *refdb_type; char *myjournal; char *item_preceeding; char *item_following; char *new_ref; const char *drivername; char bmset_buffer[256] = ""; char format_spec[5][12] = {"INTEXT", "INTEXTS", "AUTHORONLY", "AUTHORONLYS", "YEARONLY"}; char bibliomset_endstring[6][5] = {"-X", "-S", "-A", "-Q", "-Y"}; dbi_result dbires_cit; struct lilimem sentinel; sentinel.ptr_mem = NULL; sentinel.ptr_next = NULL; sentinel.varname[0] = '\0'; /* printf("now in render_rtfbib for %s with title_as_author=%hd\n", ptr_biblio_info->entry_id, title_as_author); */ drivername = dbi_driver_get_name(dbi_conn_get_driver(ptr_bibconns->conn_refdb)); /* get memory for sql command buffer */ sql_command_len = 1024; sql_command = malloc(sql_command_len); if (!sql_command || insert_lilimem(&sentinel, (void**)&sql_command, "sql_command")) { return 801; } /* ToDo: check for string overflow */ myjournal = strdup(ptr_biblio_info->format_string); if (!myjournal || insert_lilimem(&sentinel, (void**)&myjournal, "myjournal")) { delete_all_lilimem(&sentinel); return 801; } if (dbi_conn_quote_string(ptr_bibconns->conn_refdb, &myjournal) == 0) { delete_all_lilimem(&sentinel); return 801; } /* retrieve basic information about the bibliography style from CITSTYLE into ptr_result */ if (!strcmp(my_dbi_conn_get_cap(ptr_bibconns->conn_refdb, "multiple_db"), "t")) { sprintf(sql_command, "SELECT ID, CITSEPARATOR, FOLLOWING, PRECEEDING, RANGESEPARATOR, INTEXTSEQUENCE, STYLE, JANFULL, FEBFULL, MARFULL, APRFULL, MAYFULL, JUNFULL, JULFULL, AUGFULL, SEPFULL, OCTFULL, NOVFULL, DECFULL, JANABBREV, FEBABBREV, MARABBREV, APRABBREV, MAYABBREV, JUNABBREV, JULABBREV, AUGABBREV, SEPABBREV, OCTABBREV, NOVABBREV, DECABBREV, JANTHREELET, FEBTHREELET, MARTHREELET, APRTHREELET, MAYTHREELET, JUNTHREELET, JULTHREELET, AUGTHREELET, SEPTHREELET, OCTTHREELET, NOVTHREELET, DECTHREELET from %s.CITSTYLE where JOURNAL=%s", main_db, myjournal); } else { sprintf(sql_command, "SELECT ID, CITSEPARATOR, FOLLOWING, PRECEEDING, RANGESEPARATOR, INTEXTSEQUENCE, STYLE, JANFULL, FEBFULL, MARFULL, APRFULL, MAYFULL, JUNFULL, JULFULL, AUGFULL, SEPFULL, OCTFULL, NOVFULL, DECFULL, JANABBREV, FEBABBREV, MARABBREV, APRABBREV, MAYABBREV, JUNABBREV, JULABBREV, AUGABBREV, SEPABBREV, OCTABBREV, NOVABBREV, DECABBREV, JANTHREELET, FEBTHREELET, MARTHREELET, APRTHREELET, MAYTHREELET, JUNTHREELET, JULTHREELET, AUGTHREELET, SEPTHREELET, OCTTHREELET, NOVTHREELET, DECTHREELET from CITSTYLE where JOURNAL=%s", myjournal); } LOG_PRINT(LOG_DEBUG, sql_command); dbires_cit = dbi_conn_query(ptr_bibconns->conn_refdb, sql_command); if (!dbires_cit || dbi_result_next_row(dbires_cit) == 0) { delete_all_lilimem(&sentinel); return 234; } item_preceeding = my_dbi_result_get_string_copy(dbires_cit, "PRECEEDING"); if (item_preceeding && my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { if (item_preceeding) { free(item_preceeding); } item_preceeding = NULL; } if (item_preceeding && insert_lilimem(&sentinel, (void**)&item_preceeding, "item_preceeding")) { delete_all_lilimem(&sentinel); return 801; } item_following = my_dbi_result_get_string_copy(dbires_cit, "FOLLOWING"); if (item_following && my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) { if (item_following) { free(item_following); } item_following = NULL; } if (item_following && insert_lilimem(&sentinel, (void**)&item_following, "item_following")) { delete_all_lilimem(&sentinel); return 801; } /* find out reference type */ refdb_type = (char*)get_refdb_type(dbires); if (!refdb_type) { delete_all_lilimem(&sentinel); dbi_result_free(dbires_cit); return 244; } /* this loop creates a couple of bibliomset elements which can be targeted from the RTF document by link elements. They provide: - id="IDxyz:X": contains the standard in-text citation - id="IDxyz:S": contains the in-text citation for subsequent citations - id="IDxyz:A": contains the standard author-only in-text citation - id="IDxyz:Q": contains the author-only in-text citation (subsequent) - id="IDxyz:Y": contains the year-only in-text citation */ /* printf("here intext contents start for %s\n", ptr_biblio_info->entry_id); */ for (i = 0; i < 5; i++) { sprintf(bmset_buffer, "%s%s", ptr_biblio_info->entry_id, bibliomset_endstring[i]); if (print_rtf_control_word("v", ptr_ref, ptr_ref_len, NOPARAM, 0) == NULL) { delete_all_lilimem(&sentinel); dbi_result_free(dbires_cit); return 801; } if (print_rtf_bmstart(bmset_buffer, ptr_ref, ptr_ref_len) == NULL) { delete_all_lilimem(&sentinel); dbi_result_free(dbires_cit); return 801; } if (i < 2 || i > 3) { /* all but the author-onlies */ if (item_preceeding && *item_preceeding) { /* CITSTYLE PRECEEDING */ if (print_rtf_string(item_preceeding, ptr_ref, ptr_ref_len) == NULL) { delete_all_lilimem(&sentinel); dbi_result_free(dbires_cit); return 801; } } } if ((n_status = format_rtf_entry(ptr_ref, ptr_ref_len, format_spec[i], ptr_bibconns, dbires_cit, dbires, database, username, nref_counter, ptr_biblio_info, title_as_author, pdfroot)) != 0) { dbi_result_free(dbires_cit); delete_all_lilimem(&sentinel); return n_status; } if (i < 2 || i > 3) { if (item_following && *(item_following)) { /* CITSTYLE FOLLOWING */ if (print_rtf_string(item_following, ptr_ref, ptr_ref_len) == NULL) { dbi_result_free(dbires_cit); delete_all_lilimem(&sentinel); return 801; } } } if (print_rtf_bmend(bmset_buffer, ptr_ref, ptr_ref_len) == NULL) { delete_all_lilimem(&sentinel); dbi_result_free(dbires_cit); return 801; } if (print_rtf_control_word("v", ptr_ref, ptr_ref_len, 0, 0) == NULL) { delete_all_lilimem(&sentinel); dbi_result_free(dbires_cit); return 801; } if (print_rtf_control_word("par", ptr_ref, ptr_ref_len, NOPARAM, 0) == NULL) { delete_all_lilimem(&sentinel); dbi_result_free(dbires_cit); return 801; } } /* end for */ /* printf("here the real bibliography contents start for %s\n", ptr_biblio_info->entry_id); */ /* here the real bibliography contents start */ sprintf(bmset_buffer, "%s-b", ptr_biblio_info->entry_id); if (print_rtf_start_group(ptr_ref, ptr_ref_len) == NULL) { delete_all_lilimem(&sentinel); dbi_result_free(dbires_cit); return 801; } if ((new_ref = mstrcat(*ptr_ref, "\\pard\\plain\\s29\\f1\\fs24\\lang1033", ptr_ref_len, 0)) == NULL) { delete_all_lilimem(&sentinel); dbi_result_free(dbires_cit); return 801; } else { *ptr_ref = new_ref; } if (print_rtf_bmstart(bmset_buffer, ptr_ref, ptr_ref_len) == NULL) { delete_all_lilimem(&sentinel); dbi_result_free(dbires_cit); return 801; } if ((n_status = format_rtf_entry(ptr_ref, ptr_ref_len, refdb_type, ptr_bibconns, dbires_cit, dbires, database, username, nref_counter,ptr_biblio_info, title_as_author, pdfroot)) != 0) { /* format bibliography entry body according to PUBTYPE */ dbi_result_free(dbires_cit); delete_all_lilimem(&sentinel); return n_status; } if (print_rtf_bmend(bmset_buffer, ptr_ref, ptr_ref_len) == NULL) { delete_all_lilimem(&sentinel); dbi_result_free(dbires_cit); return 801; } if (print_rtf_end_group(ptr_ref, ptr_ref_len) == NULL) { delete_all_lilimem(&sentinel); dbi_result_free(dbires_cit); return 801; } if (print_rtf_control_word("par", ptr_ref, ptr_ref_len, NOPARAM, 0) == NULL) { delete_all_lilimem(&sentinel); dbi_result_free(dbires_cit); return 801; } dbi_result_free(dbires_cit); delete_all_lilimem(&sentinel); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ format_rtf_entry(): formats a bibliography entry as RTF int format_rtf_entry returns 0 if successful, >0 if failed char** ptr_ref ptr to a ptr to a buffer created with malloc which will receive the output. The calling function must allocate the buffer with at least one byte. This function will reallocate the buffer as needed. *ptr will be updated whenever a realloc is necessary. The calling function is responsible for freeing the memory again. size_t* ptr_ref_len ptr to an int holding the current length of ref. Will be modified if ref is reallocated. char* pubtype ptr to a string containing the pubtype to format struct BIBCONNS* ptr_bibconns ptr to structure with database connections dbi_result dbires_cit ptr to a dbi result structure containing the current citation style info dbi_result dbires ptr to a dbi result structure containing the current reference. If this is NULL, only the authorlist will be formatted using the database and ID info in biblio_info const char* database ptr to string containing the current reference database const char* username ptr to string containing the current user int nref_counter number of reference (to be displayed in bibliography) struct bibinfo* ptr_biblio_info ptr to struct with additional bibliographic info short title_as_author if > 0, the reference has no authors and the style wants the title to be printed instead const char* pdfroot optional path prefix for file:// links ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int format_rtf_entry(char** ptr_ref, size_t* ptr_ref_len, char* pubtype, struct BIBCONNS* ptr_bibconns, dbi_result dbires_cit, dbi_result dbires, const char* database, const char* username, int nref_counter, struct bibinfo* ptr_biblio_info, short title_as_author, const char* pdfroot) { int error = 0; size_t nref_buffer_len; int n_intext = 0; /* 0 = bibliography, 1 = intext, 2 = intext subseq */ int n_status; int errflag; unsigned int n_id; unsigned int n_refstyle_id; unsigned int n_separator_id; short my_title_as_author; char *new_ref; char *ref_buffer; char *new_ref_buffer; char *sql_command; const char *alternatetext; const char *item_type; const char *drivername; dbi_result dbires_pos; dbi_result dbires_ref; /* printf("format_entry(): title_as_author went to %d<<\n", title_as_author); */ drivername = dbi_driver_get_name(dbi_conn_get_driver(ptr_bibconns->conn_refdb)); /* get memory for sql command buffer */ sql_command = malloc(8192); if (!sql_command) { return 801; } /* get memory for the buffer */ nref_buffer_len = 1024; ref_buffer = malloc(nref_buffer_len); if (!ref_buffer) { free(sql_command); return 801; } ref_buffer[0] = '\0'; /* terminate */ /* printf("pubtype went to:%s\n", pubtype); */ if (!strcmp(pubtype, "INTEXTS")) { pubtype[6] = '\0'; n_intext = 2; } else if (!strcmp(pubtype, "INTEXT")) { n_intext = 1; } else if (!strcmp(pubtype, "AUTHORONLYS")) { pubtype[10] = '\0'; n_intext = 2; } else if (!strcmp(pubtype, "AUTHORONLY")) { n_intext = 1; } else if (!strcmp(pubtype, "YEARONLY")) { n_intext = 1; } n_id = my_dbi_result_get_int_idval(dbires_cit, "ID"); if ((dbires_ref = load_style(pubtype, n_id, ptr_bibconns->conn_refdb)) == NULL) { free(sql_command); free(ref_buffer); return 241; } if (title_as_author) { if (!strcmp(pubtype, "BOOK")) { my_title_as_author = 2; } else if (!strcmp(pubtype, "NEWS")) { alternatetext = my_dbi_result_get_string_idx(dbires_ref, AUTHORLISTALTERNATETEXT); if (alternatetext && !strcmp(alternatetext, "JOURNALNAME")) { my_title_as_author = 5; } else { my_title_as_author = 1; } } else { my_title_as_author = 1; } } else { my_title_as_author = 0; } /* only need authorlist (used for finding citations with same author/year) */ if (!dbires) { if ((n_status = format_authorlist(ptr_ref, ptr_ref_len, ptr_bibconns, dbires, dbi_style_res, 4 /* first available */, database, 1, ptr_biblio_info, my_title_as_author, NULL, NULL, REFRTF)) != 0) { error = 1; } else { /* *ptr_ref = new_ref; */ } free(sql_command); free(ref_buffer); unload_style(); return n_status; } n_refstyle_id = my_dbi_result_get_int_idval(dbi_style_res, "ID"); if ((errflag = my_dbi_conn_error_flag(ptr_bibconns->conn_refdb)) != 0) { free(sql_command); free(ref_buffer); unload_style(); return 241; } if (!strcmp(my_dbi_conn_get_cap(ptr_bibconns->conn_refdb, "multiple_db"), "t")) { sprintf(sql_command, "SELECT TYPE, SEPARATORID, POS FROM %s.POSITIONS WHERE REFSTYLEID=%u ORDER BY POS ASC", main_db, n_refstyle_id); } else { sprintf(sql_command, "SELECT TYPE, SEPARATORID, POS FROM POSITIONS WHERE REFSTYLEID=%u ORDER BY POS ASC", n_refstyle_id); } LOG_PRINT(LOG_DEBUG, sql_command); dbires_pos = dbi_conn_query(ptr_bibconns->conn_refdb, sql_command); if (!dbires_pos) { dbi_result_free(dbires_pos); unload_style(); free(sql_command); free(ref_buffer); return 241; } /* walk through all positions and format the elements */ while (dbi_result_next_row(dbires_pos)) { item_type = dbi_result_get_string(dbires_pos, "TYPE"); /* n_separator_id = my_dbi_result_get_idval(dbi_style_res, "SEPARATORID"); */ n_separator_id = dbi_result_get_uint(dbires_pos, "SEPARATORID"); if (!item_type || !*item_type) { continue; } /* printf("in format_entry loop, item_type=%s; pubtype=%s<<\nref so far:%s<<\n", item_type, pubtype, *ptr_ref); */ /* the following code uses a buffer to format the bits and pieces. this buffer will only be appended to the result string if the bits and pieces are not empty. */ /*---------------------------------------------------------------*/ if (strcmp(item_type, "REFNUMBER") == 0) { /* if (!nformat_spec) { */ if ((new_ref_buffer = format_refnumber(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, nref_counter, n_intext, NULL, NULL, REFRTF)) == NULL) { error = 805; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "CITEKEY") == 0) { /* if (!nformat_spec) { */ if ((new_ref_buffer = format_citekey(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, NULL, NULL, REFRTF)) == NULL) { error = 805; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ /* part author list */ else if (strcmp(item_type, "AUTHORLIST") == 0) { if ((n_status = format_authorlist(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, 1 /* part authors */, database, n_intext, ptr_biblio_info, title_as_author, NULL, NULL, REFRTF)) != 0) { error = n_status; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ /* publication author list */ else if (strcmp(item_type, "EDITORLIST") == 0) { if ((n_status = format_authorlist(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, 2 /* publication authors */, database, n_intext, ptr_biblio_info, 0 /* never use title */, NULL, NULL, REFRTF)) != 0) { error = n_status; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ /* set author list */ else if (strcmp(item_type, "SEDITORLIST") == 0) { if ((n_status = format_authorlist(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, 3 /* set authors */, database, n_intext, ptr_biblio_info, 0 /* never use title */, NULL, NULL, REFRTF)) != 0) { error = n_status; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "ALLALIST") == 0) { if ((n_status = format_authorlist(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, 4 /* first available */, database, n_intext, ptr_biblio_info, 0 /* never use title */, NULL, NULL, REFRTF)) != 0) { error = n_status; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "PUBDATE") == 0) { if ((new_ref_buffer = format_pubdate(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, dbires_cit, 0, n_intext, ptr_biblio_info->year_unique_suffix, NULL, NULL, REFRTF)) == NULL) { error = 809; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "PUBDATESEC") == 0) { if ((new_ref_buffer = format_pubdate(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, dbires_cit, 1, n_intext, NULL, NULL, NULL, REFRTF)) == NULL) { error = 810; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "TITLE") == 0 && my_title_as_author != 1) { if ((new_ref_buffer = format_title(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, 1, n_intext, 0 /* not title as author */, NULL, NULL, REFRTF)) == NULL) { error = 811; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "BOOKTITLE") == 0 && my_title_as_author != 2) { if ((new_ref_buffer = format_title(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, 2, n_intext, 0 /* not title as author */, NULL, NULL, REFRTF)) == NULL) { error = 812; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "SERIESTITLE") == 0 && my_title_as_author != 3) { if ((new_ref_buffer = format_title(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, 3, n_intext, 0 /* not title as author */, NULL, NULL, REFRTF)) == NULL) { error = 813; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "ALLTITLE") == 0) { /* if (!n_intext) { */ if ((new_ref_buffer = format_title(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, 4, n_intext, 0 /* not title as author */, NULL, NULL, REFRTF)) == NULL) { error = 813; break; } ref_buffer = new_ref_buffer; if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "JOURNALNAME") == 0 && my_title_as_author != 5) { /* printf("my_title_as_author went to %d\n", my_title_as_author); */ if ((new_ref_buffer = format_journalname(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, database, n_intext, NULL, NULL, REFRTF, 0 /* not title as author */)) == NULL) { error = 814; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "VOLUME") == 0) { if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_VOLUME, VOLUMEPRECEEDING, VOLUMEFOLLOWING, "volumenum", NULL, NULL, REFRTF)) == NULL) { error = 815; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "ISSUE") == 0) { if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_ISSUE, ISSUEPRECEEDING, ISSUEFOLLOWING, "issuenum", NULL, NULL, REFRTF)) == NULL) { error = 816; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "PAGES") == 0) { if ((new_ref_buffer = format_pages(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, NULL, NULL, REFRTF)) == NULL) { error = 817; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "PUBLISHER") == 0) { if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_PUBLISHER, PUBLISHERPRECEEDING, PUBLISHERFOLLOWING, "publishername", NULL, NULL, REFRTF)) == NULL) { error = 818; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "PUBPLACE") == 0) { if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_CITY, PUBPLACEPRECEEDING, PUBPLACEFOLLOWING, "city", NULL, NULL, REFRTF)) == NULL) { error = 819; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "SERIAL") == 0) { char elname[16]; if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_ISSN, SERIALPRECEEDING, SERIALFOLLOWING, elname, NULL, NULL, REFRTF)) == NULL) { error = 820; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "ADDRESS") == 0) { if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_ADDRESS, ADDRESSPRECEEDING, ADDRESSFOLLOWING, "address", NULL, NULL, REFRTF)) == NULL) { error = 821; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strncmp(item_type, "USERDEF", 7) == 0) { if (item_type[7] == '1') { if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_USER1, USERDEF1PRECEEDING, USERDEF1FOLLOWING, "userdef1", NULL, NULL, REFRTF)) == NULL) { error = 823; break; } } else if (item_type[7] == '2') { if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_USER2, USERDEF2PRECEEDING, USERDEF2FOLLOWING, "userdef2", NULL, NULL, REFRTF)) == NULL) { error = 824; break; } } else if (item_type[7] == '3') { if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_USER3, USERDEF3PRECEEDING, USERDEF3FOLLOWING, "userdef3", NULL, NULL, REFRTF)) == NULL) { error = 825; break; } } else if (item_type[7] == '4') { if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_USER4, USERDEF4PRECEEDING, USERDEF4FOLLOWING, "userdef4", NULL, NULL, REFRTF)) == NULL) { error = 826; break; } } else if (item_type[7] == '5') { if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_USER5, USERDEF5PRECEEDING, USERDEF5FOLLOWING, "userdef5", NULL, NULL, REFRTF)) == NULL) { error = 827; break; } } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strncmp(item_type, "LINK", 4) == 0) { if (item_type[4] == '0') { if ((new_ref_buffer = format_ulink(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, 0 /*LINK0*/, n_intext, LINK0PRECEEDING, LINK0FOLLOWING, NULL, NULL, REFRTF, pdfroot)) == NULL) { error = 831; break; } } else if (item_type[4] == '1') { if ((new_ref_buffer = format_ulink(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, 1 /*LINK1*/, n_intext, LINK1PRECEEDING, LINK1FOLLOWING, NULL, NULL, REFRTF, pdfroot)) == NULL) { error = 831; break; } } else if (item_type[4] == '2') { if ((new_ref_buffer = format_ulink(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, 2 /*LINK2*/, n_intext, LINK2PRECEEDING, LINK2FOLLOWING, NULL, NULL, REFRTF, pdfroot)) == NULL) { error = 832; break; } } else if (item_type[4] == '3') { if ((new_ref_buffer = format_ulink(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, 3 /*LINK3*/, n_intext, LINK3PRECEEDING, LINK3FOLLOWING, NULL, NULL, REFRTF, pdfroot)) == NULL) { error = 833; break; } } else if (item_type[4] == '4') { if ((new_ref_buffer = format_ulink(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, 4 /*LINK4*/, n_intext, LINK4PRECEEDING, LINK4FOLLOWING, NULL, NULL, REFRTF, pdfroot)) == NULL) { error = 834; break; } } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "ABSTRACT") == 0) { if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_ABSTRACT, ABSTRACTPRECEEDING, ABSTRACTFOLLOWING, "abstract", NULL, NULL, REFRTF)) == NULL) { error = 835; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "TYPEOFWORK") == 0) { if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_TYPEOFWORK, TYPEOFWORKPRECEEDING, TYPEOFWORKFOLLOWING, "typeofwork", NULL, NULL, REFRTF)) == NULL) { error = 835; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "AREA") == 0) { if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_AREA, AREAPRECEEDING, AREAFOLLOWING, "area", NULL, NULL, REFRTF)) == NULL) { error = 835; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "OSTYPE") == 0) { if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_OSTYPE, OSTYPEPRECEEDING, OSTYPEFOLLOWING, "ostype", NULL, NULL, REFRTF)) == NULL) { error = 835; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "DEGREE") == 0) { if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_DEGREE, DEGREEPRECEEDING, DEGREEFOLLOWING, "degree", NULL, NULL, REFRTF)) == NULL) { error = 835; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "RUNNINGTIME") == 0) { if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_RUNNINGTIME, RUNNINGTIMEPRECEEDING, RUNNINGTIMEFOLLOWING, "runningtime", NULL, NULL, REFRTF)) == NULL) { error = 835; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "CLASSCODEINTL") == 0) { if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_CLASSCODEINTL, CLASSCODEINTLPRECEEDING, CLASSCODEINTLFOLLOWING, "classcodeintl", NULL, NULL, REFRTF)) == NULL) { error = 835; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "CLASSCODEUS") == 0) { if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_CLASSCODEUS, CLASSCODEUSPRECEEDING, CLASSCODEUSFOLLOWING, "classcodeus", NULL, NULL, REFRTF)) == NULL) { error = 835; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "SENDEREMAIL") == 0) { if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_SENDEREMAIL, SENDEREMAILPRECEEDING, SENDEREMAILFOLLOWING, "senderemail", NULL, NULL, REFRTF)) == NULL) { error = 835; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "RECIPIENTEMAIL") == 0) { if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_RECIPIENTEMAIL, RECIPIENTEMAILPRECEEDING, RECIPIENTEMAILFOLLOWING, "recipientemail", NULL, NULL, REFRTF)) == NULL) { error = 835; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "MEDIATYPE") == 0) { if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_MEDIATYPE, MEDIATYPEPRECEEDING, MEDIATYPEFOLLOWING, "mediatype", NULL, NULL, REFRTF)) == NULL) { error = 835; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "NUMVOLUMES") == 0) { if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_NUMVOLUMES, NUMVOLUMESPRECEEDING, NUMVOLUMESFOLLOWING, "numvolumes", NULL, NULL, REFRTF)) == NULL) { error = 835; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "EDITION") == 0) { if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_EDITION, EDITIONPRECEEDING, EDITIONFOLLOWING, "edition", NULL, NULL, REFRTF)) == NULL) { error = 835; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "COMPUTER") == 0) { if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_COMPUTER, COMPUTERPRECEEDING, COMPUTERFOLLOWING, "computer", NULL, NULL, REFRTF)) == NULL) { error = 835; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "CONFERENCELOCATION") == 0) { if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_CONFERENCELOCATION, CONFERENCELOCATIONPRECEEDING, CONFERENCELOCATIONFOLLOWING, "conferencelocation", NULL, NULL, REFRTF)) == NULL) { error = 835; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "REGISTRYNUM") == 0) { if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_REGISTRYNUM, REGISTRYNUMPRECEEDING, REGISTRYNUMFOLLOWING, "registrynum", NULL, NULL, REFRTF)) == NULL) { error = 835; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "CLASSIFICATION") == 0) { if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_CLASSIFICATION, CLASSIFICATIONPRECEEDING, CLASSIFICATIONFOLLOWING, "classification", NULL, NULL, REFRTF)) == NULL) { error = 835; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "SECTION") == 0) { if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_SECTION, SECTIONPRECEEDING, SECTIONFOLLOWING, "section", NULL, NULL, REFRTF)) == NULL) { error = 835; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "PAMPHLETNUM") == 0) { if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_PAMPHLETNUM, PAMPHLETNUMPRECEEDING, PAMPHLETNUMFOLLOWING, "pamphletnum", NULL, NULL, REFRTF)) == NULL) { error = 835; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "CHAPTERNUM") == 0) { if ((new_ref_buffer = format_simple(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, n_intext, REFDB_CHAPTERNUM, CHAPTERNUMPRECEEDING, CHAPTERNUMFOLLOWING, "chapternum", NULL, NULL, REFRTF)) == NULL) { error = 835; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "NOTES") == 0) { if ((new_ref_buffer = format_notes(&ref_buffer, &nref_buffer_len, ptr_bibconns, dbires, dbi_style_res, username, NULL, NULL, REFRTF)) == NULL) { error = 836; break; } if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } /*---------------------------------------------------------------*/ else if (strcmp(item_type, "SEPARATOR") == 0) { if ((new_ref_buffer = format_separator(ref_buffer, &nref_buffer_len, ptr_bibconns, n_separator_id, REFRTF)) == NULL) { error = 837; break; } ref_buffer = new_ref_buffer; if (ref_buffer[0]) { if ((new_ref = mstrcat(*ptr_ref, ref_buffer, ptr_ref_len, 0)) == NULL) { error = 801; break; } *ptr_ref = new_ref; } ref_buffer[0] = '\0'; } } /* end while */ dbi_result_free(dbires_pos); unload_style(); free(sql_command); free(ref_buffer); return error; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ print_rtf_format(): writes a RTF formatting sequence to a string char* print_rtf_format returns a pointer to the modified string, or NULL in case of an error char** ptr_buffer ptr to a ptr to a buffer created with malloc which will receive the output. This function will reallocate the buffer as needed. *ptr will be updated whenever a realloc is necessary. The calling function is responsible for freeing the memory again. size_t* ptr_buflen pointer to variable holding current length of ref const char* name name of the item to style. This name corresponds to a part of the column name in the style table dbi_result dbires_ref style data query result int start_group if nonzero, starts a group before the formatting sequence ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* print_rtf_format(char** ptr_buffer, size_t* ptr_buflen, const char* name, dbi_result dbires_ref, int start_group) { const char* style; char column[64]; /* safety check */ if (!dbires_ref || !name || !*name) { return NULL; } if (start_group) { if (print_rtf_start_group(ptr_buffer, ptr_buflen) == NULL) { return NULL; } } /* retrieve the style information */ snprintf(column, 64, "%sSTYLE", name); style = dbi_result_get_string(dbires_ref, column); if (style && *style) { if (strstr(style, "BOLD")) { if (print_rtf_control_word("b", ptr_buffer, ptr_buflen, NOPARAM, 0) == NULL) { return NULL; } } if (strstr(style, "IT")) { if (print_rtf_control_word("i", ptr_buffer, ptr_buflen, NOPARAM, 0) == NULL) { return NULL; } } if (strstr(style, "ULINE")) { if (print_rtf_control_word("ul", ptr_buffer, ptr_buflen, NOPARAM, 0) == NULL) { return NULL; } } if (!strcmp(style, "SUPER")) { if (print_rtf_control_word("super", ptr_buffer, ptr_buflen, NOPARAM, 0) == NULL) { return NULL; } } if (!strcmp(style, "SUB")) { if (print_rtf_control_word("sub", ptr_buffer, ptr_buflen, NOPARAM, 0) == NULL) { return NULL; } } } /* assemble the formatting sequence */ return *ptr_buffer; } refdb-1.0.2/src/xmlhandler.c000755 001750 001750 00000251507 12255427652 016562 0ustar00markusmarkus000000 000000 /* xmlhandler.c: functions to write bibliography style sets to a database */ /* markus@mhoenicka.de 12-29-00 */ /* $Id: xmlhandler.c,v 1.22.2.25 2006/02/22 21:02:45 mhoenicka Exp $ */ /* 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ /* ToDo: figure out a way to handle out of memory situations properly while parsing a style set. It is not yet proven that the current implementation frees all memory that has been allocated prior to the memory error */ /* Overview */ /* This set of functions parses a XML file containing bibliography style sets according to the CiteStyle DTD. We use expat as a non-validating XML parser. We register three handlers for start tags, character data, and end tags. The elements are pushed on a stack in the start tags handler. Each structure defining an element contains a start element of another stack for the attributes of this element. These stacks are used in the character data handler and the end tag handler to retrieve parent and ancestor elements and attributes of the current element where necessary. The attribute stack of the current element is freed in the end tag handler and the current element is popped off the stack as well. */ #include #include #include #include /* header of the XML parser */ #include /* priority levels of log messages */ #include #include "backend.h" #include "linklist.h" #include "refdb.h" #include "refdbd.h" /* depends on backend.h */ #include "xmlhandler.h" #include "strfncs.h" #include "connect.h" #include "dbfncs.h" #ifndef HAVE_ATOLL long long atoll(const char *str); #endif #ifndef HAVE_STRTOLL long long strtoll(const char *nptr, char **endptr, int base); #endif extern int n_log_level; extern char main_db[]; /* forward declarations of local functions */ static char* concat_elnames(struct elstack* ptr_current_element, char* exclude_name, char* concat); static char* get_ancestor_attr(struct elstack* ptr_current_element, char* ancestor_name, char* ancestor_attribute); static int set_alternatetext(dbi_result dbires, char** ptr_aempty); /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ start_handler(): handler for start tags (handling citestyle data) void start_handler has no return value void* ptr_data this is a ptr to "non-global" global data that all handlers share - will be cast to type struct addstyle_data* const char *el ptr to a string containing the element name const char** ptr_attr ptr to an array of attributes (name-value pairs) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ void start_handler(void *ptr_data, const char *el, const char **ptr_attr) { int i; char sql_command[256]; const char *drivername; /* name of the libdbi driver */ struct elstack* ptr_el_new; struct attrlist* ptr_attr_new; struct addstyle_data* ptr_asdata; dbi_result dbires; /* printf("el:attr0:attr1:%s:%s:%s<<\n", el, attr[0], attr[1]); */ ptr_asdata = (struct addstyle_data*)ptr_data; drivername = dbi_driver_get_name(dbi_conn_get_driver(ptr_asdata->conn)); if (strcmp(el, "STYLESET") == 0) { (*(ptr_asdata->ptr_depth_adjust))++; } else if (!*(ptr_asdata->ptr_ndb_error) && !*(ptr_asdata->ptr_nmem_error)) { if (strcmp(el, "CITESTYLE") == 0) { /* create new entry in database */ dbires = dbi_conn_query(ptr_asdata->conn, "INSERT INTO CITSTYLE (JOURNAL) VALUES (\'DUMMY\')"); LOG_PRINT(LOG_DEBUG, "INSERT INTO CITSTYLE (JOURNAL) VALUES (\'DUMMY\')"); if (!dbires) { (*(ptr_asdata->ptr_ndb_error))++; LOG_PRINT(LOG_WARNING, "error in sql command"); return; } else { if (!strcmp(my_dbi_conn_get_cap(ptr_asdata->conn, "named_seq"), "f")) { *(ptr_asdata->ptr_citstyle_id) = dbi_conn_sequence_last(ptr_asdata->conn, NULL); } else { *(ptr_asdata->ptr_citstyle_id) = dbi_conn_sequence_last(ptr_asdata->conn, "citstyle_id_seq"); } dbi_result_free(dbires); } } else if (strcmp(el, "PUBTYPE") == 0 || strcmp(el, "INTEXTDEF") == 0 || strcmp(el, "AUTHORONLY") == 0 || strcmp(el, "YEARONLY") == 0) { /* reset counter */ *(ptr_asdata->ptr_position) = 0; sprintf(sql_command, "INSERT INTO REFSTYLE (CITSTYLEID, PUBTYPE) VALUES (%u"", '", *(ptr_asdata->ptr_citstyle_id)); if (strcmp(el, "PUBTYPE") == 0) { /* create new entry in database. PUBTYPE has only one attribute TYPE, the value of which is therefore in attr[1], if at all */ /* NB ptr_attr == NULL is not permitted by the DTD but we better check */ if (ptr_attr && ptr_attr[1] && *(ptr_attr[1])) { strcat(sql_command, ptr_attr[1]); } else { strcat(sql_command, "GEN"); /* default as per DTD */ } } else if (strcmp(el, "INTEXTDEF") == 0) { /* create new entry in database. INTEXTDEF is treated like a PUBTYPE element with the attribute INTEXT */ strcat(sql_command, "INTEXT"); } else if (strcmp(el, "AUTHORONLY") == 0) { /* create new entry in database. AUTHORONLY is treated like a PUBTYPE element with the attribute AUTHORONLY */ strcat(sql_command, "AUTHORONLY"); } else { /* yearonly */ /* create new entry in database. YEARONLY is treated like a PUBTYPE element with the attribute YEARONLY */ strcat(sql_command, "YEARONLY"); } strcat(sql_command, "\')"); /* printf("%s\n", sql_command); */ dbires = dbi_conn_query(ptr_asdata->conn, sql_command); LOG_PRINT(LOG_DEBUG, sql_command); if (!dbires) { (*(ptr_asdata->ptr_ndb_error))++; LOG_PRINT(LOG_WARNING, "error in sql command"); } else { if (!strcmp(my_dbi_conn_get_cap(ptr_asdata->conn, "named_seq"), "f")) { *(ptr_asdata->ptr_refstyle_id) = dbi_conn_sequence_last(ptr_asdata->conn, NULL); } else { *(ptr_asdata->ptr_refstyle_id) = dbi_conn_sequence_last(ptr_asdata->conn, "refstyle_id_seq"); } dbi_result_free(dbires); } } else if (strcmp(el, "SEPARATOR") == 0) { sprintf(sql_command, "INSERT INTO SEPARATORS (VALUE) VALUES ('Dummy')"); dbires = dbi_conn_query(ptr_asdata->conn, sql_command); LOG_PRINT(LOG_DEBUG, sql_command); if (!dbires) { (*(ptr_asdata->ptr_ndb_error))++; LOG_PRINT(LOG_WARNING, "error in sql command"); } else { if (!strcmp(my_dbi_conn_get_cap(ptr_asdata->conn, "named_seq"), "f")) { *(ptr_asdata->ptr_separator_id) = dbi_conn_sequence_last(ptr_asdata->conn, NULL); } else { *(ptr_asdata->ptr_separator_id) = dbi_conn_sequence_last(ptr_asdata->conn, "separators_id_seq"); } dbi_result_free(dbires); } } } /* printf("add to stack\n"); */ /* add current element to element stack */ ptr_el_new = malloc(sizeof(struct elstack)); if (ptr_el_new == NULL) { (*(ptr_asdata->ptr_nmem_error))++; } else { /* printf("have memory\n"); */ strncpy(ptr_el_new->elname, el, 63); ptr_el_new->elname[63] = '\0'; /* terminate just in case */ ptr_el_new->n_elvalue_len = ELVALUE_LENGTH; ptr_el_new->ptr_elvalue = malloc(ELVALUE_LENGTH); if (ptr_el_new->ptr_elvalue == NULL) { (*(ptr_asdata->ptr_nmem_error))++; } else { *(ptr_el_new->ptr_elvalue) = '\0'; } ptr_el_new->ptr_next = ptr_asdata->ptr_first; ptr_el_new->ptr_attr_first = NULL; ptr_asdata->ptr_first = ptr_el_new; /* printf("%s", ptr_first->elname); */ /* add current attributes to the element */ /* printf("add attributes\n"); */ for (i = 0; ptr_attr[i]; i += 2) { ptr_attr_new = malloc(sizeof(struct attrlist)); if (ptr_attr_new == NULL) { (*(ptr_asdata->ptr_nmem_error))++; break; } strncpy(ptr_attr_new->attribute_name, ptr_attr[i], 63); ptr_attr_new->attribute_name[63] = '\0'; strncpy(ptr_attr_new->attribute_value, ptr_attr[i+1], 63); ptr_attr_new->attribute_value[63] = '\0'; ptr_attr_new->ptr_next = (ptr_asdata->ptr_first)->ptr_attr_first; (ptr_asdata->ptr_first)->ptr_attr_first = ptr_attr_new; /* printf(" %s='%s'", attr[i], attr[i + 1]); */ } /* printf("done adding attributes\n"); */ (*(ptr_asdata->ptr_depth))++; } } /* End of start_handler */ /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ end_handler(): handler for end tags (handling citestyle data) void end_handler has no return value void* ptr_data this is a ptr to "non-global" global data that all handlers share - will be cast to type struct addstyle_data* const char *el ptr to a string containing the element name ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ void end_handler(void *ptr_data, const char *el) { int n_chardata = 0; int n_attrdata = 0; int ignore_role = 0; unsigned int current_id = 0; unsigned int n_id; char column_name[65]; char table_name[65]; char column_name_attribute[65]; char pubtype[32]; char sql_command[512]; char concat[65]; char* ptr_attr = NULL; char* new_msg; struct elstack* ptr_el_remove; struct attrlist* ptr_attr_remove; struct addstyle_data* ptr_asdata; dbi_result dbires; ptr_asdata = (struct addstyle_data*)ptr_data; (*(ptr_asdata->ptr_depth))--; pubtype[0] = '\0'; column_name[0] = '\0'; table_name[0] = '\0'; if (!*(ptr_asdata->ptr_ndb_error) && !*(ptr_asdata->ptr_nmem_error)) { /* printf("start of end tag handler:%s depth: %d depth_adjust: %d\n", el, *(ptr_asdata->ptr_depth), *(ptr_asdata->ptr_depth_adjust)); */ /* we have to update POSXY for these elements */ if (strcmp((ptr_asdata->ptr_first)->elname, "SEPARATOR") == 0) { /* encode the id of the separator in the value of the POSXY field */ sprintf(sql_command, "INSERT INTO POSITIONS (POS,TYPE,SEPARATORID,REFSTYLEID) VALUES (%d,'SEPARATOR',%u,%u)", *(ptr_asdata->ptr_position), *(ptr_asdata->ptr_separator_id), *(ptr_asdata->ptr_refstyle_id)); dbires = dbi_conn_query(ptr_asdata->conn, sql_command); LOG_PRINT(LOG_DEBUG, sql_command); if (!dbires) { (*(ptr_asdata->ptr_ndb_error))++; LOG_PRINT(LOG_WARNING, "error in sql command"); } else { /* increment position */ (*(ptr_asdata->ptr_position))++; dbi_result_free(dbires); } } /* simple elements in REFTYPE, INTEXTDEF, AUTHORONLY, or YEARONLY */ else if (strcmp((ptr_asdata->ptr_first)->elname, "REFNUMBER") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "CITEKEY") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "JOURNALNAME") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "VOLUME") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "ISSUE") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "PAGES") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "PUBLISHER") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "PUBPLACE") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "SERIAL") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "ADDRESS") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "NOTES") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "ABSTRACT") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "TYPEOFWORK") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "AREA") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "OSTYPE") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "DEGREE") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "RUNNINGTIME") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "CLASSCODEINTL") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "CLASSCODEUS") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "SENDEREMAIL") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "RECIPIENTEMAIL") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "MEDIATYPE") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "NUMVOLUMES") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "EDITION") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "COMPUTER") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "CONFERENCELOCATION") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "REGISTRYNUM") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "CLASSIFICATION") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "SECTION") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "PAMPHLETNUM") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "CHAPTERNUM") == 0 ) { /* write element name in POSITIONS */ sprintf(sql_command, "INSERT INTO POSITIONS (POS,TYPE,SEPARATORID,REFSTYLEID) VALUES (%d, '%s', 0, %u)", *(ptr_asdata->ptr_position), (ptr_asdata->ptr_first)->elname, *(ptr_asdata->ptr_refstyle_id)); dbires = dbi_conn_query(ptr_asdata->conn, sql_command); LOG_PRINT(LOG_DEBUG, sql_command); if (!dbires) { (*(ptr_asdata->ptr_ndb_error))++; LOG_PRINT(LOG_WARNING, "error in sql command"); } else { /* increment position */ (*(ptr_asdata->ptr_position))++; dbi_result_free(dbires); } } /* AUTHORLIST, PUBDATE, TITLE, USERDEF, MISC, LINK need special care as the actual column name in the database depends on the ROLE attribute */ /* first authorlist */ else if (strcmp((ptr_asdata->ptr_first)->elname, "AUTHORLIST") == 0) { ptr_attr = get_attr(ptr_asdata->ptr_first, "ROLE"); if (!ptr_attr || strcmp(ptr_attr, "PART") == 0) { strcpy(concat, "AUTHORLIST"); } else if (strcmp(ptr_attr, "PUB") == 0) { strcpy(concat, "EDITORLIST"); } else if (strcmp(ptr_attr, "SERIES") == 0) { strcpy(concat, "SEDITORLIST"); } else if (strcmp(ptr_attr, "ALL") == 0) { strcpy(concat, "ALLALIST"); } /* write element name in POSITIONS */ sprintf(sql_command, "INSERT INTO POSITIONS (POS,TYPE,SEPARATORID,REFSTYLEID) VALUES (%d, '%s', 0, %u)", *(ptr_asdata->ptr_position), concat, *(ptr_asdata->ptr_refstyle_id)); dbires = dbi_conn_query(ptr_asdata->conn, sql_command); LOG_PRINT(LOG_DEBUG, sql_command); if (!dbires) { (*(ptr_asdata->ptr_ndb_error))++; LOG_PRINT(LOG_WARNING, "error in sql command"); } else { /* increment position */ (*(ptr_asdata->ptr_position))++; dbi_result_free(dbires); } } /* second pubdate */ else if (strcmp((ptr_asdata->ptr_first)->elname, "PUBDATE") == 0) { ptr_attr = get_attr(ptr_asdata->ptr_first, "ROLE"); if (!ptr_attr || strcmp(ptr_attr, "PRIMARY") == 0) { strcpy(concat, "PUBDATE"); } else if (strcmp(ptr_attr, "SECONDARY") == 0) { strcpy(concat, "PUBDATESEC"); } else if (strcmp(ptr_attr, "ALL") == 0) { strcpy(concat, "PUBDATEALL"); } /* write element name in POSITIONS */ sprintf(sql_command, "INSERT INTO POSITIONS (POS,TYPE,SEPARATORID,REFSTYLEID) VALUES (%d, '%s', 0, %u)", *(ptr_asdata->ptr_position), concat, *(ptr_asdata->ptr_refstyle_id)); dbires = dbi_conn_query(ptr_asdata->conn, sql_command); LOG_PRINT(LOG_DEBUG, sql_command); if (!dbires) { (*(ptr_asdata->ptr_ndb_error))++; LOG_PRINT(LOG_WARNING, "error in sql command"); } else { /* increment position */ (*(ptr_asdata->ptr_position))++; dbi_result_free(dbires); } } /* third title */ else if (strcmp((ptr_asdata->ptr_first)->elname, "TITLE") == 0) { ptr_attr = get_attr(ptr_asdata->ptr_first, "ROLE"); if (!ptr_attr || strcmp(ptr_attr, "PART") == 0) { strcpy(concat, "TITLE"); } else if (strcmp(ptr_attr, "PUB") == 0) { strcpy(concat, "BOOKTITLE"); } else if (strcmp(ptr_attr, "SERIES") == 0) { strcpy(concat, "SERIESTITLE"); } else if (strcmp(ptr_attr, "ALL") == 0) { strcpy(concat, "ALLTITLE"); } /* write element name in POSITIONS */ sprintf(sql_command, "INSERT INTO POSITIONS (POS,TYPE,SEPARATORID,REFSTYLEID) VALUES (%d, '%s', 0, %u)", *(ptr_asdata->ptr_position), concat, *(ptr_asdata->ptr_refstyle_id)); dbires = dbi_conn_query(ptr_asdata->conn, sql_command); LOG_PRINT(LOG_DEBUG, sql_command); if (!dbires) { (*(ptr_asdata->ptr_ndb_error))++; LOG_PRINT(LOG_WARNING, "error in sql command"); } else { /* increment position */ (*(ptr_asdata->ptr_position))++; dbi_result_free(dbires); } } else if (strcmp((ptr_asdata->ptr_first)->elname, "USERDEF") == 0) { ptr_attr = get_attr(ptr_asdata->ptr_first, "ROLE"); if (!ptr_attr || strcmp(ptr_attr, "1") == 0) { strcpy(concat, "USERDEF1"); } else if (strcmp(ptr_attr, "2") == 0) { strcpy(concat, "USERDEF2"); } else if (strcmp(ptr_attr, "3") == 0) { strcpy(concat, "USERDEF3"); } else if (strcmp(ptr_attr, "4") == 0) { strcpy(concat, "USERDEF4"); } else if (strcmp(ptr_attr, "5") == 0) { strcpy(concat, "USERDEF5"); } /* write element name in POSITIONS */ sprintf(sql_command, "INSERT INTO POSITIONS (POS,TYPE,SEPARATORID,REFSTYLEID) VALUES (%d, '%s', 0, %u)", *(ptr_asdata->ptr_position), concat, *(ptr_asdata->ptr_refstyle_id)); dbires = dbi_conn_query(ptr_asdata->conn, sql_command); LOG_PRINT(LOG_DEBUG, sql_command); if (!dbires) { (*(ptr_asdata->ptr_ndb_error))++; LOG_PRINT(LOG_WARNING, "error in sql command"); } else { /* increment position */ (*(ptr_asdata->ptr_position))++; dbi_result_free(dbires); } } else if (strcmp((ptr_asdata->ptr_first)->elname, "LINK") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "URL") == 0) { if (*((ptr_asdata->ptr_first)->elname) == 'L') { ptr_attr = get_attr(ptr_asdata->ptr_first, "ROLE"); } if (*((ptr_asdata->ptr_first)->elname) == 'U' || ptr_attr == NULL /* 0 is implied default */ || strcmp(ptr_attr, "0") == 0) { strcpy(concat, "LINK0"); } else if (strcmp(ptr_attr, "1") == 0) { strcpy(concat, "LINK1"); } else if (strcmp(ptr_attr, "2") == 0) { strcpy(concat, "LINK2"); } else if (strcmp(ptr_attr, "3") == 0) { strcpy(concat, "LINK3"); } else if (strcmp(ptr_attr, "4") == 0) { strcpy(concat, "LINK4"); } /* write element name in POSITIONS */ sprintf(sql_command, "INSERT INTO POSITIONS (POS,TYPE,SEPARATORID,REFSTYLEID) VALUES (%d, '%s', 0, %u)", *(ptr_asdata->ptr_position), concat, *(ptr_asdata->ptr_refstyle_id)); dbires = dbi_conn_query(ptr_asdata->conn, sql_command); LOG_PRINT(LOG_DEBUG, sql_command); if (!dbires) { (*(ptr_asdata->ptr_ndb_error))++; LOG_PRINT(LOG_WARNING, "error in sql command"); } else { /* increment position */ (*(ptr_asdata->ptr_position))++; dbi_result_free(dbires); } } /* set ignore_role to 1 for those elements that treat the ROLE attribute in a special way (the attribute is used to translate the element name to a different column name than expected) */ if (strcmp((ptr_asdata->ptr_first)->elname, "AUTHORLIST") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "PUBDATE") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "TITLE") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "LINK") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "USERDEF") == 0) { ignore_role = 1; } /* the name of the style and related style info */ if (strcmp((ptr_asdata->ptr_first)->elname, "STYLENAME") == 0) { char* the_item_q = NULL; if ((the_item_q = strdup((ptr_asdata->ptr_first)->ptr_elvalue)) == NULL) { (*(ptr_asdata->ptr_nmem_error))++; LOG_PRINT(LOG_CRIT, get_status_msg(801)); } else { if (dbi_conn_quote_string(ptr_asdata->conn, &the_item_q) == 0) { (*(ptr_asdata->ptr_nmem_error))++; LOG_PRINT(LOG_CRIT, get_status_msg(801)); } } if (the_item_q) { strncpy(ptr_asdata->the_journal, the_item_q, 255); ptr_asdata->the_journal[255] = '\0'; free(the_item_q); } else { ptr_asdata->the_journal[0] = '\0'; } strcpy(column_name, "JOURNAL"); strcpy(table_name, "CITSTYLE"); n_chardata = 1; current_id = *(ptr_asdata->ptr_citstyle_id); } if (strcmp((ptr_asdata->ptr_first)->elname, "AUTHOR") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "COMMENT") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "URL") == 0) { strcpy(column_name, (ptr_asdata->ptr_first)->elname); strcpy(table_name, "CITSTYLE"); n_chardata = 1; current_id = *(ptr_asdata->ptr_citstyle_id); } /* elements with character data in PUBTYPE, INTEXT, AUTHORONLY, or YEARONLY */ else if (strcmp((ptr_asdata->ptr_first)->elname, "ABBREVIATEFIRST") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "ABBREVIATESUBSEQ") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "AEMPTY") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "ASAME") == 0) { /* assemble column name */ if (!strcmp(((ptr_asdata->ptr_first)->ptr_next)->elname, "AUTHORLIST")) { /* check role attribute of ancestor */ ptr_attr = get_ancestor_attr(ptr_asdata->ptr_first, "AUTHORLIST", "ROLE"); if (ptr_attr && strcmp(ptr_attr, "PART") == 0) { strcpy(column_name, "Q"); /* AUTHORLIST */ } else if (ptr_attr && strcmp(ptr_attr, "SERIES") == 0) { strcpy(column_name, "Y"); /* SEDITORLIST */ } else if (ptr_attr && strcmp(ptr_attr, "ALL") == 0) { strcpy(column_name, "Z"); /* ALLALIST */ } else { /* DTD uses this as default */ strcpy(column_name, "X"); /* EDITORLIST */ } } else { strcpy(column_name, ((ptr_asdata->ptr_first)->ptr_next)->elname); } strcat(column_name, (ptr_asdata->ptr_first)->elname); /* we expect char data and attr data */ n_chardata = 1; n_attrdata = 1; current_id = *(ptr_asdata->ptr_citstyle_id); strcpy(table_name, "REFSTYLE"); if (is_descendant_of(ptr_asdata->ptr_first, "PUBTYPE")) { strcpy(pubtype, get_ancestor_attr(ptr_asdata->ptr_first, "PUBTYPE", "TYPE")); } else if (is_descendant_of(ptr_asdata->ptr_first, "INTEXTDEF")) { strcpy(pubtype, "INTEXT"); } else if (is_descendant_of(ptr_asdata->ptr_first, "AUTHORONLY")) { strcpy(pubtype, "AUTHORONLY"); } else { /* yearonly */ strcpy(pubtype, "YEARONLY"); } } /* elements with character data in CITSTYLE */ else if (strcmp((ptr_asdata->ptr_first)->elname, "CITSEPARATOR") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "BIBLIOTITLE") == 0) { strcpy(table_name, "CITSTYLE"); strcpy(column_name, (ptr_asdata->ptr_first)->elname); n_chardata = 1; current_id = *(ptr_asdata->ptr_citstyle_id); } /* elements with character data at various locations */ else if (strcmp((ptr_asdata->ptr_first)->elname, "RANGESEPARATOR") == 0) { if (is_descendant_of(ptr_asdata->ptr_first, "PUBTYPE")) { strcpy(table_name, "REFSTYLE"); strcpy(column_name, concat_elnames(ptr_asdata->ptr_first, "PUBTYPE", concat)); strcpy(pubtype, get_ancestor_attr(ptr_asdata->ptr_first, "PUBTYPE", "TYPE")); n_chardata = 1; n_attrdata = 1; current_id = *(ptr_asdata->ptr_citstyle_id); } else if (is_descendant_of(ptr_asdata->ptr_first, "INTEXTDEF")) { strcpy(table_name, "REFSTYLE"); strcpy(column_name, concat_elnames(ptr_asdata->ptr_first, "INTEXTDEF", concat)); strcpy(pubtype, "INTEXT"); n_chardata = 1; n_attrdata = 1; current_id = *(ptr_asdata->ptr_citstyle_id); } else if (is_descendant_of(ptr_asdata->ptr_first, "AUTHORONLY")) { strcpy(table_name, "REFSTYLE"); strcpy(column_name, concat_elnames(ptr_asdata->ptr_first, "AUTHORONLY", concat)); strcpy(pubtype, "AUTHORONLY"); n_chardata = 1; n_attrdata = 1; current_id = *(ptr_asdata->ptr_citstyle_id); } else if (is_descendant_of(ptr_asdata->ptr_first, "YEARONLY")) { strcpy(table_name, "REFSTYLE"); strcpy(column_name, concat_elnames(ptr_asdata->ptr_first, "YEARONLY", concat)); strcpy(pubtype, "YEARONLY"); n_chardata = 1; n_attrdata = 1; current_id = *(ptr_asdata->ptr_citstyle_id); } else { /* CITSTYLE */ strcpy(table_name, "CITSTYLE"); strcpy(column_name, (ptr_asdata->ptr_first)->elname); n_chardata = 1; current_id = *(ptr_asdata->ptr_citstyle_id); } } /* can be level 2, 3, 4, 5, 6 */ else if (strcmp((ptr_asdata->ptr_first)->elname, "FOLLOWING") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "PRECEEDING") == 0) { /* printf("depth:%d\n", depth); */ if (*(ptr_asdata->ptr_depth) - *(ptr_asdata->ptr_depth_adjust) == 2) { /* citstyle-following */ strcpy(table_name, "CITSTYLE"); strcpy(column_name, (ptr_asdata->ptr_first)->elname); n_chardata = 1; n_attrdata = 1; current_id = *(ptr_asdata->ptr_citstyle_id); } else if (*(ptr_asdata->ptr_depth) - *(ptr_asdata->ptr_depth_adjust) == 3) { /* citstyle-biblionumbering-following */ strcpy(table_name, "CITSTYLE"); strcpy(column_name, ((ptr_asdata->ptr_first)->ptr_next)->elname); strcat(column_name, (ptr_asdata->ptr_first)->elname); n_chardata = 1; n_attrdata = 1; current_id = *(ptr_asdata->ptr_citstyle_id); } else { if (is_descendant_of(ptr_asdata->ptr_first, "PUBTYPE")) { strcpy(table_name, "REFSTYLE"); strcpy(column_name, concat_elnames(ptr_asdata->ptr_first, "PUBTYPE", concat)); strcpy(pubtype, get_ancestor_attr(ptr_asdata->ptr_first, "PUBTYPE", "TYPE")); } else if (is_descendant_of(ptr_asdata->ptr_first, "INTEXTDEF")) { strcpy(table_name, "REFSTYLE"); strcpy(column_name, concat_elnames(ptr_asdata->ptr_first, "INTEXTDEF", concat)); strcpy(pubtype, "INTEXT"); } else if (is_descendant_of(ptr_asdata->ptr_first, "AUTHORONLY")) { strcpy(table_name, "REFSTYLE"); strcpy(column_name, concat_elnames(ptr_asdata->ptr_first, "AUTHORONLY", concat)); strcpy(pubtype, "AUTHORONLY"); } else { /* yearonly */ strcpy(table_name, "REFSTYLE"); strcpy(column_name, concat_elnames(ptr_asdata->ptr_first, "YEARONLY", concat)); strcpy(pubtype, "YEARONLY"); } n_chardata = 1; n_attrdata = 1; current_id = *(ptr_asdata->ptr_citstyle_id); } } else if (strcmp((ptr_asdata->ptr_first)->elname, "SEPARATOR") == 0) { strcpy(table_name, "SEPARATORS"); strcpy(column_name, "VALUE"); n_chardata = 1; n_attrdata = 0; current_id = *(ptr_asdata->ptr_separator_id); } else if (strcmp((ptr_asdata->ptr_first)->elname, "THREESEPSEACH") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "THREESEPSLAST") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "TWOSEPS") == 0) { strcpy(table_name, "REFSTYLE"); if (is_descendant_of(ptr_asdata->ptr_first, "PUBTYPE")) { strcpy(column_name, concat_elnames(ptr_asdata->ptr_first, "PUBTYPE", concat)); strcpy(pubtype, get_ancestor_attr(ptr_asdata->ptr_first, "PUBTYPE", "TYPE")); } else if (is_descendant_of(ptr_asdata->ptr_first, "INTEXTDEF")) { strcpy(column_name, concat_elnames(ptr_asdata->ptr_first, "INTEXTDEF", concat)); strcpy(pubtype, "INTEXT"); } else if (is_descendant_of(ptr_asdata->ptr_first, "AUTHORONLY")) { strcpy(column_name, concat_elnames(ptr_asdata->ptr_first, "AUTHORONLY", concat)); strcpy(pubtype, "AUTHORONLY"); } else { /* yearonly */ strcpy(column_name, concat_elnames(ptr_asdata->ptr_first, "YEARONLY", concat)); strcpy(pubtype, "YEARONLY"); } n_chardata = 1; n_attrdata = 1; current_id = *(ptr_asdata->ptr_citstyle_id); } /* only cdata, no attributes */ else if (strcmp((ptr_asdata->ptr_first)->elname, "FIRSTSEP") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "SECONDSEP") == 0) { strcpy(table_name, "REFSTYLE"); if (is_descendant_of(ptr_asdata->ptr_first, "PUBTYPE")) { strcpy(column_name, concat_elnames(ptr_asdata->ptr_first, "PUBTYPE", concat)); strcpy(pubtype, get_ancestor_attr(ptr_asdata->ptr_first, "PUBTYPE", "TYPE")); } else if (is_descendant_of(ptr_asdata->ptr_first, "INTEXTDEF")) { strcpy(column_name, concat_elnames(ptr_asdata->ptr_first, "INTEXTDEF", concat)); strcpy(pubtype, "INTEXT"); } else if (is_descendant_of(ptr_asdata->ptr_first, "AUTHORONLY")) { strcpy(column_name, concat_elnames(ptr_asdata->ptr_first, "AUTHORONLY", concat)); strcpy(pubtype, "AUTHORONLY"); } else { /* yearonly */ strcpy(column_name, concat_elnames(ptr_asdata->ptr_first, "YEARONLY", concat)); strcpy(pubtype, "YEARONLY"); } n_chardata = 1; current_id = *(ptr_asdata->ptr_citstyle_id); } /* refstyle elements with attributes only */ else if (strcmp((ptr_asdata->ptr_first)->elname, "AUTHORLIST") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "ISSUE") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "JOURNALNAME") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "NAMEFIRST") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "NAMEOTHER") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "PAGERANGE") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "PAGES") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "PUBDATE") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "PUBLISHER") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "PUBPLACE") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "SERIAL") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "ADDRESS") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "URL") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "NOTES") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "ABSTRACT") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "USERDEF") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "TYPEOFWORK") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "AREA") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "OSTYPE") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "DEGREE") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "RUNNINGTIME") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "CLASSCODEINTL") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "CLASSCODEUS") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "SENDEREMAIL") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "RECIPIENTEMAIL") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "MEDIATYPE") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "NUMVOLUMES") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "EDITION") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "COMPUTER") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "CONFERENCELOCATION") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "REGISTRYNUM") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "CLASSIFICATION") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "SECTION") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "PAMPHLETNUM") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "CHAPTERNUM") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "LINK") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "REFNUMBER") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "CITEKEY") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "SINGLEPAGE") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "TITLE") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "VOLUME") == 0) { strcpy(table_name, "REFSTYLE"); if (is_descendant_of(ptr_asdata->ptr_first, "PUBTYPE")) { strcpy(column_name, concat_elnames(ptr_asdata->ptr_first, "PUBTYPE", concat)); strcpy(pubtype, get_ancestor_attr(ptr_asdata->ptr_first, "PUBTYPE", "TYPE")); } else if (is_descendant_of(ptr_asdata->ptr_first, "INTEXTDEF")) { strcpy(column_name, concat_elnames(ptr_asdata->ptr_first, "INTEXTDEF", concat)); strcpy(pubtype, "INTEXT"); } else if (is_descendant_of(ptr_asdata->ptr_first, "AUTHORONLY")) { strcpy(column_name, concat_elnames(ptr_asdata->ptr_first, "AUTHORONLY", concat)); strcpy(pubtype, "AUTHORONLY"); } else { /* yearonly */ strcpy(column_name, concat_elnames(ptr_asdata->ptr_first, "YEARONLY", concat)); strcpy(pubtype, "YEARONLY"); } n_attrdata = 1; current_id = *(ptr_asdata->ptr_citstyle_id); } /* citstyle elements with attributes only, no column_name req */ else if (strcmp((ptr_asdata->ptr_first)->elname, "CITSTYLE") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "BIBSTYLE") == 0) { strcpy(table_name, "CITSTYLE"); n_attrdata = 1; current_id = *(ptr_asdata->ptr_citstyle_id); } /* citstyle elements with attributes only, column_name req */ else if (strcmp((ptr_asdata->ptr_first)->elname, "JAN") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "FEB") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "MAR") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "APR") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "MAY") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "JUN") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "JUL") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "AUG") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "SEP") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "OCT") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "NOV") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "DEC") == 0) { strcpy(table_name, "CITSTYLE"); strcpy(column_name, (ptr_asdata->ptr_first)->elname); n_attrdata = 1; current_id = *(ptr_asdata->ptr_citstyle_id); } /* this set is done. check whether we replace an existing entry */ else if (strcmp((ptr_asdata->ptr_first)->elname, "CITESTYLE") == 0) { (*(ptr_asdata->ptr_set_count))++; sprintf(sql_command, "408:%u:%s\n", *(ptr_asdata->ptr_citstyle_id), ptr_asdata->the_journal); if ((new_msg = mstrcat(ptr_asdata->ptr_addresult->msg, sql_command, &(ptr_asdata->ptr_addresult->msg_len), 0)) == NULL) { (*(ptr_asdata->ptr_nmem_error))++; } else { ptr_asdata->ptr_addresult->msg = new_msg; } /* the_journal is already quoted */ sprintf(sql_command, "SELECT ID FROM CITSTYLE WHERE JOURNAL=%s ORDER BY ID ASC", ptr_asdata->the_journal); dbires = dbi_conn_query(ptr_asdata->conn, sql_command); LOG_PRINT(LOG_DEBUG, sql_command); if (dbires) { if (dbi_result_next_row(dbires) != 0) { n_id = my_dbi_result_get_int_idval(dbires, "ID"); if (n_id != *(ptr_asdata->ptr_citstyle_id)) { if (!remove_style(ptr_asdata->conn, n_id)) { sprintf(sql_command, "419:%u:%s\n", n_id, ptr_asdata->the_journal); } else { sprintf(sql_command, "420:%u:%s\n", *(ptr_asdata->ptr_citstyle_id), ptr_asdata->the_journal); } if ((new_msg = mstrcat(ptr_asdata->ptr_addresult->msg, sql_command, &(ptr_asdata->ptr_addresult->msg_len), 0)) == NULL) { (*(ptr_asdata->ptr_nmem_error))++; } else { ptr_asdata->ptr_addresult->msg = new_msg; } } } else { LOG_PRINT(LOG_WARNING, "error in retrieving sql result"); } dbi_result_free(dbires); } else { LOG_PRINT(LOG_WARNING, "error in sql command"); } } /* elements without values or attributes */ else if (strcmp((ptr_asdata->ptr_first)->elname, "AUTHORNAMES") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "AUTHORSEPS") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "TEXT") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "TEXTED") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "TEXTMULTIPLE") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "TEXTSINGLE") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "THREESEPS") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "REFSTYLE") == 0 || strcmp((ptr_asdata->ptr_first)->elname, "MONTHS") == 0) { /* do nothing (n_chardata and n_attrdata remain 0) */ } /* printf("%d", depth); */ /* for (i = 0; i < depth; i++) { */ /* printf(" "); */ /* } */ /* printf("endtag:%s\n", ptr_first->elname); */ /* no values or attributes, but we have to take care of depth_adjust */ else if (strcmp((ptr_asdata->ptr_first)->elname, "STYLESET") == 0) { (*(ptr_asdata->ptr_depth_adjust))--; } if (n_chardata) { char* elvalue_q = NULL; /* quote element value */ if ((elvalue_q = strdup((ptr_asdata->ptr_first)->ptr_elvalue)) == NULL) { /* todo: bail out */ } else { if (dbi_conn_quote_string(ptr_asdata->conn, &elvalue_q) == 0) { /* todo: bail out */ } } if (elvalue_q) { if (pubtype[0]) { sprintf(sql_command, "UPDATE REFSTYLE SET %s=%s WHERE CITSTYLEID=%u AND PUBTYPE='", column_name, elvalue_q, current_id); /* we have to add pubtype outside of the sprintf call. The reason is unclear, but may be a hidden overflow or something */ strcat(sql_command, pubtype); strcat(sql_command, "\'"); } else { sprintf(sql_command, "UPDATE %s SET %s=%s WHERE ID=%u", table_name, column_name, elvalue_q, current_id); } free(elvalue_q); dbires = dbi_conn_query(ptr_asdata->conn, sql_command); LOG_PRINT(LOG_DEBUG, sql_command); if (!dbires) { (*(ptr_asdata->ptr_ndb_error))++; LOG_PRINT(LOG_WARNING, "error in sql command"); } else { dbi_result_free(dbires); } } /* end if elvalue_q */ } /* end if n_chardata */ } /* end if no mem or db errors */ /* remove attributes of the current element from the list */ ptr_attr_remove = (ptr_asdata->ptr_first)->ptr_attr_first; while (ptr_attr_remove) { /* assemble column name for attribute */ if (n_attrdata) { strcpy(column_name_attribute, column_name); strcat(column_name_attribute, ptr_attr_remove->attribute_name); /* for (i = 0; i < depth; i++) { */ /* printf(" "); */ /* } */ if (strcmp(ptr_attr_remove->attribute_name, "ROLE") != 0 || !ignore_role) { if (pubtype[0]) { sprintf(sql_command, "UPDATE REFSTYLE SET %s='%s' WHERE CITSTYLEID=%u AND PUBTYPE='", column_name_attribute, ptr_attr_remove->attribute_value, current_id); /* we have to add pubtype outside of the sprintf call. The reason is unclear, but may be a hidden overflow or something */ strcat(sql_command, pubtype); strcat(sql_command, "\'"); } else { sprintf(sql_command, "UPDATE %s SET %s='%s' WHERE ID=%u", table_name, column_name_attribute, ptr_attr_remove->attribute_value, current_id); } /* printf("%s\n", sql_command); */ dbires = dbi_conn_query(ptr_asdata->conn, sql_command); LOG_PRINT(LOG_DEBUG, sql_command); if (!dbires) { (*(ptr_asdata->ptr_ndb_error))++; LOG_PRINT(LOG_WARNING, "error in sql command"); } else { dbi_result_free(dbires); } } } (ptr_asdata->ptr_first)->ptr_attr_first = ((ptr_asdata->ptr_first)->ptr_attr_first)->ptr_next; free(ptr_attr_remove); ptr_attr_remove = (ptr_asdata->ptr_first)->ptr_attr_first; } /* free element value string */ if ((ptr_asdata->ptr_first)->ptr_elvalue) { free((ptr_asdata->ptr_first)->ptr_elvalue); } /* remove current element from element stack */ ptr_el_remove = ptr_asdata->ptr_first; ptr_asdata->ptr_first = (ptr_asdata->ptr_first)->ptr_next; free(ptr_el_remove); /* printf("end tag handler done\n"); */ } /* End of end_handler */ /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ char_handler(): handler for character data. It is limited to 256 chars per element which is way enough for the citestyle dtd. void char_handler has no return value void* ptr_data this is a ptr to "non-global" global data that all handlers share - will be cast to type struct addstyle_data* const char *string ptr to a string containing the char data this string is not \0 terminated and could be only a part of the character data of an element! int len length length of string ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ void char_handler(void *ptr_data, const char *string, int len) { size_t len_elvalue; size_t len_string; struct addstyle_data* ptr_asdata; ptr_asdata = (struct addstyle_data*)ptr_data; if (*(ptr_asdata->ptr_ndb_error) || *(ptr_asdata->ptr_nmem_error)) { return; } len_elvalue = strlen((ptr_asdata->ptr_first)->ptr_elvalue); len_elvalue = (len_elvalue > 256) ? 256 : len_elvalue; len_string = (len > (int)(256-(int)len_elvalue)) ? 256-len_elvalue : (size_t)len; strncpy(&(((ptr_asdata->ptr_first)->ptr_elvalue)[len_elvalue]), string, len_string); ((ptr_asdata->ptr_first)->ptr_elvalue)[len_elvalue + len_string] = '\0'; /* printf(">>%s\n", ptr_first->elvalue); */ } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_ancestor_attr(): returns the value of an attribute of an ancestor of the current element static char* get_ancestor_attr returns the value of the requested attribute or NULL if no such attribute is found struct elstack* ptr_current_element ptr to the current element on the element stack char* ancestor_name name of the requested ancestor element char* ancestor_attribute name of the requested ancestor attribute ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static char* get_ancestor_attr(struct elstack* ptr_current_element, char* ancestor_name, char* ancestor_attribute) { struct elstack* ptr_el; struct attrlist* ptr_attr; ptr_el = ptr_current_element; while (ptr_el != NULL) { if (strcmp(ptr_el->elname, ancestor_name) == 0) { ptr_attr = ptr_el->ptr_attr_first; while (ptr_attr != NULL) { if (strcmp(ptr_attr->attribute_name, ancestor_attribute) == 0) { return ptr_attr->attribute_value; } ptr_attr = ptr_attr->ptr_next; } } ptr_el = ptr_el->ptr_next; } return NULL; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_attr(): returns the value of an attribute of the current element char* get_attr returns the value of the requested attribute or NULL if no such attribute is found struct elstack* ptr_current_element ptr to the current element on the element stack char* attribute name of the requested attribute ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* get_attr(struct elstack* ptr_current_element, char* attribute) { struct attrlist* ptr_attr; ptr_attr = ptr_current_element->ptr_attr_first; while (ptr_attr != NULL) { if (strcmp(ptr_attr->attribute_name, attribute) == 0) { return ptr_attr->attribute_value; } ptr_attr = ptr_attr->ptr_next; } return NULL; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ is_descendant_of(): tests whether the current element is the descendant of a given element int is_descendant_of returns 1 if the current element is the descendant of the given element, 0 if not struct elstack* ptr_current_element ptr to the current element on the element stack char* ancestor_name name of the requested ancestor element ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int is_descendant_of(struct elstack* ptr_current_element, char* ancestor_name) { struct elstack* ptr_el; ptr_el = ptr_current_element; while (ptr_el != NULL) { if (strcmp(ptr_el->elname, ancestor_name) == 0) { return 1; } ptr_el = ptr_el->ptr_next; } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ concat_elnames(): concatenates the names of all ancestors of the current element up to a given element which is not to be concatenated to the string. The leftmost element name in the concatenated string will be of the distal element, the rightmost will be the name of the current element static char* concat_elnames returns a ptr to the concatenated names. This will be an empty string if the current element is identical with the first excluded element struct elstack* ptr_current_element ptr to the current element on the element stack char* exclude_name the name of the first ancestor (as seen from the current element) that is not to be included into the concatenated names. This is where the concatenating stops. char* concat ptr to a buffer that receives the concatenated name. This buffer must hold at least 64 chars. This ptr is also used as the return value for the function ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static char* concat_elnames(struct elstack* ptr_current_element, char* exclude_name, char* concat) { struct elstack* ptr_el; char buffer[64]; char* ptr_attr; concat[0] = '\0'; ptr_el = ptr_current_element; while (ptr_el != NULL) { if (strcmp(ptr_el->elname, exclude_name) == 0) { return concat; } strcpy(buffer, concat); /* AUTHORLIST, PUBDATE, TITLE, USERDEF, MISC, LINK need special care as the actual column name in the database depends on the ROLE attribute */ if (strcmp(ptr_el->elname, "AUTHORLIST") == 0) { /* we use short versions of these element names in order not to exceed the column name limit of PostgreSQL */ ptr_attr = get_ancestor_attr(ptr_el, "AUTHORLIST", "ROLE"); if (ptr_attr && strcmp(ptr_attr, "PART") == 0) { strcpy(concat, "Q"); /* AUTHORLIST */ } else if (ptr_attr && strcmp(ptr_attr, "SERIES") == 0) { strcpy(concat, "Y"); /* SEDITORLIST */ } else if (ptr_attr && strcmp(ptr_attr, "ALL") == 0) { strcpy(concat, "Z"); /* ALLALIST */ } else { /* DTD uses this as default */ strcpy(concat, "X"); /* EDITORLIST */ } } else if (strcmp(ptr_el->elname, "PUBDATE") == 0) { ptr_attr = get_ancestor_attr(ptr_el, "PUBDATE", "ROLE"); if (ptr_attr && strcmp(ptr_attr, "SECONDARY") == 0) { strcpy(concat, "PUBDATESEC"); } else if (ptr_attr && strcmp(ptr_attr, "ALL") == 0) { strcpy(concat, "PUBDATEALL"); } else { strcpy(concat, "PUBDATE"); } } else if (strcmp(ptr_el->elname, "TITLE") == 0) { ptr_attr = get_ancestor_attr(ptr_el, "TITLE", "ROLE"); if (ptr_attr && strcmp(ptr_attr, "PART") == 0) { strcpy(concat, "TITLE"); } else if (ptr_attr && strcmp(ptr_attr, "SERIES") == 0) { strcpy(concat, "SERIESTITLE"); } else if (ptr_attr && strcmp(ptr_attr, "ALL") == 0) { strcpy(concat, "ALLTITLE"); } else { /* DTD uses this as default */ strcpy(concat, "BOOKTITLE"); } } else if (strcmp(ptr_el->elname, "USERDEF") == 0) { ptr_attr = get_ancestor_attr(ptr_el, "USERDEF", "ROLE"); if (ptr_attr && strcmp(ptr_attr, "2") == 0) { strcpy(concat, "USERDEF2"); } else if (ptr_attr && strcmp(ptr_attr, "3") == 0) { strcpy(concat, "USERDEF3"); } else if (ptr_attr && strcmp(ptr_attr, "4") == 0) { strcpy(concat, "USERDEF4"); } else if (ptr_attr && strcmp(ptr_attr, "5") == 0) { strcpy(concat, "USERDEF5"); } else { strcpy(concat, "USERDEF1"); } } else if (strcmp(ptr_el->elname, "LINK") == 0) { ptr_attr = get_ancestor_attr(ptr_el, "LINK", "ROLE"); if (ptr_attr && strcmp(ptr_attr, "1") == 0) { strcpy(concat, "LINK1"); } else if (ptr_attr && strcmp(ptr_attr, "2") == 0) { strcpy(concat, "LINK2"); } else if (ptr_attr && strcmp(ptr_attr, "3") == 0) { strcpy(concat, "LINK3"); } else if (ptr_attr && strcmp(ptr_attr, "4") == 0) { strcpy(concat, "LINK4"); } else { strcpy(concat, "LINK0"); } } /* in all other cases we can simply use the element name */ else { strcpy(concat, ptr_el->elname); } strcat(concat, buffer); ptr_el = ptr_el->ptr_next; } return concat; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ delete_list(): deletes the linked element list and the associated attribute lists. This is to free the memory in case of an error void delete_list struct elstack* ptr_current_element ptr to the first entry in the linked list ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ void delete_list(struct elstack* ptr_current_element) { struct elstack* ptr_el; struct attrlist* ptr_attr; struct elstack* ptr_el_next; struct attrlist* ptr_attr_next; ptr_el = ptr_current_element; while (ptr_el != NULL) { ptr_attr = ptr_el->ptr_attr_first; while (ptr_attr != NULL) { ptr_attr_next = ptr_attr->ptr_next; free(ptr_attr); ptr_attr = ptr_attr_next; } ptr_el_next = ptr_el->ptr_next; free(ptr_el); ptr_el = ptr_el_next; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ id_start_handler(): handler for start tags (handling citation/xref data) void start_handler has no return value void* ptr_data this is a ptr to "non-global" global data that all handlers share - will be cast to type struct getbib_data* const char *el ptr to a string containing the element name const char** ptr_attr ptr to an array of attributes (name-value pairs) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ void id_start_handler(void *ptr_data, const char *el, const char **ptr_attr) { struct simple_elstack* ptr_el_new; struct getbib_data* ptr_gbdata; ptr_gbdata = (struct getbib_data*)ptr_data; /* add current element to element stack */ ptr_el_new = malloc(sizeof(struct simple_elstack)); if (ptr_el_new == NULL) { (*(ptr_gbdata->ptr_nmem_error))++; } else { /* printf("have memory\n"); */ strncpy(ptr_el_new->elname, el, 63); ptr_el_new->elname[63] = '\0'; /* terminate just in case */ ptr_el_new->elvalue = malloc(256); /* something to start with */ if (ptr_el_new->elvalue == NULL) { (*(ptr_gbdata->ptr_nmem_error))++; } else { ptr_el_new->elvalue[0] = '\0'; ptr_el_new->ptr_snext = ptr_gbdata->ptr_sfirst; ptr_gbdata->ptr_sfirst = ptr_el_new; } /* printf("%s", ptr_first->elname); */ /* add attribute */ if (ptr_attr[0] && ptr_attr[1]) { ptr_el_new->attrvalue = mstrdup((char*)ptr_attr[1]); if (!ptr_el_new->attrvalue) { (*(ptr_gbdata->ptr_nmem_error))++; } } else { ptr_el_new->attrvalue = NULL; } } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ id_end_handler(): handler for end tags (handling citation/xref data) void end_handler has no return value void* ptr_data this is a ptr to "non-global" global data that all handlers share - will be cast to type struct getbib_data* const char *el ptr to a string containing the element name ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ void id_end_handler(void *ptr_data, const char *el) { size_t sql_command_len; int nis_multi = 0; int errcode; /* receives error code for periodical requests */ char buffer[32]; char* database = ""; char* id_string; char* multi_id_string; char* multi_database = ""; char* sql_command; char* new_sql_command; const char* query_result; char* new_el; char* new_elvalue; char* new_id; char* new_attrvalue = NULL; char* item; char* reftype = NULL; char* my_aempty = NULL; char *my_refdb_title = NULL; char* escape_buffer; char titlespec[16]; char periodical[256] = ""; const char *drivername; /* name of the libdbi driver */ int use_title_as_author = 0; unsigned long long temp_id = 0; unsigned long long real_orig_id = 0; dbi_conn conn_source = NULL; dbi_result dbires; dbi_result dbires1; struct getbib_data* ptr_gbdata; struct simple_elstack* ptr_el_remove; ptr_gbdata = (struct getbib_data*)ptr_data; drivername = dbi_driver_get_name(dbi_conn_get_driver(ptr_gbdata->conn)); if ((new_el = mstrdup((char*)el)) == NULL) { (*(ptr_gbdata->ptr_nmem_error))++; return; } strup(new_el); if ((new_elvalue = mstrdup((char*)((ptr_gbdata->ptr_sfirst)->elvalue))) == NULL) { (*(ptr_gbdata->ptr_nmem_error))++; return; } if ((ptr_gbdata->ptr_sfirst)->attrvalue && (new_attrvalue = mstrdup((char*)((ptr_gbdata->ptr_sfirst)->attrvalue))) == NULL) { (*(ptr_gbdata->ptr_nmem_error))++; return; } if (strcmp(new_el, "XREF") == 0) { sql_command_len = 512; if ((sql_command = malloc(sql_command_len)) == NULL) { (*(ptr_gbdata->ptr_nmem_error))++; return; } /* strup((ptr_gbdata->ptr_sfirst)->elvalue); */ id_string = getid((ptr_gbdata->ptr_sfirst)->elvalue, &database, &nis_multi); nis_multi = 0; /* protects against malformed linkends */ if ((ptr_gbdata->ptr_sfirst)->attrvalue) { multi_id_string = getid((ptr_gbdata->ptr_sfirst)->attrvalue, &multi_database, &nis_multi); } if (database) { strdn(database); /* use lowercase name */ } else { database = ptr_gbdata->ptr_default_db; /* use default database */ } /* check whether orig_id is numerical */ if (!is_number(id_string)) { /* retrieve corresponding ID for this citekey */ if (!strcmp(my_dbi_conn_get_cap(ptr_gbdata->conn, "multiple_db"), "t")) { sprintf(sql_command, "SELECT refdb_id, refdb_type FROM %s.t_refdb WHERE refdb_citekey='%s' AND refdb_type!='DUMMY'", database, id_string); dbires = dbi_conn_query(ptr_gbdata->conn, sql_command); } else { /* get additional connection */ if ((conn_source = connect_to_db(ptr_gbdata->ptr_clrequest, database, 0)) == NULL) { LOG_PRINT(LOG_ERR, get_status_msg(205)); return; } sprintf(sql_command, "SELECT refdb_id, refdb_type FROM t_refdb WHERE refdb_citekey='%s' AND refdb_type!='DUMMY'", id_string); dbires = dbi_conn_query(conn_source, sql_command); } LOG_PRINT(LOG_DEBUG, sql_command); if (!dbires) { LOG_PRINT(LOG_WARNING, "select failed"); (*(ptr_gbdata->ptr_ndb_error))++; real_orig_id = 0; } else { if (dbi_result_next_row(dbires)) { real_orig_id = my_dbi_result_get_idval(dbires, "refdb_id"); reftype = my_dbi_result_get_string_copy(dbires, "refdb_type"); } else { real_orig_id = 0; } dbi_result_free(dbires); } if (strcmp(my_dbi_conn_get_cap(ptr_gbdata->conn, "multiple_db"), "t") && conn_source) { dbi_conn_close(conn_source); } } else { /* if id is numeric */ /* we still have to query the database as the dataset may be missing */ if (!strcmp(my_dbi_conn_get_cap(ptr_gbdata->conn, "multiple_db"), "t")) { sprintf(sql_command, "SELECT refdb_id, refdb_type FROM %s.t_refdb WHERE refdb_id='%s' AND refdb_type!='DUMMY'", database, id_string); dbires = dbi_conn_query(ptr_gbdata->conn, sql_command); } else { /* get additional connection */ if ((conn_source = connect_to_db(ptr_gbdata->ptr_clrequest, database, 0)) == NULL) { LOG_PRINT(LOG_ERR, get_status_msg(205)); return; } sprintf(sql_command, "SELECT refdb_id, refdb_type FROM t_refdb WHERE refdb_id='%s' AND refdb_type!='DUMMY'", id_string); dbires = dbi_conn_query(conn_source, sql_command); } LOG_PRINT(LOG_DEBUG, sql_command); if (!dbires) { LOG_PRINT(LOG_WARNING, "select failed"); (*(ptr_gbdata->ptr_ndb_error))++; real_orig_id = 0; } else { if (dbi_result_next_row(dbires)) { real_orig_id = my_dbi_result_get_idval(dbires, "refdb_id"); reftype = my_dbi_result_get_string_copy(dbires, "refdb_type"); } else { real_orig_id = 0; } dbi_result_free(dbires); } if (strcmp(my_dbi_conn_get_cap(ptr_gbdata->conn, "multiple_db"), "t") && conn_source) { dbi_conn_close(conn_source); } } /* end if numerical */ if (real_orig_id) { if (nis_multi) { /* true only if a correct endterm was encountered */ if ((new_id = mstrcpy(ptr_gbdata->ptr_curr_multi_id, new_attrvalue, ptr_gbdata->ptr_cmid_len)) == NULL) { (*(ptr_gbdata->ptr_nmem_error))++; return; } else { ptr_gbdata->ptr_curr_multi_id = new_id; } free(reftype); } else { if (id_string != NULL) { dbi_driver driver; /* see whether the style requests to use titles in place of missing authors. The style should have the ALTERNATETEXT attribute set to TITLEPART, TITLEPUB, TITLESERIES, TITLEALL (the latter meaning the first available), or to JOURNALNAME */ if (!strcmp(my_dbi_conn_get_cap(ptr_gbdata->conn_refdb, "multiple_db"), "t")) { sprintf(sql_command, "SELECT QAEMPTY,XAEMPTY,QALTERNATETEXT,XALTERNATETEXT FROM %s.REFSTYLE INNER JOIN %s.CITSTYLE ON REFSTYLE.CITSTYLEID=CITSTYLE.ID WHERE REFSTYLE.PUBTYPE='%s' AND JOURNAL=%s", main_db, main_db, reftype, ptr_gbdata->quoted_journal); } else { sprintf(sql_command, "SELECT QAEMPTY,XAEMPTY,QALTERNATETEXT,XALTERNATETEXT FROM REFSTYLE INNER JOIN CITSTYLE ON REFSTYLE.CITSTYLEID=CITSTYLE.ID WHERE REFSTYLE.PUBTYPE='%s' AND JOURNAL=%s", reftype, ptr_gbdata->quoted_journal); } LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(ptr_gbdata->conn_refdb, sql_command); if (!dbires) { LOG_PRINT(LOG_WARNING, "accessing style data failed"); (*(ptr_gbdata->ptr_ndb_error))++; } else { if ((use_title_as_author = set_alternatetext(dbires, &my_aempty)) == -1) { /* try GEN instead */ dbi_result_free(dbires); if (!strcmp(my_dbi_conn_get_cap(ptr_gbdata->conn_refdb, "multiple_db"), "t")) { sprintf(sql_command, "SELECT QAEMPTY,XAEMPTY,QALTERNATETEXT,XALTERNATETEXT FROM %s.REFSTYLE INNER JOIN %s.CITSTYLE ON REFSTYLE.CITSTYLEID=CITSTYLE.ID WHERE REFSTYLE.PUBTYPE='GEN' AND JOURNAL=%s", main_db, main_db, ptr_gbdata->quoted_journal); } else { sprintf(sql_command, "SELECT QAEMPTY,XAEMPTY,QALTERNATETEXT,XALTERNATETEXT FROM REFSTYLE INNER JOIN CITSTYLE ON REFSTYLE.CITSTYLEID=CITSTYLE.ID WHERE REFSTYLE.PUBTYPE='GEN' AND JOURNAL=%s", ptr_gbdata->quoted_journal); } LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(ptr_gbdata->conn_refdb, sql_command); if (!dbires) { LOG_PRINT(LOG_WARNING, "accessing style data failed"); (*(ptr_gbdata->ptr_ndb_error))++; } else { if ((use_title_as_author = set_alternatetext(dbires, &my_aempty)) == -1) { (*(ptr_gbdata->ptr_nmem_error))++; } } } dbi_result_free(dbires); } /* end if have result */ if (!has_part_data(reftype)) { strcpy(titlespec, "refdb_booktitle"); } else { strcpy(titlespec, "refdb_title"); } free(reftype); driver = dbi_conn_get_driver(ptr_gbdata->conn); /* select items and stash them into the temporary table */ /* all fields that we can get directly from t_refdb */ /* create a new row with INSERT */ if (!strcmp(my_dbi_conn_get_cap(ptr_gbdata->conn, "multiple_db"), "t")) { sprintf(sql_command, "INSERT INTO %s (article_title,volume,issue,startpage,pubyear, citekey) SELECT %s,refdb_volume,refdb_issue,refdb_startpage,refdb_pubyear, refdb_citekey FROM %s.t_refdb WHERE refdb_id="ULLSPEC, ptr_gbdata->ptr_table_name, titlespec, database, (unsigned long long)real_orig_id); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(ptr_gbdata->conn, sql_command); if (!dbires) { LOG_PRINT(LOG_WARNING, "temp table insert failed"); (*(ptr_gbdata->ptr_ndb_error))++; } else { dbi_result_free(dbires); } /* save new temp id */ temp_id = dbi_conn_sequence_last(ptr_gbdata->conn, NULL); /* get refdb_title separately, as we need it further down */ sprintf(sql_command, "SELECT %s,refdb_volume,refdb_issue,refdb_startpage,refdb_pubyear, refdb_citekey FROM t_refdb WHERE refdb_id="ULLSPEC, titlespec, (unsigned long long)real_orig_id); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(ptr_gbdata->conn, sql_command); if (!dbires) { LOG_PRINT(LOG_WARNING, "source table select failed"); (*(ptr_gbdata->ptr_ndb_error))++; } else { if (dbi_result_next_row(dbires)) { my_refdb_title = my_dbi_result_get_string_copy(dbires, titlespec); /* the quote_string function checks for non-NULL arguments */ dbi_conn_quote_string(ptr_gbdata->conn, &my_refdb_title); } } } else { /* we've got a small problem here: we can't select values from one database and insert it into another with a single command Instead we've got to do it the hard way */ /* get a connection to the source database */ if ((conn_source = connect_to_db(ptr_gbdata->ptr_clrequest, database, 0)) == NULL) { LOG_PRINT(LOG_ERR, get_status_msg(205)); return; } sprintf(sql_command, "SELECT %s,refdb_volume,refdb_issue,refdb_startpage,refdb_pubyear, refdb_citekey FROM t_refdb WHERE refdb_id="ULLSPEC, titlespec, (unsigned long long)real_orig_id); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn_source, sql_command); if (!dbires) { LOG_PRINT(LOG_WARNING, "source table select failed"); (*(ptr_gbdata->ptr_ndb_error))++; } else { if (dbi_result_next_row(dbires)) { /* get strings quoted properly */ char *my_refdb_volume; char *my_refdb_issue; char *my_refdb_startpage; char *my_refdb_citekey; my_refdb_title = my_dbi_result_get_string_copy(dbires, titlespec); my_refdb_volume = my_dbi_result_get_string_copy(dbires, "refdb_volume"); my_refdb_issue = my_dbi_result_get_string_copy(dbires, "refdb_issue"); my_refdb_startpage = my_dbi_result_get_string_copy(dbires, "refdb_startpage"); my_refdb_citekey = my_dbi_result_get_string_copy(dbires, "refdb_citekey"); /* the quote_string function checks for non-NULL arguments */ dbi_conn_quote_string(ptr_gbdata->conn, &my_refdb_title); dbi_conn_quote_string(ptr_gbdata->conn, &my_refdb_volume); dbi_conn_quote_string(ptr_gbdata->conn, &my_refdb_issue); dbi_conn_quote_string(ptr_gbdata->conn, &my_refdb_startpage); dbi_conn_quote_string(ptr_gbdata->conn, &my_refdb_citekey); sprintf(sql_command, "INSERT INTO %s (article_title,volume,issue,startpage,pubyear, citekey) VALUES (%s,%s,%s,%s,%d, %s)", ptr_gbdata->ptr_table_name, (my_refdb_title) ? my_refdb_title : "\'\'", (my_refdb_volume) ? my_refdb_volume : "\'\'", (my_refdb_issue) ? my_refdb_issue : "\'\'", (my_refdb_startpage) ? my_refdb_startpage : "\'\'", dbi_result_get_short(dbires, "refdb_pubyear"), (my_refdb_citekey) ? my_refdb_citekey : "\'\'"); LOG_PRINT(LOG_DEBUG, sql_command); if (my_refdb_volume) { free(my_refdb_volume); } if (my_refdb_issue) { free(my_refdb_issue); } if (my_refdb_startpage) { free(my_refdb_startpage); } dbires1 = dbi_conn_query(ptr_gbdata->conn, sql_command); if (!dbires1) { LOG_PRINT(LOG_WARNING, "temp table insert failed"); (*(ptr_gbdata->ptr_ndb_error))++; } else { dbi_result_free(dbires1); } /* save new temp id */ temp_id = dbi_conn_sequence_last(ptr_gbdata->conn, "getbibtemp_id_seq"); } dbi_result_free(dbires); } } /* dbname, orig_id, entry_id */ sprintf(sql_command, "UPDATE %s SET dbname='%s',citation_pos=%d,xref_pos=%d,orig_id="ULLSPEC",entry_id='%s', multi_id='%s' WHERE id="ULLSPEC, ptr_gbdata->ptr_table_name, database, *(ptr_gbdata->ptr_citation_count), *(ptr_gbdata->ptr_xref_count), (unsigned long long)real_orig_id, new_elvalue, ptr_gbdata->ptr_curr_multi_id, (unsigned long long)temp_id); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(ptr_gbdata->conn, sql_command); if (!dbires) { LOG_PRINT(LOG_WARNING, "temp table insert failed"); (*(ptr_gbdata->ptr_ndb_error))++; } else { dbi_result_free(dbires); /* author_concat */ sprintf(sql_command, "UPDATE %s SET author_concat=\'", ptr_gbdata->ptr_table_name); if (!strcmp(my_dbi_conn_get_cap(ptr_gbdata->conn, "multiple_db"), "t")) { dbires1 = request_authors(ptr_gbdata->conn, 4 /* first available */, NULL /* all roles */, database, 0, real_orig_id); } else { dbires1 = request_authors(conn_source, 4 /* first available */, NULL /* all roles */, NULL, 0, real_orig_id); } if (!dbires1) { LOG_PRINT(LOG_WARNING, "temp table author query failed"); (*(ptr_gbdata->ptr_ndb_error))++; } else { if (!get_num_authors(dbires1)) { /* printf("num_authors went to zero\n"); */ /* if no authors, use AEMPTY or title here */ if (my_aempty) { /* printf("use xaempty %s\n", my_aempty); */ /* my_aempty is quoted, but we need only the internal quotes */ my_aempty[strlen(my_aempty)-1] = '\0'; if ((new_sql_command = mstrcat(sql_command, my_aempty + 1, &sql_command_len, 0)) == NULL) { (*(ptr_gbdata->ptr_nmem_error))++; } else { sql_command = new_sql_command; } } /* use journalname as author */ else if (use_title_as_author == 5) { if (!strcmp(my_dbi_conn_get_cap(ptr_gbdata->conn, "multiple_db"), "t")) { item = get_periodical(ptr_gbdata->conn, periodical, database, 4, &errcode, 0, real_orig_id, NULL /* no frequency required */); } else { item = get_periodical(conn_source, periodical, NULL, 4, &errcode, 0, real_orig_id, NULL /* no frequency required */); } if (!item && errcode != 1) { LOG_PRINT(LOG_WARNING, "temp table periodical query failed"); (*(ptr_gbdata->ptr_ndb_error))++; } else if (!errcode) { if (*periodical) { /* printf("periodical went to:%s<<\n", periodical); */ /* string is short enough, don't need mstrcat here */ escape_buffer = strdup(item); if (!escape_buffer) { LOG_PRINT(LOG_WARNING, "malloc failed"); (*(ptr_gbdata->ptr_nmem_error))++; } /* escape any characters that the database server cannot digest */ if (dbi_conn_quote_string(ptr_gbdata->conn, &escape_buffer) == 0) { LOG_PRINT(LOG_WARNING, "out of memory"); (*(ptr_gbdata->ptr_nmem_error))++; } /* printf("escape_buffer went to:%s<<\n", escape_buffer); */ escape_buffer[strlen(escape_buffer)-1] = '\0'; if ((new_sql_command = mstrcat(sql_command, escape_buffer + 1, &sql_command_len, 0)) == NULL) { (*(ptr_gbdata->ptr_nmem_error))++; } else { sql_command = new_sql_command; } free(escape_buffer); } } } /* use title as author */ else if (use_title_as_author) { /* printf("use qtitle %s\n", my_refdb_title); */ if (my_refdb_title) { /* my_refdb_title is quoted, but we need only the internal quotes */ my_refdb_title[strlen(my_refdb_title)-1] = '\0'; if ((new_sql_command = mstrcat(sql_command, my_refdb_title + 1, &sql_command_len, 0)) == NULL) { (*(ptr_gbdata->ptr_nmem_error))++; } else { sql_command = new_sql_command; } } } else { /* printf("do nothing\n"); */ } } else { /* have authors */ /* printf("have at least one author\n"); */ /* reset */ use_title_as_author = 0; while ((query_result = get_author(dbires1)) != NULL) { char *author_q; author_q = strdup(query_result); if (!author_q || dbi_conn_quote_string(ptr_gbdata->conn, &author_q) == 0) { LOG_PRINT(LOG_WARNING, "out of memory"); (*(ptr_gbdata->ptr_nmem_error))++; } else if (*author_q) { /* the quoted author is enclosed in quotes (who would have thought?) but we don't need these here; we need only the internal quotes */ author_q[strlen(author_q)-1] = '\0'; if ((new_sql_command = mstrcat(sql_command, author_q + 1, &sql_command_len, 0)) == NULL) { (*(ptr_gbdata->ptr_nmem_error))++; break; } else { sql_command = new_sql_command; } free(author_q); } /* end if no mem error */ } /* end while have author */ } /* end if have authors */ if (use_title_as_author && my_refdb_title) { char buffer[64]; sprintf(buffer, "\', title_as_author=%d WHERE id=", use_title_as_author); if ((new_sql_command = mstrcat(sql_command, buffer, &sql_command_len, 0)) == NULL) { (*(ptr_gbdata->ptr_nmem_error))++; } else { sql_command = new_sql_command; } } else { /* title_as_author has a default of 0, no need to alter it */ if ((new_sql_command = mstrcat(sql_command, "\' WHERE id=", &sql_command_len, 0)) == NULL) { (*(ptr_gbdata->ptr_nmem_error))++; } else { sql_command = new_sql_command; } } clean_request(dbires1); sprintf(buffer, ULLSPEC, (unsigned long long)temp_id); if ((new_sql_command = mstrcat(sql_command, buffer, &sql_command_len, 0)) == NULL) { (*(ptr_gbdata->ptr_nmem_error))++; } else { sql_command = new_sql_command; LOG_PRINT(LOG_DEBUG, sql_command); dbires1 = dbi_conn_query(ptr_gbdata->conn, sql_command); if (!dbires1) { LOG_PRINT(LOG_WARNING, "temp table insert failed"); (*(ptr_gbdata->ptr_ndb_error))++; } dbi_result_free(dbires1); } } } if (my_refdb_title) { free(my_refdb_title); } /* journal */ sprintf(sql_command, "UPDATE %s SET periodical=", ptr_gbdata->ptr_table_name); if (!strcmp(my_dbi_conn_get_cap(ptr_gbdata->conn, "multiple_db"), "t")) { item = get_periodical(ptr_gbdata->conn, periodical, database, 4, &errcode, 0, real_orig_id, NULL /* no frequency required */); } else { item = get_periodical(conn_source, periodical, NULL, 4, &errcode, 0, real_orig_id, NULL /* no frequency required */); } if (!item && errcode != 1) { LOG_PRINT(LOG_WARNING, "temp table periodical query failed"); (*(ptr_gbdata->ptr_ndb_error))++; } else if (!errcode) { if (*periodical) { /* printf("periodical went to:%s<<\n", periodical); */ /* string is short enough, don't need mstrcat here */ escape_buffer = strdup(item); if (!escape_buffer) { LOG_PRINT(LOG_WARNING, "malloc failed"); (*(ptr_gbdata->ptr_nmem_error))++; } /* escape any characters that the database server cannot digest */ if (dbi_conn_quote_string(ptr_gbdata->conn, &escape_buffer) == 0) { LOG_PRINT(LOG_WARNING, "out of memory"); (*(ptr_gbdata->ptr_nmem_error))++; } /* printf("escape_buffer went to:%s<<\n", escape_buffer); */ strcat(sql_command, escape_buffer); free(escape_buffer); } strcat(sql_command, " WHERE id="); /* buffer still has temp_id*/ strcat(sql_command, buffer); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(ptr_gbdata->conn, sql_command); if (!dbires) { LOG_PRINT(LOG_WARNING, "temp table insert failed"); (*(ptr_gbdata->ptr_ndb_error))++; } dbi_result_free(dbires); } /* close extra connection */ if (strcmp(my_dbi_conn_get_cap(ptr_gbdata->conn, "multiple_db"), "t") && conn_source) { dbi_conn_close(conn_source); } } (*(ptr_gbdata->ptr_xref_count))++; } } else { /* ID not found */ /* don't count the first dummy citation in a multiple citation */ if (!nis_multi) { /* requested ref is not in the database */ (*(ptr_gbdata->ptr_ndb_notfound))++; /* add ID or citation key to the linked list of unfound stuff */ if (append_lilifstring(ptr_gbdata->ptr_notfound_first, id_string)) { (*(ptr_gbdata->ptr_ndb_error))++; } } } free(sql_command); } else if (strcmp(new_el, "CITATION") == 0) { (*(ptr_gbdata->ptr_citation_count))++; (*(ptr_gbdata->ptr_xref_count)) = 0; /* reset multi-id */ (ptr_gbdata->ptr_curr_multi_id)[0] = '\0'; } /* end if XREF or CITATION */ /* remove current element from element stack */ ptr_el_remove = ptr_gbdata->ptr_sfirst; ptr_gbdata->ptr_sfirst = (ptr_gbdata->ptr_sfirst)->ptr_snext; free(ptr_el_remove->elvalue); if (ptr_el_remove->attrvalue) { free(ptr_el_remove->attrvalue); } free(ptr_el_remove); free(new_el); free(new_elvalue); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ id_char_handler(): handler for character data (getref). void char_handler has no return value void* ptr_data this is a ptr to "non-global" global data that all handlers share - will be cast to type struct getbib_data* const char *string ptr to a string containing the char data this string is not \0 terminated! int len length length of string ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ void id_char_handler(void *ptr_data, const char *string, int len) { struct getbib_data* ptr_gbdata; char *term_string; char *new_string; ptr_gbdata = (struct getbib_data*)ptr_data; if (*(ptr_gbdata->ptr_ndb_error) || *(ptr_gbdata->ptr_nmem_error)) { return; } term_string = malloc(len+1); if (!term_string) { (*(ptr_gbdata->ptr_nmem_error))++; return; } strncpy(term_string, string, len); term_string[len] = '\0'; if ((new_string = mstrcat((ptr_gbdata->ptr_sfirst)->elvalue, term_string, ptr_gbdata->ptr_cmid_len, 0)) == NULL) { free(term_string); (*(ptr_gbdata->ptr_nmem_error))++; return; } else { (ptr_gbdata->ptr_sfirst)->elvalue = new_string; free(term_string); } /* printf(">>%s\n", ptr_first->elvalue); */ } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ idraw_start_handler(): handler for start tags (handling citation/xref data for raw bibliographies) void idraw_start_handler has no return value void* ptr_data this is a ptr to "non-global" global data that all handlers share - will be cast to type struct getbib_data* const char *el ptr to a string containing the element name const char** ptr_attr ptr to an array of attributes (name-value pairs) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ void idraw_start_handler(void *ptr_data, const char *el, const char **ptr_attr) { struct simple_elstack* ptr_el_new; struct getbib_data* ptr_gbdata; ptr_gbdata = (struct getbib_data*)ptr_data; /* add current element to element stack */ ptr_el_new = malloc(sizeof(struct simple_elstack)); if (ptr_el_new == NULL) { (*(ptr_gbdata->ptr_nmem_error))++; } else { /* printf("have memory\n"); */ strncpy(ptr_el_new->elname, el, 63); ptr_el_new->elname[63] = '\0'; /* terminate just in case */ ptr_el_new->elvalue = malloc(256); /* something to start with */ if (ptr_el_new->elvalue == NULL) { (*(ptr_gbdata->ptr_nmem_error))++; } else { ptr_el_new->elvalue[0] = '\0'; ptr_el_new->ptr_snext = ptr_gbdata->ptr_sfirst; ptr_gbdata->ptr_sfirst = ptr_el_new; } /* printf("%s", ptr_first->elname); */ /* add attribute */ if (ptr_attr[0] && ptr_attr[1]) { ptr_el_new->attrvalue = mstrdup((char*)ptr_attr[1]); if (!ptr_el_new->attrvalue) { (*(ptr_gbdata->ptr_nmem_error))++; } } else { ptr_el_new->attrvalue = NULL; } } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ idraw_end_handler(): handler for end tags (handling citation/xref data for raw bibliographies) void idraw_end_handler has no return value void* ptr_data this is a ptr to "non-global" global data that all handlers share - will be cast to type struct getbib_data* const char *el ptr to a string containing the element name ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ void idraw_end_handler(void *ptr_data, const char *el) { size_t sql_command_len; int nis_multi = 0; char* database = ""; char* id_string; char* multi_id_string; char* multi_database = ""; char* sql_command; char* new_el; char* new_elvalue; char* new_attrvalue = NULL; char* reftype = NULL; const char *drivername; /* name of the libdbi driver */ char* real_orig_citekey = NULL; dbi_conn conn_source = NULL; dbi_result dbires; struct getbib_data* ptr_gbdata; struct simple_elstack* ptr_el_remove; ptr_gbdata = (struct getbib_data*)ptr_data; drivername = dbi_driver_get_name(dbi_conn_get_driver(ptr_gbdata->conn)); if ((new_el = mstrdup((char*)el)) == NULL) { (*(ptr_gbdata->ptr_nmem_error))++; return; } strup(new_el); if ((new_elvalue = mstrdup((char*)((ptr_gbdata->ptr_sfirst)->elvalue))) == NULL) { (*(ptr_gbdata->ptr_nmem_error))++; return; } if ((ptr_gbdata->ptr_sfirst)->attrvalue && (new_attrvalue = mstrdup((char*)((ptr_gbdata->ptr_sfirst)->attrvalue))) == NULL) { (*(ptr_gbdata->ptr_nmem_error))++; return; } if (strcmp(new_el, "XREF") == 0) { sql_command_len = 512; if ((sql_command = malloc(sql_command_len)) == NULL) { (*(ptr_gbdata->ptr_nmem_error))++; return; } id_string = getid((ptr_gbdata->ptr_sfirst)->elvalue, &database, &nis_multi); nis_multi = 0; /* protects against malformed linkends */ if ((ptr_gbdata->ptr_sfirst)->attrvalue) { multi_id_string = getid((ptr_gbdata->ptr_sfirst)->attrvalue, &multi_database, &nis_multi); } /* printf("id_string:%s<< nis_multi:%d<<\n", id_string, nis_multi); */ if (nis_multi) { /* no need to add this one as the next xref contains the same ID */ return; } if (database) { strdn(database); /* use lowercase name */ } else { database = ptr_gbdata->ptr_default_db; /* use default database */ } /* todo: use two lists for ids and citation keys to avoid database accesses here (don't care for redundant ID request), or retrieve ID of those identified by citation key and use a special linked list add command that eliminates duplicates? */ /* if orig_id is numerical, retrieve the citation key. This assumes that most documents will use citation keys anyway, so that case will be handled most efficiently */ if (is_number(id_string)) { if (!strcmp(my_dbi_conn_get_cap(ptr_gbdata->conn, "multiple_db"), "t")) { sprintf(sql_command, "SELECT refdb_citekey, refdb_type FROM %s.t_refdb WHERE refdb_id='%s' AND refdb_type!='DUMMY'", database, id_string); dbires = dbi_conn_query(ptr_gbdata->conn, sql_command); } else { /* get additional connection */ if ((conn_source = connect_to_db(ptr_gbdata->ptr_clrequest, database, 0)) == NULL) { LOG_PRINT(LOG_ERR, get_status_msg(205)); return; } sprintf(sql_command, "SELECT refdb_citekey, refdb_type FROM t_refdb WHERE refdb_id='%s' AND refdb_type!='DUMMY'", id_string); dbires = dbi_conn_query(conn_source, sql_command); } LOG_PRINT(LOG_DEBUG, sql_command); if (!dbires) { LOG_PRINT(LOG_WARNING, "select failed"); (*(ptr_gbdata->ptr_ndb_error))++; } else { if (dbi_result_next_row(dbires)) { real_orig_citekey = (char*)dbi_result_get_string(dbires, "refdb_citekey"); reftype = my_dbi_result_get_string_copy(dbires, "refdb_type"); } dbi_result_free(dbires); } if (strcmp(my_dbi_conn_get_cap(ptr_gbdata->conn, "multiple_db"), "t") && conn_source) { dbi_conn_close(conn_source); } } /* end if numerical */ else { real_orig_citekey = id_string; } if (real_orig_citekey && *real_orig_citekey) { /* see whether this citation key is already in the list */ if (!find_lilifstring(ptr_gbdata->ptr_found_first, real_orig_citekey)) { (*(ptr_gbdata->ptr_xref_count))++; /* add ID or citation key to the linked list of unfound stuff */ if (append_lilifstring(ptr_gbdata->ptr_found_first, real_orig_citekey)) { (*(ptr_gbdata->ptr_ndb_error))++; } } } else { /* ID not found */ /* add ID or citation key to the linked list of unfound stuff */ if (append_lilifstring(ptr_gbdata->ptr_notfound_first, id_string)) { (*(ptr_gbdata->ptr_ndb_error))++; } } free(sql_command); } else if (strcmp(new_el, "CITATION") == 0) { (*(ptr_gbdata->ptr_citation_count))++; (*(ptr_gbdata->ptr_xref_count)) = 0; } /* end if XREF or CITATION */ /* remove current element from element stack */ ptr_el_remove = ptr_gbdata->ptr_sfirst; ptr_gbdata->ptr_sfirst = (ptr_gbdata->ptr_sfirst)->ptr_snext; free(ptr_el_remove->elvalue); if (ptr_el_remove->attrvalue) { free(ptr_el_remove->attrvalue); } free(ptr_el_remove); free(new_el); free(new_elvalue); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ idraw_char_handler(): handler for character data (ID data for raw bibliographies). void idraw_char_handler has no return value void* ptr_data this is a ptr to "non-global" global data that all handlers share - will be cast to type struct getbib_data* const char *string ptr to a string containing the char data this string is not \0 terminated! int len length length of string ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ void idraw_char_handler(void *ptr_data, const char *string, int len) { struct getbib_data* ptr_gbdata; char *term_string; char *new_string; ptr_gbdata = (struct getbib_data*)ptr_data; if (*(ptr_gbdata->ptr_ndb_error) || *(ptr_gbdata->ptr_nmem_error)) { return; } term_string = malloc(len+1); if (!term_string) { (*(ptr_gbdata->ptr_nmem_error))++; return; } strncpy(term_string, string, len); term_string[len] = '\0'; if ((new_string = mstrcat((ptr_gbdata->ptr_sfirst)->elvalue, term_string, ptr_gbdata->ptr_cmid_len, 0)) == NULL) { free(term_string); (*(ptr_gbdata->ptr_nmem_error))++; return; } else { (ptr_gbdata->ptr_sfirst)->elvalue = new_string; free(term_string); } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ delete_idlist(): deletes the linked element list. This is to free the memory in case of an error void delete_idlist struct simple_elstack* ptr_current_element ptr to the first entry in the linked list ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ void delete_idlist(struct simple_elstack* ptr_current_element) { struct simple_elstack* ptr_el; struct simple_elstack* ptr_el_next; ptr_el = ptr_current_element; while (ptr_el != NULL) { free(ptr_el->elvalue); free(ptr_el->attrvalue); ptr_el_next = ptr_el->ptr_snext; free(ptr_el); ptr_el = ptr_el_next; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ set_alternatetext(): sets the alternatetext/authorempty stuff int set_alternatetext returns the type of title to use if no authors are given (1=part, 2=publication, 3=series, 4=first available), 0 if no title is to be used -1 in case of an error dbi_result dbires result of a query for the style values char** ptr_aempty ptr to a string which will receive an allocated copy of the AEMPTY string, if any. If there is no such string, the pointer pointed to by this parameter will be set to NULL ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int set_alternatetext(dbi_result dbires, char** ptr_aempty) { const char *qaempty; const char *xaempty; const char *qalternatetext; const char *xalternatetext; int use_title_as_author = 0; dbi_conn conn; if (!dbires || !ptr_aempty) { return -1; } *ptr_aempty = NULL; conn = dbi_result_get_conn(dbires); if (dbi_result_next_row(dbires)) { qaempty = my_dbi_result_get_string(dbires, "QAEMPTY"); xaempty = my_dbi_result_get_string(dbires, "XAEMPTY"); qalternatetext = my_dbi_result_get_string(dbires, "QALTERNATETEXT"); xalternatetext = my_dbi_result_get_string(dbires, "XALTERNATETEXT"); /* printf("string went to %s<<\n", string); */ /* first check part authors */ if (qalternatetext) { if (!strcmp(qalternatetext, "TITLEPART")) { use_title_as_author = 1; /* use part title */ } else if (!strcmp(qalternatetext, "TITLEPUB")) { use_title_as_author = 2; /* use publication title */ } else if (!strcmp(qalternatetext, "TITLESERIES")) { use_title_as_author = 3; /* use series title */ } else if (!strcmp(qalternatetext, "TITLEALL")) { use_title_as_author = 4; /* use first available title */ } else if (!strcmp(qalternatetext, "JOURNALNAME")) { use_title_as_author = 5; /* use periodical name */ } else { /* AEMPTY */ use_title_as_author = 0; if (qaempty) { *ptr_aempty = strdup(qaempty); if (!*ptr_aempty || !dbi_conn_quote_string(conn, ptr_aempty)) { LOG_PRINT(LOG_WARNING, "out of memory"); return -1; } } } } else if (xalternatetext) { if (!strcmp(xalternatetext, "TITLEPART")) { use_title_as_author = 1; /* use part title */ } else if (!strcmp(xalternatetext, "TITLEPUB")) { use_title_as_author = 2; /* use publication title */ } else if (!strcmp(xalternatetext, "TITLESERIES")) { use_title_as_author = 3; /* use series title */ } else if (!strcmp(xalternatetext, "TITLEALL")) { use_title_as_author = 4; /* use first available title */ } else if (!strcmp(xalternatetext, "JOURNALNAME")) { use_title_as_author = 5; /* use periodical name */ } else { /* AEMPTY */ use_title_as_author = 0; if (xaempty) { *ptr_aempty = strdup(xaempty); if (!ptr_aempty || !dbi_conn_quote_string(conn, ptr_aempty)) { LOG_PRINT(LOG_WARNING, "out of memory"); return -1; } } } } } /* end if have row */ return use_title_as_author; } refdb-1.0.2/src/xmlout.c000644 001750 001750 00000143345 12255427652 015751 0ustar00markusmarkus000000 000000 /*++++++++++++++++++++++ xmlout.c: refdb application server, xml export functions markus@mhoenicka.de 2002-09-05 $Id: xmlout.c,v 1.6.2.8 2006/04/05 20:19:26 mhoenicka Exp $ 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, see ++++++++++++++++++++++++*/ #include #include #include #include #include #include #include #include #include "linklist.h" #include "refdb.h" #include "connect.h" #include "refdbd.h" #include "backend.h" #include "xmlout.h" #include "strfncs.h" #include "dbfncs.h" #include "outformats.h" /* globals */ extern int n_log_level; /* forward declarations of local functions */ static int iwrite_authorlist(struct CLIENT_REQUEST* ptr_clrequest, dbi_result dbires_ref, const char* role); static int iwrite_authornames(struct CLIENT_REQUEST* ptr_clrequest, dbi_result dbires_ref, const char* role); static int iwrite_authorseps(struct CLIENT_REQUEST* ptr_clrequest, dbi_result dbires_ref, const char* role); static int iwrite_authortext(struct CLIENT_REQUEST* ptr_clrequest, dbi_result dbires_ref, const char* role); static int iwrite_editortext(struct CLIENT_REQUEST* ptr_clrequest, dbi_result dbires_ref, const char* role); static int iwrite_simple(struct CLIENT_REQUEST* ptr_clrequest, dbi_result dbires_ref, const char* elname); static int iwrite_twoatt(struct CLIENT_REQUEST* ptr_clrequest, dbi_result dbires_ref, const char* elname); static int iwrite_journalname(struct CLIENT_REQUEST* ptr_clrequest, dbi_result dbires_ref); static int iwrite_pages(struct CLIENT_REQUEST* ptr_clrequest, dbi_result dbires_ref); static int iwrite_pubdate(struct CLIENT_REQUEST* ptr_clrequest, dbi_result dbires_ref, const char* role); static int iwrite_separator(struct CLIENT_REQUEST* ptr_clrequest, dbi_result dbires_ref, unsigned int separator_id); static int iwrite_title(struct CLIENT_REQUEST* ptr_clrequest, dbi_result dbires_ref, const char* role); /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ iwrite_elstart() writes a start tag of an element to a file descriptor int iwrite_elstart 0 if fine, 1 if some error occurred struct CLIENT_REQUEST* ptr_clrequest ptr to a structure with client info const char* elname string containing the element name Liliform *ptr_first pointer to sentinel of a list of attributes int nis_empty 0 if element has data, 1 if element is empty ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int iwrite_elstart(struct CLIENT_REQUEST* ptr_clrequest, const char* elname, Liliform *ptr_first, int nis_empty) { Liliform *ptr_curr; char outbuffer[512]; if (!elname || !*elname) { /* nothing to do */ return 0; } if (tiwrite(ptr_clrequest->fd, "<", TERM_NO) == -1) { LOG_PRINT(LOG_WARNING, get_status_msg(110)); return 1; } if (tiwrite(ptr_clrequest->fd, elname, TERM_NO) == -1) { LOG_PRINT(LOG_WARNING, get_status_msg(110)); return 1; } /* add attributes if available */ if (ptr_first) { ptr_curr = ptr_first; while ((ptr_curr = get_next_liliform(ptr_curr)) != NULL) { if (ptr_curr->name && *(ptr_curr->name) && ptr_curr->value && *(ptr_curr->value)) { sprintf(outbuffer, " %s=\"%s\"", ptr_curr->name, ptr_curr->value); if (tiwrite(ptr_clrequest->fd, outbuffer, TERM_NO) == -1) { LOG_PRINT(LOG_WARNING, get_status_msg(110)); return 1; } } } } if (nis_empty) { if (tiwrite(ptr_clrequest->fd, "/>\n", TERM_NO) == -1) { LOG_PRINT(LOG_WARNING, get_status_msg(110)); return 1; } } else { if (tiwrite(ptr_clrequest->fd, ">", TERM_NO) == -1) { LOG_PRINT(LOG_WARNING, get_status_msg(110)); return 1; } } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ iwrite_elend() writes an end tag of an element to a file descriptor int iwrite_elstart 0 if fine, 1 if some error occurred struct CLIENT_REQUEST* ptr_clrequest ptr to a structure with client info const char* elname string containing the element name ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int iwrite_elend(struct CLIENT_REQUEST* ptr_clrequest, const char* elname) { if (!elname || !*elname) { /* nothing to do */ return 0; } if (tiwrite(ptr_clrequest->fd, "fd, elname, TERM_NO) == -1) { LOG_PRINT(LOG_WARNING, get_status_msg(110)); return 1; } if (tiwrite(ptr_clrequest->fd, ">\n", TERM_NO) == -1) { LOG_PRINT(LOG_WARNING, get_status_msg(110)); return 1; } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ iwrite_element() writes an element to a file descriptor int iwrite_element 0 if fine, 1 if some error occurred struct CLIENT_REQUEST* ptr_clrequest ptr to a structure with client info const char* elname string containing the element name Liliform *ptr_first pointer to sentinel of a list of attributes const char *elvalue ptr to string with element value ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int iwrite_element(struct CLIENT_REQUEST* ptr_clrequest, const char* elname, Liliform *ptr_first, const char *elvalue) { char* entitize_buf; if (!elvalue || !elname || !*elname) { /* nothing to do */ return 0; } if (iwrite_elstart(ptr_clrequest, elname, ptr_first, 0)) { return 1; } /* take care of entities */ if ((entitize_buf = strdup(elvalue)) == NULL || sgml_entitize(&entitize_buf, RISX) == NULL) { return 1; } if (tiwrite(ptr_clrequest->fd, entitize_buf, TERM_NO) == -1) { free(entitize_buf); return 1; } free(entitize_buf); if (iwrite_elend(ptr_clrequest, elname)) { return 1; } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ iwrite_pubtype() writes a pubtype element to a file descriptor. This works also for INTEXTDEF, AUTHORONLY etc. int iwrite_pubtype 0 if fine, 1 if some error occurred struct CLIENT_REQUEST* ptr_clrequest ptr to a structure with client info const char* type string containing the pubtype name unsigned int citstyle_id id of the current citstyle entry dbi_conn conn connection to database server ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int iwrite_pubtype(struct CLIENT_REQUEST* ptr_clrequest, const char* type, unsigned int citstyle_id, dbi_conn conn) { char sql_command[512]; const char *item; const char *my_type; const char type_intext[] = "INTEXT"; unsigned int refstyle_id; dbi_result dbires_ref; dbi_result dbires_pos; Liliform sentinel; sentinel.ptr_next = NULL; sentinel.name[0] = '\0'; sentinel.value = NULL; /* start pubtype element */ my_type = type; if (!strcmp(type, "INTEXTDEF")) { iwrite_elstart(ptr_clrequest, type, NULL, 0); my_type = type_intext; } else if (!strcmp(type, "AUTHORONLY") || !strcmp(type, "YEARONLY")) { iwrite_elstart(ptr_clrequest, type, NULL, 0); } else { if (insert_liliform(&sentinel, "TYPE", (char*)type)) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return 1; } iwrite_elstart(ptr_clrequest, "PUBTYPE", &sentinel, 0); delete_all_liliform(&sentinel); } sprintf(sql_command, "SELECT * FROM REFSTYLE WHERE PUBTYPE=\'%s\' AND CITSTYLEID=%u", my_type, citstyle_id); dbires_ref = dbi_conn_query(conn, sql_command); LOG_PRINT(LOG_DEBUG, sql_command); if (dbires_ref) { while (dbi_result_next_row(dbires_ref)) { /* should run only once */ refstyle_id = my_dbi_result_get_int_idval(dbires_ref, "ID"); sprintf(sql_command, "SELECT * FROM POSITIONS WHERE REFSTYLEID=%u ORDER BY POS", refstyle_id); dbires_pos = dbi_conn_query(conn, sql_command); LOG_PRINT(LOG_DEBUG, sql_command); if (dbires_pos) { /* loop over all positions */ while (dbi_result_next_row(dbires_pos)) { item = my_dbi_result_get_string(dbires_pos, "TYPE"); /* first the simple ones */ if (!strcmp(item, "ISSUE") || !strcmp(item, "PUBLISHER") || !strcmp(item, "PUBPLACE") || !strcmp(item, "SERIAL") || !strcmp(item, "VOLUME") || !strcmp(item, "ADDRESS") || !strcmp(item, "NOTES") || !strcmp(item, "ABSTRACT") || !strcmp(item, "TYPEOFWORK") || !strcmp(item, "AREA") || !strcmp(item, "OSTYPE") || !strcmp(item, "DEGREE") || !strcmp(item, "RUNNINGTIME") || !strcmp(item, "CLASSCODEINTL") || !strcmp(item, "CLASSCODEUS") || !strcmp(item, "SENDEREMAIL") || !strcmp(item, "RECIPIENTEMAIL") || !strcmp(item, "MEDIATYPE") || !strcmp(item, "NUMVOLUMES") || !strcmp(item, "EDITION") || !strcmp(item, "COMPUTER") || !strcmp(item, "CONFERENCELOCATION") || !strcmp(item, "REGISTRYNUM") || !strcmp(item, "CLASSIFICATION") || !strcmp(item, "SECTION") || !strcmp(item, "PAMPHLETNUM") || !strcmp(item, "CHAPTERNUM") || !strcmp(item, "CITEKEY") || !strcmp(item, "REFNUMBER")) { iwrite_simple(ptr_clrequest, dbires_ref, item); } /* now those with attributes */ else if (!strcmp(item, "AUTHORLIST")) { iwrite_authorlist(ptr_clrequest, dbires_ref, "PART"); } else if (!strcmp(item, "EDITORLIST")) { iwrite_authorlist(ptr_clrequest, dbires_ref, "PUB"); } else if (!strcmp(item, "SEDITORLIST")) { iwrite_authorlist(ptr_clrequest, dbires_ref, "SERIES"); } else if (!strcmp(item, "ALLALIST")) { iwrite_authorlist(ptr_clrequest, dbires_ref, "ALL"); } else if (!strcmp(item, "JOURNALNAME")) { iwrite_journalname(ptr_clrequest, dbires_ref); } else if (!strcmp(item, "PAGES")) { iwrite_pages(ptr_clrequest, dbires_ref); } else if (!strcmp(item, "PUBDATE")) { iwrite_pubdate(ptr_clrequest, dbires_ref, "PRIMARY"); } else if (!strcmp(item, "PUBDATESEC")) { iwrite_pubdate(ptr_clrequest, dbires_ref, "SECONDARY"); } else if (!strcmp(item, "PUBDATEALL")) { iwrite_pubdate(ptr_clrequest, dbires_ref, "ALL"); } else if (!strcmp(item, "USERDEF1") || !strcmp(item, "USERDEF2") || !strcmp(item, "USERDEF3") || !strcmp(item, "USERDEF4") || !strcmp(item, "USERDEF5") || !strcmp(item, "LINK0") || !strcmp(item, "LINK1") || !strcmp(item, "LINK2") || !strcmp(item, "LINK3") || !strcmp(item, "LINK4")) { iwrite_twoatt(ptr_clrequest, dbires_ref, item); } else if (!strcmp(item, "SEPARATOR")) { iwrite_separator(ptr_clrequest, dbires_ref, my_dbi_result_get_int_idval(dbires_pos, "SEPARATORID")); } else if (!strcmp(item, "TITLE")) { iwrite_title(ptr_clrequest, dbires_ref, "PART"); } else if (!strcmp(item, "BOOKTITLE")) { iwrite_title(ptr_clrequest, dbires_ref, "PUB"); } else if (!strcmp(item, "SERIESTITLE")) { iwrite_title(ptr_clrequest, dbires_ref, "SERIES"); } else if (!strcmp(item, "ALLTITLE")) { iwrite_title(ptr_clrequest, dbires_ref, "ALL"); } /* ToDo: else: something is wrong here */ } } } } /* end pubtype element */ if (!strcmp(type, "AUTHORONLY") || !strcmp(type, "YEARONLY") || !strcmp(type, "INTEXTDEF")) { iwrite_elend(ptr_clrequest, type); } else { iwrite_elend(ptr_clrequest, "PUBTYPE"); } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ iwrite_months() writes a months element to a file descriptor. int iwrite_months 0 if fine, 1 if some error occurred struct CLIENT_REQUEST* ptr_clrequest ptr to a structure with client info dbi_result dbires ptr to citstyle query result structure ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int iwrite_months(struct CLIENT_REQUEST* ptr_clrequest, dbi_result dbires) { int i; int j; char monthnames[4][12][12] = { {"JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"}, {"JANABBREV", "FEBABBREV", "MARABBREV", "APRABBREV", "MAYABBREV", "JUNABBREV", "JULABBREV", "AUGABBREV", "SEPABBREV", "OCTABBREV", "NOVABBREV", "DECABBREV"}, {"JANFULL", "FEBFULL", "MARFULL", "APRFULL", "MAYFULL", "JUNFULL", "JULFULL", "AUGFULL", "SEPFULL", "OCTFULL", "NOVFULL", "DECFULL"}, {"JANTHREELET", "FEBTHREELET", "MARTHREELET", "APRTHREELET", "MAYTHREELET", "JUNTHREELET", "JULTHREELET", "AUGTHREELET", "SEPTHREELET", "OCTTHREELET", "NOVTHREELET", "DECTHREELET"} }; Liliform sentinel; sentinel.ptr_next = NULL; sentinel.name[0] = '\0'; sentinel.value = NULL; /* start months block */ iwrite_elstart(ptr_clrequest, "MONTHS", NULL, 0); /* loop over all months */ for (i = 0; i < 12; i++) { /* fill linked list with attributes abbrev, full, threelet */ for (j = 1; j < 4; j++) { if (insert_liliform(&sentinel, monthnames[j][i]+3, (char*)my_dbi_result_get_string(dbires, monthnames[j][i]))) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); delete_all_liliform(&sentinel); return 1; } } iwrite_elstart(ptr_clrequest, monthnames[0][i], &sentinel, 1); delete_all_liliform(&sentinel); } iwrite_elend(ptr_clrequest, "MONTHS"); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ iwrite_authorlist() writes an authorlist element to a file descriptor. static int iwrite_authorlist 0 if fine, 1 if some error occurred struct CLIENT_REQUEST* ptr_clrequest ptr to a structure with client info dbi_result dbires_ref ptr to citstyle query result structure const char* role ptr to string with the authorlist role ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int iwrite_authorlist(struct CLIENT_REQUEST* ptr_clrequest, dbi_result dbires_ref, const char* role) { char *abbreviatefirst; char *abbreviatefirstmaxauthor; char *abbreviatefirstdisplayauthor; char *abbreviatefirststyle; char *abbreviatesubseq; char *abbreviatesubseqmaxauthor; char *abbreviatesubseqdisplayauthor; char *abbreviatesubseqstyle; char authorfields[4][15][31] = { {"QSTYLE", "QALTERNATESTYLE", "QALTERNATETEXT", "QABBREVIATEFIRST", "QABBREVIATEFIRSTMAXAUTHOR", "QABBREVIATEFIRSTDISPLAYAUTHOR", "QABBREVIATEFIRSTSTYLE", "QABBREVIATESUBSEQ", "QABBREVIATESUBSEQMAXAUTHOR", "QABBREVIATESUBSEQDISPLAYAUTHOR", "QABBREVIATESUBSEQSTYLE", "QAEMPTY", "QASAME", "QPRECEEDING", "QFOLLOWING"}, {"XSTYLE", "XALTERNATESTYLE", "XALTERNATETEXT", "XABBREVIATEFIRST", "XABBREVIATEFIRSTMAXAUTHOR", "XABBREVIATEFIRSTDISPLAYAUTHOR", "XABBREVIATEFIRSTSTYLE", "XABBREVIATESUBSEQ", "XABBREVIATESUBSEQMAXAUTHOR", "XABBREVIATESUBSEQDISPLAYAUTHOR", "XABBREVIATESUBSEQSTYLE", "XAEMPTY", "XASAME", "XPRECEEDING", "XFOLLOWING"}, {"YSTYLE", "YALTERNATESTYLE", "YALTERNATETEXT", "YABBREVIATEFIRST", "YABBREVIATEFIRSTMAXAUTHOR", "YABBREVIATEFIRSTDISPLAYAUTHOR", "YABBREVIATEFIRSTSTYLE", "YABBREVIATESUBSEQ", "YABBREVIATESUBSEQMAXAUTHOR", "YABBREVIATESUBSEQDISPLAYAUTHOR", "YABBREVIATESUBSEQSTYLE", "YAEMPTY", "YASAME", "YPRECEEDING", "YFOLLOWING"}, {"ZSTYLE", "ZALTERNATESTYLE", "ZALTERNATETEXT", "ZABBREVIATEFIRST", "ZABBREVIATEFIRSTMAXAUTHOR", "ZABBREVIATEFIRSTDISPLAYAUTHOR", "ZABBREVIATEFIRSTSTYLE", "ZABBREVIATESUBSEQ", "ZABBREVIATESUBSEQMAXAUTHOR", "ZABBREVIATESUBSEQDISPLAYAUTHOR", "ZABBREVIATESUBSEQSTYLE", "ZAEMPTY", "ZASAME", "ZPRECEEDING", "ZFOLLOWING"} }; int n_role = 0; Liliform sentinel; sentinel.ptr_next = NULL; sentinel.name[0] = '\0'; sentinel.value = NULL; if (!strcmp(role, "PART")) { n_role = 0; } else if (!strcmp(role, "PUB")) { n_role = 1; } else if (!strcmp(role, "SERIES")) { n_role = 2; } else if (!strcmp(role, "ALL")) { n_role = 3; } /* get required strings */ abbreviatefirst = (char*)my_dbi_result_get_string(dbires_ref, authorfields[n_role][3]); abbreviatefirstmaxauthor = (char*)my_dbi_result_get_string(dbires_ref, authorfields[n_role][4]); abbreviatefirstdisplayauthor = (char*)my_dbi_result_get_string(dbires_ref, authorfields[n_role][5]); abbreviatefirststyle = (char*)my_dbi_result_get_string(dbires_ref, authorfields[n_role][6]); abbreviatesubseq = (char*)my_dbi_result_get_string(dbires_ref, authorfields[n_role][7]); abbreviatesubseqmaxauthor = (char*)my_dbi_result_get_string(dbires_ref, authorfields[n_role][8]); abbreviatesubseqdisplayauthor = (char*)my_dbi_result_get_string(dbires_ref, authorfields[n_role][9]); abbreviatesubseqstyle = (char*)my_dbi_result_get_string(dbires_ref, authorfields[n_role][10]); /* begin authorlist block */ if (insert_liliform(&sentinel, "STYLE", (char*)my_dbi_result_get_string(dbires_ref, authorfields[n_role][0]))) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return 1; } if (insert_liliform(&sentinel, "ALTERNATESTYLE", (char*)my_dbi_result_get_string(dbires_ref, authorfields[n_role][1]))) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return 1; } if (insert_liliform(&sentinel, "ALTERNATETEXT", (char*)my_dbi_result_get_string(dbires_ref, authorfields[n_role][2]))) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return 1; } if (insert_liliform(&sentinel, "ROLE", (char*)role)) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return 1; } iwrite_elstart(ptr_clrequest, "AUTHORLIST", &sentinel, 0); delete_all_liliform(&sentinel); /* preceeding */ iwrite_element(ptr_clrequest, "PRECEEDING", NULL, my_dbi_result_get_string(dbires_ref, authorfields[n_role][13])); /* following */ iwrite_element(ptr_clrequest, "FOLLOWING", NULL, my_dbi_result_get_string(dbires_ref, authorfields[n_role][14])); if ((abbreviatefirst && *abbreviatefirst) || (abbreviatefirstmaxauthor && *abbreviatefirstmaxauthor) || (abbreviatefirstdisplayauthor && *abbreviatefirstdisplayauthor) || (abbreviatefirststyle && *abbreviatefirststyle)) { /* start abbreviatefirst block */ if (insert_liliform(&sentinel, "MAXAUTHOR", abbreviatefirstmaxauthor)) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return 1; } if (insert_liliform(&sentinel, "DISPLAYAUTHOR", abbreviatefirstdisplayauthor)) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return 1; } if (insert_liliform(&sentinel, "STYLE", abbreviatefirststyle)) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return 1; } iwrite_elstart(ptr_clrequest, "ABBREVIATEFIRST", &sentinel, 0); delete_all_liliform(&sentinel); tiwrite(ptr_clrequest->fd, abbreviatefirst, TERM_NO); /* end abbreviatefirst block */ iwrite_elend(ptr_clrequest, "ABBREVIATEFIRST"); } if ((abbreviatesubseq && *abbreviatesubseq) || (abbreviatesubseqmaxauthor && *abbreviatesubseqmaxauthor) || (abbreviatesubseqdisplayauthor && *abbreviatesubseqdisplayauthor) || (abbreviatesubseqstyle && *abbreviatesubseqstyle)) { /* start abbreviatesubseq block */ if (insert_liliform(&sentinel, "MAXAUTHOR", abbreviatesubseqmaxauthor)) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return 1; } if (insert_liliform(&sentinel, "DISPLAYAUTHOR", abbreviatesubseqdisplayauthor)) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return 1; } if (insert_liliform(&sentinel, "STYLE", abbreviatesubseqstyle)) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return 1; } iwrite_elstart(ptr_clrequest, "ABBREVIATESUBSEQ", &sentinel, 0); delete_all_liliform(&sentinel); tiwrite(ptr_clrequest->fd, abbreviatesubseq, TERM_NO); /* end abbreviatesubseq block */ iwrite_elend(ptr_clrequest, "ABBREVIATESUBSEQ"); } /* aempty */ iwrite_element(ptr_clrequest, "AEMPTY", NULL, my_dbi_result_get_string(dbires_ref, authorfields[n_role][11])); /* asame */ iwrite_element(ptr_clrequest, "ASAME", NULL, my_dbi_result_get_string(dbires_ref, authorfields[n_role][12])); /* authornames, authorseps, text elements */ iwrite_authorseps(ptr_clrequest, dbires_ref, role); iwrite_authornames(ptr_clrequest, dbires_ref, role); iwrite_authortext(ptr_clrequest, dbires_ref, role); iwrite_editortext(ptr_clrequest, dbires_ref, role); /* end authorlist block */ iwrite_elend(ptr_clrequest, "AUTHORLIST"); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ iwrite_authornames() writes an authornames element to a file descriptor. static int iwrite_authornames 0 if fine, 1 if some error occurred struct CLIENT_REQUEST* ptr_clrequest ptr to a structure with client info dbi_result dbires_ref ptr to citstyle query result structure const char* role ptr to string with the authorlist role ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int iwrite_authornames(struct CLIENT_REQUEST* ptr_clrequest, dbi_result dbires_ref, const char* role) { char *namefirstnameorder; char *namefirstinitialstyle; char *namefirstuppercase; char *nameothernameorder; char *nameotherinitialstyle; char *nameotheruppercase; char authorfields[4][6][34] = { {"QAUTHORNAMESNAMEFIRSTNAMEORDER", "QAUTHORNAMESNAMEFIRSTINITIALSTYLE", "QAUTHORNAMESNAMEFIRSTUPPERCASE", "QAUTHORNAMESNAMEOTHERNAMEORDER", "QAUTHORNAMESNAMEOTHERINITIALSTYLE", "QAUTHORNAMESNAMEOTHERUPPERCASE"}, {"XAUTHORNAMESNAMEFIRSTNAMEORDER", "XAUTHORNAMESNAMEFIRSTINITIALSTYLE", "XAUTHORNAMESNAMEFIRSTUPPERCASE", "XAUTHORNAMESNAMEOTHERNAMEORDER", "XAUTHORNAMESNAMEOTHERINITIALSTYLE", "XAUTHORNAMESNAMEOTHERUPPERCASE"}, {"YAUTHORNAMESNAMEFIRSTNAMEORDER", "YAUTHORNAMESNAMEFIRSTINITIALSTYLE", "YAUTHORNAMESNAMEFIRSTUPPERCASE", "YAUTHORNAMESNAMEOTHERNAMEORDER", "YAUTHORNAMESNAMEOTHERINITIALSTYLE", "YAUTHORNAMESNAMEOTHERUPPERCASE"}, {"ZAUTHORNAMESNAMEFIRSTNAMEORDER", "ZAUTHORNAMESNAMEFIRSTINITIALSTYLE", "ZAUTHORNAMESNAMEFIRSTUPPERCASE", "ZAUTHORNAMESNAMEOTHERNAMEORDER", "ZAUTHORNAMESNAMEOTHERINITIALSTYLE", "ZAUTHORNAMESNAMEOTHERUPPERCASE"} }; int n_role = 0; Liliform sentinel; sentinel.ptr_next = NULL; sentinel.name[0] = '\0'; sentinel.value = NULL; if (!strcmp(role, "PART")) { n_role = 0; } else if (!strcmp(role, "PUB")) { n_role = 1; } else if (!strcmp(role, "SERIES")) { n_role = 2; } else if (!strcmp(role, "ALL")) { n_role = 3; } /* get required strings */ namefirstnameorder = (char*)my_dbi_result_get_string(dbires_ref, authorfields[n_role][0]); namefirstinitialstyle = (char*)my_dbi_result_get_string(dbires_ref, authorfields[n_role][1]); namefirstuppercase = (char*)my_dbi_result_get_string(dbires_ref, authorfields[n_role][2]); nameothernameorder = (char*)my_dbi_result_get_string(dbires_ref, authorfields[n_role][3]); nameotherinitialstyle = (char*)my_dbi_result_get_string(dbires_ref, authorfields[n_role][4]); nameotheruppercase = (char*)my_dbi_result_get_string(dbires_ref, authorfields[n_role][5]); if ((namefirstnameorder && *namefirstnameorder) || (namefirstinitialstyle && *namefirstinitialstyle) || (namefirstuppercase && *namefirstuppercase) || (nameothernameorder && *nameothernameorder) || (nameotherinitialstyle && *nameotherinitialstyle) || (nameotheruppercase && *nameotheruppercase)) { /* begin authornames block */ iwrite_elstart(ptr_clrequest, "AUTHORNAMES", &sentinel, 0); if ((namefirstnameorder && *namefirstnameorder) || (namefirstinitialstyle && *namefirstinitialstyle) || (namefirstuppercase && *namefirstuppercase)) { /* start namefirst block */ if (insert_liliform(&sentinel, "NAMEORDER", namefirstnameorder)) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return 1; } if (insert_liliform(&sentinel, "INITIALSTYLE", namefirstinitialstyle)) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return 1; } if (insert_liliform(&sentinel, "UPPERCASE", namefirstuppercase)) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return 1; } iwrite_elstart(ptr_clrequest, "NAMEFIRST", &sentinel, 1); delete_all_liliform(&sentinel); } if ((nameothernameorder && *nameothernameorder) || (nameotherinitialstyle && *nameotherinitialstyle) || (nameotheruppercase && *nameotheruppercase)) { /* start nameother block */ if (insert_liliform(&sentinel, "NAMEORDER", nameothernameorder)) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return 1; } if (insert_liliform(&sentinel, "INITIALSTYLE", nameotherinitialstyle)) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return 1; } if (insert_liliform(&sentinel, "UPPERCASE", nameotheruppercase)) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return 1; } iwrite_elstart(ptr_clrequest, "NAMEOTHER", &sentinel, 1); delete_all_liliform(&sentinel); } /* end authorlist block */ iwrite_elend(ptr_clrequest, "AUTHORNAMES"); } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ iwrite_authorseps() writes an authorseps element to a file descriptor. static int iwrite_authorseps 0 if fine, 1 if some error occurred struct CLIENT_REQUEST* ptr_clrequest ptr to a structure with client info dbi_result dbires_ref ptr to citstyle query result structure const char* role ptr to string with the authorlist role ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int iwrite_authorseps(struct CLIENT_REQUEST* ptr_clrequest, dbi_result dbires_ref, const char* role) { char *twoseps; char *threesepseach; char *threesepslast; char authorfields[4][3][34] = { {"QAUTHORSEPSTWOSEPS", "QAUTHORSEPSTHREESEPSTHREESEPSEACH", "QAUTHORSEPSTHREESEPSTHREESEPSLAST"}, {"XAUTHORSEPSTWOSEPS", "XAUTHORSEPSTHREESEPSTHREESEPSEACH", "XAUTHORSEPSTHREESEPSTHREESEPSLAST"}, {"YAUTHORSEPSTWOSEPS", "YAUTHORSEPSTHREESEPSTHREESEPSEACH", "YAUTHORSEPSTHREESEPSTHREESEPSLAST"}, {"ZAUTHORSEPSTWOSEPS", "ZAUTHORSEPSTHREESEPSTHREESEPSEACH", "ZAUTHORSEPSTHREESEPSTHREESEPSLAST"} }; int n_role = 0; Liliform sentinel; sentinel.ptr_next = NULL; sentinel.name[0] = '\0'; sentinel.value = NULL; if (!strcmp(role, "PART")) { n_role = 0; } else if (!strcmp(role, "PUB")) { n_role = 1; } else if (!strcmp(role, "SERIES")) { n_role = 2; } else if (!strcmp(role, "ALL")) { n_role = 3; } /* get required strings */ twoseps = (char*)my_dbi_result_get_string(dbires_ref, authorfields[n_role][0]); threesepseach = (char*)my_dbi_result_get_string(dbires_ref, authorfields[n_role][1]); threesepslast = (char*)my_dbi_result_get_string(dbires_ref, authorfields[n_role][2]); if ((twoseps && *twoseps) || (threesepseach && *threesepseach) || (threesepslast && *threesepslast)) { /* begin authorseps block */ iwrite_elstart(ptr_clrequest, "AUTHORSEPS", &sentinel, 0); iwrite_element(ptr_clrequest, "TWOSEPS", NULL, twoseps); if ((threesepseach && *threesepseach) || (threesepslast && *threesepslast)) { /* start threeseps block */ iwrite_elstart(ptr_clrequest, "THREESEPS", &sentinel, 0); iwrite_element(ptr_clrequest, "THREESEPSEACH", NULL, threesepseach); iwrite_element(ptr_clrequest, "THREESEPSLAST", NULL, threesepslast); iwrite_elend(ptr_clrequest, "THREESEPS"); } /* end authorseps block */ iwrite_elend(ptr_clrequest, "AUTHORSEPS"); } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ iwrite_authortext() writes an authortext element to a file descriptor. static int iwrite_authortext 0 if fine, 1 if some error occurred struct CLIENT_REQUEST* ptr_clrequest ptr to a structure with client info dbi_result dbires_ref ptr to citstyle query result structure const char* role ptr to string with the authorlist role ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int iwrite_authortext(struct CLIENT_REQUEST* ptr_clrequest, dbi_result dbires_ref, const char* role) { char *singlepreceeding; char *singlefollowing; char *multiplepreceeding; char *multiplefollowing; char authorfields[4][4][34] = { {"QTEXTTEXTSINGLEPRECEEDING", "QTEXTTEXTSINGLEFOLLOWING", "QTEXTTEXTMULTIPLEPRECEEDING", "QTEXTTEXTMULTIPLEFOLLOWING"}, {"XTEXTTEXTSINGLEPRECEEDING", "XTEXTTEXTSINGLEFOLLOWING", "XTEXTTEXTMULTIPLEPRECEEDING", "XTEXTTEXTMULTIPLEFOLLOWING"}, {"YTEXTTEXTSINGLEPRECEEDING", "YTEXTTEXTSINGLEFOLLOWING", "YTEXTTEXTMULTIPLEPRECEEDING", "YTEXTTEXTMULTIPLEFOLLOWING"}, {"ZTEXTTEXTSINGLEPRECEEDING", "ZTEXTTEXTSINGLEFOLLOWING", "ZTEXTTEXTMULTIPLEPRECEEDING", "ZTEXTTEXTMULTIPLEFOLLOWING"} }; int n_role = 0; Liliform sentinel; sentinel.ptr_next = NULL; sentinel.name[0] = '\0'; sentinel.value = NULL; if (!strcmp(role, "PART")) { n_role = 0; } else if (!strcmp(role, "PUB")) { n_role = 1; } else if (!strcmp(role, "SERIES")) { n_role = 2; } else if (!strcmp(role, "ALL")) { n_role = 3; } /* get required strings */ singlepreceeding = (char*)my_dbi_result_get_string(dbires_ref, authorfields[n_role][0]); singlefollowing = (char*)my_dbi_result_get_string(dbires_ref, authorfields[n_role][1]); multiplepreceeding = (char*)my_dbi_result_get_string(dbires_ref, authorfields[n_role][2]); multiplefollowing = (char*)my_dbi_result_get_string(dbires_ref, authorfields[n_role][3]); if ((singlepreceeding && *singlepreceeding) || (singlefollowing && *singlefollowing) || (multiplepreceeding && *multiplepreceeding) || (multiplefollowing && *multiplefollowing)) { /* begin text block */ iwrite_elstart(ptr_clrequest, "TEXT", &sentinel, 0); if ((singlepreceeding && *singlepreceeding) || (singlefollowing && *singlefollowing)) { /* start textsingle block */ iwrite_elstart(ptr_clrequest, "TEXTSINGLE", &sentinel, 0); iwrite_element(ptr_clrequest, "PRECEEDING", NULL, singlepreceeding); iwrite_element(ptr_clrequest, "FOLLOWING", NULL, singlefollowing); iwrite_elend(ptr_clrequest, "TEXTSINGLE"); } if ((multiplepreceeding && *multiplepreceeding) || (multiplefollowing && *multiplefollowing)) { /* start textmultiple block */ iwrite_elstart(ptr_clrequest, "TEXTMULTIPLE", &sentinel, 0); iwrite_element(ptr_clrequest, "PRECEEDING", NULL, multiplepreceeding); iwrite_element(ptr_clrequest, "FOLLOWING", NULL, multiplefollowing); iwrite_elend(ptr_clrequest, "TEXTMULTIPLE"); } /* end authorseps block */ iwrite_elend(ptr_clrequest, "TEXT"); } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ iwrite_editortext() writes an authortext element (for editors) to a file descriptor. static int iwrite_editortext 0 if fine, 1 if some error occurred struct CLIENT_REQUEST* ptr_clrequest ptr to a structure with client info dbi_result dbires_ref ptr to citstyle query result structure const char* role ptr to string with the authorlist role ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int iwrite_editortext(struct CLIENT_REQUEST* ptr_clrequest, dbi_result dbires_ref, const char* role) { char *singlepreceeding; char *singlefollowing; char *multiplepreceeding; char *multiplefollowing; char authorfields[4][4][34] = { {"QTEXTEDTEXTSINGLEPRECEEDING", "QTEXTEDTEXTSINGLEFOLLOWING", "QTEXTEDTEXTMULTIPLEPRECEEDING", "QTEXTEDTEXTMULTIPLEFOLLOWING"}, {"XTEXTEDTEXTSINGLEPRECEEDING", "XTEXTEDTEXTSINGLEFOLLOWING", "XTEXTEDTEXTMULTIPLEPRECEEDING", "XTEXTEDTEXTMULTIPLEFOLLOWING"}, {"YTEXTEDTEXTSINGLEPRECEEDING", "YTEXTEDTEXTSINGLEFOLLOWING", "YTEXTEDTEXTMULTIPLEPRECEEDING", "YTEXTEDTEXTMULTIPLEFOLLOWING"}, {"ZTEXTEDTEXTSINGLEPRECEEDING", "ZTEXTEDTEXTSINGLEFOLLOWING", "ZTEXTEDTEXTMULTIPLEPRECEEDING", "ZTEXTEDTEXTMULTIPLEFOLLOWING"} }; int n_role = 0; Liliform sentinel; sentinel.ptr_next = NULL; sentinel.name[0] = '\0'; sentinel.value = NULL; if (!strcmp(role, "PART")) { n_role = 0; } else if (!strcmp(role, "PUB")) { n_role = 1; } else if (!strcmp(role, "SERIES")) { n_role = 2; } else if (!strcmp(role, "ALL")) { n_role = 3; } /* get required strings */ singlepreceeding = (char*)my_dbi_result_get_string(dbires_ref, authorfields[n_role][0]); singlefollowing = (char*)my_dbi_result_get_string(dbires_ref, authorfields[n_role][1]); multiplepreceeding = (char*)my_dbi_result_get_string(dbires_ref, authorfields[n_role][2]); multiplefollowing = (char*)my_dbi_result_get_string(dbires_ref, authorfields[n_role][3]); if ((singlepreceeding && *singlepreceeding) || (singlefollowing && *singlefollowing) || (multiplepreceeding && *multiplepreceeding) || (multiplefollowing && *multiplefollowing)) { /* begin text block */ iwrite_elstart(ptr_clrequest, "TEXTED", &sentinel, 0); if ((singlepreceeding && *singlepreceeding) || (singlefollowing && *singlefollowing)) { /* start textsingle block */ iwrite_elstart(ptr_clrequest, "TEXTSINGLE", &sentinel, 0); iwrite_element(ptr_clrequest, "PRECEEDING", NULL, singlepreceeding); iwrite_element(ptr_clrequest, "FOLLOWING", NULL, singlefollowing); iwrite_elend(ptr_clrequest, "TEXTSINGLE"); } if ((multiplepreceeding && *multiplepreceeding) || (multiplefollowing && *multiplefollowing)) { /* start textmultiple block */ iwrite_elstart(ptr_clrequest, "TEXTMULTIPLE", &sentinel, 0); iwrite_element(ptr_clrequest, "PRECEEDING", NULL, multiplepreceeding); iwrite_element(ptr_clrequest, "FOLLOWING", NULL, multiplefollowing); iwrite_elend(ptr_clrequest, "TEXTMULTIPLE"); } /* end authorseps block */ iwrite_elend(ptr_clrequest, "TEXTED"); } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ iwrite_journalname() writes a journalname element to a file descriptor. static int iwrite_journalname 0 if fine, 1 if some error occurred struct CLIENT_REQUEST* ptr_clrequest ptr to a structure with client info dbi_result dbires_ref ptr to citstyle query result structure ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int iwrite_journalname(struct CLIENT_REQUEST* ptr_clrequest, dbi_result dbires_ref) { Liliform sentinel; sentinel.ptr_next = NULL; sentinel.name[0] = '\0'; sentinel.value = NULL; if (insert_liliform(&sentinel, "STYLE", (char*)my_dbi_result_get_string(dbires_ref, "JOURNALNAMESTYLE"))) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return 1; } if (insert_liliform(&sentinel, "PUNCTUATION", (char*)my_dbi_result_get_string(dbires_ref, "JOURNALNAMEPUNCTUATION"))) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return 1; } if (insert_liliform(&sentinel, "DEFAULTTEXT", (char*)my_dbi_result_get_string(dbires_ref, "JOURNALNAMEDEFAULTTEXT"))) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return 1; } if (insert_liliform(&sentinel, "CASE", (char*)my_dbi_result_get_string(dbires_ref, "JOURNALNAMECASE"))) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return 1; } if (insert_liliform(&sentinel, "ALTERNATETEXT", (char*)my_dbi_result_get_string(dbires_ref, "JOURNALNAMEALTERNATETEXT"))) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return 1; } iwrite_elstart(ptr_clrequest, "JOURNALNAME", &sentinel, 0); delete_all_liliform(&sentinel); /* preceeding */ iwrite_element(ptr_clrequest, "PRECEEDING", NULL, my_dbi_result_get_string(dbires_ref, "JOURNALNAMEPRECEEDING")); /* following */ iwrite_element(ptr_clrequest, "FOLLOWING", NULL, my_dbi_result_get_string(dbires_ref, "JOURNALNAMEFOLLOWING")); iwrite_elend(ptr_clrequest, "JOURNALNAME"); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ iwrite_pages() writes a pages element to a file descriptor. static int iwrite_pages 0 if fine, 1 if some error occurred struct CLIENT_REQUEST* ptr_clrequest ptr to a structure with client info dbi_result dbires_ref ptr to citstyle query result structure ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int iwrite_pages(struct CLIENT_REQUEST* ptr_clrequest, dbi_result dbires_ref) { char *pagespagerangetype; char *pagespagerangepreceeding; char *pagespagerangefollowing; char *pagespagerangerangeseparator; char *pagessinglepagepreceeding; char *pagessinglepagefollowing; Liliform sentinel; sentinel.ptr_next = NULL; sentinel.name[0] = '\0'; sentinel.value = NULL; /* get required values */ pagespagerangetype = (char*)my_dbi_result_get_string(dbires_ref, "PAGESPAGERANGETYPE"); pagespagerangepreceeding =(char*) my_dbi_result_get_string(dbires_ref, "PAGESPAGERANGEPRECEEDING"); pagespagerangefollowing = (char*)my_dbi_result_get_string(dbires_ref, "PAGESPAGERANGEFOLLOWING"); pagespagerangerangeseparator = (char*)my_dbi_result_get_string(dbires_ref, "PAGESPAGERANGERANGESEPARATOR"); pagessinglepagepreceeding = (char*)my_dbi_result_get_string(dbires_ref, "PAGESSINGLEPAGEPRECEEDING"); pagessinglepagefollowing = (char*)my_dbi_result_get_string(dbires_ref, "PAGESSINGLEPAGEFOLLOWING"); if (insert_liliform(&sentinel, "STYLE", (char*)my_dbi_result_get_string(dbires_ref, "PAGESSTYLE"))) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return 1; } iwrite_elstart(ptr_clrequest, "PAGES", &sentinel, 0); delete_all_liliform(&sentinel); /* preceeding */ iwrite_element(ptr_clrequest, "PRECEEDING", NULL, my_dbi_result_get_string(dbires_ref, "PAGESPRECEEDING")); /* following */ iwrite_element(ptr_clrequest, "FOLLOWING", NULL, my_dbi_result_get_string(dbires_ref, "PAGESFOLLOWING")); if ((pagessinglepagepreceeding && *pagessinglepagepreceeding) || (pagessinglepagefollowing && *pagessinglepagefollowing)) { /* start singlepage block */ iwrite_elstart(ptr_clrequest, "SINGLEPAGE", NULL, 0); /* preceeding */ iwrite_element(ptr_clrequest, "PRECEEDING", NULL, pagessinglepagepreceeding); /* following */ iwrite_element(ptr_clrequest, "FOLLOWING", NULL, pagessinglepagefollowing); /* end singlepage block */ iwrite_elend(ptr_clrequest, "SINGLEPAGE"); } if ((pagespagerangetype && *pagespagerangetype) || (pagespagerangepreceeding && *pagespagerangepreceeding) || (pagespagerangefollowing && *pagespagerangefollowing) || (pagespagerangerangeseparator && *pagespagerangerangeseparator)) { /* start pagerange block */ if (insert_liliform(&sentinel, "TYPE", pagespagerangetype)) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return 1; } iwrite_elstart(ptr_clrequest, "PAGERANGE", &sentinel, 0); delete_all_liliform(&sentinel); /* preceeding */ iwrite_element(ptr_clrequest, "PRECEEDING", NULL, pagespagerangepreceeding); /* rangesep */ iwrite_element(ptr_clrequest, "RANGESEPARATOR", NULL, pagespagerangerangeseparator); /* following */ iwrite_element(ptr_clrequest, "FOLLOWING", NULL, pagespagerangefollowing); /* end pagerange block */ iwrite_elend(ptr_clrequest, "PAGERANGE"); } iwrite_elend(ptr_clrequest, "PAGES"); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ iwrite_pubdate() writes a pubdate element to a file descriptor. static int iwrite_pubdate 0 if fine, 1 if some error occurred struct CLIENT_REQUEST* ptr_clrequest ptr to a structure with client info dbi_result dbires_ref ptr to citstyle query result structure const char* role ptr to string with the authorlist role ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int iwrite_pubdate(struct CLIENT_REQUEST* ptr_clrequest, dbi_result dbires_ref, const char* role) { char pubdatefields[3][11][25] = { {"PUBDATEYEARFORMAT", "PUBDATEMONTHFORMAT", "PUBDATEFORMAT", "PUBDATESTYLE", "PUBDATEPADLEADINGZERO", "PUBDATEDAYFORMAT", "PUBDATESEQUENCE", "PUBDATEPRECEEDING", "PUBDATEFOLLOWING", "PUBDATEFIRSTSEP", "PUBDATESECONDSEP"}, {"PUBDATESECYEARFORMAT", "PUBDATESECMONTHFORMAT", "PUBDATESECFORMAT", "PUBDATESECSTYLE", "PUBDATESECPADLEADINGZERO", "PUBDATESECDAYFORMAT", "PUBDATESECSEQUENCE", "PUBDATESECPRECEEDING", "PUBDATESECFOLLOWING", "PUBDATESECFIRSTSEP", "PUBDATESECSECONDSEP"}, {"PUBDATEALLYEARFORMAT", "PUBDATEALLMONTHFORMAT", "PUBDATEALLFORMAT", "PUBDATEALLSTYLE", "PUBDATEALLPADLEADINGZERO", "PUBDATEALLDAYFORMAT", "PUBDATEALLSEQUENCE", "PUBDATEALLPRECEEDING", "PUBDATEALLFOLLOWING", "PUBDATEALLFIRSTSEP", "PUBDATEALLSECONDSEP"} }; int n_role = 0; Liliform sentinel; sentinel.ptr_next = NULL; sentinel.name[0] = '\0'; sentinel.value = NULL; if (!strcmp(role, "PRIMARY")) { n_role = 0; } else if (!strcmp(role, "SECONDARY")) { n_role = 1; } else if (!strcmp(role, "ALL")) { n_role = 2; } if (insert_liliform(&sentinel, "YEARFORMAT", (char*)my_dbi_result_get_string(dbires_ref, pubdatefields[n_role][0]))) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return 1; } if (insert_liliform(&sentinel, "MONTHFORMAT", (char*)my_dbi_result_get_string(dbires_ref, pubdatefields[n_role][1]))) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return 1; } if (insert_liliform(&sentinel, "FORMAT", (char*)my_dbi_result_get_string(dbires_ref, pubdatefields[n_role][2]))) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return 1; } if (insert_liliform(&sentinel, "STYLE", (char*)my_dbi_result_get_string(dbires_ref, pubdatefields[n_role][3]))) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return 1; } if (insert_liliform(&sentinel, "ROLE", (char*)role)) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return 1; } if (insert_liliform(&sentinel, "PADLEADINGZERO", (char*)my_dbi_result_get_string(dbires_ref, pubdatefields[n_role][4]))) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return 1; } if (insert_liliform(&sentinel, "DAYFORMAT", (char*)my_dbi_result_get_string(dbires_ref, pubdatefields[n_role][5]))) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return 1; } if (insert_liliform(&sentinel, "SEQUENCE", (char*)my_dbi_result_get_string(dbires_ref, pubdatefields[n_role][6]))) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return 1; } iwrite_elstart(ptr_clrequest, "PUBDATE", &sentinel, 0); delete_all_liliform(&sentinel); /* preceeding */ iwrite_element(ptr_clrequest, "PRECEEDING", NULL, my_dbi_result_get_string(dbires_ref, pubdatefields[n_role][7])); /* following */ iwrite_element(ptr_clrequest, "FOLLOWING", NULL, my_dbi_result_get_string(dbires_ref, pubdatefields[n_role][8])); /* firstsep */ iwrite_element(ptr_clrequest, "FIRSTSEP", NULL, my_dbi_result_get_string(dbires_ref, pubdatefields[n_role][9])); /* secondsep */ iwrite_element(ptr_clrequest, "SECONDSEP", NULL, my_dbi_result_get_string(dbires_ref, pubdatefields[n_role][10])); iwrite_elend(ptr_clrequest, "PUBDATE"); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ iwrite_separator() writes a separator element to a file descriptor. static int iwrite_separator 0 if fine, 1 if some error occurred struct CLIENT_REQUEST* ptr_clrequest ptr to a structure with client info dbi_result dbires_ref ptr to citstyle query result structure unsigned int separator_id id of the separator to format ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int iwrite_separator(struct CLIENT_REQUEST* ptr_clrequest, dbi_result dbires_ref, unsigned int separator_id) { dbi_conn conn; dbi_result dbires; char sql_command[256]; conn = dbi_result_get_conn(dbires_ref); sprintf(sql_command, "SELECT VALUE FROM SEPARATORS WHERE ID=%u", separator_id); dbires = dbi_conn_query(conn, sql_command); LOG_PRINT(LOG_DEBUG, sql_command); if (dbires) { while (dbi_result_next_row(dbires)) { /* should run only once */ iwrite_element(ptr_clrequest, "SEPARATOR", NULL, my_dbi_result_get_string(dbires, "VALUE")); } dbi_result_free(dbires); } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ iwrite_title() writes a title element to a file descriptor. static int iwrite_title 0 if fine, 1 if some error occurred struct CLIENT_REQUEST* ptr_clrequest ptr to a structure with client info dbi_result dbires_ref ptr to citstyle query result structure const char* role ptr to string with the authorlist role ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int iwrite_title(struct CLIENT_REQUEST* ptr_clrequest, dbi_result dbires_ref, const char* role) { char titlefields[4][4][22] = { {"TITLEPRECEEDING", "TITLEFOLLOWING", "TITLECASE", "TITLESTYLE"}, {"BOOKTITLEPRECEEDING", "BOOKTITLEFOLLOWING", "BOOKTITLECASE", "BOOKTITLESTYLE"}, {"SERIESTITLEPRECEEDING", "SERIESTITLEFOLLOWING", "SERIESTITLECASE", "SERIESTITLESTYLE"}, {"ALLTITLEPRECEEDING", "ALLTITLEFOLLOWING", "ALLTITLECASE", "ALLTITLESTYLE"} }; int n_role = 0; Liliform sentinel; sentinel.ptr_next = NULL; sentinel.name[0] = '\0'; sentinel.value = NULL; if (!strcmp(role, "PART")) { n_role = 0; } else if (!strcmp(role, "PUB")) { n_role = 1; } else if (!strcmp(role, "SERIES")) { n_role = 2; } else if (!strcmp(role, "ALL")) { n_role = 3; } if (insert_liliform(&sentinel, "CASE", (char*)my_dbi_result_get_string(dbires_ref, titlefields[n_role][2]))) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return 1; } if (insert_liliform(&sentinel, "STYLE", (char*)my_dbi_result_get_string(dbires_ref, titlefields[n_role][3]))) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); delete_all_liliform(&sentinel); return 1; } if (insert_liliform(&sentinel, "ROLE", (char*)role)) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); delete_all_liliform(&sentinel); return 1; } iwrite_elstart(ptr_clrequest, "TITLE", &sentinel, 0); delete_all_liliform(&sentinel); /* preceeding */ iwrite_element(ptr_clrequest, "PRECEEDING", NULL, my_dbi_result_get_string(dbires_ref, titlefields[n_role][0])); /* following */ iwrite_element(ptr_clrequest, "FOLLOWING", NULL, my_dbi_result_get_string(dbires_ref, titlefields[n_role][1])); iwrite_elend(ptr_clrequest, "TITLE"); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ iwrite_simple() writes a simple element to a file descriptor. static int iwrite_simple 0 if fine, 1 if some error occurred struct CLIENT_REQUEST* ptr_clrequest ptr to a structure with client info dbi_result dbires_ref ptr to citstyle query result structure const char* elname ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int iwrite_simple(struct CLIENT_REQUEST* ptr_clrequest, dbi_result dbires_ref, const char* elname) { Liliform sentinel; char buffer[64]; sentinel.ptr_next = NULL; sentinel.name[0] = '\0'; sentinel.value = NULL; snprintf(buffer, 64, "%sSTYLE", elname); if (insert_liliform(&sentinel, "STYLE", (char*)my_dbi_result_get_string(dbires_ref, buffer))) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return 1; } iwrite_elstart(ptr_clrequest, elname, &sentinel, 0); delete_all_liliform(&sentinel); /* preceeding */ snprintf(buffer, 64, "%sPRECEEDING", elname); iwrite_element(ptr_clrequest, "PRECEEDING", NULL, my_dbi_result_get_string(dbires_ref, buffer)); /* following */ snprintf(buffer, 64, "%sFOLLOWING", elname); iwrite_element(ptr_clrequest, "FOLLOWING", NULL, my_dbi_result_get_string(dbires_ref, buffer)); iwrite_elend(ptr_clrequest, elname); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ iwrite_twoatt() writes an element with two attributes to a file descriptor. static int iwrite_twoatt 0 if fine, 1 if some error occurred struct CLIENT_REQUEST* ptr_clrequest ptr to a structure with client info dbi_result dbires_ref ptr to citstyle query result structure const char* elname ptr to string with element name ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int iwrite_twoatt(struct CLIENT_REQUEST* ptr_clrequest, dbi_result dbires_ref, const char* elname) { char my_elname[10]; char fields[10][4][20] = { {"USERDEF1PRECEEDING", "USERDEF1FOLLOWING", "USERDEF1STYLE", "1"}, {"USERDEF2PRECEEDING", "USERDEF2FOLLOWING", "USERDEF2STYLE", "2"}, {"USERDEF3PRECEEDING", "USERDEF3FOLLOWING", "USERDEF3STYLE", "3"}, {"USERDEF4PRECEEDING", "USERDEF4FOLLOWING", "USERDEF4STYLE", "4"}, {"USERDEF5PRECEEDING", "USERDEF5FOLLOWING", "USERDEF5STYLE", "5"}, {"LINK0PRECEEDING", "LINK0FOLLOWING", "LINK0STYLE", "0"}, {"LINK1PRECEEDING", "LINK1FOLLOWING", "LINK1STYLE", "1"}, {"LINK2PRECEEDING", "LINK2FOLLOWING", "LINK2STYLE", "2"}, {"LINK3PRECEEDING", "LINK3FOLLOWING", "LINK3STYLE", "3"}, {"LINK4PRECEEDING", "LINK4FOLLOWING", "LINK4STYLE", "4"}, }; int n_role; Liliform sentinel; sentinel.ptr_next = NULL; sentinel.name[0] = '\0'; sentinel.value = NULL; if (!strncmp(elname, "USERDEF", 7)) { n_role = atoi(elname+7) - 1; /* attributes are 1-based */ strcpy(my_elname, "USERDEF"); } else if (!strncmp(elname, "LINK", 4)) { n_role = atoi(elname+4) + 5; strcpy(my_elname, "LINK"); } else { return 1; /* should never happen */ } if (insert_liliform(&sentinel, "STYLE", (char*)my_dbi_result_get_string(dbires_ref, fields[n_role][2]))) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); delete_all_liliform(&sentinel); return 1; } if (insert_liliform(&sentinel, "ROLE", fields[n_role][3])) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); delete_all_liliform(&sentinel); return 1; } iwrite_elstart(ptr_clrequest, my_elname, &sentinel, 0); delete_all_liliform(&sentinel); /* preceeding */ iwrite_element(ptr_clrequest, "PRECEEDING", NULL, my_dbi_result_get_string(dbires_ref, fields[n_role][0])); /* following */ iwrite_element(ptr_clrequest, "FOLLOWING", NULL, my_dbi_result_get_string(dbires_ref, fields[n_role][1])); iwrite_elend(ptr_clrequest, my_elname); return 0; } refdb-1.0.2/src/risxhandler.c000644 001750 001750 00000203563 12303475250 016732 0ustar00markusmarkus000000 000000 /* risxhandler.c: functions to write risx datasets to a database */ /* markus@mhoenicka.de 2003-05-13 */ /* 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ /* ToDo: - test sending incomplete or invalid XML data */ /* Overview */ /* This set of functions parses a XML file containing risx.dtd datasets. We use expat as a non-validating XML parser. We register three handlers for start tags, character data, and end tags. The elements are pushed on a stack in the start tags handler. Each structure defining an element contains a start element of another stack for the attributes of this element. These stacks are used in the character data handler and the end tag handler to retrieve parent and ancestor elements and attributes of the current element where necessary. The attribute stack of the current element is freed in the end tag handler and the current element is popped off the stack as well. */ #include #include #include #include #include /* header of the XML parser */ #include /* priority levels of log messages */ #include #include /* for getpid() */ #include /* for getpid() */ #include #include "backend.h" #include "linklist.h" #include "refdb.h" #include "refdbd.h" /* depends on backend.h */ #include "risdb.h" #include "xmlhandler.h" #include "risxhandler.h" #include "strfncs.h" #include "connect.h" #include "dbfncs.h" #include "authorinfo.h" #include "risdata.h" #include "connect.h" extern int n_log_level; extern int nongeek_offset; /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ risx_start_handler(): handler for start tags void risx_start_handler has no return value void* ptr_data this is a ptr to "non-global" global data that all handlers share - will be cast to type struct addrisx_data* const char *el ptr to a string containing the element name const char** ptr_attr ptr to an array of attributes (name-value pairs) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ void risx_start_handler(void *ptr_data, const char *el, const char **ptr_attr) { const char* type = NULL; const char* id = NULL; const char* citekey = NULL; char prefix[] = TEMP_TABLE_NAME_PREFIX; char* new_msgpool; char sql_command[1024] = ""; int i; int result; unsigned long long n_periodical_id; struct elstack* ptr_el_new; struct attrlist* ptr_attr_new; struct addrisx_data* ptr_ardata; dbi_result dbires; ptr_ardata = (struct addrisx_data*)ptr_data; if (ptr_ardata->replace_ref != ADDREF_CHECK) { *prefix = '\0'; } /* fprintf(stderr, "start_handler found el:%s<< attname:%s<< attvalue:%s<ndb_error, ptr_ardata->nmem_error, ptr_ardata->n_skip); */ /* LOG_PRINT(LOG_DEBUG, sql_command); */ if (!ptr_ardata->ndb_error && !ptr_ardata->nmem_error && !ptr_ardata->n_skip) { if (!strcmp(el, "ris")) { (ptr_ardata->depth_adjust)++; } else if (!strcmp(el, "entry")) { /* If the db server supports it, start a transaction. We want one transaction per reference */ if (my_dbi_conn_begin(ptr_ardata->conn)) { (ptr_ardata->ndb_error)++; LOG_PRINT(LOG_WARNING, "begin transaction failed"); return; } /* lock the tables we'll write to to prevent concurrent writes from different clients */ if (my_dbi_conn_lock(ptr_ardata->conn, ptr_ardata->replace_ref)) { (ptr_ardata->ndb_error)++; LOG_PRINT(LOG_WARNING, "Cannot lock tables"); return; } /* reset a few variables relevant to entries */ *(ptr_ardata->first_author) = '\0'; *(ptr_ardata->real_citekey) = '\0'; *(ptr_ardata->ck_year) = '\0'; ptr_ardata->create_new = 1; /* isolate attributes */ for (i = 0; ptr_attr[i]; i += 2) { if (!strcmp(ptr_attr[i], "type")) { type = ptr_attr[i+1]; } else if (!strcmp(ptr_attr[i], "id")) { id = ptr_attr[i+1]; } else if (!strcmp(ptr_attr[i], "citekey")) { citekey = ptr_attr[i+1]; } } /* we're out of luck if the type attribute is missing or too long */ if (!type) { (ptr_ardata->ndb_error)++; LOG_PRINT(LOG_WARNING, "type attribute missing"); return; } else if (strlen(type) > 6 || !strstr(REFTYPES,type)) { sprintf(sql_command, "426:%s->GEN\n", type); if ((new_msgpool = mstrcat(ptr_ardata->msgpool, sql_command, &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } strcpy(ptr_ardata->type, "GEN"); } else { strcpy(ptr_ardata->type, type); } /* see whether id or citekey already exist in the database */ if (citekey && *citekey) { char *new_key; /* truncate */ if ((new_key = preprocess_citekey_copy(citekey, 255)) == NULL) { return; } else { strcpy(ptr_ardata->real_citekey, new_key); free(new_key); } sprintf(sql_command, "SELECT refdb_id FROM t_%srefdb WHERE refdb_citekey=\'%s\'", prefix, ptr_ardata->real_citekey); } else if (id && *id) { if (strlen(id) > 20) { /* largest 8-byte integer */ (ptr_ardata->ndb_error)++; LOG_PRINT(LOG_WARNING, "ID value too long"); return ; } sprintf(sql_command, "SELECT refdb_id FROM t_%srefdb WHERE refdb_id=%s", prefix, id); } if (*sql_command) { /* search for existing entry */ LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(ptr_ardata->conn, sql_command); if (!dbires) { (ptr_ardata->ndb_error)++; LOG_PRINT(LOG_WARNING, "Search ID failed"); return; } /* we have to consider these cases: - addref: entry with same ID or citekey doesn't exist-> add - addref: entry with same ID/citekey exists-> error - updateref: entry with same ID/citekey doesn't exist-> add - updateref: entry with same ID/citekey exists-> update */ if (dbi_result_next_row(dbires)) { /* requested ID exists */ if (ptr_ardata->replace_ref != ADDREF_ADD && ptr_ardata->replace_ref != ADDREF_CHECK) { ptr_ardata->create_new = 0; ptr_ardata->n_refdb_id = my_dbi_result_get_idval(dbires, "refdb_id"); } else { /* we're supposed to add */ if (*(ptr_ardata->real_citekey)) {/* we can't add lest we overwrite existing data */ sprintf(sql_command, "refused to overwrite existing dataset %s", ptr_ardata->real_citekey); LOG_PRINT(LOG_INFO, sql_command); (ptr_ardata->n_skip)++; /* sprintf(sql_command, "refused to overwrite existing dataset %s\n", ptr_ardata->real_citekey); */ sprintf(sql_command, "407:"ULLSPEC":%s\n", (unsigned long long)(ptr_ardata->set_count + nongeek_offset), ptr_ardata->real_citekey); if ((new_msgpool = mstrcat(ptr_ardata->msgpool, sql_command, &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } return; } else { /* ignore numerical ID and assign a new one */ LOG_PRINT(LOG_INFO, "numerical ID ignored"); sprintf(sql_command, "409:"ULLSPEC":%s\n", (unsigned long long)(ptr_ardata->set_count + nongeek_offset), id); /* if ((new_msgpool = mstrcat(ptr_ardata->msgpool, "numerical ID ignored\n", &(ptr_ardata->msgpool_len), 0)) == NULL) { */ if ((new_msgpool = mstrcat(ptr_ardata->msgpool, sql_command, &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } } } } else { /* requested ID could not be found */ if (ptr_ardata->replace_ref == ADDREF_UPDATE) { ptr_ardata->create_new = 1; } else if (ptr_ardata->replace_ref == ADDREF_UPDATE_PERSONAL) { dbi_result_free(dbires); (ptr_ardata->ndb_error)++; LOG_PRINT(LOG_WARNING, "ID not found"); if (citekey && *citekey) { sprintf(sql_command, "411:"ULLSPEC":%s\n", (unsigned long long)(ptr_ardata->set_count + nongeek_offset), ptr_ardata->real_citekey); } else { sprintf(sql_command, "410:%s\n", id); } /* if ((new_msgpool = mstrcat(ptr_ardata->msgpool, "ID not found\n", &(ptr_ardata->msgpool_len), 0)) == NULL) { */ if ((new_msgpool = mstrcat(ptr_ardata->msgpool, sql_command, &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } return; } else if (!*(ptr_ardata->real_citekey)) { /* if add, ignore numerical ID and assign a new one */ LOG_PRINT(LOG_INFO, "numerical ID ignored"); sprintf(sql_command, "409:"ULLSPEC":%s\n", (unsigned long long)(ptr_ardata->set_count + nongeek_offset), id); /* if ((new_msgpool = mstrcat(ptr_ardata->msgpool, "numerical ID ignored\n", &(ptr_ardata->msgpool_len), 0)) == NULL) { */ if ((new_msgpool = mstrcat(ptr_ardata->msgpool, sql_command, &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } } } dbi_result_free(dbires); } else { /* no ID string */ if (ptr_ardata->replace_ref == ADDREF_UPDATE) { ptr_ardata->create_new = 1; /* if no ID string, simply add the dataset */ } else if (ptr_ardata->replace_ref == ADDREF_UPDATE_PERSONAL){ LOG_PRINT(LOG_WARNING, "ID missing"); (ptr_ardata->ndb_error)++; /* if ((new_msgpool = mstrcat(ptr_ardata->msgpool, "ID not found\n", &(ptr_ardata->msgpool_len), 0)) == NULL) { */ sprintf(sql_command, "412:"ULLSPEC"\n", (unsigned long long)(ptr_ardata->set_count + nongeek_offset)); if ((new_msgpool = mstrcat(ptr_ardata->msgpool, sql_command, &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } return; } /* else: add will assign new ID anyway */ } /* if we're replacing, first remove the existing entry as far as necessary */ if (!ptr_ardata->create_new && ptr_ardata->replace_ref != ADDREF_UPDATE_PERSONAL) { /* sprintf(sql_command, "try to replace reference "ULLSPEC"\n", (unsigned long long)(ptr_ardata->n_refdb_id)); */ /* if ((new_msgpool = mstrcat(ptr_ardata->msgpool, sql_command, &(ptr_ardata->msgpool_len), 0)) == NULL) { */ /* (ptr_ardata->nmem_error)++; */ /* return; */ /* } */ /* else { */ /* ptr_ardata->msgpool = new_msgpool; */ /* } */ /* search orphans in t_keyword */ /* printf("orphans in t_keyword\n"); */ result = remove_keyword_entries(ptr_ardata->n_refdb_id, ptr_ardata->conn, 0); if (result) { if (result == 1) { /* Todo: convert to LOG_WARNING, return user-digestible string instead */ strcpy(sql_command, "select from t_xkeyword failed\n"); } else if (result == 2) { strcpy(sql_command, "delete from t_keyword failed\n"); } else if (result == 3) { strcpy(sql_command, "delete from t_xkeyword failed\n"); } (ptr_ardata->ndb_error)++; if ((new_msgpool = mstrcat(ptr_ardata->msgpool, sql_command, &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } return; } /* else: all fine */ /* search orphans in t_author */ result = remove_author_entries(ptr_ardata->n_refdb_id, ptr_ardata->conn); if (result) { if (result == 1) { strcpy(sql_command, "select from t_xauthor failed\n"); } else if (result == 2) { strcpy(sql_command, "delete from t_author failed\n"); } else if (result == 3) { strcpy(sql_command, "delete from t_xauthor failed\n"); } (ptr_ardata->ndb_error)++; if ((new_msgpool = mstrcat(ptr_ardata->msgpool, sql_command, &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } return; } /* else: all fine */ /* search orphans in t_xuser */ result = remove_xuser_entries(ptr_ardata->n_refdb_id, ptr_ardata->username, ptr_ardata->conn); if (result != 0 && result != 4) { if (result == 1) { strcpy(sql_command, "select from t_xuser failed\n"); } else if (result == 3) { strcpy(sql_command, "delete from t_xuser failed\n"); } (ptr_ardata->ndb_error)++; if ((new_msgpool = mstrcat(ptr_ardata->msgpool, sql_command, &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } return; } /* else: all fine */ /* search orphans in t_ulink */ result = remove_ulink_entries(ptr_ardata->n_refdb_id, /*ptr_ardata->username*/ NULL, ptr_ardata->conn, 0 /* reference */); if (result != 0 && result != 4) { if (result == 1) { strcpy(sql_command, "select from t_xuser failed\n"); } else if (result == 3) { strcpy(sql_command, "delete from t_xuser failed\n"); } (ptr_ardata->ndb_error)++; if ((new_msgpool = mstrcat(ptr_ardata->msgpool, sql_command, &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } return; } /* else: all fine */ /* search orphans in t_periodical */ sprintf(sql_command, "SELECT refdb_periodical_id FROM t_refdb WHERE refdb_id="ULLSPEC, (unsigned long long)(ptr_ardata->n_refdb_id)); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(ptr_ardata->conn, sql_command); if (!dbires) { LOG_PRINT(LOG_WARNING, "deleteref failed"); if ((new_msgpool = mstrcat(ptr_ardata->msgpool, "deleteref failed\n", &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } (ptr_ardata->ndb_error)++; return; } while (dbi_result_next_row(dbires)) { n_periodical_id = my_dbi_result_get_idval(dbires, "refdb_periodical_id"); if (n_periodical_id != 0 && dbi_conn_error(ptr_ardata->conn, NULL) == 0) { if (remove_periodical_entries(n_periodical_id, ptr_ardata->conn)) { if ((new_msgpool = mstrcat(ptr_ardata->msgpool, "remove periodical failed\n", &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } (ptr_ardata->ndb_error)++; return; } } } /* end while */ dbi_result_free(dbires); /* reset all values in t_refdb, keep citekey, use new type */ sprintf(sql_command, "UPDATE t_refdb SET refdb_type=\'%s\', refdb_pubyear=NULL, refdb_secyear=NULL, refdb_startpage=NULL, refdb_endpage=NULL, refdb_abstract=NULL, refdb_title=NULL, refdb_volume=NULL, refdb_issue=NULL, refdb_booktitle=NULL, refdb_city=NULL, refdb_publisher=NULL, refdb_title_series=NULL, refdb_address=NULL, refdb_issn=NULL, refdb_pyother_info=NULL, refdb_secother_info=NULL, refdb_periodical_id=NULL, refdb_user1=NULL, refdb_user2=NULL, refdb_user3=NULL, refdb_user4=NULL, refdb_user5=NULL, refdb_typeofwork=NULL, refdb_area=NULL, refdb_ostype=NULL, refdb_degree=NULL, refdb_runningtime=NULL, refdb_classcodeintl=NULL, refdb_classcodeus=NULL, refdb_senderemail=NULL, refdb_recipientemail=NULL, refdb_mediatype=NULL, refdb_numvolumes=NULL, refdb_edition=NULL, refdb_computer=NULL, refdb_conferencelocation=NULL, refdb_registrynum=NULL, refdb_classification=NULL, refdb_section=NULL, refdb_pamphletnum=NULL, refdb_chapternum=NULL WHERE refdb_id="ULLSPEC, ptr_ardata->type, (unsigned long long)(ptr_ardata->n_refdb_id)); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(ptr_ardata->conn, sql_command); if (!dbires) { LOG_PRINT(LOG_WARNING, "deleteref failed"); if ((new_msgpool = mstrcat(ptr_ardata->msgpool, "deleteref failed\n", &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } (ptr_ardata->ndb_error)++; return; } dbi_result_free(dbires); } if (ptr_ardata->create_new) { /* generate temporary citekey if necessary */ if (!*(ptr_ardata->real_citekey)) { snprintf(ptr_ardata->real_citekey, 256, "DUMMY%s%d", ptr_ardata->ptr_clrequest->my_hostname, getpid()); } /* insert a new empty dataset into the main table to start with */ sprintf(sql_command, "INSERT INTO t_%srefdb (refdb_type,refdb_citekey) VALUES (\'%s\',\'%s\')", prefix, ptr_ardata->type, ptr_ardata->real_citekey); dbires = dbi_conn_query(ptr_ardata->conn, sql_command); LOG_PRINT(LOG_DEBUG, sql_command); if (!dbires) { (ptr_ardata->ndb_error)++; LOG_PRINT(LOG_WARNING, "insert into t_refdb failed"); return; } dbi_result_free(dbires); /* retrieve refdb_id of newly created dataset */ if (!strcmp(my_dbi_conn_get_cap(ptr_ardata->conn, "named_seq"), "f")) { ptr_ardata->n_refdb_id = dbi_conn_sequence_last(ptr_ardata->conn, NULL); } else { sprintf(sql_command, "t_%srefdb_refdb_id_seq", prefix); ptr_ardata->n_refdb_id = dbi_conn_sequence_last(ptr_ardata->conn, sql_command); } /* sprintf(sql_command, "try to add set as reference "ULLSPEC"\n", (unsigned long long)(ptr_ardata->n_refdb_id)); */ /* if ((new_msgpool = mstrcat(ptr_ardata->msgpool, sql_command, &(ptr_ardata->msgpool_len), 0)) == NULL) { */ /* LOG_PRINT(LOG_WARNING, get_status_msg(801)); */ /* (ptr_ardata->nmem_error)++; */ /* return; */ /* } */ /* else { */ /* ptr_ardata->msgpool = new_msgpool; */ /* } */ } /* end if create_new */ /* get a risdata object to pool the t_refdb info */ ptr_ardata->ptr_risdata = new_risdata(); if (!ptr_ardata->ptr_risdata) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); (ptr_ardata->nmem_error)++; return; } ptr_ardata->ptr_risdata->n_id = ptr_ardata->n_refdb_id; if (ptr_ardata->real_citekey && *ptr_ardata->real_citekey) { result = set_risdata_field(ptr_ardata->ptr_risdata, "citekey", ptr_ardata->real_citekey, ptr_ardata->conn); if (result == 1) { if ((new_msgpool = mstrcat(ptr_ardata->msgpool, (char *)get_status_msg(801), &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } } } if (ptr_ardata->type && *(ptr_ardata->type)) { result = set_risdata_field(ptr_ardata->ptr_risdata, "type", ptr_ardata->type, ptr_ardata->conn); if (result == 1) { if ((new_msgpool = mstrcat(ptr_ardata->msgpool, (char *)get_status_msg(801), &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } } } } /* end if "entry" */ else if (!strcmp(el, "date") || !strcmp(el, "reprint")) { *(ptr_ardata->year) = '\0'; *(ptr_ardata->month) = '\0'; *(ptr_ardata->day) = '\0'; *(ptr_ardata->date_buffer) = '\0'; } else if (!strcmp(el, "pubdate")) { *(ptr_ardata->otherinfo) = '\0'; } else if (!strcmp(el, "author")) { reset_authorinfo(ptr_ardata->ptr_ainfo); } else if (!strcmp(el, "part") || !strcmp(el, "set")) { ptr_ardata->authorpos = 0; } else if (!strcmp(el, "publication")) { ptr_ardata->authorpos = 0; (ptr_ardata->perinfo).full = NULL; (ptr_ardata->perinfo).abbrev = NULL; (ptr_ardata->perinfo).custabbrev1 = NULL; (ptr_ardata->perinfo).custabbrev2 = NULL; } else if (!strcmp(el, "libinfo")) { const char* user = NULL; /* isolate attributes */ for (i = 0; ptr_attr[i]; i += 2) { if (!strcmp(ptr_attr[i], "user")) { user = ptr_attr[i+1]; } } /* create user and xuser entries */ result = insert_user(user, ptr_ardata->n_refdb_id, &(ptr_ardata->n_user_id), ptr_ardata->conn, ptr_ardata->drivername, ptr_ardata->replace_ref, 0); if (result == 1) { if ((new_msgpool = mstrcat(ptr_ardata->msgpool, "search user failed\n", &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } (ptr_ardata->ndb_error)++; return; } else if (result == 2) { if ((new_msgpool = mstrcat(ptr_ardata->msgpool, "insert t_user failed\n", &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } (ptr_ardata->ndb_error)++; return; } else if (result == 3) { if ((new_msgpool = mstrcat(ptr_ardata->msgpool, "insert t_xuser failed\n", &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } (ptr_ardata->ndb_error)++; return; } else if (result == 4) { if ((new_msgpool = mstrcat(ptr_ardata->msgpool, "username too long\n", &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } (ptr_ardata->ndb_error)++; return; } else if (result == 5) { if ((new_msgpool = mstrcat(ptr_ardata->msgpool, "insert user failed\n", &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } (ptr_ardata->ndb_error)++; return; } else if (result == 6) { if ((new_msgpool = mstrcat(ptr_ardata->msgpool, "query t_xuser failed\n", &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } (ptr_ardata->ndb_error)++; return; } else if (result == 7) { if ((new_msgpool = mstrcat(ptr_ardata->msgpool, "failed to add reference to personal reference list\n", &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } (ptr_ardata->ndb_error)++; return; } else if (result == 8) { if ((new_msgpool = mstrcat(ptr_ardata->msgpool, "out of memory\n", &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } (ptr_ardata->ndb_error)++; return; } /* else: all fine */ } /* add current element to element stack */ ptr_el_new = malloc(sizeof(struct elstack)); if (ptr_el_new == NULL) { (ptr_ardata->nmem_error)++; } else { /* printf("have memory\n"); */ strncpy(ptr_el_new->elname, el, 63); ptr_el_new->elname[63] = '\0'; /* terminate just in case */ ptr_el_new->n_elvalue_len = ELVALUE_LENGTH; ptr_el_new->ptr_elvalue = malloc(ELVALUE_LENGTH); if (ptr_el_new->ptr_elvalue == NULL) { (ptr_ardata->nmem_error)++; } else { *(ptr_el_new->ptr_elvalue) = '\0'; } ptr_el_new->ptr_next = ptr_ardata->ptr_first; ptr_el_new->ptr_attr_first = NULL; ptr_ardata->ptr_first = ptr_el_new; /* printf("%s", ptr_el_new->elname); */ /* add current attributes to the element */ /* printf("add attributes\n"); */ for (i = 0; ptr_attr[i]; i += 2) { ptr_attr_new = malloc(sizeof(struct attrlist)); if (ptr_attr_new == NULL) { (ptr_ardata->nmem_error)++; break; } strncpy(ptr_attr_new->attribute_name, ptr_attr[i], 63); ptr_attr_new->attribute_name[63] = '\0'; strncpy(ptr_attr_new->attribute_value, ptr_attr[i+1], 63); ptr_attr_new->attribute_value[63] = '\0'; ptr_attr_new->ptr_next = (ptr_ardata->ptr_first)->ptr_attr_first; (ptr_ardata->ptr_first)->ptr_attr_first = ptr_attr_new; /* printf(" %s='%s'", ptr_attr[i], ptr_attr[i + 1]); */ } /* printf("done adding attributes\n"); */ (ptr_ardata->depth)++; } } return; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ risx_end_handler(): handler for end tags void risx_end_handler has no return value void* ptr_data this is a ptr to "non-global" global data that all handlers share - will be cast to type struct addrisx_data* const char *el ptr to a string containing the element name ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ void risx_end_handler(void *ptr_data, const char *el) { char sql_command[256]; char* new_msgpool = NULL; char prefix[] = TEMP_TABLE_NAME_PREFIX; int result; struct elstack* ptr_el_remove; struct attrlist* ptr_attr_remove; struct addrisx_data* ptr_ardata; dbi_result dbires; ptr_ardata = (struct addrisx_data*)ptr_data; if (ptr_ardata->replace_ref != ADDREF_CHECK) { *prefix = '\0'; } /* printf("end handler found el:%s<ndb_error, ptr_ardata->nmem_error); */ if (ptr_ardata->n_skip) { if (!strcmp(el, "entry")) { (ptr_ardata->n_skip)--; (ptr_ardata->skipped_count)++; (ptr_ardata->set_count)++; /* close transaction of skipped dataset, if any, and unlock the tables */ my_dbi_conn_rollback(ptr_ardata->conn); my_dbi_conn_unlock(ptr_ardata->conn); } return; } if (ptr_ardata->depth) { (ptr_ardata->depth)--; } if (!ptr_ardata->ndb_error && !ptr_ardata->nmem_error) { /* do a character conversion if required. expat dumps all character data as UTF-8 regardless of the input encoding */ size_t inlength; size_t outlength; char* my_elvalue = NULL; /* this ptr will be modified by iconv() */ char* my_elvalue_start = NULL; /* records initial state of my_elvalue */ const char* my_instring = NULL; /* this ptr will be modified by iconv() */ if (ptr_ardata->conv_descriptor && *((ptr_ardata->ptr_first)->ptr_elvalue)) { inlength = strlen((ptr_ardata->ptr_first)->ptr_elvalue)/* + 1 */; /* with the encodings supported by our database engines, the converted string can't be longer than the input string */ outlength = inlength + 1; if ((my_elvalue = malloc(outlength)) == NULL) { if ((new_msgpool = mstrcat(ptr_ardata->msgpool, (char *)get_status_msg(801), &(ptr_ardata->msgpool_len), 0)) == NULL) { return; } else { ptr_ardata->msgpool = new_msgpool; } (ptr_ardata->nmem_error)++; return; } /* keep start of the converted string */ my_elvalue_start = my_elvalue; /* variable will be modified by iconv, so don't use original */ my_instring = (const char*)((ptr_ardata->ptr_first)->ptr_elvalue); /* now actually do the conversion */ if (iconv(ptr_ardata->conv_descriptor, &my_instring, &inlength, &my_elvalue, &outlength) == (size_t)(-1)) { if (errno == EILSEQ) { new_msgpool = mstrcat(ptr_ardata->msgpool, "iconv: invalid input character sequence\n", &(ptr_ardata->msgpool_len), 0); LOG_PRINT(LOG_WARNING, "iconv: invalid input character sequence"); } else if (errno == E2BIG) { new_msgpool = mstrcat(ptr_ardata->msgpool, "iconv: output buffer too small\n", &(ptr_ardata->msgpool_len), 0); LOG_PRINT(LOG_WARNING, "iconv: output buffer too small"); } else if (errno == EINVAL) { new_msgpool = mstrcat(ptr_ardata->msgpool, "iconv: incomplete input character\n", &(ptr_ardata->msgpool_len), 0); LOG_PRINT(LOG_WARNING, "iconv: incomplete input character"); } if (new_msgpool == NULL) { return; } else { ptr_ardata->msgpool = new_msgpool; } (ptr_ardata->ndb_error)++; return; } /* else: conversion went ok. We free the original string and replace it with the converted copy */ if ((ptr_ardata->ptr_first)->ptr_elvalue) { free((ptr_ardata->ptr_first)->ptr_elvalue); } *my_elvalue = '\0'; /* terminate converted string */ (ptr_ardata->ptr_first)->ptr_elvalue = my_elvalue_start; (ptr_ardata->ptr_first)->n_elvalue_len = strlen((ptr_ardata->ptr_first)->ptr_elvalue); } /* else: no conversion required */ /* ------------------------------------------------------------ */ if (!strcmp(el, "title") && ptr_ardata->replace_ref != ADDREF_UPDATE_PERSONAL) { char* title_type; result = 0; if (is_descendant_of(ptr_ardata->ptr_first, "part")) { /* e.g. article, chapter titles */ result = set_risdata_field(ptr_ardata->ptr_risdata, "title", (ptr_ardata->ptr_first)->ptr_elvalue, ptr_ardata->conn); } else if (is_descendant_of(ptr_ardata->ptr_first, "publication")) { /* most important: journal titles and such */ /* also here: things like book titles */ title_type = get_attr(ptr_ardata->ptr_first, "type"); /* full is the default used by the dtd */ if (!title_type || (title_type && !strcmp(title_type, "full"))) { if (has_periodical_data(ptr_ardata->type)) { if (((ptr_ardata->perinfo).full = strdup((ptr_ardata->ptr_first)->ptr_elvalue)) == NULL || dbi_conn_quote_string(ptr_ardata->conn, &((ptr_ardata->perinfo).full)) == 0) { if ((new_msgpool = mstrcat(ptr_ardata->msgpool, (char *)get_status_msg(801), &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } (ptr_ardata->ndb_error)++; return; } } else { result = set_risdata_field(ptr_ardata->ptr_risdata, "booktitle", (ptr_ardata->ptr_first)->ptr_elvalue, ptr_ardata->conn); } } else if (title_type && !strcmp(title_type, "abbrev")) { /* abbreviated journal title */ if (((ptr_ardata->perinfo).abbrev = strdup((ptr_ardata->ptr_first)->ptr_elvalue)) == NULL || dbi_conn_quote_string(ptr_ardata->conn, &((ptr_ardata->perinfo).abbrev)) == 0) { if ((new_msgpool = mstrcat(ptr_ardata->msgpool, (char *)get_status_msg(801), &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } (ptr_ardata->ndb_error)++; return; } } else if (title_type && !strcmp(title_type, "user1")) { /* user abbrev1 of a journal title */ if (((ptr_ardata->perinfo).custabbrev1 = strdup((ptr_ardata->ptr_first)->ptr_elvalue)) == NULL || dbi_conn_quote_string(ptr_ardata->conn, &((ptr_ardata->perinfo).custabbrev1)) == 0) { if ((new_msgpool = mstrcat(ptr_ardata->msgpool, (char *)get_status_msg(801), &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } (ptr_ardata->ndb_error)++; return; } } else if (title_type && !strcmp(title_type, "user2")) { /* user abbrev1 of a journal title */ if (((ptr_ardata->perinfo).custabbrev2 = strdup((ptr_ardata->ptr_first)->ptr_elvalue)) == NULL || dbi_conn_quote_string(ptr_ardata->conn, &((ptr_ardata->perinfo).custabbrev2)) == 0) { if ((new_msgpool = mstrcat(ptr_ardata->msgpool, (char *)get_status_msg(801), &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } (ptr_ardata->ndb_error)++; return; } } else { /* this means we've received invalid risx data */ if ((new_msgpool = mstrcat(ptr_ardata->msgpool, "invalid title attribute", &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->ndb_error)++; return; } } } else { /* set */ result = set_risdata_field(ptr_ardata->ptr_risdata, "title_series", (ptr_ardata->ptr_first)->ptr_elvalue, ptr_ardata->conn); } if (result == 1) { if ((new_msgpool = mstrcat(ptr_ardata->msgpool, (char *)get_status_msg(801), &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } (ptr_ardata->ndb_error)++; return; } } /* ------------------------------------------------------------ */ else if (!strcmp(el, "author") && ptr_ardata->replace_ref != ADDREF_UPDATE_PERSONAL) { char* temp_author; if (!*(ptr_ardata->ptr_ainfo->name)) { temp_author = assemble_full_author(ptr_ardata->ptr_ainfo, &(ptr_ardata->nmem_error)); if (temp_author) { set_authorinfo_name(ptr_ardata->ptr_ainfo, temp_author); free(temp_author); } else { set_authorinfo_name(ptr_ardata->ptr_ainfo, ""); } } /* else: corporate name is in ptr_ainfo->name anyway */ /* role attribute, function checks for NULL value */ set_authorinfo_role(ptr_ardata->ptr_ainfo, get_attr(ptr_ardata->ptr_first, "role")); /* guess contributor type by occurrence, with the help of the role attribute */ if (is_descendant_of(ptr_ardata->ptr_first, "part")) { strcpy(ptr_ardata->ptr_ainfo->role, "author"); result = insert_author(ptr_ardata->ptr_ainfo, 1 /*part author*/, ptr_ardata->authorpos, ptr_ardata->n_refdb_id, ptr_ardata->conn, ptr_ardata->driver, ptr_ardata->drivername, ptr_ardata->replace_ref); if (!ptr_ardata->authorpos) { strncpy(ptr_ardata->first_author, ptr_ardata->ptr_ainfo->lastname, 255); (ptr_ardata->first_author)[255] = '\0'; } } else if (is_descendant_of(ptr_ardata->ptr_first, "publication")) { /* publication contributors are considered authors unless the monograph is a collection of parts, in which case they are editors */ if (!strcmp(ptr_ardata->type, "CHAP") || !strcmp(ptr_ardata->type, "CONF") ) { if (!*(ptr_ardata->ptr_ainfo->role)) { strcpy(ptr_ardata->ptr_ainfo->role, "editor"); } } else { if (!*(ptr_ardata->ptr_ainfo->role)) { strcpy(ptr_ardata->ptr_ainfo->role, "author"); } } result = insert_author(ptr_ardata->ptr_ainfo, 2 /*publication author*/, ptr_ardata->authorpos, ptr_ardata->n_refdb_id, ptr_ardata->conn, ptr_ardata->driver, ptr_ardata->drivername, ptr_ardata->replace_ref); } else { /* set */ if (!*(ptr_ardata->ptr_ainfo->role)) { strcpy(ptr_ardata->ptr_ainfo->role, "editor"); } result = insert_author(ptr_ardata->ptr_ainfo, 3 /*set author*/, ptr_ardata->authorpos, ptr_ardata->n_refdb_id, ptr_ardata->conn, ptr_ardata->driver, ptr_ardata->drivername, ptr_ardata->replace_ref); } if (result == 1) { if ((new_msgpool = mstrcat(ptr_ardata->msgpool, (char *)get_status_msg(801), &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } (ptr_ardata->ndb_error)++; return; } else if (result == 2) { if ((new_msgpool = mstrcat(ptr_ardata->msgpool, "query AU failed\n", &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } (ptr_ardata->ndb_error)++; return; } else if (result == 3) { if ((new_msgpool = mstrcat(ptr_ardata->msgpool, "insert AU failed\n", &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } (ptr_ardata->ndb_error)++; return; } else if (result == 4) { if ((new_msgpool = mstrcat(ptr_ardata->msgpool, "driver not supported\n", &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } (ptr_ardata->ndb_error)++; return; } else if (result == 5) { if ((new_msgpool = mstrcat(ptr_ardata->msgpool, "insert AU x failed\n", &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } (ptr_ardata->ndb_error)++; return; } (ptr_ardata->authorpos)++; } /* ------------------------------------------------------------ */ else if (!strcmp(el, "name")) { set_authorinfo_name(ptr_ardata->ptr_ainfo, (ptr_ardata->ptr_first)->ptr_elvalue); } /* ------------------------------------------------------------ */ else if (!strcmp(el, "lastname")) { set_authorinfo_lastname(ptr_ardata->ptr_ainfo, (ptr_ardata->ptr_first)->ptr_elvalue); } /* ------------------------------------------------------------ */ else if (!strcmp(el, "firstname")) { set_authorinfo_firstname(ptr_ardata->ptr_ainfo, (ptr_ardata->ptr_first)->ptr_elvalue); } /* ------------------------------------------------------------ */ else if (!strcmp(el, "middlename")) { add_authorinfo_middlename(ptr_ardata->ptr_ainfo, (ptr_ardata->ptr_first)->ptr_elvalue); } /* ------------------------------------------------------------ */ else if (!strcmp(el, "suffix")) { set_authorinfo_suffix(ptr_ardata->ptr_ainfo, (ptr_ardata->ptr_first)->ptr_elvalue); } /* ------------------------------------------------------------ */ else if (!strcmp(el, "pubdate") && ptr_ardata->replace_ref != ADDREF_UPDATE_PERSONAL) { char* pubtype; char otherinfo_buffer[512]; int ndate_type = 0; if (*(ptr_ardata->year) || *(ptr_ardata->month) || *(ptr_ardata->day) || *(ptr_ardata->otherinfo)) { pubtype = get_attr(ptr_ardata->ptr_first, "type"); if (pubtype && !strcmp(pubtype, "secondary")) { ndate_type = 1; } else { /* primary date, save for citation key */ strncpy(ptr_ardata->ck_year, ptr_ardata->year, 4); (ptr_ardata->ck_year)[4] = '\0'; } /* ToDo: check for buffer overflow and NULL strings */ sprintf(otherinfo_buffer, "/%s/%s/%s", (ptr_ardata->month) ? ptr_ardata->month : "", (ptr_ardata->day) ? ptr_ardata->day : "", (ptr_ardata->otherinfo) ? ptr_ardata->otherinfo : ""); result = set_risdata_dateinfo(ptr_ardata->ptr_risdata, ndate_type, atoi(ptr_ardata->year), otherinfo_buffer, ptr_ardata->conn); if (result == 1) { if ((new_msgpool = mstrcat(ptr_ardata->msgpool, (char *)get_status_msg(801), &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } (ptr_ardata->ndb_error)++; return; } /* else: all fine */ } } /* ------------------------------------------------------------ */ else if (!strcmp(el, "date")) { if (is_descendant_of(ptr_ardata->ptr_first, "reprint")) { sprintf(ptr_ardata->date_buffer, "%s-%s-%s", ptr_ardata->year, ptr_ardata->month, ptr_ardata->day); } } /* ------------------------------------------------------------ */ else if (!strcmp(el, "year")) { strncpy(ptr_ardata->year, (ptr_ardata->ptr_first)->ptr_elvalue, 4); (ptr_ardata->year)[4] = '\0'; } /* ------------------------------------------------------------ */ else if (!strcmp(el, "month")) { size_t len; len = strlen((ptr_ardata->ptr_first)->ptr_elvalue); if (len > 1) { strncpy(ptr_ardata->month, (ptr_ardata->ptr_first)->ptr_elvalue, 2); (ptr_ardata->month)[2] = '\0'; } else if (len == 1) { (ptr_ardata->month)[0] = '0'; (ptr_ardata->month)[1] = (ptr_ardata->ptr_first)->ptr_elvalue[0]; (ptr_ardata->month)[2] = '\0'; } else { strcpy(ptr_ardata->month, "00"); } } /* ------------------------------------------------------------ */ else if (!strcmp(el, "day")) { size_t len; len = strlen((ptr_ardata->ptr_first)->ptr_elvalue); if (len > 1) { strncpy(ptr_ardata->day, (ptr_ardata->ptr_first)->ptr_elvalue, 2); (ptr_ardata->day)[2] = '\0'; } else if (len == 1) { (ptr_ardata->day)[0] = '0'; (ptr_ardata->day)[1] = (ptr_ardata->ptr_first)->ptr_elvalue[0]; (ptr_ardata->day)[2] = '\0'; } else { strcpy(ptr_ardata->day, "00"); } } /* ------------------------------------------------------------ */ else if (!strcmp(el, "otherinfo")) { strncpy(ptr_ardata->otherinfo, (ptr_ardata->ptr_first)->ptr_elvalue, 255); (ptr_ardata->otherinfo)[255] = '\0'; } /* ------------------------------------------------------------ */ else if (!strcmp(el, "volume") && ptr_ardata->replace_ref != ADDREF_UPDATE_PERSONAL) { result = set_risdata_field(ptr_ardata->ptr_risdata, "volume", (ptr_ardata->ptr_first)->ptr_elvalue, ptr_ardata->conn); if (result == 1) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); if ((new_msgpool = mstrcat(ptr_ardata->msgpool, (char *)get_status_msg(801), &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } (ptr_ardata->ndb_error)++; return; } /* else: all fine */ } /* ------------------------------------------------------------ */ else if (!strcmp(el, "issue") && ptr_ardata->replace_ref != ADDREF_UPDATE_PERSONAL) { result = set_risdata_field(ptr_ardata->ptr_risdata, "issue", (ptr_ardata->ptr_first)->ptr_elvalue, ptr_ardata->conn); if (result == 1) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); if ((new_msgpool = mstrcat(ptr_ardata->msgpool, (char *)get_status_msg(801), &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } (ptr_ardata->ndb_error)++; return; } /* else: all fine */ } /* ------------------------------------------------------------ */ else if (!strcmp(el, "conftitle") && ptr_ardata->replace_ref != ADDREF_UPDATE_PERSONAL) { result = set_risdata_field(ptr_ardata->ptr_risdata, "booktitle", (ptr_ardata->ptr_first)->ptr_elvalue, ptr_ardata->conn); if (result == 1) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); if ((new_msgpool = mstrcat(ptr_ardata->msgpool, (char *)get_status_msg(801), &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } (ptr_ardata->ndb_error)++; return; } /* else: all fine */ } /* ------------------------------------------------------------ */ else if (!strcmp(el, "startpage") && ptr_ardata->replace_ref != ADDREF_UPDATE_PERSONAL) { result = set_risdata_field(ptr_ardata->ptr_risdata, "startpage", (ptr_ardata->ptr_first)->ptr_elvalue, ptr_ardata->conn); if (result == 1) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); if ((new_msgpool = mstrcat(ptr_ardata->msgpool, (char *)get_status_msg(801), &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } (ptr_ardata->ndb_error)++; return; } /* else: all fine */ } /* ------------------------------------------------------------ */ else if (!strcmp(el, "endpage") && ptr_ardata->replace_ref != ADDREF_UPDATE_PERSONAL) { result = set_risdata_field(ptr_ardata->ptr_risdata, "endpage", (ptr_ardata->ptr_first)->ptr_elvalue, ptr_ardata->conn); if (result == 1) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); if ((new_msgpool = mstrcat(ptr_ardata->msgpool, (char *)get_status_msg(801), &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } (ptr_ardata->ndb_error)++; return; } /* else: all fine */ } /* ------------------------------------------------------------ */ else if (!strcmp(el, "city") && ptr_ardata->replace_ref != ADDREF_UPDATE_PERSONAL) { result = set_risdata_field(ptr_ardata->ptr_risdata, "city", (ptr_ardata->ptr_first)->ptr_elvalue, ptr_ardata->conn); if (result == 1) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); if ((new_msgpool = mstrcat(ptr_ardata->msgpool, (char *)get_status_msg(801), &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } (ptr_ardata->ndb_error)++; return; } /* else: all fine */ } /* ------------------------------------------------------------ */ else if (!strcmp(el, "publisher") && ptr_ardata->replace_ref != ADDREF_UPDATE_PERSONAL) { result = set_risdata_field(ptr_ardata->ptr_risdata, "publisher", (ptr_ardata->ptr_first)->ptr_elvalue, ptr_ardata->conn); if (result == 1) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); if ((new_msgpool = mstrcat(ptr_ardata->msgpool, (char *)get_status_msg(801), &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } (ptr_ardata->ndb_error)++; return; } /* else: all fine */ } /* ------------------------------------------------------------ */ else if (!strcmp(el, "serial") && ptr_ardata->replace_ref != ADDREF_UPDATE_PERSONAL) { result = set_risdata_field(ptr_ardata->ptr_risdata, "issn", (ptr_ardata->ptr_first)->ptr_elvalue, ptr_ardata->conn); if (result == 1) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); if ((new_msgpool = mstrcat(ptr_ardata->msgpool, (char *)get_status_msg(801), &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } (ptr_ardata->ndb_error)++; return; } /* else: all fine */ } /* ------------------------------------------------------------ */ else if (!strcmp(el, "address") && ptr_ardata->replace_ref != ADDREF_UPDATE_PERSONAL) { result = set_risdata_field(ptr_ardata->ptr_risdata, "address", (ptr_ardata->ptr_first)->ptr_elvalue, ptr_ardata->conn); if (result == 1) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); if ((new_msgpool = mstrcat(ptr_ardata->msgpool, (char *)get_status_msg(801), &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } (ptr_ardata->ndb_error)++; return; } /* else: all fine */ } /* ------------------------------------------------------------ */ /* else if (!strcmp(el, "url") && ptr_ardata->replace_ref != ADDREF_UPDATE_PERSONAL) { */ /* result = insert_ulink((ptr_ardata->ptr_first)->ptr_elvalue, 0 /\* URL *\/, ptr_ardata->n_refdb_id, ptr_ardata->conn, ptr_ardata->driver, ptr_ardata->drivername, ptr_ardata->n_user_id, 0 /\* reference *\/, ptr_ardata->replace_ref); */ /* /\* result = set_risdata_field(ptr_ardata->ptr_risdata, "url", (ptr_ardata->ptr_first)->ptr_elvalue, ptr_ardata->conn); *\/ */ /* if (result == 1) { */ /* LOG_PRINT(LOG_WARNING, get_status_msg(801)); */ /* if ((new_msgpool = mstrcat(ptr_ardata->msgpool, (char *)get_status_msg(801), &(ptr_ardata->msgpool_len), 0)) == NULL) { */ /* (ptr_ardata->nmem_error)++; */ /* return; */ /* } */ /* else { */ /* ptr_ardata->msgpool = new_msgpool; */ /* } */ /* (ptr_ardata->ndb_error)++; */ /* return; */ /* } */ /* /\* else: all fine *\/ */ /* } */ /* ------------------------------------------------------------ */ else if (!strcmp(el, "userdef") && ptr_ardata->replace_ref != ADDREF_UPDATE_PERSONAL) { char* type; char tofield[6] = "user1"; type = get_attr(ptr_ardata->ptr_first, "type"); if (type) { if (!strcmp(type, "1")) { strcpy(tofield, "user1"); } else if (!strcmp(type, "2")) { strcpy(tofield, "user2"); } else if (!strcmp(type, "3")) { strcpy(tofield, "user3"); } else if (!strcmp(type, "4")) { strcpy(tofield, "user4"); } else if (!strcmp(type, "5")) { strcpy(tofield, "user5"); } result = set_risdata_field(ptr_ardata->ptr_risdata, tofield, (ptr_ardata->ptr_first)->ptr_elvalue, ptr_ardata->conn); if (result == 1) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); if ((new_msgpool = mstrcat(ptr_ardata->msgpool, (char *)get_status_msg(801), &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } (ptr_ardata->ndb_error)++; return; } /* else: all fine */ } } /* ------------------------------------------------------------ */ else if (!strcmp(el, "misc") && ptr_ardata->replace_ref != ADDREF_UPDATE_PERSONAL) { char* type; char tofield[11] = "misc1"; type = get_attr(ptr_ardata->ptr_first, "type"); if (type) { if (!strcmp(type, "1")) { strcpy(tofield, "misc1"); } else if (!strcmp(type, "2")) { if (!strcmp(ptr_ardata->type, "ADVS")) { strcpy(tofield, "doi"); } else { strcpy(tofield, "misc2"); } } else if (!strcmp(type, "3")) { if (strcmp(ptr_ardata->type, "ADVS") && strcmp(ptr_ardata->type, "COMP") && strcmp(ptr_ardata->type, "MPCT") && strcmp(ptr_ardata->type, "PAT") && strcmp(ptr_ardata->type, "SOUND") && strcmp(ptr_ardata->type, "VIDEO")) { strcpy(tofield, "doi"); } else if (!strcmp(ptr_ardata->type, "ADVS") || !strcmp(ptr_ardata->type, "COMP") || !strcmp(ptr_ardata->type, "MPCT") || !strcmp(ptr_ardata->type, "SOUND") || !strcmp(ptr_ardata->type, "VIDEO")) { strcpy(tofield, "mediatype"); } else if (!strcmp(ptr_ardata->type, "PAT")) { strcpy(tofield, "typeofwork"); } } if (!strcmp(tofield, "doi")) { result = insert_ulink((ptr_ardata->ptr_first)->ptr_elvalue, 5 /* doi */, ptr_ardata->n_refdb_id, ptr_ardata->conn, ptr_ardata->driver, ptr_ardata->drivername, ptr_ardata->n_user_id, 0 /* reference */, ptr_ardata->replace_ref); } else { result = set_risdata_field(ptr_ardata->ptr_risdata, tofield, (ptr_ardata->ptr_first)->ptr_elvalue, ptr_ardata->conn); } if (result == 1) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); if ((new_msgpool = mstrcat(ptr_ardata->msgpool, (char *)get_status_msg(801), &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } (ptr_ardata->ndb_error)++; return; } /* else: all fine */ } } /* ------------------------------------------------------------ */ else if (!strcmp(el, "link")) { char* type; int n_type; unsigned long long n_user_id; type = get_attr(ptr_ardata->ptr_first, "type"); if (type) { if (!strcmp(type, "pdf")) { n_type = 1; } else if (!strcmp(type, "fulltext")) { n_type = 2; } else if (!strcmp(type, "related")) { n_type = 3; } else if (!strcmp(type, "image")) { n_type = 4; } else if (!strcmp(type, "doi")) { n_type = 5; } else { /* url or attribute missing */ n_type = 0; } /* if descendant of libinfo, use username, else don't */ if (is_descendant_of(ptr_ardata->ptr_first, "libinfo")) { n_user_id = ptr_ardata->n_user_id; } else { n_user_id = 0; } result = insert_ulink((ptr_ardata->ptr_first)->ptr_elvalue, n_type, ptr_ardata->n_refdb_id, ptr_ardata->conn, ptr_ardata->driver, ptr_ardata->drivername, n_user_id, 0 /* reference */, ptr_ardata->replace_ref); /* result = set_risdata_field(ptr_ardata->ptr_risdata, tofield, (ptr_ardata->ptr_first)->ptr_elvalue, ptr_ardata->conn); */ if (result == 1) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); if ((new_msgpool = mstrcat(ptr_ardata->msgpool, (char *)get_status_msg(801), &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } (ptr_ardata->ndb_error)++; return; } /* else: all fine */ } } /* ------------------------------------------------------------ */ else if (!strcmp(el, "notes")) { result = update_notes((ptr_ardata->ptr_first)->ptr_elvalue, ptr_ardata->n_refdb_id, ptr_ardata->n_user_id, ptr_ardata->conn, ptr_ardata->driver, ptr_ardata->replace_ref); if (result == 1) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); if ((new_msgpool = mstrcat(ptr_ardata->msgpool, (char *)get_status_msg(801), &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } (ptr_ardata->ndb_error)++; return; } else if (result == 2) { LOG_PRINT(LOG_WARNING, "update N1 failed"); if ((new_msgpool = mstrcat(ptr_ardata->msgpool, "update N1 failed\n", &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } (ptr_ardata->ndb_error)++; return; } /* else: all fine */ } /* ------------------------------------------------------------ */ else if (!strcmp(el, "availability")) { char* type; char* temp_avail; /* check whether we have a full string or one that relies on pdfroot */ type = get_attr(ptr_ardata->ptr_first, "type"); if (type && !strcmp(type, "useroot")) { if ((temp_avail = malloc(strlen((ptr_ardata->ptr_first)->ptr_elvalue)+6)) == NULL) { (ptr_ardata->nmem_error)++; return; } /* skip adding PATH: to data that already contain this prefix this was added erroneously by some previous versions */ if (strncmp((ptr_ardata->ptr_first)->ptr_elvalue, "PATH:", 5)) { strcpy(temp_avail, "PATH:"); } else { *temp_avail = '\0'; } strcat(temp_avail, (ptr_ardata->ptr_first)->ptr_elvalue); result = update_avail(temp_avail, ptr_ardata->n_refdb_id, ptr_ardata->n_user_id, ptr_ardata->conn, ptr_ardata->driver, ptr_ardata->replace_ref); free(temp_avail); } else { /* full string, not a path */ result = update_avail((ptr_ardata->ptr_first)->ptr_elvalue, ptr_ardata->n_refdb_id, ptr_ardata->n_user_id, ptr_ardata->conn, ptr_ardata->driver, ptr_ardata->replace_ref); } if (result == 1) { if ((new_msgpool = mstrcat(ptr_ardata->msgpool, (char *)get_status_msg(801), &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } (ptr_ardata->ndb_error)++; return; } else if (result == 2) { if ((new_msgpool = mstrcat(ptr_ardata->msgpool, "update AV failed\n", &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } (ptr_ardata->ndb_error)++; return; } /* else: all fine */ } /* ------------------------------------------------------------ */ else if (!strcmp(el, "reprint")) { char* rptype; int n_rptype = 1; /* find out reprint type */ rptype = get_attr(ptr_ardata->ptr_first, "status"); if (!rptype || !strcmp(rptype, "NOTINFILE")) { n_rptype = 1; /* not in file */ } else if (!strcmp(rptype, "INFILE")) { n_rptype = 0; } else if (!strcmp(rptype, "ONREQUEST")) { n_rptype = 2; } result = update_reprint(n_rptype, ptr_ardata->n_refdb_id, ptr_ardata->n_user_id, ptr_ardata->conn, ptr_ardata->date_buffer, ptr_ardata->replace_ref); if (result) { if ((new_msgpool = mstrcat(ptr_ardata->msgpool, "update RP failed\n", &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } (ptr_ardata->ndb_error)++; return; } } /* ------------------------------------------------------------ */ else if (!strcmp(el, "abstract") && ptr_ardata->replace_ref != ADDREF_UPDATE_PERSONAL) { result = set_risdata_field(ptr_ardata->ptr_risdata, "abstract", (ptr_ardata->ptr_first)->ptr_elvalue, ptr_ardata->conn); if (result == 1) { if ((new_msgpool = mstrcat(ptr_ardata->msgpool, (char *)get_status_msg(801), &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } (ptr_ardata->ndb_error)++; return; } /* else: all fine */ } /* ------------------------------------------------------------ */ else if (!strcmp(el, "keyword") && ptr_ardata->replace_ref != ADDREF_UPDATE_PERSONAL) { result = insert_keyword((ptr_ardata->ptr_first)->ptr_elvalue, ptr_ardata->n_refdb_id, ptr_ardata->conn, ptr_ardata->driver, ptr_ardata->drivername, 0, ptr_ardata->replace_ref); if (result == 1) { if ((new_msgpool = mstrcat(ptr_ardata->msgpool, (char *)get_status_msg(801), &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } (ptr_ardata->ndb_error)++; return; } else if (result == 2) { if ((new_msgpool = mstrcat(ptr_ardata->msgpool, "query KW failed\n", &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } (ptr_ardata->ndb_error)++; return; } else if (result == 3) { if ((new_msgpool = mstrcat(ptr_ardata->msgpool, "insert KW failed\n", &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } (ptr_ardata->ndb_error)++; return; } else if (result == 4) { if ((new_msgpool = mstrcat(ptr_ardata->msgpool, "driver not supported\n", &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } (ptr_ardata->ndb_error)++; return; } else if (result == 5) { if ((new_msgpool = mstrcat(ptr_ardata->msgpool, "insert KW x failed\n", &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } (ptr_ardata->ndb_error)++; return; } /* else: all fine */ } /* ------------------------------------------------------------ */ else if (!strcmp(el, "publication") && ptr_ardata->replace_ref != ADDREF_UPDATE_PERSONAL) { /* we've collected all journal name synonyms, if any */ if ((ptr_ardata->perinfo).full || (ptr_ardata->perinfo).abbrev || (ptr_ardata->perinfo).custabbrev1 || (ptr_ardata->perinfo).custabbrev2) { result = insert_periodical(&(ptr_ardata->perinfo), ptr_ardata->n_refdb_id, ptr_ardata->replace_ref, 0 /*nis_dummy*/, ptr_ardata->conn, ptr_ardata->drivername); if ((ptr_ardata->perinfo).full) { free((ptr_ardata->perinfo).full); } if ((ptr_ardata->perinfo).abbrev) { free((ptr_ardata->perinfo).abbrev); } if ((ptr_ardata->perinfo).custabbrev1) { free((ptr_ardata->perinfo).custabbrev1); } if ((ptr_ardata->perinfo).custabbrev2) { free((ptr_ardata->perinfo).custabbrev2); } if (result == 1) { if ((new_msgpool = mstrcat(ptr_ardata->msgpool, (char *)get_status_msg(801), &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } (ptr_ardata->ndb_error)++; return; } else if (result == 2) { if ((new_msgpool = mstrcat(ptr_ardata->msgpool, "insert JX failed\n", &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } (ptr_ardata->ndb_error)++; return; } else if (result == 3) { if ((new_msgpool = mstrcat(ptr_ardata->msgpool, "driver not supported\n", &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } (ptr_ardata->ndb_error)++; return; } else if (result == 4) { if ((new_msgpool = mstrcat(ptr_ardata->msgpool, "select from t_periodical failed\n", &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } (ptr_ardata->ndb_error)++; return; } else if (result == 5) { if ((new_msgpool = mstrcat(ptr_ardata->msgpool, "read from t_periodical failed\n", &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } (ptr_ardata->ndb_error)++; return; } else if (result == 6) { if ((new_msgpool = mstrcat(ptr_ardata->msgpool, "update JF failed\n", &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } (ptr_ardata->ndb_error)++; return; } else if (result == 7) { if ((new_msgpool = mstrcat(ptr_ardata->msgpool, "update JO failed\n", &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } (ptr_ardata->ndb_error)++; return; } else if (result == 8) { if ((new_msgpool = mstrcat(ptr_ardata->msgpool, "update J1 failed\n", &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } (ptr_ardata->ndb_error)++; return; } else if (result == 9) { if ((new_msgpool = mstrcat(ptr_ardata->msgpool, "update J2 failed\n", &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } (ptr_ardata->ndb_error)++; return; } else if (result == 10) { if ((new_msgpool = mstrcat(ptr_ardata->msgpool, "update periodical failed\n", &(ptr_ardata->msgpool_len), 0)) == NULL) { (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } (ptr_ardata->ndb_error)++; return; } /* else: all fine */ } } /* ------------------------------------------------------------ */ else if (!strcmp(el, "entry")) { const char* citekey; int result; /* insert new citekey if required */ if (!strncmp(ptr_ardata->real_citekey, "DUMMY", 5) && ptr_ardata->create_new) { citekey = get_unique_citekey(ptr_ardata->conn, ptr_ardata->first_author, atoi(ptr_ardata->ck_year), 0 /* ref */, ptr_ardata->replace_ref); if (citekey && set_risdata_field(ptr_ardata->ptr_risdata, "citekey", citekey, ptr_ardata->conn) != 0) { if (citekey) { free((char*)citekey); } (ptr_ardata->ndb_error)++; } strcpy(ptr_ardata->real_citekey, citekey); free((char*)citekey); } /* commit t_refdb_data */ result = commit_risdata_fields(ptr_ardata->ptr_risdata, ptr_ardata->conn, ptr_ardata->replace_ref); if (result == 1) { (ptr_ardata->ndb_error)++; } else if (result == 2) { (ptr_ardata->nmem_error)++; } /* free risdata object */ free_risdata(ptr_ardata->ptr_risdata); ptr_ardata->ptr_risdata = NULL; /* close transaction, if any */ my_dbi_conn_commit(ptr_ardata->conn); if (insert_lilid(ptr_ardata->ptr_id_sentinel, ptr_ardata->n_refdb_id)) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); } if (*(ptr_ardata->real_citekey)) { /* still empty if we update the reference */ /* sprintf(sql_command, "Citation key: %s\n", ptr_ardata->real_citekey); */ sprintf(sql_command, "406:%s\n", ptr_ardata->real_citekey); if ((new_msgpool = mstrcat(ptr_ardata->msgpool, sql_command, &(ptr_ardata->msgpool_len), 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); (ptr_ardata->nmem_error)++; } else { ptr_ardata->msgpool = new_msgpool; } } if (ptr_ardata->ndb_error || ptr_ardata->nmem_error) { if (strcmp(my_dbi_conn_get_cap(ptr_ardata->conn, "transaction"), "t")) { /* we have to delete the junk reference manually */ sprintf(sql_command, "DELETE FROM t_%srefdb WHERE refdb_citekey=\'DUMMY%d\'", prefix, getpid()); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(ptr_ardata->conn, sql_command); if (!dbires) { LOG_PRINT(LOG_INFO, "removing junk reference failed"); } dbi_result_free(dbires); } else { my_dbi_conn_rollback(ptr_ardata->conn); } my_dbi_conn_unlock(ptr_ardata->conn); } else { my_dbi_conn_unlock(ptr_ardata->conn); if (ptr_ardata->create_new) { /* sprintf(sql_command, "Adding input set "ULLSPEC" successful\n", (unsigned long long)(ptr_ardata->set_count + nongeek_offset)); */ sprintf(sql_command, "408:"ULLSPEC":%s:"ULLSPEC"\n", (unsigned long long)(ptr_ardata->set_count + nongeek_offset), ptr_ardata->real_citekey, ptr_ardata->n_refdb_id); (ptr_ardata->added_count)++; } else { /* sprintf(sql_command, "Updating input set "ULLSPEC" successful\n", (unsigned long long)(ptr_ardata->set_count + nongeek_offset)); */ sprintf(sql_command, "413:"ULLSPEC":%s:"ULLSPEC"\n", (unsigned long long)(ptr_ardata->set_count + nongeek_offset), ptr_ardata->real_citekey, ptr_ardata->n_refdb_id); (ptr_ardata->updated_count)++; } if ((new_msgpool = mstrcat(ptr_ardata->msgpool, sql_command, &(ptr_ardata->msgpool_len), 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); (ptr_ardata->nmem_error)++; return; } else { ptr_ardata->msgpool = new_msgpool; } (ptr_ardata->set_count)++; } } } /* printf("removing %s from elstack\n", (ptr_ardata->ptr_first)->elname); */ /* remove attributes of the current element from the list */ if (ptr_ardata->depth && ptr_ardata->ptr_first) { ptr_attr_remove = (ptr_ardata->ptr_first)->ptr_attr_first; while (ptr_attr_remove) { (ptr_ardata->ptr_first)->ptr_attr_first = ((ptr_ardata->ptr_first)->ptr_attr_first)->ptr_next; free(ptr_attr_remove); ptr_attr_remove = (ptr_ardata->ptr_first)->ptr_attr_first; } /* free element value string */ if ((ptr_ardata->ptr_first)->ptr_elvalue) { free((ptr_ardata->ptr_first)->ptr_elvalue); } /* remove current element from element stack */ ptr_el_remove = ptr_ardata->ptr_first; ptr_ardata->ptr_first = (ptr_ardata->ptr_first)->ptr_next; if (ptr_el_remove) { free(ptr_el_remove); } } return; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ risx_char_handler(): handler for character data. void risx_char_handler has no return value void* ptr_data this is a ptr to "non-global" global data that all handlers share - will be cast to type struct addrisx_data* const char *string ptr to a string containing the char data this string is not \0 terminated and could be only a part of the character data of an element! int len length length of string ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ void risx_char_handler(void *ptr_data, const char *string, int len) { struct addrisx_data* ptr_ardata; char* new_elvalue; char* buffer; /* printf("char handler found data:<<\n"); */ ptr_ardata = (struct addrisx_data*)ptr_data; if (ptr_ardata->ndb_error || ptr_ardata->nmem_error || ptr_ardata->n_skip) { return; } /* get one byte extra for the terminating \0 */ buffer = malloc(len+1); if (!buffer) { (ptr_ardata->nmem_error)++; return; } strncpy(buffer, string, len); buffer[len] = '\0'; /* concatenate with existing elvalue. The latter will be of zero length if this is the first chunk */ new_elvalue = mstrcat((ptr_ardata->ptr_first)->ptr_elvalue, buffer, &((ptr_ardata->ptr_first)->n_elvalue_len), 0); free(buffer); if (new_elvalue) { (ptr_ardata->ptr_first)->ptr_elvalue = new_elvalue; } else { (ptr_ardata->nmem_error)++; } return; } refdb-1.0.2/src/authorinfo.c000644 001750 001750 00000030305 12255427650 016564 0ustar00markusmarkus000000 000000 /*+++++++++++++++++++++++++++++ authorinfo.c: functions to fiddle with author names markus@mhoenicka.de 2003-10-03 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, see ++++++++++++++++++++++++++*/ #include #include #include "strfncs.h" #include "authorinfo.h" /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ assemble_full_author(): assembles a normalized full author name from the name parts char* assemble_full_author returns ptr to a malloc'ed string which the calling function has to free struct AUTHOR_INFO* ptr_ainfo ptr to struct containing the name parts int* ptr_error ptr to an error counter, will be incremented in case of an error ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* assemble_full_author(struct AUTHOR_INFO* ptr_ainfo, int* ptr_error) { char* item; char* temp_author; char* temp_middle; char* new_temp_author; char bitsandpieces[6]; size_t temp_author_len = 256; if ((temp_author = malloc(temp_author_len)) == NULL) { (*ptr_error)++; return NULL; } if ((new_temp_author = mstrcpy(temp_author, ptr_ainfo->lastname, &temp_author_len)) == NULL) { (*ptr_error)++; free(temp_author); return NULL; } else { temp_author = new_temp_author; } if (*(ptr_ainfo->firstname)) { if ((new_temp_author = mstrcat(temp_author, ",", &temp_author_len, 0)) == NULL) { (*ptr_error)++; free(temp_author); return NULL; } else { temp_author = new_temp_author; } /* we've got to analyze whether this is a full first name or some hyphenated double initial */ if (ptr_ainfo->firstname[1] == '-') { *bitsandpieces = *(ptr_ainfo->firstname); *(bitsandpieces + 1) = '.'; *(bitsandpieces + 2) = '-'; *(bitsandpieces + 3) = *(ptr_ainfo->firstname + 2); *(bitsandpieces + 4) = '.'; *(bitsandpieces + 5) = '\0'; } else if (*(ptr_ainfo->firstname + 1) == '\0') { *bitsandpieces = *ptr_ainfo->firstname; *(bitsandpieces + 1) = '.'; *(bitsandpieces + 2) = '\0'; } else { *bitsandpieces = '\0'; } if (*bitsandpieces) { if ((new_temp_author = mstrcat(temp_author, bitsandpieces, &temp_author_len, 0)) == NULL) { (*ptr_error)++; free(temp_author); return NULL; } else { temp_author = new_temp_author; } } else { if ((new_temp_author = mstrcat(temp_author, ptr_ainfo->firstname, &temp_author_len, 0)) == NULL) { (*ptr_error)++; free(temp_author); return NULL; } else { temp_author = new_temp_author; } } } if (*(ptr_ainfo->middlename)) { if ((temp_middle = strdup(ptr_ainfo->middlename)) == NULL) { (*ptr_error)++; free(temp_author); return NULL; } for (item = strtok(temp_middle, " "); item; item = strtok(NULL, " ")) { if (temp_author[strlen(temp_author)-1] != '.') { if ((new_temp_author = mstrcat(temp_author, " ", &temp_author_len, 0)) == NULL) { (*ptr_error)++; free(temp_author); free(temp_middle); return NULL; } else { temp_author = new_temp_author; } } /* check whether middle name is hyphenated initial */ if (*(item + 1) == '-') { *bitsandpieces = *item; *(bitsandpieces + 1) = '.'; *(bitsandpieces + 2) = '-'; *(bitsandpieces + 3) = *(item + 2); *(bitsandpieces + 4) = '.'; *(bitsandpieces + 5) = '\0'; } else if (*(item + 1) == '\0') { *bitsandpieces = *item; *(bitsandpieces + 1) = '.'; *(bitsandpieces + 2) = '\0'; } else { *bitsandpieces = '\0'; } if (*bitsandpieces) { if ((new_temp_author = mstrcat(temp_author, bitsandpieces, &temp_author_len, 0)) == NULL) { (*ptr_error)++; free(temp_author); free(temp_middle); return NULL; } else { temp_author = new_temp_author; } } else { if ((new_temp_author = mstrcat(temp_author, item, &temp_author_len, 0)) == NULL) { (*ptr_error)++; free(temp_author); free(temp_middle); return NULL; } else { temp_author = new_temp_author; } } } /* end for */ free(temp_middle); } /* end if middlename */ if (*(ptr_ainfo->suffix)) { if ((new_temp_author = mstrcat(temp_author, ",", &temp_author_len, 0)) == NULL) { (*ptr_error)++; free(temp_author); return NULL; } else { temp_author = new_temp_author; } if ((new_temp_author = mstrcat(temp_author, ptr_ainfo->suffix, &temp_author_len, 0)) == NULL) { (*ptr_error)++; free(temp_author); return NULL; } else { temp_author = new_temp_author; } } return temp_author; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ new_authorinfo(): creates a new authorinfo object struct AUTHOR_INFO* new_authorinfo returns ptr to a malloc'ed struct which the calling function has to free by using free_authorinfo() ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ struct AUTHOR_INFO* new_authorinfo(void) { struct AUTHOR_INFO* ptr_ainfo; ptr_ainfo = malloc(sizeof(struct AUTHOR_INFO)); if (!ptr_ainfo) { return NULL; } else { reset_authorinfo(ptr_ainfo); return ptr_ainfo; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ reset_authorinfo(): resets the member variables void reset_authorinfo returns nothing struct AUTHOR_INFO* ptr_ainfo ptr to authorinfo structure ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ void reset_authorinfo(struct AUTHOR_INFO* ptr_ainfo) { if (ptr_ainfo) { *(ptr_ainfo->name) = '\0'; *(ptr_ainfo->lastname) = '\0'; *(ptr_ainfo->firstname) = '\0'; *(ptr_ainfo->middlename) = '\0'; *(ptr_ainfo->suffix) = '\0'; *(ptr_ainfo->role) = '\0'; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ set_authorinfo_name(): sets the name member variable to a new value the name will be cropped if too long char* set_authorinfo_name returns a ptr to the name member variable or NULL if at least one of the arguments is NULL struct AUTHOR_INFO* ptr_ainfo ptr to authorinfo structure const char* name ptr to string with the name ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* set_authorinfo_name(struct AUTHOR_INFO* ptr_ainfo, const char* name) { if (!ptr_ainfo || !name) { return NULL; } /* truncate string */ strncpy(ptr_ainfo->name, name, 255); (ptr_ainfo->name)[255] = '\0'; return ptr_ainfo->name; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ set_authorinfo_lastname(): sets the lastname member variable to a new value the lastname will be cropped if too long char* set_authorinfo_lastname returns a ptr to the lastname member variable or NULL if at least one of the arguments is NULL struct AUTHOR_INFO* ptr_ainfo ptr to authorinfo structure const char* lastname ptr to string with the lastname ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* set_authorinfo_lastname(struct AUTHOR_INFO* ptr_ainfo, const char* lastname) { if (!ptr_ainfo || !lastname) { return NULL; } /* truncate string */ strncpy(ptr_ainfo->lastname, lastname, 255); (ptr_ainfo->lastname)[255] = '\0'; return ptr_ainfo->lastname; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ set_authorinfo_firstname(): sets the firstname member variable to a new value the firstname will be cropped if too long char* set_authorinfo_firstname returns a ptr to the firstname member variable or NULL if at least one of the arguments is NULL struct AUTHOR_INFO* ptr_ainfo ptr to authorinfo structure const char* firstname ptr to string with the firstname ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* set_authorinfo_firstname(struct AUTHOR_INFO* ptr_ainfo, const char* firstname) { if (!ptr_ainfo || !firstname) { return NULL; } /* truncate string */ strncpy(ptr_ainfo->firstname, firstname, 255); (ptr_ainfo->firstname)[255] = '\0'; if ((ptr_ainfo->firstname)[1] == '.') { (ptr_ainfo->firstname)[1] = '\0'; } return ptr_ainfo->firstname; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ add_authorinfo_middlename(): adds the provided middle name to the existing middlename member variable the middlename will be cropped if too long char* set_authorinfo_middlename returns a ptr to the middlename member variable or NULL if at least one of the arguments is NULL struct AUTHOR_INFO* ptr_ainfo ptr to authorinfo structure const char* middlename ptr to string with the middlename ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* add_authorinfo_middlename(struct AUTHOR_INFO* ptr_ainfo, const char* middlename) { if (!ptr_ainfo || !middlename) { return NULL; } /* pool all middlenames in a single string, separated by spaces */ if (*(ptr_ainfo->middlename)) { strncat(ptr_ainfo->middlename, " ", 255 - strlen(ptr_ainfo->middlename)); } strncat(ptr_ainfo->middlename, middlename, 255 - strlen(ptr_ainfo->middlename)); (ptr_ainfo->middlename)[255] = '\0'; if (middlename[1] == '.') { (ptr_ainfo->middlename)[strlen(ptr_ainfo->middlename)-1] = '\0'; } return ptr_ainfo->middlename; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ set_authorinfo_suffix(): sets the suffix member variable to a new value the suffix will be cropped if too long char* set_authorinfo_suffix returns a ptr to the suffix member variable or NULL if at least one of the arguments is NULL struct AUTHOR_INFO* ptr_ainfo ptr to authorinfo structure const char* suffix ptr to string with the suffix ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* set_authorinfo_suffix(struct AUTHOR_INFO* ptr_ainfo, const char* suffix) { if (!ptr_ainfo || !suffix) { return NULL; } /* truncate string */ strncpy(ptr_ainfo->suffix, suffix, 255); (ptr_ainfo->suffix)[255] = '\0'; return ptr_ainfo->suffix; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ set_authorinfo_role(): sets the role member variable to a new value the role will be cropped if too long char* set_authorinfo_role returns a ptr to the role member variable or NULL if at least one of the arguments is NULL struct AUTHOR_INFO* ptr_ainfo ptr to authorinfo structure const char* role ptr to string with the role ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* set_authorinfo_role(struct AUTHOR_INFO* ptr_ainfo, const char* role) { if (!ptr_ainfo) { return NULL; } if (role) { /* truncate string */ strncpy(ptr_ainfo->role, role, 64); (ptr_ainfo->role)[63] = '\0'; } else { *(ptr_ainfo->role) = '\0'; } return ptr_ainfo->role; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ free_authorinfo(): frees the memory allocated for the object It is safe to call this function with a NULL ptr void free_authorinfo returns nothing struct AUTHOR_INFO* ptr_ainfo ptr to authorinfo structure ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ void free_authorinfo(struct AUTHOR_INFO* ptr_ainfo) { if (ptr_ainfo) { free(ptr_ainfo); } } refdb-1.0.2/src/risdata.c000644 001750 001750 00000052514 12255427652 016045 0ustar00markusmarkus000000 000000 /*++++++++++++++++++++ risdata.c: defines an object to pool RIS data before passing them to a db markus@mhoenicka.de 2003-10-01 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, see +++++++++++++++++++++++++*/ #include #include #include #include #include #include "refdb.h" #include "linklist.h" #include "refdbd.h" #include "risdata.h" #include "strfncs.h" extern int n_log_level; /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ new_risdata(): creates a new risdata object struct RISDATA* new_risdata returns a ptr to the new object or NULL if we're out of memory ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ struct RISDATA* new_risdata(void) { struct RISDATA* ptr_risdata; if ((ptr_risdata = malloc(sizeof(struct RISDATA))) == NULL) { return NULL; } else { reset_risdata(ptr_risdata); return ptr_risdata; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ free_risdata(): frees the memory allocated by a risdata object it is safe to call this function with a NULL ptr void free_risdata returns nothing struct RISDATA* ptr_risdata ptr to a risdata object ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ void free_risdata(struct RISDATA* ptr_risdata) { if (!ptr_risdata) { return; } if (ptr_risdata->abstract) { free(ptr_risdata->abstract); } if (ptr_risdata->title_series) { free(ptr_risdata->title_series); } if (ptr_risdata->booktitle) { free(ptr_risdata->booktitle); } if (ptr_risdata->title) { free(ptr_risdata->title); } if (ptr_risdata->address) { free(ptr_risdata->address); } free(ptr_risdata); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ reset_risdata(): resets the strings and ptrs of a risdata object void reset_risdata returns nothing struct RISDATA* ptr_risdata ptr to a risdata object ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ void reset_risdata(struct RISDATA* ptr_risdata) { if (!ptr_risdata) { return; } ptr_risdata->n_id = 0; ptr_risdata->n_pubyear = 0; ptr_risdata->n_secyear = 0; *(ptr_risdata->pyother_info) = '\0'; *(ptr_risdata->secother_info) = '\0'; *(ptr_risdata->citekey) = '\0'; *(ptr_risdata->user1) = '\0'; *(ptr_risdata->user2) = '\0'; *(ptr_risdata->user3) = '\0'; *(ptr_risdata->user4) = '\0'; *(ptr_risdata->user5) = '\0'; *(ptr_risdata->typeofwork) = '\0'; *(ptr_risdata->area) = '\0'; *(ptr_risdata->ostype) = '\0'; *(ptr_risdata->degree) = '\0'; *(ptr_risdata->runningtime) = '\0'; *(ptr_risdata->classcodeintl) = '\0'; *(ptr_risdata->classcodeus) = '\0'; *(ptr_risdata->senderemail) = '\0'; *(ptr_risdata->recipientemail) = '\0'; *(ptr_risdata->mediatype) = '\0'; *(ptr_risdata->numvolumes) = '\0'; *(ptr_risdata->edition) = '\0'; *(ptr_risdata->computer) = '\0'; *(ptr_risdata->conferencelocation) = '\0'; *(ptr_risdata->registrynum) = '\0'; *(ptr_risdata->classification) = '\0'; *(ptr_risdata->section) = '\0'; *(ptr_risdata->pamphletnum) = '\0'; *(ptr_risdata->chapternum) = '\0'; *(ptr_risdata->issn) = '\0'; *(ptr_risdata->issue) = '\0'; *(ptr_risdata->publisher) = '\0'; *(ptr_risdata->city) = '\0'; *(ptr_risdata->volume) = '\0'; *(ptr_risdata->endpage) = '\0'; *(ptr_risdata->startpage) = '\0'; strcpy(ptr_risdata->type, "\'GEN\'"); /* use GEN as a default */ ptr_risdata->abstract = NULL; ptr_risdata->title_series = NULL; ptr_risdata->booktitle = NULL; ptr_risdata->title = NULL; ptr_risdata->address = NULL; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ set_risdata_field(): enters the supplied info into the risdata struct the data are properly quoted before adding them to the struct int set_risdata_field returns 0 if ok, >0 if error error codes: 1 = out of memory struct RISDATA* ptr_risdata ptr to structure with field values const char* fieldname field specifier const char* fieldvalue the data proper dbi_conn conn the database connection ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int set_risdata_field(struct RISDATA* ptr_risdata, const char* fieldname, const char* fieldvalue, dbi_conn conn) { char* escape_buffer; char buffer[256]; /* buffer for log message */ if (!ptr_risdata || !fieldname || !*fieldname || !fieldvalue || !*fieldvalue) { /* nothing to do */ return 0; } escape_buffer = strdup(fieldvalue); if (escape_buffer == NULL) { LOG_PRINT(LOG_WARNING, "malloc failed"); return 1; } /* escape any characters that the db cannot digest */ if (dbi_conn_quote_string(conn, &escape_buffer) == 0) { free(escape_buffer); LOG_PRINT(LOG_WARNING, "malloc failed"); return 1; } if (!strcmp(fieldname, "citekey")) { strcpy(ptr_risdata->citekey, truncate_quoted_string(escape_buffer, 255)); free(escape_buffer); } else if (!strcmp(fieldname, "user1")) { strcpy(ptr_risdata->user1, truncate_quoted_string(escape_buffer, 255)); free(escape_buffer); } else if (!strcmp(fieldname, "user2")) { strcpy(ptr_risdata->user2, truncate_quoted_string(escape_buffer, 255)); free(escape_buffer); } else if (!strcmp(fieldname, "user3")) { strcpy(ptr_risdata->user3, truncate_quoted_string(escape_buffer, 255)); free(escape_buffer); } else if (!strcmp(fieldname, "user4")) { strcpy(ptr_risdata->user4, truncate_quoted_string(escape_buffer, 255)); free(escape_buffer); } else if (!strcmp(fieldname, "user5")) { strcpy(ptr_risdata->user5, truncate_quoted_string(escape_buffer, 255)); free(escape_buffer); } else if (!strcmp(fieldname, "issn")) { strcpy(ptr_risdata->issn, truncate_quoted_string(escape_buffer, 255)); free(escape_buffer); } else if (!strcmp(fieldname, "issue")) { strcpy(ptr_risdata->issue, truncate_quoted_string(escape_buffer, 255)); free(escape_buffer); } else if (!strcmp(fieldname, "publisher")) { strcpy(ptr_risdata->publisher, truncate_quoted_string(escape_buffer, 255)); free(escape_buffer); } else if (!strcmp(fieldname, "city")) { strcpy(ptr_risdata->city, truncate_quoted_string(escape_buffer, 255)); free(escape_buffer); } else if (!strcmp(fieldname, "volume")) { strcpy(ptr_risdata->volume, truncate_quoted_string(escape_buffer, 255)); free(escape_buffer); } else if (!strcmp(fieldname, "endpage")) { strcpy(ptr_risdata->endpage, truncate_quoted_string(escape_buffer, 255)); free(escape_buffer); } else if (!strcmp(fieldname, "startpage")) { strcpy(ptr_risdata->startpage, truncate_quoted_string(escape_buffer, 255)); free(escape_buffer); } else if (!strcmp(fieldname, "type")) { strcpy(ptr_risdata->type, truncate_quoted_string(escape_buffer, 255)); free(escape_buffer); } else if (!strcmp(fieldname, "abstract")) { ptr_risdata->abstract = escape_buffer; } else if (!strcmp(fieldname, "title_series")) { ptr_risdata->title_series = escape_buffer; } else if (!strcmp(fieldname, "booktitle")) { ptr_risdata->booktitle = escape_buffer; } else if (!strcmp(fieldname, "title")) { ptr_risdata->title = escape_buffer; } else if (!strcmp(fieldname, "address")) { ptr_risdata->address = escape_buffer; } else if (!strcmp(fieldname, "misc1")) { /* printf("type went to %s; value went to %s\n", ptr_risdata->type, truncate_quoted_string(escape_buffer, 255)); */ if (!strcmp(ptr_risdata->type, "'ART'") || !strcmp(ptr_risdata->type, "'PCOMM'") || !strcmp(ptr_risdata->type, "'RPRT'")) { strcpy(ptr_risdata->typeofwork, truncate_quoted_string(escape_buffer, 255)); } else if (!strcmp(ptr_risdata->type, "'CHAP'") || !strcmp(ptr_risdata->type, "'CONF'") || !strcmp(ptr_risdata->type, "'BOOK'") || !strcmp(ptr_risdata->type, "'SER'")) { /* printf("set numvolumes\n"); */ strcpy(ptr_risdata->numvolumes, truncate_quoted_string(escape_buffer, 255)); } else if (!strcmp(ptr_risdata->type, "'COMP'")) { strcpy(ptr_risdata->computer, truncate_quoted_string(escape_buffer, 255)); } else if (!strcmp(ptr_risdata->type, "'ELEC'") || !strcmp(ptr_risdata->type, "'JOUR'")) { strcpy(ptr_risdata->mediatype, truncate_quoted_string(escape_buffer, 255)); } else if (!strcmp(ptr_risdata->type, "'ICOMM'")) { strcpy(ptr_risdata->senderemail, truncate_quoted_string(escape_buffer, 255)); } else if (!strcmp(ptr_risdata->type, "'JFULL'")) { strcpy(ptr_risdata->registrynum, truncate_quoted_string(escape_buffer, 255)); } else if (!strcmp(ptr_risdata->type, "'MAP'")) { strcpy(ptr_risdata->area, truncate_quoted_string(escape_buffer, 255)); } else if (!strcmp(ptr_risdata->type, "'MPCT'") || !strcmp(ptr_risdata->type, "'SOUND'") || !strcmp(ptr_risdata->type, "'VIDEO'")) { strcpy(ptr_risdata->classification, truncate_quoted_string(escape_buffer, 255)); } else if (!strcmp(ptr_risdata->type, "'NEWS'")) { strcpy(ptr_risdata->issue, truncate_quoted_string(escape_buffer, 255)); } else if (!strcmp(ptr_risdata->type, "'PAMPH'")) { strcpy(ptr_risdata->pamphletnum, truncate_quoted_string(escape_buffer, 255)); } else if (!strcmp(ptr_risdata->type, "'PAT'")) { strcpy(ptr_risdata->classcodeintl, truncate_quoted_string(escape_buffer, 255)); } else if (!strcmp(ptr_risdata->type, "'THES'")) { strcpy(ptr_risdata->degree, truncate_quoted_string(escape_buffer, 255)); } else { printf("none matched\n"); } free(escape_buffer); } else if (!strcmp(fieldname, "misc2")) { if (!strcmp(ptr_risdata->type, "'CHAP'")) { strcpy(ptr_risdata->volume, truncate_quoted_string(escape_buffer, 255)); } else if (!strcmp(ptr_risdata->type, "'COMP'")) { strcpy(ptr_risdata->ostype, truncate_quoted_string(escape_buffer, 255)); } else if (!strcmp(ptr_risdata->type, "'CONF'")) { strcpy(ptr_risdata->conferencelocation, truncate_quoted_string(escape_buffer, 255)); } else if (!strcmp(ptr_risdata->type, "'ICOMM'")) { strcpy(ptr_risdata->recipientemail, truncate_quoted_string(escape_buffer, 255)); } else if (!strcmp(ptr_risdata->type, "'MAP'")) { strcpy(ptr_risdata->mediatype, truncate_quoted_string(escape_buffer, 255)); } else if (!strcmp(ptr_risdata->type, "'MPCT'") || !strcmp(ptr_risdata->type, "'SOUND'") || !strcmp(ptr_risdata->type, "'VIDEO'")) { strcpy(ptr_risdata->runningtime, truncate_quoted_string(escape_buffer, 255)); } else if (!strcmp(ptr_risdata->type, "'NEWS'")) { strcpy(ptr_risdata->section, truncate_quoted_string(escape_buffer, 255)); } else if (!strcmp(ptr_risdata->type, "'PAT'")) { strcpy(ptr_risdata->classcodeus, truncate_quoted_string(escape_buffer, 255)); } else if (!strcmp(ptr_risdata->type, "'THES'")) { strcpy(ptr_risdata->typeofwork, truncate_quoted_string(escape_buffer, 255)); } free(escape_buffer); } else if (!strcmp(fieldname, "mediatype")) { strcpy(ptr_risdata->mediatype, truncate_quoted_string(escape_buffer, 255)); free(escape_buffer); } else if (!strcmp(fieldname, "typeofwork")) { strcpy(ptr_risdata->typeofwork, truncate_quoted_string(escape_buffer, 255)); free(escape_buffer); } else if (!strcmp(fieldname, "edition")) { strcpy(ptr_risdata->edition, truncate_quoted_string(escape_buffer, 255)); free(escape_buffer); } else if (!strcmp(fieldname, "chapternum")) { strcpy(ptr_risdata->chapternum, truncate_quoted_string(escape_buffer, 255)); free(escape_buffer); } else { snprintf(buffer, 255, "unknown field: %s", fieldname); buffer[255] = '\0'; LOG_PRINT(LOG_DEBUG, buffer); } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ set_risdata_dateinfo(): sets pubyear and otherinfo fields in risdata struct int set_risdata_dateinfo returns 0 if ok, >0 if error error codes: 1 = malloc failed struct RISDATA* ptr_risdata ptr to structure with field values int year_type 0 = primary, 1 = secondary int year the year const char* otherinfo string containing otherinfo dbi_driver driver ptr to database driver ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int set_risdata_dateinfo(struct RISDATA* ptr_risdata, int date_type, int year, const char* otherinfo, dbi_conn conn) { char* escape_buffer; if (!ptr_risdata) { return 0; } if (!date_type) { ptr_risdata->n_pubyear = year; } else { ptr_risdata->n_secyear = year; } if (!otherinfo || !*otherinfo) { escape_buffer = strdup("///"); } else { escape_buffer = strdup(otherinfo); } if (escape_buffer == NULL) { LOG_PRINT(LOG_WARNING, "malloc failed"); return 1; } /* escape any characters that the database server cannot digest */ if (dbi_conn_quote_string(conn, &escape_buffer) == 0) { LOG_PRINT(LOG_WARNING, "out of memory"); free(escape_buffer); return 1; } if (!date_type) { strncpy(ptr_risdata->pyother_info, escape_buffer, 255); (ptr_risdata->pyother_info)[255] = '\0'; } else { strcpy(ptr_risdata->secother_info, escape_buffer); (ptr_risdata->secother_info)[255] = '\0'; } free(escape_buffer); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ commit_risdata_fields(): updates the t_refdb fields int commit_risdata_fields returns 0 if ok, >0 if error error codes: 1 = out of memory 2 = db error struct RISDATA* ptr_risdata ptr to structure with field values dbi_conn conn the database connection int replace_ref if 1, reference is to be replaced if 3, add to temporary table ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int commit_risdata_fields(struct RISDATA* ptr_risdata, dbi_conn conn, int replace_ref) { char* sql_command; char* new_sql_command; char buffer[256]; /* buffer for assembling strings */ char prefix[] = TEMP_TABLE_NAME_PREFIX; size_t sql_cmd_len = 10240; dbi_result dbires; if (!ptr_risdata) { /* nothing to do */ return 0; } else if ((sql_command = malloc(sql_cmd_len)) == NULL) { LOG_PRINT(LOG_WARNING, "malloc failed"); return 1; } /* fix insert */ if (replace_ref != 3) { *prefix = '\0'; } /* fill the command string with the fixed size fields as we know the maximum length */ sprintf(sql_command, "UPDATE t_%srefdb SET refdb_pubyear=%hd, refdb_secyear=%hd, refdb_pyother_info=%s, refdb_secother_info=%s, refdb_citekey=%s, refdb_user1=%s, refdb_user2=%s, refdb_user3=%s, refdb_user4=%s, refdb_user5=%s, refdb_typeofwork=%s, refdb_area=%s, refdb_ostype=%s, refdb_degree=%s, refdb_runningtime=%s, refdb_classcodeintl=%s, refdb_classcodeus=%s, refdb_senderemail=%s, refdb_recipientemail=%s, refdb_mediatype=%s, refdb_numvolumes=%s, refdb_edition=%s, refdb_computer=%s, refdb_conferencelocation=%s, refdb_registrynum=%s, refdb_classification=%s, refdb_section=%s, refdb_pamphletnum=%s, refdb_chapternum=%s, refdb_issn=%s, refdb_issue=%s, refdb_publisher=%s, refdb_city=%s, refdb_volume=%s, refdb_endpage=%s, refdb_startpage=%s, refdb_type=%s", prefix, ptr_risdata->n_pubyear, ptr_risdata->n_secyear, *(ptr_risdata->pyother_info) ? ptr_risdata->pyother_info : "NULL", *(ptr_risdata->secother_info) ? ptr_risdata->secother_info : "NULL", *(ptr_risdata->citekey) ? ptr_risdata->citekey : "NULL", *(ptr_risdata->user1) ? ptr_risdata->user1 : "NULL", *(ptr_risdata->user2) ? ptr_risdata->user2 : "NULL", *(ptr_risdata->user3) ? ptr_risdata->user3 : "NULL", *(ptr_risdata->user4) ? ptr_risdata->user4 : "NULL", *(ptr_risdata->user5) ? ptr_risdata->user5 : "NULL", *(ptr_risdata->typeofwork) ? ptr_risdata->typeofwork : "NULL", *(ptr_risdata->area) ? ptr_risdata->area : "NULL", *(ptr_risdata->ostype) ? ptr_risdata->ostype : "NULL", *(ptr_risdata->degree) ? ptr_risdata->degree : "NULL", *(ptr_risdata->runningtime) ? ptr_risdata->runningtime : "NULL", *(ptr_risdata->classcodeintl) ? ptr_risdata->classcodeintl : "NULL", *(ptr_risdata->classcodeus) ? ptr_risdata->classcodeus : "NULL", *(ptr_risdata->senderemail) ? ptr_risdata->senderemail : "NULL", *(ptr_risdata->recipientemail) ? ptr_risdata->recipientemail : "NULL", *(ptr_risdata->mediatype) ? ptr_risdata->mediatype : "NULL", *(ptr_risdata->numvolumes) ? ptr_risdata->numvolumes : "NULL", *(ptr_risdata->edition) ? ptr_risdata->edition : "NULL", *(ptr_risdata->computer) ? ptr_risdata->computer : "NULL", *(ptr_risdata->conferencelocation) ? ptr_risdata->conferencelocation : "NULL", *(ptr_risdata->registrynum) ? ptr_risdata->registrynum : "NULL", *(ptr_risdata->classification) ? ptr_risdata->classification : "NULL", *(ptr_risdata->section) ? ptr_risdata->section : "NULL", *(ptr_risdata->pamphletnum) ? ptr_risdata->pamphletnum : "NULL", *(ptr_risdata->chapternum) ? ptr_risdata->chapternum : "NULL", *(ptr_risdata->issn) ? ptr_risdata->issn : "NULL", *(ptr_risdata->issue) ? ptr_risdata->issue : "NULL", *(ptr_risdata->publisher) ? ptr_risdata->publisher : "NULL", *(ptr_risdata->city) ? ptr_risdata->city : "NULL", *(ptr_risdata->volume) ? ptr_risdata->volume : "NULL", *(ptr_risdata->endpage) ? ptr_risdata->endpage : "NULL", *(ptr_risdata->startpage) ? ptr_risdata->startpage : "NULL", *(ptr_risdata->type) ? ptr_risdata->type : "NULL"); /* append the variable length fields */ if (ptr_risdata->abstract && *(ptr_risdata->abstract)) { if ((new_sql_command = mstrcat(sql_command, ", refdb_abstract=", &sql_cmd_len, 0)) == NULL) { free(sql_command); LOG_PRINT(LOG_WARNING, "malloc failed"); return 1; } else { sql_command = new_sql_command; } if ((new_sql_command = mstrcat(sql_command, ptr_risdata->abstract, &sql_cmd_len, 0)) == NULL) { free(sql_command); LOG_PRINT(LOG_WARNING, "malloc failed"); return 1; } else { sql_command = new_sql_command; } } if (ptr_risdata->title_series && *(ptr_risdata->title_series)) { if ((new_sql_command = mstrcat(sql_command, ", refdb_title_series=", &sql_cmd_len, 0)) == NULL) { free(sql_command); LOG_PRINT(LOG_WARNING, "malloc failed"); return 1; } else { sql_command = new_sql_command; } if ((new_sql_command = mstrcat(sql_command, ptr_risdata->title_series, &sql_cmd_len, 0)) == NULL) { free(sql_command); LOG_PRINT(LOG_WARNING, "malloc failed"); return 1; } else { sql_command = new_sql_command; } } if (ptr_risdata->booktitle && *(ptr_risdata->booktitle)) { if ((new_sql_command = mstrcat(sql_command, ", refdb_booktitle=", &sql_cmd_len, 0)) == NULL) { free(sql_command); LOG_PRINT(LOG_WARNING, "malloc failed"); return 1; } else { sql_command = new_sql_command; } if ((new_sql_command = mstrcat(sql_command, ptr_risdata->booktitle, &sql_cmd_len, 0)) == NULL) { free(sql_command); LOG_PRINT(LOG_WARNING, "malloc failed"); return 1; } else { sql_command = new_sql_command; } } if (ptr_risdata->title && *(ptr_risdata->title)) { if ((new_sql_command = mstrcat(sql_command, ", refdb_title=", &sql_cmd_len, 0)) == NULL) { free(sql_command); LOG_PRINT(LOG_WARNING, "malloc failed"); return 1; } else { sql_command = new_sql_command; } if ((new_sql_command = mstrcat(sql_command, ptr_risdata->title, &sql_cmd_len, 0)) == NULL) { free(sql_command); LOG_PRINT(LOG_WARNING, "malloc failed"); return 1; } else { sql_command = new_sql_command; } } if (ptr_risdata->address && *(ptr_risdata->address)) { if ((new_sql_command = mstrcat(sql_command, ", refdb_address=", &sql_cmd_len, 0)) == NULL) { free(sql_command); LOG_PRINT(LOG_WARNING, "malloc failed"); return 1; } else { sql_command = new_sql_command; } if ((new_sql_command = mstrcat(sql_command, ptr_risdata->address, &sql_cmd_len, 0)) == NULL) { free(sql_command); LOG_PRINT(LOG_WARNING, "malloc failed"); return 1; } else { sql_command = new_sql_command; } } sprintf(buffer, " WHERE refdb_id="ULLSPEC, (unsigned long long)ptr_risdata->n_id); if ((new_sql_command = mstrcat(sql_command, buffer, &sql_cmd_len, 0)) == NULL) { free(sql_command); LOG_PRINT(LOG_WARNING, "malloc failed"); return 1; } else { sql_command = new_sql_command; } LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); free(sql_command); if (!dbires) { return 2; } dbi_result_free(dbires); return 0; } refdb-1.0.2/src/noteshandler.c000644 001750 001750 00000144753 12255427651 017112 0ustar00markusmarkus000000 000000 /* noteshandler.c: functions to write note datasets to a database */ /* markus@mhoenicka.de 2003-10-08 */ /* 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ /* Overview */ /* This set of functions parses a XML file containing notes datasets. We use expat as a non-validating XML parser. We register three handlers for start tags, character data, and end tags. The elements are pushed on a stack in the start tags handler. Each structure defining an element contains a start element of another stack for the attributes of this element. These stacks are used in the character data handler and the end tag handler to retrieve parent and ancestor elements and attributes of the current element where necessary. The attribute stack of the current element is freed in the end tag handler and the current element is popped off the stack as well. */ #include #include #include #include /* for strftime */ #include #include /* header of the XML parser */ #include /* priority levels of log messages */ #include #include /* for getpid() */ #include /* for getpid() */ #include #include "refdb.h" #include "linklist.h" #include "refdbd.h" #include "strfncs.h" #include "xmlhandler.h" #include "noteshandler.h" #include "risdb.h" #include "dbfncs.h" #include "connect.h" extern int n_log_level; extern int nongeek_offset; /* forward declaration of local functions */ static int set_notesdata_field(const char* field, const char* value, dbi_conn conn, unsigned long long n_note_id); static int set_notesdata_int_field(const char* field, int n_value, dbi_conn conn, unsigned long long n_note_id); static int set_notesdata_longlong_field(const char* field, unsigned long long n_value, dbi_conn conn, unsigned long long n_note_id); /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ notes_start_handler(): handler for start tags void notes_start_handler has no return value void* ptr_data this is a ptr to "non-global" global data that all handlers share - will be cast to type struct addnotes_data* const char *el ptr to a string containing the element name const char** ptr_attr ptr to an array of attributes (name-value pairs) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ void notes_start_handler(void *ptr_data, const char *el, const char **ptr_attr) { const char* user = NULL; const char* id = NULL; const char* key = NULL; const char* date = NULL; const char* share = NULL; char* new_msgpool; char sql_command[1024] = ""; int i; int result; struct elstack* ptr_el_new; struct attrlist* ptr_attr_new; struct addnotes_data* ptr_andata; dbi_result dbires; ptr_andata = (struct addnotes_data*)ptr_data; /* printf("start_handler found el:%s<< attname:%s<< attvalue:%s<ndb_error, ptr_andata->nmem_error, ptr_andata->n_skip); */ if (!ptr_andata->ndb_error && !ptr_andata->nmem_error && !ptr_andata->n_skip) { if (!strcmp(el, "xnoteset")) { (ptr_andata->depth_adjust)++; } else if (!strcmp(el, "xnote")) { time_t the_time; /* If the db server supports it, start a transaction. We want one transaction per reference */ if (my_dbi_conn_begin(ptr_andata->conn)) { (ptr_andata->ndb_error)++; LOG_PRINT(LOG_WARNING, "begin transaction failed"); return; } /* lock the tables we'll write to to prevent concurrent writes from different clients */ if (my_dbi_conn_lock_note(ptr_andata->conn)) { (ptr_andata->ndb_error)++; LOG_PRINT(LOG_WARNING, "Cannot lock tables"); return; } /* reset a few variables relevant to entries */ ptr_andata->create_new = 1; ptr_andata->share = -1; /* undecided */ *(ptr_andata->date_buffer) = '\0'; *(ptr_andata->content_type) = '\0'; *(ptr_andata->content_xmllang) = '\0'; *(ptr_andata->real_key) = '\0'; /* isolate attributes */ for (i = 0; ptr_attr[i]; i += 2) { if (!strcmp(ptr_attr[i], "user")) { user = ptr_attr[i+1]; } else if (!strcmp(ptr_attr[i], "id")) { id = ptr_attr[i+1]; } else if (!strcmp(ptr_attr[i], "citekey")) { key = ptr_attr[i+1]; } else if (!strcmp(ptr_attr[i], "date")) { date = ptr_attr[i+1]; } else if (!strcmp(ptr_attr[i], "share")) { share = ptr_attr[i+1]; } } /* we're out of luck if the user attribute is too long */ if (user && strlen(user) > DBUSER_LENGTH) { (ptr_andata->ndb_error)++; LOG_PRINT(LOG_WARNING, "user attribute missing or too long"); return; } else if (!user) { user = ptr_andata->user; } else { strncpy(ptr_andata->user, user, DBUSER_LENGTH); ptr_andata->user[DBUSER_LENGTH-1] = '\0'; } if (share && *share) { if (!strcmp(share, "public")) { ptr_andata->share = 1; } else if (!strcmp(share, "private")) { ptr_andata->share = 0; } } if (date && strlen(date) == 10) { /* try to parse date according to YYYY-MM-DD */ int year; int month; int day; char my_date[11]; /* get a copy that we can modify. length is checked above */ strcpy(my_date, date); if (my_date[4] == '-') { my_date[4] = '\0'; year = atoi(my_date); if (year >= 1900 && year <= 2036) { if (my_date[7] == '-') { my_date[7] = '\0'; month = atoi(my_date+5); if (month > 0 && month < 13) { day = atoi(my_date+8); if (day > 0 && day < 32) { strcpy(ptr_andata->date_buffer, date); strcpy(ptr_andata->year, my_date); } /* else: day out of range */ } /* else: month out of range */ } /* else: invalid month */ } /* else: year out of range */ } /* else: invalid year */ } if (!*(ptr_andata->date_buffer)) { /* set date to current time in case no date is specified */ time(&the_time); strftime(ptr_andata->date_buffer, 12, "%Y-%m-%d", gmtime(&the_time)); strftime(ptr_andata->year, 5, "%Y", gmtime(&the_time)); } /* todo: check whether current user is owner of the existing note */ /* see whether id or key already exist in the database */ if (key && *key) { char *new_key; /* preprocess and truncate */ if ((new_key = preprocess_citekey_copy(key, 255)) == NULL) { return; } else { /* new_key is already truncated */ strcpy(ptr_andata->real_key, new_key); free(new_key); } sprintf(sql_command, "SELECT t_note.note_id, t_user.user_name FROM t_note, t_user WHERE t_note.note_user_id=t_user.user_id AND t_note.note_key=\'%s\'", ptr_andata->real_key); } else if (id && *id) { if (strlen(id) > 20) { /* largest 8-byte integer */ (ptr_andata->ndb_error)++; LOG_PRINT(LOG_WARNING, "ID value too long"); return ; } sprintf(sql_command, "SELECT t_note.note_id, t_user.user_name FROM t_note, t_user WHERE t_note.note_user_id=t_user.user_id AND t_note.note_id=%s", id); } if (*sql_command) { /* search for existing entry */ LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(ptr_andata->conn, sql_command); if (!dbires) { (ptr_andata->ndb_error)++; LOG_PRINT(LOG_WARNING, "Search ID failed"); return; } /* we have to consider these cases: - addnote: entry with same ID or key doesn't exist-> add - addnote: entry with same ID/key exists-> error - updatenote: entry with same ID/key doesn't exist-> add - updatenote: entry with same ID/key exists-> update if same user */ if (dbi_result_next_row(dbires)) { /* requested ID exists */ if (ptr_andata->replace_note) { const char* existing_user = my_dbi_result_get_string(dbires, "user_name"); if (strcmp(existing_user, user)) { sprintf(sql_command, "only owner can overwrite existing note %s", ptr_andata->real_key); LOG_PRINT(LOG_INFO, sql_command); (ptr_andata->n_skip)++; sprintf(sql_command, "422:"ULLSPEC":%s\n", (unsigned long long)(ptr_andata->set_count + nongeek_offset), ptr_andata->real_key); if ((new_msgpool = mstrcat(ptr_andata->msgpool, sql_command, &(ptr_andata->msgpool_len), 0)) == NULL) { (ptr_andata->nmem_error)++; return; } else { ptr_andata->msgpool = new_msgpool; } return; } ptr_andata->create_new = 0; ptr_andata->n_note_id = my_dbi_result_get_idval(dbires, "note_id"); } else { /* we're supposed to add */ if (*(ptr_andata->real_key)) {/* we can't add lest we overwrite existing data */ sprintf(sql_command, "refused to overwrite existing note %s", ptr_andata->real_key); LOG_PRINT(LOG_INFO, sql_command); (ptr_andata->n_skip)++; sprintf(sql_command, "407:"ULLSPEC":%s\n", (unsigned long long)(ptr_andata->set_count + nongeek_offset), ptr_andata->real_key); if ((new_msgpool = mstrcat(ptr_andata->msgpool, sql_command, &(ptr_andata->msgpool_len), 0)) == NULL) { (ptr_andata->nmem_error)++; return; } else { ptr_andata->msgpool = new_msgpool; } return; } else { /* ignore numerical ID and assign a new one */ LOG_PRINT(LOG_INFO, "numerical ID ignored"); sprintf(sql_command, "409:"ULLSPEC":%s\n", (unsigned long long)(ptr_andata->set_count + nongeek_offset), id); if ((new_msgpool = mstrcat(ptr_andata->msgpool, sql_command, &(ptr_andata->msgpool_len), 0)) == NULL) { (ptr_andata->nmem_error)++; return; } else { ptr_andata->msgpool = new_msgpool; } } } } else { /* requested ID could not be found */ if (ptr_andata->replace_note == 1) { ptr_andata->create_new = 1; } else if (ptr_andata->replace_note == 2) { dbi_result_free(dbires); (ptr_andata->ndb_error)++; LOG_PRINT(LOG_WARNING, "ID not found"); sprintf(sql_command, "411:"ULLSPEC":%s\n", (unsigned long long)(ptr_andata->set_count + nongeek_offset), ptr_andata->real_key); if ((new_msgpool = mstrcat(ptr_andata->msgpool, sql_command, &(ptr_andata->msgpool_len), 0)) == NULL) { (ptr_andata->nmem_error)++; return; } else { ptr_andata->msgpool = new_msgpool; } return; } else if (!*(ptr_andata->real_key)) { /* if add, ignore numerical ID and assign a new one */ LOG_PRINT(LOG_INFO, "numerical ID ignored"); sprintf(sql_command, "409:"ULLSPEC":%s\n", (unsigned long long)(ptr_andata->set_count + nongeek_offset), id); if ((new_msgpool = mstrcat(ptr_andata->msgpool, sql_command, &(ptr_andata->msgpool_len), 0)) == NULL) { (ptr_andata->nmem_error)++; return; } else { ptr_andata->msgpool = new_msgpool; } } } dbi_result_free(dbires); } else { /* no ID string */ if (ptr_andata->replace_note == 1) { ptr_andata->create_new = 1; /* if no ID string, simply add the dataset */ } else if (ptr_andata->replace_note == 2){ LOG_PRINT(LOG_WARNING, "ID missing"); (ptr_andata->ndb_error)++; sprintf(sql_command, "412:"ULLSPEC"\n", (unsigned long long)(ptr_andata->set_count + nongeek_offset)); if ((new_msgpool = mstrcat(ptr_andata->msgpool, sql_command, &(ptr_andata->msgpool_len), 0)) == NULL) { (ptr_andata->nmem_error)++; return; } else { ptr_andata->msgpool = new_msgpool; } return; } /* else: add will assign new ID anyway */ } /* if we're replacing, first remove the existing entry as far as necessary */ if (!ptr_andata->create_new && ptr_andata->replace_note != 2) { /* sprintf(sql_command, "try to replace note "ULLSPEC"\n", (unsigned long long)(ptr_andata->n_note_id)); */ /* if ((new_msgpool = mstrcat(ptr_andata->msgpool, sql_command, &(ptr_andata->msgpool_len), 0)) == NULL) { */ /* (ptr_andata->nmem_error)++; */ /* return; */ /* } */ /* else { */ /* ptr_andata->msgpool = new_msgpool; */ /* } */ /* search orphans in t_keyword */ /* printf("orphans in t_keyword\n"); */ result = remove_keyword_entries(ptr_andata->n_note_id, ptr_andata->conn, 1); if (result) { if (result == 1) { strcpy(sql_command, "select from t_xkeyword failed\n"); } else if (result == 2) { strcpy(sql_command, "delete from t_keyword failed\n"); } else if (result == 3) { strcpy(sql_command, "delete from t_xkeyword failed\n"); } (ptr_andata->ndb_error)++; if ((new_msgpool = mstrcat(ptr_andata->msgpool, sql_command, &(ptr_andata->msgpool_len), 0)) == NULL) { (ptr_andata->nmem_error)++; return; } else { ptr_andata->msgpool = new_msgpool; } return; } /* else: all fine */ result = remove_ulink_entries(ptr_andata->n_note_id, ptr_andata->user, ptr_andata->conn, 1); if (result) { if (result == 1) { strcpy(sql_command, "select from t_xlink failed\n"); } else if (result == 2) { strcpy(sql_command, "delete from t_link failed\n"); } else if (result == 3) { strcpy(sql_command, "delete from t_xlink failed\n"); } (ptr_andata->ndb_error)++; if ((new_msgpool = mstrcat(ptr_andata->msgpool, sql_command, &(ptr_andata->msgpool_len), 0)) == NULL) { (ptr_andata->nmem_error)++; return; } else { ptr_andata->msgpool = new_msgpool; } return; } /* else: all fine */ /* search orphans in t_xnote */ result = remove_xnote_entries(ptr_andata->n_note_id, 0 /* any link target */, ptr_andata->conn, 4); if (result && result < 4) { /* 4 indicates no link found */ if (result == 1) { strcpy(sql_command, "select from t_xnote failed\n"); } else if (result == 3) { strcpy(sql_command, "delete from t_xnote failed\n"); } (ptr_andata->ndb_error)++; if ((new_msgpool = mstrcat(ptr_andata->msgpool, sql_command, &(ptr_andata->msgpool_len), 0)) == NULL) { (ptr_andata->nmem_error)++; return; } else { ptr_andata->msgpool = new_msgpool; } return; } /* reset all values in t_note, keep key, use new type */ sprintf(sql_command, "UPDATE t_note SET note_title=NULL, note_content=NULL WHERE note_id="ULLSPEC, (unsigned long long)(ptr_andata->n_note_id)); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(ptr_andata->conn, sql_command); if (!dbires) { LOG_PRINT(LOG_WARNING, "deletenote failed"); if ((new_msgpool = mstrcat(ptr_andata->msgpool, "deletenote failed\n", &(ptr_andata->msgpool_len), 0)) == NULL) { (ptr_andata->nmem_error)++; return; } else { ptr_andata->msgpool = new_msgpool; } (ptr_andata->ndb_error)++; return; } dbi_result_free(dbires); } if (ptr_andata->create_new) { /* generate temporary key if necessary */ if (!*(ptr_andata->real_key)) { /* use pid to avoid problems with concurrent inserts */ snprintf(ptr_andata->real_key, 256, "dummy%s%d", ptr_andata->ptr_clrequest->my_hostname, getpid()); } /* insert a new empty dataset into the main table to start with */ sprintf(sql_command, "INSERT INTO t_note (note_key) VALUES (\'%s\')", ptr_andata->real_key); dbires = dbi_conn_query(ptr_andata->conn, sql_command); LOG_PRINT(LOG_DEBUG, sql_command); if (!dbires) { (ptr_andata->ndb_error)++; LOG_PRINT(LOG_WARNING, "insert into t_note failed"); return; } dbi_result_free(dbires); /* retrieve note_id of newly created dataset */ if (!strcmp(my_dbi_conn_get_cap(ptr_andata->conn, "named_seq"), "f")) { ptr_andata->n_note_id = dbi_conn_sequence_last(ptr_andata->conn, NULL); } else { ptr_andata->n_note_id = dbi_conn_sequence_last(ptr_andata->conn, "t_note_note_id_seq"); } /* sprintf(sql_command, "try to add set as note "ULLSPEC"\n", (unsigned long long)(ptr_andata->n_note_id)); */ /* if ((new_msgpool = mstrcat(ptr_andata->msgpool, sql_command, &(ptr_andata->msgpool_len), 0)) == NULL) { */ /* LOG_PRINT(LOG_WARNING, get_status_msg(801)); */ /* (ptr_andata->nmem_error)++; */ /* return; */ /* } */ /* else { */ /* ptr_andata->msgpool = new_msgpool; */ /* } */ } /* end if create_new */ /* create user and xuser entries */ result = insert_user(user, ptr_andata->n_note_id, &(ptr_andata->n_user_id), ptr_andata->conn, ptr_andata->drivername, ptr_andata->replace_note, 1); if (result == 1) { if ((new_msgpool = mstrcat(ptr_andata->msgpool, "search user failed\n", &(ptr_andata->msgpool_len), 0)) == NULL) { (ptr_andata->nmem_error)++; return; } else { ptr_andata->msgpool = new_msgpool; } (ptr_andata->ndb_error)++; return; } else if (result == 2) { if ((new_msgpool = mstrcat(ptr_andata->msgpool, "insert t_user failed\n", &(ptr_andata->msgpool_len), 0)) == NULL) { (ptr_andata->nmem_error)++; return; } else { ptr_andata->msgpool = new_msgpool; } (ptr_andata->ndb_error)++; return; } /* else if (result == 3) { */ /* } */ else if (result == 4) { if ((new_msgpool = mstrcat(ptr_andata->msgpool, "username too long\n", &(ptr_andata->msgpool_len), 0)) == NULL) { (ptr_andata->nmem_error)++; return; } else { ptr_andata->msgpool = new_msgpool; } (ptr_andata->ndb_error)++; return; } else if (result == 5) { if ((new_msgpool = mstrcat(ptr_andata->msgpool, "insert user failed\n", &(ptr_andata->msgpool_len), 0)) == NULL) { (ptr_andata->nmem_error)++; return; } else { ptr_andata->msgpool = new_msgpool; } (ptr_andata->ndb_error)++; return; } /* else if (result == 6) { */ /* } */ result = set_notesdata_longlong_field("user_id", ptr_andata->n_user_id, ptr_andata->conn, ptr_andata->n_note_id); if (result == 1) { LOG_PRINT(LOG_WARNING, "out of memory"); } else if (result == 2) { LOG_PRINT(LOG_WARNING, "insert into t_note failed"); } result = set_notesdata_int_field("share", ptr_andata->share, ptr_andata->conn, ptr_andata->n_note_id); if (result == 1) { LOG_PRINT(LOG_WARNING, "out of memory"); } else if (result == 2) { LOG_PRINT(LOG_WARNING, "insert into t_note failed"); } } else if (!strcmp(el, "content")) { ptr_andata->notepool_len = ELVALUE_LENGTH; ptr_andata->notepool = malloc(ELVALUE_LENGTH); if (ptr_andata->notepool == NULL) { (ptr_andata->nmem_error)++; } else { *(ptr_andata->notepool) = '\0'; } for (i = 0; ptr_attr[i]; i += 2) { if (!strcmp(ptr_attr[i], "type")) { strncpy(ptr_andata->content_type, ptr_attr[i+1], 255); ptr_andata->content_type[255] = '\0'; } else if (!strcmp(ptr_attr[i], "xml:lang")) { strncpy(ptr_andata->content_xmllang, ptr_attr[i+1], 255); ptr_andata->content_xmllang[255] = '\0'; } } } else { if (is_descendant_of(ptr_andata->ptr_first, "content")) { char* new_notepool; char attribute_buf[EL_LENGTH]; new_notepool = mstrcat(ptr_andata->notepool, "<", &(ptr_andata->notepool_len), 0); if (new_notepool) { ptr_andata->notepool = new_notepool; } else { (ptr_andata->nmem_error)++; } /* printf("found content descentant %s<<\n", el); */ new_notepool = mstrcat(ptr_andata->notepool, (char*)el, &(ptr_andata->notepool_len), 0); if (new_notepool) { ptr_andata->notepool = new_notepool; } else { (ptr_andata->nmem_error)++; } /* insert attributes */ for (i = 0; ptr_attr[i]; i += 2) { sprintf(attribute_buf, " %s=\'%s\'", ptr_attr[i], ptr_attr[i+1]); new_notepool = mstrcat(ptr_andata->notepool, attribute_buf, &(ptr_andata->notepool_len), 0); if (new_notepool) { ptr_andata->notepool = new_notepool; } else { (ptr_andata->nmem_error)++; } } new_notepool = mstrcat(ptr_andata->notepool, ">", &(ptr_andata->notepool_len), 0); if (new_notepool) { ptr_andata->notepool = new_notepool; } else { (ptr_andata->nmem_error)++; } /* printf("notepool went to %s<<\n", ptr_andata->notepool); */ } /* else: ignore */ } /* end if "xnoteset" */ /* add current element to element stack */ ptr_el_new = malloc(sizeof(struct elstack)); if (ptr_el_new == NULL) { (ptr_andata->nmem_error)++; } else { /* printf("have memory\n"); */ strncpy(ptr_el_new->elname, el, 63); ptr_el_new->elname[63] = '\0'; /* terminate just in case */ ptr_el_new->n_elvalue_len = ELVALUE_LENGTH; ptr_el_new->ptr_elvalue = malloc(ELVALUE_LENGTH); if (ptr_el_new->ptr_elvalue == NULL) { (ptr_andata->nmem_error)++; } else { *(ptr_el_new->ptr_elvalue) = '\0'; } ptr_el_new->ptr_next = ptr_andata->ptr_first; ptr_el_new->ptr_attr_first = NULL; ptr_andata->ptr_first = ptr_el_new; /* printf("%s", ptr_el_new->elname); */ /* add current attributes to the element */ /* printf("add attributes\n"); */ for (i = 0; ptr_attr[i]; i += 2) { ptr_attr_new = malloc(sizeof(struct attrlist)); if (ptr_attr_new == NULL) { (ptr_andata->nmem_error)++; break; } strncpy(ptr_attr_new->attribute_name, ptr_attr[i], 63); ptr_attr_new->attribute_name[63] = '\0'; strncpy(ptr_attr_new->attribute_value, ptr_attr[i+1], 63); ptr_attr_new->attribute_value[63] = '\0'; ptr_attr_new->ptr_next = (ptr_andata->ptr_first)->ptr_attr_first; (ptr_andata->ptr_first)->ptr_attr_first = ptr_attr_new; /* printf(" %s='%s'", ptr_attr[i], ptr_attr[i + 1]); */ } /* printf("done adding attributes\n"); */ (ptr_andata->depth)++; } } return; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ notes_end_handler(): handler for end tags void notes_end_handler has no return value void* ptr_data this is a ptr to "non-global" global data that all handlers share - will be cast to type struct addnotes_data* const char *el ptr to a string containing the element name ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ void notes_end_handler(void *ptr_data, const char *el) { char sql_command[256]; char* new_msgpool = NULL; int result = 0; struct elstack* ptr_el_remove; struct attrlist* ptr_attr_remove; struct addnotes_data* ptr_andata; dbi_result dbires; ptr_andata = (struct addnotes_data*)ptr_data; /* printf("end handler found el:%s<ndb_error, ptr_andata->nmem_error); */ if (ptr_andata->n_skip) { if (!strcmp(el, "xnote")) { (ptr_andata->n_skip)--; (ptr_andata->skipped_count)++; /* close transaction of skipped dataset, if any */ my_dbi_conn_rollback(ptr_andata->conn); } return; } if (ptr_andata->depth) { (ptr_andata->depth)--; } if (!ptr_andata->ndb_error && !ptr_andata->nmem_error) { /* do a character conversion if required. expat dumps all character data as UTF-8 regardless of the input encoding */ size_t inlength; size_t outlength; char* my_elvalue = NULL; /* this ptr will be modified by iconv() */ char* my_elvalue_start = NULL; /* records initial state of my_elvalue */ const char* my_instring = NULL; /* this ptr will be modified by iconv() */ if (ptr_andata->conv_descriptor && *((ptr_andata->ptr_first)->ptr_elvalue)) { inlength = strlen((ptr_andata->ptr_first)->ptr_elvalue)/* + 1 */; /* with the encodings supported by our database engines, the converted string can't be longer than the input string */ outlength = inlength + 1; if ((my_elvalue = malloc(outlength)) == NULL) { if ((new_msgpool = mstrcat(ptr_andata->msgpool, (char*)get_status_msg(801), &(ptr_andata->msgpool_len), 0)) == NULL) { return; } else { ptr_andata->msgpool = new_msgpool; } (ptr_andata->nmem_error)++; return; } /* keep start of the converted string */ my_elvalue_start = my_elvalue; /* variable will be modified by iconv, so don't use original */ my_instring = (const char*)((ptr_andata->ptr_first)->ptr_elvalue); /* now actually do the conversion */ if (iconv(ptr_andata->conv_descriptor, &my_instring, &inlength, &my_elvalue, &outlength) == (size_t)(-1)) { if (errno == EILSEQ) { new_msgpool = mstrcat(ptr_andata->msgpool, "iconv: invalid input character sequence\n", &(ptr_andata->msgpool_len), 0); LOG_PRINT(LOG_WARNING, "iconv: invalid input character sequence"); } else if (errno == E2BIG) { new_msgpool = mstrcat(ptr_andata->msgpool, "iconv: output buffer too small\n", &(ptr_andata->msgpool_len), 0); LOG_PRINT(LOG_WARNING, "iconv: output buffer too small"); } else if (errno == EINVAL) { new_msgpool = mstrcat(ptr_andata->msgpool, "iconv: incomplete input character\n", &(ptr_andata->msgpool_len), 0); LOG_PRINT(LOG_WARNING, "iconv: incomplete input character"); } if (new_msgpool == NULL) { return; } else { ptr_andata->msgpool = new_msgpool; } (ptr_andata->ndb_error)++; return; } /* else: conversion went ok. We free the original string and replace it with the converted copy */ if ((ptr_andata->ptr_first)->ptr_elvalue) { free((ptr_andata->ptr_first)->ptr_elvalue); } *my_elvalue = '\0'; /* terminate converted string */ (ptr_andata->ptr_first)->ptr_elvalue = my_elvalue_start; (ptr_andata->ptr_first)->n_elvalue_len = strlen((ptr_andata->ptr_first)->ptr_elvalue); } /* else: no conversion required */ /* ------------------------------------------------------------ */ if (!strcmp(el, "title") && ptr_andata->replace_note != 2) { result = 0; result = set_notesdata_field("title", (ptr_andata->ptr_first)->ptr_elvalue, ptr_andata->conn, ptr_andata->n_note_id); if (result == 1) { if ((new_msgpool = mstrcat(ptr_andata->msgpool, (char*)get_status_msg(801), &(ptr_andata->msgpool_len), 0)) == NULL) { (ptr_andata->nmem_error)++; return; } else { ptr_andata->msgpool = new_msgpool; } (ptr_andata->ndb_error)++; return; } } /* ------------------------------------------------------------ */ else if (!strcmp(el, "link") && ptr_andata->replace_note != 2) { char* type; char* target; type = get_attr(ptr_andata->ptr_first, "type"); target = get_attr(ptr_andata->ptr_first, "target"); result = insert_link(type, target, ptr_andata->conn, ptr_andata->n_note_id); if (result == 1 /* out of memory */) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); if ((new_msgpool = mstrcat(ptr_andata->msgpool, (char*)get_status_msg(801), &(ptr_andata->msgpool_len), 0)) == NULL) { (ptr_andata->nmem_error)++; return; } else { ptr_andata->msgpool = new_msgpool; } (ptr_andata->ndb_error)++; return; } else if (result == 2 /* incorrect link type */) { LOG_PRINT(LOG_WARNING, "insert_link(): incorrect link type"); sprintf(sql_command, "416:"ULLSPEC":%s\n", (unsigned long long)(ptr_andata->set_count + nongeek_offset), type); if ((new_msgpool = mstrcat(ptr_andata->msgpool, sql_command, &(ptr_andata->msgpool_len), 0)) == NULL) { (ptr_andata->nmem_error)++; return; } else { ptr_andata->msgpool = new_msgpool; } (ptr_andata->ndb_error)++; return; } else if (result == 3 /* xref query failed */) { LOG_PRINT(LOG_WARNING, "insert_link(): xref query failed"); if ((new_msgpool = mstrcat(ptr_andata->msgpool, "xref query failed\n", &(ptr_andata->msgpool_len), 0)) == NULL) { (ptr_andata->nmem_error)++; return; } else { ptr_andata->msgpool = new_msgpool; } (ptr_andata->ndb_error)++; return; } else if (result == 4 /* missing target */) { LOG_PRINT(LOG_INFO, "insert_link(): missing link target"); sprintf(sql_command, "415:"ULLSPEC":%s:%s\n", (unsigned long long)(ptr_andata->set_count + nongeek_offset), type, target); if ((new_msgpool = mstrcat(ptr_andata->msgpool, sql_command, &(ptr_andata->msgpool_len), 0)) == NULL) { (ptr_andata->nmem_error)++; return; } else { ptr_andata->msgpool = new_msgpool; } } else if (result == 5 /* xnote query failed */) { LOG_PRINT(LOG_WARNING, "insert_link(): xnote query failed"); if ((new_msgpool = mstrcat(ptr_andata->msgpool, "xnote query failed\n", &(ptr_andata->msgpool_len), 0)) == NULL) { (ptr_andata->nmem_error)++; return; } else { ptr_andata->msgpool = new_msgpool; } (ptr_andata->ndb_error)++; return; } else if (result == 6 /* insert into t_xnote failed */) { LOG_PRINT(LOG_WARNING, "insert_link(): insert into t_xnote failed"); if ((new_msgpool = mstrcat(ptr_andata->msgpool, "insert into t_xnote failed\n", &(ptr_andata->msgpool_len), 0)) == NULL) { (ptr_andata->nmem_error)++; return; } else { ptr_andata->msgpool = new_msgpool; } (ptr_andata->ndb_error)++; return; } else if (result == 7 /* link already exists */) { sprintf(sql_command, "418:"ULLSPEC":%s:%s\n", (unsigned long long)(ptr_andata->set_count + nongeek_offset), type, target); if ((new_msgpool = mstrcat(ptr_andata->msgpool, sql_command, &(ptr_andata->msgpool_len), 0)) == NULL) { (ptr_andata->nmem_error)++; return; } else { ptr_andata->msgpool = new_msgpool; } } else { /* all fine, report what happened */ sprintf(sql_command, "421:"ULLSPEC":%s:%s\n", (unsigned long long)(ptr_andata->set_count + nongeek_offset), type, target); if ((new_msgpool = mstrcat(ptr_andata->msgpool, sql_command, &(ptr_andata->msgpool_len), 0)) == NULL) { (ptr_andata->nmem_error)++; return; } else { ptr_andata->msgpool = new_msgpool; } } } /* ------------------------------------------------------------ */ else if (!strcmp(el, "content")) { if (ptr_andata->notepool && *(ptr_andata->notepool)) { result = set_notesdata_field("content", ptr_andata->notepool, ptr_andata->conn, ptr_andata->n_note_id); /* printf("notepool went to %s<<\n", ptr_andata->notepool); */ free(ptr_andata->notepool); ptr_andata->notepool = NULL; } else if (ptr_andata->ptr_first->ptr_elvalue && *ptr_andata->ptr_first->ptr_elvalue) { result = set_notesdata_field("content", ptr_andata->ptr_first->ptr_elvalue, ptr_andata->conn, ptr_andata->n_note_id); } if (result == 1) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); if ((new_msgpool = mstrcat(ptr_andata->msgpool, (char*)get_status_msg(801), &(ptr_andata->msgpool_len), 0)) == NULL) { (ptr_andata->nmem_error)++; return; } else { ptr_andata->msgpool = new_msgpool; } (ptr_andata->ndb_error)++; return; } else if (result == 2) { LOG_PRINT(LOG_WARNING, "update note failed"); if ((new_msgpool = mstrcat(ptr_andata->msgpool, "update note failed\n", &(ptr_andata->msgpool_len), 0)) == NULL) { (ptr_andata->nmem_error)++; return; } else { ptr_andata->msgpool = new_msgpool; } (ptr_andata->ndb_error)++; return; } /* else: all fine */ if (*(ptr_andata->content_type)) { result = set_notesdata_field("content_type", ptr_andata->content_type, ptr_andata->conn, ptr_andata->n_note_id); if (result == 1) { if ((new_msgpool = mstrcat(ptr_andata->msgpool, (char*)get_status_msg(801), &(ptr_andata->msgpool_len), 0)) == NULL) { (ptr_andata->nmem_error)++; return; } else { ptr_andata->msgpool = new_msgpool; } (ptr_andata->ndb_error)++; return; } } if (*(ptr_andata->content_xmllang)) { result = set_notesdata_field("content_xmllang", ptr_andata->content_xmllang, ptr_andata->conn, ptr_andata->n_note_id); if (result == 1) { if ((new_msgpool = mstrcat(ptr_andata->msgpool, (char*)get_status_msg(801), &(ptr_andata->msgpool_len), 0)) == NULL) { (ptr_andata->nmem_error)++; return; } else { ptr_andata->msgpool = new_msgpool; } (ptr_andata->ndb_error)++; return; } } } /* ------------------------------------------------------------ */ else if (!strcmp(el, "keyword") && ptr_andata->replace_note != 2) { result = insert_keyword((ptr_andata->ptr_first)->ptr_elvalue, ptr_andata->n_note_id, ptr_andata->conn, ptr_andata->driver, ptr_andata->drivername, 1 /* mode=note */, ptr_andata->replace_note); if (result == 1) { if ((new_msgpool = mstrcat(ptr_andata->msgpool, (char*)get_status_msg(801), &(ptr_andata->msgpool_len), 0)) == NULL) { (ptr_andata->nmem_error)++; return; } else { ptr_andata->msgpool = new_msgpool; } (ptr_andata->ndb_error)++; return; } else if (result == 2) { if ((new_msgpool = mstrcat(ptr_andata->msgpool, "query KW failed\n", &(ptr_andata->msgpool_len), 0)) == NULL) { (ptr_andata->nmem_error)++; return; } else { ptr_andata->msgpool = new_msgpool; } (ptr_andata->ndb_error)++; return; } else if (result == 3) { if ((new_msgpool = mstrcat(ptr_andata->msgpool, "insert KW failed\n", &(ptr_andata->msgpool_len), 0)) == NULL) { (ptr_andata->nmem_error)++; return; } else { ptr_andata->msgpool = new_msgpool; } (ptr_andata->ndb_error)++; return; } else if (result == 4) { if ((new_msgpool = mstrcat(ptr_andata->msgpool, "driver not supported\n", &(ptr_andata->msgpool_len), 0)) == NULL) { (ptr_andata->nmem_error)++; return; } else { ptr_andata->msgpool = new_msgpool; } (ptr_andata->ndb_error)++; return; } else if (result == 5) { if ((new_msgpool = mstrcat(ptr_andata->msgpool, "insert KW x failed\n", &(ptr_andata->msgpool_len), 0)) == NULL) { (ptr_andata->nmem_error)++; return; } else { ptr_andata->msgpool = new_msgpool; } (ptr_andata->ndb_error)++; return; } /* else: all fine */ } /* ------------------------------------------------------------ */ else if (!strcmp(el, "ulink") && ptr_andata->replace_note != 2) { char *type; int n_type = 0; type = get_attr(ptr_andata->ptr_first, "type"); if (!strcmp(type, "url")) { n_type = 0; } else if (!strcmp(type, "pdf")) { n_type = 1; } else if (!strcmp(type, "fulltext")) { n_type = 2; } else if (!strcmp(type, "related")) { n_type = 3; } else if (!strcmp(type, "image")) { n_type = 4; } result = insert_ulink((ptr_andata->ptr_first)->ptr_elvalue, n_type, ptr_andata->n_note_id, ptr_andata->conn, ptr_andata->driver, ptr_andata->drivername, ptr_andata->n_user_id, 1 /* mode=note */, ptr_andata->replace_note); if (result == 1) { if ((new_msgpool = mstrcat(ptr_andata->msgpool, (char*)get_status_msg(801), &(ptr_andata->msgpool_len), 0)) == NULL) { (ptr_andata->nmem_error)++; return; } else { ptr_andata->msgpool = new_msgpool; } (ptr_andata->ndb_error)++; return; } else if (result == 2) { if ((new_msgpool = mstrcat(ptr_andata->msgpool, "query UR failed\n", &(ptr_andata->msgpool_len), 0)) == NULL) { (ptr_andata->nmem_error)++; return; } else { ptr_andata->msgpool = new_msgpool; } (ptr_andata->ndb_error)++; return; } else if (result == 3) { if ((new_msgpool = mstrcat(ptr_andata->msgpool, "insert UR failed\n", &(ptr_andata->msgpool_len), 0)) == NULL) { (ptr_andata->nmem_error)++; return; } else { ptr_andata->msgpool = new_msgpool; } (ptr_andata->ndb_error)++; return; } else if (result == 5) { if ((new_msgpool = mstrcat(ptr_andata->msgpool, "insert UR x failed\n", &(ptr_andata->msgpool_len), 0)) == NULL) { (ptr_andata->nmem_error)++; return; } else { ptr_andata->msgpool = new_msgpool; } (ptr_andata->ndb_error)++; return; } /* else: all fine */ } /* ------------------------------------------------------------ */ else if (!strcmp(el, "xnote")) { const char* key; int result; /* insert new citekey if required */ if (!strncmp(ptr_andata->real_key, "dummy", 5) && ptr_andata->create_new) { key = get_unique_citekey(ptr_andata->conn, ptr_andata->user, atoi(ptr_andata->year), 1 /* notes */, 0 /* regular tables */); if (key && set_notesdata_field("key", key, ptr_andata->conn, ptr_andata->n_note_id) != 0) { if (key) { free((char*)key); } (ptr_andata->ndb_error)++; } strcpy(ptr_andata->real_key, key); free((char*)key); } /* ToDo: check return */ /* set date */ result = set_notesdata_field("date", ptr_andata->date_buffer, ptr_andata->conn, ptr_andata->n_note_id); /* close transaction, if any */ my_dbi_conn_commit(ptr_andata->conn); if (insert_lilid(ptr_andata->ptr_id_sentinel, ptr_andata->n_note_id)) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); } if (*(ptr_andata->real_key)) { /* still empty if we update the reference */ sprintf(sql_command, "406:"ULLSPEC":%s\n", (unsigned long long)(ptr_andata->set_count + nongeek_offset), ptr_andata->real_key); if ((new_msgpool = mstrcat(ptr_andata->msgpool, sql_command, &(ptr_andata->msgpool_len), 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); (ptr_andata->nmem_error)++; } else { ptr_andata->msgpool = new_msgpool; } } if (ptr_andata->ndb_error || ptr_andata->nmem_error) { if (strcmp(my_dbi_conn_get_cap(ptr_andata->conn, "transaction"), "t")) { /* we have to delete the junk reference manually */ if (*(ptr_andata->real_key)) { sprintf(sql_command, "DELETE FROM t_note WHERE note_key=\'%s\'", ptr_andata->real_key); } else { sprintf(sql_command, "DELETE FROM t_note WHERE note_key=\'dummy%d\'", getpid()); } LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(ptr_andata->conn, sql_command); if (!dbires) { LOG_PRINT(LOG_INFO, "removing junk reference failed"); } dbi_result_free(dbires); } else { my_dbi_conn_rollback(ptr_andata->conn); } my_dbi_conn_unlock(ptr_andata->conn); } else { my_dbi_conn_unlock(ptr_andata->conn); if (ptr_andata->create_new) { /* sprintf(sql_command, "Adding input set "ULLSPEC" successful\n", (unsigned long long)(ptr_andata->set_count + nongeek_offset)); */ sprintf(sql_command, "408:"ULLSPEC"\n", (unsigned long long)(ptr_andata->set_count + nongeek_offset)); (ptr_andata->added_count)++; } else { /* sprintf(sql_command, "Updating input set "ULLSPEC" successful\n", (unsigned long long)(ptr_andata->set_count + nongeek_offset)); */ sprintf(sql_command, "413:"ULLSPEC"\n", (unsigned long long)(ptr_andata->set_count + nongeek_offset)); (ptr_andata->updated_count)++; } (ptr_andata->set_count)++; if ((new_msgpool = mstrcat(ptr_andata->msgpool, sql_command, &(ptr_andata->msgpool_len), 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); (ptr_andata->nmem_error)++; return; } else { ptr_andata->msgpool = new_msgpool; } } } else { if (is_descendant_of(ptr_andata->ptr_first, "content")) { char* new_notepool; new_notepool = mstrcat(ptr_andata->notepool, (ptr_andata->ptr_first)->ptr_elvalue, &(ptr_andata->notepool_len), 0); if (new_notepool) { ptr_andata->notepool = new_notepool; } else { (ptr_andata->nmem_error)++; } new_notepool = mstrcat(ptr_andata->notepool, "notepool_len), 0); if (new_notepool) { ptr_andata->notepool = new_notepool; } else { (ptr_andata->nmem_error)++; } new_notepool = mstrcat(ptr_andata->notepool, ptr_andata->ptr_first->elname, &(ptr_andata->notepool_len), 0); if (new_notepool) { ptr_andata->notepool = new_notepool; } else { (ptr_andata->nmem_error)++; } new_notepool = mstrcat(ptr_andata->notepool, ">", &(ptr_andata->notepool_len), 0); if (new_notepool) { ptr_andata->notepool = new_notepool; } else { (ptr_andata->nmem_error)++; } /* printf("in endhandler: notepool went to %s<<\n", ptr_andata->notepool); */ } /* else: ignore */ } } /* printf("removing %s from elstack\n", (ptr_andata->ptr_first)->elname); */ /* remove attributes of the current element from the list */ if (ptr_andata->depth && ptr_andata->ptr_first) { ptr_attr_remove = (ptr_andata->ptr_first)->ptr_attr_first; while (ptr_attr_remove) { (ptr_andata->ptr_first)->ptr_attr_first = ((ptr_andata->ptr_first)->ptr_attr_first)->ptr_next; free(ptr_attr_remove); ptr_attr_remove = (ptr_andata->ptr_first)->ptr_attr_first; } /* free element value string */ if ((ptr_andata->ptr_first)->ptr_elvalue) { free((ptr_andata->ptr_first)->ptr_elvalue); } /* remove current element from element stack */ ptr_el_remove = ptr_andata->ptr_first; ptr_andata->ptr_first = (ptr_andata->ptr_first)->ptr_next; if (ptr_el_remove) { free(ptr_el_remove); } } return; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ notes_char_handler(): handler for character data. void notes_char_handler has no return value void* ptr_data this is a ptr to "non-global" global data that all handlers share - will be cast to type struct addnotes_data* const char *string ptr to a string containing the char data this string is not \0 terminated and could be only a part of the character data of an element! int len length length of string ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ void notes_char_handler(void *ptr_data, const char *string, int len) { struct addnotes_data* ptr_andata; char* new_elvalue; char* buffer; /* printf("char handler found data:<<\n"); */ ptr_andata = (struct addnotes_data*)ptr_data; if (ptr_andata->ndb_error || ptr_andata->nmem_error || ptr_andata->n_skip) { return; } /* get one byte extra for the terminating \0 */ buffer = malloc(len+1); if (!buffer) { (ptr_andata->nmem_error)++; return; } strncpy(buffer, string, len); buffer[len] = '\0'; /* concatenate with existing elvalue. The latter will be of zero length if this is the first chunk */ new_elvalue = mstrcat((ptr_andata->ptr_first)->ptr_elvalue, buffer, &((ptr_andata->ptr_first)->n_elvalue_len), 0); free(buffer); if (new_elvalue) { (ptr_andata->ptr_first)->ptr_elvalue = new_elvalue; } else { (ptr_andata->nmem_error)++; } return; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ set_notesdata_field(): sets a value in t_notes static int set_notesdata_field returns 0 if ok, 1 if out of memory, 2 if query error const char *field ptr to a string containing the field name const char *value ptr to a string containing the field value dbi_conn conn connection to database server unsigned long long n_note_id id value of note ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int set_notesdata_field(const char* field, const char* value, dbi_conn conn, unsigned long long n_note_id) { char* sql_command; char* quoted_value; size_t sql_cmd_len = 128; dbi_result dbires; if (!field || !*field || !value || !*value) { /* nothing to do */ return 0; } /* field length is limited but value length isn't */ sql_cmd_len += strlen(value); if ((sql_command = malloc(sql_cmd_len)) == NULL) { LOG_PRINT(LOG_WARNING, "malloc failed"); return 1; } quoted_value = mstrdup((char*)value); if (!quoted_value) { LOG_PRINT(LOG_WARNING, "malloc failed"); return 1; } if (dbi_conn_quote_string(conn, "ed_value) == 0) { free(quoted_value); LOG_PRINT(LOG_WARNING, "malloc failed"); return 1; } /* assemble query */ sprintf(sql_command, "UPDATE t_note SET note_%s=%s WHERE note_id="ULLSPEC, field, quoted_value, (unsigned long long)n_note_id); free(quoted_value); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); free(sql_command); if (!dbires) { return 2; } dbi_result_free(dbires); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ set_notesdata_int_field(): sets an int value in t_notes static int set_notesdata_int_field returns 0 if ok, 1 if out of memory, 2 if query error const char *field ptr to a string containing the field name int n_value the field value dbi_conn conn connection to database server unsigned long long n_note_id id value of note ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int set_notesdata_int_field(const char* field, int n_value, dbi_conn conn, unsigned long long n_note_id) { char* sql_command; size_t sql_cmd_len = 128; dbi_result dbires; if (!field || !*field) { /* nothing to do */ return 0; } if ((sql_command = malloc(sql_cmd_len)) == NULL) { LOG_PRINT(LOG_WARNING, "malloc failed"); return 1; } /* assemble query */ sprintf(sql_command, "UPDATE t_note SET note_%s=%d WHERE note_id="ULLSPEC, field, n_value, (unsigned long long)n_note_id); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); free(sql_command); if (!dbires) { return 2; } dbi_result_free(dbires); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ set_notesdata_longlong_field(): sets a longlong value in t_notes static int set_notesdata_longlong_field returns 0 if ok, 1 if out of memory, 2 if query error const char *field ptr to a string containing the field name unsigned long long n_value the field value dbi_conn conn connection to database server unsigned long long n_note_id id value of note ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int set_notesdata_longlong_field(const char* field, unsigned long long n_value, dbi_conn conn, unsigned long long n_note_id) { char* sql_command; size_t sql_cmd_len = 128; dbi_result dbires; if (!field || !*field) { /* nothing to do */ return 0; } if ((sql_command = malloc(sql_cmd_len)) == NULL) { LOG_PRINT(LOG_WARNING, "malloc failed"); return 1; } /* assemble query */ sprintf(sql_command, "UPDATE t_note SET note_%s="ULLSPEC" WHERE note_id="ULLSPEC, field, (unsigned long long)n_value, (unsigned long long)n_note_id); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); free(sql_command); if (!dbires) { return 2; } dbi_result_free(dbires); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ insert_link(): inserts an entry in t_xnotes int insert_link returns 0 if ok, 1 if out of memory, 2 if incorrect link type, 3 if xref query failed, 4 if missing target, 5 if xnote query failed, 6 if insert into t_xnote failed, 7 if link already exists const char *field ptr to a string containing the field name const char *value ptr to a string containing the field value dbi_conn conn connection to database server unsigned long long n_note_id id value of note ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int insert_link(const char* type, const char* target, dbi_conn conn, unsigned long long n_note_id) { char* sql_command; char* my_type; char* quoted_target; char xref_type[11]; size_t sql_cmd_len = 512; unsigned long long n_xref_id; dbi_result dbires; dbi_result dbires1; if (!type || !*type || !target || !*target) { /* we're done */ return 0; } if (!(sql_command = malloc(sql_cmd_len))) { LOG_PRINT(LOG_WARNING, "malloc failed"); return 1; } if ((my_type = strdup(type)) == NULL) { LOG_PRINT(LOG_WARNING, "malloc failed"); free(sql_command); return 1; } strup(my_type); /* quote target to make it usable for a SQL query */ if ((quoted_target = strdup(target)) == NULL || dbi_conn_quote_string(conn, "ed_target) == 0) { LOG_PRINT(LOG_WARNING, "malloc failed"); free(sql_command); free(my_type); return 1; } /* first search xref_id of requested target */ if (!strcmp(my_type, "JOURNALFULL")) { sprintf(sql_command, "SELECT periodical_id from t_periodical WHERE periodical_name=%s", quoted_target); strcpy(xref_type, "PERIODICAL"); } else if (!strcmp(my_type, "JOURNALABBREV")) { sprintf(sql_command, "SELECT periodical_id from t_periodical WHERE periodical_abbrev=%s", quoted_target); strcpy(xref_type, "PERIODICAL"); } else if (!strcmp(my_type, "JOURNALCUSTABBREV1")) { sprintf(sql_command, "SELECT periodical_id from t_periodical WHERE periodical_custabbrev1=%s", quoted_target); strcpy(xref_type, "PERIODICAL"); } else if (!strcmp(my_type, "JOURNALCUSTABBREV2")) { sprintf(sql_command, "SELECT periodical_id from t_periodical WHERE periodical_custabbrev2=%s", quoted_target); strcpy(xref_type, "PERIODICAL"); } else if (!strcmp(my_type, "KEYWORD")) { sprintf(sql_command, "SELECT keyword_id from t_keyword WHERE keyword_name=%s", quoted_target); strcpy(xref_type, "KEYWORD"); } else if (!strcmp(my_type, "AUTHOR")) { sprintf(sql_command, "SELECT author_id from t_author WHERE author_name=%s", quoted_target); strcpy(xref_type, "AUTHOR"); } else if (!strcmp(my_type, "REFID")) { sprintf(sql_command, "SELECT refdb_id from t_refdb WHERE refdb_id=%s", quoted_target); strcpy(xref_type, "REFERENCE"); } else if (!strcmp(my_type, "REFERENCE")) { sprintf(sql_command, "SELECT refdb_id from t_refdb WHERE refdb_citekey=%s", quoted_target); strcpy(xref_type, "REFERENCE"); } else { LOG_PRINT(LOG_WARNING, "incorrect link type"); free(my_type); free(sql_command); return 2; } free(quoted_target); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_WARNING, "query xref failed"); return 3; } if (dbi_result_next_row(dbires)) { n_xref_id = my_dbi_result_get_idval_idx(dbires, 1); } else { n_xref_id = 0; } dbi_result_free(dbires); if (!n_xref_id) { free(sql_command); return 4; } /* check for existing link */ sprintf(sql_command, "SELECT xnote_id FROM t_xnote WHERE note_id="ULLSPEC" AND xnote_type=\'%s\' AND xref_id="ULLSPEC, (unsigned long long)n_note_id, xref_type, (unsigned long long)n_xref_id); LOG_PRINT(LOG_DEBUG, sql_command); free(my_type); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); LOG_PRINT(LOG_WARNING, "query xnote failed"); return 5; } if (dbi_result_next_row(dbires) == 0) { /* finally create entry in notes xref table */ sprintf(sql_command, "INSERT INTO t_xnote (note_id, xref_id, xnote_type) VALUES ("ULLSPEC", "ULLSPEC", \'%s\')", (unsigned long long)n_note_id, (unsigned long long)n_xref_id, xref_type); LOG_PRINT(LOG_DEBUG, sql_command); dbires1 = dbi_conn_query(conn, sql_command); free(sql_command); if (!dbires1) { dbi_result_free(dbires); LOG_PRINT(LOG_WARNING, "insert xnote failed"); return 6; } dbi_result_free(dbires1); } else { free(sql_command); dbi_result_free(dbires); return 7; } dbi_result_free(dbires); return 0; } refdb-1.0.2/src/refdbdnote.c000644 001750 001750 00000261161 12255427652 016532 0ustar00markusmarkus000000 000000 /*++++++++++++++++++++++ refdbdnote.c: refdb application server, notes handling functions markus@mhoenicka.de 2003-10-12 $Id: refdbdnote.c,v 1.25.2.15 2005/11/03 20:40:19 mhoenicka Exp $ 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, see ++++++++++++++++++++++++*/ #include "stdio.h" #include "string.h" #include #include #include /* the xml parser header file */ #include #include #include "refdb.h" #include "connect.h" #include "linklist.h" #include "refdbd.h" #include "noteshandler.h" #include "strfncs.h" #include "tokenize.h" #include "writenote.h" #include "dbfncs.h" #include "risdb.h" #ifndef HAVE_ATOLL long long atoll(const char *str); #endif extern int n_log_level; /* numeric version of log_level */ /* prototypes of local functions */ static int delete_note_by_id(unsigned long long idval, dbi_conn conn, struct CLIENT_REQUEST* ptr_clrequest, struct ADDRESULT* ptr_addresult); /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ addnote(): implements the client command addnote int addnote returns 1 if mem error, 2 if other error, 0 if successful struct CLIENT_REQUEST* ptr_clrequest ptr to structure with client info char *set_owner the username of the owner of new/updated references if different from *username struct ADDRESULT* addresult this structure will be filled in with the number of (un-)successfully added/updated references int replace_note if 1, note will be updated according to ID field; if 0 note will be added without looking at an ID field Lilid* ptr_sentinel ptr to linked list that will receive all added ID values ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int addnote(struct CLIENT_REQUEST* ptr_clrequest, char* set_owner, struct ADDRESULT* ptr_addresult, int replace_note, Lilid* ptr_sentinel) { dbi_conn conn; dbi_conn conn_refdb = NULL; XML_Parser p; int numbyte; /* number of bytes written */ int result; /* result value of processing a note set */ int retval = 0; /* be optimistic */ int iconv_init_status = 0; /* indicates iconv initialization problem */ char *the_user; /* name (either set_owner or username) */ char *return_msg; /* string to hold a return message for the client */ const char *db_encoding; /* encoding of database */ struct addnotes_data andata; struct lilimem sentinel; sentinel.ptr_mem = NULL; sentinel.ptr_next = NULL; sentinel.varname[0] = '\0'; ptr_addresult->success = 0; ptr_addresult->failure = 0; ptr_addresult->updated = 0; ptr_addresult->skipped = 0; andata.msgpool = NULL; /* if set_owner is set, use it, otherwise use username as owner */ if (set_owner && *set_owner) { the_user = set_owner; } else { the_user = ptr_clrequest->username; } /* get some memory for a return message */ return_msg = malloc((size_t)256); if (return_msg == NULL || insert_lilimem(&sentinel, (void**)&return_msg, NULL)) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } /* connect to database server*/ if ((conn = connect_to_db(ptr_clrequest, NULL, 0)) == NULL) { send_status(ptr_clrequest->fd, 204, TERM_NO); LOG_PRINT(LOG_WARNING, get_status_msg(204)); delete_all_lilimem(&sentinel); return 2; } /* get the database encoding */ db_encoding = dbi_conn_get_encoding(conn); /* if we need to convert, create a conversion descriptor for iconv() */ if (db_encoding && strcmp(db_encoding, "UTF-8")) { andata.conv_descriptor = iconv_open(!strcmp(db_encoding, "US-ASCII") ? "ASCII" : db_encoding, "UTF-8"); if (andata.conv_descriptor == (iconv_t)(-1)) { andata.conv_descriptor = NULL; LOG_PRINT(LOG_WARNING, "cannot set output encoding (database):"); iconv_init_status = 701; } else { LOG_PRINT(LOG_DEBUG, "encoding is now:"); } LOG_PRINT(LOG_DEBUG, db_encoding); } else { andata.conv_descriptor = NULL; LOG_PRINT(LOG_DEBUG, "encoding is UTF-8, no conversion required"); } while (1) { /* leave with break */ /* create the parser instance */ p = XML_ParserCreate(NULL); if (!p) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); retval = 1; goto Finish; } /* initialize "global" handler data */ andata.msgpool_len = 512; andata.msgpool = malloc(andata.msgpool_len); if (!andata.msgpool || insert_lilimem(&sentinel, (void**)&(andata.msgpool), NULL)) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); retval = 1; goto Finish; } *(andata.msgpool) = '\0'; *(andata.real_key) = '\0'; strcpy(andata.user, the_user); /* fallback if dataset doesn't specify user */ andata.ptr_id_sentinel = ptr_sentinel; andata.ptr_clrequest = ptr_clrequest; andata.ptr_first = NULL; andata.nmem_error = 0; andata.ndb_error = 0; andata.n_skip = 0; andata.depth = 0; andata.depth_adjust = 0; andata.set_count = 0; andata.added_count = 0; andata.skipped_count = 0; andata.updated_count = 0; andata.failed_count = 0; andata.replace_note = replace_note; andata.create_new = 1; andata.n_user_id = 0; andata.share = 0; andata.conn = conn; andata.driver = dbi_conn_get_driver(conn); andata.drivername = dbi_driver_get_name(andata.driver); /* register our handlers. these handlers will be called whenever expat finds a start- or endtag or character data */ XML_SetElementHandler(p, notes_start_handler, notes_end_handler); XML_SetCharacterDataHandler(p, notes_char_handler); /* make pointer to "global data" available for handlers */ XML_SetUserData(p, (void*)&andata); send_status(ptr_clrequest->fd, iconv_init_status, TERM_NO); result = read_xml(ptr_clrequest->fd, p, ptr_addresult); XML_ParserFree(p); /* do something intelligent in the case of a parse or mem error */ if (!result || andata.ndb_error || andata.nmem_error) { if (strcmp(my_dbi_conn_get_cap(andata.conn, "transaction"), "t")) { /* we have to delete the junk reference manually */ delete_note_by_id(andata.n_note_id, conn, ptr_clrequest, ptr_addresult); } else { my_dbi_conn_rollback(andata.conn); } my_dbi_conn_unlock(andata.conn); } /* send messages to client */ numbyte = tiwrite(ptr_clrequest->fd, andata.msgpool, TERM_YES); if (numbyte == -1) { LOG_PRINT(LOG_INFO, get_status_msg(110)); retval = 1; goto Finish; } ptr_addresult->success += andata.added_count; ptr_addresult->failure += andata.failed_count; ptr_addresult->updated += andata.updated_count; ptr_addresult->skipped += andata.skipped_count; if (!result) { /* error */ retval = 1; goto Finish; } else if (result == -1) { /* we're done */ break; } } /* end while */ Finish: if (ptr_addresult->success || ptr_addresult->updated) { /* database was changed, update meta info */ update_meta(conn, ptr_clrequest); } if (conn_refdb) { dbi_conn_close(conn_refdb); } dbi_conn_close(conn); delete_all_lilimem(&sentinel); if (andata.conv_descriptor) { iconv_close(andata.conv_descriptor); } return retval; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ deletenote(): implements the client command deletenote int deletenote returns >0 if failed, 0 if successful struct CLIENT_REQUEST* ptr_clrequest ptr to structure with client info struct ADDRESULT* ptr_addresult structure to hold number of successful and failed deleterefs ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int deletenote(struct CLIENT_REQUEST* ptr_clrequest, struct ADDRESULT* ptr_addresult) { dbi_conn conn; int numbyte; /* number of bytes written */ int error; int retval = 0; int cs_status; size_t n_bufsize; char* id_list; char* new_msg; char buffer[64]; const char* drivername; struct lilimem sentinel; Lilid id_sentinel; Lilid *ptr_curr; sentinel.ptr_mem = NULL; sentinel.ptr_next = NULL; sentinel.varname[0] = '\0'; id_sentinel.ptr_next = NULL; n_bufsize = atoi(ptr_clrequest->argument); /* try to allocate the amount the client requested */ id_list = malloc(n_bufsize); if (id_list == NULL || insert_lilimem(&sentinel, (void**)&id_list, NULL)) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } /* send acknowledgement to client */ send_status(ptr_clrequest->fd, 0, TERM_NO); /* read id list from client */ if ((cs_status = read_status(ptr_clrequest->fd)) != 0) { LOG_PRINT(LOG_INFO, get_status_msg(112)); delete_all_lilimem(&sentinel); return 112; } numbyte = tread(ptr_clrequest->fd, id_list, n_bufsize); if (numbyte == -1) { LOG_PRINT(LOG_INFO, get_status_msg(109)); delete_all_lilimem(&sentinel); return 109; } /* split id_list into tokens */ error = string_tokenize_lili(&id_sentinel, id_list); if (error == 2) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); delete_all_lilid(&id_sentinel); delete_all_lilimem(&sentinel); return 801; } else if (error == 1) { send_status(ptr_clrequest->fd, 412, TERM_NO); delete_all_lilid(&id_sentinel); delete_all_lilimem(&sentinel); return 412; } /* connect to database server*/ if ((conn = connect_to_db(ptr_clrequest, NULL, 0)) == NULL) { send_status(ptr_clrequest->fd, 204, TERM_NO); LOG_PRINT(LOG_WARNING, get_status_msg(204)); delete_all_lilid(&id_sentinel); delete_all_lilimem(&sentinel); return 204; } drivername = dbi_driver_get_name(dbi_conn_get_driver(conn)); ptr_addresult->success = 0; ptr_addresult->failure = 0; ptr_addresult->skipped = 0; ptr_curr = &id_sentinel; /* loop over arguments */ while ((ptr_curr = get_next_lilid(ptr_curr)) != NULL) { if ((retval = delete_note_by_id(ptr_curr->value, conn, ptr_clrequest, ptr_addresult)) != 0) { sprintf(buffer, "420:"ULLSPEC"\n", (unsigned long long)ptr_curr->value); if ((new_msg = mstrcat(ptr_addresult->msg, buffer, &(ptr_addresult->msg_len), 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { ptr_addresult->msg = new_msg; } } } /* end while */ if (conn && ptr_addresult->success) { update_meta(conn, ptr_clrequest); } dbi_conn_close(conn); delete_all_lilid(&id_sentinel); delete_all_lilimem(&sentinel); send_status(ptr_clrequest->fd, 0, TERM_NO); numbyte = tiwrite(ptr_clrequest->fd, ptr_addresult->msg, TERM_YES); if (numbyte == -1) { LOG_PRINT(LOG_INFO, get_status_msg(110)); retval = 1; } return retval; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ delete_note_by_id(): deletes a note by its ID value static int delete_note_by_id returns 0 if ok, >0 if failed unsigned long long idval ID value of the note to be deleted dbi_conn conn database connection struct CLIENT_REQUEST* ptr_clrequest ptr to structure with client info struct ADDRESULT* ptr_addresult structure to hold number of successful and failed deleterefs ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int delete_note_by_id(unsigned long long idval, dbi_conn conn, struct CLIENT_REQUEST* ptr_clrequest, struct ADDRESULT* ptr_addresult) { char sql_command[640]; /* fixed length is ok here since only IDs are appended to the query strings, and the length of an ID is limited by the database */ char* new_msg; const char* owner; int result; unsigned long long n_user_id = 0; dbi_result dbires; /* The general procedure to remove a note is as follows: Remove the entry in the main table t_note. Query the keyword, user crosslink tables for keywords, users used by this reference. Find out whether these keywords, users are used by any other dataset. If not, delete them from the keywords, users data tables. In all cases, delete the entries in the crosslink tables */ /* If the db server supports it, start a transaction. We want one transaction per reference */ if (my_dbi_conn_begin(conn)) { LOG_PRINT(LOG_WARNING, get_status_msg(227)); return 227; } /* lock the tables we'll write to to prevent concurrent writes from different clients */ if (my_dbi_conn_lock(conn, 0 /* lock regular tables */)) { LOG_PRINT(LOG_WARNING, get_status_msg(228)); return 228; } sprintf(sql_command, "SELECT note_id FROM t_note WHERE note_id="ULLSPEC, (unsigned long long)idval); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { my_dbi_conn_unlock(conn); my_dbi_conn_rollback(conn); LOG_PRINT(LOG_WARNING, get_status_msg(234)); return 234; } if (dbi_result_get_numrows(dbires) == 0) { /* ID does not exist - nothing to do */ ptr_addresult->skipped++; dbi_result_free(dbires); my_dbi_conn_unlock(conn); my_dbi_conn_commit(conn); /* add message, reuse sql_command */ sprintf(sql_command, "417:"ULLSPEC"\n", (unsigned long long)idval); if ((new_msg = mstrcat(ptr_addresult->msg, sql_command, &(ptr_addresult->msg_len), 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { ptr_addresult->msg = new_msg; } return 417; } dbi_result_free(dbires); /* get user id and name */ owner = NULL; sprintf(sql_command, "SELECT note_user_id, user_name FROM t_note,t_user WHERE t_note.note_user_id=t_user.user_id AND note_id="ULLSPEC, (unsigned long long)idval); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { my_dbi_conn_unlock(conn); my_dbi_conn_rollback(conn); LOG_PRINT(LOG_WARNING, get_status_msg(234)); return 234; } else if (dbi_result_next_row(dbires) != 0){ n_user_id = my_dbi_result_get_idval_idx(dbires, 1); owner = dbi_result_get_string_idx(dbires, 2); } else { n_user_id = 0; } if (owner && *owner) { if (strcmp(owner, ptr_clrequest->username)) { /* only owner can delete this note */ ptr_addresult->failure++; my_dbi_conn_unlock(conn); my_dbi_conn_rollback(conn); /* send message to client, reuse sql_command */ sprintf(sql_command, "422:%s:"ULLSPEC"\n", owner, (unsigned long long)idval); if ((new_msg = mstrcat(ptr_addresult->msg, sql_command, &(ptr_addresult->msg_len), 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { ptr_addresult->msg = new_msg; } return 422; } } dbi_result_free(dbires); /* search orphans in t_keyword */ result = remove_keyword_entries(idval, conn, 1); if (result) { /* send message to client, reuse sql_command */ sprintf(sql_command, "229:"ULLSPEC"\n", (unsigned long long)idval); if ((new_msg = mstrcat(ptr_addresult->msg, sql_command, &(ptr_addresult->msg_len), 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { ptr_addresult->msg = new_msg; } my_dbi_conn_unlock(conn); my_dbi_conn_rollback(conn); return 229; } /* search orphans in t_ulink */ result = remove_ulink_entries(idval, ptr_clrequest->username, conn, 1 /* note */); if (result) { /* send message to client, reuse sql_command */ sprintf(sql_command, "259:"ULLSPEC"\n", (unsigned long long)idval); if ((new_msg = mstrcat(ptr_addresult->msg, sql_command, &(ptr_addresult->msg_len), 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { ptr_addresult->msg = new_msg; } my_dbi_conn_unlock(conn); my_dbi_conn_rollback(conn); return 259; } /* search orphans in t_xnote */ result = remove_xnote_entries(idval, 0 /* any link target */, conn, 4); if (result == 1 || result == 3) { /* send message to client, reuse sql_command */ sprintf(sql_command, "245:"ULLSPEC"\n", (unsigned long long)idval); if ((new_msg = mstrcat(ptr_addresult->msg, sql_command, &(ptr_addresult->msg_len), 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { ptr_addresult->msg = new_msg; } my_dbi_conn_unlock(conn); my_dbi_conn_rollback(conn); return 245; } /* delete entry in main table */ sprintf(sql_command, "DELETE FROM t_note WHERE note_id="ULLSPEC, (unsigned long long)idval); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { /* send message to client, reuse sql_command */ sprintf(sql_command, "246:"ULLSPEC"\n", (unsigned long long)idval); if ((new_msg = mstrcat(ptr_addresult->msg, sql_command, &(ptr_addresult->msg_len), 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { ptr_addresult->msg = new_msg; } my_dbi_conn_unlock(conn); my_dbi_conn_rollback(conn); LOG_PRINT(LOG_WARNING, get_status_msg(246)); return 246; } dbi_result_free(dbires); /* search orphans in t_user */ if (n_user_id) { result = remove_user_entries(n_user_id, conn); if (result != 0 && result != 4) { /* send message to client, reuse sql_command */ sprintf(sql_command, "234:"ULLSPEC"\n", (unsigned long long)idval); if ((new_msg = mstrcat(ptr_addresult->msg, sql_command, &(ptr_addresult->msg_len), 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { ptr_addresult->msg = new_msg; } my_dbi_conn_unlock(conn); my_dbi_conn_rollback(conn); LOG_PRINT(LOG_WARNING, get_status_msg(234)); return 234; } } /* end if n_user_id */ ptr_addresult->success++; /* send message to client, reuse sql_command */ sprintf(sql_command, "419:"ULLSPEC"\n", (unsigned long long)idval); if ((new_msg = mstrcat(ptr_addresult->msg, sql_command, &(ptr_addresult->msg_len), 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { ptr_addresult->msg = new_msg; } my_dbi_conn_unlock(conn); my_dbi_conn_commit(conn); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ getnote(): implements the client command getnote int getnote returns 0 = no error, 1 = out of memory or connection error, 2 = subselect failed struct CLIENT_REQUEST* ptr_clrequest ptr to structure with client info struct bibinfo *ptr_biblio_info ptr to structure holding bibliography style int ref_format the output format 0 = simple screen rendering, 4 = HTML 12 = notex int n_privatelist if set to 1, limit search to user's private list if set to 0, search all struct ADDRESULT* ptr_addresult ptr to struct with counters int send_data if set to 1, sends back matching datasets (getref) if set to 0, sends back number of matching datasets (scanref) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int getnote(struct CLIENT_REQUEST* ptr_clrequest, struct bibinfo *ptr_biblio_info, int ref_format, int n_privatelist, struct ADDRESULT* ptr_addresult, int send_data) { dbi_conn conn; dbi_result dbires; dbi_driver driver; char **inargv; /* tokens of the client request */ int inargc; /* number of tokens of the client request */ int inargcmax; /* maximum number of tokens of the client request */ size_t len; int counter; int nref_counter = 0; /* counter for references */ int n_isalpha; int n_havesome; int retval = 0; int render_res; int cs_status; int numbyte; /* number of bytes written */ unsigned long long n_id; unsigned long long numrows = 0; size_t buffer_len; /* these are the allocated lengths of the buffers */ size_t sql_command_len; size_t sql_command1_len; size_t stringbuf_len; size_t result_len; size_t n_bufsize; char *sql_command; /* these are ptrs to the buffers and temporary ptrs */ char *new_sql_command; char *sql_command1; char *new_sql_command1; char *buffer; char *new_buffer; char *stringbuf; char *new_stringbuf; char *token; char *newtoken; char *quoted_token; char *query_string; char *eostring; const char* db_encoding; char operator[5]; char the_id[32]; char bitsandpieces[256]; char limitstring[128]; struct SQLTOKEN sqltoken; struct lilimem sentinel; struct renderinfo rendinfo; iconv_t conv_descriptor; sentinel.ptr_mem = NULL; sentinel.ptr_next = NULL; sentinel.varname[0] = '\0'; /* fill in invariant elements of structure */ rendinfo.ptr_biblio_info = ptr_biblio_info; rendinfo.ref_format = ref_format; rendinfo.nuse_citestyle = 0; rendinfo.database = ptr_clrequest->current_db; rendinfo.dbname = NULL; rendinfo.username = ptr_clrequest->username; rendinfo.cgi_url = ptr_clrequest->cgi_url; rendinfo.ptr_clrequest = ptr_clrequest; rendinfo.javascript = 0; /* get buffer to analyze the request */ inargc = 0; inargcmax = 10; inargv = malloc((size_t)inargcmax*sizeof(char*)); if (inargv == NULL || insert_lilimem(&sentinel, (void**)&inargv, NULL)) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } /* get buffer to assemble the SQL queries */ sql_command_len = 4096; sql_command = malloc(sql_command_len); if (sql_command == NULL || insert_lilimem(&sentinel, (void**)&sql_command, NULL)) { delete_all_lilimem(&sentinel); send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } sql_command[0] = '\0'; /* start with an empty string */ /* get another buffer to assemble the SQL queries */ sql_command1_len = 4096; sql_command1 = malloc(sql_command1_len); if (sql_command1 == NULL || insert_lilimem(&sentinel, (void**)&sql_command1, NULL)) { delete_all_lilimem(&sentinel); send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } sql_command1[0] = '\0'; /* start with an empty string */ /* get a buffer to hold tokens */ buffer_len = 4096; buffer = malloc(buffer_len); if (buffer == NULL || insert_lilimem(&sentinel, (void**)&buffer, NULL)) { delete_all_lilimem(&sentinel); send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } buffer[0] = '\0'; /* start with an empty string */ /* get a buffer to hold tokens */ stringbuf_len = 4096; stringbuf = malloc(stringbuf_len); if (stringbuf == NULL || insert_lilimem(&sentinel, (void**)&stringbuf, NULL)) { delete_all_lilimem(&sentinel); send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } buffer[0] = '\0'; /* start with an empty string */ /* get length of the input string */ n_bufsize = atoi(ptr_clrequest->argument); /* try to allocate the amount the client requested */ query_string = malloc(n_bufsize); if (query_string == NULL || insert_lilimem(&sentinel, (void**)&query_string, NULL)) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } /* send acknowledgement to client */ send_status(ptr_clrequest->fd, 0, TERM_NO); if ((cs_status = read_status(ptr_clrequest->fd)) != 0) { LOG_PRINT(LOG_INFO, get_status_msg(112)); delete_all_lilimem(&sentinel); return 1; } /* read id list from client */ numbyte = tread(ptr_clrequest->fd, query_string, n_bufsize); if (numbyte == -1) { LOG_PRINT(LOG_INFO, get_status_msg(109)); delete_all_lilimem(&sentinel); return 1; } eostring = query_string + strlen(query_string); /* connect to the database */ if ((conn = connect_to_db(ptr_clrequest, NULL, 0)) == NULL) { send_status(ptr_clrequest->fd, 204, TERM_NO); LOG_PRINT(LOG_WARNING, get_status_msg(204)); delete_all_lilimem(&sentinel); return 1; } driver = dbi_conn_get_driver(conn); /* get the database encoding */ db_encoding = dbi_conn_get_encoding(conn); /* if we need to convert, create a conversion descriptor for iconv() */ if (db_encoding && *(ptr_biblio_info->encoding) && strcmp(db_encoding, ptr_biblio_info->encoding)) { char to_encoding[64]; if (!strcmp(ptr_biblio_info->encoding, "US-ASCII")) { strcpy(to_encoding, "ASCII//TRANSLIT"); } else { snprintf(to_encoding, 64, "%s//TRANSLIT", ptr_biblio_info->encoding); } conv_descriptor = iconv_open(to_encoding, !strcmp(db_encoding, "US-ASCII") ? "ASCII" : db_encoding); if (conv_descriptor == (iconv_t)(-1)) { LOG_PRINT(LOG_WARNING, "cannot set conversion descriptor (database/output):"); LOG_PRINT(LOG_DEBUG, db_encoding); LOG_PRINT(LOG_DEBUG, ptr_biblio_info->encoding); send_status(ptr_clrequest->fd, 701, TERM_NO); LOG_PRINT(LOG_WARNING, get_status_msg(701)); delete_all_lilimem(&sentinel); return 1; } else { LOG_PRINT(LOG_DEBUG, "database encoding is:"); LOG_PRINT(LOG_DEBUG, db_encoding); } } else { conv_descriptor = NULL; LOG_PRINT(LOG_DEBUG, "no character encoding conversion required"); } LOG_PRINT(LOG_DEBUG, "output encoding is:"); if (*(ptr_biblio_info->encoding)) { LOG_PRINT(LOG_DEBUG, ptr_biblio_info->encoding); } else { LOG_PRINT(LOG_DEBUG, db_encoding); } token = query_string; newtoken = token; /* general strategy: we extract the tokens one after the other and insert brackets, logical operators, and those requests which map to simple t_refdb queries directly into the future search string. For those queries that require a relational lookup a surrogate subselect query is formulated, as mySQL does not (yet) support true subselects. The results of these subselects are lists of refdb_id values which are translated into query fragments and get inserted into the future search string. The final search string is sent to the db server and provides us with the final list of the t_refdb fields we're interested in. This list is finally used to extract the additional data from the t_author, t_keyword, and t_user fields that we need to send back the result. */ /* loop as long as we find more tokens */ while (newtoken != NULL) { token = sql_tokenize(newtoken, &sqltoken); newtoken = sqltoken.next_token; /* printf("%s\n", token); */ if (token != NULL) { /* extract the token and save to a temporary string */ if (sqltoken.length > buffer_len) { new_buffer = (char*)realloc(buffer, (size_t)sqltoken.length); if (new_buffer == NULL) { /* out of memory */ retval = 1; break; } else { buffer = new_buffer; buffer_len = sqltoken.length; } } strncpy(buffer, token, sqltoken.length); buffer[sqltoken.length] ='\0'; if (sqltoken.type != 4) { /* we recycle these tokens */ if ((new_sql_command1 = mstrcat(sql_command1, buffer, &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } else { /*----------------------------------------------------------------*/ /* keywords of note datasets */ if (strncmp(token, ":NKW:", 5) == 0) { /* keyword query */ strncpy(operator, &token[5], sqltoken.length-5); /* save the comparison operator */ operator[sqltoken.length-5] = '\0'; /* terminate string */ /* assemble a surrogate subselect query */ token = sql_tokenize(newtoken, &sqltoken); newtoken = sqltoken.next_token; if (token != NULL) { strncpy(buffer, token, sqltoken.length); buffer[sqltoken.length] ='\0'; /* terminate string */ len = 0; token = nstrtok(buffer, &len, " "); if (token != NULL) { if (*token != '&' && *token != '|') { /* simple keyword query */ sprintf(sql_command, "SELECT DISTINCT t_xkeyword.xref_id FROM t_xkeyword, t_keyword WHERE t_xkeyword.xkeyword_type=\'NOTE\' AND t_keyword.keyword_id=t_xkeyword.keyword_id AND t_keyword.keyword_name %s ", (*operator == '=' || (*operator == '!' && *(operator+1) == '=')) ? "=" : my_dbi_conn_get_cap(conn, "rlike")); quoted_token = mstrdup(token); if (!quoted_token) { retval = 1; break; } if (dbi_conn_quote_string(conn, "ed_token) == 0) { retval = 1; break; } if ((new_sql_command = mstrcat(sql_command, quoted_token, &sql_command_len, 0)) == NULL) { retval = 1; free(quoted_token); break; } else { sql_command = new_sql_command; } free(quoted_token); } else if (*token == '|') { strcpy(sql_command, "SELECT DISTINCT t_xkeyword.xref_id FROM t_xkeyword, t_keyword WHERE t_xkeyword.xkeyword_type=\'NOTE\' AND ("); while (token != NULL) { token = nstrtok(token+len, &len, " "); if (token != NULL) { if (*operator == '=' || (*operator == '!' && *(operator+1) == '=')) { strcpy(bitsandpieces, "t_keyword.keyword_name = "); } else { sprintf(bitsandpieces, "t_keyword.keyword_name %s ", my_dbi_conn_get_cap(conn, "rlike")); } if ((new_sql_command = mstrcat(sql_command, bitsandpieces, &sql_command_len, 0)) == NULL) { retval = 1; break; } else { sql_command = new_sql_command; } if ((new_stringbuf = mstrncpy(stringbuf, token, len, &stringbuf_len)) == NULL) { retval = 1; break; } else { stringbuf = new_stringbuf; } stringbuf[len] = '\0'; quoted_token = mstrdup(stringbuf); if (!quoted_token) { retval = 1; break; } if (dbi_conn_quote_string(conn, "ed_token) == 0) { retval = 1; break; } if ((new_sql_command = mstrcat(sql_command, quoted_token, &sql_command_len, 0)) == NULL) { retval = 1; free(quoted_token); break; } else { sql_command = new_sql_command; } free(quoted_token); if ((new_sql_command = mstrcat(sql_command, " OR ", &sql_command_len, 0)) == NULL) { retval = 1; break; } else { sql_command = new_sql_command; } } else { if ((new_sql_command = mstrcat(sql_command, ") ", &sql_command_len, 4)) == NULL) { retval = 1; break; } else { sql_command = new_sql_command; } } } if ((new_sql_command = mstrcat(sql_command, "AND t_keyword.keyword_id=t_xkeyword.keyword_id", &sql_command_len, 0)) == NULL) { retval = 1; break; } else { sql_command = new_sql_command; } } else if (*token == '&') { counter = 0; strcpy(sql_command, "SELECT DISTINCT t_xkeyword.xref_id, COUNT(*) AS count FROM t_xkeyword, t_keyword WHERE t_xkeyword.xkeyword_type=\'NOTE\' AND ("); while (token != NULL) { token = nstrtok(token+len, &len, " "); if (token != NULL) { if (*operator == '=' || (*operator == '!' && *(operator+1) == '=')) { strcpy(bitsandpieces, "t_keyword.keyword_name = "); } else { sprintf(bitsandpieces, "t_keyword.keyword_name %s ", my_dbi_conn_get_cap(conn, "rlike")); } if ((new_sql_command = mstrcat(sql_command, bitsandpieces, &sql_command_len, 0)) == NULL) { retval = 1; break; } else { sql_command = new_sql_command; } if ((new_stringbuf = mstrncpy(stringbuf, token, len, &stringbuf_len)) == NULL) { retval = 1; break; } else { stringbuf = new_stringbuf; } stringbuf[len] = '\0'; quoted_token = mstrdup(stringbuf); if (!quoted_token) { retval = 1; break; } if (dbi_conn_quote_string(conn, "ed_token) == 0) { retval = 1; break; } if ((new_sql_command = mstrcat(sql_command, quoted_token, &sql_command_len, 0)) == NULL) { retval = 1; free(quoted_token); break; } else { sql_command = new_sql_command; } free(quoted_token); if ((new_sql_command = mstrcat(sql_command, " OR ", &sql_command_len, 0)) == NULL) { retval = 1; break; } else { sql_command = new_sql_command; } counter++; } else { if ((new_sql_command = mstrcat(sql_command, ") ", &sql_command_len, 4)) == NULL) { retval = 1; break; } else { sql_command = new_sql_command; } } } if ((new_sql_command = mstrcat(sql_command, "AND t_keyword.keyword_id=t_xkeyword.keyword_id GROUP BY t_xkeyword.xref_id HAVING count=", &sql_command_len, 0)) == NULL) { retval = 1; break; } else { sql_command = new_sql_command; } sprintf(buffer, "%d", counter); if ((new_sql_command = mstrcat(sql_command, buffer, &sql_command_len, 0)) == NULL) { retval = 1; break; } else { sql_command = new_sql_command; } } } } LOG_PRINT(LOG_DEBUG, sql_command); /* dbires will contain all refdb_ids that match the above keyword requirements in the pseudo-subselect */ dbires = dbi_conn_query(conn, sql_command); if (!dbires) { retval = 2; break; } if ((new_sql_command1 = mstrcat(sql_command1, "t_note.note_id IN (", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } n_havesome = 0; while (dbi_result_next_row(dbires) != 0) { n_havesome = 1; n_id = my_dbi_result_get_idval_idx(dbires, 1); sprintf(the_id, ULLSPEC, (unsigned long long)n_id); if ((new_sql_command1 = mstrcat(sql_command1, the_id, &sql_command1_len, 0)) == NULL) { retval = 1; dbi_result_free(dbires); break; } else { sql_command1 = new_sql_command1; } if ((new_sql_command1 = mstrcat(sql_command1, ",", &sql_command1_len, 0)) == NULL) { retval = 1; dbi_result_free(dbires); break; } else { sql_command1 = new_sql_command1; } } if (!n_havesome) { /* use a dummy value that does not exist in the database */ if ((new_sql_command1 = mstrcat(sql_command1, "-1,", &sql_command1_len, 0)) == NULL) { /* the comma will be removed further down */ retval = 1; dbi_result_free(dbires); break; } else { sql_command1 = new_sql_command1; } } dbi_result_free(dbires); if (retval) { break; } if ((new_sql_command1 = mstrcat(sql_command1, ")", &sql_command1_len, 1)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } /*----------------------------------------------------------------*/ /* queries linking to keywords */ else if (strncmp(token, ":KW:", 4) == 0) { /* keyword query */ strncpy(operator, &token[4], sqltoken.length-4); /* save the comparison operator */ operator[sqltoken.length-4] = '\0'; /* terminate string */ /* assemble a surrogate subselect query */ token = sql_tokenize(newtoken, &sqltoken); newtoken = sqltoken.next_token; if (token != NULL) { strncpy(buffer, token, sqltoken.length); buffer[sqltoken.length] ='\0'; /* terminate string */ len = 0; token = nstrtok(buffer, &len, " "); if (token != NULL) { if (*token != '&' && *token != '|') { /* simple keyword query */ sprintf(sql_command, "SELECT t_xnote.note_id FROM t_xnote, t_keyword WHERE t_keyword.keyword_id=t_xnote.xref_id AND t_xnote.xnote_type=\'KEYWORD\' AND t_keyword.keyword_name %s ", (*operator == '=' || (*operator == '!' && *(operator+1) == '=')) ? "=" : my_dbi_conn_get_cap(conn, "rlike")); quoted_token = mstrdup(token); if (!quoted_token) { retval = 1; break; } if (dbi_conn_quote_string(conn, "ed_token) == 0) { retval = 1; break; } if ((new_sql_command = mstrcat(sql_command, quoted_token, &sql_command_len, 0)) == NULL) { retval = 1; free(quoted_token); break; } else { sql_command = new_sql_command; } free(quoted_token); } else if (*token == '|') { strcpy(sql_command, "SELECT DISTINCT t_xnote.note_id FROM t_xnote, t_keyword WHERE t_keyword.keyword_id=t_xnote.xref_id AND t_xnote.xnote_type=\'KEYWORD\' AND ("); while (token != NULL) { token = nstrtok(token+len, &len, " "); if (token != NULL) { if (*operator == '=' || (*operator == '!' && *(operator+1) == '=')) { strcpy(bitsandpieces, "t_keyword.keyword_name = "); } else { sprintf(bitsandpieces, "t_keyword.keyword_name %s ", my_dbi_conn_get_cap(conn, "rlike")); } if ((new_sql_command = mstrcat(sql_command, bitsandpieces, &sql_command_len, 0)) == NULL) { retval = 1; break; } else { sql_command = new_sql_command; } if ((new_stringbuf = mstrncpy(stringbuf, token, len, &stringbuf_len)) == NULL) { retval = 1; break; } else { stringbuf = new_stringbuf; } stringbuf[len] = '\0'; quoted_token = mstrdup(stringbuf); if (!quoted_token) { retval = 1; break; } if (dbi_conn_quote_string(conn, "ed_token) == 0) { retval = 1; break; } if ((new_sql_command = mstrcat(sql_command, quoted_token, &sql_command_len, 0)) == NULL) { retval = 1; free(quoted_token); break; } else { sql_command = new_sql_command; } free(quoted_token); if ((new_sql_command = mstrcat(sql_command, " OR ", &sql_command_len, 0)) == NULL) { retval = 1; break; } else { sql_command = new_sql_command; } } else { if ((new_sql_command = mstrcat(sql_command, ") ", &sql_command_len, 4)) == NULL) { retval = 1; break; } else { sql_command = new_sql_command; } } } } else if (*token == '&') { counter = 0; strcpy(sql_command, "SELECT DISTINCT t_xnote.note_id, COUNT(*) FROM t_xnote, t_keyword WHERE t_keyword.keyword_id=t_xnote.xref_id AND t_xnote.xnote_type=\'KEYWORD\' AND ("); while (token != NULL) { token = nstrtok(token+len, &len, " "); if (token != NULL) { if (*operator == '=' || (*operator == '!' && *(operator+1) == '=')) { strcpy(bitsandpieces, "t_keyword.keyword_name = "); } else { sprintf(bitsandpieces, "t_keyword.keyword_name %s ", my_dbi_conn_get_cap(conn, "rlike")); } if ((new_sql_command = mstrcat(sql_command, bitsandpieces, &sql_command_len, 0)) == NULL) { retval = 1; break; } else { sql_command = new_sql_command; } if ((new_stringbuf = mstrncpy(stringbuf, token, len, &stringbuf_len)) == NULL) { retval = 1; break; } else { stringbuf = new_stringbuf; } stringbuf[len] = '\0'; quoted_token = mstrdup(stringbuf); if (!quoted_token) { retval = 1; break; } if (dbi_conn_quote_string(conn, "ed_token) == 0) { retval = 1; break; } if ((new_sql_command = mstrcat(sql_command, quoted_token, &sql_command_len, 0)) == NULL) { retval = 1; free(quoted_token); break; } else { sql_command = new_sql_command; } free(quoted_token); if ((new_sql_command = mstrcat(sql_command, " OR ", &sql_command_len, 0)) == NULL) { retval = 1; break; } else { sql_command = new_sql_command; } counter++; } else { if ((new_sql_command = mstrcat(sql_command, ") ", &sql_command_len, 4)) == NULL) { retval = 1; break; } else { sql_command = new_sql_command; } } } if ((new_sql_command = mstrcat(sql_command, " GROUP BY t_xnote.note_id HAVING count=", &sql_command_len, 0)) == NULL) { retval = 1; break; } else { sql_command = new_sql_command; } sprintf(buffer, "%d", counter); if ((new_sql_command = mstrcat(sql_command, buffer, &sql_command_len, 0)) == NULL) { retval = 1; break; } else { sql_command = new_sql_command; } } } } LOG_PRINT(LOG_DEBUG, sql_command); /* dbires will contain all note_ids that match the above keyword requirements in the pseudo-subselect */ dbires = dbi_conn_query(conn, sql_command); if (!dbires) { retval = 2; break; } if ((new_sql_command1 = mstrcat(sql_command1, "t_note.note_id IN (", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } n_havesome = 0; while (dbi_result_next_row(dbires) != 0) { n_havesome = 1; n_id = my_dbi_result_get_idval_idx(dbires, 1); sprintf(the_id, ULLSPEC, (unsigned long long)n_id); if ((new_sql_command1 = mstrcat(sql_command1, the_id, &sql_command1_len, 0)) == NULL) { retval = 1; dbi_result_free(dbires); break; } else { sql_command1 = new_sql_command1; } if ((new_sql_command1 = mstrcat(sql_command1, ",", &sql_command1_len, 0)) == NULL) { retval = 1; dbi_result_free(dbires); break; } else { sql_command1 = new_sql_command1; } } if (!n_havesome) { /* use a dummy value that does not exist in the database */ if ((new_sql_command1 = mstrcat(sql_command1, "-1,", &sql_command1_len, 0)) == NULL) { /* the comma will be removed further down */ retval = 1; dbi_result_free(dbires); break; } else { sql_command1 = new_sql_command1; } } dbi_result_free(dbires); if (retval) { break; } if ((new_sql_command1 = mstrcat(sql_command1, ")", &sql_command1_len, 1)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } /*----------------------------------------------------------------*/ /* queries linking to author names */ else if (strncmp(token, ":AU:", 4) == 0) { /* author query */ strncpy(operator, &token[4], sqltoken.length-4); /* save the comparison operator */ operator[sqltoken.length-4] = '\0'; /* terminate string */ /* assemble a surrogate subselect query */ token = sql_tokenize(newtoken, &sqltoken); newtoken = sqltoken.next_token; if (token != NULL) { strncpy(buffer, token, sqltoken.length); buffer[sqltoken.length] ='\0'; /* terminate string */ len = 0; token = nstrtok(buffer, &len, " "); if (token != NULL) { if (*token != '&' && *token != '|') { /* simple keyword query */ sprintf(sql_command, "SELECT t_xnote.note_id FROM t_xnote, t_author WHERE t_author.author_id=t_xnote.xref_id AND t_xnote.xnote_type=\'AUTHOR\' AND t_author.author_name %s ", (*operator == '=' || (*operator == '!' && *(operator+1) == '=')) ? "=" : my_dbi_conn_get_cap(conn, "rlike")); quoted_token = mstrdup(token); if (!quoted_token) { retval = 1; break; } if (dbi_conn_quote_string(conn, "ed_token) == 0) { retval = 1; break; } if ((new_sql_command = mstrcat(sql_command, quoted_token, &sql_command_len, 0)) == NULL) { retval = 1; free(quoted_token); break; } else { sql_command = new_sql_command; } free(quoted_token); } else if (*token == '|') { strcpy(sql_command, "SELECT DISTINCT t_xnote.note_id FROM t_xnote, t_author WHERE t_author.author_id=t_xnote.xref_id AND t_xnote.xnote_type=\'AUTHOR\' AND ("); while (token != NULL) { token = nstrtok(token+len, &len, " "); if (token != NULL) { if (*operator == '=' || (*operator == '!' && *(operator+1) == '=')) { strcpy(bitsandpieces, "t_author.author_name = "); } else { sprintf(bitsandpieces, "t_author.author_name %s ", my_dbi_conn_get_cap(conn, "rlike")); } if ((new_sql_command = mstrcat(sql_command, bitsandpieces, &sql_command_len, 0)) == NULL) { retval = 1; break; } else { sql_command = new_sql_command; } if ((new_stringbuf = mstrncpy(stringbuf, token, len, &stringbuf_len)) == NULL) { retval = 1; break; } else { stringbuf = new_stringbuf; } stringbuf[len] = '\0'; quoted_token = mstrdup(stringbuf); if (!quoted_token) { retval = 1; break; } if (dbi_conn_quote_string(conn, "ed_token) == 0) { retval = 1; break; } if ((new_sql_command = mstrcat(sql_command, quoted_token, &sql_command_len, 0)) == NULL) { retval = 1; free(quoted_token); break; } else { sql_command = new_sql_command; } free(quoted_token); if ((new_sql_command = mstrcat(sql_command, " OR ", &sql_command_len, 0)) == NULL) { retval = 1; break; } else { sql_command = new_sql_command; } } else { if ((new_sql_command = mstrcat(sql_command, ") ", &sql_command_len, 4)) == NULL) { retval = 1; break; } else { sql_command = new_sql_command; } } } } else if (*token == '&') { counter = 0; strcpy(sql_command, "SELECT DISTINCT t_xnote.note_id, COUNT(*) FROM t_xnote, t_author WHERE t_author.author_id=t_xnote.xref_id AND t_xnote.xnote_type=\'AUTHOR\' AND ("); while (token != NULL) { token = nstrtok(token+len, &len, " "); if (token != NULL) { if (*operator == '=' || (*operator == '!' && *(operator+1) == '=')) { strcpy(bitsandpieces, "t_author.author_name = "); } else { sprintf(bitsandpieces, "t_author.author_name %s ", my_dbi_conn_get_cap(conn, "rlike")); } if ((new_sql_command = mstrcat(sql_command, bitsandpieces, &sql_command_len, 0)) == NULL) { retval = 1; break; } else { sql_command = new_sql_command; } if ((new_stringbuf = mstrncpy(stringbuf, token, len, &stringbuf_len)) == NULL) { retval = 1; break; } else { stringbuf = new_stringbuf; } stringbuf[len] = '\0'; quoted_token = mstrdup(stringbuf); if (!quoted_token) { retval = 1; break; } if (dbi_conn_quote_string(conn, "ed_token) == 0) { retval = 1; break; } if ((new_sql_command = mstrcat(sql_command, quoted_token, &sql_command_len, 0)) == NULL) { retval = 1; free(quoted_token); break; } else { sql_command = new_sql_command; } free(quoted_token); if ((new_sql_command = mstrcat(sql_command, " OR ", &sql_command_len, 0)) == NULL) { retval = 1; break; } else { sql_command = new_sql_command; } counter++; } else { if ((new_sql_command = mstrcat(sql_command, ") ", &sql_command_len, 4)) == NULL) { retval = 1; break; } else { sql_command = new_sql_command; } } } if ((new_sql_command = mstrcat(sql_command, " GROUP BY t_xnote.note_id HAVING count=", &sql_command_len, 0)) == NULL) { retval = 1; break; } else { sql_command = new_sql_command; } sprintf(buffer, "%d", counter); if ((new_sql_command = mstrcat(sql_command, buffer, &sql_command_len, 0)) == NULL) { retval = 1; break; } else { sql_command = new_sql_command; } } } } LOG_PRINT(LOG_DEBUG, sql_command); /* dbires will contain all note_ids that match the above keyword requirements in the pseudo-subselect */ dbires = dbi_conn_query(conn, sql_command); if (!dbires) { retval = 2; break; } if ((new_sql_command1 = mstrcat(sql_command1, "t_note.note_id IN (", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } n_havesome = 0; while (dbi_result_next_row(dbires) != 0) { n_havesome = 1; n_id = my_dbi_result_get_idval_idx(dbires, 1); sprintf(the_id, ULLSPEC, (unsigned long long)n_id); if ((new_sql_command1 = mstrcat(sql_command1, the_id, &sql_command1_len, 0)) == NULL) { retval = 1; dbi_result_free(dbires); break; } else { sql_command1 = new_sql_command1; } if ((new_sql_command1 = mstrcat(sql_command1, ",", &sql_command1_len, 0)) == NULL) { retval = 1; dbi_result_free(dbires); break; } else { sql_command1 = new_sql_command1; } } if (!n_havesome) { /* use a dummy value that does not exist in the database */ if ((new_sql_command1 = mstrcat(sql_command1, "-1,", &sql_command1_len, 0)) == NULL) { /* the comma will be removed further down */ retval = 1; dbi_result_free(dbires); break; } else { sql_command1 = new_sql_command1; } } dbi_result_free(dbires); if (retval) { break; } if ((new_sql_command1 = mstrcat(sql_command1, ")", &sql_command1_len, 1)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } /*----------------------------------------------------------------*/ /* queries linking to journal names */ else if (strncmp(token, ":JO:", 4) == 0 || strncmp(token, ":JF:", 4) == 0 || strncmp(token, ":J1:", 4) == 0 || strncmp(token, ":J2:", 4) == 0) { /* periodical query */ strncpy(operator, &token[4], sqltoken.length-4); /* save the comparison operator */ operator[sqltoken.length-4] = '\0'; /* terminate string */ /* assemble a surrogate subselect query */ if (strncmp(token, ":JF:", 4) == 0) { strcpy(sql_command, "SELECT t_xnote.note_id FROM t_xnote, t_periodical WHERE t_periodical.periodical_id=t_xnote.xref_id AND t_periodical.periodical_name"); } else if (strncmp(token, ":JO:", 4) == 0) { strcpy(sql_command, "SELECT t_xnote.note_id FROM t_xnote, t_periodical WHERE t_periodical.periodical_id=t_xnote.xref_id AND t_periodical.periodical_abbrev"); } else if (strncmp(token, ":J1:", 4) == 0) { strcpy(sql_command, "SELECT t_xnote.note_id FROM t_xnote, t_periodical WHERE t_periodical.periodical_id=t_xnote.xref_id AND t_periodical.periodical_custabbrev1"); } else { /* :J2: */ strcpy(sql_command, "SELECT t_xnote.note_id FROM t_xnote, t_periodical WHERE t_periodical.periodical_id=t_xnote.xref_id AND t_periodical.periodical_custabbrev2"); } /* translate operator to regexp operator */ if (*operator == '=') { /* sprintf(bitsandpieces, " %s ", my_dbi_conn_get_cap(conn, "rlike")); */ if ((new_sql_command = mstrcat(sql_command, " = ", &sql_command_len, 0)) == NULL) { retval = 1; break; } else { sql_command = new_sql_command; } } else if (*operator == '~') { sprintf(bitsandpieces, " %s ", my_dbi_conn_get_cap(conn, "rlike")); if ((new_sql_command = mstrcat(sql_command, bitsandpieces, &sql_command_len, 0)) == NULL) { retval = 1; break; } else { sql_command = new_sql_command; } } else if (*(operator+1) == '=') { /* sprintf(bitsandpieces, " %s ", my_dbi_conn_get_cap(conn, "not_rlike")); */ if ((new_sql_command = mstrcat(sql_command, " != ", &sql_command_len, 0)) == NULL) { retval = 1; break; } else { sql_command = new_sql_command; } } else { /* treat all other operators as non-equal regexp*/ sprintf(bitsandpieces, " %s ", my_dbi_conn_get_cap(conn, "not_rlike")); if ((new_sql_command = mstrcat(sql_command, bitsandpieces, &sql_command_len, 0)) == NULL) { retval = 1; break; } else { sql_command = new_sql_command; } } token = sql_tokenize(newtoken, &sqltoken); newtoken = sqltoken.next_token; if (token != NULL) { if ((new_buffer = mstrncpy(buffer, token, sqltoken.length, &buffer_len)) == NULL) { retval = 1; break; } else { buffer = new_buffer; } buffer[sqltoken.length] ='\0'; quoted_token = mstrdup(buffer); if (!quoted_token) { retval = 1; break; } if (dbi_conn_quote_string(conn, "ed_token) == 0) { retval = 1; break; } if ((new_sql_command = mstrcat(sql_command, quoted_token, &sql_command_len, 0)) == NULL) { retval = 1; free(quoted_token); break; } else { sql_command = new_sql_command; } free(quoted_token); } LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { retval = 2; break; } if ((new_sql_command1 = mstrcat(sql_command1, "t_note.note_id IN (", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } if (dbi_result_get_numrows(dbires)) { while (dbi_result_next_row(dbires) != 0) { n_id = my_dbi_result_get_idval_idx(dbires, 1); sprintf(the_id, ULLSPEC, (unsigned long long)n_id); if ((new_sql_command1 = mstrcat(sql_command1, the_id, &sql_command1_len, 0)) == NULL) { retval = 1; dbi_result_free(dbires); break; } else { sql_command1 = new_sql_command1; } if ((new_sql_command1 = mstrcat(sql_command1, ",", &sql_command1_len, 0)) == NULL) { retval = 1; dbi_result_free(dbires); break; } else { sql_command1 = new_sql_command1; } } /* remove trailing comma */ sql_command1[strlen(sql_command1)-1] = '\0'; } else { /* use a dummy value that does not exist in the database */ if ((new_sql_command1 = mstrcat(sql_command1, "-1", &sql_command1_len, 0)) == NULL) { retval = 1; dbi_result_free(dbires); break; } else { sql_command1 = new_sql_command1; } } if ((new_sql_command1 = mstrcat(sql_command1, ")", &sql_command1_len, 0)) == NULL) { retval = 1; dbi_result_free(dbires); break; } else { sql_command1 = new_sql_command1; } dbi_result_free(dbires); } /*----------------------------------------------------------------*/ /* queries linking to references */ else if (strncmp(token, ":ID:", 4) == 0 || strncmp(token, ":CK:", 4) == 0) { /* reference by ID or by citation key */ strncpy(operator, &token[4], sqltoken.length-4); /* save the comparison operator */ operator[sqltoken.length-4] = '\0'; /* terminate string */ /* assemble a surrogate subselect query */ if (strncmp(token, ":ID:", 4) == 0) { strcpy(sql_command, "SELECT t_xnote.note_id FROM t_xnote WHERE t_xnote.xnote_type=\'REFERENCE\' AND t_xnote.xref_id"); } else { /* :CK: */ strcpy(sql_command, "SELECT t_xnote.note_id FROM t_xnote, t_refdb WHERE t_xnote.xnote_type=\'REFERENCE\' AND t_refdb.refdb_id=t_xnote.xref_id AND t_refdb.refdb_citekey"); } /* append operator */ if (strncmp(token, ":ID:", 4) == 0 && *operator == '~') { strcpy(bitsandpieces, "="); } else if (strncmp(token, ":ID:", 4) == 0 && *operator == '!' && *(operator+1) == '~') { strcpy(bitsandpieces, "!="); } else { strcpy(bitsandpieces, operator); } if ((new_sql_command = mstrcat(sql_command, bitsandpieces, &sql_command_len, 0)) == NULL) { retval = 1; break; } else { sql_command = new_sql_command; } token = sql_tokenize(newtoken, &sqltoken); newtoken = sqltoken.next_token; if (token != NULL) { if ((new_buffer = mstrncpy(buffer, token, sqltoken.length, &buffer_len)) == NULL) { retval = 1; break; } else { buffer = new_buffer; } buffer[sqltoken.length] ='\0'; quoted_token = mstrdup(buffer); if (!quoted_token) { retval = 1; break; } if (dbi_conn_quote_string(conn, "ed_token) == 0) { retval = 1; break; } if ((new_sql_command = mstrcat(sql_command, quoted_token, &sql_command_len, 0)) == NULL) { retval = 1; free(quoted_token); break; } else { sql_command = new_sql_command; } free(quoted_token); } LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { retval = 2; break; } if ((new_sql_command1 = mstrcat(sql_command1, "t_note.note_id IN (", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } if (dbi_result_get_numrows(dbires)) { while (dbi_result_next_row(dbires) != 0) { n_id = my_dbi_result_get_idval_idx(dbires, 1); sprintf(the_id, ULLSPEC, (unsigned long long)n_id); if ((new_sql_command1 = mstrcat(sql_command1, the_id, &sql_command1_len, 0)) == NULL) { retval = 1; dbi_result_free(dbires); break; } else { sql_command1 = new_sql_command1; } if ((new_sql_command1 = mstrcat(sql_command1, ",", &sql_command1_len, 0)) == NULL) { retval = 1; dbi_result_free(dbires); break; } else { sql_command1 = new_sql_command1; } } /* remove trailing comma */ sql_command1[strlen(sql_command1)-1] = '\0'; } else { /* use a dummy value that does not exist in the database */ if ((new_sql_command1 = mstrcat(sql_command1, "-1", &sql_command1_len, 0)) == NULL) { retval = 1; dbi_result_free(dbires); break; } else { sql_command1 = new_sql_command1; } } if ((new_sql_command1 = mstrcat(sql_command1, ")", &sql_command1_len, 0)) == NULL) { retval = 1; dbi_result_free(dbires); break; } else { sql_command1 = new_sql_command1; } dbi_result_free(dbires); } /*----------------------------------------------------------------*/ /* simple queries */ else { /* all simple t_note queries */ strncpy(operator, &token[5], sqltoken.length-5); /* save the comparison operator */ operator[sqltoken.length-5] = '\0'; /* terminate string */ /* initialize alphanumeric indicator */ n_isalpha = 1; if (strncmp(token, ":NPY:", 5) == 0) { if ((new_sql_command1 = mstrcat(sql_command1, "t_note.note_date", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; n_isalpha = 0; } } else if (strncmp(token, ":NID:", 5) == 0) { if ((new_sql_command1 = mstrcat(sql_command1, "t_note.note_id", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; n_isalpha = 0; } } else if (strncmp(token, ":NCK:", 5) == 0) { if ((new_sql_command1 = mstrcat(sql_command1, "t_note.note_key", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } else if (strncmp(token, ":NTI:", 5) == 0) { if ((new_sql_command1 = mstrcat(sql_command1, "t_note.note_title", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } /* we have to treat two types of columns: numerical columns can reuse the operator directly. Alphanumeric columns need some intelligent translation into a regexp-based query */ if (n_isalpha) { if (*operator == '=') { strcpy(bitsandpieces, " = "); } else if (*operator == '~') { sprintf(bitsandpieces, " %s ", my_dbi_conn_get_cap(conn, "rlike")); } else if (*operator == '!' && *(operator+1) == '=') { sprintf(bitsandpieces, " != "); } else { /* treat all other operators as non-equal */ sprintf(bitsandpieces, " %s ", my_dbi_conn_get_cap(conn, "not_rlike")); } if ((new_sql_command1 = mstrcat(sql_command1, bitsandpieces, &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } else { if ((new_sql_command1 = mstrcat(sql_command1, operator, &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } token = sql_tokenize(newtoken, &sqltoken); newtoken = sqltoken.next_token; if (token != NULL) { /* printf("%s:%d\n", token, error); */ /* printf("%s\n", newtoken); */ if ((new_buffer = mstrncpy(buffer, token, sqltoken.length, &buffer_len)) == NULL) { retval = 1; break; } else { buffer = new_buffer; } buffer[sqltoken.length] ='\0'; quoted_token = mstrdup(buffer); if (!quoted_token) { retval = 1; break; } if (dbi_conn_quote_string(conn, "ed_token) == 0) { retval = 1; break; } if ((new_sql_command1 = mstrcat(sql_command1, quoted_token, &sql_command1_len, 0)) == NULL) { retval = 1; free(quoted_token); break; } else { sql_command1 = new_sql_command1; } free(quoted_token); } } } /* if (sqltoken.type != 4) / else */ } /* if (token != NULL) */ } /* while (newtoken != NULL) */ if (retval) { if (retval == 1) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); } else if (retval == 2) { send_status(ptr_clrequest->fd, 234, TERM_NO); LOG_PRINT(LOG_WARNING, get_status_msg(234)); } /* printf("error detected\n"); */ dbi_conn_close(conn); delete_all_lilimem(&sentinel); if (conv_descriptor) { iconv_close(conv_descriptor); } return 1; } /* now assemble the SQL query string proper */ if (n_privatelist) { /* this list contains only the notes that belong to the user. We need not care about the share setting of the server or of extended notes */ sprintf(sql_command, "SELECT DISTINCT t_note.note_id, t_note.note_key, t_note.note_title, t_note.note_user_id, t_note.note_date, t_note.note_content, t_note.note_content_type, t_note.note_content_xmllang, t_note.note_share, t_user.user_name FROM t_note,t_user WHERE t_note.note_user_id=t_user.user_id AND t_user.user_name=\'%s\' AND ", ptr_clrequest->username); } else { /* need to check the server and note share settings */ if (ptr_clrequest->share_default) { /* if the server shares by default, we need to make sure the notes of other users are not private */ sprintf(sql_command, "SELECT DISTINCT t_note.note_id, t_note.note_key, t_note.note_title, t_note.note_user_id, t_note.note_date, t_note.note_content, t_note.note_content_type, t_note.note_content_xmllang, t_note.note_share, t_user.user_name FROM t_note,t_user WHERE t_note.note_user_id=t_user.user_id AND (t_user.user_name=\'%s\' OR (t_user.user_name!=\'%s\' AND t_note.note_share!=0)) AND ", ptr_clrequest->username, ptr_clrequest->username); } else { /* if the server is paranoid by default, we need to make sure the notes of other users are positively public */ sprintf(sql_command, "SELECT DISTINCT t_note.note_id, t_note.note_key, t_note.note_title, t_note.note_user_id, t_note.note_date, t_note.note_content, t_note.note_content_type, t_note.note_content_xmllang, t_note.note_share, t_user.user_name FROM t_note,t_user WHERE t_note.note_user_id=t_user.user_id AND (t_user.user_name=\'%s\' OR (t_user.user_name!=\'%s\' AND t_note.note_share=1)) AND ", ptr_clrequest->username, ptr_clrequest->username); } } if ((new_sql_command = mstrcat(sql_command, sql_command1, &sql_command_len, 0)) == NULL) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); dbi_conn_close(conn); delete_all_lilimem(&sentinel); if (conv_descriptor) { iconv_close(conv_descriptor); } return 1; } else { sql_command = new_sql_command; } /* sort the output */ if (strncmp(ptr_biblio_info->sort_string, "PY", 2) == 0) { if (retval || ((new_sql_command = mstrcat(sql_command, " ORDER BY t_note.note_date", &sql_command_len, 0)) == NULL)) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); dbi_conn_close(conn); delete_all_lilimem(&sentinel); if (conv_descriptor) { iconv_close(conv_descriptor); } return 1; } else { sql_command = new_sql_command; } } else { if (retval || ((new_sql_command = mstrcat(sql_command, " ORDER BY t_note.note_id", &sql_command_len, 0)) == NULL)) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); dbi_conn_close(conn); delete_all_lilimem(&sentinel); if (conv_descriptor) { iconv_close(conv_descriptor); } return 1; } else { sql_command = new_sql_command; } } /* see whether the query should be limited to a range */ if (*(ptr_clrequest->limit)) { char *colon; colon = strchr(ptr_clrequest->limit, (int)':'); if (!colon) { snprintf(limitstring, 128, " LIMIT %s ", ptr_clrequest->limit); } else { *colon = '\0'; snprintf(limitstring, 128, " LIMIT %s OFFSET %s ", ptr_clrequest->limit, colon+1); } if ((new_sql_command = mstrcat(sql_command, limitstring, &sql_command_len, 0)) == NULL) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); dbi_conn_close(conn); delete_all_lilimem(&sentinel); if (conv_descriptor) { iconv_close(conv_descriptor); } return 1; } else { sql_command = new_sql_command; } } LOG_PRINT(LOG_DEBUG, sql_command); /* actually run the query */ rendinfo.dbires = dbi_conn_query(conn, sql_command); if (!rendinfo.dbires) { send_status(ptr_clrequest->fd, 234, TERM_NO); LOG_PRINT(LOG_WARNING, get_status_msg(234)); dbi_conn_close(conn); delete_all_lilimem(&sentinel); if (conv_descriptor) { iconv_close(conv_descriptor); } return 1; } numrows = dbi_result_get_numrows(rendinfo.dbires); if (!send_data) { /* countref */ ptr_addresult->success = numrows; dbi_result_free(rendinfo.dbires); dbi_conn_close(conn); delete_all_lilimem(&sentinel); send_status(ptr_clrequest->fd, 402, TERM_YES); return retval; } /* else: getnote */ /* create a "header" if necessary */ /* prepare_render resets sql_command */ /* fill in variable elements of structure */ rendinfo.ptr_ref = &sql_command; rendinfo.ptr_ref_len = &sql_command_len; if (!*(rendinfo.ptr_biblio_info->encoding)) { rendinfo.ptr_biblio_info->encoding = dbi_conn_get_encoding(conn); } /* real output starts here */ if (prepare_render_note(&rendinfo)) { tiwrite(ptr_clrequest->fd, "", TERM_YES); read_status(ptr_clrequest->fd); send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); dbi_result_free(rendinfo.dbires); dbi_conn_close(conn); delete_all_lilimem(&sentinel); if (conv_descriptor) { iconv_close(conv_descriptor); } return 1; } if (numrows) { /* fetch all notes we're interested in */ while (dbi_result_next_row(rendinfo.dbires) != 0) { nref_counter++; /* fill in variable elements of structure */ rendinfo.ptr_ref = &sql_command; rendinfo.ptr_ref_len = &sql_command_len; rendinfo.nref_counter = nref_counter; /* recycle sql_command */ if ((render_res = render_note(&rendinfo)) != 0) { if (render_res == 801) { retval = 1; tiwrite(ptr_clrequest->fd, "", TERM_YES); read_status(ptr_clrequest->fd); send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); dbi_result_free(rendinfo.dbires); dbi_conn_close(conn); delete_all_lilimem(&sentinel); if (conv_descriptor) { iconv_close(conv_descriptor); } return 0; } else { ptr_addresult->failure++; } } /* run a character encoding conversion if required */ if (conv_descriptor && *sql_command) { size_t inlength; size_t outlength; char* my_sql_command = NULL; /* this ptr will be modified by iconv() */ char* my_sql_command_start = NULL; /* records initial state of my_elvalue */ const char* my_instring = NULL; /* this ptr will be modified by iconv() */ inlength = strlen(sql_command)/* + 1 */; /* with the encodings supported by our database engines, the converted string can't be longer than six times the input string */ outlength = 6*inlength; if ((my_sql_command = malloc(outlength)) == NULL) { retval = 1; tiwrite(ptr_clrequest->fd, "", TERM_YES); read_status(ptr_clrequest->fd); send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); dbi_result_free(rendinfo.dbires); dbi_conn_close(conn); delete_all_lilimem(&sentinel); if (conv_descriptor) { iconv_close(conv_descriptor); } return 0; } /* keep start of the converted string */ my_sql_command_start = my_sql_command; /* variable will be modified by iconv, so don't use original */ my_instring = (const char*)sql_command; /* now actually do the conversion */ if (iconv(conv_descriptor, &my_instring, &inlength, &my_sql_command, &outlength) == (size_t)(-1)) { if (errno == EILSEQ) { sprintf(sql_command, "iconv: invalid input character sequence\n"); LOG_PRINT(LOG_WARNING, "iconv: invalid input character sequence"); } else if (errno == E2BIG) { sprintf(sql_command, "iconv: output buffer too small\n"); LOG_PRINT(LOG_WARNING, "iconv: output buffer too small"); } else if (errno == EINVAL) { sprintf(sql_command, "iconv: incomplete input character\n"); LOG_PRINT(LOG_WARNING, "iconv: incomplete input character"); } tiwrite(ptr_clrequest->fd, "", TERM_YES); read_status(ptr_clrequest->fd); send_status(ptr_clrequest->fd, 702, TERM_NO); dbi_result_free(rendinfo.dbires); dbi_conn_close(conn); delete_all_lilimem(&sentinel); if (conv_descriptor) { iconv_close(conv_descriptor); } return 0; } /* else: conversion went ok. We free the original string and replace it with the converted copy */ if (sql_command) { free(sql_command); } sql_command = my_sql_command_start; sql_command_len = outlength; result_len = (size_t)(my_sql_command - my_sql_command_start); } else { /* no conversion required */ result_len = strlen(sql_command); } /* send ok status, then the terminated result string */ send_status(ptr_clrequest->fd, 404, TERM_NO); iwrite(ptr_clrequest->fd, sql_command, result_len); tiwrite(ptr_clrequest->fd, "", TERM_YES); ptr_addresult->success++; /* reset buffer string */ sql_command[0] = '\0'; /* read client response */ cs_status = read_status(ptr_clrequest->fd); if (cs_status) { break; } } /* end while */ } else { /* no notes found, send an empty body */ send_status(ptr_clrequest->fd, 402, TERM_NO); tiwrite(ptr_clrequest->fd, "", TERM_YES); } if (ptr_addresult->success) { /* create a "footer" if necessary */ /* fill in variable elements of structure */ if ((render_res = finish_render_note(&rendinfo)) != 0) { retval = 1; tiwrite(ptr_clrequest->fd, "", TERM_YES); send_status(ptr_clrequest->fd, 801, TERM_NO); read_status(ptr_clrequest->fd); dbi_result_free(rendinfo.dbires); dbi_conn_close(conn); delete_all_lilimem(&sentinel); if (conv_descriptor) { iconv_close(conv_descriptor); } return 0; } send_status(ptr_clrequest->fd, 402, TERM_NO); tiwrite(ptr_clrequest->fd, sql_command, TERM_YES); } dbi_result_free(rendinfo.dbires); dbi_conn_close(conn); delete_all_lilimem(&sentinel); if (conv_descriptor) { iconv_close(conv_descriptor); } return retval; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ addlink(): implements the client command addlink int addlink returns 1 if failed, 0 if successful struct CLIENT_REQUEST* ptr_clrequest ptr to structure with client info char *set_owner the username of the owner of new/updated references if different from *username struct ADDRESULT* addresult this structure will be filled in with the number of (un-)successfully added/updated references int n_remove if 0, links will be added, if 1, links will be removed ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int addlink(struct CLIENT_REQUEST* ptr_clrequest, char* set_owner, struct ADDRESULT* ptr_addresult, int n_remove) { dbi_conn conn; dbi_result dbires; dbi_driver driver; char **inargv; /* tokens of the client request */ int inargc; /* number of tokens of the client request */ int inargcmax; /* maximum number of tokens of the client request */ size_t len; int result; int mode = 0; int retval = 0; int error = 0; /* codes: 0 = no error, 1 = out of memory, 2 = subselect failed */ unsigned long long n_id; unsigned long long n_target_id; size_t buffer_len; /* these are the allocated lengths of the buffers */ size_t sql_command_len; size_t return_msg_len; char *return_msg; char *sql_command; /* these are ptrs to the buffers and temporary ptrs */ char *buffer; char *new_buffer; char *token; char *newtoken; char *quoted_token; char *stripped_token; char *eostring; char note_val[256] = ""; /* note id or citation key value*/ char note_type[7] = ""; /* type: either numerical or key */ char field_buffer[10]; char my_type[20]; char assemble_buffer[2048]; struct SQLTOKEN sqltoken; struct lilimem sentinel; Liliform *ptr_curr; Liliform link_sentinel; ptr_addresult->success = 0; ptr_addresult->failure = 0; ptr_addresult->updated = 0; ptr_addresult->skipped = 0; sentinel.ptr_mem = NULL; sentinel.ptr_next = NULL; sentinel.varname[0] = '\0'; link_sentinel.ptr_next = NULL; link_sentinel.name[0] = '\0'; link_sentinel.value = NULL; /* get buffer to analyze the request */ inargc = 0; inargcmax = 10; inargv = malloc((size_t)inargcmax*sizeof(char*)); if (inargv == NULL || insert_lilimem(&sentinel, (void**)&inargv, NULL)) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } /* get buffer to assemble the SQL queries */ sql_command_len = 4096; sql_command = malloc(sql_command_len); if (sql_command == NULL || insert_lilimem(&sentinel, (void**)&sql_command, NULL)) { delete_all_lilimem(&sentinel); send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } *sql_command = '\0'; /* start with an empty string */ /* get a buffer to hold tokens */ buffer_len = 4096; buffer = malloc(buffer_len); if (buffer == NULL || insert_lilimem(&sentinel, (void**)&buffer, NULL)) { delete_all_lilimem(&sentinel); send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } *buffer = '\0'; /* start with an empty string */ /* yet another buffer */ return_msg_len = 4096; return_msg = malloc(return_msg_len); if (return_msg == NULL || insert_lilimem(&sentinel, (void**)&return_msg, NULL)) { delete_all_lilimem(&sentinel); send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } *return_msg = '\0'; /* start with an empty string */ eostring = ptr_clrequest->argument + strlen(ptr_clrequest->argument); /* connect to the database */ if ((conn = connect_to_db(ptr_clrequest, NULL, 0)) == NULL) { send_status(ptr_clrequest->fd, 204, TERM_NO); LOG_PRINT(LOG_WARNING, get_status_msg(204)); delete_all_lilimem(&sentinel); return 1; } driver = dbi_conn_get_driver(conn); token = ptr_clrequest->argument; newtoken = token; /* printf("%s\n", token); */ /* general strategy: scan the command string for items and add all of them except the first :NID: or :NCK: to a linked list. Then walk through the linked list to add or remove the links */ /* loop as long as we find more tokens */ while (newtoken != NULL) { token = link_tokenize(newtoken, &sqltoken); newtoken = sqltoken.next_token; /* printf("token:%s< buffer_len) { new_buffer = (char*)realloc(buffer, (size_t)sqltoken.length); if (new_buffer == NULL) { /* out of memory */ error = 1; break; } else { buffer = new_buffer; buffer_len = sqltoken.length; } } strncpy(buffer, token, sqltoken.length); buffer[sqltoken.length] ='\0'; if (sqltoken.type == 4) { /*----------------------------------------------------------------*/ /* target fields */ if (strncmp(token, ":ID:", 4) == 0 || /* ID of reference */ strncmp(token, ":KW:", 4) == 0 || /* keyword */ strncmp(token, ":AU:", 4) == 0 || /* author */ strncmp(token, ":JF:", 4) == 0 || /* journal full */ strncmp(token, ":JO:", 4) == 0 || /* journal abbrev */ strncmp(token, ":J1:", 4) == 0 || /* journal custabbrev1 */ strncmp(token, ":J2:", 4) == 0 || /* journal custabbrev2 */ strncmp(token, ":CK:", 4) == 0) { /* citation key of reference */ strcpy(field_buffer, buffer); field_buffer[4] = '\0'; /* terminate string */ token = link_tokenize(newtoken, &sqltoken); newtoken = sqltoken.next_token; if (token != NULL) { strncpy(buffer, token, sqltoken.length); buffer[sqltoken.length] ='\0'; /* terminate string */ len = 0; token = nstrtok(buffer, &len, " "); if (token != NULL) { /* printf("key:%s<skipped++; } } /* if (sqltoken.type != 4) / else */ } /* if (token != NULL) */ } /* while (newtoken != NULL) */ if (error || !*note_type || !*note_val) { if (error == 1) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); } else { send_status(ptr_clrequest->fd, 417, TERM_NO); LOG_PRINT(LOG_INFO, get_status_msg(417)); } retval = 1; goto Finish; } if (!strcmp(note_type, ":NCK:")) { if ((quoted_token = strdup(note_val)) == NULL || dbi_conn_quote_string(conn, "ed_token) == 0) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_WARNING, get_status_msg(801)); retval = 1; error = 1; goto Finish; } sprintf(sql_command, "SELECT note_id FROM t_note WHERE note_key=%s", quoted_token); free(quoted_token); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { send_status(ptr_clrequest->fd, 417, TERM_NO); LOG_PRINT(LOG_WARNING, get_status_msg(417)); retval = 1; error = 1; goto Finish; } if (dbi_result_next_row(dbires)) { n_id = my_dbi_result_get_idval_idx(dbires, 1); } else { dbi_result_free(dbires); send_status(ptr_clrequest->fd, 417, TERM_NO); LOG_PRINT(LOG_INFO, get_status_msg(417)); retval = 1; error = 1; goto Finish; } dbi_result_free(dbires); } else { n_id = (unsigned long long)atoll(note_val); } /* loop over all targets */ ptr_curr = &link_sentinel; while ((ptr_curr = get_next_liliform(ptr_curr)) != NULL) { if (!strcmp(ptr_curr->name, ":ID:")) { sprintf(my_type, "REFID"); } else if (!strcmp(ptr_curr->name, ":CK:")) { sprintf(my_type, "REFERENCE"); } else if (!strcmp(ptr_curr->name, ":KW:")) { sprintf(my_type, "KEYWORD"); } else if (!strcmp(ptr_curr->name, ":AU:")) { sprintf(my_type, "AUTHOR"); } else if (!strcmp(ptr_curr->name, ":JF:")) { sprintf(my_type, "JOURNALFULL"); } else if (!strcmp(ptr_curr->name, ":JO:")) { sprintf(my_type, "JOURNALABBREV"); } else if (!strcmp(ptr_curr->name, ":J1:")) { sprintf(my_type, "JOURNALCUSTABBREV1"); } else if (!strcmp(ptr_curr->name, ":J2:")) { sprintf(my_type, "JOURNALCUSTABBREV2"); } /* add links */ if (!n_remove) { /* function will quote ptr_curr->value */ result = insert_link(my_type, ptr_curr->value, conn, n_id); /* printf("my_type: %s<< ptr_curr->value: %s<<\n", my_type, ptr_curr->value); */ if (!result) { /* ok */ sprintf(assemble_buffer, "421:%s -> %s:%s\n", note_val, my_type, ptr_curr->value); ptr_addresult->success++; } else if (result == 7) { /* link already exists */ sprintf(assemble_buffer, "418:%s -> %s:%s\n", note_val, my_type, ptr_curr->value); ptr_addresult->skipped++; } else { /* other errors */ sprintf(assemble_buffer, "414:%s -> %s:%s\n", note_val, my_type, ptr_curr->value); ptr_addresult->failure++; } /* free(ptr_curr->value); */ if ((new_buffer = mstrcat(return_msg, assemble_buffer, &return_msg_len, 0)) == NULL) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); error = 1; retval = 1; goto Finish; } else { return_msg = new_buffer; } } else { /* if n_remove */ /* remove links */ if (!strcmp(ptr_curr->name, ":ID:")) { /* we already have the xref ID */ n_target_id = (unsigned long long)atoll(ptr_curr->value); } else { if ((quoted_token = strdup(ptr_curr->value)) == NULL || dbi_conn_quote_string(conn, "ed_token) == 0) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); error = 1; ptr_addresult->failure++; retval = 1; goto Finish; } if (!strcmp(ptr_curr->name, ":CK:")) { sprintf(sql_command, "SELECT refdb_id FROM t_refdb WHERE refdb_citekey=%s", quoted_token); mode = 0; } else if (!strcmp(ptr_curr->name, ":KW:")) { sprintf(sql_command, "SELECT keyword_id FROM t_keyword WHERE keyword_name=%s", quoted_token); mode = 2; } else if (!strcmp(ptr_curr->name, ":AU:")) { sprintf(sql_command, "SELECT author_id FROM t_author WHERE author_name=%s", quoted_token); mode = 1; } else if (!strcmp(ptr_curr->name, ":JF:")) { sprintf(sql_command, "SELECT periodical_id FROM t_periodical WHERE periodical_name=%s", quoted_token); mode = 3; } else if (!strcmp(ptr_curr->name, ":JO:")) { sprintf(sql_command, "SELECT periodical_id FROM t_periodical WHERE periodical_abbrev=%s", quoted_token); mode = 3; } else if (!strcmp(ptr_curr->name, ":J1:")) { sprintf(sql_command, "SELECT periodical_id FROM t_periodical WHERE periodical_custabbrev1=%s", quoted_token); mode = 3; } else if (!strcmp(ptr_curr->name, ":J2:")) { sprintf(sql_command, "SELECT periodical_id FROM t_periodical WHERE periodical_custabbrev2=%s", quoted_token); mode = 3; } free(quoted_token); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { send_status(ptr_clrequest->fd, 233, TERM_NO); LOG_PRINT(LOG_INFO, get_status_msg(233)); error = 2; ptr_addresult->failure++; retval = 1; goto Finish; } if (dbi_result_next_row(dbires)) { n_target_id = my_dbi_result_get_idval_idx(dbires, 1); } else { /* target missing */ ptr_addresult->failure++; dbi_result_free(dbires); /* todo: check for buffer overflow */ sprintf(assemble_buffer, "415:%s -> %s:%s\n", note_val, my_type, ptr_curr->value); if ((new_buffer = mstrcat(return_msg, assemble_buffer, &return_msg_len, 0)) == NULL) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); error = 1; retval = 1; goto Finish; } else { return_msg = new_buffer; } dbi_result_free(dbires); continue; } dbi_result_free(dbires); } /* end if :ID: */ result = remove_xnote_entries(n_id, n_target_id, conn, mode); /* todo: fix output */ if (!result) { /* ok */ sprintf(assemble_buffer, "419:%s -> %s:%s\n", note_val, my_type, ptr_curr->value); ptr_addresult->success++; } else if (result == 4) { /* link not found */ sprintf(assemble_buffer, "417:%s -> %s:%s ", note_val, my_type, ptr_curr->value); ptr_addresult->skipped++; } else { /* other errors */ sprintf(assemble_buffer, "414:%s -> %s:%s ", note_val, my_type, ptr_curr->value); ptr_addresult->failure++; } if ((new_buffer = mstrcat(return_msg, assemble_buffer, &return_msg_len, 0)) == NULL) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); error = 1; retval = 1; goto Finish; } else { return_msg = new_buffer; } } /* end if add */ } /* end while */ Finish: if (ptr_addresult->success) { /* database was changed, update meta info */ update_meta(conn, ptr_clrequest); } /* send back result message */ if (!error) { send_status(ptr_clrequest->fd, 0, TERM_NO); } tiwrite(ptr_clrequest->fd, return_msg, TERM_YES); dbi_conn_close(conn); delete_all_lilimem(&sentinel); delete_all_liliform(&link_sentinel); return retval; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ create_personal_list(): creates an almost empty note for the purposes of a personal reference list unsigned long long create_personal_list returns 0 if failed, ID of new list if successful dbi_conn conn connection structure char *listname name of the personal list, escaped and quoted unsigned long long n_user_id ID of the current user const char *username name of the current user ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ unsigned long long create_personal_list(dbi_conn conn, char *listname, unsigned long long n_user_id, const char *username) { unsigned long long n_list_id; char sql_command[256]; char date_buffer[12]; const char *citekey; time_t the_time; dbi_result dbires; citekey = get_unique_citekey(conn, listname, 0, 1 /* note */, 0 /* regular tables */); if (!citekey) { return 0; } time(&the_time); strftime(date_buffer, 12, "%Y-%m-%d", gmtime(&the_time)); sprintf(sql_command, "INSERT INTO t_note (note_key, note_title, note_user_id, note_date, note_share) VALUES ('%s', '%s', "ULLSPEC", '%s', 0)", citekey, citekey, (unsigned long long)n_user_id, date_buffer); free((char*)citekey); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { return 0; } dbi_result_free(dbires); /* retrieve ID of new note */ if (!strcmp(my_dbi_conn_get_cap(conn, "named_seq"), "f")) { n_list_id = dbi_conn_sequence_last(conn, NULL); } else { n_list_id = dbi_conn_sequence_last(conn, "t_note_note_id_seq"); } return n_list_id; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ remove_personal_list(): removes a personal reference list int remove_personal_list returns > 0 if failed, 0 if successful dbi_conn conn connection structure char *quoted_listname name of the personal list, escaped and quoted struct CLIENT_REQUEST* ptr_clrequest ptr to structure with client info struct ADDRESULT* ptr_addresult structure to hold number of successful and failed deleterefs ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int remove_personal_list(dbi_conn conn, char *quoted_listname, struct CLIENT_REQUEST* ptr_clrequest, struct ADDRESULT* ptr_addresult) { unsigned long long n_list_id; char sql_command[256]; dbi_result dbires; sprintf(sql_command, "SELECT note_id FROM t_note WHERE note_key=%s", quoted_listname); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { return 1; } if (!dbi_result_next_row(dbires)) { return 1; } n_list_id = my_dbi_result_get_idval(dbires, "note_id"); delete_note_by_id(n_list_id, conn, ptr_clrequest, ptr_addresult); dbi_result_free(dbires); return 0; } refdb-1.0.2/src/writenote.c000644 001750 001750 00000006564 12255427652 016442 0ustar00markusmarkus000000 000000 /* writenote.c: functions to write notes */ /* markus@mhoenicka.de 2003-10-12 */ /* 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ #include #include #include #include #include #include "backend.h" #include "backendn-scrn.h" #include "backendn-notex.h" #include "backendn-html.h" #include "writenote.h" /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ render_note(): formats the result of a note query int render_note returns 0 if successful, >0 if failed struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int render_note(struct renderinfo* ptr_rendinfo) { int retval; if (ptr_rendinfo->ref_format == XNOTE) { retval = render_note_xnote(ptr_rendinfo); } else if (ptr_rendinfo->ref_format == REFHTML || ptr_rendinfo->ref_format == REFXHTML) { retval = render_note_html(ptr_rendinfo); } else { retval = render_note_scrn(ptr_rendinfo); } return retval; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ prepare_render_note(): writes a header for the output of a note query int prepare_render returns 0 if successful, >0 if failed struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int prepare_render_note(struct renderinfo* ptr_rendinfo) { int retval; if (ptr_rendinfo->ref_format == XNOTE) { retval = prepare_render_note_xnote(ptr_rendinfo); } else if (ptr_rendinfo->ref_format == REFHTML || ptr_rendinfo->ref_format == REFXHTML) { retval = prepare_render_note_html(ptr_rendinfo); } else { retval = prepare_render_note_scrn(ptr_rendinfo); } return retval; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ finish_render_note(): writes a footer for the output of a note query int finish_render_note returns 0 if successful, >0 if failed struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int finish_render_note(struct renderinfo* ptr_rendinfo) { int retval; if (ptr_rendinfo->ref_format == XNOTE) { retval = finish_render_note_xnote(ptr_rendinfo); } else if (ptr_rendinfo->ref_format == REFHTML || ptr_rendinfo->ref_format == REFXHTML) { retval = finish_render_note_html(ptr_rendinfo); } else { retval = finish_render_note_scrn(ptr_rendinfo); } return retval; } refdb-1.0.2/src/backendn-scrn.c000644 001750 001750 00000032337 12255427651 017126 0ustar00markusmarkus000000 000000 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ backendn-scrn.c defines the notes screen output backend of refdbd markus@mhoenicka.de 2003-10-14 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ #include #include #include /* for definitions of log message priorities */ #include #include /* for getpid() */ #include /* for getpid() */ #include #include "refdb.h" #include "backend.h" #include "backendn-scrn.h" #include "strfncs.h" #include "linklist.h" #include "refdbd.h" #include "dbfncs.h" #include "connect.h" /* some globals */ extern int n_log_level; /* numeric version of log_level */ /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ prepare_render_note_scrn(): writes a header for the screen output of a notes query int prepare_render_note_scrn returns 0 if successful, >0 if failed struct renderinfo* ptr_rendinfo ptr to a structure with the info how the note should be rendered ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int prepare_render_note_scrn(struct renderinfo* ptr_rendinfo) { /* we just make sure that we start with a clean string */ (*(ptr_rendinfo->ptr_ref))[0] = '\0'; return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ finish_render_note_scrn(): writes a footer for the screen output of a notes query int finish_render_note_scrn returns 0 if successful, >0 if failed struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int finish_render_note_scrn(struct renderinfo* ptr_rendinfo) { /* nothing to do here */ return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ render_note_scrn() renders a note for screen display int render_note_scrn returns 0 if successful, >0 if failed struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int render_note_scrn(struct renderinfo* ptr_rendinfo) { int i; char id[32] = ""; char date_buffer[256]; char linktype[4][11] = {"reference", "keyword", "author", "periodical"}; const char* citem; char* item; char* new_ref; dbi_conn conn; dbi_result dbires; conn = dbi_result_get_conn(ptr_rendinfo->dbires); /*----------------------------------------------------------------*/ /* ID */ get_refdb_note_id(ptr_rendinfo->dbires, id); if (*id) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "Note ID:", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } /* ID */ if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), id, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } else { LOG_PRINT(LOG_WARNING, get_status_msg(234)); return 234; /* this is bad and will hopefully never happen */ } /*----------------------------------------------------------------*/ /* date */ if (get_refdb_note_date(ptr_rendinfo->dbires, date_buffer, 0) != NULL) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), " (", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } /* date */ if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), date_buffer, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), ")", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "\n", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } /*----------------------------------------------------------------*/ /* note key */ citem = get_refdb_note_key(ptr_rendinfo->dbires); if (citem && *citem) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "Key: ", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), (char*)citem, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "\n", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } /*----------------------------------------------------------------*/ /* note title */ item = get_refdb_note_title_copy(ptr_rendinfo->dbires); if (item != NULL) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), (char*)item, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { /* title */ free(item); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } free(item); if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "\n", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } /*----------------------------------------------------------------*/ /* the note proper */ item = get_refdb_note_content_copy(ptr_rendinfo->dbires); if (item != NULL) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), (char*)item, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { /* note proper */ free(item); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } free(item); if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "\n", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } /*----------------------------------------------------------------*/ /* links */ if (strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "NL") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "ALL") != NULL) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "\nNote is attached to:", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { /* note proper */ LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } /* loop over reference, keyword, author, periodical links */ for (i = 0; i < 4; i++) { int mode = i; dbires = request_links(conn, my_dbi_result_get_idval(ptr_rendinfo->dbires, "note_id"), i); if (dbires == NULL) { return 234; } /* fetch all links of this type and note */ while ((citem = get_link(dbires, &mode)) != NULL) { if (i == 3) { /* periodical */ if (!mode) { /* full name */ if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "\nPeriodical full name: ", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { /* note proper */ free(item); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), (char*)citem, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { /* note proper */ free(item); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } else if (mode == 1) { /* abbrev */ if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "\nPeriodical abbreviation: ", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { /* note proper */ free(item); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), (char*)citem, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { /* note proper */ free(item); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } else if (mode == 2) { /* custabbrev 1 */ if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "\nPeriodical custom abbreviation 1: ", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { /* note proper */ free(item); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), (char*)citem, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { /* note proper */ free(item); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } else if (mode == 3) { /* custabbrev 2 */ if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "\nPeriodical custom abbreviation 2: ", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { /* note proper */ free(item); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), (char*)citem, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { /* note proper */ free(item); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } } else { /* reuse date_buffer */ sprintf(date_buffer, "\n%s: ", linktype[i]); if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), date_buffer, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { /* note proper */ free(item); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), (char*)citem, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { /* note proper */ free(item); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } } clean_request(dbires); } /* end for */ } /*----------------------------------------------------------------*/ /* ulink */ if (strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "UR") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "ALL") != NULL) { int i; char link_tag[12]; /* loop over all link types */ for (i=0; i<5;i++) { if (!i) { strcpy(link_tag, "\nURL: "); } else if (i == 1) { strcpy(link_tag, "\nPDF: "); } else if (i == 2) { strcpy(link_tag, "\nFULLTEXT: "); } else if (i == 3) { strcpy(link_tag, "\nRELATED: "); } else if (i == 4) { strcpy(link_tag, "\nIMAGE: "); } dbires = request_ulinks(conn, my_dbi_result_get_idval(ptr_rendinfo->dbires, "note_id"), 1 /* note entry */, i /* link type */, 0 /* is_temp */, ptr_rendinfo->username); if (dbires == NULL) { return 234; } while ((citem = get_ulink(dbires)) != NULL) { char* full_link; if (i>0 && i<5) { full_link = add_root_to_link(citem, ptr_rendinfo->pdfroot); } else { full_link = strdup(citem); } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), link_tag, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); clean_request(dbires); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), full_link, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); clean_request(dbires); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } free(full_link); } /* end while */ clean_request(dbires); } /* end for */ } /* finish with an empty line */ if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "\n\n", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } /* printf("%s\n", ref); */ return 0; } refdb-1.0.2/src/backendn-notex.c000644 001750 001750 00000030464 12255427651 017315 0ustar00markusmarkus000000 000000 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ backendn-notex.c defines the notes xnote output backend of refdbd markus@mhoenicka.de 2003-10-15 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ #include #include /* for definitions of log message priorities */ #include #include #include #include "refdb.h" #include "linklist.h" #include "refdbd.h" #include "backend.h" #include "backendn-notex.h" #include "strfncs.h" #include "dbfncs.h" #include "xmlhelper.h" #include "connect.h" /* some globals */ extern int n_log_level; /* numeric version of log_level */ /* forward declaration of local functions */ static int indent_notbelow_xnote(const char* name); static int is_entry_xnote(const char* name); /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ prepare_render_note_xnote(): writes a header for the xnote output of a notes query int prepare_render_note_xnote returns 0 if successful or >0 if failed struct renderinfo* ptr_rendinfo ptr to a structure with the info how the note should be rendered ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int prepare_render_note_xnote(struct renderinfo* ptr_rendinfo) { char* new_ref; char* header; char ns[PREFS_BUF_LEN+128]; if ((header = assemble_header(ptr_rendinfo)) == NULL) { return 801; } new_ref = mstrcpy(*(ptr_rendinfo->ptr_ref), header, ptr_rendinfo->ptr_ref_len); free(header); if (new_ref == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if (*(ptr_rendinfo->ptr_clrequest->namespace)) { sprintf(ns, "<%s:xnoteset xmlns:%s=\"http://refdb.sourceforge.net/ns/xnote\">\n", ptr_rendinfo->ptr_clrequest->namespace, ptr_rendinfo->ptr_clrequest->namespace); } else { strcpy(ns, "\n"); } new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), ns, ptr_rendinfo->ptr_ref_len, 0); if (new_ref == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ finish_render_note_xnote(): writes a footer for the xnote output of a notes query int finish_render_note_xnote returns 0 if successful, >0 if failed struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int finish_render_note_xnote(struct renderinfo* ptr_rendinfo) { char* new_ref; char ns[PREFS_BUF_LEN+32]; if (*(ptr_rendinfo->ptr_clrequest->namespace)) { sprintf(ns, "\n\n", ptr_rendinfo->ptr_clrequest->namespace); } else { strcpy(ns, "\n\n"); } new_ref = mstrcpy(*(ptr_rendinfo->ptr_ref), ns, ptr_rendinfo->ptr_ref_len); if (new_ref == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ render_note_xnote() renders a note for xnote output int render_note_xnote returns 0 if successful, >0 if failed struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int render_note_xnote(struct renderinfo* ptr_rendinfo) { int i; char id[32] = ""; char linktype[4][11] = {"reference", "keyword", "author", "periodical"}; char date_buffer[256]; const char* citem; const char* owner; short int share; char* item; char* new_ref; dbi_conn conn; dbi_result dbires; struct xmlindent xindent; /*initialize xindent */ initialize_xmlindent(&xindent, 2, indent_notbelow_xnote, is_entry_xnote); conn = dbi_result_get_conn(ptr_rendinfo->dbires); /*----------------------------------------------------------------*/ /* ID */ get_refdb_note_id(ptr_rendinfo->dbires, id); citem = get_refdb_note_key(ptr_rendinfo->dbires); if (citem && !*citem) { citem = NULL; } get_refdb_note_date(ptr_rendinfo->dbires, date_buffer, 1); owner = get_refdb_note_user_name(ptr_rendinfo->dbires); if (!owner && !*owner) { owner = ptr_rendinfo->username; } share = get_refdb_note_share(ptr_rendinfo->dbires); if (*id) { if (share != -1) { if (print_elstart_x(ptr_rendinfo->ptr_ref, ptr_rendinfo->ptr_ref_len, "xnote", "id", id, "citekey", citem, "user", owner, "date", date_buffer, "share", (share == 1) ? "public":"private", 0, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { return 801; } } else { if (print_elstart_x(ptr_rendinfo->ptr_ref, ptr_rendinfo->ptr_ref_len, "xnote", "id", id, "citekey", citem, "user", owner, "date", date_buffer, NULL, NULL, 0, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { return 801; } } } else { LOG_PRINT(LOG_WARNING, "note has no ID"); return 234; /* this is bad and will hopefully never happen */ } /*----------------------------------------------------------------*/ /* note title */ item = get_refdb_note_title_copy(ptr_rendinfo->dbires); if (item != NULL) { if (print_element_x(item, ptr_rendinfo->ptr_ref, ptr_rendinfo->ptr_ref_len, "title", NULL, NULL, NULL, NULL, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free((char*)item); return 801; } free((char*)item); if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "\n", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } /*----------------------------------------------------------------*/ /* the content of the note */ item = get_refdb_note_content_copy(ptr_rendinfo->dbires); if (item != NULL) { if (print_elstart_x(ptr_rendinfo->ptr_ref, ptr_rendinfo->ptr_ref_len, "content", "type", get_refdb_note_content_type(ptr_rendinfo->dbires), "xml:lang", get_refdb_note_content_xmllang(ptr_rendinfo->dbires), NULL, NULL, NULL, NULL, NULL, NULL, 0, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { free(item); return 801; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), (char*)item, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { free(item); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } free(item); if (print_elend_x(ptr_rendinfo->ptr_ref, ptr_rendinfo->ptr_ref_len, "content", &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { return 801; } } /*----------------------------------------------------------------*/ /* keywords */ dbires = request_keywords(conn, my_dbi_result_get_idval(ptr_rendinfo->dbires, "note_id"), 1, 0); if (dbires == NULL) { return 801; } /* fetch all keywords of this article */ while ((citem = get_keyword(dbires)) != NULL) { if (print_element_x(citem, ptr_rendinfo->ptr_ref, ptr_rendinfo->ptr_ref_len, "keyword", NULL, NULL, NULL, NULL, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { clean_request(dbires); return 801; } } clean_request(dbires); /*----------------------------------------------------------------*/ /* links */ /* loop over reference, keyword, author, periodical links */ for (i = 0; i < 4; i++) { int mode = i; dbires = request_links(conn, my_dbi_result_get_idval(ptr_rendinfo->dbires, "note_id"), i); if (dbires == NULL) { return 234; } /* fetch all links of this type and note */ while ((citem = get_link(dbires, &mode)) != NULL) { if (i == 3) { /* periodical */ if (!mode) { /* full name */ if (print_elstart_x(ptr_rendinfo->ptr_ref, ptr_rendinfo->ptr_ref_len, "link", "type", "journalfull", "target", citem, NULL, NULL, NULL, NULL, NULL, NULL, 1, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { return 801; } } else if (mode == 1) { /* abbrev */ if (print_elstart_x(ptr_rendinfo->ptr_ref, ptr_rendinfo->ptr_ref_len, "link", "type", "journalabbrev", "target", citem, NULL, NULL, NULL, NULL, NULL, NULL, 1, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { return 801; } } else if (mode == 2) { /* custabbrev 1 */ if (print_elstart_x(ptr_rendinfo->ptr_ref, ptr_rendinfo->ptr_ref_len, "link", "type", "journalcustabbrev1", "target", citem, NULL, NULL, NULL, NULL, NULL, NULL, 1, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { return 801; } } else if (mode == 3) { /* custabbrev 2 */ if (print_elstart_x(ptr_rendinfo->ptr_ref, ptr_rendinfo->ptr_ref_len, "link", "type", "journalcustabbrev2", "target", citem, NULL, NULL, NULL, NULL, NULL, NULL, 1, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { return 801; } } } else { if (print_elstart_x(ptr_rendinfo->ptr_ref, ptr_rendinfo->ptr_ref_len, "link", "type", linktype[i], "target", citem, NULL, NULL, NULL, NULL, NULL, NULL, 1, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { return 801; } } } clean_request(dbires); } /* end for */ /*----------------------------------------------------------------*/ /* ulink */ /* loop over all link types */ for (i=0; i<5;i++) { char ulink_type[10]; dbi_result dbires; dbires = request_ulinks(conn, my_dbi_result_get_idval(ptr_rendinfo->dbires, "note_id"), 1 /* notes entry */, i /* link type */, 0 /* is_temp */, ptr_rendinfo->username); if (dbires == NULL) { return 234; } while ((citem = get_ulink(dbires)) != NULL) { if (i == 0) { strcpy(ulink_type, "url"); } else if (i == 1) { strcpy(ulink_type, "pdf"); } else if (i == 2) { strcpy(ulink_type, "fulltext"); } else if (i == 3) { strcpy(ulink_type, "related"); } else if (i == 4) { strcpy(ulink_type, "image"); } if (print_element_x(citem, ptr_rendinfo->ptr_ref, ptr_rendinfo->ptr_ref_len, "ulink", "type", ulink_type, NULL, NULL, &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { clean_request(dbires); return 801; } } clean_request(dbires); } /* end for */ if (print_elend_x(ptr_rendinfo->ptr_ref, ptr_rendinfo->ptr_ref_len, "xnote", &xindent, ptr_rendinfo->ptr_clrequest->namespace) == NULL) { return 801; } /* finish with an empty line */ if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "\n\n", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } /* printf("%s\n", ref); */ return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ indent_notbelow_xnote(): checks whether or not to indent below the current element static int indent_notbelow returns 1 if not to indent, 0 if to indent const char* name ptr to element name ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int indent_notbelow_xnote(const char* name) { if (!strcmp(name, "date")) { return 1; } else { return 0; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ is_entry_xnote(): checks whether an element starts a new entry static int is_entry_risx returns 1 if entry starts, 0 if not const char* name ptr to element name ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int is_entry_xnote(const char* name) { if (!strcmp(name, "refdbnote")) { return 1; } else { return 0; } } refdb-1.0.2/src/backendn-html.c000644 001750 001750 00000036616 12255427651 017131 0ustar00markusmarkus000000 000000 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ backendn-scrn.c defines the notes screen output backend of refdbd markus@mhoenicka.de 2003-10-14 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ #include #include #include /* for definitions of log message priorities */ #include #include #include "refdb.h" #include "backend.h" #include "backendn-html.h" #include "strfncs.h" #include "linklist.h" #include "refdbd.h" #include "dbfncs.h" #include "connect.h" /* some globals */ extern int n_log_level; /* numeric version of log_level */ /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ prepare_render_note_html(): writes a header for the html output of a notes query int prepare_render_note_html returns 0 if successful, >0 if failed struct renderinfo* ptr_rendinfo ptr to a structure with the info how the note should be rendered ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int prepare_render_note_html(struct renderinfo* ptr_rendinfo) { char* new_ref; char* header; if ((header = assemble_header(ptr_rendinfo)) == NULL) { return 801; } if ((new_ref = mstrcpy(*(ptr_rendinfo->ptr_ref), header, ptr_rendinfo->ptr_ref_len)) == NULL) { free(header); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; free(header); } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ finish_render_note_html(): writes a footer for the html output of a notes query int finish_render_note_html returns ptr to the buffer if successful, NULL if failed struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int finish_render_note_html(struct renderinfo* ptr_rendinfo) { char* new_ref; if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "\n\n", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ render_note_html() renders a note for html display int render_note_html returns ptr to the buffer if successful, NULL if failed struct renderinfo* ptr_rendinfo ptr to a structure with the info how the reference should be rendered ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int render_note_html(struct renderinfo* ptr_rendinfo) { char id[32] = ""; char date_buffer[256]; char hr_buffer[10]; char linktype[4][11] = {"reference", "keyword", "author", "periodical"}; const char* citem; char* item; char* new_ref; char* entitize_buf; dbi_conn conn; if (ptr_rendinfo->ref_format == REFXHTML) { strcpy(hr_buffer, "
\n"); } else { strcpy(hr_buffer, "
\n"); } conn = dbi_result_get_conn(ptr_rendinfo->dbires); /*----------------------------------------------------------------*/ /* ID */ get_refdb_note_id(ptr_rendinfo->dbires, id); if (*id) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "
\n", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "

Note ID:", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } /* ID */ if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), id, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "

\n", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } else { LOG_PRINT(LOG_WARNING, get_status_msg(234)); return 234; /* this is bad and will hopefully never happen */ } /*----------------------------------------------------------------*/ /* date */ if (get_refdb_note_date(ptr_rendinfo->dbires, date_buffer, 0) != NULL) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "

Date: ", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } /* date */ if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), date_buffer, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "

\n", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } /*----------------------------------------------------------------*/ /* note key */ citem = get_refdb_note_key(ptr_rendinfo->dbires); if (citem && *citem) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "

Key: ", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), (char*)citem, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "

\n", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } /*----------------------------------------------------------------*/ /* note title */ item = get_refdb_note_title_copy(ptr_rendinfo->dbires); if (item != NULL) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "

", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if (sgml_entitize(&item, ptr_rendinfo->ref_format) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(item); return 801; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), (char*)item, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { /* title */ free(item); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } free(item); if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "

\n", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } /*----------------------------------------------------------------*/ /* the note proper */ item = get_refdb_note_content_copy(ptr_rendinfo->dbires); if (item != NULL) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "

", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if (sgml_entitize(&item, ptr_rendinfo->ref_format) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(item); return 801; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), (char*)item, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { /* note proper */ free(item); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } free(item); if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "

\n", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } /*----------------------------------------------------------------*/ /* links */ if (strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "NL") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "ALL") != NULL) { int i; dbi_result dbires; if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "

Note is attached to:

\n", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { /* note proper */ LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } /* loop over reference, keyword, author, periodical links */ for (i = 0; i < 4; i++) { int mode = i; dbires = request_links(conn, my_dbi_result_get_idval(ptr_rendinfo->dbires, "note_id"), i); if (dbires == NULL) { return 234; } /* fetch all links of this type and note */ while ((citem = get_link(dbires, &mode)) != NULL) { if (i == 3) { /* periodical */ if (!mode) { /* full name */ if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "

Periodical full name: ", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { /* note proper */ free(item); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } else if (mode == 1) { /* abbrev */ if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "

Periodical abbreviation: ", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { /* note proper */ free(item); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } else if (mode == 2) { /* custabbrev 1 */ if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "

Periodical custom abbreviation 1: ", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { /* note proper */ free(item); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } else if (mode == 3) { /* custabbrev 2 */ if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "

Periodical custom abbreviation 2: ", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { /* note proper */ free(item); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } } else { /* reuse date_buffer */ sprintf(date_buffer, "

%s: ", linktype[i]); if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), date_buffer, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { /* note proper */ free(item); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } if ((entitize_buf = strdup(citem)) != NULL && sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), entitize_buf, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { /* note proper */ free(item); free(entitize_buf); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } free(entitize_buf); if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "

\n", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { /* note proper */ free(item); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } clean_request(dbires); } /* end for */ } /*----------------------------------------------------------------*/ /* ulink */ if (strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "UR") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "ALL") != NULL) { int i; char *entitize_string; char keytype[5][10] = {"URL", "PDF", "FULLTEXT", "RELATED", "IMAGE"}; char buffer[64]; dbi_result dbires; /* loop over all link types */ for (i=0; i<5;i++) { dbires = request_ulinks(conn, my_dbi_result_get_idval(ptr_rendinfo->dbires, "note_id"), 1 /* notes entry */, i /* link type */, 0 /* is_temp */, ptr_rendinfo->username); if (dbires == NULL) { return 234; } while ((citem = get_ulink(dbires)) != NULL) { sprintf(buffer, "

%s: ptr_ref), buffer, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); clean_request(dbires); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if (i>0 && i<5) { entitize_string = add_root_to_link(citem, ptr_rendinfo->pdfroot); } else { entitize_string = strdup(citem); } if (entitize_string == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); clean_request(dbires); return 801; } if (sgml_entitize(&entitize_string, ptr_rendinfo->ref_format) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); clean_request(dbires); free(entitize_string); return 801; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), entitize_string, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); clean_request(dbires); free(entitize_string); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "\">", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); clean_request(dbires); free(entitize_string); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), entitize_string, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); clean_request(dbires); free(entitize_string); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } free(entitize_string); if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "

\n", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } /* end while */ clean_request(dbires); } /* end for */ } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "
\n", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } /* printf("%s\n", ref); */ return 0; } refdb-1.0.2/src/xmlhelper.c000644 001750 001750 00000036111 12255427652 016411 0ustar00markusmarkus000000 000000 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ xmlhelper.c defines some functions to output xml elements markus@mhoenicka.de 2003-10-15 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ #include #include #include #include #include /* need this to make backend.h happy */ #include "backend.h" #include "linklist.h" #include "refdb.h" #include "refdbd.h" #include "xmlhelper.h" #include "strfncs.h" #include "connect.h" #include "outformats.h" extern int n_log_level; /* numeric version of log_level */ /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ print_element_x() prints out a risx element char* print_element_x returns ptr to the buffer if successful, NULL if failed const char* elvalue ptr to string with value of element char** ptr_buffer ptr to ptr to buffer that will receive the output size_t* ptr_buflen ptr to var holding size of *ptr_buffer const char* elname name of element to print const char* attname name of attribute, if any const char* attvalue value of attribute, if any const char* attname1 name of another attribute, if any const char* attvalue1 value of another attribute, if any struct xmlindent* ptr_indent ptr to struct with indent info const char* namespace namespace prefix, or NULL if no namespace prefix ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* print_element_x(const char* elvalue, char** ptr_buffer, size_t* ptr_buflen, const char* elname, const char* attname, const char* attvalue, const char* attname1, const char* attvalue1, struct xmlindent* ptr_indent, const char* namespace) { char* new_ref; char* entitize_buf; int is_empty = 1; if (elvalue && *elvalue) { is_empty = 0; if ((entitize_buf = mstrdup((char*)elvalue)) == NULL) { return NULL; } if (sgml_entitize(&entitize_buf, RISX) == NULL) { free(entitize_buf); return NULL; } } if ((new_ref = print_elstart_x(ptr_buffer, ptr_buflen, elname, attname, attvalue, attname1, attvalue1, NULL, NULL, NULL, NULL, NULL, NULL, is_empty, ptr_indent, namespace)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } else { *ptr_buffer = new_ref; } if (elvalue && *elvalue) { if ((new_ref = mstrcat(*ptr_buffer, entitize_buf, ptr_buflen, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(entitize_buf); return NULL; } else { *ptr_buffer = new_ref; } free(entitize_buf); if ((new_ref = print_elend_x(ptr_buffer, ptr_buflen, elname, ptr_indent, namespace)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } else { *ptr_buffer = new_ref; } } return *ptr_buffer; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ print_elstart_x() prints out a risx element start tag char* print_elstart_x returns ptr to the buffer if successful, NULL if failed char** ptr_buffer ptr to ptr to buffer that will receive the output size_t* ptr_buflen ptr to var holding size of *ptr_buffer const char* elname name of element to print const char* attname name of attribute, if any const char* attvalue value of attribute, if any const char* attname1 name of 2nd attribute, if any const char* attvalue1 value of 2nd attribute, if any const char* attname2 name of 3rd attribute, if any const char* attvalue2 value of 3rd attribute, if any const char* attname3 name of 4th attribute, if any const char* attvalue3 value of 4th attribute, if any const char* attname4 name of 4th attribute, if any const char* attvalue4 value of 4th attribute, if any int is_empty if non-zero, element is assumed to be empty struct xmlindent* ptr_indent ptr to struct with indent info const char* namespace namespace prefix, or NULL if no namespace prefix ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* print_elstart_x(char** ptr_buffer, size_t* ptr_buflen, const char* elname, const char* attname, const char* attvalue, const char* attname1, const char* attvalue1, const char* attname2, const char* attvalue2, const char* attname3, const char* attvalue3, const char* attname4, const char* attvalue4, int is_empty, struct xmlindent* ptr_indent, const char* namespace) { /* ToDo: The attname/attname1 thing is pretty much like cheating. This could be done in a cleaner way using an attribute stack or something */ char buffer[PREFS_BUF_LEN+2]; char* new_ref; if (elname != NULL && *elname) { int indent_real = (ptr_indent->indent_current > INDENT_MAX) ? INDENT_MAX : ptr_indent->indent_current; ptr_indent->maybe_in_leaf = 1; /* safety check */ if (ptr_indent->indent_current < 0) { LOG_PRINT(LOG_CRIT, "negative indentation at line: " STRINGIFY(__LINE__) " in " __FILE__); return NULL; } if (ptr_indent->indent_toodeep || ptr_indent->inline_mode) { /* then just a '<' */ if ((new_ref = mstrcat(*ptr_buffer, "<", ptr_buflen, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } else { *ptr_buffer = new_ref; } } else { /* skip a few lines before each entry */ if (ptr_indent->isentry(elname)) { if ((new_ref = mstrcat(*ptr_buffer, "\n\n", ptr_buflen, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } else { *ptr_buffer = new_ref; } } /* linefeed just before indent */ if ((new_ref = mstrcat(*ptr_buffer, "\n", ptr_buflen, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } else { *ptr_buffer = new_ref; } /* do indent + '<' */ if ((new_ref = mstrcat(*ptr_buffer, & ptr_indent->indent_string[INDENT_MAX-indent_real], ptr_buflen, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } else { *ptr_buffer = new_ref; } } ptr_indent->indent_current += INDENT_INC; /* prevents too much indentation */ if (ptr_indent->notbelow(elname)) { ptr_indent->indent_toodeep = 1; } /* end of indentation + '<' code */ if (namespace && *namespace) { sprintf(buffer, "%s:", namespace); if ((new_ref = mstrcat(*ptr_buffer, buffer, ptr_buflen, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } else { *ptr_buffer = new_ref; } } if ((new_ref = mstrcat(*ptr_buffer, (char*)elname, ptr_buflen, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } else { *ptr_buffer = new_ref; } if (attname && *attname) { if (!print_attribute_x(ptr_buffer, ptr_buflen, attname, attvalue)) { return NULL; } } /* end if attname */ if (attname1 && *attname1) { if (!print_attribute_x(ptr_buffer, ptr_buflen, attname1, attvalue1)) { return NULL; } } /* end if attname */ if (attname2 && *attname2) { if (!print_attribute_x(ptr_buffer, ptr_buflen, attname2, attvalue2)) { return NULL; } } /* end if attname */ if (attname3 && *attname3) { if (!print_attribute_x(ptr_buffer, ptr_buflen, attname3, attvalue3)) { return NULL; } } /* end if attname */ if (attname4 && *attname4) { if (!print_attribute_x(ptr_buffer, ptr_buflen, attname4, attvalue4)) { return NULL; } } /* end if attname */ if (is_empty) { ptr_indent->maybe_in_leaf = 0; ptr_indent->indent_current -= INDENT_INC; if ((new_ref = mstrcat(*ptr_buffer, "/>", ptr_buflen, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } else { *ptr_buffer = new_ref; } } else { if ((new_ref = mstrcat(*ptr_buffer, ">", ptr_buflen, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } else { *ptr_buffer = new_ref; } } } return *ptr_buffer; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ print_attribute_x() prints out an XML attribute key/value pair char* print_attribute_x returns ptr to the buffer if successful, NULL if failed char** ptr_buffer ptr to ptr to buffer that will receive the output size_t* ptr_buflen ptr to var holding size of *ptr_buffer const char* attname name of attribute, if any const char* attvalue value of attribute, if any ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* print_attribute_x(char** ptr_buffer, size_t* ptr_buflen, const char* attname, const char* attvalue) { char* new_ref; if (!attname || !*attname || !attvalue || !*attvalue) { /* nothing to do */ return *ptr_buffer; } /* need to print a space, the attribute name, a '=', the quoted attribute value */ if ((new_ref = mstrcat(*ptr_buffer, " ", ptr_buflen, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } else { *ptr_buffer = new_ref; } if ((new_ref = mstrcat(*ptr_buffer, (char*)attname, ptr_buflen, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } else { *ptr_buffer = new_ref; } if ((new_ref = mstrcat(*ptr_buffer, "=\"", ptr_buflen, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } else { *ptr_buffer = new_ref; } if ((new_ref = mstrcat(*ptr_buffer, (char*)attvalue, ptr_buflen, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } else { *ptr_buffer = new_ref; } if ((new_ref = mstrcat(*ptr_buffer, "\"", ptr_buflen, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } else { *ptr_buffer = new_ref; } return *ptr_buffer; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ print_elend_x() prints out a risx element end tag static char* print_elend_x returns ptr to the buffer if successful, NULL if failed char** ptr_buffer ptr to ptr to buffer that will receive the output size_t* ptr_buflen ptr to var holding size of *ptr_buffer const char* elname name of element to print struct xmlindent* ptr_indent ptr to structure with indentation info const char* namespace namespace prefix, or NULL if no namespace prefix ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* print_elend_x(char** ptr_buffer, size_t* ptr_buflen, const char* elname, struct xmlindent* ptr_indent, const char* namespace) { char* new_ref; char buffer[PREFS_BUF_LEN+2]; if (elname && *elname) { ptr_indent->indent_current -= INDENT_INC; /* safety check */ if (ptr_indent->indent_current < 0) { LOG_PRINT(LOG_CRIT, "negative indentation at line: " STRINGIFY(__LINE__) " in " __FILE__); return NULL; } if (ptr_indent->maybe_in_leaf /* here now we are sure */ || ptr_indent->indent_toodeep || ptr_indent->inline_mode) { ptr_indent->maybe_in_leaf = 0; if ((new_ref = mstrcat(*ptr_buffer, "<", ptr_buflen, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } else { *ptr_buffer = new_ref; } } else { /* NOT in leaf: linefeed + indent + '<' */ unsigned indent_real = ptr_indent->indent_current > INDENT_MAX ? INDENT_MAX : ptr_indent->indent_current; if ((new_ref = mstrcat(*ptr_buffer, "\n", ptr_buflen, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } else { *ptr_buffer = new_ref; } if ((new_ref = mstrcat(*ptr_buffer, & ptr_indent->indent_string[INDENT_MAX-indent_real], ptr_buflen, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } else { *ptr_buffer = new_ref; } } if (ptr_indent->notbelow(elname)) { ptr_indent->indent_toodeep = 0; } /* end of indentation + '<' code */ if (namespace && *namespace) { sprintf(buffer, "/%s:", namespace); } else { strcpy(buffer, "/"); } if ((new_ref = mstrcat(*ptr_buffer, buffer, ptr_buflen, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } else { *ptr_buffer = new_ref; } if ((new_ref = mstrcat(*ptr_buffer, (char*)elname, ptr_buflen, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } else { *ptr_buffer = new_ref; } if ((new_ref = mstrcat(*ptr_buffer, ">", ptr_buflen, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } else { *ptr_buffer = new_ref; } } return *ptr_buffer; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ initialize_xmlindent() initializes an xmlindent structure int initialize_xmlindent currently always returns 0 struct xmlindent* ptr_xindent ptr to structure with indentation info int indent_current set the initial indentation level int (*notbelow)(const char*) ptr to function which limits indentation int (*isentry)(const char*) ptr to function which determines the top-level element that starts a new entry ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int initialize_xmlindent(struct xmlindent* ptr_xindent, int indent_current, int (*notbelow)(const char*), int (*isentry)(const char*)) { ptr_xindent->indent_current = indent_current; ptr_xindent->maybe_in_leaf = 0; ptr_xindent->indent_toodeep = 0; ptr_xindent->inline_mode = 0; ptr_xindent->notbelow = notbelow; ptr_xindent->isentry = isentry; memset (ptr_xindent->indent_string, ' ', INDENT_MAX); ptr_xindent->indent_string[INDENT_MAX] = '<'; ptr_xindent->indent_string[INDENT_MAX+1] = 0; return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ inline_xmlindent() toggles the inline mode of an xmlindent structure the inline mode is important in mixed content where whitespace matters. The indentation code does not add newlines or indentation while in inline mode. int inline_xmlindent returns the previous value of the inline_mode variable struct xmlindent* ptr_xindent ptr to structure with indentation info int n_inline if 0, toggle inline mode off, if not 0, toggle on ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int inline_xmlindent(struct xmlindent* ptr_xindent, int n_inline) { int n_prev_inline; n_prev_inline = ptr_xindent->inline_mode; ptr_xindent->inline_mode = (n_inline) ? 1:0; return n_prev_inline; } refdb-1.0.2/src/rtfhelper.c000644 001750 001750 00000033700 12255427652 016405 0ustar00markusmarkus000000 000000 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ rtfhelper.c defines some helper functions to output RTF 1.7 data markus@mhoenicka.de 2008-01-27 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ #include #include #include #include #include /* need LONG_MAX */ #include /* #include "backend.h" */ #include "strfncs.h" #include "linklist.h" #include "connect.h" #include "refdb.h" #include "refdbd.h" #include "rtfhelper.h" extern int n_log_level; /* prototypes of static functions */ static char* print_rtf_bm(const char* label, char** ptr_buffer, size_t* ptr_buflen, int n_start); /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ print_rtf_control_word(): writes a RTF control word with an optional numerical parameter to a string char* print_rtf_control_word returns a pointer to the modified string, or NULL in case of an error const char* ctrlword name of the control word (without the leading backslash) char** ptr_buffer ptr to a ptr to a buffer created with malloc which will receive the output. This function will reallocate the buffer as needed. *ptr will be updated whenever a realloc is necessary. The calling function is responsible for freeing the memory again. size_t* ptr_buflen pointer to variable holding current length of ref long param optional numerical parameter. If a control word does not use such a parameter, pass NOPARAM here int start_group if nonzero, a group is opened before the control word is printed. The calling function is responsible for closing this group eventually ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* print_rtf_control_word(const char* ctrlword, char** ptr_buffer, size_t* ptr_buflen, long param, int start_group) { char buffer[CTRLWORDLEN+13]; /* leading backslash, word, 10-digit param, space, NULL */ char *to; char *new_ref; if (start_group) { if (print_rtf_start_group(ptr_buffer, ptr_buflen) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } } if (param == NOPARAM) { snprintf(buffer, CTRLWORDLEN+13, "\\%s ", ctrlword); } else { snprintf(buffer, CTRLWORDLEN+13, "\\%s%ld ", ctrlword, param); } /* we could try to avoid redundant spaces like this, but this may be called at the start of a string, causing access violations */ /* if (*(*ptr_buffer-1) == ' ') { */ /* to = *ptr_buffer-1; */ /* } */ /* else { */ to = *ptr_buffer; /* } */ if ((new_ref = mstrcat(to, buffer, ptr_buflen, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } else { *ptr_buffer = new_ref; } /* to keep the text human-readable, insert a linebreak after each \par */ if (!strcmp(ctrlword, "par")) { if ((new_ref = mstrcat(*ptr_buffer, "\n", ptr_buflen, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } else { *ptr_buffer = new_ref; } } return *ptr_buffer; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ print_rtf_control_symbol(): writes a RTF control symbol to a string char* print_rtf_control_symbol returns a pointer to the modified string, or NULL in case of an error const char symbol the symbol to be printed. This is one character, not a one-character string char** ptr_buffer ptr to a ptr to a buffer created with malloc which will receive the output. This function will reallocate the buffer as needed. *ptr will be updated whenever a realloc is necessary. The calling function is responsible for freeing the memory again. size_t* ptr_buflen pointer to variable holding current length of ref int start_group if nonzero, a group is opened before the control word is printed. The calling function is responsible for closing this group eventually ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* print_rtf_control_symbol(const char symbol, char** ptr_buffer, size_t* ptr_buflen, int start_group) { char* new_ref; char buffer[16]; if (start_group) { if (print_rtf_start_group(ptr_buffer, ptr_buflen) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } } snprintf(buffer, 16, "\\%c", symbol); if ((new_ref = mstrcat(*ptr_buffer, buffer, ptr_buflen, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } else { *ptr_buffer = new_ref; } return *ptr_buffer; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ print_rtf_start_group(): writes a RTF group start character to a string char* print_rtf_start_group returns a pointer to the modified string, or NULL in case of an error char** ptr_buffer ptr to a ptr to a buffer created with malloc which will receive the output. This function will reallocate the buffer as needed. *ptr will be updated whenever a realloc is necessary. The calling function is responsible for freeing the memory again. size_t* ptr_buflen pointer to variable holding current length of ref ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* print_rtf_start_group(char** ptr_buffer, size_t* ptr_buflen) { char* new_ref; if ((new_ref = mstrcat(*ptr_buffer, "{", ptr_buflen, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } else { *ptr_buffer = new_ref; } return *ptr_buffer; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ print_rtf_end_group(): writes a RTF group end sequence to a string char* print_rtf_end_group returns a pointer to the modified string, or NULL in case of an error char** ptr_buffer ptr to a ptr to a buffer created with malloc which will receive the output. This function will reallocate the buffer as needed. *ptr will be updated whenever a realloc is necessary. The calling function is responsible for freeing the memory again. size_t* ptr_buflen pointer to variable holding current length of ref ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* print_rtf_end_group(char** ptr_buffer, size_t* ptr_buflen) { char* new_ref; if ((new_ref = mstrcat(*ptr_buffer, "}", ptr_buflen, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } else { *ptr_buffer = new_ref; } return *ptr_buffer; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ print_rtf_header(): writes a RTF document header to a string char* print_rtf_header returns a pointer to the modified string, or NULL in case of an error char** ptr_buffer ptr to a ptr to a buffer created with malloc which will receive the output. This function will reallocate the buffer as needed. *ptr will be updated whenever a realloc is necessary. The calling function is responsible for freeing the memory again. size_t* ptr_buflen pointer to variable holding current length of ref ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* print_rtf_header(char** ptr_buffer, size_t* ptr_buflen) { char* new_ref; /* use fixed string for the time being */ if ((new_ref = mstrcat(*ptr_buffer, "{\\rtf1\\ansi\\deff1\\adeflang1025\n{\\fonttbl{\\f0\\froman\\fprq2\\fcharset0 Times New Roman;}{\\f1\\fprq2\\fcharset0 Times New Roman;}}\n", ptr_buflen, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } else { *ptr_buffer = new_ref; } return *ptr_buffer; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ print_rtf_string(): writes a string as escaped RTF text to a string char* print_rtf_header returns a pointer to the modified string, or NULL in case of an error const char* src ptr to the buffer holding the string to print char** ptr_buffer ptr to a ptr to a buffer created with malloc which will receive the output. This function will reallocate the buffer as needed. *ptr will be updated whenever a realloc is necessary. The calling function is responsible for freeing the memory again. size_t* ptr_buflen pointer to variable holding current length of ref ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* print_rtf_string(const char* src, char** ptr_buffer, size_t* ptr_buflen) { char* new_ref; char* escaped_src = NULL; if ((escaped_src = rtf_escape_string(src)) == NULL) { return NULL; } if ((new_ref = mstrcat(*ptr_buffer, escaped_src, ptr_buflen, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(escaped_src); return NULL; } else { *ptr_buffer = new_ref; } free(escaped_src); return *ptr_buffer; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ rtf_escape_string(): escapes special RTF characters in a string char* print_rtf_header returns a pointer to the escaped string in a newly allocated buffer, or NULL in case of an error. The calling function is responsible for freeing the buffer const char* src ptr to the buffer holding the string to print ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* rtf_escape_string(const char* src) { char* escaped_string; char* in; char* out; if (!src) { return NULL; } /* escape backslashes (as \\) and braces (as \{ and \}) */ escaped_string = malloc(2*strlen(src)+1); /* worst case: every char needs to be escaped, plus terminating NULL*/ if (!escaped_string) { return NULL; } out = escaped_string; for (in = (char*)src; *in; in++) { if (*in == '\\' || *in == '{' || *in == '}') { *out++ = '\\'; } *out++ = *in; } /* terminate escaped string */ *out = '\0'; return escaped_string; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ print_rtf_bmstart(): writes a bookmark start to a string char* print_rtf_bmstart returns a pointer to the modified string, or NULL in case of an error const char* label name of the bookmark char** ptr_buffer ptr to a ptr to a buffer created with malloc which will receive the output. This function will reallocate the buffer as needed. *ptr will be updated whenever a realloc is necessary. The calling function is responsible for freeing the memory again. size_t* ptr_buflen pointer to variable holding current length of ref ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* print_rtf_bmstart(const char* label, char** ptr_buffer, size_t* ptr_buflen) { return print_rtf_bm(label, ptr_buffer, ptr_buflen, 1); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ print_rtf_bmend(): writes a bookmark end to a string char* print_rtf_bmend returns a pointer to the modified string, or NULL in case of an error const char* label name of the bookmark char** ptr_buffer ptr to a ptr to a buffer created with malloc which will receive the output. This function will reallocate the buffer as needed. *ptr will be updated whenever a realloc is necessary. The calling function is responsible for freeing the memory again. size_t* ptr_buflen pointer to variable holding current length of ref ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* print_rtf_bmend(const char* label, char** ptr_buffer, size_t* ptr_buflen) { return print_rtf_bm(label, ptr_buffer, ptr_buflen, 0); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ print_rtf_bm(): writes a bookmark start or end to a string char* print_rtf_bm returns a pointer to the modified string, or NULL in case of an error const char* label name of the bookmark char** ptr_buffer ptr to a ptr to a buffer created with malloc which will receive the output. This function will reallocate the buffer as needed. *ptr will be updated whenever a realloc is necessary. The calling function is responsible for freeing the memory again. size_t* ptr_buflen pointer to variable holding current length of ref int start if nonzero, prints bookmark start. if zero, prints bookmark end ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static char* print_rtf_bm(const char* label, char** ptr_buffer, size_t* ptr_buflen, int n_start) { if (print_rtf_control_symbol('*', ptr_buffer, ptr_buflen, 1 /* start group */) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } if (print_rtf_control_word((n_start) ? "bkmkstart": "bkmkend", ptr_buffer, ptr_buflen, NOPARAM, 0) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } if (print_rtf_string(label, ptr_buffer, ptr_buflen) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } if (print_rtf_end_group(ptr_buffer, ptr_buflen) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return NULL; } return *ptr_buffer; } refdb-1.0.2/src/mset.c000644 001750 001750 00000012715 12255427651 015364 0ustar00markusmarkus000000 000000 /*+++++++++++++++++ mset.c - implements some functions for bibliography output markus@mhoenicka.de 2005-12-15 $Id: mset.c,v 1.1.2.2 2005/12/17 01:36:33 mhoenicka Exp $ 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ #include /* for a definition of NULL */ #include /* for malloc */ #include #include "strfncs.h" #include "xmlhelper.h" #include "mset.h" #include "outformats.h" /* for the REFXX definitions */ /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ set_mset(): starts and closes bibliomsets as requested static char* set_mset returns ptr to the buffer if successful, NULL if failed struct mset* ptr_first pointer to the sentinel of the mset stack char* new_mset ptr to a string containing the requested new bibliomset relation attribute. The string may be empty indicating that we shall only close the current bibliomset if any char** ptr_ref ptr to a ptr to a buffer created with malloc which will receive the output. The calling function must allocate the buffer with at least one byte. This function will reallocate the buffer as needed. *ptr will be updated whenever a realloc is necessary. The calling function is responsible for freeing the memory again. size_t* ptr_ref_len ptr to an int holding the current length of ref. Will be modified if ref is reallocated. int n_ref_format requested output format: REFDOCBK, REFDOCBKX, REFTEIX ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* set_mset(struct mset* ptr_first, char* new_mset, char** ptr_ref, size_t* ptr_ref_len, const char* ns, struct xmlindent* ptr_indent, int n_ref_format) { int no_close = 0; char* new_ref; char current_mset[MSET_RELATION_LEN]; char bibliomset[] = "bibliomset"; char relation[] = "relation"; /* if there is no stack, assume that no msets should be handled */ if (!ptr_first) { return *ptr_ref; } if (!ptr_first->ptr_next) { *current_mset = '\0'; no_close = 1; } else { strncpy(current_mset, ptr_first->ptr_next->relation, MSET_RELATION_LEN); current_mset[MSET_RELATION_LEN-1] = '\0'; } if (n_ref_format == REFTEIX5) { strcpy(bibliomset, "seg"); strcpy(relation, "type"); } if (/*(!(*current_mset == *new_mset && *current_mset == '\0')) || strcmp(current_mset, new_mset) != 0*/ 1) { if (!*new_mset/* && *current_mset */ && !no_close) { /* dont add new bibliomset, but old one exists */ if (print_elend_x(ptr_ref, ptr_ref_len, bibliomset, ptr_indent, ns) == NULL) { return NULL; } pop_mset(ptr_first, current_mset); } else if (!no_close && *new_mset && strcmp(current_mset, new_mset)){ /* close old one, add new one */ pop_mset(ptr_first, current_mset); if (print_elend_x(ptr_ref, ptr_ref_len, bibliomset, ptr_indent, ns) == NULL) { return NULL; } if (print_elstart_x(ptr_ref, ptr_ref_len, bibliomset, relation, new_mset, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0 /* not empty */, ptr_indent, ns) == NULL) { return NULL; } push_mset(ptr_first, new_mset); } else if (*new_mset && strcmp(current_mset, new_mset)) { /* add new one, no old one to close */ if (print_elstart_x(ptr_ref, ptr_ref_len, bibliomset, relation, new_mset, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0 /* not empty */, ptr_indent, ns) == NULL) { return NULL; } push_mset(ptr_first, new_mset); } } return *ptr_ref; } struct mset* new_mset_stack(void) { struct mset* ptr_new; if ((ptr_new = malloc(sizeof(struct mset))) == NULL) { return NULL; } *(ptr_new->relation) = '\0'; ptr_new->ptr_next = NULL; ptr_new->stacksize = 0; return ptr_new; } void clear_mset_stack(struct mset* ptr_first) { struct mset* ptr_delete; if (ptr_first) { while((ptr_delete = ptr_first->ptr_next) != NULL) { ptr_first->ptr_next = ptr_delete->ptr_next; free(ptr_delete); } free(ptr_first); } } char* push_mset(struct mset* ptr_first, char* new_mset) { struct mset* ptr_new; if (!new_mset || (ptr_new = malloc(sizeof(struct mset))) == NULL) { return NULL; } strncpy(ptr_new->relation, new_mset, MSET_RELATION_LEN); ptr_new->relation[MSET_RELATION_LEN-1] = '\0'; ptr_new->ptr_next = ptr_first->ptr_next; ptr_first->ptr_next = ptr_new; ptr_first->stacksize++; return new_mset; } char* pop_mset(struct mset* ptr_first, char* prev_mset) { struct mset* ptr_pop; if (!prev_mset || !ptr_first->ptr_next) { return NULL; } strncpy(prev_mset, ptr_first->ptr_next->relation, MSET_RELATION_LEN); prev_mset[MSET_RELATION_LEN-1] = '\0'; ptr_pop = ptr_first->ptr_next; ptr_first->ptr_next = ptr_pop->ptr_next; free(ptr_pop); ptr_first->stacksize--; return prev_mset; } refdb-1.0.2/src/refdbdgetref.c000644 001750 001750 00000265076 12255427652 017052 0ustar00markusmarkus000000 000000 /*++++++++++++++++++++ refdbdgetref.c: refdb getref-related functions markus@mhoenicka.de 2006-08-22 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, see +++++++++++++++++++++++++*/ #include #include #include #include /* priority level definitions */ #include #include #include #include "linklist.h" #include "refdb.h" #include "backend.h" #include "refdbd.h" /* depends on backend.h */ #include "strfncs.h" #include "tokenize.h" #include "dbfncs.h" #include "connect.h" #include "refdbdgetref.h" #include "writeris.h" /* some globals */ extern int n_log_level; /* numeric version of log_level */ extern char cs_term[]; /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ assemble_author_subselect(): assembles a string that replaces an author subselect char* assemble_author_subselect returns an allocated string if ok, or NULL if an error occurred. The calling function is responsible for freeing the allocated memory char* author_string string containing the author query fragment const char* operator string containing the query operator dbi_conn conn database connection structure dbi_driver driver the database driver ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* assemble_author_subselect(char* author_string, const char* operator, int author_type, dbi_conn conn, dbi_driver driver) { char author_type_start[64]; char author_type_end[4]; int counter; size_t len = 0; size_t sql_command_len = 4096; size_t stringbuf_len = 4096; char bitsandpieces[512]; char* sql_command; char* new_sql_command; char* token; char* quoted_token; char *stringbuf; char *new_stringbuf; sql_command = malloc(sql_command_len); if (sql_command == NULL) { return NULL; } sql_command[0] = '\0'; /* start with an empty string */ stringbuf = malloc(stringbuf_len); if (stringbuf == NULL) { free(sql_command); return NULL; } stringbuf[0] = '\0'; /* start with an empty string */ token = nstrtok(author_string, &len, " "); if (token != NULL) { /* prepare bits and pieces for AND/OR queries*/ if (author_type == 4) { /* any type of author */ *author_type_start = '\0'; strcpy(author_type_end, ") "); } else { /* particular type of author */ sprintf(author_type_start, "(t_xauthor.xauthor_type=%s AND ", get_author_type_string(driver, author_type)); strcpy(author_type_end, ")) "); } /* plain query with one author */ if (*token != '&' && *token != '|') { if (author_type == 4) { /* any type of author */ sprintf(sql_command, "SELECT DISTINCT t_xauthor.refdb_id FROM t_xauthor INNER JOIN t_author ON t_author.author_id=t_xauthor.author_id WHERE t_author.author_name %s ", (*operator == '=' || (*operator == '!' && *(operator+1) == '=')) ? "=" : my_dbi_conn_get_cap(conn, "rlike")); } else { /* particular type of author */ sprintf(sql_command, "SELECT DISTINCT t_xauthor.refdb_id FROM t_xauthor INNER JOIN t_author ON t_author.author_id=t_xauthor.author_id WHERE t_xauthor.xauthor_type=%s AND t_author.author_name %s ", get_author_type_string(driver, author_type), (*operator == '=' || (*operator == '!' && *(operator+1) == '=')) ? "=" : my_dbi_conn_get_cap(conn, "rlike")); } quoted_token = mstrdup(token); if (!quoted_token) { free(sql_command); free(stringbuf); return NULL; } if (dbi_conn_quote_string(conn, "ed_token) == 0) { free(sql_command); free(stringbuf); return NULL; } if ((new_sql_command = mstrcat(sql_command, quoted_token, &sql_command_len, 0)) == NULL) { free(quoted_token); free(sql_command); free(stringbuf); return NULL; } else { sql_command = new_sql_command; } free(quoted_token); } /* OR query with several authors */ else if (*token == '|') { sprintf(sql_command, "SELECT DISTINCT t_xauthor.refdb_id FROM t_xauthor INNER JOIN t_author ON t_author.author_id=t_xauthor.author_id WHERE %s (", author_type_start); while (token != NULL) { token = nstrtok(token+len, &len, " "); if (token != NULL) { if (*operator == '=' || (*operator == '!' && *(operator+1) == '=')) { strcpy(bitsandpieces, "t_author.author_name = "); } else { sprintf(bitsandpieces, "t_author.author_name %s ", my_dbi_conn_get_cap(conn, "rlike")); } if ((new_sql_command = mstrcat(sql_command, bitsandpieces, &sql_command_len, 0)) == NULL) { free(sql_command); free(stringbuf); return NULL; } else { sql_command = new_sql_command; } if ((new_stringbuf = mstrncpy(stringbuf, token, len, &stringbuf_len)) == NULL) { free(sql_command); free(stringbuf); return NULL; } else { stringbuf = new_stringbuf; } stringbuf[len] = '\0'; quoted_token = mstrdup(stringbuf); if (!quoted_token) { free(sql_command); free(stringbuf); return NULL; } if (dbi_conn_quote_string(conn, "ed_token) == 0) { free(sql_command); free(stringbuf); return NULL; } if ((new_sql_command = mstrcat(sql_command, quoted_token, &sql_command_len, 0)) == NULL) { free(quoted_token); free(sql_command); free(stringbuf); return NULL; } else { sql_command = new_sql_command; } free(quoted_token); if ((new_sql_command = mstrcat(sql_command, " OR ", &sql_command_len, 0)) == NULL) { free(sql_command); free(stringbuf); return NULL; } else { sql_command = new_sql_command; } } else { if ((new_sql_command = mstrcat(sql_command, author_type_end, &sql_command_len, 4)) == NULL) { free(sql_command); free(stringbuf); return NULL; } else { sql_command = new_sql_command; } } } /* end while */ } /* AND query with several authors */ else if (*token == '&') { counter = 0; sprintf(sql_command, "SELECT DISTINCT t_xauthor.refdb_id FROM t_xauthor INNER JOIN t_author ON t_author.author_id=t_xauthor.author_id WHERE %s (", author_type_start); while (token != NULL) { token = nstrtok(token+len, &len, " "); if (token != NULL) { if (*operator == '=' || (*operator == '!' && *(operator+1) == '=')) { strcpy(bitsandpieces, "t_author.author_name = "); } else { sprintf(bitsandpieces, "t_author.author_name %s ", my_dbi_conn_get_cap(conn, "rlike")); } if ((new_sql_command = mstrcat(sql_command, bitsandpieces, &sql_command_len, 0)) == NULL) { free(sql_command); free(stringbuf); return NULL; } else { sql_command = new_sql_command; } if ((new_stringbuf = mstrncpy(stringbuf, token, len, &stringbuf_len)) == NULL) { free(sql_command); free(stringbuf); return NULL; } else { stringbuf = new_stringbuf; } stringbuf[len] = '\0'; quoted_token = mstrdup(stringbuf); if (!quoted_token) { free(sql_command); free(stringbuf); return NULL; } if (dbi_conn_quote_string(conn, "ed_token) == 0) { free(quoted_token); free(sql_command); free(stringbuf); return NULL; } if ((new_sql_command = mstrcat(sql_command, quoted_token, &sql_command_len, 0)) == NULL) { free(quoted_token); free(sql_command); free(stringbuf); return NULL; } else { sql_command = new_sql_command; } free(quoted_token); if ((new_sql_command = mstrcat(sql_command, " OR ", &sql_command_len, 0)) == NULL) { free(sql_command); free(stringbuf); return NULL; } else { sql_command = new_sql_command; } counter++; } else { if ((new_sql_command = mstrcat(sql_command, author_type_end, &sql_command_len, 4)) == NULL) { free(sql_command); free(stringbuf); return NULL; } else { sql_command = new_sql_command; } } } if ((new_sql_command = mstrcat(sql_command, "GROUP BY t_xauthor.refdb_id HAVING COUNT(*)=", &sql_command_len, 0)) == NULL) { free(sql_command); free(stringbuf); return NULL; } else { sql_command = new_sql_command; } sprintf(author_string, "%d", counter); if ((new_sql_command = mstrcat(sql_command, author_string, &sql_command_len, 0)) == NULL) { free(sql_command); free(stringbuf); return NULL; } else { sql_command = new_sql_command; } } } free(stringbuf); return sql_command; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ assemble_keyword_subselect(): assembles a string that replaces a keyword subselect char* assemble_keyword_subselect returns an allocated string if ok, or NULL if an error occurred. The calling function is responsible for freeing the allocated memory char* keyword_string string containing the keyword query fragment const char* operator string containing the query operator dbi_conn conn database connection structure ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* assemble_keyword_subselect(char* keyword_string, const char* operator, dbi_conn conn) { int counter; size_t len = 0; size_t sql_command_len = 4096; size_t stringbuf_len = 4096; char bitsandpieces[512]; char* sql_command; char* new_sql_command; char* token; char* quoted_token; char *stringbuf; char *new_stringbuf; sql_command = malloc(sql_command_len); if (sql_command == NULL) { return NULL; } sql_command[0] = '\0'; /* start with an empty string */ stringbuf = malloc(stringbuf_len); if (stringbuf == NULL) { free(sql_command); return NULL; } stringbuf[0] = '\0'; /* start with an empty string */ token = nstrtok(keyword_string, &len, " "); if (token != NULL) { if (*token != '&' && *token != '|') { /* simple keyword query */ snprintf(sql_command, sql_command_len, "SELECT DISTINCT t_xkeyword.xref_id FROM t_xkeyword INNER JOIN t_keyword ON t_keyword.keyword_id=t_xkeyword.keyword_id WHERE t_xkeyword.xkeyword_type=\'REFERENCE\' AND t_keyword.keyword_name %s ", (*operator == '=' || (*operator == '!' && *(operator+1) == '=')) ? "=" : my_dbi_conn_get_cap(conn, "rlike")); quoted_token = mstrdup(token); if (!quoted_token) { free(sql_command); free(stringbuf); return NULL; } if (dbi_conn_quote_string(conn, "ed_token) == 0) { free(sql_command); free(stringbuf); return NULL; } if ((new_sql_command = mstrcat(sql_command, quoted_token, &sql_command_len, 0)) == NULL) { free(sql_command); free(stringbuf); return NULL; } else { sql_command = new_sql_command; } free(quoted_token); } else if (*token == '|') { /* several keywords OR'ed */ strcpy(sql_command, "SELECT DISTINCT t_xkeyword.xref_id FROM t_xkeyword INNER JOIN t_keyword ON t_keyword.keyword_id=t_xkeyword.keyword_id WHERE t_xkeyword.xkeyword_type=\'REFERENCE\' AND ("); while (token != NULL) { token = nstrtok(token+len, &len, " "); if (token != NULL) { if (*operator == '=' || (*operator == '!' && *(operator+1) == '=')) { strcpy(bitsandpieces, "t_keyword.keyword_name = "); } else { sprintf(bitsandpieces, "t_keyword.keyword_name %s ", my_dbi_conn_get_cap(conn, "rlike")); } if ((new_sql_command = mstrcat(sql_command, bitsandpieces, &sql_command_len, 0)) == NULL) { free(sql_command); free(stringbuf); return NULL; } else { sql_command = new_sql_command; } if ((new_stringbuf = mstrncpy(stringbuf, token, len, &stringbuf_len)) == NULL) { free(sql_command); free(stringbuf); return NULL; } else { stringbuf = new_stringbuf; } stringbuf[len] = '\0'; quoted_token = mstrdup(stringbuf); if (!quoted_token) { free(sql_command); free(stringbuf); return NULL; } if (dbi_conn_quote_string(conn, "ed_token) == 0) { free(quoted_token); free(sql_command); free(stringbuf); return NULL; } if ((new_sql_command = mstrcat(sql_command, quoted_token, &sql_command_len, 0)) == NULL) { free(quoted_token); free(sql_command); free(stringbuf); return NULL; } else { sql_command = new_sql_command; } free(quoted_token); if ((new_sql_command = mstrcat(sql_command, " OR ", &sql_command_len, 0)) == NULL) { free(sql_command); free(stringbuf); return NULL; } else { sql_command = new_sql_command; } } else { if ((new_sql_command = mstrcat(sql_command, ") ", &sql_command_len, 4)) == NULL) { free(sql_command); free(stringbuf); return NULL; } else { sql_command = new_sql_command; } } } } else if (*token == '&') { /* several keywords AND'ed */ counter = 0; strcpy(sql_command, "SELECT DISTINCT t_xkeyword.xref_id FROM t_xkeyword INNER JOIN t_keyword ON t_keyword.keyword_id=t_xkeyword.keyword_id WHERE t_xkeyword.xkeyword_type=\'REFERENCE\' AND ("); while (token != NULL) { token = nstrtok(token+len, &len, " "); if (token != NULL) { if (*operator == '=' || (*operator == '!' && *(operator+1) == '=')) { strcpy(bitsandpieces, "t_keyword.keyword_name = "); } else { sprintf(bitsandpieces, "t_keyword.keyword_name %s ", my_dbi_conn_get_cap(conn, "rlike")); } if ((new_sql_command = mstrcat(sql_command, bitsandpieces, &sql_command_len, 0)) == NULL) { free(sql_command); free(stringbuf); return NULL; } else { sql_command = new_sql_command; } if ((new_stringbuf = mstrncpy(stringbuf, token, len, &stringbuf_len)) == NULL) { free(sql_command); free(stringbuf); return NULL; } else { stringbuf = new_stringbuf; } stringbuf[len] = '\0'; quoted_token = mstrdup(stringbuf); if (!quoted_token) { free(sql_command); free(stringbuf); return NULL; } if (dbi_conn_quote_string(conn, "ed_token) == 0) { free(quoted_token); free(sql_command); free(stringbuf); return NULL; } if ((new_sql_command = mstrcat(sql_command, quoted_token, &sql_command_len, 0)) == NULL) { free(quoted_token); free(sql_command); free(stringbuf); return NULL; } else { sql_command = new_sql_command; } free(quoted_token); if ((new_sql_command = mstrcat(sql_command, " OR ", &sql_command_len, 0)) == NULL) { free(quoted_token); free(sql_command); return NULL; } else { sql_command = new_sql_command; } counter++; } else { if ((new_sql_command = mstrcat(sql_command, ") ", &sql_command_len, 4)) == NULL) { free(quoted_token); free(sql_command); return NULL; } else { sql_command = new_sql_command; } } } if ((new_sql_command = mstrcat(sql_command, "GROUP BY t_xkeyword.xref_id HAVING COUNT(*)=", &sql_command_len, 0)) == NULL) { free(quoted_token); free(sql_command); return NULL; } else { sql_command = new_sql_command; } sprintf(keyword_string, "%d", counter); if ((new_sql_command = mstrcat(sql_command, keyword_string, &sql_command_len, 0)) == NULL) { free(quoted_token); free(sql_command); return NULL; } else { sql_command = new_sql_command; } } } free(stringbuf); return sql_command; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ assemble_link_subselect(): assembles a string that replaces a link subselect char* assemble_link_subselect returns an allocated string if ok, or NULL if an error occurred. The calling function is responsible for freeing the allocated memory char* link_string string containing the link query fragment const char* operator string containing the query operator const char* link_type string containing the type (URL, PDF...) dbi_conn conn database connection structure ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* assemble_link_subselect(char* link_string, const char* operator, const char* link_type, dbi_conn conn) { int counter; size_t len = 0; size_t sql_command_len = 4096; size_t stringbuf_len = 4096; char bitsandpieces[512]; char* sql_command; char* new_sql_command; char* token; char* quoted_token; char *stringbuf; char *new_stringbuf; sql_command = malloc(sql_command_len); if (sql_command == NULL) { return NULL; } sql_command[0] = '\0'; /* start with an empty string */ stringbuf = malloc(stringbuf_len); if (stringbuf == NULL) { free(sql_command); return NULL; } stringbuf[0] = '\0'; /* start with an empty string */ token = nstrtok(link_string, &len, " "); if (token != NULL) { if (*token != '&' && *token != '|') { /* simple link query */ snprintf(sql_command, sql_command_len, "SELECT DISTINCT t_xlink.xref_id FROM t_xlink INNER JOIN t_link ON t_link.link_id=t_xlink.link_id WHERE t_xlink.xlink_source=\'REFERENCE\' AND t_xlink.xlink_type=\'%s\' AND t_link.link_url %s ", link_type, (*operator == '=' || (*operator == '!' && *(operator+1) == '=')) ? "=" : my_dbi_conn_get_cap(conn, "rlike")); quoted_token = mstrdup(token); if (!quoted_token) { free(sql_command); free(stringbuf); return NULL; } if (dbi_conn_quote_string(conn, "ed_token) == 0) { free(sql_command); free(stringbuf); return NULL; } if ((new_sql_command = mstrcat(sql_command, quoted_token, &sql_command_len, 0)) == NULL) { free(sql_command); free(stringbuf); return NULL; } else { sql_command = new_sql_command; } free(quoted_token); } else if (*token == '|') { /* several links OR'ed */ sprintf(sql_command, "SELECT DISTINCT t_xlink.xref_id FROM t_xlink INNER JOIN t_link ON t_link.link_id=t_xlink.link_id WHERE t_xlink.xlink_source=\'REFERENCE\' AND t_xlink.xlink_type=\'%s\' AND (", link_type); while (token != NULL) { token = nstrtok(token+len, &len, " "); if (token != NULL) { if (*operator == '=' || (*operator == '!' && *(operator+1) == '=')) { strcpy(bitsandpieces, "t_link.link_url = "); } else { sprintf(bitsandpieces, "t_link.link_url %s ", my_dbi_conn_get_cap(conn, "rlike")); } if ((new_sql_command = mstrcat(sql_command, bitsandpieces, &sql_command_len, 0)) == NULL) { free(sql_command); free(stringbuf); return NULL; } else { sql_command = new_sql_command; } if ((new_stringbuf = mstrncpy(stringbuf, token, len, &stringbuf_len)) == NULL) { free(sql_command); free(stringbuf); return NULL; } else { stringbuf = new_stringbuf; } stringbuf[len] = '\0'; quoted_token = mstrdup(stringbuf); if (!quoted_token) { free(sql_command); free(stringbuf); return NULL; } if (dbi_conn_quote_string(conn, "ed_token) == 0) { free(quoted_token); free(sql_command); free(stringbuf); return NULL; } if ((new_sql_command = mstrcat(sql_command, quoted_token, &sql_command_len, 0)) == NULL) { free(quoted_token); free(sql_command); free(stringbuf); return NULL; } else { sql_command = new_sql_command; } free(quoted_token); if ((new_sql_command = mstrcat(sql_command, " OR ", &sql_command_len, 0)) == NULL) { free(sql_command); free(stringbuf); return NULL; } else { sql_command = new_sql_command; } } else { if ((new_sql_command = mstrcat(sql_command, ") ", &sql_command_len, 4)) == NULL) { free(sql_command); free(stringbuf); return NULL; } else { sql_command = new_sql_command; } } } } else if (*token == '&') { /* several links AND'ed */ counter = 0; sprintf(sql_command, "SELECT DISTINCT t_xlink.xref_id FROM t_xlink INNER JOIN t_link ON t_link.link_id=t_xlink.link_id WHERE t_xlink.xlink_source=\'REFERENCE\' AND t_xlink.xlink_type=\'%s\' AND (", link_type); while (token != NULL) { token = nstrtok(token+len, &len, " "); if (token != NULL) { if (*operator == '=' || (*operator == '!' && *(operator+1) == '=')) { strcpy(bitsandpieces, "t_link.link_url = "); } else { sprintf(bitsandpieces, "t_link.link_url %s ", my_dbi_conn_get_cap(conn, "rlike")); } if ((new_sql_command = mstrcat(sql_command, bitsandpieces, &sql_command_len, 0)) == NULL) { free(sql_command); free(stringbuf); return NULL; } else { sql_command = new_sql_command; } if ((new_stringbuf = mstrncpy(stringbuf, token, len, &stringbuf_len)) == NULL) { free(sql_command); free(stringbuf); return NULL; } else { stringbuf = new_stringbuf; } stringbuf[len] = '\0'; quoted_token = mstrdup(stringbuf); if (!quoted_token) { free(sql_command); free(stringbuf); return NULL; } if (dbi_conn_quote_string(conn, "ed_token) == 0) { free(quoted_token); free(sql_command); free(stringbuf); return NULL; } if ((new_sql_command = mstrcat(sql_command, quoted_token, &sql_command_len, 0)) == NULL) { free(quoted_token); free(sql_command); free(stringbuf); return NULL; } else { sql_command = new_sql_command; } free(quoted_token); if ((new_sql_command = mstrcat(sql_command, " OR ", &sql_command_len, 0)) == NULL) { free(quoted_token); free(sql_command); return NULL; } else { sql_command = new_sql_command; } counter++; } else { if ((new_sql_command = mstrcat(sql_command, ") ", &sql_command_len, 4)) == NULL) { free(quoted_token); free(sql_command); return NULL; } else { sql_command = new_sql_command; } } } if ((new_sql_command = mstrcat(sql_command, "GROUP BY t_xlink.xref_id HAVING COUNT(*)=", &sql_command_len, 0)) == NULL) { free(quoted_token); free(sql_command); return NULL; } else { sql_command = new_sql_command; } sprintf(link_string, "%d", counter); if ((new_sql_command = mstrcat(sql_command, link_string, &sql_command_len, 0)) == NULL) { free(quoted_token); free(sql_command); return NULL; } else { sql_command = new_sql_command; } } } free(stringbuf); return sql_command; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ getref(): implements the client command getref int getref returns 0 = no error, 1 = out of memory or db open error, 2 = subselect failed struct CLIENT_REQUEST* ptr_clrequest ptr to structure with client info struct bibinfo *ptr_biblio_info ptr to structure holding bibliography style int ref_format the output format 0 = simple screen rendering, 1 = RIS format, 2 = DocBook format, 3 = BibTeX format, 4 = HTML 10 = RISX 11 = XHTML int n_privatelist if set to 1, limit search to user's private list if set to 0, search all struct ADDRESULT* ptr_addresult ptr to result counter structure int send_data if set to 1, sends back matching datasets (getref) if set to 0, sends back number of matching datasets (scanref) int frequency if 1, provide frequency information (not necessarily supported by all backends), otherwise don't ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int getref(struct CLIENT_REQUEST* ptr_clrequest, struct bibinfo *ptr_biblio_info, int ref_format, int n_privatelist, struct ADDRESULT* ptr_addresult, int send_data, int frequency) { dbi_conn conn; dbi_result dbires = NULL; dbi_driver driver; char **inargv; /* tokens of the client request */ int inargc; /* number of tokens of the client request */ int inargcmax; /* maximum number of tokens of the client request */ int n_isalpha; int n_havesome; int numbyte; /* number of bytes written */ int author_type; /* signals type of author query, if any */ int render_res; int cs_status; int retval = 0; unsigned long long n_id; unsigned long long nref_counter = 0; unsigned long long numrows = 0; size_t buffer_len; /* these are the allocated lengths of the buffers */ size_t sql_command_len; size_t sql_command1_len; size_t stringbuf_len; size_t result_len = 0; size_t n_bufsize; char *sql_command; /* these are ptrs to the buffers and temporary ptrs */ char *new_sql_command; char *sql_command1; char *new_sql_command1; char *buffer; char *new_buffer; char *stringbuf; char *token; char *newtoken; char *quoted_token; char *eostring; char *query_string; const char* db_encoding; char operator[5]; char the_id[32]; char bitsandpieces[512]; char limitstring[128] = ""; struct SQLTOKEN sqltoken; struct lilimem sentinel; struct renderinfo rendinfo; iconv_t conv_descriptor; sentinel.ptr_mem = NULL; sentinel.ptr_next = NULL; sentinel.varname[0] = '\0'; /* fill in invariant elements of structure */ rendinfo.ptr_biblio_info = ptr_biblio_info; rendinfo.ref_format = ref_format; rendinfo.nuse_citestyle = 0; rendinfo.dbname = NULL; /* todo: remove the redundance */ rendinfo.database = ptr_clrequest->current_db; rendinfo.username = ptr_clrequest->username; rendinfo.pdfroot = ptr_clrequest->pdfroot; rendinfo.cgi_url = ptr_clrequest->cgi_url; rendinfo.ptr_clrequest = ptr_clrequest; rendinfo.javascript = 0; rendinfo.frequency = frequency; /* get buffer to analyze the request */ inargc = 0; inargcmax = 10; inargv = malloc((size_t)inargcmax*sizeof(char*)); if (inargv == NULL || insert_lilimem(&sentinel, (void**)&inargv, NULL)) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } /* get buffer to assemble the SQL queries */ sql_command_len = 4096; sql_command = malloc(sql_command_len); if (sql_command == NULL || insert_lilimem(&sentinel, (void**)&sql_command, NULL)) { delete_all_lilimem(&sentinel); send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } sql_command[0] = '\0'; /* start with an empty string */ /* get another buffer to assemble the SQL queries */ sql_command1_len = 4096; sql_command1 = malloc(sql_command1_len); if (sql_command1 == NULL || insert_lilimem(&sentinel, (void**)&sql_command1, NULL)) { delete_all_lilimem(&sentinel); send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } sql_command1[0] = '\0'; /* start with an empty string */ /* get a buffer to hold tokens */ buffer_len = 4096; buffer = malloc(buffer_len); if (buffer == NULL || insert_lilimem(&sentinel, (void**)&buffer, NULL)) { delete_all_lilimem(&sentinel); send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } buffer[0] = '\0'; /* start with an empty string */ /* get a buffer to hold tokens */ stringbuf_len = 4096; stringbuf = malloc(stringbuf_len); if (stringbuf == NULL || insert_lilimem(&sentinel, (void**)&stringbuf, NULL)) { delete_all_lilimem(&sentinel); send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } buffer[0] = '\0'; /* start with an empty string */ /* get length of the input string */ n_bufsize = atoi(ptr_clrequest->argument); /* refuse queries if buffer length is unreasonable */ if (n_bufsize <= TERM_LEN) { LOG_PRINT(LOG_WARNING, get_status_msg(301)); send_status(ptr_clrequest->fd, 301, TERM_NO); return 1; } /* try to allocate the amount the client requested */ query_string = malloc(n_bufsize); if (query_string == NULL || insert_lilimem(&sentinel, (void**)&query_string, NULL)) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } /* send acknowledgement to client */ send_status(ptr_clrequest->fd, 0, TERM_NO); if ((cs_status = read_status(ptr_clrequest->fd)) != 0) { LOG_PRINT(LOG_INFO, get_status_msg(112)); delete_all_lilimem(&sentinel); return 1; } /* read id list from client */ numbyte = tread(ptr_clrequest->fd, query_string, n_bufsize); if (numbyte == -1) { LOG_PRINT(LOG_INFO, get_status_msg(109)); delete_all_lilimem(&sentinel); return 1; } /* printf("query: %s<<\n", query_string); */ eostring = query_string + strlen(query_string); /* connect to the database */ if ((conn = connect_to_db(ptr_clrequest, NULL, 0)) == NULL) { send_status(ptr_clrequest->fd, 204, TERM_NO); LOG_PRINT(LOG_WARNING, get_status_msg(204)); delete_all_lilimem(&sentinel); return 1; } driver = dbi_conn_get_driver(conn); /* get the database encoding */ db_encoding = dbi_conn_get_encoding(conn); /* if we need to convert, create a conversion descriptor for iconv() */ if (db_encoding && *(ptr_biblio_info->encoding) && strcmp(db_encoding, ptr_biblio_info->encoding)) { char to_encoding[64]; if (!strcmp(ptr_biblio_info->encoding, "US-ASCII")) { strcpy(to_encoding, "ASCII//TRANSLIT"); } else { snprintf(to_encoding, 64, "%s//TRANSLIT", ptr_biblio_info->encoding); } conv_descriptor = iconv_open(to_encoding, !strcmp(db_encoding, "US-ASCII") ? "ASCII" : db_encoding); if (conv_descriptor == (iconv_t)(-1)) { LOG_PRINT(LOG_WARNING, "cannot set conversion descriptor (database/output):"); LOG_PRINT(LOG_DEBUG, db_encoding); LOG_PRINT(LOG_DEBUG, ptr_biblio_info->encoding); send_status(ptr_clrequest->fd, 701, TERM_NO); LOG_PRINT(LOG_WARNING, get_status_msg(701)); delete_all_lilimem(&sentinel); return 1; } else { LOG_PRINT(LOG_DEBUG, "database encoding is:"); LOG_PRINT(LOG_DEBUG, db_encoding); } } else { conv_descriptor = NULL; LOG_PRINT(LOG_DEBUG, "no character encoding conversion required"); } LOG_PRINT(LOG_DEBUG, "output encoding is:"); if (*(ptr_biblio_info->encoding)) { LOG_PRINT(LOG_DEBUG, ptr_biblio_info->encoding); } else { LOG_PRINT(LOG_DEBUG, db_encoding); } token = query_string; newtoken = token; /* general strategy: we extract the tokens one after the other and insert brackets, logical operators, and those requests which map to simple t_refdb queries directly into the future search string. For those queries that require a relational lookup a surrogate subselect query is formulated, as mySQL does not (yet) support true subselects. The results of these subselects are lists of refdb_id values which are translated into query fragments and get inserted into the future search string. The final search string is sent to the db server and provides us with the final list of the t_refdb fields we're interested in. This list is finally used to extract the additional data from the t_author, t_keyword, and t_user fields that we need to send back the result. */ /* loop as long as we find more tokens */ while (newtoken != NULL) { token = sql_tokenize(newtoken, &sqltoken); newtoken = sqltoken.next_token; if (token != NULL) { /* extract the token and save to a temporary string */ if (sqltoken.length > buffer_len) { new_buffer = (char*)realloc(buffer, (size_t)sqltoken.length); if (new_buffer == NULL) { /* out of memory */ retval = 1; break; } else { buffer = new_buffer; buffer_len = sqltoken.length; } } strncpy(buffer, token, sqltoken.length); buffer[sqltoken.length] ='\0'; /* printf("token went to:%s<<\n", buffer); */ if (sqltoken.type != 4) { /* we recycle these tokens */ if ((new_sql_command1 = mstrcat(sql_command1, buffer, &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } else { /*----------------------------------------------------------------*/ /* author */ if (strncmp(buffer, ":AU:", 4) == 0 || strncmp(buffer, ":A1:", 4) == 0) { author_type = 1; } else if (strncmp(buffer, ":A2:", 4) == 0 || strncmp(buffer, ":ED:", 4) == 0) { author_type = 2; } else if (strncmp(buffer, ":A3:", 4) == 0) { author_type = 3; } else if (strncmp(buffer, ":AX:", 4) == 0) { author_type = 4; } else { author_type = 0; } if (author_type != 0) { /* author query */ char* subselect = NULL; strncpy(operator, &token[4], sqltoken.length-4); /* save the comparison operator */ operator[sqltoken.length-4] = '\0'; /* terminate string */ /* assemble a surrogate subselect query */ token = sql_tokenize(newtoken, &sqltoken); newtoken = sqltoken.next_token; if (token != NULL) { strncpy(buffer, token, sqltoken.length); buffer[sqltoken.length] ='\0'; /* terminate string */ /* printf("author_token went to:%s<<\n", buffer); */ if ((subselect = assemble_author_subselect(buffer, operator, author_type, conn, driver)) == NULL) { retval = 1; break; } } LOG_PRINT(LOG_DEBUG, subselect); /* dbires will contain all refdb_ids of those entries that match the author requirements in the pseudo-subselect */ dbires = dbi_conn_query(conn, subselect); if (!dbires) { free(subselect); retval = 2; break; } free(subselect); if (*operator == '!') { if ((new_sql_command1 = mstrcat(sql_command1, "t_refdb.refdb_id NOT IN (", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } else { if ((new_sql_command1 = mstrcat(sql_command1, "t_refdb.refdb_id IN (", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } n_havesome = 0; while (dbi_result_next_row(dbires) != 0) { n_havesome = 1; n_id = my_dbi_result_get_idval_idx(dbires, 1); /* 1-base index */ sprintf(the_id, ULLSPEC, (unsigned long long)n_id); if ((new_sql_command1 = mstrcat(sql_command1, the_id, &sql_command1_len, 0)) == NULL) { retval = 1; dbi_result_free(dbires); break; } else { sql_command1 = new_sql_command1; } if ((new_sql_command1 = mstrcat(sql_command1, ",", &sql_command1_len, 0)) == NULL) { retval = 1; dbi_result_free(dbires); break; } else { sql_command1 = new_sql_command1; } } if (!n_havesome) { /* use a dummy value that does not exist in the database */ if ((new_sql_command1 = mstrcat(sql_command1, "-1,", &sql_command1_len, 0)) == NULL) { /* the comma will be removed further down */ retval = 1; dbi_result_free(dbires); break; } else { sql_command1 = new_sql_command1; } } dbi_result_free(dbires); if (retval) { break; } if ((new_sql_command1 = mstrcat(sql_command1, ")", &sql_command1_len, 1)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } /*----------------------------------------------------------------*/ /* keyword */ else if (strncmp(token, ":KW:", 4) == 0) { /* keyword query */ char* subselect = NULL; strncpy(operator, &token[4], sqltoken.length-4); /* save the comparison operator */ operator[sqltoken.length-4] = '\0'; /* terminate string */ /* assemble a surrogate subselect query */ token = sql_tokenize(newtoken, &sqltoken); newtoken = sqltoken.next_token; if (token != NULL) { strncpy(buffer, token, sqltoken.length); buffer[sqltoken.length] ='\0'; /* terminate string */ if ((subselect = assemble_keyword_subselect(buffer, operator, conn)) == NULL) { retval = 1; break; } } LOG_PRINT(LOG_DEBUG, subselect); /* dbires will contain all refdb_ids that match the above keyword requirements in the pseudo-subselect */ dbires = dbi_conn_query(conn, subselect); if (!dbires) { free(subselect); retval = 2; break; } free(subselect); if (*operator == '!') { if ((new_sql_command1 = mstrcat(sql_command1, "t_refdb.refdb_id NOT IN (", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } else { if ((new_sql_command1 = mstrcat(sql_command1, "t_refdb.refdb_id IN (", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } n_havesome = 0; while (dbi_result_next_row(dbires) != 0) { n_havesome = 1; n_id = my_dbi_result_get_idval_idx(dbires, 1); sprintf(the_id, ULLSPEC, (unsigned long long)n_id); if ((new_sql_command1 = mstrcat(sql_command1, the_id, &sql_command1_len, 0)) == NULL) { retval = 1; dbi_result_free(dbires); break; } else { sql_command1 = new_sql_command1; } if ((new_sql_command1 = mstrcat(sql_command1, ",", &sql_command1_len, 0)) == NULL) { retval = 1; dbi_result_free(dbires); break; } else { sql_command1 = new_sql_command1; } } if (!n_havesome) { /* use a dummy value that does not exist in the database */ if ((new_sql_command1 = mstrcat(sql_command1, "-1,", &sql_command1_len, 0)) == NULL) { /* the comma will be removed further down */ retval = 1; dbi_result_free(dbires); break; } else { sql_command1 = new_sql_command1; } } dbi_result_free(dbires); if (retval) { break; } if ((new_sql_command1 = mstrcat(sql_command1, ")", &sql_command1_len, 1)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } /*----------------------------------------------------------------*/ /* URL, L1-L4 */ else if (strncmp(token, ":UR:", 4) == 0 || strncmp(token, ":L1:", 4) == 0 || strncmp(token, ":L2:", 4) == 0 || strncmp(token, ":L3:", 4) == 0 || strncmp(token, ":L4:", 4) == 0 || strncmp(token, ":DO:", 4) == 0) { /* link query */ char* subselect = NULL; char link_type[9]; strncpy(operator, &token[4], sqltoken.length-4); /* save the comparison operator */ operator[sqltoken.length-4] = '\0'; /* terminate string */ if (token[2] == 'R') { strcpy(link_type, "URL"); } else if (token[2] == '1') { strcpy(link_type, "PDF"); } else if (token[2] == '2') { strcpy(link_type, "FULLTEXT"); } else if (token[2] == '3') { strcpy(link_type, "RELATED"); } else if (token[2] == '4') { strcpy(link_type, "IMAGE"); } else if (token[2] == 'O') { strcpy(link_type, "DOI"); } /* assemble a surrogate subselect query */ token = sql_tokenize(newtoken, &sqltoken); newtoken = sqltoken.next_token; if (token != NULL) { strncpy(buffer, token, sqltoken.length); buffer[sqltoken.length] ='\0'; /* terminate string */ if ((subselect = assemble_link_subselect(buffer, operator, link_type, conn)) == NULL) { retval = 1; break; } } LOG_PRINT(LOG_DEBUG, subselect); /* dbires will contain all refdb_ids that match the above keyword requirements in the pseudo-subselect */ dbires = dbi_conn_query(conn, subselect); if (!dbires) { free(subselect); retval = 2; break; } free(subselect); if (*operator == '!') { if ((new_sql_command1 = mstrcat(sql_command1, "t_refdb.refdb_id NOT IN (", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } else { if ((new_sql_command1 = mstrcat(sql_command1, "t_refdb.refdb_id IN (", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } n_havesome = 0; while (dbi_result_next_row(dbires) != 0) { n_havesome = 1; n_id = my_dbi_result_get_idval_idx(dbires, 1); sprintf(the_id, ULLSPEC, (unsigned long long)n_id); if ((new_sql_command1 = mstrcat(sql_command1, the_id, &sql_command1_len, 0)) == NULL) { retval = 1; dbi_result_free(dbires); break; } else { sql_command1 = new_sql_command1; } if ((new_sql_command1 = mstrcat(sql_command1, ",", &sql_command1_len, 0)) == NULL) { retval = 1; dbi_result_free(dbires); break; } else { sql_command1 = new_sql_command1; } } if (!n_havesome) { /* use a dummy value that does not exist in the database */ if ((new_sql_command1 = mstrcat(sql_command1, "-1,", &sql_command1_len, 0)) == NULL) { /* the comma will be removed further down */ retval = 1; dbi_result_free(dbires); break; } else { sql_command1 = new_sql_command1; } } dbi_result_free(dbires); if (retval) { break; } if ((new_sql_command1 = mstrcat(sql_command1, ")", &sql_command1_len, 1)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } /*----------------------------------------------------------------*/ /* journal */ else if (strncmp(token, ":JO:", 4) == 0 || strncmp(token, ":JF:", 4) == 0 || strncmp(token, ":J1:", 4) == 0 || strncmp(token, ":J2:", 4) == 0 || strncmp(token, ":JX:", 4) == 0) { /* periodical query */ char my_token[5]; /* backup of token */ char my_bool[4]; strncpy(my_token, token, 4); my_token[4] = '\0'; strncpy(operator, &token[4], sqltoken.length-4); /* save the comparison operator */ operator[sqltoken.length-4] = '\0'; /* terminate string */ /* translate operator to regexp operator */ if (*operator == '=') { strcpy(bitsandpieces, " = "); strcpy(my_bool, "OR"); } else if (*operator == '~') { sprintf(bitsandpieces, " %s ", my_dbi_conn_get_cap(conn, "rlike")); strcpy(my_bool, "OR"); } else if (*(operator+1) == '=') { strcpy(bitsandpieces, " != "); strcpy(my_bool, "AND"); } else { /* treat all other operators as non-equal regexp*/ sprintf(bitsandpieces, " %s ", my_dbi_conn_get_cap(conn, "not_rlike")); strcpy(my_bool, "AND"); } token = sql_tokenize(newtoken, &sqltoken); newtoken = sqltoken.next_token; if (token != NULL) { if ((new_buffer = mstrncpy(buffer, token, sqltoken.length, &buffer_len)) == NULL) { retval = 1; break; } else { buffer = new_buffer; } buffer[sqltoken.length] ='\0'; quoted_token = mstrdup(buffer); if (!quoted_token) { retval = 1; break; } if (dbi_conn_quote_string(conn, "ed_token) == 0) { retval = 1; break; } } else { quoted_token = mstrdup(""); } /* assemble a surrogate subselect query */ if (strncmp(my_token, ":JX:", 4) == 0) { char jxbuffer[2048]; snprintf(jxbuffer, 2048, "SELECT t_refdb.refdb_periodical_id FROM t_refdb INNER JOIN t_periodical ON t_periodical.periodical_id=t_refdb.refdb_periodical_id WHERE (t_periodical.periodical_name%s%s %s t_periodical.periodical_abbrev%s%s %s t_periodical.periodical_custabbrev1%s%s %s t_periodical.periodical_custabbrev2%s%s)", bitsandpieces, quoted_token, my_bool, bitsandpieces, quoted_token, my_bool, bitsandpieces, quoted_token, my_bool, bitsandpieces, quoted_token); free(quoted_token); *sql_command = '\0'; if ((new_sql_command = mstrcat(sql_command, jxbuffer, &sql_command_len, 0)) == NULL) { retval = 1; break; } else { sql_command = new_sql_command; } } else { if (strncmp(my_token, ":JF:", 4) == 0) { strcpy(sql_command, "SELECT t_refdb.refdb_periodical_id FROM t_refdb INNER JOIN t_periodical ON t_periodical.periodical_id=t_refdb.refdb_periodical_id WHERE t_periodical.periodical_name"); } else if (strncmp(my_token, ":JO:", 4) == 0) { strcpy(sql_command, "SELECT t_refdb.refdb_periodical_id FROM t_refdb INNER JOIN t_periodical ON t_periodical.periodical_id=t_refdb.refdb_periodical_id WHERE t_periodical.periodical_abbrev"); } else if (strncmp(my_token, ":J1:", 4) == 0) { strcpy(sql_command, "SELECT t_refdb.refdb_periodical_id FROM t_refdb INNER JOIN t_periodical ON t_periodical.periodical_id=t_refdb.refdb_periodical_id WHERE t_periodical.periodical_custabbrev1"); } else if (strncmp(my_token, ":J2:", 4) == 0){ strcpy(sql_command, "SELECT t_refdb.refdb_periodical_id FROM t_refdb INNER JOIN t_periodical ON t_periodical.periodical_id=t_refdb.refdb_periodical_id WHERE t_periodical.periodical_custabbrev2"); } if ((new_sql_command = mstrcat(sql_command, bitsandpieces, &sql_command_len, 0)) == NULL) { retval = 1; break; } else { sql_command = new_sql_command; } if (quoted_token != NULL) { if ((new_sql_command = mstrcat(sql_command, quoted_token, &sql_command_len, 0)) == NULL) { retval = 1; free(quoted_token); break; } else { sql_command = new_sql_command; } free(quoted_token); } } /* end if JX */ LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { retval = 2; break; } if ((new_sql_command1 = mstrcat(sql_command1, "t_refdb.refdb_periodical_id IN (", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } if (dbi_result_get_numrows(dbires)) { while (dbi_result_next_row(dbires) != 0) { n_id = my_dbi_result_get_idval_idx(dbires, 1); sprintf(the_id, ULLSPEC, (unsigned long long)n_id); if ((new_sql_command1 = mstrcat(sql_command1, the_id, &sql_command1_len, 0)) == NULL) { retval = 1; dbi_result_free(dbires); break; } else { sql_command1 = new_sql_command1; } if ((new_sql_command1 = mstrcat(sql_command1, ",", &sql_command1_len, 0)) == NULL) { retval = 1; dbi_result_free(dbires); break; } else { sql_command1 = new_sql_command1; } } /* remove trailing comma */ sql_command1[strlen(sql_command1)-1] = '\0'; } else { /* use a dummy value that does not exist in the database */ if ((new_sql_command1 = mstrcat(sql_command1, "-1", &sql_command1_len, 0)) == NULL) { retval = 1; dbi_result_free(dbires); break; } else { sql_command1 = new_sql_command1; } } if ((new_sql_command1 = mstrcat(sql_command1, ")", &sql_command1_len, 0)) == NULL) { retval = 1; dbi_result_free(dbires); break; } else { sql_command1 = new_sql_command1; } dbi_result_free(dbires); } /*----------------------------------------------------------------*/ /* search in all titles */ else if (strncmp(token, ":TA:", 4) == 0 /* deprecated */ || strncmp(token, ":TX:", 4) == 0) { /* all titles query */ char table[3][27] = {"t_refdb.refdb_title", "t_refdb.refdb_booktitle", "t_refdb.refdb_title_series"}; char the_op[6]; int i; int n_isfirst = 1; /* todo: fixme */ strncpy(operator, &token[4], sqltoken.length-4); /* save the comparison operator */ operator[sqltoken.length-4] = '\0'; /* terminate string */ if (*operator == '=') { strcpy(bitsandpieces, " = "); strcpy(the_op, " OR "); } else if (*operator == '~') { sprintf(bitsandpieces, " %s ", my_dbi_conn_get_cap(conn, "rlike")); strcpy(the_op, " OR "); } else if (*operator == '!' && *(operator+1) == '=') { sprintf(bitsandpieces, " != "); strcpy(the_op, " AND "); } else { /* treat all other operators as non-equal */ sprintf(bitsandpieces, " %s ", my_dbi_conn_get_cap(conn, "not_rlike")); strcpy(the_op, " AND "); } token = sql_tokenize(newtoken, &sqltoken); newtoken = sqltoken.next_token; if (token != NULL) { /* printf("%s:%d\n", token, error); */ /* printf("%s\n", newtoken); */ if ((new_buffer = mstrncpy(buffer, token, sqltoken.length, &buffer_len)) == NULL) { retval = 1; break; } else { buffer = new_buffer; } buffer[sqltoken.length] ='\0'; quoted_token = mstrdup(buffer); if (!quoted_token) { retval = 1; break; } if (dbi_conn_quote_string(conn, "ed_token) == 0) { retval = 1; break; } for (i = 0; i<3; i++) { if (!n_isfirst) { if ((new_sql_command1 = mstrcat(sql_command1, the_op, &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } else { n_isfirst--; if ((new_sql_command1 = mstrcat(sql_command1, "(", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } if ((new_sql_command1 = mstrcat(sql_command1, table[i], &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } if ((new_sql_command1 = mstrcat(sql_command1, bitsandpieces, &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } if ((new_sql_command1 = mstrcat(sql_command1, quoted_token, &sql_command1_len, 0)) == NULL) { retval = 1; free(quoted_token); break; } else { sql_command1 = new_sql_command1; } } /* end for */ if ((new_sql_command1 = mstrcat(sql_command1, ")", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } free(quoted_token); } } /*----------------------------------------------------------------*/ /* extended notes - note ID */ else if (strncmp(token, ":NID:", 5) == 0) { /* extended note ID query */ strncpy(operator, &token[5], sqltoken.length-5); /* save the comparison operator */ operator[sqltoken.length-5] = '\0'; /* terminate string */ /* assemble a surrogate subselect query */ quoted_token = mstrdup(ptr_clrequest->username); if (!quoted_token) { retval = 1; break; } if (dbi_conn_quote_string(conn, "ed_token) == 0) { retval = 1; break; } sprintf(sql_command, "SELECT t_refdb.refdb_id FROM t_refdb INNER JOIN t_xnote ON t_refdb.refdb_id=t_xnote.xref_id INNER JOIN t_note ON t_note.note_id=t_xnote.note_id INNER JOIN t_user ON t_note.note_user_id=t_user.user_id WHERE t_user.user_name=%s AND t_xnote.xnote_type=\'REFERENCE\' AND t_note.note_id", quoted_token); free(quoted_token); /* append operator */ if (*operator == '~') { strcpy(bitsandpieces, "="); } else if (*operator == '!' && *(operator+1) == '~') { strcpy(bitsandpieces, "!="); } else { strcpy(bitsandpieces, operator); } if ((new_sql_command = mstrcat(sql_command, bitsandpieces, &sql_command_len, 0)) == NULL) { retval = 1; break; } else { sql_command = new_sql_command; } token = sql_tokenize(newtoken, &sqltoken); newtoken = sqltoken.next_token; if (token != NULL) { if ((new_buffer = mstrncpy(buffer, token, sqltoken.length, &buffer_len)) == NULL) { retval = 1; break; } else { buffer = new_buffer; } buffer[sqltoken.length] ='\0'; if ((new_sql_command = mstrcat(sql_command, buffer, &sql_command_len, 0)) == NULL) { retval = 1; break; } else { sql_command = new_sql_command; } } LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { retval = 2; break; } if ((new_sql_command1 = mstrcat(sql_command1, "t_refdb.refdb_id IN (", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } if (dbi_result_get_numrows(dbires)) { while (dbi_result_next_row(dbires) != 0) { n_id = my_dbi_result_get_idval_idx(dbires, 1); sprintf(the_id, ULLSPEC, (unsigned long long)n_id); if ((new_sql_command1 = mstrcat(sql_command1, the_id, &sql_command1_len, 0)) == NULL) { retval = 1; dbi_result_free(dbires); break; } else { sql_command1 = new_sql_command1; } if ((new_sql_command1 = mstrcat(sql_command1, ",", &sql_command1_len, 0)) == NULL) { retval = 1; dbi_result_free(dbires); break; } else { sql_command1 = new_sql_command1; } } /* remove trailing comma */ sql_command1[strlen(sql_command1)-1] = '\0'; } else { /* use a dummy value that does not exist in the database */ if ((new_sql_command1 = mstrcat(sql_command1, "-1", &sql_command1_len, 0)) == NULL) { retval = 1; dbi_result_free(dbires); break; } else { sql_command1 = new_sql_command1; } } if ((new_sql_command1 = mstrcat(sql_command1, ")", &sql_command1_len, 0)) == NULL) { retval = 1; dbi_result_free(dbires); break; } else { sql_command1 = new_sql_command1; } dbi_result_free(dbires); } /*----------------------------------------------------------------*/ /* extended notes - note citekey */ else if (strncmp(token, ":NCK:", 5) == 0) { /* extended note citekey query */ strncpy(operator, &token[5], sqltoken.length-5); /* save the comparison operator */ operator[sqltoken.length-5] = '\0'; /* terminate string */ /* assemble a surrogate subselect query */ quoted_token = mstrdup(ptr_clrequest->username); if (!quoted_token) { retval = 1; break; } if (dbi_conn_quote_string(conn, "ed_token) == 0) { retval = 1; break; } sprintf(sql_command, "SELECT t_refdb.refdb_id FROM t_refdb INNER JOIN t_xnote ON t_refdb.refdb_id=t_xnote.xref_id INNER JOIN t_note ON t_note.note_id=t_xnote.note_id INNER JOIN t_user ON t_note.note_user_id=t_user.user_id WHERE (t_user.user_name=%s OR (t_user.user_name!=%s AND t_note.note_share!='0')) AND t_xnote.xnote_type=\'REFERENCE\' AND t_note.note_key", quoted_token, quoted_token); free(quoted_token); /* translate operator to regexp operator */ if (*operator == '=') { strcpy(bitsandpieces, " = "); } else if (*operator == '~') { sprintf(bitsandpieces, " %s ", my_dbi_conn_get_cap(conn, "rlike")); } else if (*operator == '!' && *(operator+1) == '=') { strcpy(bitsandpieces, " != "); } else { /* treat all other operators as non-equal */ sprintf(bitsandpieces, " %s ", my_dbi_conn_get_cap(conn, "not_rlike")); } if ((new_sql_command = mstrcat(sql_command, bitsandpieces, &sql_command_len, 0)) == NULL) { retval = 1; break; } else { sql_command = new_sql_command; } token = sql_tokenize(newtoken, &sqltoken); newtoken = sqltoken.next_token; if (token != NULL) { if ((new_buffer = mstrncpy(buffer, token, sqltoken.length, &buffer_len)) == NULL) { retval = 1; break; } else { buffer = new_buffer; } buffer[sqltoken.length] ='\0'; quoted_token = mstrdup(buffer); if (!quoted_token) { retval = 1; break; } if (dbi_conn_quote_string(conn, "ed_token) == 0) { retval = 1; break; } if ((new_sql_command = mstrcat(sql_command, quoted_token, &sql_command_len, 0)) == NULL) { retval = 1; free(quoted_token); break; } else { sql_command = new_sql_command; } free(quoted_token); } LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { retval = 2; break; } if ((new_sql_command1 = mstrcat(sql_command1, "t_refdb.refdb_id IN (", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } if (dbi_result_get_numrows(dbires)) { while (dbi_result_next_row(dbires) != 0) { n_id = my_dbi_result_get_idval_idx(dbires, 1); sprintf(the_id, ULLSPEC, (unsigned long long)n_id); if ((new_sql_command1 = mstrcat(sql_command1, the_id, &sql_command1_len, 0)) == NULL) { retval = 1; dbi_result_free(dbires); break; } else { sql_command1 = new_sql_command1; } if ((new_sql_command1 = mstrcat(sql_command1, ",", &sql_command1_len, 0)) == NULL) { retval = 1; dbi_result_free(dbires); break; } else { sql_command1 = new_sql_command1; } } /* remove trailing comma */ sql_command1[strlen(sql_command1)-1] = '\0'; } else { /* use a dummy value that does not exist in the database */ if ((new_sql_command1 = mstrcat(sql_command1, "-1", &sql_command1_len, 0)) == NULL) { retval = 1; dbi_result_free(dbires); break; } else { sql_command1 = new_sql_command1; } } if ((new_sql_command1 = mstrcat(sql_command1, ")", &sql_command1_len, 0)) == NULL) { retval = 1; dbi_result_free(dbires); break; } else { sql_command1 = new_sql_command1; } dbi_result_free(dbires); } /*----------------------------------------------------------------*/ /* Personal info: reprint, notes, availability */ else if (strncmp(token, ":RP:", 4) == 0 || /* reprint query */ strncmp(token, ":N1:", 4) == 0 || /* notes query */ strncmp(token, ":AV:", 4) == 0) { /* availability query */ strncpy(operator, &token[4], sqltoken.length-4); /* save the comparison operator */ operator[sqltoken.length-4] = '\0'; /* terminate string */ /* assemble a surrogate subselect query */ if (*operator == '=') { if (strncmp(token, ":RP:", 4) == 0) { strcpy(sql_command, "SELECT t_xuser.refdb_id FROM t_refdb INNER JOIN t_xuser ON t_refdb.refdb_id=t_xuser.refdb_id WHERE t_xuser.xuser_reprint = "); } else if (strncmp(token, ":N1:", 4) == 0) { strcpy(sql_command, "SELECT t_xuser.refdb_id FROM t_refdb INNER JOIN t_xuser ON t_refdb.refdb_id=t_xuser.refdb_id WHERE t_xuser.xuser_notes = "); } else { strcpy(sql_command, "SELECT t_xuser.refdb_id FROM t_refdb INNER JOIN t_xuser ON t_refdb.refdb_id=t_xuser.refdb_id WHERE t_xuser.xuser_avail = "); } } else if (*operator == '~') { if (strncmp(token, ":RP:", 4) == 0) { sprintf(sql_command, "SELECT t_xuser.refdb_id FROM t_refdb INNER JOIN t_xuser ON t_refdb.refdb_id=t_xuser.refdb_id WHERE t_xuser.xuser_reprint %s ", my_dbi_conn_get_cap(conn, "rlike")); } else if (strncmp(token, ":N1:", 4) == 0) { sprintf(sql_command, "SELECT t_xuser.refdb_id FROM t_refdb INNER JOIN t_xuser ON t_refdb.refdb_id=t_xuser.refdb_id WHERE t_xuser.xuser_notes %s ", my_dbi_conn_get_cap(conn, "rlike")); } else { sprintf(sql_command, "SELECT t_xuser.refdb_id FROM t_refdb INNER JOIN t_xuser ON t_refdb.refdb_id=t_xuser.refdb_id WHERE t_xuser.xuser_avail %s ", my_dbi_conn_get_cap(conn, "rlike")); } } else if (*operator == '!' && *(operator+1) == '=') { if (strncmp(token, ":RP:", 4) == 0) { strcpy(sql_command, "SELECT t_xuser.refdb_id FROM t_refdb INNER JOIN t_xuser ON t_refdb.refdb_id=t_xuser.refdb_id WHERE t_xuser.xuser_reprint != "); } else if (strncmp(token, ":N1:", 4) == 0) { strcpy(sql_command, "SELECT t_xuser.refdb_id FROM t_refdb INNER JOIN t_xuser ON t_refdb.refdb_id=t_xuser.refdb_id WHERE t_xuser.xuser_notes != "); } else { strcpy(sql_command, "SELECT t_xuser.refdb_id FROM t_refdb INNER JOIN t_xuser ON t_refdb.refdb_id=t_xuser.refdb_id WHERE t_xuser.xuser_avail != "); } } else { if (strncmp(token, ":RP:", 4) == 0) { sprintf(sql_command, "SELECT t_xuser.refdb_id FROM t_refdb INNER JOIN t_xuser ON t_refdb.refdb_id=t_xuser.refdb_id WHERE t_xuser.xuser_reprint %s ", my_dbi_conn_get_cap(conn, "not_rlike")); } else if (strncmp(token, ":N1:", 4) == 0) { sprintf(sql_command, "SELECT t_xuser.refdb_id FROM t_refdb INNER JOIN t_xuser ON t_refdb.refdb_id=t_xuser.refdb_id WHERE t_xuser.xuser_notes %s ", my_dbi_conn_get_cap(conn, "not_rlike")); } else { sprintf(sql_command, "SELECT t_xuser.refdb_id FROM t_refdb INNER JOIN t_xuser ON t_refdb.refdb_id=t_xuser.refdb_id WHERE t_xuser.xuser_avail %s ", my_dbi_conn_get_cap(conn, "not_rlike")); } } token = sql_tokenize(newtoken, &sqltoken); newtoken = sqltoken.next_token; if (token != NULL) { if ((new_buffer = mstrncpy(buffer, token, sqltoken.length, &buffer_len)) == NULL) { retval = 1; break; } else { buffer = new_buffer; } buffer[sqltoken.length] ='\0'; quoted_token = mstrdup(buffer); if (!quoted_token) { retval = 1; break; } if (dbi_conn_quote_string(conn, "ed_token) == 0) { retval = 1; break; } if ((new_sql_command = mstrcat(sql_command, quoted_token, &sql_command_len, 0)) == NULL) { retval = 1; free(quoted_token); break; } else { sql_command = new_sql_command; } free(quoted_token); } LOG_PRINT(LOG_DEBUG, sql_command); /* dbires will contain a list of all refdb_ids that match the above publication subquery */ dbires = dbi_conn_query(conn, sql_command); if (!dbires) { retval = 2; break; } if ((new_sql_command1 = mstrcat(sql_command1, "t_refdb.refdb_id IN (", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } n_havesome = 0; while (dbi_result_next_row(dbires) != 0) { n_havesome = 1; n_id = my_dbi_result_get_idval_idx(dbires, 1); sprintf(the_id, ULLSPEC, (unsigned long long)n_id); if ((new_sql_command1 = mstrcat(sql_command1, the_id, &sql_command1_len, 0)) == NULL) { retval = 1; dbi_result_free(dbires); break; } else { sql_command1 = new_sql_command1; } if ((new_sql_command1 = mstrcat(sql_command1, ",", &sql_command1_len, 0)) == NULL) { retval = 1; dbi_result_free(dbires); break; } else { sql_command1 = new_sql_command1; } } if (!n_havesome) { /* use a dummy value that does not exist in the database */ if ((new_sql_command1 = mstrcat(sql_command1, "-1,", &sql_command1_len, 0)) == NULL) { /* trailing comma will be overwritten below */ retval = 1; dbi_result_free(dbires); break; } else { sql_command1 = new_sql_command1; } } dbi_result_free(dbires); if (retval) { break; } if ((new_sql_command1 = mstrcat(sql_command1, ")", &sql_command1_len, 1)) == NULL) { /* overwrites trailing comma */ retval = 1; break; } else { sql_command1 = new_sql_command1; } } /*----------------------------------------------------------------*/ /* simple queries */ else { /* all simple t_refdb queries */ strncpy(operator, &token[4], sqltoken.length-4); /* save the comparison operator */ operator[sqltoken.length-4] = '\0'; /* terminate string */ /* initialize alphanumeric indicator */ n_isalpha = 1; if (strncmp(token, ":TY:", 4) == 0) { if ((new_sql_command1 = mstrcat(sql_command1, "t_refdb.refdb_type", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } else if (strncmp(token, ":PY:", 4) == 0) { if ((new_sql_command1 = mstrcat(sql_command1, "t_refdb.refdb_pubyear", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; n_isalpha = 0; } } else if (strncmp(token, ":Y2:", 4) == 0) { if ((new_sql_command1 = mstrcat(sql_command1, "t_refdb.refdb_secyear", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; n_isalpha = 0; } } else if (strncmp(token, ":ID:", 4) == 0) { if ((new_sql_command1 = mstrcat(sql_command1, "t_refdb.refdb_id", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; n_isalpha = 0; } } else if (strncmp(token, ":CK:", 4) == 0) { if ((new_sql_command1 = mstrcat(sql_command1, "t_refdb.refdb_citekey", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } else if (strncmp(token, ":TI:", 4) == 0) { if ((new_sql_command1 = mstrcat(sql_command1, "t_refdb.refdb_title", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } else if (strncmp(token, ":T2:", 4) == 0) { if ((new_sql_command1 = mstrcat(sql_command1, "t_refdb.refdb_booktitle", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } else if (strncmp(token, ":T3:", 4) == 0) { if ((new_sql_command1 = mstrcat(sql_command1, "t_refdb.refdb_title_series", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } else if (strncmp(token, ":SN:", 4) == 0) { if ((new_sql_command1 = mstrcat(sql_command1, "t_refdb.refdb_issn", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } else if (strncmp(token, ":N2:", 4) == 0) { if ((new_sql_command1 = mstrcat(sql_command1, "t_refdb.refdb_abstract", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } else if (strncmp(token, ":SP:", 4) == 0) { if ((new_sql_command1 = mstrcat(sql_command1, "t_refdb.refdb_startpage", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } else if (strncmp(token, ":EP:", 4) == 0) { if ((new_sql_command1 = mstrcat(sql_command1, "t_refdb.refdb_endpage", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } else if (strncmp(token, ":VL:", 4) == 0) { if ((new_sql_command1 = mstrcat(sql_command1, "t_refdb.refdb_volume", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } else if (strncmp(token, ":IS:", 4) == 0) { if ((new_sql_command1 = mstrcat(sql_command1, "t_refdb.refdb_issue", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } else if (strncmp(token, ":AD:", 4) == 0) { if ((new_sql_command1 = mstrcat(sql_command1, "t_refdb.refdb_address", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } else if (strncmp(token, ":CY:", 4) == 0) { if ((new_sql_command1 = mstrcat(sql_command1, "t_refdb.refdb_city", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } else if (strncmp(token, ":PB:", 4) == 0) { if ((new_sql_command1 = mstrcat(sql_command1, "t_refdb.refdb_publisher", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } else if (strncmp(token, ":U1:", 4) == 0) { if ((new_sql_command1 = mstrcat(sql_command1, "t_refdb.refdb_user1", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } else if (strncmp(token, ":U2:", 4) == 0) { if ((new_sql_command1 = mstrcat(sql_command1, "t_refdb.refdb_user2", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } else if (strncmp(token, ":U3:", 4) == 0) { if ((new_sql_command1 = mstrcat(sql_command1, "t_refdb.refdb_user3", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } else if (strncmp(token, ":U4:", 4) == 0) { if ((new_sql_command1 = mstrcat(sql_command1, "t_refdb.refdb_user4", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } else if (strncmp(token, ":U5:", 4) == 0) { if ((new_sql_command1 = mstrcat(sql_command1, "t_refdb.refdb_user5", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } /* TO typeofwork AR area OS ostype DG degree RT runningtime CI classcodeintl CU classcodeus SE senderemail RE recipientemail MT mediatype NV numvolumes EI edition CO computer CF conferencelocation RN registrynum CL classification SC section PN pamphletnum CN chapternum */ else if (strncmp(token, ":TO:", 4) == 0) { if ((new_sql_command1 = mstrcat(sql_command1, "t_refdb.refdb_typeofwork", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } else if (strncmp(token, ":AR:", 4) == 0) { if ((new_sql_command1 = mstrcat(sql_command1, "t_refdb.refdb_area", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } else if (strncmp(token, ":OS:", 4) == 0) { if ((new_sql_command1 = mstrcat(sql_command1, "t_refdb.refdb_ostype", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } else if (strncmp(token, ":DG:", 4) == 0) { if ((new_sql_command1 = mstrcat(sql_command1, "t_refdb.refdb_degree", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } else if (strncmp(token, ":RT:", 4) == 0) { if ((new_sql_command1 = mstrcat(sql_command1, "t_refdb.refdb_runningtime", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } else if (strncmp(token, ":CI:", 4) == 0) { if ((new_sql_command1 = mstrcat(sql_command1, "t_refdb.refdb_classcodeintl", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } else if (strncmp(token, ":CU:", 4) == 0) { if ((new_sql_command1 = mstrcat(sql_command1, "t_refdb.refdb_classcodeus", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } else if (strncmp(token, ":SE:", 4) == 0) { if ((new_sql_command1 = mstrcat(sql_command1, "t_refdb.refdb_senderemail", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } else if (strncmp(token, ":RE:", 4) == 0) { if ((new_sql_command1 = mstrcat(sql_command1, "t_refdb.refdb_recipientemail", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } else if (strncmp(token, ":MT:", 4) == 0) { if ((new_sql_command1 = mstrcat(sql_command1, "t_refdb.refdb_mediatype", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } else if (strncmp(token, ":NV:", 4) == 0) { if ((new_sql_command1 = mstrcat(sql_command1, "t_refdb.refdb_numvolumes", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } else if (strncmp(token, ":EI:", 4) == 0) { if ((new_sql_command1 = mstrcat(sql_command1, "t_refdb.refdb_edition", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } else if (strncmp(token, ":CO:", 4) == 0) { if ((new_sql_command1 = mstrcat(sql_command1, "t_refdb.refdb_computer", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } else if (strncmp(token, ":CF:", 4) == 0) { if ((new_sql_command1 = mstrcat(sql_command1, "t_refdb.refdb_conferencelocation", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } else if (strncmp(token, ":RN:", 4) == 0) { if ((new_sql_command1 = mstrcat(sql_command1, "t_refdb.refdb_registrynum", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } else if (strncmp(token, ":CL:", 4) == 0) { if ((new_sql_command1 = mstrcat(sql_command1, "t_refdb.refdb_classification", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } else if (strncmp(token, ":SC:", 4) == 0) { if ((new_sql_command1 = mstrcat(sql_command1, "t_refdb.refdb_section", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } else if (strncmp(token, ":PN:", 4) == 0) { if ((new_sql_command1 = mstrcat(sql_command1, "t_refdb.refdb_pamphletnum", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } else if (strncmp(token, ":CN:", 4) == 0) { if ((new_sql_command1 = mstrcat(sql_command1, "t_refdb.refdb_chapternum", &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } /* we have to treat two types of columns: numerical columns can reuse the operator directly. Alphanumeric columns need some intelligent translation into a regexp-based query */ if (n_isalpha) { if (*operator == '=') { strcpy(bitsandpieces, " = "); } else if (*operator == '~') { sprintf(bitsandpieces, " %s ", my_dbi_conn_get_cap(conn, "rlike")); } else if (*operator == '!' && *(operator+1) == '=') { sprintf(bitsandpieces, " != "); } else { /* treat all other operators as non-equal */ sprintf(bitsandpieces, " %s ", my_dbi_conn_get_cap(conn, "not_rlike")); } if ((new_sql_command1 = mstrcat(sql_command1, bitsandpieces, &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } else { if ((new_sql_command1 = mstrcat(sql_command1, operator, &sql_command1_len, 0)) == NULL) { retval = 1; break; } else { sql_command1 = new_sql_command1; } } token = sql_tokenize(newtoken, &sqltoken); newtoken = sqltoken.next_token; if (token != NULL) { /* printf("%s:%d\n", token, retval); */ /* printf("%s\n", newtoken); */ if ((new_buffer = mstrncpy(buffer, token, sqltoken.length, &buffer_len)) == NULL) { retval = 1; break; } else { buffer = new_buffer; } buffer[sqltoken.length] ='\0'; quoted_token = mstrdup(buffer); if (!quoted_token) { retval = 1; break; } if (dbi_conn_quote_string(conn, "ed_token) == 0) { retval = 1; break; } if ((new_sql_command1 = mstrcat(sql_command1, quoted_token, &sql_command1_len, 0)) == NULL) { retval = 1; free(quoted_token); break; } else { sql_command1 = new_sql_command1; } free(quoted_token); } } } /* if (sqltoken.type != 4) / else */ } /* if (token != NULL) */ } /* while (newtoken != NULL) */ if (retval) { if (retval == 1) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); } else if (retval == 2) { send_status(ptr_clrequest->fd, 234, TERM_NO); LOG_PRINT(LOG_WARNING, get_status_msg(234)); } /* printf("retval detected\n"); */ dbi_conn_close(conn); delete_all_lilimem(&sentinel); if (conv_descriptor) { iconv_close(conv_descriptor); } return 1; } /* now assemble the SQL query string proper */ /* printf("assembling query\n"); */ /* 0 refdb_id ID - (if numeric) 1 refdb_type TY - 2 refdb_pubyear PY - (partial) 3 refdb_startpage SP - 4 refdb_endpage EP - 5 refdb_abstract N2 - 6 refdb_title TI - 7 refdb_volume VL - 8 refdb_issue CP - 9 refdb_booktitle BT - 10 refdb_city CY - 11 refdb_publisher PB - 12 refdb_title_series T3 - 13 refdb_address AD - 14 refdb_issn SN - 15 refdb_periodical_id JO - (indirect) 16 refdb_pyother_info PY - (partial) 17 refdb_secyear Y2 - (partial) 18 refdb_secother_info Y2 - (partial) 19 refdb_user1 U1 - 20 refdb_user2 U2 - 21 refdb_user3 U3 - 22 refdb_user4 U4 - 23 refdb_user5 U5 - 24 refdb_typeofwork .. - 25 refdb_area .. - 26 refdb_ostype .. - 27 refdb_degree .. - 28 refdb_runningtime .. - 29 refdb_classcodeintl .. - 30 refdb_classcodeus .. - 31 refdb_senderemail .. - 32 refdb_recipientemail .. - 33 refdb_mediatype .. - 34 refdb_numvolumes .. - 35 refdb_edition .. - 36 refdb_computer .. - 37 refdb_conferencelocation .. - 38 refdb_registrynum .. - 39 refdb_classification .. - 40 refdb_section .. - 41 refdb_pamphletnum .. - 42 refdb_chapternum .. - 43 refdb_citekey ID - (if non-numeric) */ if (*(ptr_clrequest->listname)) { /* have to query t_note and t_xnote as well */ strcpy(sql_command, "SELECT DISTINCT t_refdb.refdb_id, t_refdb.refdb_type, t_refdb.refdb_pubyear, t_refdb.refdb_startpage, t_refdb.refdb_endpage, t_refdb.refdb_abstract, t_refdb.refdb_title, t_refdb.refdb_volume, t_refdb.refdb_issue, t_refdb.refdb_booktitle, t_refdb.refdb_city, t_refdb.refdb_publisher, t_refdb.refdb_title_series, t_refdb.refdb_address, t_refdb.refdb_issn, t_refdb.refdb_periodical_id, t_refdb.refdb_pyother_info, t_refdb.refdb_secyear, t_refdb.refdb_secother_info, t_refdb.refdb_user1, t_refdb.refdb_user2, t_refdb.refdb_user3, t_refdb.refdb_user4, t_refdb.refdb_user5, t_refdb.refdb_typeofwork, t_refdb.refdb_area, t_refdb.refdb_ostype, t_refdb.refdb_degree, t_refdb.refdb_runningtime, t_refdb.refdb_classcodeintl, t_refdb.refdb_classcodeus, t_refdb.refdb_senderemail, t_refdb.refdb_recipientemail, t_refdb.refdb_mediatype, t_refdb.refdb_numvolumes, t_refdb.refdb_edition, t_refdb.refdb_computer, t_refdb.refdb_conferencelocation, t_refdb.refdb_registrynum, t_refdb.refdb_classification, t_refdb.refdb_section, t_refdb.refdb_pamphletnum, t_refdb.refdb_chapternum, t_refdb.refdb_citekey FROM t_refdb INNER JOIN t_xnote ON t_refdb.refdb_id=t_xnote.xref_id INNER JOIN t_note ON t_xnote.note_id=t_note.note_id WHERE "); } else { /* have to query only t_refdb */ strcpy(sql_command, "SELECT DISTINCT t_refdb.refdb_id, t_refdb.refdb_type, t_refdb.refdb_pubyear, t_refdb.refdb_startpage, t_refdb.refdb_endpage, t_refdb.refdb_abstract, t_refdb.refdb_title, t_refdb.refdb_volume, t_refdb.refdb_issue, t_refdb.refdb_booktitle, t_refdb.refdb_city, t_refdb.refdb_publisher, t_refdb.refdb_title_series, t_refdb.refdb_address, t_refdb.refdb_issn, t_refdb.refdb_periodical_id, t_refdb.refdb_pyother_info, t_refdb.refdb_secyear, t_refdb.refdb_secother_info, t_refdb.refdb_user1, t_refdb.refdb_user2, t_refdb.refdb_user3, t_refdb.refdb_user4, t_refdb.refdb_user5, t_refdb.refdb_typeofwork, t_refdb.refdb_area, t_refdb.refdb_ostype, t_refdb.refdb_degree, t_refdb.refdb_runningtime, t_refdb.refdb_classcodeintl, t_refdb.refdb_classcodeus, t_refdb.refdb_senderemail, t_refdb.refdb_recipientemail, t_refdb.refdb_mediatype, t_refdb.refdb_numvolumes, t_refdb.refdb_edition, t_refdb.refdb_computer, t_refdb.refdb_conferencelocation, t_refdb.refdb_registrynum, t_refdb.refdb_classification, t_refdb.refdb_section, t_refdb.refdb_pamphletnum, t_refdb.refdb_chapternum, t_refdb.refdb_citekey FROM t_refdb WHERE "); } if (ref_format != 1 || !strstr(ptr_biblio_info->format_string, "NOHOLES")) { if ((new_sql_command = mstrcat(sql_command, "refdb_type!='DUMMY' AND ", &sql_command_len, 0)) == NULL) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); dbi_conn_close(conn); delete_all_lilimem(&sentinel); if (conv_descriptor) { iconv_close(conv_descriptor); } return 1; } else { sql_command = new_sql_command; } } if ((new_sql_command = mstrcat(sql_command, sql_command1, &sql_command_len, 0)) == NULL) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); dbi_conn_close(conn); delete_all_lilimem(&sentinel); if (conv_descriptor) { iconv_close(conv_descriptor); } return 1; } else { sql_command = new_sql_command; } /* see whether we need a personal reference list instead of the whole list */ if (*(ptr_clrequest->listname)) { char *quoted_listname; quoted_listname = strdup(ptr_clrequest->listname); if (!quoted_listname || !dbi_conn_quote_string(conn, "ed_listname)) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); dbi_result_free(dbires); dbi_conn_close(conn); delete_all_lilimem(&sentinel); if (conv_descriptor) { iconv_close(conv_descriptor); } return 1; } sprintf(bitsandpieces, " AND t_xnote.xnote_type='REFERENCE' AND t_note.note_key=%s", quoted_listname); if ((new_sql_command = mstrcat(sql_command, bitsandpieces, &sql_command_len, 0)) == NULL) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); dbi_result_free(dbires); dbi_conn_close(conn); delete_all_lilimem(&sentinel); if (conv_descriptor) { iconv_close(conv_descriptor); } return 1; } else { sql_command = new_sql_command; } } /* sort the output */ if (strncmp(ptr_biblio_info->sort_string, "PY", 2) == 0) { if (retval || ((new_sql_command = mstrcat(sql_command, " ORDER BY t_refdb.refdb_pubyear", &sql_command_len, 0)) == NULL)) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); dbi_conn_close(conn); delete_all_lilimem(&sentinel); if (conv_descriptor) { iconv_close(conv_descriptor); } return 1; } else { sql_command = new_sql_command; } } else { if (retval || ((new_sql_command = mstrcat(sql_command, " ORDER BY t_refdb.refdb_id", &sql_command_len, 0)) == NULL)) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); dbi_conn_close(conn); delete_all_lilimem(&sentinel); if (conv_descriptor) { iconv_close(conv_descriptor); } return 1; } else { sql_command = new_sql_command; } } /* see whether the query should be limited to a range */ if (*(ptr_clrequest->limit)) { char *colon; colon = strchr(ptr_clrequest->limit, (int)':'); if (!colon) { snprintf(limitstring, 128, " LIMIT %s ", ptr_clrequest->limit); } else { *colon = '\0'; snprintf(limitstring, 128, " LIMIT %s OFFSET %s ", ptr_clrequest->limit, colon+1); } if ((new_sql_command = mstrcat(sql_command, limitstring, &sql_command_len, 0)) == NULL) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); dbi_conn_close(conn); delete_all_lilimem(&sentinel); if (conv_descriptor) { iconv_close(conv_descriptor); } return 1; } else { sql_command = new_sql_command; } } LOG_PRINT(LOG_DEBUG, sql_command); /* actually run the query */ rendinfo.dbires = dbi_conn_query(conn, sql_command); if (!rendinfo.dbires) { send_status(ptr_clrequest->fd, 234, TERM_NO); LOG_PRINT(LOG_WARNING, get_status_msg(234)); dbi_conn_close(conn); delete_all_lilimem(&sentinel); if (conv_descriptor) { iconv_close(conv_descriptor); } return 1; } numrows = dbi_result_get_numrows(rendinfo.dbires); if (!send_data) { /* countref */ ptr_addresult->success = numrows; dbi_result_free(rendinfo.dbires); dbi_conn_close(conn); delete_all_lilimem(&sentinel); send_status(ptr_clrequest->fd, 402, TERM_YES); return retval; } /* else: getref */ /* create a "header" if necessary */ /* prepare_render resets sql_command */ /* fill in variable elements of structure */ rendinfo.ptr_ref = &sql_command; rendinfo.ptr_ref_len = &sql_command_len; if (!*(rendinfo.ptr_biblio_info->encoding)) { rendinfo.ptr_biblio_info->encoding = dbi_conn_get_encoding(conn); } /* real output starts here */ if (prepare_render(&rendinfo)) { send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); dbi_result_free(rendinfo.dbires); dbi_conn_close(conn); delete_all_lilimem(&sentinel); if (conv_descriptor) { iconv_close(conv_descriptor); } return 1; } if (numrows) { int chunksize; /* number of refs grouped together before sending */ /* we use a larger chunksize for queries intended to retrieve ID lists (done by -t ris -s ID) as the returned documents are tiny, and a smaller one for other queries as we might run into swapping */ if (!strcmp(rendinfo.ptr_biblio_info->format_string, "ID") && ref_format == REFRIS) { chunksize = 100; } else { chunksize = 10; } /* fetch all articles we're interested in */ while (dbi_result_next_row(rendinfo.dbires) != 0) { nref_counter++; /* fill in variable elements of structure */ rendinfo.ptr_ref = &sql_command; rendinfo.ptr_ref_len = &sql_command_len; rendinfo.nref_counter = nref_counter; /* todo: count query errors and such as failed datasets, bail out only after irrecoverable errors */ if ((render_res = render_ref(&rendinfo)) != 0) { if (render_res == 801) { retval = 1; send_status(ptr_clrequest->fd, render_res, TERM_NO); dbi_result_free(rendinfo.dbires); dbi_conn_close(conn); delete_all_lilimem(&sentinel); if (conv_descriptor) { iconv_close(conv_descriptor); } return 0; } else { ptr_addresult->failure++; } } /* run a character encoding conversion if required */ if (conv_descriptor && *sql_command) { size_t inlength; size_t outlength; char* my_sql_command = NULL; /* this ptr will be modified by iconv() */ char* my_sql_command_start = NULL; /* records initial state of my_elvalue */ const char* my_instring = NULL; /* this ptr will be modified by iconv() */ /* strlen should be ok here as this can't be a multibyte encoding */ inlength = strlen(sql_command)/* + 1 */; /* with the encodings supported by our database engines, the converted string can't be longer than six times the input string */ /* todo: is this assumption correct? */ outlength = 6*inlength; if ((my_sql_command = (char*)calloc(outlength, sizeof(char))) == NULL) { retval = 1; send_status(ptr_clrequest->fd, 801, TERM_NO); LOG_PRINT(LOG_CRIT, get_status_msg(801)); dbi_result_free(rendinfo.dbires); dbi_conn_close(conn); delete_all_lilimem(&sentinel); if (conv_descriptor) { iconv_close(conv_descriptor); } return 0; } /* keep start of the converted string */ my_sql_command_start = my_sql_command; /* variable will be modified by iconv, so don't use original */ my_instring = (const char*)sql_command; /* now actually do the conversion */ if (iconv(conv_descriptor, &my_instring, &inlength, &my_sql_command, &outlength) == (size_t)(-1)) { if (errno == EILSEQ) { LOG_PRINT(LOG_WARNING, "iconv: invalid input character sequence"); } else if (errno == E2BIG) { LOG_PRINT(LOG_WARNING, "iconv: output buffer too small"); } else if (errno == EINVAL) { LOG_PRINT(LOG_WARNING, "iconv: incomplete input character"); } retval = 1; send_status(ptr_clrequest->fd, 702, TERM_NO); dbi_result_free(rendinfo.dbires); dbi_conn_close(conn); delete_all_lilimem(&sentinel); if (conv_descriptor) { iconv_close(conv_descriptor); } return 0; } /* else: conversion went ok. We free the original string and replace it with the converted copy */ if (sql_command) { free(sql_command); } sql_command = my_sql_command_start; sql_command_len = outlength; result_len = (size_t)(my_sql_command - my_sql_command_start); } else { /* no conversion required */ result_len = strlen(sql_command); } ptr_addresult->success++; if (nref_counter % chunksize == 0) { /* send ok status, then the terminated result string */ send_status(ptr_clrequest->fd, 404, TERM_NO); iwrite(ptr_clrequest->fd, sql_command, result_len); iwrite(ptr_clrequest->fd, cs_term, TERM_LEN); /* reset buffer string */ sql_command[0] = '\0'; /* read client response */ cs_status = read_status(ptr_clrequest->fd); if (cs_status) { break; } } } /* end while */ /* send remaining data */ if (nref_counter % chunksize != 0) { /* send ok status, then the terminated result string */ send_status(ptr_clrequest->fd, 404, TERM_NO); iwrite(ptr_clrequest->fd, sql_command, result_len); iwrite(ptr_clrequest->fd, cs_term, TERM_LEN); /* reset buffer string */ sql_command[0] = '\0'; /* read client response */ cs_status = read_status(ptr_clrequest->fd); } } else { /* no datasets, return an empty body */ send_status(ptr_clrequest->fd, 402, TERM_NO); iwrite(ptr_clrequest->fd, cs_term, TERM_LEN); } if (conv_descriptor) { iconv_close(conv_descriptor); } if (ptr_addresult->success) { /* create a "footer" if necessary */ /* fill in variable elements of structure */ /* rendinfo.ptr_ref = &sql_command; */ /* rendinfo.ptr_ref_len = &sql_command_len; */ if ((render_res = finish_render(&rendinfo)) != 0) { retval = 1; send_status(ptr_clrequest->fd, 801, TERM_NO); dbi_result_free(rendinfo.dbires); dbi_conn_close(conn); delete_all_lilimem(&sentinel); return 0; } send_status(ptr_clrequest->fd, 402, TERM_NO); tiwrite(ptr_clrequest->fd, sql_command, TERM_YES); } dbi_result_free(rendinfo.dbires); dbi_conn_close(conn); delete_all_lilimem(&sentinel); return retval; } refdb-1.0.2/src/refdbdgetrefx.c000644 001750 001750 00000056100 12255427652 017224 0ustar00markusmarkus000000 000000 /*++++++++++++++++++++ refdbdgetrefx.c: refdb getrefx-related functions markus@mhoenicka.de 2007-09-08 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, see +++++++++++++++++++++++++*/ #include #include #include #include /* priority level definitions */ #include #include #include #include "linklist.h" #include "refdb.h" #include "backend.h" #include "refdbd.h" /* depends on backend.h */ #include "strfncs.h" #include "tokenize.h" #include "dbfncs.h" #include "connect.h" #include "refdbdgetrefx.h" #include "writeris.h" #include "xmlhandler.h" /* some globals */ extern int n_log_level; /* numeric version of log_level */ extern char cs_term[]; /* todo: steal xml reading code from getbib, write handler for citationlistx data which creates a linked list with unique ID values, assemble query from that list */ /* prototypes of local functions */ static char* build_citekey_list(Lilifstring* ptr_first, char** ptr_buffer, size_t* ptr_buffer_len, dbi_conn conn); /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ getrefx(): implements the client command getrefx int getrefx returns 0 = no error, 1 = out of memory or db open error, 2 = subselect failed struct CLIENT_REQUEST* ptr_clrequest ptr to structure with client info struct bibinfo *ptr_biblio_info ptr to structure holding bibliography style int ref_format the output format 0 = simple screen rendering, 1 = RIS format, 2 = DocBook format, 3 = BibTeX format, 4 = HTML 10 = RISX 11 = XHTML int n_privatelist if set to 1, limit search to user's private list if set to 0, search all struct ADDRESULT* ptr_addresult ptr to result counter structure ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int getrefx(struct CLIENT_REQUEST* ptr_clrequest, struct bibinfo *ptr_biblio_info, int ref_format, int n_privatelist, struct ADDRESULT* ptr_addresult) { dbi_conn conn; dbi_result dbires = NULL; dbi_driver driver; int render_res; int cs_status; int retval = 0; int citation_count; /* counter for citations in id handler */ int xref_count; /* counter for xrefs in id handler */ int nmem_error; int ndb_error; int n_client_status; unsigned long long nref_counter = 0; unsigned long long numrows = 0; size_t sql_command_len; size_t sql_command1_len; size_t result_len; size_t curr_multi_id_len; char *sql_command; /* these are ptrs to the buffers and temporary ptrs */ char *new_sql_command; char *sql_command1; char *myjournal = NULL; char table_name[] = "getbibtemp"; char *curr_multi_id = NULL; const char* db_encoding; const char *sql_errmsg = NULL; char limitstring[128] = ""; struct lilimem sentinel; struct renderinfo rendinfo; struct getbib_data gbdata; struct simple_elstack *ptr_sfirst = NULL; /* start of the simple element stack */ Lilifstring notfound_first; Lilifstring found_first; XML_Parser p; iconv_t conv_descriptor; sentinel.ptr_mem = NULL; sentinel.ptr_next = NULL; sentinel.varname[0] = '\0'; notfound_first.ptr_next = NULL; *(notfound_first.token) = '\0'; found_first.ptr_next = NULL; *(found_first.token) = '\0'; /* fill in invariant elements of structure */ rendinfo.ptr_biblio_info = ptr_biblio_info; rendinfo.ref_format = ref_format; rendinfo.nuse_citestyle = 0; rendinfo.dbname = NULL; /* todo: remove the redundance */ rendinfo.database = ptr_clrequest->current_db; rendinfo.username = ptr_clrequest->username; rendinfo.pdfroot = ptr_clrequest->pdfroot; rendinfo.cgi_url = ptr_clrequest->cgi_url; rendinfo.ptr_clrequest = ptr_clrequest; rendinfo.javascript = 0; /* get buffer to assemble the SQL queries */ sql_command_len = 4096; sql_command = malloc(sql_command_len); if (sql_command == NULL || insert_lilimem(&sentinel, (void**)&sql_command, NULL)) { delete_all_lilimem(&sentinel); send_status(ptr_clrequest->fd, 801, TERM_NO); /* send step 2 */ LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } sql_command[0] = '\0'; /* start with an empty string */ /* get another buffer to assemble the SQL queries */ sql_command1_len = 4096; sql_command1 = malloc(sql_command1_len); if (sql_command1 == NULL || insert_lilimem(&sentinel, (void**)&sql_command1, NULL)) { delete_all_lilimem(&sentinel); send_status(ptr_clrequest->fd, 801, TERM_NO); /* send step 2 */ LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 1; } sql_command1[0] = '\0'; /* start with an empty string */ /* initialize "globals" */ nmem_error = 0; ndb_error = 0; ptr_sfirst = NULL; citation_count = 0; xref_count = 0; /* create the parser instance */ p = XML_ParserCreate(NULL); if (!p) { send_status(ptr_clrequest->fd, 801, TERM_NO); /* send step 2 */ LOG_PRINT(LOG_CRIT, get_status_msg(801)); delete_all_lilimem(&sentinel); return 1; } /* register our handlers. these handlers will be called whenever expat finds a start- or endtag or character data */ XML_SetElementHandler(p, idraw_start_handler, idraw_end_handler); XML_SetCharacterDataHandler(p, idraw_char_handler); /* connect to the database */ if ((conn = connect_to_db(ptr_clrequest, NULL, 0)) == NULL) { send_status(ptr_clrequest->fd, 204, TERM_NO); /* send step 2 */ LOG_PRINT(LOG_WARNING, get_status_msg(204)); delete_all_lilimem(&sentinel); return 1; } driver = dbi_conn_get_driver(conn); /* get the database encoding */ db_encoding = dbi_conn_get_encoding(conn); /* if we need to convert, create a conversion descriptor for iconv() */ if (db_encoding && *(ptr_biblio_info->encoding) && strcmp(db_encoding, ptr_biblio_info->encoding)) { char to_encoding[64]; if (!strcmp(ptr_biblio_info->encoding, "US-ASCII")) { strcpy(to_encoding, "ASCII//TRANSLIT"); } else { snprintf(to_encoding, 64, "%s//TRANSLIT", ptr_biblio_info->encoding); } conv_descriptor = iconv_open(to_encoding, !strcmp(db_encoding, "US-ASCII") ? "ASCII" : db_encoding); if (conv_descriptor == (iconv_t)(-1)) { LOG_PRINT(LOG_WARNING, "cannot set conversion descriptor (database/output):"); LOG_PRINT(LOG_DEBUG, db_encoding); LOG_PRINT(LOG_DEBUG, ptr_biblio_info->encoding); send_status(ptr_clrequest->fd, 701, TERM_NO); /* send step 2 */ LOG_PRINT(LOG_WARNING, get_status_msg(701)); delete_all_lilimem(&sentinel); return 1; } else { LOG_PRINT(LOG_DEBUG, "database encoding is:"); LOG_PRINT(LOG_DEBUG, db_encoding); } } else { conv_descriptor = NULL; LOG_PRINT(LOG_DEBUG, "no character encoding conversion required"); } LOG_PRINT(LOG_DEBUG, "output encoding is:"); if (*(ptr_biblio_info->encoding)) { LOG_PRINT(LOG_DEBUG, ptr_biblio_info->encoding); } else { LOG_PRINT(LOG_DEBUG, db_encoding); } /* make data available for handlers */ gbdata.ptr_default_db = ptr_clrequest->current_db; gbdata.conn = conn; /* connection to the reference db */ gbdata.conn_refdb = NULL; /* not used here */ gbdata.ptr_citation_count = &citation_count; gbdata.ptr_xref_count = &xref_count; gbdata.ptr_table_name = table_name; gbdata.ptr_curr_multi_id = curr_multi_id; gbdata.quoted_journal = myjournal; gbdata.ptr_cmid_len = &curr_multi_id_len; gbdata.ptr_sfirst = ptr_sfirst; gbdata.ptr_nmem_error = &nmem_error; gbdata.ptr_ndb_error = &ndb_error; gbdata.ptr_ndb_notfound = &(ptr_addresult->skipped); gbdata.ptr_clrequest = ptr_clrequest; gbdata.ptr_notfound_first = ¬found_first; gbdata.ptr_found_first = &found_first; XML_SetUserData(p, (void*)&gbdata); /* tell client that we're ready for XML data */ send_status(ptr_clrequest->fd, 0, TERM_NO); /* send step 2 */ /* read XML data from client */ /* corresponds to steps 3 to 6 */ if (!read_xml(ptr_clrequest->fd, p, ptr_addresult)) { /* error */ dbi_conn_error(conn, &sql_errmsg); LOG_PRINT(LOG_WARNING, (char*)sql_errmsg); delete_idlist(ptr_sfirst); retval = 1; goto Finish; } else if (nmem_error) { retval = 1; goto Finish; } else if (ndb_error) { dbi_conn_error(conn, &sql_errmsg); LOG_PRINT(LOG_WARNING, (char*)sql_errmsg); retval = 1; goto Finish; } n_client_status = read_status(ptr_clrequest->fd); /* read step 7 */ /* printf("done reading client status after transmitting xml data, now preparing to send output\n"); */ if (n_client_status != 0) { LOG_PRINT(LOG_INFO, get_status_msg(112)); retval = 1; goto Finish; } /* now assemble the SQL query string proper */ /* printf("assembling query\n"); */ /* 0 refdb_id ID - (if numeric) 1 refdb_type TY - 2 refdb_pubyear PY - (partial) 3 refdb_startpage SP - 4 refdb_endpage EP - 5 refdb_abstract N2 - 6 refdb_title TI - 7 refdb_volume VL - 8 refdb_issue CP - 9 refdb_booktitle BT - 10 refdb_city CY - 11 refdb_publisher PB - 12 refdb_title_series T3 - 13 refdb_address AD - 14 refdb_issn SN - 15 refdb_periodical_id JO - (indirect) 16 refdb_pyother_info PY - (partial) 17 refdb_secyear Y2 - (partial) 18 refdb_secother_info Y2 - (partial) 19 refdb_user1 U1 - 20 refdb_user2 U2 - 21 refdb_user3 U3 - 22 refdb_user4 U4 - 23 refdb_user5 U5 - 24 refdb_typeofwork .. - 25 refdb_area .. - 26 refdb_ostype .. - 27 refdb_degree .. - 28 refdb_runningtime .. - 29 refdb_classcodeintl .. - 30 refdb_classcodeus .. - 31 refdb_senderemail .. - 32 refdb_recipientemail .. - 33 refdb_mediatype .. - 34 refdb_numvolumes .. - 35 refdb_edition .. - 36 refdb_computer .. - 37 refdb_conferencelocation .. - 38 refdb_registrynum .. - 39 refdb_classification .. - 40 refdb_section .. - 41 refdb_pamphletnum .. - 42 refdb_chapternum .. - 43 refdb_citekey ID - (if non-numeric) */ strcpy(sql_command, "SELECT DISTINCT t_refdb.refdb_id, t_refdb.refdb_type, t_refdb.refdb_pubyear, t_refdb.refdb_startpage, t_refdb.refdb_endpage, t_refdb.refdb_abstract, t_refdb.refdb_title, t_refdb.refdb_volume, t_refdb.refdb_issue, t_refdb.refdb_booktitle, t_refdb.refdb_city, t_refdb.refdb_publisher, t_refdb.refdb_title_series, t_refdb.refdb_address, t_refdb.refdb_issn, t_refdb.refdb_periodical_id, t_refdb.refdb_pyother_info, t_refdb.refdb_secyear, t_refdb.refdb_secother_info, t_refdb.refdb_user1, t_refdb.refdb_user2, t_refdb.refdb_user3, t_refdb.refdb_user4, t_refdb.refdb_user5, t_refdb.refdb_typeofwork, t_refdb.refdb_area, t_refdb.refdb_ostype, t_refdb.refdb_degree, t_refdb.refdb_runningtime, t_refdb.refdb_classcodeintl, t_refdb.refdb_classcodeus, t_refdb.refdb_senderemail, t_refdb.refdb_recipientemail, t_refdb.refdb_mediatype, t_refdb.refdb_numvolumes, t_refdb.refdb_edition, t_refdb.refdb_computer, t_refdb.refdb_conferencelocation, t_refdb.refdb_registrynum, t_refdb.refdb_classification, t_refdb.refdb_section, t_refdb.refdb_pamphletnum, t_refdb.refdb_chapternum, t_refdb.refdb_citekey FROM t_refdb WHERE "); if (ref_format != 1 || !strstr(ptr_biblio_info->format_string, "NOHOLES")) { if ((new_sql_command = mstrcat(sql_command, "refdb_type!='DUMMY' AND ", &sql_command_len, 0)) == NULL) { send_status(ptr_clrequest->fd, 801, TERM_NO); /* send step 8 */ LOG_PRINT(LOG_CRIT, get_status_msg(801)); dbi_conn_close(conn); delete_all_lilimem(&sentinel); if (conv_descriptor) { iconv_close(conv_descriptor); } return 1; } else { sql_command = new_sql_command; } } strcpy(sql_command1, "t_refdb.refdb_citekey IN ("); if (build_citekey_list(gbdata.ptr_found_first, &sql_command1, &sql_command1_len, conn) == NULL) { send_status(ptr_clrequest->fd, 801, TERM_NO); /* send step 8 */ LOG_PRINT(LOG_CRIT, get_status_msg(801)); dbi_conn_close(conn); delete_all_lilimem(&sentinel); if (conv_descriptor) { iconv_close(conv_descriptor); } return 1; } if ((new_sql_command = mstrcat(sql_command, sql_command1, &sql_command_len, 0)) == NULL) { send_status(ptr_clrequest->fd, 801, TERM_NO); /* send step 8 */ LOG_PRINT(LOG_CRIT, get_status_msg(801)); dbi_conn_close(conn); delete_all_lilimem(&sentinel); if (conv_descriptor) { iconv_close(conv_descriptor); } return 1; } else { sql_command = new_sql_command; } if ((new_sql_command = mstrcat(sql_command, ")", &sql_command_len, 0)) == NULL) { send_status(ptr_clrequest->fd, 801, TERM_NO); /* send step 8 */ LOG_PRINT(LOG_CRIT, get_status_msg(801)); dbi_conn_close(conn); delete_all_lilimem(&sentinel); if (conv_descriptor) { iconv_close(conv_descriptor); } return 1; } else { sql_command = new_sql_command; } /* sort the output */ if (strncmp(ptr_biblio_info->sort_string, "PY", 2) == 0) { if (retval || ((new_sql_command = mstrcat(sql_command, " ORDER BY t_refdb.refdb_pubyear", &sql_command_len, 0)) == NULL)) { send_status(ptr_clrequest->fd, 801, TERM_NO); /* send step 8 */ LOG_PRINT(LOG_CRIT, get_status_msg(801)); dbi_conn_close(conn); delete_all_lilimem(&sentinel); if (conv_descriptor) { iconv_close(conv_descriptor); } return 1; } else { sql_command = new_sql_command; } } else { if (retval || ((new_sql_command = mstrcat(sql_command, " ORDER BY t_refdb.refdb_id", &sql_command_len, 0)) == NULL)) { send_status(ptr_clrequest->fd, 801, TERM_NO); /* send step 8 */ LOG_PRINT(LOG_CRIT, get_status_msg(801)); dbi_conn_close(conn); delete_all_lilimem(&sentinel); if (conv_descriptor) { iconv_close(conv_descriptor); } return 1; } else { sql_command = new_sql_command; } } /* see whether the query should be limited to a range */ if (*(ptr_clrequest->limit)) { char *colon; colon = strchr(ptr_clrequest->limit, (int)':'); if (!colon) { snprintf(limitstring, 128, " LIMIT %s ", ptr_clrequest->limit); } else { *colon = '\0'; snprintf(limitstring, 128, " LIMIT %s OFFSET %s ", ptr_clrequest->limit, colon+1); } if ((new_sql_command = mstrcat(sql_command, limitstring, &sql_command_len, 0)) == NULL) { send_status(ptr_clrequest->fd, 801, TERM_NO); /* send step 8 */ LOG_PRINT(LOG_CRIT, get_status_msg(801)); dbi_conn_close(conn); delete_all_lilimem(&sentinel); if (conv_descriptor) { iconv_close(conv_descriptor); } return 1; } else { sql_command = new_sql_command; } } LOG_PRINT(LOG_DEBUG, sql_command); /* actually run the query */ rendinfo.dbires = dbi_conn_query(conn, sql_command); if (!rendinfo.dbires) { send_status(ptr_clrequest->fd, 234, TERM_NO); /* send step 8 */ LOG_PRINT(LOG_WARNING, get_status_msg(234)); dbi_conn_close(conn); delete_all_lilimem(&sentinel); if (conv_descriptor) { iconv_close(conv_descriptor); } return 1; } numrows = dbi_result_get_numrows(rendinfo.dbires); /* create a "header" if necessary */ /* prepare_render resets sql_command */ /* fill in variable elements of structure */ rendinfo.ptr_ref = &sql_command; rendinfo.ptr_ref_len = &sql_command_len; if (!*(rendinfo.ptr_biblio_info->encoding)) { rendinfo.ptr_biblio_info->encoding = dbi_conn_get_encoding(conn); } /* real output starts here */ if (prepare_render(&rendinfo)) { send_status(ptr_clrequest->fd, 801, TERM_NO); /* send step 8 */ LOG_PRINT(LOG_CRIT, get_status_msg(801)); dbi_result_free(rendinfo.dbires); dbi_conn_close(conn); delete_all_lilimem(&sentinel); if (conv_descriptor) { iconv_close(conv_descriptor); } return 1; } if (numrows) { /* fetch all articles we're interested in */ while (dbi_result_next_row(rendinfo.dbires) != 0) { nref_counter++; /* fill in variable elements of structure */ rendinfo.ptr_ref = &sql_command; rendinfo.ptr_ref_len = &sql_command_len; rendinfo.nref_counter = nref_counter; /* todo: count query errors and such as failed datasets, bail out only after irrecoverable errors */ if ((render_res = render_ref(&rendinfo)) != 0) { if (render_res == 801) { retval = 1; send_status(ptr_clrequest->fd, render_res, TERM_NO); /* send step 8 */ dbi_result_free(rendinfo.dbires); dbi_conn_close(conn); delete_all_lilimem(&sentinel); if (conv_descriptor) { iconv_close(conv_descriptor); } return 0; } else { ptr_addresult->failure++; } } /* run a character encoding conversion if required */ if (conv_descriptor && *sql_command) { size_t inlength; size_t outlength; char* my_sql_command = NULL; /* this ptr will be modified by iconv() */ char* my_sql_command_start = NULL; /* records initial state of my_elvalue */ const char* my_instring = NULL; /* this ptr will be modified by iconv() */ /* strlen should be ok here as this can't be a multibyte encoding */ inlength = strlen(sql_command)/* + 1 */; /* with the encodings supported by our database engines, the converted string can't be longer than six times the input string */ /* todo: is this assumption correct? */ outlength = 6*inlength; if ((my_sql_command = (char*)calloc(outlength, sizeof(char))) == NULL) { retval = 1; send_status(ptr_clrequest->fd, 801, TERM_NO); /* send step 8 */ LOG_PRINT(LOG_CRIT, get_status_msg(801)); dbi_result_free(rendinfo.dbires); dbi_conn_close(conn); delete_all_lilimem(&sentinel); if (conv_descriptor) { iconv_close(conv_descriptor); } return 0; } /* keep start of the converted string */ my_sql_command_start = my_sql_command; /* variable will be modified by iconv, so don't use original */ my_instring = (const char*)sql_command; /* now actually do the conversion */ if (iconv(conv_descriptor, &my_instring, &inlength, &my_sql_command, &outlength) == (size_t)(-1)) { if (errno == EILSEQ) { LOG_PRINT(LOG_WARNING, "iconv: invalid input character sequence"); } else if (errno == E2BIG) { LOG_PRINT(LOG_WARNING, "iconv: output buffer too small"); } else if (errno == EINVAL) { LOG_PRINT(LOG_WARNING, "iconv: incomplete input character"); } retval = 1; send_status(ptr_clrequest->fd, 702, TERM_NO); /* send step 8 */ dbi_result_free(rendinfo.dbires); dbi_conn_close(conn); delete_all_lilimem(&sentinel); if (conv_descriptor) { iconv_close(conv_descriptor); } return 0; } /* else: conversion went ok. We free the original string and replace it with the converted copy */ if (sql_command) { free(sql_command); } sql_command = my_sql_command_start; sql_command_len = outlength; result_len = (size_t)(my_sql_command - my_sql_command_start - 1); } else { /* no conversion required */ result_len = strlen(sql_command); } /* send ok status, then the terminated result string */ send_status(ptr_clrequest->fd, 404, TERM_NO); /* send step 8 */ iwrite(ptr_clrequest->fd, sql_command, result_len); iwrite(ptr_clrequest->fd, cs_term, TERM_LEN); ptr_addresult->success++; /* reset buffer string */ sql_command[0] = '\0'; /* read client response */ cs_status = read_status(ptr_clrequest->fd); /* read step 9 */ if (cs_status) { break; } } /* end while */ } else { /* no datasets, return an empty body */ send_status(ptr_clrequest->fd, 402, TERM_NO); /* send step 8 */ iwrite(ptr_clrequest->fd, cs_term, TERM_LEN); /* read client response */ /* cs_status = read_status(ptr_clrequest->fd);*/ /* read step 9 */ } if (conv_descriptor) { iconv_close(conv_descriptor); } if (ptr_addresult->success) { /* create a "footer" if necessary */ /* fill in variable elements of structure */ /* rendinfo.ptr_ref = &sql_command; */ /* rendinfo.ptr_ref_len = &sql_command_len; */ if ((render_res = finish_render(&rendinfo)) != 0) { retval = 1; send_status(ptr_clrequest->fd, 801, TERM_NO); /* send step 8 */ dbi_result_free(rendinfo.dbires); dbi_conn_close(conn); delete_all_lilimem(&sentinel); return 0; } send_status(ptr_clrequest->fd, 402, TERM_NO); /* send step 8 */ tiwrite(ptr_clrequest->fd, sql_command, TERM_YES); } Finish: dbi_result_free(rendinfo.dbires); dbi_conn_close(conn); delete_all_lilimem(&sentinel); return retval; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ build_citekey_list(): turns a Lilifstring list into a string with comma-separated citation keys char* build_citekey_list returns a pointer to the result string or NULL if the realloc failed. As the buffer holding the destination string may have been reallocated, it is mandatory to use *ONLY* this returned pointer after the function call and *NEVER* the old pointer to destination char** ptr_buffer pointer to a malloc'ed string. The citation key list will be appended to the string, so it should be initialized to something useful before calling this function size_t* ptr_buffer_len points to a variable that contains the current size of the buffer that ptr_buffer points to. Will be modified if a realloc() is necessary to increase the buffer size dbi_conn conn database connection ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static char* build_citekey_list(Lilifstring* ptr_first, char** ptr_buffer, size_t* ptr_buffer_len, dbi_conn conn) { Lilifstring* ptr_curr; char* new_buffer; char* token; int n_isfirst = 1; ptr_curr = ptr_first; while ((ptr_curr = get_next_lilifstring(ptr_curr)) != NULL) { if (n_isfirst) { n_isfirst--; } else { /* add a separator */ if ((new_buffer = mstrcat(*ptr_buffer, ",", ptr_buffer_len, 0)) == NULL) { return NULL; } else { *ptr_buffer = new_buffer; } } token = strdup(ptr_curr->token); if (!token) { return NULL; } if (dbi_conn_quote_string(conn, &token) == 0) { return NULL; } if ((new_buffer = mstrcat(*ptr_buffer, token, ptr_buffer_len, 0)) == NULL) { free(token); return NULL; } else { *ptr_buffer = new_buffer; } free(token); } /* end while */ return *ptr_buffer; } refdb-1.0.2/src/refdbdupdb.c000644 001750 001750 00000152125 12255427652 016516 0ustar00markusmarkus000000 000000 /*++++++++++++++++++++ refdbdupdb.c: refdbd code to update main databases markus@mhoenicka.de 2006-09-06 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, see +++++++++++++++++++++++++*/ #include #include #include #include #include #include "strfncs.h" #include "linklist.h" #include "connect.h" #include "refdb.h" #include "refdbd.h" #include "refdbdupdb.h" #include "dbfncs.h" /* global variables */ extern int n_log_level; extern char refdblib[]; extern char main_db[]; extern dbi_inst Inst; /* prototypes of local functions */ static short int dispatch_update_main_db(struct CLIENT_REQUEST* ptr_clrequest, dbi_conn conn, short int current_version, short int target_version); static short int update_mysql_main_db(struct CLIENT_REQUEST* ptr_clrequest, dbi_conn conn, short int current_version, short int target_version); static int mysql_duplicate_tables(struct CLIENT_REQUEST* ptr_clrequest, dbi_conn conn, Liliform* ptr_sentinel); static int execute_sql_mysql(struct CLIENT_REQUEST* ptr_clrequest, dbi_conn conn, const char* sqlfile); static int mysql_merge_tables(struct CLIENT_REQUEST* ptr_clrequest, dbi_conn conn, Liliform* ptr_sentinel, short int target_version); static int install_mysql_main_db(struct CLIENT_REQUEST* ptr_clrequest); static short int update_pgsql_main_db(struct CLIENT_REQUEST* ptr_clrequest, dbi_conn conn, short int current_version, short int target_version); static int pgsql_duplicate_tables(struct CLIENT_REQUEST* ptr_clrequest, dbi_conn conn, Liliform* ptr_sentinel); static int execute_sql_pgsql(struct CLIENT_REQUEST* ptr_clrequest, dbi_conn conn, const char* sqlfile, int is_create); static int pgsql_merge_tables(struct CLIENT_REQUEST* ptr_clrequest, dbi_conn conn, Liliform* ptr_sentinel, short int target_version); static int install_pgsql_main_db(struct CLIENT_REQUEST* ptr_clrequest); static int set_main_db_permissions_pgsql(dbi_conn conn); static short int update_sqlite_main_db(struct CLIENT_REQUEST* ptr_clrequest, dbi_conn conn, short int current_version, short int target_version); static int sqlite_duplicate_tables(struct CLIENT_REQUEST* ptr_clrequest, dbi_conn conn); static int execute_sql_sqlite(struct CLIENT_REQUEST* ptr_clrequest, dbi_conn conn, const char* sqlfile); static int sqlite_merge_tables(struct CLIENT_REQUEST* ptr_clrequest, dbi_conn conn, short int target_version); static int install_sqlite_main_db(struct CLIENT_REQUEST* ptr_clrequest, dbi_conn conn); static char* assemble_column_list(const char* create_statement, short int target_version); static char* read_sql_from_file(const char* path); static int read_sql_from_file_to_list(const char* path, Liliform* ptr_sentinel); /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ update_main_db(): updates the main database to the current version int update_main_db returns 0 if ok, >0 if an error occurred struct CLIENT_REQUEST* ptr_clrequest ptr to struct with request data int n_updatedb if 1, update main database; if 0, just report version ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int update_main_db(struct CLIENT_REQUEST* ptr_clrequest, int n_updatedb) { dbi_conn conn; /* libdbi connection structure */ dbi_result dbires; /* libdbi result structure */ char sql_command[] = "SELECT meta_dbversion FROM "MAIN_META" WHERE meta_type='refdb'"; char msg_buf[256] = ""; short int n_main_dbversion; int retval = 0; LOG_PRINT(LOG_INFO, "check main database version"); if ((conn = connect_to_db(ptr_clrequest, main_db, 0)) != NULL) { /* check version tag of main database */ dbires = dbi_conn_query(conn, sql_command); if (!dbires || !dbi_result_next_row(dbires)) { if (!strcmp(ptr_clrequest->dbserver, "sqlite") /* a missing sqlite main db will throw us here as the connection will always succeed by creating an empty database (as long as we have write permissions, that is). Proceed by installing the main database */ || !strcmp(ptr_clrequest->dbserver, "sqlite3")) { return install_sqlite_main_db(ptr_clrequest, conn); } else { /* too old (there is no t_meta) or corrupt */ LOG_PRINT(LOG_ERR, get_status_msg(203)); return 1; } } n_main_dbversion = dbi_result_get_short(dbires, "meta_dbversion"); if (dbi_conn_error(conn, NULL)) { /* corrupt */ LOG_PRINT(LOG_ERR, get_status_msg(203)); dbi_result_free(dbires); return 1; } dbi_result_free(dbires); sprintf(msg_buf, "current main database version: %d", n_main_dbversion); LOG_PRINT(LOG_INFO, msg_buf); /* we're done if we shall only check the connection. Else, see whether the main database is in need of an upgrade */ if (n_updatedb) { /* this loop runs until we're at the current version, or until an error occurs. The dispatch function may choose to upgrade older databases in more than one step. */ while (n_main_dbversion < MAIN_DB_VERSION) { retval = dispatch_update_main_db(ptr_clrequest, conn, n_main_dbversion, MAIN_DB_VERSION); if (!retval) { /* error */ dbi_conn_close(conn); return 1; } else { n_main_dbversion = retval; } } } dbi_conn_close(conn); } else { /* can't access main database. This may be due to incorrect permissions on the database server side, or the database is indeed missing */ LOG_PRINT(LOG_WARNING, get_status_msg(202)); if (!n_updatedb) { return 1; } /* attempt to create the database */ if (!strcmp(ptr_clrequest->dbserver, "mysql")) { retval = install_mysql_main_db(ptr_clrequest); } else if (!strcmp(ptr_clrequest->dbserver, "pgsql")) { retval = install_pgsql_main_db(ptr_clrequest); } else { LOG_PRINT(LOG_ERR, "Can't access or create SQLite database"); retval = 1; } return retval; } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ dispatch_update_main_db(): sets the upgrade strategy short int dispatch_update_main_db returns new database version if ok, or 0 if an error occurred struct CLIENT_REQUEST* ptr_clrequest ptr to struct with request data dbi_conn conn connection structure short int n_current_version current database version short int n_target_version target version ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static short int dispatch_update_main_db(struct CLIENT_REQUEST* ptr_clrequest, dbi_conn conn, short int current_version, short int target_version) { short int retval = 0; if (target_version == 2) { LOG_PRINT(LOG_INFO, "updating main database to version 2"); /* the upgrade strategies differ between the supported databases */ if (!strcmp(ptr_clrequest->dbserver, "mysql")) { retval = update_mysql_main_db(ptr_clrequest, conn, 1, 2); } else if (!strcmp(ptr_clrequest->dbserver, "pgsql")) { retval = update_pgsql_main_db(ptr_clrequest, conn, 1, 2); } else if (!strcmp(ptr_clrequest->dbserver, "sqlite") || !strcmp(ptr_clrequest->dbserver, "sqlite3")) { retval = update_sqlite_main_db(ptr_clrequest, conn, 1, 2); } return retval; } else if (target_version == 3) { LOG_PRINT(LOG_INFO, "updating main database to version 3"); /* the upgrade strategies differ between the supported databases */ if (!strcmp(ptr_clrequest->dbserver, "mysql")) { retval = update_mysql_main_db(ptr_clrequest, conn, 2, 3); } else if (!strcmp(ptr_clrequest->dbserver, "pgsql")) { retval = update_pgsql_main_db(ptr_clrequest, conn, 2, 3); } else if (!strcmp(ptr_clrequest->dbserver, "sqlite") || !strcmp(ptr_clrequest->dbserver, "sqlite3")) { retval = update_sqlite_main_db(ptr_clrequest, conn, 2, 3); } return retval; } /* else if: add future cases here */ else { /* upgrade not supported */ return 0; } } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ update_mysql_main_db(): updates the main database (mysql) short int update_mysql_main_db returns new database version if ok, or 0 if an error occurred struct CLIENT_REQUEST* ptr_clrequest ptr to struct with request data dbi_conn conn connection structure short int n_current_version current database version short int n_target_version target version ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static short int update_mysql_main_db(struct CLIENT_REQUEST* ptr_clrequest, dbi_conn conn, short int current_version, short int target_version) { char path[_POSIX_PATH_MAX+1] = ""; Liliform sentinel; /* assemble path to sql script */ snprintf(path, _POSIX_PATH_MAX, "%s/sql/refdb.%d.dump.mysql41", refdblib, target_version); /* initialize linked list sentinel */ sentinel.ptr_next = NULL; sentinel.name[0] = '\0'; sentinel.value = NULL; /* start a transaction */ if (my_dbi_conn_begin(conn)) { return 0; } /* first replace existing tables with temporary copies */ if (mysql_duplicate_tables(ptr_clrequest, conn, &sentinel)) { my_dbi_conn_rollback(conn); delete_all_liliform(&sentinel); return 0; } /* create new tables */ if (execute_sql_mysql(ptr_clrequest, conn, path)) { my_dbi_conn_rollback(conn); return 0; } /* finally write the data back into the new tables */ if (mysql_merge_tables(ptr_clrequest, conn, &sentinel, target_version)) { my_dbi_conn_rollback(conn); return 0; } my_dbi_conn_commit(conn); return target_version; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ mysql_duplicate_tables(): duplicates the tables into temporary ones int mysql_duplicate_tables returns 0 if ok, or >0 if an error occurred struct CLIENT_REQUEST* ptr_clrequest ptr to struct with request data dbi_conn conn connection structure Liliform* ptr_sentinel ptr to linked list for table names ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int mysql_duplicate_tables(struct CLIENT_REQUEST* ptr_clrequest, dbi_conn conn, Liliform* ptr_sentinel) { char sql_command[256]; const char* table_name; dbi_result dbires; dbi_result dbires1; /* get a list of tables */ dbires = dbi_conn_get_table_list(conn, "refdb", NULL); if (!dbires) { return 1; } /* loop over all existing tables */ while (dbi_result_next_row(dbires)) { table_name = my_dbi_result_get_string_idx(dbires, 1); if (!table_name) { dbi_result_free(dbires); return 1; } /* create a temporary copy of the table */ sprintf(sql_command, "CREATE TEMPORARY TABLE temp%s SELECT * from %s", table_name, table_name); LOG_PRINT(LOG_DEBUG, sql_command); dbires1 = dbi_conn_query(conn, sql_command); if (!dbires1) { dbi_result_free(dbires); return 1; } dbi_result_free(dbires1); /* add the table name to the linked list */ if (insert_liliform(ptr_sentinel, "dummy", (char*)table_name)) { dbi_result_free(dbires); return 1; } /* drop the existing table */ sprintf(sql_command, "DROP TABLE %s", table_name); LOG_PRINT(LOG_DEBUG, sql_command); dbires1 = dbi_conn_query(conn, sql_command); if (!dbires1) { dbi_result_free(dbires); return 1; } dbi_result_free(dbires1); } dbi_result_free(dbires); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ execute_sql_mysql(): runs an SQL script for MySQL int execute_sql_mysql returns 0 if ok, or >0 if an error occurred The return value is the exit code of the mysql command line application, or 1 if there was insufficient memory to assemble the command string struct CLIENT_REQUEST* ptr_clrequest ptr to struct with request data dbi_conn conn connection structure const char* sqlfile path of the SQL script to execute ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int execute_sql_mysql(struct CLIENT_REQUEST* ptr_clrequest, dbi_conn conn, const char* sqlfile) { dbi_result dbires; Liliform sentinel; Liliform* ptr_curr; /* initialize linked list sentinel */ sentinel.ptr_next = NULL; sentinel.name[0] = '\0'; sentinel.value = NULL; /* read the sql script into a linked list of individual commands */ if (read_sql_from_file_to_list(sqlfile, &sentinel)) { return 1; } ptr_curr = &sentinel; /* loop over all commands */ while ((ptr_curr = get_next_liliform(ptr_curr)) != NULL) { if (ptr_curr->value && *(ptr_curr->value)) { LOG_PRINT(LOG_DEBUG, ptr_curr->value); dbires = dbi_conn_query(conn, ptr_curr->value); if (!dbires) { return 1; } dbi_result_free(dbires); } } /* clean up the linked list */ delete_all_liliform(&sentinel); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ mysql_merge_tables(): merges the temporary and new tables. It is assumed that the new table contains all (and maybe more) columns of the temporary table int mysql_merge_tables returns 0 if ok, or >0 if an error occurred struct CLIENT_REQUEST* ptr_clrequest ptr to struct with request data dbi_conn conn connection structure Liliform* ptr_sentinel ptr to linked list for table names short int target_version target version of the update procedure ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int mysql_merge_tables(struct CLIENT_REQUEST* ptr_clrequest, dbi_conn conn, Liliform* ptr_sentinel, short int target_version) { char column_buffer[128]; char* sql_command; char* new_sql_command; char* column_list = NULL; const char* table_name; size_t sql_cmd_len = 512; Liliform* ptr_curr; dbi_result dbires1; /* get some memory */ if ((sql_command = malloc(sql_cmd_len)) == NULL) { return 1; } ptr_curr = ptr_sentinel; /* loop over all existing tables. The linked list contains the original table names, not the temporary table names */ while ((ptr_curr = get_next_liliform(ptr_curr)) != NULL) { table_name = ptr_curr->value; if (!table_name) { free(sql_command); return 1; } /* retrieve the column names */ sprintf(sql_command, "SHOW CREATE TABLE temp%s", table_name); LOG_PRINT(LOG_DEBUG, sql_command); dbires1 = dbi_conn_query(conn, sql_command); if (!dbires1) { const char* errmsg; dbi_conn_error(conn, &errmsg); LOG_PRINT(LOG_WARNING, "retrieve column names failed"); LOG_PRINT(LOG_DEBUG, errmsg); free(sql_command); return 1; } /* assemble a command which inserts the existing data into the columns that were present in the original table */ sprintf(sql_command, "INSERT IGNORE INTO %s (", table_name); /* this should run only once */ while (dbi_result_next_row(dbires1)) { char* create_command; create_command = my_dbi_result_get_string_copy_idx(dbires1, 2); if (!create_command) { free(sql_command); return 1; } /* convert the create command into a comma-separated list of column names */ column_list = assemble_column_list(create_command, target_version); free(create_command); if (!column_list || (new_sql_command = mstrcat(sql_command, column_list, &sql_cmd_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(column_list); free(sql_command); return 1; } else { sql_command = new_sql_command; } } dbi_result_free(dbires1); if (!column_list) { return 1; } if ((new_sql_command = mstrcat(sql_command, ") SELECT ", &sql_cmd_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(sql_command); return 1; } else { sql_command = new_sql_command; } if ((new_sql_command = mstrcat(sql_command, column_list, &sql_cmd_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(sql_command); return 1; } else { sql_command = new_sql_command; } free(column_list); sprintf(column_buffer, " FROM temp%s", table_name); if ((new_sql_command = mstrcat(sql_command, column_buffer, &sql_cmd_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(sql_command); return 1; } else { sql_command = new_sql_command; } LOG_PRINT(LOG_DEBUG, sql_command); dbires1 = dbi_conn_query(conn, sql_command); if (!dbires1) { const char* errmsg; dbi_conn_error(conn, &errmsg); LOG_PRINT(LOG_WARNING, "INSERT into main database failed"); LOG_PRINT(LOG_DEBUG, errmsg); free(sql_command); return 1; } dbi_result_free(dbires1); } free(sql_command); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ install_mysql_main_db(): installs the main database (mysql) int install_mysql_main_db returns 0 if ok, or >0 if an error occurred struct CLIENT_REQUEST* ptr_clrequest ptr to struct with request data ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int install_mysql_main_db(struct CLIENT_REQUEST* ptr_clrequest) { unsigned int server_version; char path[_POSIX_PATH_MAX+1] = ""; char sql_command[128]; dbi_conn conn; dbi_result dbires; /* get a connection to the MySQL system database */ if ((conn = my_dbi_conn_new("mysql", ptr_clrequest->inst)) == NULL) { LOG_PRINT(LOG_ERR, "Cannot connect to database server. Installation of main database aborted"); return 1; } LOG_PRINT(LOG_DEBUG, ptr_clrequest->server_ip); LOG_PRINT(LOG_DEBUG, ptr_clrequest->username); LOG_PRINT(LOG_DEBUG, ptr_clrequest->passwd); LOG_PRINT(LOG_DEBUG, ptr_clrequest->current_db); LOG_PRINT(LOG_DEBUG, ptr_clrequest->dbs_port_address); LOG_PRINT(LOG_DEBUG, ptr_clrequest->dbserver); LOG_PRINT(LOG_DEBUG, ptr_clrequest->db_path); LOG_PRINT(LOG_DEBUG, ptr_clrequest->db_encoding); dbi_conn_set_option(conn, "username", ptr_clrequest->username); dbi_conn_set_option(conn, "password", (ptr_clrequest->passwd && *(ptr_clrequest->passwd)) ? ptr_clrequest->passwd : ""); dbi_conn_set_option(conn, "dbname", "mysql"); dbi_conn_set_option(conn, "encoding", "auto"); dbi_conn_set_option_numeric(conn, "port", atoi(ptr_clrequest->dbs_port_address)); dbi_conn_set_option(conn, "host", ptr_clrequest->server_ip); dbi_conn_set_option_numeric(conn, "mysql_include_trailing_null", 1); if (dbi_conn_connect(conn) < 0) { /* -1 and -2 indicate errors */ LOG_PRINT(LOG_ERR, "could not connect to the database server. Main database upgrade aborted"); return 1; } /* get MySQL server version */ server_version = dbi_conn_get_engine_version(conn); /* assemble path to sql script */ if (server_version == 0 || server_version > 40100) { snprintf(path, _POSIX_PATH_MAX, "%s/sql/refdb.%d.dump.mysql41", refdblib, MAIN_DB_VERSION); LOG_PRINT(LOG_INFO, "using MySQL 4.1 and later dump file"); snprintf(sql_command, 128, "CREATE DATABASE %s CHARACTER SET %s", main_db, dbi_driver_encoding_from_iana(dbi_conn_get_driver(conn), ptr_clrequest->db_encoding)); } else { LOG_PRINT(LOG_INFO, "libdbi requires MySQL 4.1 or higher"); return 1; } /* create the database */ LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { dbi_result_free(dbires); dbi_conn_close(conn); return 1; } dbi_result_free(dbires); /* close connection and reconnect to new database */ dbi_conn_close(conn); if ((conn = my_dbi_conn_new("mysql", ptr_clrequest->inst)) == NULL) { LOG_PRINT(LOG_ERR, "Cannot connect to database server. Installation of main database aborted"); return 1; } dbi_conn_set_option(conn, "username", ptr_clrequest->username); dbi_conn_set_option(conn, "password", (ptr_clrequest->passwd && *(ptr_clrequest->passwd)) ? ptr_clrequest->passwd : ""); dbi_conn_set_option(conn, "dbname", main_db); dbi_conn_set_option(conn, "encoding", "auto"); dbi_conn_set_option_numeric(conn, "port", atoi(ptr_clrequest->dbs_port_address)); dbi_conn_set_option(conn, "host", ptr_clrequest->server_ip); dbi_conn_set_option_numeric(conn, "mysql_include_trailing_null", 1); if (dbi_conn_connect(conn) < 0) { /* -1 and -2 indicate errors */ LOG_PRINT(LOG_ERR, "could not connect to the database server. Main database upgrade aborted"); dbi_conn_close(conn); return 1; } /* start a transaction for the insertion of data */ my_dbi_conn_begin(conn); /* create new tables */ if (execute_sql_mysql(ptr_clrequest, conn, path)) { my_dbi_conn_rollback(conn); dbi_conn_close(conn); return 1; } my_dbi_conn_commit(conn); dbi_conn_close(conn); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ update_pgsql_main_db(): updates the main database (pgsql) short int update_pgsql_main_db returns new database version if ok, or 0 if an error occurred struct CLIENT_REQUEST* ptr_clrequest ptr to struct with request data dbi_conn conn connection structure short int n_current_version current database version short int n_target_version target version ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static short int update_pgsql_main_db(struct CLIENT_REQUEST* ptr_clrequest, dbi_conn conn, short int current_version, short int target_version) { char path[_POSIX_PATH_MAX+1] = ""; Liliform sentinel; /* assemble path to sql script */ snprintf(path, _POSIX_PATH_MAX, "%s/sql/refdb.%d.dump.pgsql", refdblib, target_version); /* initialize linked list sentinel */ sentinel.ptr_next = NULL; sentinel.name[0] = '\0'; sentinel.value = NULL; /* start a transaction */ if (my_dbi_conn_begin(conn)) { return 0; } /* first replace existing tables with temporary copies */ if (pgsql_duplicate_tables(ptr_clrequest, conn, &sentinel)) { my_dbi_conn_rollback(conn); delete_all_liliform(&sentinel); return 0; } /* create new tables */ if (execute_sql_pgsql(ptr_clrequest, conn, path, 0)) { my_dbi_conn_rollback(conn); return 0; } /* finally write the data back into the new tables ... */ if (pgsql_merge_tables(ptr_clrequest, conn, &sentinel, target_version)) { my_dbi_conn_rollback(conn); return 0; } /* ... and update the permissions */ if (set_main_db_permissions_pgsql(conn)) { my_dbi_conn_rollback(conn); dbi_conn_close(conn); } my_dbi_conn_commit(conn); return target_version; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ pgsql_duplicate_tables(): duplicates the tables into temporary ones int pgsql_duplicate_tables returns 0 if ok, or >0 if an error occurred struct CLIENT_REQUEST* ptr_clrequest ptr to struct with request data dbi_conn conn connection structure Liliform* ptr_sentinel ptr to linked list for table names ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int pgsql_duplicate_tables(struct CLIENT_REQUEST* ptr_clrequest, dbi_conn conn, Liliform* ptr_sentinel) { char sql_command[256]; const char* table_name; dbi_result dbires; dbi_result dbires1; /* get a list of tables */ dbires = dbi_conn_get_table_list(conn, "refdb", NULL); if (!dbires) { return 1; } /* loop over all existing tables */ while (dbi_result_next_row(dbires)) { table_name = my_dbi_result_get_string_idx(dbires, 1); if (!table_name) { dbi_result_free(dbires); return 1; } /* create a temporary copy of the table */ sprintf(sql_command, "CREATE TEMPORARY TABLE temp%s AS SELECT * from %s", table_name, table_name); LOG_PRINT(LOG_DEBUG, sql_command); dbires1 = dbi_conn_query(conn, sql_command); if (!dbires1) { dbi_result_free(dbires); return 1; } dbi_result_free(dbires1); /* add the table name to the linked list */ if (insert_liliform(ptr_sentinel, "dummy", (char*)table_name)) { dbi_result_free(dbires); return 1; } /* drop the existing table */ sprintf(sql_command, "DROP TABLE %s", table_name); LOG_PRINT(LOG_DEBUG, sql_command); dbires1 = dbi_conn_query(conn, sql_command); if (!dbires1) { dbi_result_free(dbires); return 1; } dbi_result_free(dbires1); } dbi_result_free(dbires); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ execute_sql_pgsql(): runs an SQL script for PostgreSQL int execute_sql_pgsql returns 0 if ok, or >0 if an error occurred The return value is the exit code of the psql command line application, or 1 if there was insufficient memory to assemble the command string struct CLIENT_REQUEST* ptr_clrequest ptr to struct with request data dbi_conn conn connection structure const char* sqlfile path of the SQL script to execute int is_create if 1, database is being created; if 0, database is being updated ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int execute_sql_pgsql(struct CLIENT_REQUEST* ptr_clrequest, dbi_conn conn, const char* sqlfile, int is_create) { dbi_result dbires; Liliform sentinel; Liliform* ptr_curr; /* initialize linked list sentinel */ sentinel.ptr_next = NULL; sentinel.name[0] = '\0'; sentinel.value = NULL; /* read the sql script into a linked list of individual commands */ if (read_sql_from_file_to_list(sqlfile, &sentinel)) { return 1; } ptr_curr = &sentinel; /* loop over all commands */ while ((ptr_curr = get_next_liliform(ptr_curr)) != NULL) { if (ptr_curr->value && *(ptr_curr->value)) { /* create group only if this is a first installation */ if (is_create || !strstr(ptr_curr->value, "CREATE GROUP")) { LOG_PRINT(LOG_DEBUG, ptr_curr->value); dbires = dbi_conn_query(conn, ptr_curr->value); if (!dbires) { return 1; } dbi_result_free(dbires); } } } /* clean up the linked list */ delete_all_liliform(&sentinel); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ pgsql_merge_tables(): merges the temporary and new tables. It is assumed that the new table contains all (and maybe more) columns of the temporary table int pgsql_merge_tables returns 0 if ok, or >0 if an error occurred struct CLIENT_REQUEST* ptr_clrequest ptr to struct with request data dbi_conn conn connection structure Liliform* ptr_sentinel ptr to linked list for table names short int target_version target version of the update procedure ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int pgsql_merge_tables(struct CLIENT_REQUEST* ptr_clrequest, dbi_conn conn, Liliform* ptr_sentinel, short int target_version) { char column_buffer[128]; char* sql_command; char* column_list; char* new_sql_command; const char* table_name; size_t sql_cmd_len = 512; size_t column_list_len = 512; Liliform* ptr_curr; dbi_result dbires1; /* get some memory */ if ((sql_command = malloc(sql_cmd_len)) == NULL) { return 1; } /* get some memory */ if ((column_list = malloc(column_list_len)) == NULL) { free(sql_command); return 1; } ptr_curr = ptr_sentinel; /* loop over all existing tables. The linked list contains the original table names, not the temporary table names */ while ((ptr_curr = get_next_liliform(ptr_curr)) != NULL) { table_name = ptr_curr->value; if (!table_name) { free(sql_command); free(column_list); return 1; } if (!strcmp(table_name, "t_meta")) { /* t_meta provides meta information about the database and should therefore contain the new data only. The duplicate check built into the code below will fail as the version info and the timestamps will inevitably differ */ continue; } /* retrieve the column names */ *column_list = '\0'; sprintf(sql_command, "SELECT pg_attribute.attname FROM pg_class,pg_attribute WHERE pg_class.relname='temp%s' and pg_class.oid=pg_attribute.attrelid", table_name); LOG_PRINT(LOG_DEBUG, sql_command); dbires1 = dbi_conn_query(conn, sql_command); if (!dbires1) { const char* errmsg; dbi_conn_error(conn, &errmsg); LOG_PRINT(LOG_WARNING, "retrieve column names failed"); LOG_PRINT(LOG_DEBUG, errmsg); free(sql_command); free(column_list); return 1; } /* assemble a command which inserts the existing data into the columns that were present in the original table */ sprintf(sql_command, "INSERT INTO %s (", table_name); while (dbi_result_next_row(dbires1)) { const char* column_name; column_name = my_dbi_result_get_string_idx(dbires1, 1); if (!column_name) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(sql_command); free(column_list); return 1; } if (!strcmp(column_name, "tableoid") || !strcmp(column_name, "cmax") || !strcmp(column_name, "xmax") || !strcmp(column_name, "xmin") || !strcmp(column_name, "cmin") || !strcmp(column_name, "cmin") || !strcmp(column_name, "oid") || !strcmp(column_name, "ctid")) { /* these are maintained by PostgreSQL and none of our business */ continue; } /* skip columns no longer needed in version 3 */ if (target_version == 3) { if (!strcmp(column_name, "misc1preceeding") || !strcmp(column_name, "misc1following") || !strcmp(column_name, "misc1style") || !strcmp(column_name, "misc2preceeding") || !strcmp(column_name, "misc2following") || !strcmp(column_name, "misc2style") || !strcmp(column_name, "misc3preceeding") || !strcmp(column_name, "misc3following") || !strcmp(column_name, "misc3style")) { continue; } } if ((new_sql_command = mstrcat(column_list, (char*)column_name, &column_list_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(sql_command); free(column_list); return 1; } else { column_list = new_sql_command; } if ((new_sql_command = mstrcat(column_list, ",", &column_list_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(sql_command); free(column_list); return 1; } else { column_list = new_sql_command; } } dbi_result_free(dbires1); if ((new_sql_command = mstrcat(sql_command, column_list, &sql_cmd_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(sql_command); free(column_list); return 1; } else { sql_command = new_sql_command; } if ((new_sql_command = mstrcat(sql_command, ") SELECT ", &sql_cmd_len, 1)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(sql_command); free(column_list); return 1; } else { sql_command = new_sql_command; } if ((new_sql_command = mstrcat(sql_command, column_list, &sql_cmd_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(sql_command); free(column_list); return 1; } else { sql_command = new_sql_command; } sprintf(column_buffer, " FROM temp%s EXCEPT SELECT ", table_name); /* skip trailing comma */ if ((new_sql_command = mstrcat(sql_command, column_buffer, &sql_cmd_len, 1)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(sql_command); return 1; } else { sql_command = new_sql_command; } if ((new_sql_command = mstrcat(sql_command, column_list, &sql_cmd_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(sql_command); return 1; } else { sql_command = new_sql_command; } sprintf(column_buffer, " FROM %s", table_name); /* overwrite trailing comma */ if ((new_sql_command = mstrcat(sql_command, column_buffer, &sql_cmd_len, 1)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(sql_command); return 1; } else { sql_command = new_sql_command; } LOG_PRINT(LOG_DEBUG, sql_command); dbires1 = dbi_conn_query(conn, sql_command); if (!dbires1) { const char* errmsg; dbi_conn_error(conn, &errmsg); LOG_PRINT(LOG_WARNING, "INSERT into main database failed"); LOG_PRINT(LOG_DEBUG, errmsg); free(sql_command); return 1; } dbi_result_free(dbires1); } free(sql_command); free(column_list); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ install_pgsql_main_db(): installs the main database (pgsql) int install_pgsql_main_db returns 0 if ok, or >0 if an error occurred struct CLIENT_REQUEST* ptr_clrequest ptr to struct with request data ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int install_pgsql_main_db(struct CLIENT_REQUEST* ptr_clrequest) { char path[_POSIX_PATH_MAX+1] = ""; char sql_command[128]; dbi_conn conn; dbi_result dbires; /* assemble path to sql script */ snprintf(path, _POSIX_PATH_MAX, "%s/sql/refdb.%d.dump.pgsql", refdblib, MAIN_DB_VERSION); /* get a connection to template1 */ if ((conn = my_dbi_conn_new("pgsql", ptr_clrequest->inst)) == NULL) { LOG_PRINT(LOG_ERR, "Cannot connect to database server. Installation of main database aborted"); return 1; } LOG_PRINT(LOG_DEBUG, ptr_clrequest->server_ip); LOG_PRINT(LOG_DEBUG, ptr_clrequest->username); LOG_PRINT(LOG_DEBUG, ptr_clrequest->passwd); LOG_PRINT(LOG_DEBUG, ptr_clrequest->current_db); LOG_PRINT(LOG_DEBUG, ptr_clrequest->dbs_port_address); LOG_PRINT(LOG_DEBUG, ptr_clrequest->dbserver); LOG_PRINT(LOG_DEBUG, ptr_clrequest->db_path); LOG_PRINT(LOG_DEBUG, ptr_clrequest->db_encoding); dbi_conn_set_option(conn, "username", ptr_clrequest->username); dbi_conn_set_option(conn, "password", (ptr_clrequest->passwd && *(ptr_clrequest->passwd)) ? ptr_clrequest->passwd : ""); dbi_conn_set_option(conn, "dbname", "template1"); dbi_conn_set_option(conn, "encoding", "auto"); dbi_conn_set_option_numeric(conn, "port", atoi(ptr_clrequest->dbs_port_address)); if (strcmp(ptr_clrequest->server_ip, "localhost")) { dbi_conn_set_option(conn, "host", ptr_clrequest->server_ip); } if (dbi_conn_connect(conn) < 0) { /* -1 and -2 indicate errors */ LOG_PRINT(LOG_ERR, "could not connect to the database server. Main database upgrade aborted"); return 1; } /* create the database */ snprintf(sql_command, 128, "CREATE DATABASE %s WITH ENCODING=\'%s\'", main_db, dbi_driver_encoding_from_iana(dbi_conn_get_driver(conn), ptr_clrequest->db_encoding)); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { LOG_PRINT(LOG_ERR, "Could not create main database"); dbi_result_free(dbires); dbi_conn_close(conn); return 1; } dbi_result_free(dbires); /* close connection and reconnect to new database */ dbi_conn_close(conn); if ((conn = my_dbi_conn_new("pgsql", ptr_clrequest->inst)) == NULL) { LOG_PRINT(LOG_ERR, "Cannot connect to database server. Installation of main database aborted"); return 1; } dbi_conn_set_option(conn, "username", ptr_clrequest->username); dbi_conn_set_option(conn, "password", (ptr_clrequest->passwd && *(ptr_clrequest->passwd)) ? ptr_clrequest->passwd : ""); dbi_conn_set_option(conn, "dbname", main_db); dbi_conn_set_option(conn, "encoding", "auto"); dbi_conn_set_option_numeric(conn, "port", atoi(ptr_clrequest->dbs_port_address)); if (strcmp(ptr_clrequest->server_ip, "localhost")) { dbi_conn_set_option(conn, "host", ptr_clrequest->server_ip); } if (dbi_conn_connect(conn) < 0) { /* -1 and -2 indicate errors */ LOG_PRINT(LOG_ERR, "could not connect to the database server. Main database upgrade aborted"); dbi_conn_close(conn); return 1; } /* start a transaction for the insertion of data */ my_dbi_conn_begin(conn); /* create new tables */ if (execute_sql_pgsql(ptr_clrequest, conn, path, 1)) { my_dbi_conn_rollback(conn); dbi_conn_close(conn); return 1; } if (set_main_db_permissions_pgsql(conn)) { my_dbi_conn_rollback(conn); dbi_conn_close(conn); } my_dbi_conn_commit(conn); dbi_conn_close(conn); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ set_main_db_permissions_pgsql(): sets the main database permissions (pgsql) int set_main_db_permissions_pgsql returns 0 if ok, or >0 if an error occurred dbi_conn conn database connection structure ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int set_main_db_permissions_pgsql(dbi_conn conn) { char sql_command[256]; dbi_result dbires; dbi_result dbires1; /* check for existing group */ snprintf(sql_command, 256, "SELECT groname FROM pg_group WHERE groname=\'%suser\'", main_db); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { LOG_PRINT(LOG_ERR, "Could not query main database user group"); return 1; } if (!dbi_result_get_numrows(dbires)) { /* group already exists */ snprintf(sql_command, 256, "CREATE GROUP %suser", main_db); LOG_PRINT(LOG_DEBUG, sql_command); dbires1 = dbi_conn_query(conn, sql_command); if (!dbires1) { LOG_PRINT(LOG_ERR, "Could not create main database user group"); dbi_result_free(dbires); return 1; } dbi_result_free(dbires1); } dbi_result_free(dbires); snprintf(sql_command, 256, "GRANT SELECT ON CITSTYLE, POSITIONS, REFSTYLE, SEPARATORS, t_journal_words, %s TO GROUP %suser", MAIN_META, main_db); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { LOG_PRINT(LOG_ERR, "Could not grant permissions to main database user group"); return 1; } dbi_result_free(dbires); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ update_sqlite_main_db(): updates the main database (sqlite) short int update_sqlite_main_db returns new database version if ok, or 0 if an error occurred struct CLIENT_REQUEST* ptr_clrequest ptr to struct with request data dbi_conn conn connection structure short int n_current_version current database version short int n_target_version target version ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static short int update_sqlite_main_db(struct CLIENT_REQUEST* ptr_clrequest, dbi_conn conn, short int current_version, short int target_version) { char path[_POSIX_PATH_MAX+1] = ""; /* assemble path to sql script */ snprintf(path, _POSIX_PATH_MAX, "%s/sql/refdb.%d.dump.sqlite", refdblib, target_version); /* start a transaction */ if (my_dbi_conn_begin(conn)) { return 0; } /* first replace existing tables with temporary copies */ if (sqlite_duplicate_tables(ptr_clrequest, conn)) { my_dbi_conn_rollback(conn); return 0; } /* create new tables */ if (execute_sql_sqlite(ptr_clrequest, conn, path)) { my_dbi_conn_rollback(conn); return 0; } if (sqlite_merge_tables(ptr_clrequest, conn, target_version)) { my_dbi_conn_rollback(conn); return 0; } my_dbi_conn_commit(conn); return target_version; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ sqlite_duplicate_tables(): duplicates the tables into temporary ones int sqlite_duplicate_tables returns 0 if ok, or >0 if an error occurred struct CLIENT_REQUEST* ptr_clrequest ptr to struct with request data dbi_conn conn connection structure ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int sqlite_duplicate_tables(struct CLIENT_REQUEST* ptr_clrequest, dbi_conn conn) { char sql_command[256]; const char* table_name; dbi_result dbires; dbi_result dbires1; dbires = dbi_conn_get_table_list(conn, "refdb", NULL); if (!dbires) { return 1; } /* loop over all existing tables */ while (dbi_result_next_row(dbires)) { table_name = my_dbi_result_get_string_idx(dbires, 1); if (!table_name) { dbi_result_free(dbires); return 1; } /* create a temporary copy of the table */ sprintf(sql_command, "CREATE TEMPORARY TABLE temp%s AS SELECT * from %s", table_name, table_name); LOG_PRINT(LOG_DEBUG, sql_command); dbires1 = dbi_conn_query(conn, sql_command); if (!dbires1) { dbi_result_free(dbires); return 1; } dbi_result_free(dbires1); /* drop the existing table */ sprintf(sql_command, "DROP TABLE %s", table_name); LOG_PRINT(LOG_DEBUG, sql_command); dbires1 = dbi_conn_query(conn, sql_command); if (!dbires1) { dbi_result_free(dbires); return 1; } dbi_result_free(dbires1); } dbi_result_free(dbires); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ execute_sql_sqlite(): runs an SQL script for SQLite int execute_sql_sqlite returns 0 if ok, or >0 if an error occurred The return value is the exit code of the sqlite(3) command line application, or 1 if there was insufficient memory to assemble the command string struct CLIENT_REQUEST* ptr_clrequest ptr to struct with request data dbi_conn conn connection structure const char* sqlfile path of the SQL script to execute ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int execute_sql_sqlite(struct CLIENT_REQUEST* ptr_clrequest, dbi_conn conn, const char* sqlfile) { char* sql_command; dbi_result dbires; if ((sql_command = read_sql_from_file(sqlfile)) == NULL) { return 1; } LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); free(sql_command); if (!dbires) { return 1; } dbi_result_free(dbires); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ sqlite_merge_tables(): merges the temporary and new tables. It is assumed that the new table contains all (and maybe more) columns of the temporary table int sqlite_merge_tables returns 0 if ok, or >0 if an error occurred struct CLIENT_REQUEST* ptr_clrequest ptr to struct with request data dbi_conn conn connection structure short int target_version target version of the update procedure ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int sqlite_merge_tables(struct CLIENT_REQUEST* ptr_clrequest, dbi_conn conn, short int target_version) { char column_buffer[128]; char* sql_command; char* new_sql_command; char* column_list = NULL; const char* table_name; size_t sql_cmd_len = 512; dbi_result dbires; dbi_result dbires1; if ((sql_command = malloc(sql_cmd_len)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); return 1; } sprintf(sql_command, "SELECT name FROM sqlite_temp_master WHERE type='table'"); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { return 1; } /* loop over all existing temporary tables */ while (dbi_result_next_row(dbires)) { table_name = my_dbi_result_get_string(dbires, "name"); if (!table_name) { dbi_result_free(dbires); return 1; } else if (!strcmp(table_name, "libdbi_tablenames") || !strcmp(table_name, "tempt_meta")) { /* this is a libdbi temporary table used to list tables */ continue; } /* retrieve the column names */ sprintf(sql_command, "SELECT sql FROM sqlite_temp_master WHERE tbl_name='%s'", table_name); LOG_PRINT(LOG_DEBUG, sql_command); dbires1 = dbi_conn_query(conn, sql_command); if (!dbires1) { const char* errmsg; dbi_conn_error(conn, &errmsg); LOG_PRINT(LOG_WARNING, "retrieve column names failed"); LOG_PRINT(LOG_DEBUG, errmsg); dbi_result_free(dbires); return 1; } sprintf(sql_command, "INSERT OR REPLACE INTO %s (", table_name+4); while (dbi_result_next_row(dbires1)) { char* create_command; create_command = my_dbi_result_get_string_copy(dbires1, "sql"); if (!create_command) { dbi_result_free(dbires); return 1; } column_list = assemble_column_list(create_command, target_version); free(create_command); if (!column_list || (new_sql_command = mstrcat(sql_command, column_list, &sql_cmd_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); free(column_list); dbi_result_free(dbires); return 1; } else { sql_command = new_sql_command; } } dbi_result_free(dbires1); if (!column_list) { return 1; } if ((new_sql_command = mstrcat(sql_command, ") SELECT ", &sql_cmd_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); dbi_result_free(dbires); return 1; } else { sql_command = new_sql_command; } if ((new_sql_command = mstrcat(sql_command, column_list, &sql_cmd_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); dbi_result_free(dbires); return 1; } else { sql_command = new_sql_command; } free(column_list); sprintf(column_buffer, " FROM %s", table_name); if ((new_sql_command = mstrcat(sql_command, column_buffer, &sql_cmd_len, 0)) == NULL) { LOG_PRINT(LOG_WARNING, get_status_msg(801)); dbi_result_free(dbires); return 1; } else { sql_command = new_sql_command; } LOG_PRINT(LOG_DEBUG, sql_command); dbires1 = dbi_conn_query(conn, sql_command); if (!dbires1) { const char* errmsg; dbi_conn_error(conn, &errmsg); LOG_PRINT(LOG_WARNING, "INSERT into main database failed"); LOG_PRINT(LOG_DEBUG, errmsg); dbi_result_free(dbires); return 1; } dbi_result_free(dbires1); } dbi_result_free(dbires); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ install_sqlite_main_db(): installs the main database (sqlite) int install_sqlite_main_db returns 0 if ok, or >0 if an error occurred struct CLIENT_REQUEST* ptr_clrequest ptr to struct with request data dbi_conn conn connection structure ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int install_sqlite_main_db(struct CLIENT_REQUEST* ptr_clrequest, dbi_conn conn) { char path[_POSIX_PATH_MAX+1] = ""; /* assemble path to sql script */ snprintf(path, _POSIX_PATH_MAX, "%s/sql/refdb.%d.dump.sqlite", refdblib, MAIN_DB_VERSION); /* create new tables */ if (execute_sql_sqlite(ptr_clrequest, conn, path)) { return 1; } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ assemble_column_list(): assembles a list of column names from a create table statement char assemble_column_list returns an allocated string containing the comma-separated list of column names, or NULL if an error occurs const char* create_statement ptr to buffer containing the create table statement short int target_version target version of the upgrade procedure ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static char* assemble_column_list(const char* create_statement, short int target_version) { char* start; char* item; char* item_end; char* column_list; char* new_column_list; size_t column_list_len = 256; if (!create_statement || !*create_statement) { return NULL; } /* printf("create statement went to:%s<<\n", create_statement); */ /* fflush(stdout); */ if ((column_list = malloc(column_list_len)) == NULL) { return NULL; } *column_list = '\0'; start = strchr(create_statement, (int)'('); if (!start) { return NULL; } item = strtok(start+1, ","); while (item) { char* new_item; new_item = stripwhite(item, 1, 1); item_end = strchr(new_item, (int)' '); if (item_end) { *item_end = '\0'; new_item = strip_quote(new_item); /* skip primary key statements */ if (!strcmp(new_item, "PRIMARY")) { continue; } /* skip columns no longer used in version 3 */ if (target_version == 3) { if (!strcmp(new_item, "MISC1PRECEEDING") || !strcmp(new_item, "MISC1FOLLOWING") || !strcmp(new_item, "MISC1STYLE") || !strcmp(new_item, "MISC2PRECEEDING") || !strcmp(new_item, "MISC2FOLLOWING") || !strcmp(new_item, "MISC2STYLE") || !strcmp(new_item, "MISC3PRECEEDING") || !strcmp(new_item, "MISC3FOLLOWING") || !strcmp(new_item, "MISC3STYLE")) { continue; } } if ((new_column_list = mstrcat(column_list, new_item, &column_list_len, 0)) == NULL) { return NULL; } else { column_list = new_column_list; } if ((new_column_list = mstrcat(column_list, ",", &column_list_len, 0)) == NULL) { return NULL; } else { column_list = new_column_list; } } item = strtok(NULL, ","); } /* remove trailing comma */ if (strlen(column_list)) { column_list[strlen(column_list)-1] = '\0'; } return column_list; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ read_sql_from_file(): reads a sql script from a file and turns it into a query string without newlines char* read_sql_from_file returns the query string in an allocated buffer or NULL if an error occurs const char* path ptr to buffer containing the path to the sql file ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static char* read_sql_from_file(const char* path) { char* sql_command; char* new_sql_command; char* linebuf; size_t sql_cmd_len = 65536; size_t linebuf_len = 65536; FILE *fp; if ((sql_command = malloc(sql_cmd_len)) == NULL) { return NULL; } *sql_command = '\0'; if ((linebuf = malloc(linebuf_len)) == NULL) { free(sql_command); return NULL; } fp = fopen(path, "r"); if (fp == NULL) { free(sql_command); free(linebuf); return NULL; } /* loop as long as we find lines */ while (fgets(linebuf, linebuf_len, fp) != NULL) { /* skip empty lines and comments */ if (*linebuf == '\n' || (*linebuf == '-' && *(linebuf+1) == '-')) { continue; } /* strip whitespace including newline from the end */ stripwhite(linebuf, 2, 1); if ((new_sql_command = mstrcat(sql_command, linebuf, &sql_cmd_len, 0)) == NULL) { free(linebuf); free(sql_command); return NULL; } else { sql_command = new_sql_command; } } fclose(fp); free(linebuf); return sql_command; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ read_sql_from_file_to_list(): reads a sql script from a file and inserts individual commands into a linked list char* read_sql_from_file_to_list returns 0 if ok or 1 if an error occurred const char* path ptr to buffer containing the path to the sql file Liliform* ptr_sentinel ptr to the starting member of a linked list that will receive the sql commands ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int read_sql_from_file_to_list(const char* path, Liliform* ptr_sentinel) { char* sql_command; char* new_sql_command; char* linebuf; size_t sql_cmd_len = 65536; size_t linebuf_len = 65536; FILE *fp; if ((sql_command = malloc(sql_cmd_len)) == NULL) { return 1; } *sql_command = '\0'; if ((linebuf = malloc(linebuf_len)) == NULL) { free(sql_command); return 1; } fp = fopen(path, "r"); if (fp == NULL) { free(sql_command); free(linebuf); return 1; } /* loop as long as we find lines */ while (fgets(linebuf, linebuf_len, fp) != NULL) { /* skip empty lines and comments */ if (*linebuf == '\n' || (*linebuf == '-' && *(linebuf+1) == '-')) { continue; } if (strchr(linebuf, (int)';')) { /* this is either an oneliner or the last line of a multiline command. Append to existing command string and insert into linked list */ /* strip whitespace excluding newline from the end */ stripwhite(linebuf, 2, 0); if ((new_sql_command = mstrcat(sql_command, linebuf, &sql_cmd_len, 0)) == NULL) { free(sql_command); free(linebuf); return 1; } else { sql_command = new_sql_command; } if (append_liliform(ptr_sentinel, "dummy", sql_command)) { free(linebuf); return 1; } *sql_command = '\0'; } else if (*linebuf) { /* don't bother if there's nothing to read */ /* this is a part of a multiline command */ /* strip whitespace including newline from the end */ stripwhite(linebuf, 2, 1); if ((new_sql_command = mstrcat(sql_command, linebuf, &sql_cmd_len, 0)) == NULL) { free(sql_command); free(linebuf); return 1; } else { sql_command = new_sql_command; } } } fclose(fp); free(sql_command); free(linebuf); return 0; } refdb-1.0.2/src/refdbdcheckref.c000644 001750 001750 00000202077 12255427652 017340 0ustar00markusmarkus000000 000000 /*++++++++++++++++++++ refdbdcheckref.c: compare references markus@mhoenicka.de 2006-09-29 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, see +++++++++++++++++++++++++*/ #include #include #include #include #include #include "refdb.h" #include "linklist.h" #include "refdbd.h" #include "backend.h" #include "strfncs.h" #include "connect.h" #include "dbfncs.h" #include "refdbdcheckref.h" #include "backend-html.h" /* prototypes */ static int find_duplicate_title(dbi_conn conn); static int find_duplicate_location(dbi_conn conn); static int find_duplicate_citekey(dbi_conn conn); static int find_author_variants(dbi_conn conn); static int find_keyword_variants(dbi_conn conn); static int find_periodical_variants(dbi_conn conn); char* create_periodical_regexp_string(const char* periodical_abbrev); static int create_dupreport(struct CLIENT_REQUEST* ptr_clrequest, struct renderinfo* ptr_rendinfo, dbi_conn conn, int outformat); static int create_dupreport_scrn(struct CLIENT_REQUEST* ptr_clrequest, dbi_conn conn); static int create_dupreport_xhtml(struct CLIENT_REQUEST* ptr_clrequest, struct renderinfo* ptr_rendinfo, dbi_conn conn); static char* format_title_line(char* destination, size_t* ptr_dest_len, const char* title, const char *temp_title, unsigned long long refdb_id, int title_level, const char* match_type); static dbi_result retrieve_bibdata(dbi_conn conn, unsigned long long refdb_id); static int write_tooltips(struct CLIENT_REQUEST* ptr_clrequest); /* some globals */ extern int n_log_level; /* numeric version of log_level */ /* this chunk of xhtml code is inserted at the top of the xhtml output and contains the tooltips of the checkref command */ char tooltips[] = "
\n" "
$label \n"; if(isset($rows[$field])){ echo " \n"; } else if($field=="RP"){ echo " \n"; echo " (Requested:"; $datetype="onrequestday"; $date=date("d"); dateChooser($datetype,$date); echo "/"; $datetype="onrequestdatemonth"; $month=date("F"); monthChooser($datetype,$month); echo "/"; echo " )"; } else if(isset($is_date[$field])){ echo "  "; echo " ("; monthChooser("form".$field."month",$default['month']); echo " "; dateChooser("form".$field."day",$default['day']); echo "/"; echo " )"; } else { echo " \n"; } if(isset($tips[$field])){ echo " $tips[$field]\n"; } echo "
", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); retval = 801; goto cleanup; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } /* get reference count for later use */ refcount = get_reference_count(dbi_result_get_conn(ptr_rendinfo->dbires), NULL, 0 /* istemp */); /*----------------------------------------------------------------*/ /* ID */ get_refdb_id(ptr_rendinfo->dbires, id); if (*id) { if (n_cgi) { /* misuse date_buffer */ sprintf(date_buffer, " ", id, id); if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), date_buffer, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); retval = 801; goto cleanup; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } /* else: do nothing */ } else { LOG_PRINT(LOG_WARNING, get_status_msg(234)); retval = 234; goto cleanup; } /* each reference is wrapped in a div element */ if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "
\n", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); retval = 801; goto cleanup; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } /* misuse date_buffer */ if (is_in_list(ptr_rendinfo->dbires, ptr_rendinfo->username) == 1) { strcpy(date_buffer, "

ID:"); } else { strcpy(date_buffer, "

ID:"); } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), date_buffer, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); retval = 801; goto cleanup; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } /* ID */ if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), id, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); retval = 801; goto cleanup; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "

\n", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); retval = 801; goto cleanup; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } /*----------------------------------------------------------------*/ /* citation key */ item = get_refdb_citekey(ptr_rendinfo->dbires); /* citation key is preprocessed and cannot contain offending xml chars */ if (item && *item) { if (print_field_html(item, ptr_rendinfo, "

CITEKEY:") == NULL) { return 234; } } /*----------------------------------------------------------------*/ /* the part apparatus (analytic) */ if (has_part_data(type)) { if ((retval = add_partdata_html(&buffer, &buffer_len, ptr_rendinfo, n_istemp, refcount)) != 0) { goto cleanup; } else if (*buffer) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "

\n", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); retval = 801; goto cleanup; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), buffer, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); retval = 801; goto cleanup; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "
\n", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); retval = 801; goto cleanup; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } *buffer = '\0'; } /*----------------------------------------------------------------*/ /* the publication apparatus (monographic) */ if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "
\n", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if (has_chapter_data(type)) { /* use a verbal separator to start the monographic data */ if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "in:\n", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } /*----------------------------------------------------------------*/ /* authors */ if ((retval = add_author_info_html(&buffer, &buffer_len, 2 /* publication */, ptr_rendinfo, n_istemp, refcount)) != 0) { goto cleanup; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), buffer, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); retval = 801; goto cleanup; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } *buffer = '\0'; if (has_periodical_data(type)) { /*----------------------------------------------------------------*/ /* periodical */ int rel_frequency; char buffer[64]; nhave_para = 1; if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "

", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } /* fetch journal of this article */ if ((item = get_periodical(dbi_result_get_conn(ptr_rendinfo->dbires), date_buffer, NULL, 4, &errcode, n_istemp, my_dbi_result_get_idval(ptr_rendinfo->dbires, "refdb_id"), &frequency)) != NULL) { rel_frequency = calculate_relative_frequency(frequency, refcount); sprintf(buffer, "", rel_frequency); if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), buffer, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((entitize_buf = strdup(item)) != NULL && sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), entitize_buf, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(entitize_buf); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } free(entitize_buf); if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), " ", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } } /*----------------------------------------------------------------*/ /* publication title */ item = get_refdb_booktitle_copy(ptr_rendinfo->dbires); if (item != NULL) { nhave_booktitle++; if (sgml_entitize((char**)&item, ptr_rendinfo->ref_format) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), (char*)item, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { /* book title */ LOG_PRINT(LOG_CRIT, get_status_msg(801)); free((char*)item); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } free((char*)item); if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } /*----------------------------------------------------------------*/ /* edition */ item = get_refdb_edition(ptr_rendinfo->dbires); if (item != NULL) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), " (", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((entitize_buf = strdup(item)) != NULL && sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), entitize_buf, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { /* volume */ LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(entitize_buf); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } free(entitize_buf); if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), ".edition) ", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } /*----------------------------------------------------------------*/ /* volume */ item = get_refdb_volume(ptr_rendinfo->dbires); if (item != NULL) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((entitize_buf = strdup(item)) != NULL && sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), entitize_buf, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { /* volume */ LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(entitize_buf); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } free(entitize_buf); if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } /*----------------------------------------------------------------*/ /* issue */ item = get_refdb_issue(ptr_rendinfo->dbires); if (item != NULL) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "(", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((entitize_buf = strdup(item)) != NULL && sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), entitize_buf, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { /* issue */ LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(entitize_buf); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } free(entitize_buf); if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), ")", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } /*----------------------------------------------------------------*/ /* startpage */ item = get_refdb_startpage(ptr_rendinfo->dbires); if (item != NULL) { have_page++; if (strcmp(type, "BOOK") == 0 || strcmp(type, "SER") == 0 || strcmp(type, "THES") == 0 || strcmp(type, "RPRT") == 0 || strcmp(type, "CHAP") == 0) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "pp. ", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } else { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), ":", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } if ((entitize_buf = strdup(item)) != NULL && sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), entitize_buf, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { /* start page */ LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(entitize_buf); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } free(entitize_buf); } /*----------------------------------------------------------------*/ /* endpage */ item = get_refdb_endpage(ptr_rendinfo->dbires); if (item != NULL) { have_page++; if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "-", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((entitize_buf = strdup(item)) != NULL && sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), entitize_buf, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { /* end page */ LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(entitize_buf); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } free(entitize_buf); } if (have_page) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } /*----------------------------------------------------------------*/ /* pubyear */ item = get_refdb_pubyear(ptr_rendinfo->dbires, date_buffer); if (item != NULL) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), " (", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } /* year */ if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), date_buffer, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), ")", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } if (nhave_para) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "

\n", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "\n
\n", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } /*----------------------------------------------------------------*/ /* the set apparatus (series) */ if (has_set_data(type)) { if ((retval = add_setdata_html(&buffer, &buffer_len, ptr_rendinfo, n_istemp, refcount)) != 0) { goto cleanup; } else if (*buffer) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "
\npart of: ", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); retval = 801; goto cleanup; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), buffer, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); retval = 801; goto cleanup; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "
\n", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); retval = 801; goto cleanup; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } *buffer = '\0'; } /*----------------------------------------------------------------*/ /* abstract */ if (strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "N2") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "AB") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "ALL") != NULL) { item = get_refdb_abstract_copy(ptr_rendinfo->dbires); if (item != NULL) { if (sgml_entitize((char**)&item, ptr_rendinfo->ref_format) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free((char*)item); return 801; } if (print_field_html(item, ptr_rendinfo, "

ABSTRACT: ") == NULL) { free((char*)item); return 801; } free((char*)item); } } /*----------------------------------------------------------------*/ /* address */ if (strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "AD") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "ALL") != NULL) { item = get_refdb_address_copy(ptr_rendinfo->dbires); if (item != NULL) { if (sgml_entitize((char**)&item, ptr_rendinfo->ref_format) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free((char*)item); return 801; } if (print_field_html(item, ptr_rendinfo, "

ADDRESS: ") == NULL) { free((char*)item); return 801; } free((char*)item); } } /*----------------------------------------------------------------*/ /* reprint, availability */ if (strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "RP") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "ALL") != NULL) { if (get_reprint(ptr_rendinfo->dbires, &reprint, ptr_rendinfo->username, 4) != NULL && reprint.reprint != NULL && *(reprint.reprint)) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "

REPRINT: ", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), reprint.reprint, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if (reprint.date != NULL && *(reprint.date)) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), " (", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), reprint.date, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), ")", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } } if (reprint.date != NULL && *(reprint.date)) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), ": ", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), reprint.date, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } if (reprint.avail != NULL && *(reprint.avail)) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), ": ", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } avail = mstrdup(reprint.avail); if (avail == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } if (strncmp(strup(avail), "PATH:", 5) == 0) { free(avail); /* if pdfroot specifies a protocol, use it as a prefix for the href attribute. If not, add file:// as a pseudo protocol */ if (strncmp(ptr_rendinfo->pdfroot, "http://", 7) == 0 || strncmp(ptr_rendinfo->pdfroot, "HTTP://", 7) == 0 || strncmp(ptr_rendinfo->pdfroot, "ftp://", 6) == 0 || strncmp(ptr_rendinfo->pdfroot, "FTP://", 6) == 0 || strncmp(ptr_rendinfo->pdfroot, "file://", 7) == 0 || strncmp(ptr_rendinfo->pdfroot, "FILE://", 7) == 0) { strcpy(href_buffer, "ptr_ref), href_buffer, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if (*(ptr_rendinfo->pdfroot)) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), ptr_rendinfo->pdfroot, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } if ((entitize_buf = strdup(reprint.avail+5)) != NULL && sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), entitize_buf, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(entitize_buf); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "\">", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(entitize_buf); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if (*(ptr_rendinfo->pdfroot)) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), ptr_rendinfo->pdfroot, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), entitize_buf, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(entitize_buf); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } free(entitize_buf); if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } else { int n_renderaslink = 0; free(avail); /* if the availability string starts with a protocol specifier, render the string as a link */ if (strncmp(reprint.avail, "http://", 7) == 0 || strncmp(reprint.avail, "HTTP://", 7) == 0 || strncmp(reprint.avail, "ftp://", 6) == 0 || strncmp(reprint.avail, "FTP://", 6) == 0 || strncmp(reprint.avail, "file://", 7) == 0 || strncmp(reprint.avail, "FILE://", 7) == 0) { n_renderaslink++; if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((entitize_buf = strdup(reprint.avail)) != NULL && sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), entitize_buf, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(entitize_buf); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "\">", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(entitize_buf); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), entitize_buf, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free(entitize_buf); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } free(entitize_buf); if (n_renderaslink) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } } } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "

\n", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } /*----------------------------------------------------------------*/ /* ISBN/ISSN */ if (strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "SN") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "ALL") != NULL) { item = get_refdb_issn(ptr_rendinfo->dbires); if (item) { if ((entitize_buf = strdup(item)) != NULL && sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } if (print_field_html(entitize_buf, ptr_rendinfo, "

ISSN: ") == NULL) { free(entitize_buf); return 801; } free(entitize_buf); } } /*----------------------------------------------------------------*/ /* publisher */ if (strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "PB") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "ALL") != NULL) { item = get_refdb_publisher(ptr_rendinfo->dbires); if (item) { if ((entitize_buf = strdup(item)) != NULL && sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } if (print_field_html(entitize_buf, ptr_rendinfo, "

PUBLISHER: ") == NULL) { free(entitize_buf); return 801; } free(entitize_buf); } } /*----------------------------------------------------------------*/ /* city */ if (strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "CY") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "ALL") != NULL) { item = get_refdb_city(ptr_rendinfo->dbires); if (item) { if ((entitize_buf = strdup(item)) != NULL && sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } if (print_field_html(entitize_buf, ptr_rendinfo, "

CITY: ") == NULL) { free(entitize_buf); return 801; } free(entitize_buf); } } /*----------------------------------------------------------------*/ /* keywords */ if (strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "KW") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "ALL") != NULL) { int rel_frequency; int have_keyword = 0; char buffer[64]; dbires = request_keywords(conn, my_dbi_result_get_idval(ptr_rendinfo->dbires, "refdb_id"), 0, n_istemp); if (dbires == NULL) { return 234; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "

KEYWORDS: ", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { clean_request(dbires); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } /* fetch all keywords of this article */ while ((item = get_extended_keyword(dbires, n_istemp, &frequency)) != NULL) { have_keyword = 1; rel_frequency = calculate_relative_frequency(frequency, refcount); if ((entitize_buf = strdup(item)) == NULL || sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } /* todo: use relative frequency instead of absolute, e.g. an integer between 1 and 10 */ sprintf(buffer, "", rel_frequency); if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), buffer, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { clean_request(dbires); free(entitize_buf); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), entitize_buf, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { clean_request(dbires); free(entitize_buf); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } free(entitize_buf); if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "; ", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { clean_request(dbires); LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } clean_request(dbires); if (have_keyword) { /* eliminate the trailing comma after the last author */ new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "

\n", ptr_rendinfo->ptr_ref_len, 2); } else { new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "

\n", ptr_rendinfo->ptr_ref_len, 0); } if (new_ref == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } /*----------------------------------------------------------------*/ /* user fields */ if (strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "U1") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "ALL") != NULL) { item = get_refdb_user1(ptr_rendinfo->dbires); if (item) { if ((entitize_buf = strdup(item)) != NULL && sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } if (print_field_html(entitize_buf, ptr_rendinfo, "

USER1: ") == NULL) { free(entitize_buf); return 801; } free(entitize_buf); } } if (strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "U2") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "ALL") != NULL) { item = get_refdb_user2(ptr_rendinfo->dbires); if (item) { if ((entitize_buf = strdup(item)) != NULL && sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } if (print_field_html(entitize_buf, ptr_rendinfo, "

USER2: ") == NULL) { free(entitize_buf); return 801; } free(entitize_buf); } } if (strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "U3") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "ALL") != NULL) { item = get_refdb_user3(ptr_rendinfo->dbires); if (item) { if ((entitize_buf = strdup(item)) != NULL && sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } if (print_field_html(entitize_buf, ptr_rendinfo, "

USER3: ") == NULL) { free(entitize_buf); return 801; } free(entitize_buf); } } if (strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "U4") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "ALL") != NULL) { item = get_refdb_user4(ptr_rendinfo->dbires); if (item) { if ((entitize_buf = strdup(item)) != NULL && sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } if (print_field_html(entitize_buf, ptr_rendinfo, "

USER4: ") == NULL) { free(entitize_buf); return 801; } free(entitize_buf); } } if (strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "U5") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "ALL") != NULL) { item = get_refdb_user5(ptr_rendinfo->dbires); if (item) { if ((entitize_buf = strdup(item)) != NULL && sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } if (print_field_html(entitize_buf, ptr_rendinfo, "

USER5: ") == NULL) { free(entitize_buf); return 801; } free(entitize_buf); } } /*----------------------------------------------------------------*/ /* misc fields */ if (strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "MX") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "ALL") != NULL) { item = get_refdb_typeofwork(ptr_rendinfo->dbires); if (item && *item) { if ((entitize_buf = strdup(item)) != NULL && sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } if (print_field_html(entitize_buf, ptr_rendinfo, "

TYPE OF WORK: ") == NULL) { free(entitize_buf); return 801; } free(entitize_buf); } item = get_refdb_area(ptr_rendinfo->dbires); if (item && *item) { if ((entitize_buf = strdup(item)) != NULL && sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } if (print_field_html(entitize_buf, ptr_rendinfo, "

AREA: ") == NULL) { free(entitize_buf); return 801; } free(entitize_buf); } item = get_refdb_ostype(ptr_rendinfo->dbires); if (item && *item) { if ((entitize_buf = strdup(item)) != NULL && sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } if (print_field_html(entitize_buf, ptr_rendinfo, "

OS TYPE: ") == NULL) { free(entitize_buf); return 801; } free(entitize_buf); } item = get_refdb_degree(ptr_rendinfo->dbires); if (item && *item) { if ((entitize_buf = strdup(item)) != NULL && sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } if (print_field_html(entitize_buf, ptr_rendinfo, "

DEGREE: ") == NULL) { free(entitize_buf); return 801; } free(entitize_buf); } item = get_refdb_runningtime(ptr_rendinfo->dbires); if (item && *item) { if ((entitize_buf = strdup(item)) != NULL && sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } if (print_field_html(entitize_buf, ptr_rendinfo, "

RUNNING TIME: ") == NULL) { free(entitize_buf); return 801; } free(entitize_buf); } item = get_refdb_classcodeintl(ptr_rendinfo->dbires); if (item && *item) { if ((entitize_buf = strdup(item)) != NULL && sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } if (print_field_html(entitize_buf, ptr_rendinfo, "

CLASS CODE (INTL): ") == NULL) { free(entitize_buf); return 801; } free(entitize_buf); } item = get_refdb_classcodeus(ptr_rendinfo->dbires); if (item && *item) { if ((entitize_buf = strdup(item)) != NULL && sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } if (print_field_html(entitize_buf, ptr_rendinfo, "

CLASS CODE (US): ") == NULL) { free(entitize_buf); return 801; } free(entitize_buf); } item = get_refdb_senderemail(ptr_rendinfo->dbires); if (item && *item) { if ((entitize_buf = strdup(item)) != NULL && sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } if (print_field_html(entitize_buf, ptr_rendinfo, "

EMAIL (SENDER): ") == NULL) { free(entitize_buf); return 801; } free(entitize_buf); } item = get_refdb_recipientemail(ptr_rendinfo->dbires); if (item && *item) { if ((entitize_buf = strdup(item)) != NULL && sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } if (print_field_html(entitize_buf, ptr_rendinfo, "

EMAIL (RECIPIENT): ") == NULL) { free(entitize_buf); return 801; } free(entitize_buf); } item = get_refdb_mediatype(ptr_rendinfo->dbires); if (item && *item) { if ((entitize_buf = strdup(item)) != NULL && sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } if (print_field_html(entitize_buf, ptr_rendinfo, "

MEDIA TYPE: ") == NULL) { free(entitize_buf); return 801; } free(entitize_buf); } item = get_refdb_numvolumes(ptr_rendinfo->dbires); if (item && *item) { if ((entitize_buf = strdup(item)) != NULL && sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } if (print_field_html(entitize_buf, ptr_rendinfo, "

NUMBER OF VOLUMES: ") == NULL) { free(entitize_buf); return 801; } free(entitize_buf); } item = get_refdb_computer(ptr_rendinfo->dbires); if (item && *item) { if ((entitize_buf = strdup(item)) != NULL && sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } if (print_field_html(entitize_buf, ptr_rendinfo, "

COMPUTER: ") == NULL) { free(entitize_buf); return 801; } free(entitize_buf); } item = get_refdb_conferencelocation(ptr_rendinfo->dbires); if (item && *item) { if ((entitize_buf = strdup(item)) != NULL && sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } if (print_field_html(entitize_buf, ptr_rendinfo, "

CONFERENCE LOCATION: ") == NULL) { free(entitize_buf); return 801; } free(entitize_buf); } item = get_refdb_registrynum(ptr_rendinfo->dbires); if (item && *item) { if ((entitize_buf = strdup(item)) != NULL && sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } if (print_field_html(entitize_buf, ptr_rendinfo, "

REGISTRY NUMBER: ") == NULL) { free(entitize_buf); return 801; } free(entitize_buf); } item = get_refdb_classification(ptr_rendinfo->dbires); if (item && *item) { if ((entitize_buf = strdup(item)) != NULL && sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } if (print_field_html(entitize_buf, ptr_rendinfo, "

CLASSIFICATION: ") == NULL) { free(entitize_buf); return 801; } free(entitize_buf); } item = get_refdb_section(ptr_rendinfo->dbires); if (item && *item) { if ((entitize_buf = strdup(item)) != NULL && sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } if (print_field_html(entitize_buf, ptr_rendinfo, "

SECTION: ") == NULL) { free(entitize_buf); return 801; } free(entitize_buf); } item = get_refdb_pamphletnum(ptr_rendinfo->dbires); if (item && *item) { if ((entitize_buf = strdup(item)) != NULL && sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } if (print_field_html(entitize_buf, ptr_rendinfo, "

PAMPHLET NUMBER: ") == NULL) { free(entitize_buf); return 801; } free(entitize_buf); } item = get_refdb_chapternum(ptr_rendinfo->dbires); if (item && *item) { if ((entitize_buf = strdup(item)) != NULL && sgml_entitize(&entitize_buf, ptr_rendinfo->ref_format) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } if (print_field_html(entitize_buf, ptr_rendinfo, "

CHAPTER NUMBER: ") == NULL) { free(entitize_buf); return 801; } free(entitize_buf); } } /*----------------------------------------------------------------*/ /* URL, L1-L4, DOI */ if (strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "UR") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "DOI") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "LX") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "ALL") != NULL) { int i; char *entitize_string; char keytype[6][10] = {"URL", "PDF", "FULLTEXT", "RELATED", "IMAGE", "DOI"}; char buffer[64]; /* loop over all link types */ for (i=0; i<6;i++) { dbires = request_ulinks(conn, my_dbi_result_get_idval(ptr_rendinfo->dbires, "refdb_id"), 0 /* ref entry */, i /* link type */, n_istemp, ptr_rendinfo->username); if (dbires == NULL) { return 234; } while ((item = get_ulink(dbires)) != NULL) { if (i != 5) { /* render link as is */ sprintf(buffer, "

%s: %s: ptr_ref), buffer, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); clean_request(dbires); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if (i>0 && i<5) { entitize_string = add_root_to_link(item, ptr_rendinfo->pdfroot); } else { entitize_string = strdup(item); } if (entitize_string == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); clean_request(dbires); return 801; } if (sgml_entitize(&entitize_string, ptr_rendinfo->ref_format) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); clean_request(dbires); free(entitize_string); return 801; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), entitize_string, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); clean_request(dbires); free(entitize_string); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "\">", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); clean_request(dbires); free(entitize_string); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), entitize_string, ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); clean_request(dbires); free(entitize_string); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } free(entitize_string); if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "

\n", ptr_rendinfo->ptr_ref_len, 0)) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); return 801; } else { *(ptr_rendinfo->ptr_ref) = new_ref; } } /* end while */ clean_request(dbires); } /* end for */ } /*----------------------------------------------------------------*/ /* notes */ if (strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "N1") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "ALL") != NULL) { item = get_notes_copy(ptr_rendinfo->dbires, ptr_rendinfo->username); if (item != NULL) { if (sgml_entitize((char**)&item, ptr_rendinfo->ref_format) == NULL) { LOG_PRINT(LOG_CRIT, get_status_msg(801)); free((char*)item); return 801; } if (print_field_html(item, ptr_rendinfo, "

NOTES:") == NULL) { free((char*)item); return 801; } free((char*)item); } } /*----------------------------------------------------------------*/ /* extended notes */ if (strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "NX") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "ALL") != NULL) { dbi_result orig_dbires; /* look for additional notes linked with the record, keywords, authors, or periodicals */ /* see whether to include reference lists */ if (strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "NL") != NULL || strstr((ptr_rendinfo->ptr_biblio_info)->format_string, "ALL") != NULL) { if ((dbires = request_notes_by_ref(dbi_result_get_conn(ptr_rendinfo->dbires), atoll(id), REFERENCE|KEYWORD|AUTHOR|PERIODICAL, ptr_rendinfo->username, ptr_rendinfo->ptr_clrequest->share_default, 1/* include lists */)) == NULL) { /* printf("request_notes_by_ref() failed\n"); */ free_request_notes_by_ref(dbi_result_get_conn(ptr_rendinfo->dbires)); return 234; } } else { if ((dbires = request_notes_by_ref(dbi_result_get_conn(ptr_rendinfo->dbires), atoll(id), REFERENCE|KEYWORD|AUTHOR|PERIODICAL, ptr_rendinfo->username, ptr_rendinfo->ptr_clrequest->share_default, 0/* exclude lists */)) == NULL) { /* printf("request_notes_by_ref() failed\n"); */ free_request_notes_by_ref(dbi_result_get_conn(ptr_rendinfo->dbires)); return 234; } } /* save original query result. This is legal as dbi_result is a pointer in disguise */ orig_dbires = ptr_rendinfo->dbires; ptr_rendinfo->dbires = dbires; while (dbi_result_next_row(ptr_rendinfo->dbires) != 0) { if ((render_res = render_note(ptr_rendinfo)) != 0) { ptr_rendinfo->dbires = orig_dbires; clean_request(dbires); free_request_notes_by_ref(dbi_result_get_conn(ptr_rendinfo->dbires)); return render_res; } } clean_request(dbires); free_request_notes_by_ref(dbi_result_get_conn(orig_dbires)); ptr_rendinfo->dbires = orig_dbires; } if (n_cgi) { if ((new_ref = mstrcat(*(ptr_rendinfo->ptr_ref), "

\n" "
The database contains an entry with the same title. If the references are identical, you should not add the new reference to avoid duplicates.
\n" "
" "
\n" "\n" "
The database contains an entry with a title that differs only in case. It is possible that the references are identical, in which case you don't want to add the new one.
\n" "
""
\n" "\n" "
The database contains an entry with the same title. If the references are identical, you should not add the new reference to avoid duplicates.
\n" "
""
\n" "\n" "
The database contains an entry with a title that differs only in case. It is possible that the references are identical, in which case you don't want to add the new one.
\n" "
""
\n" "\n" "
The database contains an entry with the same title. If the references are identical, you should not add the new reference to avoid duplicates.
\n" "
""
\n" "\n" "
The database contains an entry with a title that differs only in case. It is possible that the references are identical, in which case you don't want to add the new one.
\n" "
""
\n" "\n" "
The database contains an article that was published in the same year, in the same periodical, and on the same starting page of the same volume and issue. The references are likely to be identical, so you should not add this reference to avoid duplicates.
\n" "
""
\n" "\n" "
The database contains a reference with the same citation key. If the checked reference specifies a citation key, you should either change it, or remove it and thus let RefDB choose one. If the reference does not specify a citation key, RefDB will automatically choose a unique citation key.
\n" "
""
\n" "\n" "
Check whether the abbreviated authorname and the" "full authorname belong to the same person. In this case you should expand the abbreviated name to the full name.
\n" "
""
\n" "\n" "
This keyword is similar to one already used in the database. To make your searches more consistent, you may want to change the keyword.
\n" "
" """
\n" "\n" "
The database contains a periodical name which may be the expanded version of the abbreviation in the checked reference or vice versa. If this is the case, you may want to specify both the full and the abbreviated name in the checked reference to tell RefDB the periodicals are identical.
\n" "
"; /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ check_references(): check references for duplicates int check_references returns 0 if ok, >0 if an error occurred struct CLIENT_REQUEST ptr_clrequest ptr to struct containing connection information struct renderinfo* ptr_rendinfo ptr to struct containing rendering hints dbi_conn conn pointer to a data structure for a previously established database session. The caller is responsible to establish this connection and to take it down again after this function returns. int outformat output format (REFSCRN|REFXHTML) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int check_references(struct CLIENT_REQUEST* ptr_clrequest, struct renderinfo* ptr_rendinfo, dbi_conn conn, int outformat) { int retval = 0; /* create additional temporary table to hold the relationships between references and possible duplicates */ if (!strcmp(ptr_clrequest->dbserver, "mysql")) { retval = create_xdup_tables_mysql(conn); } else if (!strcmp(ptr_clrequest->dbserver, "pgsql")) { retval = create_xdup_tables_pgsql(conn); } else if (!strcmp(ptr_clrequest->dbserver, "sqlite")) { retval = create_xdup_tables_sqlite(conn); } else if (!strcmp(ptr_clrequest->dbserver, "sqlite3")) { retval = create_xdup_tables_sqlite3(conn); } else { /* we're not supposed to ever hit this */ retval = 1; /* error */ } if (retval) { return retval; } if (!*(ptr_clrequest->check_string) || strstr(ptr_clrequest->check_string, "TX")) { /* check titles */ retval = find_duplicate_title(conn); if (retval) { return retval; } } if (!*(ptr_clrequest->check_string) || strstr(ptr_clrequest->check_string, "PY")) { /* check pubdate, volume, issue, pages */ retval = find_duplicate_location(conn); if (retval) { return retval; } } if (!*(ptr_clrequest->check_string) || strstr(ptr_clrequest->check_string, "CK")) { /* check citation keys */ retval = find_duplicate_citekey(conn); if (retval) { return retval; } } if (!*(ptr_clrequest->check_string) || strstr(ptr_clrequest->check_string, "AX")) { /* check authorlists */ retval = find_author_variants(conn); if (retval) { return retval; } } if (!*(ptr_clrequest->check_string) || strstr(ptr_clrequest->check_string, "KW")) { /* check keywords */ retval = find_keyword_variants(conn); if (retval) { return retval; } } if (!*(ptr_clrequest->check_string) || strstr(ptr_clrequest->check_string, "JO")) { /* check periodical synonyms */ retval = find_periodical_variants(conn); if (retval) { return retval; } } /* compile report */ retval = create_dupreport(ptr_clrequest, ptr_rendinfo, conn, outformat); /* the temporary tables will be dropped automatically as soon as the calling function terminates the connection */ return retval; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ find_duplicate_title(): check references for duplicate titles int find_duplicate_title returns 0 if ok, >0 if an error occurred dbi_conn conn pointer to a data structure for a previously established database session. The caller is responsible to establish this connection and to take it down again after this function returns. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int find_duplicate_title(dbi_conn conn) { char* sql_command; const char* my_title; const char* my_temp_title; const char* my_booktitle; const char* my_temp_booktitle; const char* my_title_series; const char* my_temp_title_series; char* my_quoted_title; char* my_quoted_temp_title; char* my_quoted_booktitle; char* my_quoted_temp_booktitle; char* my_quoted_title_series; char* my_quoted_temp_title_series; size_t sql_cmd_len; unsigned long long my_refdb_id; unsigned long long my_temp_refdb_id; dbi_result dbires; dbi_result dbires1; dbi_result dbires2; sql_cmd_len = 1024; if ((sql_command = malloc(sql_cmd_len)) == NULL) { return 801; } /* check for identical title */ snprintf(sql_command, sql_cmd_len, "SELECT DISTINCT t_refdb.refdb_id, t_%srefdb.refdb_id, t_refdb.refdb_title, t_%srefdb.refdb_title, t_refdb.refdb_booktitle, t_%srefdb.refdb_booktitle, t_refdb.refdb_title_series, t_%srefdb.refdb_title_series FROM t_refdb,t_%srefdb WHERE t_refdb.refdb_title=t_%srefdb.refdb_title OR t_refdb.refdb_booktitle=t_%srefdb.refdb_booktitle OR t_refdb.refdb_title_series=t_%srefdb.refdb_title_series", TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); return 207; } while (dbi_result_next_row(dbires)) { my_refdb_id = my_dbi_result_get_idval_idx(dbires, 1); my_temp_refdb_id = my_dbi_result_get_idval_idx(dbires, 2); my_title = my_dbi_result_get_string_idx(dbires, 3); my_temp_title = my_dbi_result_get_string_idx(dbires, 4); my_booktitle = my_dbi_result_get_string_idx(dbires, 5); my_temp_booktitle = my_dbi_result_get_string_idx(dbires, 6); my_title_series = my_dbi_result_get_string_idx(dbires, 7); my_temp_title_series = my_dbi_result_get_string_idx(dbires, 8); if (!my_refdb_id || !my_temp_refdb_id) { continue; } if (my_title && my_temp_title) { my_quoted_title = strdup(my_title); my_quoted_temp_title = strdup(my_temp_title); if (!my_quoted_title || !dbi_conn_quote_string(conn, &my_quoted_title) || !my_quoted_temp_title || !dbi_conn_quote_string(conn, &my_quoted_temp_title)) { dbi_result_free(dbires); return 801; } } else { my_quoted_title = NULL; my_quoted_temp_title = NULL; } if (my_booktitle && my_temp_booktitle) { my_quoted_booktitle = strdup(my_booktitle); my_quoted_temp_booktitle = strdup(my_temp_booktitle); if (!my_quoted_booktitle || !dbi_conn_quote_string(conn, &my_quoted_booktitle) || !my_quoted_temp_booktitle || !dbi_conn_quote_string(conn, &my_quoted_temp_booktitle)) { dbi_result_free(dbires); return 801; } } else { my_quoted_booktitle = NULL; my_quoted_temp_booktitle = NULL; } if (my_title_series && my_temp_title_series) { my_quoted_title_series = strdup(my_title_series); my_quoted_temp_title_series = strdup(my_temp_title_series); if (!my_quoted_title_series || !dbi_conn_quote_string(conn, &my_quoted_title_series) || !my_quoted_temp_title_series || !dbi_conn_quote_string(conn, &my_quoted_temp_title_series)) { dbi_result_free(dbires); return 801; } } else { my_quoted_title_series = NULL; my_quoted_temp_title_series = NULL; } sprintf(sql_command, "INSERT INTO t_temp_xdup (xdup_type, match_type, temp_refdb_id, refdb_id, value_name, temp_value_name, value_name_2, temp_value_name_2, value_name_3, temp_value_name_3) VALUES (\'TITLE\',\'IDENT\',"ULLSPEC","ULLSPEC",%s,%s,%s,%s,%s,%s)", (unsigned long long)my_temp_refdb_id, (unsigned long long)my_refdb_id, (my_quoted_title) ? my_quoted_title:"NULL", (my_quoted_temp_title) ? my_quoted_temp_title:"NULL", (my_quoted_booktitle) ? my_quoted_booktitle:"NULL", (my_quoted_temp_booktitle) ? my_quoted_temp_booktitle:"NULL", (my_quoted_title_series) ? my_quoted_title_series:"NULL", (my_quoted_temp_title_series) ? my_quoted_temp_title_series:"NULL"); LOG_PRINT(LOG_INFO, sql_command); dbires1 = dbi_conn_query(conn, sql_command); if (!dbires1) { /* TODO: bail out? */ continue; } dbi_result_free(dbires1); free(my_quoted_title); free(my_quoted_temp_title); free(my_quoted_booktitle); free(my_quoted_temp_booktitle); free(my_quoted_title_series); free(my_quoted_temp_title_series); } dbi_result_free(dbires); /* check for identical title (case-insensitive) */ /* this may not always work as expected as the conversion from lowercase to uppercase depends on the character encoding. Some database engines use the C library toupper function which works correctly only on ASCII strings */ if (!strcmp(my_dbi_conn_get_cap(conn, "except"), "t")) { /* the EXCEPT clause removes all references from the result set which are already marked in the duplicates table as TITLE IDENT */ snprintf(sql_command, sql_cmd_len, "SELECT DISTINCT t_refdb.refdb_id, t_%srefdb.refdb_id, t_refdb.refdb_title, t_%srefdb.refdb_title, t_refdb.refdb_booktitle, t_%srefdb.refdb_booktitle, t_refdb.refdb_title_series, t_%srefdb.refdb_title_series FROM t_refdb,t_%srefdb,t_temp_xdup WHERE UPPER(t_refdb.refdb_title)=UPPER(t_%srefdb.refdb_title) OR UPPER(t_refdb.refdb_booktitle)=UPPER(t_%srefdb.refdb_booktitle) OR UPPER(t_refdb.refdb_title_series)=UPPER(t_%srefdb.refdb_title_series) EXCEPT SELECT DISTINCT t_refdb.refdb_id, t_%srefdb.refdb_id, t_refdb.refdb_title, t_%srefdb.refdb_title, t_refdb.refdb_booktitle, t_%srefdb.refdb_booktitle, t_refdb.refdb_title_series, t_%srefdb.refdb_title_series FROM t_refdb,t_%srefdb,t_temp_xdup WHERE t_temp_xdup.refdb_id=t_refdb.refdb_id AND t_temp_xdup.xdup_type=\'TITLE\' and t_temp_xdup.match_type=\'IDENT\'", TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); return 207; } /* loop over all matching references and create a TITLE CASE entry in the duplicates table */ while (dbi_result_next_row(dbires)) { my_refdb_id = my_dbi_result_get_idval_idx(dbires, 1); my_temp_refdb_id = my_dbi_result_get_idval_idx(dbires, 2); my_title = my_dbi_result_get_string_idx(dbires, 3); my_temp_title = my_dbi_result_get_string_idx(dbires, 4); my_booktitle = my_dbi_result_get_string_idx(dbires, 5); my_temp_booktitle = my_dbi_result_get_string_idx(dbires, 6); my_title_series = my_dbi_result_get_string_idx(dbires, 7); my_temp_title_series = my_dbi_result_get_string_idx(dbires, 8); if (!my_refdb_id || !my_temp_refdb_id) { continue; } if (my_title) { my_quoted_title = strdup(my_title); my_quoted_temp_title = strdup(my_temp_title); if (!my_quoted_title || !dbi_conn_quote_string(conn, &my_quoted_title) || !my_quoted_temp_title || !dbi_conn_quote_string(conn, &my_quoted_temp_title)) { dbi_result_free(dbires); return 801; } } else { my_quoted_title = NULL; my_quoted_temp_title = NULL; } if (my_booktitle) { my_quoted_booktitle = strdup(my_booktitle); my_quoted_temp_booktitle = strdup(my_temp_booktitle); if (!my_quoted_booktitle || !dbi_conn_quote_string(conn, &my_quoted_booktitle) || !my_quoted_temp_booktitle || !dbi_conn_quote_string(conn, &my_quoted_temp_booktitle)) { dbi_result_free(dbires); return 801; } } else { my_quoted_booktitle = NULL; my_quoted_temp_booktitle = NULL; } if (my_title_series) { my_quoted_title_series = strdup(my_title_series); my_quoted_temp_title_series = strdup(my_temp_title_series); if (!my_quoted_title_series || !dbi_conn_quote_string(conn, &my_quoted_title_series) || !my_quoted_temp_title_series || !dbi_conn_quote_string(conn, &my_quoted_temp_title_series)) { dbi_result_free(dbires); return 801; } } else { my_quoted_title_series = NULL; my_quoted_temp_title_series = NULL; } sprintf(sql_command, "INSERT INTO t_temp_xdup (xdup_type, match_type, temp_refdb_id, refdb_id, value_name, temp_value_name, value_name_2, temp_value_name_2, value_name_3, temp_value_name_3) VALUES (\'TITLE\',\'CASE\',"ULLSPEC","ULLSPEC",%s,%s,%s,%s,%s,%s)", (unsigned long long)my_temp_refdb_id, (unsigned long long)my_refdb_id, (my_quoted_title) ? my_quoted_title:"NULL", (my_quoted_temp_title) ? my_quoted_temp_title:"NULL", (my_quoted_booktitle) ? my_quoted_booktitle:"NULL", (my_quoted_temp_booktitle) ? my_quoted_temp_booktitle:"NULL", (my_quoted_title_series) ? my_quoted_title_series:"NULL", (my_quoted_temp_title_series) ? my_quoted_temp_title_series:"NULL"); LOG_PRINT(LOG_INFO, sql_command); dbires2 = dbi_conn_query(conn, sql_command); if (!dbires2) { /* TODO: bail out? */ continue; } dbi_result_free(dbires2); free(my_quoted_title); free(my_quoted_temp_title); free(my_quoted_booktitle); free(my_quoted_temp_booktitle); free(my_quoted_title_series); free(my_quoted_temp_title_series); } } else { /* without EXCEPT, we need an additional query */ snprintf(sql_command, sql_cmd_len, "SELECT DISTINCT t_refdb.refdb_id, t_%srefdb.refdb_id, t_refdb.refdb_title, t_%srefdb.refdb_title, t_refdb.refdb_booktitle, t_%srefdb.refdb_booktitle, t_refdb.refdb_title_series, t_%srefdb.refdb_title_series FROM t_refdb,t_%srefdb WHERE UPPER(t_refdb.refdb_title)=UPPER(t_%srefdb.refdb_title) OR UPPER(t_refdb.refdb_booktitle)=UPPER(t_%srefdb.refdb_booktitle) OR UPPER(t_refdb.refdb_title_series)=UPPER(t_%srefdb.refdb_title_series)", TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); return 207; } /* loop over all matching references */ while (dbi_result_next_row(dbires)) { my_refdb_id = my_dbi_result_get_idval_idx(dbires, 1); my_temp_refdb_id = my_dbi_result_get_idval_idx(dbires, 2); my_title = my_dbi_result_get_string_idx(dbires, 3); my_temp_title = my_dbi_result_get_string_idx(dbires, 4); my_booktitle = my_dbi_result_get_string_idx(dbires, 5); my_temp_booktitle = my_dbi_result_get_string_idx(dbires, 6); my_title_series = my_dbi_result_get_string_idx(dbires, 7); my_temp_title_series = my_dbi_result_get_string_idx(dbires, 8); if (!my_refdb_id || !my_temp_refdb_id) { continue; } if (my_title && my_temp_title) { my_quoted_title = strdup(my_title); my_quoted_temp_title = strdup(my_temp_title); if (!my_quoted_title || !dbi_conn_quote_string(conn, &my_quoted_title) || !my_quoted_temp_title || !dbi_conn_quote_string(conn, &my_quoted_temp_title)) { dbi_result_free(dbires); return 801; } } else { my_quoted_title = NULL; my_quoted_temp_title = NULL; } if (my_booktitle && my_temp_booktitle) { my_quoted_booktitle = strdup(my_booktitle); my_quoted_temp_booktitle = strdup(my_temp_booktitle); if (!my_quoted_booktitle || !dbi_conn_quote_string(conn, &my_quoted_booktitle) || !my_quoted_temp_booktitle || !dbi_conn_quote_string(conn, &my_quoted_temp_booktitle)) { dbi_result_free(dbires); return 801; } } else { my_quoted_booktitle = NULL; my_quoted_temp_booktitle = NULL; } if (my_title_series && my_temp_title_series) { my_quoted_title_series = strdup(my_title_series); my_quoted_temp_title_series = strdup(my_temp_title_series); if (!my_quoted_title_series || !dbi_conn_quote_string(conn, &my_quoted_title_series) || !my_quoted_temp_title_series || !dbi_conn_quote_string(conn, &my_quoted_temp_title_series)) { dbi_result_free(dbires); return 801; } } else { my_quoted_title_series = NULL; my_quoted_temp_title_series = NULL; } /* check whether the reference is already in the duplicates table as TITLE IDENT */ sprintf(sql_command, "SELECT DISTINCT xdup_id FROM t_temp_xdup WHERE refdb_id="ULLSPEC" AND xdup_type=\'TITLE\' AND match_type=\'IDENT\'", (unsigned long long)my_refdb_id); dbires1 = dbi_conn_query(conn, sql_command); if (!dbires1) { continue; } /* add a CASE entry if there is no IDENT entry */ if (!dbi_result_get_numrows(dbires1)) { sprintf(sql_command, "INSERT INTO t_temp_xdup (xdup_type, match_type, temp_refdb_id, refdb_id, value_name, temp_value_name, value_name_2, temp_value_name_2, value_name_3, temp_value_name_3) VALUES (\'TITLE\',\'CASE\',"ULLSPEC","ULLSPEC",%s,%s,%s,%s,%s,%s)", (unsigned long long)my_temp_refdb_id, (unsigned long long)my_refdb_id, (my_quoted_title) ? my_quoted_title:"NULL", (my_quoted_temp_title) ? my_quoted_temp_title:"NULL", (my_quoted_booktitle) ? my_quoted_booktitle:"NULL", (my_quoted_temp_booktitle) ? my_quoted_temp_booktitle:"NULL", (my_quoted_title_series) ? my_quoted_title_series:"NULL", (my_quoted_temp_title_series) ? my_quoted_temp_title_series:"NULL"); LOG_PRINT(LOG_INFO, sql_command); dbires2 = dbi_conn_query(conn, sql_command); if (!dbires2) { /* TODO: bail out? */ continue; } dbi_result_free(dbires2); } dbi_result_free(dbires1); free(my_quoted_title); free(my_quoted_temp_title); free(my_quoted_booktitle); free(my_quoted_temp_booktitle); free(my_quoted_title_series); free(my_quoted_temp_title_series); } } dbi_result_free(dbires); /* todo: check for title words of at least 3 chars, and compare the sequence of these words */ free(sql_command); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ find_duplicate_location(): check references for duplicate location int find_duplicate_location returns 0 if ok, >0 if an error occurred dbi_conn conn pointer to a data structure for a previously established database session. The caller is responsible to establish this connection and to take it down again after this function returns. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int find_duplicate_location(dbi_conn conn) { char* sql_command; const char* rlike; size_t sql_cmd_len; unsigned long long my_refdb_id; unsigned long long my_temp_refdb_id; dbi_result dbires; dbi_result dbires1; sql_cmd_len = 2048; if ((sql_command = malloc(sql_cmd_len)) == NULL) { return 801; } /* check for identical location, i.e. same periodical, same publication year, same volum, same issue and same start page */ /* PostgreSQL for some reason needs a RLIKE instead of an equality check for the periodical names, could not find out why */ rlike = my_dbi_conn_get_cap(conn, "rlike"); snprintf(sql_command, sql_cmd_len, "SELECT DISTINCT t_refdb.refdb_id, t_%srefdb.refdb_id FROM t_refdb,t_%srefdb,t_periodical,t_%speriodical WHERE" "((t_%srefdb.refdb_type=\'JOUR\' OR t_%srefdb.refdb_type=\'JFULL\' OR t_%srefdb.refdb_type=\'NEWS\' OR t_%srefdb.refdb_type=\'MGZN\') AND t_refdb.refdb_pubyear=t_%srefdb.refdb_pubyear AND t_refdb.refdb_volume=t_%srefdb.refdb_volume AND t_refdb.refdb_issue=t_%srefdb.refdb_issue AND t_refdb.refdb_startpage=t_%srefdb.refdb_startpage AND t_refdb.refdb_periodical_id=t_periodical.periodical_id AND t_%srefdb.refdb_periodical_id=t_%speriodical.periodical_id AND (t_periodical.periodical_name %s t_%speriodical.periodical_name OR t_periodical.periodical_abbrev %s t_%speriodical.periodical_abbrev))" " OR " "((t_%srefdb.refdb_type=\'CONF\' OR t_%srefdb.refdb_type=\'CHAP\') AND t_refdb.refdb_booktitle=t_%srefdb.refdb_booktitle AND t_refdb.refdb_pubyear=t_%srefdb.refdb_pubyear)", TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, rlike, TEMP_TABLE_NAME_PREFIX, rlike, TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); return 207; } /* loop over all matching references */ while (dbi_result_next_row(dbires)) { my_refdb_id = my_dbi_result_get_idval_idx(dbires, 1); my_temp_refdb_id = my_dbi_result_get_idval_idx(dbires, 2); LOG_PRINT(LOG_DEBUG, sql_command); if (!my_refdb_id || !my_temp_refdb_id) { continue; } /* create a LOCATION IDENT entry in the duplicates table */ sprintf(sql_command, "INSERT INTO t_temp_xdup (xdup_type, match_type, temp_refdb_id, refdb_id) VALUES (\'LOCATION\',\'IDENT\',"ULLSPEC","ULLSPEC")", (unsigned long long)my_temp_refdb_id, (unsigned long long)my_refdb_id); LOG_PRINT(LOG_INFO, sql_command); dbires1 = dbi_conn_query(conn, sql_command); if (!dbires1) { /* TODO: bail out? */ continue; } dbi_result_free(dbires1); } dbi_result_free(dbires); free(sql_command); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ find_duplicate_citekey(): check references for duplicate citation keys int find_duplicate_citekey returns 0 if ok, >0 if an error occurred dbi_conn conn pointer to a data structure for a previously established database session. The caller is responsible to establish this connection and to take it down again after this function returns. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int find_duplicate_citekey(dbi_conn conn) { char* sql_command; const char* my_citekey; size_t sql_cmd_len; unsigned long long my_refdb_id; unsigned long long my_temp_refdb_id; dbi_result dbires; dbi_result dbires1; sql_cmd_len = 512; if ((sql_command = malloc(sql_cmd_len)) == NULL) { return 801; } /* check for identical citation key */ snprintf(sql_command, sql_cmd_len, "SELECT DISTINCT t_refdb.refdb_id, t_%srefdb.refdb_id, t_refdb.refdb_citekey FROM t_refdb INNER JOIN t_%srefdb ON t_refdb.refdb_citekey=t_%srefdb.refdb_citekey", TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); return 207; } while (dbi_result_next_row(dbires)) { my_refdb_id = my_dbi_result_get_idval_idx(dbires, 1); my_temp_refdb_id = my_dbi_result_get_idval_idx(dbires, 2); my_citekey = my_dbi_result_get_string_idx(dbires, 3); if (!my_refdb_id || !my_temp_refdb_id || !my_citekey) { continue; } sprintf(sql_command, "INSERT INTO t_temp_xdup (xdup_type, match_type, temp_refdb_id, refdb_id, value_name, temp_value_name) VALUES (\'CITEKEY\',\'IDENT\',"ULLSPEC","ULLSPEC",'%s','%s')", (unsigned long long)my_temp_refdb_id, (unsigned long long)my_refdb_id, my_citekey, my_citekey); LOG_PRINT(LOG_INFO, sql_command); dbires1 = dbi_conn_query(conn, sql_command); if (!dbires1) { /* TODO: bail out? */ continue; } dbi_result_free(dbires1); } dbi_result_free(dbires); free(sql_command); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ find_author_variants(): check author names for spelling variants int find_author_variants returns 0 if ok, >0 if an error occurred dbi_conn conn pointer to a data structure for a previously established database session. The caller is responsible to establish this connection and to take it down again after this function returns. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int find_author_variants(dbi_conn conn) { char* sql_command; const char* author_name; const char* temp_author_name; char* quoted_author_name; char* quoted_temp_author_name; size_t sql_cmd_len; unsigned long long n_refdb_id; dbi_result dbires; dbi_result dbires1; dbi_result dbires2; sql_cmd_len = 1024; if ((sql_command = malloc(sql_cmd_len)) == NULL) { return 801; } /* check for name duplicates. The query is supposed to find the following authorname pairs: - lastnames are identical - one firstname is abbreviated - the other is not */ snprintf(sql_command, sql_cmd_len, "SELECT DISTINCT t_author.author_name, t_%sauthor.author_name " "FROM t_author, t_%sauthor " "WHERE t_author.author_lastname=t_%sauthor.author_lastname " "AND ((%s(t_author.author_firstname)=1 AND %s(t_%sauthor.author_firstname)>1 AND t_author.author_firstname=%s(t_%sauthor.author_firstname%s1%s1)) " "OR (%s(t_%sauthor.author_firstname)=1 AND %s(t_author.author_firstname)>1 AND t_%sauthor.author_firstname=%s(t_author.author_firstname%s1%s1)))", TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, my_dbi_conn_get_cap(conn, "charlength"), my_dbi_conn_get_cap(conn, "charlength"), TEMP_TABLE_NAME_PREFIX, my_dbi_conn_get_cap(conn, "substring"), TEMP_TABLE_NAME_PREFIX, my_dbi_conn_get_cap(conn, "substring_from"), my_dbi_conn_get_cap(conn, "substring_for"), my_dbi_conn_get_cap(conn, "charlength"), TEMP_TABLE_NAME_PREFIX, my_dbi_conn_get_cap(conn, "charlength"), TEMP_TABLE_NAME_PREFIX, my_dbi_conn_get_cap(conn, "substring"), my_dbi_conn_get_cap(conn, "substring_from"), my_dbi_conn_get_cap(conn, "substring_for")); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); return 207; } /* loop over all author names */ while (dbi_result_next_row(dbires)) { author_name = my_dbi_result_get_string_idx(dbires, 1); temp_author_name = my_dbi_result_get_string_idx(dbires, 2); if (!author_name || !temp_author_name) { continue; } quoted_author_name = strdup(author_name); quoted_temp_author_name = strdup(temp_author_name); if (!quoted_author_name || !dbi_conn_quote_string(conn, "ed_author_name) || !quoted_temp_author_name || !dbi_conn_quote_string(conn, "ed_temp_author_name)) { dbi_result_free(dbires); return 801; } /* find out which temp datasets are affected. We need this info to list the duplicate authors with the references that contain them */ sprintf(sql_command, "SELECT DISTINCT t_%sxauthor.refdb_id FROM t_%sauthor INNER JOIN t_%sxauthor ON t_%sauthor.author_id=t_%sxauthor.author_id WHERE t_%sauthor.author_name=%s", TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, quoted_temp_author_name); LOG_PRINT(LOG_DEBUG, sql_command); dbires1 = dbi_conn_query(conn, sql_command); if (!dbires1) { /* TODO: bail out? */ continue; } /* add one entry per reference, so the authornames will be listed with each reference they appear in */ while (dbi_result_next_row(dbires1)) { n_refdb_id = my_dbi_result_get_idval_idx(dbires1, 1); if (!n_refdb_id) { continue; } sprintf(sql_command, "INSERT INTO t_temp_xdup (xdup_type, match_type, temp_refdb_id, temp_value_name, value_name) VALUES (\'AUTHOR\',\'ABBREV\',"ULLSPEC",%s, %s)", (unsigned long long)n_refdb_id, quoted_temp_author_name, quoted_author_name); LOG_PRINT(LOG_DEBUG, sql_command); dbires2 = dbi_conn_query(conn, sql_command); if (!dbires2) { /* TODO: bail out? */ continue; } dbi_result_free(dbires2); } free(quoted_author_name); free(quoted_temp_author_name); dbi_result_free(dbires1); } dbi_result_free(dbires); free(sql_command); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ find_keyword_variants(): check keywords for variants int find_keyword_variants returns 0 if ok, >0 if an error occurred dbi_conn conn pointer to a data structure for a previously established database session. The caller is responsible to establish this connection and to take it down again after this function returns. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int find_keyword_variants(dbi_conn conn) { char* sql_command; char* start; const char* rlike; const char* drivername; size_t sql_cmd_len; /* todo: make this a setting sent by the client */ size_t req_token_length = 3; unsigned long long n_refdb_id; dbi_result dbires; dbi_result dbires1; dbi_result dbires2; sql_cmd_len = 1024; if ((sql_command = malloc(sql_cmd_len)) == NULL) { return 801; } drivername = dbi_driver_get_name(dbi_conn_get_driver(conn)); rlike = my_dbi_conn_get_cap(conn, "rlike"); /* use the permanent keywords to create regexp and find matches in the temporary keywords */ sprintf(sql_command, "SELECT DISTINCT keyword_name FROM t_keyword"); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); return 207; } /* loop over all keyword names */ while (dbi_result_next_row(dbires)) { char* keyword_name; char* quoted_keyword_name; const char* temp_keyword_name; char* quoted_temp_keyword_name; keyword_name = my_dbi_result_get_string_copy_idx(dbires, 1); quoted_keyword_name = strdup(keyword_name); if (!quoted_keyword_name || !dbi_conn_quote_string(conn, "ed_keyword_name)) { dbi_result_free(dbires); return 801; } /* replace regexp special characters */ replace_regexp_chars(keyword_name, "()*?[]\\", ' '); /* loop over all space-separated tokens in the keyword */ for (start = strtok(keyword_name, " "); start; start = strtok(NULL, " ")) { char* quoted_keyword_token; start = stripwhite(start, 0, 0); if (strlen(start) > req_token_length) { /* todo: use special regexp quote function */ quoted_keyword_token = strdup(start); if (!quoted_keyword_token || !dbi_conn_quote_string(conn, "ed_keyword_token)) { dbi_result_free(dbires); return 801; } sprintf(sql_command, "SELECT DISTINCT t_%skeyword.keyword_name, t_%sxkeyword.xref_id FROM t_%skeyword INNER JOIN t_%sxkeyword ON t_%skeyword.keyword_id=t_%sxkeyword.keyword_id WHERE upper(t_%skeyword.keyword_name) %s upper(%s)", TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, rlike, quoted_keyword_token); free(quoted_keyword_token); LOG_PRINT(LOG_DEBUG, sql_command); dbires1 = dbi_conn_query(conn, sql_command); if (!dbires1) { continue; } /* loop over all matching keywords */ while (dbi_result_next_row(dbires1)) { n_refdb_id = my_dbi_result_get_idval_idx(dbires1, 2); temp_keyword_name = my_dbi_result_get_string_idx(dbires1, 1); if (!n_refdb_id) { continue; } quoted_temp_keyword_name = strdup(temp_keyword_name); if (!quoted_temp_keyword_name || !dbi_conn_quote_string(conn, "ed_temp_keyword_name)) { dbi_result_free(dbires); return 801; } /* use only if the keywords are not identical */ if (strcmp(quoted_temp_keyword_name, quoted_keyword_name)) { sprintf(sql_command, "INSERT INTO t_temp_xdup (xdup_type, match_type, temp_refdb_id, temp_value_name, value_name) VALUES (\'KEYWORD\',\'LIKE\',"ULLSPEC",%s, %s)", (unsigned long long)n_refdb_id, quoted_temp_keyword_name, quoted_keyword_name); LOG_PRINT(LOG_DEBUG, sql_command); dbires2 = dbi_conn_query(conn, sql_command); if (!dbires2) { /* TODO: bail out? */ continue; } dbi_result_free(dbires2); } /* end if */ free(quoted_temp_keyword_name); } /* end while */ dbi_result_free(dbires1); } /* end if */ } /* end for */ free(quoted_keyword_name); free(keyword_name); } /* end while */ dbi_result_free(dbires); /* use the temporary keywords to create regexp and find matches in the permanent keywords */ sprintf(sql_command, "SELECT DISTINCT keyword_name FROM t_%skeyword", TEMP_TABLE_NAME_PREFIX); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); return 207; } /* loop over all keyword names */ while (dbi_result_next_row(dbires)) { char* temp_keyword_name; char* quoted_temp_keyword_name; char* quoted_keyword_name; const char* keyword_name; temp_keyword_name = my_dbi_result_get_string_copy_idx(dbires, 1); quoted_temp_keyword_name = strdup(temp_keyword_name); if (!quoted_temp_keyword_name || !dbi_conn_quote_string(conn, "ed_temp_keyword_name)) { dbi_result_free(dbires); return 801; } /* replace regexp special characters */ replace_regexp_chars(temp_keyword_name, "()*?[]\\", ' '); /* loop over all space-separated tokens in the keyword */ for (start = strtok(temp_keyword_name, " "); start; start = strtok(NULL, " ")) { char* quoted_temp_keyword_token = NULL; start = stripwhite(start, 0, 0); if (strlen(start) > req_token_length) { quoted_temp_keyword_token = strdup(start); if (!quoted_temp_keyword_token || !dbi_conn_quote_string(conn, "ed_temp_keyword_token)) { dbi_result_free(dbires); return 801; } sprintf(sql_command, "SELECT DISTINCT t_keyword.keyword_name, t_%sxkeyword.xref_id FROM t_keyword, t_%skeyword INNER JOIN t_%sxkeyword ON t_%skeyword.keyword_id=t_%sxkeyword.keyword_id WHERE upper(t_keyword.keyword_name) %s upper(%s) AND t_%skeyword.keyword_name=%s", TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, rlike, quoted_temp_keyword_token, TEMP_TABLE_NAME_PREFIX, quoted_temp_keyword_name); LOG_PRINT(LOG_DEBUG, sql_command); dbires1 = dbi_conn_query(conn, sql_command); if (!dbires1) { continue; } /* loop over all matching keywords */ while (dbi_result_next_row(dbires1)) { n_refdb_id = my_dbi_result_get_idval_idx(dbires1, 2); keyword_name = my_dbi_result_get_string_idx(dbires1, 1); if (!n_refdb_id) { continue; } quoted_keyword_name = strdup(keyword_name); if (!quoted_keyword_name || !dbi_conn_quote_string(conn, "ed_keyword_name)) { dbi_result_free(dbires); return 801; } if (strcmp(quoted_temp_keyword_name, quoted_keyword_name)) { sprintf(sql_command, "INSERT INTO t_temp_xdup (xdup_type, match_type, temp_refdb_id, temp_value_name, value_name) VALUES (\'KEYWORD\',\'LIKE\',"ULLSPEC",%s, %s)", (unsigned long long)n_refdb_id, quoted_temp_keyword_name, quoted_keyword_name); free(quoted_keyword_name); LOG_PRINT(LOG_DEBUG, sql_command); dbires2 = dbi_conn_query(conn, sql_command); if (!dbires2) { /* TODO: bail out? */ continue; } dbi_result_free(dbires2); } else { free(quoted_keyword_name); } /* end if */ } /* end while */ dbi_result_free(dbires1); } /* end if */ if (quoted_temp_keyword_token) { free(quoted_temp_keyword_token); } } /* end for */ free(temp_keyword_name); free(quoted_temp_keyword_name); } /* end while */ dbi_result_free(dbires); free(sql_command); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ find_periodical_variants(): check periodical names for variants int find_periodical_variants returns 0 if ok, >0 if an error occurred dbi_conn conn pointer to a data structure for a previously established database session. The caller is responsible to establish this connection and to take it down again after this function returns. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int find_periodical_variants(dbi_conn conn) { char* sql_command; char* new_sql_command; char* periodical_regexp; const char* rlike; const char* periodical_abbrev; const char* match_periodical_name; const char* match_periodical_abbrev; char* quoted_periodical_abbrev = NULL; char* quoted_periodical_regexp = NULL; char* quoted_match_periodical_value = NULL; size_t sql_cmd_len; unsigned long long n_refdb_id; dbi_result dbires; dbi_result dbires1; dbi_result dbires2; dbi_result dbires3; sql_cmd_len = 1024; if ((sql_command = malloc(sql_cmd_len)) == NULL) { return 801; } rlike = my_dbi_conn_get_cap(conn, "rlike"); /* find all periodicals in the temporary tables */ sprintf(sql_command, "SELECT DISTINCT periodical_name, periodical_abbrev FROM t_%speriodical", TEMP_TABLE_NAME_PREFIX); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { free(sql_command); return 207; } /* loop over all periodical names */ while (dbi_result_next_row(dbires)) { periodical_abbrev = my_dbi_result_get_string_idx(dbires, 2); if (!periodical_abbrev || !*periodical_abbrev) { continue; } quoted_periodical_abbrev = strdup(periodical_abbrev); if (!quoted_periodical_abbrev || !dbi_conn_quote_string(conn, "ed_periodical_abbrev)) { dbi_result_free(dbires); return 801; } /* construct a regular expression from the tokens of the abbreviated name. Use only the abbreviated (i.e. followed by a dot) tokens as stems of regular expressions */ periodical_regexp = create_periodical_regexp_string(periodical_abbrev); /* if (!*periodical_regexp) { */ /* sprintf(sql_command, "periodical_abbrev went to:%s<<\n", periodical_abbrev); */ /* LOG_PRINT(LOG_DEBUG, sql_command); */ /* } */ quoted_periodical_regexp = strdup(periodical_regexp); if (!quoted_periodical_regexp || !dbi_conn_quote_string(conn, "ed_periodical_regexp)) { dbi_result_free(dbires); return 801; } if (sql_cmd_len < (2*strlen(quoted_periodical_regexp)) + 160) { new_sql_command = realloc(sql_command, (2*strlen(quoted_periodical_regexp)) + 160); if (!new_sql_command) { dbi_result_free(dbires); return 801; } else { sql_command = new_sql_command; } } sprintf(sql_command, "SELECT DISTINCT periodical_name, periodical_abbrev from t_periodical WHERE periodical_name %s %s OR periodical_abbrev %s %s", rlike, quoted_periodical_regexp, rlike, quoted_periodical_regexp); LOG_PRINT(LOG_DEBUG, sql_command); dbires1 = dbi_conn_query(conn, sql_command); if (!dbires1) { /* TODO: bail out? */ continue; } /* loop over all matching periodicals in the permanent table */ while (dbi_result_next_row(dbires1)) { match_periodical_name = my_dbi_result_get_string_idx(dbires1, 1); match_periodical_abbrev = my_dbi_result_get_string_idx(dbires1, 2); quoted_match_periodical_value = strdup((match_periodical_name && *match_periodical_name) ? match_periodical_name:match_periodical_abbrev); if (!quoted_match_periodical_value || !dbi_conn_quote_string(conn, "ed_match_periodical_value)) { dbi_result_free(dbires); return 801; } /* find out which temp datasets are affected. We need this info to list the duplicate periodicals with the references that contain them */ sprintf(sql_command, "SELECT DISTINCT t_%srefdb.refdb_id FROM t_%srefdb INNER JOIN t_%speriodical ON t_%srefdb.refdb_periodical_id=t_%speriodical.periodical_id WHERE t_%speriodical.periodical_abbrev=%s", TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, TEMP_TABLE_NAME_PREFIX, quoted_periodical_abbrev); LOG_PRINT(LOG_DEBUG, sql_command); dbires2 = dbi_conn_query(conn, sql_command); if (!dbires2) { /* TODO: bail out? */ continue; } /* add one entry per reference, so the periodicals will be listed with each reference they appear in */ while (dbi_result_next_row(dbires2)) { n_refdb_id = my_dbi_result_get_idval_idx(dbires2, 1); if (!n_refdb_id) { continue; } sprintf(sql_command, "INSERT INTO t_temp_xdup (xdup_type, match_type, temp_refdb_id, temp_value_name, value_name) VALUES (\'PERIODICAL\',\'LIKE\',"ULLSPEC",%s, %s)", (unsigned long long)n_refdb_id, quoted_periodical_abbrev, quoted_match_periodical_value); LOG_PRINT(LOG_DEBUG, sql_command); dbires3 = dbi_conn_query(conn, sql_command); if (!dbires3) { /* TODO: bail out? */ continue; } dbi_result_free(dbires3); } free(quoted_match_periodical_value); dbi_result_free(dbires2); } free(periodical_regexp); free(quoted_periodical_regexp); free(quoted_periodical_abbrev); dbi_result_free(dbires1); } dbi_result_free(dbires); free(sql_command); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ create_periodical_regexp_string(): turns an abbreviated periodical name into a regexp to find possible matching full names char* create_periodical_regexp_string returns an allocated string containing the regexp, or NULL if there was an error const char* periodical_abbrev the abbreviation of the periodical name ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* create_periodical_regexp_string(const char* periodical_abbrev) { char regexp_code[] = "[^\\.]+"; char* regexp; char* start; char* period; size_t regexp_len; size_t n_periods; n_periods = count_the_flowers(periodical_abbrev, ".", 1); if (!n_periods) { /* no periods */ regexp = strdup(periodical_abbrev); /* no need to check result. if strdup failed, NULL is the correct return value of the function */ return regexp; } /* allocate a string that holds periodical_abbrev plus n_periods times the length of the regexp code plus the trailing zero */ regexp_len = strlen(periodical_abbrev) + n_periods*strlen(regexp_code) + 1; if ((regexp = malloc(regexp_len)) == NULL) { return NULL; } strcpy(regexp, periodical_abbrev); start = regexp; /* loop over all periods in the string */ while ((period = strchr(start, (int)'.')) != NULL) { replace_char_string(period, regexp_code, 1); start = period+strlen(regexp_code); } return regexp; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ create_dupreport(): create the report about duplicates int create_dupreport returns 0 if ok, >0 if an error occurred struct CLIENT_REQUEST ptr_clrequest ptr to struct containing connection information struct renderinfo* ptr_rendinfo ptr to struct containing rendering hints dbi_conn conn pointer to a data structure for a previously established database session. The caller is responsible to establish this connection and to take it down again after this function returns. int outformat output format (REFSCRN|REFXHTML) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int create_dupreport(struct CLIENT_REQUEST* ptr_clrequest, struct renderinfo* ptr_rendinfo, dbi_conn conn, int outformat) { int retval; if (outformat == REFXHTML) { retval = create_dupreport_xhtml(ptr_clrequest, ptr_rendinfo, conn); } else { retval = create_dupreport_scrn(ptr_clrequest, conn); } return retval; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ create_dupreport_scrn(): create the screen report about duplicates int create_dupreport_scrn returns 0 if ok, >0 if an error occurred struct CLIENT_REQUEST ptr_clrequest ptr to struct containing connection information dbi_conn conn pointer to a data structure for a previously established database session. The caller is responsible to establish this connection and to take it down again after this function returns. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int create_dupreport_scrn(struct CLIENT_REQUEST* ptr_clrequest, dbi_conn conn) { int retval = 0; char sql_command[512]; char* msg_buf; const char* xdup_type; const char* match_type; const char* value_name; const char* temp_value_name; const char* value_name_2; const char* temp_value_name_2; const char* value_name_3; const char* temp_value_name_3; size_t msg_buf_len = 1024; int numbyte; unsigned long long temp_refdb_id; unsigned long long refdb_id; dbi_result dbires; if ((msg_buf = malloc(msg_buf_len)) == NULL) { return 801; } *msg_buf = '\0'; /* retrieve duplicates sorted by input dataset */ snprintf(sql_command, 512, "SELECT DISTINCT xdup_type, match_type, temp_refdb_id, refdb_id, value_name, temp_value_name, value_name_2, temp_value_name_2, value_name_3, temp_value_name_3 FROM t_temp_xdup ORDER BY temp_refdb_id, xdup_type, match_type, temp_value_name, value_name"); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { /* TODO: bail out? */ } while (dbi_result_next_row(dbires)) { temp_refdb_id = my_dbi_result_get_idval(dbires, "temp_refdb_id"); refdb_id = my_dbi_result_get_idval(dbires, "refdb_id"); xdup_type = my_dbi_result_get_string(dbires, "xdup_type"); match_type = my_dbi_result_get_string(dbires, "match_type"); temp_value_name = my_dbi_result_get_string(dbires, "temp_value_name"); value_name = my_dbi_result_get_string(dbires, "value_name"); temp_value_name_2 = my_dbi_result_get_string(dbires, "temp_value_name_2"); value_name_2 = my_dbi_result_get_string(dbires, "value_name_2"); temp_value_name_3 = my_dbi_result_get_string(dbires, "temp_value_name_3"); value_name_3 = my_dbi_result_get_string(dbires, "value_name_3"); /* these values must be non-zero for all match types */ if (!temp_refdb_id || !xdup_type) { /* todo: bail out? */ continue; } if (!strcmp(xdup_type, "LOCATION")) { sprintf(msg_buf, "%s %s: temp_id:"ULLSPEC" id:"ULLSPEC"\n", xdup_type, match_type, (unsigned long long)temp_refdb_id, (unsigned long long)refdb_id); } else if (!strcmp(xdup_type, "AUTHOR") || !strcmp(xdup_type, "KEYWORD") || !strcmp(xdup_type, "PERIODICAL") || !strcmp(xdup_type, "CITEKEY")) { sprintf(msg_buf, "%s %s: temp_id:"ULLSPEC" temp_value:%s value:%s\n", xdup_type, match_type, (unsigned long long)temp_refdb_id, temp_value_name, value_name); } else if (!strcmp(xdup_type, "TITLE")) { sprintf(msg_buf, "%s %s: temp_id:"ULLSPEC" temp_title:%s id:"ULLSPEC" title:%s temp_booktitle: %s booktitle: %s temp_title_series: %s title_series: %s\n", xdup_type, match_type, (unsigned long long)temp_refdb_id, temp_value_name, (unsigned long long)refdb_id, value_name, temp_value_name_2, value_name_2, temp_value_name_3, value_name_3); } /* printf("trying to write %d byte\n", strlen(msg_buf)); */ numbyte = tiwrite(ptr_clrequest->fd, msg_buf, TERM_NO); if (numbyte == -1) { LOG_PRINT(LOG_INFO, get_status_msg(110)); retval = 110; break; } } dbi_result_free(dbires); free(msg_buf); return retval; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ create_dupreport_xhtml(): create the xhtml report about duplicates int create_dupreport_xhtml returns 0 if ok, >0 if an error occurred struct CLIENT_REQUEST ptr_clrequest ptr to struct containing connection information struct renderinfo* ptr_rendinfo ptr to struct containing rendering hints dbi_conn conn pointer to a data structure for a previously established database session. The caller is responsible to establish this connection and to take it down again after this function returns. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int create_dupreport_xhtml(struct CLIENT_REQUEST* ptr_clrequest, struct renderinfo* ptr_rendinfo, dbi_conn conn) { int retval = 0; char sql_command[512]; char* msg_buf; char* new_msg_buf; const char* xdup_type; const char* match_type; const char* value_name; const char* temp_value_name; const char* value_name_2; const char* temp_value_name_2; const char* value_name_3; const char* temp_value_name_3; size_t msg_buf_len = 1024; int numbyte; unsigned long long temp_refdb_id; unsigned long long prev_temp_id = 0; /* used in loop to detect id switch */ unsigned long long refdb_id; dbi_result dbires; if (write_tooltips(ptr_clrequest)) { return 1; } if ((msg_buf = malloc(msg_buf_len)) == NULL) { return 801; } *msg_buf = '\0'; /* retrieve duplicates sorted by input dataset */ snprintf(sql_command, 512, "SELECT DISTINCT xdup_type, match_type, temp_refdb_id, refdb_id, value_name, temp_value_name, value_name_2, temp_value_name_2, value_name_3, temp_value_name_3 FROM t_temp_xdup ORDER BY temp_refdb_id, xdup_type, match_type, temp_value_name, value_name"); dbires = dbi_conn_query(conn, sql_command); if (!dbires) { /* TODO: bail out? */ } /* loop over all temporary datasets */ while (dbi_result_next_row(dbires)) { temp_refdb_id = my_dbi_result_get_idval(dbires, "temp_refdb_id"); refdb_id = my_dbi_result_get_idval(dbires, "refdb_id"); xdup_type = my_dbi_result_get_string(dbires, "xdup_type"); match_type = my_dbi_result_get_string(dbires, "match_type"); temp_value_name = my_dbi_result_get_string(dbires, "temp_value_name"); value_name = my_dbi_result_get_string(dbires, "value_name"); temp_value_name_2 = my_dbi_result_get_string(dbires, "temp_value_name_2"); value_name_2 = my_dbi_result_get_string(dbires, "value_name_2"); temp_value_name_3 = my_dbi_result_get_string(dbires, "temp_value_name_3"); value_name_3 = my_dbi_result_get_string(dbires, "value_name_3"); *msg_buf = '\0'; /* truncate string */ /* these values must be non-zero for all match types */ if (!temp_refdb_id || !xdup_type) { /* todo: bail out? */ continue; } if (prev_temp_id != 0 && prev_temp_id != temp_refdb_id) { /* close previous table */ sprintf(msg_buf, "\n"); numbyte = tiwrite(ptr_clrequest->fd, msg_buf, TERM_NO); if (numbyte == -1) { LOG_PRINT(LOG_INFO, get_status_msg(110)); retval = 110; break; } } if (prev_temp_id != temp_refdb_id) { /* retrieve bibliographic data of the temporary dataset */ /* printf("start retrieving bib data\n"); */ ptr_rendinfo->dbires = retrieve_bibdata(conn, temp_refdb_id); **(ptr_rendinfo->ptr_ref) = '\0'; /* truncate string */ /* render dataset */ /* printf("start rendering bib data\n"); */ if (render_html(ptr_rendinfo, 2 /* temporary tables, but frequency data from the permanent tables */)) { /* todo: bail out? */ /* printf("rendering html failed\n"); */ continue; } else { numbyte = tiwrite(ptr_clrequest->fd, *(ptr_rendinfo->ptr_ref), TERM_NO); if (numbyte == -1) { LOG_PRINT(LOG_INFO, get_status_msg(110)); retval = 110; break; } } sprintf(msg_buf, "\n\n"); numbyte = tiwrite(ptr_clrequest->fd, msg_buf, TERM_NO); if (numbyte == -1) { LOG_PRINT(LOG_INFO, get_status_msg(110)); retval = 110; break; } *msg_buf = '\0'; /* truncate string */ } prev_temp_id = temp_refdb_id; /* set for next cycle */ if (!strcmp(xdup_type, "LOCATION")) { sprintf(msg_buf, "\n", match_type, xdup_type, match_type, match_type, (unsigned long long)refdb_id); } else if (!strcmp(xdup_type, "AUTHOR") || !strcmp(xdup_type, "KEYWORD") || !strcmp(xdup_type, "PERIODICAL") || !strcmp(xdup_type, "CITEKEY")) { sprintf(msg_buf, "\n", match_type, xdup_type, xdup_type, match_type, match_type, temp_value_name, value_name); } else if (!strcmp(xdup_type, "TITLE")) { if ((temp_value_name && *temp_value_name) || (value_name && *value_name)) { if ((new_msg_buf = format_title_line(msg_buf, &msg_buf_len, value_name, temp_value_name, refdb_id, 1, match_type)) == NULL) { LOG_PRINT(LOG_INFO, get_status_msg(110)); retval = 801; break; } else { msg_buf = new_msg_buf; } } if ((temp_value_name_2 && *temp_value_name_2) || (value_name_2 && *value_name_2)) { if ((new_msg_buf = format_title_line(msg_buf, &msg_buf_len, value_name_2, temp_value_name_2, refdb_id, 2, match_type)) == NULL) { LOG_PRINT(LOG_INFO, get_status_msg(110)); retval = 801; break; } else { msg_buf = new_msg_buf; } } if ((temp_value_name_3 && *temp_value_name_3) || (value_name_3 && *value_name_3)) { if ((new_msg_buf = format_title_line(msg_buf, &msg_buf_len, value_name_3, temp_value_name_3, refdb_id, 3, match_type)) == NULL) { LOG_PRINT(LOG_INFO, get_status_msg(110)); retval = 801; break; } else { msg_buf = new_msg_buf; } } } else { /* should never happen */ /* printf("unknown duplicate type\n"); */ } numbyte = tiwrite(ptr_clrequest->fd, msg_buf, TERM_NO); if (numbyte == -1) { LOG_PRINT(LOG_INFO, get_status_msg(110)); retval = 110; break; } } sprintf(msg_buf, "
fieldmatch typecheck valuedatabase value
%s%sID "ULLSPEC"
%s%s%s%s
\n


"); numbyte = tiwrite(ptr_clrequest->fd, msg_buf, TERM_NO); if (numbyte == -1) { LOG_PRINT(LOG_INFO, get_status_msg(110)); retval = 110; } dbi_result_free(dbires); free(msg_buf); return retval; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ format_title_line(): writes out one line in the duplicate table listing one of the title matches char* format_title_line returns the buffer containing the result, or NULL if there was an error. char* destination an allocated buffer that will receive the result. The buffer may be reallocated during assembly, so use the return value of this function to access the results size_t* ptr_dest_len ptr to an integer holding the length of the allocated buffer const char* title ptr to the title in the database const char* temp_title ptr to the title in the temporary table unsigned long long refdb_id the ID of the dataset to retrieve from the temporary table int title_level 1=title 2=booktitle 3=series_title const char* match_type string that specifies how the titles are matching ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static char* format_title_line(char* destination, size_t* ptr_dest_len, const char* title, const char *temp_title, unsigned long long refdb_id, int title_level, const char* match_type) { char buffer[256]; char* new_dest; if (title_level == 1) { sprintf(buffer, "title%s", match_type, match_type, match_type); } else if (title_level == 2) { sprintf(buffer, "booktitle%s", match_type, match_type, match_type); } else { sprintf(buffer, "series title%s", match_type, match_type, match_type); } if ((new_dest = mstrcat(destination, buffer, ptr_dest_len, 0)) == NULL) { return NULL; } else { destination = new_dest; } if ((new_dest = mstrcat(destination, (char*)temp_title, ptr_dest_len, 0)) == NULL) { return NULL; } else { destination = new_dest; } sprintf(buffer, "ID "ULLSPEC": ", (unsigned long long)refdb_id); if ((new_dest = mstrcat(destination, buffer, ptr_dest_len, 0)) == NULL) { return NULL; } else { destination = new_dest; } if ((new_dest = mstrcat(destination, (char*)title, ptr_dest_len, 0)) == NULL) { return NULL; } else { destination = new_dest; } if ((new_dest = mstrcat(destination, "\n", ptr_dest_len, 0)) == NULL) { return NULL; } else { destination = new_dest; } return destination; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ retrieve_bibdata(): retrieves the bibliographic data used for the duplicate listing dbi_result retrieve_bibdata returns a dbires structure containing the query results or NULL if there was an error dbi_conn conn pointer to a data structure for a previously established database session. The caller is responsible to establish this connection and to take it down again after this function returns. unsigned long long refdb_id the ID of the dataset to retrieve from the temporary table ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static dbi_result retrieve_bibdata(dbi_conn conn, unsigned long long refdb_id) { dbi_result dbires; char* sql_command; if ((sql_command = malloc(1024)) == NULL) { return NULL; } sprintf(sql_command, "SELECT DISTINCT refdb_id, refdb_type, refdb_pubyear, refdb_startpage, refdb_endpage, refdb_abstract, refdb_title, refdb_volume, refdb_issue, refdb_booktitle, refdb_city, refdb_publisher, refdb_title_series, refdb_address, refdb_issn, refdb_periodical_id, refdb_pyother_info, refdb_secyear, refdb_secother_info, refdb_user1, refdb_user2, refdb_user3, refdb_user4, refdb_user5, refdb_typeofwork, refdb_area, refdb_ostype, refdb_degree, refdb_runningtime, refdb_classcodeintl, refdb_classcodeus, refdb_senderemail, refdb_recipientemail, refdb_mediatype, refdb_numvolumes, refdb_edition, refdb_computer, refdb_conferencelocation, refdb_registrynum, refdb_classification, refdb_section, refdb_pamphletnum, refdb_chapternum, refdb_citekey FROM t_%srefdb WHERE refdb_id="ULLSPEC, TEMP_TABLE_NAME_PREFIX, (unsigned long long)refdb_id); LOG_PRINT(LOG_DEBUG, sql_command); dbires = dbi_conn_query(conn, sql_command); free(sql_command); if (!dbires) { return NULL; } else if (!dbi_result_next_row(dbires)) { dbi_result_free(dbires); return NULL; } return dbires; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ write_tooltips(): creates the xhtml tooltip output int write_tooltip returns 0 if ok, >0 if an error occurred struct CLIENT_REQUEST ptr_clrequest ptr to struct containing connection information ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ static int write_tooltips(struct CLIENT_REQUEST* ptr_clrequest) { int numbyte; numbyte = tiwrite(ptr_clrequest->fd, tooltips, TERM_NO); if (numbyte == -1) { LOG_PRINT(LOG_INFO, get_status_msg(110)); return 110; } return 0; } refdb-1.0.2/src/refdbd.h000644 001750 001750 00000026674 12255427652 015661 0ustar00markusmarkus000000 000000 /* refdbd.h header file for refdbd.c */ /* markus@mhoenicka.de 2-10-00 */ /* $Id: refdbd.h.in,v 1.7.2.15 2006/02/22 20:58:39 mhoenicka Exp $ */ /* 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ #ifndef XmlParse_INCLUDED #include #endif #ifndef backend_included #include "backend.h" #endif /* instances were not available before libdbi 1.0 */ #if !defined (LIBDBI_LIB_CURRENT) || LIBDBI_LIB_CURRENT < 2 typedef void * dbi_inst; #endif struct ADDRESULT { unsigned long long success; /* number of successfully added references */ unsigned long long failure; /* number of failures */ unsigned long long updated; /* number of successfully updated references */ unsigned long long skipped; /* number of skipped references */ char *msg; /* ptr to optional error message */ size_t msg_len; /* length of optional error message */ }; struct CLIENT_REQUEST { int fd; /* file descriptor of incoming connection */ int n_cgi; /* if 1, handle as CGI request */ int* ptr_optind; /* ptr to index of first parsed argument to handle */ int inargc; /* number of parsed arguments */ int protocol; /* protocol version */ int db_timeout; /* db-engine specific timeout (sqlite/sqlite3) */ int share_default; /* whether (1) or not (0) to share notes by default */ char** inargv; /* ptr to array of parsed arguments */ char username[USERNAME_LENGTH]; /* username for database authentication */ char passwd[PREFS_BUF_LEN]; /* password for database authentication */ char server_ip[PREFS_BUF_LEN]; /* hostname or IP address of database server */ char my_hostname[256]; /* hostname of box running refdbd */ char dbs_port_address[PREFS_BUF_LEN]; /* port where database server listens */ char dbserver[PREFS_BUF_LEN]; /* name of the libdbi driver */ char current_db[DBNAME_LENGTH+1]; /* name of reference database */ char db_path[PREFS_BUF_LEN]; /* path of dir containing databases */ char db_encoding[PREFS_BUF_LEN]; /* input or output encoding */ char listname[PREFS_BUF_LEN+USERNAME_LENGTH+2]; /* name of personal list */ char limit[PREFS_BUF_LEN]; /* limit:offset for retrieval functions */ char namespace[PREFS_BUF_LEN]; /* namespace for XML documents */ char client_ip[16]; /* IP address of client */ char pdfroot[_POSIX_PATH_MAX+1]; char cgi_url[_POSIX_PATH_MAX+1]; char check_string[MAX_FMT_LEN]; /* fields to check */ char* argument; /* additional unparsed command arguments */ dbi_inst inst; /* the libdbi instance (used for libdbi >= 1.0) */ }; struct BIBCONNS { dbi_conn conn; dbi_conn conn_refdb; dbi_conn conn_source; }; #define MSG_BUF_SIZE 256 #define FIFO_NAME "/tmp/refdbd_fifo" /* base name of a fifo */ #define MAIN_META "t_meta" /* name of the main database meta table */ #define DB_DIR "/usr/local/var/lib/refdb/db" /* directory which holds database and version file */ #define MAIN_DB_VERSION 3 /* version tag of main database shipped with this version */ #define MIN_MAIN_DB_VERSION 3 /* minimum version tag of readable main database */ #define DB_VERSION 4 /* version tag of reference databases created with this version */ #define MIN_DB_VERSION 4 /* minimum version tag of reference databases readable */ #define CITEKEY_BASE_LENGTH 240 /* maximum length of authorname+year */ /* defines for the temporary tables used in duplicate checks */ #define TEMP_TABLE_SPECIFIER "TEMPORARY " #define TEMP_TABLE_NAME_PREFIX "temp_" /* here we define some strings that will be used in the DSSSL style specification files */ #define STYLESHEET_HTML_NAME "docbook-refdb-html.dsl" #define STYLESHEET_HTML_BASENAME "docbook-refdb-html" #define STYLESHEET_HTML_ID "html" #define STYLESHEET_HTML_PUBID "-//Markus Hoenicka//DOCUMENT RefDB DocBook html stylesheet//EN" #define STYLESHEET_PRINT_NAME "docbook-refdb-print.dsl" #define STYLESHEET_PRINT_BASENAME "docbook-refdb-print" #define STYLESHEET_PRINT_ID "print" #define STYLESHEET_PRINT_PUBID "-//Markus Hoenicka//DOCUMENT RefDB DocBook print stylesheet//EN" /* these defines are for the bibliography style output */ #define PROCESSING_INST "\n" #define PROCESSING_INST_UTF8 "\n" #define DOCTYPE_CITESTYLE "\n\n\n\n\n\n]>\n" #define DOCTYPE_STYLESET "\n\n\n\n\n\n]>\n" /* this one is for the risx.dtd */ #define RISX_PUBID "\n\n\n\n\n\n]>\n" /* the extended notes dtd */ #define XNOTE_PUBID "\n\n\n\n\n\n]>\n" /* the citationlistx dtd */ #define CITATIONLISTX_PUBID "\n" /* these defines select the addref modes */ #define ADDREF_ADD 0 #define ADDREF_UPDATE 1 #define ADDREF_UPDATE_PERSONAL 2 #define ADDREF_CHECK 3 /* the following defines are for daemonize & friends */ #define ROOT_DIR "/" #define STDIN_FILENO 0 #define STDOUT_FILENO 1 #define STDERR_FILENO 2 /* supported reference types */ #define REFTYPES "ABST ADVS ART BILL BOOK CASE CHAP COMP CONF CTLG DATA ELEC GEN HEAR ICOMM INPR JFULL JOUR MAP MGZN MPCT MUSIC NEWS PAMP PAT PCOMM RPRT SER SLIDE SOUND STAT THES UNBILL UNPB VIDEO" struct ADDRESULT* new_addresult(size_t msg_len); void free_addresult(struct ADDRESULT* ptr_addresult); struct bibinfo* new_bibinfo(char* format_string, char* sort_string); dbi_conn connect_to_db(struct CLIENT_REQUEST* ptr_clrequest, const char* special_db, int nocheck); int viewstat(struct CLIENT_REQUEST* ptr_clrequest); int listdb(struct CLIENT_REQUEST* ptr_clrequest, int select, struct ADDRESULT* ptr_addresult); int listuser(struct CLIENT_REQUEST* ptr_clrequest, struct ADDRESULT* ptr_addresult); int liststyle(struct CLIENT_REQUEST* ptr_clrequest, struct ADDRESULT* ptr_addresult); int getstyle(struct CLIENT_REQUEST* ptr_clrequest, struct ADDRESULT* ptr_addresult); int whichdb(struct CLIENT_REQUEST* ptr_clrequest); int createdb(struct CLIENT_REQUEST* ptr_clrequest, struct ADDRESULT* ptr_addresult, int optind); int real_createdb(struct CLIENT_REQUEST* ptr_clrequest, const char* db_encoding, struct ADDRESULT* ptr_addresult); int deletedb(struct CLIENT_REQUEST* ptr_clrequest, int optind, struct ADDRESULT* ptr_addresult); int child_confserv(struct CLIENT_REQUEST* ptr_clrequest, struct ADDRESULT* ptr_addresult); void confserv(char *command, char *server_ip); int addref(struct CLIENT_REQUEST* ptr_clrequest, struct bibinfo* ptr_biblio_info, char* set_owner, struct ADDRESULT* ptr_addresult, int replace_ref, int n_keep_id, int informat, int outformat, Lilid* ptr_sentinel); int deleteref(struct CLIENT_REQUEST* ptr_clrequest, struct ADDRESULT* ptr_addresult); int delete_ref_by_id(unsigned long long idval, dbi_conn conn, struct CLIENT_REQUEST* ptr_clrequest, struct ADDRESULT* ptr_addresult); int pickref(struct CLIENT_REQUEST* ptr_clrequest, int n_remove, struct ADDRESULT* ptr_addresult); int pick_one_reference(dbi_conn conn, unsigned long long n_ref_id, unsigned long long n_user_id, const char *listname, const char *username, struct ADDRESULT* ptr_addresult); int dump_one_reference(dbi_conn conn, unsigned long long n_ref_id, unsigned long long n_user_id, const char *listname, const char *username, struct ADDRESULT* ptr_addresult); int adduser(struct CLIENT_REQUEST* ptr_clrequest, char *user_host, char* newuser_passwd, int n_remove, int n_readonly, struct ADDRESULT* ptr_addresult); int addword(struct CLIENT_REQUEST* ptr_clrequest, int n_remove, struct ADDRESULT* ptr_addresult); int listword(struct CLIENT_REQUEST* ptr_clrequest, struct ADDRESULT* ptr_addresult); int getfoo(struct CLIENT_REQUEST* ptr_clrequest, int type, int all, char* input_encoding, struct ADDRESULT* ptr_addresult, char* format_string); int getbib(struct CLIENT_REQUEST* ptr_clrequest, struct bibinfo* ptr_biblio_info, int n_ref_format, struct ADDRESULT* ptr_addresult); char* getid(char* idstring, char** db, int* type); char* get_bibtex_id(char* idstring, char** db); int addstyle(struct CLIENT_REQUEST* ptr_clrequest, struct ADDRESULT* ptr_addresult); int deletestyle(struct CLIENT_REQUEST* ptr_clrequest, struct ADDRESULT* ptr_addresult); int remove_style(dbi_conn conn, unsigned int id); int read_xml(int fd, XML_Parser p, struct ADDRESULT* ptr_addresult); void log_print(int priority, const char* string); int is_refdb_admin(struct CLIENT_REQUEST* ptr_clrequest, struct ADDRESULT* ptr_addresult); int run_keyword_scan(struct CLIENT_REQUEST* ptr_clrequest, Lilid* ptr_sentinel, int mode); int addnote(struct CLIENT_REQUEST* ptr_clrequest, char* set_owner, struct ADDRESULT* ptr_addresult, int replace_note, Lilid* ptr_sentinel); int deletenote(struct CLIENT_REQUEST* ptr_clrequest, struct ADDRESULT* ptr_addresult); int getnote(struct CLIENT_REQUEST* ptr_clrequest, struct bibinfo *ptr_biblio_info, int ref_format, int n_privatelist, struct ADDRESULT* ptr_addresult, int send_data); int addlink(struct CLIENT_REQUEST* ptr_clrequest, char* set_owner, struct ADDRESULT* ptr_addresult, int n_remove); unsigned long long create_personal_list(dbi_conn conn, char *listname, unsigned long long n_user_id, const char *username); int remove_personal_list(dbi_conn conn, char *quoted_listname, struct CLIENT_REQUEST* ptr_clrequest, struct ADDRESULT* ptr_addresult); int updatejo(struct CLIENT_REQUEST* ptr_clrequest, struct ADDRESULT* ptr_addresult); struct CLIENT_REQUEST* new_client_request(void); struct CLIENT_REQUEST* dup_client_request(struct CLIENT_REQUEST* ptr_clrequest); int initialize_client_request(struct CLIENT_REQUEST* ptr_clrequest); int free_client_request(struct CLIENT_REQUEST* ptr_clrequest); int update_meta(dbi_conn conn, struct CLIENT_REQUEST* ptr_clrequest); int check_is_subseq(const char* author_concat, const char* table_name, int n_currpos, short int n_pubyear, dbi_conn conn); int daemonize(char* progname); int indent_notbelow_dbib(const char* name); int is_entry_dbib(const char* name); refdb-1.0.2/src/risdb.h000755 001750 001750 00000007240 12255427652 015525 0ustar00markusmarkus000000 000000 /* risdb.h header file for risdb.c */ /* markus@mhoenicka.de 3-26-00 */ /* $Id: risdb.h,v 1.11.2.4 2005/11/02 22:37:52 mhoenicka Exp $ */ /* 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ #include "authorinfo.h" /* this structure holds pointers to the synonyms of a particular journal */ struct PERIODICAL_INFO { char* full; char* abbrev; char* custabbrev1; char* custabbrev2; }; int process_ris_set(char* set, dbi_conn conn, dbi_conn conn_refdb, int replace_ref, char* set_owner, struct CLIENT_REQUEST* ptr_clrequest, int n_keep_id, Lilid* ptr_sentinel, unsigned long long set_count, char** msg_pool, size_t* msg_pool_len); char* preprocess_citekey_copy (const char* string, size_t n_maxlen); const char* get_unique_citekey(dbi_conn conn, const char* first_author, int year, int type, int replace_ref); int remove_keyword_entries(unsigned long long ref_id, dbi_conn conn, int mode); int remove_author_entries(unsigned long long ref_id, dbi_conn conn); int remove_xnote_entries(unsigned long long note_id, unsigned long long xref_id, dbi_conn conn, int mode); int remove_periodical_entries(unsigned long long periodical_id, dbi_conn conn); int remove_user_entries(unsigned long long user_id, dbi_conn conn); int remove_xuser_entries(unsigned long long ref_id, char* set_owner, dbi_conn conn); int remove_ulink_entries(unsigned long long ref_id, const char* set_owner, dbi_conn conn, int mode); /* int update_refdb_field(const char* fieldname, unsigned long long id, const char* fieldvalue, dbi_driver dbidrv, dbi_conn conn); */ int insert_user(const char* set_owner, unsigned long long n_refdb_id, unsigned long long* ptr_n_user_id, dbi_conn conn, const char* drivername, int replace_ref, int mode); int update_reprint(int rp_type, unsigned long long n_refdb_id, unsigned long long n_user_id, dbi_conn conn, const char* date_buffer, int replace_ref); int update_notes(const char* notes, unsigned long long n_refdb_id, unsigned long long n_user_id, dbi_conn conn, dbi_driver driver, int replace_ref); int update_avail(const char* avail, unsigned long long n_refdb_id, unsigned long long n_user_id, dbi_conn conn, dbi_driver driver, int replace_ref); int insert_author(struct AUTHOR_INFO* ptr_ainfo, int author_type, int xauthor_pos, unsigned long long n_refdb_id, dbi_conn conn, dbi_driver driver, const char* drivername, int replace_ref); int update_dateinfo(int date_type, int year, const char* otherinfo, unsigned long long n_refdb_id, dbi_conn conn, dbi_driver driver); int insert_keyword(const char* keyword, unsigned long long n_refdb_id, dbi_conn conn, dbi_driver driver, const char* drivername, int mode, int replace_ref); int insert_ulink(const char* ulink, int type, unsigned long long n_xref_id, dbi_conn conn, dbi_driver driver, const char* drivername, unsigned long long n_user_id, int mode, int replace_ref); int insert_periodical(struct PERIODICAL_INFO* ptr_perinfo, unsigned long long n_refdb_id, int replace_ref, int nis_dummy, dbi_conn conn, const char* drivername); char* assemble_full_author(struct AUTHOR_INFO* ptr_ainfo, int* ptr_error); refdb-1.0.2/src/writeris.h000755 001750 001750 00000001762 12255427653 016276 0ustar00markusmarkus000000 000000 /* writeris.h: header for writeris.c */ /* markus@mhoenicka.de 4-28-00 */ /* $Id: writeris.h,v 1.4.2.1 2005/04/15 22:45:11 mhoenicka Exp $ */ /* 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int render_ref(struct renderinfo* rendinfo); int prepare_render(struct renderinfo* rendinfo); int finish_render(struct renderinfo* rendinfo); refdb-1.0.2/src/backend.h000755 001750 001750 00000043307 12255427652 016015 0ustar00markusmarkus000000 000000 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ backend.h - header file for backend.c markus@mhoenicka.de 6-20-00 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ #ifndef backend_included #define backend_included 1 #include "authorinfo.h" #include "outformats.h" struct REPRINT { char reprint[13]; /* the reprint string: IN FILE etc. */ char date[12]; /* the ON REQUEST date or NULL if [NOT] IN FILE */ char avail[256]; /* the availability string */ }; struct bibinfo { char* format_string; /* additional output format information */ char* sort_string; /* specifies how to sort */ char* xreflabel; /* label for sgml output */ const char* encoding; /* character encoding of output */ const char* entry_id; /* id in sgml document */ int is_subseq; /* 1 if this is a subsequent reference of the same authors */ unsigned long long n_refdb_id; /* id of the reference in the original database */ unsigned long long n_startnumber; /* numeric citations start with number */ const char* year_unique_suffix; /* optional suffix after the year */ }; struct renderinfo { char** ptr_ref; /* ptr to a ptr to a buffer created with malloc which will receive the output. The calling function must allocate the buffer with at least one byte. This function will reallocate the buffer as needed. *ptr will be updated whenever a realloc is necessary. The calling function is responsible for freeing the memory again. */ size_t* ptr_ref_len; /* ptr to a variable holding the allocated length of ref. This variable will be updated if a realloc is necessary. */ dbi_result dbires; char* database; /* name of the database from which the data were pulled */ char* dbname; /* ptr to string with ID database prefix */ char* username; /* ptr to string with the current username */ char* pdfroot; /* ptr to string with the pdf root path */ char* cgi_url; /* ptr to string with URL for CSS file */ struct bibinfo* ptr_biblio_info; /* ptr to struct containing the info which fields to print etc. */ struct CLIENT_REQUEST* ptr_clrequest; /* ptr to struct with the client request info */ int ref_format; /* the output format; possible values are defined as REFXX */ unsigned long long nref_counter; /* number of current dataset */ int nuse_citestyle; /* 1 if citestyle-based formatting is requested, 0 if not */ int javascript; /* select the javascript to insert into html/xhmtl output; use 0 if a script is not required */ int frequency; /* if 1, include frequency information */ }; char* add_root_to_link(const char* link, const char* pdfroot); unsigned long long get_reference_count(dbi_conn conn, unsigned long long* ptr_max_id, int n_istemp); unsigned long long get_notes_count(dbi_conn conn, unsigned long long* ptr_max_id, int n_istemp); int calculate_relative_frequency(unsigned long long frequency, unsigned long long refcount); char* get_refdb_note_id(dbi_result dbires, char* id); const char* get_refdb_note_key(dbi_result dbires); char* get_refdb_note_date(dbi_result dbires, char* date, int mode); short int get_refdb_note_share(dbi_result dbires); const char* get_refdb_note_user_name(dbi_result dbires); char* get_refdb_note_title_copy(dbi_result dbires); char* get_refdb_note_content_copy(dbi_result dbires); const char* get_refdb_note_content_type(dbi_result dbires); const char* get_refdb_note_content_xmllang(dbi_result dbires); dbi_result request_notes_by_ref(dbi_conn conn, unsigned long long n_id, int mode, const char* user, int share, int include_lists); int free_request_notes_by_ref(dbi_conn conn); dbi_result request_links(dbi_conn conn, unsigned long long n_id, int mode); const char* get_link(dbi_result dbires, int *ptr_mode); char* get_refdb_id(dbi_result dbires, char* id); const char* get_refdb_citekey(dbi_result dbires); const char* get_refdb_type(dbi_result dbires); char* get_refdb_pubyear(dbi_result dbires, char* year); const char* get_refdb_startpage(dbi_result dbires); const char* get_refdb_endpage(dbi_result dbires); char* get_refdb_abstract_copy(dbi_result dbires); char* get_refdb_title_copy(dbi_result dbires); const char* get_refdb_volume(dbi_result dbires); const char* get_refdb_issue(dbi_result dbires); char* get_refdb_booktitle_copy(dbi_result dbires); const char* get_refdb_city(dbi_result dbires); const char* get_refdb_publisher(dbi_result dbires); char* get_refdb_title_series_copy(dbi_result dbires); char* get_refdb_address_copy(dbi_result dbires); /* char* get_refdb_url_copy(dbi_result dbires); */ const char* get_refdb_issn(dbi_result dbires); const char* get_refdb_pyother_info(dbi_result dbires); char* get_refdb_secyear(dbi_result dbires, char* year); const char* get_refdb_secother_info(dbi_result dbires); const char* get_refdb_user(dbi_result dbires, int n_fieldno); const char* get_refdb_user1(dbi_result dbires); const char* get_refdb_user2(dbi_result dbires); const char* get_refdb_user3(dbi_result dbires); const char* get_refdb_user4(dbi_result dbires); const char* get_refdb_user5(dbi_result dbires); const char* get_refdb_typeofwork(dbi_result dbires); const char* get_refdb_area(dbi_result dbires); const char* get_refdb_ostype(dbi_result dbires); const char* get_refdb_degree(dbi_result dbires); const char* get_refdb_runningtime(dbi_result dbires); const char* get_refdb_classcodeintl(dbi_result dbires); const char* get_refdb_classcodeus(dbi_result dbires); const char* get_refdb_senderemail(dbi_result dbires); const char* get_refdb_recipientemail(dbi_result dbires); const char* get_refdb_mediatype(dbi_result dbires); const char* get_refdb_numvolumes(dbi_result dbires); const char* get_refdb_edition(dbi_result dbires); const char* get_refdb_computer(dbi_result dbires); const char* get_refdb_conferencelocation(dbi_result dbires); const char* get_refdb_registrynum(dbi_result dbires); const char* get_refdb_classification(dbi_result dbires); const char* get_refdb_section(dbi_result dbires); const char* get_refdb_pamphletnum(dbi_result dbires); const char* get_refdb_chapternum(dbi_result dbires); const char* get_refdb_doi(dbi_result dbires); char* get_notes_copy(dbi_result dbires, char* username); struct REPRINT* get_reprint(dbi_result dbires, struct REPRINT* ptr_reprint, char* username, int yeardigits); char* get_periodical(dbi_conn conn, char* periodical, const char* db, int type, int* errcode, int is_temp, unsigned long long id, unsigned long long* ptr_frequency); dbi_result request_authors(dbi_conn conn, int type, const char* role, const char* db, int is_temp, unsigned long long n_id); unsigned long long get_num_authors(dbi_result dbires); const char* get_author(dbi_result dbires); struct AUTHOR_INFO* get_author_parts(dbi_result dbires, struct AUTHOR_INFO* ptr_ainfo); const char* get_extended_author(dbi_result dbires, int is_temp, unsigned long long* ptr_frequency); struct AUTHOR_INFO* get_extended_author_parts(dbi_result dbires, struct AUTHOR_INFO* ptr_ainfo, int is_temp, unsigned long long* ptr_frequency); dbi_result request_users(dbi_conn conn, const char* db, int is_temp, unsigned long long n_id); const char* get_user(dbi_result dbires); dbi_result request_keywords(dbi_conn conn, unsigned long long n_id, int mode, int is_temp); const char* get_keyword(dbi_result dbires); const char* get_extended_keyword(dbi_result dbires, int is_temp, unsigned long long* ptr_frequency); unsigned long long get_num_keywords(dbi_result dbires); dbi_result request_ulinks(dbi_conn conn, unsigned long long n_id, int mode, int type, int is_temp, const char* username); const char* get_ulink(dbi_result dbires); void clean_request(dbi_result dbires); char* my_dbi_result_get_binary_copy(dbi_result Result, const char* fieldname); const char* my_dbi_result_get_string(dbi_result Result, const char* fieldname); const char* my_dbi_result_get_string_idx(dbi_result Result, unsigned int idx); char* my_dbi_result_get_string_copy(dbi_result dbires, const char* fieldname); char* my_dbi_result_get_string_copy_idx(dbi_result dbires, unsigned int idx); const char* get_author_type_string(dbi_driver driver, int type); int is_in_list(dbi_result dbires, char* username); char* assemble_header(struct renderinfo* ptr_rendinfo); int has_part_data(const char* type); int has_set_data(const char* type); int has_periodical_data(const char* type); int has_chapter_data(const char* type); char* sgml_entitize(char** buffer, int n_ref_format); dbi_result load_style(const char* pubtype, unsigned int citstyle_id, dbi_conn conn); void unload_style(void); /* libdbi _idx functions use a 1-based index */ enum refdb_col {ID = 1, AUTHORLISTSTYLE, EDITORLISTSTYLE, SEDITORLISTSTYLE, ALLALISTSTYLE, AUTHORLISTALTERNATESTYLE, EDITORLISTALTERNATESTYLE, SEDITORLISTALTERNATESTYLE, ALLALISTALTERNATESTYLE, AUTHORLISTALTERNATETEXT, EDITORLISTALTERNATETEXT, SEDITORLISTALTERNATETEXT, ALLALISTALTERNATETEXT, AUTHORLISTABBREVIATEFIRST, EDITORLISTABBREVIATEFIRST, SEDITORLISTABBREVIATEFIRST, ALLALISTABBREVIATEFIRST, AUTHORLISTABBREVIATESUBSEQ, EDITORLISTABBREVIATESUBSEQ, SEDITORLISTABBREVIATESUBSEQ, ALLALISTABBREVIATESUBSEQ, AUTHORLISTABBREVIATEFIRSTMAXAUTHOR, EDITORLISTABBREVIATEFIRSTMAXAUTHOR, SEDITORLISTABBREVIATEFIRSTMAXAUTHOR, ALLALISTABBREVIATEFIRSTMAXAUTHOR, AUTHORLISTABBREVIATESUBSEQMAXAUTHOR, EDITORLISTABBREVIATESUBSEQMAXAUTHOR, SEDITORLISTABBREVIATESUBSEQMAXAUTHOR, ALLALISTABBREVIATESUBSEQMAXAUTHOR, AUTHORLISTABBREVIATEFIRSTDISPLAYAUTHOR, EDITORLISTABBREVIATEFIRSTDISPLAYAUTHOR, SEDITORLISTABBREVIATEFIRSTDISPLAYAUTHOR, ALLALISTABBREVIATEFIRSTDISPLAYAUTHOR, AUTHORLISTABBREVIATESUBSEQDISPLAYAUTHOR, EDITORLISTABBREVIATESUBSEQDISPLAYAUTHOR, SEDITORLISTABBREVIATESUBSEQDISPLAYAUTHOR, ALLALISTABBREVIATESUBSEQDISPLAYAUTHOR, AUTHORLISTAEMPTY, EDITORLISTAEMPTY, SEDITORLISTAEMPTY, ALLALISTAEMPTY, AUTHORLISTASAME, EDITORLISTASAME, SEDITORLISTASAME, ALLALISTASAME, AUTHORLISTPRECEEDING, EDITORLISTPRECEEDING, SEDITORLISTPRECEEDING, ALLALISTPRECEEDING, AUTHORLISTFOLLOWING, EDITORLISTFOLLOWING, SEDITORLISTFOLLOWING, ALLALISTFOLLOWING, AUTHORLISTAUTHORSEPSTWOSEPS, EDITORLISTAUTHORSEPSTWOSEPS, SEDITORLISTAUTHORSEPSTWOSEPS, ALLALISTAUTHORSEPSTWOSEPS, AUTHORLISTAUTHORSEPSTHREESEPSTHREESEPSEACH, EDITORLISTAUTHORSEPSTHREESEPSTHREESEPSEACH, SEDITORLISTAUTHORSEPSTHREESEPSTHREESEPSEACH, ALLALISTAUTHORSEPSTHREESEPSTHREESEPSEACH, AUTHORLISTAUTHORSEPSTHREESEPSTHREESEPSLAST, EDITORLISTAUTHORSEPSTHREESEPSTHREESEPSLAST, SEDITORLISTAUTHORSEPSTHREESEPSTHREESEPSLAST, ALLALISTAUTHORSEPSTHREESEPSTHREESEPSLAST, AUTHORLISTAUTHORNAMESNAMEFIRSTNAMEORDER, EDITORLISTAUTHORNAMESNAMEFIRSTNAMEORDER, SEDITORLISTAUTHORNAMESNAMEFIRSTNAMEORDER, ALLALISTAUTHORNAMESNAMEFIRSTNAMEORDER, AUTHORLISTAUTHORNAMESNAMEFIRSTINITIALSTYLE, EDITORLISTAUTHORNAMESNAMEFIRSTINITIALSTYLE, SEDITORLISTAUTHORNAMESNAMEFIRSTINITIALSTYLE, ALLALISTAUTHORNAMESNAMEFIRSTINITIALSTYLE, AUTHORLISTAUTHORNAMESNAMEFIRSTUPPERCASE, EDITORLISTAUTHORNAMESNAMEFIRSTUPPERCASE, SEDITORLISTAUTHORNAMESNAMEFIRSTUPPERCASE, ALLALISTAUTHORNAMESNAMEFIRSTUPPERCASE, AUTHORLISTAUTHORNAMESNAMEOTHERNAMEORDER, EDITORLISTAUTHORNAMESNAMEOTHERNAMEORDER, SEDITORLISTAUTHORNAMESNAMEOTHERNAMEORDER, ALLALISTAUTHORNAMESNAMEOTHERNAMEORDER, AUTHORLISTAUTHORNAMESNAMEOTHERINITIALSTYLE, EDITORLISTAUTHORNAMESNAMEOTHERINITIALSTYLE, SEDITORLISTAUTHORNAMESNAMEOTHERINITIALSTYLE, ALLALISTAUTHORNAMESNAMEOTHERINITIALSTYLE, AUTHORLISTAUTHORNAMESNAMEOTHERUPPERCASE, EDITORLISTAUTHORNAMESNAMEOTHERUPPERCASE, SEDITORLISTAUTHORNAMESNAMEOTHERUPPERCASE, ALLALISTAUTHORNAMESNAMEOTHERUPPERCASE, AUTHORLISTTEXTTEXTSINGLEPRECEEDING, EDITORLISTTEXTTEXTSINGLEPRECEEDING, SEDITORLISTTEXTTEXTSINGLEPRECEEDING, ALLALISTTEXTTEXTSINGLEPRECEEDING, AUTHORLISTTEXTTEXTSINGLEFOLLOWING, EDITORLISTTEXTTEXTSINGLEFOLLOWING, SEDITORLISTTEXTTEXTSINGLEFOLLOWING, ALLALISTTEXTTEXTSINGLEFOLLOWING, AUTHORLISTTEXTTEXTMULTIPLEPRECEEDING, EDITORLISTTEXTTEXTMULTIPLEPRECEEDING, SEDITORLISTTEXTTEXTMULTIPLEPRECEEDING, ALLALISTTEXTTEXTMULTIPLEPRECEEDING, AUTHORLISTTEXTTEXTMULTIPLEFOLLOWING, EDITORLISTTEXTTEXTMULTIPLEFOLLOWING, SEDITORLISTTEXTTEXTMULTIPLEFOLLOWING, ALLALISTTEXTTEXTMULTIPLEFOLLOWING, AUTHORLISTTEXTEDTEXTSINGLEPRECEEDING, EDITORLISTTEXTEDTEXTSINGLEPRECEEDING, SEDITORLISTTEXTEDTEXTSINGLEPRECEEDING, ALLALISTTEXTEDTEXTSINGLEPRECEEDING, AUTHORLISTTEXTEDTEXTSINGLEFOLLOWING, EDITORLISTTEXTEDTEXTSINGLEFOLLOWING, SEDITORLISTTEXTEDTEXTSINGLEFOLLOWING, ALLALISTTEXTEDTEXTSINGLEFOLLOWING, AUTHORLISTTEXTEDTEXTMULTIPLEPRECEEDING, EDITORLISTTEXTEDTEXTMULTIPLEPRECEEDING, SEDITORLISTTEXTEDTEXTMULTIPLEPRECEEDING, ALLALISTTEXTEDTEXTMULTIPLEPRECEEDING, AUTHORLISTTEXTEDTEXTMULTIPLEFOLLOWING, EDITORLISTTEXTEDTEXTMULTIPLEFOLLOWING, SEDITORLISTTEXTEDTEXTMULTIPLEFOLLOWING, ALLALISTTEXTEDTEXTMULTIPLEFOLLOWING, PUBDATEPRECEEDING, PUBDATEFOLLOWING, PUBDATEFORMAT, PUBDATESEQUENCE, PUBDATEMONTHFORMAT, PUBDATEDAYFORMAT, PUBDATEYEARFORMAT, PUBDATEPADLEADINGZERO, PUBDATESTYLE, PUBDATESECPRECEEDING, PUBDATESECFOLLOWING, PUBDATESECFORMAT, PUBDATESECSEQUENCE, PUBDATESECMONTHFORMAT, PUBDATESECDAYFORMAT, PUBDATESECYEARFORMAT, PUBDATESECPADLEADINGZERO, PUBDATESECSTYLE, PUBDATEALLPRECEEDING, PUBDATEALLFOLLOWING, PUBDATEALLFORMAT, PUBDATEALLSEQUENCE, PUBDATEALLMONTHFORMAT, PUBDATEALLDAYFORMAT, PUBDATEALLYEARFORMAT, PUBDATEALLPADLEADINGZERO, PUBDATEALLSTYLE, TITLEPRECEEDING, TITLEFOLLOWING, TITLECASE, TITLESTYLE, BOOKTITLEPRECEEDING, BOOKTITLEFOLLOWING, BOOKTITLECASE, BOOKTITLESTYLE, SERIESTITLEPRECEEDING, SERIESTITLEFOLLOWING, SERIESTITLECASE, SERIESTITLESTYLE, ALLTITLEPRECEEDING, ALLTITLEFOLLOWING, ALLTITLECASE, ALLTITLESTYLE, JOURNALNAMEPRECEEDING, JOURNALNAMEFOLLOWING, JOURNALNAMECASE, JOURNALNAMEDEFAULTTEXT, JOURNALNAMEALTERNATETEXT, JOURNALNAMEPUNCTUATION, JOURNALNAMESTYLE, VOLUMEPRECEEDING, VOLUMEFOLLOWING, VOLUMESTYLE, ISSUEPRECEEDING, ISSUEFOLLOWING, ISSUESTYLE, PAGESSTYLE, PAGESSINGLEPAGEPRECEEDING, PAGESSINGLEPAGEFOLLOWING, PAGESPAGERANGEPRECEEDING, PAGESPAGERANGEFOLLOWING, PAGESPAGERANGETYPE, PUBLISHERPRECEEDING, PUBLISHERFOLLOWING, PUBLISHERSTYLE, PUBPLACEPRECEEDING, PUBPLACEFOLLOWING, PUBPLACESTYLE, PAGESPRECEEDING, PAGESFOLLOWING, REFNUMBERPRECEEDING, REFNUMBERFOLLOWING, REFNUMBERSTYLE, PUBDATEFIRSTSEP, PUBDATESECONDSEP, PUBDATESECFIRSTSEP, PUBDATESECSECONDSEP, PUBDATEALLFIRSTSEP, PUBDATEALLSECONDSEP, PAGESPAGERANGERANGESEPARATOR, SERIALPRECEEDING, SERIALFOLLOWING, SERIALSTYLE, ADDRESSPRECEEDING, ADDRESSFOLLOWING, ADDRESSSTYLE, USERDEF1PRECEEDING, USERDEF1FOLLOWING, USERDEF1STYLE, USERDEF2PRECEEDING, USERDEF2FOLLOWING, USERDEF2STYLE, USERDEF3PRECEEDING, USERDEF3FOLLOWING, USERDEF3STYLE, USERDEF4PRECEEDING, USERDEF4FOLLOWING, USERDEF4STYLE, USERDEF5PRECEEDING, USERDEF5FOLLOWING, USERDEF5STYLE, NOTESPRECEEDING, NOTESFOLLOWING, NOTESSTYLE, ABSTRACTPRECEEDING, ABSTRACTFOLLOWING, ABSTRACTSTYLE, TYPEOFWORKPRECEEDING, TYPEOFWORKFOLLOWING, TYPEOFWORKSTYLE, AREAPRECEEDING, AREAFOLLOWING, AREASTYLE, OSTYPEPRECEEDING, OSTYPEFOLLOWING, OSTYPESTYLE, DEGREEPRECEEDING, DEGREEFOLLOWING, DEGREESTYLE, RUNNINGTIMEPRECEEDING, RUNNINGTIMEFOLLOWING, RUNNINGTIMESTYLE, CLASSCODEINTLPRECEEDING, CLASSCODEINTLFOLLOWING, CLASSCODEINTLSTYLE, CLASSCODEUSPRECEEDING, CLASSCODEUSFOLLOWING, CLASSCODEUSSTYLE, SENDEREMAILPRECEEDING, SENDEREMAILFOLLOWING, SENDEREMAILSTYLE, RECIPIENTEMAILPRECEEDING, RECIPIENTEMAILFOLLOWING, RECIPIENTEMAILSTYLE, MEDIATYPEPRECEEDING, MEDIATYPEFOLLOWING, MEDIATYPESTYLE, NUMVOLUMESPRECEEDING, NUMVOLUMESFOLLOWING, NUMVOLUMESSTYLE, EDITIONPRECEEDING, EDITIONFOLLOWING, EDITIONSTYLE, COMPUTERPRECEEDING, COMPUTERFOLLOWING, COMPUTERSTYLE, CONFERENCELOCATIONPRECEEDING, CONFERENCELOCATIONFOLLOWING, CONFERENCELOCATIONSTYLE, REGISTRYNUMPRECEEDING, REGISTRYNUMFOLLOWING, REGISTRYNUMSTYLE, CLASSIFICATIONPRECEEDING, CLASSIFICATIONFOLLOWING, CLASSIFICATIONSTYLE, SECTIONPRECEEDING, SECTIONFOLLOWING, SECTIONSTYLE, PAMPHLETNUMPRECEEDING, PAMPHLETNUMFOLLOWING, PAMPHLETNUMSTYLE, CHAPTERNUMPRECEEDING, CHAPTERNUMFOLLOWING, CHAPTERNUMSTYLE, LINK0PRECEEDING, LINK0FOLLOWING, LINK0STYLE, LINK1PRECEEDING, LINK1FOLLOWING, LINK1STYLE, LINK2PRECEEDING, LINK2FOLLOWING, LINK2STYLE, LINK3PRECEEDING, LINK3FOLLOWING, LINK3STYLE, LINK4PRECEEDING, LINK4FOLLOWING, LINK4STYLE, CITEKEYPRECEEDING, CITEKEYFOLLOWING, CITEKEYSTYLE}; enum citestyle_col {CITID = 1, CITSEPARATOR, FOLLOWING, PRECEEDING, RANGESEPARATOR, INTEXTSEQUENCE, STYLE, JANFULL, FEBFULL, MARFULL, APRFULL, MAYFULL, JUNFULL, JULFULL, AUGFULL, SEPFULL, OCTFULL, NOVFULL, DECFULL, JANABBREV, FEBABBREV, MARABBREV, APRABBREV, MAYABBREV, JUNABBREV, JULABBREV, AUGABBREV, SEPABBREV, OCTABBREV, NOVABBREV, DECABBREV, JANTHREELET, FEBTHREELET, MARTHREELET, APRTHREELET, MAYTHREELET, JUNTHREELET, JULTHREELET, AUGTHREELET, SEPTHREELET, OCTTHREELET, NOVTHREELET, DECTHREELET}; enum refdbref_col {REFDB_ID = 1, REFDB_TYPE, REFDB_PUBYEAR, REFDB_STARTPAGE, REFDB_ENDPAGE, REFDB_ABSTRACT, REFDB_TITLE, REFDB_VOLUME, REFDB_ISSUE, REFDB_BOOKTITLE, REFDB_CITY, REFDB_PUBLISHER, REFDB_TITLE_SERIES, REFDB_ADDRESS, REFDB_ISSN, REFDB_PERIODICAL_ID, REFDB_PYOTHER_INFO, REFDB_SECYEAR, REFDB_SECOTHER_INFO, REFDB_USER1, REFDB_USER2, REFDB_USER3, REFDB_USER4, REFDB_USER5, REFDB_TYPEOFWORK, REFDB_AREA, REFDB_OSTYPE, REFDB_DEGREE, REFDB_RUNNINGTIME, REFDB_CLASSCODEINTL, REFDB_CLASSCODEUS, REFDB_SENDEREMAIL, REFDB_RECIPIENTEMAIL, REFDB_MEDIATYPE, REFDB_NUMVOLUMES, REFDB_EDITION, REFDB_COMPUTER, REFDB_CONFERENCELOCATION, REFDB_REGISTRYNUM, REFDB_CLASSIFICATION, REFDB_SECTION, REFDB_PAMPHLETNUM, REFDB_CHAPTERNUM, REFDB_CITEKEY}; #endif /* ifndef backend_included */ refdb-1.0.2/src/backend-scrn.h000755 001750 001750 00000002116 12255427652 016751 0ustar00markusmarkus000000 000000 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ backend-scrn.h header file for backend-scrn.c markus@mhoenicka.de 6-21-00 $Id: backend-scrn.h,v 1.3.2.1 2005/04/15 22:45:06 mhoenicka Exp $ 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int prepare_render_scrn(struct renderinfo* ptr_rendinfo); int finish_render_scrn(struct renderinfo* ptr_rendinfo); int render_scrn(struct renderinfo* ptr_rendinfo); refdb-1.0.2/src/backend-ris.h000755 001750 001750 00000002110 12255427652 016573 0ustar00markusmarkus000000 000000 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ backend-ris.h header file for backend-ris.c markus@mhoenicka.de 6-21-00 $Id: backend-ris.h,v 1.4.2.1 2005/04/15 22:45:06 mhoenicka Exp $ 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int prepare_render_ris(struct renderinfo* ptr_rendinfo); int finish_render_ris(struct renderinfo* ptr_rendinfo); int render_ris(struct renderinfo* ptr_rendinfo); refdb-1.0.2/src/backend-risx.h000644 001750 001750 00000002121 12255427652 016762 0ustar00markusmarkus000000 000000 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ backend-risx.h header file for backend-risx.c markus@mhoenicka.de 2003-03-25 $Id: backend-risx.h,v 1.3.2.1 2005/04/15 22:45:06 mhoenicka Exp $ 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int prepare_render_risx(struct renderinfo* ptr_rendinfo); int finish_render_risx(struct renderinfo* ptr_rendinfo); int render_risx(struct renderinfo* ptr_rendinfo); refdb-1.0.2/src/backend-mods.h000644 001750 001750 00000002015 12255427652 016741 0ustar00markusmarkus000000 000000 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ backend-mods.h header file for backend-mods.c markus@mhoenicka.de 2007-03-13 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int prepare_render_mods(struct renderinfo* ptr_rendinfo); int finish_render_mods(struct renderinfo* ptr_rendinfo); int render_mods(struct renderinfo* ptr_rendinfo); refdb-1.0.2/src/backend-db31.h000755 001750 001750 00000002366 12255427652 016544 0ustar00markusmarkus000000 000000 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ backend-db31.h header file for backend-db31.c markus@mhoenicka.de 6-21-00 $Id: backend-db31.h,v 1.4.2.1 2005/04/15 22:45:05 mhoenicka Exp $ 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int prepare_render_db31(struct renderinfo* ptr_rendinfo); int finish_render_db31(struct renderinfo* ptr_rendinfo); int render_db31(struct renderinfo* ptr_rendinfo); int prepare_render_db50(struct renderinfo* ptr_rendinfo); int finish_render_db50(struct renderinfo* ptr_rendinfo); int render_db50(struct renderinfo* ptr_rendinfo); refdb-1.0.2/src/backend-teix.h000644 001750 001750 00000002375 12255427652 016761 0ustar00markusmarkus000000 000000 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ backend-teix.h header file for backend-teix.c markus@mhoenicka.de 2002-08-27 $Id: backend-teix.h,v 1.2.2.1 2005/04/15 22:45:06 mhoenicka Exp $ 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int prepare_render_teix(struct renderinfo* ptr_rendinfo); int finish_render_teix(struct renderinfo* ptr_rendinfo); int render_teix(struct renderinfo* ptr_rendinfo); int prepare_render_teix5(struct renderinfo* ptr_rendinfo); int finish_render_teix5(struct renderinfo* ptr_rendinfo); int render_teix5(struct renderinfo* ptr_rendinfo); refdb-1.0.2/src/backend-bibtex.h000755 001750 001750 00000002325 12255427652 017263 0ustar00markusmarkus000000 000000 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ backend-bibtex.h header file for backend-bibtex.c markus@mhoenicka.de 8-10-00 $Id: backend-bibtex.h,v 1.6.2.1 2005/04/15 22:45:05 mhoenicka Exp $ 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int prepare_render_bibtex(struct renderinfo* ptr_rendinfo); int finish_render_bibtex(struct renderinfo* ptr_rendinfo); int render_bibtex(struct renderinfo* ptr_rendinfo); int gettexbib(struct CLIENT_REQUEST* ptr_clrequest, struct bibinfo* ptr_biblio_info, struct ADDRESULT* ptr_addresult); refdb-1.0.2/src/backend-html.h000755 001750 001750 00000002133 12255427652 016747 0ustar00markusmarkus000000 000000 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ backend-html.h header file for backend-html.c markus@mhoenicka.de 9-5-00 $Id: backend-html.h,v 1.4.2.1 2005/04/15 22:45:06 mhoenicka Exp $ 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int prepare_render_html(struct renderinfo* ptr_rendinfo); int finish_render_html(struct renderinfo* ptr_rendinfo); int render_html(struct renderinfo* ptr_rendinfo, int n_istemp); refdb-1.0.2/src/backend-dbib.h000755 001750 001750 00000010753 12255427652 016712 0ustar00markusmarkus000000 000000 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ backend-dbib.h header file for backend-dbib.c markus@mhoenicka.de 2001-01-10 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ #include "mset.h" int prepare_render_dbib(char** ptr_ref, size_t* ptr_ref_len, struct bibinfo* ptr_biblio_info, dbi_conn conn, int n_ref_format, const char* ns); int finish_render_dbib(char** ptr_ref, size_t* ptr_ref_len, struct BIBCONNS* ptr_bibconns, struct bibinfo* ptr_biblio_info, char* table_name, struct CLIENT_REQUEST* ptr_clrequest, struct xmlindent* ptr_indent, int n_ref_format); int render_dbib(char** ptr_ref, size_t* ref_len, struct BIBCONNS* ptr_bibconns, dbi_result dbires, const char* database, struct bibinfo* ptr_biblio_info, char* username, char* pdfroot, int nref_counter, short title_as_author, const char* ns, struct xmlindent* ptr_indent, int n_ref_format); int format_entry(char** ptr_ref, size_t* ptr_ref_len, char* pubtype, struct BIBCONNS* ptr_bibconns, dbi_result dbiresref, dbi_result dbires, const char* database, const char* username, int nref_counter, struct mset* ptr_mset_sentinel, struct bibinfo* ptr_biblio_info, short title_as_author, const char* ns, struct xmlindent* ptr_indent, int n_ref_format, const char* pdfroot); char* format_refnumber(char** ptr_ref, size_t* ptr_ref_len, struct BIBCONNS* ptr_bibconns, dbi_result dbires, dbi_result dbiresref, int nref_counter, int n_intext, const char* ns, struct xmlindent* ptr_indent, int n_ref_format); char* format_citekey(char** ptr_ref, size_t* ptr_ref_len, struct BIBCONNS* ptr_bibconns, dbi_result dbires, dbi_result dbiresref, int n_intext, const char* ns, struct xmlindent* ptr_indent, int n_ref_format); int format_authorlist(char** ptr_ref, size_t* ptr_ref_len, struct BIBCONNS* ptr_bibconns, dbi_result dbires, dbi_result dbiresref, int type, const char* database, int n_intext, struct bibinfo* ptr_biblio_info, short title_as_author, const char* ns, struct xmlindent* ptr_indent, int n_ref_format); char* format_pubdate(char** ptr_ref, size_t* ptr_ref_len, struct BIBCONNS* ptr_bibconns, dbi_result dbires, dbi_result dbiresref, dbi_result dbirescit, int type, int n_intext, const char* year_unique_suffix, const char* ns, struct xmlindent* ptr_indent, int n_ref_format); char* format_title(char** ptr_ref, size_t* ptr_ref_len, struct BIBCONNS* ptr_bibconns, dbi_result dbires, dbi_result dbires_ref, int type, int n_intext, int n_title_as_author, const char* ns, struct xmlindent* ptr_indent, int n_ref_format); char* format_journalname(char** ptr_ref, size_t* ptr_ref_len, struct BIBCONNS* ptr_bibconns, dbi_result dbires, dbi_result dbires_ref, const char* database, int n_intext, const char* ns, struct xmlindent* ptr_indent, int n_ref_format, int n_title_as_author); char* format_pages(char** ptr_ref, size_t* ptr_ref_len, struct BIBCONNS* ptr_bibconns, dbi_result dbires, dbi_result dbiresref, int n_intext, const char* ns, struct xmlindent* ptr_indent, int n_ref_format); char* format_separator(char* ref, size_t* ptr_ref_len, struct BIBCONNS* ptr_bibconns, unsigned int n_separator_id, int n_ref_format); char* format_simple(char** ptr_ref, size_t* ptr_ref_len, struct BIBCONNS* ptr_bibconns, dbi_result dbires, dbi_result dbires_ref, int n_intext, int n_item_index, int n_preceeding_index, int n_following_index, const char* elname, const char* ns, struct xmlindent* ptr_indent, int n_ref_format); char* format_notes(char** ptr_ref, size_t* ptr_ref_len, struct BIBCONNS* ptr_bibconns, dbi_result dbires, dbi_result dbires_ref, const char* username, const char* ns, struct xmlindent* ptr_indent, int n_ref_format); char* format_ulink(char** ptr_ref, size_t* ptr_ref_len, struct BIBCONNS* ptr_bibconns, dbi_result dbires, dbi_result dbires_ref, int type, int n_intext, int n_preceeding_index, int n_following_index, const char* ns, struct xmlindent* ptr_indent, int n_ref_format, const char* pdfroot); refdb-1.0.2/src/backend-citationlistx.h000644 001750 001750 00000002204 12255427652 020675 0ustar00markusmarkus000000 000000 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ backend-citationlistx.h header file for backend-citationlistx.c markus@mhoenicka.de 6-21-00 $Id: backend-citationlistx.h,v 1.1.2.1 2006/02/22 20:50:14 mhoenicka Exp $ 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int prepare_render_citationlistx(struct renderinfo* ptr_rendinfo); int finish_render_citationlistx(struct renderinfo* ptr_rendinfo); int render_citationlistx(struct renderinfo* ptr_rendinfo); refdb-1.0.2/src/backend-rtfbib.h000644 001750 001750 00000003427 12255427652 017257 0ustar00markusmarkus000000 000000 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ backend-rtfbib.h header file for backend-rtfbib.c markus@mhoenicka.de 2008-01-27 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int prepare_render_rtfbib(char** ptr_ref, size_t* ptr_ref_len, struct bibinfo* ptr_biblio_info, dbi_conn conn); int finish_render_rtfbib(char** ptr_ref, size_t* ptr_ref_len, struct BIBCONNS* ptr_bibconns, struct bibinfo* ptr_biblio_info, char* table_name, struct CLIENT_REQUEST* ptr_clrequest); int render_rtfbib(char** ptr_ref, size_t* ptr_ref_len, struct BIBCONNS* ptr_bibconns, dbi_result dbires, const char* database, struct bibinfo* ptr_biblio_info, char* username, char* pdfroot, int nref_counter, short title_as_author); int format_rtf_entry(char** ptr_ref, size_t* ptr_ref_len, char* pubtype, struct BIBCONNS* ptr_bibconns, dbi_result dbires_cit, dbi_result dbires, const char* database, const char* username, int nref_counter, struct bibinfo* ptr_biblio_info, short title_as_author, const char* pdfroot); char* print_rtf_format(char** ptr_buffer, size_t* ptr_buflen, const char* name, dbi_result dbires_ref, int start_group); refdb-1.0.2/src/xmlhandler.h000755 001750 001750 00000011013 12255427653 016552 0ustar00markusmarkus000000 000000 /*+++++++++++++++++++++++ xmlhandler.h header file for xmlhandler.c markus@mhoenicka.de 12-29-00 $Id: xmlhandler.h,v 1.6.2.5 2005/09/29 22:35:59 mhoenicka Exp $ 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, see ++++++++++++++++++++++++*/ #define ELNAME_LENGTH 64 /* max length of an XML element name */ #define ELVALUE_LENGTH 256 /* max/initial length of an XML element value */ #define EL_LENGTH 512 /* ELNAME plus ELVALUE plus a little slack */ /* the current implementation can do without resizable name/value variables which saves a few malloc()/realloc() calls in favour of speed */ struct attrlist { char attribute_name[ELNAME_LENGTH]; char attribute_value[ELVALUE_LENGTH]; struct attrlist *ptr_next; }; /* element names are ok with fixed size. element values may be treated as resizable */ struct elstack { char elname[ELNAME_LENGTH]; char *ptr_elvalue; size_t n_elvalue_len; struct attrlist *ptr_attr_first; struct elstack *ptr_next; }; /* this struct defines a simple stack for elements without a length limit for the value and with just one attribute of variable length. */ struct simple_elstack { char elname[ELNAME_LENGTH]; char* elvalue; char* attrvalue; struct simple_elstack *ptr_snext; }; struct getbib_data { char* ptr_default_db; dbi_conn conn; /* connection to the reference database */ dbi_conn conn_refdb; /* connection to the style database */ int* ptr_citation_count; /* counter for citations in id handler */ int* ptr_xref_count; /* counter for xrefs in id handler */ char* ptr_table_name; /* unique table name for temporary table */ char* ptr_curr_multi_id; /* ptr to the current multiple citation id */ char* quoted_journal; /* name of the style to be used */ size_t* ptr_cmid_len; /* ptr to int containing allocated length of ptr_curr_multi_id */ int* ptr_nmem_error; /* if != 0, out of memory error occurred */ int* ptr_ndb_error; /* if != 0, database error occurred */ unsigned long long* ptr_ndb_notfound; /* number of refs not found in the database */ struct simple_elstack *ptr_sfirst; /* the elements from the id list */ struct CLIENT_REQUEST *ptr_clrequest; Lilifstring *ptr_notfound_first; /* list of citation keys not found */ Lilifstring *ptr_found_first; /* list of citation keys found */ }; struct addstyle_data { int* ptr_nmem_error; /* if != 0, out of memory error occurred */ int* ptr_ndb_error; /* if != 0, database error occurred */ int* ptr_depth; /* the current depth of the element stack */ int* ptr_depth_adjust; /* 0 if citestyle, 1 if styleset */ int* ptr_position; /* position of an element in PUBTYPE or INTEXTDEF */ int* ptr_set_count; /* number of finished CITESTYLE elements */ unsigned int* ptr_citstyle_id; /* id of the current CITSTYLE element */ unsigned int* ptr_refstyle_id; /* id of the current REFSTYLE element */ unsigned int* ptr_separator_id; /* id of the current SEPARATORS element */ struct elstack* ptr_first; /* start of the element stack */ char* the_journal; /* current journal name */ dbi_conn conn; struct ADDRESULT* ptr_addresult; /* ptr to struct with counters */ }; void start_handler(void *ptr_data, const char *el, const char **ptr_attr); void end_handler(void *ptr_data, const char *el); void char_handler(void *ptr_data, const char *string, int len); void delete_list(struct elstack* ptr_current_element); char* get_attr(struct elstack* ptr_current_element, char* attribute); int is_descendant_of(struct elstack* ptr_current_element, char* ancestor_name); void id_start_handler(void *ptr_data, const char *el, const char **ptr_attr); void id_end_handler(void *ptr_data, const char *el); void id_char_handler(void *ptr_data, const char *string, int len); void delete_idlist(struct simple_elstack* ptr_current_element); void idraw_start_handler(void *ptr_data, const char *el, const char **ptr_attr); void idraw_end_handler(void *ptr_data, const char *el); void idraw_char_handler(void *ptr_data, const char *string, int len); refdb-1.0.2/src/dbfncs.h000644 001750 001750 00000010535 12255427652 015657 0ustar00markusmarkus000000 000000 /* dbfncs.h header file for dbfncs.c */ /* markus@mhoenicka.de 2002-08-06 */ /* $Id: dbfncs.h,v 1.6.2.5 2005/09/11 19:58:10 mhoenicka Exp $ */ /* 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ struct db_caps { char multiple_db[2]; /* if t, SELECT can address tables in more than one db */ char sql_enum[2]; /* if t, the db engine supports an enum type */ char rlike[13]; /* what SELECT uses to implement a regexp like */ char not_rlike[17]; /* what SELECT uses to implement a regexp not like */ char transaction[2]; /* if t, the db engine supports transactions */ char localhost[10]; /* the string used to access the db engine on localhost */ char encoding[16]; /* command fragment to request char encodings */ char groups[3]; /* if t, db engine uses groups to manage users */ char admin_systable[11]; /* a table that only the admin may access */ char listall[3]; /* the string used in SELECT to list all entries */ char bigint[2]; /* if t, db engine supports unsigned long long */ char sql_union[2]; /* if t, the db engine supports UNION in SELECT */ char named_seq[2]; /* if t, sequence_last() needs seq name */ char charlength[12]; /* the SQL function returning the length of a string */ char substring[10]; /* the SQL function used to retrieve a substring */ char substring_from[7]; /* the from part of the substring function */ char substring_for[6]; /* the for part of the substring function */ char sql_except[2]; /* if t, supports EXCEPT in SELECT clauses */ char defval[2]; /* default return value if nothing else helps */ char unix_regexp[2]; /* if t, supports unix regular expressions */ int has_versioninfo; /* if non-zero, struct was updated with db engine version-specific information */ }; struct db_caps* new_db_caps(struct CLIENT_REQUEST* ptr_clrequest); void free_db_caps(struct db_caps* ptr_caps); int create_tables_mysql(dbi_conn conn, struct CLIENT_REQUEST* ptr_clrequest, int is_temp); int create_xdup_tables_mysql(dbi_conn conn); int create_tables_pgsql(dbi_conn conn, struct CLIENT_REQUEST* ptr_clrequest, int is_temp); int create_xdup_tables_pgsql(dbi_conn conn); int create_tables_sqlite(dbi_conn conn, struct CLIENT_REQUEST* ptr_clrequest, int is_temp); int create_xdup_tables_sqlite(dbi_conn conn); int create_tables_sqlite3(dbi_conn conn, struct CLIENT_REQUEST* ptr_clrequest, int is_temp); int create_xdup_tables_sqlite3(dbi_conn conn); int is_user_pgsql(dbi_conn conn, const char* username); int is_group_pgsql(dbi_conn conn, const char* dbname, int is_readonly); int create_temporary_tables(dbi_conn conn, struct CLIENT_REQUEST* ptr_clrequest); const char* my_dbi_driver_regexp(dbi_driver driver, int like); int my_dbi_conn_begin(dbi_conn conn); int my_dbi_conn_rollback(dbi_conn conn); int my_dbi_conn_commit(dbi_conn conn); int my_dbi_conn_lock(dbi_conn conn, int replace_ref); int my_dbi_conn_lock_note(dbi_conn conn); int my_dbi_conn_unlock(dbi_conn conn); const char* my_dbi_conn_get_cap(dbi_conn conn, const char* cap); const char* my_dbi_driver_get_cap(dbi_driver driver, const char* cap); unsigned long long my_dbi_result_get_idval(dbi_result dbires, const char* fieldname); unsigned long long my_dbi_result_get_idval_idx(dbi_result dbires, unsigned int idx); unsigned int my_dbi_result_get_int_idval(dbi_result dbires, const char* fieldname); unsigned int my_dbi_result_get_int_idval_idx(dbi_result dbires, unsigned int idx); int my_dbi_conn_get_versioninfo(dbi_conn conn, struct VERSIONINFO* ptr_ver); int my_dbi_initialize(const char *driverdir, dbi_inst *pInst); void my_dbi_shutdown(dbi_inst Inst); dbi_driver my_dbi_driver_list(dbi_driver Current, dbi_inst Inst); dbi_conn my_dbi_conn_new(const char *name, dbi_inst Inst); int my_dbi_conn_error_flag(dbi_conn Conn); refdb-1.0.2/src/xmlout.h000644 001750 001750 00000002467 12255427653 015756 0ustar00markusmarkus000000 000000 /*++++++++++++++++++++++ xmlout.h: header file for xmlout.c markus@mhoenicka.de 2002-09-05 $Id: xmlout.h,v 1.2 2002/12/13 20:35:38 mhoenicka Exp $ 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, see ++++++++++++++++++++++++*/ int iwrite_elstart(struct CLIENT_REQUEST* ptr_clrequest, const char* elname, Liliform *ptr_first, int nis_emtpy); int iwrite_elend(struct CLIENT_REQUEST* ptr_clrequest, const char* elname); int iwrite_element(struct CLIENT_REQUEST* ptr_clrequest, const char* elname, Liliform *ptr_first, const char *elvalue); int iwrite_pubtype(struct CLIENT_REQUEST* ptr_clrequest, const char* type, unsigned int citstyle_id, dbi_conn conn); int iwrite_months(struct CLIENT_REQUEST* ptr_clrequest, dbi_result dbires); refdb-1.0.2/src/risxhandler.h000644 001750 001750 00000005324 12255427652 016743 0ustar00markusmarkus000000 000000 /*+++++++++++++++++++++++ risxhandler.h header file for risxhandler.c markus@mhoenicka.de 2003-05-13 $Id: risxhandler.h,v 1.10.2.1 2005/08/12 21:10:15 mhoenicka Exp $ 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, see ++++++++++++++++++++++++*/ #include "authorinfo.h" #include "risdata.h" struct addrisx_data { char year[5]; char month[3]; char day[3]; char date_buffer[12]; char otherinfo[256]; char username[16]; /* may be different from current user which is in ptr_clrequest */ struct AUTHOR_INFO* ptr_ainfo; struct RISDATA* ptr_risdata; char first_author[256]; char ck_year[5]; char real_citekey[256]; char type[7]; char* msgpool; const char* drivername; int nmem_error; /* if != 0, out of memory error occurred */ int ndb_error; /* if != 0, database error occurred */ int n_skip; /* if != 0, skip current entry element */ int depth; /* the current depth of the element stack */ int depth_adjust; /* 0 if entry, 1 if ris */ unsigned long long set_count; /* number of entry elements */ unsigned long long added_count; /* number of added entry elements */ unsigned long long skipped_count; /* number of skipped entries */ unsigned long long updated_count; /* number of updated entry elements */ unsigned long long failed_count; /* number of failed entry elements */ int authorpos; int replace_ref; /* if != 0, existing reference is to be replaced */ int create_new; /* if 1, dataset is a new one */ size_t msgpool_len; unsigned long long n_refdb_id; /* database id of dataset */ unsigned long long n_user_id; /* database id of current user */ struct elstack* ptr_first; /* start of the element stack */ struct PERIODICAL_INFO perinfo; /* periodical name synonyms */ struct CLIENT_REQUEST* ptr_clrequest; Lilid* ptr_id_sentinel; /* linked list for added IDs */ dbi_conn conn; dbi_conn conn_refdb; dbi_driver driver; iconv_t conv_descriptor; /* conversion descriptor for iconv */ }; void risx_start_handler(void *ptr_data, const char *el, const char **ptr_attr); void risx_end_handler(void *ptr_data, const char *el); void risx_char_handler(void *ptr_data, const char *string, int len); refdb-1.0.2/src/authorinfo.h000644 001750 001750 00000003551 12255427652 016576 0ustar00markusmarkus000000 000000 /* authorinfo.h header file for authorinfo.c */ /* markus@mhoenicka.de 2003-10-03 */ /* 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ /* authorinfo defines an object to fiddle with the parts of an author name */ #ifndef authorinfo_included #define authorinfo_included 1 /* this structure holds the name components */ struct AUTHOR_INFO { char name[256]; char lastname[256]; char firstname[256]; char middlename[256]; char suffix[256]; char role[64]; }; char* assemble_full_author(struct AUTHOR_INFO* ptr_ainfo, int* ptr_error); struct AUTHOR_INFO* new_authorinfo(void); void reset_authorinfo(struct AUTHOR_INFO* ptr_ainfo); char* set_authorinfo_name(struct AUTHOR_INFO* ptr_ainfo, const char* name); char* set_authorinfo_lastname(struct AUTHOR_INFO* ptr_ainfo, const char* lastname); char* set_authorinfo_firstname(struct AUTHOR_INFO* ptr_ainfo, const char* firstname); char* add_authorinfo_middlename(struct AUTHOR_INFO* ptr_ainfo, const char* middlename); char* set_authorinfo_suffix(struct AUTHOR_INFO* ptr_ainfo, const char* suffix); char* set_authorinfo_role(struct AUTHOR_INFO* ptr_ainfo, const char* role); void free_authorinfo(struct AUTHOR_INFO* ptr_ainfo); #endif /* ifndef authorinfo_included */ refdb-1.0.2/src/risdata.h000644 001750 001750 00000004530 12255427652 016045 0ustar00markusmarkus000000 000000 /* risdata.h header file for risdata.c */ /* markus@mhoenicka.de 2003-10-06 */ /* 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ /* risdata defines an object to collect data for the t_refdb table */ #ifndef risdata_included #define risdata_included 1 /* this structure holds the name components */ struct RISDATA { unsigned long long n_id; int n_pubyear; int n_secyear; char pyother_info[256]; char secother_info[256]; char citekey[256]; char user1[256]; char user2[256]; char user3[256]; char user4[256]; char user5[256]; char typeofwork[256]; char area[256]; char ostype[256]; char degree[256]; char runningtime[256]; char classcodeintl[256]; char classcodeus[256]; char senderemail[256]; char recipientemail[256]; char mediatype[256]; char numvolumes[256]; char edition[256]; char computer[256]; char conferencelocation[256]; char registrynum[256]; char classification[256]; char section[256]; char pamphletnum[256]; char chapternum[256]; char issn[256]; char issue[256]; char publisher[256]; char city[256]; char volume[256]; char endpage[256]; char startpage[256]; char type[256]; char* abstract; char* title_series; char* booktitle; char* title; char* address; }; struct RISDATA* new_risdata(void); void free_risdata(struct RISDATA* ptr_risdata); void reset_risdata(struct RISDATA* ptr_risdata); int set_risdata_field(struct RISDATA* ptr_risdata, const char* fieldname, const char* fieldvalue, dbi_conn conn); int set_risdata_dateinfo(struct RISDATA* ptr_risdata, int date_type, int year, const char* otherinfo, dbi_conn conn); int commit_risdata_fields(struct RISDATA* ptr_risdata, dbi_conn conn, int replace_ref); #endif refdb-1.0.2/src/noteshandler.h000644 001750 001750 00000005135 12255427652 017106 0ustar00markusmarkus000000 000000 /*+++++++++++++++++++++++ noteshandler.h header file for noteshandler.c markus@mhoenicka.de 2003-10-08 $Id: noteshandler.h,v 1.6.2.2 2005/09/21 23:30:31 mhoenicka Exp $ 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, see ++++++++++++++++++++++++*/ struct addnotes_data { char year[5]; char date_buffer[12]; char real_key[256]; char content_type[256]; char content_xmllang[256]; char user[DBUSER_LENGTH]; char* msgpool; char* notepool; const char* drivername; int nmem_error; /* if != 0, out of memory error occurred */ int ndb_error; /* if != 0, database error occurred */ int n_skip; /* if != 0, skip current entry element */ int depth; /* the current depth of the element stack */ int depth_adjust; /* 0 if entry, 1 if ris */ unsigned long long set_count; /* number of entry elements */ unsigned long long added_count; /* number of added entry elements */ unsigned long long skipped_count; /* number of skipped entries */ unsigned long long updated_count; /* number of updated entry elements */ unsigned long long failed_count; /* number of failed entry elements */ int replace_note; /* if != 0, existing note is to be replaced */ int create_new; /* if 1, dataset is a new one */ size_t msgpool_len; size_t notepool_len; unsigned long long n_note_id; /* database id of dataset */ unsigned long long n_user_id; /* database id of current user */ int share; /* if 1, dataset is public; if 0, private */ struct elstack* ptr_first; /* start of the element stack */ struct CLIENT_REQUEST* ptr_clrequest; Lilid* ptr_id_sentinel; /* linked list for added IDs */ dbi_conn conn; dbi_conn conn_refdb; dbi_driver driver; iconv_t conv_descriptor; /* conversion descriptor for iconv */ }; void notes_start_handler(void *ptr_data, const char *el, const char **ptr_attr); void notes_end_handler(void *ptr_data, const char *el); void notes_char_handler(void *ptr_data, const char *string, int len); int insert_link(const char* type, const char* target, dbi_conn conn, unsigned long long n_note_id); refdb-1.0.2/src/writenote.h000644 001750 001750 00000002015 12255427653 016433 0ustar00markusmarkus000000 000000 /* writenote.h: header for writenote.c */ /* markus@mhoenicka.de 2003-10-12 */ /* $Id: writenote.h,v 1.1.2.1 2005/04/15 22:45:11 mhoenicka Exp $ */ /* 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int render_note(struct renderinfo* ptr_rendinfo); int prepare_render_note(struct renderinfo* ptr_rendinfo); int finish_render_note(struct renderinfo* ptr_rendinfo); refdb-1.0.2/src/backendn-scrn.h000644 001750 001750 00000002143 12255427652 017124 0ustar00markusmarkus000000 000000 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ backendn-scrn.h header file for backendn-scrn.c markus@mhoenicka.de 2003-10-15 $Id: backendn-scrn.h,v 1.1.2.1 2005/04/15 22:45:07 mhoenicka Exp $ 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int prepare_render_note_scrn(struct renderinfo* ptr_rendinfo); int finish_render_note_scrn(struct renderinfo* ptr_rendinfo); int render_note_scrn(struct renderinfo* ptr_rendinfo); refdb-1.0.2/src/backendn-notex.h000644 001750 001750 00000002151 12255427652 017313 0ustar00markusmarkus000000 000000 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ backendn-notex.h header file for backendn-notex.c markus@mhoenicka.de 2003-10-15 $Id: backendn-notex.h,v 1.2.2.1 2005/04/15 22:45:07 mhoenicka Exp $ 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int prepare_render_note_xnote(struct renderinfo* ptr_rendinfo); int finish_render_note_xnote(struct renderinfo* ptr_rendinfo); int render_note_xnote(struct renderinfo* ptr_rendinfo); refdb-1.0.2/src/xmlhelper.h000644 001750 001750 00000004561 12255427653 016423 0ustar00markusmarkus000000 000000 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ xmlhelper.h header for xmlhelper.c markus@mhoenicka.de 2003-10-15 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ #define INDENT_MAX 14 /* unit is character for both */ #define INDENT_INC 2 #define STRINGIFY(v) #v struct xmlindent { int indent_current; int maybe_in_leaf; int indent_toodeep; int inline_mode; /* if not 0, no linebreaks and no indentation */ char indent_string[INDENT_MAX+2]; /* +1 for '<', +1 for '\0' */ int (*notbelow)(const char*); /* ptr to fn that tests whether or not to indent */ int (*isentry)(const char*); /* ptr to fn that tests whether this is a main entry */ }; char* print_element_x(const char* elvalue, char** ptr_buffer, size_t* ptr_buflen, const char* elname, const char* attname, const char* attvalue, const char* attname1, const char* attvalue1, struct xmlindent* ptr_indent, const char* namespace); char* print_elstart_x(char** ptr_buffer, size_t* ptr_buflen, const char* elname, const char* attname, const char* attvalue, const char* attname1, const char* attvalue1, const char* attname2, const char* attvalue2, const char* attname3, const char* attvalue3, const char* attname4, const char* attvalue4, int is_empty, struct xmlindent* ptr_indent, const char* namespace); char* print_elend_x(char** ptr_buffer, size_t* ptr_buflen, const char* elname, struct xmlindent* ptr_indent, const char* namespace); char* print_attribute_x(char** ptr_buffer, size_t* ptr_buflen, const char* attname, const char* attvalue); int initialize_xmlindent(struct xmlindent* ptr_xindent, int indent_current, int (*notbelow)(const char*), int (*isentry)(const char*)); int inline_xmlindent(struct xmlindent* ptr_xindent, int n_inline); refdb-1.0.2/src/rtfhelper.h000644 001750 001750 00000004042 12255427653 016410 0ustar00markusmarkus000000 000000 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ rtfhelper.h header file for rtfhelper.c markus@mhoenicka.de 2008-01-27 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ #define CTRLWORDLEN 32 /* the maximum length of a RTF control word, as per the M$ RTF spec */ #define NOPARAM LONG_MAX /* in theory this is the highest allowed value of a numerical parameter of a control word. We'll rely on the fact that this value is orders of magnitude less likely than 0 in order to denote that a control word does not take a parameter (this obviates the need to maintain and check a list of control words that do use a parameter */ char* print_rtf_control_word(const char* ctrlword, char** ptr_buffer, size_t* ptr_buflen, long param, int start_group); char* print_rtf_control_symbol(const char symbol, char** ptr_buffer, size_t* ptr_buflen, int start_group); char* print_rtf_start_group(char** ptr_buffer, size_t* ptr_buflen); char* print_rtf_end_group(char** ptr_buffer, size_t* ptr_buflen); char* print_rtf_header(char** ptr_buffer, size_t* ptr_buflen); char* print_rtf_string(const char* src, char** ptr_buffer, size_t* ptr_buflen); char* rtf_escape_string(const char* src); char* print_rtf_bmstart(const char* label, char** ptr_buffer, size_t* ptr_buflen); char* print_rtf_bmend(const char* label, char** ptr_buffer, size_t* ptr_buflen); refdb-1.0.2/src/backendn-html.h000644 001750 001750 00000002143 12255427652 017123 0ustar00markusmarkus000000 000000 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ backendn-html.h header file for backendn-html.c markus@mhoenicka.de 2003-10-20 $Id: backendn-html.h,v 1.1.2.1 2005/04/15 22:45:07 mhoenicka Exp $ 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int prepare_render_note_html(struct renderinfo* ptr_rendinfo); int finish_render_note_html(struct renderinfo* ptr_rendinfo); int render_note_html(struct renderinfo* ptr_rendinfo); refdb-1.0.2/src/mset.h000644 001750 001750 00000002652 12255427652 015371 0ustar00markusmarkus000000 000000 /*+++++++++++++++++ mset.h - header file for mset.c markus@mhoenicka.de 2005-12-15 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ #ifndef MSET_H_INCLUDED #define MSET_H_INCLUDED 1 #define MSET_RELATION_LEN 16 typedef struct mset { char relation[MSET_RELATION_LEN]; /* relation attribute value of bibliomset */ int stacksize; struct mset *ptr_next; /* pointer to next element in the list */ } MSET; char* push_mset(struct mset* ptr_first, char* new_mset); char* pop_mset(struct mset* ptr_first, char* prev_mset); char* set_mset(struct mset* ptr_first, char* new_mset, char** ref, size_t* ptr_ref_len, const char* ns, struct xmlindent* ptr_indent, int n_ref_format); struct mset* new_mset_stack(void); void clear_mset_stack(struct mset* ptr_first); #endif refdb-1.0.2/src/refdbdgetref.h000644 001750 001750 00000002420 12255427652 017035 0ustar00markusmarkus000000 000000 /*++++++++++++++++++++ refdbdgetref.h: headers for refdb getref-related functions markus@mhoenicka.de 2006-08-22 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, see +++++++++++++++++++++++++*/ char* assemble_author_subselect(char* author_string, const char* operator, int author_type, dbi_conn conn, dbi_driver driver); char* assemble_keyword_subselect(char* keyword_string, const char* operator, dbi_conn conn); char* assemble_link_subselect(char* link_string, const char* operator, const char* link_type, dbi_conn conn); int getref(struct CLIENT_REQUEST* ptr_clrequest, struct bibinfo* ptr_biblio_info, int ref_format, int n_privatelist, struct ADDRESULT* ptr_addresult, int send_data, int freqency); refdb-1.0.2/src/refdbdgetrefx.h000644 001750 001750 00000001654 12255427652 017235 0ustar00markusmarkus000000 000000 /*++++++++++++++++++++ refdbdgetrefx.h: headers for refdb getrefx-related functions markus@mhoenicka.de 2007-09-08 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, see +++++++++++++++++++++++++*/ int getrefx(struct CLIENT_REQUEST* ptr_clrequest, struct bibinfo* ptr_biblio_info, int ref_format, int n_privatelist, struct ADDRESULT* ptr_addresult); refdb-1.0.2/src/refdbdupdb.h000644 001750 001750 00000001533 12255427652 016517 0ustar00markusmarkus000000 000000 /*++++++++++++++++++++ refdbdupdb.h: header file for refdbdupdb.c markus@mhoenicka.de 2006-09-06 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, see +++++++++++++++++++++++++*/ int update_main_db(struct CLIENT_REQUEST* ptr_clrequest, int n_updatedb); refdb-1.0.2/src/refdbdcheckref.h000644 001750 001750 00000001620 12255427652 017334 0ustar00markusmarkus000000 000000 /*++++++++++++++++++++ refdbdcheckref.h: header file for refdbdcheckref.c markus@mhoenicka.de 2006-09-29 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, see +++++++++++++++++++++++++*/ int check_references(struct CLIENT_REQUEST* ptr_clrequest, struct renderinfo* ptr_rendinfo, dbi_conn conn, int outformat); refdb-1.0.2/src/outformats.h000644 001750 001750 00000003104 12255427652 016615 0ustar00markusmarkus000000 000000 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ outformats.h - defines the output types supported by RefDB markus@mhoenicka.de 2007-09-08 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, see ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ #ifndef outformats_included #define outformats_included 1 /* output formats for getref/getnote */ #define REFSCREEN 0 #define REFRIS 1 #define REFDOCBK 2 #define REFBIBTEX 3 #define REFHTML 4 #define REFCGIHTML 6 #define REFCGIRIS 7 #define REFDOCBKX 8 #define REFTEIX 9 #define RISX 10 #define REFXHTML 11 #define XNOTE 12 #define REFCITATIONLISTX 13 #define REFMODS 14 #define REFDOCBKX5 15 #define REFTEIX5 16 #define REFRTF 17 /* note types */ #define REFERENCE 1 #define KEYWORD 2 #define AUTHOR 4 #define PERIODICAL 8 #endif /* ifndef outformats_included */ refdb-1.0.2/src/refdbib.c000755 001750 001750 00000126522 12255427652 016017 0ustar00markusmarkus000000 000000 /*+++++++++++++++++ refdbib - the refdb bibliography client console application markus@mhoenicka.de 9-25-00 $Id: refdbib.c,v 1.41.2.11 2006/02/13 21:33:54 mhoenicka Exp $ 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, see +++++++++++++++++*/ /* general includes */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "getopt.h" /* our own stuff */ #include "refdb.h" /* common stuff for all refdb applications*/ #include "connect.h" #include "linklist.h" /* for linked lists */ #include "pref.h" /* for init file, depends on linklist.h */ #include "strfncs.h" /* for is functions, LOG_PRINT definition */ #include "readln.h" /* readline-related stuff, need only for command dummy */ #include "page.h" /* pager functions */ #include "refdb-client.h" /* stuff common to all clients */ #include "refdbib.h" /* stuff specific to this client */ #include "readris.h" /* fncs to access RIS files */ #include "tokenize.h" /* cuts command line into tokens */ #include "passwd.h" /* securely obtain passwords */ #include "outformats.h" /* definitions of output formats */ /* Globals */ char current_db[PREFS_BUF_LEN] = ""; /*+ this array will hold the user preferences +*/ Prefs prefs[22] = { {"serverip", ""}, {"port", ""}, {"verbose", ""}, {"pager", ""}, {"username", ""}, {"passwd", ""}, {"defaultdb", ""}, {"timeout", ""}, {"outtype", ""}, {"outformat", ""}, {"logfile", ""}, {"logdest", ""}, {"loglevel", ""}, {"stylespecdir", ""}, {"refdblib", ""}, {"startnumber", ""}, {"toencoding", ""}, {"ignore_missing", ""}, {"raw", ""}, {"pdfroot", ""}, {"no_encrypt", ""}, {"", ""} }; /* these are the configurable variables with the compile-time defaults */ char server_ip[PREFS_BUF_LEN] = "127.0.0.1"; /*+ default IP address of refdbd +*/ char port_address[PREFS_BUF_LEN] = "9734"; /*+ default port address of refdbd +*/ char the_pager[PREFS_BUF_LEN] = "stdout"; /*+ default pager +*/ char username[PREFS_BUF_LEN] = ""; /*+ default username (emtpy) +*/ char passwd[PREFS_BUF_LEN] = "*"; /*+ default password (ask user) +*/ char refdb_timeout[PREFS_BUF_LEN] = "180"; /* 180 seconds default timeout */ char output_type[PREFS_BUF_LEN] = "db31"; /* docbook is default output fmt */ char output_format[PREFS_BUF_LEN] = ""; /* format specification */ char log_file[PREFS_BUF_LEN] = "/var/log/refdbib.log"; /*+ default log file +*/ char log_dest[PREFS_BUF_LEN] = "1"; /*+ default log destination (0 = stderr, 1 = syslog, 2 = log_file +*/ char log_level[PREFS_BUF_LEN] = "6"; /*+ default level up to which messages are logged (0 through 7). -1 means no logging +*/ char stylespec_dir[PREFS_BUF_LEN] = "."; /* use PWD for stylespec files */ char refdblib[PREFS_BUF_LEN] = ""; /* path to shareable files */ char verbose[PREFS_BUF_LEN] = ""; /* verbose output? */ char startnumber[PREFS_BUF_LEN] = ""; /* first number of reference */ char encoding[PREFS_BUF_LEN] = ""; /* output encoding */ char ignore_missing[PREFS_BUF_LEN] = "f"; /* ignore missing refs */ char confdir[_POSIX_PATH_MAX+1] = ""; /* path to the config files */ char namespace[PREFS_BUF_LEN] = ""; /* namespace for XML output */ char raw[PREFS_BUF_LEN] = ""; /* if t, retrieve raw instead of cooked bibliography */ char pdfroot[PREFS_BUF_LEN] = ""; /* root of path to offprints */ char no_encrypt[PREFS_BUF_LEN] = ""; /* do not encrypt passwords if 't' */ int n_refdb_timeout; int n_broken_pipe; /*+ 1 indicates that we attempted to write to a broken pipe +*/ int n_abort_connect; /*+ 1 indicates that we want to abort a connection +*/ int n_log_dest = 1; /* destination of log output */ int n_log_level = 0; /* level of log information that will be printed */ int n_read_stdin = 0; /* if 1, data try to squeeze in at stdin */ int n_exit_code = 0; /* any other value than 0 indicates an error */ int n_cgi = 0; /* if 1, we run as a cgi app */ int n_verbose = 0; /* verbose output if 1 */ FILE* fp_log_file = NULL; /* ptr to logfile structure */ extern const char cs_term[]; /* declaration of the svn version function */ const char* svn_version(void); /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ The one and only main function int main returns 0 if successful, 1 if error int argc number of arguments char** argv ptr to array of strings with the command line arguments ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int main (int argc, char** argv) { char *processed_infile; char msgbuf[512]; /* buffer to assemble error messages */ char infile[_POSIX_PATH_MAX]; int n_opt, i; int j = 0; int n_readinit = 1; /* if 1, read config file. If 0, skip config file */ int n_type = 0; /* output type, numerical version 0 = db31 1 = db31x 2 = teix 3 = bibtex */ FILE* fp_infile = NULL; struct sigaction act, oldact, intact, oldintact; /* initialize signal handler */ n_broken_pipe = 0; n_abort_connect = 0; act.sa_handler = pipehandler; sigemptyset(&act.sa_mask); act.sa_flags = 0; intact.sa_handler = inthandler; sigemptyset(&intact.sa_mask); intact.sa_flags = 0; if (sigaction(SIGPIPE, &act, &oldact) != 0 || sigaction(SIGINT, &intact, &oldintact) != 0) { fprintf(stderr, "initializing signal handlers failed\n"); exit(1); } /* initialize the array of preference values */ prefs[0].varvalue = server_ip; prefs[1].varvalue = port_address; prefs[2].varvalue = verbose; prefs[3].varvalue = the_pager; prefs[4].varvalue = username; prefs[5].varvalue = passwd; prefs[6].varvalue = current_db; prefs[7].varvalue = refdb_timeout; prefs[8].varvalue = output_type; prefs[9].varvalue = output_format; prefs[10].varvalue = log_file; prefs[11].varvalue = log_dest; prefs[12].varvalue = log_level; prefs[13].varvalue = stylespec_dir; prefs[14].varvalue = refdblib; prefs[15].varvalue = startnumber; prefs[16].varvalue = encoding; prefs[17].varvalue = ignore_missing; prefs[18].varvalue = raw; prefs[19].varvalue = pdfroot; prefs[20].varvalue = no_encrypt; /* a slimy hack to detect options before getopt runs */ for (i = 0; i < argc; i++) { if (argv[i][0] == '-' && argv[i][1] == 'q') { n_readinit = 0; j--; if (!j) { break; } } if (argv[i][0] == '-' && argv[i][1] == 'y') { strncpy(confdir, argv[i+1], _POSIX_PATH_MAX); confdir[_POSIX_PATH_MAX] = '\0'; j--; if (!j) { break; } } } if (n_readinit) { /* read config file settings */ read_prefs(prefs, "refdbibrc", 0); } /* read command line settings. These may override the config file settings */ while ((n_opt = getopt(argc, argv, "c:d:D:e:E:f:hi:l:L:mn:N:p:qrS:t:T:u:vVw:xy:")) != -1) { switch (n_opt) { case 'c': strncpy(the_pager, optarg, PREFS_BUF_LEN); the_pager[PREFS_BUF_LEN-1] = '\0'; break; case 'd': strncpy(current_db, optarg, PREFS_BUF_LEN); current_db[PREFS_BUF_LEN-1] = '\0'; break; case 'D': strncpy(stylespec_dir, optarg, PREFS_BUF_LEN); stylespec_dir[PREFS_BUF_LEN-1] = '\0'; break; case 'e': strncpy(log_dest, optarg, PREFS_BUF_LEN); log_dest[PREFS_BUF_LEN-1] = '\0'; break; case 'E': strncpy(encoding, optarg, PREFS_BUF_LEN); encoding[PREFS_BUF_LEN-1] = '\0'; break; case 'f': if (!strcmp(optarg, "stdin")) { n_read_stdin = 1; } break; case 'h': fprintf(stderr, "Create a bibliography file based on an ID or citation key list\nThe list must be provided as an XML document using the citationlistx DTD either on stdin or by passing the file\'s path as an argument\nUsage: refdbib [-c pager ] [-d db] [-D dir] [-e logdest] [-E encoding] [-f stdin] [-h] [-i address] [-l log-level] [-L logfile] [-m] [-n namespace-prefix] [-N number] [-p port] [-q] [-r][-S style] [-t type] [-T time] [-u name] [-v] [-V] [-w password] [-x] [-y confdir] file\nOptions: -c pager command\n -d use database db\n -D save driver files in dir\n -e log destination (0=stderr, 1=syslog, 2=custom file)\n -E encoding set the output character encoding\n -f stdin read data from stdin (kludge only required for Cygwin)\n -h prints this help\n -i set server IP address\n -l set the log level\n -L set the log file\n -m ignore missing references\n -n set optional namespace prefix for XML output\n -N start numbering bibliography entries with number\n -p set server port\n -q ignore init-file\n -r retrieve raw rather than cooked bibliography\n -S use bibliography style\n -t output type (db31|db31x|db50x|teix|tei5x|bibtex|rtf)\n -T set timeout in seconds\n -u set username\n -v show version information\n -V switch to verbose mode\n -w set password\n -x do not encrypt passwords\n -y look for configuration files in confdir\n"); exit (0); break; case 'i': strncpy(server_ip, optarg, PREFS_BUF_LEN); server_ip[PREFS_BUF_LEN-1] = '\0'; break; case 'l': strncpy(log_level, optarg, PREFS_BUF_LEN); log_level[PREFS_BUF_LEN-1] = '\0'; break; case 'L': strncpy(log_file, optarg, PREFS_BUF_LEN); log_file[PREFS_BUF_LEN-1] = '\0'; break; case 'm': *ignore_missing = 't'; break; case 'n': strncpy(namespace, optarg, PREFS_BUF_LEN); namespace[PREFS_BUF_LEN-1] = '\0'; break; case 'N': strncpy(startnumber, optarg, PREFS_BUF_LEN); break; case 'p': strncpy(port_address, optarg, PREFS_BUF_LEN); port_address[PREFS_BUF_LEN-1] = '\0'; break; case 'q': n_readinit = 0; break; case 'r': strcpy(raw, "t"); break; case 'S': strncpy(output_format, optarg, PREFS_BUF_LEN); output_format[PREFS_BUF_LEN-1] = '\0'; break; case 't': strncpy(output_type, optarg, PREFS_BUF_LEN); output_type[PREFS_BUF_LEN-1] = '\0'; break; case 'T': strncpy(refdb_timeout, optarg, PREFS_BUF_LEN); refdb_timeout[PREFS_BUF_LEN-1] = '\0'; break; case 'u': strncpy(username, optarg, PREFS_BUF_LEN); username[PREFS_BUF_LEN-1] = '\0'; break; case 'v': printf("refdbib %s built from svn revision %s markus@mhoenicka.de\nYou may redistribute and modify this software under the terms of the GNU General Public License.\n", VERSION, svn_version()); exit (0); break; case 'V': strcpy(verbose, "t"); break; case 'w': strncpy(passwd, optarg, PREFS_BUF_LEN); passwd[PREFS_BUF_LEN-1] = '\0'; break; case 'x': strcpy(no_encrypt, "t"); break; case 'y': /* do nothing, this option is used before getopt runs */ break; case ':': fprintf(stderr, "Usage: refdbib [-c pager ] [-d db] [-D dir] [-e logdest] [-E encoding] [-f stdin] [-h] [-i address] [-l log-level] [-L logfile] [-m] [-n namespace-prefix] [-N number] [-p port] [-q] [-r] [-S style] [-t type] [-T time] [-u name] [-v] [-V] [-w password] [-x] [-y confdir] file\nOptions: -c pager command\n -d use database db\n -D save driver files in dir\n -e log destination (0=stderr, 1=syslog, 2=custom file)\n -E encoding set the output character encoding\n -f stdin read data from stdin (kludge only required for Cygwin)\n -h prints this help\n -i set server IP address\n -l set the log level\n -L set the log file\n -m ignore missing references\n -n set optional namespace prefix for XML output\n -N start numbering bibliography entries with number\n -p set server port\n -q ignore init-file\n -r retrieve raw rather than cooked bibliography\n -S use bibliography style\n -t output type (db31|db31x|db50x|teix|tei5x|bibtex|rtf)\n -T set timeout in seconds\n -u set username\n -v show version information\n -V switch to verbose mode\n -w set password\n -x do not encrypt passwords\n -y look for configuration files in confdir\n"); exit (1); break; case '?': fprintf(stderr, "unknown option %c: use refdbib -h to display usage\n", optopt); break; } } /* a smart but simple hack to hide the password in the ps ax output */ for (i = 0; i < argc; i++) { if (argv[i][0] == '-' && argv[i][1] == 'w') { j = 0; while (argv[i+1][j]) { argv[i+1][j] = 'x'; j++; } break; } } /* post-process configuration variables */ if (*verbose == 't') { n_verbose = 1; } i = check_ip(server_ip); /* reuse i */ if (i>0) { if (i==1) { fprintf(stderr, "\'%s\' cannot be resolved as a hostname\n", server_ip); } else if (i==2) { fprintf(stderr, "\'%s\' does not appear to be an IP host\n", server_ip); } else if (i==3) { fprintf(stderr, "\'%s\' does not appear to have a valid IP address\n", server_ip); } else if (i==4) { fprintf(stderr, "\'%s\' has more than one network interface. Please specify one IP address\n", server_ip); } exit (1); } else if (i==-1) { /* silently change 'localhost' to '127.0.0.1' */ strcpy(server_ip, "127.0.0.1"); } if (!is_port(port_address)) { fprintf(stderr, "option -p needs a value: %s is no valid port\n", optarg); if (*verbose == 't') { fprintf(stderr, "Port addresses below 1024 are reserved for system use. refdb should use a port higher than 1024. The server and all clients must use the same port.\n"); } exit (1); } /* see whether we have a username */ if (!username[0] && getlogin()) { strcpy(username, getlogin()); /* although not recommended, the login name is a good guess */ } else if (!username[0]) { fprintf(stderr, "missing username\n"); exit (1); } /* see whether we need to ask for a password */ if (strcmp(passwd, "*") == 0) { ask_for_passwd(passwd); } /* make some conversions */ n_log_level = num_loglevel(log_level); n_log_dest = num_logdest(log_dest); n_refdb_timeout = atoi(refdb_timeout); /* fill in stylespec_dir if not explicitly set */ if (!strcmp(stylespec_dir, ".") || !*stylespec_dir) { /* use PWD if the path is a single dot or if nothing else helps */ stylespec_dir[0] = '\0'; } else if (!strcmp(stylespec_dir, ".")) { stylespec_dir[0] = '\0'; /* use PWD if the path is a single dot */ } if (!strcmp(output_type, "db31")) { n_type = REFDOCBK; } else if (!strcmp(output_type, "db31x")) { n_type = REFDOCBKX; } else if (!strcmp(output_type, "teix")) { n_type = REFTEIX; } else if (!strcmp(output_type, "bibtex")) { n_type = REFBIBTEX; } else if (!strcmp(output_type, "db50x")) { n_type = REFDOCBKX5; } else if (!strcmp(output_type, "tei5x")) { n_type = REFTEIX5; } else if (!strcmp(output_type, "rtf")) { n_type = REFRTF; *raw = 'f'; /* force cooked bib */ } else { n_type = REFDOCBK; /* temporary default, may change or be removed */ } /* fprintf(stderr, "username: %s; password: %s\n", username, passwd); */ /* set up logging */ if (n_log_dest == 2) { /* use custom log file */ if ((fp_log_file = fopen(log_file, "ab")) == NULL) { n_log_dest = 1; /* fall back to syslog */ openlog("refdbib", LOG_PID|LOG_ODELAY, LOG_USER); LOG_PRINT(LOG_WARNING, "could not open custom log file"); } } else if (n_log_dest == 1) { /* use syslog */ openlog("refdbib", LOG_PID|LOG_ODELAY, LOG_USER); } LOG_PRINT(LOG_INFO, "refdbib started"); /* some checks */ if (*current_db == '\0') { LOG_PRINT(LOG_CRIT, "no database specified"); n_exit_code = 127; } else { if (n_read_stdin || optind == argc) { n_read_stdin = 1; /* not set if optind == inargc */ if (n_type == REFBIBTEX) { n_exit_code = make_texbib(stdin); } else { /* 0 is default */ if (*raw != 't') { n_exit_code = make_cookedbib(stdin, n_type); } else { n_exit_code = make_rawbib(stdin, n_type); } } } else if (argv[optind] && *(argv[optind])) { /* read from file */ strncpy(infile, argv[optind], (size_t)_POSIX_PATH_MAX-1); infile[_POSIX_PATH_MAX-1] = '\0'; /* terminate just in case */ processed_infile = canonicalize_path(infile); if (processed_infile == NULL) { if (n_type == REFBIBTEX) { strcat(infile, ".aux"); processed_infile = canonicalize_path(infile); if (processed_infile == NULL) { sprintf(msgbuf, "could not access input file %s", argv[optind]); LOG_PRINT(LOG_WARNING, msgbuf); n_exit_code = 1; goto the_end; } } else { sprintf(msgbuf, "could not access input file %s", argv[optind]); LOG_PRINT(LOG_WARNING, msgbuf); n_exit_code = 1; goto the_end; } } strcpy(infile, processed_infile); free(processed_infile); if ((fp_infile = fopen(infile, "rb")) == NULL) { sprintf(msgbuf, "could not open input file %s", argv[optind]); LOG_PRINT(LOG_WARNING, msgbuf); n_exit_code = 1; } else { if (n_type == REFBIBTEX) { n_exit_code = make_texbib(fp_infile); } else { /* 0 is default */ if (*raw != 't') { n_exit_code = make_cookedbib(fp_infile, n_type); } else { n_exit_code = make_rawbib(fp_infile, n_type); } } fclose(fp_infile); } } /* else: no file specified, do nothing */ } the_end: if (n_exit_code) { LOG_PRINT(LOG_INFO, "refdbib finished with errors"); } else { LOG_PRINT(LOG_INFO, "refdbib finished"); } if (fp_log_file) { fclose(fp_log_file); /* not strictly necessary, but more polite */ } exit (n_exit_code); } /* **************************************************************** */ /* */ /* refdbib functions */ /* */ /* **************************************************************** */ /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ make_cookedbib() requests a cooked bibliography int make_cookedbib returns 0 if ok, 1 if error FILE *fp_infile pointer to a stream to read the id data from int n_type type of requested output, see REFXX definitions ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int make_cookedbib(FILE* fp_infile, int n_type) { char inbuffer[COMMAND_INBUF_LEN]; char srv_inbuffer[COMMAND_INBUF_LEN] = ""; char specfile[_POSIX_PATH_MAX]; char scrambled_passwd[PASSWD_LENGTH*3+1]; size_t outbuf_len = COMMAND_INBUF_LEN; int numbyte; int n_read_done = 0; int n_result; int n_error; int n_retval = 0; int n_curr_trailing_z = 0; int n_last_trailing_z = 0; int n_done_refs; int cs_status; size_t byte_written = 0; FILE *pagerfp; FILE *specfilefp; struct linger mylinger; struct simplelistvals slvals; slvals.n_file_open = 0; slvals.n_file_append = 0; slvals.n_pipe = 0; slvals.outfile = NULL; slvals.outpipe = NULL; slvals.outbuffer = malloc(outbuf_len); if (slvals.outbuffer == NULL) { return 1; } strcpy(slvals.outbuffer, "getbib "); if (connect_to_server(&slvals.n_sockfd, server_ip, port_address) != 0) { LOG_PRINT(LOG_ERR, "could not connect to server"); free(slvals.outbuffer); return 1; } strcpy(scrambled_passwd, passwd); if (init_dialog(slvals.n_sockfd, scrambled_passwd, srv_inbuffer)) { LOG_PRINT(LOG_ERR, "server authentication failed"); free(slvals.outbuffer); close(slvals.n_sockfd); return 1; } /* assemble command */ switch (n_type) { case REFTEIX: strcat(slvals.outbuffer, " -t teix -u "); break; case REFDOCBKX: strcat(slvals.outbuffer, " -t db31x -u "); break; case REFDOCBKX5: strcat(slvals.outbuffer, " -t db50x -u "); break; case REFTEIX5: strcat(slvals.outbuffer, " -t tei5x -u "); break; case REFRTF: strcat(slvals.outbuffer, " -t rtf -u "); break; case REFDOCBK: /* fall through */ default: strcat(slvals.outbuffer, " -t db31 -u "); break; } strcat(slvals.outbuffer, username); if (*passwd) { strcat(slvals.outbuffer, " -w "); strcat(slvals.outbuffer, scrambled_passwd); } strcat(slvals.outbuffer, " -d "); strcat(slvals.outbuffer, current_db); if (*output_format) { strcat(slvals.outbuffer, " -s "); strcat(slvals.outbuffer, output_format); } if (*startnumber) { strcat(slvals.outbuffer, " -o "); strcat(slvals.outbuffer, startnumber); } if (*encoding) { strcat(slvals.outbuffer, " -E "); strcat(slvals.outbuffer, encoding); } if (*namespace) { strcat(slvals.outbuffer, " -n \""); strcat(slvals.outbuffer, namespace); strcat(slvals.outbuffer, "\""); } /* now send the command to the application server */ /* printf("%s\n", slvals.outbuffer); */ /* free(slvals.outbuffer); */ /* return 0; */ LOG_PRINT(LOG_DEBUG, slvals.outbuffer); send_status(slvals.n_sockfd, 0, TERM_NO); numbyte = tiwrite(slvals.n_sockfd, slvals.outbuffer, TERM_YES); if (numbyte == -1) { free(slvals.outbuffer); fprintf(stderr, "%s\n", get_status_msg(110)); LOG_PRINT(LOG_WARNING, get_status_msg(110)); close(slvals.n_sockfd); return 1; } cs_status = read_status(slvals.n_sockfd); if (cs_status && cs_status != 402) { free(slvals.outbuffer); fprintf(stderr, "%s\n", get_status_msg(cs_status)); LOG_PRINT(LOG_WARNING, get_status_msg(cs_status)); close(slvals.n_sockfd); return 1; } if (cs_status == 402) { if (stylespec_dir && *stylespec_dir) { strcpy(specfile, stylespec_dir); if (specfile[0] && specfile[strlen(specfile)-1] != '/') { strcat(specfile, "/"); } } else { specfile[0] = '\0'; } strcat(specfile, output_format); if (specfile[strlen(specfile)-1] != '.') { strcat(specfile, "."); } if (n_type == REFDOCBK) { strcat(specfile, "dsl"); } else { strcat(specfile, "xsl"); } /* this is guaranteed to return a file ptr. This may be stdout if nothing else helps */ specfilefp = open_outfile(specfile, 0); /* printf("specfile: %s<<\n", specfile); */ byte_written += read_terminated_string(&slvals, specfilefp, &n_error); if (n_error) { free(slvals.outbuffer); close_outfile(specfilefp); close(slvals.n_sockfd); n_broken_pipe = 0; return 1; } close_outfile(specfilefp); cs_status = read_status(slvals.n_sockfd); if (cs_status) { fprintf(stderr, "%s\n", get_status_msg(cs_status)); LOG_PRINT(LOG_WARNING, get_status_msg(cs_status)); free(slvals.outbuffer); close(slvals.n_sockfd); return 1; } } /* end if (n_send_stylespec) */ byte_written = 0; /* run phases 1 through 4 of client/server protocol */ n_result = send_xml_data(fp_infile, /*pagerfp*/stderr, stderr, slvals.n_sockfd, &byte_written); if (n_result) { free(slvals.outbuffer); close(slvals.n_sockfd); return 1; } /* ------------------------------------------------------------ */ /* PHASE 5 */ /* signal server that we're done */ send_status(slvals.n_sockfd, 402, TERM_NO); /* check server status, should be "chunk added successfully" */ if ((cs_status = read_status(slvals.n_sockfd)) != 403) { if (cs_status == 400) { size_t byte_written_to_inbuffer; int num_trailz; int n_read_done = 0; /* retrieve server-generated error message */ do { numbyte = tread(slvals.n_sockfd, inbuffer, OUTBUF_LEN); /* printf("phase4 server reply:%s<<\n", inbuffer); */ if (numbyte == -1) { /* timeout while reading */ fprintf(stderr, "%s\n", get_status_msg(109)); return 1; } /* we rely on the fact that the server reply is no more than OUTBUF_LEN in length */ if ((num_trailz = get_trailz(inbuffer, numbyte)) >= TERM_LEN) { /* if transmission ends */ n_read_done++; } /* write numbyte chars to output, unless this is the last chunk: we do not want to write the terminating \0 */ if (!n_broken_pipe) { byte_written_to_inbuffer = fwrite(inbuffer, sizeof(char), numbyte-num_trailz, /*pagerfp*/stderr); } /* printf("%s", inbuffer); */ } while (!n_read_done); } else { fprintf(stderr, "%s\n", get_status_msg(cs_status)); return 1; } } /* end if cs_status */ /* request data */ send_status(slvals.n_sockfd, 0, TERM_NO); /* openpager and open_outfile are guaranteed to return a valid file/pipe - and be it stdout */ pagerfp = openpager(the_pager); n_read_done = 0; n_last_trailing_z = 0; n_curr_trailing_z = 0; n_done_refs = 0; do { /* read in loop over all chunks of data the server is going to send */ if ((cs_status = read_status(slvals.n_sockfd)) == 402) { n_done_refs++; } else if (cs_status != 404) { fprintf(stderr, "%s\n", get_status_msg(cs_status)); LOG_PRINT(LOG_WARNING, get_status_msg(cs_status)); free(slvals.outbuffer); close(slvals.n_sockfd); closepager(pagerfp); n_broken_pipe = 0; return 1; } byte_written += read_terminated_string(&slvals, pagerfp, &n_error); if (n_error) { closepager(pagerfp); n_broken_pipe = 0; return 1; } } while (!n_done_refs); /* request summary */ send_status(slvals.n_sockfd, 0, TERM_NO); /* printf("byte written:%d\n", byte_written); */ /* fflush(stdout); */ if ((cs_status = read_status(slvals.n_sockfd)) != 0) { fprintf(stderr, "%s\n", get_status_msg(109)); LOG_PRINT(LOG_WARNING, get_status_msg(109)); free(slvals.outbuffer); close(slvals.n_sockfd); closepager(pagerfp); n_broken_pipe = 0; return 1; } byte_written += read_terminated_string(&slvals, stderr, &n_error); if (n_error) { free(slvals.outbuffer); close(slvals.n_sockfd); closepager(pagerfp); n_broken_pipe = 0; return 1; } /* send back confirmation to the server */ send_status(slvals.n_sockfd, 0, TERM_NO); closepager(pagerfp); /* closing the socket in the background apparently does not work if the whole app exits. So we force the close() call to wait until the data are read by the server */ mylinger.l_onoff = 1; /* let close wait */ mylinger.l_linger = 5; /* 5 seconds timeout */ setsockopt(slvals.n_sockfd, SOL_SOCKET, SO_LINGER, (const void*)&mylinger, sizeof(mylinger)); n_broken_pipe = 0; free(slvals.outbuffer); close(slvals.n_sockfd); return n_retval; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ make_rawbib() requests a raw bibliography int make_rawbib returns 0 if ok, 1 if error FILE *fp_infile pointer to a stream to read the id data from int n_type type of requested output, see REFXX definitions ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int make_rawbib(FILE* fp_infile, int n_type) { char inbuffer[COMMAND_INBUF_LEN] = ""; char format_string[MAX_FMT_LEN] = ""; char db[_POSIX_PATH_MAX] = ""; char pdf_root[_POSIX_PATH_MAX] = ""; char scrambled_passwd[PASSWD_LENGTH*3+1] = ""; int n_result; int n_done; int n_cmdlinerror = 0; int numbyte; int cs_status; size_t byte_written = 0; size_t outbuf_len; FILE* pagerfp; /* ptr to file */ struct linger mylinger; struct simplelistvals slvals; /* get us some buffer for output */ outbuf_len = 256; /* something to start with */ slvals.outbuffer = malloc(outbuf_len); if (slvals.outbuffer == NULL) { free(slvals.outbuffer); return 1; } strcpy(slvals.outbuffer, "getrefx "); slvals.n_file_open = 0; slvals.n_file_append = 0; slvals.n_pipe = 0; slvals.outfile = NULL; slvals.outpipe = NULL; if (*pdfroot) { strcpy(pdf_root, pdfroot); } strcpy(db, current_db); /* use default db if set */ if (!*db) { fprintf(stderr, "Don't know which database to use. Select one with selectdb or use the -d switch with getref.Stop.\n"); free(slvals.outbuffer); return 1; } if (n_cmdlinerror) { free(slvals.outbuffer); return 1; } if (connect_to_server(&slvals.n_sockfd, server_ip, port_address) != 0) { free(slvals.outbuffer); return 1; } strcpy(scrambled_passwd, passwd); if (init_dialog(slvals.n_sockfd, scrambled_passwd, inbuffer)) { free(slvals.outbuffer); close(slvals.n_sockfd); return 1; } /* assemble command string for refdbd */ switch (n_type) { case REFTEIX: strcat(slvals.outbuffer, " -t teix -u "); break; case REFDOCBKX: strcat(slvals.outbuffer, " -t db31x -u "); break; case REFDOCBKX5: strcat(slvals.outbuffer, " -t db50x -u "); break; case REFTEIX5: strcat(slvals.outbuffer, " -t tei5x -u "); break; case REFDOCBK: /* fall through */ default: strcat(slvals.outbuffer, " -t db31 -u "); break; } strcat(slvals.outbuffer, username); if (*passwd) { strcat(slvals.outbuffer, " -w "); strcat(slvals.outbuffer, scrambled_passwd); } strcat(slvals.outbuffer, " -d "); strcat(slvals.outbuffer, db); if (*format_string) { strcat(slvals.outbuffer, " -s \""); strcat(slvals.outbuffer, format_string); strcat(slvals.outbuffer, "\""); } if (*namespace) { strcat(slvals.outbuffer, " -n \""); strcat(slvals.outbuffer, namespace); strcat(slvals.outbuffer, "\""); } if (*pdf_root) { strcat(slvals.outbuffer, " -R "); strcat(slvals.outbuffer, pdf_root); } if (*encoding) { strcat(slvals.outbuffer, " -E "); strcat(slvals.outbuffer, encoding); } LOG_PRINT(LOG_DEBUG, slvals.outbuffer); send_status(slvals.n_sockfd, 0, TERM_NO); /* send step 1 */ numbyte = tiwrite(slvals.n_sockfd, slvals.outbuffer, TERM_YES); if (numbyte == -1) { fprintf(stderr, "could not write to refdbd. Stop\n"); free(slvals.outbuffer); return 1; } numbyte = 0; if ((cs_status = read_status(slvals.n_sockfd)) != 0) { /* read step 2 */ fprintf(stderr, "%s\n", get_status_msg(cs_status)); close(slvals.n_sockfd); free(slvals.outbuffer); return 1; } /* run phases 1 through 4 of client/server protocol */ /* corresponds to steps 3 to 6 of the getrefx protocol */ n_result = send_xml_data(fp_infile, /*pagerfp*/stderr, stderr, slvals.n_sockfd, &byte_written); if (n_result) { free(slvals.outbuffer); close(slvals.n_sockfd); return 1; } /* ------------------------------------------------------------ */ /* PHASE 5 */ /* signal server that we're done */ send_status(slvals.n_sockfd, 402, TERM_NO); /* check server status, should be "chunk added successfully" */ if ((cs_status = read_status(slvals.n_sockfd)) != 403) { if (cs_status == 400) { size_t byte_written_to_inbuffer; int num_trailz; int n_read_done = 0; /* retrieve server-generated error message */ do { numbyte = tread(slvals.n_sockfd, inbuffer, OUTBUF_LEN); /* printf("phase4 server reply:%s<<\n", inbuffer); */ if (numbyte == -1) { /* timeout while reading */ fprintf(stderr, "%s", get_status_msg(109)); free(slvals.outbuffer); return 1; } /* we rely on the fact that the server reply is no more than OUTBUF_LEN in length */ if ((num_trailz = get_trailz(inbuffer, numbyte)) >= TERM_LEN) { /* if transmission ends */ n_read_done++; } /* write numbyte chars to output, unless this is the last chunk: we do not want to write the terminating \0 */ if (!n_broken_pipe) { byte_written_to_inbuffer = fwrite(inbuffer, sizeof(char), numbyte-num_trailz, /*pagerfp*/stderr); } /* printf("%s", inbuffer); */ } while (!n_read_done); } else { fprintf(stderr, "%s\n", get_status_msg(cs_status)); free(slvals.outbuffer); return 1; } } /* end if cs_status */ /* request data */ send_status(slvals.n_sockfd, 0, TERM_NO); /* send step 7 */ /* openpager and open_outfile are guaranteed to return a valid file/pipe - and be it stdout */ if (slvals.n_file_open) { pagerfp = open_outfile(slvals.outfile, 0); } else if (slvals.n_file_append) { pagerfp = open_outfile(slvals.outfile, 1); } else if (slvals.n_pipe) { pagerfp = openpager(slvals.outpipe); } else { pagerfp = openpager(the_pager); } n_done = 0; do { /* loop until we have all requested datasets */ int n_error; cs_status = read_status(slvals.n_sockfd); /* read step 8 */ if (cs_status != 402 /* last dataset */ && cs_status != 404) { /* finished dataset */ fprintf(stderr, "%s\n", get_status_msg(cs_status)); if (slvals.n_file_open || slvals.n_file_append) { close_outfile(pagerfp); } else { closepager(pagerfp); } n_broken_pipe = 0; free(slvals.outbuffer); return 1; } if (cs_status == 402) { n_done++; } byte_written += read_terminated_string(&slvals, pagerfp, &n_error); /* send step 9 */ if (n_error) { free(slvals.outbuffer); if (slvals.n_file_open || slvals.n_file_append) { close_outfile(pagerfp); } else { closepager(pagerfp); } n_broken_pipe = 0; return 1; } } while (!n_done); /* read summary */ /* send_status(slvals.n_sockfd, 0, TERM_NO); */ cs_status = read_status(slvals.n_sockfd); /* read step 10 */ if (cs_status != 0 /* success */ && cs_status != 803) { /* partial success */ fprintf(stderr, "%s\n", get_status_msg(cs_status)); free(slvals.outbuffer); return 1; } numbyte = tread(slvals.n_sockfd, slvals.inbuffer, OUTBUF_LEN); if (numbyte == -1) { fprintf(stderr, "%s\n", get_status_msg(109)); n_broken_pipe = 0; free(slvals.outbuffer); return 1; } send_status(slvals.n_sockfd, 0, TERM_NO); if (slvals.n_file_open || slvals.n_file_append) { close_outfile(pagerfp); fprintf(stderr, "%d byte written to %s\n", byte_written, slvals.outfile); } else { closepager(pagerfp); } /* closing the socket in the background apparently does not work if the whole app exits. So we force the close() call to wait until the data are read by the server */ mylinger.l_onoff = 1; /* let close wait */ mylinger.l_linger = 5; /* 5 seconds timeout */ setsockopt(slvals.n_sockfd, SOL_SOCKET, SO_LINGER, (const void*)&mylinger, sizeof(mylinger)); n_broken_pipe = 0; free(slvals.outbuffer); close(slvals.n_sockfd); fprintf(stderr, "%s", slvals.inbuffer); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ make_texbib() requests a LaTeX/BibTeX bibliography int make_texbib returns 0 if ok, 1 if error FILE *fp_infile pointer to a stream to read the id data from ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int make_texbib(FILE* fp_infile) { char cmd_buffer[OUTBUF_LEN] = ""; char inbuffer[COMMAND_INBUF_LEN] = ""; char scrambled_passwd[PASSWD_LENGTH*3+1] = ""; int numbyte = 0; int n_read_done = 0; int result; int cs_status; int n_done; int n_curr_trailing_z = 0; int n_last_trailing_z = 0; int retval = 0; size_t outbuf_len; size_t byte_written = 0; FILE *pagerfp; struct linger mylinger; struct simplelistvals slvals; struct lilimem sentinel; sentinel.ptr_mem = NULL; sentinel.ptr_next = NULL; sentinel.varname[0] = '\0'; outbuf_len = 128; /* something to start with */ slvals.outbuffer = malloc(outbuf_len); if (slvals.outbuffer == NULL) { return 1; } slvals.outbuffer[0] = '\0'; /* terminate string */ slvals.n_file_open = 0; slvals.n_file_append = 0; slvals.n_pipe = 0; slvals.outfile = NULL; slvals.outpipe = NULL; if (insert_lilimem(&sentinel, (void**)&(slvals.outbuffer), NULL)) { return 1; } strcpy(cmd_buffer, "gettexbib "); if (connect_to_server(&(slvals.n_sockfd), server_ip, port_address) != 0) { LOG_PRINT(LOG_ERR, "could not connect to server"); delete_all_lilimem(&sentinel); return 1; } strcpy(scrambled_passwd, passwd); if (init_dialog(slvals.n_sockfd, scrambled_passwd, inbuffer)) { LOG_PRINT(LOG_ERR, "server authentication failed"); retval = 1; goto Finish; } /* prepare data */ result = add_id_from_aux(fp_infile, &(slvals.outbuffer), &outbuf_len); if (result) { LOG_PRINT(LOG_WARNING, "could not read ID data from .aux file"); send_status(slvals.n_sockfd, 112, TERM_NO); retval = 1; goto Finish; } /* assemble command */ strcat(cmd_buffer, " -u "); strcat(cmd_buffer, username); if (*passwd) { strcat(cmd_buffer, " -w "); strcat(cmd_buffer, scrambled_passwd); } strcat(cmd_buffer, " -d "); strcat(cmd_buffer, current_db); if (*output_format) { strcat(cmd_buffer, " -s "); strcat(cmd_buffer, output_format); } sprintf(cmd_buffer+strlen(cmd_buffer), " %d", strlen(slvals.outbuffer)+TERM_LEN); /* printf("outbuffer:%s<<\ncmd_buffer:%s<<\n", slvals.outbuffer, cmd_buffer); */ /* delete_all_lilimem(&sentinel); */ /* return 0; */ /* send command to application server */ send_status(slvals.n_sockfd, 0, TERM_NO); /* #1 */ numbyte = tiwrite(slvals.n_sockfd, cmd_buffer, TERM_YES); LOG_PRINT(LOG_DEBUG, cmd_buffer); if (numbyte == -1) { fprintf(stderr, "%s\n", get_status_msg(110)); LOG_PRINT(LOG_WARNING, get_status_msg(110)); retval = 1; goto Finish; } cs_status = read_status(slvals.n_sockfd); /* #2 */ if (cs_status) { fprintf(stderr, "%s\n", get_status_msg(cs_status)); LOG_PRINT(LOG_WARNING, get_status_msg(cs_status)); retval = 1; goto Finish; } /* send id list to server */ send_status(slvals.n_sockfd, 0, TERM_NO); /* #3 */ numbyte = tiwrite(slvals.n_sockfd, slvals.outbuffer, TERM_YES); LOG_PRINT(LOG_DEBUG, slvals.outbuffer); if (numbyte == -1) { fprintf(stderr, "%s\n", get_status_msg(110)); LOG_PRINT(LOG_WARNING, get_status_msg(110)); retval = 1; goto Finish; } /* openpager and open_outfile are guaranteed to return a valid file/pipe - and be it stdout */ if (slvals.n_file_open) { pagerfp = open_outfile(slvals.outfile, 0); } else if (slvals.n_file_append) { pagerfp = open_outfile(slvals.outfile, 1); } else if (slvals.n_pipe) { pagerfp = openpager(slvals.outpipe); } else { pagerfp = openpager(the_pager); } n_done = 0; do { /* loop until we have all requested datasets */ /* read acknowledgement from application server */ cs_status = read_status(slvals.n_sockfd); /* #4/#6 */ if (cs_status != 402 && cs_status != 404) { fprintf(stderr, "%s\n", get_status_msg(cs_status)); LOG_PRINT(LOG_WARNING, get_status_msg(cs_status)); if (slvals.n_file_open || slvals.n_file_append) { close_outfile(pagerfp); } else { closepager(pagerfp); } retval = 1; goto Finish; } if (cs_status == 402) { n_done++; } n_read_done = 0; do { /* loop until a terminated string is complete */ numbyte = tread(slvals.n_sockfd, slvals.inbuffer, OUTBUF_LEN); /* #6 ok */ if (numbyte == -1) { fprintf(stderr, "%s\n", get_status_msg(109)); if (slvals.n_file_open || slvals.n_file_append) { close_outfile(pagerfp); } else { closepager(pagerfp); } n_broken_pipe = 0; retval = 1; goto Finish; } n_curr_trailing_z = get_trailz(slvals.inbuffer, numbyte); if (numbyte >= TERM_LEN) { if (n_curr_trailing_z >= TERM_LEN) { /* terminator is complete */ n_read_done++; /* send back confirmation to the server */ send_status(slvals.n_sockfd, 0, TERM_NO); /* #7 */ } } else if (n_curr_trailing_z == numbyte && n_curr_trailing_z + n_last_trailing_z >= TERM_LEN) { /* terminator is complete including the previous cycle */ n_read_done++; /* send back confirmation to the server */ send_status(slvals.n_sockfd, 0, TERM_NO); /* #7 */ } else if (n_curr_trailing_z == numbyte) { /* terminator is still incomplete */ n_last_trailing_z += n_curr_trailing_z; continue; } /* write numbyte chars to output, unless this is the last chunk: we do not want to write the terminating \0 */ if (!n_broken_pipe) { if (n_last_trailing_z) { byte_written += fwrite(cs_term, sizeof(char), n_last_trailing_z, pagerfp); } byte_written += fwrite(slvals.inbuffer, sizeof(char), numbyte-n_curr_trailing_z, pagerfp); } /* printf("inbuffer went to:%s<<\nn_read_done is %d< ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ /* maximum size of an input line */ #define INFILE_CHUNK_SIZE 65536 int make_cookedbib(FILE* fp_infile, int n_type); int make_rawbib(FILE* fp_infile, int n_type); int make_texbib(FILE* fp_infile); refdb-1.0.2/src/refdbxp.c000644 001750 001750 00000107265 12255427652 016054 0ustar00markusmarkus000000 000000 /*+++++++++++++++++ refdbxp.c - expands or contracts citations in SGML/XML documents markus@mhoenicka.de 2002-10-8 $Id: refdbxp.c,v 1.7.2.5 2005/11/08 21:39:50 mhoenicka Exp $ 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, see ++++++++++++++++++++++++*/ /* ToDo: Use a command line option to define a default database. Then include the database in the linked list elements and write out the expanded form in all cases. */ #include #include #include #include "getopt.h" #include "strfncs.h" #define LINE_SIZE 65536 /* buffer size for fgets */ #define MAX_ATTR_LEN 256 /* maximum allowable length of a attribute value. This value is taken from docbook.dcl (4.1), but xml.dcl doesn't specify a value so I'm not sure whether we're on the safe side */ #define FIRST 0 #define SUBSEQ 1 /* structures used in the linked lists */ /* liliment is used in a linked list to manage the chunks of a line separated by refdb citation element starts. Each chunk starts at the beginning of the line or just after the end of the previous chunk and extends to the end of the citation end tag. Within each chunk we keep pointers to the start of the citation start tag, the data proper (i.e. a string containing one or more references in either short or long format), and the start of the end tag. The contents of the original line could be recreated by piecing together the chunks in the correct order. */ typedef struct liliment { char* chunkstart; /* ptr to start of the current chunk */ char* elstartstart; /* ptr to first char of start tag */ char* elstartend; /* ptr to last char of start tag */ char* elendstart; /* ptr to first char of end tag, NULL if element is not closed */ char* eldata; /* ptr to allocated string containing element data */ struct liliment *ptr_next; /* pointer to the next element in the list */ struct liliment *ptr_last; /* pointer to the last element in the list */ } Liliment; /* lilicit is used in a linked list to manage a global list of all references in the document */ typedef struct lilicit { char* cit; /* ptr to reference string */ int nis_subseq; /* if 1, subsequent citation, if 0, first citation */ int n_citstylespec; /* 0 = regular, 1 = authoronly, 2 = yearonly */ struct lilicit *ptr_next; /* pointer to the next element in the list */ struct lilicit *ptr_last; /* pointer to the last element in the list */ } Lilicit; /* global variables */ int n_create_full = 1; /* by default, create expanded output */ int n_intype = 0; /* 0 = db31; 1 = db31x; 2 = teix */ int n_multicit_count = 0; /* this counter is used to create pseudo-unique ID values for multiple citations, i.e. IMXXX */ char typesep = '-'; /* separator for A,Q,Y etc suffix */ /* prototypes */ int handle_full_style(Liliment *ptr_first, Lilicit *ptr_first_cit); int handle_short_style(Liliment *ptr_first, Lilicit *ptr_first_cit); int write_full(const char* citation, int nis_subseq, int n_citstylespec); int write_short(const char* citation, int n_citstylespec); int write_multixref(Lilicit* ptr_cit_sentinel, int n_citestylespec, int* ptr_multicit_count); char* fget_line(char** linebuffer, size_t* lb_size, const char* start_tag, const char* end_tag, FILE* infp); char* find_start(char* scan_start, char* start_tag, char* attrname_refdb, char* attrvalue_refdb, char** cit_startend, int n_intype); Liliment* add_liliment(Liliment* ptr_first, const char* el_startstart, const char* el_startend, const char* chunkstart); Liliment* get_next_liliment(Liliment* ptr_first); int delete_all_liliment(Liliment* ptr_first); int count_liliment(Liliment* ptr_first); Lilicit* add_lilicit(Lilicit *ptr_first, char* cit); Lilicit* get_next_lilicit(Lilicit* ptr_first); Lilicit* get_lilicit_byname(Lilicit* ptr_first, const char* name); int delete_all_lilicit(Lilicit *ptr_first); int count_lilicit(Lilicit* ptr_first); /* declaration of the svn version function */ const char* svn_version(void); /* the one and only main function */ int main(int argc, char** argv) { char *linebuffer; char *new_linebuffer; char *uplinebuffer = NULL; char *outbuffer; char *new_outbuffer; char *result; char *cit_start; char *cit_startend = NULL; char *cit_end; char *scan_start; char *real_start; char start_tag[11]; char end_tag[11]; char attrname_refdb[5]; char attrvalue_refdb[16]; int n_opt; size_t len; size_t lb_len = LINE_SIZE; size_t ob_len = LINE_SIZE; FILE *infp = stdin; Liliment sentinel; Liliment *ptr_curr; Lilicit cit_sentinel; /* initialize linked lists */ sentinel.ptr_next = NULL; sentinel.ptr_last = &sentinel; sentinel.eldata = NULL; cit_sentinel.ptr_next = NULL; cit_sentinel.ptr_last = &cit_sentinel; cit_sentinel.cit = NULL; /* allocate memory for input and output */ linebuffer = malloc(lb_len); if (linebuffer == NULL) { fprintf(stderr, "out of memory\n"); exit(1); } linebuffer[0] = '\0'; outbuffer = malloc(ob_len); if (outbuffer == NULL) { fprintf(stderr, "out of memory\n"); free(linebuffer); exit(1); } /* parse command line options */ while ((n_opt = getopt(argc, argv, "hst:v")) != -1) { switch (n_opt) { case 'h': fprintf(stderr, "Expands or contracts citations in SGML/XML documents\nInput is read from stdin, output is sent to stdout\nUsage: refdbxp [-h] [-s] [-t type]\nOptions: -h print help and exit\n -s create short citations (default: long)\n -t specify input type (db31, db31x, teix)\n -v print version info and exit\n"); exit(0); break; case 's': n_create_full = 0; break; case 't': if (!strcmp(optarg, "db31x")) { n_intype = 1; } else if (!strcmp(optarg, "teix")) { n_intype = 2; } /* else: for db31 and anything else n_intype remains 0 */ break; case 'v': printf("refdbxp %s built from svn revision %s markus@mhoenicka.de\nYou may redistribute and modify this software under the terms of the GNU General Public License.\n", VERSION, svn_version()); exit (0); break; case ':': fprintf(stderr, "Usage: refdbxp [-h] [-s] [-t type]\nOptions: -h print help and exit\n -s create short citations (default: long)\n -t specify input type (db31, db31x, teix)\n"); break; case '?': fprintf(stderr, "unknown option %c: use refdbxp -h to display usage\n", optopt); break; default: break; } } /* set search strings to match input type */ switch (n_intype) { case 0: /* db31 */ strcpy(start_tag, "/ start tags with appropriate attributes and add them to linked list - walk through linked list of citations (fifo) - decide whether citation has short or full style - full style: add references to linked list, correct first/subseq stuff if necessary - short style: add references to linked list, expand reference by inserting appropriate markup, take care of first/subseq issue */ /* loop over all \n-terminated lines of the input */ while ((result = fget_line(&linebuffer, &lb_len, start_tag, end_tag, infp)) != NULL) { /* fprintf(stderr, linebuffer); */ /* get sizes of linebuffer and outbuffer in sync if necessary */ if (lb_len > ob_len) { if ((new_outbuffer = (char*)realloc(outbuffer, lb_len)) == NULL) { free(linebuffer); free(outbuffer); fprintf(stderr, "out of memory\n"); exit(1); } else { outbuffer = new_outbuffer; ob_len = lb_len; } } /* if we're looking at SGML data, create a copy of the input string and uppercase it */ if (!n_intype) { uplinebuffer = strdup(linebuffer); if (!uplinebuffer) { free(linebuffer); free(outbuffer); fprintf(stderr, "out of memory\n"); exit(1); } strup(uplinebuffer); scan_start = uplinebuffer; } else { /* we're looking at XML data */ scan_start = linebuffer; } /* real_start is a ptr to the real data regardless of uppercasing scan_start = real_start for XML data. Only if we use SGML data, scan_start points to the uppercased string. We do all string comparisons with the uppercased (for SGML data) string, but use weird pointer arithmetics to grab the corresponding chunks of interest from the original string. That is, all pointers in the linked list elements are pointers to the original string meaning they're never uppercased. Functions doing string comparisons with these fragments need to uppercase the fragments again in the case of SGML data */ real_start = linebuffer; /* look for start tag */ while ((cit_start = find_start(scan_start, start_tag, attrname_refdb, attrvalue_refdb, &cit_startend, n_intype)) != NULL) { /* add the element to the list of elements of the current line */ if ((ptr_curr = add_liliment(&sentinel, real_start+(cit_start-scan_start), real_start+(cit_startend-scan_start), real_start)) == NULL) { fprintf(stderr, "out of memory\n"); break; } /* look for end tag */ if ((cit_end = strstr(cit_startend, end_tag)) != NULL) { ptr_curr->elendstart = real_start+(cit_end-scan_start); len = ptr_curr->elendstart - ptr_curr->elstartend; ptr_curr->eldata = malloc(len + 1); if (!ptr_curr->eldata) { fprintf(stderr, "out of memory\n"); break; } strncpy(ptr_curr->eldata, ptr_curr->elstartend, len); (ptr_curr->eldata)[len] = '\0'; } else { ptr_curr->elendstart = NULL; } /* 5 is the minimum length of an end tag (elendstart) ? (ptr_curr->elendstart+5)-real_start : (ptr_curr->elstartend+1)-real_start; real_start = (ptr_curr->elendstart) ? ptr_curr->elendstart+5 : ptr_curr->elstartend+1; } if (sentinel.ptr_next) { ptr_curr = &sentinel; /* all citations of the current line are in the linked list starting at sentinel. Loop over all list members to create the requested output */ while ((ptr_curr = get_next_liliment(ptr_curr)) != NULL) { len = ptr_curr->elstartend - ptr_curr->chunkstart; strncpy(outbuffer, ptr_curr->chunkstart, len); outbuffer[len] = '\0'; fputs(outbuffer, stdout); /* don't use printf for chunks that could contain '%' */ /* check first char after closing delimiter */ if (*(ptr_curr->eldata) == '<') { /* full style */ handle_full_style(ptr_curr, &cit_sentinel); } else { /* short style */ handle_short_style(ptr_curr, &cit_sentinel); } /* after the element is written, we have to print the data until the next element starts or the remainder of the line if this was the last element */ if (ptr_curr->ptr_next) { len = (ptr_curr->ptr_next)->chunkstart - ptr_curr->elendstart; strncpy(outbuffer, ptr_curr->elendstart, len); outbuffer[len] = '\0'; fputs(outbuffer, stdout); } else { fputs(ptr_curr->elendstart, stdout); } } /* delete list of citations of the current line */ delete_all_liliment(&sentinel); } else { /* line doesn't contain citation - pass through unaltered */ fputs(result, stdout); } if (lb_len > LINE_SIZE) { lb_len = LINE_SIZE; new_linebuffer = (char*)realloc(linebuffer, lb_len); if (!new_linebuffer) { delete_all_lilicit(&cit_sentinel); free(linebuffer); if (uplinebuffer) { /* only used for SGML data, otherwise NULL */ free(uplinebuffer); } free(outbuffer); } else { linebuffer = new_linebuffer; } } if (uplinebuffer) { /* only used for SGML data, otherwise NULL */ free(uplinebuffer); uplinebuffer = NULL; } linebuffer[0] = '\0'; } /* delete global list of references */ delete_all_lilicit(&cit_sentinel); /* free allocated memory */ free(linebuffer); if (uplinebuffer) { /* only used for SGML data, otherwise NULL */ free(uplinebuffer); } free(outbuffer); exit(0); } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ handle_full_style(): parses and creates output from a full-style citation int handle_full_style returns 0 if ok, 1 if error Liliment *ptr_first ptr to structure containing the current citation data Lilicit *ptr_first_cit ptr to sentinel of global citation list ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int handle_full_style(Liliment *ptr_first, Lilicit *ptr_first_cit) { /* ToDo: look for multixref stuff and ignore */ int citstylespec = 0; /* 0 is regular, 1 is authoronly, 2 is yearonly */ int len; char *token; char *idstring; char *idend; char idbuffer[MAX_ATTR_LEN]; char att_role[] = "\"MULTIXREF\""; char att_linkend[10]; Lilicit cit_sentinel; Lilicit *ptr_curr_cit; cit_sentinel.ptr_next = NULL; cit_sentinel.ptr_last = &cit_sentinel; cit_sentinel.cit = NULL; if (!ptr_first || (!ptr_first->eldata && !*(ptr_first->eldata))) { return 0; /* nothing to do */ } /* check whether SGML or XML data */ switch (n_intype) { case 0: strcpy(att_linkend, "LINKEND"); break; case 1: strcpy(att_linkend, "linkend"); break; case 2: strcpy(att_linkend, "target"); break; default: break; } /* parse data and create list of references */ for (token = strtok(ptr_first->eldata, "<"); token; token = strtok(NULL, "<")) { /* fprintf(stderr, "token:%s<<\n", token); */ if (!n_intype) { strup(token); } /* extract ID from token */ if (strstr(token, att_role)) { /* ignore multixref stuff */ continue; } idstring = strstr(token, att_linkend); if (!idstring) { /* should never happen */ continue; } while (*idstring && *idstring != '=') { idstring++; } if (!*idstring) { /* attribute name without '=', should never happen */ continue; } idstring = strstr(idstring, "ID"); if (!idstring) { /* should never happen */ continue; } idstring += 2; idend = strstr(idstring, "\""); /* quotation mark terminates attribute value */ if (!idend) { /* should never happen */ continue; } else { /* use one char less to eliminate trailing type specifier */ len = idend - idstring - 1; if (len < 5) { /* incomplete citation */ continue; } /* skip the type suffix separator */ if (*(idend-2) == typesep) { len--; } /* prevent buffer overflow */ len = (len >= MAX_ATTR_LEN) ? MAX_ATTR_LEN-1 : len; /* keep copy of ID string */ strncpy(idbuffer, idstring, len); idbuffer[len] = '\0'; /* terminate just in case */ } /* check reference type */ switch ((int)*(idend-1)) { case (int)'X': /* fall through */ case (int)'S': citstylespec = 0; break; case (int)'A': /* fall through */ case (int)'Q': citstylespec = 1; break; case (int)'Y': citstylespec = 2; break; default: /* should never happen */ break; } /* try to find existing reference with the same ID string */ if (get_lilicit_byname(ptr_first_cit, idbuffer)) { /* subsequent occurrence, add only to local reference list */ if ((ptr_curr_cit = add_lilicit(&cit_sentinel, idbuffer)) == NULL) { return 1; } ptr_curr_cit->nis_subseq = SUBSEQ; ptr_curr_cit->n_citstylespec = citstylespec; } else { /* first occurrence, first add to global reference list... */ if (!add_lilicit(ptr_first_cit, idbuffer)) { return 1; } /* ...then add to local reference list */ if ((ptr_curr_cit = add_lilicit(&cit_sentinel, idbuffer)) == NULL) { return 1; } ptr_curr_cit->nis_subseq = FIRST; ptr_curr_cit->n_citstylespec = citstylespec; } } /* end for */ /* write requested output full/short. Start with MULTIXREF stuff if applicable */ write_multixref(&cit_sentinel, citstylespec, &n_multicit_count); ptr_curr_cit = &cit_sentinel; /* loop over all references in the current citation */ while ((ptr_curr_cit = get_next_lilicit(ptr_curr_cit)) != NULL) { if (n_create_full) { write_full(ptr_curr_cit->cit, ptr_curr_cit->nis_subseq, ptr_curr_cit->n_citstylespec); } else { write_short(ptr_curr_cit->cit, ptr_curr_cit->n_citstylespec); } } /* end while */ /* delete local list of references of the current citation */ delete_all_lilicit(&cit_sentinel); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ handle_short_style(): parses and creates output from a short-style citation int handle_short_style returns 0 if ok, 1 if error Liliment *ptr_first ptr to structure containing the current citation data Lilicit *ptr_first_cit ptr to sentinel of global citation list ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int handle_short_style(Liliment *ptr_first, Lilicit *ptr_first_cit) { int citstylespec = 0; /* 0 is regular, 1 is authoronly, 2 is yearonly */ char *mydata; char *token; Lilicit cit_sentinel; Lilicit *ptr_curr_cit; cit_sentinel.ptr_next = NULL; cit_sentinel.ptr_last = &cit_sentinel; cit_sentinel.cit = NULL; if (!ptr_first->eldata && !*(ptr_first->eldata)) { return 0; /* nothing to do */ } /* first look for citation style specifier */ if (!strncmp(ptr_first->eldata, "A:", 2)) { /* authoronly */ citstylespec = 1; } else if (!strncmp(ptr_first->eldata, "Y:", 2)) { /* yearonly */ citstylespec = 2; } /* parse remaining data and create list of references */ mydata = (citstylespec) ? ptr_first->eldata+2 : ptr_first->eldata; for (token = strtok(mydata, ";"); token; token = strtok(NULL, ";")) { if (get_lilicit_byname(ptr_first_cit, token)) { /* subsequent occurrence, add reference to local list only */ if ((ptr_curr_cit = add_lilicit(&cit_sentinel, token)) == NULL) { return 1; } ptr_curr_cit->nis_subseq = SUBSEQ; ptr_curr_cit->n_citstylespec = citstylespec; } else { /* first occurrence, first add reference to global list ... */ if (!add_lilicit(ptr_first_cit, token)) { return 1; } /* ... then to local reference list */ if ((ptr_curr_cit = add_lilicit(&cit_sentinel, token)) == NULL) { return 1; } ptr_curr_cit->nis_subseq = FIRST; ptr_curr_cit->n_citstylespec = citstylespec; } } /* end for */ /* write requested output full/short. Start with MULTIXREF stuff if applicable */ write_multixref(&cit_sentinel, citstylespec, &n_multicit_count); ptr_curr_cit = &cit_sentinel; while ((ptr_curr_cit = get_next_lilicit(ptr_curr_cit)) != NULL) { if (n_create_full) { if (write_full(ptr_curr_cit->cit, ptr_curr_cit->nis_subseq, ptr_curr_cit->n_citstylespec)) { delete_all_lilicit(&cit_sentinel); return 1; } } else { write_short(ptr_curr_cit->cit, ptr_curr_cit->n_citstylespec); } } /* end while */ /* delete local list of references of the current citation */ delete_all_lilicit(&cit_sentinel); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ write_full(): writes a full-style citation int write_full returns 0 if ok, 1 on error const char* citation ptr to citation string int nis_subseq 1 if citation is a subsequent one, 0 if first int n_citestylespec 0 = regular citation, 1 = authoronly, 2 = yearonly ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int write_full(const char* citation, int nis_subseq, int n_citstylespec) { char modifier[3] = {'-', '\0', '\0'}; switch (n_citstylespec) { case 0: modifier[1] = (nis_subseq) ? 'S' : 'X'; break; case 1: modifier[1] = (nis_subseq) ? 'Q' : 'A'; break; case 2: modifier[1] = 'Y'; break; default: break; } switch (n_intype) { case 0: /* db31 */ printf("", citation, modifier); break; case 1: /* db31x */ printf("", citation, modifier); break; case 2: /* teix */ printf("", citation, modifier); break; default: break; } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ write_short(): writes a short-style citation int write_short returns 0 const char* citation ptr to citation string int n_citestylespec 0 = regular citation, 1 = authoronly, 2 = yearonly ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int write_short(const char* citation, int n_citstylespec) { printf("%s;", citation); return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ write_multixref(): writes multixref stuff int write_multixref returns 0 Lilicit* ptr_cit_sentinel ptr to start of linked list with references int n_citestylespec 0 = regular citation, 1 = authoronly, 2 = yearonly int* ptr_multicit_count ptr to counter for multiple citations; will be incremented accordingly ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int write_multixref(Lilicit* ptr_cit_sentinel, int n_citestylespec, int* ptr_multicit_count) { if (n_create_full && count_lilicit(ptr_cit_sentinel)) { switch (n_intype) { case 0: /* db31 */ printf("", *ptr_multicit_count, (ptr_cit_sentinel->ptr_next)->cit); break; case 1: /* db31x */ printf("", *ptr_multicit_count, (ptr_cit_sentinel->ptr_next)->cit); break; case 2: /* teix */ printf("", *ptr_multicit_count); break; default: break; } (*ptr_multicit_count)++; } else if (!n_create_full) { switch (n_citestylespec) { case 0: /* no modifier necessary */ break; case 1: printf("A:"); break; case 2: printf("Y:"); break; default: break; } } return 0; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ fget_line(): reads a full line until a newline is encountered, basically a lame workaround for the fixed buffer size problem of fgets, but in addition this fn makes sure that we read each citation element completely even if it is spread over several \n-terminated lines. char* fget_line returns ptr to complete string or NULL if some error occurs char** linebuffer address of ptr to allocated string to contain the full line. **linebuffer must hold at least LINE_SIZE chars initially and may grow as needed. size_t* lb_size ptr to size of *linebuffer const char* start_tag ptr to string containing start tag of citation element const char* end_tag ptr to string containing end tag of citation element FILE* infp ptr to file descriptor of data source ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* fget_line(char** linebuffer, size_t* lb_size, const char* start_tag, const char* end_tag, FILE* infp) { char *result; char *my_linebuffer; char *new_linebuffer; char *start_cit; char *end_cit; char *my_cit = NULL; size_t len; size_t total_len = 0; int n_have_cit = 0; my_linebuffer = *linebuffer; /* loop until we've got one logical line or no more data */ while (1) { if ((result = fgets(my_linebuffer, LINE_SIZE, infp)) == NULL) { /* assume no more data available (EOF) */ if (**linebuffer) { /* if we have some data, return what we have */ break; } else { /* otherwise return NULL */ return NULL; } } /* check whether last char is a newline, i.e. whether we've got one logical line */ len = strlen(result); total_len += len; if (result[len-1] == '\n') { if (!n_have_cit) { /* now we need to check whether the current line contains the start of an unfinished citation element. If so, we need to loop until we find the matching end tag */ start_cit = strrchr(result, (int)'<'); if (start_cit) { if (!n_intype) { my_cit = strdup(start_cit); if (!my_cit) { fprintf(stderr, "out of memory"); return NULL; } strup(my_cit); } else { my_cit = start_cit; } if ((start_cit = strstr(my_cit, start_tag)) == NULL) { if (!n_intype && my_cit) { free(my_cit); } break; } else { if (!n_intype && my_cit) { free(my_cit); } n_have_cit = 1; } my_cit = NULL; } } else { /* a previous line contained a citation start tag. Now we need to keep on reading until we find a matching end tag */ if (!n_intype) { my_cit = strdup(result); if (!my_cit) { fprintf(stderr, "out of memory"); return NULL; } strup(my_cit); } else { my_cit = result; } end_cit = strstr(my_cit, end_tag); if (end_cit) { n_have_cit = 0; /* to make matters worse, some nasty author could have started another citation element on the very same line. So we need to check again whether we really can safely stop reading here */ start_cit = strrchr(my_cit, (int)'<'); if (start_cit) { if ((start_cit = strstr(start_cit, start_tag)) == NULL) { if (!n_intype && my_cit) { free(my_cit); } break; /* no new start tag, line is finished */ } else { n_have_cit = 1; /* new open start tag, need to read more */ } } /* else: no '<', should not happen as we have at least the end tag*/ } /* else: keep on reading, no citation end tag yet */ if (!n_intype && my_cit) { free(my_cit); } } } /* increase size of buffer */ *lb_size += LINE_SIZE; if ((new_linebuffer = (char*)realloc(*linebuffer, *lb_size)) == NULL) { return NULL; } else { *linebuffer = new_linebuffer; my_linebuffer = *linebuffer + total_len; /* add next chunk to the end of the existing data */ } } return *linebuffer; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ find_start(): finds the start of a RefDB citation element in a string char* find_start returns ptr to the first citation element or NULL if some error occurs char* scan_start ptr to string to scan char* start_tag ptr to string containing the start tag search string char* attrname_refdb ptr to string containing the attribute name used to check for a RefDB citation char* attrvalue_refdb ptr to string containing the attribute value used to check for a RefDB citation char** cit_startend address of ptr to the first char after the end of the start tag. Will be updated with the proper value or will contain NULL if the start tag is incomplete int n_intype the type of input ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ char* find_start(char* scan_start, char* start_tag, char* attrname_refdb, char* attrvalue_refdb, char** cit_startend, int n_intype) { char *cit_start; char *end_starttag; char *attr_start; cit_start = scan_start; while ((cit_start = strstr(cit_start, start_tag)) != NULL) { end_starttag = strchr(cit_start, (int)'>'); if (end_starttag) { *end_starttag = '\0'; /* terminate string temporarily */ } else { /* incomplete start tag. This is allowed by SGML, but can't be handled properly here -> bail out. However, as fget_line keeps on reading until it gets the matching end tag, this should never happen */ break; } /* try to locate the attribute with the name given in attrname_refdb */ if ((attr_start = strstr(cit_start, attrname_refdb)) != NULL) { if ((attr_start = strchr(attr_start, (int)'=')) != NULL) { /* skip whitespace */ attr_start++; while (*attr_start == ' ') { attr_start++; } if (!strncmp(attr_start, attrvalue_refdb, strlen(attrvalue_refdb))) { *end_starttag = '>'; /* restore original string */ *cit_startend = end_starttag+1; return cit_start; } } /* else: missing '=', should not happen */ } /* else: no refdb citation */ if (end_starttag) { *end_starttag = '>'; /* restore original string */ cit_start = end_starttag; } else { break; } } /* nothing suitable found */ *cit_startend = NULL; return NULL; } /* Liliment defines a linked list for string chunks, each containing up to one citation element. New members are added to the end of the list, so the first member after the sentinel is the first member that was added. For this to work the sentinel has to keep a ptr to the next member and a ptr to the last member. */ /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ add_liliment(): adds a new member to the Liliment linked list Liliment* ptr_first ptr to the sentinel of the linked list const char* el_startstart ptr to the start of the start tag of the citation element in the current chunk const char* el_startend ptr to the first char after the end of the start tag of the citation element in the current chunk const char* chunkstart ptr to the start of the current chunk ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ Liliment* add_liliment(Liliment* ptr_first, const char* el_startstart, const char* el_startend, const char* chunkstart) { Liliment* ptr_new; /* allocate memory for a new list member */ ptr_new = malloc(sizeof(Liliment)); if (!ptr_new) { return NULL; /* out of memory */ } /* set provided values */ ptr_new->chunkstart = (char*)chunkstart; ptr_new->elstartstart = (char*)el_startstart; ptr_new->elstartend = (char*)el_startend; /* set initial values, will be changed by the app later */ ptr_new->eldata = NULL; ptr_new->ptr_next = NULL; /* link new member into the list */ (ptr_first->ptr_last)->ptr_next = ptr_new; ptr_first->ptr_last = ptr_new; return ptr_new; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_next_liliment(): retrieves the next member from the Liliment linked list Liliment* ptr_first ptr to the sentinel of the linked list (first call in a loop) or ptr to the previous element (subsequent calls in a loop) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ Liliment* get_next_liliment(Liliment* ptr_first) { return ptr_first->ptr_next; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ delete_all_liliment(): deletes all list members and deallocates memory Liliment* ptr_first ptr to the sentinel of the linked list ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int delete_all_liliment(Liliment *ptr_first) { Liliment* ptr_curr; Liliment* ptr_next; /* skip sentinel */ ptr_curr = ptr_first->ptr_next; /* loop over all list members */ while (ptr_curr) { if (ptr_curr->eldata) { free(ptr_curr->eldata); } ptr_next = ptr_curr->ptr_next; free(ptr_curr); ptr_curr = ptr_next; } /* reset sentinel */ ptr_first->ptr_next = NULL; ptr_first->ptr_last = ptr_first; return 0; } /* Lilicit defines a linked list for reference strings. New members are added to the end of the list, so the first member after the sentinel is the first member that was added to the list. */ /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ add_lilicit(): adds a new member to the Lilicit linked list Lilicit* ptr_first ptr to the sentinel of the linked list char* cit ptr to string containing the reference ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ Lilicit* add_lilicit(Lilicit *ptr_first, char* cit) { Lilicit* ptr_new; ptr_new = malloc(sizeof(Lilicit)); if (!ptr_new) { return NULL; } ptr_new->cit = strdup(cit); ptr_new->ptr_next = NULL; (ptr_first->ptr_last)->ptr_next = ptr_new; ptr_first->ptr_last = ptr_new; return ptr_new; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_next_lilicit(): retrieves the next member from the Lilicit linked list Lilicit* ptr_first ptr to the sentinel of the linked list (first call in a loop) or ptr to the previous element (subsequent calls in a loop) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ Lilicit* get_next_lilicit(Lilicit* ptr_first) { return ptr_first->ptr_next; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ get_lilicit_byname(): retrieves the member from the Lilicit linked list with the given reference string Lilicit* ptr_first ptr to the sentinel of the linked list (first call in a loop) or ptr to the previous element (subsequent calls in a loop) const char* name ptr to string with reference string to match ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ Lilicit* get_lilicit_byname(Lilicit* ptr_first, const char* name) { Lilicit* ptr_curr; ptr_curr = ptr_first->ptr_next; while (ptr_curr) { if (ptr_curr->cit) { if (!strcmp(ptr_curr->cit, name)) { return ptr_curr; } } ptr_curr = ptr_curr->ptr_next; } return NULL; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ count_lilicit(): counts the members of the Lilicit linked list int count_lilicit returns the number of members minus one. This is the easiest way to distinguish between single (0) and multiple (!=0) references Lilicit* ptr_first ptr to the sentinel of the linked list ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int count_lilicit(Lilicit* ptr_first) { int i = 0; Lilicit *ptr_curr; ptr_curr = ptr_first; while ((ptr_curr = get_next_lilicit(ptr_curr))) { i++; } if (i) { i--; } return i; } /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ delete_all_lilicit(): deletes all list members and deallocates memory Lilicit* ptr_first ptr to the sentinel of the linked list ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ int delete_all_lilicit(Lilicit *ptr_first) { Lilicit* ptr_curr; Lilicit* ptr_next; ptr_curr = ptr_first->ptr_next; while (ptr_curr) { if (ptr_curr->cit) { free(ptr_curr->cit); } ptr_next = ptr_curr->ptr_next; free(ptr_curr); ptr_curr = ptr_next; } ptr_first->ptr_next = NULL; ptr_first->ptr_last = ptr_first; return 0; } refdb-1.0.2/src/refdbd.h.in000755 001750 001750 00000027172 11636157172 016262 0ustar00markusmarkus000000 000000 /* refdbd.h header file for refdbd.c */ /* markus@mhoenicka.de 2-10-00 */ /* $Id: refdbd.h.in,v 1.7.2.15 2006/02/22 20:58:39 mhoenicka Exp $ */ /* 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 XmlParse_INCLUDED #include #endif #ifndef backend_included #include "backend.h" #endif /* instances were not available before libdbi 1.0 */ #if !defined (LIBDBI_LIB_CURRENT) || LIBDBI_LIB_CURRENT < 2 typedef void * dbi_inst; #endif struct ADDRESULT { unsigned long long success; /* number of successfully added references */ unsigned long long failure; /* number of failures */ unsigned long long updated; /* number of successfully updated references */ unsigned long long skipped; /* number of skipped references */ char *msg; /* ptr to optional error message */ size_t msg_len; /* length of optional error message */ }; struct CLIENT_REQUEST { int fd; /* file descriptor of incoming connection */ int n_cgi; /* if 1, handle as CGI request */ int* ptr_optind; /* ptr to index of first parsed argument to handle */ int inargc; /* number of parsed arguments */ int protocol; /* protocol version */ int db_timeout; /* db-engine specific timeout (sqlite/sqlite3) */ int share_default; /* whether (1) or not (0) to share notes by default */ char** inargv; /* ptr to array of parsed arguments */ char username[USERNAME_LENGTH]; /* username for database authentication */ char passwd[PREFS_BUF_LEN]; /* password for database authentication */ char server_ip[PREFS_BUF_LEN]; /* hostname or IP address of database server */ char my_hostname[256]; /* hostname of box running refdbd */ char dbs_port_address[PREFS_BUF_LEN]; /* port where database server listens */ char dbserver[PREFS_BUF_LEN]; /* name of the libdbi driver */ char current_db[DBNAME_LENGTH+1]; /* name of reference database */ char db_path[PREFS_BUF_LEN]; /* path of dir containing databases */ char db_encoding[PREFS_BUF_LEN]; /* input or output encoding */ char listname[PREFS_BUF_LEN+USERNAME_LENGTH+2]; /* name of personal list */ char limit[PREFS_BUF_LEN]; /* limit:offset for retrieval functions */ char namespace[PREFS_BUF_LEN]; /* namespace for XML documents */ char client_ip[16]; /* IP address of client */ char pdfroot[_POSIX_PATH_MAX+1]; char cgi_url[_POSIX_PATH_MAX+1]; char check_string[MAX_FMT_LEN]; /* fields to check */ char* argument; /* additional unparsed command arguments */ dbi_inst inst; /* the libdbi instance (used for libdbi >= 1.0) */ }; struct BIBCONNS { dbi_conn conn; dbi_conn conn_refdb; dbi_conn conn_source; }; #define MSG_BUF_SIZE 256 #define FIFO_NAME "/tmp/refdbd_fifo" /* base name of a fifo */ #define MAIN_META "t_meta" /* name of the main database meta table */ #define DB_DIR "" /* directory which holds database and version file */ #define MAIN_DB_VERSION 3 /* version tag of main database shipped with this version */ #define MIN_MAIN_DB_VERSION 3 /* minimum version tag of readable main database */ #define DB_VERSION 4 /* version tag of reference databases created with this version */ #define MIN_DB_VERSION 4 /* minimum version tag of reference databases readable */ #define CITEKEY_BASE_LENGTH 240 /* maximum length of authorname+year */ /* defines for the temporary tables used in duplicate checks */ #define TEMP_TABLE_SPECIFIER "TEMPORARY " #define TEMP_TABLE_NAME_PREFIX "temp_" /* here we define some strings that will be used in the DSSSL style specification files */ #define STYLESHEET_HTML_NAME "docbook-refdb-html.dsl" #define STYLESHEET_HTML_BASENAME "docbook-refdb-html" #define STYLESHEET_HTML_ID "html" #define STYLESHEET_HTML_PUBID "-//Markus Hoenicka//DOCUMENT RefDB DocBook html stylesheet//EN" #define STYLESHEET_PRINT_NAME "docbook-refdb-print.dsl" #define STYLESHEET_PRINT_BASENAME "docbook-refdb-print" #define STYLESHEET_PRINT_ID "print" #define STYLESHEET_PRINT_PUBID "-//Markus Hoenicka//DOCUMENT RefDB DocBook print stylesheet//EN" /* these defines are for the bibliography style output */ #define PROCESSING_INST "\n" #define PROCESSING_INST_UTF8 "\n" #define DOCTYPE_CITESTYLE "//EN\" \"http://refdb.sourceforge.net/dtd/citestylex-/citestylex.dtd\" [\n\n\n\n\n\n\n]>\n" #define DOCTYPE_STYLESET "//EN\" \"http://refdb.sourceforge.net/dtd/citestylex-/citestylex.dtd\" [\n\n\n\n\n\n\n]>\n" /* this one is for the risx.dtd */ #define RISX_PUBID "//EN\" \"http://refdb.sourceforge.net/dtd/risx-/risx.dtd\" [\n\n\n\n\n\n\n]>\n" /* the extended notes dtd */ #define XNOTE_PUBID "//EN\" \"http://refdb.sourceforge.net/dtd/xnote-/xnote.dtd\" [\n\n\n\n\n\n\n]>\n" /* the citationlistx dtd */ #define CITATIONLISTX_PUBID "//EN\" \"http://refdb.sourceforge.net/dtd/citationlistx-/citationlistx.dtd\">\n" /* these defines select the addref modes */ #define ADDREF_ADD 0 #define ADDREF_UPDATE 1 #define ADDREF_UPDATE_PERSONAL 2 #define ADDREF_CHECK 3 /* the following defines are for daemonize & friends */ #define ROOT_DIR "/" #define STDIN_FILENO 0 #define STDOUT_FILENO 1 #define STDERR_FILENO 2 /* supported reference types */ #define REFTYPES "ABST ADVS ART BILL BOOK CASE CHAP COMP CONF CTLG DATA ELEC GEN HEAR ICOMM INPR JFULL JOUR MAP MGZN MPCT MUSIC NEWS PAMP PAT PCOMM RPRT SER SLIDE SOUND STAT THES UNBILL UNPB VIDEO" struct ADDRESULT* new_addresult(size_t msg_len); void free_addresult(struct ADDRESULT* ptr_addresult); struct bibinfo* new_bibinfo(char* format_string, char* sort_string); dbi_conn connect_to_db(struct CLIENT_REQUEST* ptr_clrequest, const char* special_db, int nocheck); int viewstat(struct CLIENT_REQUEST* ptr_clrequest); int listdb(struct CLIENT_REQUEST* ptr_clrequest, int select, struct ADDRESULT* ptr_addresult); int listuser(struct CLIENT_REQUEST* ptr_clrequest, struct ADDRESULT* ptr_addresult); int liststyle(struct CLIENT_REQUEST* ptr_clrequest, struct ADDRESULT* ptr_addresult); int getstyle(struct CLIENT_REQUEST* ptr_clrequest, struct ADDRESULT* ptr_addresult); int whichdb(struct CLIENT_REQUEST* ptr_clrequest); int createdb(struct CLIENT_REQUEST* ptr_clrequest, struct ADDRESULT* ptr_addresult, int optind); int real_createdb(struct CLIENT_REQUEST* ptr_clrequest, const char* db_encoding, struct ADDRESULT* ptr_addresult); int deletedb(struct CLIENT_REQUEST* ptr_clrequest, int optind, struct ADDRESULT* ptr_addresult); int child_confserv(struct CLIENT_REQUEST* ptr_clrequest, struct ADDRESULT* ptr_addresult); void confserv(char *command, char *server_ip); int addref(struct CLIENT_REQUEST* ptr_clrequest, struct bibinfo* ptr_biblio_info, char* set_owner, struct ADDRESULT* ptr_addresult, int replace_ref, int n_keep_id, int informat, int outformat, Lilid* ptr_sentinel); int deleteref(struct CLIENT_REQUEST* ptr_clrequest, struct ADDRESULT* ptr_addresult); int delete_ref_by_id(unsigned long long idval, dbi_conn conn, struct CLIENT_REQUEST* ptr_clrequest, struct ADDRESULT* ptr_addresult); int pickref(struct CLIENT_REQUEST* ptr_clrequest, int n_remove, struct ADDRESULT* ptr_addresult); int pick_one_reference(dbi_conn conn, unsigned long long n_ref_id, unsigned long long n_user_id, const char *listname, const char *username, struct ADDRESULT* ptr_addresult); int dump_one_reference(dbi_conn conn, unsigned long long n_ref_id, unsigned long long n_user_id, const char *listname, const char *username, struct ADDRESULT* ptr_addresult); int adduser(struct CLIENT_REQUEST* ptr_clrequest, char *user_host, char* newuser_passwd, int n_remove, int n_readonly, struct ADDRESULT* ptr_addresult); int addword(struct CLIENT_REQUEST* ptr_clrequest, int n_remove, struct ADDRESULT* ptr_addresult); int listword(struct CLIENT_REQUEST* ptr_clrequest, struct ADDRESULT* ptr_addresult); int getfoo(struct CLIENT_REQUEST* ptr_clrequest, int type, int all, char* input_encoding, struct ADDRESULT* ptr_addresult, char* format_string); int getbib(struct CLIENT_REQUEST* ptr_clrequest, struct bibinfo* ptr_biblio_info, int n_ref_format, struct ADDRESULT* ptr_addresult); char* getid(char* idstring, char** db, int* type); char* get_bibtex_id(char* idstring, char** db); int addstyle(struct CLIENT_REQUEST* ptr_clrequest, struct ADDRESULT* ptr_addresult); int deletestyle(struct CLIENT_REQUEST* ptr_clrequest, struct ADDRESULT* ptr_addresult); int remove_style(dbi_conn conn, unsigned int id); int read_xml(int fd, XML_Parser p, struct ADDRESULT* ptr_addresult); void log_print(int priority, const char* string); int is_refdb_admin(struct CLIENT_REQUEST* ptr_clrequest, struct ADDRESULT* ptr_addresult); int run_keyword_scan(struct CLIENT_REQUEST* ptr_clrequest, Lilid* ptr_sentinel, int mode); int addnote(struct CLIENT_REQUEST* ptr_clrequest, char* set_owner, struct ADDRESULT* ptr_addresult, int replace_note, Lilid* ptr_sentinel); int deletenote(struct CLIENT_REQUEST* ptr_clrequest, struct ADDRESULT* ptr_addresult); int getnote(struct CLIENT_REQUEST* ptr_clrequest, struct bibinfo *ptr_biblio_info, int ref_format, int n_privatelist, struct ADDRESULT* ptr_addresult, int send_data); int addlink(struct CLIENT_REQUEST* ptr_clrequest, char* set_owner, struct ADDRESULT* ptr_addresult, int n_remove); unsigned long long create_personal_list(dbi_conn conn, char *listname, unsigned long long n_user_id, const char *username); int remove_personal_list(dbi_conn conn, char *quoted_listname, struct CLIENT_REQUEST* ptr_clrequest, struct ADDRESULT* ptr_addresult); int updatejo(struct CLIENT_REQUEST* ptr_clrequest, struct ADDRESULT* ptr_addresult); struct CLIENT_REQUEST* new_client_request(void); struct CLIENT_REQUEST* dup_client_request(struct CLIENT_REQUEST* ptr_clrequest); int initialize_client_request(struct CLIENT_REQUEST* ptr_clrequest); int free_client_request(struct CLIENT_REQUEST* ptr_clrequest); int update_meta(dbi_conn conn, struct CLIENT_REQUEST* ptr_clrequest); int check_is_subseq(const char* author_concat, const char* table_name, int n_currpos, short int n_pubyear, dbi_conn conn); int daemonize(char* progname); int indent_notbelow_dbib(const char* name); int is_entry_dbib(const char* name); refdb-1.0.2/src/refstat.h000644 001750 001750 00000017014 12255427652 016067 0ustar00markusmarkus000000 000000 /* This definition is generated by statgen.pl. DO NOT modify this definition as all changes will be lost. Change statgen.pl instead */ struct refdb_status refstat[] = { {0, "000", "ok"}, {1, "001", "error"}, {100, "100", "void"}, {101, "101", "incorrect scramble string"}, {102, "102", "client and server protocols do not match"}, {103, "103", "invalid client request"}, {104, "104", "incomplete client command"}, {105, "105", "missing client command"}, {106, "106", "missing client command option"}, {107, "107", "unknown client command option"}, {108, "108", "could not descramble password"}, {109, "109", "timeout while reading"}, {110, "110", "timeout while writing"}, {111, "111", "missing client command argument"}, {112, "112", "client aborted command"}, {200, "200", "void"}, {201, "201", "main database is missing"}, {202, "202", "could not open main database"}, {203, "203", "main database is too old or corrupt"}, {204, "204", "could not open reference database"}, {205, "205", "could not connect to database server"}, {206, "206", "main database version is not supported"}, {207, "207", "could not create result from database query"}, {208, "208", "could not retrieve reference database metadata"}, {209, "209", "could not create reference database"}, {210, "210", "could not create reference database metadata"}, {211, "211", "create t_meta failed"}, {212, "212", "create t_refdb failed"}, {213, "213", "create t_author failed"}, {214, "214", "create t_keyword failed"}, {215, "215", "create t_periodical failed"}, {216, "216", "create t_note failed"}, {217, "217", "create t_user failed"}, {218, "218", "create t_xauthor failed"}, {219, "219", "create t_xkeyword failed"}, {220, "220", "create t_xuser failed"}, {221, "221", "create t_xnote failed"}, {222, "222", "could not create user group"}, {223, "223", "could not grant user permissions"}, {224, "224", "access control not supported"}, {225, "225", "not a RefDB database"}, {226, "226", "database does not exist"}, {227, "227", "begin transaction failed"}, {228, "228", "cannot lock tables"}, {229, "229", "failed to remove keyword"}, {230, "230", "failed to remove author"}, {231, "231", "failed to remove periodical"}, {232, "232", "failed to update main reference data"}, {233, "233", "inserting reference data failed"}, {234, "234", "select failed"}, {235, "235", "database successfully created"}, {236, "236", "assume localhost as host"}, {237, "237", "grant user permissions successful"}, {238, "238", "revoke user permissions successful"}, {239, "239", "could not revoke user permissions"}, {240, "240", "switched to database"}, {241, "241", "failed to access style data"}, {242, "242", "create temporary table failed"}, {243, "243", "delete temporary table failed"}, {244, "244", "incomplete reference data"}, {245, "245", "failed to remove note xlink"}, {246, "246", "failed to delete main note data"}, {247, "247", "failed to remove user"}, {248, "248", "failed to delete main reference data"}, {249, "249", "failed to delete database"}, {250, "250", "could not delete user group"}, {251, "251", "database successfully deleted"}, {252, "252", "personal interest list is empty"}, {253, "253", "failed to detach dataset from user"}, {254, "254", "sucessfully detached dataset from user"}, {255, "255", "failed to attach dataset to user"}, {256, "256", "sucessfully attached dataset to user"}, {257, "257", "create t_link failed"}, {258, "258", "create t_xlink failed"}, {259, "259", "failed to remove ulink"}, {260, "260", "failed to update journal names"}, {261, "261", "failed to create citation key"}, {262, "262", "failed to create personal list"}, {263, "263", "successfully created personal list"}, {264, "264", "failed to delete personal list"}, {265, "265", "successfully deleted personal list"}, {266, "266", "personal list not owned by current user"}, {267, "267", "personal list does not exist"}, {268, "268", "create t_temp_xdup failed"}, {269, "269", "style not found"}, {300, "300", "void"}, {301, "301", "missing argument"}, {302, "302", "unknown output format"}, {400, "400", "void"}, {401, "401", "no more data available"}, {402, "402", "finished transferring data"}, {403, "403", "chunk added successfully"}, {404, "404", "finished transferring dataset"}, {405, "405", "finished adding dataset"}, {406, "406", "citation key"}, {407, "407", "refused to overwrite dataset"}, {408, "408", "dataset added successfully"}, {409, "409", "numerical id ignored"}, {410, "410", "numerical id nonexistent"}, {411, "411", "citation key nonexistent"}, {412, "412", "ID and citation key missing"}, {413, "413", "dataset updated successfully"}, {414, "414", "failed to add dataset"}, {415, "415", "missing link target"}, {416, "416", "incorrect link type"}, {417, "417", "dataset not found"}, {418, "418", "link already exists"}, {419, "419", "dataset removed successfully"}, {420, "420", "failed to remove dataset"}, {421, "421", "link added successfully"}, {422, "422", "only owner can fiddle with dataset"}, {423, "423", "dataset is still in use"}, {424, "424", "dataset is already attached to user"}, {425, "425", "periodical name changed successfully"}, {426, "426", "reference type changed"}, {700, "700", "void"}, {701, "701", "failed to initialize character set conversion"}, {702, "702", "character set conversion failed"}, {703, "703", "remote administration disabled"}, {704, "704", "administration is not restricted"}, {705, "705", "administration not permitted"}, {706, "706", "administration permitted"}, {707, "707", "process ID"}, {708, "708", "application server stop submitted"}, {709, "709", "set server IP submitted"}, {710, "710", "set timeout submitted"}, {711, "711", "set logfile submitted"}, {712, "712", "set logdest submitted"}, {713, "713", "set loglevel submitted"}, {800, "800", "void"}, {801, "801", "out of memory"}, {802, "802", "failed to load cgi templates"}, {803, "803", "command partially processed, aborted after unrecoverable error"}, {804, "804", "suffix pool exhausted"}, {805, "805", "REFNUMBER formatting failed"}, {806, "806", "AUTHORLIST formatting failed"}, {807, "807", "EDITORLIST formatting failed"}, {808, "808", "SEDITORLIST formatting failed"}, {809, "809", "PUBDATE formatting failed"}, {810, "810", "PUBDATESEC formatting failed"}, {811, "811", "TITLE formatting failed"}, {812, "812", "BOOKTITLE formatting failed"}, {813, "813", "SERIESTITLE formatting failed"}, {814, "814", "JOURNALNAME formatting failed"}, {815, "815", "VOLUME formatting failed"}, {816, "816", "ISSUE formatting failed"}, {817, "817", "PAGES formatting failed"}, {818, "818", "PUBLISHER formatting failed"}, {819, "819", "PUBPLACE formatting failed"}, {820, "820", "SERIAL formatting failed"}, {821, "821", "ADDRESS formatting failed"}, {822, "822", "URL formatting failed"}, {823, "823", "USERDEF1 formatting failed"}, {824, "824", "USERDEF2 formatting failed"}, {825, "825", "USERDEF3 formatting failed"}, {826, "826", "USERDEF4 formatting failed"}, {827, "827", "USERDEF5 formatting failed"}, {828, "828", "MISC1 formatting failed"}, {829, "829", "MISC2 formatting failed"}, {830, "830", "MISC3 formatting failed"}, {831, "831", "LINK1 formatting failed"}, {832, "832", "LINK2 formatting failed"}, {833, "833", "LINK3 formatting failed"}, {834, "834", "LINK4 formatting failed"}, {835, "835", "ABSTRACT formatting failed"}, {836, "836", "NOTES formatting failed"}, {837, "837", "SEPARATOR formatting failed"}, {838, "838", "remote administration failed"}, {839, "839", "child->parent communication failure"}, {840, "840", "FIFO write error"}, {841, "841", "unknown command"}, {842, "842", "failed to load style"}, {999, "999", "summary"}, }; /* end statgen.pl-generated code */ refdb-1.0.2/src/svn_dist_version000644 001750 001750 00000000007 12303477603 017554 0ustar00markusmarkus000000 000000 780:781refdb-1.0.2/scripts/Makefile.in000644 001750 001750 00000055061 12303475767 017223 0ustar00markusmarkus000000 000000 # Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = scripts DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/./conf/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/./conf/mkinstalldirs CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(bindir)" SCRIPTS = $(bin_SCRIPTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BIB2RIS = @BIB2RIS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ ULLSPEC = @ULLSPEC@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bib2ris_LDADD = @bib2ris_LDADD@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ classpath_root = @classpath_root@ client1_mans = @client1_mans@ client_bins = @client_bins@ client_etc_distobjects = @client_etc_distobjects@ client_etc_objects = @client_etc_objects@ client_mans = @client_mans@ client_scripts = @client_scripts@ client_subdirs = @client_subdirs@ datadir = @datadir@ datarootdir = @datarootdir@ db_dir = @db_dir@ docbk_xsl = @docbk_xsl@ docbk_xsl_ns = @docbk_xsl_ns@ docdir = @docdir@ docs_subdirs = @docs_subdirs@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ log_dir = @log_dir@ main_db = @main_db@ man_subdirs = @man_subdirs@ mandir = @mandir@ mkdir_p = @mkdir_p@ mybatik = @mybatik@ mydtdformat = @mydtdformat@ mydtdparse = @mydtdparse@ myjade = @myjade@ myperl = @myperl@ mysgrep = @mysgrep@ myshell = @myshell@ mysvnversion = @mysvnversion@ mytidy = @mytidy@ myxmlcatalog = @myxmlcatalog@ myxsltproc = @myxsltproc@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psarg = @psarg@ psdir = @psdir@ refdba_LDADD = @refdba_LDADD@ refdbc_LDADD = @refdbc_LDADD@ refdbd_LDADD = @refdbd_LDADD@ sbindir = @sbindir@ server8_mans = @server8_mans@ server_bins = @server_bins@ server_etc_distobjects = @server_etc_distobjects@ server_etc_objects = @server_etc_objects@ server_mans = @server_mans@ server_scripts = @server_scripts@ server_subdirs = @server_subdirs@ sgml_decl = @sgml_decl@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ svnversioncommand = @svnversioncommand@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ tei_xsl = @tei_xsl@ tei_xsl_ns = @tei_xsl_ns@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ trang_cmd = @trang_cmd@ var_dir = @var_dir@ xml_decl = @xml_decl@ EXTRA_SCRIPTS = refdbjade runbib runbib-missing db2ris refdb-bug refdbxml refdbrtf marc2ris med2ris en2ris refdbsru refdb-sruserver refdbnd refdb_dos2unix refdbctl refdb-ms refdb-backup refdb-restore refdb-init bib2ris-utf8 refdb_latex2utf8txt rtfcitations refdb-pubmed bin_SCRIPTS = @server_scripts@ @client_scripts@ EXTRA_DIST = refdb.in refdbjade.in runbib.in runbib-missing db2ris.in refdb-bug.in refdbxml.in refdbrtf.in refdbctl.in refdb-upgrade.sql marc2ris.in med2ris.in en2ris.in refdbsru.in refdb-sruserver.in refdbnd.in vargen.pl libgen.pl statgen.pl xslns.pl refdb_dos2unix.in migrate_mysql_0.9.5 refdb.2.dump.mysql41.in refdb.2.dump.pgsql.in refdb.2.dump.sqlite.in refdb.3.dump.mysql41.in refdb.3.dump.pgsql.in refdb.3.dump.sqlite.in empty.2.dump.mysql41.in empty.2.dump.pgsql.in empty.2.dump.sqlite3.in refdb-ms dtdparseweave refdb-backup refdb-restore refdb-init.in bib2ris-utf8.in refdb_latex2utf8txt rtfcitations refdb-pubmed MOSTLYCLEANFILES = refdb refdbjade runbib db2ris refdbxml refdbrtf refdbctl refdb-bug refdbnd marc2ris med2ris en2ris refdbsru refdb-sruserver refdb_dos2unix refdb.2.dump.mysql41 refdb.2.dump.pgsql refdb.2.dump.sqlite refdb.3.dump.mysql41 refdb.3.dump.pgsql refdb.3.dump.sqlite empty.2.dump.mysql41 empty.2.dump.pgsql empty.2.dump.sqlite3 refdb-init bib2ris-utf8 sqlscripts = refdb.2.dump.mysql41 refdb.2.dump.pgsql refdb.2.dump.sqlite refdb.3.dump.mysql41 refdb.3.dump.pgsql refdb.3.dump.sqlite empty.2.dump.mysql41 empty.2.dump.pgsql empty.2.dump.sqlite3 utctimestamp = $(shell date -u "+%Y-%m-%d %H:%M:%S") all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu scripts/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu scripts/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binSCRIPTS: $(bin_SCRIPTS) @$(NORMAL_INSTALL) @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(bindir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(SCRIPTS) installdirs: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." @HAVESERVER_FALSE@install-data-local: clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binSCRIPTS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binSCRIPTS .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir dvi dvi-am html \ html-am info info-am install install-am install-binSCRIPTS \ install-data install-data-am install-data-local install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic pdf pdf-am ps ps-am tags-am uninstall \ uninstall-am uninstall-binSCRIPTS all: refdb refdb.2.dump.mysql41 refdb.2.dump.pgsql refdb.2.dump.sqlite refdb.3.dump.mysql41 refdb.3.dump.pgsql refdb.3.dump.sqlite empty.2.dump.mysql41 empty.2.dump.pgsql empty.2.dump.sqlite3 refdb-init bib2ris-utf8 refdb: refdb.in sed 's%%$(prefix)%' < $(srcdir)/refdb.in | \ sed 's%%$(program_prefix)%' | \ sed 's%%$(program_suffix)%' > refdb chmod a+x refdb refdbjade: refdbjade.in sed 's%%$(myjade)%' < $(srcdir)/refdbjade.in | \ sed 's%%$(pkgdatadir)/refdb.cat%' | \ sed 's%%$(myshell)%' | \ sed 's%%$(sysconfdir)/@PACKAGE@%' | \ sed 's%%$(sgml_decl)%' > refdbjade chmod a+x refdbjade runbib: runbib.in sed 's%%$(pkgdatadir)%g' < $(srcdir)/runbib.in | \ sed 's%%$(myjade)%' | \ sed 's%%$(myxsltproc)%' | \ sed 's%%$(sgml_decl)%' | \ sed 's%%$(myshell)%' | \ sed 's%%$(sysconfdir)/@PACKAGE@%' | \ sed 's%%$(program_prefix)%' | \ sed 's%%$(program_suffix)%' | \ sed 's%%$(xml_decl)%' > runbib chmod a+x runbib db2ris: db2ris.in sed 's%%$(pkgdatadir)%' < $(srcdir)/db2ris.in | \ sed 's%%$(myjade)%' | \ sed 's%%$(sysconfdir)/@PACKAGE@%' | \ sed 's%%$(sgml_decl)%' > db2ris chmod a+x db2ris refdbxml: refdbxml.in sed 's%%$(docbk_xsl)%g' < $(srcdir)/refdbxml.in | \ sed 's%%$(tei_xsl)%g' | \ sed 's%%$(docbk_xsl_ns)%g' | \ sed 's%%$(tei_xsl_ns)%g' | \ sed 's%%$(myshell)%' | \ sed 's%%$(sysconfdir)/@PACKAGE@%' | \ sed 's%%$(classpath_root)%' > refdbxml chmod a+x refdbxml refdbrtf: refdbrtf.in sed 's%%$(myshell)%' < $(srcdir)/refdbrtf.in | \ sed 's%%$(sysconfdir)/@PACKAGE@%' > refdbrtf chmod a+x refdbrtf refdbctl: refdbctl.in sed 's%%$(bindir)/$(program_prefix)refdbd$(program_suffix)%' < $(srcdir)/refdbctl.in | \ sed 's%%$(pkgdatadir)%' | \ sed 's%%$(myshell)%' | \ sed 's%%$(psarg)%' | \ sed 's%%$(sysconfdir)/@PACKAGE@%g' | \ sed 's%%$(var_dir)%' > refdbctl chmod a+x refdbctl refdb-init: refdb-init.in sed 's%/var/log%$(log_dir)%' < $(srcdir)/refdb-init.in | \ sed 's%/var/run%$(var_dir)%' | \ sed 's%%$(pkgdatadir)%' | \ sed 's%%$(db_dir)%' | \ sed 's%%$(myshell)%' | \ sed 's%%$(psarg)%' | \ sed 's%%$(prefix)%g' | \ sed 's%%$(program_prefix)%' | \ sed 's%%$(program_suffix)%' | \ sed 's%%$(sysconfdir)/@PACKAGE@%g' | \ sed 's%%$(var_dir)%' > refdb-init chmod a+x refdb-init refdb-bug: refdb-bug.in sed 's%%$(pkgdatadir)%' < $(srcdir)/refdb-bug.in | \ sed 's%%$(program_prefix)%' | \ sed 's%%$(program_suffix)%' | \ sed 's%%$(sysconfdir)/@PACKAGE@%' > refdb-bug chmod a+x refdb-bug refdbnd: refdbnd.in sed 's%%$(pkgdatadir)%' < $(srcdir)/refdbnd.in > refdbnd chmod a+x refdbnd refdb_dos2unix: refdb_dos2unix.in sed 's%%$(myshell)%' < $(srcdir)/refdb_dos2unix.in > refdb_dos2unix chmod a+x refdb_dos2unix bib2ris-utf8: bib2ris-utf8.in sed 's%%$(prefix)%g' < $(srcdir)/bib2ris-utf8.in | \ sed 's%%$(program_prefix)%g' | \ sed 's%%$(program_suffix)%g' > bib2ris-utf8 chmod a+x bib2ris-utf8 marc2ris: marc2ris.in sed 's%%$(sysconfdir)/@PACKAGE@%' < $(srcdir)/marc2ris.in | \ sed 's%%$(pkgdatadir)%' > marc2ris chmod a+x marc2ris med2ris: med2ris.in sed 's%%$(sysconfdir)/@PACKAGE@%' < $(srcdir)/med2ris.in | \ sed 's%%$(pkgdatadir)%' > med2ris chmod a+x med2ris en2ris: en2ris.in sed 's%%$(sysconfdir)/@PACKAGE@%' < $(srcdir)/en2ris.in > en2ris chmod a+x en2ris refdbsru: refdbsru.in sed 's%%$(sysconfdir)/@PACKAGE@%' < $(srcdir)/refdbsru.in > refdbsru chmod a+x refdbsru refdb-sruserver: refdb-sruserver.in sed 's%%$(pkgdatadir)%' < $(srcdir)/refdb-sruserver.in | \ sed 's%%$(sysconfdir)/@PACKAGE@%' > refdb-sruserver chmod a+x refdb-sruserver refdb.2.dump.mysql41: refdb.2.dump.mysql41.in sed 's%%@PACKAGE@%' < $(srcdir)/refdb.2.dump.mysql41.in |\ sed 's%%@VERSION@%' > refdb.2.dump.mysql41 refdb.2.dump.pgsql: refdb.2.dump.pgsql.in sed 's%%@PACKAGE@%' < $(srcdir)/refdb.2.dump.pgsql.in |\ sed 's%%@VERSION@%' > refdb.2.dump.pgsql refdb.2.dump.sqlite: refdb.2.dump.sqlite.in sed 's%%@PACKAGE@%' < $(srcdir)/refdb.2.dump.sqlite.in |\ sed 's%%@VERSION@%' |\ sed 's%CURRENT_TIMESTAMP%$(utctimestamp)%g' > refdb.2.dump.sqlite refdb.3.dump.mysql41: refdb.3.dump.mysql41.in sed 's%%@PACKAGE@%' < $(srcdir)/refdb.3.dump.mysql41.in |\ sed 's%%@VERSION@%' > refdb.3.dump.mysql41 refdb.3.dump.pgsql: refdb.3.dump.pgsql.in sed 's%%@PACKAGE@%' < $(srcdir)/refdb.3.dump.pgsql.in |\ sed 's%%@VERSION@%' > refdb.3.dump.pgsql refdb.3.dump.sqlite: refdb.3.dump.sqlite.in sed 's%%@PACKAGE@%' < $(srcdir)/refdb.3.dump.sqlite.in |\ sed 's%%@VERSION@%' |\ sed 's%CURRENT_TIMESTAMP%$(utctimestamp)%g' > refdb.3.dump.sqlite empty.2.dump.mysql41: empty.2.dump.mysql41.in sed 's%%@PACKAGE@%' < $(srcdir)/empty.2.dump.mysql41.in |\ sed 's%%@VERSION@%' > empty.2.dump.mysql41 empty.2.dump.pgsql: empty.2.dump.pgsql.in sed 's%%@PACKAGE@%' < $(srcdir)/empty.2.dump.pgsql.in |\ sed 's%%@VERSION@%' > empty.2.dump.pgsql empty.2.dump.sqlite3: empty.2.dump.sqlite3.in sed 's%%@PACKAGE@%' < $(srcdir)/empty.2.dump.sqlite3.in |\ sed 's%%@VERSION@%' |\ sed 's%CURRENT_TIMESTAMP%$(utctimestamp)%g' > empty.2.dump.sqlite3 @HAVESERVER_TRUE@install-data-local: @HAVESERVER_TRUE@ $(mkinstalldirs) $(DESTDIR)$(pkgdatadir)/sql @HAVESERVER_TRUE@ @for f in $(sqlscripts); do \ @HAVESERVER_TRUE@ $(INSTALL_DATA) $$f $(DESTDIR)$(pkgdatadir)/sql/$$f; \ @HAVESERVER_TRUE@ done # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: refdb-1.0.2/scripts/Makefile.am000644 001750 001750 00000017000 12034374244 017166 0ustar00markusmarkus000000 000000 ## Process this file with automake to produce Makefile.in EXTRA_SCRIPTS = refdbjade runbib runbib-missing db2ris refdb-bug refdbxml refdbrtf marc2ris med2ris en2ris refdbsru refdb-sruserver refdbnd refdb_dos2unix refdbctl refdb-ms refdb-backup refdb-restore refdb-init bib2ris-utf8 refdb_latex2utf8txt rtfcitations refdb-pubmed bin_SCRIPTS = @server_scripts@ @client_scripts@ EXTRA_DIST=refdb.in refdbjade.in runbib.in runbib-missing db2ris.in refdb-bug.in refdbxml.in refdbrtf.in refdbctl.in refdb-upgrade.sql marc2ris.in med2ris.in en2ris.in refdbsru.in refdb-sruserver.in refdbnd.in vargen.pl libgen.pl statgen.pl xslns.pl refdb_dos2unix.in migrate_mysql_0.9.5 refdb.2.dump.mysql41.in refdb.2.dump.pgsql.in refdb.2.dump.sqlite.in refdb.3.dump.mysql41.in refdb.3.dump.pgsql.in refdb.3.dump.sqlite.in empty.2.dump.mysql41.in empty.2.dump.pgsql.in empty.2.dump.sqlite3.in refdb-ms dtdparseweave refdb-backup refdb-restore refdb-init.in bib2ris-utf8.in refdb_latex2utf8txt rtfcitations refdb-pubmed MOSTLYCLEANFILES=refdb refdbjade runbib db2ris refdbxml refdbrtf refdbctl refdb-bug refdbnd marc2ris med2ris en2ris refdbsru refdb-sruserver refdb_dos2unix refdb.2.dump.mysql41 refdb.2.dump.pgsql refdb.2.dump.sqlite refdb.3.dump.mysql41 refdb.3.dump.pgsql refdb.3.dump.sqlite empty.2.dump.mysql41 empty.2.dump.pgsql empty.2.dump.sqlite3 refdb-init bib2ris-utf8 sqlscripts=refdb.2.dump.mysql41 refdb.2.dump.pgsql refdb.2.dump.sqlite refdb.3.dump.mysql41 refdb.3.dump.pgsql refdb.3.dump.sqlite empty.2.dump.mysql41 empty.2.dump.pgsql empty.2.dump.sqlite3 utctimestamp=$(shell date -u "+%Y-%m-%d %H:%M:%S") all: refdb refdb.2.dump.mysql41 refdb.2.dump.pgsql refdb.2.dump.sqlite refdb.3.dump.mysql41 refdb.3.dump.pgsql refdb.3.dump.sqlite empty.2.dump.mysql41 empty.2.dump.pgsql empty.2.dump.sqlite3 refdb-init bib2ris-utf8 refdb: refdb.in sed 's%%$(prefix)%' < $(srcdir)/refdb.in | \ sed 's%%$(program_prefix)%' | \ sed 's%%$(program_suffix)%' > refdb chmod a+x refdb refdbjade: refdbjade.in sed 's%%$(myjade)%' < $(srcdir)/refdbjade.in | \ sed 's%%$(pkgdatadir)/refdb.cat%' | \ sed 's%%$(myshell)%' | \ sed 's%%$(sysconfdir)/@PACKAGE@%' | \ sed 's%%$(sgml_decl)%' > refdbjade chmod a+x refdbjade runbib: runbib.in sed 's%%$(pkgdatadir)%g' < $(srcdir)/runbib.in | \ sed 's%%$(myjade)%' | \ sed 's%%$(myxsltproc)%' | \ sed 's%%$(sgml_decl)%' | \ sed 's%%$(myshell)%' | \ sed 's%%$(sysconfdir)/@PACKAGE@%' | \ sed 's%%$(program_prefix)%' | \ sed 's%%$(program_suffix)%' | \ sed 's%%$(xml_decl)%' > runbib chmod a+x runbib db2ris: db2ris.in sed 's%%$(pkgdatadir)%' < $(srcdir)/db2ris.in | \ sed 's%%$(myjade)%' | \ sed 's%%$(sysconfdir)/@PACKAGE@%' | \ sed 's%%$(sgml_decl)%' > db2ris chmod a+x db2ris refdbxml: refdbxml.in sed 's%%$(docbk_xsl)%g' < $(srcdir)/refdbxml.in | \ sed 's%%$(tei_xsl)%g' | \ sed 's%%$(docbk_xsl_ns)%g' | \ sed 's%%$(tei_xsl_ns)%g' | \ sed 's%%$(myshell)%' | \ sed 's%%$(sysconfdir)/@PACKAGE@%' | \ sed 's%%$(classpath_root)%' > refdbxml chmod a+x refdbxml refdbrtf: refdbrtf.in sed 's%%$(myshell)%' < $(srcdir)/refdbrtf.in | \ sed 's%%$(sysconfdir)/@PACKAGE@%' > refdbrtf chmod a+x refdbrtf refdbctl: refdbctl.in sed 's%%$(bindir)/$(program_prefix)refdbd$(program_suffix)%' < $(srcdir)/refdbctl.in | \ sed 's%%$(pkgdatadir)%' | \ sed 's%%$(myshell)%' | \ sed 's%%$(psarg)%' | \ sed 's%%$(sysconfdir)/@PACKAGE@%g' | \ sed 's%%$(var_dir)%' > refdbctl chmod a+x refdbctl refdb-init: refdb-init.in sed 's%/var/log%$(log_dir)%' < $(srcdir)/refdb-init.in | \ sed 's%/var/run%$(var_dir)%' | \ sed 's%%$(pkgdatadir)%' | \ sed 's%%$(db_dir)%' | \ sed 's%%$(myshell)%' | \ sed 's%%$(psarg)%' | \ sed 's%%$(prefix)%g' | \ sed 's%%$(program_prefix)%' | \ sed 's%%$(program_suffix)%' | \ sed 's%%$(sysconfdir)/@PACKAGE@%g' | \ sed 's%%$(var_dir)%' > refdb-init chmod a+x refdb-init refdb-bug: refdb-bug.in sed 's%%$(pkgdatadir)%' < $(srcdir)/refdb-bug.in | \ sed 's%%$(program_prefix)%' | \ sed 's%%$(program_suffix)%' | \ sed 's%%$(sysconfdir)/@PACKAGE@%' > refdb-bug chmod a+x refdb-bug refdbnd: refdbnd.in sed 's%%$(pkgdatadir)%' < $(srcdir)/refdbnd.in > refdbnd chmod a+x refdbnd refdb_dos2unix: refdb_dos2unix.in sed 's%%$(myshell)%' < $(srcdir)/refdb_dos2unix.in > refdb_dos2unix chmod a+x refdb_dos2unix bib2ris-utf8: bib2ris-utf8.in sed 's%%$(prefix)%g' < $(srcdir)/bib2ris-utf8.in | \ sed 's%%$(program_prefix)%g' | \ sed 's%%$(program_suffix)%g' > bib2ris-utf8 chmod a+x bib2ris-utf8 marc2ris: marc2ris.in sed 's%%$(sysconfdir)/@PACKAGE@%' < $(srcdir)/marc2ris.in | \ sed 's%%$(pkgdatadir)%' > marc2ris chmod a+x marc2ris med2ris: med2ris.in sed 's%%$(sysconfdir)/@PACKAGE@%' < $(srcdir)/med2ris.in | \ sed 's%%$(pkgdatadir)%' > med2ris chmod a+x med2ris en2ris: en2ris.in sed 's%%$(sysconfdir)/@PACKAGE@%' < $(srcdir)/en2ris.in > en2ris chmod a+x en2ris refdbsru: refdbsru.in sed 's%%$(sysconfdir)/@PACKAGE@%' < $(srcdir)/refdbsru.in > refdbsru chmod a+x refdbsru refdb-sruserver: refdb-sruserver.in sed 's%%$(pkgdatadir)%' < $(srcdir)/refdb-sruserver.in | \ sed 's%%$(sysconfdir)/@PACKAGE@%' > refdb-sruserver chmod a+x refdb-sruserver refdb.2.dump.mysql41: refdb.2.dump.mysql41.in sed 's%%@PACKAGE@%' < $(srcdir)/refdb.2.dump.mysql41.in |\ sed 's%%@VERSION@%' > refdb.2.dump.mysql41 refdb.2.dump.pgsql: refdb.2.dump.pgsql.in sed 's%%@PACKAGE@%' < $(srcdir)/refdb.2.dump.pgsql.in |\ sed 's%%@VERSION@%' > refdb.2.dump.pgsql refdb.2.dump.sqlite: refdb.2.dump.sqlite.in sed 's%%@PACKAGE@%' < $(srcdir)/refdb.2.dump.sqlite.in |\ sed 's%%@VERSION@%' |\ sed 's%CURRENT_TIMESTAMP%$(utctimestamp)%g' > refdb.2.dump.sqlite refdb.3.dump.mysql41: refdb.3.dump.mysql41.in sed 's%%@PACKAGE@%' < $(srcdir)/refdb.3.dump.mysql41.in |\ sed 's%%@VERSION@%' > refdb.3.dump.mysql41 refdb.3.dump.pgsql: refdb.3.dump.pgsql.in sed 's%%@PACKAGE@%' < $(srcdir)/refdb.3.dump.pgsql.in |\ sed 's%%@VERSION@%' > refdb.3.dump.pgsql refdb.3.dump.sqlite: refdb.3.dump.sqlite.in sed 's%%@PACKAGE@%' < $(srcdir)/refdb.3.dump.sqlite.in |\ sed 's%%@VERSION@%' |\ sed 's%CURRENT_TIMESTAMP%$(utctimestamp)%g' > refdb.3.dump.sqlite empty.2.dump.mysql41: empty.2.dump.mysql41.in sed 's%%@PACKAGE@%' < $(srcdir)/empty.2.dump.mysql41.in |\ sed 's%%@VERSION@%' > empty.2.dump.mysql41 empty.2.dump.pgsql: empty.2.dump.pgsql.in sed 's%%@PACKAGE@%' < $(srcdir)/empty.2.dump.pgsql.in |\ sed 's%%@VERSION@%' > empty.2.dump.pgsql empty.2.dump.sqlite3: empty.2.dump.sqlite3.in sed 's%%@PACKAGE@%' < $(srcdir)/empty.2.dump.sqlite3.in |\ sed 's%%@VERSION@%' |\ sed 's%CURRENT_TIMESTAMP%$(utctimestamp)%g' > empty.2.dump.sqlite3 if HAVESERVER install-data-local: $(mkinstalldirs) $(DESTDIR)$(pkgdatadir)/sql @for f in $(sqlscripts); do \ $(INSTALL_DATA) $$f $(DESTDIR)$(pkgdatadir)/sql/$$f; \ done endif refdb-1.0.2/scripts/refdb.in000644 001750 001750 00000005624 12255427435 016563 0ustar00markusmarkus000000 000000 #!/bin/sh # # refdb: Start the refdb bibliography tool application server # (for use as init.d or rc.d script) # # markus@mhoenicka.de 2001-7-22 # 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, see # ***********IMPORTANT************* # This file is configured for SysV-style systems (most Linux distributions and # a few commercial Unices). If you want to use the script on a BSD-style # system (Slackware, {Free|Net|Open}BSD and a few commercial Unices), these # two changes are recommended: # 1. Set the value of BSDSTYLE to "YES" a few lines below # 2. Rename the file to refdb.sh # ********************************* # the name of the application NAME=refdb # set some default path PATH=/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin # the full path to the binary that is to be started as a daemon DAEMON=/bin/refdbd # the full path to the script that actually starts and stops the application REFDBCTL=/bin/refdbctl # set to 'YES' if the OS uses a BSD-style daemon startup system (this is # true for BSD-UNIX and Unices derived thereof, as well as for the # Slackware Linux distribution). This setting does not perform any black # magic, but it makes the screen messages at startup match the OS style BSDSTYLE=NO # don't get interrupted trap "" 1 # see whether all ingredients are available test -f $DAEMON || exit 1 test -f $REFDBCTL || exit 1 # now run the specified command case "$1" in start) if [ $BSDSTYLE = "YES" ]; then $REFDBCTL start > /dev/null && echo -n ' refdb' else echo "Starting bibliography tool application server: $NAME." $REFDBCTL start fi;; stop) if [ $BSDSTYLE = "YES" ]; then $REFDBCTL stop > /dev/null && echo -n ' refdb' else echo "Stopping bibliography tool application server: $NAME." $REFDBCTL stop fi;; restart) if [ $BSDSTYLE = "YES" ]; then $REFDBCTL restart > /dev/null && echo -n ' refdb' else echo "Restarting bibliography tool application server: $NAME." $REFDBCTL restart fi;; force-reload) if [ $BSDSTYLE = "YES" ]; then $REFDBCTL reload > /dev/null && echo -n ' refdb' else echo "Reloading bibliography tool application server: $NAME." $REFDBCTL reload fi;; *) echo "Usage: $(basename $0) {start|stop|restart|force-reload}" >&2 exit 1;; esac exit 0 refdb-1.0.2/scripts/refdbjade.in000644 001750 001750 00000021526 12255427435 017406 0ustar00markusmarkus000000 000000 #! # refdbjade - creates formatted output from a DocBook SGML source with # RefDB bibliography data # Markus Hoenicka 1999-09-02 # OPTIONS: -d (stylesheet) -h (invoke help), -i (variable), # -j (jade command-line arguments), -t (output format) # relies on these external programs: (open)jade, jadetex, pdfjadetex, dvips ### start user-customizable section # the Jade/OpenJade command myjade="" # the SGML declaration sgmldecl="" # the RefDB master catalog refdbcat="" ### end user-customizable section # some defaults outformat="tex" # this allows to include or ignore marked sections in the SGML file jadeincludearg="" # this allows to pass additional options to (open)jade jadeargs="" # this allows to set variable values on the (open)jade command line jadevariablearg="" # this is an optional prefix for output filenames prefix="" htmlprefixarg="" # the path of the global configuration file globalconfig="/refdbjaderc" # determine configuration files if [ ! -r "$globalconfig" ] && [ -n "$REFDBLIB" ]; then globalconfig=$REFDBLIB/refdbjaderc fi userconfig=$HOME/.refdbjaderc if [ -n "$globalconfig" ] && [ -r "$globalconfig" ]; then allconfigs=$globalconfig fi if [ -r "$userconfig" ]; then allconfigs=$allconfigs" "$userconfig fi # read the settings in the configure file(s) for config in $allconfigs; do while read refdbvar refdbval; do if [ -n "$refdbvar" ]; then if [ $refdbvar = jade_args ]; then jadeargs=$refdbval fi if [ $refdbvar = jade_includearg ]; then jadeincludearg=$jadeincludearg" -i "$refdbval fi if [ $refdbvar = jade_variable ]; then jadevariablearg=$jadevariablearg" -V "$refdbval fi if [ $refdbvar = outformat ]; then outformat=$refdbval fi fi done < $config done # read the command line options while getopts ":hI:j:p:s:t:v:" opt; do case $opt in h ) echo "creates formatted output from a DocBook SGML source with RefDB bibliography data" echo 'usage: refdbjade [-h] [-I name] [-j jade-args] [-p prefix] [-s stylesheet] [-t outformat] [-v variable[=value]] file1 [file2...]' echo "Options: -h print this help and exit" echo " -I set name of INCLUDE section in OpenJade" echo " -j additional command-line options for OpenJade" echo " -p use prefix for output filenames" echo " -s select stylesheet" echo " -t select the output format. Possible values are html," echo " rtf, dvi, pdf, ps, tex, tps, tpdf. Default is tex." echo " -v set variable to #t or to value for OpenJade" exit 0 ;; I ) jadeincludearg=$jadeincludearg" -i "$OPTARG;; j ) jadeargs=$OPTARG;; p ) prefix=$OPTARG;; s ) stylesheet=$OPTARG;; t ) outformat=$OPTARG;; v ) jadevariablearg=$jadevariablearg" -v "$OPTARG;; \? ) echo 'usage: refdbjade [-h] [-I name] [-j jade-args] [-p prefix] [-s stylesheet] [-t outformat] [-v variable[=value]] file1 [file2...]' echo 'type refdbjade -h to invoke help' exit 1;; esac done # correct the index so the filename argument is always $1 shift $(($OPTIND - 1)) # test for valid arguments if [ ! $outformat = html ] && [ ! $outformat = htmlr ] && [ ! $outformat = rtf ] && [ ! $outformat = dvi ] && [ ! $outformat = pdf ] && [ ! $outformat = ps ] && [ ! $outformat = tex ] && [ ! $outformat = tps ] && [ ! $outformat = tpdf ]; then echo "specify one of 'html', 'htmlr', 'rtf', 'dvi', 'pdf', 'ps', 'tex', 'tps', 'tpdf' with the -t option" exit 1 fi # assemble stylesheet invocation htmlsheet=$stylesheet\#html printsheet=$stylesheet\#print # Unfortunately TeX does not indicate with an appropriate return # value whether an additional run is necessary. To determine whether # we need an additional tex run, we can look at file.aux and compare # it to the previous run (we could also try to parse the output of tex # on stdout, but that does not seem to be easier). So we create a # backup of the existing file.aux (we create an empty file.aux if it # does not exist) by appending the process number to the filename. We # then run jadetex/pdfjadetex once which will create a new # file.aux. We compare this version with the previous version and run # jadetex until diff returns 0 indicating no differences. diff --brief # prevents that the differences are listed on the screen. Somewhat # kludgy, but it works. We might consider adding a counter to break # infinite loops. # loop over all filename arguments for filename in $*; do # on Win32-cygwin, the native Win32 TeX tools want the DOS path, and # the cygwin TeX tools accept this too case $(uname) in CYGWIN*) mypath=$(cygpath -w $filename);; *) mypath=$filename;; esac # extract the basename from the argument basename=${filename%.*} # extract basename w/o full path sbasename=${basename##*/} if [ -n "$prefix" ]; then # put the prefix in place outbasename=$prefix$sbasename htmloutarg="-V %html-prefix%="$prefix rtfoutarg="-o "$outbasename.rtf texoutarg="-o "$outbasename.tex pdfoutarg="-o "$outbasename.pdf # get the name only - output files will be generated in PWD myfile=$prefix${filename##*/} else htmloutarg="" rtfoutarg="-o "$sbasename.rtf texoutarg="-o "$sbasename.tex pdfoutarg="-o "$sbasename.pdf # get the name only - output files will be generated in PWD myfile=${filename##*/} fi # the jade calls contain the -c option to make sure the stylesheets # are found even if the user was too lazy to set SGML_CATALOG_FILES case $outformat in html ) $myjade $jadeargs $jadevariablearg $htmloutarg $jadeincludearg -t sgml -c $refdbcat -d $htmlsheet $sgmldecl $mypath if [ $? -ne 0 ]; then exit 1 fi;; htmlr ) $myjade $jadeargs $jadevariablearg $htmloutarg $jadeincludearg -t sgml-raw -c $refdbcat -d $htmlsheet $sgmldecl $mypath if [ $? -ne 0 ]; then exit 1 fi;; rtf ) $myjade $jadeargs $jadevariablearg $rtfoutarg $jadeincludearg -t rtf -c $refdbcat -d $printsheet $sgmldecl $mypath if [ $? -ne 0 ]; then exit 1 fi;; dvi ) $myjade $jadeargs $jadevariablearg $texoutarg $jadeincludearg -t tex -V tex-backend -c $refdbcat -d $printsheet $sgmldecl $mypath if [ $? -ne 0 ]; then exit 1 fi if [ ! -e ${myfile%.*}.aux ]; then touch ${myfile%.*}.aux fi cp ${myfile%.*}.aux ${myfile%.*}.aux.$$ jadetex ${myfile%.*}.tex if [ $? -ne 0 ]; then exit 1 fi until diff --brief ${myfile%.*}.aux ${myfile%.*}.aux.$$; do cp ${myfile%.*}.aux ${myfile%.*}.aux.$$ jadetex ${myfile%.*}.tex done rm ${myfile%.*}.aux.$$;; pdf ) $myjade $jadeargs $jadevariablearg $texoutarg $jadeincludearg -t tex -V tex-backend -c $refdbcat -d $printsheet $sgmldecl $mypath if [ $? -ne 0 ]; then exit 1 fi if [ ! -e ${myfile%.*}.aux ]; then touch ${myfile%.*}.aux fi cp ${myfile%.*}.aux ${myfile%.*}.aux.$$ pdfjadetex ${myfile%.*}.tex if [ $? -ne 0 ]; then exit 1 fi until diff --brief ${myfile%.*}.aux ${myfile%.*}.aux.$$; do cp ${myfile%.*}.aux ${myfile%.*}.aux.$$ pdfjadetex ${myfile%.*}.tex done rm ${myfile%.*}.aux.$$;; ps ) $myjade $jadeargs $jadevariablearg $texoutarg $jadeincludearg -t tex -V tex-backend -c $refdbcat -d $printsheet $sgmldecl $mypath if [ $? -ne 0 ]; then exit 1 fi if [ ! -e ${myfile%.*}.aux ]; then touch ${myfile%.*}.aux fi cp ${myfile%.*}.aux ${myfile%.*}.aux.$$ jadetex ${myfile%.*}.tex if [ $? -ne 0 ]; then exit 1 fi until diff --brief ${myfile%.*}.aux ${myfile%.*}.aux.$$; do cp ${myfile%.*}.aux ${myfile%.*}.aux.$$ jadetex ${myfile%.*}.tex done rm ${myfile%.*}.aux.$$ dvips -o ${myfile%.*}.ps ${myfile%.*}.dvi if [ $? -ne 0 ]; then exit 1 fi;; tex ) $myjade $jadeargs $jadevariablearg $texoutarg $jadeincludearg -t tex -V tex-backend -c $refdbcat -d $printsheet $sgmldecl $mypath if [ $? -ne 0 ]; then exit 1 fi;; tps ) if [ ! -e ${myfile%.*}.aux ]; then touch ${myfile%.*}.aux fi cp ${myfile%.*}.aux ${myfile%.*}.aux.$$ jadetex ${myfile%.*}.tex if [ $? -ne 0 ]; then exit 1 fi until diff --brief ${myfile%.*}.aux ${myfile%.*}.aux.$$; do cp ${myfile%.*}.aux ${myfile%.*}.aux.$$ jadetex ${myfile%.*}.tex done rm ${myfile%.*}.aux.$$ dvips -o ${myfile%.*}.ps ${myfile%.*}.dvi if [ $? -ne 0 ]; then exit 1 fi;; tpdf ) if [ ! -e ${myfile%.*}.aux ]; then touch ${myfile%.*}.aux fi cp ${myfile%.*}.aux ${myfile%.*}.aux.$$ pdfjadetex ${myfile%.*}.tex if [ $? -ne 0 ]; then exit 1 fi until diff --brief ${myfile%.*}.aux ${myfile%.*}.aux.$$; do cp ${myfile%.*}.aux ${myfile%.*}.aux.$$ pdfjadetex ${myfile%.*}.tex done rm ${myfile%.*}.aux.$$;; esac done exit 0 refdb-1.0.2/scripts/runbib.in000644 001750 001750 00000061747 12255427435 016772 0ustar00markusmarkus000000 000000 #! # runbib - creates bibliography files from SGML/XML, LaTeX or RTF files # Markus Hoenicka 2001-05-10 # OPTIONS: -d (database) -h (invoke help), -S bibliography-style, # -t type (db31|db31x|db50x|teix|tei5x|bibtex|rtf) # relies on these external programs: (open)jade (db31) # xsltproc (db31x,db50x,teix,tei5x) # textutils (bibtex) # use the configuration file runbibrc to alter the settings ### start user-customizable section # the commands used to extract the IDs from the document sources myjade="" myxsltproc="" # the textutils commands mysort=sort myuniq=uniq # some refdb commands myrefdbib=refdbib myrtfcitations=rtfcitations myrefdbrtf=refdbrtf # the SGML and XML declarations sgmldecl="" xmldecl="" ### end user-customizable section # default stylesheets. Override them in runbibrc citlist="/dsssl/citations.dsl" makecss="/dsssl/makecss.dsl" citlistx="/xsl/citations.xsl" citlistxraw="/xsl/citationsraw.xsl" db2teix="/xsl/bibdb2tei.xsl" makecssx="/xsl/makecss.xsl" makecssxns="/xsl/makecss-ns.xsl" teihtml="/xsl/tei-refdb-xsl/tei-html/tei-refdb-html.xsl" teifo="/xsl/tei-refdb-xsl/tei-fo/tei-refdb-fo.xsl" tei5html="/xsl/tei-refdb-xsl/tei-html/tei-refdb-html-ns.xsl" tei5fo="/xsl/tei-refdb-xsl/tei-fo/tei-refdb-fo-ns.xsl" docbkhtml="/xsl/docbk-refdb-xsl/docbk-html/docbk-refdb-html.xsl" docbkxhtml="/xsl/docbk-refdb-xsl/docbk-xhtml/docbk-refdb-xhtml.xsl" docbkfo="/xsl/docbk-refdb-xsl/docbk-fo/docbk-refdb-fo.xsl" docbk5html="/xsl/docbk-refdb-xsl/docbk-html/docbk-refdb-html-ns.xsl" docbk5xhtml="/xsl/docbk-refdb-xsl/docbk-xhtml/docbk-refdb-xhtml-ns.xsl" docbk5fo="/xsl/docbk-refdb-xsl/docbk-fo/docbk-refdb-fo-ns.xsl" # some initialization databaseopt="" encodingopt="" outformat=db31 username="" useropt="" passwd="" passwdopt="" portarg="" skip_id="" startnumber="1" numopt="" cssfile="" raw="f" myfo="" myhtml="" myxhtml="" # this allows to include or ignore marked sections in the SGML file jadeincludearg="" # this allows to pass additional options to (open)jade jadeargs="" # this allows to pass additional options to xsltproc xsltprocargs="" # the server IP address is passed to refdbib iparg="" # functions fixdoctype () { # Arguments: $1: filename of a jade-generated xml file # # jade and openjade erroneously forget a space in the doctype line # this problem is *only* fixed in OpenJade 1.3.1, but this function # will not alter this version's correct output so it is safe to run it # unconditionally sed 's/\( $1.$$ if [ $? -ne 0 ]; then echo "error while post-processing id file" exit 1 fi mv $1.$$ $1 } manglexsl () { # Arguments: $1: filename of the refdbd-created driver file # $2: string denoting the document type (see outformats.h) # # refdbd sends us a generic xsl stylesheet. We need to create # one html stylesheet and one fo stylesheet by importing the proper # refdb xsl stylesheets. DocBook gets an additional xhtml stylesheet # we'll also create a CSS file for all (x)html output local basename=${1%.*} if [ $2 = "REFTEIX5" ] || [ $2 = "REFDOCBKX5" ]; then $myxsltproc $makecssxns $1 > $basename.css else $myxsltproc $makecssx $1 > $basename.css fi # todo: test whether $cssfile is an url if [ -n "$cssfile" ] && [ "$cssfile" != "$basename.css" ]; then # custom css file if [ $2 = "REFTEIX" ]; then if [ "X$myfo" != "X" ]; then teifo=$myfo fi if [ "X$myhtml" != "X" ]; then teihtml=$myhtml fi echo "sed 's&.*&& ; s&.*&& ; s&&$cssfile&' < $1 > $basename.html.xsl" | sh echo "sed 's&.*&& ; s&&&' < $1 > $basename.fo.xsl" | sh elif [ $2 = "REFTEIX5" ]; then if [ "X$myfo" != "X" ]; then tei5fo=$myfo fi if [ "X$myhtml" != "X" ]; then tei5html=$myhtml fi echo "sed 's&.*&& ; s&.*&& ; s&&$cssfile&' < $1 > $basename.html.xsl" | sh echo "sed 's&.*&& ; s&&&' < $1 > $basename.fo.xsl" | sh elif [ $2 = "REFDOCBKX" ]; then if [ "X$myfo" != "X" ]; then docbkfo=$myfo fi if [ "X$myhtml" != "X" ]; then docbkhtml=$myhtml fi if [ "X$myxhtml" != "X" ]; then docbkxhtml=$myxhtml fi echo "sed 's&.*&& ; s&.*&& ; s&&$cssfile&' < $1 > $basename.html.xsl" | sh echo "sed 's&.*&& ; s&.*&& ; s&&$cssfile&' < $1 > $basename.xhtml.xsl" | sh echo "sed 's&.*&& ; s&&&' < $1 > $basename.fo.xsl" | sh elif [ $2 = "REFDOCBKX5" ]; then if [ "X$myfo" != "X" ]; then docbk5fo=$myfo fi if [ "X$myhtml" != "X" ]; then docbk5html=$myhtml fi if [ "X$myxhtml" != "X" ]; then docbk5xhtml=$myxhtml fi echo "sed 's&.*&& ; s&.*&& ; s&&$cssfile&' < $1 > $basename.html.xsl" | sh echo "sed 's&.*&& ; s&.*&& ; s&&$cssfile&' < $1 > $basename.xhtml.xsl" | sh echo "sed 's&.*&& ; s&&&' < $1 > $basename.fo.xsl" | sh fi elif [ -s "$basename.css" ]; then # default css file if [ $2 = "REFTEIX" ]; then if [ "X$myfo" != "X" ]; then teifo=$myfo fi if [ "X$myhtml" != "X" ]; then teihtml=$myhtml fi echo "sed 's&.*&& ; s&.*&& ; s&&$basename.css&' < $1 > $basename.html.xsl" | sh echo "sed 's&.*&& ; s&&&' < $1 > $basename.fo.xsl" | sh elif [ $2 = "REFTEIX5" ]; then if [ "X$myfo" != "X" ]; then tei5fo=$myfo fi if [ "X$myhtml" != "X" ]; then tei5html=$myhtml fi echo "sed 's&.*&& ; s&.*&& ; s&&$basename.css&' < $1 > $basename.html.xsl" | sh echo "sed 's&.*&& ; s&&&' < $1 > $basename.fo.xsl" | sh elif [ $2 = "REFDOCBKX" ]; then if [ "X$myfo" != "X" ]; then docbkfo=$myfo fi if [ "X$myhtml" != "X" ]; then docbkhtml=$myhtml fi if [ "X$myxhtml" != "X" ]; then docbkxhtml=$myxhtml fi echo "sed 's&.*&& ; s&.*&& ; s&&$basename.css&' < $1 > $basename.html.xsl" | sh echo "sed 's&.*&& ; s&.*&& ; s&&$basename.css&' < $1 > $basename.xhtml.xsl" | sh echo "sed 's&.*&& ; s&&&' < $1 > $basename.fo.xsl" | sh elif [ $2 = "REFDOCBKX5" ]; then if [ "X$myfo" != "X" ]; then docbk5fo=$myfo fi if [ "X$myhtml" != "X" ]; then docbk5html=$myhtml fi if [ "X$myxhtml" != "X" ]; then docbk5xhtml=$myxhtml fi echo "sed 's&.*&& ; s&.*&& ; s&&$basename.css&' < $1 > $basename.html.xsl" | sh echo "sed 's&.*&& ; s&.*&& ; s&&$basename.css&' < $1 > $basename.xhtml.xsl" | sh echo "sed 's&.*&& ; s&&&' < $1 > $basename.fo.xsl" | sh fi else # no css file if [ $2 = "REFTEIX" ]; then if [ "X$myfo" != "X" ]; then teifo=$myfo fi if [ "X$myhtml" != "X" ]; then teihtml=$myhtml fi echo "sed 's&.*&& ; s&.*&& ; s&&&' < $1 > $basename.html.xsl" | sh echo "sed 's&.*&& ; s&&&' < $1 > $basename.fo.xsl" | sh elif [ $2 = "REFTEIX5" ]; then if [ "X$myfo" != "X" ]; then tei5fo=$myfo fi if [ "X$myhtml" != "X" ]; then tei5html=$myhtml fi echo "sed 's&.*&& ; s&.*&& ; s&&&' < $1 > $basename.html.xsl" | sh echo "sed 's&.*&& ; s&&&' < $1 > $basename.fo.xsl" | sh elif [ $2 = "REFDOCBK" ]; then if [ "X$myfo" != "X" ]; then docbkfo=$myfo fi if [ "X$myhtml" != "X" ]; then docbkhtml=$myhtml fi if [ "X$myxhtml" != "X" ]; then docbkxhtml=$myxhtml fi echo "sed 's&.*&& ; s&.*&& ; s&&&' < $1 > $basename.html.xsl" | sh echo "sed 's&.*&& ; s&.*&& ; s&&&' < $1 > $basename.xhtml.xsl" | sh echo "sed 's&.*&& ; s&&&' < $1 > $basename.fo.xsl" | sh elif [ $2 = "REFDOCBKX5" ]; then if [ "X$myfo" != "X" ]; then docbk5fo=$myfo fi if [ "X$myhtml" != "X" ]; then docbk5html=$myhtml fi if [ "X$myxhtml" != "X" ]; then docbk5xhtml=$myxhtml fi echo "sed 's&.*&& ; s&.*&& ; s&&&' < $1 > $basename.html.xsl" | sh echo "sed 's&.*&& ; s&.*&& ; s&&&' < $1 > $basename.xhtml.xsl" | sh echo "sed 's&.*&& ; s&&&' < $1 > $basename.fo.xsl" | sh fi fi rm $1 } mangledsssl () { # refdb sends us a dsssl stylesheet. We need to create # a CSS file for all (x)html output. We first send the driver file through # a dsssl script to isolate the html section (otherwise we'd get another # definition for each variable from the print section), then grep for the # definitions, and convert them to css local basename=${1%.*} $myjade -t sgml -d $makecss $1 | grep "(define refdb-" | sed 's/(define refdb-text-indent \(.*\))/p.BIBLIOMIXED {text-indent: \1;}/ ; s/(define refdb-start-indent \(.*\))/p.BIBLIOMIXED {margin-left: \1;}/ ; s/(define refdb-font-size \(.*\))/p.BIBLIOMIXED {font-size: \1;}/' > $basename.css if [ -n "$cssfile" ] && [ "$cssfile" != "$basename.css" ]; then echo "sed 's&(define %stylesheet% #f)&(define %stylesheet% \"$cssfile\")&' < $1 > $basename.dsl$$" | sh mv $basename.dsl$$ $basename.dsl elif [ -s "$basename.css" ]; then echo "sed 's&(define %stylesheet% #f)&(define %stylesheet% \"$basename.css\")&' < $1 > $basename.dsl$$" | sh mv $basename.dsl$$ $basename.dsl fi } # the path of the global configuration file globalconfig="/runbibrc" # determine configuration files if [ ! -r "$globalconfig" ] && [ -n "$REFDBLIB" ]; then globalconfig=$REFDBLIB/runbibrc fi userconfig=$HOME/.runbibrc if [ -n "$globalconfig" ] && [ -r "$globalconfig" ]; then allconfigs=$globalconfig fi if [ -r "$userconfig" ]; then allconfigs=$allconfigs" "$userconfig fi # read the settings in the configure file(s) for config in $allconfigs; do while read refdbvar refdbval; do if [ -n "$refdbvar" ]; then if [ $refdbvar = jade_args ]; then jadeargs=$refdbval fi if [ $refdbvar = jade_includearg ]; then jadeincludearg=$jadeincludearg" -i "$refdbval fi if [ $refdbvar = outformat ]; then outformat=$refdbval fi if [ $refdbvar = xsltproc_args ]; then xsltprocargs=$refdbval fi fi done < $config done # read the command line options while getopts ":a:b:c:d:E:G:hi:I:j:N:p:rsS:t:u:w:" opt; do case $opt in a ) myfo=$OPTARG;; b ) myhtml=$OPTARG;; c ) myxhtml=$OPTARG;; d ) databaseopt="-d "$OPTARG;; E ) encodingopt="-E "$OPTARG;; G ) cssfile=$OPTARG;; h ) echo "creates refdb bibliographies from SGML, XML, Latex, or RTF documents" echo 'usage: runbib [-a fo-driver] [-b html-driver] [-c xhtml-driver] [-d database] [-E encoding] [-G cssfile] [-h] [-i server-ip] [-I name] [-j jade-args] [-N number] [r] [s] [-S style] [-t type] [-u username] [-w password] file1 [file2...]' echo "Options: -a select custom fo driver file" echo " -b select custom html driver file" echo " -c select custom xhtml driver file" echo " -d select default database" echo " -E set output character encoding" echo " -G set the path or URL of a CSS file for (x)html output" echo " -h print this help and exit" echo " -i set server IP address" echo " -I set name of INCLUDE section in OpenJade" echo " -j additional command-line options for OpenJade" echo " -N set start of reference numbering" echo " -r create raw instead of cooked bibliography" echo " -s skip ID extraction (provide your own IDs)" echo " -S select bibliography style" echo " -t select output type (db31|db31x|db50x|teix|tei5x|bibtex|rtf)" echo " -u set username" echo " -w set password" exit 0 ;; i ) iparg=" -i "$OPTARG;; I ) jadeincludearg=$jadeincludearg" -i "$OPTARG;; j ) jadeargs=$OPTARG;; N ) startnumber=$OPTARG;; p ) portarg=" -p $OPTARG";; r ) raw="t";; s ) skip_id="t";; S ) style=$OPTARG;; t ) outformat=$OPTARG;; u ) username=$OPTARG;; w ) passwd=$OPTARG;; \? ) echo 'usage: runbib [-a fo-driver] [-b html-driver] [-c xhtml-driver] [-d database] [-E encoding] [-G cssfile] [-h] [-i server-ip] [-I name] [-j jade-args] [-N number] [-r] [s] [-S style] [-t type] [-u username] [-w password] file1 [file2...]' echo 'type runbib -h to invoke help' exit 1;; esac done # correct the index so the filename argument is always $1 shift $(($OPTIND - 1)) # check arguments if [ $outformat != "db31" ] && [ $outformat != "bibtex" ] && [ $outformat != "db31x" ] && [ $outformat != "teix" ] && [ $outformat != "db50x" ] && [ $outformat != "tei5x" ] && [ $outformat != "rtf" ]; then echo "invalid output type" exit 1 fi if [ -n "$username" ]; then useropt=" -u $username" fi if [ -n "$passwd" ]; then passwdopt=" -w $passwd" fi if [ -n "$startnumber" ]; then numopt=" -N $startnumber" fi for filename in $*; do # extract the basename from the argument basename=${filename%.*} ### DocBook SGML if [ $outformat = "db31" ]; then # create a dummy bibliography file to get rid of the error msg if [ ! -f "$basename.bib.sgml" ]; then touch $basename.bib.sgml fi if [ ! -n "$skip_id" ]; then # first we run (open)jade with the citations.dsl stylesheet # to extract a list of citations from the source document $myjade $jadeincludearg $jadeargs -t xml -d $citlist $sgmldecl $filename > $basename.id.xml # this command will return an error if the bibliography does # not exist yet. Therefore we can't test for an error condition # here #if [ $? -ne 0 ]; then #exit 1 #fi # due to a bug in both jade and openjade we need to doctor the # doctype line to get a well-formed document fixdoctype $basename.id.xml fi # then we run refdbib with the intermediate xml file to retrieve # the bibliography file and the style specification file $myrefdbib $databaseopt $encodingopt $useropt $passwdopt $numopt $portarg $iparg -S $style -D "." -t db31 $basename.id.xml > $basename.bib.sgml if [ $? -ne 0 ]; then # move the output to error files so we can use the script # in makefiles mv $basename.bib.sgml $basename.bib.sgml.err mv ${style%.}.dsl ${style%.}.dsl.err exit 1 fi # need to create the css file mangledsssl ${style%.}.dsl ### DocBook XML V4 elif [ $outformat = "db31x" ]; then # create a dummy bibliography file to get rid of the error msg if [ ! -f "$basename.bib.xml" ]; then touch $basename.bib.xml fi if [ ! -n "$skip_id" ]; then # extract IDs with xsltproc if [ $raw = "t" ]; then $myxsltproc --catalogs $citlistxraw $filename > $basename.id.xml else $myxsltproc --catalogs $citlistx $filename > $basename.id.xml fi fi if [ $raw = "t" ]; then $myrefdbib $databaseopt $encodingopt $useropt $passwdopt $numopt $portarg $iparg -r -t db31x $basename.id.xml > $basename.bib.xml if [ $? -ne 0 ]; then # move the output to error files so we can use the script # in makefiles mv $basename.bib.xml $basename.bib.xml.err exit 1 fi else # cooked bib including driver file $myrefdbib $databaseopt $encodingopt $useropt $passwdopt $numopt $portarg $iparg -S $style -D "." -t db31x $basename.id.xml > $basename.bib.xml if [ $? -ne 0 ]; then # move the output to error files so we can use the script # in makefiles mv $basename.bib.xml $basename.bib.xml.err mv ${style%.}.xsl ${style%.}.xsl.err exit 1 fi # need to create three (html/xhtml/fo) xsl stylesheets manglexsl ${style%.}.xsl "REFDOCBKX" fi ### DocBook XML V5 elif [ $outformat = "db50x" ]; then # create a dummy bibliography file to get rid of the error msg if [ ! -f "$basename.bib.xml" ]; then touch $basename.bib.xml fi if [ ! -n "$skip_id" ]; then # extract IDs with xsltproc if [ $raw = "t" ]; then $myxsltproc --catalogs $citlistxraw $filename > $basename.id.xml else $myxsltproc --catalogs $citlistx $filename > $basename.id.xml fi fi if [ $raw = "t" ]; then $myrefdbib $databaseopt $encodingopt $useropt $passwdopt $numopt $portarg $iparg -r -n d -t db50x $basename.id.xml > $basename.bib.xml if [ $? -ne 0 ]; then # move the output to error files so we can use the script # in makefiles mv $basename.bib.xml $basename.bib.xml.err exit 1 fi else # cooked bib including driver file $myrefdbib $databaseopt $encodingopt $useropt $passwdopt $numopt $portarg $iparg -S $style -D "." -n d -t db50x $basename.id.xml > $basename.bib.xml if [ $? -ne 0 ]; then # move the output to error files so we can use the script # in makefiles mv $basename.bib.xml $basename.bib.xml.err mv ${style%.}.xsl ${style%.}.xsl.err exit 1 fi # need to create three (html/xhtml/fo) xsl stylesheets manglexsl ${style%.}.xsl "REFDOCBKX5" fi ### TEI P4 XML elif [ $outformat = "teix" ]; then # same procedure as above, but for TEI P4 xml documents # create a dummy bibliography file to get rid of the error msg if [ ! -f "$basename.bib.xml" ]; then touch $basename.bib.xml fi if [ ! -n "$skip_id" ]; then # extract IDs with xsltproc if [ $raw = "t" ]; then $myxsltproc --catalogs $citlistxraw $filename > $basename.id.xml else $myxsltproc --catalogs $citlistx $filename > $basename.id.xml fi fi if [ $raw = "t" ]; then $myrefdbib $databaseopt $encodingopt $useropt $passwdopt $numopt $portarg $iparg -r -t teix $basename.id.xml > $basename.bib.xml if [ $? -ne 0 ]; then # move the output to error files so we can use the script # in makefiles mv $basename.bib.xml $basename.bib.xml.err exit 1 fi # the bibliography carries its own prolog, comment it out # sed 's/\(/ ; s/\(/' < $basename.bib.xml.$$ > $basename.bib.xml # rm $basename.bib.xml.$$ else # cooked bibliography including driver file $myrefdbib $databaseopt $encodingopt $useropt $passwdopt $numopt $portarg $iparg -S $style -D "." -t teix $basename.id.xml > $basename.bib.xml if [ $? -ne 0 ]; then # move the output to error files so we can use the script # in makefiles mv $basename.bib.xml $basename.bib.xml.err mv ${style%.}.xsl ${style%.}.xsl.err exit 1 fi # the bibliography is in DocBook notation, transform to TEI $myxsltproc --catalogs $db2teix $basename.bib.xml > $basename.bib.xml.$$ if [ $? -ne 0 ]; then mv $basename.bib.xml.$$ $basename.bib.xml.err mv ${style%.}.xsl ${style%.}.xsl.err exit 1 fi # the bibliography carries its own prolog, comment it out sed 's/\(/ ; s/\(/' < $basename.bib.xml.$$ > $basename.bib.xml rm $basename.bib.xml.$$ manglexsl ${style%.}.xsl "REFTEIX" fi ### TEI P5 XML elif [ $outformat = "tei5x" ]; then # same procedure as above, but for TEI P5 xml documents # create a dummy bibliography file to get rid of the error msg if [ ! -f "$basename.bib.xml" ]; then touch $basename.bib.xml fi if [ ! -n "$skip_id" ]; then # extract IDs with xsltproc if [ $raw = "t" ]; then $myxsltproc --catalogs $citlistxraw $filename > $basename.id.xml else $myxsltproc --catalogs $citlistx $filename > $basename.id.xml fi fi if [ $raw = "t" ]; then $myrefdbib $databaseopt $encodingopt $useropt $passwdopt $numopt $portarg $iparg -r -n tei -t tei5x $basename.id.xml > $basename.bib.xml if [ $? -ne 0 ]; then # move the output to error files so we can use the script # in makefiles mv $basename.bib.xml $basename.bib.xml.err exit 1 fi else # cooked bibliography including driver file $myrefdbib $databaseopt $encodingopt $useropt $passwdopt $numopt $portarg $iparg -S $style -D "." -n tei -t tei5x $basename.id.xml > $basename.bib.xml if [ $? -ne 0 ]; then # move the output to error files so we can use the script # in makefiles mv $basename.bib.xml $basename.bib.xml.err mv ${style%.}.xsl ${style%.}.xsl.err exit 1 fi manglexsl ${style%.}.xsl "REFTEIX5" fi ### BibTeX elif [ $outformat = "bibtex" ]; then if [ ! -r "$filename" ]; then filename=$filename.aux if [ ! -r "$filename" ]; then echo "cannot read input file" exit 1 fi fi $mysort $filename | $myuniq | $myrefdbib $databaseopt $encodingopt $useropt $passwdopt $portarg $iparg -S $style -t bibtex > $basename.bib if [ $? -ne 0 ]; then echo "No references retrieved from $filename" fi ### RTF else # RTF output if [ ! -n "$skip_id" ]; then # extract IDs with rtfcitations $myrtfcitations $filename > $basename.id.xml fi $myrefdbib $databaseopt $encodingopt $useropt $passwdopt $numopt $portarg $iparg -S $style -D "." -t rtf $basename.id.xml > $basename.bib.rtf if [ $? -ne 0 ]; then # move the output to error files so we can use the script # in makefiles mv $basename.bib.xml $basename.bib.xml.err mv ${style%.}.xsl ${style%.}.xsl.err exit 1 fi fi done exit 0 refdb-1.0.2/scripts/runbib-missing000755 001750 001750 00000005074 11535271222 020015 0ustar00markusmarkus000000 000000 #!/usr/bin/perl -w ## runbib-missing: checks for missing files after a runbib run ## ## usage: (perl) runbib-missing -b basename ## usage: (perl) runbib-missing -f basename.bib.xml < basename.id.xml ## ## Dependencies: perl 5.0.0 or later ## Getopt::Std; ## ## markus@mhoenicka.de 2011-03-07 ## 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 # use this module to read command line options use Getopt::Std; my @idlist; my $lastid = ""; my $bibfile; my $idfile; my $basename; # this hash will receive the command line options my %opts; getopts('b:f:h', \%opts); ## loop over all command line options while (($key, $value) = each %opts) { if ($key eq "b") { $basename = $value; $idfile = $basename . ".id.xml"; $bibfile = $basename . ".bib.xml"; } elsif ($key eq "f") { $bibfile = $value; } elsif ($key eq "h") { print("runbib-missing displays any ID values not found by runbib Usage: runbib-missing -b basename runbib-missing -f basename.bib.xml < basename.id.xml\n"); exit (0); } } unless (defined($bibfile)) { die "error: you must use -b to specify a bibliography file"; } if (defined($idfile)) { open IDFILE, $idfile or die "cannot access $idfile"; while () { chomp; if (//) { s%.*(.*).*%$1%; push(@idlist, $_); } } close IDFILE; } else { while (<>) { chomp; if (//) { s%.*(.*).*%$1%; push(@idlist, $_); } } } # to save time while processing large input files, check only unique # IDs. We emulate the unix sort|uniq pipe by sorting the array and # checking for the existence only if the ID differs from the previous # iteration @idlist = sort(@idlist); foreach my $id (@idlist) { if ($id ne $lastid) { # grep -c prints only the match count my $matches = `grep -c $id $bibfile`; if ($matches == 0) { print $id . "\n"; } $lastid = $id; } } exit (0); refdb-1.0.2/scripts/db2ris.in000644 001750 001750 00000011360 12255427435 016660 0ustar00markusmarkus000000 000000 #!/bin/sh # db2ris - converts DocBook BiblioEntry elements into RIS datasets # Markus Hoenicka 010927 # $Id: db2ris.in,v 1.4 2003/02/26 23:27:09 mhoenicka Exp $ # OPTIONS: -a (long firstnames) -h (invoke help) -o outfile -O outfile # -r (default reference type) # relies on these external programs: (open)jade sed # tries to use these environment variables: $REFDBLIB $HOME ### start user-customizable section # path to the db2ris stylesheet db2risdsssl="/dsssl/db2ris.dsl" # the Jade/OpenJade command. You should use OpenJade whenever possible. Jade # cannot read arbitrary variable values from the command line so you cannot # use configuration files or the -a and -r command line switches. To configure # this script for use with Jade, edit the initialization for authorlong # and defaultreftype accordingly myjade="" # the SGML declaration sgmldecl="" # the default destination for log output. 0 means stderr, 2 means # a custom log file defined in $logfile logdest=0 # the path of the custom log file. To use this, set $logdest to 2 logfile="/var/log/db2ris" # the path of the global configuration file globalconfig="" ### end user-customizable section # initialize variables outfile="" truncate='f' authorlong="" defaultreftype="" allconfigs="" globalconfig="" varstring="" # determine configuration files if [ ! -r "$globalconfig" ] && [ -n "$REFDBLIB" ]; then globalconfig=$REFDBLIB/db2risrc fi userconfig=$HOME/.db2risrc # first try the hidden file, then the plain file if [ ! -r "$userconfig" ]; then userconfig=$HOME/db2risrc fi if [ -n "$globalconfig" ] && [ -r "$globalconfig" ]; then allconfigs=$globalconfig fi if [ -r "$userconfig" ]; then allconfigs=$allconfigs" "$userconfig fi # read the settings in the configure file(s) for config in $allconfigs; do while read refdbvar refdbval; do if [ -n "$refdbvar" ]; then if [ $refdbvar = authorlong ]; then authorlong=$refdbval fi if [ $refdbvar = defaultreftype ]; then defaultreftype=$refdbval fi if [ $refdbvar = logdest ]; then logdest=$refdbval fi if [ $refdbvar = logfile ]; then logfile=$refdbval fi fi done < $config done # read the command line options while getopts ":ae:hL:o:O:r:" opt; do case $opt in a ) authorlong="t";; e ) logdest=$OPTARG;; h ) echo "converts DocBook BiblioEntry elements into RIS datasets" echo 'usage: db2ris [-a] [-e dest] [-h] [-L logfile] [-o outfile] [-O outfile] [-r type] file1 [file2...]' echo "Options: -a use long author firstnames" echo " -e log destination. 0 means stderr, 2 means custom file" echo " -h print this help and exit" echo " -L path of a custom log file" echo " -o send output to file" echo " -O append output to file" echo " -r set default reference type" exit 0 ;; L ) logfile=$OPTARG;; o ) outfile=$OPTARG truncate='t';; O ) outfile=$OPTARG;; r ) defaultreftype=$OPTARG;; \? ) echo 'usage: db2ris [-a] [-e dest] [-h] [-L logfile] [-o outfile] [-O outfile] [-r type] file1 [file2...]' echo 'type db2ris -h to invoke help' exit 1;; esac done # correct the index so the filename argument is always $1 shift $(($OPTIND - 1)) # assemble the OpenJade variable string if [ -n "$authorlong" ]; then varstring=" -V AUTHORLONG="$authorlong fi if [ -n "$defaultreftype" ]; then varstring=$varstring" -V DEFAULTREFTYPE="$defaultreftype fi # truncate the output file if requested. We cannot use the redirect and append # operators in the command below because the former would not make much sense # if several files are specified on the command line. The difference between # overwriting and appending in this script is that the output of all files is # appended to an empty file in the first case and to a possibly existing file # in the second case. if [ -n "$outfile" ] && [ $truncate = "t" ]; then # poor man's truncate(1) echo "" > $outfile fi for filename in $*; do if [ -n "$outfile" ]; then if [ $logdest = 2 ] && [ -n "$logfile" ]; then $myjade -t sgml -d $db2risdsssl $varstring $sgmldecl $filename 2>>$logfile | sed 'N;s%^>*\(.*\)$%%g' >> $outfile else $myjade -t sgml -d $db2risdsssl $varstring $sgmldecl $filename | sed 'N;s%^>*\(.*\)$%%g' >> $outfile fi else if [ $logdest = 2 ] && [ -n "$logfile" ]; then $myjade -t sgml -d $db2risdsssl $varstring $sgmldecl $filename 2>>$logfile | sed 'N;s%^>*\(.*\)$%%g' else $myjade -t sgml -d $db2risdsssl $varstring $sgmldecl $filename | sed 'N;s%^>*\(.*\)$%%g' fi fi done exit 0 refdb-1.0.2/scripts/refdb-bug.in000644 001750 001750 00000010740 12255427435 017331 0ustar00markusmarkus000000 000000 #!/bin/sh # refdb-bug - collects information about the RefDB installation and # writes a report in the file refdb-bug.txt in the current working directory # Markus Hoenicka 011114 # output goes to this file. This unflexible hardwired approach was chosen # deliberately to allow users to file a bug report without the foggiest # notion of Unix concepts like redirection. outfile="refdb-bug.tmp" reportfile="refdb-bug.txt" sysconfdir="" REFDBLIB="" # which which should we use? which which 2>&1 > /dev/null if [ $? = 1 ]; then mywhich="type -a" else mywhich="which" fi uname -a > $outfile echo "RefDB binaries and scripts in the path:" >> $outfile $mywhich refdbd 2>&1 >> $outfile $mywhich refdba 2>&1 >> $outfile $mywhich refdbc 2>&1 >> $outfile $mywhich refdbib 2>&1 >> $outfile $mywhich med2ris 2>&1 >> $outfile $mywhich marc2ris 2>&1 >> $outfile $mywhich bib2ris 2>&1 >> $outfile echo "and their version numbers:" >> $outfile refdbd -v 2>&1 | grep refdb | sed 's/^\(ref[^ ]* [^ ]*\) .*/\1/' >> $outfile refdba -v 2>&1 | grep refdb | sed 's/^\(ref[^ ]* [^ ]*\) .*/\1/' >> $outfile refdbc -v 2>&1 | grep refdb | sed 's/^\(ref[^ ]* [^ ]*\) .*/\1/' >> $outfile refdbib -v 2>&1 | grep refdb | sed 's/^\(ref[^ ]* [^ ]*\) .*/\1/' >> $outfile bib2ris -v 2>&1 | grep bib2ris | sed 's/^\(bib[^ ]* [^ ]*\) .*/\1/' >> $outfile echo "DSSSL engines in the path:" >> $outfile $mywhich jade 2>&1 >> $outfile $mywhich openjade 2>&1 >> $outfile echo "and their version numbers:" >> $outfile echo "test" | jade -v 2>&1 | grep version >> $outfile echo "test" | openjade -v 2>&1 | grep version >> $outfile echo >> $outfile echo "\$REFDBLIB is "$REFDBLIB >> $outfile echo "global refdbd config file:" >> $outfile cat $sysconfdir/refdbdrc | grep "^[^#]" >> $outfile 2>&1 echo >> $outfile echo "global refdba config file:" >> $outfile cat $sysconfdir/refdbarc | grep "^[^#]" >> $outfile 2>&1 echo >> $outfile echo "global refdbc config file:" >> $outfile cat $sysconfdir/refdbcrc | grep "^[^#]" >> $outfile 2>&1 echo >> $outfile echo "global refdbc config file (cgi):" >> $outfile cat $sysconfdir/refdbcgirc | grep "^[^#]" >> $outfile 2>&1 echo >> $outfile echo "global refdbib config file:" >> $outfile cat $sysconfdir/refdbibrc | grep "^[^#]" >> $outfile 2>&1 echo >> $outfile echo "global bib2ris config file:" >> $outfile cat $sysconfdir/bib2risrc | grep "^[^#]" >> $outfile 2>&1 echo >> $outfile echo "\$HOME is "$HOME >> $outfile echo "user refdba config file:" >> $outfile cat $HOME/refdbarc | grep "^[^#]" >> $outfile 2>&1 echo >> $outfile echo "user refdba config file (hidden):" >> $outfile cat $HOME/.refdbarc | grep "^[^#]" >> $outfile 2>&1 echo >> $outfile echo "user refdbc config file:" >> $outfile cat $HOME/refdbcrc | grep "^[^#]" >> $outfile 2>&1 echo >> $outfile echo "user refdbc config file (hidden):" >> $outfile cat $HOME/.refdbcrc | grep "^[^#]" >> $outfile 2>&1 echo >> $outfile echo "user refdbib config file:" >> $outfile cat $HOME/refdbibrc | grep "^[^#]" >> $outfile 2>&1 echo >> $outfile echo "user refdbib config file (hidden):" >> $outfile cat $HOME/.refdbibrc | grep "^[^#]" >> $outfile 2>&1 echo >> $outfile echo "user bib2ris config file:" >> $outfile cat $HOME/bib2risrc | grep "^[^#]" >> $outfile 2>&1 echo >> $outfile echo "user bib2ris config file (hidden):" >> $outfile cat $HOME/.bib2risrc | grep "^[^#]" >> $outfile 2>&1 echo "" echo "************************************************************" >&2 echo "WARNING: ./$reportfile might contain plain-text passwords" >&2 echo "Do you want me to protect these passwords from prying eyes?" >&2 echo "************************************************************" >&2 echo -n "[Y/n]" >&2 read STRIP if [ "$STRIP" = "n" ] || [ "$STRIP" = "N" ];then mv $outfile $reportfile else # the square brackets contain a space and a tab sed 's/^\(passwd[ ]*\).*/\1/' < $outfile > $reportfile && rm $outfile fi echo "************************************************************" >&2 echo "Output was written to ./$reportfile" >&2 echo "Please append this file to all bug reports" >&2 echo "************************************************************" >&2 refdb-1.0.2/scripts/refdbxml.in000644 001750 001750 00000031037 12255427435 017301 0ustar00markusmarkus000000 000000 #! # refdbxml - creates formatted output from XML documents # Markus Hoenicka 2001-10-10 # $Id: refdbxml.in,v 1.12.2.7 2006/04/08 21:30:21 mhoenicka Exp $ # OPTIONS: -s (stylesheet) -h (invoke help), -p (xslt processor), # -t (output format), -f (fo processor) # relies on these external programs: SUN JRE, tex, passivetex, xmltex, JFOR # at least one of: xerces/xalan, xp/xt, xsltproc, saxon # and at least one of: passivetex, fop, xep # use the refdbxmlrc configuration file to adapt this script to your needs ## initialise variables # location of the stock DocBook and TEI XSL stylesheets # DocBook V4 htmldb="/html/docbook.xsl" xhtmldb="/xhtml/docbook.xsl" fodb="/fo/docbook.xsl" # DocBook V5 htmldbns="/html/docbook.xsl" xhtmldbns="/xhtml/docbook.xsl" fodbns="/fo/docbook.xsl" # TEI P4 htmltei="/p4/html/tei.xsl" xhtmltei="/p4/html/tei.xsl" fotei="/p4/fo/tei.xsl" # TEI P5 htmlteins="/p5/html/tei.xsl" xhtmlteins="/p5/html/tei.xsl" foteins="/p5/fo/tei.xsl" # the default xslt processor: xalan, xt, saxon, saxon-xerces or xsltproc xslt_processor="xsltproc" # the default fo processor: passivetex, fop, jfor, or xep fo_processor="fop" # the path to the Java class repository. This option is DEPRECATED. Please # set xslt_classpath and fo_classpath in your refdbxmlrc config file instead # This assumes that all necessary .jar # files are in this directory. If this is not the case, adding a few symlinks # might be the simplest solution classpath_root="" # CLASSPATH settings for your xslt and fo processors xslt_classpath="" fo_classpath="" # FOP can accept a user configuration file parameter fop_config_file="" # FOP command. Usually a shell script provided by FOP fop_command="fop" # this option is required to find xep.sh which usually is not in your # PATH. Specify the directory containing xep.sh including the trailing # slash. Leave this option empty if xep.sh *is* in your PATH. xep_path="" # the path of the global configuration file globalconfig="/refdbxmlrc" # some defaults stylesheet="" outformat="html" # associate fo processors with their output format rtf_generators="fop jfor" pdf_generators="fop xep passivetex" # determine configuration files if [ ! -r "$globalconfig" ] && [ -n "$REFDBLIB" ]; then globalconfig=$REFDBLIB/refdbxmlrc fi userconfig=$HOME/.refdbxmlrc if [ -n "$globalconfig" ] && [ -r "$globalconfig" ]; then allconfigs=$globalconfig fi if [ -r "$userconfig" ]; then allconfigs=$allconfigs" "$userconfig fi # read the settings in the configure file(s) for config in $allconfigs; do while read refdbvar refdbval; do if [ -n "$refdbvar" ]; then if [ $refdbvar = xslt_processor ]; then xslt_processor=$refdbval fi if [ $refdbvar = xslt_classpath ]; then xslt_classpath=$refdbval fi if [ $refdbvar = fo_processor ]; then fo_processor=$refdbval fi if [ $refdbvar = fo_classpath ]; then fo_classpath=$refdbval fi if [ $refdbvar = stylesheet ]; then stylesheet=$refdbval fi if [ $refdbvar = outformat ]; then outformat=$refdbval fi if [ $refdbvar = fop_config_file ]; then fop_config_file="-c $refdbval" fi if [ $refdbvar = fop_command ]; then fop_command=$refdbval fi fi done < $config done # set processor launch commands for functions which follow # more maintainable (and less ugly -- check out saxon-xerces!) # note: saxon|saxon-xerces|xalan have command-line options for catalog # resolving case $xslt_processor in xalan ) xslt_launch="org.apache.xalan.xslt.Process -ENTITYRESOLVER org.apache.xml.resolver.tools.CatalogResolver -URIRESOLVER org.apache.xml.resolver.tools.CatalogResolver ";; xt ) xslt_launch="com.jclark.xsl.sax.Driver";; saxon ) xslt_launch="com.icl.saxon.StyleSheet -x org.apache.xml.resolver.tools.ResolvingXMLReader -y org.apache.xml.resolver.tools.ResolvingXMLReader -r org.apache.xml.resolver.tools.CatalogResolver -u";; saxon-xerces ) xslt_launch="-Djavax.xml.parsers.DocumentBuilderFactory=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl -Djavax.xml.parsers.SAXParserFactory=org.apache.xerces.jaxp.SAXParserFactoryImpl com.icl.saxon.StyleSheet -x org.apache.xml.resolver.tools.ResolvingXMLReader -y org.apache.xml.resolver.tools.ResolvingXMLReader -r org.apache.xml.resolver.tools.CatalogResolver -u";; xsltproc ) xslt_launch="xsltproc --xinclude";; esac ## function definitions # creates fo output from xml. Arguments: input_filename out_filename process_fo () { case $xslt_processor in xalan ) java -cp "$xslt_classpath" ${xslt_launch} $1 -xsl $jfosheet -out $2;; xt ) java -cp "$xslt_classpath" ${xslt_launch} $1 $jfosheet > $2;; saxon ) java -cp "$xslt_classpath" ${xslt_launch} -o $2 $1 $jfosheet;; saxon-xerces ) java -cp "$xslt_classpath" ${xslt_launch} -o $2 $1 $jfosheet;; xsltproc ) ${xslt_launch} $fosheet $1 > $2;; esac } # creates html output from xml. Arguments: input_filename out_filename process_html () { case $xslt_processor in xalan ) java -cp "$xslt_classpath" ${xslt_launch} -in $1 -xsl $jhtmlsheet -out $2;; xt ) java -cp "$xslt_classpath" ${xslt_launch} $1 $jhtmlsheet > $2;; saxon ) java -cp "$xslt_classpath" ${xslt_launch} -o $2 $1 $jhtmlsheet;; saxon-xerces ) java -cp "$xslt_classpath" ${xslt_launch} -o $2 $1 $jhtmlsheet;; xsltproc ) ${xslt_launch} $htmlsheet $1 > $2;; esac } # creates xhtml output from xml. Arguments: input_filename out_filename process_xhtml () { case $xslt_processor in xalan ) java -cp "$xslt_classpath" ${xslt_launch} -in $1 -xsl $jxhtmlsheet -out $2;; xt ) java -cp "$xslt_classpath" ${xslt_launch} $1 $jxhtmlsheet > $2;; saxon ) java -cp "$xslt_classpath" ${xslt_launch} -o $2 $1 $jxhtmlsheet;; saxon-xerces ) java -cp "$xslt_classpath" ${xslt_launch} -o $2 $1 $jxhtmlsheet;; xsltproc ) ${xslt_launch} $xhtmlsheet $1 > $2;; esac } # creates printable output (pdf|rtf) from fo. # Arguments: input_filename out_filename process_print () { case $outformat in rtf ) generators=$rtf_generators;; pdf ) generators=$pdf_generators;; esac processor_outformat_match=false for generator in $generators ; do [ "$generator" = "$fo_processor" ] && processor_outformat_match=true done if [ ${processor_outformat_match} = false ] ; then echo "Specified FO processor: $fo_processor." echo "Specified output format: $outformat." echo "Error: $fo_processor does not produce $outformat output." exit 1 fi case $fo_processor in jfor ) java -cp "$fo_classpath" ch.codeconsult.jfor.main.CmdLineConverter $1 $2;; passivetex ) if [ ! -e $basename.aux ]; then touch $basename.aux fi cp $basename.aux $basename.aux.$$ pdfxmltex $basename.fo if [ $? -ne 0 ]; then exit 1 fi # the following loop should be fixed to run not more # than a fixed number of iterations. until diff --brief $basename.aux $basename.aux.$$; do cp $basename.aux $basename.aux.$$ pdfxmltex $basename.fo done rm $basename.aux.$$;; fop ) $fop_command $fop_config_file -fo $1 -$outformat $2;; xep ) ${xep_path}xep.sh -fo $1 -pdf $2;; esac } # read the command line options while getopts ":hp:f:s:t:c:" opt; do case $opt in c ) fop_config_file="-c $OPTARG";; h ) echo "creates formatted output from a DocBook or TEI XML sources" echo 'usage: refdbxml [-c fop_config_file] [-f fo_processor ] [-h] [-p xslt_processor] [-s stylesheet] [-t outformat] file1 [file2...]' echo "Options: -c select the FOP configuration file" echo " -f specify fo processor: passivetex, fop or xep" echo " -h print this help and exit" echo " -p specify xslt processor: xalan, xt, saxon, or xsltproc" echo " -s stylesheet (the RefDB-generated driver file)" echo " -t select the output format. Possible values are html, xhtml, rtf, pdf." exit 0 ;; p ) xslt_processor=$OPTARG;; f ) fo_processor=$OPTARG;; s ) stylesheet=$OPTARG;; t ) outformat=$OPTARG;; \? ) echo 'usage: refdbxml [-c fop_config_file] [-h] [-p xslt_processor] [-f fo_processor] [-s stylesheet] [-t outformat] file1 [file2...]' echo 'type refdbxml -h to invoke help' exit 1;; esac done # correct the index so the filename argument is always $1 shift $(($OPTIND - 1)) # test for valid arguments if [ ! $outformat = html ] && [ ! $outformat = rtf ] && [ ! $outformat = pdf ] && [ ! $outformat = xhtml ]; then echo "specify one of 'html', 'xhtml', 'rtf', 'pdf' with the -t option" exit 1 fi # pick stylesheet; the values "db", "db5", "tei", and "tei5" use the stock # stylesheets without any RefDB extensions. To format a document using # RefDB bibliographies the RefDB-generated driver file must be specified here case $stylesheet in db ) htmlsheet=$htmldb xhtmlsheet=$xhtmldb fosheet=$fodb;; tei ) htmlsheet=$htmltei xhtmlsheet=$xhtmltei fosheet=$fotei;; db5 ) htmlsheet=$htmldbns xhtmlsheet=$xhtmldbns fosheet=$fodbns;; tei5 ) htmlsheet=$htmlteins xhtmlsheet=$xhtmlteins fosheet=$foteins;; * ) if [ $outformat = "html" ]; then htmlsheet=$stylesheet elif [ $outformat = "xhtml" ]; then xhtmlsheet=$stylesheet else fosheet=$stylesheet fi;; \? ) echo 'type refdbxml -h to invoke help' exit 1;; esac # test for valid xslt processor # default is xsltproc unless configured otherwise if [ ! $xslt_processor = "xalan" ] && [ ! $xslt_processor = "xt" ] && [ ! $xslt_processor = "xsltproc" ] && [ ! $xslt_processor = "saxon" ] && [ ! $xslt_processor = "saxon-xerces" ]; then echo "specify one of 'xalan', 'xt', 'saxon', 'saxon-xerces', 'xsltproc' with the -p option" exit 1; fi # test for valid fo processor # if none specified will be default (passivetex), which is legal if [ ! $fo_processor = "passivetex" ] && [ ! $fo_processor = "fop" ] && [ ! $fo_processor = "xep" ] && [ ! $fo_processor = "jfor" ]; then echo "specify one of 'passivetex', 'fop', 'xep', or 'jfor' with the -f option" exit 1; fi # if using fop and config file is specified, then check config file exists [ "$fo_processor" = "fop" ] && [ -n "$fop_config_file" ] && [ ! -r ${fop_config_file##-c } ] && echo "unable to access fop configuration file: ${fop_config_file##-c }" && fop_config_file="" # on Win32-cygwin, the native Win32 tools want the DOS path # the variables $jfosheet and jhtmlsheet will receive the appropriate paths if [ $OSTYPE = "cygwin" ]; then if [ ! "X$classpath_root" = "X" ]; then # get the full dos path of the classpath root osclasspath_root=$(cygpath -w $classpath_root) classpath="$osclasspath_root\avalon-framework.jar;$osclasspath_root\batik.jar;$osclasspath_root\fop.jar;$osclasspath_root\jfor.jar;$osclasspath_root\jimi-1.0.jar;$osclasspath_root\logkit.jar;$osclasspath_root\sax.jar;$osclasspath_root\xalan.jar;$osclasspath_root\xerces.jar;$osclasspath_root\xp.jar;$osclasspath_root\xt.jar;$osclasspath_root\resolver.jar" fi if [ ! "X$fosheet" = "X" ]; then jfosheet=$(cygpath -w $fosheet) fi if [ ! "X$htmlsheet" = "X" ]; then jhtmlsheet=$(cygpath -w $htmlsheet) fi if [ ! "X$xhtmlsheet" = "X" ]; then jxhtmlsheet=$(cygpath -w $xhtmlsheet) fi else classpath="$classpath_root/avalon-framework.jar:$classpath_root/batik.jar:$classpath_root/fop.jar:$classpath_root/jfor.jar:$classpath_root/jimi-1.0.jar:$classpath_root/logkit.jar:$classpath_root/sax.jar:$classpath_root/saxon.jar:$classpath_root/saxon-fop.jar:$classpath_root/saxon-jdom.jar:$classpath_root/xalan.jar:$classpath_root/xerces.jar:$classpath_root/xp.jar:$classpath_root/xt.jar:$classpath_root/resolver.jar" jfosheet=$fosheet jhtmlsheet=$htmlsheet jxhtmlsheet=$xhtmlsheet fi # Set classpath variables to default if not already specified if ! [ -n "$xslt_classpath" ]; then xslt_classpath=$classpath fi if ! [ -n "$fo_classpath" ]; then fo_classpath=$classpath fi # loop over all files on the command line for filename in $*; do if [ $OSTYPE = "cygwin" ]; then # get the full dos path of the file mypath=$(cygpath -w $filename) else mypath=$filename fi # extract the basename from the argument basename=${mypath%.*} case $outformat in rtf ) process_fo $mypath $basename.fo if [ $? -ne 0 ]; then exit 1 fi process_print $basename.fo $basename.rtf;; html) process_html $mypath $basename.html;; xhtml) process_xhtml $mypath $basename.xhtml;; pdf ) process_fo $mypath $basename.fo if [ $? -ne 0 ]; then exit 1 fi process_print $basename.fo $basename.pdf;; esac done exit 0 refdb-1.0.2/scripts/refdbrtf.in000644 001750 001750 00000013707 12255427435 017300 0ustar00markusmarkus000000 000000 #!/usr/local/bin/perl -w ## refdbrtf - combines a source RTF document and a bibliography file ## citations must be written as [[cit-Z]], multi-head citations as ## [[cit1-Z][cit2-Z]...], where cit, cit1, cit2 are citation keys from ## a RefDB database, and -Z is one of -X, -Q, -A, -S, and -Y, denoting ## the type of the citation ## usage: refdbrtf -b bibfile.rtf < source.rtf > combined.rtf ## markus@mhoenicka.de 2008-02-01 ## 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, see ## use this module to read command line options use Getopt::Std; my $bibfile; my $terminator = ""; my %opts; ## the switches are: ## -h: prints help getopts('b:h', \%opts); ## loop over all command line options while (($key, $value) = each %opts) { if ($key eq "b") { $bibfile = $value; } elsif ($key eq "h") { print "refdbrtf reads a RTF document from stdin and scans it for RefDB citations (such as \"[[Miller1999]]\" or \"[[Miller1999][Doe2001]]\"). These citations are replaced with crosslinks to appropriate entries in a bibliographic listing, which must be provided in RTF format using the -b option. The bibliography will be inserted in the document, and the combined document is written to stdout.\n"; exit(0); } } if (!defined($bibfile)) { print STDERR ("error: no bibliography file provided\n"); exit(1); } ## read the bib file and create a hash that keeps a display text handy ## for each linkend open BIBFILE, "<$bibfile" or die "error: could not open bibliography file\n"; my %displaytexts; while () { chomp; ## all in-text citation strings are hidden paragraphs. Extract a hash ## which associates the display texts with their linkends. Display ## texts may be undefined, e.g. in references w/o authors if (/^\\v/) { my $linkend = $_; my $displaytext = $_; $linkend =~ s/.*\\bkmkstart ([^-]+-.|IM\d+).*/$1/; $displaytext =~ s/.*\\bkmkstart[^\}]+\}(.*)\{\\\*\\bkmkend.*/$1/; $displaytexts{"$linkend"} = $displaytext; #print STDERR ("displaytext of linkend $linkend is $displaytext\n"); } } my %refs; ## counter for multiple references. RefDB uses a 1-based index my $multicounter = 1; ## read data from stdin while (<>) { # retain terminating }, if any, and emit it before the next loop # to allow inserting bib in front of the } which terminates the # document. The last bracket is discarded as the bib # file adds one anyway print $terminator; if (s/\}$//) { $terminator="}"; } else { $terminator=""; } ## split each line into tokens separated by citations. As the regular ## expression used in split() contains parentheses, the citations ## are returned too as members of the result array my @citations = split(/(\[\[.+?\]\])/); ## loop over all tokens and use only the citations for further processing foreach my $citation (@citations) { if ($citation =~ /\[\[.+\]\]/) { ## remove outer pair of square brackets $citation =~ s/^\[(.+)\]$/$1/; #print STDERR "citation went to >>" . $citation . "<<\n"; ## split into individual references my @xrefs = split(/\[/, $citation); ## remove leading empty item shift(@xrefs); #print "xrefs went to " . scalar @xrefs . "\n"; if (scalar @xrefs > 1) { ## multi-head reference. We have to find the bookmark name ## of the appropriate hidden entry in the bib file. my $im; $im = $multicounter++; $linkend = "IM$im"; $displaytext = $displaytexts{"$linkend"}; if (!defined($displaytext)) { $displaytext = ""; } #print STDERR ("displaytext of linkend $linkend is $displaytext\n"); ## reuse linkend $linkend = $xrefs[0]; $linkend =~ s/(.+)\]$/ID$1/; ## remove trailing square bracket and turn it in ## a RTF hyperlink print "\{\\field\{\\\*\\fldinst\{ HYPERLINK \\\\l \"$linkend\" \}\}\{\\fldrslt\{\\cf3\\ul $displaytext\}\}\}"; } else { ## single reference ## isolate the linkend and find the matching display text my $brief; $xref = $xrefs[0]; $linkend = $xref; $linkend =~ s/(.+)\]$/ID$1/; ## check for first or subsequent reference by removing the ## -Z specifier $brief = $linkend; $brief =~ s/(.+)-./$1/; if (exists($refs{"$brief"})) { ## fix any "out of order" references. Should be subsequent $linkend =~ s/(.+-)X/${1}S/; $linkend =~ s/(.+-)A/${1}Q/; } else { ## fix any "out of order" references. Should be first ## add the brief linkend to the hash $refs{"$brief"} = 1; $linkend =~ s/(.+-)Q/${1}A/; $linkend =~ s/(.+-)S/${1}X/; } $displaytext = $displaytexts{"$linkend"}; if (!defined($displaytext)) { $displaytext = ""; } #print STDERR ("displaytext of linkend $linkend is $displaytext\n"); ## remove trailing square bracket and turn it in ## a RTF hyperlink $xref =~ s/(.+)-.\]$/\{\\field\{\\\*\\fldinst\{ HYPERLINK \\\\l \"ID$1-b\" \}\}\{\\fldrslt\{\\cf3\\ul $displaytext\}\}\}/; print $xref; } } else { # pass through any text outside of a citation print $citation; } } } # read and insert bibliography file my $counter = 0; # reopen the file to get back to the start open BIBFILE, "<$bibfile" or die "error: could not open bibliography file\n"; while () { ## skip RTF header (first two lines in refdbib output) if ($counter > 1) { ## skip the hidden entries unless (/^\\v /) { print $_; } } $counter++; } ## the end exit 0; refdb-1.0.2/scripts/refdbctl.in000755 001750 001750 00000007734 12255427435 017275 0ustar00markusmarkus000000 000000 #! # # refdbctl: RefDB control script for starting, stopping, reconfiguring, and # restarting of refdbd # usage: refdbctl (start|stop|reload|restart) # markus@mhoenicka.de 2001-7-22 # 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, see # NB we must use bash for "cd -" to work # full path to the daemon binary REFDBD='' # default full path of the file the daemon writes its PID to PIDFILE='/refdbd.pid' # the path of the global refdbd configuration file globalconfig="/refdbdrc" if [ ! -r "$globalconfig" ] && [ -n "$REFDBLIB" ]; then globalconfig=$REFDBLIB/refdbdrc fi # read the settings in the configure file. We're only interested in # nonstandard PID file settings for config in $globalconfig; do while read refdbvar refdbval; do if [ -n "$refdbvar" ]; then if [ $refdbvar = pidfile ]; then PIDFILE=$refdbval fi fi done < $config done # default return value is 0 (all fine). Other values are: 1 (error), # 2 (nothing to do), 3 (unknown or missing command) RETVAL=0 # we need at least one argument (only the first one is used actually) ARGV="$@" if [ "x$ARGV" = "x" ] ; then ARGS="help" fi # find the saved process ID (strip leading and trailing junk) if [ -f $PIDFILE ]; then SAVEDPID=`cat $PIDFILE | sed 's/^ *\([0-9]*\).*/\1/'` else SAVEDPID=# fi # make sure the process with this ID is an instance of refdbd # NB run grep case-insensitive as some Windozes return uppercase process names PID=`ps | grep -i "^ *$SAVEDPID.*[r]efdbd" | sed 's/^ *\([0-9]*\).*/\1/'` # see whether the daemon is running if [ "x$PID" != "x" ] ; then RUNNING=1 else RUNNING=0 fi # in order to work around a sqlite bug on Windows/Cygwin, we have to # start the daemon from the root directory (this does not hurt in any way). # On Cygwin, the refdbdrc config file has to use the relative path starting # from / to the database directory. On other systems you can use either # the absolute or the relative path case $1 in start) if [ $RUNNING -eq 1 ]; then echo "$0 $1: $REFDBD already running (PID=$PID)" RETVAL=2 else cd / if $REFDBD ; then echo "$0 $1: bibliography tool application server started" else echo "$0 $1: bibliography tool application server could not be started" RETVAL=1 fi cd - fi;; stop) if [ $RUNNING -eq 0 ]; then echo "$0 $1: $REFDBD is not running" RETVAL=2 else if kill $PID ; then echo "$0 $1: bibliography tool application server stopped" else echo "$0 $1: bibliography tool application server could not be stopped" RETVAL=1 fi fi;; reload) if [ $RUNNING -eq 0 ]; then echo "$0 $1: $REFDBD is not running" RETVAL=2 else if kill -HUP $PID ; then echo "$0 $1: bibliography tool application server reconfigured" else echo "$0 $1: bibliography tool application server could not be reconfigured" RETVAL=1 fi fi;; restart) if [ $RUNNING -eq 0 ]; then echo "$0 $1: $REFDBD is not running" RETVAL=2 else if kill -TERM $PID ; then cd / if $REFDBD ; then echo "$0 $1: bibliography tool application server restarted" else echo "$0 $1: bibliography tool application server could not be restarted" RETVAL=1 fi cd - else echo "$0 $1: bibliography tool application server could not be stopped" RETVAL=1 fi fi;; *) echo "usage: $0 (start|stop|reload|restart)" RETVAL=3;; esac exit $RETVAL refdb-1.0.2/scripts/refdb-upgrade.sql000644 001750 001750 00000000177 11512721660 020367 0ustar00markusmarkus000000 000000 ALTER TABLE t_refdb ADD refdb_citekey VARCHAR(255); UPDATE IGNORE t_refdb SET refdb_citekey=CONCAT(refdb_id,'-',refdb_pubyear);refdb-1.0.2/scripts/marc2ris.in000644 001750 001750 00000102127 12255427435 017217 0ustar00markusmarkus000000 000000 #!/usr/bin/perl ## marc2ris: converts MARC21 and UNIMARC datasets to RIS format ## See comments below for compliance with other MARC dialects ## ## usage: perl marc2ris < infile.marc > outfile.ris ## ## Dependencies: perl 5.6.0 or later ## MARC::Record ## MARC::Charset ## RefDB::Log ## RefDB::Prefs ## ## markus@mhoenicka.de 2002-11-16 ## 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, see ## Some background about MARC as understood by this script ## The default input format used in this script is MARC21, which ## superseded USMARC and CANMARC. The specification can be found at: ## http://lcweb.loc.gov/marc/ ## UNIMARC follows the specification at: ## http://www.ifla.org/VI/3/p1996-1/sec-uni.htm ## UKMARC support is a bit shaky because there is no specification available ## for free. The wisdom used in this script was taken from a PDF document ## comparing UKMARC to MARC21 found at: ## www.bl.uk/services/bibliographic/marcchange.pdf ## we need a MARC::File::USMARC object use MARC::File::USMARC; ## use this for charset translations use MARC::Charset 'marc8_to_utf8'; ## the common RefDB modules use RefDB::Log; use RefDB::Prefs; ## use this module to read command line options use Getopt::Std; ## this is for the config file stuff my $prefs; ## the html fragments for the cgi output will go here my $refdblib = ""; my $cgi_head; my $cgi_foot; ## read config file settings my $confdir = ""; my $read_prefs = 1; my $next; ## look for -q and -y options foreach $arg (@ARGV) { # my $next; if ($next) { $confdir = $arg; $next = 0; } elsif ($arg eq "-y") { $next = 1; } elsif ($arg eq "-q") { $read_prefs = 0; } } ## read config files if ($read_prefs) { my $home = $ENV{'HOME'}; $prefs = RefDB::Prefs::->new("$confdir/marc2risrc", "$home/marc2risrc"); } ## if "t", switch on debug info my $marcprint = (defined($prefs->{"inlinedebug"})) ? $prefs->{"inlinedebug"} : "f"; ## name of the output file, if any. If undef, send data to stdout my $outfile = $prefs->{"outfile"}; ## if 0, overwrite; if 1, append my $append = (defined($prefs->{"outappend"})) ? $prefs->{"outappend"} : "f"; ## if 1, create unicode output my $uniout = (defined($prefs->{"uniout"})) ? $prefs->{"uniout"} : "t"; ## input type, default is MARC21 my $intype = (defined($prefs->{"type"})) ? $prefs->{"type"} : "marc21"; ## location of shared data ($refdblib was initialized previously) my $refdblib = (defined($prefs->{"refdblib"})) ? $prefs->{"refdblib"} : $refdblib; ## logging options my $logfile = (defined($prefs->{"logfile"})) ? $prefs->{"logfile"} : "/var/log/med2ris.log"; my $loglevel = (defined($prefs->{"loglevel"})) ? $prefs->{"loglevel"} : 6; my $logdest = (defined($prefs->{"logdest"})) ? $prefs->{"logdest"} : 2; ## 0 = stderr, 1 = syslog, 2 = file ## this hash will receive the command line options my %opts; ## the switches are: ## -h: prints help ## -i: switches on info ## -o/-O file: specifies output file for writing/appending ## -t: input type marc21, ukmarc or unimarc ## -u: create unicode output getopts('e:hil:L:o:O:qt:u:y:', \%opts); ## loop over all command line options while (($key, $value) = each %opts) { if ($key eq "e") { $logdest = $value; } elsif ($key eq "h") { print "marc2ris converts MARC datasets into RIS datasets\n"; print "Usage: [perl] marc2ris [-e dest] [-h] [-i] [-l loglevel] [-L logfile] [(-o|-O) outfile] [-q] [-y path] -t type -u {filename...}\n [perl] marc2ris [-e dest] [-h] [-i] [-l loglevel] [-L logfile] [(-o|-O) outfile] [-q] [-y path] -t type -u\nThe first invocation reads MARC datasets from the specified input files. The second invocation accepts MARC datasets at stdin. Output is sent to stdout unless one of the -o/-O options is used\nOptions: -e dest log destination (stderr|syslog|file)\n -h print this help and exit\n -i output MARC input data in addition to RIS\n -l loglevel set log level (0-7)\n -L logfile path of custom log file\n -o outfile send output to outfile (overwrite)\n -O outfile send output to outfile (append)\n -q ignore config file\n -t type type of input data: marc21, unimarc, ukmarc\n -u convert output to Unicode (t|f)\n -y path set custom config file path\n"; exit(0); } elsif ($key eq "i") { $marcprint = "t"; } elsif ($key eq "l") { $loglevel = $value; } elsif ($key eq "L") { $logfile = $value; } elsif ($key eq "o") { $outfile = $value; } elsif ($key eq "O") { $outfile = $value; $append = "t"; } elsif ($key eq "q") { ## do nothing, -q was used before getopts } elsif ($key eq "t") { $intype = $value; } elsif ($key eq "u") { if ($value eq "f") { $uniout = "f"; } else { $uniout = "t"; } } elsif ($key eq "y") { ## do nothing, -y was used before getopts } } ## post-process a few variables $logdest = RefDB::Log::num_logdest($logdest); $loglevel = RefDB::Log::num_loglevel($loglevel); if (defined($intype)) { $intype = lc($intype); if ($intype ne "unimarc" && $intype ne "ukmarc") { $type = "marc21"; } } else { $type = "marc21"; } # prepare stdout for UTF-8 data if ($uniout eq "t") { binmode(STDOUT, 'utf8'); } $marcprint = ($marcprint eq "t") ? $marcprint : undef; ## if we're supposed to write to an output file, try to open it if (length($outfile) > 0) { ## try to open the output file if ($append eq "t") { open OUT, ">> $outfile" or die "cannot open output file for appending: $outfile\n"; } else { open OUT, "> $outfile" or die "cannot open output file for overwriting: $outfile\n"; } ## make all print commands send output to this handle select OUT; } ## @ARGV has the remaining arguments if the user specified input ## files. Use stdin if there's no input file argument if (@ARGV == 0) { push @ARGV, "-"; } ## if 1, the input contains UTF-8 data my $utf = 0; ## set up logging my $log = RefDB::Log::->new($logdest, $loglevel, $logfile, "marc2ris.pl"); ## loop over all filename arguments foreach $arg (@ARGV) { $log->log_print("debug", "converting $arg"); my $file = MARC::File::USMARC->in($arg); ## if $file isn't defined we had trouble with the file if (not($file)) { $log->log_print("err", $MARC::File::ERROR); ## try the next file next; } ## loop over all MARC records in the current file while (my $record = $file->next()) { ## First we should check the character encoding. This may be ## MARC-8 or UTF-8. The former is indicated by a blank, the latter ## by 'a' at position 09 (zero-based) of the leader my $leader = $record->leader(); if ($intype eq "marc21") { if ($leader =~ /^.{9}a/) { print "---\nUTF-8 data\n" if $marcprint; $utf = 1; } else { print "---\nMARC-8 data\n" if $marcprint; } } ## else: other MARC formats do not specify the character encoding ## we assume it's *not* UTF-8 ## start RIS dataset &print_typetag($leader); ## retrieve all author fields and collect them in a list my @author_fields; if ($intype eq "unimarc") { ## Fields 700, 701, and 702 can contain author names @author_fields = ($record->field('700'), $record->field('701'), $record->field('702')); } else { ## marc21, ukmarc ## Field 100 sometimes carries main author ## Field(s) 700 carry added entries - personal names @author_fields = ($record->field('100'), $record->field('700')); } ## loop over all author fields foreach $field (@author_fields) { if (length($field)) { my $author = &get_author($field); print "AU - ",&charconv($author),"\n"; } } # ToDo: should we specify anonymous as author if we didn't find # one? or use one of the corporate/meeting names below? ## add corporate names or meeting names as editors ?? my @editor_fields; if ($intype eq "unimarc") { ## Fields 710, 711, and 712 can carry corporate names ## Field(s) 720, 721, 722, 730 have additional candidates @editor_fields = ($record->field('710'), $record->field('711'), $record->field('712'), $record->field('720'), $record->field('721'), $record->field('722'), $record->field('730')); } else { ## marc21, ukmarc ## Fields 110 and 111 carry the main entries - corporate name and ## meeting name, respectively ## Field(s) 710, 711 carry added entries - personal names @editor_fields = ($record->field('110'), $record->field('111'), $record->field('710'), $record->field('711')); } ## loop over all editor fields foreach $field (@editor_fields) { if (length($field)) { my $editor = &get_editor($field); print "ED - ",&charconv($editor),"\n"; } } ## get info from the title field if ($intype eq "unimarc") { &print_title($record->field('200')); } else { ## marc21, ukmarc &print_title($record->field('245')); } ## series title if ($intype eq "unimarc") { &print_stitle($record->field('225')); } else { ## marc21, ukmarc &print_stitle($record->field('210')); } ## ISBN/ISSN if ($intype eq "unimarc") { &print_isbn($record->field('010')); &print_issn($record->field('011')); } elsif ($intype eq "ukmarc") { &print_isbn($record->field('021')); ## this is just an assumption &print_issn($record->field('022')); } else { ## assume marc21 &print_isbn($record->field('020')); &print_issn($record->field('022')); } if ($intype eq "marc21") { &print_loc_callno($record->field('050')); &print_dewey($record->field('082')); } ## else: unimarc, ukmarc do not seem to store call numbers? ## publication info if ($intype eq "unimarc") { &print_pubinfo($record->field('210')); } else { ## marc21, ukmarc &print_pubinfo($record->field('260')); } ## 6XX fields contain KW candidates. We add all of them to a ## hash to eliminate duplicates my %kwpool; if ($intype eq "unimarc") { foreach ('600', '601', '602', '604', '605', '606','607', '608', '610', '615', '620', '660'. '661', '670', '675', '676', '680', '686') { &get_keywords(\%kwpool, "$_",$record->field($_)); } } elsif ($intype eq "ukmarc") { foreach ('600', '610', '611', '630', '650', '651','653', '655', '660', '661', '668', '690', '691', '692', '695') { &get_keywords(\%kwpool, "$_",$record->field($_)); } } else { ## assume marc21 foreach ('600', '610', '611', '630', '650', '651','653', '654', '655', '656', '657', '658') { &get_keywords(\%kwpool, "$_",$record->field($_)); } } ## print all keywords found in the hash. The value of each hash ## entry is the number of occurrences, but we're not really interested ## in that and rather print the key while (($key, $value) = each %kwpool) { print "KW - ", &charconv($key), "\n"; } ## 5XX have various candidates for notes and abstracts. We pool ## all notes-like stuff in one list. my @notepool; ## these fields have notes candidates if ($intype eq "unimarc") { foreach ('300', '301', '302', '303', '304', '305', '306', '307', '308', '310', '311', '312', '313', '314', '315', '316', '317', '318', '320', '321', '322', '323', '324', '325', '326', '327', '328', '332', '333', '336', '337', '345') { &pool_subx(\@notepool, $_, $record->field($_)); } } elsif ($intype eq "ukmarc") { foreach ('500', '501', '502', '503', '504', '505', '506', '508', '514', '515', '516', '521', '524', '525', '528', '530', '531', '532', '533', '534', '535', '537', '538', '540', '541', '542', '544', '554', '555', '556', '557', '561', '563', '580', '583', '584', '586') { &pool_subx(\@notepool, $_, $record->field($_)); } } else { ## assume marc21 foreach ('500', '501', '502', '504', '505', '506', '507', '508', '510', '511', '513', '514', '515', '516', '518', '521', '522', '524', '525', '526', '530', '533', '534', '535') { &pool_subx(\@notepool, $_, $record->field($_)); } } my $allnotes = join "; ", @notepool; if (length($allnotes) > 0) { print "N1 - ", &charconv($allnotes), "\n"; } ## 320/520 have the abstract if ($intype eq "unimarc") { &print_abstract($record->field('320')); } elsif ($intype eq "ukmarc") { &print_abstract($record->field('512'), $record->field('513')); } else { ## assume marc21 &print_abstract($record->field('520')); } ## end RIS dataset print "ER - \n"; } ## we're done so close the file $file->close(); } ## done processing all input $log->close(); ##******************************************************************** ## print_typetag(): prints the first line of a RIS dataset including ## the preceeding newline ## Argument: the leader of a MARC dataset ## Returns: the value at leader position 06 ##******************************************************************** sub print_typetag { ## the keys of typehash are the allowed values at position 06 ## of the leader of a MARC record, the values are the RIS types ## that might appropriately represent these types. my %ustypehash = ( "a" => "BOOK", "c" => "MUSIC", "d" => "MUSIC", "e" => "MAP", "f" => "MAP", "g" => "ADVS", "i" => "SOUND", "j" => "SOUND", "k" => "ART", "m" => "DATA", "o" => "GEN", "p" => "GEN", "r" => "ART", "t" => "GEN", ); my %unitypehash = ( "a" => "BOOK", "b" => "BOOK", "c" => "MUSIC", "d" => "MUSIC", "e" => "MAP", "f" => "MAP", "g" => "ADVS", "i" => "SOUND", "j" => "SOUND", "k" => "ART", "l" => "ELEC", "m" => "ADVS", "r" => "ART", ); ## The type of a MARC record is found at position 06 of the leader my $typeofrecord = substr("@_", 6, 1); ## ToDo: for books, field 008 positions 24-27 might have a few more ## hints my $typehash; ## the ukmarc here is just a guess if ($intype eq "marc21" || $intype eq "ukmarc") { $typehash = $ustypehash; } elsif ($intype eq "unimarc") { $typehash = $unitypehash; } else { ## assume MARC21 as default $typehash = $ustypehash; } if (!exists $typehash{$typeofrecord}) { print "\nTY - BOOK\n"; ## most reasonable default $log->log_print("note", "no type found - assume BOOK"); } else { print "\nTY - $typehash{$typeofrecord}\n"; } ## use $typeofrecord as the return value, just in case $typeofrecord; } ##******************************************************************** ## normalize_author(): normalizes an authorname ## Arguments: authorname subfield a ## authorname subfield b ## authorname subfield c ## name type if known: 0=direct order ## 1=only surname or full name in ## inverted order ## 3=family, clan, dynasty name ## Returns: the normalized authorname ##******************************************************************** sub normalize_author { my($rawauthora, $rawauthorb, $rawauthorc, $nametype) = @_; if ($nametype == 0) { # ToDo: convert every input to Last[,(F.|First)[ (M.|Middle)[,Suffix]]] $log->log_print("note", "name >>$rawauthora<< in direct order - leave as is"); return $rawauthora; } elsif ($nametype == 1) { ## start munging subfield a (the real name part) ## remove spaces after separators $rawauthora =~ s%([,.]+) *%$1%g; ## remove trailing separators after spaces $rawauthora =~ s% *[,;:/]*$%%; ## remove periods after a non-abbreviated name $rawauthora =~ s%(\w{2,})\.%$1%g; ## start munging subfield b (something like the suffix) ## remove trailing separators after spaces $rawauthorb =~ s% *[,;:/]*$%%; ## we currently ignore subfield c until someone complains if (length($rawauthorb) > 0) { return join ",", ($rawauthora, $rawauthorb); } else { return $rawauthora; } } elsif ($nametype == 3) { return $rawauthora; } } ##******************************************************************** ## get_author(): gets authorname info from MARC fields 100, 700 ## Argument: field (100 or 700) ## Returns: an author string in the format found in the record ##******************************************************************** sub get_author { my ($authorfield) = @_; my ($indicator); ## the sequence of the name parts is encoded either in indicator ## 1 (marc21) or 2 (unimarc) if ($intype eq "unimarc") { $indicator = 2; } else { ## assume marc21 $indicator = 1; } print ":Author(Ind$indicator): ", $authorfield->indicator("$indicator"),"\n" if $marcprint; print ":Author(\$a): ", $authorfield->subfield('a'),"\n" if $marcprint; print ":Author(\$b): ", $authorfield->subfield('b'),"\n" if $marcprint; print ":Author(\$c): ", $authorfield->subfield('c'),"\n" if $marcprint; print ":Author(\$h): ", $authorfield->subfield('h'),"\n" if $marcprint; if ($intype eq "ukmarc") { my $authorname = $authorfield->subfield('a') . "," . $authorfield->subfield('h'); normalize_author($authorname, $authorfield->subfield('b'), $authorfield->subfield('c'), $authorfield->indicator("$indicator")); } else { normalize_author($authorfield->subfield('a'), $authorfield->subfield('b'), $authorfield->subfield('c'), $authorfield->indicator("$indicator")); } } ##******************************************************************** ## get_editor(): gets editor info from MARC fields 110, 111, 710, 711 ## Argument: field (110, 111, 710, or 711) ## Returns: an author string in the format found in the record ##******************************************************************** sub get_editor { my ($editorfield) = @_; if ($editorfield == undef) { return undef; } else { print "Editor(\$a): ", $editorfield->subfield('a'),"\n" if $marcprint; print "Editor(\$b): ", $editorfield->subfield('b'),"\n" if $marcprint; print "editor(\$c): ", $editorfield->subfield('c'),"\n" if $marcprint; return $editorfield->subfield('a'); } } ##******************************************************************** ## print_title(): gets info from MARC field 245 ## Arguments: field (245) ## Returns: ##******************************************************************** sub print_title { my ($titlefield) = @_; if ($titlefield == undef) { print "empty title field (245)\n" if $marcprint; $log->log_print("info", "empty title field (245)"); @_; } else { print "Title(\$a): ",$titlefield->subfield('a'),"\n" if $marcprint; print "Title(\$b): ",$titlefield->subfield('b'),"\n" if $marcprint; print "Title(\$c): ",$titlefield->subfield('c'),"\n" if $marcprint; ## The title is usually written in a very odd notation. The title ## proper ($a) often ends with a space followed by a separator like ## a slash or a colon. The subtitle ($b) doesn't start with a space ## so simple concatenation looks odd. We have to conditionally remove ## the separator and make sure there's a space between title and ## subtitle my $clean_title = $titlefield->subfield('a'); my $clean_subtitle = $titlefield->subfield('b'); $clean_title =~ s% *[/:;.]$%%; $clean_subtitle =~ s%^ *(.*) *[/:;.]$%$1%; if (length($clean_title) > 0 || (length($clean_subtitle) > 0 && $intype ne "unimarc")) { print "TI - ", &charconv($clean_title); ## subfield $b is relevant only for marc21/ukmarc if (length($clean_subtitle) > 0 && $intype ne "unimarc") { print ": ",&charconv($clean_subtitle); } print "\n"; } ## The statement of responsibility is just this: horrors. There is ## no formal definition how authors, editors and the like should ## be written and designated. The field is free-form and resistant ## to all parsing efforts, so this information is lost on me } } ##******************************************************************** ## print_stitle(): prints info from series title field ## Arguments: field ## Returns: ##******************************************************************** sub print_stitle { my ($titlefield) = @_; if ($titlefield == undef) { print "empty series title field\n" if $marcprint; $log->log_print("info", "empty series title field"); @_; } else { print "Series title(\$a): ",$titlefield->subfield('a'),"\n" if $marcprint; my $clean_title = $titlefield->subfield('a'); $clean_title =~ s% *[/:;.]$%%; if (length($clean_title) > 0) { print "T2 - ", &charconv($clean_title); } if ($intype eq "unimarc") { print "Series vol(\$v): ",$titlefield->subfield('v'),"\n" if $marcprint; if (length($titlefield->subfield('v')) > 0) { print "VL - ", &charconv($titlefield->subfield('v')); } } } } ##******************************************************************** ## print_isbn(): gets info from MARC field 020 ## Arguments: field (020) ##******************************************************************** sub print_isbn { my($isbnfield) = @_; if ($isbnfield == undef ||length ($isbnfield->subfield('a')) == 0) { print "no isbn found (020\$a)\n" if $marcprint; $log->log_print("info", "no isbn found"); } else { if (length ($isbnfield->subfield('a')) < 10) { print "truncated isbn (020\$a)\n" if $marcprint; $log->log_print("warning", "truncated isbn"); } my $isbn = substr($isbnfield->subfield('a'), 0, 10); print "SN - ", &charconv($isbn), "\n"; } } ##******************************************************************** ## print_issn(): gets info from MARC field 022 ## Arguments: field (022) ##******************************************************************** sub print_issn { my($issnfield) = @_; if ($issnfield == undef ||length ($issnfield->subfield('a')) == 0) { print "no issn found (022\$a)\n" if $marcprint; $log->log_print("info", "no issn found"); } else { if (length ($issnfield->subfield('a')) < 9) { print "truncated issn (022\$a)\n" if $marcprint; $log->log_print("warning", "truncated issn"); } my $issn = substr($issnfield->subfield('a'), 0, 9); print "SN - ", &charconv($issn), "\n"; } } ##******************************************************************** ## print_loc_callno(): gets info from MARC field 050 ## Arguments: field (050) ##******************************************************************** sub print_loc_callno { my($callnofield) = @_; if ($callnofield == undef || length ($callnofield->subfield('a')) == 0) { print "no LOC call number found (050\$a)\n" if $marcprint; $log->log_print("info", "no LOC call number found"); } else { print "AV - ", &charconv($callnofield->subfield('a')), " ", &charconv($callnofield->subfield('b')), "\n"; } } ##******************************************************************** ## print_dewey(): gets info from MARC field 082 ## Arguments: field (082) ##******************************************************************** sub print_dewey { my($deweyfield) = @_; if ($deweyfield == undef || length ($deweyfield->subfield('a')) == 0) { print "no Dewey number found (082\$a)\n" if $marcprint; $log->log_print("info", "no Dewey number found"); } else { print "U1 - ", &charconv($deweyfield->subfield('a')), " ", &charconv($deweyfield->subfield('2')), "\n"; } } ##******************************************************************** ## print_pubinfo(): gets info from MARC field 260 ## Arguments: field (260) ##******************************************************************** sub print_pubinfo { my($pubinfofield) = @_; if ($pubinfofield == undef) { print "no publication information found (260)\n" if $marcprint; $log->log_print("info", "no publication information found"); } else { ## the following information is available in MARC21: ## $a place -> CY ## $b publisher -> PB ## $c date -> PY ## the corresponding subfields for UNIMARC: ## $a place -> CY ## $c publisher -> PB ## $d date -> PY ## all of them are repeatable. We pool all places into a ## comma-separated list in CY. We also pool all publishers ## into a comma-separated list in PB. We break the rule with ## the date field because this wouldn't make much sense. In ## this case, we use the first occurrence for PY, the second ## for Y2, and ignore the rest my @pubsubfields = $pubinfofield->subfields(); my @cities; my @publishers; my $pycounter = 0; my $pubsub_place; my $pubsub_publisher; my $pubsub_date; if ($intype eq "unimarc") { $pubsub_place = "a"; $pubsub_publisher = "c"; $pubsub_date = "d"; } else { ## assume marc21 $pubsub_place = "a"; $pubsub_publisher = "b"; $pubsub_date = "c"; } ## loop over all subfield list entries for my $tuple (@pubsubfields) { ## each tuple consists of the subfield code and the value if (@$tuple[0] eq $pubsub_place) { ## strip any trailing crap $_ = @$tuple[1]; s% *[,;:/]$%%; ## pool all occurrences in a list push (@cities, $_); } elsif (@$tuple[0] eq $pubsub_publisher) { ## strip any trailing crap $_ = @$tuple[1]; s% *[,;:/]$%%; ## pool all occurrences in a list push (@publishers, $_); } elsif (@$tuple[0] eq $pubsub_date) { ## the dates are free-form, so we want to extract ## a four-digit year and leave the rest as ## "other info" $protoyear = @$tuple[1]; print "Year (260\$c): $protoyear\n" if $marcprint; ## strip any separator chars at the end $protoyear =~ s% *[\.;:/]*$%%; ## isolate a four-digit year. We discard anything ## preceeding the year, but keep everything after ## the year as other info. $protoyear =~ s%\D*([0-9\-]{4})(.*)%$1///$2%; ## check what we've got. If there is no four-digit ## year, make it up. If digits are replaced by '-', ## replace those with 0s if (index($protoyear, "/") == 4) { ## have year info ## replace all '-' in the four-digit year ## by '0' substr($protoyear,0,4) =~ s!-!0!g; } else { ## have no year info print "no four-digit year found, use 0000\n" if $marcprint; $protoyear = "0000///$protoyear"; $log->log_print("warning", "no four-digit year found, use 0000"); } if ($pycounter == 0 && length($protoyear)) { print "PY - $protoyear\n"; } elsif ($pycounter == 1 && length($_)) { print "Y2 - $protoyear\n"; } ## else: discard } ## else: discard } ## now dump the collected CY and PB lists if (@cities > 0) { print "CY - ", &charconv(join(", ", @cities)), "\n"; } if (@publishers > 0) { print "PB - ", &charconv(join(", ", @publishers)), "\n"; } } } ##******************************************************************** ## get_keywords(): prints info from MARC fields 6XX ## Arguments: list of fields (6XX) ##******************************************************************** sub get_keywords { my($href, $fieldname, @keywords) = @_; ## a list of all possible subfields my @subfields = ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'x', 'y', 'z', '2', '3', '4'); ## loop over all 6XX fields foreach $kwfield (@keywords) { if ($kwfield != undef) { ## authornames get special treatment if ($fieldname eq "600") { my $val = normalize_author($kwfield->subfield('a'), $kwfield->subfield('b'), $kwfield->subfield('c'), $kwfield->indicator('1')); ${$href}{$val} += 1; print "Field $kwfield subfield a:", $kwfield->subfield('a'), "\nField $kwfield subfield b:", $kwfield->subfield('b'), "\nField $kwfield subfield c:", $kwfield->subfield('c'), "\n" if $marcprint; } else { ## retrieve all available subfields @kwsubfields = $kwfield->subfields(); ## loop over all available subfield tuples foreach $kwtuple (@kwsubfields) { ## loop over all subfields to check foreach $subfield (@subfields) { ## [0] contains subfield code if (@$kwtuple[0] eq $subfield) { ## [1] contains value, remove trailing separators @$kwtuple[1] =~ s% *[,;.:/]*$%%; if (length(@$kwtuple[1]) > 0) { ## add to hash ${$href}{@$kwtuple[1]} += 1; print "Field $fieldname subfield $subfield:", @$kwtuple[1], "\n" if $marcprint; } ## we can leave the subfields loop here last; } } } } } } } ##******************************************************************** ## pool_subx(): adds contents of several subfields to a list ## Arguments: reference to a list ## field name ## list of fields (5XX) ##******************************************************************** sub pool_subx { my($aref, $fieldname, @notefields) = @_; ## we use a list that contains the interesting subfields ## for each field # ToDo: this is apparently correct only for marc21 my @subfields; if ($fieldname eq "500") { @subfields = ('a'); } elsif ($fieldname eq "501") { @subfields = ('a'); } elsif ($fieldname eq "502") { @subfields = ('a'); } elsif ($fieldname eq "504") { @subfields = ('a', 'b'); } elsif ($fieldname eq "505") { @subfields = ('a', 'g', 'r', 't', 'u'); } elsif ($fieldname eq "506") { @subfields = ('a', 'b', 'c', 'd', 'e'); } elsif ($fieldname eq "507") { @subfields = ('a', 'b'); } elsif ($fieldname eq "508") { @subfields = ('a'); } elsif ($fieldname eq "510") { @subfields = ('a', 'b', 'c', 'x', '3'); } elsif ($fieldname eq "511") { @subfields = ('a'); } elsif ($fieldname eq "513") { @subfields = ('a', 'b'); } elsif ($fieldname eq "514") { @subfields = ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'm', 'u', 'z'); } elsif ($fieldname eq "515") { @subfields = ('a'); } elsif ($fieldname eq "516") { @subfields = ('a'); } elsif ($fieldname eq "518") { @subfields = ('a', '3'); } elsif ($fieldname eq "521") { @subfields = ('a', 'b', '3'); } elsif ($fieldname eq "522") { @subfields = ('a'); } elsif ($fieldname eq "524") { @subfields = ('a', '2', '3'); } elsif ($fieldname eq "525") { @subfields = ('a'); } elsif ($fieldname eq "526") { @subfields = ('a', 'b', 'c', 'd', 'i', 'x', 'z', '5'); } elsif ($fieldname eq "530") { @subfields = ('a', 'b', 'c', 'd', 'u', '3'); } elsif ($fieldname eq "533") { @subfields = ('a', 'b', 'c', 'd', 'e', 'f', 'm', 'n', '3'); } elsif ($fieldname eq "534") { @subfields = ('a', 'b', 'c', 'e', 'f', 'k', 'l', 'm', 'n', 'p', 't', 'x', 'z'); } elsif ($fieldname eq "535") { @subfields = ('a', 'b', 'c', 'd', 'g', '3'); } ## loop over all notefields foreach $notefield (@notefields) { if ($notefield != undef) { ## retrieve all available subfield tuples @notesubfields = $notefield->subfields(); ## loop over all subfield tuples foreach $notetuple (@notesubfields) { ## loop over all subfields to check foreach $subfield (@subfields) { ## [0] contains subfield code if (@$notetuple[0] eq $subfield) { ## [1] contains value, remove trailing separators print "field $fieldname subfield $subfield: ", @$notetuple[1], "\n" if $marcprint; @$notetuple[1] =~ s% *[,;.:/]*$%%; if (length(@$notetuple[1]) > 0) { ## add to list push @{$aref}, @$notetuple[1]; } last; } } } } } } ##******************************************************************** ## print_abstract(): prints abstract fields ## Arguments: list of fields (520) ##******************************************************************** sub print_abstract { # ToDo: take care of repeatable subfields my(@abfields) = @_; ## we check the following subfields my @subfields = ('a', 'b'); ## we generate a list for all useful strings my @abstrings; ## loop over all abfields foreach $abfield (@abfields) { foreach $field (@subfields) { if (length ($abfield->subfield($field)) > 0) { my $ab = $abfield->subfield($field); print "field 520 subfield $field: $ab\n" if $marcprint; ## strip trailing separators $ab =~ s% *[;,:./]*$%%; ## add string to the list push (@abstrings, $ab); } } } my $allabs = join "; ", @abstrings; if (length($allabs) > 0) { print "N2 - ", &charconv($allabs), "\n"; } } ##******************************************************************** ## charconv(): converts to a different charset based on a global var ## Arguments: string ## Returns: string ##******************************************************************** sub charconv { if ($utf) { ## return unaltered if already utf-8 return @_; } elsif ($uniout eq "t") { ## convert to utf-8 return marc8_to_utf8("@_"); } else { ## return unaltered if no utf-8 requested return @_; } } refdb-1.0.2/scripts/med2ris.in000644 001750 001750 00000053701 12255427435 017045 0ustar00markusmarkus000000 000000 #!/usr/bin/perl ## med2ris: converts Pubmed/Medline datasets to RIS format ## auto-detects tagged and XML data formats ## ## usage: perl med2ris < infile.med > outfile.ris ## ## Dependencies: perl 5.0.0 or later ## XML::Parser ## RefDB::Pubmed ## RefDB::CGI ## RefDB::Pref ## RefDB::Log ## Text::Iconv ## ## markus@mhoenicka.de 2002-12-02 ## 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, see ## define a lightweight class to hold the element info for XML data package Elinfo; sub new { my $class = shift; my $self = {}; ## the name of the element $self->{ELNAME} = undef; ## the character data contained in the element, if any $self->{ELVALUE} = undef; ## a list of attribute key/value pairs, if any $self->{ATTLIST} = []; bless $self, $class; return $self; } ## here the code proper starts package main; ## the interface module for expat, required to read Pubmed XML data use XML::Parser; ## the common RefDB modules use RefDB::CGI; use RefDB::Log; use RefDB::Prefs; ## the RefDB module for tagged Pubmed data use RefDB::Pubmed; ## use this module to read command line options use Getopt::Std; ## this one is for syslog (who'd have guessed) use Sys::Syslog; ## character encoding conversion use Text::Iconv; ## this is for the config file stuff my $prefs; ## whether or not we run as cgi my $is_cgi = 0; ## the html fragments for the cgi output will go here my $refdblib = ""; my $cgi_head; my $cgi_foot; ## read config file settings my $confdir = ""; my $read_prefs = 1; my $next; ## look for -q and -y options foreach $arg (@ARGV) { # my $next; if ($next) { $confdir = $arg; $next = 0; } elsif ($arg eq "-y") { $next = 1; } elsif ($arg eq "-q") { $read_prefs = 0; } } ## read config files if ($read_prefs) { if (RefDB::CGI::check_cgi("GET") == 0) { $prefs = RefDB::Prefs::->new("$confdir/med2riscgirc", undef); $is_cgi = 1; } else { my $home = $ENV{'HOME'}; $prefs = RefDB::Prefs::->new("$confdir/med2risrc", "$home/med2risrc"); } } #### variables to hold config options. Will be initialized by whatever #### was in the config files ## name of the output file, if any. If undef, send data to stdout my $outfile = $prefs->{"outfile"}; ## if f, overwrite; if t, append my $append = (defined($prefs->{"outappend"})) ? $prefs->{"outappend"} : "f"; ## type is either xml or tag my $type = $prefs->{"type"}; ## leave undef if no default type specified ## whether or not to print info about unknown/unused tags my $unmapped = (defined($prefs->{"unmapped"})) ? $prefs->{"unmapped"} : "f"; ## location of shared data ($refdblib was initialized previously) my $refdblib = (defined($prefs->{"refdblib"})) ? $prefs->{"refdblib"} : $refdblib; ## character encodings my $from_enc = (defined($prefs->{"from_enc"})) ? $prefs->{"from_enc"} : "ASCII"; my $to_enc = (defined($prefs->{"to_enc"})) ? $prefs->{"to_enc"} : "UTF-8"; ## logging options my $logfile = (defined($prefs->{"logfile"})) ? $prefs->{"logfile"} : "/var/log/med2ris.log"; my $loglevel = (defined($prefs->{"loglevel"})) ? $prefs->{"loglevel"} : 6; my $logdest = (defined($prefs->{"logdest"})) ? $prefs->{"logdest"} : 2; ## 0 = stderr, 1 = syslog, 2 = file ## this hash will receive the command line options my %opts; ## the switches are: ## -e dest: log destination ## -f enc: input data character encoding ## -h: prints help ## -i: print additional info about unused/unknown tags ## -l level: log level ## -L file: log file ## -o/-O file: specifies output file for writing/appending ## -q: ignore config file ## -t enc: output data character encoding ## -T type: override automatic type detection ## -y path: set confdir getopts('e:f:hil:L:o:O:qt:T:y:', \%opts); ## loop over all command line options while (($key, $value) = each %opts) { if ($key eq "e") { $logdest = $value; } elsif ($key eq "f") { $from_enc = $value; } elsif ($key eq "h") { print "med2ris converts tagged or XML Pubmed datasets into RIS datasets\n"; print "Usage: [perl] med2ris [-e dest] [-f enc] [-h] [-i] [-l level] [-L logfile] [(-o|-O) outfile] [-q] [-t enc] [-T type] [-y path] {filename...}\n [perl] med2ris [-h] [(-o|-O) outfile]\nThe first invocation reads Pubmed datasets from the specified input files. The second invocation accepts Pubmed datasets at stdin. Output is sent to stdout unless one of the -o/-O options is used\nOptions: -e dest log destination (stderr|syslog|file)\n -f enc set RIS input data character encoding\n -h print this help and exit\n -i print additional tag info\n -l loglevel set log level (0-7)\n -L logfile path of custom log file\n -o outfile send output to outfile (overwrite)\n -O outfile send output to outfile (append)\n -q ignore config file\n -t enc set output data character encoding\n -T type override automatic type detection (xml|tag)\n -y path set custom config file path\n"; exit(0); } elsif ($key eq "i") { $unmapped = "t"; } elsif ($key eq "l") { $loglevel = $value; } elsif ($key eq "L") { $logfile = $value; } elsif ($key eq "o") { $outfile = $value; } elsif ($key eq "O") { $outfile = $value; $append = t; } elsif ($key eq "q") { ## do nothing, -q was used before getopts } elsif ($key eq "t") { $to_enc = $value; } elsif ($key eq "T") { $type = ($value eq "tag") ? "tag" : "xml"; } elsif ($key eq "y") { ## do nothing, -y was used before getopts } } ## post-process a few variables $logdest = RefDB::Log::num_logdest($logdest); $loglevel = RefDB::Log::num_loglevel($loglevel); if (defined($type)) { $type = ($type eq "tag") ? $type : "xml"; } ## else: leave undefined ## if we're supposed to write to an output file, try to open it if (length($outfile) > 0 && $is_cgi == 0) { ## try to open the output file if ($append eq "t") { open OUT, ">>$outfile" or die "cannot open output file for appending: $outfile\n"; } else { open OUT, ">$outfile" or die "cannot open output file for overwriting: $outfile\n"; } ## make all print commands send output to this handle select OUT; } ## set up logging my $log = RefDB::Log::->new($logdest, $loglevel, $logfile, "med2ris"); ## we may have to deal with both tagged and XML data unless the type was ## specified on the command line. Load the parsers appropriately my $parser; my $pm; my $converter; if (!defined($type) || $type ne "tag") { ## initialize XML parser $parser = new XML::Parser(); $parser->setHandlers(Start => \&Start_handler, End => \&End_handler, Char => \&Char_handler, Default => \&Default_handler ); # expat always returns UTF-8 data $converter = Text::Iconv->new("UTF-8", $to_enc); } if (!defined($type) || $type ne "xml") { ## initialize tagged Pubmed parser $pm = new RefDB::Pubmed; $pm->set_encodings($from_enc, $to_enc); $pm->set_print_unmapped($unmapped); } ## @ARGV has the remaining arguments if the user specified input ## files. Use stdin if there's no input file argument if (@ARGV == 0) { push @ARGV, "-"; } ## we'll push/pop XML elements on/off this list as they arrive my @elstack; ## these hashes will receive the current values of pubdate, author, ## chemical, meshheading XML elements my %currpubdate; my %currauthor; my %currchemical; my %currmesh; ## this string will receive all RIS field except the TY field so the ## output can be dumped in the correct order my $alloutstring; ## this string will receive the TY field my $tystring; ## this string collects the abstract chunks. Around 2011, Pubmed ## started to use several elements for Background, ## Methods and so on my $n2string; ## this hash helps to convert month names to numbers my %monthnames = ( "Jan" => "01", "Feb" => "02", "Mar" => "03", "Apr" => "04", "May" => "05", "Jun" => "06", "Jul" => "07", "Aug" => "08", "Sep" => "09", "Oct" => "10", "Nov" => "11", "Dec" => "12"); ## CGI and regular usage require different data handling if ($is_cgi) { ## load html templates $cgi_head = RefDB::CGI::load_html("$refdblib/templates/refdbadd_head.html"); $cgi_foot = RefDB::CGI::load_html("$refdblib/templates/refdbadd_foot.html"); ## read CGI data into a string and split into name/value pairs read (STDIN, my $input_buffer, $ENV{'CONTENT_LENGTH'}); my @namevals = split /&/, $input_buffer; ## print content type and head template print "Content-type: text/html\n\n"; print $cgi_head; ## loop over all name/value pairs foreach $item (@namevals) { ## split name and value my ($name, $value) = split /=/, $item; ## some black magic to decode the POST data string $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; ## addref is the only data field of interest if ($name eq "addref") { if ($pm->string($value)) { ## apparently tagged data $log->log_print("debug", "converting tagged data (cgi)"); while ((my $set = $pm->next_pubmed_set())) { $set->parse_pmset(); $set->convert_pmset(); $set->dump_pmset_as_ris(); } } else { ## apparently XML data $log->log_print("debug", "converting XML data (cgi)"); $parser->parse($value); } } } ## print footer template print $cgi_foot; } else { ## not CGI ## loop over all filename arguments foreach $arg (@ARGV) { ## try to determine data type unless type was specified if (!defined($type)) { if (defined($pm->in($arg))) { ## apparently tagged data $log->log_print("debug", "converting tagged data in $arg"); while ((my $set = $pm->next_pubmed_set())) { $set->parse_pmset(); $set->convert_pmset(); $set->dump_pmset_as_ris(); } } else { ## apparently XML data $log->log_print("debug", "converting XML data in $arg"); $parser->parsefile($arg); } } elsif ($type eq "xml") { ## the parser calls our handlers whenever it encounters a start tag, ## character data, or an end tag. All data processing is done in ## these handlers $log->log_print("debug", "converting XML data in $arg"); $parser->parsefile($arg); } else { ## tagged data $log->log_print("debug", "converting tagged data in $arg"); $pm->in($arg); while ((my $set = $pm->next_pubmed_set())) { $set->parse_pmset(); $set->convert_pmset(); $set->dump_pmset_as_ris(); } } } ## end foreach } ## done processing all input $log->close(); ###################################################################### ## XML parser handlers ## ###################################################################### ##******************************************************************** ## Start_handler(): this handler is called once for each start tag and ## once for each empty element ## Arguments: pointer to "global" parser data (unused) ## element name ## list of attribute name/value pairs ## Return value is ignored ##******************************************************************** sub Start_handler { my($p, $el, @keyvals) = @_; my $numvals = @keyvals; ## create a new Elinfo object for the current element my $elinf = new Elinfo; ## fill in element name and attributes, if any $elinf->{ELNAME} = $el; @{$elinf->{KEYVALS}} = @keyvals; # push the new object on our stack push @elstack, $elinf; } ## end of Start_handler ##******************************************************************** ## End_handler(): this handler is called once for each end tag and ## once for each empty element ## Arguments: pointer to "global" parser data (unused) ## element name (unused) ## Return value is ignored ##******************************************************************** sub End_handler { my($p, $el) = @_; ## pop the current element off the stack my $currel = pop @elstack; my $elname = $currel->{ELNAME}; my $elvalue = $currel->{ELVALUE}; my $IdType = undef; # attribute of the ArticleId element my $N2Label = undef; # label of an extende abstract ## retrieve the attributes that make a difference while (my $key = shift(@{$currel->{KEYVALS}})) { my $val = shift(@{$currel->{KEYVALS}}); if ($key eq "IdType") { $IdType = $val; } elsif ($key eq "Label") { $n2label = $val . " "; } } ## check available element data and append an appropriate string ## to our pool strings if ($elname eq "ISSN" && length($elvalue) > 0) { $alloutstring .= "SN - $elvalue\n"; } elsif ($elname eq "ArticleId" && length($elvalue) > 0 && $IdType eq "doi") { $alloutstring .= "M3 - $elvalue\n"; } elsif ($elname eq "Volume" && length($elvalue) > 0) { $alloutstring .= "VL - $elvalue\n"; } elsif ($elname eq "Issue" && length($elvalue) > 0) { $alloutstring .= "IS - $elvalue\n"; } elsif ($elname eq "PubDate") { my $year = $currpubdate{"Year"}; ## the month is supplied as a three letter abbreviated name my $month = $monthnames{$currpubdate{"Month"}}; ## expand day to two digits my $day = $currpubdate{"Day"}; if (length($currpubdate{"Day"}) == 1) { $alloutstring .= "PY - $year/$month/0$day/\n"; } elsif (length($currpubdate{"Day"}) == 2) { $alloutstring .= "PY - $year/$month/$day/\n"; } else { $alloutstring .= "PY - $year/$month//\n"; } ## reset pool %currpubdate = (); } elsif ($elname eq "DateCreated" || $elname eq "DateCompleted" || $elname eq "DateRevised" || $elname eq "PubMedPubDate") { ## these dates are currently not evaluated. However, as they may contain year, month, and day elements, we have to reset the pool %currpubdate = (); } elsif ($elname eq "ArticleTitle" && length($elvalue) > 0) { $alloutstring .= "TI - $elvalue\n"; } elsif ($elname eq "MedlinePgn" && length($elvalue) > 0) { my $startpage = $elvalue; my $endpage = $elvalue; ## try to split the string into start and end page ## everything before a dash or the whole string if no dash ## is present goes into $startpage ## everything after a dash or the whole string if no dash ## is present goes into $endpage $startpage =~ s/-.*//; $endpage =~ s/.*-//; if (length($startpage) > 0) { $alloutstring .= "SP - $startpage\n"; } ## print endpage only if it differs from startpage if (length($endpage) > 0 && $startpage ne $endpage) { $alloutstring .= "EP - $endpage\n"; } } elsif ($elname eq "AbstractText" && length($elvalue) > 0) { if (length($n2string) > 0) { $n2string .= "$n2label" . "$elvalue\n"; } else { $n2string .= "N2 - $n2label" . "$elvalue\n"; } } elsif ($elname eq "Affiliation" && length($elvalue) > 0) { $alloutstring .= "AD - $elvalue\n"; } elsif ($elname eq "PersonalNameSubject") { ## reset the pool. We don't transform this element but currauthor ## contains the name parts anyway %currauthor = (); } elsif ($elname eq "Author") { my $firstname = $currauthor{"FirstName"}; my $forename = $currauthor{"ForeName"}; my $middlename = $currauthor{"MiddleName"}; my $lastname = $currauthor{"LastName"}; my $initials = $currauthor{"Initials"}; my $suffix = $currauthor{"Suffix"}; my $collectivename = $currauthor{"CollectiveName"}; my $rawname; if (defined ($collectivename)) { $rawname = $collectivename; } elsif (defined ($forename)) { ## append a period if the last char is an initial $forename =~ s%([A-Z])$%$1.%g; ## replace space following initial with period $forename =~ s%([A-Z]) +%$1.%g; $rawname = $lastname . "," . $forename . "," . $suffix; } elsif (length($middlename) > 0) { $rawname = $lastname . "," . $firstname . " " . $middlename . "," . $suffix; } else { $rawname = $lastname . "," . $firstname . "," . $suffix; } ## remove spaces after separators $rawname =~ s%([,.]+) *%$1%g; ## remove trailing separators after spaces $rawname =~ s% *[,;:/]*$%%; ## remove periods after a non-abbreviated name $rawname =~ s%(\w{2,})\.%$1%g; ## output the result $alloutstring .= "AU - $rawname\n"; ## reset the pool %currauthor = (); } elsif ($elname eq "PublicationType") { ## ToDo: this should be improved. We currently map everything ## to a journal article because RIS doesn't really give us ## much of a choice. The real type is encoded as a keyword $tystring = "\nTY - JOUR\n"; $alloutstring .= "KW - $elvalue\n"; } elsif ($elname eq "MedlineTA" && length($elvalue) > 0) { $alloutstring .= "JO - $elvalue\n"; } elsif ($elname eq "Chemical") { my $regnum = $currchemical{"RegistryNumber"}; my $chemname = $currchemical{"NameOfSubstance"}; if (length($regnum) > 0) { if (length($chemname) > 0) { $alloutstring .= "KW - $regnum ($chemname)\n"; } else { $alloutstring .= "KW - $regnum\n"; } } elsif (length($chemname) > 0) { $alloutstring .= "KW - $chemname\n"; } ## reset the pool %currchemical = (); } elsif ($elname eq "MeshHeading") { my $descr = $currmesh{"DescriptorName"}; my $qual = $currmesh{"QualifierName"}; ## the parser does funny things with entities like & so ## we have to fix the $qual string lest we get things like ## tyrosine [analogs][&][ derivatives] $qual =~ s/\]\[&\]\[/ &/g; ## we can safely assume that we'll never see a qualifier without ## descriptor if (length($qual) > 0) { ## now we split the qualifier string into single qualifiers my @tokens = split m%\[%, $qual; foreach $item (@tokens) { ## the first item will be whitespace, ignore $item =~ s/^\s//; if (length($item)> 0) { $alloutstring .= "KW - $descr [$item\n"; } } } elsif (length($descr) > 0) { $alloutstring .= "KW - $descr\n"; } ## reset the pool %currmesh = (); } elsif ($elname eq "PMID") { ## each Medline article has a PMID, but this element is also ## used to crosslink to corrections, comments and such. We ## only want the article's own PMID, so we have to peek at the ## top of the stack and make sure the current PMID element is ## a child of a MedlineCitation element my $currel = $elstack[-1]; my $currel_elname = $currel->{ELNAME}; if ($currel_elname eq "MedlineCitation") { $alloutstring .= "L2 - http://www.ncbi.nlm.nih.gov/pubmed/$elvalue\n"; } } elsif ($elname eq "PubmedArticle") { ## the article is done so dump all available information print $tystring,$alloutstring,$n2string,"ER - \n"; ## reset our pool strings $alloutstring = ""; $tystring = ""; $n2string = ""; $n2label = ""; } } ## end of End_handler ##******************************************************************** ## Char_handler(): this handler is called at least once for character ## data within an element ## Arguments: pointer to "global" parser data (unused) ## character data ## Return value is ignored ##******************************************************************** sub Char_handler { my($p, $string) = @_; ## remove trailing whitespace $string =~ s/\s*$//g; ## character encoding changes here $string = $converter->convert($string); ## set the value of the current top element of the stack. As the parser ## may legally provide the character data of one element in more than ## one call to this handler we have to append the current $string to ## whatever is already there my $currel = $elstack[-1]; $currel->{ELVALUE} = $currel->{ELVALUE} . $string; my $elname = $currel->{ELNAME}; ## some RIS fields are composed of several elements. We pool the ## data here and dump them as soon as the enclosing element ends if ($elname eq "Year" || $elname eq "Month" || $elname eq "Day") { $currpubdate{$elname} = $currel->{ELVALUE}; } elsif ($elname eq "MedlineDate") { ## apparently common in older citations, contains plain text date $currpubdate{"Year"} = $currel->{ELVALUE}; ## make no attempt to extract anything but a 4-digit year $currpubdate{"Year"} =~ s/.*(\d{4,}).*/$1/; $currpubdate{"Month"} = ""; $currpubdate{"Day"} = ""; } elsif ($elname eq "FirstName" || $elname eq "ForeName" || $elname eq "MiddleName" || $elname eq "LastName" || $elname eq "Suffix" || $elname eq "CollectiveName" || $elname eq "Initials") { $currauthor{$elname} .= $currel->{ELVALUE}; } elsif ($elname eq "RegistryNumber" || $elname eq "NameOfSubstance") { $currchemical{$elname} .= $currel->{ELVALUE}; } elsif ($elname eq "DescriptorName") { $currmesh{$elname} .= $currel->{ELVALUE}; } elsif ($elname eq "QualifierName") { ## using a list for the qualifiers would be more appropriate ## but the parser returns character entities as a separate ## char chunk. We have to concatenate the stuff to a string ## and fix the charent oddities later $currmesh{$elname} = $currmesh{$elname} . "[" . $string . "]"; } } ## end of Char_handler ##******************************************************************** ## Default_handler(): this handler is called for everything else ## Arguments: pointer to "global" parser data (unused) ## string ## Return value is ignored ##******************************************************************** sub Default_handler { my($p, $string) = @_; ## these data are currently not used } ## end of Default_handler refdb-1.0.2/scripts/en2ris.in000755 001750 001750 00000023260 12255427435 016702 0ustar00markusmarkus000000 000000 #!/usr/bin/perl ## en2ris.pl: converts EndNote "RIS" datasets to RIS format ## ## usage: perl en2ris.pl < endnote.ris > outfile.ris ## ## Dependencies: perl 5.0.0 or later ## RefDB::CGI ## RefDB::Pref ## RefDB::Log ## Text::Iconv ## ## markus@mhoenicka.de 2003-04-27 ## $Id: en2ris.in,v 1.1.2.2 2005/04/19 19:34:25 mhoenicka Exp $ ## 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, see ## change character encoding on the fly use Text::Iconv; ## the common RefDB modules use RefDB::Log; use RefDB::Prefs; ## use this module to read command line options use Getopt::Std; ## this one is for syslog (who'd have guessed) use Sys::Syslog; ## this is for the config file stuff my $prefs; ## read config file settings my $confdir = ""; my $read_prefs = 1; my $next; ## look for -q and -y options foreach $arg (@ARGV) { # my $next; if ($next) { $confdir = $arg; $next = 0; } elsif ($arg eq "-y") { $next = 1; } elsif ($arg eq "-q") { $read_prefs = 0; } } ## read config files if ($read_prefs) { my $home = $ENV{'HOME'}; $prefs = RefDB::Prefs::->new("$confdir/en2risrc", "$home/en2risrc"); } #### variables to hold config options. Will be initialized by whatever #### was in the config files ## name of the output file, if any. If undef, send data to stdout my $outfile = $prefs->{"outfile"}; ## if f, overwrite; if t, append my $append = (defined($prefs->{"outappend"})) ? $prefs->{"outappend"} : "f"; ## encodings to use for input and output. empty string uses the locale my $from_enc = (defined($prefs->{"from_enc"})) ? $prefs->{"from_enc"} : "ISO-8859-1"; my $to_enc = (defined($prefs->{"to_enc"})) ? $prefs->{"to_enc"} : "UTF-8"; ## logging options my $logfile = (defined($prefs->{"logfile"})) ? $prefs->{"logfile"} : "/var/log/en2ris.log"; my $loglevel = (defined($prefs->{"loglevel"})) ? $prefs->{"loglevel"} : 6; my $logdest = (defined($prefs->{"logdest"})) ? $prefs->{"logdest"} : 2; ## 0 = stderr, 1 = syslog, 2 = file ## this hash will receive the command line options my %opts; ## the switches are: ## -e dest: log destination ## -f enc: input encoding ## -h: prints help ## -l level: log level ## -L file: log file ## -o/-O file: specifies output file for writing/appending ## -q: ignore config file ## -t enc: output encoding ## -y path: set confdir getopts('e:f:hl:L:o:O:qt:y:', \%opts); ## loop over all command line options while (($key, $value) = each %opts) { if ($key eq "e") { $logdest = $value; } elsif ($key eq "f") { $from_enc = $value; } elsif ($key eq "h") { print "en2ris.pl turns EndNote \"RIS\" output into RIS\n"; print "Usage: [perl] en2ris.pl [-e dest] [-f enc] [-h] [-l level] [-L logfile] [(-o|-O) outfile] [-q] [-t enc] [-y path]\n Reads EndNote \"RIS\" data from stdin. Output is sent to stdout unless one of the -o/-O options is used\nOptions: -e dest log destination (stderr|syslog|file)\n -f enc input encoding\n -h print this help and exit\n -l loglevel set log level (0-7)\n -L logfile path of custom log file\n -o outfile send output to outfile (overwrite)\n -O outfile send output to outfile (append)\n -q ignore config file\n -t enc output encoding\n -y path set custom config file path\n"; exit(0); } elsif ($key eq "l") { $loglevel = $value; } elsif ($key eq "L") { $logfile = $value; } elsif ($key eq "o") { $outfile = $value; } elsif ($key eq "O") { $outfile = $value; $append = t; } elsif ($key eq "q") { ## do nothing, -q was used before getopts } elsif ($key eq "t") { $to_enc = $value; } elsif ($key eq "y") { ## do nothing, -y was used before getopts } } ## post-process a few variables $logdest = RefDB::Log::num_logdest($logdest); $loglevel = RefDB::Log::num_loglevel($loglevel); ## if we're supposed to write to an output file, try to open it if (length($outfile) > 0 && $is_cgi == 0) { ## try to open the output file if ($append eq "t") { open OUT, ">>$outfile" or die "cannot open output file for appending: $outfile\n"; } else { open OUT, ">$outfile" or die "cannot open output file for overwriting: $outfile\n"; } ## make all print commands send output to this handle select OUT; } ## set up logging my $log = RefDB::Log::->new($logdest, $loglevel, $logfile, "en2ris.pl"); ## here the code proper starts my $last_tag = "TY - "; my $PY = ""; my $Y2 = ""; ## initialize character encoding conversion my $converter = Text::Iconv->new($from_enc, $to_enc); ## counter for datasets my $set_count = 0; ## this hash helps to convert month names to numbers my %monthnames = ( "January" => "01", "February" => "02", "March" => "03", "April" => "04", "May" => "05", "June" => "06", "July" => "07", "August" => "08", "September" => "09", "October" => "10", "November" => "11", "December" => "12"); ## this hash helps to convert month abbreviations to numbers my %monthabbrevs = ( "Jan" => "01", "Feb" => "02", "Mar" => "03", "Apr" => "04", "May" => "05", "Jun" => "06", "Jul" => "07", "Aug" => "08", "Sep" => "09", "Oct" => "10", "Nov" => "11", "Dec" => "12"); ## read data from stdin while (<>) { # remove an odd character that EndNote exports once in a while for no # good reason s/[\035]//; if ($_ =~ /^(.. - )/) { $last_tag = $1; } elsif ($last_tag eq "KW - ") { print $last_tag . $_; $_ = ""; } if ($_ =~ /^SP - /) { $_ =~ s/^SP - (.*)-(.*)/SP - $1/; if (length("$2") > 0) { $_ .= "EP - $2\n"; } $log->log_print("debug", "fixed SP"); } elsif ($_ =~ /^EP - /) { if ($_ =~ /^EP - .*-.*/) { $_ =~ s/^EP - .*-(.*)/EP - $1/; } else { $_ = ""; } $log->log_print("debug", "fixed EP"); } elsif ($_ =~ /^PY - /) { chomp $_; $PY = substr($_, 6); $_ = ""; $log->log_print("debug", "found PY"); } elsif ($_ =~ /^Y2 - /) { chomp $_; $Y2 = substr($_, 6); $_ = ""; $log->log_print("debug", "found Y2"); } elsif ($_ =~ /^ER - /) { # dump pubyear string, reset variables for new round my $datestring = fix_dates($PY, $Y2); print $converter->convert("PY - $datestring\n"); $PY = ""; $Y2 = ""; $set_count++; } elsif ($_ =~ /^ID - /) { # informational message about the current dataset $log->log_print("info", substr($_, 6)); } print $converter->convert("$_"); } $log->log_print("info", "converted $set_count datasets"); ## done processing all input $log->close(); ## the end exit 0; ## this function assumes that the publication year is in the PY field, ## whereas month, date, and otherinfo are in the Y2 field. Two formats ## of the Y2 field are recognized: /month/day/otherinfo, where month ## may either be numeric or a month name/abbrev; or a date like "March 10" sub fix_dates { my ($PY, $Y2) = @_; my $month; my $day; my $otherinfo; # strip leading slashes $Y2 =~ s!^\/*!!; # see whether we have a monthname while ( ($key, $value) = each %monthnames) { if ($Y2 =~ s!^$key/!!) { $month = $value; $otherinfo = $Y2; last; } } # see whether we have a monthabbrev if (!length($month)) { while ( ($key, $value) = each %monthabbrevs) { if ($Y2 =~ s!^$key/!!) { $month = $value; $otherinfo = $Y2; last; } } } # if we still don't have a month, use string as numeric if (!length($month)) { $month = $Y2; $month =~ s!^([^/]*)/.*!$1!; if ($month =~ s/^(\d{1,2}).*/$1/) { if (length($month) == 1) { $month = "0" . $month; } $Y2 =~ s!^[^/]*/(.*)!$1!; } else { $month = undef; } $otherinfo = $Y2; } # separate day and otherinfo, if any if (length($otherinfo)) { $otherinfo =~ s!^[\s/]*!!; $day = $otherinfo; # use first one or two digits as day if ($day =~ s/^(\d{1,2}).*/$1/) { $otherinfo =~ s/^\d{1,2}\s*(.*)/$1/; # day requires exactly two digits if (length($day) == 1) { $day = "0" . $day; } } else { $day = undef; } } if (length($otherinfo)) { $otherinfo =~ s!^[\s/]*!!; if (!defined($month)) { # last attempt to find month and date; assume no slashes while ( ($key, $value) = each %monthnames) { if ($otherinfo =~ s!^$key!!) { $month = $value; last; } } # see whether we have a monthabbrev if (!length($month)) { while ( ($key, $value) = each %monthabbrevs) { if ($otherinfo =~ s!^$key!!) { $month = $value; last; } } } # maybe there's also a day if (length($otherinfo)) { $otherinfo =~ s!^[\s]*!!; $day = $otherinfo; # use first one or two digits as day if ($day =~ s/^(\d{1,2}).*/$1/) { $otherinfo =~ s/^\d{1,2}\s*(.*)/$1/; # day requires exactly two digits if (length($day) == 1) { $day = "0" . $day; } } else { $day = undef; } } } } if (!length($PY)) { $log->log_print("warning", "found no PY"); $PY = "0000"; } # assemble return string return $PY . "/" . $month . "/" . $day . "/" . $otherinfo; } refdb-1.0.2/scripts/refdbsru.in000644 001750 001750 00000010373 12255427435 017312 0ustar00markusmarkus000000 000000 #!/usr/bin/perl ## refdbsru: CGI script providing SRU access to RefDB data ## ## usage: install in the CGI directory of your web server ## todo: how to adapt web server config ## ## Dependencies: perl 5.6.0 or later ## CGI.pm ## RefDB::SRU ## RefDB::Log ## RefDB::Pref ## ## markus@mhoenicka.de 2007-02-07 ## 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, see ## some RefDB modules use RefDB::Prefs; use RefDB::SRU; use Sys::Syslog; use CGI; ## read config file settings my $confdir = ""; my $prefs = RefDB::Prefs::->new("$confdir/refdbsrurc", undef); # CGI does all the magic related to reading the query my $query = new CGI; # this hash receives the parameter-value pairs my %params = $query->Vars; # logging options $params{'logfile'} = (defined($prefs->{"logfile"})) ? $prefs->{"logfile"} : "/var/log/refdbsru.log"; $params{'loglevel'} = (defined($prefs->{"loglevel"})) ? $prefs->{"loglevel"} : 6; $params{'logdest'} = (defined($prefs->{"logdest"})) ? $prefs->{"logdest"} : 2; ## 0 = stderr, 1 = syslog, 2 = file # networking options $params{'server_ip'} = (defined($prefs->{"serverip"})) ? $prefs->{"serverip"} : "127.0.0.1"; $params{'port'} = (defined($prefs->{"port"})) ? $prefs->{"port"} : "9734"; $params{'timeout'} = (defined($prefs->{"timeout"})) ? $prefs->{"timeout"} : "180"; # user authentication $params{'username'} = (defined($prefs->{"username"})) ? $prefs->{"username"} : "anonymous"; $params{'password'} = (defined($prefs->{"passwd"})) ? $prefs->{"passwd"} : ""; $params{'pdfroot'} = (defined($prefs->{"pdfroot"})) ? $prefs->{"pdfroot"} : "/home/foo/literature"; $params{'xsl_url'} = (defined($prefs->{"xsl_url"})) ? $prefs->{"xsl_url"} : ""; $params{'db_engine'} = (defined($prefs->{"dbserver"})) ? $prefs->{"dbserver"} : undef; # zeerex parameters $params{'zeerex_host'} = (defined($prefs->{"zeerex_host"})) ? $prefs->{"zeerex_host"} : "www.change.me"; $params{'zeerex_port'} = (defined($prefs->{"zeerex_port"})) ? $prefs->{"zeerex_port"} : "80"; $params{'zeerex_database'} = (defined($prefs->{"zeerex_database"})) ? $prefs->{"zeerex_database"} : "refs"; $params{'zeerex_databaseInfo_title'} = (defined($prefs->{"zeerex_databaseInfo_title"})) ? $prefs->{"zeerex_databaseInfo_title"} : "Reference Database"; $params{'zeerex_databaseInfo_description'} = (defined($prefs->{"zeerex_databaseInfo_description"})) ? $prefs->{"zeerex_databaseInfo_description"} : "Reference Database"; $params{'zeerex_databaseInfo_author'} = (defined($prefs->{"zeerex_databaseInfo_author"})) ? $prefs->{"zeerex_databaseInfo_author"} : "John Doe"; $params{'zeerex_databaseInfo_contact'} = (defined($prefs->{"zeerex_databaseInfo_contact"})) ? $prefs->{"zeerex_databaseInfo_contact"} : "John\@Doe.org"; # create a new RefDB query object and pass a reference to the # parameter-value hash my $refdbquery = new RefDB::SRU(\%params); # try to figure out the database name. A default database should be # provided in the config file. Remote users can override this setting # by providing an additional path info in the URL. E.g. # http://myserver.com/cgi-bin/refdbsru/? will use the # default database, whereas # http://myserver.com/cgi-bin/refdbsru/foo? will use the # database "foo" instead if (defined($query->path_info()) && length($query->path_info()) > 1) { $params{'database'} = $query->path_info(); # strip leading slash $params{'database'} =~ s/^\///; } else { $params{'database'} = (defined($prefs->{"defaultdb"})) ? $prefs->{"defaultdb"} : "references"; } $refdbquery->run(); my $result = $refdbquery->response(); print "Content-type: text/xml\n\n"; print "$result\n"; #$refdbquery->print_vars(); exit 0; refdb-1.0.2/scripts/refdb-sruserver.in000644 001750 001750 00000000753 12255427435 020617 0ustar00markusmarkus000000 000000 #!/usr/bin/perl use warnings; use strict; use RefDB::SRUserver; # change into the directory that contains the RefDB SRU stylesheets chdir '/sru' or die "Can't cd to stylesheet directory: $!\n"; # create the web server my $server = RefDB::SRUserver->new(); # set the configuration directory $server->{"confdir"} = ""; # run the server. If nothing goes wrong, this call never returns. # To terminate the server again, kill it with ctrl-c $server->run(); exit 0; refdb-1.0.2/scripts/refdbnd.in000644 001750 001750 00000041152 12255427435 017101 0ustar00markusmarkus000000 000000 #!/bin/sh # refdbnd: creates a new document and sets up a Makefile for use # with RefDB bibliographies # Invocation: refdbnd basename doctype|filename pubtype database style encoding fo-driver html-driver xhtml-driver # or: refdbnd (interactive mode) # markus@mhoenicka.de 2002-11-26 # 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, see # user variable defaults defbasename="refdbtest" defdoctype="db43x" defpubtype="book" defdatabase="refdbtest" defstyle="J.Biol.Chem." defencoding="utf-8" defcssfile="" xfile="" encoding="" cssfile="" silent="f" myfo="" myhtml="" myxhtml="" fodriveropt="" htmldriveropt="" xhtmldriveropt="" check_existing_doc() { if [ -e $basename ]; then # guess values from existing file xfile=$basename if grep "^/examples/Makefile.rtf.template" else maketemplate="/examples/Makefile.template" fi case "$doctype" in db31 | db40 | db41) doctypeswitch="db31" extension="sgml" htmlstylesheet=".dsl" xhtmlstylesheet=".dsl" printstylesheet=".dsl" makeall="all: pdf ps rtf html" dist="dist: pdfdist psdist rtfdist htmldist" transformscript="refdbjade";; db41x | db42x | db43x) doctypeswitch="db31x" extension="xml" htmlstylesheet=".html.xsl" xhtmlstylesheet=".xhtml.xsl" printstylesheet=".fo.xsl" makeall="all: pdf rtf html" dist="dist: pdfdist rtfdist htmldist" transformscript="refdbxml";; db50x ) doctypeswitch="db50x" extension="xml" htmlstylesheet=".html.xsl" xhtmlstylesheet=".xhtml.xsl" printstylesheet=".fo.xsl" makeall="all: pdf rtf html" dist="dist: pdfdist rtfdist htmldist" transformscript="refdbxml";; teix ) doctypeswitch="teix" extension="xml" htmlstylesheet=".html.xsl" xhtmlstylesheet=".html.xsl" printstylesheet=".fo.xsl" makeall="all: pdf rtf html" dist="dist: pdfdist rtfdist htmldist" transformscript="refdbxml";; tei5x ) doctypeswitch="tei5x" extension="xml" htmlstylesheet=".html.xsl" xhtmlstylesheet=".html.xsl" printstylesheet=".fo.xsl" makeall="all: pdf rtf html" dist="dist: pdfdist rtfdist htmldist" transformscript="refdbxml";; rtf ) doctypeswitch="rtf" extension="rtf" makeall="all: rtf" dist="dist: rtfdist" transformscript="refdbrtf";; esac # substitute values sed "s%%$doctypeswitch%" < $maketemplate | sed "s%%$pubtype%" | sed "s%%$basename%" | sed "s%%$extension%" | sed "s%